aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.bazelci/presubmit.yml4
-rw-r--r--.github/CODEOWNERS4
-rw-r--r--.pylintrc2
-rw-r--r--.pylintrc-examples2
-rw-r--r--.pylintrc-tests2
-rw-r--r--Android.bp4
-rw-r--r--BUILD729
-rw-r--r--BUILD.gn1653
-rw-r--r--BUILDING.md4
-rw-r--r--CMakeLists.txt223
-rw-r--r--CONCEPTS.md2
-rw-r--r--METADATA6
-rw-r--r--Makefile24
-rw-r--r--WORKSPACE21
-rw-r--r--_metadata.py2
-rw-r--r--bazel/OWNERS1
-rw-r--r--bazel/copts.bzl8
-rw-r--r--bazel/grpc_build_system.bzl28
-rw-r--r--bazel/grpc_deps.bzl48
-rw-r--r--build_autogenerated.yaml90
-rw-r--r--build_handwritten.yaml4
-rw-r--r--config.m414
-rw-r--r--config.w3214
-rw-r--r--doc/g_stands_for.md2
-rw-r--r--examples/android/binder/java/io/grpc/binder/cpp/example/AndroidManifest.xml21
-rw-r--r--examples/android/binder/java/io/grpc/binder/cpp/example/BUILD48
-rw-r--r--examples/android/binder/java/io/grpc/binder/cpp/example/ButtonPressHandler.java15
-rw-r--r--examples/android/binder/java/io/grpc/binder/cpp/example/MainActivity.java26
-rw-r--r--examples/android/binder/java/io/grpc/binder/cpp/example/README.md18
-rw-r--r--examples/android/binder/java/io/grpc/binder/cpp/example/native.cc30
-rw-r--r--examples/android/binder/java/io/grpc/binder/cpp/example/res/layout/activity_main.xml24
-rw-r--r--examples/android/binder/java/io/grpc/binder/cpp/example/res/values/strings.xml5
-rw-r--r--examples/android/helloworld/README.md2
-rw-r--r--examples/cpp/compression/Makefile2
-rw-r--r--examples/cpp/helloworld/Makefile2
-rw-r--r--examples/cpp/load_balancing/Makefile2
-rw-r--r--examples/cpp/metadata/Makefile2
-rw-r--r--examples/cpp/route_guide/Makefile2
-rw-r--r--examples/node/static_codegen/greeter_client.js1
-rw-r--r--examples/python/async_streaming/client.py2
-rw-r--r--examples/python/async_streaming/server.py6
-rw-r--r--examples/python/auth/async_customized_auth_client.py3
-rw-r--r--examples/python/auth/async_customized_auth_server.py3
-rw-r--r--examples/python/auth/customized_auth_client.py2
-rw-r--r--examples/python/auth/customized_auth_server.py4
-rw-r--r--examples/python/auth/test/_auth_example_test.py5
-rw-r--r--examples/python/cancellation/search.py4
-rw-r--r--examples/python/cancellation/server.py2
-rw-r--r--examples/python/compression/client.py1
-rw-r--r--examples/python/compression/server.py3
-rw-r--r--examples/python/data_transmission/alts_client.py6
-rw-r--r--examples/python/data_transmission/client.py3
-rw-r--r--examples/python/data_transmission/server.py5
-rw-r--r--examples/python/debug/asyncio_debug_server.py2
-rw-r--r--examples/python/debug/asyncio_get_stats.py4
-rw-r--r--examples/python/debug/asyncio_send_message.py3
-rw-r--r--examples/python/debug/debug_server.py2
-rw-r--r--examples/python/debug/get_stats.py4
-rw-r--r--examples/python/debug/send_message.py3
-rw-r--r--examples/python/debug/test/_debug_example_test.py6
-rw-r--r--examples/python/errors/client.py3
-rw-r--r--examples/python/errors/server.py7
-rw-r--r--examples/python/errors/test/_error_handling_example_test.py2
-rw-r--r--examples/python/helloworld/async_greeter_client.py4
-rw-r--r--examples/python/helloworld/async_greeter_client_with_options.py1
-rw-r--r--examples/python/helloworld/async_greeter_server.py12
-rw-r--r--examples/python/helloworld/async_greeter_server_with_graceful_shutdown.py64
-rw-r--r--examples/python/helloworld/async_greeter_server_with_reflection.py1
-rw-r--r--examples/python/helloworld/greeter_client.py2
-rw-r--r--examples/python/helloworld/greeter_client_with_options.py2
-rw-r--r--examples/python/helloworld/greeter_server.py1
-rw-r--r--examples/python/helloworld/greeter_server_with_reflection.py1
-rw-r--r--examples/python/interceptors/default_value/greeter_client.py4
-rw-r--r--examples/python/interceptors/headers/greeter_client.py4
-rw-r--r--examples/python/interceptors/headers/greeter_server.py4
-rw-r--r--examples/python/interceptors/headers/header_manipulator_client_interceptor.py2
-rw-r--r--examples/python/metadata/metadata_client.py2
-rw-r--r--examples/python/metadata/metadata_server.py2
-rw-r--r--examples/python/multiplex/multiplex_client.py3
-rw-r--r--examples/python/multiplex/multiplex_server.py5
-rw-r--r--examples/python/multiprocessing/client.py1
-rw-r--r--examples/python/multiprocessing/server.py3
-rw-r--r--examples/python/no_codegen/greeter_client.py1
-rw-r--r--examples/python/retry/README.md48
-rw-r--r--examples/python/retry/async_retry_client.py58
-rw-r--r--examples/python/retry/flaky_server.py58
-rw-r--r--examples/python/retry/helloworld.proto33
-rw-r--r--examples/python/retry/retry_client.py56
-rw-r--r--examples/python/route_guide/asyncio_route_guide_client.py5
-rw-r--r--examples/python/route_guide/asyncio_route_guide_server.py5
-rw-r--r--examples/python/route_guide/route_guide_client.py3
-rw-r--r--examples/python/route_guide/route_guide_server.py5
-rw-r--r--examples/python/wait_for_ready/asyncio_wait_for_ready_example.py2
-rw-r--r--examples/python/wait_for_ready/test/_wait_for_ready_example_test.py4
-rw-r--r--examples/python/wait_for_ready/wait_for_ready_example.py2
-rw-r--r--examples/python/xds/client.py4
-rw-r--r--examples/python/xds/server.py10
-rw-r--r--gRPC-C++.podspec26
-rw-r--r--gRPC-Core.podspec40
-rw-r--r--gRPC-ProtoRPC.podspec2
-rw-r--r--gRPC-RxLibrary.podspec2
-rw-r--r--gRPC.podspec2
-rw-r--r--grpc.gemspec21
-rw-r--r--grpc.gyp22
-rw-r--r--include/grpc/event_engine/event_engine.h24
-rw-r--r--include/grpc/event_engine/slice_allocator.h41
-rw-r--r--include/grpc/impl/codegen/grpc_types.h26
-rw-r--r--include/grpc/impl/codegen/port_platform.h24
-rw-r--r--include/grpcpp/impl/codegen/channel_interface.h1
-rw-r--r--include/grpcpp/impl/codegen/client_callback.h27
-rw-r--r--include/grpcpp/impl/codegen/client_context.h15
-rw-r--r--include/grpcpp/impl/codegen/server_callback.h11
-rw-r--r--include/grpcpp/impl/codegen/server_context.h41
-rw-r--r--include/grpcpp/impl/codegen/server_interface.h1
-rw-r--r--include/grpcpp/impl/codegen/sync.h5
-rw-r--r--include/grpcpp/test/default_reactor_test_peer.h15
-rw-r--r--package.xml27
-rw-r--r--setup.py18
-rw-r--r--src/android/test/interop/README.md2
-rw-r--r--src/compiler/cpp_generator.cc2
-rw-r--r--src/compiler/csharp_generator.cc2
-rw-r--r--src/compiler/objective_c_generator_helpers.h2
-rw-r--r--src/compiler/python_generator.h2
-rw-r--r--src/compiler/python_generator_helpers.h4
-rw-r--r--src/compiler/ruby_generator.cc2
-rw-r--r--src/core/ext/filters/client_channel/OWNERS1
-rw-r--r--src/core/ext/filters/client_channel/client_channel.cc660
-rw-r--r--src/core/ext/filters/client_channel/client_channel.h60
-rw-r--r--src/core/ext/filters/client_channel/config_selector.h25
-rw-r--r--src/core/ext/filters/client_channel/lb_policy.cc16
-rw-r--r--src/core/ext/filters/client_channel/lb_policy.h116
-rw-r--r--src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc15
-rw-r--r--src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc33
-rw-r--r--src/core/ext/filters/client_channel/lb_policy/priority/priority.cc8
-rw-r--r--src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc55
-rw-r--r--src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc23
-rw-r--r--src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc9
-rw-r--r--src/core/ext/filters/client_channel/lb_policy/xds/cds.cc20
-rw-r--r--src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc36
-rw-r--r--src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc11
-rw-r--r--src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc13
-rw-r--r--src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc174
-rw-r--r--src/core/ext/filters/client_channel/retry_filter.cc654
-rw-r--r--src/core/ext/filters/client_channel/retry_service_config.cc62
-rw-r--r--src/core/ext/filters/client_channel/retry_service_config.h2
-rw-r--r--src/core/ext/filters/client_channel/service_config_call_data.h50
-rw-r--r--src/core/ext/filters/fault_injection/fault_injection_filter.cc6
-rw-r--r--src/core/ext/filters/http/client/http_client_filter.cc7
-rw-r--r--src/core/ext/transport/binder/README.md6
-rw-r--r--src/core/ext/transport/binder/utils/BUILD42
-rw-r--r--src/core/ext/transport/binder/utils/transport_stream_receiver.h61
-rw-r--r--src/core/ext/transport/binder/utils/transport_stream_receiver_impl.cc139
-rw-r--r--src/core/ext/transport/binder/utils/transport_stream_receiver_impl.h81
-rw-r--r--src/core/ext/transport/binder/wire_format/BUILD111
-rw-r--r--src/core/ext/transport/binder/wire_format/binder.h101
-rw-r--r--src/core/ext/transport/binder/wire_format/binder_android.cc240
-rw-r--r--src/core/ext/transport/binder/wire_format/binder_android.h128
-rw-r--r--src/core/ext/transport/binder/wire_format/binder_constants.cc30
-rw-r--r--src/core/ext/transport/binder/wire_format/binder_constants.h52
-rw-r--r--src/core/ext/transport/binder/wire_format/transaction.cc29
-rw-r--r--src/core/ext/transport/binder/wire_format/transaction.h103
-rw-r--r--src/core/ext/transport/binder/wire_format/wire_reader.h37
-rw-r--r--src/core/ext/transport/binder/wire_format/wire_reader_impl.cc273
-rw-r--r--src/core/ext/transport/binder/wire_format/wire_reader_impl.h76
-rw-r--r--src/core/ext/transport/binder/wire_format/wire_writer.cc80
-rw-r--r--src/core/ext/transport/binder/wire_format/wire_writer.h49
-rw-r--r--src/core/ext/transport/chttp2/server/chttp2_server.cc6
-rw-r--r--src/core/ext/transport/chttp2/transport/bin_decoder.cc2
-rw-r--r--src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc (renamed from src/core/lib/event_engine/slice_allocator.cc)53
-rw-r--r--src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h74
-rw-r--r--src/core/ext/transport/chttp2/transport/chttp2_transport.cc8
-rw-r--r--src/core/ext/transport/chttp2/transport/flow_control.h2
-rw-r--r--src/core/ext/transport/chttp2/transport/frame_data.cc8
-rw-r--r--src/core/ext/transport/chttp2/transport/frame_goaway.cc16
-rw-r--r--src/core/ext/transport/chttp2/transport/frame_settings.cc10
-rw-r--r--src/core/ext/transport/chttp2/transport/hpack_parser.cc1391
-rw-r--r--src/core/ext/transport/chttp2/transport/hpack_parser.h259
-rw-r--r--src/core/ext/transport/chttp2/transport/internal.h2
-rw-r--r--src/core/ext/transport/chttp2/transport/parsing.cc124
-rw-r--r--src/core/ext/transport/chttp2/transport/varint.cc10
-rw-r--r--src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c91
-rw-r--r--src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h256
-rw-r--r--src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c62
-rw-r--r--src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h145
-rw-r--r--src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c54
-rw-r--r--src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h74
-rw-r--r--src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c75
-rw-r--r--src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h227
-rw-r--r--src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c46
-rw-r--r--src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h121
-rw-r--r--src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c1
-rw-r--r--src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c35
-rw-r--r--src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h90
-rw-r--r--src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c56
-rw-r--r--src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h193
-rw-r--r--src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c6
-rw-r--r--src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h15
-rw-r--r--src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c48
-rw-r--r--src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h171
-rw-r--r--src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c14
-rw-r--r--src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h46
-rw-r--r--src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c1
-rw-r--r--src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c31
-rw-r--r--src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h57
-rw-r--r--src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c46
-rw-r--r--src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h72
-rw-r--r--src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c5
-rw-r--r--src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h4
-rw-r--r--src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c11
-rw-r--r--src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h26
-rw-r--r--src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c128
-rw-r--r--src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h365
-rw-r--r--src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c19
-rw-r--r--src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h43
-rw-r--r--src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c38
-rw-r--r--src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h115
-rw-r--r--src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c60
-rw-r--r--src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h181
-rw-r--r--src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c1
-rw-r--r--src/core/ext/upb-generated/validate/validate.upb.c148
-rw-r--r--src/core/ext/upb-generated/validate/validate.upb.h344
-rw-r--r--src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c22
-rw-r--r--src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c105
-rw-r--r--src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c595
-rw-r--r--src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h5
-rw-r--r--src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c847
-rw-r--r--src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c368
-rw-r--r--src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h10
-rw-r--r--src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c17
-rw-r--r--src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c382
-rw-r--r--src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h15
-rw-r--r--src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c59
-rw-r--r--src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.h40
-rw-r--r--src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c54
-rw-r--r--src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c52
-rw-r--r--src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.h35
-rw-r--r--src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c260
-rw-r--r--src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h5
-rw-r--r--src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c254
-rw-r--r--src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c90
-rw-r--r--src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.h35
-rw-r--r--src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c56
-rw-r--r--src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c234
-rw-r--r--src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c124
-rw-r--r--src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h5
-rw-r--r--src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c1348
-rw-r--r--src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h5
-rw-r--r--src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c23
-rw-r--r--src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c23
-rw-r--r--src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c816
-rw-r--r--src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h10
-rw-r--r--src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c236
-rw-r--r--src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c2
-rw-r--r--src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c191
-rw-r--r--src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h5
-rw-r--r--src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c64
-rw-r--r--src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.h50
-rw-r--r--src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c67
-rw-r--r--src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c8
-rw-r--r--src/core/ext/upbdefs-generated/validate/validate.upbdefs.c342
-rw-r--r--src/core/ext/xds/OWNERS1
-rw-r--r--src/core/ext/xds/certificate_provider_store.h2
-rw-r--r--src/core/ext/xds/xds_api.cc590
-rw-r--r--src/core/ext/xds/xds_api.h33
-rw-r--r--src/core/ext/xds/xds_bootstrap.cc5
-rw-r--r--src/core/ext/xds/xds_client.cc109
-rw-r--r--src/core/ext/xds/xds_client.h4
-rw-r--r--src/core/ext/xds/xds_http_filters.cc5
-rw-r--r--src/core/ext/xds/xds_http_filters.h3
-rw-r--r--src/core/lib/channel/call_tracer.h85
-rw-r--r--src/core/lib/channel/channel_stack.h2
-rw-r--r--src/core/lib/channel/context.h3
-rw-r--r--src/core/lib/channel/status_util.h4
-rw-r--r--src/core/lib/compression/stream_compression.h2
-rw-r--r--src/core/lib/compression/stream_compression_gzip.h2
-rw-r--r--src/core/lib/compression/stream_compression_identity.h2
-rw-r--r--src/core/lib/debug/stats.h2
-rw-r--r--src/core/lib/gpr/arena.h47
-rw-r--r--src/core/lib/gpr/murmur_hash.cc6
-rw-r--r--src/core/lib/gprpp/bitset.h156
-rw-r--r--src/core/lib/gprpp/manual_constructor.h2
-rw-r--r--src/core/lib/gprpp/match.h72
-rw-r--r--src/core/lib/gprpp/orphanable.h6
-rw-r--r--src/core/lib/gprpp/overload.h59
-rw-r--r--src/core/lib/gprpp/sync.h32
-rw-r--r--src/core/lib/gprpp/table.h386
-rw-r--r--src/core/lib/iomgr/buffer_list.cc2
-rw-r--r--src/core/lib/iomgr/ev_apple.h2
-rw-r--r--src/core/lib/iomgr/event_engine/endpoint.cc14
-rw-r--r--src/core/lib/iomgr/event_engine/tcp.cc40
-rw-r--r--src/core/lib/iomgr/python_util.h2
-rw-r--r--src/core/lib/iomgr/resource_quota.cc2
-rw-r--r--src/core/lib/iomgr/tcp_client_windows.cc2
-rw-r--r--src/core/lib/iomgr/tcp_server_posix.cc1
-rw-r--r--src/core/lib/iomgr/timer_manager.cc2
-rw-r--r--src/core/lib/json/json_reader.cc3
-rw-r--r--src/core/lib/matchers/matchers.cc28
-rw-r--r--src/core/lib/matchers/matchers.h3
-rw-r--r--src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc49
-rw-r--r--src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h7
-rw-r--r--src/core/lib/security/security_connector/tls/tls_security_connector.cc24
-rw-r--r--src/core/lib/security/transport/security_handshaker.cc16
-rw-r--r--src/core/lib/security/transport/server_auth_filter.cc7
-rw-r--r--src/core/lib/slice/slice.cc14
-rw-r--r--src/core/lib/slice/slice_internal.h1
-rw-r--r--src/core/lib/surface/call.cc11
-rw-r--r--src/core/lib/surface/server.cc4
-rw-r--r--src/core/lib/surface/server.h6
-rw-r--r--src/core/lib/surface/version.cc4
-rw-r--r--src/core/lib/transport/metadata_batch.cc15
-rw-r--r--src/core/lib/transport/metadata_batch.h7
-rw-r--r--src/cpp/Protobuf-C++.podspec4
-rwxr-xr-xsrc/cpp/README.md7
-rw-r--r--src/cpp/client/secure_credentials.cc2
-rw-r--r--src/cpp/common/version_cc.cc2
-rw-r--r--src/cpp/ext/filters/census/client_filter.cc297
-rw-r--r--src/cpp/ext/filters/census/client_filter.h67
-rw-r--r--src/cpp/ext/filters/census/context.h5
-rw-r--r--src/cpp/ext/filters/census/grpc_plugin.cc13
-rw-r--r--src/cpp/ext/filters/census/grpc_plugin.h21
-rw-r--r--src/cpp/ext/filters/census/measures.cc26
-rw-r--r--src/cpp/ext/filters/census/measures.h3
-rw-r--r--src/cpp/ext/filters/census/open_census_call_tracer.h109
-rw-r--r--src/cpp/ext/filters/census/views.cc150
-rw-r--r--src/cpp/server/secure_server_credentials.cc2
-rw-r--r--src/cpp/server/server_cc.cc6
-rw-r--r--src/csharp/Grpc.Core.Api/VersionInfo.cs4
-rw-r--r--src/csharp/Grpc.Tools/ProtoCompile.cs2
-rw-r--r--src/csharp/build/dependencies.props2
-rw-r--r--src/objective-c/!ProtoCompiler-gRPCCppPlugin.podspec2
-rw-r--r--src/objective-c/!ProtoCompiler-gRPCPlugin.podspec2
-rw-r--r--src/objective-c/!ProtoCompiler.podspec2
-rw-r--r--src/objective-c/GRPCClient/GRPCCallOptions.h6
-rw-r--r--src/objective-c/GRPCClient/private/GRPCCore/GRPCChannel.m7
-rw-r--r--src/objective-c/GRPCClient/version.h2
-rw-r--r--src/objective-c/README.md6
-rw-r--r--src/objective-c/tests/InteropTests/InteropTests.m2
-rw-r--r--src/objective-c/tests/version.h2
-rw-r--r--src/php/README.md2
-rwxr-xr-xsrc/php/bin/interop_server.sh21
-rw-r--r--src/php/composer.json2
-rw-r--r--src/php/ext/grpc/version.h2
-rwxr-xr-xsrc/php/tests/interop/interop_client.php1
-rw-r--r--src/php/tests/interop/interop_server.php217
-rw-r--r--src/proto/grpc/testing/xds/v3/ads.proto2
-rw-r--r--src/proto/grpc/testing/xds/v3/route.proto16
-rw-r--r--src/python/grpcio/commands.py1
-rw-r--r--src/python/grpcio/grpc/__init__.py10
-rw-r--r--src/python/grpcio/grpc/_channel.py4
-rw-r--r--src/python/grpcio/grpc/_common.py2
-rw-r--r--src/python/grpcio/grpc/_grpcio_metadata.py2
-rw-r--r--src/python/grpcio/grpc/_plugin_wrapping.py1
-rw-r--r--src/python/grpcio/grpc/_server.py5
-rw-r--r--src/python/grpcio/grpc/_simple_stubs.py2
-rw-r--r--src/python/grpcio/grpc/_utilities.py5
-rw-r--r--src/python/grpcio/grpc/aio/__init__.py48
-rw-r--r--src/python/grpcio/grpc/aio/_base_call.py8
-rw-r--r--src/python/grpcio/grpc/aio/_base_channel.py5
-rw-r--r--src/python/grpcio/grpc/aio/_base_server.py5
-rw-r--r--src/python/grpcio/grpc/aio/_call.py42
-rw-r--r--src/python/grpcio/grpc/aio/_channel.py35
-rw-r--r--src/python/grpcio/grpc/aio/_interceptor.py27
-rw-r--r--src/python/grpcio/grpc/aio/_metadata.py5
-rw-r--r--src/python/grpcio/grpc/aio/_server.py5
-rw-r--r--src/python/grpcio/grpc/aio/_typing.py5
-rw-r--r--src/python/grpcio/grpc/beta/implementations.py3
-rw-r--r--src/python/grpcio/grpc/beta/interfaces.py3
-rw-r--r--src/python/grpcio/grpc/experimental/__init__.py5
-rw-r--r--src/python/grpcio/grpc/framework/foundation/logging_pool.py3
-rw-r--r--src/python/grpcio/grpc/framework/interfaces/base/base.py3
-rw-r--r--src/python/grpcio/grpc/framework/interfaces/face/face.py4
-rw-r--r--src/python/grpcio/grpc_core_dependencies.py10
-rw-r--r--src/python/grpcio/grpc_version.py2
-rw-r--r--src/python/grpcio/support.py3
-rw-r--r--src/python/grpcio_admin/grpc_admin/__init__.py2
-rw-r--r--src/python/grpcio_admin/grpc_version.py2
-rw-r--r--src/python/grpcio_admin/setup.py1
-rw-r--r--src/python/grpcio_channelz/grpc_channelz/v1/_async.py4
-rw-r--r--src/python/grpcio_channelz/grpc_channelz/v1/_servicer.py4
-rw-r--r--src/python/grpcio_channelz/grpc_channelz/v1/channelz.py4
-rw-r--r--src/python/grpcio_channelz/grpc_version.py2
-rw-r--r--src/python/grpcio_channelz/setup.py3
-rw-r--r--src/python/grpcio_csds/grpc_csds/__init__.py8
-rw-r--r--src/python/grpcio_csds/grpc_version.py2
-rw-r--r--src/python/grpcio_csds/setup.py1
-rw-r--r--src/python/grpcio_health_checking/grpc_health/v1/_async.py2
-rw-r--r--src/python/grpcio_health_checking/grpc_health/v1/health.py4
-rw-r--r--src/python/grpcio_health_checking/grpc_version.py2
-rw-r--r--src/python/grpcio_health_checking/setup.py3
-rw-r--r--src/python/grpcio_reflection/grpc_reflection/v1alpha/_async.py1
-rw-r--r--src/python/grpcio_reflection/grpc_reflection/v1alpha/_base.py3
-rw-r--r--src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py6
-rw-r--r--src/python/grpcio_reflection/grpc_version.py2
-rw-r--r--src/python/grpcio_reflection/setup.py3
-rw-r--r--src/python/grpcio_status/grpc_status/_async.py6
-rw-r--r--src/python/grpcio_status/grpc_status/rpc_status.py5
-rw-r--r--src/python/grpcio_status/grpc_version.py2
-rw-r--r--src/python/grpcio_status/setup.py3
-rw-r--r--src/python/grpcio_testing/grpc_testing/__init__.py3
-rw-r--r--src/python/grpcio_testing/grpc_testing/_server/_service.py1
-rw-r--r--src/python/grpcio_testing/grpc_version.py2
-rw-r--r--src/python/grpcio_testing/setup.py1
-rw-r--r--src/python/grpcio_tests/commands.py5
-rw-r--r--src/python/grpcio_tests/grpc_version.py2
-rw-r--r--src/python/grpcio_tests/setup.py3
-rw-r--r--src/python/grpcio_tests/tests/admin/test_admin.py8
-rw-r--r--src/python/grpcio_tests/tests/channelz/_channelz_servicer_test.py4
-rw-r--r--src/python/grpcio_tests/tests/csds/test_csds.py12
-rw-r--r--src/python/grpcio_tests/tests/fork/_fork_interop_test.py4
-rw-r--r--src/python/grpcio_tests/tests/fork/methods.py1
-rw-r--r--src/python/grpcio_tests/tests/health_check/_health_servicer_test.py4
-rw-r--r--src/python/grpcio_tests/tests/http2/negative_http2_client.py5
-rw-r--r--src/python/grpcio_tests/tests/interop/_insecure_intraop_test.py4
-rw-r--r--src/python/grpcio_tests/tests/interop/_secure_intraop_test.py4
-rw-r--r--src/python/grpcio_tests/tests/interop/client.py2
-rw-r--r--src/python/grpcio_tests/tests/interop/resources.py2
-rw-r--r--src/python/grpcio_tests/tests/interop/server.py4
-rw-r--r--src/python/grpcio_tests/tests/protoc_plugin/_python_plugin_test.py7
-rw-r--r--src/python/grpcio_tests/tests/protoc_plugin/_split_definitions_test.py4
-rw-r--r--src/python/grpcio_tests/tests/protoc_plugin/beta_python_plugin_test.py4
-rw-r--r--src/python/grpcio_tests/tests/qps/benchmark_client.py6
-rw-r--r--src/python/grpcio_tests/tests/qps/benchmark_server.py2
-rw-r--r--src/python/grpcio_tests/tests/qps/qps_worker.py2
-rw-r--r--src/python/grpcio_tests/tests/qps/worker_server.py8
-rw-r--r--src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py7
-rw-r--r--src/python/grpcio_tests/tests/status/_grpc_status_test.py5
-rw-r--r--src/python/grpcio_tests/tests/stress/client.py2
-rw-r--r--src/python/grpcio_tests/tests/stress/unary_stream_benchmark.py12
-rw-r--r--src/python/grpcio_tests/tests/testing/_application_testing_common.py2
-rw-r--r--src/python/grpcio_tests/tests/testing/_client_application.py5
-rw-r--r--src/python/grpcio_tests/tests/testing/_client_test.py4
-rw-r--r--src/python/grpcio_tests/tests/testing/_server_application.py4
-rw-r--r--src/python/grpcio_tests/tests/unit/_abort_test.py2
-rw-r--r--src/python/grpcio_tests/tests/unit/_api_test.py5
-rw-r--r--src/python/grpcio_tests/tests/unit/_auth_context_test.py4
-rw-r--r--src/python/grpcio_tests/tests/unit/_auth_test.py2
-rw-r--r--src/python/grpcio_tests/tests/unit/_channel_args_test.py2
-rw-r--r--src/python/grpcio_tests/tests/unit/_channel_connectivity_test.py3
-rw-r--r--src/python/grpcio_tests/tests/unit/_channel_ready_future_test.py5
-rw-r--r--src/python/grpcio_tests/tests/unit/_compression_test.py7
-rw-r--r--src/python/grpcio_tests/tests/unit/_contextvars_propagation_test.py2
-rw-r--r--src/python/grpcio_tests/tests/unit/_credentials_test.py4
-rw-r--r--src/python/grpcio_tests/tests/unit/_cython/_cancel_many_calls_test.py3
-rw-r--r--src/python/grpcio_tests/tests/unit/_cython/_channel_test.py2
-rw-r--r--src/python/grpcio_tests/tests/unit/_cython/_read_some_but_not_all_responses_test.py1
-rw-r--r--src/python/grpcio_tests/tests/unit/_cython/cygrpc_test.py9
-rw-r--r--src/python/grpcio_tests/tests/unit/_dns_resolver_test.py5
-rw-r--r--src/python/grpcio_tests/tests/unit/_empty_message_test.py2
-rw-r--r--src/python/grpcio_tests/tests/unit/_exit_scenarios.py2
-rw-r--r--src/python/grpcio_tests/tests/unit/_exit_test.py7
-rw-r--r--src/python/grpcio_tests/tests/unit/_grpc_shutdown_test.py4
-rw-r--r--src/python/grpcio_tests/tests/unit/_interceptor_test.py6
-rw-r--r--src/python/grpcio_tests/tests/unit/_invalid_metadata_test.py2
-rw-r--r--src/python/grpcio_tests/tests/unit/_invocation_defects_test.py2
-rw-r--r--src/python/grpcio_tests/tests/unit/_local_credentials_test.py5
-rw-r--r--src/python/grpcio_tests/tests/unit/_logging_test.py5
-rw-r--r--src/python/grpcio_tests/tests/unit/_metadata_code_details_test.py2
-rw-r--r--src/python/grpcio_tests/tests/unit/_metadata_flags_test.py12
-rw-r--r--src/python/grpcio_tests/tests/unit/_metadata_test.py2
-rw-r--r--src/python/grpcio_tests/tests/unit/_reconnect_test.py4
-rw-r--r--src/python/grpcio_tests/tests/unit/_resource_exhausted_test.py2
-rw-r--r--src/python/grpcio_tests/tests/unit/_rpc_part_1_test.py20
-rw-r--r--src/python/grpcio_tests/tests/unit/_rpc_part_2_test.py20
-rw-r--r--src/python/grpcio_tests/tests/unit/_server_shutdown_scenarios.py8
-rw-r--r--src/python/grpcio_tests/tests/unit/_server_shutdown_test.py2
-rw-r--r--src/python/grpcio_tests/tests/unit/_server_ssl_cert_config_test.py12
-rw-r--r--src/python/grpcio_tests/tests/unit/_server_test.py2
-rw-r--r--src/python/grpcio_tests/tests/unit/_server_wait_for_termination_test.py9
-rw-r--r--src/python/grpcio_tests/tests/unit/_session_cache_test.py4
-rw-r--r--src/python/grpcio_tests/tests/unit/_signal_handling_test.py4
-rw-r--r--src/python/grpcio_tests/tests/unit/_version_test.py3
-rw-r--r--src/python/grpcio_tests/tests/unit/_xds_credentials_test.py8
-rw-r--r--src/python/grpcio_tests/tests/unit/beta/_beta_features_test.py1
-rw-r--r--src/python/grpcio_tests/tests/unit/beta/_implementations_test.py2
-rw-r--r--src/python/grpcio_tests/tests/unit/beta/_not_found_test.py1
-rw-r--r--src/python/grpcio_tests/tests/unit/beta/_utilities_test.py1
-rw-r--r--src/python/grpcio_tests/tests/unit/framework/common/__init__.py2
-rw-r--r--src/python/grpcio_tests/tests/unit/test_common.py2
-rw-r--r--src/python/grpcio_tests/tests/unit/thread_pool.py2
-rw-r--r--src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py7
-rw-r--r--src/python/grpcio_tests/tests_aio/benchmark/benchmark_servicer.py3
-rw-r--r--src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py9
-rw-r--r--src/python/grpcio_tests/tests_aio/channelz/channelz_servicer_test.py5
-rw-r--r--src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py6
-rw-r--r--src/python/grpcio_tests/tests_aio/interop/methods.py6
-rw-r--r--src/python/grpcio_tests/tests_aio/interop/server.py2
-rw-r--r--src/python/grpcio_tests/tests_aio/reflection/reflection_servicer_test.py7
-rw-r--r--src/python/grpcio_tests/tests_aio/status/grpc_status_test.py8
-rw-r--r--src/python/grpcio_tests/tests_aio/unit/_common.py9
-rw-r--r--src/python/grpcio_tests/tests_aio/unit/_test_base.py5
-rw-r--r--src/python/grpcio_tests/tests_aio/unit/_test_server.py6
-rw-r--r--src/python/grpcio_tests/tests_aio/unit/abort_test.py7
-rw-r--r--src/python/grpcio_tests/tests_aio/unit/aio_rpc_error_test.py4
-rw-r--r--src/python/grpcio_tests/tests_aio/unit/auth_context_test.py2
-rw-r--r--src/python/grpcio_tests/tests_aio/unit/call_test.py7
-rw-r--r--src/python/grpcio_tests/tests_aio/unit/channel_argument_test.py5
-rw-r--r--src/python/grpcio_tests/tests_aio/unit/channel_ready_test.py3
-rw-r--r--src/python/grpcio_tests/tests_aio/unit/channel_test.py7
-rw-r--r--src/python/grpcio_tests/tests_aio/unit/client_stream_stream_interceptor_test.py10
-rw-r--r--src/python/grpcio_tests/tests_aio/unit/client_stream_unary_interceptor_test.py15
-rw-r--r--src/python/grpcio_tests/tests_aio/unit/client_unary_stream_interceptor_test.py15
-rw-r--r--src/python/grpcio_tests/tests_aio/unit/client_unary_unary_interceptor_test.py11
-rw-r--r--src/python/grpcio_tests/tests_aio/unit/close_channel_test.py5
-rw-r--r--src/python/grpcio_tests/tests_aio/unit/compatibility_test.py10
-rw-r--r--src/python/grpcio_tests/tests_aio/unit/compression_test.py2
-rw-r--r--src/python/grpcio_tests/tests_aio/unit/context_peer_test.py8
-rw-r--r--src/python/grpcio_tests/tests_aio/unit/done_callback_test.py10
-rw-r--r--src/python/grpcio_tests/tests_aio/unit/metadata_test.py2
-rw-r--r--src/python/grpcio_tests/tests_aio/unit/outside_init_test.py6
-rw-r--r--src/python/grpcio_tests/tests_aio/unit/secure_call_test.py8
-rw-r--r--src/python/grpcio_tests/tests_aio/unit/server_interceptor_test.py8
-rw-r--r--src/python/grpcio_tests/tests_aio/unit/server_time_remaining_test.py5
-rw-r--r--src/python/grpcio_tests/tests_aio/unit/timeout_test.py4
-rw-r--r--src/python/grpcio_tests/tests_aio/unit/wait_for_connection_test.py11
-rw-r--r--src/python/grpcio_tests/tests_aio/unit/wait_for_ready_test.py17
-rw-r--r--src/python/grpcio_tests/tests_gevent/unit/_test_server.py9
-rw-r--r--src/python/grpcio_tests/tests_gevent/unit/close_channel_test.py9
-rw-r--r--src/python/grpcio_tests/tests_py3_only/interop/xds_interop_client.py17
-rw-r--r--src/python/grpcio_tests/tests_py3_only/interop/xds_interop_server.py19
-rw-r--r--src/python/grpcio_tests/tests_py3_only/unit/_leak_test.py2
-rw-r--r--src/python/grpcio_tests/tests_py3_only/unit/_simple_stubs_test.py11
-rw-r--r--src/ruby/ext/grpc/extconf.rb2
-rw-r--r--src/ruby/lib/grpc/version.rb2
-rw-r--r--src/ruby/tools/version.rb2
-rw-r--r--templates/BUILD.gn.template205
-rw-r--r--templates/src/core/lib/surface/version.cc.template4
-rw-r--r--templates/src/objective-c/!ProtoCompiler.podspec.template2
-rw-r--r--templates/test/core/end2end/end2end_defs.include1
-rw-r--r--templates/test/cpp/naming/resolver_component_tests_defs.include9
-rw-r--r--templates/tools/dockerfile/test/bazel/Dockerfile.template15
-rw-r--r--test/core/client_channel/service_config_test.cc65
-rw-r--r--test/core/end2end/end2end_nosec_tests.cc33
-rw-r--r--test/core/end2end/end2end_tests.cc33
-rwxr-xr-xtest/core/end2end/gen_build_yaml.py1
-rwxr-xr-xtest/core/end2end/generate_tests.bzl16
-rw-r--r--test/core/end2end/tests/authority_not_supported.cc2
-rw-r--r--test/core/end2end/tests/binary_metadata.cc4
-rw-r--r--test/core/end2end/tests/retry.cc2
-rw-r--r--test/core/end2end/tests/retry_cancel_during_delay.cc2
-rw-r--r--test/core/end2end/tests/retry_cancel_with_multiple_send_batches.cc346
-rw-r--r--test/core/end2end/tests/retry_cancellation.cc2
-rw-r--r--test/core/end2end/tests/retry_disabled.cc44
-rw-r--r--test/core/end2end/tests/retry_exceeds_buffer_size_in_delay.cc2
-rw-r--r--test/core/end2end/tests/retry_exceeds_buffer_size_in_initial_batch.cc2
-rw-r--r--test/core/end2end/tests/retry_exceeds_buffer_size_in_subsequent_batch.cc2
-rw-r--r--test/core/end2end/tests/retry_lb_drop.cc20
-rw-r--r--test/core/end2end/tests/retry_lb_fail.cc276
-rw-r--r--test/core/end2end/tests/retry_non_retriable_status.cc2
-rw-r--r--test/core/end2end/tests/retry_non_retriable_status_before_recv_trailing_metadata_started.cc8
-rw-r--r--test/core/end2end/tests/retry_per_attempt_recv_timeout.cc4
-rw-r--r--test/core/end2end/tests/retry_per_attempt_recv_timeout_on_last_attempt.cc263
-rw-r--r--test/core/end2end/tests/retry_recv_initial_metadata.cc14
-rw-r--r--test/core/end2end/tests/retry_recv_message.cc2
-rw-r--r--test/core/end2end/tests/retry_recv_trailing_metadata_error.cc2
-rw-r--r--test/core/end2end/tests/retry_send_initial_metadata_refs.cc359
-rw-r--r--test/core/end2end/tests/retry_send_op_fails.cc2
-rw-r--r--test/core/end2end/tests/retry_server_pushback_delay.cc2
-rw-r--r--test/core/end2end/tests/retry_server_pushback_disabled.cc2
-rw-r--r--test/core/end2end/tests/retry_streaming.cc2
-rw-r--r--test/core/end2end/tests/retry_streaming_after_commit.cc2
-rw-r--r--test/core/end2end/tests/retry_streaming_succeeds_before_replay_finished.cc2
-rw-r--r--test/core/end2end/tests/retry_throttled.cc2
-rw-r--r--test/core/end2end/tests/retry_too_many_attempts.cc2
-rw-r--r--test/core/end2end/tests/simple_cacheable_request.cc4
-rw-r--r--test/core/end2end/tests/simple_metadata.cc4
-rw-r--r--test/core/end2end/tests/trailing_metadata.cc6
-rw-r--r--test/core/gprpp/BUILD51
-rw-r--r--test/core/gprpp/bitset_test.cc82
-rw-r--r--test/core/gprpp/match_test.cc75
-rw-r--r--test/core/gprpp/overload_test.cc36
-rw-r--r--test/core/gprpp/table_test.cc151
-rw-r--r--test/core/handshake/client_ssl.cc6
-rw-r--r--test/core/handshake/server_ssl_common.cc6
-rwxr-xr-xtest/core/http/test_server.py3
-rw-r--r--test/core/iomgr/tcp_client_posix_test.cc2
-rw-r--r--test/core/iomgr/tcp_client_uv_test.cc2
-rw-r--r--test/core/security/grpc_tls_certificate_provider_test.cc49
-rw-r--r--test/core/security/matchers_test.cc14
-rw-r--r--test/core/transport/binder/BUILD34
-rw-r--r--test/core/transport/binder/binder_smoke_test.cc38
-rw-r--r--test/core/transport/chttp2/hpack_parser_fuzzer_test.cc12
-rw-r--r--test/core/transport/chttp2/hpack_parser_test.cc334
-rw-r--r--test/core/util/BUILD15
-rw-r--r--test/core/util/test_lb_policies.cc15
-rw-r--r--test/core/util/test_tcp_server.cc1
-rw-r--r--test/core/util/tsan_suppressions.txt2
-rw-r--r--test/core/xds/xds_bootstrap_test.cc31
-rw-r--r--test/cpp/codegen/compiler_test_golden4
-rw-r--r--test/cpp/end2end/client_lb_end2end_test.cc90
-rw-r--r--test/cpp/end2end/end2end_test.cc1
-rw-r--r--test/cpp/end2end/grpclb_end2end_test.cc31
-rw-r--r--test/cpp/end2end/mock_test.cc32
-rw-r--r--test/cpp/end2end/service_config_end2end_test.cc32
-rw-r--r--test/cpp/end2end/xds_end2end_test.cc1404
-rw-r--r--test/cpp/ext/filters/census/stats_plugin_end2end_test.cc134
-rw-r--r--test/cpp/interop/xds_interop_client.cc13
-rw-r--r--test/cpp/microbenchmarks/bm_chttp2_hpack.cc34
-rwxr-xr-xtest/cpp/naming/gen_build_yaml.py3
-rwxr-xr-xtest/cpp/naming/resolver_component_tests_runner.py9
-rwxr-xr-xtest/cpp/naming/utils/dns_resolver.py3
-rwxr-xr-xtest/cpp/naming/utils/dns_server.py19
-rwxr-xr-xtest/cpp/naming/utils/run_dns_server_for_lb_interop_tests.py7
-rwxr-xr-xtest/cpp/naming/utils/tcp_connect.py2
-rwxr-xr-xtest/cpp/qps/gen_build_yaml.py4
-rwxr-xr-xtest/cpp/qps/json_run_localhost_scenario_gen.py3
-rwxr-xr-xtest/cpp/qps/qps_json_driver_scenario_gen.py3
-rwxr-xr-xtest/distrib/python/test_packages.sh2
-rwxr-xr-xtest/distrib/ruby/run_distrib_test.sh2
-rw-r--r--test/http2_test/http2_base_server.py2
-rw-r--r--test/http2_test/http2_server_health_check.py3
-rw-r--r--test/http2_test/http2_test_server.py10
-rw-r--r--test/http2_test/test_data_frame_padding.py3
-rw-r--r--test/http2_test/test_max_streams.py2
-rw-r--r--third_party/README.md25
-rw-r--r--third_party/py/python_configure.bzl2
-rw-r--r--third_party/xxhash/.gitattributes10
-rw-r--r--third_party/xxhash/.gitignore47
-rw-r--r--third_party/xxhash/.travis.yml138
-rw-r--r--third_party/xxhash/Android.bp21
-rw-r--r--third_party/xxhash/CHANGELOG52
-rw-r--r--third_party/xxhash/Doxyfile58
-rw-r--r--third_party/xxhash/Makefile506
-rw-r--r--third_party/xxhash/README.md235
-rw-r--r--third_party/xxhash/appveyor.yml111
-rw-r--r--third_party/xxhash/cli/xsum_arch.h153
-rw-r--r--third_party/xxhash/cli/xsum_config.h205
-rw-r--r--third_party/xxhash/cli/xsum_os_specific.c487
-rw-r--r--third_party/xxhash/cli/xsum_os_specific.h89
-rw-r--r--third_party/xxhash/cli/xsum_output.c67
-rw-r--r--third_party/xxhash/cli/xsum_output.h62
-rw-r--r--third_party/xxhash/cli/xsum_sanity_check.c602
-rw-r--r--third_party/xxhash/cli/xsum_sanity_check.h60
-rw-r--r--third_party/xxhash/cmake_unofficial/.gitignore12
-rw-r--r--third_party/xxhash/cmake_unofficial/CMakeLists.txt173
-rw-r--r--third_party/xxhash/cmake_unofficial/README.md36
-rw-r--r--third_party/xxhash/cmake_unofficial/xxHashConfig.cmake.in4
-rw-r--r--third_party/xxhash/doc/README.md9
-rw-r--r--third_party/xxhash/doc/xxhash.cry206
-rw-r--r--third_party/xxhash/doc/xxhash_spec.md317
-rw-r--r--third_party/xxhash/libxxhash.pc.in15
-rw-r--r--third_party/xxhash/tests/Makefile83
-rw-r--r--third_party/xxhash/tests/bench/.clang_complete1
-rw-r--r--third_party/xxhash/tests/bench/.gitignore11
-rw-r--r--third_party/xxhash/tests/bench/LICENSE339
-rw-r--r--third_party/xxhash/tests/bench/Makefile67
-rw-r--r--third_party/xxhash/tests/bench/benchHash.c164
-rw-r--r--third_party/xxhash/tests/bench/benchHash.h67
-rw-r--r--third_party/xxhash/tests/bench/benchfn.c252
-rw-r--r--third_party/xxhash/tests/bench/benchfn.h183
-rw-r--r--third_party/xxhash/tests/bench/bhDisplay.c160
-rw-r--r--third_party/xxhash/tests/bench/bhDisplay.h61
-rw-r--r--third_party/xxhash/tests/bench/hashes.h118
-rw-r--r--third_party/xxhash/tests/bench/main.c220
-rw-r--r--third_party/xxhash/tests/bench/timefn.c168
-rw-r--r--third_party/xxhash/tests/bench/timefn.h89
-rw-r--r--third_party/xxhash/tests/collisions/.gitignore2
-rw-r--r--third_party/xxhash/tests/collisions/LICENSE339
-rw-r--r--third_party/xxhash/tests/collisions/Makefile74
-rw-r--r--third_party/xxhash/tests/collisions/README.md122
-rw-r--r--third_party/xxhash/tests/collisions/allcodecs/README.md1
-rw-r--r--third_party/xxhash/tests/collisions/allcodecs/dummy.c38
-rw-r--r--third_party/xxhash/tests/collisions/allcodecs/dummy.h45
-rw-r--r--third_party/xxhash/tests/collisions/hashes.h127
-rw-r--r--third_party/xxhash/tests/collisions/main.c1120
-rw-r--r--third_party/xxhash/tests/collisions/pool.c344
-rw-r--r--third_party/xxhash/tests/collisions/pool.h80
-rw-r--r--third_party/xxhash/tests/collisions/sort.cc59
-rw-r--r--third_party/xxhash/tests/collisions/sort.hh40
-rw-r--r--third_party/xxhash/tests/collisions/threading.c82
-rw-r--r--third_party/xxhash/tests/collisions/threading.h124
-rw-r--r--third_party/xxhash/tests/generate_unicode_test.c154
-rw-r--r--third_party/xxhash/tests/multiInclude.c66
-rw-r--r--third_party/xxhash/tests/ppc_define.c62
-rw-r--r--third_party/xxhash/xxh3.h55
-rw-r--r--third_party/xxhash/xxh_x86dispatch.c770
-rw-r--r--third_party/xxhash/xxh_x86dispatch.h86
-rw-r--r--third_party/xxhash/xxhash.c43
-rw-r--r--third_party/xxhash/xxhash.h272
-rw-r--r--third_party/xxhash/xxhsum.1165
-rw-r--r--third_party/xxhash/xxhsum.1.md148
-rw-r--r--third_party/xxhash/xxhsum.c1503
-rw-r--r--tools/bazel.rc2
-rwxr-xr-xtools/buildgen/_mako_renderer.py2
-rw-r--r--tools/buildgen/_utils.py4
-rwxr-xr-xtools/buildgen/build_cleaner.py1
-rwxr-xr-xtools/buildgen/extract_metadata_from_bazel_xml.py13
-rwxr-xr-xtools/buildgen/generate_projects.py8
-rwxr-xr-xtools/buildgen/plugins/list_api.py1
-rwxr-xr-xtools/codegen/core/gen_header_frame.py2
-rw-r--r--tools/codegen/core/gen_hpack_tables.cc106
-rwxr-xr-xtools/codegen/core/gen_settings_ids.py3
-rwxr-xr-xtools/codegen/core/gen_static_metadata.py7
-rwxr-xr-xtools/codegen/core/gen_stats_data.py3
-rwxr-xr-xtools/codegen/core/gen_upb_api.sh21
-rwxr-xr-xtools/debug/core/chttp2_ref_leak.py2
-rw-r--r--tools/debug/core/error_ref_leak.py2
-rwxr-xr-xtools/distrib/check_copyright.py84
-rwxr-xr-xtools/distrib/check_include_guards.py2
-rwxr-xr-xtools/distrib/gen_compilation_database.py2
-rwxr-xr-xtools/distrib/isort_code.sh57
-rw-r--r--tools/distrib/python/.gitignore2
-rwxr-xr-xtools/distrib/python/docgen.py1
-rw-r--r--tools/distrib/python/grpc_prefixed/templates/setup.py.template1
-rw-r--r--tools/distrib/python/grpc_version.py2
-rw-r--r--tools/distrib/python/grpcio_tools/grpc_tools/_protoc_compiler.pyx8
-rw-r--r--tools/distrib/python/grpcio_tools/grpc_tools/command.py5
-rw-r--r--tools/distrib/python/grpcio_tools/grpc_tools/protoc.py5
-rw-r--r--tools/distrib/python/grpcio_tools/grpc_tools/test/protoc_test.py2
-rw-r--r--tools/distrib/python/grpcio_tools/grpc_version.py2
-rw-r--r--tools/distrib/python/grpcio_tools/setup.py13
-rw-r--r--tools/distrib/python/xds_protos/build.py10
-rwxr-xr-xtools/distrib/python/xds_protos/build_validate_upload.sh10
-rw-r--r--tools/distrib/python/xds_protos/setup.py4
-rwxr-xr-xtools/distrib/run_clang_tidy.py6
-rwxr-xr-xtools/distrib/sanitize.sh3
-rw-r--r--tools/dockerfile/distribtest/python_arch_x64/Dockerfile8
-rw-r--r--tools/dockerfile/distribtest/python_centos6_x64/Dockerfile33
-rw-r--r--tools/dockerfile/distribtest/python_centos7_x64/Dockerfile3
-rw-r--r--tools/dockerfile/distribtest/python_dev_alpine3.7_x64/Dockerfile6
-rw-r--r--tools/dockerfile/distribtest/python_dev_arch_x64/Dockerfile8
-rw-r--r--tools/dockerfile/distribtest/python_dev_centos7_x64/Dockerfile10
-rw-r--r--tools/dockerfile/distribtest/python_dev_fedora23_x64/Dockerfile6
-rw-r--r--tools/dockerfile/distribtest/python_dev_jessie_x64/Dockerfile6
-rw-r--r--tools/dockerfile/distribtest/python_dev_jessie_x86/Dockerfile6
-rw-r--r--tools/dockerfile/distribtest/python_dev_ubuntu1604_x64/Dockerfile6
-rw-r--r--tools/dockerfile/distribtest/python_dev_ubuntu1804_x64/Dockerfile6
-rw-r--r--tools/dockerfile/distribtest/python_fedora34_x64/Dockerfile (renamed from tools/dockerfile/distribtest/python_fedora23_x64/Dockerfile)6
-rw-r--r--tools/dockerfile/distribtest/python_opensuse_x64/Dockerfile8
-rw-r--r--tools/dockerfile/distribtest/python_stretch_x64/Dockerfile (renamed from tools/dockerfile/distribtest/python_jessie_x64/Dockerfile)6
-rw-r--r--tools/dockerfile/distribtest/python_stretch_x86/Dockerfile (renamed from tools/dockerfile/distribtest/python_jessie_x86/Dockerfile)6
-rw-r--r--tools/dockerfile/distribtest/python_ubuntu1604_x64/Dockerfile4
-rw-r--r--tools/dockerfile/distribtest/python_ubuntu1804_x64/Dockerfile4
-rw-r--r--tools/dockerfile/grpc_dist_proto/Dockerfile2
-rw-r--r--tools/dockerfile/test/bazel/Dockerfile14
-rw-r--r--tools/dockerfile/test/binder_transport_apk/Dockerfile73
-rw-r--r--tools/doxygen/Doxyfile.c++2
-rw-r--r--tools/doxygen/Doxyfile.c++.internal23
-rw-r--r--tools/doxygen/Doxyfile.core.internal22
-rw-r--r--tools/doxygen/Doxyfile.objc2
-rw-r--r--tools/doxygen/Doxyfile.objc.internal2
-rw-r--r--tools/doxygen/Doxyfile.php2
-rw-r--r--tools/gcp/github_stats_tracking/fetch_data.py7
-rw-r--r--tools/gcp/github_stats_tracking/main.py2
-rwxr-xr-xtools/gcp/utils/big_query_utils.py2
-rw-r--r--tools/github/pr_latency.py5
-rwxr-xr-xtools/internal_ci/linux/grpc_bazel_build_in_docker.sh6
-rw-r--r--tools/internal_ci/linux/grpc_binder_transport_apk.cfg23
-rwxr-xr-xtools/internal_ci/linux/grpc_binder_transport_apk.sh25
-rw-r--r--tools/internal_ci/linux/grpc_binder_transport_apk_build_in_docker.sh33
-rwxr-xr-xtools/internal_ci/linux/grpc_e2e_performance_gke.sh10
-rwxr-xr-xtools/internal_ci/linux/grpc_e2e_performance_v2.sh12
-rwxr-xr-xtools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh3
-rwxr-xr-xtools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh3
-rwxr-xr-xtools/internal_ci/linux/grpc_xds_k8s.sh5
-rw-r--r--tools/internal_ci/linux/grpc_xds_k8s_install_test_driver.sh17
-rwxr-xr-xtools/internal_ci/linux/grpc_xds_k8s_python.sh6
-rwxr-xr-xtools/internal_ci/linux/grpc_xds_url_map.sh12
-rw-r--r--tools/internal_ci/linux/grpc_xds_url_map_python.cfg26
-rwxr-xr-xtools/internal_ci/linux/grpc_xds_url_map_python.sh146
-rw-r--r--tools/internal_ci/windows/bazel_rbe.bat2
-rw-r--r--tools/interop_matrix/client_matrix.py4
-rwxr-xr-xtools/line_count/collect-history.py2
-rwxr-xr-xtools/line_count/summarize-history.py2
-rwxr-xr-xtools/line_count/yaml2csv.py5
-rwxr-xr-xtools/profiling/ios_bin/binary_size.py1
-rwxr-xr-xtools/profiling/ios_bin/parse_link_map.py2
-rwxr-xr-xtools/profiling/microbenchmarks/bm2bq.py6
-rwxr-xr-xtools/profiling/qps/qps_diff.py3
-rw-r--r--tools/release/release_notes.py10
-rw-r--r--tools/release/verify_python_release.py3
-rw-r--r--tools/run_tests/artifacts/artifact_targets.py7
-rw-r--r--tools/run_tests/artifacts/distribtest_targets.py7
-rw-r--r--tools/run_tests/generated/tests.json120
-rwxr-xr-xtools/run_tests/lb_interop_tests/gen_build_yaml.py1
-rw-r--r--tools/run_tests/performance/README.md24
-rwxr-xr-xtools/run_tests/performance/bq_upload_result.py1
-rwxr-xr-xtools/run_tests/performance/loadtest_concat_yaml.py1
-rwxr-xr-xtools/run_tests/performance/loadtest_config.py8
-rwxr-xr-xtools/run_tests/performance/loadtest_examples.sh9
-rwxr-xr-xtools/run_tests/performance/loadtest_template.py4
-rwxr-xr-xtools/run_tests/performance/scenario_config_exporter.py1
-rw-r--r--tools/run_tests/performance/templates/loadtest_template_basic_all_languages.yaml26
-rw-r--r--tools/run_tests/performance/templates/loadtest_template_prebuilt_all_languages.yaml19
-rw-r--r--tools/run_tests/python_utils/check_on_pr.py7
-rwxr-xr-xtools/run_tests/python_utils/dockerjob.py6
-rw-r--r--tools/run_tests/python_utils/download_and_unzip.py3
-rw-r--r--tools/run_tests/python_utils/filter_pull_request_tests.py3
-rwxr-xr-xtools/run_tests/python_utils/jobset.py2
-rwxr-xr-xtools/run_tests/python_utils/port_server.py12
-rw-r--r--tools/run_tests/python_utils/report_utils.py3
-rw-r--r--tools/run_tests/python_utils/start_port_server.py7
-rwxr-xr-xtools/run_tests/python_utils/upload_rbe_results.py5
-rw-r--r--tools/run_tests/python_utils/upload_test_results.py3
-rwxr-xr-xtools/run_tests/python_utils/watch_dirs.py1
-rwxr-xr-xtools/run_tests/run_grpclb_interop_tests.py3
-rwxr-xr-xtools/run_tests/run_interop_tests.py12
-rwxr-xr-xtools/run_tests/run_performance_tests.py1
-rwxr-xr-xtools/run_tests/run_tests.py21
-rwxr-xr-xtools/run_tests/run_tests_matrix.py2
-rwxr-xr-xtools/run_tests/run_xds_tests.py23
-rwxr-xr-xtools/run_tests/sanity/check_port_platform.py23
-rwxr-xr-xtools/run_tests/sanity/check_qps_scenario_changes.py2
-rwxr-xr-xtools/run_tests/sanity/check_submodules.sh9
-rwxr-xr-xtools/run_tests/sanity/check_test_filtering.py5
-rwxr-xr-xtools/run_tests/sanity/check_tracer_sanity.py2
-rwxr-xr-xtools/run_tests/sanity/check_version.py5
-rw-r--r--tools/run_tests/sanity/sanity_tests.yaml2
-rw-r--r--tools/run_tests/xds_k8s_test_driver/README.md23
-rwxr-xr-xtools/run_tests/xds_k8s_test_driver/bin/cleanup.sh6
-rwxr-xr-xtools/run_tests/xds_k8s_test_driver/bin/run_channelz.py10
-rwxr-xr-xtools/run_tests/xds_k8s_test_driver/bin/run_td_setup.py72
-rwxr-xr-xtools/run_tests/xds_k8s_test_driver/bin/run_test_client.py14
-rwxr-xr-xtools/run_tests/xds_k8s_test_driver/bin/run_test_server.py17
-rw-r--r--tools/run_tests/xds_k8s_test_driver/config/common.cfg5
-rw-r--r--tools/run_tests/xds_k8s_test_driver/config/grpc-testing.cfg4
-rw-r--r--tools/run_tests/xds_k8s_test_driver/config/local-dev.cfg.example7
-rw-r--r--tools/run_tests/xds_k8s_test_driver/config/url-map.cfg8
-rw-r--r--tools/run_tests/xds_k8s_test_driver/framework/helpers/datetime.py52
-rw-r--r--tools/run_tests/xds_k8s_test_driver/framework/helpers/highlighter.py99
-rw-r--r--tools/run_tests/xds_k8s_test_driver/framework/helpers/rand.py49
-rw-r--r--tools/run_tests/xds_k8s_test_driver/framework/infrastructure/gcp/api.py25
-rw-r--r--tools/run_tests/xds_k8s_test_driver/framework/infrastructure/gcp/compute.py62
-rw-r--r--tools/run_tests/xds_k8s_test_driver/framework/infrastructure/gcp/network_services.py163
-rw-r--r--tools/run_tests/xds_k8s_test_driver/framework/infrastructure/traffic_director.py333
-rw-r--r--tools/run_tests/xds_k8s_test_driver/framework/rpc/grpc_testing.py33
-rw-r--r--tools/run_tests/xds_k8s_test_driver/framework/test_app/base_runner.py65
-rw-r--r--tools/run_tests/xds_k8s_test_driver/framework/test_app/client_app.py44
-rw-r--r--tools/run_tests/xds_k8s_test_driver/framework/test_app/server_app.py129
-rw-r--r--tools/run_tests/xds_k8s_test_driver/framework/xds_flags.py97
-rw-r--r--tools/run_tests/xds_k8s_test_driver/framework/xds_k8s_flags.py4
-rw-r--r--tools/run_tests/xds_k8s_test_driver/framework/xds_k8s_testcase.py257
-rw-r--r--tools/run_tests/xds_k8s_test_driver/framework/xds_url_map_test_resources.py113
-rw-r--r--tools/run_tests/xds_k8s_test_driver/framework/xds_url_map_testcase.py35
-rw-r--r--tools/run_tests/xds_k8s_test_driver/kubernetes-manifests/client.deployment.yaml5
-rw-r--r--tools/run_tests/xds_k8s_test_driver/requirements.txt2
-rwxr-xr-xtools/run_tests/xds_k8s_test_driver/run.sh2
-rw-r--r--tools/run_tests/xds_k8s_test_driver/tests/app_net_test.py61
-rw-r--r--tools/run_tests/xds_k8s_test_driver/tests/baseline_test.py4
-rw-r--r--tools/run_tests/xds_k8s_test_driver/tests/change_backend_service_test.py106
-rw-r--r--tools/run_tests/xds_k8s_test_driver/tests/failover_test.py127
-rw-r--r--tools/run_tests/xds_k8s_test_driver/tests/remove_neg_test.py103
-rw-r--r--tools/run_tests/xds_k8s_test_driver/tests/round_robin_test.py88
-rw-r--r--tools/run_tests/xds_k8s_test_driver/tests/security_test.py4
-rw-r--r--tools/run_tests/xds_k8s_test_driver/tests/url_map/affinity_test.py217
-rw-r--r--tools/run_tests/xds_k8s_test_driver/tests/url_map/fault_injection_test.py11
-rw-r--r--tools/run_tests/xds_k8s_test_driver/tests/url_map/retry_test.py143
846 files changed, 22048 insertions, 22136 deletions
diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml
index ab0bfd3a19..8349d412a7 100644
--- a/.bazelci/presubmit.yml
+++ b/.bazelci/presubmit.yml
@@ -11,8 +11,8 @@
# [3] https://github.com/grpc/grpc/pull/20784
---
# TODO(yannic): Ideally, we should also enable buildifier and all platforms should test `//...`.
-platforms:
- ubuntu1604:
+tasks:
+ ubuntu1804:
build_targets:
- //:all
- //src/proto/...
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index a3bf2b17ad..1125cabcb5 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -1,8 +1,8 @@
# Auto-generated by the tools/mkowners/mkowners.py tool
# Uses OWNERS files in different modules throughout the
# repository as the source of truth for module ownership.
-/**/OWNERS @markdroth @nicolasnoble @a11r
-/bazel/** @nicolasnoble @jtattermusch @veblush @gnossen
+/**/OWNERS @markdroth @nicolasnoble @a11r @ctiller
+/bazel/** @nicolasnoble @jtattermusch @veblush @gnossen @ctiller
/cmake/** @jtattermusch @nicolasnoble @apolcyn
/src/core/ext/filters/client_channel/** @markdroth
/src/core/ext/xds/** @markdroth
diff --git a/.pylintrc b/.pylintrc
index 08ec7e836d..3f2384e067 100644
--- a/.pylintrc
+++ b/.pylintrc
@@ -95,5 +95,7 @@ disable=
no-else-return,
# NOTE(lidiz): Python 3 make object inheritance default, but not PY2
useless-object-inheritance,
+ # NOTE(lidiz): the import order will be enforced by isort instead
+ wrong-import-order,
# NOTE(sergiitk): yapf compatibility, ref #25071
bad-continuation,
diff --git a/.pylintrc-examples b/.pylintrc-examples
index 0100d84ab6..ba9bded89f 100644
--- a/.pylintrc-examples
+++ b/.pylintrc-examples
@@ -98,5 +98,7 @@ disable=
no-else-return,
# NOTE(lidiz): Python 3 make object inheritance default, but not PY2
useless-object-inheritance,
+ # NOTE(lidiz): the import order will be enforced by isort instead
+ wrong-import-order,
# NOTE(sergiitk): yapf compatibility, ref #25071
bad-continuation,
diff --git a/.pylintrc-tests b/.pylintrc-tests
index 808fe7f6f7..1451201960 100644
--- a/.pylintrc-tests
+++ b/.pylintrc-tests
@@ -124,5 +124,7 @@ disable=
no-else-return,
# NOTE(lidiz): Python 3 make object inheritance default, but not PY2
useless-object-inheritance,
+ # NOTE(lidiz): the import order will be enforced by isort instead
+ wrong-import-order,
# NOTE(sergiitk): yapf compatibility, ref #25071
bad-continuation,
diff --git a/Android.bp b/Android.bp
index 1db3231294..3e837ebc7b 100644
--- a/Android.bp
+++ b/Android.bp
@@ -131,6 +131,7 @@ GRPC_COMMON_SRCS = [
"src/core/ext/transport/chttp2/transport/bin_decoder.cc",
"src/core/ext/transport/chttp2/transport/bin_encoder.cc",
"src/core/ext/transport/chttp2/transport/chttp2_plugin.cc",
+ "src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc",
"src/core/ext/transport/chttp2/transport/chttp2_transport.cc",
"src/core/ext/transport/chttp2/transport/context_list.cc",
"src/core/ext/transport/chttp2/transport/flow_control.cc",
@@ -179,7 +180,6 @@ GRPC_COMMON_SRCS = [
"src/core/lib/debug/trace.cc",
"src/core/lib/event_engine/endpoint_config.cc",
"src/core/lib/event_engine/event_engine.cc",
- "src/core/lib/event_engine/slice_allocator.cc",
"src/core/lib/event_engine/sockaddr.cc",
"src/core/lib/gpr/alloc.cc",
"src/core/lib/gpr/atm.cc",
@@ -587,7 +587,7 @@ cc_defaults {
target: {
vendor: {
// Needs to be updated when a new version is imported.
- suffix: "-1.39.1",
+ suffix: "-1.40.0",
},
},
}
diff --git a/BUILD b/BUILD
index 8a16471c3b..6997bbed3d 100644
--- a/BUILD
+++ b/BUILD
@@ -14,28 +14,29 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-licenses(["notice"])
+load(
+ "//bazel:grpc_build_system.bzl",
+ "grpc_cc_library",
+ "grpc_generate_one_off_targets",
+ "grpc_upb_proto_library",
+ "python_config_settings",
+)
+load("@bazel_skylib//lib:selects.bzl", "selects")
-exports_files([
- "LICENSE",
- "etc/roots.pem",
-])
+licenses(["notice"])
package(
default_visibility = ["//visibility:public"],
features = [
- "-layering_check",
+ "layering_check",
"-parse_headers",
],
)
-load(
- "//bazel:grpc_build_system.bzl",
- "grpc_cc_library",
- "grpc_generate_one_off_targets",
- "grpc_upb_proto_library",
- "python_config_settings",
-)
+exports_files([
+ "LICENSE",
+ "etc/roots.pem",
+])
config_setting(
name = "grpc_no_ares",
@@ -43,11 +44,34 @@ config_setting(
)
config_setting(
- name = "grpc_no_xds",
+ name = "grpc_no_xds_define",
values = {"define": "grpc_no_xds=true"},
)
config_setting(
+ name = "android",
+ values = {"crosstool_top": "//external:android/crosstool"},
+)
+
+config_setting(
+ name = "ios",
+ values = {"apple_platform_type": "ios"},
+)
+
+selects.config_setting_group(
+ name = "grpc_no_xds",
+ match_any = [
+ ":grpc_no_xds_define",
+ # In addition to disabling XDS support when --define=grpc_no_xds=true is
+ # specified, we also disable it on mobile platforms where it is not
+ # likely to be needed and where reducing the binary size is more
+ # important.
+ ":android",
+ ":ios",
+ ],
+)
+
+config_setting(
name = "grpc_allow_exceptions",
values = {"define": "GRPC_ALLOW_EXCEPTIONS=1"},
)
@@ -85,11 +109,11 @@ config_setting(
python_config_settings()
# This should be updated along with build_handwritten.yaml
-g_stands_for = "goofy" # @unused
+g_stands_for = "guileless" # @unused
core_version = "18.0.0" # @unused
-version = "1.39.1" # @unused
+version = "1.40.0" # @unused
GPR_PUBLIC_HDRS = [
"include/grpc/support/alloc.h",
@@ -299,6 +323,7 @@ grpc_cc_library(
language = "c++",
public_hdrs = GPR_PUBLIC_HDRS,
standalone = True,
+ visibility = ["@grpc:public"],
deps = [
"gpr_base",
],
@@ -317,8 +342,11 @@ grpc_cc_library(
standalone = True,
visibility = ["@grpc:public"],
deps = [
+ "gpr_base",
+ "grpc_base_c",
"grpc_common",
"grpc_lb_policy_grpclb",
+ "grpc_trace",
],
)
@@ -348,13 +376,15 @@ grpc_cc_library(
},
standalone = True,
visibility = [
- "@grpc:alt_grpc_legacy",
"@grpc:public",
],
deps = [
+ "gpr_base",
+ "grpc_base_c",
"grpc_common",
"grpc_lb_policy_grpclb_secure",
"grpc_secure",
+ "grpc_trace",
"grpc_transport_chttp2_client_secure",
"grpc_transport_chttp2_server_secure",
],
@@ -389,7 +419,6 @@ grpc_cc_library(
},
standalone = True,
visibility = [
- "@grpc:alt_grpc++_legacy",
"@grpc:public",
],
deps = [
@@ -420,18 +449,23 @@ grpc_cc_library(
],
external_deps = [
"absl/synchronization",
+ "absl/container:inlined_vector",
+ "absl/strings",
"protobuf_headers",
],
language = "c++",
public_hdrs = GRPCXX_PUBLIC_HDRS,
deps = [
- "gpr",
+ "gpr_base",
"grpc",
"grpc++_base",
"grpc++_codegen_base",
"grpc++_codegen_base_src",
"grpc++_codegen_proto",
+ "grpc_base_c",
+ "grpc_codegen",
"grpc_secure",
+ "ref_counted_ptr",
],
)
@@ -443,6 +477,9 @@ grpc_cc_library(
hdrs = [
"src/cpp/client/secure_credentials.h",
],
+ external_deps = [
+ "absl/container:inlined_vector",
+ ],
language = "c++",
deps = [
"grpc++_internals",
@@ -461,6 +498,7 @@ grpc_cc_library(
public_hdrs = [
"include/grpcpp/xds_server_builder.h",
],
+ visibility = ["@grpc:xds"],
deps = [
"grpc++_internals",
],
@@ -497,6 +535,7 @@ grpc_cc_library(
],
language = "c++",
standalone = True,
+ visibility = ["@grpc:public"],
deps = [
"grpc++",
],
@@ -512,12 +551,18 @@ grpc_cc_library(
"include/grpcpp/security/alts_context.h",
"include/grpcpp/security/alts_util.h",
],
+ external_deps = [
+ "upb_lib",
+ ],
language = "c++",
standalone = True,
+ visibility = ["@grpc:tsi"],
deps = [
"alts_upb",
"alts_util",
+ "gpr_base",
"grpc++",
+ "tsi",
],
)
@@ -543,7 +588,9 @@ grpc_cc_library(
"include/grpc/census.h",
],
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
+ "grpc_trace",
],
)
@@ -613,7 +660,6 @@ grpc_cc_library(
],
hdrs = [
"src/core/lib/gpr/alloc.h",
- "src/core/lib/gpr/arena.h",
"src/core/lib/gpr/env.h",
"src/core/lib/gpr/murmur_hash.h",
"src/core/lib/gpr/spinlock.h",
@@ -648,16 +694,20 @@ grpc_cc_library(
],
external_deps = [
"absl/base",
+ "absl/base:core_headers",
"absl/memory",
"absl/status",
"absl/strings",
+ "absl/strings:cord",
"absl/strings:str_format",
"absl/synchronization",
"absl/time:time",
"absl/types:optional",
+ "upb_lib",
],
language = "c++",
public_hdrs = GPR_PUBLIC_HDRS,
+ visibility = ["@grpc:alt_gpr_base_legacy"],
deps = [
"debug_location",
"google_api_upb",
@@ -686,6 +736,17 @@ grpc_cc_library(
"include/grpc/impl/codegen/sync_posix.h",
"include/grpc/impl/codegen/sync_windows.h",
],
+ visibility = ["@grpc:public"],
+)
+
+# A library that vends only port_platform, so that libraries that don't need
+# anything else from gpr can still be portable!
+grpc_cc_library(
+ name = "gpr_platform",
+ language = "c++",
+ public_hdrs = [
+ "include/grpc/impl/codegen/port_platform.h",
+ ],
)
grpc_cc_library(
@@ -694,9 +755,10 @@ grpc_cc_library(
hdrs = ["src/core/lib/debug/trace.h"],
language = "c++",
public_hdrs = GRPC_PUBLIC_HDRS,
+ visibility = ["@grpc:trace"],
deps = [
+ "gpr",
"grpc_codegen",
- ":gpr",
],
)
@@ -715,12 +777,54 @@ grpc_cc_library(
name = "debug_location",
language = "c++",
public_hdrs = ["src/core/lib/gprpp/debug_location.h"],
+ visibility = ["@grpc:debug_location"],
+)
+
+grpc_cc_library(
+ name = "overload",
+ language = "c++",
+ public_hdrs = ["src/core/lib/gprpp/overload.h"],
+ deps = ["gpr_platform"],
+)
+
+grpc_cc_library(
+ name = "match",
+ external_deps = [
+ "absl/types:variant",
+ ],
+ language = "c++",
+ public_hdrs = ["src/core/lib/gprpp/match.h"],
+ deps = [
+ "gpr_platform",
+ "overload",
+ ],
+)
+
+grpc_cc_library(
+ name = "table",
+ external_deps = ["absl/utility"],
+ language = "c++",
+ public_hdrs = ["src/core/lib/gprpp/table.h"],
+ deps = [
+ "bitset",
+ "gpr_platform",
+ ],
+)
+
+grpc_cc_library(
+ name = "bitset",
+ language = "c++",
+ public_hdrs = ["src/core/lib/gprpp/bitset.h"],
+ deps = [
+ "gpr_platform",
+ ],
)
grpc_cc_library(
name = "orphanable",
language = "c++",
public_hdrs = ["src/core/lib/gprpp/orphanable.h"],
+ visibility = ["@grpc:client_channel"],
deps = [
"debug_location",
"gpr_base",
@@ -761,6 +865,7 @@ grpc_cc_library(
name = "ref_counted_ptr",
language = "c++",
public_hdrs = ["src/core/lib/gprpp/ref_counted_ptr.h"],
+ visibility = ["@grpc:ref_counted_ptr"],
deps = [
"gpr_base",
],
@@ -794,7 +899,6 @@ grpc_cc_library(
"src/core/lib/debug/stats_data.cc",
"src/core/lib/event_engine/endpoint_config.cc",
"src/core/lib/event_engine/event_engine.cc",
- "src/core/lib/event_engine/slice_allocator.cc",
"src/core/lib/event_engine/sockaddr.cc",
"src/core/lib/http/format_request.cc",
"src/core/lib/http/httpcli.cc",
@@ -948,6 +1052,7 @@ grpc_cc_library(
"src/core/lib/address_utils/sockaddr_utils.h",
"src/core/lib/avl/avl.h",
"src/core/lib/backoff/backoff.h",
+ "src/core/lib/channel/call_tracer.h",
"src/core/lib/channel/channel_args.h",
"src/core/lib/channel/channel_stack.h",
"src/core/lib/channel/channel_stack_builder.h",
@@ -1092,20 +1197,24 @@ grpc_cc_library(
"src/core/lib/uri/uri_parser.h",
],
external_deps = [
- "madler_zlib",
+ "absl/container:flat_hash_map",
"absl/container:inlined_vector",
"absl/functional:bind_front",
- "absl/status",
+ "absl/memory",
"absl/status:statusor",
+ "absl/status",
+ "absl/strings:str_format",
"absl/strings",
"absl/types:optional",
- "absl/container:flat_hash_map",
+ "madler_zlib",
],
language = "c++",
public_hdrs = GRPC_PUBLIC_HDRS + GRPC_PUBLIC_EVENT_ENGINE_HDRS,
+ visibility = ["@grpc:alt_grpc_base_legacy"],
deps = [
"dual_ref_counted",
"gpr_base",
+ "gpr_codegen",
"grpc_codegen",
"grpc_trace",
"orphanable",
@@ -1120,8 +1229,10 @@ grpc_cc_library(
"src/core/lib/surface/lame_client.cc",
],
language = "c++",
+ visibility = ["@grpc:alt_grpc_base_legacy"],
deps = [
"atomic",
+ "gpr_base",
"grpc_base_c",
],
)
@@ -1227,14 +1338,22 @@ grpc_cc_library(
],
external_deps = [
"absl/container:inlined_vector",
+ "absl/strings",
+ "absl/strings:str_format",
+ "absl/types:optional",
+ "absl/status:statusor",
+ "upb_lib",
],
language = "c++",
+ visibility = ["@grpc:client_channel"],
deps = [
+ "debug_location",
"gpr_base",
- "grpc_base",
+ "grpc_base_c",
"grpc_client_authority_filter",
"grpc_deadline_filter",
"grpc_health_upb",
+ "grpc_trace",
"orphanable",
"ref_counted",
"ref_counted_ptr",
@@ -1249,7 +1368,8 @@ grpc_cc_library(
],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
],
)
@@ -1263,7 +1383,8 @@ grpc_cc_library(
],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
],
)
@@ -1277,7 +1398,8 @@ grpc_cc_library(
],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
],
)
@@ -1291,7 +1413,8 @@ grpc_cc_library(
],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
],
)
@@ -1303,10 +1426,15 @@ grpc_cc_library(
hdrs = [
"src/core/ext/filters/message_size/message_size_filter.h",
],
+ external_deps = ["absl/strings:str_format"],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_client_channel",
+ "grpc_codegen",
+ "ref_counted",
+ "ref_counted_ptr",
],
)
@@ -1320,9 +1448,11 @@ grpc_cc_library(
"src/core/ext/filters/fault_injection/fault_injection_filter.h",
"src/core/ext/filters/fault_injection/service_config_parser.h",
],
+ external_deps = ["absl/strings"],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_client_channel",
],
)
@@ -1342,9 +1472,15 @@ grpc_cc_library(
"src/core/ext/filters/http/message_compress/message_decompress_filter.h",
"src/core/ext/filters/http/server/http_server_filter.h",
],
+ external_deps = [
+ "absl/strings:str_format",
+ "absl/strings",
+ "absl/types:optional",
+ ],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_message_size_filter",
],
)
@@ -1359,7 +1495,8 @@ grpc_cc_library(
],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_server_backward_compatibility",
],
)
@@ -1377,6 +1514,7 @@ grpc_cc_library(
"include/grpc/impl/codegen/status.h",
"include/grpc/impl/codegen/slice.h",
],
+ visibility = ["@grpc:public"],
deps = [
"gpr_codegen",
],
@@ -1391,8 +1529,10 @@ grpc_cc_library(
"src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h",
],
language = "c++",
+ visibility = ["@grpc:grpclb"],
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_client_channel",
],
)
@@ -1413,14 +1553,25 @@ grpc_cc_library(
"src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h",
"src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h",
],
+ external_deps = [
+ "absl/memory",
+ "absl/container:inlined_vector",
+ "absl/strings",
+ "absl/strings:str_format",
+ "upb_lib",
+ ],
language = "c++",
deps = [
- "grpc_base",
+ "google_api_upb",
+ "gpr_base",
+ "grpc_base_c",
"grpc_client_channel",
"grpc_grpclb_balancer_addresses",
"grpc_lb_upb",
"grpc_resolver_fake",
"grpc_transport_chttp2_client_insecure",
+ "orphanable",
+ "ref_counted_ptr",
],
)
@@ -1440,15 +1591,26 @@ grpc_cc_library(
"src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h",
"src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h",
],
+ external_deps = [
+ "absl/memory",
+ "absl/container:inlined_vector",
+ "absl/strings",
+ "absl/strings:str_format",
+ "upb_lib",
+ ],
language = "c++",
deps = [
- "grpc_base",
+ "google_api_upb",
+ "gpr_base",
+ "grpc_base_c",
"grpc_client_channel",
"grpc_grpclb_balancer_addresses",
"grpc_lb_upb",
"grpc_resolver_fake",
"grpc_secure",
"grpc_transport_chttp2_client_secure",
+ "orphanable",
+ "ref_counted_ptr",
],
)
@@ -1484,21 +1646,36 @@ grpc_cc_library(
],
external_deps = [
"absl/functional:bind_front",
+ "absl/status:statusor",
+ "absl/strings",
+ "absl/strings:str_format",
+ "absl/container:inlined_vector",
"upb_lib",
"upb_textformat_lib",
"upb_json_lib",
"re2",
+ "upb_reflection",
],
language = "c++",
deps = [
"envoy_ads_upb",
"envoy_ads_upbdefs",
- "grpc_base",
+ "envoy_core_upb",
+ "envoy_core_upbdefs",
+ "envoy_type_upb",
+ "google_api_upb",
+ "gpr_base",
+ "gpr_codegen",
+ "grpc_base_c",
"grpc_client_channel",
+ "grpc_codegen",
"grpc_fault_injection_filter",
+ "grpc_lb_xds_channel_args",
"grpc_matchers",
"grpc_secure",
"grpc_transport_chttp2_client_secure",
+ "orphanable",
+ "ref_counted_ptr",
"udpa_type_upb",
"udpa_type_upbdefs",
],
@@ -1509,8 +1686,13 @@ grpc_cc_library(
srcs = [
"src/core/ext/xds/xds_server_config_fetcher.cc",
],
+ external_deps = [
+ "absl/strings",
+ ],
language = "c++",
deps = [
+ "gpr_base",
+ "grpc_base_c",
"grpc_xds_client",
],
)
@@ -1523,9 +1705,13 @@ grpc_cc_library(
hdrs = [
"src/core/ext/xds/google_mesh_ca_certificate_provider_factory.h",
],
+ external_deps = [
+ "absl/strings",
+ ],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_xds_client",
],
)
@@ -1535,11 +1721,17 @@ grpc_cc_library(
srcs = [
"src/core/ext/filters/client_channel/lb_policy/xds/cds.cc",
],
+ external_deps = [
+ "absl/strings",
+ ],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_client_channel",
"grpc_xds_client",
+ "orphanable",
+ "ref_counted_ptr",
],
)
@@ -1558,7 +1750,8 @@ grpc_cc_library(
],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_client_channel",
"grpc_xds_client",
],
@@ -1571,10 +1764,12 @@ grpc_cc_library(
],
external_deps = [
"absl/strings",
+ "absl/types:optional",
],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_client_channel",
"grpc_lb_address_filtering",
"grpc_lb_policy_ring_hash",
@@ -1582,6 +1777,8 @@ grpc_cc_library(
"grpc_lb_xds_common",
"grpc_resolver_fake",
"grpc_xds_client",
+ "orphanable",
+ "ref_counted_ptr",
],
)
@@ -1595,11 +1792,14 @@ grpc_cc_library(
],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_client_channel",
"grpc_lb_xds_channel_args",
"grpc_lb_xds_common",
"grpc_xds_client",
+ "orphanable",
+ "ref_counted_ptr",
],
)
@@ -1610,12 +1810,17 @@ grpc_cc_library(
],
external_deps = [
"absl/strings",
+ "absl/status",
],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_client_channel",
"grpc_resolver_xds_header",
+ "orphanable",
+ "ref_counted",
+ "ref_counted_ptr",
],
)
@@ -1632,7 +1837,8 @@ grpc_cc_library(
],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_client_channel",
],
)
@@ -1644,7 +1850,8 @@ grpc_cc_library(
],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_client_channel",
],
)
@@ -1656,7 +1863,8 @@ grpc_cc_library(
],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_client_channel",
"grpc_lb_subchannel_list",
],
@@ -1676,9 +1884,12 @@ grpc_cc_library(
],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_client_channel",
"grpc_lb_subchannel_list",
+ "grpc_trace",
+ "ref_counted_ptr",
],
)
@@ -1689,9 +1900,12 @@ grpc_cc_library(
],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_client_channel",
"grpc_lb_subchannel_list",
+ "grpc_trace",
+ "ref_counted_ptr",
],
)
@@ -1702,12 +1916,16 @@ grpc_cc_library(
],
external_deps = [
"absl/strings",
+ "absl/strings:str_format",
],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_client_channel",
"grpc_lb_address_filtering",
+ "orphanable",
+ "ref_counted_ptr",
],
)
@@ -1716,11 +1934,18 @@ grpc_cc_library(
srcs = [
"src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc",
],
+ external_deps = [
+ "absl/container:inlined_vector",
+ "absl/strings",
+ ],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_client_channel",
"grpc_lb_address_filtering",
+ "orphanable",
+ "ref_counted_ptr",
],
)
@@ -1735,11 +1960,15 @@ grpc_cc_library(
"src/cpp/server/load_reporter/constants.h",
],
external_deps = [
+ "absl/strings",
+ "absl/strings:str_format",
"opencensus-stats",
],
language = "c++",
deps = [
+ "gpr",
"grpc++_base",
+ "grpc_base_c",
"grpc_secure",
],
alwayslink = 1,
@@ -1756,7 +1985,10 @@ grpc_cc_library(
],
language = "c++",
deps = [
+ "gpr",
+ "gpr_codegen",
"grpc++",
+ "grpc_base_c",
],
)
@@ -1770,6 +2002,8 @@ grpc_cc_library(
],
language = "c++",
deps = [
+ "gpr",
+ "grpc++",
"lb_load_reporter_service",
],
)
@@ -1785,6 +2019,8 @@ grpc_cc_library(
"include/grpcpp/ext/server_load_reporting.h",
],
deps = [
+ "gpr",
+ "gpr_codegen",
"lb_server_load_reporting_filter",
"lb_server_load_reporting_service_server_builder_plugin",
],
@@ -1798,8 +2034,10 @@ grpc_cc_library(
hdrs = [
"src/cpp/server/load_reporter/load_reporter_async_service_impl.h",
],
+ external_deps = ["absl/memory"],
language = "c++",
deps = [
+ "gpr",
"lb_load_reporter",
],
)
@@ -1817,6 +2055,7 @@ grpc_cc_library(
],
language = "c++",
deps = [
+ "gpr_base",
"grpc++",
],
)
@@ -1832,9 +2071,12 @@ grpc_cc_library(
],
external_deps = [
"opencensus-stats",
+ "opencensus-tags",
],
language = "c++",
deps = [
+ "gpr",
+ "gpr_codegen",
"lb_get_cpu_stats",
"lb_load_data_store",
"//src/proto/grpc/lb/v1:load_reporter_proto",
@@ -1851,7 +2093,8 @@ grpc_cc_library(
],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
],
)
@@ -1860,9 +2103,13 @@ grpc_cc_library(
srcs = [
"src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc",
],
+ external_deps = [
+ "absl/strings",
+ ],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_client_channel",
"grpc_resolver_dns_selection",
],
@@ -1887,12 +2134,16 @@ grpc_cc_library(
"src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h",
],
external_deps = [
- "cares",
+ "absl/strings",
+ "absl/strings:str_format",
+ "absl/container:inlined_vector",
"address_sorting",
+ "cares",
],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_client_channel",
"grpc_grpclb_balancer_addresses",
"grpc_resolver_dns_selection",
@@ -1904,9 +2155,13 @@ grpc_cc_library(
srcs = [
"src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc",
],
+ external_deps = [
+ "absl/strings",
+ ],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_client_channel",
],
)
@@ -1921,7 +2176,8 @@ grpc_cc_library(
"@grpc:grpc_resolver_fake",
],
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_client_channel",
],
)
@@ -1941,10 +2197,13 @@ grpc_cc_library(
],
external_deps = [
"xxhash",
+ "re2",
+ "absl/strings",
],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_client_channel",
"grpc_lb_policy_ring_hash",
"grpc_xds_client",
@@ -1958,7 +2217,9 @@ grpc_cc_library(
],
language = "c++",
deps = [
- "grpc_base",
+ "alts_util",
+ "gpr_base",
+ "grpc_base_c",
"grpc_client_channel",
"grpc_xds_client",
],
@@ -2063,15 +2324,31 @@ grpc_cc_library(
"src/core/lib/security/transport/tsi_error.h",
"src/core/lib/security/util/json_util.h",
],
+ external_deps = [
+ "absl/container:inlined_vector",
+ "absl/strings",
+ "absl/strings:str_format",
+ "absl/time",
+ "libcrypto",
+ "libssl",
+ ],
language = "c++",
public_hdrs = GRPC_SECURE_PUBLIC_HDRS,
visibility = ["@grpc:public"],
deps = [
"alts_util",
+ "gpr_base",
"grpc_base",
+ "grpc_base_c",
+ "grpc_client_channel",
+ "grpc_codegen",
"grpc_lb_xds_channel_args",
+ "grpc_trace",
"grpc_transport_chttp2_alpn",
+ "ref_counted",
+ "ref_counted_ptr",
"tsi",
+ "tsi_interface",
],
)
@@ -2088,7 +2365,7 @@ grpc_cc_library(
language = "c++",
deps = [
"google_api_upb",
- "grpc_base",
+ "grpc_base_c",
],
)
@@ -2103,10 +2380,14 @@ grpc_cc_library(
],
external_deps = [
"re2",
+ "absl/memory",
+ "absl/strings",
+ "absl/strings:str_format",
],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
],
)
@@ -2123,9 +2404,14 @@ grpc_cc_library(
"src/core/lib/security/authorization/matchers.h",
"src/core/lib/security/authorization/rbac_policy.h",
],
+ external_deps = [
+ "absl/strings",
+ "absl/strings:str_format",
+ ],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_matchers",
"grpc_secure",
],
@@ -2142,9 +2428,16 @@ grpc_cc_library(
"src/core/lib/security/authorization/grpc_authorization_policy_provider.h",
"src/core/lib/security/authorization/rbac_translator.h",
],
+ external_deps = [
+ "absl/strings",
+ "absl/strings:str_format",
+ ],
language = "c++",
deps = [
+ "gpr_base",
+ "grpc_matchers",
"grpc_rbac_engine",
+ "grpc_secure",
],
)
@@ -2161,6 +2454,7 @@ grpc_cc_library(
language = "c++",
public_hdrs = GRPCXX_PUBLIC_HDRS + GRPC_SECURE_PUBLIC_HDRS,
deps = [
+ "gpr_base",
"grpc++_codegen_base",
"grpc_authorization_provider",
],
@@ -2177,12 +2471,14 @@ grpc_cc_library(
],
external_deps = [
"absl/container:flat_hash_set",
+ "absl/memory",
],
language = "c++",
deps = [
"envoy_ads_upb",
"google_api_upb",
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_mock_cel",
"grpc_rbac_engine",
],
@@ -2194,6 +2490,7 @@ grpc_cc_library(
"src/core/ext/transport/chttp2/transport/bin_decoder.cc",
"src/core/ext/transport/chttp2/transport/bin_encoder.cc",
"src/core/ext/transport/chttp2/transport/chttp2_plugin.cc",
+ "src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc",
"src/core/ext/transport/chttp2/transport/chttp2_transport.cc",
"src/core/ext/transport/chttp2/transport/context_list.cc",
"src/core/ext/transport/chttp2/transport/flow_control.cc",
@@ -2218,6 +2515,7 @@ grpc_cc_library(
hdrs = [
"src/core/ext/transport/chttp2/transport/bin_decoder.h",
"src/core/ext/transport/chttp2/transport/bin_encoder.h",
+ "src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h",
"src/core/ext/transport/chttp2/transport/chttp2_transport.h",
"src/core/ext/transport/chttp2/transport/context_list.h",
"src/core/ext/transport/chttp2/transport/flow_control.h",
@@ -2238,11 +2536,20 @@ grpc_cc_library(
"src/core/ext/transport/chttp2/transport/stream_map.h",
"src/core/ext/transport/chttp2/transport/varint.h",
],
+ external_deps = [
+ "absl/base:core_headers",
+ "absl/memory",
+ "absl/status",
+ "absl/strings",
+ "absl/strings:str_format",
+ ],
language = "c++",
+ visibility = ["@grpc:grpclb"],
deps = [
"gpr_base",
- "grpc_base",
+ "grpc_base_c",
"grpc_http_filters",
+ "grpc_trace",
"grpc_transport_chttp2_alpn",
],
)
@@ -2257,7 +2564,7 @@ grpc_cc_library(
],
language = "c++",
deps = [
- "gpr",
+ "gpr_base",
],
)
@@ -2273,7 +2580,8 @@ grpc_cc_library(
],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_client_channel",
"grpc_transport_chttp2",
],
@@ -2287,7 +2595,8 @@ grpc_cc_library(
],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_client_channel",
"grpc_transport_chttp2",
"grpc_transport_chttp2_client_connector",
@@ -2301,7 +2610,8 @@ grpc_cc_library(
],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_client_channel",
"grpc_secure",
"grpc_transport_chttp2",
@@ -2317,10 +2627,19 @@ grpc_cc_library(
hdrs = [
"src/core/ext/transport/chttp2/server/chttp2_server.h",
],
+ external_deps = [
+ "absl/strings",
+ "absl/strings:str_format",
+ ],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
+ "grpc_codegen",
+ "grpc_http_filters",
"grpc_transport_chttp2",
+ "ref_counted",
+ "ref_counted_ptr",
],
)
@@ -2330,9 +2649,13 @@ grpc_cc_library(
"src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc",
"src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc",
],
+ external_deps = [
+ "absl/strings",
+ ],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_transport_chttp2",
"grpc_transport_chttp2_server",
],
@@ -2343,12 +2666,17 @@ grpc_cc_library(
srcs = [
"src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc",
],
+ external_deps = [
+ "absl/strings",
+ ],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_secure",
"grpc_transport_chttp2",
"grpc_transport_chttp2_server",
+ "ref_counted_ptr",
],
)
@@ -2363,7 +2691,9 @@ grpc_cc_library(
],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
+ "grpc_trace",
],
)
@@ -2377,6 +2707,7 @@ grpc_cc_library(
"src/core/tsi/transport_security_interface.h",
],
language = "c++",
+ visibility = ["@grpc:tsi_interface"],
deps = [
"gpr",
"grpc_trace",
@@ -2418,11 +2749,13 @@ grpc_cc_library(
],
external_deps = [
"libssl",
+ "libcrypto",
],
language = "c++",
+ visibility = ["@grpc:alts_frame_protector"],
deps = [
- "gpr",
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"tsi_interface",
],
)
@@ -2444,12 +2777,16 @@ grpc_cc_library(
"src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h",
"src/core/tsi/alts/handshaker/transport_security_common_api.h",
],
+ external_deps = [
+ "upb_lib",
+ ],
language = "c++",
public_hdrs = GRPC_SECURE_PUBLIC_HDRS,
+ visibility = ["@grpc:tsi"],
deps = [
"alts_upb",
"gpr",
- "grpc_base",
+ "grpc_base_c",
],
)
@@ -2484,13 +2821,17 @@ grpc_cc_library(
],
external_deps = [
"libssl",
+ "libcrypto",
+ "absl/strings",
+ "upb_lib",
],
language = "c++",
+ visibility = ["@grpc:tsi"],
deps = [
"alts_frame_protector",
"alts_util",
- "gpr",
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
"grpc_transport_chttp2_client_insecure",
"tsi_interface",
],
@@ -2502,15 +2843,26 @@ grpc_cc_library(
hdrs = GRPCXX_HDRS,
external_deps = [
"absl/synchronization",
+ "absl/memory",
+ "upb_lib",
"protobuf_headers",
],
language = "c++",
public_hdrs = GRPCXX_PUBLIC_HDRS,
+ visibility = ["@grpc:alt_grpc++_base_legacy"],
deps = [
+ "gpr_base",
"grpc",
"grpc++_codegen_base",
"grpc++_codegen_base_src",
+ "grpc++_internal_hdrs_only",
+ "grpc_base_c",
+ "grpc_client_channel",
+ "grpc_codegen",
"grpc_health_upb",
+ "grpc_trace",
+ "grpc_transport_inproc",
+ "ref_counted",
],
)
@@ -2520,15 +2872,26 @@ grpc_cc_library(
hdrs = GRPCXX_HDRS,
external_deps = [
"absl/synchronization",
+ "absl/memory",
+ "upb_lib",
"protobuf_headers",
],
language = "c++",
public_hdrs = GRPCXX_PUBLIC_HDRS,
+ visibility = ["@grpc:alt_grpc++_base_unsecure_legacy"],
deps = [
+ "gpr_base",
"grpc++_codegen_base",
"grpc++_codegen_base_src",
+ "grpc++_internal_hdrs_only",
+ "grpc_base_c",
+ "grpc_client_channel",
+ "grpc_codegen",
"grpc_health_upb",
+ "grpc_trace",
+ "grpc_transport_inproc",
"grpc_unsecure",
+ "ref_counted",
],
)
@@ -2612,6 +2975,7 @@ grpc_cc_library(
"include/grpcpp/impl/codegen/sync_stream.h",
"include/grpcpp/impl/codegen/time.h",
],
+ visibility = ["@grpc:public"],
deps = [
"grpc++_internal_hdrs_only",
"grpc_codegen",
@@ -2641,6 +3005,7 @@ grpc_cc_library(
"include/grpcpp/impl/codegen/proto_buffer_writer.h",
"include/grpcpp/impl/codegen/proto_utils.h",
],
+ visibility = ["@grpc:public"],
deps = [
"grpc++_codegen_base",
"grpc++_config_proto",
@@ -2657,6 +3022,7 @@ grpc_cc_library(
"include/grpc++/impl/codegen/config_protobuf.h",
"include/grpcpp/impl/codegen/config_protobuf.h",
],
+ visibility = ["@grpc:public"],
)
grpc_cc_library(
@@ -2673,8 +3039,9 @@ grpc_cc_library(
"include/grpc++/ext/proto_server_reflection_plugin.h",
"include/grpcpp/ext/proto_server_reflection_plugin.h",
],
+ visibility = ["@grpc:public"],
deps = [
- ":grpc++",
+ "grpc++",
"//src/proto/grpc/reflection/v1alpha:reflection_proto",
],
alwayslink = 1,
@@ -2694,7 +3061,9 @@ grpc_cc_library(
"include/grpcpp/ext/channelz_service_plugin.h",
],
deps = [
- ":grpc++",
+ "gpr",
+ "grpc",
+ "grpc++",
"//src/proto/grpc/channelz:channelz_proto",
],
alwayslink = 1,
@@ -2708,9 +3077,13 @@ grpc_cc_library(
hdrs = [
"src/cpp/server/csds/csds.h",
],
+ external_deps = ["absl/status:statusor"],
language = "c++",
deps = [
- ":grpc++_internals",
+ "gpr",
+ "grpc",
+ "grpc++_codegen_base",
+ "grpc++_internals",
"//src/proto/grpc/testing/xds/v3:csds_proto",
],
alwayslink = 1,
@@ -2738,8 +3111,9 @@ grpc_cc_library(
"//conditions:default": ["//:grpcpp_csds"],
},
deps = [
- ":grpc++",
- ":grpcpp_channelz",
+ "gpr",
+ "grpc++",
+ "grpcpp_channelz",
],
alwayslink = 1,
)
@@ -2761,8 +3135,11 @@ grpc_cc_library(
"include/grpcpp/test/mock_stream.h",
"include/grpcpp/test/server_context_test_spouse.h",
],
+ visibility = ["@grpc:grpc++_test"],
deps = [
- ":grpc++",
+ "gpr_base",
+ "grpc++",
+ "grpc_base_c",
],
)
@@ -2776,7 +3153,8 @@ grpc_cc_library(
],
language = "c++",
deps = [
- "grpc_base",
+ "gpr_base",
+ "grpc_base_c",
],
)
@@ -2790,7 +3168,8 @@ grpc_cc_library(
],
language = "c++",
deps = [
- ":grpc++",
+ "gpr",
+ "grpc++",
"//src/proto/grpc/core:stats_proto",
],
)
@@ -2814,23 +3193,29 @@ grpc_cc_library(
"src/cpp/ext/filters/census/context.h",
"src/cpp/ext/filters/census/grpc_plugin.h",
"src/cpp/ext/filters/census/measures.h",
+ "src/cpp/ext/filters/census/open_census_call_tracer.h",
"src/cpp/ext/filters/census/rpc_encoding.h",
"src/cpp/ext/filters/census/server_filter.h",
],
external_deps = [
"absl-base",
"absl-time",
+ "absl/strings",
"opencensus-trace",
"opencensus-trace-context_util",
"opencensus-trace-propagation",
+ "opencensus-tags",
+ "opencensus-tags-context_util",
"opencensus-stats",
"opencensus-context",
],
language = "c++",
visibility = ["@grpc:grpc_opencensus_plugin"],
deps = [
- ":census",
- ":grpc++",
+ "census",
+ "gpr_base",
+ "grpc++",
+ "grpc_base_c",
],
)
@@ -2860,8 +3245,8 @@ grpc_cc_library(
# language = "c++",
# tags = ["no_windows"],
# deps = [
-# ":upb_load_report",
-# ":upb_lrs",
+# "upb_load_report",
+# "upb_lrs",
# ],
# )
@@ -2873,7 +3258,7 @@ grpc_cc_library(
# language = "c++",
# tags = ["no_windows"],
# deps = [
-# ":upb_cds",
+# "upb_cds",
# ],
# )
@@ -2887,12 +3272,15 @@ grpc_cc_library(
"src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c",
"src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c",
"src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c",
+ "src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c",
+ "src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c",
"src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c",
"src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c",
"src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c",
"src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c",
"src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c",
"src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c",
+ "src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c",
"src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c",
"src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c",
"src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c",
@@ -2919,6 +3307,7 @@ grpc_cc_library(
"src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c",
"src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c",
"src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c",
+ "src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c",
],
hdrs = [
"src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h",
@@ -2928,12 +3317,15 @@ grpc_cc_library(
"src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h",
"src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h",
"src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h",
+ "src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h",
+ "src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h",
"src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h",
"src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h",
"src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h",
"src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h",
"src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h",
"src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h",
+ "src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h",
"src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h",
"src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h",
"src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h",
@@ -2960,20 +3352,22 @@ grpc_cc_library(
"src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h",
"src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h",
"src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h",
+ "src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h",
],
external_deps = [
"upb_lib",
"upb_lib_descriptor",
+ "upb_generated_code_support__only_for_generated_code_do_not_use__i_give_permission_to_break_me",
],
language = "c++",
deps = [
- ":envoy_annotations_upb",
- ":envoy_core_upb",
- ":envoy_type_upb",
- ":google_api_upb",
- ":proto_gen_validate_upb",
- ":udpa_annotations_upb",
- ":xds_core_upb",
+ "envoy_annotations_upb",
+ "envoy_core_upb",
+ "envoy_type_upb",
+ "google_api_upb",
+ "proto_gen_validate_upb",
+ "udpa_annotations_upb",
+ "xds_core_upb",
],
)
@@ -2987,12 +3381,15 @@ grpc_cc_library(
"src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c",
"src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c",
"src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c",
+ "src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c",
+ "src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c",
"src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c",
"src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c",
"src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c",
"src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c",
"src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c",
"src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c",
+ "src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c",
"src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c",
"src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c",
"src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c",
@@ -3018,6 +3415,7 @@ grpc_cc_library(
"src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c",
"src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c",
"src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c",
+ "src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c",
],
hdrs = [
"src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h",
@@ -3027,12 +3425,15 @@ grpc_cc_library(
"src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h",
"src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h",
"src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h",
+ "src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.h",
+ "src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.h",
"src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h",
"src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h",
"src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h",
"src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h",
"src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h",
"src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h",
+ "src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.h",
"src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h",
"src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.h",
"src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h",
@@ -3058,22 +3459,25 @@ grpc_cc_library(
"src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h",
"src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h",
"src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h",
+ "src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.h",
],
external_deps = [
"upb_lib",
"upb_lib_descriptor_reflection",
"upb_textformat_lib",
+ "upb_reflection",
+ "upb_generated_code_support__only_for_generated_code_do_not_use__i_give_permission_to_break_me",
],
language = "c++",
deps = [
- ":envoy_ads_upb",
- ":envoy_annotations_upbdefs",
- ":envoy_core_upbdefs",
- ":envoy_type_upbdefs",
- ":google_api_upbdefs",
- ":proto_gen_validate_upbdefs",
- ":udpa_annotations_upbdefs",
- ":xds_core_upbdefs",
+ "envoy_ads_upb",
+ "envoy_annotations_upbdefs",
+ "envoy_core_upbdefs",
+ "envoy_type_upbdefs",
+ "google_api_upbdefs",
+ "proto_gen_validate_upbdefs",
+ "udpa_annotations_upbdefs",
+ "xds_core_upbdefs",
],
)
@@ -3090,10 +3494,11 @@ grpc_cc_library(
external_deps = [
"upb_lib",
"upb_lib_descriptor",
+ "upb_generated_code_support__only_for_generated_code_do_not_use__i_give_permission_to_break_me",
],
language = "c++",
deps = [
- ":google_api_upb",
+ "google_api_upb",
],
)
@@ -3110,12 +3515,14 @@ grpc_cc_library(
external_deps = [
"upb_lib",
"upb_lib_descriptor_reflection",
+ "upb_reflection",
"upb_textformat_lib",
+ "upb_generated_code_support__only_for_generated_code_do_not_use__i_give_permission_to_break_me",
],
language = "c++",
deps = [
- ":envoy_annotations_upb",
- ":google_api_upbdefs",
+ "envoy_annotations_upb",
+ "google_api_upbdefs",
],
)
@@ -3154,15 +3561,16 @@ grpc_cc_library(
external_deps = [
"upb_lib",
"upb_lib_descriptor",
+ "upb_generated_code_support__only_for_generated_code_do_not_use__i_give_permission_to_break_me",
],
language = "c++",
deps = [
- ":envoy_annotations_upb",
- ":envoy_type_upb",
- ":google_api_upb",
- ":proto_gen_validate_upb",
- ":udpa_annotations_upb",
- ":xds_core_upb",
+ "envoy_annotations_upb",
+ "envoy_type_upb",
+ "google_api_upb",
+ "proto_gen_validate_upb",
+ "udpa_annotations_upb",
+ "xds_core_upb",
],
)
@@ -3202,13 +3610,17 @@ grpc_cc_library(
"upb_lib",
"upb_lib_descriptor_reflection",
"upb_textformat_lib",
+ "upb_reflection",
+ "upb_generated_code_support__only_for_generated_code_do_not_use__i_give_permission_to_break_me",
],
language = "c++",
deps = [
- ":envoy_core_upb",
- ":envoy_type_upbdefs",
- ":google_api_upbdefs",
- ":proto_gen_validate_upbdefs",
+ "envoy_annotations_upbdefs",
+ "envoy_core_upb",
+ "envoy_type_upbdefs",
+ "google_api_upbdefs",
+ "proto_gen_validate_upbdefs",
+ "xds_core_upbdefs",
],
)
@@ -3249,13 +3661,14 @@ grpc_cc_library(
external_deps = [
"upb_lib",
"upb_lib_descriptor",
+ "upb_generated_code_support__only_for_generated_code_do_not_use__i_give_permission_to_break_me",
],
language = "c++",
deps = [
- ":envoy_annotations_upb",
- ":google_api_upb",
- ":proto_gen_validate_upb",
- ":udpa_annotations_upb",
+ "envoy_annotations_upb",
+ "google_api_upb",
+ "proto_gen_validate_upb",
+ "udpa_annotations_upb",
],
)
@@ -3296,13 +3709,15 @@ grpc_cc_library(
external_deps = [
"upb_lib",
"upb_lib_descriptor_reflection",
+ "upb_reflection",
"upb_textformat_lib",
+ "upb_generated_code_support__only_for_generated_code_do_not_use__i_give_permission_to_break_me",
],
language = "c++",
deps = [
- ":envoy_type_upb",
- ":google_api_upbdefs",
- ":proto_gen_validate_upbdefs",
+ "envoy_type_upb",
+ "google_api_upbdefs",
+ "proto_gen_validate_upbdefs",
],
)
@@ -3317,10 +3732,11 @@ grpc_cc_library(
external_deps = [
"upb_lib",
"upb_lib_descriptor",
+ "upb_generated_code_support__only_for_generated_code_do_not_use__i_give_permission_to_break_me",
],
language = "c++",
deps = [
- ":google_api_upb",
+ "google_api_upb",
],
)
@@ -3336,11 +3752,13 @@ grpc_cc_library(
"upb_lib",
"upb_lib_descriptor_reflection",
"upb_textformat_lib",
+ "upb_reflection",
+ "upb_generated_code_support__only_for_generated_code_do_not_use__i_give_permission_to_break_me",
],
language = "c++",
deps = [
- ":google_api_upbdefs",
- ":proto_gen_validate_upb",
+ "google_api_upbdefs",
+ "proto_gen_validate_upb",
],
)
@@ -3361,10 +3779,11 @@ grpc_cc_library(
external_deps = [
"upb_lib",
"upb_lib_descriptor",
+ "upb_generated_code_support__only_for_generated_code_do_not_use__i_give_permission_to_break_me",
],
language = "c++",
deps = [
- ":proto_gen_validate_upb",
+ "proto_gen_validate_upb",
],
)
@@ -3387,11 +3806,12 @@ grpc_cc_library(
external_deps = [
"upb_lib",
"upb_lib_descriptor",
+ "upb_generated_code_support__only_for_generated_code_do_not_use__i_give_permission_to_break_me",
],
language = "c++",
deps = [
- ":google_api_upb",
- ":proto_gen_validate_upb",
+ "google_api_upb",
+ "proto_gen_validate_upb",
],
)
@@ -3415,11 +3835,13 @@ grpc_cc_library(
"upb_lib",
"upb_lib_descriptor_reflection",
"upb_textformat_lib",
+ "upb_reflection",
+ "upb_generated_code_support__only_for_generated_code_do_not_use__i_give_permission_to_break_me",
],
language = "c++",
deps = [
- ":google_api_upbdefs",
- ":udpa_annotations_upb",
+ "google_api_upbdefs",
+ "udpa_annotations_upb",
],
)
@@ -3444,12 +3866,13 @@ grpc_cc_library(
external_deps = [
"upb_lib",
"upb_lib_descriptor",
+ "upb_generated_code_support__only_for_generated_code_do_not_use__i_give_permission_to_break_me",
],
language = "c++",
deps = [
- ":google_api_upb",
- ":proto_gen_validate_upb",
- ":udpa_annotations_upb",
+ "google_api_upb",
+ "proto_gen_validate_upb",
+ "udpa_annotations_upb",
],
)
@@ -3475,13 +3898,15 @@ grpc_cc_library(
"upb_lib",
"upb_lib_descriptor_reflection",
"upb_textformat_lib",
+ "upb_reflection",
+ "upb_generated_code_support__only_for_generated_code_do_not_use__i_give_permission_to_break_me",
],
language = "c++",
deps = [
- ":google_api_upbdefs",
- ":proto_gen_validate_upbdefs",
- ":udpa_annotations_upbdefs",
- ":xds_core_upb",
+ "google_api_upbdefs",
+ "proto_gen_validate_upbdefs",
+ "udpa_annotations_upbdefs",
+ "xds_core_upb",
],
)
@@ -3496,11 +3921,12 @@ grpc_cc_library(
external_deps = [
"upb_lib",
"upb_lib_descriptor",
+ "upb_generated_code_support__only_for_generated_code_do_not_use__i_give_permission_to_break_me",
],
language = "c++",
deps = [
- ":google_api_upb",
- ":proto_gen_validate_upb",
+ "google_api_upb",
+ "proto_gen_validate_upb",
],
)
@@ -3516,11 +3942,13 @@ grpc_cc_library(
"upb_lib",
"upb_lib_descriptor_reflection",
"upb_textformat_lib",
+ "upb_reflection",
+ "upb_generated_code_support__only_for_generated_code_do_not_use__i_give_permission_to_break_me",
],
language = "c++",
deps = [
- ":google_api_upbdefs",
- ":proto_gen_validate_upbdefs",
+ "google_api_upbdefs",
+ "proto_gen_validate_upbdefs",
],
)
@@ -3541,6 +3969,7 @@ grpc_cc_library(
external_deps = [
"upb_lib",
"upb_lib_descriptor",
+ "upb_generated_code_support__only_for_generated_code_do_not_use__i_give_permission_to_break_me",
],
language = "c++",
)
@@ -3577,6 +4006,7 @@ grpc_cc_library(
external_deps = [
"upb_lib",
"upb_lib_descriptor",
+ "upb_generated_code_support__only_for_generated_code_do_not_use__i_give_permission_to_break_me",
],
language = "c++",
)
@@ -3609,10 +4039,12 @@ grpc_cc_library(
"upb_lib",
"upb_lib_descriptor_reflection",
"upb_textformat_lib",
+ "upb_reflection",
+ "upb_generated_code_support__only_for_generated_code_do_not_use__i_give_permission_to_break_me",
],
language = "c++",
deps = [
- ":google_api_upb",
+ "google_api_upb",
],
)
@@ -3633,6 +4065,7 @@ grpc_cc_library(
external_deps = [
"upb_lib",
"upb_lib_descriptor",
+ "upb_generated_code_support__only_for_generated_code_do_not_use__i_give_permission_to_break_me",
],
language = "c++",
deps = [
@@ -3654,6 +4087,9 @@ grpc_cc_library(
hdrs = [
"src/core/ext/upb-generated/third_party/istio/security/proto/providers/google/meshca.upb.h",
],
+ external_deps = [
+ "upb_generated_code_support__only_for_generated_code_do_not_use__i_give_permission_to_break_me",
+ ],
language = "c++",
deps = [
"google_api_upb",
@@ -3681,6 +4117,7 @@ grpc_cc_library(
external_deps = [
"upb_lib",
"upb_lib_descriptor",
+ "upb_generated_code_support__only_for_generated_code_do_not_use__i_give_permission_to_break_me",
],
language = "c++",
)
diff --git a/BUILD.gn b/BUILD.gn
deleted file mode 100644
index 47ebfa31ed..0000000000
--- a/BUILD.gn
+++ /dev/null
@@ -1,1653 +0,0 @@
-# GRPC Fuchsia GN build file
-
-# This file has been automatically generated from a template file.
-# Please look at the templates directory instead.
-# This file can be regenerated from the template by running
-# tools/buildgen/generate_projects.sh
-
-# Copyright 2019 gRPC authors.
-#
-# 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.
-
-config("grpc_config") {
- include_dirs = [
- ".",
- "include/",
- ]
- defines = [
- "GRPC_USE_PROTO_LITE",
- "GPR_SUPPORT_CHANNELS_FROM_FD",
- "PB_FIELD_16BIT",
- ]
-}
-
-
-
- source_set("address_sorting") {
- sources = [
- "third_party/address_sorting/address_sorting.c",
- "third_party/address_sorting/address_sorting_internal.h",
- "third_party/address_sorting/address_sorting_posix.c",
- "third_party/address_sorting/address_sorting_windows.c",
- "third_party/address_sorting/include/address_sorting/address_sorting.h",
- ]
- deps = [
- ]
-
- public_configs = [
- ":grpc_config",
- ]
- include_dirs = [
- "third_party/address_sorting/include",
- ]
- }
-
-
-
- source_set("gpr") {
- sources = [
- "include/grpc/impl/codegen/atm.h",
- "include/grpc/impl/codegen/atm_gcc_atomic.h",
- "include/grpc/impl/codegen/atm_gcc_sync.h",
- "include/grpc/impl/codegen/atm_windows.h",
- "include/grpc/impl/codegen/byte_buffer.h",
- "include/grpc/impl/codegen/byte_buffer_reader.h",
- "include/grpc/impl/codegen/compression_types.h",
- "include/grpc/impl/codegen/connectivity_state.h",
- "include/grpc/impl/codegen/fork.h",
- "include/grpc/impl/codegen/gpr_slice.h",
- "include/grpc/impl/codegen/gpr_types.h",
- "include/grpc/impl/codegen/grpc_types.h",
- "include/grpc/impl/codegen/log.h",
- "include/grpc/impl/codegen/port_platform.h",
- "include/grpc/impl/codegen/propagation_bits.h",
- "include/grpc/impl/codegen/slice.h",
- "include/grpc/impl/codegen/status.h",
- "include/grpc/impl/codegen/sync.h",
- "include/grpc/impl/codegen/sync_abseil.h",
- "include/grpc/impl/codegen/sync_custom.h",
- "include/grpc/impl/codegen/sync_generic.h",
- "include/grpc/impl/codegen/sync_posix.h",
- "include/grpc/impl/codegen/sync_windows.h",
- "include/grpc/support/alloc.h",
- "include/grpc/support/atm.h",
- "include/grpc/support/atm_gcc_atomic.h",
- "include/grpc/support/atm_gcc_sync.h",
- "include/grpc/support/atm_windows.h",
- "include/grpc/support/cpu.h",
- "include/grpc/support/log.h",
- "include/grpc/support/log_windows.h",
- "include/grpc/support/port_platform.h",
- "include/grpc/support/string_util.h",
- "include/grpc/support/sync.h",
- "include/grpc/support/sync_abseil.h",
- "include/grpc/support/sync_custom.h",
- "include/grpc/support/sync_generic.h",
- "include/grpc/support/sync_posix.h",
- "include/grpc/support/sync_windows.h",
- "include/grpc/support/thd_id.h",
- "include/grpc/support/time.h",
- "src/core/ext/upb-generated/google/api/annotations.upb.c",
- "src/core/ext/upb-generated/google/api/annotations.upb.h",
- "src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c",
- "src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h",
- "src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c",
- "src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h",
- "src/core/ext/upb-generated/google/api/http.upb.c",
- "src/core/ext/upb-generated/google/api/http.upb.h",
- "src/core/ext/upb-generated/google/protobuf/any.upb.c",
- "src/core/ext/upb-generated/google/protobuf/any.upb.h",
- "src/core/ext/upb-generated/google/protobuf/duration.upb.c",
- "src/core/ext/upb-generated/google/protobuf/duration.upb.h",
- "src/core/ext/upb-generated/google/protobuf/empty.upb.c",
- "src/core/ext/upb-generated/google/protobuf/empty.upb.h",
- "src/core/ext/upb-generated/google/protobuf/struct.upb.c",
- "src/core/ext/upb-generated/google/protobuf/struct.upb.h",
- "src/core/ext/upb-generated/google/protobuf/timestamp.upb.c",
- "src/core/ext/upb-generated/google/protobuf/timestamp.upb.h",
- "src/core/ext/upb-generated/google/protobuf/wrappers.upb.c",
- "src/core/ext/upb-generated/google/protobuf/wrappers.upb.h",
- "src/core/ext/upb-generated/google/rpc/status.upb.c",
- "src/core/ext/upb-generated/google/rpc/status.upb.h",
- "src/core/lib/gpr/alloc.cc",
- "src/core/lib/gpr/alloc.h",
- "src/core/lib/gpr/arena.h",
- "src/core/lib/gpr/atm.cc",
- "src/core/lib/gpr/cpu_iphone.cc",
- "src/core/lib/gpr/cpu_linux.cc",
- "src/core/lib/gpr/cpu_posix.cc",
- "src/core/lib/gpr/cpu_windows.cc",
- "src/core/lib/gpr/env.h",
- "src/core/lib/gpr/env_linux.cc",
- "src/core/lib/gpr/env_posix.cc",
- "src/core/lib/gpr/env_windows.cc",
- "src/core/lib/gpr/log.cc",
- "src/core/lib/gpr/log_android.cc",
- "src/core/lib/gpr/log_linux.cc",
- "src/core/lib/gpr/log_posix.cc",
- "src/core/lib/gpr/log_windows.cc",
- "src/core/lib/gpr/murmur_hash.cc",
- "src/core/lib/gpr/murmur_hash.h",
- "src/core/lib/gpr/spinlock.h",
- "src/core/lib/gpr/string.cc",
- "src/core/lib/gpr/string.h",
- "src/core/lib/gpr/string_posix.cc",
- "src/core/lib/gpr/string_util_windows.cc",
- "src/core/lib/gpr/string_windows.cc",
- "src/core/lib/gpr/string_windows.h",
- "src/core/lib/gpr/sync.cc",
- "src/core/lib/gpr/sync_abseil.cc",
- "src/core/lib/gpr/sync_posix.cc",
- "src/core/lib/gpr/sync_windows.cc",
- "src/core/lib/gpr/time.cc",
- "src/core/lib/gpr/time_posix.cc",
- "src/core/lib/gpr/time_precise.cc",
- "src/core/lib/gpr/time_precise.h",
- "src/core/lib/gpr/time_windows.cc",
- "src/core/lib/gpr/tls.h",
- "src/core/lib/gpr/tls_gcc.h",
- "src/core/lib/gpr/tls_msvc.h",
- "src/core/lib/gpr/tls_pthread.cc",
- "src/core/lib/gpr/tls_pthread.h",
- "src/core/lib/gpr/tls_stdcpp.h",
- "src/core/lib/gpr/tmpfile.h",
- "src/core/lib/gpr/tmpfile_msys.cc",
- "src/core/lib/gpr/tmpfile_posix.cc",
- "src/core/lib/gpr/tmpfile_windows.cc",
- "src/core/lib/gpr/useful.h",
- "src/core/lib/gpr/wrap_memcpy.cc",
- "src/core/lib/gprpp/arena.cc",
- "src/core/lib/gprpp/arena.h",
- "src/core/lib/gprpp/atomic.h",
- "src/core/lib/gprpp/debug_location.h",
- "src/core/lib/gprpp/examine_stack.cc",
- "src/core/lib/gprpp/examine_stack.h",
- "src/core/lib/gprpp/fork.cc",
- "src/core/lib/gprpp/fork.h",
- "src/core/lib/gprpp/global_config.h",
- "src/core/lib/gprpp/global_config_custom.h",
- "src/core/lib/gprpp/global_config_env.cc",
- "src/core/lib/gprpp/global_config_env.h",
- "src/core/lib/gprpp/global_config_generic.h",
- "src/core/lib/gprpp/host_port.cc",
- "src/core/lib/gprpp/host_port.h",
- "src/core/lib/gprpp/manual_constructor.h",
- "src/core/lib/gprpp/memory.h",
- "src/core/lib/gprpp/mpscq.cc",
- "src/core/lib/gprpp/mpscq.h",
- "src/core/lib/gprpp/stat.h",
- "src/core/lib/gprpp/stat_posix.cc",
- "src/core/lib/gprpp/stat_windows.cc",
- "src/core/lib/gprpp/status_helper.cc",
- "src/core/lib/gprpp/status_helper.h",
- "src/core/lib/gprpp/sync.h",
- "src/core/lib/gprpp/thd.h",
- "src/core/lib/gprpp/thd_posix.cc",
- "src/core/lib/gprpp/thd_windows.cc",
- "src/core/lib/gprpp/time_util.cc",
- "src/core/lib/gprpp/time_util.h",
- "src/core/lib/profiling/basic_timers.cc",
- "src/core/lib/profiling/stap_timers.cc",
- "src/core/lib/profiling/timers.h",
- ]
- deps = [
- ":absl/base:base",
- ":absl/memory:memory",
- ":absl/status:status",
- ":absl/strings:str_format",
- ":absl/strings:strings",
- ":absl/synchronization:synchronization",
- ":absl/time:time",
- ":absl/types:optional",
- ":upb",
- ]
-
- public_configs = [
- ":grpc_config",
- ]
- }
-
-
-
- source_set("grpc") {
- sources = [
- "include/grpc/byte_buffer.h",
- "include/grpc/byte_buffer_reader.h",
- "include/grpc/census.h",
- "include/grpc/compression.h",
- "include/grpc/event_engine/endpoint_config.h",
- "include/grpc/event_engine/event_engine.h",
- "include/grpc/event_engine/port.h",
- "include/grpc/event_engine/slice_allocator.h",
- "include/grpc/fork.h",
- "include/grpc/grpc.h",
- "include/grpc/grpc_posix.h",
- "include/grpc/grpc_security.h",
- "include/grpc/grpc_security_constants.h",
- "include/grpc/load_reporting.h",
- "include/grpc/slice.h",
- "include/grpc/slice_buffer.h",
- "include/grpc/status.h",
- "include/grpc/support/workaround_list.h",
- "src/core/ext/filters/census/grpc_context.cc",
- "src/core/ext/filters/client_channel/backend_metric.cc",
- "src/core/ext/filters/client_channel/backend_metric.h",
- "src/core/ext/filters/client_channel/backup_poller.cc",
- "src/core/ext/filters/client_channel/backup_poller.h",
- "src/core/ext/filters/client_channel/channel_connectivity.cc",
- "src/core/ext/filters/client_channel/client_channel.cc",
- "src/core/ext/filters/client_channel/client_channel.h",
- "src/core/ext/filters/client_channel/client_channel_channelz.cc",
- "src/core/ext/filters/client_channel/client_channel_channelz.h",
- "src/core/ext/filters/client_channel/client_channel_factory.cc",
- "src/core/ext/filters/client_channel/client_channel_factory.h",
- "src/core/ext/filters/client_channel/client_channel_plugin.cc",
- "src/core/ext/filters/client_channel/config_selector.cc",
- "src/core/ext/filters/client_channel/config_selector.h",
- "src/core/ext/filters/client_channel/connector.h",
- "src/core/ext/filters/client_channel/dynamic_filters.cc",
- "src/core/ext/filters/client_channel/dynamic_filters.h",
- "src/core/ext/filters/client_channel/global_subchannel_pool.cc",
- "src/core/ext/filters/client_channel/global_subchannel_pool.h",
- "src/core/ext/filters/client_channel/health/health_check_client.cc",
- "src/core/ext/filters/client_channel/health/health_check_client.h",
- "src/core/ext/filters/client_channel/http_connect_handshaker.cc",
- "src/core/ext/filters/client_channel/http_connect_handshaker.h",
- "src/core/ext/filters/client_channel/http_proxy.cc",
- "src/core/ext/filters/client_channel/http_proxy.h",
- "src/core/ext/filters/client_channel/lb_policy.cc",
- "src/core/ext/filters/client_channel/lb_policy.h",
- "src/core/ext/filters/client_channel/lb_policy/address_filtering.cc",
- "src/core/ext/filters/client_channel/lb_policy/address_filtering.h",
- "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc",
- "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h",
- "src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc",
- "src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h",
- "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc",
- "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h",
- "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc",
- "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h",
- "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h",
- "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc",
- "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc",
- "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h",
- "src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc",
- "src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h",
- "src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc",
- "src/core/ext/filters/client_channel/lb_policy/priority/priority.cc",
- "src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc",
- "src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h",
- "src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc",
- "src/core/ext/filters/client_channel/lb_policy/subchannel_list.h",
- "src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc",
- "src/core/ext/filters/client_channel/lb_policy/xds/cds.cc",
- "src/core/ext/filters/client_channel/lb_policy/xds/xds.h",
- "src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h",
- "src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc",
- "src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc",
- "src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc",
- "src/core/ext/filters/client_channel/lb_policy_factory.h",
- "src/core/ext/filters/client_channel/lb_policy_registry.cc",
- "src/core/ext/filters/client_channel/lb_policy_registry.h",
- "src/core/ext/filters/client_channel/local_subchannel_pool.cc",
- "src/core/ext/filters/client_channel/local_subchannel_pool.h",
- "src/core/ext/filters/client_channel/proxy_mapper.h",
- "src/core/ext/filters/client_channel/proxy_mapper_registry.cc",
- "src/core/ext/filters/client_channel/proxy_mapper_registry.h",
- "src/core/ext/filters/client_channel/resolver.cc",
- "src/core/ext/filters/client_channel/resolver.h",
- "src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc",
- "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h",
- "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_event_engine.cc",
- "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc",
- "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc",
- "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc",
- "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc",
- "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h",
- "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_event_engine.cc",
- "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc",
- "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc",
- "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc",
- "src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc",
- "src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h",
- "src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc",
- "src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc",
- "src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h",
- "src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc",
- "src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc",
- "src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc",
- "src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h",
- "src/core/ext/filters/client_channel/resolver_factory.h",
- "src/core/ext/filters/client_channel/resolver_registry.cc",
- "src/core/ext/filters/client_channel/resolver_registry.h",
- "src/core/ext/filters/client_channel/resolver_result_parsing.cc",
- "src/core/ext/filters/client_channel/resolver_result_parsing.h",
- "src/core/ext/filters/client_channel/retry_filter.cc",
- "src/core/ext/filters/client_channel/retry_filter.h",
- "src/core/ext/filters/client_channel/retry_service_config.cc",
- "src/core/ext/filters/client_channel/retry_service_config.h",
- "src/core/ext/filters/client_channel/retry_throttle.cc",
- "src/core/ext/filters/client_channel/retry_throttle.h",
- "src/core/ext/filters/client_channel/server_address.cc",
- "src/core/ext/filters/client_channel/server_address.h",
- "src/core/ext/filters/client_channel/service_config.cc",
- "src/core/ext/filters/client_channel/service_config.h",
- "src/core/ext/filters/client_channel/service_config_call_data.h",
- "src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc",
- "src/core/ext/filters/client_channel/service_config_parser.cc",
- "src/core/ext/filters/client_channel/service_config_parser.h",
- "src/core/ext/filters/client_channel/subchannel.cc",
- "src/core/ext/filters/client_channel/subchannel.h",
- "src/core/ext/filters/client_channel/subchannel_interface.h",
- "src/core/ext/filters/client_channel/subchannel_pool_interface.cc",
- "src/core/ext/filters/client_channel/subchannel_pool_interface.h",
- "src/core/ext/filters/client_idle/client_idle_filter.cc",
- "src/core/ext/filters/deadline/deadline_filter.cc",
- "src/core/ext/filters/deadline/deadline_filter.h",
- "src/core/ext/filters/fault_injection/fault_injection_filter.cc",
- "src/core/ext/filters/fault_injection/fault_injection_filter.h",
- "src/core/ext/filters/fault_injection/service_config_parser.cc",
- "src/core/ext/filters/fault_injection/service_config_parser.h",
- "src/core/ext/filters/http/client/http_client_filter.cc",
- "src/core/ext/filters/http/client/http_client_filter.h",
- "src/core/ext/filters/http/client_authority_filter.cc",
- "src/core/ext/filters/http/client_authority_filter.h",
- "src/core/ext/filters/http/http_filters_plugin.cc",
- "src/core/ext/filters/http/message_compress/message_compress_filter.cc",
- "src/core/ext/filters/http/message_compress/message_compress_filter.h",
- "src/core/ext/filters/http/message_compress/message_decompress_filter.cc",
- "src/core/ext/filters/http/message_compress/message_decompress_filter.h",
- "src/core/ext/filters/http/server/http_server_filter.cc",
- "src/core/ext/filters/http/server/http_server_filter.h",
- "src/core/ext/filters/max_age/max_age_filter.cc",
- "src/core/ext/filters/max_age/max_age_filter.h",
- "src/core/ext/filters/message_size/message_size_filter.cc",
- "src/core/ext/filters/message_size/message_size_filter.h",
- "src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc",
- "src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h",
- "src/core/ext/filters/workarounds/workaround_utils.cc",
- "src/core/ext/filters/workarounds/workaround_utils.h",
- "src/core/ext/transport/chttp2/alpn/alpn.cc",
- "src/core/ext/transport/chttp2/alpn/alpn.h",
- "src/core/ext/transport/chttp2/client/authority.cc",
- "src/core/ext/transport/chttp2/client/authority.h",
- "src/core/ext/transport/chttp2/client/chttp2_connector.cc",
- "src/core/ext/transport/chttp2/client/chttp2_connector.h",
- "src/core/ext/transport/chttp2/client/insecure/channel_create.cc",
- "src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc",
- "src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc",
- "src/core/ext/transport/chttp2/server/chttp2_server.cc",
- "src/core/ext/transport/chttp2/server/chttp2_server.h",
- "src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc",
- "src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc",
- "src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc",
- "src/core/ext/transport/chttp2/transport/bin_decoder.cc",
- "src/core/ext/transport/chttp2/transport/bin_decoder.h",
- "src/core/ext/transport/chttp2/transport/bin_encoder.cc",
- "src/core/ext/transport/chttp2/transport/bin_encoder.h",
- "src/core/ext/transport/chttp2/transport/chttp2_plugin.cc",
- "src/core/ext/transport/chttp2/transport/chttp2_transport.cc",
- "src/core/ext/transport/chttp2/transport/chttp2_transport.h",
- "src/core/ext/transport/chttp2/transport/context_list.cc",
- "src/core/ext/transport/chttp2/transport/context_list.h",
- "src/core/ext/transport/chttp2/transport/flow_control.cc",
- "src/core/ext/transport/chttp2/transport/flow_control.h",
- "src/core/ext/transport/chttp2/transport/frame.h",
- "src/core/ext/transport/chttp2/transport/frame_data.cc",
- "src/core/ext/transport/chttp2/transport/frame_data.h",
- "src/core/ext/transport/chttp2/transport/frame_goaway.cc",
- "src/core/ext/transport/chttp2/transport/frame_goaway.h",
- "src/core/ext/transport/chttp2/transport/frame_ping.cc",
- "src/core/ext/transport/chttp2/transport/frame_ping.h",
- "src/core/ext/transport/chttp2/transport/frame_rst_stream.cc",
- "src/core/ext/transport/chttp2/transport/frame_rst_stream.h",
- "src/core/ext/transport/chttp2/transport/frame_settings.cc",
- "src/core/ext/transport/chttp2/transport/frame_settings.h",
- "src/core/ext/transport/chttp2/transport/frame_window_update.cc",
- "src/core/ext/transport/chttp2/transport/frame_window_update.h",
- "src/core/ext/transport/chttp2/transport/hpack_encoder.cc",
- "src/core/ext/transport/chttp2/transport/hpack_encoder.h",
- "src/core/ext/transport/chttp2/transport/hpack_parser.cc",
- "src/core/ext/transport/chttp2/transport/hpack_parser.h",
- "src/core/ext/transport/chttp2/transport/hpack_table.cc",
- "src/core/ext/transport/chttp2/transport/hpack_table.h",
- "src/core/ext/transport/chttp2/transport/http2_settings.cc",
- "src/core/ext/transport/chttp2/transport/http2_settings.h",
- "src/core/ext/transport/chttp2/transport/huffsyms.cc",
- "src/core/ext/transport/chttp2/transport/huffsyms.h",
- "src/core/ext/transport/chttp2/transport/incoming_metadata.cc",
- "src/core/ext/transport/chttp2/transport/incoming_metadata.h",
- "src/core/ext/transport/chttp2/transport/internal.h",
- "src/core/ext/transport/chttp2/transport/parsing.cc",
- "src/core/ext/transport/chttp2/transport/stream_lists.cc",
- "src/core/ext/transport/chttp2/transport/stream_map.cc",
- "src/core/ext/transport/chttp2/transport/stream_map.h",
- "src/core/ext/transport/chttp2/transport/varint.cc",
- "src/core/ext/transport/chttp2/transport/varint.h",
- "src/core/ext/transport/chttp2/transport/writing.cc",
- "src/core/ext/transport/inproc/inproc_plugin.cc",
- "src/core/ext/transport/inproc/inproc_transport.cc",
- "src/core/ext/transport/inproc/inproc_transport.h",
- "src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c",
- "src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h",
- "src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c",
- "src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h",
- "src/core/ext/upb-generated/envoy/annotations/resource.upb.c",
- "src/core/ext/upb-generated/envoy/annotations/resource.upb.h",
- "src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c",
- "src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h",
- "src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c",
- "src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h",
- "src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c",
- "src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h",
- "src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c",
- "src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h",
- "src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c",
- "src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h",
- "src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c",
- "src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h",
- "src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c",
- "src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h",
- "src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c",
- "src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h",
- "src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c",
- "src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h",
- "src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c",
- "src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h",
- "src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c",
- "src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h",
- "src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c",
- "src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h",
- "src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c",
- "src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h",
- "src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c",
- "src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h",
- "src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c",
- "src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h",
- "src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c",
- "src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h",
- "src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c",
- "src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h",
- "src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c",
- "src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h",
- "src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c",
- "src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h",
- "src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c",
- "src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h",
- "src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c",
- "src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h",
- "src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c",
- "src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h",
- "src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c",
- "src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h",
- "src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c",
- "src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h",
- "src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c",
- "src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h",
- "src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c",
- "src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h",
- "src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c",
- "src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h",
- "src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c",
- "src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h",
- "src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c",
- "src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h",
- "src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c",
- "src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h",
- "src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c",
- "src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h",
- "src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c",
- "src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h",
- "src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c",
- "src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h",
- "src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c",
- "src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h",
- "src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c",
- "src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h",
- "src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c",
- "src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h",
- "src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c",
- "src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h",
- "src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c",
- "src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h",
- "src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c",
- "src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h",
- "src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c",
- "src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h",
- "src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c",
- "src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h",
- "src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c",
- "src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h",
- "src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c",
- "src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h",
- "src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c",
- "src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h",
- "src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c",
- "src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h",
- "src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c",
- "src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h",
- "src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c",
- "src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h",
- "src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c",
- "src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h",
- "src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c",
- "src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h",
- "src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c",
- "src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h",
- "src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c",
- "src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h",
- "src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c",
- "src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h",
- "src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c",
- "src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h",
- "src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c",
- "src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h",
- "src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c",
- "src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h",
- "src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c",
- "src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h",
- "src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c",
- "src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h",
- "src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c",
- "src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h",
- "src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c",
- "src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h",
- "src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c",
- "src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h",
- "src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c",
- "src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h",
- "src/core/ext/upb-generated/envoy/type/v3/http.upb.c",
- "src/core/ext/upb-generated/envoy/type/v3/http.upb.h",
- "src/core/ext/upb-generated/envoy/type/v3/percent.upb.c",
- "src/core/ext/upb-generated/envoy/type/v3/percent.upb.h",
- "src/core/ext/upb-generated/envoy/type/v3/range.upb.c",
- "src/core/ext/upb-generated/envoy/type/v3/range.upb.h",
- "src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c",
- "src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h",
- "src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c",
- "src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h",
- "src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c",
- "src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h",
- "src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c",
- "src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h",
- "src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c",
- "src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h",
- "src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c",
- "src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h",
- "src/core/ext/upb-generated/udpa/annotations/migrate.upb.c",
- "src/core/ext/upb-generated/udpa/annotations/migrate.upb.h",
- "src/core/ext/upb-generated/udpa/annotations/security.upb.c",
- "src/core/ext/upb-generated/udpa/annotations/security.upb.h",
- "src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c",
- "src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h",
- "src/core/ext/upb-generated/udpa/annotations/status.upb.c",
- "src/core/ext/upb-generated/udpa/annotations/status.upb.h",
- "src/core/ext/upb-generated/udpa/annotations/versioning.upb.c",
- "src/core/ext/upb-generated/udpa/annotations/versioning.upb.h",
- "src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c",
- "src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h",
- "src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.c",
- "src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h",
- "src/core/ext/upb-generated/validate/validate.upb.c",
- "src/core/ext/upb-generated/validate/validate.upb.h",
- "src/core/ext/upb-generated/xds/core/v3/authority.upb.c",
- "src/core/ext/upb-generated/xds/core/v3/authority.upb.h",
- "src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c",
- "src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h",
- "src/core/ext/upb-generated/xds/core/v3/context_params.upb.c",
- "src/core/ext/upb-generated/xds/core/v3/context_params.upb.h",
- "src/core/ext/upb-generated/xds/core/v3/resource.upb.c",
- "src/core/ext/upb-generated/xds/core/v3/resource.upb.h",
- "src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c",
- "src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h",
- "src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c",
- "src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h",
- "src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h",
- "src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c",
- "src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h",
- "src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c",
- "src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h",
- "src/core/ext/upbdefs-generated/google/api/http.upbdefs.c",
- "src/core/ext/upbdefs-generated/google/api/http.upbdefs.h",
- "src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c",
- "src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h",
- "src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c",
- "src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h",
- "src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c",
- "src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h",
- "src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c",
- "src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h",
- "src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c",
- "src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h",
- "src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c",
- "src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h",
- "src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c",
- "src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h",
- "src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c",
- "src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h",
- "src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c",
- "src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h",
- "src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c",
- "src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h",
- "src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c",
- "src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h",
- "src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c",
- "src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h",
- "src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c",
- "src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h",
- "src/core/ext/upbdefs-generated/validate/validate.upbdefs.c",
- "src/core/ext/upbdefs-generated/validate/validate.upbdefs.h",
- "src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c",
- "src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h",
- "src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c",
- "src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h",
- "src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c",
- "src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h",
- "src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c",
- "src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h",
- "src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c",
- "src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h",
- "src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c",
- "src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h",
- "src/core/ext/xds/certificate_provider_factory.h",
- "src/core/ext/xds/certificate_provider_registry.cc",
- "src/core/ext/xds/certificate_provider_registry.h",
- "src/core/ext/xds/certificate_provider_store.cc",
- "src/core/ext/xds/certificate_provider_store.h",
- "src/core/ext/xds/file_watcher_certificate_provider_factory.cc",
- "src/core/ext/xds/file_watcher_certificate_provider_factory.h",
- "src/core/ext/xds/xds_api.cc",
- "src/core/ext/xds/xds_api.h",
- "src/core/ext/xds/xds_bootstrap.cc",
- "src/core/ext/xds/xds_bootstrap.h",
- "src/core/ext/xds/xds_certificate_provider.cc",
- "src/core/ext/xds/xds_certificate_provider.h",
- "src/core/ext/xds/xds_channel_args.h",
- "src/core/ext/xds/xds_client.cc",
- "src/core/ext/xds/xds_client.h",
- "src/core/ext/xds/xds_client_stats.cc",
- "src/core/ext/xds/xds_client_stats.h",
- "src/core/ext/xds/xds_http_fault_filter.cc",
- "src/core/ext/xds/xds_http_fault_filter.h",
- "src/core/ext/xds/xds_http_filters.cc",
- "src/core/ext/xds/xds_http_filters.h",
- "src/core/ext/xds/xds_server_config_fetcher.cc",
- "src/core/lib/address_utils/parse_address.cc",
- "src/core/lib/address_utils/parse_address.h",
- "src/core/lib/address_utils/sockaddr_utils.cc",
- "src/core/lib/address_utils/sockaddr_utils.h",
- "src/core/lib/avl/avl.cc",
- "src/core/lib/avl/avl.h",
- "src/core/lib/backoff/backoff.cc",
- "src/core/lib/backoff/backoff.h",
- "src/core/lib/channel/channel_args.cc",
- "src/core/lib/channel/channel_args.h",
- "src/core/lib/channel/channel_stack.cc",
- "src/core/lib/channel/channel_stack.h",
- "src/core/lib/channel/channel_stack_builder.cc",
- "src/core/lib/channel/channel_stack_builder.h",
- "src/core/lib/channel/channel_trace.cc",
- "src/core/lib/channel/channel_trace.h",
- "src/core/lib/channel/channelz.cc",
- "src/core/lib/channel/channelz.h",
- "src/core/lib/channel/channelz_registry.cc",
- "src/core/lib/channel/channelz_registry.h",
- "src/core/lib/channel/connected_channel.cc",
- "src/core/lib/channel/connected_channel.h",
- "src/core/lib/channel/context.h",
- "src/core/lib/channel/handshaker.cc",
- "src/core/lib/channel/handshaker.h",
- "src/core/lib/channel/handshaker_factory.h",
- "src/core/lib/channel/handshaker_registry.cc",
- "src/core/lib/channel/handshaker_registry.h",
- "src/core/lib/channel/status_util.cc",
- "src/core/lib/channel/status_util.h",
- "src/core/lib/compression/algorithm_metadata.h",
- "src/core/lib/compression/compression.cc",
- "src/core/lib/compression/compression_args.cc",
- "src/core/lib/compression/compression_args.h",
- "src/core/lib/compression/compression_internal.cc",
- "src/core/lib/compression/compression_internal.h",
- "src/core/lib/compression/message_compress.cc",
- "src/core/lib/compression/message_compress.h",
- "src/core/lib/compression/stream_compression.cc",
- "src/core/lib/compression/stream_compression.h",
- "src/core/lib/compression/stream_compression_gzip.cc",
- "src/core/lib/compression/stream_compression_gzip.h",
- "src/core/lib/compression/stream_compression_identity.cc",
- "src/core/lib/compression/stream_compression_identity.h",
- "src/core/lib/debug/stats.cc",
- "src/core/lib/debug/stats.h",
- "src/core/lib/debug/stats_data.cc",
- "src/core/lib/debug/stats_data.h",
- "src/core/lib/debug/trace.cc",
- "src/core/lib/debug/trace.h",
- "src/core/lib/event_engine/endpoint_config.cc",
- "src/core/lib/event_engine/endpoint_config_internal.h",
- "src/core/lib/event_engine/event_engine.cc",
- "src/core/lib/event_engine/slice_allocator.cc",
- "src/core/lib/event_engine/sockaddr.cc",
- "src/core/lib/event_engine/sockaddr.h",
- "src/core/lib/gprpp/atomic.h",
- "src/core/lib/gprpp/dual_ref_counted.h",
- "src/core/lib/gprpp/orphanable.h",
- "src/core/lib/gprpp/ref_counted.h",
- "src/core/lib/gprpp/ref_counted_ptr.h",
- "src/core/lib/http/format_request.cc",
- "src/core/lib/http/format_request.h",
- "src/core/lib/http/httpcli.cc",
- "src/core/lib/http/httpcli.h",
- "src/core/lib/http/httpcli_security_connector.cc",
- "src/core/lib/http/parser.cc",
- "src/core/lib/http/parser.h",
- "src/core/lib/iomgr/block_annotate.h",
- "src/core/lib/iomgr/buffer_list.cc",
- "src/core/lib/iomgr/buffer_list.h",
- "src/core/lib/iomgr/call_combiner.cc",
- "src/core/lib/iomgr/call_combiner.h",
- "src/core/lib/iomgr/cfstream_handle.cc",
- "src/core/lib/iomgr/cfstream_handle.h",
- "src/core/lib/iomgr/closure.h",
- "src/core/lib/iomgr/combiner.cc",
- "src/core/lib/iomgr/combiner.h",
- "src/core/lib/iomgr/dualstack_socket_posix.cc",
- "src/core/lib/iomgr/dynamic_annotations.h",
- "src/core/lib/iomgr/endpoint.cc",
- "src/core/lib/iomgr/endpoint.h",
- "src/core/lib/iomgr/endpoint_cfstream.cc",
- "src/core/lib/iomgr/endpoint_cfstream.h",
- "src/core/lib/iomgr/endpoint_pair.h",
- "src/core/lib/iomgr/endpoint_pair_event_engine.cc",
- "src/core/lib/iomgr/endpoint_pair_posix.cc",
- "src/core/lib/iomgr/endpoint_pair_uv.cc",
- "src/core/lib/iomgr/endpoint_pair_windows.cc",
- "src/core/lib/iomgr/error.cc",
- "src/core/lib/iomgr/error.h",
- "src/core/lib/iomgr/error_cfstream.cc",
- "src/core/lib/iomgr/error_cfstream.h",
- "src/core/lib/iomgr/error_internal.h",
- "src/core/lib/iomgr/ev_apple.cc",
- "src/core/lib/iomgr/ev_apple.h",
- "src/core/lib/iomgr/ev_epoll1_linux.cc",
- "src/core/lib/iomgr/ev_epoll1_linux.h",
- "src/core/lib/iomgr/ev_epollex_linux.cc",
- "src/core/lib/iomgr/ev_epollex_linux.h",
- "src/core/lib/iomgr/ev_poll_posix.cc",
- "src/core/lib/iomgr/ev_poll_posix.h",
- "src/core/lib/iomgr/ev_posix.cc",
- "src/core/lib/iomgr/ev_posix.h",
- "src/core/lib/iomgr/ev_windows.cc",
- "src/core/lib/iomgr/event_engine/closure.cc",
- "src/core/lib/iomgr/event_engine/closure.h",
- "src/core/lib/iomgr/event_engine/endpoint.cc",
- "src/core/lib/iomgr/event_engine/endpoint.h",
- "src/core/lib/iomgr/event_engine/iomgr.cc",
- "src/core/lib/iomgr/event_engine/iomgr.h",
- "src/core/lib/iomgr/event_engine/pollset.cc",
- "src/core/lib/iomgr/event_engine/pollset.h",
- "src/core/lib/iomgr/event_engine/promise.h",
- "src/core/lib/iomgr/event_engine/resolved_address_internal.cc",
- "src/core/lib/iomgr/event_engine/resolved_address_internal.h",
- "src/core/lib/iomgr/event_engine/resolver.cc",
- "src/core/lib/iomgr/event_engine/tcp.cc",
- "src/core/lib/iomgr/event_engine/timer.cc",
- "src/core/lib/iomgr/exec_ctx.cc",
- "src/core/lib/iomgr/exec_ctx.h",
- "src/core/lib/iomgr/executor.cc",
- "src/core/lib/iomgr/executor.h",
- "src/core/lib/iomgr/executor/mpmcqueue.cc",
- "src/core/lib/iomgr/executor/mpmcqueue.h",
- "src/core/lib/iomgr/executor/threadpool.cc",
- "src/core/lib/iomgr/executor/threadpool.h",
- "src/core/lib/iomgr/fork_posix.cc",
- "src/core/lib/iomgr/fork_windows.cc",
- "src/core/lib/iomgr/gethostname.h",
- "src/core/lib/iomgr/gethostname_fallback.cc",
- "src/core/lib/iomgr/gethostname_host_name_max.cc",
- "src/core/lib/iomgr/gethostname_sysconf.cc",
- "src/core/lib/iomgr/grpc_if_nametoindex.h",
- "src/core/lib/iomgr/grpc_if_nametoindex_posix.cc",
- "src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc",
- "src/core/lib/iomgr/internal_errqueue.cc",
- "src/core/lib/iomgr/internal_errqueue.h",
- "src/core/lib/iomgr/iocp_windows.cc",
- "src/core/lib/iomgr/iocp_windows.h",
- "src/core/lib/iomgr/iomgr.cc",
- "src/core/lib/iomgr/iomgr.h",
- "src/core/lib/iomgr/iomgr_custom.cc",
- "src/core/lib/iomgr/iomgr_custom.h",
- "src/core/lib/iomgr/iomgr_internal.cc",
- "src/core/lib/iomgr/iomgr_internal.h",
- "src/core/lib/iomgr/iomgr_posix.cc",
- "src/core/lib/iomgr/iomgr_posix_cfstream.cc",
- "src/core/lib/iomgr/iomgr_uv.cc",
- "src/core/lib/iomgr/iomgr_windows.cc",
- "src/core/lib/iomgr/is_epollexclusive_available.cc",
- "src/core/lib/iomgr/is_epollexclusive_available.h",
- "src/core/lib/iomgr/load_file.cc",
- "src/core/lib/iomgr/load_file.h",
- "src/core/lib/iomgr/lockfree_event.cc",
- "src/core/lib/iomgr/lockfree_event.h",
- "src/core/lib/iomgr/nameser.h",
- "src/core/lib/iomgr/polling_entity.cc",
- "src/core/lib/iomgr/polling_entity.h",
- "src/core/lib/iomgr/pollset.cc",
- "src/core/lib/iomgr/pollset.h",
- "src/core/lib/iomgr/pollset_custom.cc",
- "src/core/lib/iomgr/pollset_custom.h",
- "src/core/lib/iomgr/pollset_set.cc",
- "src/core/lib/iomgr/pollset_set.h",
- "src/core/lib/iomgr/pollset_set_custom.cc",
- "src/core/lib/iomgr/pollset_set_custom.h",
- "src/core/lib/iomgr/pollset_set_windows.cc",
- "src/core/lib/iomgr/pollset_set_windows.h",
- "src/core/lib/iomgr/pollset_uv.cc",
- "src/core/lib/iomgr/pollset_uv.h",
- "src/core/lib/iomgr/pollset_windows.cc",
- "src/core/lib/iomgr/pollset_windows.h",
- "src/core/lib/iomgr/port.h",
- "src/core/lib/iomgr/python_util.h",
- "src/core/lib/iomgr/resolve_address.cc",
- "src/core/lib/iomgr/resolve_address.h",
- "src/core/lib/iomgr/resolve_address_custom.cc",
- "src/core/lib/iomgr/resolve_address_custom.h",
- "src/core/lib/iomgr/resolve_address_posix.cc",
- "src/core/lib/iomgr/resolve_address_windows.cc",
- "src/core/lib/iomgr/resource_quota.cc",
- "src/core/lib/iomgr/resource_quota.h",
- "src/core/lib/iomgr/sockaddr.h",
- "src/core/lib/iomgr/sockaddr_custom.h",
- "src/core/lib/iomgr/sockaddr_posix.h",
- "src/core/lib/iomgr/sockaddr_windows.h",
- "src/core/lib/iomgr/socket_factory_posix.cc",
- "src/core/lib/iomgr/socket_factory_posix.h",
- "src/core/lib/iomgr/socket_mutator.cc",
- "src/core/lib/iomgr/socket_mutator.h",
- "src/core/lib/iomgr/socket_utils.h",
- "src/core/lib/iomgr/socket_utils_common_posix.cc",
- "src/core/lib/iomgr/socket_utils_linux.cc",
- "src/core/lib/iomgr/socket_utils_posix.cc",
- "src/core/lib/iomgr/socket_utils_posix.h",
- "src/core/lib/iomgr/socket_utils_uv.cc",
- "src/core/lib/iomgr/socket_utils_windows.cc",
- "src/core/lib/iomgr/socket_windows.cc",
- "src/core/lib/iomgr/socket_windows.h",
- "src/core/lib/iomgr/sys_epoll_wrapper.h",
- "src/core/lib/iomgr/tcp_client.cc",
- "src/core/lib/iomgr/tcp_client.h",
- "src/core/lib/iomgr/tcp_client_cfstream.cc",
- "src/core/lib/iomgr/tcp_client_custom.cc",
- "src/core/lib/iomgr/tcp_client_posix.cc",
- "src/core/lib/iomgr/tcp_client_posix.h",
- "src/core/lib/iomgr/tcp_client_windows.cc",
- "src/core/lib/iomgr/tcp_custom.cc",
- "src/core/lib/iomgr/tcp_custom.h",
- "src/core/lib/iomgr/tcp_posix.cc",
- "src/core/lib/iomgr/tcp_posix.h",
- "src/core/lib/iomgr/tcp_server.cc",
- "src/core/lib/iomgr/tcp_server.h",
- "src/core/lib/iomgr/tcp_server_custom.cc",
- "src/core/lib/iomgr/tcp_server_posix.cc",
- "src/core/lib/iomgr/tcp_server_utils_posix.h",
- "src/core/lib/iomgr/tcp_server_utils_posix_common.cc",
- "src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc",
- "src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc",
- "src/core/lib/iomgr/tcp_server_windows.cc",
- "src/core/lib/iomgr/tcp_uv.cc",
- "src/core/lib/iomgr/tcp_windows.cc",
- "src/core/lib/iomgr/tcp_windows.h",
- "src/core/lib/iomgr/time_averaged_stats.cc",
- "src/core/lib/iomgr/time_averaged_stats.h",
- "src/core/lib/iomgr/timer.cc",
- "src/core/lib/iomgr/timer.h",
- "src/core/lib/iomgr/timer_custom.cc",
- "src/core/lib/iomgr/timer_custom.h",
- "src/core/lib/iomgr/timer_generic.cc",
- "src/core/lib/iomgr/timer_generic.h",
- "src/core/lib/iomgr/timer_heap.cc",
- "src/core/lib/iomgr/timer_heap.h",
- "src/core/lib/iomgr/timer_manager.cc",
- "src/core/lib/iomgr/timer_manager.h",
- "src/core/lib/iomgr/timer_uv.cc",
- "src/core/lib/iomgr/udp_server.cc",
- "src/core/lib/iomgr/udp_server.h",
- "src/core/lib/iomgr/unix_sockets_posix.cc",
- "src/core/lib/iomgr/unix_sockets_posix.h",
- "src/core/lib/iomgr/unix_sockets_posix_noop.cc",
- "src/core/lib/iomgr/wakeup_fd_eventfd.cc",
- "src/core/lib/iomgr/wakeup_fd_nospecial.cc",
- "src/core/lib/iomgr/wakeup_fd_pipe.cc",
- "src/core/lib/iomgr/wakeup_fd_pipe.h",
- "src/core/lib/iomgr/wakeup_fd_posix.cc",
- "src/core/lib/iomgr/wakeup_fd_posix.h",
- "src/core/lib/iomgr/work_serializer.cc",
- "src/core/lib/iomgr/work_serializer.h",
- "src/core/lib/json/json.h",
- "src/core/lib/json/json_reader.cc",
- "src/core/lib/json/json_util.cc",
- "src/core/lib/json/json_util.h",
- "src/core/lib/json/json_writer.cc",
- "src/core/lib/matchers/matchers.cc",
- "src/core/lib/matchers/matchers.h",
- "src/core/lib/security/authorization/authorization_engine.h",
- "src/core/lib/security/authorization/authorization_policy_provider.h",
- "src/core/lib/security/authorization/authorization_policy_provider_vtable.cc",
- "src/core/lib/security/authorization/evaluate_args.cc",
- "src/core/lib/security/authorization/evaluate_args.h",
- "src/core/lib/security/context/security_context.cc",
- "src/core/lib/security/context/security_context.h",
- "src/core/lib/security/credentials/alts/alts_credentials.cc",
- "src/core/lib/security/credentials/alts/alts_credentials.h",
- "src/core/lib/security/credentials/alts/check_gcp_environment.cc",
- "src/core/lib/security/credentials/alts/check_gcp_environment.h",
- "src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc",
- "src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc",
- "src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc",
- "src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc",
- "src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc",
- "src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h",
- "src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc",
- "src/core/lib/security/credentials/composite/composite_credentials.cc",
- "src/core/lib/security/credentials/composite/composite_credentials.h",
- "src/core/lib/security/credentials/credentials.cc",
- "src/core/lib/security/credentials/credentials.h",
- "src/core/lib/security/credentials/credentials_metadata.cc",
- "src/core/lib/security/credentials/external/aws_external_account_credentials.cc",
- "src/core/lib/security/credentials/external/aws_external_account_credentials.h",
- "src/core/lib/security/credentials/external/aws_request_signer.cc",
- "src/core/lib/security/credentials/external/aws_request_signer.h",
- "src/core/lib/security/credentials/external/external_account_credentials.cc",
- "src/core/lib/security/credentials/external/external_account_credentials.h",
- "src/core/lib/security/credentials/external/file_external_account_credentials.cc",
- "src/core/lib/security/credentials/external/file_external_account_credentials.h",
- "src/core/lib/security/credentials/external/url_external_account_credentials.cc",
- "src/core/lib/security/credentials/external/url_external_account_credentials.h",
- "src/core/lib/security/credentials/fake/fake_credentials.cc",
- "src/core/lib/security/credentials/fake/fake_credentials.h",
- "src/core/lib/security/credentials/google_default/credentials_generic.cc",
- "src/core/lib/security/credentials/google_default/google_default_credentials.cc",
- "src/core/lib/security/credentials/google_default/google_default_credentials.h",
- "src/core/lib/security/credentials/iam/iam_credentials.cc",
- "src/core/lib/security/credentials/iam/iam_credentials.h",
- "src/core/lib/security/credentials/insecure/insecure_credentials.cc",
- "src/core/lib/security/credentials/jwt/json_token.cc",
- "src/core/lib/security/credentials/jwt/json_token.h",
- "src/core/lib/security/credentials/jwt/jwt_credentials.cc",
- "src/core/lib/security/credentials/jwt/jwt_credentials.h",
- "src/core/lib/security/credentials/jwt/jwt_verifier.cc",
- "src/core/lib/security/credentials/jwt/jwt_verifier.h",
- "src/core/lib/security/credentials/local/local_credentials.cc",
- "src/core/lib/security/credentials/local/local_credentials.h",
- "src/core/lib/security/credentials/oauth2/oauth2_credentials.cc",
- "src/core/lib/security/credentials/oauth2/oauth2_credentials.h",
- "src/core/lib/security/credentials/plugin/plugin_credentials.cc",
- "src/core/lib/security/credentials/plugin/plugin_credentials.h",
- "src/core/lib/security/credentials/ssl/ssl_credentials.cc",
- "src/core/lib/security/credentials/ssl/ssl_credentials.h",
- "src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc",
- "src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h",
- "src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc",
- "src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h",
- "src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc",
- "src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h",
- "src/core/lib/security/credentials/tls/tls_credentials.cc",
- "src/core/lib/security/credentials/tls/tls_credentials.h",
- "src/core/lib/security/credentials/tls/tls_utils.cc",
- "src/core/lib/security/credentials/tls/tls_utils.h",
- "src/core/lib/security/credentials/xds/xds_credentials.cc",
- "src/core/lib/security/credentials/xds/xds_credentials.h",
- "src/core/lib/security/security_connector/alts/alts_security_connector.cc",
- "src/core/lib/security/security_connector/alts/alts_security_connector.h",
- "src/core/lib/security/security_connector/fake/fake_security_connector.cc",
- "src/core/lib/security/security_connector/fake/fake_security_connector.h",
- "src/core/lib/security/security_connector/insecure/insecure_security_connector.cc",
- "src/core/lib/security/security_connector/insecure/insecure_security_connector.h",
- "src/core/lib/security/security_connector/load_system_roots.h",
- "src/core/lib/security/security_connector/load_system_roots_fallback.cc",
- "src/core/lib/security/security_connector/load_system_roots_linux.cc",
- "src/core/lib/security/security_connector/load_system_roots_linux.h",
- "src/core/lib/security/security_connector/local/local_security_connector.cc",
- "src/core/lib/security/security_connector/local/local_security_connector.h",
- "src/core/lib/security/security_connector/security_connector.cc",
- "src/core/lib/security/security_connector/security_connector.h",
- "src/core/lib/security/security_connector/ssl/ssl_security_connector.cc",
- "src/core/lib/security/security_connector/ssl/ssl_security_connector.h",
- "src/core/lib/security/security_connector/ssl_utils.cc",
- "src/core/lib/security/security_connector/ssl_utils.h",
- "src/core/lib/security/security_connector/ssl_utils_config.cc",
- "src/core/lib/security/security_connector/ssl_utils_config.h",
- "src/core/lib/security/security_connector/tls/tls_security_connector.cc",
- "src/core/lib/security/security_connector/tls/tls_security_connector.h",
- "src/core/lib/security/transport/auth_filters.h",
- "src/core/lib/security/transport/client_auth_filter.cc",
- "src/core/lib/security/transport/secure_endpoint.cc",
- "src/core/lib/security/transport/secure_endpoint.h",
- "src/core/lib/security/transport/security_handshaker.cc",
- "src/core/lib/security/transport/security_handshaker.h",
- "src/core/lib/security/transport/server_auth_filter.cc",
- "src/core/lib/security/transport/tsi_error.cc",
- "src/core/lib/security/transport/tsi_error.h",
- "src/core/lib/security/util/json_util.cc",
- "src/core/lib/security/util/json_util.h",
- "src/core/lib/slice/b64.cc",
- "src/core/lib/slice/b64.h",
- "src/core/lib/slice/percent_encoding.cc",
- "src/core/lib/slice/percent_encoding.h",
- "src/core/lib/slice/slice.cc",
- "src/core/lib/slice/slice_buffer.cc",
- "src/core/lib/slice/slice_intern.cc",
- "src/core/lib/slice/slice_internal.h",
- "src/core/lib/slice/slice_string_helpers.cc",
- "src/core/lib/slice/slice_string_helpers.h",
- "src/core/lib/slice/slice_utils.h",
- "src/core/lib/surface/api_trace.cc",
- "src/core/lib/surface/api_trace.h",
- "src/core/lib/surface/byte_buffer.cc",
- "src/core/lib/surface/byte_buffer_reader.cc",
- "src/core/lib/surface/call.cc",
- "src/core/lib/surface/call.h",
- "src/core/lib/surface/call_details.cc",
- "src/core/lib/surface/call_log_batch.cc",
- "src/core/lib/surface/call_test_only.h",
- "src/core/lib/surface/channel.cc",
- "src/core/lib/surface/channel.h",
- "src/core/lib/surface/channel_init.cc",
- "src/core/lib/surface/channel_init.h",
- "src/core/lib/surface/channel_ping.cc",
- "src/core/lib/surface/channel_stack_type.cc",
- "src/core/lib/surface/channel_stack_type.h",
- "src/core/lib/surface/completion_queue.cc",
- "src/core/lib/surface/completion_queue.h",
- "src/core/lib/surface/completion_queue_factory.cc",
- "src/core/lib/surface/completion_queue_factory.h",
- "src/core/lib/surface/event_string.cc",
- "src/core/lib/surface/event_string.h",
- "src/core/lib/surface/init.cc",
- "src/core/lib/surface/init.h",
- "src/core/lib/surface/init_secure.cc",
- "src/core/lib/surface/lame_client.cc",
- "src/core/lib/surface/lame_client.h",
- "src/core/lib/surface/metadata_array.cc",
- "src/core/lib/surface/server.cc",
- "src/core/lib/surface/server.h",
- "src/core/lib/surface/validate_metadata.cc",
- "src/core/lib/surface/validate_metadata.h",
- "src/core/lib/surface/version.cc",
- "src/core/lib/transport/authority_override.cc",
- "src/core/lib/transport/authority_override.h",
- "src/core/lib/transport/bdp_estimator.cc",
- "src/core/lib/transport/bdp_estimator.h",
- "src/core/lib/transport/byte_stream.cc",
- "src/core/lib/transport/byte_stream.h",
- "src/core/lib/transport/connectivity_state.cc",
- "src/core/lib/transport/connectivity_state.h",
- "src/core/lib/transport/error_utils.cc",
- "src/core/lib/transport/error_utils.h",
- "src/core/lib/transport/http2_errors.h",
- "src/core/lib/transport/metadata.cc",
- "src/core/lib/transport/metadata.h",
- "src/core/lib/transport/metadata_batch.cc",
- "src/core/lib/transport/metadata_batch.h",
- "src/core/lib/transport/pid_controller.cc",
- "src/core/lib/transport/pid_controller.h",
- "src/core/lib/transport/static_metadata.cc",
- "src/core/lib/transport/static_metadata.h",
- "src/core/lib/transport/status_conversion.cc",
- "src/core/lib/transport/status_conversion.h",
- "src/core/lib/transport/status_metadata.cc",
- "src/core/lib/transport/status_metadata.h",
- "src/core/lib/transport/timeout_encoding.cc",
- "src/core/lib/transport/timeout_encoding.h",
- "src/core/lib/transport/transport.cc",
- "src/core/lib/transport/transport.h",
- "src/core/lib/transport/transport_impl.h",
- "src/core/lib/transport/transport_op_string.cc",
- "src/core/lib/uri/uri_parser.cc",
- "src/core/lib/uri/uri_parser.h",
- "src/core/plugin_registry/grpc_plugin_registry.cc",
- "src/core/tsi/alts/crypt/aes_gcm.cc",
- "src/core/tsi/alts/crypt/gsec.cc",
- "src/core/tsi/alts/crypt/gsec.h",
- "src/core/tsi/alts/frame_protector/alts_counter.cc",
- "src/core/tsi/alts/frame_protector/alts_counter.h",
- "src/core/tsi/alts/frame_protector/alts_crypter.cc",
- "src/core/tsi/alts/frame_protector/alts_crypter.h",
- "src/core/tsi/alts/frame_protector/alts_frame_protector.cc",
- "src/core/tsi/alts/frame_protector/alts_frame_protector.h",
- "src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc",
- "src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.h",
- "src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc",
- "src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc",
- "src/core/tsi/alts/frame_protector/frame_handler.cc",
- "src/core/tsi/alts/frame_protector/frame_handler.h",
- "src/core/tsi/alts/handshaker/alts_handshaker_client.cc",
- "src/core/tsi/alts/handshaker/alts_handshaker_client.h",
- "src/core/tsi/alts/handshaker/alts_shared_resource.cc",
- "src/core/tsi/alts/handshaker/alts_shared_resource.h",
- "src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc",
- "src/core/tsi/alts/handshaker/alts_tsi_handshaker.h",
- "src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h",
- "src/core/tsi/alts/handshaker/alts_tsi_utils.cc",
- "src/core/tsi/alts/handshaker/alts_tsi_utils.h",
- "src/core/tsi/alts/handshaker/transport_security_common_api.cc",
- "src/core/tsi/alts/handshaker/transport_security_common_api.h",
- "src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc",
- "src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h",
- "src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc",
- "src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.h",
- "src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h",
- "src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc",
- "src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h",
- "src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc",
- "src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h",
- "src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc",
- "src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h",
- "src/core/tsi/fake_transport_security.cc",
- "src/core/tsi/fake_transport_security.h",
- "src/core/tsi/local_transport_security.cc",
- "src/core/tsi/local_transport_security.h",
- "src/core/tsi/ssl/session_cache/ssl_session.h",
- "src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc",
- "src/core/tsi/ssl/session_cache/ssl_session_cache.cc",
- "src/core/tsi/ssl/session_cache/ssl_session_cache.h",
- "src/core/tsi/ssl/session_cache/ssl_session_openssl.cc",
- "src/core/tsi/ssl_transport_security.cc",
- "src/core/tsi/ssl_transport_security.h",
- "src/core/tsi/ssl_types.h",
- "src/core/tsi/transport_security.cc",
- "src/core/tsi/transport_security.h",
- "src/core/tsi/transport_security_grpc.cc",
- "src/core/tsi/transport_security_grpc.h",
- "src/core/tsi/transport_security_interface.h",
- "third_party/xxhash/xxhash.h",
- ]
- deps = [
- "//third_party/zlib",
- ":absl/container:flat_hash_map",
- ":absl/container:inlined_vector",
- ":absl/functional:bind_front",
- ":absl/status:statusor",
- ":gpr",
- "//third_party/boringssl",
- ":address_sorting",
- "//third_party/cares",
- ":address_sorting",
- ]
-
- public_configs = [
- ":grpc_config",
- ]
- include_dirs = [
- "third_party/cares",
- "third_party/address_sorting/include",
- ]
- }
-
-
-
- source_set("grpc++") {
- sources = [
- "include/grpc++/alarm.h",
- "include/grpc++/channel.h",
- "include/grpc++/client_context.h",
- "include/grpc++/completion_queue.h",
- "include/grpc++/create_channel.h",
- "include/grpc++/create_channel_posix.h",
- "include/grpc++/ext/health_check_service_server_builder_option.h",
- "include/grpc++/generic/async_generic_service.h",
- "include/grpc++/generic/generic_stub.h",
- "include/grpc++/grpc++.h",
- "include/grpc++/health_check_service_interface.h",
- "include/grpc++/impl/call.h",
- "include/grpc++/impl/channel_argument_option.h",
- "include/grpc++/impl/client_unary_call.h",
- "include/grpc++/impl/codegen/async_stream.h",
- "include/grpc++/impl/codegen/async_unary_call.h",
- "include/grpc++/impl/codegen/byte_buffer.h",
- "include/grpc++/impl/codegen/call.h",
- "include/grpc++/impl/codegen/call_hook.h",
- "include/grpc++/impl/codegen/channel_interface.h",
- "include/grpc++/impl/codegen/client_context.h",
- "include/grpc++/impl/codegen/client_unary_call.h",
- "include/grpc++/impl/codegen/completion_queue.h",
- "include/grpc++/impl/codegen/completion_queue_tag.h",
- "include/grpc++/impl/codegen/config.h",
- "include/grpc++/impl/codegen/config_protobuf.h",
- "include/grpc++/impl/codegen/core_codegen.h",
- "include/grpc++/impl/codegen/core_codegen_interface.h",
- "include/grpc++/impl/codegen/create_auth_context.h",
- "include/grpc++/impl/codegen/grpc_library.h",
- "include/grpc++/impl/codegen/metadata_map.h",
- "include/grpc++/impl/codegen/method_handler_impl.h",
- "include/grpc++/impl/codegen/proto_utils.h",
- "include/grpc++/impl/codegen/rpc_method.h",
- "include/grpc++/impl/codegen/rpc_service_method.h",
- "include/grpc++/impl/codegen/security/auth_context.h",
- "include/grpc++/impl/codegen/serialization_traits.h",
- "include/grpc++/impl/codegen/server_context.h",
- "include/grpc++/impl/codegen/server_interface.h",
- "include/grpc++/impl/codegen/service_type.h",
- "include/grpc++/impl/codegen/slice.h",
- "include/grpc++/impl/codegen/status.h",
- "include/grpc++/impl/codegen/status_code_enum.h",
- "include/grpc++/impl/codegen/string_ref.h",
- "include/grpc++/impl/codegen/stub_options.h",
- "include/grpc++/impl/codegen/sync_stream.h",
- "include/grpc++/impl/codegen/time.h",
- "include/grpc++/impl/grpc_library.h",
- "include/grpc++/impl/method_handler_impl.h",
- "include/grpc++/impl/rpc_method.h",
- "include/grpc++/impl/rpc_service_method.h",
- "include/grpc++/impl/serialization_traits.h",
- "include/grpc++/impl/server_builder_option.h",
- "include/grpc++/impl/server_builder_plugin.h",
- "include/grpc++/impl/server_initializer.h",
- "include/grpc++/impl/service_type.h",
- "include/grpc++/resource_quota.h",
- "include/grpc++/security/auth_context.h",
- "include/grpc++/security/auth_metadata_processor.h",
- "include/grpc++/security/credentials.h",
- "include/grpc++/security/server_credentials.h",
- "include/grpc++/server.h",
- "include/grpc++/server_builder.h",
- "include/grpc++/server_context.h",
- "include/grpc++/server_posix.h",
- "include/grpc++/support/async_stream.h",
- "include/grpc++/support/async_unary_call.h",
- "include/grpc++/support/byte_buffer.h",
- "include/grpc++/support/channel_arguments.h",
- "include/grpc++/support/config.h",
- "include/grpc++/support/slice.h",
- "include/grpc++/support/status.h",
- "include/grpc++/support/status_code_enum.h",
- "include/grpc++/support/string_ref.h",
- "include/grpc++/support/stub_options.h",
- "include/grpc++/support/sync_stream.h",
- "include/grpc++/support/time.h",
- "include/grpcpp/alarm.h",
- "include/grpcpp/channel.h",
- "include/grpcpp/client_context.h",
- "include/grpcpp/completion_queue.h",
- "include/grpcpp/create_channel.h",
- "include/grpcpp/create_channel_posix.h",
- "include/grpcpp/ext/health_check_service_server_builder_option.h",
- "include/grpcpp/generic/async_generic_service.h",
- "include/grpcpp/generic/generic_stub.h",
- "include/grpcpp/grpcpp.h",
- "include/grpcpp/health_check_service_interface.h",
- "include/grpcpp/impl/call.h",
- "include/grpcpp/impl/channel_argument_option.h",
- "include/grpcpp/impl/client_unary_call.h",
- "include/grpcpp/impl/codegen/async_generic_service.h",
- "include/grpcpp/impl/codegen/async_stream.h",
- "include/grpcpp/impl/codegen/async_unary_call.h",
- "include/grpcpp/impl/codegen/byte_buffer.h",
- "include/grpcpp/impl/codegen/call.h",
- "include/grpcpp/impl/codegen/call_hook.h",
- "include/grpcpp/impl/codegen/call_op_set.h",
- "include/grpcpp/impl/codegen/call_op_set_interface.h",
- "include/grpcpp/impl/codegen/callback_common.h",
- "include/grpcpp/impl/codegen/channel_interface.h",
- "include/grpcpp/impl/codegen/client_callback.h",
- "include/grpcpp/impl/codegen/client_context.h",
- "include/grpcpp/impl/codegen/client_interceptor.h",
- "include/grpcpp/impl/codegen/client_unary_call.h",
- "include/grpcpp/impl/codegen/completion_queue.h",
- "include/grpcpp/impl/codegen/completion_queue_tag.h",
- "include/grpcpp/impl/codegen/config.h",
- "include/grpcpp/impl/codegen/config_protobuf.h",
- "include/grpcpp/impl/codegen/core_codegen.h",
- "include/grpcpp/impl/codegen/core_codegen_interface.h",
- "include/grpcpp/impl/codegen/create_auth_context.h",
- "include/grpcpp/impl/codegen/delegating_channel.h",
- "include/grpcpp/impl/codegen/grpc_library.h",
- "include/grpcpp/impl/codegen/intercepted_channel.h",
- "include/grpcpp/impl/codegen/interceptor.h",
- "include/grpcpp/impl/codegen/interceptor_common.h",
- "include/grpcpp/impl/codegen/message_allocator.h",
- "include/grpcpp/impl/codegen/metadata_map.h",
- "include/grpcpp/impl/codegen/method_handler.h",
- "include/grpcpp/impl/codegen/method_handler_impl.h",
- "include/grpcpp/impl/codegen/proto_buffer_reader.h",
- "include/grpcpp/impl/codegen/proto_buffer_writer.h",
- "include/grpcpp/impl/codegen/proto_utils.h",
- "include/grpcpp/impl/codegen/rpc_method.h",
- "include/grpcpp/impl/codegen/rpc_service_method.h",
- "include/grpcpp/impl/codegen/security/auth_context.h",
- "include/grpcpp/impl/codegen/serialization_traits.h",
- "include/grpcpp/impl/codegen/server_callback.h",
- "include/grpcpp/impl/codegen/server_callback_handlers.h",
- "include/grpcpp/impl/codegen/server_context.h",
- "include/grpcpp/impl/codegen/server_interceptor.h",
- "include/grpcpp/impl/codegen/server_interface.h",
- "include/grpcpp/impl/codegen/service_type.h",
- "include/grpcpp/impl/codegen/slice.h",
- "include/grpcpp/impl/codegen/status.h",
- "include/grpcpp/impl/codegen/status_code_enum.h",
- "include/grpcpp/impl/codegen/string_ref.h",
- "include/grpcpp/impl/codegen/stub_options.h",
- "include/grpcpp/impl/codegen/sync.h",
- "include/grpcpp/impl/codegen/sync_stream.h",
- "include/grpcpp/impl/codegen/time.h",
- "include/grpcpp/impl/grpc_library.h",
- "include/grpcpp/impl/method_handler_impl.h",
- "include/grpcpp/impl/rpc_method.h",
- "include/grpcpp/impl/rpc_service_method.h",
- "include/grpcpp/impl/serialization_traits.h",
- "include/grpcpp/impl/server_builder_option.h",
- "include/grpcpp/impl/server_builder_plugin.h",
- "include/grpcpp/impl/server_initializer.h",
- "include/grpcpp/impl/service_type.h",
- "include/grpcpp/resource_quota.h",
- "include/grpcpp/security/auth_context.h",
- "include/grpcpp/security/auth_metadata_processor.h",
- "include/grpcpp/security/authorization_policy_provider.h",
- "include/grpcpp/security/credentials.h",
- "include/grpcpp/security/server_credentials.h",
- "include/grpcpp/security/tls_certificate_provider.h",
- "include/grpcpp/security/tls_credentials_options.h",
- "include/grpcpp/server.h",
- "include/grpcpp/server_builder.h",
- "include/grpcpp/server_context.h",
- "include/grpcpp/server_posix.h",
- "include/grpcpp/support/async_stream.h",
- "include/grpcpp/support/async_unary_call.h",
- "include/grpcpp/support/byte_buffer.h",
- "include/grpcpp/support/channel_arguments.h",
- "include/grpcpp/support/client_callback.h",
- "include/grpcpp/support/client_interceptor.h",
- "include/grpcpp/support/config.h",
- "include/grpcpp/support/interceptor.h",
- "include/grpcpp/support/message_allocator.h",
- "include/grpcpp/support/method_handler.h",
- "include/grpcpp/support/proto_buffer_reader.h",
- "include/grpcpp/support/proto_buffer_writer.h",
- "include/grpcpp/support/server_callback.h",
- "include/grpcpp/support/server_interceptor.h",
- "include/grpcpp/support/slice.h",
- "include/grpcpp/support/status.h",
- "include/grpcpp/support/status_code_enum.h",
- "include/grpcpp/support/string_ref.h",
- "include/grpcpp/support/stub_options.h",
- "include/grpcpp/support/sync_stream.h",
- "include/grpcpp/support/time.h",
- "include/grpcpp/support/validate_service_config.h",
- "include/grpcpp/xds_server_builder.h",
- "src/cpp/client/channel_cc.cc",
- "src/cpp/client/client_callback.cc",
- "src/cpp/client/client_context.cc",
- "src/cpp/client/client_interceptor.cc",
- "src/cpp/client/create_channel.cc",
- "src/cpp/client/create_channel_internal.cc",
- "src/cpp/client/create_channel_internal.h",
- "src/cpp/client/create_channel_posix.cc",
- "src/cpp/client/credentials_cc.cc",
- "src/cpp/client/insecure_credentials.cc",
- "src/cpp/client/secure_credentials.cc",
- "src/cpp/client/secure_credentials.h",
- "src/cpp/client/xds_credentials.cc",
- "src/cpp/codegen/codegen_init.cc",
- "src/cpp/common/alarm.cc",
- "src/cpp/common/auth_property_iterator.cc",
- "src/cpp/common/channel_arguments.cc",
- "src/cpp/common/channel_filter.cc",
- "src/cpp/common/channel_filter.h",
- "src/cpp/common/completion_queue_cc.cc",
- "src/cpp/common/core_codegen.cc",
- "src/cpp/common/resource_quota_cc.cc",
- "src/cpp/common/rpc_method.cc",
- "src/cpp/common/secure_auth_context.cc",
- "src/cpp/common/secure_auth_context.h",
- "src/cpp/common/secure_channel_arguments.cc",
- "src/cpp/common/secure_create_auth_context.cc",
- "src/cpp/common/tls_certificate_provider.cc",
- "src/cpp/common/tls_credentials_options.cc",
- "src/cpp/common/tls_credentials_options_util.cc",
- "src/cpp/common/tls_credentials_options_util.h",
- "src/cpp/common/validate_service_config.cc",
- "src/cpp/common/version_cc.cc",
- "src/cpp/server/async_generic_service.cc",
- "src/cpp/server/channel_argument_option.cc",
- "src/cpp/server/create_default_thread_pool.cc",
- "src/cpp/server/dynamic_thread_pool.cc",
- "src/cpp/server/dynamic_thread_pool.h",
- "src/cpp/server/external_connection_acceptor_impl.cc",
- "src/cpp/server/external_connection_acceptor_impl.h",
- "src/cpp/server/health/default_health_check_service.cc",
- "src/cpp/server/health/default_health_check_service.h",
- "src/cpp/server/health/health_check_service.cc",
- "src/cpp/server/health/health_check_service_server_builder_option.cc",
- "src/cpp/server/insecure_server_credentials.cc",
- "src/cpp/server/secure_server_credentials.cc",
- "src/cpp/server/secure_server_credentials.h",
- "src/cpp/server/server_builder.cc",
- "src/cpp/server/server_callback.cc",
- "src/cpp/server/server_cc.cc",
- "src/cpp/server/server_context.cc",
- "src/cpp/server/server_credentials.cc",
- "src/cpp/server/server_posix.cc",
- "src/cpp/server/thread_pool_interface.h",
- "src/cpp/server/xds_server_credentials.cc",
- "src/cpp/thread_manager/thread_manager.cc",
- "src/cpp/thread_manager/thread_manager.h",
- "src/cpp/util/byte_buffer_cc.cc",
- "src/cpp/util/status.cc",
- "src/cpp/util/string_ref.cc",
- "src/cpp/util/time_cc.cc",
- ]
- deps = [
- "//third_party/protobuf:protobuf_lite",
- ":grpc",
- ]
-
- public_configs = [
- ":grpc_config",
- ]
- }
-
- # Only compile the plugin for the host architecture.
- if (current_toolchain == host_toolchain) {
-
-
- source_set("grpc_plugin_support") {
- sources = [
- "include/grpc++/impl/codegen/config_protobuf.h",
- "include/grpcpp/impl/codegen/config_protobuf.h",
- "src/compiler/config.h",
- "src/compiler/config_protobuf.h",
- "src/compiler/cpp_generator.cc",
- "src/compiler/cpp_generator.h",
- "src/compiler/cpp_generator_helpers.h",
- "src/compiler/cpp_plugin.h",
- "src/compiler/csharp_generator.cc",
- "src/compiler/csharp_generator.h",
- "src/compiler/csharp_generator_helpers.h",
- "src/compiler/generator_helpers.h",
- "src/compiler/node_generator.cc",
- "src/compiler/node_generator.h",
- "src/compiler/node_generator_helpers.h",
- "src/compiler/objective_c_generator.cc",
- "src/compiler/objective_c_generator.h",
- "src/compiler/objective_c_generator_helpers.h",
- "src/compiler/php_generator.cc",
- "src/compiler/php_generator.h",
- "src/compiler/php_generator_helpers.h",
- "src/compiler/protobuf_plugin.h",
- "src/compiler/python_generator.cc",
- "src/compiler/python_generator.h",
- "src/compiler/python_generator_helpers.h",
- "src/compiler/python_private_generator.h",
- "src/compiler/schema_interface.h",
- ]
- deps = [
- "//third_party/protobuf:protoc_lib",
- ]
-
- public_configs = [
- ":grpc_config",
- ]
- }
-
- }
- # Only compile the plugin for the host architecture.
- if (current_toolchain == host_toolchain) {
-
- executable("grpc_cpp_plugin") {
- sources = [
- "src/compiler/cpp_plugin.cc",
- ]
- deps = [
- "//third_party/protobuf:protoc_lib",
- ":grpc_plugin_support",
- ]
-
- configs += [
- "//third_party/protobuf:protobuf_config",
- ]
- public_configs = [ ":grpc_config" ]
- }
-
- }
-
-
diff --git a/BUILDING.md b/BUILDING.md
index 4a69c3b779..3c8e24143d 100644
--- a/BUILDING.md
+++ b/BUILDING.md
@@ -20,7 +20,7 @@ If you plan to build using CMake
If you are a contributor and plan to build and run tests, install the following as well:
```sh
$ # clang and LLVM C++ lib is only required for sanitizer builds
- $ [sudo] apt-get install clang-5.0 libc++-dev
+ $ [sudo] apt-get install clang libc++-dev
```
## MacOS
@@ -269,7 +269,7 @@ $ make
### A note on `protoc`
-By default gRPC uses [protocol buffers](https://github.com/google/protobuf),
+By default gRPC uses [protocol buffers](https://github.com/protocolbuffers/protobuf),
you will need the `protoc` compiler to generate stub server and client code.
If you compile gRPC from source, as described below, the Makefile will
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4260bd4df8..e00b4349ea 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -25,13 +25,13 @@
cmake_minimum_required(VERSION 3.5.1)
set(PACKAGE_NAME "grpc")
-set(PACKAGE_VERSION "1.39.1")
+set(PACKAGE_VERSION "1.40.0")
set(gRPC_CORE_VERSION "18.0.0")
set(gRPC_CORE_SOVERSION "18")
-set(gRPC_CPP_VERSION "1.39.1")
-set(gRPC_CPP_SOVERSION "1.39")
-set(gRPC_CSHARP_VERSION "2.39.1")
-set(gRPC_CSHARP_SOVERSION "2.39")
+set(gRPC_CPP_VERSION "1.40.0")
+set(gRPC_CPP_SOVERSION "1.40")
+set(gRPC_CSHARP_VERSION "2.40.0")
+set(gRPC_CSHARP_SOVERSION "2.40")
set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
set(PACKAGE_TARNAME "${PACKAGE_NAME}-${PACKAGE_VERSION}")
set(PACKAGE_BUGREPORT "https://github.com/grpc/grpc/issues/")
@@ -251,7 +251,7 @@ endif()
if (gRPC_XDS_USER_AGENT_IS_CSHARP)
# The value of the defines needs to contain quotes.
# See https://github.com/grpc/grpc/blob/fbf32836a418cc84f58786700273b65cb9174e1d/src/core/ext/xds/xds_api.cc#L854
- add_definitions("-DGRPC_XDS_USER_AGENT_NAME_SUFFIX=\"csharp\"" "-DGRPC_XDS_USER_AGENT_VERSION_SUFFIX=\"2.39.1\"")
+ add_definitions("-DGRPC_XDS_USER_AGENT_NAME_SUFFIX=\"csharp\"" "-DGRPC_XDS_USER_AGENT_VERSION_SUFFIX=\"2.40.0\"")
endif()
include(cmake/abseil-cpp.cmake)
@@ -749,6 +749,8 @@ if(gRPC_BUILD_TESTS)
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
add_dependencies(buildtests_cxx bdp_estimator_test)
endif()
+ add_dependencies(buildtests_cxx binder_smoke_test)
+ add_dependencies(buildtests_cxx bitset_test)
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
add_dependencies(buildtests_cxx bm_alarm)
endif()
@@ -896,6 +898,7 @@ if(gRPC_BUILD_TESTS)
add_dependencies(buildtests_cxx lb_load_data_store_test)
add_dependencies(buildtests_cxx linux_system_roots_test)
add_dependencies(buildtests_cxx log_test)
+ add_dependencies(buildtests_cxx match_test)
add_dependencies(buildtests_cxx matchers_test)
add_dependencies(buildtests_cxx message_allocator_end2end_test)
add_dependencies(buildtests_cxx mock_stream_test)
@@ -904,6 +907,7 @@ if(gRPC_BUILD_TESTS)
add_dependencies(buildtests_cxx noop-benchmark)
add_dependencies(buildtests_cxx orphanable_test)
add_dependencies(buildtests_cxx out_of_bounds_bad_client_test)
+ add_dependencies(buildtests_cxx overload_test)
add_dependencies(buildtests_cxx pid_controller_test)
add_dependencies(buildtests_cxx port_sharing_end2end_test)
add_dependencies(buildtests_cxx proto_server_reflection_test)
@@ -956,6 +960,7 @@ if(gRPC_BUILD_TESTS)
add_dependencies(buildtests_cxx streaming_throughput_test)
endif()
add_dependencies(buildtests_cxx string_ref_test)
+ add_dependencies(buildtests_cxx table_test)
add_dependencies(buildtests_cxx test_cpp_client_credentials_test)
add_dependencies(buildtests_cxx test_cpp_server_credentials_test)
add_dependencies(buildtests_cxx test_cpp_util_slice_test)
@@ -1120,18 +1125,22 @@ add_library(end2end_nosec_tests
test/core/end2end/tests/resource_quota_server.cc
test/core/end2end/tests/retry.cc
test/core/end2end/tests/retry_cancel_during_delay.cc
+ test/core/end2end/tests/retry_cancel_with_multiple_send_batches.cc
test/core/end2end/tests/retry_cancellation.cc
test/core/end2end/tests/retry_disabled.cc
test/core/end2end/tests/retry_exceeds_buffer_size_in_delay.cc
test/core/end2end/tests/retry_exceeds_buffer_size_in_initial_batch.cc
test/core/end2end/tests/retry_exceeds_buffer_size_in_subsequent_batch.cc
test/core/end2end/tests/retry_lb_drop.cc
+ test/core/end2end/tests/retry_lb_fail.cc
test/core/end2end/tests/retry_non_retriable_status.cc
test/core/end2end/tests/retry_non_retriable_status_before_recv_trailing_metadata_started.cc
test/core/end2end/tests/retry_per_attempt_recv_timeout.cc
+ test/core/end2end/tests/retry_per_attempt_recv_timeout_on_last_attempt.cc
test/core/end2end/tests/retry_recv_initial_metadata.cc
test/core/end2end/tests/retry_recv_message.cc
test/core/end2end/tests/retry_recv_trailing_metadata_error.cc
+ test/core/end2end/tests/retry_send_initial_metadata_refs.cc
test/core/end2end/tests/retry_send_op_fails.cc
test/core/end2end/tests/retry_server_pushback_delay.cc
test/core/end2end/tests/retry_server_pushback_disabled.cc
@@ -1258,18 +1267,22 @@ add_library(end2end_tests
test/core/end2end/tests/resource_quota_server.cc
test/core/end2end/tests/retry.cc
test/core/end2end/tests/retry_cancel_during_delay.cc
+ test/core/end2end/tests/retry_cancel_with_multiple_send_batches.cc
test/core/end2end/tests/retry_cancellation.cc
test/core/end2end/tests/retry_disabled.cc
test/core/end2end/tests/retry_exceeds_buffer_size_in_delay.cc
test/core/end2end/tests/retry_exceeds_buffer_size_in_initial_batch.cc
test/core/end2end/tests/retry_exceeds_buffer_size_in_subsequent_batch.cc
test/core/end2end/tests/retry_lb_drop.cc
+ test/core/end2end/tests/retry_lb_fail.cc
test/core/end2end/tests/retry_non_retriable_status.cc
test/core/end2end/tests/retry_non_retriable_status_before_recv_trailing_metadata_started.cc
test/core/end2end/tests/retry_per_attempt_recv_timeout.cc
+ test/core/end2end/tests/retry_per_attempt_recv_timeout_on_last_attempt.cc
test/core/end2end/tests/retry_recv_initial_metadata.cc
test/core/end2end/tests/retry_recv_message.cc
test/core/end2end/tests/retry_recv_trailing_metadata_error.cc
+ test/core/end2end/tests/retry_send_initial_metadata_refs.cc
test/core/end2end/tests/retry_send_op_fails.cc
test/core/end2end/tests/retry_server_pushback_delay.cc
test/core/end2end/tests/retry_server_pushback_disabled.cc
@@ -1426,8 +1439,10 @@ target_include_directories(gpr
target_link_libraries(gpr
${_gRPC_ALLTARGETS_LIBRARIES}
absl::base
+ absl::core_headers
absl::memory
absl::status
+ absl::cord
absl::str_format
absl::strings
absl::synchronization
@@ -1593,6 +1608,7 @@ add_library(grpc
src/core/ext/transport/chttp2/transport/bin_decoder.cc
src/core/ext/transport/chttp2/transport/bin_encoder.cc
src/core/ext/transport/chttp2/transport/chttp2_plugin.cc
+ src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc
src/core/ext/transport/chttp2/transport/chttp2_transport.cc
src/core/ext/transport/chttp2/transport/context_list.cc
src/core/ext/transport/chttp2/transport/flow_control.cc
@@ -1635,14 +1651,17 @@ add_library(grpc
src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c
src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c
src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c
+ src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c
src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c
src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c
+ src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c
src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c
src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c
src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c
src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c
src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c
src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c
+ src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c
src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c
src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c
src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c
@@ -1669,6 +1688,7 @@ add_library(grpc
src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c
src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c
src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c
+ src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c
src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c
src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c
src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c
@@ -1722,14 +1742,17 @@ add_library(grpc
src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c
src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c
src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c
+ src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c
src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c
src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c
+ src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c
src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c
src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c
src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c
src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c
src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c
src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c
+ src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c
src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c
src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c
src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c
@@ -1755,6 +1778,7 @@ add_library(grpc
src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c
src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c
src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c
+ src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c
src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c
src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c
src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c
@@ -1828,7 +1852,6 @@ add_library(grpc
src/core/lib/debug/trace.cc
src/core/lib/event_engine/endpoint_config.cc
src/core/lib/event_engine/event_engine.cc
- src/core/lib/event_engine/slice_allocator.cc
src/core/lib/event_engine/sockaddr.cc
src/core/lib/http/format_request.cc
src/core/lib/http/httpcli.cc
@@ -2413,6 +2436,7 @@ add_library(grpc_unsecure
src/core/ext/transport/chttp2/transport/bin_decoder.cc
src/core/ext/transport/chttp2/transport/bin_encoder.cc
src/core/ext/transport/chttp2/transport/chttp2_plugin.cc
+ src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc
src/core/ext/transport/chttp2/transport/chttp2_transport.cc
src/core/ext/transport/chttp2/transport/context_list.cc
src/core/ext/transport/chttp2/transport/flow_control.cc
@@ -2465,7 +2489,6 @@ add_library(grpc_unsecure
src/core/lib/debug/trace.cc
src/core/lib/event_engine/endpoint_config.cc
src/core/lib/event_engine/event_engine.cc
- src/core/lib/event_engine/slice_allocator.cc
src/core/lib/event_engine/sockaddr.cc
src/core/lib/http/format_request.cc
src/core/lib/http/httpcli.cc
@@ -8299,6 +8322,75 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
endif()
endif()
if(gRPC_BUILD_TESTS)
+
+add_executable(binder_smoke_test
+ test/core/transport/binder/binder_smoke_test.cc
+ third_party/googletest/googletest/src/gtest-all.cc
+ third_party/googletest/googlemock/src/gmock-all.cc
+)
+
+target_include_directories(binder_smoke_test
+ PRIVATE
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/include
+ ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
+ ${_gRPC_RE2_INCLUDE_DIR}
+ ${_gRPC_SSL_INCLUDE_DIR}
+ ${_gRPC_UPB_GENERATED_DIR}
+ ${_gRPC_UPB_GRPC_GENERATED_DIR}
+ ${_gRPC_UPB_INCLUDE_DIR}
+ ${_gRPC_XXHASH_INCLUDE_DIR}
+ ${_gRPC_ZLIB_INCLUDE_DIR}
+ third_party/googletest/googletest/include
+ third_party/googletest/googletest
+ third_party/googletest/googlemock/include
+ third_party/googletest/googlemock
+ ${_gRPC_PROTO_GENS_DIR}
+)
+
+target_link_libraries(binder_smoke_test
+ ${_gRPC_PROTOBUF_LIBRARIES}
+ ${_gRPC_ALLTARGETS_LIBRARIES}
+ grpc_test_util
+)
+
+
+endif()
+if(gRPC_BUILD_TESTS)
+
+add_executable(bitset_test
+ test/core/gprpp/bitset_test.cc
+ third_party/googletest/googletest/src/gtest-all.cc
+ third_party/googletest/googlemock/src/gmock-all.cc
+)
+
+target_include_directories(bitset_test
+ PRIVATE
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/include
+ ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
+ ${_gRPC_RE2_INCLUDE_DIR}
+ ${_gRPC_SSL_INCLUDE_DIR}
+ ${_gRPC_UPB_GENERATED_DIR}
+ ${_gRPC_UPB_GRPC_GENERATED_DIR}
+ ${_gRPC_UPB_INCLUDE_DIR}
+ ${_gRPC_XXHASH_INCLUDE_DIR}
+ ${_gRPC_ZLIB_INCLUDE_DIR}
+ third_party/googletest/googletest/include
+ third_party/googletest/googletest
+ third_party/googletest/googlemock/include
+ third_party/googletest/googlemock
+ ${_gRPC_PROTO_GENS_DIR}
+)
+
+target_link_libraries(bitset_test
+ ${_gRPC_PROTOBUF_LIBRARIES}
+ ${_gRPC_ALLTARGETS_LIBRARIES}
+)
+
+
+endif()
+if(gRPC_BUILD_TESTS)
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX)
add_executable(bm_alarm
@@ -12248,6 +12340,41 @@ target_link_libraries(log_test
endif()
if(gRPC_BUILD_TESTS)
+add_executable(match_test
+ test/core/gprpp/match_test.cc
+ third_party/googletest/googletest/src/gtest-all.cc
+ third_party/googletest/googlemock/src/gmock-all.cc
+)
+
+target_include_directories(match_test
+ PRIVATE
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/include
+ ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
+ ${_gRPC_RE2_INCLUDE_DIR}
+ ${_gRPC_SSL_INCLUDE_DIR}
+ ${_gRPC_UPB_GENERATED_DIR}
+ ${_gRPC_UPB_GRPC_GENERATED_DIR}
+ ${_gRPC_UPB_INCLUDE_DIR}
+ ${_gRPC_XXHASH_INCLUDE_DIR}
+ ${_gRPC_ZLIB_INCLUDE_DIR}
+ third_party/googletest/googletest/include
+ third_party/googletest/googletest
+ third_party/googletest/googlemock/include
+ third_party/googletest/googlemock
+ ${_gRPC_PROTO_GENS_DIR}
+)
+
+target_link_libraries(match_test
+ ${_gRPC_PROTOBUF_LIBRARIES}
+ ${_gRPC_ALLTARGETS_LIBRARIES}
+ absl::variant
+)
+
+
+endif()
+if(gRPC_BUILD_TESTS)
+
add_executable(matchers_test
test/core/security/matchers_test.cc
third_party/googletest/googletest/src/gtest-all.cc
@@ -12586,6 +12713,40 @@ target_link_libraries(out_of_bounds_bad_client_test
endif()
if(gRPC_BUILD_TESTS)
+add_executable(overload_test
+ test/core/gprpp/overload_test.cc
+ third_party/googletest/googletest/src/gtest-all.cc
+ third_party/googletest/googlemock/src/gmock-all.cc
+)
+
+target_include_directories(overload_test
+ PRIVATE
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/include
+ ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
+ ${_gRPC_RE2_INCLUDE_DIR}
+ ${_gRPC_SSL_INCLUDE_DIR}
+ ${_gRPC_UPB_GENERATED_DIR}
+ ${_gRPC_UPB_GRPC_GENERATED_DIR}
+ ${_gRPC_UPB_INCLUDE_DIR}
+ ${_gRPC_XXHASH_INCLUDE_DIR}
+ ${_gRPC_ZLIB_INCLUDE_DIR}
+ third_party/googletest/googletest/include
+ third_party/googletest/googletest
+ third_party/googletest/googlemock/include
+ third_party/googletest/googlemock
+ ${_gRPC_PROTO_GENS_DIR}
+)
+
+target_link_libraries(overload_test
+ ${_gRPC_PROTOBUF_LIBRARIES}
+ ${_gRPC_ALLTARGETS_LIBRARIES}
+)
+
+
+endif()
+if(gRPC_BUILD_TESTS)
+
add_executable(pid_controller_test
test/core/transport/pid_controller_test.cc
third_party/googletest/googletest/src/gtest-all.cc
@@ -14209,6 +14370,42 @@ target_link_libraries(string_ref_test
endif()
if(gRPC_BUILD_TESTS)
+add_executable(table_test
+ test/core/gprpp/table_test.cc
+ third_party/googletest/googletest/src/gtest-all.cc
+ third_party/googletest/googlemock/src/gmock-all.cc
+)
+
+target_include_directories(table_test
+ PRIVATE
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/include
+ ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
+ ${_gRPC_RE2_INCLUDE_DIR}
+ ${_gRPC_SSL_INCLUDE_DIR}
+ ${_gRPC_UPB_GENERATED_DIR}
+ ${_gRPC_UPB_GRPC_GENERATED_DIR}
+ ${_gRPC_UPB_INCLUDE_DIR}
+ ${_gRPC_XXHASH_INCLUDE_DIR}
+ ${_gRPC_ZLIB_INCLUDE_DIR}
+ third_party/googletest/googletest/include
+ third_party/googletest/googletest
+ third_party/googletest/googlemock/include
+ third_party/googletest/googlemock
+ ${_gRPC_PROTO_GENS_DIR}
+)
+
+target_link_libraries(table_test
+ ${_gRPC_PROTOBUF_LIBRARIES}
+ ${_gRPC_ALLTARGETS_LIBRARIES}
+ absl::optional
+ absl::utility
+)
+
+
+endif()
+if(gRPC_BUILD_TESTS)
+
add_executable(test_cpp_client_credentials_test
test/cpp/client/credentials_test.cc
third_party/googletest/googletest/src/gtest-all.cc
@@ -15857,7 +16054,7 @@ generate_pkgconfig(
"gpr"
"gRPC platform support library"
"${gRPC_CORE_VERSION}"
- "absl_base absl_memory absl_optional absl_status absl_str_format absl_strings absl_synchronization absl_time"
+ "absl_base absl_cord absl_core_headers absl_memory absl_optional absl_status absl_str_format absl_strings absl_synchronization absl_time"
"-lgpr"
""
"gpr.pc")
@@ -15867,7 +16064,7 @@ generate_pkgconfig(
"gRPC"
"high performance general RPC framework"
"${gRPC_CORE_VERSION}"
- "gpr openssl absl_base absl_bind_front absl_flat_hash_map absl_inlined_vector absl_memory absl_optional absl_status absl_statusor absl_str_format absl_strings absl_synchronization absl_time"
+ "gpr openssl absl_base absl_bind_front absl_cord absl_core_headers absl_flat_hash_map absl_inlined_vector absl_memory absl_optional absl_status absl_statusor absl_str_format absl_strings absl_synchronization absl_time"
"-lgrpc -laddress_sorting -lre2 -lupb -lcares -lz"
""
"grpc.pc")
@@ -15877,7 +16074,7 @@ generate_pkgconfig(
"gRPC unsecure"
"high performance general RPC framework without SSL"
"${gRPC_CORE_VERSION}"
- "gpr absl_base absl_bind_front absl_flat_hash_map absl_inlined_vector absl_memory absl_optional absl_status absl_statusor absl_str_format absl_strings absl_synchronization absl_time"
+ "gpr absl_base absl_bind_front absl_cord absl_core_headers absl_flat_hash_map absl_inlined_vector absl_memory absl_optional absl_status absl_statusor absl_str_format absl_strings absl_synchronization absl_time"
"-lgrpc_unsecure"
""
"grpc_unsecure.pc")
@@ -15887,7 +16084,7 @@ generate_pkgconfig(
"gRPC++"
"C++ wrapper for gRPC"
"${gRPC_CPP_VERSION}"
- "grpc absl_base absl_bind_front absl_flat_hash_map absl_inlined_vector absl_memory absl_optional absl_status absl_statusor absl_str_format absl_strings absl_synchronization absl_time"
+ "grpc absl_base absl_bind_front absl_cord absl_core_headers absl_flat_hash_map absl_inlined_vector absl_memory absl_optional absl_status absl_statusor absl_str_format absl_strings absl_synchronization absl_time"
"-lgrpc++"
""
"grpc++.pc")
@@ -15897,7 +16094,7 @@ generate_pkgconfig(
"gRPC++ unsecure"
"C++ wrapper for gRPC without SSL"
"${gRPC_CPP_VERSION}"
- "grpc_unsecure absl_base absl_bind_front absl_flat_hash_map absl_inlined_vector absl_memory absl_optional absl_status absl_statusor absl_str_format absl_strings absl_synchronization absl_time"
+ "grpc_unsecure absl_base absl_bind_front absl_cord absl_core_headers absl_flat_hash_map absl_inlined_vector absl_memory absl_optional absl_status absl_statusor absl_str_format absl_strings absl_synchronization absl_time"
"-lgrpc++_unsecure"
""
"grpc++_unsecure.pc")
diff --git a/CONCEPTS.md b/CONCEPTS.md
index 034d58e427..f78be0ce64 100644
--- a/CONCEPTS.md
+++ b/CONCEPTS.md
@@ -14,7 +14,7 @@ of methods). From this description, gRPC will generate client and server side in
in any of the supported languages. The server implements
the service interface, which can be remotely invoked by the client interface.
-By default, gRPC uses [Protocol Buffers](https://github.com/google/protobuf) as the
+By default, gRPC uses [Protocol Buffers](https://github.com/protocolbuffers/protobuf) as the
Interface Definition Language (IDL) for describing both the service interface
and the structure of the payload messages. It is possible to use other
alternatives if desired.
diff --git a/METADATA b/METADATA
index ea1e2d659e..83efc04866 100644
--- a/METADATA
+++ b/METADATA
@@ -12,12 +12,12 @@ third_party {
value: "https://github.com/grpc/grpc"
}
# grpc_version_defaults in Android.bp must be updated when importing a new version.
- version: "1.39.1"
+ version: "1.40.0"
# As of this upgrade, the most recent upstream version was 1.59.1.
- last_upgrade_date { year: 2023 month: 10 day: 12 }
+ last_upgrade_date { year: 2023 month: 10 day: 14 }
license_note: "would be NOTICE save for MPL 2.0 in: etc/roots.pem and src/android/test/interop/app/src/main/assets/roots.pem"
license_type: RECIPROCAL
security {
- tag: "NVD-CPE2.3:cpe:2.3:a:grpc:grpc:1.39.1"
+ tag: "NVD-CPE2.3:cpe:2.3:a:grpc:grpc:1.40.0"
}
}
diff --git a/Makefile b/Makefile
index 59bbf7355b..c7aa7c7eb8 100644
--- a/Makefile
+++ b/Makefile
@@ -455,8 +455,8 @@ Q = @
endif
CORE_VERSION = 18.0.0
-CPP_VERSION = 1.39.1
-CSHARP_VERSION = 2.39.1
+CPP_VERSION = 1.40.0
+CSHARP_VERSION = 2.40.0
CPPFLAGS_NO_ARCH += $(addprefix -I, $(INCLUDES)) $(addprefix -D, $(DEFINES))
CPPFLAGS += $(CPPFLAGS_NO_ARCH) $(ARCH_FLAGS)
@@ -1136,6 +1136,7 @@ LIBGRPC_SRC = \
src/core/ext/transport/chttp2/transport/bin_decoder.cc \
src/core/ext/transport/chttp2/transport/bin_encoder.cc \
src/core/ext/transport/chttp2/transport/chttp2_plugin.cc \
+ src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc \
src/core/ext/transport/chttp2/transport/chttp2_transport.cc \
src/core/ext/transport/chttp2/transport/context_list.cc \
src/core/ext/transport/chttp2/transport/flow_control.cc \
@@ -1178,14 +1179,17 @@ LIBGRPC_SRC = \
src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c \
+ src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c \
+ src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c \
src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c \
src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c \
src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c \
src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c \
src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c \
src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c \
+ src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c \
src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c \
src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c \
src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c \
@@ -1212,6 +1216,7 @@ LIBGRPC_SRC = \
src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c \
src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c \
src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c \
+ src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c \
src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c \
src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c \
src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c \
@@ -1265,14 +1270,17 @@ LIBGRPC_SRC = \
src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c \
+ src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c \
+ src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c \
+ src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c \
@@ -1298,6 +1306,7 @@ LIBGRPC_SRC = \
src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c \
+ src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c \
@@ -1371,7 +1380,6 @@ LIBGRPC_SRC = \
src/core/lib/debug/trace.cc \
src/core/lib/event_engine/endpoint_config.cc \
src/core/lib/event_engine/event_engine.cc \
- src/core/lib/event_engine/slice_allocator.cc \
src/core/lib/event_engine/sockaddr.cc \
src/core/lib/http/format_request.cc \
src/core/lib/http/httpcli.cc \
@@ -1807,6 +1815,7 @@ LIBGRPC_UNSECURE_SRC = \
src/core/ext/transport/chttp2/transport/bin_decoder.cc \
src/core/ext/transport/chttp2/transport/bin_encoder.cc \
src/core/ext/transport/chttp2/transport/chttp2_plugin.cc \
+ src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc \
src/core/ext/transport/chttp2/transport/chttp2_transport.cc \
src/core/ext/transport/chttp2/transport/context_list.cc \
src/core/ext/transport/chttp2/transport/flow_control.cc \
@@ -1859,7 +1868,6 @@ LIBGRPC_UNSECURE_SRC = \
src/core/lib/debug/trace.cc \
src/core/lib/event_engine/endpoint_config.cc \
src/core/lib/event_engine/event_engine.cc \
- src/core/lib/event_engine/slice_allocator.cc \
src/core/lib/event_engine/sockaddr.cc \
src/core/lib/http/format_request.cc \
src/core/lib/http/httpcli.cc \
@@ -2727,14 +2735,17 @@ src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c: $(OPENSSL_DE
src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c: $(OPENSSL_DEP)
+src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c: $(OPENSSL_DEP)
+src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c: $(OPENSSL_DEP)
+src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c: $(OPENSSL_DEP)
@@ -2761,6 +2772,7 @@ src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c: $(OPENSSL_DEP)
+src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c: $(OPENSSL_DEP)
@@ -2810,14 +2822,17 @@ src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c: $(OP
src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c: $(OPENSSL_DEP)
@@ -2843,6 +2858,7 @@ src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c: $(OPEN
src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c: $(OPENSSL_DEP)
diff --git a/WORKSPACE b/WORKSPACE
index 5d772805c8..9f7b7e5e51 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -69,6 +69,27 @@ rbe_autoconfig(
load("@bazel_toolchains//rules:environments.bzl", "clang_env")
load("@bazel_skylib//lib:dicts.bzl", "dicts")
+load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
+
+http_archive(
+ name = "build_bazel_rules_android",
+ sha256 = "cd06d15dd8bb59926e4d65f9003bfc20f9da4b2519985c27e190cddc8b7a7806",
+ strip_prefix = "rules_android-0.1.1",
+ urls = ["https://github.com/bazelbuild/rules_android/archive/v0.1.1.zip"],
+)
+
+android_sdk_repository(
+ name = "androidsdk",
+ # version 31.0.0 won't work https://stackoverflow.com/a/68036845
+ build_tools_version = "30.0.3",
+)
+
+android_ndk_repository(
+ name = "androidndk",
+ # Note that Bazel does not support NDK 22 yet, and Bazel 3.7.1 only
+ # supports up to API level 29 for NDK 21
+ # https://github.com/bazelbuild/bazel/issues/13421
+)
# Create msan toolchain configuration for remote execution.
rbe_autoconfig(
diff --git a/_metadata.py b/_metadata.py
index 8338650575..7bd969b083 100644
--- a/_metadata.py
+++ b/_metadata.py
@@ -14,4 +14,4 @@
# AUTO-GENERATED FROM `$REPO_ROOT/templates/_metadata.py.template`!!!
-__version__ = """1.39.1"""
+__version__ = """1.40.0"""
diff --git a/bazel/OWNERS b/bazel/OWNERS
index b6e63d6399..81c44e5d7e 100644
--- a/bazel/OWNERS
+++ b/bazel/OWNERS
@@ -3,4 +3,5 @@ set noparent
@jtattermusch
@veblush
@gnossen
+@ctiller
diff --git a/bazel/copts.bzl b/bazel/copts.bzl
index 91f0bc8224..64c16cdd8b 100644
--- a/bazel/copts.bzl
+++ b/bazel/copts.bzl
@@ -14,14 +14,16 @@
# This is a list of llvm flags to be used when being built with use_strict_warning=1
GRPC_LLVM_WARNING_FLAGS = [
- # Enable all & extra waninrgs
+ # Enable all & extra warnings
"-Wall",
"-Wextra",
+ # Avoid some known traps
+ "-Wimplicit-fallthrough",
# Consider warnings as errors
"-Werror",
# Ignore unknown warning flags
"-Wno-unknown-warning-option",
- # A list of flags coming from internal build system
+ # A list of enabled flags coming from internal build system
"-Wc++20-extensions",
"-Wctad-maybe-unsupported",
"-Wdeprecated-increment-bool",
@@ -41,6 +43,8 @@ GRPC_LLVM_WARNING_FLAGS = [
"-Wthread-safety-beta",
"-Wunused-comparison",
"-Wvla",
+ # A list of disabled flags coming from internal build system
+ "-Wno-string-concatenation",
# Exceptions but will be removed
"-Wno-deprecated-declarations",
"-Wno-unused-function",
diff --git a/bazel/grpc_build_system.bzl b/bazel/grpc_build_system.bzl
index a94f7508a0..a37a422385 100644
--- a/bazel/grpc_build_system.bzl
+++ b/bazel/grpc_build_system.bzl
@@ -70,18 +70,32 @@ def _update_visibility(visibility):
# Visibility rules prefixed with '@grpc_' are used to flag different visibility rule
# classes upstream.
+ PUBLIC = ["//visibility:public"]
+ PRIVATE = ["//:__subpackages__"]
VISIBILITY_TARGETS = {
- "alt_grpc_legacy": [],
- "alt_grpc++_legacy": [],
- "endpoint_tests": [],
- "grpc_opencensus_plugin": ["//visibility:public"],
- "grpc_resolver_fake": [],
- "public": ["//visibility:public"],
+ "alt_gpr_base_legacy": PRIVATE,
+ "alt_grpc++_base_legacy": PRIVATE,
+ "alt_grpc_base_legacy": PRIVATE,
+ "alt_grpc++_base_unsecure_legacy": PRIVATE,
+ "alts_frame_protector": PRIVATE,
+ "client_channel": PRIVATE,
+ "debug_location": PRIVATE,
+ "endpoint_tests": PRIVATE,
+ "grpclb": PRIVATE,
+ "grpc_opencensus_plugin": PUBLIC,
+ "grpc_resolver_fake": PRIVATE,
+ "grpc++_test": PRIVATE,
+ "public": PUBLIC,
+ "ref_counted_ptr": PRIVATE,
+ "trace": PRIVATE,
+ "tsi_interface": PRIVATE,
+ "tsi": PRIVATE,
+ "xds": PRIVATE,
}
final_visibility = []
for rule in visibility:
if rule.startswith("@grpc:"):
- for replacement in VISIBILITY_TARGETS[rule[6:]]:
+ for replacement in VISIBILITY_TARGETS[rule[len("@grpc:"):]]:
final_visibility.append(replacement)
else:
final_visibility.append(rule)
diff --git a/bazel/grpc_deps.bzl b/bazel/grpc_deps.bzl
index 105d8bdcec..f8029a5914 100644
--- a/bazel/grpc_deps.bzl
+++ b/bazel/grpc_deps.bzl
@@ -25,6 +25,11 @@ def grpc_deps():
)
native.bind(
+ name = "upb_reflection",
+ actual = "@upb//:reflection",
+ )
+
+ native.bind(
name = "upb_lib_descriptor",
actual = "@upb//:descriptor_upb_proto",
)
@@ -45,6 +50,11 @@ def grpc_deps():
)
native.bind(
+ name = "upb_generated_code_support__only_for_generated_code_do_not_use__i_give_permission_to_break_me",
+ actual = "@upb//:generated_code_support__only_for_generated_code_do_not_use__i_give_permission_to_break_me",
+ )
+
+ native.bind(
name = "absl",
actual = "@com_google_absl//absl",
)
@@ -65,6 +75,11 @@ def grpc_deps():
)
native.bind(
+ name = "libcrypto",
+ actual = "@boringssl//:crypto",
+ )
+
+ native.bind(
name = "madler_zlib",
actual = "@zlib//:zlib",
)
@@ -160,6 +175,11 @@ def grpc_deps():
)
native.bind(
+ name = "opencensus-tags-context_util",
+ actual = "@io_opencensus_cpp//opencensus/tags:context_util",
+ )
+
+ native.bind(
name = "libuv",
actual = "@libuv//:libuv",
)
@@ -195,8 +215,8 @@ def grpc_deps():
sha256 = "cf63d46ef743f4c30b0e36a562caf83cabed3f10e6ca49eb476913c4655394d5",
strip_prefix = "protobuf-436bd7880e458532901c58f4d9d1ea23fa7edd52",
urls = [
- "https://storage.googleapis.com/grpc-bazel-mirror/github.com/google/protobuf/archive/436bd7880e458532901c58f4d9d1ea23fa7edd52.tar.gz",
- "https://github.com/google/protobuf/archive/436bd7880e458532901c58f4d9d1ea23fa7edd52.tar.gz",
+ "https://storage.googleapis.com/grpc-bazel-mirror/github.com/protocolbuffers/protobuf/archive/436bd7880e458532901c58f4d9d1ea23fa7edd52.tar.gz",
+ "https://github.com/protocolbuffers/protobuf/archive/436bd7880e458532901c58f4d9d1ea23fa7edd52.tar.gz",
],
patches = ["@com_github_grpc_grpc//third_party:protobuf.patch"],
patch_args = ["-p1"],
@@ -329,11 +349,11 @@ def grpc_deps():
if "envoy_api" not in native.existing_rules():
http_archive(
name = "envoy_api",
- sha256 = "4423bef0ab15053dca0f723cbdaf4b48ab145e9d8158f02e33028c66fb1d20e0",
- strip_prefix = "data-plane-api-18b54850c9b7ba29a4ab67cbd7ed7eab7b0bbdb2",
+ sha256 = "68343216fe214b6fd420672e04da8dfe10ae87bb98528239dd16c848016a8a48",
+ strip_prefix = "data-plane-api-df3b1ab2773147f292c4f175f790c35448328161",
urls = [
- "https://storage.googleapis.com/grpc-bazel-mirror/github.com/envoyproxy/data-plane-api/archive/18b54850c9b7ba29a4ab67cbd7ed7eab7b0bbdb2.tar.gz",
- "https://github.com/envoyproxy/data-plane-api/archive/18b54850c9b7ba29a4ab67cbd7ed7eab7b0bbdb2.tar.gz",
+ "https://storage.googleapis.com/grpc-bazel-mirror/github.com/envoyproxy/data-plane-api/archive/df3b1ab2773147f292c4f175f790c35448328161.tar.gz",
+ "https://github.com/envoyproxy/data-plane-api/archive/df3b1ab2773147f292c4f175f790c35448328161.tar.gz",
],
)
@@ -383,11 +403,11 @@ def grpc_deps():
if "com_google_googleapis" not in native.existing_rules():
http_archive(
name = "com_google_googleapis",
- sha256 = "a45019af4d3290f02eaeb1ce10990166978c807cb33a9692141a076ba46d1405",
- strip_prefix = "googleapis-82944da21578a53b74e547774cf62ed31a05b841",
+ sha256 = "5bb6b0253ccf64b53d6c7249625a7e3f6c3bc6402abd52d3778bfa48258703a0",
+ strip_prefix = "googleapis-2f9af297c84c55c8b871ba4495e01ade42476c92",
urls = [
- "https://storage.googleapis.com/grpc-bazel-mirror/github.com/googleapis/googleapis/archive/82944da21578a53b74e547774cf62ed31a05b841.tar.gz",
- "https://github.com/googleapis/googleapis/archive/82944da21578a53b74e547774cf62ed31a05b841.tar.gz",
+ "https://storage.googleapis.com/grpc-bazel-mirror/github.com/googleapis/googleapis/archive/2f9af297c84c55c8b871ba4495e01ade42476c92.tar.gz",
+ "https://github.com/googleapis/googleapis/archive/2f9af297c84c55c8b871ba4495e01ade42476c92.tar.gz",
],
)
@@ -416,11 +436,11 @@ def grpc_deps():
if "com_envoyproxy_protoc_gen_validate" not in native.existing_rules():
http_archive(
name = "com_envoyproxy_protoc_gen_validate",
- sha256 = "e368733c9fb7f8489591ffaf269170d7658cc0cd1ee322b601512b769446d3c8",
- strip_prefix = "protoc-gen-validate-278964a8052f96a2f514add0298098f63fb7f47f",
+ sha256 = "dd4962e4a9e8388a4fbc5c33e64d73bdb222f103e4bad40ca5535f81c2c606c2",
+ strip_prefix = "protoc-gen-validate-59da36e59fef2267fc2b1849a05159e3ecdf24f3",
urls = [
- "https://storage.googleapis.com/grpc-bazel-mirror/github.com/envoyproxy/protoc-gen-validate/archive/278964a8052f96a2f514add0298098f63fb7f47f.tar.gz",
- "https://github.com/envoyproxy/protoc-gen-validate/archive/278964a8052f96a2f514add0298098f63fb7f47f.tar.gz",
+ "https://storage.googleapis.com/grpc-bazel-mirror/github.com/envoyproxy/protoc-gen-validate/archive/59da36e59fef2267fc2b1849a05159e3ecdf24f3.tar.gz",
+ "https://github.com/envoyproxy/protoc-gen-validate/archive/59da36e59fef2267fc2b1849a05159e3ecdf24f3.tar.gz",
],
)
diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml
index def2ee1501..32ee883cc8 100644
--- a/build_autogenerated.yaml
+++ b/build_autogenerated.yaml
@@ -85,18 +85,22 @@ libs:
- test/core/end2end/tests/resource_quota_server.cc
- test/core/end2end/tests/retry.cc
- test/core/end2end/tests/retry_cancel_during_delay.cc
+ - test/core/end2end/tests/retry_cancel_with_multiple_send_batches.cc
- test/core/end2end/tests/retry_cancellation.cc
- test/core/end2end/tests/retry_disabled.cc
- test/core/end2end/tests/retry_exceeds_buffer_size_in_delay.cc
- test/core/end2end/tests/retry_exceeds_buffer_size_in_initial_batch.cc
- test/core/end2end/tests/retry_exceeds_buffer_size_in_subsequent_batch.cc
- test/core/end2end/tests/retry_lb_drop.cc
+ - test/core/end2end/tests/retry_lb_fail.cc
- test/core/end2end/tests/retry_non_retriable_status.cc
- test/core/end2end/tests/retry_non_retriable_status_before_recv_trailing_metadata_started.cc
- test/core/end2end/tests/retry_per_attempt_recv_timeout.cc
+ - test/core/end2end/tests/retry_per_attempt_recv_timeout_on_last_attempt.cc
- test/core/end2end/tests/retry_recv_initial_metadata.cc
- test/core/end2end/tests/retry_recv_message.cc
- test/core/end2end/tests/retry_recv_trailing_metadata_error.cc
+ - test/core/end2end/tests/retry_send_initial_metadata_refs.cc
- test/core/end2end/tests/retry_send_op_fails.cc
- test/core/end2end/tests/retry_server_pushback_delay.cc
- test/core/end2end/tests/retry_server_pushback_disabled.cc
@@ -198,18 +202,22 @@ libs:
- test/core/end2end/tests/resource_quota_server.cc
- test/core/end2end/tests/retry.cc
- test/core/end2end/tests/retry_cancel_during_delay.cc
+ - test/core/end2end/tests/retry_cancel_with_multiple_send_batches.cc
- test/core/end2end/tests/retry_cancellation.cc
- test/core/end2end/tests/retry_disabled.cc
- test/core/end2end/tests/retry_exceeds_buffer_size_in_delay.cc
- test/core/end2end/tests/retry_exceeds_buffer_size_in_initial_batch.cc
- test/core/end2end/tests/retry_exceeds_buffer_size_in_subsequent_batch.cc
- test/core/end2end/tests/retry_lb_drop.cc
+ - test/core/end2end/tests/retry_lb_fail.cc
- test/core/end2end/tests/retry_non_retriable_status.cc
- test/core/end2end/tests/retry_non_retriable_status_before_recv_trailing_metadata_started.cc
- test/core/end2end/tests/retry_per_attempt_recv_timeout.cc
+ - test/core/end2end/tests/retry_per_attempt_recv_timeout_on_last_attempt.cc
- test/core/end2end/tests/retry_recv_initial_metadata.cc
- test/core/end2end/tests/retry_recv_message.cc
- test/core/end2end/tests/retry_recv_trailing_metadata_error.cc
+ - test/core/end2end/tests/retry_send_initial_metadata_refs.cc
- test/core/end2end/tests/retry_send_op_fails.cc
- test/core/end2end/tests/retry_server_pushback_delay.cc
- test/core/end2end/tests/retry_server_pushback_disabled.cc
@@ -295,7 +303,6 @@ libs:
- src/core/ext/upb-generated/google/protobuf/wrappers.upb.h
- src/core/ext/upb-generated/google/rpc/status.upb.h
- src/core/lib/gpr/alloc.h
- - src/core/lib/gpr/arena.h
- src/core/lib/gpr/env.h
- src/core/lib/gpr/murmur_hash.h
- src/core/lib/gpr/spinlock.h
@@ -388,8 +395,10 @@ libs:
- src/core/lib/profiling/stap_timers.cc
deps:
- absl/base:base
+ - absl/base:core_headers
- absl/memory:memory
- absl/status:status
+ - absl/strings:cord
- absl/strings:str_format
- absl/strings:strings
- absl/synchronization:synchronization
@@ -486,6 +495,7 @@ libs:
- src/core/ext/transport/chttp2/server/chttp2_server.h
- src/core/ext/transport/chttp2/transport/bin_decoder.h
- src/core/ext/transport/chttp2/transport/bin_encoder.h
+ - src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h
- src/core/ext/transport/chttp2/transport/chttp2_transport.h
- src/core/ext/transport/chttp2/transport/context_list.h
- src/core/ext/transport/chttp2/transport/flow_control.h
@@ -526,14 +536,17 @@ libs:
- src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h
- src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h
- src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h
+ - src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h
- src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h
- src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h
+ - src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h
- src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h
- src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h
- src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h
- src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h
- src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h
- src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h
+ - src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h
- src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h
- src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h
- src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h
@@ -560,6 +573,7 @@ libs:
- src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h
- src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h
- src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h
+ - src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h
- src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h
- src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h
- src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h
@@ -613,14 +627,17 @@ libs:
- src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h
+ - src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h
+ - src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h
+ - src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h
@@ -646,6 +663,7 @@ libs:
- src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h
+ - src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h
@@ -698,6 +716,7 @@ libs:
- src/core/lib/address_utils/sockaddr_utils.h
- src/core/lib/avl/avl.h
- src/core/lib/backoff/backoff.h
+ - src/core/lib/channel/call_tracer.h
- src/core/lib/channel/channel_args.h
- src/core/lib/channel/channel_stack.h
- src/core/lib/channel/channel_stack_builder.h
@@ -1012,6 +1031,7 @@ libs:
- src/core/ext/transport/chttp2/transport/bin_decoder.cc
- src/core/ext/transport/chttp2/transport/bin_encoder.cc
- src/core/ext/transport/chttp2/transport/chttp2_plugin.cc
+ - src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc
- src/core/ext/transport/chttp2/transport/chttp2_transport.cc
- src/core/ext/transport/chttp2/transport/context_list.cc
- src/core/ext/transport/chttp2/transport/flow_control.cc
@@ -1054,14 +1074,17 @@ libs:
- src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c
- src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c
- src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c
+ - src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c
- src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c
- src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c
+ - src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c
- src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c
- src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c
- src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c
- src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c
- src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c
- src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c
+ - src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c
- src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c
- src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c
- src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c
@@ -1088,6 +1111,7 @@ libs:
- src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c
- src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c
- src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c
+ - src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c
- src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c
- src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c
- src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c
@@ -1141,14 +1165,17 @@ libs:
- src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c
+ - src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c
+ - src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c
+ - src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c
@@ -1174,6 +1201,7 @@ libs:
- src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c
+ - src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c
@@ -1247,7 +1275,6 @@ libs:
- src/core/lib/debug/trace.cc
- src/core/lib/event_engine/endpoint_config.cc
- src/core/lib/event_engine/event_engine.cc
- - src/core/lib/event_engine/slice_allocator.cc
- src/core/lib/event_engine/sockaddr.cc
- src/core/lib/http/format_request.cc
- src/core/lib/http/httpcli.cc
@@ -1695,6 +1722,7 @@ libs:
- src/core/ext/transport/chttp2/server/chttp2_server.h
- src/core/ext/transport/chttp2/transport/bin_decoder.h
- src/core/ext/transport/chttp2/transport/bin_encoder.h
+ - src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h
- src/core/ext/transport/chttp2/transport/chttp2_transport.h
- src/core/ext/transport/chttp2/transport/context_list.h
- src/core/ext/transport/chttp2/transport/flow_control.h
@@ -1723,6 +1751,7 @@ libs:
- src/core/lib/address_utils/sockaddr_utils.h
- src/core/lib/avl/avl.h
- src/core/lib/backoff/backoff.h
+ - src/core/lib/channel/call_tracer.h
- src/core/lib/channel/channel_args.h
- src/core/lib/channel/channel_stack.h
- src/core/lib/channel/channel_stack_builder.h
@@ -1955,6 +1984,7 @@ libs:
- src/core/ext/transport/chttp2/transport/bin_decoder.cc
- src/core/ext/transport/chttp2/transport/bin_encoder.cc
- src/core/ext/transport/chttp2/transport/chttp2_plugin.cc
+ - src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc
- src/core/ext/transport/chttp2/transport/chttp2_transport.cc
- src/core/ext/transport/chttp2/transport/context_list.cc
- src/core/ext/transport/chttp2/transport/flow_control.cc
@@ -2007,7 +2037,6 @@ libs:
- src/core/lib/debug/trace.cc
- src/core/lib/event_engine/endpoint_config.cc
- src/core/lib/event_engine/event_engine.cc
- - src/core/lib/event_engine/slice_allocator.cc
- src/core/lib/event_engine/sockaddr.cc
- src/core/lib/http/format_request.cc
- src/core/lib/http/httpcli.cc
@@ -4380,6 +4409,26 @@ targets:
- posix
- mac
uses_polling: false
+- name: binder_smoke_test
+ gtest: true
+ build: test
+ language: c++
+ headers: []
+ src:
+ - test/core/transport/binder/binder_smoke_test.cc
+ deps:
+ - grpc_test_util
+ uses_polling: false
+- name: bitset_test
+ gtest: true
+ build: test
+ language: c++
+ headers:
+ - src/core/lib/gprpp/bitset.h
+ src:
+ - test/core/gprpp/bitset_test.cc
+ deps: []
+ uses_polling: false
- name: bm_alarm
build: test
language: c++
@@ -5756,6 +5805,18 @@ targets:
deps:
- grpc_test_util
uses_polling: false
+- name: match_test
+ gtest: true
+ build: test
+ language: c++
+ headers:
+ - src/core/lib/gprpp/match.h
+ - src/core/lib/gprpp/overload.h
+ src:
+ - test/core/gprpp/match_test.cc
+ deps:
+ - absl/types:variant
+ uses_polling: false
- name: matchers_test
gtest: true
build: test
@@ -5879,6 +5940,16 @@ targets:
- test/core/end2end/cq_verifier.cc
deps:
- grpc_test_util
+- name: overload_test
+ gtest: true
+ build: test
+ language: c++
+ headers:
+ - src/core/lib/gprpp/overload.h
+ src:
+ - test/core/gprpp/overload_test.cc
+ deps: []
+ uses_polling: false
- name: percent_decode_fuzzer
build: fuzzer
language: c++
@@ -6464,6 +6535,19 @@ targets:
- grpc++
- grpc_test_util
uses_polling: false
+- name: table_test
+ gtest: true
+ build: test
+ language: c++
+ headers:
+ - src/core/lib/gprpp/bitset.h
+ - src/core/lib/gprpp/table.h
+ src:
+ - test/core/gprpp/table_test.cc
+ deps:
+ - absl/types:optional
+ - absl/utility:utility
+ uses_polling: false
- name: test_cpp_client_credentials_test
gtest: true
build: test
diff --git a/build_handwritten.yaml b/build_handwritten.yaml
index ac117685fe..b4be6f9c08 100644
--- a/build_handwritten.yaml
+++ b/build_handwritten.yaml
@@ -14,9 +14,9 @@ settings:
'#10': See the expand_version.py for all the quirks here
core_version: 18.0.0
csharp_major_version: 2
- g_stands_for: guadalupe_river_park_conservancy
+ g_stands_for: guileless
protobuf_version: 3.15.8
- version: 1.39.1
+ version: 1.40.0
targets:
- name: check_epollexclusive
build: tool
diff --git a/config.m4 b/config.m4
index a53c5c43b9..939efca9e2 100644
--- a/config.m4
+++ b/config.m4
@@ -130,6 +130,7 @@ if test "$PHP_GRPC" != "no"; then
src/core/ext/transport/chttp2/transport/bin_decoder.cc \
src/core/ext/transport/chttp2/transport/bin_encoder.cc \
src/core/ext/transport/chttp2/transport/chttp2_plugin.cc \
+ src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc \
src/core/ext/transport/chttp2/transport/chttp2_transport.cc \
src/core/ext/transport/chttp2/transport/context_list.cc \
src/core/ext/transport/chttp2/transport/flow_control.cc \
@@ -172,14 +173,17 @@ if test "$PHP_GRPC" != "no"; then
src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c \
+ src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c \
+ src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c \
src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c \
src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c \
src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c \
src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c \
src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c \
src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c \
+ src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c \
src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c \
src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c \
src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c \
@@ -206,6 +210,7 @@ if test "$PHP_GRPC" != "no"; then
src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c \
src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c \
src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c \
+ src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c \
src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c \
src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c \
src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c \
@@ -271,14 +276,17 @@ if test "$PHP_GRPC" != "no"; then
src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c \
+ src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c \
+ src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c \
+ src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c \
@@ -304,6 +312,7 @@ if test "$PHP_GRPC" != "no"; then
src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c \
+ src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c \
@@ -378,7 +387,6 @@ if test "$PHP_GRPC" != "no"; then
src/core/lib/debug/trace.cc \
src/core/lib/event_engine/endpoint_config.cc \
src/core/lib/event_engine/event_engine.cc \
- src/core/lib/event_engine/slice_allocator.cc \
src/core/lib/event_engine/sockaddr.cc \
src/core/lib/gpr/alloc.cc \
src/core/lib/gpr/atm.cc \
@@ -1053,7 +1061,7 @@ if test "$PHP_GRPC" != "no"; then
-D_HAS_EXCEPTIONS=0 -DNOMINMAX -DGRPC_ARES=0 \
-DGRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK=1 \
-DGRPC_XDS_USER_AGENT_NAME_SUFFIX='"\"PHP\""' \
- -DGRPC_XDS_USER_AGENT_VERSION_SUFFIX='"\"1.39.1\""')
+ -DGRPC_XDS_USER_AGENT_VERSION_SUFFIX='"\"1.40.0\""')
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/census)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel)
@@ -1118,6 +1126,7 @@ if test "$PHP_GRPC" != "no"; then
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/service/load_stats/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/service/route/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/service/status/v3)
+ PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/type/http/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/type/matcher/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/type/metadata/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/type/tracing/v3)
@@ -1159,6 +1168,7 @@ if test "$PHP_GRPC" != "no"; then
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/service/route/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/service/status/v3)
+ PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/type/http/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/type/matcher/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/type/metadata/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/type/tracing/v3)
diff --git a/config.w32 b/config.w32
index 699e917a67..1d6e69d0e1 100644
--- a/config.w32
+++ b/config.w32
@@ -96,6 +96,7 @@ if (PHP_GRPC != "no") {
"src\\core\\ext\\transport\\chttp2\\transport\\bin_decoder.cc " +
"src\\core\\ext\\transport\\chttp2\\transport\\bin_encoder.cc " +
"src\\core\\ext\\transport\\chttp2\\transport\\chttp2_plugin.cc " +
+ "src\\core\\ext\\transport\\chttp2\\transport\\chttp2_slice_allocator.cc " +
"src\\core\\ext\\transport\\chttp2\\transport\\chttp2_transport.cc " +
"src\\core\\ext\\transport\\chttp2\\transport\\context_list.cc " +
"src\\core\\ext\\transport\\chttp2\\transport\\flow_control.cc " +
@@ -138,14 +139,17 @@ if (PHP_GRPC != "no") {
"src\\core\\ext\\upb-generated\\envoy\\config\\core\\v3\\http_uri.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\config\\core\\v3\\protocol.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\config\\core\\v3\\proxy_protocol.upb.c " +
+ "src\\core\\ext\\upb-generated\\envoy\\config\\core\\v3\\resolver.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\config\\core\\v3\\socket_option.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\config\\core\\v3\\substitution_format_string.upb.c " +
+ "src\\core\\ext\\upb-generated\\envoy\\config\\core\\v3\\udp_socket_config.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\config\\endpoint\\v3\\endpoint.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\config\\endpoint\\v3\\endpoint_components.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\config\\endpoint\\v3\\load_report.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\config\\listener\\v3\\api_listener.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\config\\listener\\v3\\listener.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\config\\listener\\v3\\listener_components.upb.c " +
+ "src\\core\\ext\\upb-generated\\envoy\\config\\listener\\v3\\quic_config.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\config\\listener\\v3\\udp_listener_config.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\config\\metrics\\v3\\stats.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\config\\overload\\v3\\overload.upb.c " +
@@ -172,6 +176,7 @@ if (PHP_GRPC != "no") {
"src\\core\\ext\\upb-generated\\envoy\\service\\route\\v3\\rds.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\service\\route\\v3\\srds.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\service\\status\\v3\\csds.upb.c " +
+ "src\\core\\ext\\upb-generated\\envoy\\type\\http\\v3\\path_transformation.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\type\\matcher\\v3\\metadata.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\type\\matcher\\v3\\node.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\type\\matcher\\v3\\number.upb.c " +
@@ -237,14 +242,17 @@ if (PHP_GRPC != "no") {
"src\\core\\ext\\upbdefs-generated\\envoy\\config\\core\\v3\\http_uri.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\config\\core\\v3\\protocol.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\config\\core\\v3\\proxy_protocol.upbdefs.c " +
+ "src\\core\\ext\\upbdefs-generated\\envoy\\config\\core\\v3\\resolver.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\config\\core\\v3\\socket_option.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\config\\core\\v3\\substitution_format_string.upbdefs.c " +
+ "src\\core\\ext\\upbdefs-generated\\envoy\\config\\core\\v3\\udp_socket_config.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\config\\endpoint\\v3\\endpoint.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\config\\endpoint\\v3\\endpoint_components.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\config\\endpoint\\v3\\load_report.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\config\\listener\\v3\\api_listener.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\config\\listener\\v3\\listener.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\config\\listener\\v3\\listener_components.upbdefs.c " +
+ "src\\core\\ext\\upbdefs-generated\\envoy\\config\\listener\\v3\\quic_config.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\config\\listener\\v3\\udp_listener_config.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\config\\metrics\\v3\\stats.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\config\\overload\\v3\\overload.upbdefs.c " +
@@ -270,6 +278,7 @@ if (PHP_GRPC != "no") {
"src\\core\\ext\\upbdefs-generated\\envoy\\service\\route\\v3\\rds.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\service\\route\\v3\\srds.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\service\\status\\v3\\csds.upbdefs.c " +
+ "src\\core\\ext\\upbdefs-generated\\envoy\\type\\http\\v3\\path_transformation.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\type\\matcher\\v3\\metadata.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\type\\matcher\\v3\\node.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\type\\matcher\\v3\\number.upbdefs.c " +
@@ -344,7 +353,6 @@ if (PHP_GRPC != "no") {
"src\\core\\lib\\debug\\trace.cc " +
"src\\core\\lib\\event_engine\\endpoint_config.cc " +
"src\\core\\lib\\event_engine\\event_engine.cc " +
- "src\\core\\lib\\event_engine\\slice_allocator.cc " +
"src\\core\\lib\\event_engine\\sockaddr.cc " +
"src\\core\\lib\\gpr\\alloc.cc " +
"src\\core\\lib\\gpr\\atm.cc " +
@@ -1156,6 +1164,8 @@ if (PHP_GRPC != "no") {
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\service\\status");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\service\\status\\v3");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\type");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\type\\http");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\type\\http\\v3");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\type\\matcher");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\type\\matcher\\v3");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\type\\metadata");
@@ -1249,6 +1259,8 @@ if (PHP_GRPC != "no") {
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\service\\status");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\service\\status\\v3");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\type");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\type\\http");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\type\\http\\v3");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\type\\matcher");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\type\\matcher\\v3");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\type\\metadata");
diff --git a/doc/g_stands_for.md b/doc/g_stands_for.md
index 8ff02d0d0c..5c891c63db 100644
--- a/doc/g_stands_for.md
+++ b/doc/g_stands_for.md
@@ -39,3 +39,5 @@
- 1.37 'g' stands for ['gilded'](https://github.com/grpc/grpc/tree/v1.37.x)
- 1.38 'g' stands for ['guadalupe_river_park_conservancy'](https://github.com/grpc/grpc/tree/v1.38.x)
- 1.39 'g' stands for ['goofy'](https://github.com/grpc/grpc/tree/v1.39.x)
+- 1.40 'g' stands for ['guileless'](https://github.com/grpc/grpc/tree/master)
+- 1.41 'g' stands for goat
diff --git a/examples/android/binder/java/io/grpc/binder/cpp/example/AndroidManifest.xml b/examples/android/binder/java/io/grpc/binder/cpp/example/AndroidManifest.xml
new file mode 100644
index 0000000000..ffec202363
--- /dev/null
+++ b/examples/android/binder/java/io/grpc/binder/cpp/example/AndroidManifest.xml
@@ -0,0 +1,21 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="io.grpc.binder.cpp.example"
+ android:versionCode="1"
+ android:versionName="1.0" >
+
+ <uses-sdk
+ android:minSdkVersion="29"
+ android:targetSdkVersion="30" />
+
+ <application
+ android:label="gRPC BinderTransport Cpp">
+ <activity
+ android:name=".MainActivity"
+ android:label="gRPC BinderTransport Cpp" >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+</manifest>
diff --git a/examples/android/binder/java/io/grpc/binder/cpp/example/BUILD b/examples/android/binder/java/io/grpc/binder/cpp/example/BUILD
new file mode 100644
index 0000000000..2b78927534
--- /dev/null
+++ b/examples/android/binder/java/io/grpc/binder/cpp/example/BUILD
@@ -0,0 +1,48 @@
+# Copyright 2021 gRPC authors.
+#
+# 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.
+
+load("@build_bazel_rules_android//android:rules.bzl", "android_binary", "android_library")
+
+cc_library(
+ name = "jni_lib",
+ srcs = ["native.cc"],
+ linkopts = [
+ "-ldl",
+ "-llog",
+ "-Wl,--no-undefined",
+ ],
+ deps = [],
+ alwayslink = True,
+)
+
+android_library(
+ name = "activity",
+ srcs = [
+ "ButtonPressHandler.java",
+ "MainActivity.java",
+ ],
+ manifest = "AndroidManifest.xml",
+ resource_files = glob(["res/**"]),
+ deps = [
+ ":jni_lib",
+ ],
+)
+
+android_binary(
+ name = "app",
+ manifest = "AndroidManifest.xml",
+ deps = [
+ ":activity",
+ ],
+)
diff --git a/examples/android/binder/java/io/grpc/binder/cpp/example/ButtonPressHandler.java b/examples/android/binder/java/io/grpc/binder/cpp/example/ButtonPressHandler.java
new file mode 100644
index 0000000000..44e1e08509
--- /dev/null
+++ b/examples/android/binder/java/io/grpc/binder/cpp/example/ButtonPressHandler.java
@@ -0,0 +1,15 @@
+package io.grpc.binder.cpp.example;
+
+import android.app.Application;
+
+public class ButtonPressHandler {
+ static {
+ System.loadLibrary("app");
+ }
+
+ public native String native_entry(Application application);
+
+ public String onPressed(Application application) {
+ return native_entry(application);
+ }
+}
diff --git a/examples/android/binder/java/io/grpc/binder/cpp/example/MainActivity.java b/examples/android/binder/java/io/grpc/binder/cpp/example/MainActivity.java
new file mode 100644
index 0000000000..0c87b2bbcf
--- /dev/null
+++ b/examples/android/binder/java/io/grpc/binder/cpp/example/MainActivity.java
@@ -0,0 +1,26 @@
+package io.grpc.binder.cpp.example;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.util.Log;
+import android.widget.Button;
+import android.widget.TextView;
+
+/** Main class for the example app. */
+public class MainActivity extends Activity {
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ Log.v("Example", "hello, world");
+
+ setContentView(R.layout.activity_main);
+
+ Button clickMeButton = findViewById(R.id.clickMeButton);
+ TextView exampleTextView = findViewById(R.id.exampleTextView);
+
+ ButtonPressHandler h = new ButtonPressHandler();
+
+ clickMeButton.setOnClickListener(
+ v -> exampleTextView.setText(h.onPressed(getApplication())));
+ }
+}
diff --git a/examples/android/binder/java/io/grpc/binder/cpp/example/README.md b/examples/android/binder/java/io/grpc/binder/cpp/example/README.md
new file mode 100644
index 0000000000..bbc1545ecf
--- /dev/null
+++ b/examples/android/binder/java/io/grpc/binder/cpp/example/README.md
@@ -0,0 +1,18 @@
+# gRPC-core BinderTransport example app
+
+WIP.
+
+## Build Instruction
+
+1. Install Android SDK and NDK. Currently we only support SDK version 30.0.3 and
+ NDK version 21.4.7075529 . Make sure you get these exact versions otherwise
+ Bazel might complain.
+
+2. Point environment variables to install locations of SDK and NDK
+ ```
+ export ANDROID_HOME=$HOME/Android/Sdk/
+ export ANDROID_NDK_HOME=$HOME/Android/Sdk/ndk/21.4.7075529
+ ```
+3. `bazel build //examples/android/binder/java/io/grpc/binder/cpp/example:app`
+4. `adb install
+ bazel-bin/examples/android/binder/java/io/grpc/binder/cpp/example/app.apk`
diff --git a/examples/android/binder/java/io/grpc/binder/cpp/example/native.cc b/examples/android/binder/java/io/grpc/binder/cpp/example/native.cc
new file mode 100644
index 0000000000..e9cdf984b2
--- /dev/null
+++ b/examples/android/binder/java/io/grpc/binder/cpp/example/native.cc
@@ -0,0 +1,30 @@
+// Copyright 2021 gRPC authors.
+//
+// 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.
+
+
+#include <android/log.h>
+#include <jni.h>
+
+extern "C" JNIEXPORT jstring JNICALL
+Java_io_grpc_binder_cpp_example_ButtonPressHandler_native_1entry(
+ JNIEnv* env, jobject /*this*/, jobject /*application*/) {
+ static bool first = true;
+ __android_log_print(ANDROID_LOG_INFO, "Demo", "Line number %d", __LINE__);
+ if (first) {
+ first = false;
+ return env->NewStringUTF("Clicked 1 time");
+ } else {
+ return env->NewStringUTF("Clicked more than 1 time");
+ }
+}
diff --git a/examples/android/binder/java/io/grpc/binder/cpp/example/res/layout/activity_main.xml b/examples/android/binder/java/io/grpc/binder/cpp/example/res/layout/activity_main.xml
new file mode 100644
index 0000000000..e866d8df89
--- /dev/null
+++ b/examples/android/binder/java/io/grpc/binder/cpp/example/res/layout/activity_main.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:padding="16dp"
+ android:orientation="vertical"
+ android:gravity="center_vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <TextView
+ android:id="@+id/exampleTextView"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:textSize="32dp"
+ android:text="@string/thinking_face"/>
+
+ <Button
+ android:id="@+id/clickMeButton"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:layout_marginTop="16dp"
+ android:text="@string/click_me_button"/>
+</LinearLayout>
diff --git a/examples/android/binder/java/io/grpc/binder/cpp/example/res/values/strings.xml b/examples/android/binder/java/io/grpc/binder/cpp/example/res/values/strings.xml
new file mode 100644
index 0000000000..7593624fa8
--- /dev/null
+++ b/examples/android/binder/java/io/grpc/binder/cpp/example/res/values/strings.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="click_me_button">Run example</string>
+ <string name="thinking_face">🤔</string>
+</resources>
diff --git a/examples/android/helloworld/README.md b/examples/android/helloworld/README.md
index ebb16d136b..79acc02643 100644
--- a/examples/android/helloworld/README.md
+++ b/examples/android/helloworld/README.md
@@ -2,7 +2,7 @@ gRPC on Android
==============
Note: Building the protobuf dependency for Android requires
-https://github.com/google/protobuf/pull/3878. This fix will be in the next
+https://github.com/protocolbuffers/protobuf/pull/3878. This fix will be in the next
protobuf release, but until then must be manually patched in to
`third_party/protobuf` to build gRPC for Android.
diff --git a/examples/cpp/compression/Makefile b/examples/cpp/compression/Makefile
index 47211886ff..4adbbb543e 100644
--- a/examples/cpp/compression/Makefile
+++ b/examples/cpp/compression/Makefile
@@ -83,7 +83,7 @@ ifneq ($(HAS_VALID_PROTOC),true)
@echo "Please install Google protocol buffers 3.0.0 and its compiler."
@echo "You can find it here:"
@echo
- @echo " https://github.com/google/protobuf/releases/tag/v3.0.0"
+ @echo " https://github.com/protocolbuffers/protobuf/releases/tag/v3.0.0"
@echo
@echo "Here is what I get when trying to evaluate your version of protoc:"
@echo
diff --git a/examples/cpp/helloworld/Makefile b/examples/cpp/helloworld/Makefile
index cfd03ca672..b5eb41c0d8 100644
--- a/examples/cpp/helloworld/Makefile
+++ b/examples/cpp/helloworld/Makefile
@@ -100,7 +100,7 @@ ifneq ($(HAS_VALID_PROTOC),true)
@echo "Please install Google protocol buffers 3.0.0 and its compiler."
@echo "You can find it here:"
@echo
- @echo " https://github.com/google/protobuf/releases/tag/v3.0.0"
+ @echo " https://github.com/protocolbuffers/protobuf/releases/tag/v3.0.0"
@echo
@echo "Here is what I get when trying to evaluate your version of protoc:"
@echo
diff --git a/examples/cpp/load_balancing/Makefile b/examples/cpp/load_balancing/Makefile
index 7c8d072770..71f780e260 100644
--- a/examples/cpp/load_balancing/Makefile
+++ b/examples/cpp/load_balancing/Makefile
@@ -83,7 +83,7 @@ ifneq ($(HAS_VALID_PROTOC),true)
@echo "Please install Google protocol buffers 3.0.0 and its compiler."
@echo "You can find it here:"
@echo
- @echo " https://github.com/google/protobuf/releases/tag/v3.0.0"
+ @echo " https://github.com/protocolbuffers/protobuf/releases/tag/v3.0.0"
@echo
@echo "Here is what I get when trying to evaluate your version of protoc:"
@echo
diff --git a/examples/cpp/metadata/Makefile b/examples/cpp/metadata/Makefile
index 46be8bfaa3..36fd554b90 100644
--- a/examples/cpp/metadata/Makefile
+++ b/examples/cpp/metadata/Makefile
@@ -69,7 +69,7 @@ ifneq ($(HAS_VALID_PROTOC),true)
@echo "Please install Google protocol buffers 3.0.0 and its compiler."
@echo "You can find it here:"
@echo
- @echo " https://github.com/google/protobuf/releases/tag/v3.0.0"
+ @echo " https://github.com/protocolbuffers/protobuf/releases/tag/v3.0.0"
@echo
@echo "Here is what I get when trying to evaluate your version of protoc:"
@echo
diff --git a/examples/cpp/route_guide/Makefile b/examples/cpp/route_guide/Makefile
index 3bf61cb76f..17d2820cc4 100644
--- a/examples/cpp/route_guide/Makefile
+++ b/examples/cpp/route_guide/Makefile
@@ -83,7 +83,7 @@ ifneq ($(HAS_VALID_PROTOC),true)
@echo "Please install Google protocol buffers 3.0.0 and its compiler."
@echo "You can find it here:"
@echo
- @echo " https://github.com/google/protobuf/releases/tag/v3.0.0"
+ @echo " https://github.com/protocolbuffers/protobuf/releases/tag/v3.0.0"
@echo
@echo "Here is what I get when trying to evaluate your version of protoc:"
@echo
diff --git a/examples/node/static_codegen/greeter_client.js b/examples/node/static_codegen/greeter_client.js
index a647140131..668a3f8e44 100644
--- a/examples/node/static_codegen/greeter_client.js
+++ b/examples/node/static_codegen/greeter_client.js
@@ -16,6 +16,7 @@
*
*/
+var parseArgs = require('minimist');
var messages = require('./helloworld_pb');
var services = require('./helloworld_grpc_pb');
diff --git a/examples/python/async_streaming/client.py b/examples/python/async_streaming/client.py
index 25db69359b..28b7f5742f 100644
--- a/examples/python/async_streaming/client.py
+++ b/examples/python/async_streaming/client.py
@@ -12,10 +12,10 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+from concurrent.futures import ThreadPoolExecutor
import logging
import threading
from typing import Iterator
-from concurrent.futures import ThreadPoolExecutor
import grpc
diff --git a/examples/python/async_streaming/server.py b/examples/python/async_streaming/server.py
index f835a45205..ae2a10dcd9 100644
--- a/examples/python/async_streaming/server.py
+++ b/examples/python/async_streaming/server.py
@@ -12,14 +12,14 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+from concurrent.futures import ThreadPoolExecutor
import logging
+import threading
import time
-from concurrent.futures import ThreadPoolExecutor
from typing import Iterable
-import threading
-import grpc
from google.protobuf.json_format import MessageToJson
+import grpc
import phone_pb2
import phone_pb2_grpc
diff --git a/examples/python/auth/async_customized_auth_client.py b/examples/python/auth/async_customized_auth_client.py
index 343a262963..d0c6f8fa9f 100644
--- a/examples/python/auth/async_customized_auth_client.py
+++ b/examples/python/auth/async_customized_auth_client.py
@@ -17,9 +17,8 @@ import argparse
import asyncio
import logging
-import grpc
-
import _credentials
+import grpc
helloworld_pb2, helloworld_pb2_grpc = grpc.protos_and_services(
"helloworld.proto")
diff --git a/examples/python/auth/async_customized_auth_server.py b/examples/python/auth/async_customized_auth_server.py
index 10724b4ae8..e1571a517b 100644
--- a/examples/python/auth/async_customized_auth_server.py
+++ b/examples/python/auth/async_customized_auth_server.py
@@ -18,9 +18,8 @@ import asyncio
import logging
from typing import Awaitable, Callable, Tuple
-import grpc
-
import _credentials
+import grpc
helloworld_pb2, helloworld_pb2_grpc = grpc.protos_and_services(
"helloworld.proto")
diff --git a/examples/python/auth/customized_auth_client.py b/examples/python/auth/customized_auth_client.py
index 59227a4cf0..c1310836b4 100644
--- a/examples/python/auth/customized_auth_client.py
+++ b/examples/python/auth/customized_auth_client.py
@@ -17,8 +17,8 @@ import argparse
import contextlib
import logging
-import grpc
import _credentials
+import grpc
helloworld_pb2, helloworld_pb2_grpc = grpc.protos_and_services(
"helloworld.proto")
diff --git a/examples/python/auth/customized_auth_server.py b/examples/python/auth/customized_auth_server.py
index 492c8423b3..dafcbb0be8 100644
--- a/examples/python/auth/customized_auth_server.py
+++ b/examples/python/auth/customized_auth_server.py
@@ -14,12 +14,12 @@
"""Server of the Python example of customizing authentication mechanism."""
import argparse
+from concurrent import futures
import contextlib
import logging
-from concurrent import futures
-import grpc
import _credentials
+import grpc
helloworld_pb2, helloworld_pb2_grpc = grpc.protos_and_services(
"helloworld.proto")
diff --git a/examples/python/auth/test/_auth_example_test.py b/examples/python/auth/test/_auth_example_test.py
index 25e83931ed..45f207de40 100644
--- a/examples/python/auth/test/_auth_example_test.py
+++ b/examples/python/auth/test/_auth_example_test.py
@@ -17,11 +17,12 @@ import asyncio
import unittest
import grpc
+
from examples.python.auth import _credentials
-from examples.python.auth import customized_auth_client
-from examples.python.auth import customized_auth_server
from examples.python.auth import async_customized_auth_client
from examples.python.auth import async_customized_auth_server
+from examples.python.auth import customized_auth_client
+from examples.python.auth import customized_auth_server
_SERVER_ADDR_TEMPLATE = 'localhost:%d'
diff --git a/examples/python/cancellation/search.py b/examples/python/cancellation/search.py
index 9d2331af1b..28ac3664fc 100644
--- a/examples/python/cancellation/search.py
+++ b/examples/python/cancellation/search.py
@@ -127,7 +127,7 @@ def search(target,
hashes_computed = 0
for secret in _all_bytestrings():
if stop_event.is_set():
- raise StopIteration() # pylint: disable=stop-iteration-return
+ return
candidate_hash = _get_hash(secret)
distance = _get_substring_hamming_distance(candidate_hash, target)
if interesting_hamming_distance is not None and distance <= interesting_hamming_distance:
@@ -142,7 +142,7 @@ def search(target,
secret=base64.b64encode(secret),
hashed_name=candidate_hash,
hamming_distance=distance)
- raise StopIteration() # pylint: disable=stop-iteration-return
+ return
hashes_computed += 1
if hashes_computed == maximum_hashes:
raise ResourceLimitExceededError()
diff --git a/examples/python/cancellation/server.py b/examples/python/cancellation/server.py
index 4116fd1df8..cbfd49605f 100644
--- a/examples/python/cancellation/server.py
+++ b/examples/python/cancellation/server.py
@@ -17,8 +17,8 @@ from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
-from concurrent import futures
import argparse
+from concurrent import futures
import logging
import threading
diff --git a/examples/python/compression/client.py b/examples/python/compression/client.py
index 3de9d9e730..e1822f708d 100644
--- a/examples/python/compression/client.py
+++ b/examples/python/compression/client.py
@@ -19,6 +19,7 @@ from __future__ import print_function
import argparse
import logging
+
import grpc
from examples.protos import helloworld_pb2
diff --git a/examples/python/compression/server.py b/examples/python/compression/server.py
index 935b044e1c..d0a77bbe1a 100644
--- a/examples/python/compression/server.py
+++ b/examples/python/compression/server.py
@@ -17,10 +17,11 @@ from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
-from concurrent import futures
import argparse
+from concurrent import futures
import logging
import threading
+
import grpc
from examples.protos import helloworld_pb2
diff --git a/examples/python/data_transmission/alts_client.py b/examples/python/data_transmission/alts_client.py
index eb328667cd..33d79e24e0 100644
--- a/examples/python/data_transmission/alts_client.py
+++ b/examples/python/data_transmission/alts_client.py
@@ -17,9 +17,11 @@ The example would only successfully run in GCP environment."""
import grpc
+from client import bidirectional_streaming_method
+from client import client_streaming_method
+from client import server_streaming_method
+from client import simple_method
import demo_pb2_grpc
-from client import (bidirectional_streaming_method, client_streaming_method,
- server_streaming_method, simple_method)
SERVER_ADDRESS = "localhost:23333"
diff --git a/examples/python/data_transmission/client.py b/examples/python/data_transmission/client.py
index cc4a68e343..bfea00fb8b 100644
--- a/examples/python/data_transmission/client.py
+++ b/examples/python/data_transmission/client.py
@@ -14,10 +14,11 @@
"""The example of four ways of data transmission using gRPC in Python."""
import time
+
import grpc
-import demo_pb2_grpc
import demo_pb2
+import demo_pb2_grpc
__all__ = [
'simple_method', 'client_streaming_method', 'server_streaming_method',
diff --git a/examples/python/data_transmission/server.py b/examples/python/data_transmission/server.py
index 3c990945ec..ab655f27f4 100644
--- a/examples/python/data_transmission/server.py
+++ b/examples/python/data_transmission/server.py
@@ -13,12 +13,13 @@
# limitations under the License.
"""The example of four ways of data transmission using gRPC in Python."""
-from threading import Thread
from concurrent import futures
+from threading import Thread
import grpc
-import demo_pb2_grpc
+
import demo_pb2
+import demo_pb2_grpc
__all__ = 'DemoServer'
SERVER_ADDRESS = 'localhost:23333'
diff --git a/examples/python/debug/asyncio_debug_server.py b/examples/python/debug/asyncio_debug_server.py
index b1dcc6f5c5..de59fe1012 100644
--- a/examples/python/debug/asyncio_debug_server.py
+++ b/examples/python/debug/asyncio_debug_server.py
@@ -13,8 +13,8 @@
# limitations under the License.
"""The Python AsyncIO example of utilizing Channelz feature."""
-import asyncio
import argparse
+import asyncio
import logging
import random
diff --git a/examples/python/debug/asyncio_get_stats.py b/examples/python/debug/asyncio_get_stats.py
index a421f8aa9b..3a835ebec5 100644
--- a/examples/python/debug/asyncio_get_stats.py
+++ b/examples/python/debug/asyncio_get_stats.py
@@ -13,11 +13,11 @@
# limitations under the License.
"""Poll statistics from the server."""
+import argparse
import asyncio
import logging
-import argparse
-import grpc
+import grpc
from grpc_channelz.v1 import channelz_pb2
from grpc_channelz.v1 import channelz_pb2_grpc
diff --git a/examples/python/debug/asyncio_send_message.py b/examples/python/debug/asyncio_send_message.py
index c3923990a2..1937ebf7a8 100644
--- a/examples/python/debug/asyncio_send_message.py
+++ b/examples/python/debug/asyncio_send_message.py
@@ -13,9 +13,10 @@
# limitations under the License.
"""Send multiple greeting messages to the backend."""
+import argparse
import asyncio
import logging
-import argparse
+
import grpc
helloworld_pb2, helloworld_pb2_grpc = grpc.protos_and_services(
diff --git a/examples/python/debug/debug_server.py b/examples/python/debug/debug_server.py
index f627d3b391..dd98c2219d 100644
--- a/examples/python/debug/debug_server.py
+++ b/examples/python/debug/debug_server.py
@@ -18,8 +18,8 @@ from __future__ import division
from __future__ import print_function
import argparse
-import logging
from concurrent import futures
+import logging
import random
import grpc
diff --git a/examples/python/debug/get_stats.py b/examples/python/debug/get_stats.py
index 398e1c014b..a7add5fd79 100644
--- a/examples/python/debug/get_stats.py
+++ b/examples/python/debug/get_stats.py
@@ -17,10 +17,10 @@ from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
-import logging
import argparse
-import grpc
+import logging
+import grpc
from grpc_channelz.v1 import channelz_pb2
from grpc_channelz.v1 import channelz_pb2_grpc
diff --git a/examples/python/debug/send_message.py b/examples/python/debug/send_message.py
index 3f0219954b..9467a60a3c 100644
--- a/examples/python/debug/send_message.py
+++ b/examples/python/debug/send_message.py
@@ -17,8 +17,9 @@ from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
-import logging
import argparse
+import logging
+
import grpc
helloworld_pb2, helloworld_pb2_grpc = grpc.protos_and_services(
diff --git a/examples/python/debug/test/_debug_example_test.py b/examples/python/debug/test/_debug_example_test.py
index efd7dbe104..57f206f586 100644
--- a/examples/python/debug/test/_debug_example_test.py
+++ b/examples/python/debug/test/_debug_example_test.py
@@ -17,12 +17,12 @@ import asyncio
import logging
import unittest
-from examples.python.debug import debug_server
from examples.python.debug import asyncio_debug_server
-from examples.python.debug import send_message
+from examples.python.debug import asyncio_get_stats
from examples.python.debug import asyncio_send_message
+from examples.python.debug import debug_server
from examples.python.debug import get_stats
-from examples.python.debug import asyncio_get_stats
+from examples.python.debug import send_message
_LOGGER = logging.getLogger(__name__)
_LOGGER.setLevel(logging.INFO)
diff --git a/examples/python/errors/client.py b/examples/python/errors/client.py
index a79b8fce1b..c37d62e1a7 100644
--- a/examples/python/errors/client.py
+++ b/examples/python/errors/client.py
@@ -14,11 +14,12 @@
"""This example handles rich error status in client-side."""
from __future__ import print_function
+
import logging
+from google.rpc import error_details_pb2
import grpc
from grpc_status import rpc_status
-from google.rpc import error_details_pb2
from examples.protos import helloworld_pb2
from examples.protos import helloworld_pb2_grpc
diff --git a/examples/python/errors/server.py b/examples/python/errors/server.py
index c410367034..585ff0344e 100644
--- a/examples/python/errors/server.py
+++ b/examples/python/errors/server.py
@@ -17,12 +17,13 @@ from concurrent import futures
import logging
import threading
+from google.protobuf import any_pb2
+from google.rpc import code_pb2
+from google.rpc import error_details_pb2
+from google.rpc import status_pb2
import grpc
from grpc_status import rpc_status
-from google.protobuf import any_pb2
-from google.rpc import code_pb2, status_pb2, error_details_pb2
-
from examples.protos import helloworld_pb2
from examples.protos import helloworld_pb2_grpc
diff --git a/examples/python/errors/test/_error_handling_example_test.py b/examples/python/errors/test/_error_handling_example_test.py
index a79ca45e2a..c5427f804e 100644
--- a/examples/python/errors/test/_error_handling_example_test.py
+++ b/examples/python/errors/test/_error_handling_example_test.py
@@ -21,8 +21,8 @@ try:
except ImportError:
pass
-import unittest
import logging
+import unittest
import grpc
diff --git a/examples/python/helloworld/async_greeter_client.py b/examples/python/helloworld/async_greeter_client.py
index 08a54230a5..b779a88195 100644
--- a/examples/python/helloworld/async_greeter_client.py
+++ b/examples/python/helloworld/async_greeter_client.py
@@ -13,10 +13,10 @@
# limitations under the License.
"""The Python AsyncIO implementation of the GRPC helloworld.Greeter client."""
-import logging
import asyncio
-import grpc
+import logging
+import grpc
import helloworld_pb2
import helloworld_pb2_grpc
diff --git a/examples/python/helloworld/async_greeter_client_with_options.py b/examples/python/helloworld/async_greeter_client_with_options.py
index 0edd255cee..b625ec8923 100644
--- a/examples/python/helloworld/async_greeter_client_with_options.py
+++ b/examples/python/helloworld/async_greeter_client_with_options.py
@@ -17,7 +17,6 @@ import asyncio
import logging
import grpc
-
import helloworld_pb2
import helloworld_pb2_grpc
diff --git a/examples/python/helloworld/async_greeter_server.py b/examples/python/helloworld/async_greeter_server.py
index 79025697c6..e0912a3454 100644
--- a/examples/python/helloworld/async_greeter_server.py
+++ b/examples/python/helloworld/async_greeter_server.py
@@ -13,10 +13,10 @@
# limitations under the License.
"""The Python AsyncIO implementation of the GRPC helloworld.Greeter server."""
-import logging
import asyncio
-import grpc
+import logging
+import grpc
import helloworld_pb2
import helloworld_pb2_grpc
@@ -36,13 +36,7 @@ async def serve() -> None:
server.add_insecure_port(listen_addr)
logging.info("Starting server on %s", listen_addr)
await server.start()
- try:
- await server.wait_for_termination()
- except KeyboardInterrupt:
- # Shuts down the server with 0 seconds of grace period. During the
- # grace period, the server won't accept new connections and allow
- # existing RPCs to continue within the grace period.
- await server.stop(0)
+ await server.wait_for_termination()
if __name__ == '__main__':
diff --git a/examples/python/helloworld/async_greeter_server_with_graceful_shutdown.py b/examples/python/helloworld/async_greeter_server_with_graceful_shutdown.py
new file mode 100644
index 0000000000..ebc03f8d9a
--- /dev/null
+++ b/examples/python/helloworld/async_greeter_server_with_graceful_shutdown.py
@@ -0,0 +1,64 @@
+# Copyright 2021 The gRPC Authors
+#
+# 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.
+"""The graceful shutdown example for the asyncio Greeter server."""
+
+import asyncio
+import logging
+
+import grpc
+import helloworld_pb2
+import helloworld_pb2_grpc
+
+# Coroutines to be invoked when the event loop is shutting down.
+_cleanup_coroutines = []
+
+
+class Greeter(helloworld_pb2_grpc.GreeterServicer):
+
+ async def SayHello(
+ self, request: helloworld_pb2.HelloRequest,
+ context: grpc.aio.ServicerContext) -> helloworld_pb2.HelloReply:
+ logging.info('Received request, sleeping for 4 seconds...')
+ await asyncio.sleep(4)
+ logging.info('Sleep completed, responding')
+ return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name)
+
+
+async def serve() -> None:
+ server = grpc.aio.server()
+ helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
+ listen_addr = '[::]:50051'
+ server.add_insecure_port(listen_addr)
+ logging.info("Starting server on %s", listen_addr)
+ await server.start()
+
+ async def server_graceful_shutdown():
+ logging.info("Starting graceful shutdown...")
+ # Shuts down the server with 0 seconds of grace period. During the
+ # grace period, the server won't accept new connections and allow
+ # existing RPCs to continue within the grace period.
+ await server.stop(5)
+
+ _cleanup_coroutines.append(server_graceful_shutdown())
+ await server.wait_for_termination()
+
+
+if __name__ == '__main__':
+ logging.basicConfig(level=logging.INFO)
+ loop = asyncio.get_event_loop()
+ try:
+ loop.run_until_complete(serve())
+ finally:
+ loop.run_until_complete(*_cleanup_coroutines)
+ loop.close()
diff --git a/examples/python/helloworld/async_greeter_server_with_reflection.py b/examples/python/helloworld/async_greeter_server_with_reflection.py
index 2abe3c9afc..5ce2abf9c0 100644
--- a/examples/python/helloworld/async_greeter_server_with_reflection.py
+++ b/examples/python/helloworld/async_greeter_server_with_reflection.py
@@ -18,7 +18,6 @@ import logging
import grpc
from grpc_reflection.v1alpha import reflection
-
import helloworld_pb2
import helloworld_pb2_grpc
diff --git a/examples/python/helloworld/greeter_client.py b/examples/python/helloworld/greeter_client.py
index ee2032a9e6..afab399931 100644
--- a/examples/python/helloworld/greeter_client.py
+++ b/examples/python/helloworld/greeter_client.py
@@ -14,10 +14,10 @@
"""The Python implementation of the GRPC helloworld.Greeter client."""
from __future__ import print_function
+
import logging
import grpc
-
import helloworld_pb2
import helloworld_pb2_grpc
diff --git a/examples/python/helloworld/greeter_client_with_options.py b/examples/python/helloworld/greeter_client_with_options.py
index 74c6a154d6..efb5fd58bd 100644
--- a/examples/python/helloworld/greeter_client_with_options.py
+++ b/examples/python/helloworld/greeter_client_with_options.py
@@ -14,10 +14,10 @@
"""gRPC Python helloworld.Greeter client with channel options and call timeout parameters."""
from __future__ import print_function
+
import logging
import grpc
-
import helloworld_pb2
import helloworld_pb2_grpc
diff --git a/examples/python/helloworld/greeter_server.py b/examples/python/helloworld/greeter_server.py
index 7bc3f2f725..acc5adbfe1 100644
--- a/examples/python/helloworld/greeter_server.py
+++ b/examples/python/helloworld/greeter_server.py
@@ -17,7 +17,6 @@ from concurrent import futures
import logging
import grpc
-
import helloworld_pb2
import helloworld_pb2_grpc
diff --git a/examples/python/helloworld/greeter_server_with_reflection.py b/examples/python/helloworld/greeter_server_with_reflection.py
index 7c73a42eb6..8ce3b1d49a 100644
--- a/examples/python/helloworld/greeter_server_with_reflection.py
+++ b/examples/python/helloworld/greeter_server_with_reflection.py
@@ -18,7 +18,6 @@ import logging
import grpc
from grpc_reflection.v1alpha import reflection
-
import helloworld_pb2
import helloworld_pb2_grpc
diff --git a/examples/python/interceptors/default_value/greeter_client.py b/examples/python/interceptors/default_value/greeter_client.py
index 25834c2bbd..7eaf556bc0 100644
--- a/examples/python/interceptors/default_value/greeter_client.py
+++ b/examples/python/interceptors/default_value/greeter_client.py
@@ -14,13 +14,13 @@
"""The Python implementation of the gRPC helloworld.Greeter client."""
from __future__ import print_function
+
import logging
+import default_value_client_interceptor
import grpc
-
import helloworld_pb2
import helloworld_pb2_grpc
-import default_value_client_interceptor
def run():
diff --git a/examples/python/interceptors/headers/greeter_client.py b/examples/python/interceptors/headers/greeter_client.py
index 712539850d..0714aa7d02 100644
--- a/examples/python/interceptors/headers/greeter_client.py
+++ b/examples/python/interceptors/headers/greeter_client.py
@@ -14,13 +14,13 @@
"""The Python implementation of the GRPC helloworld.Greeter client."""
from __future__ import print_function
+
import logging
import grpc
-
+import header_manipulator_client_interceptor
import helloworld_pb2
import helloworld_pb2_grpc
-import header_manipulator_client_interceptor
def run():
diff --git a/examples/python/interceptors/headers/greeter_server.py b/examples/python/interceptors/headers/greeter_server.py
index 21d86631ad..95f3b2a22b 100644
--- a/examples/python/interceptors/headers/greeter_server.py
+++ b/examples/python/interceptors/headers/greeter_server.py
@@ -17,10 +17,10 @@ from concurrent import futures
import logging
import grpc
-
import helloworld_pb2
import helloworld_pb2_grpc
-from request_header_validator_interceptor import RequestHeaderValidatorInterceptor
+from request_header_validator_interceptor import \
+ RequestHeaderValidatorInterceptor
class Greeter(helloworld_pb2_grpc.GreeterServicer):
diff --git a/examples/python/interceptors/headers/header_manipulator_client_interceptor.py b/examples/python/interceptors/headers/header_manipulator_client_interceptor.py
index 89b1bef05f..b2b06b8624 100644
--- a/examples/python/interceptors/headers/header_manipulator_client_interceptor.py
+++ b/examples/python/interceptors/headers/header_manipulator_client_interceptor.py
@@ -15,8 +15,8 @@
import collections
-import grpc
import generic_client_interceptor
+import grpc
class _ClientCallDetails(
diff --git a/examples/python/metadata/metadata_client.py b/examples/python/metadata/metadata_client.py
index f2a8e37cc2..147dcedc61 100644
--- a/examples/python/metadata/metadata_client.py
+++ b/examples/python/metadata/metadata_client.py
@@ -14,10 +14,10 @@
"""Example gRPC client that gets/sets metadata (HTTP2 headers)"""
from __future__ import print_function
+
import logging
import grpc
-
import helloworld_pb2
import helloworld_pb2_grpc
diff --git a/examples/python/metadata/metadata_server.py b/examples/python/metadata/metadata_server.py
index 79eb380092..1562e14346 100644
--- a/examples/python/metadata/metadata_server.py
+++ b/examples/python/metadata/metadata_server.py
@@ -14,11 +14,11 @@
"""Example gRPC server that gets/sets metadata (HTTP2 headers)"""
from __future__ import print_function
+
from concurrent import futures
import logging
import grpc
-
import helloworld_pb2
import helloworld_pb2_grpc
diff --git a/examples/python/multiplex/multiplex_client.py b/examples/python/multiplex/multiplex_client.py
index 37083cf394..d97d6c65bf 100644
--- a/examples/python/multiplex/multiplex_client.py
+++ b/examples/python/multiplex/multiplex_client.py
@@ -15,12 +15,11 @@
from __future__ import print_function
+import logging
import random
import time
-import logging
import grpc
-
import helloworld_pb2
import helloworld_pb2_grpc
import route_guide_pb2
diff --git a/examples/python/multiplex/multiplex_server.py b/examples/python/multiplex/multiplex_server.py
index 9499af508f..eb1902aafc 100644
--- a/examples/python/multiplex/multiplex_server.py
+++ b/examples/python/multiplex/multiplex_server.py
@@ -14,12 +14,11 @@
"""A gRPC server servicing both Greeter and RouteGuide RPCs."""
from concurrent import futures
-import time
-import math
import logging
+import math
+import time
import grpc
-
import helloworld_pb2
import helloworld_pb2_grpc
import route_guide_pb2
diff --git a/examples/python/multiprocessing/client.py b/examples/python/multiprocessing/client.py
index 7676bd4ec8..1cc3336639 100644
--- a/examples/python/multiprocessing/client.py
+++ b/examples/python/multiprocessing/client.py
@@ -25,7 +25,6 @@ import operator
import sys
import grpc
-
import prime_pb2
import prime_pb2_grpc
diff --git a/examples/python/multiprocessing/server.py b/examples/python/multiprocessing/server.py
index a5ee00755e..48e49eccd8 100644
--- a/examples/python/multiprocessing/server.py
+++ b/examples/python/multiprocessing/server.py
@@ -23,12 +23,11 @@ import datetime
import logging
import math
import multiprocessing
-import time
import socket
import sys
+import time
import grpc
-
import prime_pb2
import prime_pb2_grpc
diff --git a/examples/python/no_codegen/greeter_client.py b/examples/python/no_codegen/greeter_client.py
index 7ee2c2722c..c16d4db257 100644
--- a/examples/python/no_codegen/greeter_client.py
+++ b/examples/python/no_codegen/greeter_client.py
@@ -20,6 +20,7 @@ Several APIs used in this example are in an experimental state.
"""
from __future__ import print_function
+
import logging
import grpc
diff --git a/examples/python/retry/README.md b/examples/python/retry/README.md
new file mode 100644
index 0000000000..75cdb35b61
--- /dev/null
+++ b/examples/python/retry/README.md
@@ -0,0 +1,48 @@
+# Retry Example in gRPC Python
+
+## Prerequisite
+
+* grpcio >= 1.39.0
+* grpcio-tools >= 1.39.0
+
+## Running the example
+
+In terminal 1, start the flaky server:
+
+```sh
+python3 flaky_server.py
+```
+
+In terminal 2, start the retry clients:
+
+```sh
+python3 retry_client.py
+# Or
+python3 async_retry_client.py
+```
+
+## Expect results
+
+The client RPC will succeed, even with server injecting multiple errors. Here is an example server log:
+
+```sh
+$ python3 flaky_server.py
+INFO:root:Starting flaky server on [::]:50051
+INFO:root:Injecting error to RPC from ipv6:[::1]:54471
+INFO:root:Successfully responding to RPC from ipv6:[::1]:54473
+INFO:root:Injecting error to RPC from ipv6:[::1]:54491
+INFO:root:Injecting error to RPC from ipv6:[::1]:54581
+INFO:root:Injecting error to RPC from ipv6:[::1]:54581
+INFO:root:Injecting error to RPC from ipv6:[::1]:54581
+INFO:root:Injecting error to RPC from ipv6:[::1]:54581
+INFO:root:Successfully responding to RPC from ipv6:[::1]:54581
+INFO:root:Injecting error to RPC from ipv6:[::1]:55474
+INFO:root:Injecting error to RPC from ipv6:[::1]:55474
+INFO:root:Injecting error to RPC from ipv6:[::1]:55474
+INFO:root:Injecting error to RPC from ipv6:[::1]:55474
+INFO:root:Successfully responding to RPC from ipv6:[::1]:55474
+INFO:root:Injecting error to RPC from ipv6:[::1]:55533
+INFO:root:Injecting error to RPC from ipv6:[::1]:55533
+INFO:root:Injecting error to RPC from ipv6:[::1]:55533
+INFO:root:Successfully responding to RPC from ipv6:[::1]:55533
+```
diff --git a/examples/python/retry/async_retry_client.py b/examples/python/retry/async_retry_client.py
new file mode 100644
index 0000000000..faadf6a57d
--- /dev/null
+++ b/examples/python/retry/async_retry_client.py
@@ -0,0 +1,58 @@
+# Copyright 2021 The gRPC Authors
+#
+# 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.
+"""The Python AsyncIO implementation of the gRPC client-side retry example."""
+
+import asyncio
+import json
+import logging
+
+import grpc
+
+helloworld_pb2, helloworld_pb2_grpc = grpc.protos_and_services(
+ "helloworld.proto")
+
+
+async def run() -> None:
+ # The ServiceConfig proto definition can be found:
+ # https://github.com/grpc/grpc-proto/blob/ec886024c2f7b7f597ba89d5b7d60c3f94627b17/grpc/service_config/service_config.proto#L377
+ service_config_json = json.dumps({
+ "methodConfig": [{
+ # To apply retry to all methods, put [{}] in the "name" field
+ "name": [{
+ "service": "helloworld.Greeter",
+ "method": "SayHello"
+ }],
+ "retryPolicy": {
+ "maxAttempts": 5,
+ "initialBackoff": "0.1s",
+ "maxBackoff": "1s",
+ "backoffMultiplier": 2,
+ "retryableStatusCodes": ["UNAVAILABLE"],
+ },
+ }]
+ })
+ options = []
+ # NOTE: the retry feature will be enabled by default >=v1.40.0
+ options.append(("grpc.enable_retries", 1))
+ options.append(("grpc.service_config", service_config_json))
+ async with grpc.aio.insecure_channel('localhost:50051',
+ options=options) as channel:
+ stub = helloworld_pb2_grpc.GreeterStub(channel)
+ response = await stub.SayHello(helloworld_pb2.HelloRequest(name='you'))
+ print("Greeter client received: " + response.message)
+
+
+if __name__ == '__main__':
+ logging.basicConfig()
+ asyncio.run(run())
diff --git a/examples/python/retry/flaky_server.py b/examples/python/retry/flaky_server.py
new file mode 100644
index 0000000000..caa166bcdb
--- /dev/null
+++ b/examples/python/retry/flaky_server.py
@@ -0,0 +1,58 @@
+# Copyright 2021 The gRPC Authors
+#
+# 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.
+"""A flaky backend for the gRPC Python retry example."""
+
+import asyncio
+import collections
+import logging
+import random
+
+import grpc
+
+helloworld_pb2, helloworld_pb2_grpc = grpc.protos_and_services(
+ "helloworld.proto")
+
+
+class ErrorInjectingGreeter(helloworld_pb2_grpc.GreeterServicer):
+
+ def __init__(self):
+ self._counter = collections.defaultdict(int)
+
+ async def SayHello(
+ self, request: helloworld_pb2.HelloRequest,
+ context: grpc.aio.ServicerContext) -> helloworld_pb2.HelloReply:
+ self._counter[context.peer()] += 1
+ if self._counter[context.peer()] < 5:
+ if random.random() < 0.75:
+ logging.info('Injecting error to RPC from %s', context.peer())
+ await context.abort(grpc.StatusCode.UNAVAILABLE,
+ 'injected error')
+ logging.info('Successfully responding to RPC from %s', context.peer())
+ return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name)
+
+
+async def serve() -> None:
+ server = grpc.aio.server()
+ helloworld_pb2_grpc.add_GreeterServicer_to_server(ErrorInjectingGreeter(),
+ server)
+ listen_addr = '[::]:50051'
+ server.add_insecure_port(listen_addr)
+ logging.info("Starting flaky server on %s", listen_addr)
+ await server.start()
+ await server.wait_for_termination()
+
+
+if __name__ == '__main__':
+ logging.basicConfig(level=logging.INFO)
+ asyncio.run(serve())
diff --git a/examples/python/retry/helloworld.proto b/examples/python/retry/helloworld.proto
new file mode 100644
index 0000000000..1fc716702b
--- /dev/null
+++ b/examples/python/retry/helloworld.proto
@@ -0,0 +1,33 @@
+// Copyright 2021 The gRPC Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+
+package helloworld;
+
+// The greeting service definition.
+service Greeter {
+ // Sends a greeting
+ rpc SayHello (HelloRequest) returns (HelloReply) {}
+}
+
+// The request message containing the user's name.
+message HelloRequest {
+ string name = 1;
+}
+
+// The response message containing the greetings
+message HelloReply {
+ string message = 1;
+}
diff --git a/examples/python/retry/retry_client.py b/examples/python/retry/retry_client.py
new file mode 100644
index 0000000000..486340e44d
--- /dev/null
+++ b/examples/python/retry/retry_client.py
@@ -0,0 +1,56 @@
+# Copyright 2021 The gRPC Authors
+#
+# 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.
+"""The Python implementation of the gRPC client-side retry example."""
+
+import json
+import logging
+
+import grpc
+
+helloworld_pb2, helloworld_pb2_grpc = grpc.protos_and_services(
+ "helloworld.proto")
+
+
+def run():
+ # The ServiceConfig proto definition can be found:
+ # https://github.com/grpc/grpc-proto/blob/ec886024c2f7b7f597ba89d5b7d60c3f94627b17/grpc/service_config/service_config.proto#L377
+ service_config_json = json.dumps({
+ "methodConfig": [{
+ # To apply retry to all methods, put [{}] in the "name" field
+ "name": [{
+ "service": "helloworld.Greeter",
+ "method": "SayHello"
+ }],
+ "retryPolicy": {
+ "maxAttempts": 5,
+ "initialBackoff": "0.1s",
+ "maxBackoff": "1s",
+ "backoffMultiplier": 2,
+ "retryableStatusCodes": ["UNAVAILABLE"],
+ },
+ }]
+ })
+ options = []
+ # NOTE: the retry feature will be enabled by default >=v1.40.0
+ options.append(("grpc.enable_retries", 1))
+ options.append(("grpc.service_config", service_config_json))
+ with grpc.insecure_channel('localhost:50051', options=options) as channel:
+ stub = helloworld_pb2_grpc.GreeterStub(channel)
+ response = stub.SayHello(helloworld_pb2.HelloRequest(name='you'))
+ print("Greeter client received: " + response.message)
+
+
+if __name__ == '__main__':
+ logging.basicConfig()
+ run()
diff --git a/examples/python/route_guide/asyncio_route_guide_client.py b/examples/python/route_guide/asyncio_route_guide_client.py
index 47584691c7..98d66c5c30 100644
--- a/examples/python/route_guide/asyncio_route_guide_client.py
+++ b/examples/python/route_guide/asyncio_route_guide_client.py
@@ -14,12 +14,11 @@
"""The Python AsyncIO implementation of the gRPC route guide client."""
import asyncio
-import random
import logging
-from typing import List, Iterable
+import random
+from typing import Iterable, List
import grpc
-
import route_guide_pb2
import route_guide_pb2_grpc
import route_guide_resources
diff --git a/examples/python/route_guide/asyncio_route_guide_server.py b/examples/python/route_guide/asyncio_route_guide_server.py
index ac9fa166aa..b948da1712 100644
--- a/examples/python/route_guide/asyncio_route_guide_server.py
+++ b/examples/python/route_guide/asyncio_route_guide_server.py
@@ -14,13 +14,12 @@
"""The Python AsyncIO implementation of the gRPC route guide server."""
import asyncio
-import time
-import math
import logging
+import math
+import time
from typing import AsyncIterable, Iterable
import grpc
-
import route_guide_pb2
import route_guide_pb2_grpc
import route_guide_resources
diff --git a/examples/python/route_guide/route_guide_client.py b/examples/python/route_guide/route_guide_client.py
index 6103c53525..c7383d3b6e 100644
--- a/examples/python/route_guide/route_guide_client.py
+++ b/examples/python/route_guide/route_guide_client.py
@@ -15,11 +15,10 @@
from __future__ import print_function
-import random
import logging
+import random
import grpc
-
import route_guide_pb2
import route_guide_pb2_grpc
import route_guide_resources
diff --git a/examples/python/route_guide/route_guide_server.py b/examples/python/route_guide/route_guide_server.py
index ab6b63e4a9..e58f2ad299 100644
--- a/examples/python/route_guide/route_guide_server.py
+++ b/examples/python/route_guide/route_guide_server.py
@@ -14,12 +14,11 @@
"""The Python implementation of the gRPC route guide server."""
from concurrent import futures
-import time
-import math
import logging
+import math
+import time
import grpc
-
import route_guide_pb2
import route_guide_pb2_grpc
import route_guide_resources
diff --git a/examples/python/wait_for_ready/asyncio_wait_for_ready_example.py b/examples/python/wait_for_ready/asyncio_wait_for_ready_example.py
index f449909085..97922062c1 100644
--- a/examples/python/wait_for_ready/asyncio_wait_for_ready_example.py
+++ b/examples/python/wait_for_ready/asyncio_wait_for_ready_example.py
@@ -14,8 +14,8 @@
"""The Python example of utilizing wait-for-ready flag."""
import asyncio
-import logging
from contextlib import contextmanager
+import logging
import socket
from typing import Iterable
diff --git a/examples/python/wait_for_ready/test/_wait_for_ready_example_test.py b/examples/python/wait_for_ready/test/_wait_for_ready_example_test.py
index 24d9865b43..ebc8164ad3 100644
--- a/examples/python/wait_for_ready/test/_wait_for_ready_example_test.py
+++ b/examples/python/wait_for_ready/test/_wait_for_ready_example_test.py
@@ -14,11 +14,11 @@
"""Tests of the wait-for-ready example."""
import asyncio
-import unittest
import logging
+import unittest
-from examples.python.wait_for_ready import wait_for_ready_example
from examples.python.wait_for_ready import asyncio_wait_for_ready_example
+from examples.python.wait_for_ready import wait_for_ready_example
class WaitForReadyExampleTest(unittest.TestCase):
diff --git a/examples/python/wait_for_ready/wait_for_ready_example.py b/examples/python/wait_for_ready/wait_for_ready_example.py
index 6b6da869b4..c3fa90df2b 100644
--- a/examples/python/wait_for_ready/wait_for_ready_example.py
+++ b/examples/python/wait_for_ready/wait_for_ready_example.py
@@ -13,9 +13,9 @@
# limitations under the License.
"""The Python example of utilizing wait-for-ready flag."""
-import logging
from concurrent import futures
from contextlib import contextmanager
+import logging
import socket
import threading
diff --git a/examples/python/xds/client.py b/examples/python/xds/client.py
index a969b603fa..b422dcdc0c 100644
--- a/examples/python/xds/client.py
+++ b/examples/python/xds/client.py
@@ -14,12 +14,12 @@
"""The Python implementation of the GRPC helloworld.Greeter client."""
from __future__ import print_function
-import logging
+
import argparse
+import logging
import grpc
import grpc.experimental
-
import helloworld_pb2
import helloworld_pb2_grpc
diff --git a/examples/python/xds/server.py b/examples/python/xds/server.py
index 82fabf2664..5d26547b21 100644
--- a/examples/python/xds/server.py
+++ b/examples/python/xds/server.py
@@ -13,20 +13,18 @@
# limitations under the License.
"""The Python implementation of the GRPC helloworld.Greeter server."""
-from concurrent import futures
import argparse
+from concurrent import futures
import logging
import socket
import grpc
-
-import helloworld_pb2
-import helloworld_pb2_grpc
-
-from grpc_reflection.v1alpha import reflection
from grpc_health.v1 import health
from grpc_health.v1 import health_pb2
from grpc_health.v1 import health_pb2_grpc
+from grpc_reflection.v1alpha import reflection
+import helloworld_pb2
+import helloworld_pb2_grpc
_DESCRIPTION = "A general purpose phony server."
diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec
index 42ef775fe7..f1628a5e62 100644
--- a/gRPC-C++.podspec
+++ b/gRPC-C++.podspec
@@ -22,7 +22,7 @@
Pod::Spec.new do |s|
s.name = 'gRPC-C++'
# TODO (mxyan): use version that match gRPC version when pod is stabilized
- version = '1.39.1'
+ version = '1.40.0'
s.version = version
s.summary = 'gRPC C++ library'
s.homepage = 'https://grpc.io'
@@ -189,12 +189,14 @@ Pod::Spec.new do |s|
ss.dependency 'gRPC-Core', version
abseil_version = '1.20210324.0'
ss.dependency 'abseil/base/base', abseil_version
+ ss.dependency 'abseil/base/core_headers', abseil_version
ss.dependency 'abseil/container/flat_hash_map', abseil_version
ss.dependency 'abseil/container/inlined_vector', abseil_version
ss.dependency 'abseil/functional/bind_front', abseil_version
ss.dependency 'abseil/memory/memory', abseil_version
ss.dependency 'abseil/status/status', abseil_version
ss.dependency 'abseil/status/statusor', abseil_version
+ ss.dependency 'abseil/strings/cord', abseil_version
ss.dependency 'abseil/strings/str_format', abseil_version
ss.dependency 'abseil/strings/strings', abseil_version
ss.dependency 'abseil/synchronization/synchronization', abseil_version
@@ -268,6 +270,7 @@ Pod::Spec.new do |s|
'src/core/ext/transport/chttp2/server/chttp2_server.h',
'src/core/ext/transport/chttp2/transport/bin_decoder.h',
'src/core/ext/transport/chttp2/transport/bin_encoder.h',
+ 'src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h',
'src/core/ext/transport/chttp2/transport/chttp2_transport.h',
'src/core/ext/transport/chttp2/transport/context_list.h',
'src/core/ext/transport/chttp2/transport/flow_control.h',
@@ -308,14 +311,17 @@ Pod::Spec.new do |s|
'src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h',
'src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h',
'src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h',
+ 'src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h',
'src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h',
'src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h',
+ 'src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h',
'src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h',
'src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h',
'src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h',
'src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h',
'src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h',
'src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h',
+ 'src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h',
'src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h',
'src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h',
'src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h',
@@ -342,6 +348,7 @@ Pod::Spec.new do |s|
'src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h',
'src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h',
'src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h',
+ 'src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h',
'src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h',
'src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h',
'src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h',
@@ -407,14 +414,17 @@ Pod::Spec.new do |s|
'src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h',
@@ -440,6 +450,7 @@ Pod::Spec.new do |s|
'src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h',
@@ -493,6 +504,7 @@ Pod::Spec.new do |s|
'src/core/lib/address_utils/sockaddr_utils.h',
'src/core/lib/avl/avl.h',
'src/core/lib/backoff/backoff.h',
+ 'src/core/lib/channel/call_tracer.h',
'src/core/lib/channel/channel_args.h',
'src/core/lib/channel/channel_stack.h',
'src/core/lib/channel/channel_stack_builder.h',
@@ -518,7 +530,6 @@ Pod::Spec.new do |s|
'src/core/lib/event_engine/endpoint_config_internal.h',
'src/core/lib/event_engine/sockaddr.h',
'src/core/lib/gpr/alloc.h',
- 'src/core/lib/gpr/arena.h',
'src/core/lib/gpr/env.h',
'src/core/lib/gpr/murmur_hash.h',
'src/core/lib/gpr/spinlock.h',
@@ -920,6 +931,7 @@ Pod::Spec.new do |s|
'src/core/ext/transport/chttp2/server/chttp2_server.h',
'src/core/ext/transport/chttp2/transport/bin_decoder.h',
'src/core/ext/transport/chttp2/transport/bin_encoder.h',
+ 'src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h',
'src/core/ext/transport/chttp2/transport/chttp2_transport.h',
'src/core/ext/transport/chttp2/transport/context_list.h',
'src/core/ext/transport/chttp2/transport/flow_control.h',
@@ -960,14 +972,17 @@ Pod::Spec.new do |s|
'src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h',
'src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h',
'src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h',
+ 'src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h',
'src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h',
'src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h',
+ 'src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h',
'src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h',
'src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h',
'src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h',
'src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h',
'src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h',
'src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h',
+ 'src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h',
'src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h',
'src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h',
'src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h',
@@ -994,6 +1009,7 @@ Pod::Spec.new do |s|
'src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h',
'src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h',
'src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h',
+ 'src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h',
'src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h',
'src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h',
'src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h',
@@ -1059,14 +1075,17 @@ Pod::Spec.new do |s|
'src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h',
@@ -1092,6 +1111,7 @@ Pod::Spec.new do |s|
'src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h',
@@ -1145,6 +1165,7 @@ Pod::Spec.new do |s|
'src/core/lib/address_utils/sockaddr_utils.h',
'src/core/lib/avl/avl.h',
'src/core/lib/backoff/backoff.h',
+ 'src/core/lib/channel/call_tracer.h',
'src/core/lib/channel/channel_args.h',
'src/core/lib/channel/channel_stack.h',
'src/core/lib/channel/channel_stack_builder.h',
@@ -1170,7 +1191,6 @@ Pod::Spec.new do |s|
'src/core/lib/event_engine/endpoint_config_internal.h',
'src/core/lib/event_engine/sockaddr.h',
'src/core/lib/gpr/alloc.h',
- 'src/core/lib/gpr/arena.h',
'src/core/lib/gpr/env.h',
'src/core/lib/gpr/murmur_hash.h',
'src/core/lib/gpr/spinlock.h',
diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec
index 8a50cff3f2..d2af3b0ac5 100644
--- a/gRPC-Core.podspec
+++ b/gRPC-Core.podspec
@@ -21,7 +21,7 @@
Pod::Spec.new do |s|
s.name = 'gRPC-Core'
- version = '1.39.1'
+ version = '1.40.0'
s.version = version
s.summary = 'Core cross-platform gRPC library, written in C'
s.homepage = 'https://grpc.io'
@@ -179,12 +179,14 @@ Pod::Spec.new do |s|
ss.dependency "#{s.name}/Interface", version
ss.dependency 'BoringSSL-GRPC', '0.0.19'
ss.dependency 'abseil/base/base', abseil_version
+ ss.dependency 'abseil/base/core_headers', abseil_version
ss.dependency 'abseil/container/flat_hash_map', abseil_version
ss.dependency 'abseil/container/inlined_vector', abseil_version
ss.dependency 'abseil/functional/bind_front', abseil_version
ss.dependency 'abseil/memory/memory', abseil_version
ss.dependency 'abseil/status/status', abseil_version
ss.dependency 'abseil/status/statusor', abseil_version
+ ss.dependency 'abseil/strings/cord', abseil_version
ss.dependency 'abseil/strings/str_format', abseil_version
ss.dependency 'abseil/strings/strings', abseil_version
ss.dependency 'abseil/synchronization/synchronization', abseil_version
@@ -349,6 +351,8 @@ Pod::Spec.new do |s|
'src/core/ext/transport/chttp2/transport/bin_encoder.cc',
'src/core/ext/transport/chttp2/transport/bin_encoder.h',
'src/core/ext/transport/chttp2/transport/chttp2_plugin.cc',
+ 'src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc',
+ 'src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h',
'src/core/ext/transport/chttp2/transport/chttp2_transport.cc',
'src/core/ext/transport/chttp2/transport/chttp2_transport.h',
'src/core/ext/transport/chttp2/transport/context_list.cc',
@@ -431,10 +435,14 @@ Pod::Spec.new do |s|
'src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h',
'src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c',
'src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h',
+ 'src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c',
+ 'src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h',
'src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c',
'src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h',
'src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c',
'src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h',
+ 'src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c',
+ 'src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h',
'src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c',
'src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h',
'src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c',
@@ -447,6 +455,8 @@ Pod::Spec.new do |s|
'src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h',
'src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c',
'src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h',
+ 'src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c',
+ 'src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h',
'src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c',
'src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h',
'src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c',
@@ -499,6 +509,8 @@ Pod::Spec.new do |s|
'src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h',
'src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c',
'src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h',
+ 'src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c',
+ 'src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h',
'src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c',
'src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h',
'src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c',
@@ -629,10 +641,14 @@ Pod::Spec.new do |s|
'src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c',
@@ -645,6 +661,8 @@ Pod::Spec.new do |s|
'src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c',
@@ -695,6 +713,8 @@ Pod::Spec.new do |s|
'src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c',
@@ -800,6 +820,7 @@ Pod::Spec.new do |s|
'src/core/lib/avl/avl.h',
'src/core/lib/backoff/backoff.cc',
'src/core/lib/backoff/backoff.h',
+ 'src/core/lib/channel/call_tracer.h',
'src/core/lib/channel/channel_args.cc',
'src/core/lib/channel/channel_args.h',
'src/core/lib/channel/channel_stack.cc',
@@ -845,12 +866,10 @@ Pod::Spec.new do |s|
'src/core/lib/event_engine/endpoint_config.cc',
'src/core/lib/event_engine/endpoint_config_internal.h',
'src/core/lib/event_engine/event_engine.cc',
- 'src/core/lib/event_engine/slice_allocator.cc',
'src/core/lib/event_engine/sockaddr.cc',
'src/core/lib/event_engine/sockaddr.h',
'src/core/lib/gpr/alloc.cc',
'src/core/lib/gpr/alloc.h',
- 'src/core/lib/gpr/arena.h',
'src/core/lib/gpr/atm.cc',
'src/core/lib/gpr/cpu_iphone.cc',
'src/core/lib/gpr/cpu_linux.cc',
@@ -1500,6 +1519,7 @@ Pod::Spec.new do |s|
'src/core/ext/transport/chttp2/server/chttp2_server.h',
'src/core/ext/transport/chttp2/transport/bin_decoder.h',
'src/core/ext/transport/chttp2/transport/bin_encoder.h',
+ 'src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h',
'src/core/ext/transport/chttp2/transport/chttp2_transport.h',
'src/core/ext/transport/chttp2/transport/context_list.h',
'src/core/ext/transport/chttp2/transport/flow_control.h',
@@ -1540,14 +1560,17 @@ Pod::Spec.new do |s|
'src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h',
'src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h',
'src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h',
+ 'src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h',
'src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h',
'src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h',
+ 'src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h',
'src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h',
'src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h',
'src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h',
'src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h',
'src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h',
'src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h',
+ 'src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h',
'src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h',
'src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h',
'src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h',
@@ -1574,6 +1597,7 @@ Pod::Spec.new do |s|
'src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h',
'src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h',
'src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h',
+ 'src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h',
'src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h',
'src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h',
'src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h',
@@ -1639,14 +1663,17 @@ Pod::Spec.new do |s|
'src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h',
@@ -1672,6 +1699,7 @@ Pod::Spec.new do |s|
'src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h',
@@ -1725,6 +1753,7 @@ Pod::Spec.new do |s|
'src/core/lib/address_utils/sockaddr_utils.h',
'src/core/lib/avl/avl.h',
'src/core/lib/backoff/backoff.h',
+ 'src/core/lib/channel/call_tracer.h',
'src/core/lib/channel/channel_args.h',
'src/core/lib/channel/channel_stack.h',
'src/core/lib/channel/channel_stack_builder.h',
@@ -1750,7 +1779,6 @@ Pod::Spec.new do |s|
'src/core/lib/event_engine/endpoint_config_internal.h',
'src/core/lib/event_engine/sockaddr.h',
'src/core/lib/gpr/alloc.h',
- 'src/core/lib/gpr/arena.h',
'src/core/lib/gpr/env.h',
'src/core/lib/gpr/murmur_hash.h',
'src/core/lib/gpr/spinlock.h',
@@ -2127,18 +2155,22 @@ Pod::Spec.new do |s|
'test/core/end2end/tests/resource_quota_server.cc',
'test/core/end2end/tests/retry.cc',
'test/core/end2end/tests/retry_cancel_during_delay.cc',
+ 'test/core/end2end/tests/retry_cancel_with_multiple_send_batches.cc',
'test/core/end2end/tests/retry_cancellation.cc',
'test/core/end2end/tests/retry_disabled.cc',
'test/core/end2end/tests/retry_exceeds_buffer_size_in_delay.cc',
'test/core/end2end/tests/retry_exceeds_buffer_size_in_initial_batch.cc',
'test/core/end2end/tests/retry_exceeds_buffer_size_in_subsequent_batch.cc',
'test/core/end2end/tests/retry_lb_drop.cc',
+ 'test/core/end2end/tests/retry_lb_fail.cc',
'test/core/end2end/tests/retry_non_retriable_status.cc',
'test/core/end2end/tests/retry_non_retriable_status_before_recv_trailing_metadata_started.cc',
'test/core/end2end/tests/retry_per_attempt_recv_timeout.cc',
+ 'test/core/end2end/tests/retry_per_attempt_recv_timeout_on_last_attempt.cc',
'test/core/end2end/tests/retry_recv_initial_metadata.cc',
'test/core/end2end/tests/retry_recv_message.cc',
'test/core/end2end/tests/retry_recv_trailing_metadata_error.cc',
+ 'test/core/end2end/tests/retry_send_initial_metadata_refs.cc',
'test/core/end2end/tests/retry_send_op_fails.cc',
'test/core/end2end/tests/retry_server_pushback_delay.cc',
'test/core/end2end/tests/retry_server_pushback_disabled.cc',
diff --git a/gRPC-ProtoRPC.podspec b/gRPC-ProtoRPC.podspec
index 97e1cc6730..ae8bb8eab8 100644
--- a/gRPC-ProtoRPC.podspec
+++ b/gRPC-ProtoRPC.podspec
@@ -21,7 +21,7 @@
Pod::Spec.new do |s|
s.name = 'gRPC-ProtoRPC'
- version = '1.39.1'
+ version = '1.40.0'
s.version = version
s.summary = 'RPC library for Protocol Buffers, based on gRPC'
s.homepage = 'https://grpc.io'
diff --git a/gRPC-RxLibrary.podspec b/gRPC-RxLibrary.podspec
index f746f5cd7b..b00d115be4 100644
--- a/gRPC-RxLibrary.podspec
+++ b/gRPC-RxLibrary.podspec
@@ -21,7 +21,7 @@
Pod::Spec.new do |s|
s.name = 'gRPC-RxLibrary'
- version = '1.39.1'
+ version = '1.40.0'
s.version = version
s.summary = 'Reactive Extensions library for iOS/OSX.'
s.homepage = 'https://grpc.io'
diff --git a/gRPC.podspec b/gRPC.podspec
index 5fb07c5bfd..3d7f6638f4 100644
--- a/gRPC.podspec
+++ b/gRPC.podspec
@@ -20,7 +20,7 @@
Pod::Spec.new do |s|
s.name = 'gRPC'
- version = '1.39.1'
+ version = '1.40.0'
s.version = version
s.summary = 'gRPC client library for iOS/OSX'
s.homepage = 'https://grpc.io'
diff --git a/grpc.gemspec b/grpc.gemspec
index 14bf3feab7..60e758df65 100644
--- a/grpc.gemspec
+++ b/grpc.gemspec
@@ -265,6 +265,8 @@ Gem::Specification.new do |s|
s.files += %w( src/core/ext/transport/chttp2/transport/bin_encoder.cc )
s.files += %w( src/core/ext/transport/chttp2/transport/bin_encoder.h )
s.files += %w( src/core/ext/transport/chttp2/transport/chttp2_plugin.cc )
+ s.files += %w( src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc )
+ s.files += %w( src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h )
s.files += %w( src/core/ext/transport/chttp2/transport/chttp2_transport.cc )
s.files += %w( src/core/ext/transport/chttp2/transport/chttp2_transport.h )
s.files += %w( src/core/ext/transport/chttp2/transport/context_list.cc )
@@ -347,10 +349,14 @@ Gem::Specification.new do |s|
s.files += %w( src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h )
s.files += %w( src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c )
s.files += %w( src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h )
+ s.files += %w( src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c )
+ s.files += %w( src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h )
s.files += %w( src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c )
s.files += %w( src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h )
s.files += %w( src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c )
s.files += %w( src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h )
+ s.files += %w( src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c )
+ s.files += %w( src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h )
s.files += %w( src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c )
s.files += %w( src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h )
s.files += %w( src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c )
@@ -363,6 +369,8 @@ Gem::Specification.new do |s|
s.files += %w( src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h )
s.files += %w( src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c )
s.files += %w( src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h )
+ s.files += %w( src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c )
+ s.files += %w( src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h )
s.files += %w( src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c )
s.files += %w( src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h )
s.files += %w( src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c )
@@ -415,6 +423,8 @@ Gem::Specification.new do |s|
s.files += %w( src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h )
s.files += %w( src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c )
s.files += %w( src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h )
+ s.files += %w( src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c )
+ s.files += %w( src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h )
s.files += %w( src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c )
s.files += %w( src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h )
s.files += %w( src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c )
@@ -545,10 +555,14 @@ Gem::Specification.new do |s|
s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h )
s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c )
s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h )
+ s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c )
+ s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.h )
s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c )
s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h )
s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c )
s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h )
+ s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c )
+ s.files += %w( src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.h )
s.files += %w( src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c )
s.files += %w( src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h )
s.files += %w( src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c )
@@ -561,6 +575,8 @@ Gem::Specification.new do |s|
s.files += %w( src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h )
s.files += %w( src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c )
s.files += %w( src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h )
+ s.files += %w( src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c )
+ s.files += %w( src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.h )
s.files += %w( src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c )
s.files += %w( src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h )
s.files += %w( src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c )
@@ -611,6 +627,8 @@ Gem::Specification.new do |s|
s.files += %w( src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h )
s.files += %w( src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c )
s.files += %w( src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h )
+ s.files += %w( src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c )
+ s.files += %w( src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.h )
s.files += %w( src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c )
s.files += %w( src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h )
s.files += %w( src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c )
@@ -716,6 +734,7 @@ Gem::Specification.new do |s|
s.files += %w( src/core/lib/avl/avl.h )
s.files += %w( src/core/lib/backoff/backoff.cc )
s.files += %w( src/core/lib/backoff/backoff.h )
+ s.files += %w( src/core/lib/channel/call_tracer.h )
s.files += %w( src/core/lib/channel/channel_args.cc )
s.files += %w( src/core/lib/channel/channel_args.h )
s.files += %w( src/core/lib/channel/channel_stack.cc )
@@ -761,12 +780,10 @@ Gem::Specification.new do |s|
s.files += %w( src/core/lib/event_engine/endpoint_config.cc )
s.files += %w( src/core/lib/event_engine/endpoint_config_internal.h )
s.files += %w( src/core/lib/event_engine/event_engine.cc )
- s.files += %w( src/core/lib/event_engine/slice_allocator.cc )
s.files += %w( src/core/lib/event_engine/sockaddr.cc )
s.files += %w( src/core/lib/event_engine/sockaddr.h )
s.files += %w( src/core/lib/gpr/alloc.cc )
s.files += %w( src/core/lib/gpr/alloc.h )
- s.files += %w( src/core/lib/gpr/arena.h )
s.files += %w( src/core/lib/gpr/atm.cc )
s.files += %w( src/core/lib/gpr/cpu_iphone.cc )
s.files += %w( src/core/lib/gpr/cpu_linux.cc )
diff --git a/grpc.gyp b/grpc.gyp
index 8a59392f55..29ede20c9d 100644
--- a/grpc.gyp
+++ b/grpc.gyp
@@ -239,18 +239,22 @@
'test/core/end2end/tests/resource_quota_server.cc',
'test/core/end2end/tests/retry.cc',
'test/core/end2end/tests/retry_cancel_during_delay.cc',
+ 'test/core/end2end/tests/retry_cancel_with_multiple_send_batches.cc',
'test/core/end2end/tests/retry_cancellation.cc',
'test/core/end2end/tests/retry_disabled.cc',
'test/core/end2end/tests/retry_exceeds_buffer_size_in_delay.cc',
'test/core/end2end/tests/retry_exceeds_buffer_size_in_initial_batch.cc',
'test/core/end2end/tests/retry_exceeds_buffer_size_in_subsequent_batch.cc',
'test/core/end2end/tests/retry_lb_drop.cc',
+ 'test/core/end2end/tests/retry_lb_fail.cc',
'test/core/end2end/tests/retry_non_retriable_status.cc',
'test/core/end2end/tests/retry_non_retriable_status_before_recv_trailing_metadata_started.cc',
'test/core/end2end/tests/retry_per_attempt_recv_timeout.cc',
+ 'test/core/end2end/tests/retry_per_attempt_recv_timeout_on_last_attempt.cc',
'test/core/end2end/tests/retry_recv_initial_metadata.cc',
'test/core/end2end/tests/retry_recv_message.cc',
'test/core/end2end/tests/retry_recv_trailing_metadata_error.cc',
+ 'test/core/end2end/tests/retry_send_initial_metadata_refs.cc',
'test/core/end2end/tests/retry_send_op_fails.cc',
'test/core/end2end/tests/retry_server_pushback_delay.cc',
'test/core/end2end/tests/retry_server_pushback_disabled.cc',
@@ -345,18 +349,22 @@
'test/core/end2end/tests/resource_quota_server.cc',
'test/core/end2end/tests/retry.cc',
'test/core/end2end/tests/retry_cancel_during_delay.cc',
+ 'test/core/end2end/tests/retry_cancel_with_multiple_send_batches.cc',
'test/core/end2end/tests/retry_cancellation.cc',
'test/core/end2end/tests/retry_disabled.cc',
'test/core/end2end/tests/retry_exceeds_buffer_size_in_delay.cc',
'test/core/end2end/tests/retry_exceeds_buffer_size_in_initial_batch.cc',
'test/core/end2end/tests/retry_exceeds_buffer_size_in_subsequent_batch.cc',
'test/core/end2end/tests/retry_lb_drop.cc',
+ 'test/core/end2end/tests/retry_lb_fail.cc',
'test/core/end2end/tests/retry_non_retriable_status.cc',
'test/core/end2end/tests/retry_non_retriable_status_before_recv_trailing_metadata_started.cc',
'test/core/end2end/tests/retry_per_attempt_recv_timeout.cc',
+ 'test/core/end2end/tests/retry_per_attempt_recv_timeout_on_last_attempt.cc',
'test/core/end2end/tests/retry_recv_initial_metadata.cc',
'test/core/end2end/tests/retry_recv_message.cc',
'test/core/end2end/tests/retry_recv_trailing_metadata_error.cc',
+ 'test/core/end2end/tests/retry_send_initial_metadata_refs.cc',
'test/core/end2end/tests/retry_send_op_fails.cc',
'test/core/end2end/tests/retry_server_pushback_delay.cc',
'test/core/end2end/tests/retry_server_pushback_disabled.cc',
@@ -389,8 +397,10 @@
'type': 'static_library',
'dependencies': [
'absl/base:base',
+ 'absl/base:core_headers',
'absl/memory:memory',
'absl/status:status',
+ 'absl/strings:cord',
'absl/strings:str_format',
'absl/strings:strings',
'absl/synchronization:synchronization',
@@ -560,6 +570,7 @@
'src/core/ext/transport/chttp2/transport/bin_decoder.cc',
'src/core/ext/transport/chttp2/transport/bin_encoder.cc',
'src/core/ext/transport/chttp2/transport/chttp2_plugin.cc',
+ 'src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc',
'src/core/ext/transport/chttp2/transport/chttp2_transport.cc',
'src/core/ext/transport/chttp2/transport/context_list.cc',
'src/core/ext/transport/chttp2/transport/flow_control.cc',
@@ -602,14 +613,17 @@
'src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c',
'src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c',
'src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c',
+ 'src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c',
'src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c',
'src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c',
+ 'src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c',
'src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c',
'src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c',
'src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c',
'src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c',
'src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c',
'src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c',
+ 'src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c',
'src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c',
'src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c',
'src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c',
@@ -636,6 +650,7 @@
'src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c',
'src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c',
'src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c',
+ 'src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c',
'src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c',
'src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c',
'src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c',
@@ -689,14 +704,17 @@
'src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c',
@@ -722,6 +740,7 @@
'src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c',
@@ -795,7 +814,6 @@
'src/core/lib/debug/trace.cc',
'src/core/lib/event_engine/endpoint_config.cc',
'src/core/lib/event_engine/event_engine.cc',
- 'src/core/lib/event_engine/slice_allocator.cc',
'src/core/lib/event_engine/sockaddr.cc',
'src/core/lib/http/format_request.cc',
'src/core/lib/http/httpcli.cc',
@@ -1203,6 +1221,7 @@
'src/core/ext/transport/chttp2/transport/bin_decoder.cc',
'src/core/ext/transport/chttp2/transport/bin_encoder.cc',
'src/core/ext/transport/chttp2/transport/chttp2_plugin.cc',
+ 'src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc',
'src/core/ext/transport/chttp2/transport/chttp2_transport.cc',
'src/core/ext/transport/chttp2/transport/context_list.cc',
'src/core/ext/transport/chttp2/transport/flow_control.cc',
@@ -1255,7 +1274,6 @@
'src/core/lib/debug/trace.cc',
'src/core/lib/event_engine/endpoint_config.cc',
'src/core/lib/event_engine/event_engine.cc',
- 'src/core/lib/event_engine/slice_allocator.cc',
'src/core/lib/event_engine/sockaddr.cc',
'src/core/lib/http/format_request.cc',
'src/core/lib/http/httpcli.cc',
diff --git a/include/grpc/event_engine/event_engine.h b/include/grpc/event_engine/event_engine.h
index af932aeb43..1fa8e43a5f 100644
--- a/include/grpc/event_engine/event_engine.h
+++ b/include/grpc/event_engine/event_engine.h
@@ -80,7 +80,7 @@ class EventEngine {
using Callback = std::function<void(absl::Status)>;
/// A callback handle, used to cancel a callback.
struct TaskHandle {
- intptr_t key;
+ intptr_t keys[2];
};
/// A thin wrapper around a platform-specific sockaddr type. A sockaddr struct
/// exists on all platforms that gRPC supports.
@@ -127,10 +127,8 @@ class EventEngine {
///
/// For failed read operations, implementations should pass the appropriate
/// statuses to \a on_read. For example, callbacks might expect to receive
- /// DEADLINE_EXCEEDED when the deadline is exceeded, and CANCELLED on
- /// endpoint shutdown.
- virtual void Read(Callback on_read, SliceBuffer* buffer,
- absl::Time deadline) = 0;
+ /// CANCELLED on endpoint shutdown.
+ virtual void Read(Callback on_read, SliceBuffer* buffer) = 0;
/// Write data out on the connection.
///
/// \a on_writable is called when the connection is ready for more data. The
@@ -140,15 +138,13 @@ class EventEngine {
///
/// For failed write operations, implementations should pass the appropriate
/// statuses to \a on_writable. For example, callbacks might expect to
- /// receive DEADLINE_EXCEEDED when the deadline is exceeded, and CANCELLED
- /// on endpoint shutdown.
- virtual void Write(Callback on_writable, SliceBuffer* data,
- absl::Time deadline) = 0;
+ /// receive CANCELLED on endpoint shutdown.
+ virtual void Write(Callback on_writable, SliceBuffer* data) = 0;
/// These methods return an address in the format described in DNSResolver.
/// The returned values are owned by the Endpoint and are expected to remain
/// valid for the life of the Endpoint.
- virtual const ResolvedAddress* GetPeerAddress() const = 0;
- virtual const ResolvedAddress* GetLocalAddress() const = 0;
+ virtual const ResolvedAddress& GetPeerAddress() const = 0;
+ virtual const ResolvedAddress& GetLocalAddress() const = 0;
};
/// Called when a new connection is established.
@@ -197,7 +193,7 @@ class EventEngine {
virtual absl::StatusOr<std::unique_ptr<Listener>> CreateListener(
Listener::AcceptCallback on_accept, Callback on_shutdown,
const EndpointConfig& args,
- SliceAllocatorFactory slice_allocator_factory) = 0;
+ std::unique_ptr<SliceAllocatorFactory> slice_allocator_factory) = 0;
/// Creates a client network connection to a remote network listener.
///
/// \a Connect may return an error status immediately if there was a failure
@@ -214,7 +210,7 @@ class EventEngine {
virtual absl::Status Connect(OnConnectCallback on_connect,
const ResolvedAddress& addr,
const EndpointConfig& args,
- SliceAllocator slice_allocator,
+ std::unique_ptr<SliceAllocator> slice_allocator,
absl::Time deadline) = 0;
/// The DNSResolver that provides asynchronous resolution.
@@ -222,7 +218,7 @@ class EventEngine {
public:
/// A task handle for DNS Resolution requests.
struct LookupTaskHandle {
- intptr_t key;
+ intptr_t key[2];
};
/// A DNS SRV record type.
struct SRVRecord {
diff --git a/include/grpc/event_engine/slice_allocator.h b/include/grpc/event_engine/slice_allocator.h
index f752541117..96c1d17806 100644
--- a/include/grpc/event_engine/slice_allocator.h
+++ b/include/grpc/event_engine/slice_allocator.h
@@ -37,18 +37,8 @@ class SliceBuffer {
class SliceAllocator {
public:
- // gRPC-internal constructor
- explicit SliceAllocator(grpc_resource_user* user);
- // Not copyable
- SliceAllocator(SliceAllocator& other) = delete;
- SliceAllocator& operator=(const SliceAllocator& other) = delete;
- // Moveable
- SliceAllocator(SliceAllocator&& other) noexcept;
- SliceAllocator& operator=(SliceAllocator&& other) noexcept;
- ~SliceAllocator();
-
- using AllocateCallback =
- std::function<void(absl::Status, SliceBuffer* buffer)>;
+ using AllocateCallback = std::function<void(absl::Status)>;
+ virtual ~SliceAllocator() = default;
/// Requests \a size bytes from gRPC, and populates \a dest with the allocated
/// slices. Ownership of the \a SliceBuffer is not transferred.
///
@@ -57,32 +47,17 @@ class SliceAllocator {
/// interrupted to attempt to reclaim memory from participating gRPC
/// internals. When there is sufficient memory available, slice allocation
/// proceeds as normal.
- absl::Status Allocate(size_t size, SliceBuffer* dest,
- SliceAllocator::AllocateCallback cb);
-
- private:
- grpc_resource_user* resource_user_;
+ virtual absl::Status Allocate(size_t size, SliceBuffer* dest,
+ SliceAllocator::AllocateCallback cb) = 0;
};
class SliceAllocatorFactory {
public:
- // gRPC-internal constructor
- explicit SliceAllocatorFactory(grpc_resource_quota* quota);
- // Not copyable
- SliceAllocatorFactory(SliceAllocatorFactory& other) = delete;
- SliceAllocatorFactory& operator=(const SliceAllocatorFactory& other) = delete;
- // Moveable
- SliceAllocatorFactory(SliceAllocatorFactory&& other) noexcept;
- SliceAllocatorFactory& operator=(SliceAllocatorFactory&& other) noexcept;
- ~SliceAllocatorFactory();
-
+ virtual ~SliceAllocatorFactory() = default;
/// On Endpoint creation, call \a CreateSliceAllocator with the name of the
- /// endpoint peer (a URI string, most likely). Note: \a peer_name must outlive
- /// the Endpoint.
- SliceAllocator CreateSliceAllocator(absl::string_view peer_name);
-
- private:
- grpc_resource_quota* resource_quota_;
+ /// endpoint peer (a URI string, most likely).
+ virtual std::unique_ptr<SliceAllocator> CreateSliceAllocator(
+ absl::string_view peer_name) = 0;
};
} // namespace experimental
diff --git a/include/grpc/impl/codegen/grpc_types.h b/include/grpc/impl/codegen/grpc_types.h
index cf909b6377..4f33acf85a 100644
--- a/include/grpc/impl/codegen/grpc_types.h
+++ b/include/grpc/impl/codegen/grpc_types.h
@@ -384,12 +384,26 @@ typedef struct {
Defaults to "blend". In the current implementation "blend" is equivalent to
"latency". */
#define GRPC_ARG_OPTIMIZATION_TARGET "grpc.optimization_target"
-/** If set to zero, disables retry behavior. Otherwise, transparent retries
- are enabled for all RPCs, and configurable retries are enabled when they
- are configured via the service config. For details, see:
+/** Enables retry functionality. Defaults to true. When enabled,
+ configurable retries are enabled when they are configured via the
+ service config. For details, see:
https://github.com/grpc/proposal/blob/master/A6-client-retries.md
+ NOTE: Transparent retries are not yet implemented. When they are
+ implemented, they will also be enabled by this arg.
+ NOTE: Hedging functionality is not yet implemented, so those
+ fields in the service config will currently be ignored. See
+ also the GRPC_ARG_EXPERIMENTAL_ENABLE_HEDGING arg below.
*/
#define GRPC_ARG_ENABLE_RETRIES "grpc.enable_retries"
+/** Enables hedging functionality, as described in:
+ https://github.com/grpc/proposal/blob/master/A6-client-retries.md
+ Default is currently false, since this functionality is not yet
+ fully implemented.
+ NOTE: This channel arg is experimental and will eventually be removed.
+ Once hedging functionality has been implemented and proves stable,
+ this arg will be removed, and the hedging functionality will
+ be enabled via the GRPC_ARG_ENABLE_RETRIES arg above. */
+#define GRPC_ARG_EXPERIMENTAL_ENABLE_HEDGING "grpc.experimental.enable_hedging"
/** Per-RPC retry buffer size, in bytes. Default is 256 KiB. */
#define GRPC_ARG_PER_RPC_RETRY_BUFFER_SIZE "grpc.per_rpc_retry_buffer_size"
/** Channel arg that carries the bridged objective c object for custom metrics
@@ -495,6 +509,7 @@ typedef enum grpc_call_error {
(GRPC_WRITE_BUFFER_HINT | GRPC_WRITE_NO_COMPRESS | GRPC_WRITE_THROUGH)
/** Initial metadata flags */
+/** These flags are to be passed to the `grpc_op::flags` field */
/** Signal that the call is idempotent */
#define GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST (0x00000010u)
/** Signal that the call should not return UNAVAILABLE before it has started */
@@ -522,8 +537,6 @@ typedef struct grpc_metadata {
grpc_slice key;
grpc_slice value;
- uint32_t flags;
-
/** The following fields are reserved for grpc internal use.
There is no need to initialize them, and they will be set to garbage
during calls to grpc. */
@@ -770,9 +783,6 @@ typedef struct grpc_completion_queue_functor {
struct grpc_completion_queue_functor* internal_next;
} grpc_completion_queue_functor;
-typedef grpc_completion_queue_functor
- grpc_experimental_completion_queue_functor;
-
#define GRPC_CQ_CURRENT_VERSION 2
#define GRPC_CQ_VERSION_MINIMUM_FOR_CALLBACKABLE 2
typedef struct grpc_completion_queue_attributes {
diff --git a/include/grpc/impl/codegen/port_platform.h b/include/grpc/impl/codegen/port_platform.h
index 23d2fe4fea..cf7f873884 100644
--- a/include/grpc/impl/codegen/port_platform.h
+++ b/include/grpc/impl/codegen/port_platform.h
@@ -566,6 +566,14 @@ typedef unsigned __int64 uint64_t;
#define CENSUSAPI GRPCAPI
#endif
+#ifndef GPR_HAS_CPP_ATTRIBUTE
+#ifdef __has_cpp_attribute
+#define GPR_HAS_CPP_ATTRIBUTE(a) __has_cpp_attribute(a)
+#else
+#define GPR_HAS_CPP_ATTRIBUTE(a) 0
+#endif
+#endif /* GPR_HAS_CPP_ATTRIBUTE */
+
#ifndef GPR_HAS_ATTRIBUTE
#ifdef __has_attribute
#define GPR_HAS_ATTRIBUTE(a) __has_attribute(a)
@@ -591,6 +599,22 @@ typedef unsigned __int64 uint64_t;
#endif
#endif /* GPR_ATTRIBUTE_NOINLINE */
+#ifndef GPR_NO_UNIQUE_ADDRESS
+#if GPR_HAS_CPP_ATTRIBUTE(no_unique_address)
+#define GPR_NO_UNIQUE_ADDRESS [[no_unique_address]]
+#else
+#define GPR_NO_UNIQUE_ADDRESS
+#endif
+#endif /* GPR_NO_UNIQUE_ADDRESS */
+
+#ifndef GRPC_DEPRECATED
+#if GPR_HAS_CPP_ATTRIBUTE(deprecated)
+#define GRPC_DEPRECATED(reason) [[deprecated(reason)]]
+#else
+#define GRPC_DEPRECATED(reason)
+#endif
+#endif /* GRPC_DEPRECATED */
+
#ifndef GPR_ATTRIBUTE_WEAK
/* Attribute weak is broken on LLVM/windows:
* https://bugs.llvm.org/show_bug.cgi?id=37598 */
diff --git a/include/grpcpp/impl/codegen/channel_interface.h b/include/grpcpp/impl/codegen/channel_interface.h
index 324c10d17d..ac82e2f650 100644
--- a/include/grpcpp/impl/codegen/channel_interface.h
+++ b/include/grpcpp/impl/codegen/channel_interface.h
@@ -156,7 +156,6 @@ class ChannelInterface {
return internal::Call();
}
- // EXPERIMENTAL
// A method to get the callbackable completion queue associated with this
// channel. If the return value is nullptr, this channel doesn't support
// callback operations.
diff --git a/include/grpcpp/impl/codegen/client_callback.h b/include/grpcpp/impl/codegen/client_callback.h
index 7d38ea5ca2..dea0cae492 100644
--- a/include/grpcpp/impl/codegen/client_callback.h
+++ b/include/grpcpp/impl/codegen/client_callback.h
@@ -1226,32 +1226,5 @@ class ClientCallbackUnaryFactory {
};
} // namespace internal
-
-// TODO(vjpai): Remove namespace experimental when de-experimentalized fully.
-namespace experimental {
-
-template <class Response>
-using ClientCallbackReader = ::grpc::ClientCallbackReader<Response>;
-
-template <class Request>
-using ClientCallbackWriter = ::grpc::ClientCallbackWriter<Request>;
-
-template <class Request, class Response>
-using ClientCallbackReaderWriter =
- ::grpc::ClientCallbackReaderWriter<Request, Response>;
-
-template <class Response>
-using ClientReadReactor = ::grpc::ClientReadReactor<Response>;
-
-template <class Request>
-using ClientWriteReactor = ::grpc::ClientWriteReactor<Request>;
-
-template <class Request, class Response>
-using ClientBidiReactor = ::grpc::ClientBidiReactor<Request, Response>;
-
-typedef ::grpc::ClientUnaryReactor ClientUnaryReactor;
-
-} // namespace experimental
-
} // namespace grpc
#endif // GRPCPP_IMPL_CODEGEN_CLIENT_CALLBACK_H
diff --git a/include/grpcpp/impl/codegen/client_context.h b/include/grpcpp/impl/codegen/client_context.h
index c4df62aa8c..761259c9b2 100644
--- a/include/grpcpp/impl/codegen/client_context.h
+++ b/include/grpcpp/impl/codegen/client_context.h
@@ -224,11 +224,16 @@ class ClientContext {
/// must end in "-bin".
///
/// Metadata must conform to the following format:
- /// Custom-Metadata -> Binary-Header / ASCII-Header
- /// Binary-Header -> {Header-Name "-bin" } {binary value}
- /// ASCII-Header -> Header-Name ASCII-Value
- /// Header-Name -> 1*( %x30-39 / %x61-7A / "_" / "-" / ".") ; 0-9 a-z _ - .
- /// ASCII-Value -> 1*( %x20-%x7E ) ; space and printable ASCII
+ /**
+ \verbatim
+ Custom-Metadata -> Binary-Header / ASCII-Header
+ Binary-Header -> {Header-Name "-bin" } {binary value}
+ ASCII-Header -> Header-Name ASCII-Value
+ Header-Name -> 1*( %x30-39 / %x61-7A / "_" / "-" / ".") ; 0-9 a-z _ - .
+ ASCII-Value -> 1*( %x20-%x7E ) ; space and printable ASCII
+ Custom-Metadata -> Binary-Header / ASCII-Header
+ \endverbatim
+ **/
void AddMetadata(const std::string& meta_key, const std::string& meta_value);
/// Return a collection of initial metadata key-value pairs. Note that keys
diff --git a/include/grpcpp/impl/codegen/server_callback.h b/include/grpcpp/impl/codegen/server_callback.h
index 513213da14..70b4a36a3d 100644
--- a/include/grpcpp/impl/codegen/server_callback.h
+++ b/include/grpcpp/impl/codegen/server_callback.h
@@ -783,20 +783,13 @@ using UnimplementedBidiReactor =
} // namespace internal
-// TODO(vjpai): Remove namespace experimental when de-experimentalized fully.
+// TODO(vjpai): Remove namespace experimental when last known users are migrated
+// off.
namespace experimental {
-template <class Request>
-using ServerReadReactor = ::grpc::ServerReadReactor<Request>;
-
-template <class Response>
-using ServerWriteReactor = ::grpc::ServerWriteReactor<Response>;
-
template <class Request, class Response>
using ServerBidiReactor = ::grpc::ServerBidiReactor<Request, Response>;
-using ServerUnaryReactor = ::grpc::ServerUnaryReactor;
-
} // namespace experimental
} // namespace grpc
diff --git a/include/grpcpp/impl/codegen/server_context.h b/include/grpcpp/impl/codegen/server_context.h
index 3eaee7541c..9cb645538a 100644
--- a/include/grpcpp/impl/codegen/server_context.h
+++ b/include/grpcpp/impl/codegen/server_context.h
@@ -101,15 +101,6 @@ class GenericServerContext;
class Server;
class ServerInterface;
class ContextAllocator;
-
-// TODO(vjpai): Remove namespace experimental when de-experimentalized fully.
-namespace experimental {
-
-typedef ::grpc::ServerContextBase ServerContextBase;
-typedef ::grpc::CallbackServerContext CallbackServerContext;
-
-} // namespace experimental
-
class GenericCallbackServerContext;
namespace internal {
@@ -122,7 +113,7 @@ class ServerContextTestSpouse;
class DefaultReactorTestPeer;
} // namespace testing
-/// Base class of ServerContext. Experimental until callback API is final.
+/// Base class of ServerContext.
class ServerContextBase {
public:
virtual ~ServerContextBase();
@@ -149,11 +140,15 @@ class ServerContextBase {
/// must end in "-bin".
///
/// Metadata must conform to the following format:
- /// Custom-Metadata -> Binary-Header / ASCII-Header
- /// Binary-Header -> {Header-Name "-bin" } {binary value}
- /// ASCII-Header -> Header-Name ASCII-Value
- /// Header-Name -> 1*( %x30-39 / %x61-7A / "_" / "-" / ".") ; 0-9 a-z _ - .
- /// ASCII-Value -> 1*( %x20-%x7E ) ; space and printable ASCII
+ /**
+ \verbatim
+ Custom-Metadata -> Binary-Header / ASCII-Header
+ Binary-Header -> {Header-Name "-bin" } {binary value}
+ ASCII-Header -> Header-Name ASCII-Value
+ Header-Name -> 1*( %x30-39 / %x61-7A / "_" / "-" / ".") ; 0-9 a-z _ - .
+ ASCII-Value -> 1*( %x20-%x7E ) ; space and printable ASCII
+ \endverbatim
+ **/
void AddInitialMetadata(const std::string& key, const std::string& value);
/// Add the (\a key, \a value) pair to the initial metadata
@@ -170,11 +165,15 @@ class ServerContextBase {
/// must end in "-bin".
///
/// Metadata must conform to the following format:
- /// Custom-Metadata -> Binary-Header / ASCII-Header
- /// Binary-Header -> {Header-Name "-bin" } {binary value}
- /// ASCII-Header -> Header-Name ASCII-Value
- /// Header-Name -> 1*( %x30-39 / %x61-7A / "_" / "-" / ".") ; 0-9 a-z _ - .
- /// ASCII-Value -> 1*( %x20-%x7E ) ; space and printable ASCII
+ /**
+ \verbatim
+ Custom-Metadata -> Binary-Header / ASCII-Header
+ Binary-Header -> {Header-Name "-bin" } {binary value}
+ ASCII-Header -> Header-Name ASCII-Value
+ Header-Name -> 1*( %x30-39 / %x61-7A / "_" / "-" / ".") ; 0-9 a-z _ - .
+ ASCII-Value -> 1*( %x20-%x7E ) ; space and printable ASCII
+ \endverbatim
+ **/
void AddTrailingMetadata(const std::string& key, const std::string& value);
/// Return whether this RPC failed before the server could provide its status
@@ -310,8 +309,6 @@ class ServerContextBase {
///
/// This method should not be called more than once or called after return
/// from the method handler.
- ///
- /// WARNING: This is experimental API and could be changed or removed.
::grpc::ServerUnaryReactor* DefaultReactor() {
// Short-circuit the case where a default reactor was already set up by
// the TestPeer.
diff --git a/include/grpcpp/impl/codegen/server_interface.h b/include/grpcpp/impl/codegen/server_interface.h
index ac87b276cd..0cea47ee37 100644
--- a/include/grpcpp/impl/codegen/server_interface.h
+++ b/include/grpcpp/impl/codegen/server_interface.h
@@ -354,7 +354,6 @@ class ServerInterface : public internal::CallHook {
return nullptr;
}
- // EXPERIMENTAL
// A method to get the callbackable completion queue associated with this
// server. If the return value is nullptr, this server doesn't support
// callback operations.
diff --git a/include/grpcpp/impl/codegen/sync.h b/include/grpcpp/impl/codegen/sync.h
index 0c4effe4b0..1f4e4aac58 100644
--- a/include/grpcpp/impl/codegen/sync.h
+++ b/include/grpcpp/impl/codegen/sync.h
@@ -46,7 +46,7 @@
namespace grpc {
namespace internal {
-#ifdef GRPCPP_ABSEIL_SYNC
+#ifdef GPR_ABSEIL_SYNC
using Mutex = absl::Mutex;
using MutexLock = absl::MutexLock;
@@ -141,9 +141,10 @@ class CondVar {
gpr_cv cv_;
};
-#endif // GRPCPP_ABSEIL_SYNC
+#endif // GPR_ABSEIL_SYNC
template <typename Predicate>
+GRPC_DEPRECATED("incompatible with thread safety analysis")
static void WaitUntil(CondVar* cv, Mutex* mu, Predicate pred) {
while (!pred()) {
cv->Wait(mu);
diff --git a/include/grpcpp/test/default_reactor_test_peer.h b/include/grpcpp/test/default_reactor_test_peer.h
index a792e6f94a..4d4ae5c39d 100644
--- a/include/grpcpp/test/default_reactor_test_peer.h
+++ b/include/grpcpp/test/default_reactor_test_peer.h
@@ -34,22 +34,21 @@ namespace testing {
/// test mode rather than letting it follow the normal paths.
class DefaultReactorTestPeer {
public:
- explicit DefaultReactorTestPeer(experimental::CallbackServerContext* ctx)
- : DefaultReactorTestPeer(ctx, [](::grpc::Status) {}) {}
- DefaultReactorTestPeer(experimental::CallbackServerContext* ctx,
- std::function<void(::grpc::Status)> finish_func)
+ explicit DefaultReactorTestPeer(CallbackServerContext* ctx)
+ : DefaultReactorTestPeer(ctx, [](Status) {}) {}
+ DefaultReactorTestPeer(CallbackServerContext* ctx,
+ std::function<void(Status)> finish_func)
: ctx_(ctx) {
ctx->SetupTestDefaultReactor(std::move(finish_func));
}
- ::grpc::experimental::ServerUnaryReactor* reactor() const {
- return reinterpret_cast<experimental::ServerUnaryReactor*>(
- &ctx_->default_reactor_);
+ ServerUnaryReactor* reactor() const {
+ return reinterpret_cast<ServerUnaryReactor*>(&ctx_->default_reactor_);
}
bool test_status_set() const { return ctx_->test_status_set(); }
Status test_status() const { return ctx_->test_status(); }
private:
- experimental::CallbackServerContext* const ctx_; // not owned
+ CallbackServerContext* const ctx_; // not owned
};
} // namespace testing
diff --git a/package.xml b/package.xml
index 4327707d3b..ce6ba71d32 100644
--- a/package.xml
+++ b/package.xml
@@ -13,8 +13,8 @@
<date>2019-09-24</date>
<time>16:06:07</time>
<version>
- <release>1.39.1</release>
- <api>1.39.1</api>
+ <release>1.40.0</release>
+ <api>1.40.0</api>
</version>
<stability>
<release>stable</release>
@@ -22,7 +22,7 @@
</stability>
<license>Apache 2.0</license>
<notes>
-- gRPC Core 1.39.1 update
+- gRPC Core 1.40.0 update
</notes>
<contents>
<dir baseinstalldir="/" name="/">
@@ -245,6 +245,8 @@
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/transport/bin_encoder.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/transport/bin_encoder.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/transport/chttp2_plugin.cc" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/transport/chttp2_transport.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/transport/chttp2_transport.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/transport/context_list.cc" role="src" />
@@ -327,10 +329,14 @@
<file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c" role="src" />
@@ -343,6 +349,8 @@
<file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c" role="src" />
@@ -395,6 +403,8 @@
<file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c" role="src" />
@@ -525,10 +535,14 @@
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c" role="src" />
@@ -541,6 +555,8 @@
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c" role="src" />
@@ -591,6 +607,8 @@
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c" role="src" />
@@ -696,6 +714,7 @@
<file baseinstalldir="/" name="src/core/lib/avl/avl.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/backoff/backoff.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/backoff/backoff.h" role="src" />
+ <file baseinstalldir="/" name="src/core/lib/channel/call_tracer.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/channel/channel_args.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/channel/channel_args.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/channel/channel_stack.cc" role="src" />
@@ -741,12 +760,10 @@
<file baseinstalldir="/" name="src/core/lib/event_engine/endpoint_config.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/event_engine/endpoint_config_internal.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/event_engine/event_engine.cc" role="src" />
- <file baseinstalldir="/" name="src/core/lib/event_engine/slice_allocator.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/event_engine/sockaddr.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/event_engine/sockaddr.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/gpr/alloc.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/gpr/alloc.h" role="src" />
- <file baseinstalldir="/" name="src/core/lib/gpr/arena.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/gpr/atm.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/gpr/cpu_iphone.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/gpr/cpu_linux.cc" role="src" />
diff --git a/setup.py b/setup.py
index 4aad42e1ea..65c7c373f2 100644
--- a/setup.py
+++ b/setup.py
@@ -15,11 +15,12 @@
# setuptools need to be imported before distutils. Otherwise it might lead to
# undesirable behaviors or errors.
-import setuptools
+import setuptools # isort:skip
# Monkey Patch the unix compiler to accept ASM
# files used by boring SSL.
from distutils.unixccompiler import UnixCCompiler
+
UnixCCompiler.src_extensions.append('.S')
del UnixCCompiler
@@ -28,20 +29,18 @@ from distutils import extension as _extension
from distutils import util
import os
import os.path
-import pkg_resources
import platform
import re
import shlex
import shutil
-import sys
-import sysconfig
-
-from setuptools.command import egg_info
-
import subprocess
from subprocess import PIPE
+import sys
+import sysconfig
import _metadata
+import pkg_resources
+from setuptools.command import egg_info
# Redirect the manifest template from MANIFEST.in to PYTHON-MANIFEST.in.
egg_info.manifest_maker.template = 'PYTHON-MANIFEST.in'
@@ -86,8 +85,9 @@ sys.path.insert(0, os.path.abspath(PYTHON_STEM))
# Break import-style to ensure we can actually find our in-repo dependencies.
import _parallel_compile_patch
import _spawn_patch
-import commands
import grpc_core_dependencies
+
+import commands
import grpc_version
_parallel_compile_patch.monkeypatch_compile_maybe()
@@ -98,8 +98,6 @@ LICENSE = 'Apache License 2.0'
CLASSIFIERS = [
'Development Status :: 5 - Production/Stable',
'Programming Language :: Python',
- 'Programming Language :: Python :: 2',
- 'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
diff --git a/src/android/test/interop/README.md b/src/android/test/interop/README.md
index 95262307eb..e399dab078 100644
--- a/src/android/test/interop/README.md
+++ b/src/android/test/interop/README.md
@@ -2,7 +2,7 @@ gRPC on Android
==============
Note: Building the protobuf dependency for Android requires
-https://github.com/google/protobuf/pull/3878. This fix will be in the next
+https://github.com/protocolbuffers/protobuf/pull/3878. This fix will be in the next
protobuf release, but until then must be manually patched in to
`third_party/protobuf` to build gRPC for Android.
diff --git a/src/compiler/cpp_generator.cc b/src/compiler/cpp_generator.cc
index 13d65d9d1c..37178d9093 100644
--- a/src/compiler/cpp_generator.cc
+++ b/src/compiler/cpp_generator.cc
@@ -1365,7 +1365,7 @@ void PrintHeaderService(grpc_generator::Printer* printer,
}
PrintHeaderClientMethodCallbackInterfacesEnd(printer, vars);
printer->Outdent();
- printer->Print("private:\n");
+ printer->Print(" private:\n");
printer->Indent();
for (int i = 0; i < service->method_count(); ++i) {
PrintHeaderClientMethodInterfaces(printer, service->method(i).get(), vars,
diff --git a/src/compiler/csharp_generator.cc b/src/compiler/csharp_generator.cc
index 9c9830ef57..21968c665f 100644
--- a/src/compiler/csharp_generator.cc
+++ b/src/compiler/csharp_generator.cc
@@ -38,7 +38,7 @@ namespace grpc_csharp_generator {
namespace {
// This function is a massaged version of
-// https://github.com/google/protobuf/blob/master/src/google/protobuf/compiler/csharp/csharp_doc_comment.cc
+// https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/compiler/csharp/csharp_doc_comment.cc
// Currently, we cannot easily reuse the functionality as
// google/protobuf/compiler/csharp/csharp_doc_comment.h is not a public header.
// TODO(jtattermusch): reuse the functionality from google/protobuf.
diff --git a/src/compiler/objective_c_generator_helpers.h b/src/compiler/objective_c_generator_helpers.h
index b372e24deb..f9320f06eb 100644
--- a/src/compiler/objective_c_generator_helpers.h
+++ b/src/compiler/objective_c_generator_helpers.h
@@ -37,7 +37,7 @@ inline string MessageHeaderName(const FileDescriptor* file) {
inline string ServiceClassName(const ServiceDescriptor* service) {
const FileDescriptor* file = service->file();
- string prefix = file->options().objc_class_prefix();
+ string prefix = google::protobuf::compiler::objectivec::FileClassPrefix(file);
return prefix + service->name();
}
diff --git a/src/compiler/python_generator.h b/src/compiler/python_generator.h
index 9480796828..12343ccde1 100644
--- a/src/compiler/python_generator.h
+++ b/src/compiler/python_generator.h
@@ -34,7 +34,7 @@ struct GeneratorConfiguration {
std::string grpc_package_root;
// TODO(https://github.com/grpc/grpc/issues/8622): Drop this.
std::string beta_package_root;
- // TODO(https://github.com/google/protobuf/issues/888): Drop this.
+ // TODO(https://github.com/protocolbuffers/protobuf/issues/888): Drop this.
std::string import_prefix;
std::vector<std::string> prefixes_to_filter;
};
diff --git a/src/compiler/python_generator_helpers.h b/src/compiler/python_generator_helpers.h
index 4bdc9383d2..8a5d745432 100644
--- a/src/compiler/python_generator_helpers.h
+++ b/src/compiler/python_generator_helpers.h
@@ -61,7 +61,7 @@ static std::string StripModulePrefixes(
return raw_module_name;
}
-// TODO(https://github.com/google/protobuf/issues/888):
+// TODO(https://github.com/protocolbuffers/protobuf/issues/888):
// Export `ModuleName` from protobuf's
// `src/google/protobuf/compiler/python/python_generator.cc` file.
std::string ModuleName(const std::string& filename,
@@ -74,7 +74,7 @@ std::string ModuleName(const std::string& filename,
prefixes_to_filter);
}
-// TODO(https://github.com/google/protobuf/issues/888):
+// TODO(https://github.com/protocolbuffers/protobuf/issues/888):
// Export `ModuleAlias` from protobuf's
// `src/google/protobuf/compiler/python/python_generator.cc` file.
std::string ModuleAlias(const std::string& filename,
diff --git a/src/compiler/ruby_generator.cc b/src/compiler/ruby_generator.cc
index 2fae61082f..e045c96386 100644
--- a/src/compiler/ruby_generator.cc
+++ b/src/compiler/ruby_generator.cc
@@ -109,7 +109,7 @@ void PrintService(const ServiceDescriptor* service, Printer* out) {
// ruby generator
// to ensure compatibility (with the exception of int and string type changes).
// See
-// https://github.com/google/protobuf/blob/master/src/google/protobuf/compiler/ruby/ruby_generator.cc#L250
+// https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/compiler/ruby/ruby_generator.cc#L250
// TODO: keep up to date with protoc code generation, though this behavior isn't
// expected to change
bool IsLower(char ch) { return ch >= 'a' && ch <= 'z'; }
diff --git a/src/core/ext/filters/client_channel/OWNERS b/src/core/ext/filters/client_channel/OWNERS
index d699bedc52..14a326486e 100644
--- a/src/core/ext/filters/client_channel/OWNERS
+++ b/src/core/ext/filters/client_channel/OWNERS
@@ -1,2 +1,3 @@
set noparent
@markdroth
+
diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc
index 40318cb557..96531d44eb 100644
--- a/src/core/ext/filters/client_channel/client_channel.cc
+++ b/src/core/ext/filters/client_channel/client_channel.cc
@@ -174,9 +174,9 @@ class ClientChannel::CallData {
void MaybeAddCallToResolverQueuedCallsLocked(grpc_call_element* elem)
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&ClientChannel::resolution_mu_);
- static void RecvInitialMetadataReadyForConfigSelectorCommitCallback(
+ static void RecvTrailingMetadataReadyForConfigSelectorCommitCallback(
void* arg, grpc_error_handle error);
- void InjectRecvInitialMetadataReadyForConfigSelectorCommitCallback(
+ void InjectRecvTrailingMetadataReadyForConfigSelectorCommitCallback(
grpc_transport_stream_op_batch* batch);
void CreateDynamicCall(grpc_call_element* elem);
@@ -199,7 +199,7 @@ class ClientChannel::CallData {
grpc_polling_entity* pollent_ = nullptr;
- grpc_closure pick_closure_;
+ grpc_closure resolution_done_closure_;
// Accessed while holding ClientChannel::resolution_mu_.
bool service_config_applied_ ABSL_GUARDED_BY(&ClientChannel::resolution_mu_) =
@@ -211,10 +211,8 @@ class ClientChannel::CallData {
ResolverQueuedCallCanceller* resolver_call_canceller_
ABSL_GUARDED_BY(&ClientChannel::resolution_mu_) = nullptr;
- std::function<void()> on_call_committed_;
-
- grpc_closure* original_recv_initial_metadata_ready_ = nullptr;
- grpc_closure recv_initial_metadata_ready_;
+ grpc_closure* original_recv_trailing_metadata_ready_ = nullptr;
+ grpc_closure recv_trailing_metadata_ready_;
RefCountedPtr<DynamicFilters> dynamic_filters_;
RefCountedPtr<DynamicFilters::Call> dynamic_call_;
@@ -345,13 +343,16 @@ class DynamicTerminationFilter::CallData {
auto* calld = static_cast<CallData*>(elem->call_data);
auto* chand = static_cast<DynamicTerminationFilter*>(elem->channel_data);
ClientChannel* client_channel = chand->chand_;
- grpc_call_element_args args = {
- calld->owning_call_, nullptr,
- calld->call_context_, calld->path_,
- calld->call_start_time_, calld->deadline_,
- calld->arena_, calld->call_combiner_};
- calld->lb_call_ =
- client_channel->CreateLoadBalancedCall(args, pollent, nullptr);
+ grpc_call_element_args args = {calld->owning_call_, nullptr,
+ calld->call_context_, calld->path_,
+ /*start_time=*/0, calld->deadline_,
+ calld->arena_, calld->call_combiner_};
+ auto* service_config_call_data = static_cast<ServiceConfigCallData*>(
+ calld->call_context_[GRPC_CONTEXT_SERVICE_CONFIG_CALL_DATA].value);
+ calld->lb_call_ = client_channel->CreateLoadBalancedCall(
+ args, pollent, nullptr,
+ service_config_call_data->call_dispatch_controller(),
+ /*is_transparent_retry=*/false);
if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
gpr_log(GPR_INFO,
"chand=%p dynamic_termination_calld=%p: create lb_call=%p", chand,
@@ -362,7 +363,6 @@ class DynamicTerminationFilter::CallData {
private:
explicit CallData(const grpc_call_element_args& args)
: path_(grpc_slice_ref_internal(args.path)),
- call_start_time_(args.start_time),
deadline_(args.deadline),
arena_(args.arena),
owning_call_(args.call_stack),
@@ -372,14 +372,13 @@ class DynamicTerminationFilter::CallData {
~CallData() { grpc_slice_unref_internal(path_); }
grpc_slice path_; // Request path.
- gpr_cycle_counter call_start_time_;
grpc_millis deadline_;
Arena* arena_;
grpc_call_stack* owning_call_;
CallCombiner* call_combiner_;
grpc_call_context_element* call_context_;
- RefCountedPtr<ClientChannel::LoadBalancedCall> lb_call_;
+ OrphanablePtr<ClientChannel::LoadBalancedCall> lb_call_;
};
const grpc_channel_filter DynamicTerminationFilter::kFilterVtable = {
@@ -1060,10 +1059,6 @@ void ClientChannel::Destroy(grpc_channel_element* elem) {
namespace {
-bool GetEnableRetries(const grpc_channel_args* args) {
- return grpc_channel_args_find_bool(args, GRPC_ARG_ENABLE_RETRIES, false);
-}
-
RefCountedPtr<SubchannelPoolInterface> GetSubchannelPool(
const grpc_channel_args* args) {
const bool use_local_subchannel_pool = grpc_channel_args_find_bool(
@@ -1085,7 +1080,6 @@ ClientChannel::ClientChannel(grpc_channel_element_args* args,
grpc_error_handle* error)
: deadline_checking_enabled_(
grpc_deadline_checking_enabled(args->channel_args)),
- enable_retries_(GetEnableRetries(args->channel_args)),
owning_stack_(args->channel_stack),
client_channel_factory_(
ClientChannelFactory::GetFromChannelArgs(args->channel_args)),
@@ -1169,12 +1163,15 @@ ClientChannel::~ClientChannel() {
GRPC_ERROR_UNREF(disconnect_error_.Load(MemoryOrder::RELAXED));
}
-RefCountedPtr<ClientChannel::LoadBalancedCall>
+OrphanablePtr<ClientChannel::LoadBalancedCall>
ClientChannel::CreateLoadBalancedCall(
const grpc_call_element_args& args, grpc_polling_entity* pollent,
- grpc_closure* on_call_destruction_complete) {
- return args.arena->New<LoadBalancedCall>(this, args, pollent,
- on_call_destruction_complete);
+ grpc_closure* on_call_destruction_complete,
+ ConfigSelector::CallDispatchController* call_dispatch_controller,
+ bool is_transparent_retry) {
+ return OrphanablePtr<LoadBalancedCall>(args.arena->New<LoadBalancedCall>(
+ this, args, pollent, on_call_destruction_complete,
+ call_dispatch_controller, is_transparent_retry));
}
namespace {
@@ -1359,11 +1356,12 @@ void ClientChannel::OnResolverErrorLocked(grpc_error_handle error) {
grpc_error_handle state_error =
GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
"Resolver transient failure", &error, 1);
+ absl::Status status = grpc_error_to_absl_status(state_error);
{
MutexLock lock(&resolution_mu_);
// Update resolver transient failure.
GRPC_ERROR_UNREF(resolver_transient_failure_error_);
- resolver_transient_failure_error_ = GRPC_ERROR_REF(state_error);
+ resolver_transient_failure_error_ = state_error;
// Process calls that were queued waiting for the resolver result.
for (ResolverQueuedCall* call = resolver_queued_calls_; call != nullptr;
call = call->next) {
@@ -1377,10 +1375,8 @@ void ClientChannel::OnResolverErrorLocked(grpc_error_handle error) {
}
// Update connectivity state.
UpdateStateAndPickerLocked(
- GRPC_CHANNEL_TRANSIENT_FAILURE, grpc_error_to_absl_status(state_error),
- "resolver failure",
- absl::make_unique<LoadBalancingPolicy::TransientFailurePicker>(
- state_error));
+ GRPC_CHANNEL_TRANSIENT_FAILURE, status, "resolver failure",
+ absl::make_unique<LoadBalancingPolicy::TransientFailurePicker>(status));
}
GRPC_ERROR_UNREF(error);
}
@@ -1507,14 +1503,6 @@ void ClientChannel::UpdateServiceConfigInDataPlaneLocked() {
config_selector =
MakeRefCounted<DefaultConfigSelector>(saved_service_config_);
}
- // Construct dynamic filter stack.
- std::vector<const grpc_channel_filter*> filters =
- config_selector->GetFilters();
- if (enable_retries_) {
- filters.push_back(&kRetryFilterVtable);
- } else {
- filters.push_back(&DynamicTerminationFilter::kFilterVtable);
- }
absl::InlinedVector<grpc_arg, 2> args_to_add = {
grpc_channel_arg_pointer_create(
const_cast<char*>(GRPC_ARG_CLIENT_CHANNEL), this,
@@ -1526,6 +1514,16 @@ void ClientChannel::UpdateServiceConfigInDataPlaneLocked() {
grpc_channel_args* new_args = grpc_channel_args_copy_and_add(
channel_args_, args_to_add.data(), args_to_add.size());
new_args = config_selector->ModifyChannelArgs(new_args);
+ bool enable_retries =
+ grpc_channel_args_find_bool(new_args, GRPC_ARG_ENABLE_RETRIES, true);
+ // Construct dynamic filter stack.
+ std::vector<const grpc_channel_filter*> filters =
+ config_selector->GetFilters();
+ if (enable_retries) {
+ filters.push_back(&kRetryFilterVtable);
+ } else {
+ filters.push_back(&DynamicTerminationFilter::kFilterVtable);
+ }
RefCountedPtr<DynamicFilters> dynamic_filters =
DynamicFilters::Create(new_args, std::move(filters));
GPR_ASSERT(dynamic_filters != nullptr);
@@ -1548,6 +1546,15 @@ void ClientChannel::UpdateServiceConfigInDataPlaneLocked() {
// Process calls that were queued waiting for the resolver result.
for (ResolverQueuedCall* call = resolver_queued_calls_; call != nullptr;
call = call->next) {
+ // If there are a lot of queued calls here, resuming them all may cause us
+ // to stay inside C-core for a long period of time. All of that work would
+ // be done using the same ExecCtx instance and therefore the same cached
+ // value of "now". The longer it takes to finish all of this work and exit
+ // from C-core, the more stale the cached value of "now" may become. This
+ // can cause problems whereby (e.g.) we calculate a timer deadline based
+ // on the stale value, which results in the timer firing too early. To
+ // avoid this, we invalidate the cached value for each call we process.
+ ExecCtx::Get()->InvalidateNow();
grpc_call_element* elem = call->elem;
CallData* calld = static_cast<CallData*>(elem->call_data);
grpc_error_handle error = GRPC_ERROR_NONE;
@@ -1660,6 +1667,15 @@ void ClientChannel::UpdateStateAndPickerLocked(
// Re-process queued picks.
for (LbQueuedCall* call = lb_queued_calls_; call != nullptr;
call = call->next) {
+ // If there are a lot of queued calls here, resuming them all may cause us
+ // to stay inside C-core for a long period of time. All of that work would
+ // be done using the same ExecCtx instance and therefore the same cached
+ // value of "now". The longer it takes to finish all of this work and exit
+ // from C-core, the more stale the cached value of "now" may become. This
+ // can cause problems whereby (e.g.) we calculate a timer deadline based
+ // on the stale value, which results in the timer firing too early. To
+ // avoid this, we invalidate the cached value for each call we process.
+ ExecCtx::Get()->InvalidateNow();
grpc_error_handle error = GRPC_ERROR_NONE;
if (call->lb_call->PickSubchannelLocked(&error)) {
call->lb_call->AsyncPickDone(error);
@@ -1671,6 +1687,40 @@ void ClientChannel::UpdateStateAndPickerLocked(
pending_subchannel_updates_.clear();
}
+namespace {
+
+// TODO(roth): Remove this in favor of the gprpp Match() function once
+// we can do that without breaking lock annotations.
+template <typename T>
+T HandlePickResult(
+ LoadBalancingPolicy::PickResult* result,
+ std::function<T(LoadBalancingPolicy::PickResult::Complete*)> complete_func,
+ std::function<T(LoadBalancingPolicy::PickResult::Queue*)> queue_func,
+ std::function<T(LoadBalancingPolicy::PickResult::Fail*)> fail_func,
+ std::function<T(LoadBalancingPolicy::PickResult::Drop*)> drop_func) {
+ auto* complete_pick =
+ absl::get_if<LoadBalancingPolicy::PickResult::Complete>(&result->result);
+ if (complete_pick != nullptr) {
+ return complete_func(complete_pick);
+ }
+ auto* queue_pick =
+ absl::get_if<LoadBalancingPolicy::PickResult::Queue>(&result->result);
+ if (queue_pick != nullptr) {
+ return queue_func(queue_pick);
+ }
+ auto* fail_pick =
+ absl::get_if<LoadBalancingPolicy::PickResult::Fail>(&result->result);
+ if (fail_pick != nullptr) {
+ return fail_func(fail_pick);
+ }
+ auto* drop_pick =
+ absl::get_if<LoadBalancingPolicy::PickResult::Drop>(&result->result);
+ GPR_ASSERT(drop_pick != nullptr);
+ return drop_func(drop_pick);
+}
+
+} // namespace
+
grpc_error_handle ClientChannel::DoPingLocked(grpc_transport_op* op) {
if (state_tracker_.state() != GRPC_CHANNEL_READY) {
return GRPC_ERROR_CREATE_FROM_STATIC_STRING("channel not connected");
@@ -1680,21 +1730,31 @@ grpc_error_handle ClientChannel::DoPingLocked(grpc_transport_op* op) {
MutexLock lock(&data_plane_mu_);
result = picker_->Pick(LoadBalancingPolicy::PickArgs());
}
- ConnectedSubchannel* connected_subchannel = nullptr;
- if (result.subchannel != nullptr) {
- SubchannelWrapper* subchannel =
- static_cast<SubchannelWrapper*>(result.subchannel.get());
- connected_subchannel = subchannel->connected_subchannel();
- }
- if (connected_subchannel != nullptr) {
- connected_subchannel->Ping(op->send_ping.on_initiate, op->send_ping.on_ack);
- } else {
- if (result.error == GRPC_ERROR_NONE) {
- result.error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "LB policy dropped call on ping");
- }
- }
- return result.error;
+ return HandlePickResult<grpc_error_handle>(
+ &result,
+ // Complete pick.
+ [op](LoadBalancingPolicy::PickResult::Complete* complete_pick)
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&ClientChannel::work_serializer_) {
+ SubchannelWrapper* subchannel = static_cast<SubchannelWrapper*>(
+ complete_pick->subchannel.get());
+ ConnectedSubchannel* connected_subchannel =
+ subchannel->connected_subchannel();
+ connected_subchannel->Ping(op->send_ping.on_initiate,
+ op->send_ping.on_ack);
+ return GRPC_ERROR_NONE;
+ },
+ // Queue pick.
+ [](LoadBalancingPolicy::PickResult::Queue* /*queue_pick*/) {
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING("LB picker queued call");
+ },
+ // Fail pick.
+ [](LoadBalancingPolicy::PickResult::Fail* fail_pick) {
+ return absl_status_to_grpc_error(fail_pick->status);
+ },
+ // Drop pick.
+ [](LoadBalancingPolicy::PickResult::Drop* drop_pick) {
+ return absl_status_to_grpc_error(drop_pick->status);
+ });
}
void ClientChannel::StartTransportOpLocked(grpc_transport_op* op) {
@@ -1749,7 +1809,7 @@ void ClientChannel::StartTransportOpLocked(grpc_transport_op* op) {
UpdateStateAndPickerLocked(
GRPC_CHANNEL_SHUTDOWN, absl::Status(), "shutdown from API",
absl::make_unique<LoadBalancingPolicy::TransientFailurePicker>(
- GRPC_ERROR_REF(op->disconnect_with_error)));
+ grpc_error_to_absl_status(op->disconnect_with_error)));
}
}
GRPC_CHANNEL_STACK_UNREF(owning_stack_, "start_transport_op");
@@ -1919,10 +1979,26 @@ void ClientChannel::CallData::StartTransportStreamOpBatch(
if (GPR_LIKELY(chand->deadline_checking_enabled_)) {
grpc_deadline_state_client_start_transport_stream_op_batch(elem, batch);
}
- // Intercept recv_initial_metadata for config selector on-committed callback.
- if (batch->recv_initial_metadata) {
- calld->InjectRecvInitialMetadataReadyForConfigSelectorCommitCallback(batch);
+ // Intercept recv_trailing_metadata to call CallDispatchController::Commit(),
+ // in case we wind up failing the call before we get down to the retry
+ // or LB call layer.
+ if (batch->recv_trailing_metadata) {
+ calld->InjectRecvTrailingMetadataReadyForConfigSelectorCommitCallback(
+ batch);
+ }
+ // If we already have a dynamic call, pass the batch down to it.
+ // Note that once we have done so, we do not need to acquire the channel's
+ // resolution mutex, which is more efficient (especially for streaming calls).
+ if (calld->dynamic_call_ != nullptr) {
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_call_trace)) {
+ gpr_log(GPR_INFO, "chand=%p calld=%p: starting batch on dynamic_call=%p",
+ chand, calld, calld->dynamic_call_.get());
+ }
+ calld->dynamic_call_->StartTransportStreamOpBatch(batch);
+ return;
}
+ // We do not yet have a dynamic call.
+ //
// If we've previously been cancelled, immediately fail any new batches.
if (GPR_UNLIKELY(calld->cancel_error_ != GRPC_ERROR_NONE)) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_call_trace)) {
@@ -1949,35 +2025,16 @@ void ClientChannel::CallData::StartTransportStreamOpBatch(
gpr_log(GPR_INFO, "chand=%p calld=%p: recording cancel_error=%s", chand,
calld, grpc_error_std_string(calld->cancel_error_).c_str());
}
- // If we do not have a dynamic call (i.e., name resolution has not
- // yet completed), fail all pending batches. Otherwise, send the
- // cancellation down to the dynamic call.
- if (calld->dynamic_call_ == nullptr) {
- calld->PendingBatchesFail(elem, GRPC_ERROR_REF(calld->cancel_error_),
- NoYieldCallCombiner);
- // Note: This will release the call combiner.
- grpc_transport_stream_op_batch_finish_with_failure(
- batch, GRPC_ERROR_REF(calld->cancel_error_), calld->call_combiner_);
- } else {
- // Note: This will release the call combiner.
- calld->dynamic_call_->StartTransportStreamOpBatch(batch);
- }
+ // Fail all pending batches.
+ calld->PendingBatchesFail(elem, GRPC_ERROR_REF(calld->cancel_error_),
+ NoYieldCallCombiner);
+ // Note: This will release the call combiner.
+ grpc_transport_stream_op_batch_finish_with_failure(
+ batch, GRPC_ERROR_REF(calld->cancel_error_), calld->call_combiner_);
return;
}
// Add the batch to the pending list.
calld->PendingBatchesAdd(elem, batch);
- // Check if we've already created a dynamic call.
- // Note that once we have done so, we do not need to acquire the channel's
- // resolution mutex, which is more efficient (especially for streaming calls).
- if (calld->dynamic_call_ != nullptr) {
- if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_call_trace)) {
- gpr_log(GPR_INFO, "chand=%p calld=%p: starting batch on dynamic_call=%p",
- chand, calld, calld->dynamic_call_.get());
- }
- calld->PendingBatchesResume(elem);
- return;
- }
- // We do not yet have a dynamic call.
// For batches containing a send_initial_metadata op, acquire the
// channel's resolution mutex to apply the service config to the call,
// after which we will create a dynamic call.
@@ -2218,7 +2275,6 @@ grpc_error_handle ClientChannel::CallData::ApplyServiceConfigToCallLocked(
ConfigSelector::CallConfig call_config =
config_selector->GetCallConfig({&path_, initial_metadata, arena_});
if (call_config.error != GRPC_ERROR_NONE) return call_config.error;
- on_call_committed_ = std::move(call_config.on_call_committed);
// Create a ServiceConfigCallData for the call. This stores a ref to the
// ServiceConfig and caches the right set of parsed configs to use for
// the call. The MethodConfig will store itself in the call context,
@@ -2226,7 +2282,8 @@ grpc_error_handle ClientChannel::CallData::ApplyServiceConfigToCallLocked(
// will be cleaned up when the call ends.
auto* service_config_call_data = arena_->New<ServiceConfigCallData>(
std::move(call_config.service_config), call_config.method_configs,
- std::move(call_config.call_attributes), call_context_);
+ std::move(call_config.call_attributes),
+ call_config.call_dispatch_controller, call_context_);
// Apply our own method params to the call.
auto* method_params = static_cast<ClientChannelMethodParsedConfig*>(
service_config_call_data->GetMethodParsedConfig(
@@ -2265,36 +2322,36 @@ grpc_error_handle ClientChannel::CallData::ApplyServiceConfigToCallLocked(
}
void ClientChannel::CallData::
- RecvInitialMetadataReadyForConfigSelectorCommitCallback(
+ RecvTrailingMetadataReadyForConfigSelectorCommitCallback(
void* arg, grpc_error_handle error) {
auto* self = static_cast<CallData*>(arg);
- if (self->on_call_committed_ != nullptr) {
- self->on_call_committed_();
- self->on_call_committed_ = nullptr;
+ auto* service_config_call_data = static_cast<ServiceConfigCallData*>(
+ self->call_context_[GRPC_CONTEXT_SERVICE_CONFIG_CALL_DATA].value);
+ if (service_config_call_data != nullptr) {
+ service_config_call_data->call_dispatch_controller()->Commit();
}
// Chain to original callback.
- Closure::Run(DEBUG_LOCATION, self->original_recv_initial_metadata_ready_,
+ Closure::Run(DEBUG_LOCATION, self->original_recv_trailing_metadata_ready_,
GRPC_ERROR_REF(error));
}
-// TODO(roth): Consider not intercepting this callback unless we
-// actually need to, if this causes a performance problem.
void ClientChannel::CallData::
- InjectRecvInitialMetadataReadyForConfigSelectorCommitCallback(
+ InjectRecvTrailingMetadataReadyForConfigSelectorCommitCallback(
grpc_transport_stream_op_batch* batch) {
- original_recv_initial_metadata_ready_ =
- batch->payload->recv_initial_metadata.recv_initial_metadata_ready;
- GRPC_CLOSURE_INIT(&recv_initial_metadata_ready_,
- RecvInitialMetadataReadyForConfigSelectorCommitCallback,
+ original_recv_trailing_metadata_ready_ =
+ batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready;
+ GRPC_CLOSURE_INIT(&recv_trailing_metadata_ready_,
+ RecvTrailingMetadataReadyForConfigSelectorCommitCallback,
this, nullptr);
- batch->payload->recv_initial_metadata.recv_initial_metadata_ready =
- &recv_initial_metadata_ready_;
+ batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready =
+ &recv_trailing_metadata_ready_;
}
void ClientChannel::CallData::AsyncResolutionDone(grpc_call_element* elem,
grpc_error_handle error) {
- GRPC_CLOSURE_INIT(&pick_closure_, ResolutionDone, elem, nullptr);
- ExecCtx::Run(DEBUG_LOCATION, &pick_closure_, error);
+ // TODO(roth): Does this callback need to hold a ref to the call stack?
+ GRPC_CLOSURE_INIT(&resolution_done_closure_, ResolutionDone, elem, nullptr);
+ ExecCtx::Run(DEBUG_LOCATION, &resolution_done_closure_, error);
}
void ClientChannel::CallData::ResolutionDone(void* arg,
@@ -2530,22 +2587,39 @@ class ClientChannel::LoadBalancedCall::LbCallState
// LoadBalancedCall
//
+namespace {
+
+CallTracer::CallAttemptTracer* GetCallAttemptTracer(
+ grpc_call_context_element* context, bool is_transparent_retry) {
+ auto* call_tracer =
+ static_cast<CallTracer*>(context[GRPC_CONTEXT_CALL_TRACER].value);
+ if (call_tracer == nullptr) return nullptr;
+ return call_tracer->StartNewAttempt(is_transparent_retry);
+}
+
+} // namespace
+
ClientChannel::LoadBalancedCall::LoadBalancedCall(
ClientChannel* chand, const grpc_call_element_args& args,
- grpc_polling_entity* pollent, grpc_closure* on_call_destruction_complete)
- : RefCounted(GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)
- ? "LoadBalancedCall"
- : nullptr),
+ grpc_polling_entity* pollent, grpc_closure* on_call_destruction_complete,
+ ConfigSelector::CallDispatchController* call_dispatch_controller,
+ bool is_transparent_retry)
+ : InternallyRefCounted(
+ GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)
+ ? "LoadBalancedCall"
+ : nullptr),
chand_(chand),
path_(grpc_slice_ref_internal(args.path)),
- call_start_time_(args.start_time),
deadline_(args.deadline),
arena_(args.arena),
owning_call_(args.call_stack),
call_combiner_(args.call_combiner),
call_context_(args.context),
pollent_(pollent),
- on_call_destruction_complete_(on_call_destruction_complete) {}
+ on_call_destruction_complete_(on_call_destruction_complete),
+ call_dispatch_controller_(call_dispatch_controller),
+ call_attempt_tracer_(
+ GetCallAttemptTracer(args.context, is_transparent_retry)) {}
ClientChannel::LoadBalancedCall::~LoadBalancedCall() {
grpc_slice_unref_internal(path_);
@@ -2565,6 +2639,16 @@ ClientChannel::LoadBalancedCall::~LoadBalancedCall() {
}
}
+void ClientChannel::LoadBalancedCall::Orphan() {
+ // Compute latency and report it to the tracer.
+ if (call_attempt_tracer_ != nullptr) {
+ gpr_timespec latency =
+ gpr_cycle_counter_sub(gpr_get_cycle_counter(), lb_call_start_time_);
+ call_attempt_tracer_->RecordEnd(latency);
+ }
+ Unref();
+}
+
size_t ClientChannel::LoadBalancedCall::GetBatchIndex(
grpc_transport_stream_op_batch* batch) {
// Note: It is important the send_initial_metadata be the first entry
@@ -2680,10 +2764,79 @@ void ClientChannel::LoadBalancedCall::PendingBatchesResume() {
void ClientChannel::LoadBalancedCall::StartTransportStreamOpBatch(
grpc_transport_stream_op_batch* batch) {
- // Intercept recv_trailing_metadata_ready for LB callback.
+ // Handle call tracing.
+ if (call_attempt_tracer_ != nullptr) {
+ // Record send ops in tracer.
+ if (batch->cancel_stream) {
+ call_attempt_tracer_->RecordCancel(
+ GRPC_ERROR_REF(batch->payload->cancel_stream.cancel_error));
+ }
+ if (batch->send_initial_metadata) {
+ call_attempt_tracer_->RecordSendInitialMetadata(
+ batch->payload->send_initial_metadata.send_initial_metadata,
+ batch->payload->send_initial_metadata.send_initial_metadata_flags);
+ peer_string_ = batch->payload->send_initial_metadata.peer_string;
+ original_send_initial_metadata_on_complete_ = batch->on_complete;
+ GRPC_CLOSURE_INIT(&send_initial_metadata_on_complete_,
+ SendInitialMetadataOnComplete, this, nullptr);
+ batch->on_complete = &send_initial_metadata_on_complete_;
+ }
+ if (batch->send_message) {
+ call_attempt_tracer_->RecordSendMessage(
+ *batch->payload->send_message.send_message);
+ }
+ if (batch->send_trailing_metadata) {
+ call_attempt_tracer_->RecordSendTrailingMetadata(
+ batch->payload->send_trailing_metadata.send_trailing_metadata);
+ }
+ // Intercept recv ops.
+ if (batch->recv_initial_metadata) {
+ recv_initial_metadata_ =
+ batch->payload->recv_initial_metadata.recv_initial_metadata;
+ original_recv_initial_metadata_ready_ =
+ batch->payload->recv_initial_metadata.recv_initial_metadata_ready;
+ GRPC_CLOSURE_INIT(&recv_initial_metadata_ready_, RecvInitialMetadataReady,
+ this, nullptr);
+ batch->payload->recv_initial_metadata.recv_initial_metadata_ready =
+ &recv_initial_metadata_ready_;
+ }
+ if (batch->recv_message) {
+ recv_message_ = batch->payload->recv_message.recv_message;
+ original_recv_message_ready_ =
+ batch->payload->recv_message.recv_message_ready;
+ GRPC_CLOSURE_INIT(&recv_message_ready_, RecvMessageReady, this, nullptr);
+ batch->payload->recv_message.recv_message_ready = &recv_message_ready_;
+ }
+ }
+ // Intercept recv_trailing_metadata even if there is no call tracer,
+ // since we may need to notify the LB policy about trailing metadata.
if (batch->recv_trailing_metadata) {
- InjectRecvTrailingMetadataReadyForLoadBalancingPolicy(batch);
+ recv_trailing_metadata_ =
+ batch->payload->recv_trailing_metadata.recv_trailing_metadata;
+ transport_stream_stats_ =
+ batch->payload->recv_trailing_metadata.collect_stats;
+ original_recv_trailing_metadata_ready_ =
+ batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready;
+ GRPC_CLOSURE_INIT(&recv_trailing_metadata_ready_, RecvTrailingMetadataReady,
+ this, nullptr);
+ batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready =
+ &recv_trailing_metadata_ready_;
+ }
+ // If we've already gotten a subchannel call, pass the batch down to it.
+ // Note that once we have picked a subchannel, we do not need to acquire
+ // the channel's data plane mutex, which is more efficient (especially for
+ // streaming calls).
+ if (subchannel_call_ != nullptr) {
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_call_trace)) {
+ gpr_log(GPR_INFO,
+ "chand=%p lb_call=%p: starting batch on subchannel_call=%p",
+ chand_, this, subchannel_call_.get());
+ }
+ subchannel_call_->StartTransportStreamOpBatch(batch);
+ return;
}
+ // We do not yet have a subchannel call.
+ //
// If we've previously been cancelled, immediately fail any new batches.
if (GPR_UNLIKELY(cancel_error_ != GRPC_ERROR_NONE)) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_call_trace)) {
@@ -2708,36 +2861,15 @@ void ClientChannel::LoadBalancedCall::StartTransportStreamOpBatch(
gpr_log(GPR_INFO, "chand=%p lb_call=%p: recording cancel_error=%s",
chand_, this, grpc_error_std_string(cancel_error_).c_str());
}
- // If we do not have a subchannel call (i.e., a pick has not yet
- // been started), fail all pending batches. Otherwise, send the
- // cancellation down to the subchannel call.
- if (subchannel_call_ == nullptr) {
- PendingBatchesFail(GRPC_ERROR_REF(cancel_error_), NoYieldCallCombiner);
- // Note: This will release the call combiner.
- grpc_transport_stream_op_batch_finish_with_failure(
- batch, GRPC_ERROR_REF(cancel_error_), call_combiner_);
- } else {
- // Note: This will release the call combiner.
- subchannel_call_->StartTransportStreamOpBatch(batch);
- }
+ // Fail all pending batches.
+ PendingBatchesFail(GRPC_ERROR_REF(cancel_error_), NoYieldCallCombiner);
+ // Note: This will release the call combiner.
+ grpc_transport_stream_op_batch_finish_with_failure(
+ batch, GRPC_ERROR_REF(cancel_error_), call_combiner_);
return;
}
// Add the batch to the pending list.
PendingBatchesAdd(batch);
- // Check if we've already gotten a subchannel call.
- // Note that once we have picked a subchannel, we do not need to acquire
- // the channel's data plane mutex, which is more efficient (especially for
- // streaming calls).
- if (subchannel_call_ != nullptr) {
- if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_call_trace)) {
- gpr_log(GPR_INFO,
- "chand=%p lb_call=%p: starting batch on subchannel_call=%p",
- chand_, this, subchannel_call_.get());
- }
- PendingBatchesResume();
- return;
- }
- // We do not yet have a subchannel call.
// For batches containing a send_initial_metadata op, acquire the
// channel's data plane mutex to pick a subchannel.
if (GPR_LIKELY(batch->send_initial_metadata)) {
@@ -2759,38 +2891,82 @@ void ClientChannel::LoadBalancedCall::StartTransportStreamOpBatch(
}
}
-void ClientChannel::LoadBalancedCall::
- RecvTrailingMetadataReadyForLoadBalancingPolicy(void* arg,
- grpc_error_handle error) {
+void ClientChannel::LoadBalancedCall::SendInitialMetadataOnComplete(
+ void* arg, grpc_error_handle error) {
+ auto* self = static_cast<LoadBalancedCall*>(arg);
+ self->call_attempt_tracer_->RecordOnDoneSendInitialMetadata(
+ self->peer_string_);
+ Closure::Run(DEBUG_LOCATION,
+ self->original_send_initial_metadata_on_complete_,
+ GRPC_ERROR_REF(error));
+}
+
+void ClientChannel::LoadBalancedCall::RecvInitialMetadataReady(
+ void* arg, grpc_error_handle error) {
+ auto* self = static_cast<LoadBalancedCall*>(arg);
+ if (error == GRPC_ERROR_NONE) {
+ // recv_initial_metadata_flags is not populated for clients
+ self->call_attempt_tracer_->RecordReceivedInitialMetadata(
+ self->recv_initial_metadata_, 0 /* recv_initial_metadata_flags */);
+ }
+ Closure::Run(DEBUG_LOCATION, self->original_recv_initial_metadata_ready_,
+ GRPC_ERROR_REF(error));
+}
+
+void ClientChannel::LoadBalancedCall::RecvMessageReady(
+ void* arg, grpc_error_handle error) {
+ auto* self = static_cast<LoadBalancedCall*>(arg);
+ if (*self->recv_message_ != nullptr) {
+ self->call_attempt_tracer_->RecordReceivedMessage(**self->recv_message_);
+ }
+ Closure::Run(DEBUG_LOCATION, self->original_recv_message_ready_,
+ GRPC_ERROR_REF(error));
+}
+
+void ClientChannel::LoadBalancedCall::RecvTrailingMetadataReady(
+ void* arg, grpc_error_handle error) {
auto* self = static_cast<LoadBalancedCall*>(arg);
- if (self->lb_recv_trailing_metadata_ready_ != nullptr) {
- // Set error if call did not succeed.
- grpc_error_handle error_for_lb = GRPC_ERROR_NONE;
+ // Check if we have a tracer or an LB callback to invoke.
+ if (self->call_attempt_tracer_ != nullptr ||
+ self->lb_recv_trailing_metadata_ready_ != nullptr) {
+ // Get the call's status.
+ absl::Status status;
if (error != GRPC_ERROR_NONE) {
- error_for_lb = error;
+ // Get status from error.
+ grpc_status_code code;
+ grpc_slice message = grpc_empty_slice();
+ grpc_error_get_status(error, self->deadline_, &code, &message,
+ /*http_error=*/nullptr, /*error_string=*/nullptr);
+ status = absl::Status(static_cast<absl::StatusCode>(code),
+ StringViewFromSlice(message));
} else {
+ // Get status from headers.
const auto& fields = self->recv_trailing_metadata_->idx.named;
GPR_ASSERT(fields.grpc_status != nullptr);
- grpc_status_code status =
+ grpc_status_code code =
grpc_get_status_code_from_metadata(fields.grpc_status->md);
- std::string msg;
- if (status != GRPC_STATUS_OK) {
- error_for_lb = grpc_error_set_int(
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("call failed"),
- GRPC_ERROR_INT_GRPC_STATUS, status);
+ if (code != GRPC_STATUS_OK) {
+ absl::string_view message;
if (fields.grpc_message != nullptr) {
- error_for_lb = grpc_error_set_str(
- error_for_lb, GRPC_ERROR_STR_GRPC_MESSAGE,
- grpc_slice_ref_internal(GRPC_MDVALUE(fields.grpc_message->md)));
+ message = StringViewFromSlice(GRPC_MDVALUE(fields.grpc_message->md));
}
+ status = absl::Status(static_cast<absl::StatusCode>(code), message);
}
}
- // Invoke callback to LB policy.
- Metadata trailing_metadata(self, self->recv_trailing_metadata_);
- LbCallState lb_call_state(self);
- self->lb_recv_trailing_metadata_ready_(error_for_lb, &trailing_metadata,
- &lb_call_state);
- if (error == GRPC_ERROR_NONE) GRPC_ERROR_UNREF(error_for_lb);
+ // If we have a tracer, notify it.
+ if (self->call_attempt_tracer_ != nullptr) {
+ self->call_attempt_tracer_->RecordReceivedTrailingMetadata(
+ status, self->recv_trailing_metadata_,
+ *self->transport_stream_stats_);
+ }
+ // If the LB policy requested a callback for trailing metadata, invoke
+ // the callback.
+ if (self->lb_recv_trailing_metadata_ready_ != nullptr) {
+ Metadata trailing_metadata(self, self->recv_trailing_metadata_);
+ LbCallState lb_call_state(self);
+ self->lb_recv_trailing_metadata_ready_(status, &trailing_metadata,
+ &lb_call_state);
+ }
}
// Chain to original callback.
if (self->failure_error_ != GRPC_ERROR_NONE) {
@@ -2803,23 +2979,9 @@ void ClientChannel::LoadBalancedCall::
error);
}
-void ClientChannel::LoadBalancedCall::
- InjectRecvTrailingMetadataReadyForLoadBalancingPolicy(
- grpc_transport_stream_op_batch* batch) {
- recv_trailing_metadata_ =
- batch->payload->recv_trailing_metadata.recv_trailing_metadata;
- original_recv_trailing_metadata_ready_ =
- batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready;
- GRPC_CLOSURE_INIT(&recv_trailing_metadata_ready_,
- RecvTrailingMetadataReadyForLoadBalancingPolicy, this,
- grpc_schedule_on_exec_ctx);
- batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready =
- &recv_trailing_metadata_ready_;
-}
-
void ClientChannel::LoadBalancedCall::CreateSubchannelCall() {
SubchannelCall::Args call_args = {
- std::move(connected_subchannel_), pollent_, path_, call_start_time_,
+ std::move(connected_subchannel_), pollent_, path_, /*start_time=*/0,
deadline_, arena_,
// TODO(roth): When we implement hedging support, we will probably
// need to use a separate call context for each subchannel call.
@@ -2873,6 +3035,7 @@ class ClientChannel::LoadBalancedCall::LbQueuedCallCanceller {
lb_call->lb_call_canceller_);
}
if (lb_call->lb_call_canceller_ == self && error != GRPC_ERROR_NONE) {
+ lb_call->call_dispatch_controller_->Commit();
// Remove pick from list of queued picks.
lb_call->MaybeRemoveCallFromLbQueuedCallsLocked();
// Fail pending batches on the call.
@@ -2914,6 +3077,7 @@ void ClientChannel::LoadBalancedCall::MaybeAddCallToLbQueuedCallsLocked() {
}
void ClientChannel::LoadBalancedCall::AsyncPickDone(grpc_error_handle error) {
+ // TODO(roth): Does this callback need to hold a ref to LoadBalancedCall?
GRPC_CLOSURE_INIT(&pick_closure_, PickDone, this, grpc_schedule_on_exec_ctx);
ExecCtx::Run(DEBUG_LOCATION, &pick_closure_, error);
}
@@ -2930,26 +3094,10 @@ void ClientChannel::LoadBalancedCall::PickDone(void* arg,
self->PendingBatchesFail(GRPC_ERROR_REF(error), YieldCallCombiner);
return;
}
+ self->call_dispatch_controller_->Commit();
self->CreateSubchannelCall();
}
-namespace {
-
-const char* PickResultTypeName(
- LoadBalancingPolicy::PickResult::ResultType type) {
- switch (type) {
- case LoadBalancingPolicy::PickResult::PICK_COMPLETE:
- return "COMPLETE";
- case LoadBalancingPolicy::PickResult::PICK_QUEUE:
- return "QUEUE";
- case LoadBalancingPolicy::PickResult::PICK_FAILED:
- return "FAILED";
- }
- GPR_UNREACHABLE_CODE(return "UNKNOWN");
-}
-
-} // namespace
-
void ClientChannel::LoadBalancedCall::PickSubchannel(void* arg,
grpc_error_handle error) {
auto* self = static_cast<LoadBalancedCall*>(arg);
@@ -2983,64 +3131,82 @@ bool ClientChannel::LoadBalancedCall::PickSubchannelLocked(
Metadata initial_metadata(this, initial_metadata_batch);
pick_args.initial_metadata = &initial_metadata;
auto result = chand_->picker_->Pick(pick_args);
- if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
- gpr_log(
- GPR_INFO,
- "chand=%p lb_call=%p: LB pick returned %s (subchannel=%p, error=%s)",
- chand_, this, PickResultTypeName(result.type), result.subchannel.get(),
- grpc_error_std_string(result.error).c_str());
- }
- switch (result.type) {
- case LoadBalancingPolicy::PickResult::PICK_FAILED: {
- // If we're shutting down, fail all RPCs.
- grpc_error_handle disconnect_error = chand_->disconnect_error();
- if (disconnect_error != GRPC_ERROR_NONE) {
- GRPC_ERROR_UNREF(result.error);
- MaybeRemoveCallFromLbQueuedCallsLocked();
- *error = GRPC_ERROR_REF(disconnect_error);
- return true;
- }
- // If wait_for_ready is false, then the error indicates the RPC
- // attempt's final status.
- if ((send_initial_metadata_flags &
- GRPC_INITIAL_METADATA_WAIT_FOR_READY) == 0) {
- grpc_error_handle new_error =
- GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
- "Failed to pick subchannel", &result.error, 1);
- GRPC_ERROR_UNREF(result.error);
- *error = new_error;
- MaybeRemoveCallFromLbQueuedCallsLocked();
- return true;
- }
- // If wait_for_ready is true, then queue to retry when we get a new
- // picker.
- GRPC_ERROR_UNREF(result.error);
- }
- // Fallthrough
- case LoadBalancingPolicy::PickResult::PICK_QUEUE:
- MaybeAddCallToLbQueuedCallsLocked();
- return false;
- default: // PICK_COMPLETE
- MaybeRemoveCallFromLbQueuedCallsLocked();
- // Handle drops.
- if (GPR_UNLIKELY(result.subchannel == nullptr)) {
- result.error = grpc_error_set_int(
- grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "Call dropped by load balancing policy"),
- GRPC_ERROR_INT_GRPC_STATUS,
- GRPC_STATUS_UNAVAILABLE),
- GRPC_ERROR_INT_LB_POLICY_DROP, 1);
- } else {
- // Grab a ref to the connected subchannel while we're still
- // holding the data plane mutex.
- connected_subchannel_ =
- chand_->GetConnectedSubchannelInDataPlane(result.subchannel.get());
- GPR_ASSERT(connected_subchannel_ != nullptr);
- }
- lb_recv_trailing_metadata_ready_ = result.recv_trailing_metadata_ready;
- *error = result.error;
- return true;
- }
+ return HandlePickResult<bool>(
+ &result,
+ // CompletePick
+ [this](LoadBalancingPolicy::PickResult::Complete* complete_pick)
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&ClientChannel::data_plane_mu_) {
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
+ gpr_log(GPR_INFO,
+ "chand=%p lb_call=%p: LB pick succeeded: subchannel=%p",
+ chand_, this, complete_pick->subchannel.get());
+ }
+ GPR_ASSERT(complete_pick->subchannel != nullptr);
+ // Grab a ref to the connected subchannel while we're still
+ // holding the data plane mutex.
+ connected_subchannel_ = chand_->GetConnectedSubchannelInDataPlane(
+ complete_pick->subchannel.get());
+ GPR_ASSERT(connected_subchannel_ != nullptr);
+ lb_recv_trailing_metadata_ready_ =
+ std::move(complete_pick->recv_trailing_metadata_ready);
+ MaybeRemoveCallFromLbQueuedCallsLocked();
+ return true;
+ },
+ // QueuePick
+ [this](LoadBalancingPolicy::PickResult::Queue* /*queue_pick*/)
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&ClientChannel::data_plane_mu_) {
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
+ gpr_log(GPR_INFO, "chand=%p lb_call=%p: LB pick queued", chand_,
+ this);
+ }
+ MaybeAddCallToLbQueuedCallsLocked();
+ return false;
+ },
+ // FailPick
+ [this, send_initial_metadata_flags,
+ &error](LoadBalancingPolicy::PickResult::Fail* fail_pick)
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&ClientChannel::data_plane_mu_) {
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
+ gpr_log(GPR_INFO, "chand=%p lb_call=%p: LB pick failed: %s",
+ chand_, this, fail_pick->status.ToString().c_str());
+ }
+ // If we're shutting down, fail all RPCs.
+ grpc_error_handle disconnect_error = chand_->disconnect_error();
+ if (disconnect_error != GRPC_ERROR_NONE) {
+ MaybeRemoveCallFromLbQueuedCallsLocked();
+ *error = GRPC_ERROR_REF(disconnect_error);
+ return true;
+ }
+ // If wait_for_ready is false, then the error indicates the RPC
+ // attempt's final status.
+ if ((send_initial_metadata_flags &
+ GRPC_INITIAL_METADATA_WAIT_FOR_READY) == 0) {
+ grpc_error_handle lb_error =
+ absl_status_to_grpc_error(fail_pick->status);
+ *error = GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
+ "Failed to pick subchannel", &lb_error, 1);
+ GRPC_ERROR_UNREF(lb_error);
+ MaybeRemoveCallFromLbQueuedCallsLocked();
+ return true;
+ }
+ // If wait_for_ready is true, then queue to retry when we get a new
+ // picker.
+ MaybeAddCallToLbQueuedCallsLocked();
+ return false;
+ },
+ // DropPick
+ [this, &error](LoadBalancingPolicy::PickResult::Drop* drop_pick)
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&ClientChannel::data_plane_mu_) {
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
+ gpr_log(GPR_INFO, "chand=%p lb_call=%p: LB pick dropped: %s",
+ chand_, this, drop_pick->status.ToString().c_str());
+ }
+ *error =
+ grpc_error_set_int(absl_status_to_grpc_error(drop_pick->status),
+ GRPC_ERROR_INT_LB_POLICY_DROP, 1);
+ MaybeRemoveCallFromLbQueuedCallsLocked();
+ return true;
+ });
}
} // namespace grpc_core
diff --git a/src/core/ext/filters/client_channel/client_channel.h b/src/core/ext/filters/client_channel/client_channel.h
index b7dd1a19db..44594aba02 100644
--- a/src/core/ext/filters/client_channel/client_channel.h
+++ b/src/core/ext/filters/client_channel/client_channel.h
@@ -39,6 +39,7 @@
#include "src/core/ext/filters/client_channel/service_config.h"
#include "src/core/ext/filters/client_channel/subchannel.h"
#include "src/core/ext/filters/client_channel/subchannel_pool_interface.h"
+#include "src/core/lib/channel/call_tracer.h"
#include "src/core/lib/gprpp/sync.h"
#include "src/core/lib/iomgr/error.h"
#include "src/core/lib/iomgr/polling_entity.h"
@@ -132,9 +133,11 @@ class ClientChannel {
void RemoveConnectivityWatcher(
AsyncConnectivityStateWatcherInterface* watcher);
- RefCountedPtr<LoadBalancedCall> CreateLoadBalancedCall(
+ OrphanablePtr<LoadBalancedCall> CreateLoadBalancedCall(
const grpc_call_element_args& args, grpc_polling_entity* pollent,
- grpc_closure* on_call_destruction_complete);
+ grpc_closure* on_call_destruction_complete,
+ ConfigSelector::CallDispatchController* call_dispatch_controller,
+ bool is_transparent_retry);
private:
class CallData;
@@ -273,7 +276,6 @@ class ClientChannel {
// Fields set at construction and never modified.
//
const bool deadline_checking_enabled_;
- const bool enable_retries_;
grpc_channel_stack* owning_stack_;
ClientChannelFactory* client_channel_factory_;
const grpc_channel_args* channel_args_;
@@ -369,12 +371,10 @@ class ClientChannel {
// ClientChannel::LoadBalancedCall
//
-// This object is ref-counted, but it cannot inherit from RefCounted<>,
-// because it is allocated on the arena and can't free its memory when
-// its refcount goes to zero. So instead, it manually implements the
-// same API as RefCounted<>, so that it can be used with RefCountedPtr<>.
+// TODO(roth): As part of simplifying cancellation in the filter stack,
+// this should no longer need to be ref-counted.
class ClientChannel::LoadBalancedCall
- : public RefCounted<LoadBalancedCall, PolymorphicRefCount, kUnrefCallDtor> {
+ : public InternallyRefCounted<LoadBalancedCall, kUnrefCallDtor> {
public:
// If on_call_destruction_complete is non-null, then it will be
// invoked once the LoadBalancedCall is completely destroyed.
@@ -382,11 +382,15 @@ class ClientChannel::LoadBalancedCall
// the LB call has a subchannel call and ensuring that the
// on_call_destruction_complete closure passed down from the surface
// is not invoked until after the subchannel call stack is destroyed.
- LoadBalancedCall(ClientChannel* chand, const grpc_call_element_args& args,
- grpc_polling_entity* pollent,
- grpc_closure* on_call_destruction_complete);
+ LoadBalancedCall(
+ ClientChannel* chand, const grpc_call_element_args& args,
+ grpc_polling_entity* pollent, grpc_closure* on_call_destruction_complete,
+ ConfigSelector::CallDispatchController* call_dispatch_controller,
+ bool is_transparent_retry);
~LoadBalancedCall() override;
+ void Orphan() override;
+
void StartTransportStreamOpBatch(grpc_transport_stream_op_batch* batch);
// Invoked by channel for queued LB picks when the picker is updated.
@@ -438,10 +442,10 @@ class ClientChannel::LoadBalancedCall
// Resumes all pending batches on subchannel_call_.
void PendingBatchesResume();
- static void RecvTrailingMetadataReadyForLoadBalancingPolicy(
- void* arg, grpc_error_handle error);
- void InjectRecvTrailingMetadataReadyForLoadBalancingPolicy(
- grpc_transport_stream_op_batch* batch);
+ static void SendInitialMetadataOnComplete(void* arg, grpc_error_handle error);
+ static void RecvInitialMetadataReady(void* arg, grpc_error_handle error);
+ static void RecvMessageReady(void* arg, grpc_error_handle error);
+ static void RecvTrailingMetadataReady(void* arg, grpc_error_handle error);
void CreateSubchannelCall();
// Invoked when a pick is completed, on both success or failure.
@@ -459,7 +463,6 @@ class ClientChannel::LoadBalancedCall
// that uses any one of them, we should store them in the call
// context. This will save per-call memory overhead.
grpc_slice path_; // Request path.
- gpr_cycle_counter call_start_time_;
grpc_millis deadline_;
Arena* arena_;
grpc_call_stack* owning_call_;
@@ -467,6 +470,11 @@ class ClientChannel::LoadBalancedCall
grpc_call_context_element* call_context_;
grpc_polling_entity* pollent_;
grpc_closure* on_call_destruction_complete_;
+ ConfigSelector::CallDispatchController* call_dispatch_controller_;
+
+ CallTracer::CallAttemptTracer* call_attempt_tracer_;
+
+ gpr_cycle_counter lb_call_start_time_ = gpr_get_cycle_counter();
// Set when we get a cancel_stream op.
grpc_error_handle cancel_error_ = GRPC_ERROR_NONE;
@@ -486,14 +494,30 @@ class ClientChannel::LoadBalancedCall
RefCountedPtr<ConnectedSubchannel> connected_subchannel_;
const LoadBalancingPolicy::BackendMetricData* backend_metric_data_ = nullptr;
- std::function<void(grpc_error_handle, LoadBalancingPolicy::MetadataInterface*,
+ std::function<void(absl::Status, LoadBalancingPolicy::MetadataInterface*,
LoadBalancingPolicy::CallState*)>
lb_recv_trailing_metadata_ready_;
RefCountedPtr<SubchannelCall> subchannel_call_;
- // For intercepting recv_trailing_metadata_ready for the LB policy.
+ // For intercepting send_initial_metadata on_complete.
+ gpr_atm* peer_string_ = nullptr;
+ grpc_closure send_initial_metadata_on_complete_;
+ grpc_closure* original_send_initial_metadata_on_complete_ = nullptr;
+
+ // For intercepting recv_initial_metadata_ready.
+ grpc_metadata_batch* recv_initial_metadata_ = nullptr;
+ grpc_closure recv_initial_metadata_ready_;
+ grpc_closure* original_recv_initial_metadata_ready_ = nullptr;
+
+ // For intercepting recv_message_ready.
+ OrphanablePtr<ByteStream>* recv_message_ = nullptr;
+ grpc_closure recv_message_ready_;
+ grpc_closure* original_recv_message_ready_ = nullptr;
+
+ // For intercepting recv_trailing_metadata_ready.
grpc_metadata_batch* recv_trailing_metadata_ = nullptr;
+ grpc_transport_stream_stats* transport_stream_stats_ = nullptr;
grpc_closure recv_trailing_metadata_ready_;
grpc_closure* original_recv_trailing_metadata_ready_ = nullptr;
diff --git a/src/core/ext/filters/client_channel/config_selector.h b/src/core/ext/filters/client_channel/config_selector.h
index 98ae07e46e..6c7e750909 100644
--- a/src/core/ext/filters/client_channel/config_selector.h
+++ b/src/core/ext/filters/client_channel/config_selector.h
@@ -44,6 +44,22 @@ namespace grpc_core {
// MethodConfig and provide input to LB policies on a per-call basis.
class ConfigSelector : public RefCounted<ConfigSelector> {
public:
+ using CallAttributes = std::map<const char*, absl::string_view>;
+
+ // An interface to be used by the channel when dispatching calls.
+ class CallDispatchController {
+ public:
+ virtual ~CallDispatchController() = default;
+
+ // Called by the channel to decide if it should retry the call upon a
+ // failure.
+ virtual bool ShouldRetry() = 0;
+
+ // Called by the channel when no more LB picks will be performed for
+ // the call.
+ virtual void Commit() = 0;
+ };
+
struct GetCallConfigArgs {
grpc_slice* path;
grpc_metadata_batch* initial_metadata;
@@ -60,11 +76,9 @@ class ConfigSelector : public RefCounted<ConfigSelector> {
// the call to ensure that method_configs lives long enough.
RefCountedPtr<ServiceConfig> service_config;
// Call attributes that will be accessible to LB policy implementations.
- std::map<const char*, absl::string_view> call_attributes;
- // A callback that, if set, will be invoked when the call is
- // committed (i.e., when we know that we will never again need to
- // ask the picker for a subchannel for this call).
- std::function<void()> on_call_committed;
+ CallAttributes call_attributes;
+ // Call dispatch controller.
+ CallDispatchController* call_dispatch_controller = nullptr;
};
~ConfigSelector() override = default;
@@ -85,7 +99,6 @@ class ConfigSelector : public RefCounted<ConfigSelector> {
// The channel will call this when the resolver returns a new ConfigSelector
// to determine what set of dynamic filters will be configured.
virtual std::vector<const grpc_channel_filter*> GetFilters() { return {}; }
-
// Modifies channel args to be passed to the dynamic filter stack.
// Takes ownership of argument. Caller takes ownership of result.
virtual grpc_channel_args* ModifyChannelArgs(grpc_channel_args* args) {
diff --git a/src/core/ext/filters/client_channel/lb_policy.cc b/src/core/ext/filters/client_channel/lb_policy.cc
index b9272249c4..44363b4ac9 100644
--- a/src/core/ext/filters/client_channel/lb_policy.cc
+++ b/src/core/ext/filters/client_channel/lb_policy.cc
@@ -125,21 +125,7 @@ LoadBalancingPolicy::PickResult LoadBalancingPolicy::QueuePicker::Pick(
parent, nullptr),
GRPC_ERROR_NONE);
}
- PickResult result;
- result.type = PickResult::PICK_QUEUE;
- return result;
-}
-
-//
-// LoadBalancingPolicy::TransientFailurePicker
-//
-
-LoadBalancingPolicy::PickResult
-LoadBalancingPolicy::TransientFailurePicker::Pick(PickArgs /*args*/) {
- PickResult result;
- result.type = PickResult::PICK_FAILED;
- result.error = GRPC_ERROR_REF(error_);
- return result;
+ return PickResult::Queue();
}
} // namespace grpc_core
diff --git a/src/core/ext/filters/client_channel/lb_policy.h b/src/core/ext/filters/client_channel/lb_policy.h
index 1c6f309823..68f1eb2582 100644
--- a/src/core/ext/filters/client_channel/lb_policy.h
+++ b/src/core/ext/filters/client_channel/lb_policy.h
@@ -26,6 +26,7 @@
#include "absl/status/status.h"
#include "absl/strings/string_view.h"
+#include "absl/types/variant.h"
#include "src/core/ext/filters/client_channel/server_address.h"
#include "src/core/ext/filters/client_channel/service_config.h"
@@ -204,47 +205,69 @@ class LoadBalancingPolicy : public InternallyRefCounted<LoadBalancingPolicy> {
/// The result of picking a subchannel for a call.
struct PickResult {
- enum ResultType {
- /// Pick complete. If \a subchannel is non-null, the client channel
- /// will immediately proceed with the call on that subchannel;
- /// otherwise, it will drop the call.
- PICK_COMPLETE,
- /// Pick cannot be completed until something changes on the control
- /// plane. The client channel will queue the pick and try again the
- /// next time the picker is updated.
- PICK_QUEUE,
- /// Pick failed. If the call is wait_for_ready, the client channel
- /// will wait for the next picker and try again; otherwise, it
- /// will immediately fail the call with the status indicated via
- /// \a error (although the call may be retried if the client channel
- /// is configured to do so).
- PICK_FAILED,
+ /// A successful pick.
+ struct Complete {
+ /// The subchannel to be used for the call. Must be non-null.
+ RefCountedPtr<SubchannelInterface> subchannel;
+
+ /// Callback set by LB policy to be notified of trailing metadata.
+ /// If non-null, the client channel will invoke the callback
+ /// when trailing metadata is returned.
+ /// The metadata may be modified by the callback. However, the callback
+ /// does not take ownership, so any data that needs to be used after
+ /// returning must be copied.
+ /// The call state can be used to obtain backend metric data.
+ // TODO(roth): The arguments to this callback should be moved into a
+ // struct, so that we can later add new fields without breaking
+ // existing implementations.
+ std::function<void(absl::Status, MetadataInterface*, CallState*)>
+ recv_trailing_metadata_ready;
+
+ explicit Complete(
+ RefCountedPtr<SubchannelInterface> sc,
+ std::function<void(absl::Status, MetadataInterface*, CallState*)> cb =
+ nullptr)
+ : subchannel(std::move(sc)),
+ recv_trailing_metadata_ready(std::move(cb)) {}
};
- ResultType type;
-
- /// Used only if type is PICK_COMPLETE. Will be set to the selected
- /// subchannel, or nullptr if the LB policy decides to drop the call.
- RefCountedPtr<SubchannelInterface> subchannel;
-
- /// Used only if type is PICK_FAILED.
- /// Error to be set when returning a failure.
- // TODO(roth): Replace this with something similar to grpc::Status,
- // so that we don't expose grpc_error to this API.
- grpc_error_handle error = GRPC_ERROR_NONE;
-
- /// Used only if type is PICK_COMPLETE.
- /// Callback set by LB policy to be notified of trailing metadata.
- /// If set by LB policy, the client channel will invoke the callback
- /// when trailing metadata is returned.
- /// The metadata may be modified by the callback. However, the callback
- /// does not take ownership, so any data that needs to be used after
- /// returning must be copied.
- /// The call state can be used to obtain backend metric data.
- // TODO(roth): The arguments to this callback should be moved into a
- // struct, so that we can later add new fields without breaking
- // existing implementations.
- std::function<void(grpc_error_handle, MetadataInterface*, CallState*)>
- recv_trailing_metadata_ready;
+
+ /// Pick cannot be completed until something changes on the control
+ /// plane. The client channel will queue the pick and try again the
+ /// next time the picker is updated.
+ struct Queue {};
+
+ /// Pick failed. If the call is wait_for_ready, the client channel
+ /// will wait for the next picker and try again; otherwise, it
+ /// will immediately fail the call with the status indicated (although
+ /// the call may be retried if the client channel is configured to do so).
+ struct Fail {
+ absl::Status status;
+
+ explicit Fail(absl::Status s) : status(s) {}
+ };
+
+ /// Pick will be dropped with the status specified.
+ /// Unlike FailPick, the call will be dropped even if it is
+ /// wait_for_ready, and retries (if configured) will be inhibited.
+ struct Drop {
+ absl::Status status;
+
+ explicit Drop(absl::Status s) : status(s) {}
+ };
+
+ // A pick result must be one of these types.
+ // Default to Queue, just to allow default construction.
+ absl::variant<Complete, Queue, Fail, Drop> result = Queue();
+
+ PickResult() = default;
+ // NOLINTNEXTLINE(google-explicit-constructor)
+ PickResult(Complete complete) : result(std::move(complete)) {}
+ // NOLINTNEXTLINE(google-explicit-constructor)
+ PickResult(Queue queue) : result(queue) {}
+ // NOLINTNEXTLINE(google-explicit-constructor)
+ PickResult(Fail fail) : result(std::move(fail)) {}
+ // NOLINTNEXTLINE(google-explicit-constructor)
+ PickResult(Drop drop) : result(std::move(drop)) {}
};
/// A subchannel picker is the object used to pick the subchannel to
@@ -367,7 +390,7 @@ class LoadBalancingPolicy : public InternallyRefCounted<LoadBalancingPolicy> {
// Note: This must be invoked while holding the work_serializer.
void Orphan() override;
- // A picker that returns PICK_QUEUE for all picks.
+ // A picker that returns PickResult::Queue for all picks.
// Also calls the parent LB policy's ExitIdleLocked() method when the
// first pick is seen.
class QueuePicker : public SubchannelPicker {
@@ -384,16 +407,17 @@ class LoadBalancingPolicy : public InternallyRefCounted<LoadBalancingPolicy> {
bool exit_idle_called_ = false;
};
- // A picker that returns PICK_TRANSIENT_FAILURE for all picks.
+ // A picker that returns PickResult::Fail for all picks.
class TransientFailurePicker : public SubchannelPicker {
public:
- explicit TransientFailurePicker(grpc_error_handle error) : error_(error) {}
- ~TransientFailurePicker() override { GRPC_ERROR_UNREF(error_); }
+ explicit TransientFailurePicker(absl::Status status) : status_(status) {}
- PickResult Pick(PickArgs args) override;
+ PickResult Pick(PickArgs /*args*/) override {
+ return PickResult::Fail(status_);
+ }
private:
- grpc_error_handle error_;
+ absl::Status status_;
};
protected:
diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc
index 4b4f1ab6c0..ca50eda324 100644
--- a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc
+++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc
@@ -606,7 +606,6 @@ const char* GrpcLb::Serverlist::ShouldDrop() {
//
GrpcLb::PickResult GrpcLb::Picker::Pick(PickArgs args) {
- PickResult result;
// Check if we should drop the call.
const char* drop_token =
serverlist_ == nullptr ? nullptr : serverlist_->ShouldDrop();
@@ -619,16 +618,16 @@ GrpcLb::PickResult GrpcLb::Picker::Pick(PickArgs args) {
if (client_stats_ != nullptr) {
client_stats_->AddCallDropped(drop_token);
}
- result.type = PickResult::PICK_COMPLETE;
- return result;
+ return PickResult::Drop(
+ absl::UnavailableError("drop directed by grpclb balancer"));
}
// Forward pick to child policy.
- result = child_picker_->Pick(args);
+ PickResult result = child_picker_->Pick(args);
// If pick succeeded, add LB token to initial metadata.
- if (result.type == PickResult::PICK_COMPLETE &&
- result.subchannel != nullptr) {
+ auto* complete_pick = absl::get_if<PickResult::Complete>(&result.result);
+ if (complete_pick != nullptr) {
const SubchannelWrapper* subchannel_wrapper =
- static_cast<SubchannelWrapper*>(result.subchannel.get());
+ static_cast<SubchannelWrapper*>(complete_pick->subchannel.get());
// Encode client stats object into metadata for use by
// client_load_reporting filter.
GrpcLbClientStats* client_stats = subchannel_wrapper->client_stats();
@@ -654,7 +653,7 @@ GrpcLb::PickResult GrpcLb::Picker::Pick(PickArgs args) {
args.initial_metadata->Add(kGrpcLbLbTokenMetadataKey, lb_token);
}
// Unwrap subchannel to pass up to the channel.
- result.subchannel = subchannel_wrapper->wrapped_subchannel();
+ complete_pick->subchannel = subchannel_wrapper->wrapped_subchannel();
}
return result;
}
diff --git a/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc b/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc
index 6b7568c813..ba38a9f5a5 100644
--- a/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc
+++ b/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc
@@ -114,10 +114,7 @@ class PickFirst : public LoadBalancingPolicy {
: subchannel_(std::move(subchannel)) {}
PickResult Pick(PickArgs /*args*/) override {
- PickResult result;
- result.type = PickResult::PICK_COMPLETE;
- result.subchannel = subchannel_;
- return result;
+ return PickResult::Complete(subchannel_);
}
private:
@@ -197,12 +194,10 @@ void PickFirst::AttemptToConnectUsingLatestUpdateArgsLocked() {
// (If we are idle, then this will happen in ExitIdleLocked() if we
// haven't gotten a non-empty update by the time the application tries
// to start a new call.)
- grpc_error_handle error =
- grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING("Empty update"),
- GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
+ absl::Status status = absl::UnavailableError("Empty update");
channel_control_helper()->UpdateState(
- GRPC_CHANNEL_TRANSIENT_FAILURE, grpc_error_to_absl_status(error),
- absl::make_unique<TransientFailurePicker>(error));
+ GRPC_CHANNEL_TRANSIENT_FAILURE, status,
+ absl::make_unique<TransientFailurePicker>(status));
return;
}
// If one of the subchannels in the new list is already in state
@@ -314,13 +309,11 @@ void PickFirst::PickFirstSubchannelData::ProcessConnectivityChangeLocked(
p->subchannel_list_ = std::move(p->latest_pending_subchannel_list_);
// Set our state to that of the pending subchannel list.
if (p->subchannel_list_->in_transient_failure()) {
- grpc_error_handle error = grpc_error_set_int(
- GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "selected subchannel failed; switching to pending update"),
- GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
+ absl::Status status = absl::UnavailableError(
+ "selected subchannel failed; switching to pending update");
p->channel_control_helper()->UpdateState(
- GRPC_CHANNEL_TRANSIENT_FAILURE, grpc_error_to_absl_status(error),
- absl::make_unique<TransientFailurePicker>(error));
+ GRPC_CHANNEL_TRANSIENT_FAILURE, status,
+ absl::make_unique<TransientFailurePicker>(status));
} else {
p->channel_control_helper()->UpdateState(
GRPC_CHANNEL_CONNECTING, absl::Status(),
@@ -393,13 +386,11 @@ void PickFirst::PickFirstSubchannelData::ProcessConnectivityChangeLocked(
subchannel_list()->set_in_transient_failure(true);
// Only report new state in case 1.
if (subchannel_list() == p->subchannel_list_.get()) {
- grpc_error_handle error = grpc_error_set_int(
- GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "failed to connect to all addresses"),
- GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
+ absl::Status status =
+ absl::UnavailableError("failed to connect to all addresses");
p->channel_control_helper()->UpdateState(
- GRPC_CHANNEL_TRANSIENT_FAILURE, grpc_error_to_absl_status(error),
- absl::make_unique<TransientFailurePicker>(error));
+ GRPC_CHANNEL_TRANSIENT_FAILURE, status,
+ absl::make_unique<TransientFailurePicker>(status));
}
}
sd->CheckConnectivityStateAndStartWatchingLocked();
diff --git a/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc b/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc
index 3cd7c54187..1f8d44fdfb 100644
--- a/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc
+++ b/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc
@@ -472,12 +472,10 @@ void PriorityLb::TryNextPriorityLocked(bool report_connecting) {
this);
}
current_child_from_before_update_ = nullptr;
- grpc_error_handle error = grpc_error_set_int(
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("no ready priority"),
- GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
+ absl::Status status = absl::UnavailableError("no ready priority");
channel_control_helper()->UpdateState(
- GRPC_CHANNEL_TRANSIENT_FAILURE, grpc_error_to_absl_status(error),
- absl::make_unique<TransientFailurePicker>(error));
+ GRPC_CHANNEL_TRANSIENT_FAILURE, status,
+ absl::make_unique<TransientFailurePicker>(status));
}
void PriorityLb::SelectPriorityLocked(uint32_t priority) {
diff --git a/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc b/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc
index b59d97f792..8d033f2398 100644
--- a/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc
+++ b/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc
@@ -380,18 +380,12 @@ RingHash::Picker::Picker(RefCountedPtr<RingHash> parent,
}
RingHash::PickResult RingHash::Picker::Pick(PickArgs args) {
- PickResult result;
- // Initialize to PICK_FAILED.
- result.type = PickResult::PICK_FAILED;
auto hash =
args.call_state->ExperimentalGetCallAttribute(kRequestRingHashAttribute);
uint64_t h;
if (!absl::SimpleAtoi(hash, &h)) {
- result.error = grpc_error_set_int(
- GRPC_ERROR_CREATE_FROM_COPIED_STRING(
- absl::StrCat("xds ring hash value is not a number").c_str()),
- GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_INTERNAL);
- return result;
+ return PickResult::Fail(
+ absl::InternalError("xds ring hash value is not a number"));
}
// Ported from https://github.com/RJ/ketama/blob/master/libketama/ketama.c
// (ketama_get_server) NOTE: The algorithm depends on using signed integers
@@ -431,15 +425,12 @@ RingHash::PickResult RingHash::Picker::Pick(PickArgs args) {
};
switch (ring_[first_index].connectivity_state) {
case GRPC_CHANNEL_READY:
- result.type = PickResult::PICK_COMPLETE;
- result.subchannel = ring_[first_index].subchannel;
- return result;
+ return PickResult::Complete(ring_[first_index].subchannel);
case GRPC_CHANNEL_IDLE:
ScheduleSubchannelConnectionAttempt(ring_[first_index].subchannel);
- // fallthrough
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_CHANNEL_CONNECTING:
- result.type = PickResult::PICK_QUEUE;
- return result;
+ return PickResult::Queue();
default: // GRPC_CHANNEL_TRANSIENT_FAILURE
break;
}
@@ -455,18 +446,15 @@ RingHash::PickResult RingHash::Picker::Pick(PickArgs args) {
continue;
}
if (entry.connectivity_state == GRPC_CHANNEL_READY) {
- result.type = PickResult::PICK_COMPLETE;
- result.subchannel = entry.subchannel;
- return result;
+ return PickResult::Complete(entry.subchannel);
}
if (!found_second_subchannel) {
switch (entry.connectivity_state) {
case GRPC_CHANNEL_IDLE:
ScheduleSubchannelConnectionAttempt(entry.subchannel);
- // fallthrough
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_CHANNEL_CONNECTING:
- result.type = PickResult::PICK_QUEUE;
- return result;
+ return PickResult::Queue();
default:
break;
}
@@ -483,13 +471,8 @@ RingHash::PickResult RingHash::Picker::Pick(PickArgs args) {
}
}
}
- result.error =
- grpc_error_set_int(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
- absl::StrCat("xds ring hash found a subchannel "
- "that is in TRANSIENT_FAILURE state")
- .c_str()),
- GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_INTERNAL);
- return result;
+ return PickResult::Fail(absl::UnavailableError(
+ "xds ring hash found a subchannel that is in TRANSIENT_FAILURE state"));
}
//
@@ -580,13 +563,11 @@ bool RingHash::RingHashSubchannelList::UpdateRingHashConnectivityStateLocked() {
this));
return false;
}
- grpc_error* error =
- grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "connections to backend failing or idle"),
- GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
+ absl::Status status =
+ absl::UnavailableError("connections to backend failing or idle");
p->channel_control_helper()->UpdateState(
- GRPC_CHANNEL_TRANSIENT_FAILURE, grpc_error_to_absl_status(error),
- absl::make_unique<TransientFailurePicker>(error));
+ GRPC_CHANNEL_TRANSIENT_FAILURE, status,
+ absl::make_unique<TransientFailurePicker>(status));
return true;
}
@@ -724,12 +705,10 @@ void RingHash::UpdateLocked(UpdateArgs args) {
this, &grpc_lb_ring_hash_trace, std::move(addresses), *args.args);
if (subchannel_list_->num_subchannels() == 0) {
// If the new list is empty, immediately transition to TRANSIENT_FAILURE.
- grpc_error* error =
- grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING("Empty update"),
- GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
+ absl::Status status = absl::UnavailableError("Empty update");
channel_control_helper()->UpdateState(
- GRPC_CHANNEL_TRANSIENT_FAILURE, grpc_error_to_absl_status(error),
- absl::make_unique<TransientFailurePicker>(error));
+ GRPC_CHANNEL_TRANSIENT_FAILURE, status,
+ absl::make_unique<TransientFailurePicker>(status));
} else {
// Start watching the new list.
subchannel_list_->StartWatchingLocked();
diff --git a/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc b/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc
index 529d90d347..d8269fdc53 100644
--- a/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc
+++ b/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc
@@ -213,10 +213,7 @@ RoundRobin::PickResult RoundRobin::Picker::Pick(PickArgs /*args*/) {
parent_, this, last_picked_index_,
subchannels_[last_picked_index_].get());
}
- PickResult result;
- result.type = PickResult::PICK_COMPLETE;
- result.subchannel = subchannels_[last_picked_index_];
- return result;
+ return PickResult::Complete(subchannels_[last_picked_index_]);
}
//
@@ -331,13 +328,11 @@ void RoundRobin::RoundRobinSubchannelList::
absl::make_unique<QueuePicker>(p->Ref(DEBUG_LOCATION, "QueuePicker")));
} else if (num_transient_failure_ == num_subchannels()) {
/* 3) TRANSIENT_FAILURE */
- grpc_error_handle error =
- grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "connections to all backends failing"),
- GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
+ absl::Status status =
+ absl::UnavailableError("connections to all backends failing");
p->channel_control_helper()->UpdateState(
- GRPC_CHANNEL_TRANSIENT_FAILURE, grpc_error_to_absl_status(error),
- absl::make_unique<TransientFailurePicker>(error));
+ GRPC_CHANNEL_TRANSIENT_FAILURE, status,
+ absl::make_unique<TransientFailurePicker>(status));
}
}
@@ -449,12 +444,10 @@ void RoundRobin::UpdateLocked(UpdateArgs args) {
if (latest_pending_subchannel_list_->num_subchannels() == 0) {
// If the new list is empty, immediately promote the new list to the
// current list and transition to TRANSIENT_FAILURE.
- grpc_error_handle error =
- grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING("Empty update"),
- GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
+ absl::Status status = absl::UnavailableError("Empty update");
channel_control_helper()->UpdateState(
- GRPC_CHANNEL_TRANSIENT_FAILURE, grpc_error_to_absl_status(error),
- absl::make_unique<TransientFailurePicker>(error));
+ GRPC_CHANNEL_TRANSIENT_FAILURE, status,
+ absl::make_unique<TransientFailurePicker>(status));
subchannel_list_ = std::move(latest_pending_subchannel_list_);
} else if (subchannel_list_ == nullptr) {
// If there is no current list, immediately promote the new list to
diff --git a/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc b/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc
index ac1857be69..aab5f6fe93 100644
--- a/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc
+++ b/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc
@@ -387,12 +387,9 @@ void WeightedTargetLb::UpdateStateLocked() {
absl::make_unique<QueuePicker>(Ref(DEBUG_LOCATION, "QueuePicker"));
break;
default:
- grpc_error_handle error = grpc_error_set_int(
- GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "weighted_target: all children report state TRANSIENT_FAILURE"),
- GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
- status = grpc_error_to_absl_status(error);
- picker = absl::make_unique<TransientFailurePicker>(error);
+ status = absl::UnavailableError(
+ "weighted_target: all children report state TRANSIENT_FAILURE");
+ picker = absl::make_unique<TransientFailurePicker>(status);
}
channel_control_helper()->UpdateState(connectivity_state, status,
std::move(picker));
diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc b/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc
index 9097523563..1ac1aa4368 100644
--- a/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc
+++ b/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc
@@ -536,12 +536,12 @@ void CdsLb::OnError(const std::string& name, grpc_error_handle error) {
// policy (i.e., we have not yet received data from xds). Otherwise,
// we keep running with the data we had previously.
if (child_policy_ == nullptr) {
+ absl::Status status = grpc_error_to_absl_status(error);
channel_control_helper()->UpdateState(
- GRPC_CHANNEL_TRANSIENT_FAILURE, grpc_error_to_absl_status(error),
- absl::make_unique<TransientFailurePicker>(error));
- } else {
- GRPC_ERROR_UNREF(error);
+ GRPC_CHANNEL_TRANSIENT_FAILURE, status,
+ absl::make_unique<TransientFailurePicker>(status));
}
+ GRPC_ERROR_UNREF(error);
}
void CdsLb::OnResourceDoesNotExist(const std::string& name) {
@@ -549,15 +549,11 @@ void CdsLb::OnResourceDoesNotExist(const std::string& name) {
"[cdslb %p] CDS resource for %s does not exist -- reporting "
"TRANSIENT_FAILURE",
this, name.c_str());
- grpc_error_handle error =
- grpc_error_set_int(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
- absl::StrCat("CDS resource \"", config_->cluster(),
- "\" does not exist")
- .c_str()),
- GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
+ absl::Status status = absl::UnavailableError(
+ absl::StrCat("CDS resource \"", config_->cluster(), "\" does not exist"));
channel_control_helper()->UpdateState(
- GRPC_CHANNEL_TRANSIENT_FAILURE, grpc_error_to_absl_status(error),
- absl::make_unique<TransientFailurePicker>(error));
+ GRPC_CHANNEL_TRANSIENT_FAILURE, status,
+ absl::make_unique<TransientFailurePicker>(status));
MaybeDestroyChildPolicyLocked();
}
diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc
index 7dbba6467d..1e5b4508c2 100644
--- a/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc
+++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc
@@ -284,59 +284,51 @@ LoadBalancingPolicy::PickResult XdsClusterImplLb::Picker::Pick(
const std::string* drop_category;
if (drop_config_->ShouldDrop(&drop_category)) {
if (drop_stats_ != nullptr) drop_stats_->AddCallDropped(*drop_category);
- PickResult result;
- result.type = PickResult::PICK_COMPLETE;
- return result;
+ return PickResult::Drop(absl::UnavailableError(
+ absl::StrCat("EDS-configured drop: ", *drop_category)));
}
// Handle circuit breaking.
uint32_t current = call_counter_->Load();
// Check and see if we exceeded the max concurrent requests count.
if (current >= max_concurrent_requests_) {
if (drop_stats_ != nullptr) drop_stats_->AddUncategorizedDrops();
- PickResult result;
- result.type = PickResult::PICK_COMPLETE;
- return result;
+ return PickResult::Drop(absl::UnavailableError("circuit breaker drop"));
}
call_counter_->Increment();
// If we're not dropping the call, we should always have a child picker.
if (picker_ == nullptr) { // Should never happen.
- PickResult result;
- result.type = PickResult::PICK_FAILED;
- result.error = grpc_error_set_int(
- GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "xds_cluster_impl picker not given any child picker"),
- GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_INTERNAL);
call_counter_->Decrement();
- return result;
+ return PickResult::Fail(absl::InternalError(
+ "xds_cluster_impl picker not given any child picker"));
}
// Not dropping, so delegate to child picker.
PickResult result = picker_->Pick(args);
- if (result.type == result.PICK_COMPLETE && result.subchannel != nullptr) {
+ auto* complete_pick = absl::get_if<PickResult::Complete>(&result.result);
+ if (complete_pick != nullptr) {
XdsClusterLocalityStats* locality_stats = nullptr;
if (drop_stats_ != nullptr) { // If load reporting is enabled.
auto* subchannel_wrapper =
- static_cast<StatsSubchannelWrapper*>(result.subchannel.get());
+ static_cast<StatsSubchannelWrapper*>(complete_pick->subchannel.get());
// Handle load reporting.
locality_stats = subchannel_wrapper->locality_stats()->Ref().release();
// Record a call started.
locality_stats->AddCallStarted();
// Unwrap subchannel to pass back up the stack.
- result.subchannel = subchannel_wrapper->wrapped_subchannel();
+ complete_pick->subchannel = subchannel_wrapper->wrapped_subchannel();
}
// Intercept the recv_trailing_metadata op to record call completion.
auto* call_counter = call_counter_->Ref(DEBUG_LOCATION, "call").release();
auto original_recv_trailing_metadata_ready =
- result.recv_trailing_metadata_ready;
- result.recv_trailing_metadata_ready =
+ complete_pick->recv_trailing_metadata_ready;
+ complete_pick->recv_trailing_metadata_ready =
// Note: This callback does not run in either the control plane
// work serializer or in the data plane mutex.
[locality_stats, original_recv_trailing_metadata_ready, call_counter](
- grpc_error_handle error, MetadataInterface* metadata,
+ absl::Status status, MetadataInterface* metadata,
CallState* call_state) {
// Record call completion for load reporting.
if (locality_stats != nullptr) {
- const bool call_failed = error != GRPC_ERROR_NONE;
- locality_stats->AddCallFinished(call_failed);
+ locality_stats->AddCallFinished(!status.ok());
locality_stats->Unref(DEBUG_LOCATION, "LocalityStats+call");
}
// Decrement number of calls in flight.
@@ -344,7 +336,7 @@ LoadBalancingPolicy::PickResult XdsClusterImplLb::Picker::Pick(
call_counter->Unref(DEBUG_LOCATION, "call");
// Invoke the original recv_trailing_metadata_ready callback, if any.
if (original_recv_trailing_metadata_ready != nullptr) {
- original_recv_trailing_metadata_ready(error, metadata, call_state);
+ original_recv_trailing_metadata_ready(status, metadata, call_state);
}
};
} else {
diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc
index 1d4f1431db..dfd9a441b3 100644
--- a/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc
+++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc
@@ -212,15 +212,8 @@ XdsClusterManagerLb::PickResult XdsClusterManagerLb::ClusterPicker::Pick(
if (it != cluster_map_.end()) {
return it->second->Pick(args);
}
- PickResult result;
- result.type = PickResult::PICK_FAILED;
- result.error = grpc_error_set_int(
- GRPC_ERROR_CREATE_FROM_COPIED_STRING(
- absl::StrCat("xds cluster manager picker: unknown cluster \"",
- cluster_name, "\"")
- .c_str()),
- GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_INTERNAL);
- return result;
+ return PickResult::Fail(absl::InternalError(absl::StrCat(
+ "xds cluster manager picker: unknown cluster \"", cluster_name, "\"")));
}
//
diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc
index 8bdfd6ce91..ac222ed665 100644
--- a/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc
+++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc
@@ -1027,15 +1027,12 @@ XdsClusterResolverLb::CreateChildPolicyConfigLocked() {
"config -- "
"will put channel in TRANSIENT_FAILURE: %s",
this, grpc_error_std_string(error).c_str());
- error = grpc_error_set_int(
- grpc_error_add_child(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "xds_cluster_resolver LB policy: error "
- "parsing generated child policy config"),
- error),
- GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_INTERNAL);
+ absl::Status status = absl::InternalError(
+ "xds_cluster_resolver LB policy: error parsing generated child policy "
+ "config");
channel_control_helper()->UpdateState(
- GRPC_CHANNEL_TRANSIENT_FAILURE, grpc_error_to_absl_status(error),
- absl::make_unique<TransientFailurePicker>(error));
+ GRPC_CHANNEL_TRANSIENT_FAILURE, status,
+ absl::make_unique<TransientFailurePicker>(status));
return nullptr;
}
return config;
diff --git a/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc b/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc
index 069292ee51..da48e6fede 100644
--- a/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc
+++ b/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc
@@ -34,7 +34,6 @@
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/iomgr/closure.h"
#include "src/core/lib/iomgr/exec_ctx.h"
-#include "src/core/lib/surface/lame_client.h"
#include "src/core/lib/transport/timeout_encoding.h"
namespace grpc_core {
@@ -130,23 +129,68 @@ class XdsResolver : public Resolver {
RefCountedPtr<XdsResolver> resolver_;
};
- class ClusterState
- : public RefCounted<ClusterState, PolymorphicRefCount, kUnrefNoDelete> {
+ // An entry in the map of clusters that need to be present in the LB
+ // policy config. The map holds a weak ref. One strong ref is held by
+ // the ConfigSelector, and another is held by each call assigned to
+ // the cluster by the ConfigSelector. The ref for each call is held
+ // until the call is committed. When the strong refs go away, we hop
+ // back into the WorkSerializer to remove the entry from the map.
+ class ClusterState : public DualRefCounted<ClusterState> {
public:
using ClusterStateMap =
- std::map<std::string, std::unique_ptr<ClusterState>>;
+ std::map<std::string, WeakRefCountedPtr<ClusterState>>;
- ClusterState(const std::string& cluster_name,
- ClusterStateMap* cluster_state_map)
- : it_(cluster_state_map
- ->emplace(cluster_name, std::unique_ptr<ClusterState>(this))
+ ClusterState(RefCountedPtr<XdsResolver> resolver,
+ const std::string& cluster_name)
+ : resolver_(std::move(resolver)),
+ it_(resolver_->cluster_state_map_.emplace(cluster_name, WeakRef())
.first) {}
+
+ void Orphan() override {
+ auto* resolver = resolver_.release();
+ resolver->work_serializer_->Run(
+ [resolver]() {
+ resolver->MaybeRemoveUnusedClusters();
+ resolver->Unref();
+ },
+ DEBUG_LOCATION);
+ }
+
const std::string& cluster() const { return it_->first; }
private:
+ RefCountedPtr<XdsResolver> resolver_;
ClusterStateMap::iterator it_;
};
+ // Call dispatch controller, created for each call handled by the
+ // ConfigSelector. Holds a ref to the ClusterState object until the
+ // call is committed.
+ class XdsCallDispatchController
+ : public ConfigSelector::CallDispatchController {
+ public:
+ explicit XdsCallDispatchController(
+ RefCountedPtr<ClusterState> cluster_state)
+ : cluster_state_(std::move(cluster_state)) {}
+
+ bool ShouldRetry() override {
+ // TODO(donnadionne): Implement the retry circuit breaker here.
+ return true;
+ }
+
+ void Commit() override {
+ // TODO(donnadionne): If ShouldRetry() was called previously,
+ // decrement the retry circuit breaker counter.
+ cluster_state_.reset();
+ }
+
+ private:
+ // Note: The XdsCallDispatchController object is never actually destroyed,
+ // so do not add any data members that require destruction unless you have
+ // some other way to clean them up.
+ RefCountedPtr<ClusterState> cluster_state_;
+ };
+
class XdsConfigSelector : public ConfigSelector {
public:
XdsConfigSelector(RefCountedPtr<XdsResolver> resolver,
@@ -198,7 +242,6 @@ class XdsResolver : public Resolver {
RouteTable route_table_;
std::map<absl::string_view, RefCountedPtr<ClusterState>> clusters_;
std::vector<const grpc_channel_filter*> filters_;
- grpc_error_handle filter_error_ = GRPC_ERROR_NONE;
};
void OnListenerUpdate(XdsApi::LdsUpdate listener);
@@ -377,16 +420,8 @@ XdsResolver::XdsConfigSelector::XdsConfigSelector(
}
}
// Populate filter list.
- bool found_router = false;
for (const auto& http_filter :
resolver_->current_listener_.http_connection_manager.http_filters) {
- // Stop at the router filter. It's a no-op for us, and we ignore
- // anything that may come after it, for compatibility with Envoy.
- if (http_filter.config.config_proto_type_name ==
- kXdsHttpRouterFilterConfigName) {
- found_router = true;
- break;
- }
// Find filter. This is guaranteed to succeed, because it's checked
// at config validation time in the XdsApi code.
const XdsHttpFilterImpl* filter_impl =
@@ -394,16 +429,9 @@ XdsResolver::XdsConfigSelector::XdsConfigSelector(
http_filter.config.config_proto_type_name);
GPR_ASSERT(filter_impl != nullptr);
// Add C-core filter to list.
- filters_.push_back(filter_impl->channel_filter());
- }
- // For compatibility with Envoy, if the router filter is not
- // configured, we fail all RPCs.
- if (!found_router) {
- filter_error_ =
- grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "no xDS HTTP router filter configured"),
- GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
- filters_.push_back(&grpc_lame_filter);
+ if (filter_impl->channel_filter() != nullptr) {
+ filters_.push_back(filter_impl->channel_filter());
+ }
}
}
@@ -414,7 +442,6 @@ XdsResolver::XdsConfigSelector::~XdsConfigSelector() {
}
clusters_.clear();
resolver_->MaybeRemoveUnusedClusters();
- GRPC_ERROR_UNREF(filter_error_);
}
const XdsHttpFilterImpl::FilterConfig* FindFilterConfigOverride(
@@ -441,6 +468,42 @@ grpc_error_handle XdsResolver::XdsConfigSelector::CreateMethodConfig(
const XdsApi::Route::ClusterWeight* cluster_weight,
RefCountedPtr<ServiceConfig>* method_config) {
std::vector<std::string> fields;
+ // Set retry policy if any.
+ if (route.retry_policy.has_value()) {
+ std::vector<std::string> retry_parts;
+ retry_parts.push_back(absl::StrFormat(
+ "\"retryPolicy\": {\n"
+ " \"maxAttempts\": %d,\n"
+ " \"initialBackoff\": \"%d.%09ds\",\n"
+ " \"maxBackoff\": \"%d.%09ds\",\n"
+ " \"backoffMultiplier\": 2,\n",
+ route.retry_policy->num_retries + 1,
+ route.retry_policy->retry_back_off.base_interval.seconds,
+ route.retry_policy->retry_back_off.base_interval.nanos,
+ route.retry_policy->retry_back_off.max_interval.seconds,
+ route.retry_policy->retry_back_off.max_interval.nanos));
+ std::vector<std::string> code_parts;
+ if (route.retry_policy->retry_on.Contains(GRPC_STATUS_CANCELLED)) {
+ code_parts.push_back(" \"CANCELLED\"");
+ }
+ if (route.retry_policy->retry_on.Contains(GRPC_STATUS_DEADLINE_EXCEEDED)) {
+ code_parts.push_back(" \"DEADLINE_EXCEEDED\"");
+ }
+ if (route.retry_policy->retry_on.Contains(GRPC_STATUS_INTERNAL)) {
+ code_parts.push_back(" \"INTERNAL\"");
+ }
+ if (route.retry_policy->retry_on.Contains(GRPC_STATUS_RESOURCE_EXHAUSTED)) {
+ code_parts.push_back(" \"RESOURCE_EXHAUSTED\"");
+ }
+ if (route.retry_policy->retry_on.Contains(GRPC_STATUS_UNAVAILABLE)) {
+ code_parts.push_back(" \"UNAVAILABLE\"");
+ }
+ retry_parts.push_back(
+ absl::StrFormat(" \"retryableStatusCodes\": [\n %s ]\n",
+ absl::StrJoin(code_parts, ",\n")));
+ retry_parts.push_back(absl::StrFormat(" }"));
+ fields.emplace_back(absl::StrJoin(retry_parts, ""));
+ }
// Set timeout.
if (route.max_stream_duration.has_value() &&
(route.max_stream_duration->seconds != 0 ||
@@ -454,18 +517,15 @@ grpc_error_handle XdsResolver::XdsConfigSelector::CreateMethodConfig(
grpc_channel_args* args = grpc_channel_args_copy(resolver_->args_);
for (const auto& http_filter :
resolver_->current_listener_.http_connection_manager.http_filters) {
- // Stop at the router filter. It's a no-op for us, and we ignore
- // anything that may come after it, for compatibility with Envoy.
- if (http_filter.config.config_proto_type_name ==
- kXdsHttpRouterFilterConfigName) {
- break;
- }
// Find filter. This is guaranteed to succeed, because it's checked
// at config validation time in the XdsApi code.
const XdsHttpFilterImpl* filter_impl =
XdsHttpFilterRegistry::GetFilterForType(
http_filter.config.config_proto_type_name);
GPR_ASSERT(filter_impl != nullptr);
+ // If there is not actually any C-core filter associated with this
+ // xDS filter, then it won't need any config, so skip it.
+ if (filter_impl->channel_filter() == nullptr) continue;
// Allow filter to add channel args that may affect service config
// parsing.
args = filter_impl->ModifyChannelArgs(args);
@@ -513,20 +573,14 @@ grpc_error_handle XdsResolver::XdsConfigSelector::CreateMethodConfig(
grpc_channel_args* XdsResolver::XdsConfigSelector::ModifyChannelArgs(
grpc_channel_args* args) {
- if (filter_error_ == GRPC_ERROR_NONE) return args;
- grpc_arg error_arg = MakeLameClientErrorArg(filter_error_);
- grpc_channel_args* new_args =
- grpc_channel_args_copy_and_add(args, &error_arg, 1);
- grpc_channel_args_destroy(args);
- return new_args;
+ return args;
}
void XdsResolver::XdsConfigSelector::MaybeAddCluster(const std::string& name) {
if (clusters_.find(name) == clusters_.end()) {
auto it = resolver_->cluster_state_map_.find(name);
if (it == resolver_->cluster_state_map_.end()) {
- auto new_cluster_state =
- MakeRefCounted<ClusterState>(name, &resolver_->cluster_state_map_);
+ auto new_cluster_state = MakeRefCounted<ClusterState>(resolver_, name);
clusters_[new_cluster_state->cluster()] = std::move(new_cluster_state);
} else {
clusters_[it->second->cluster()] = it->second->Ref();
@@ -641,10 +695,7 @@ ConfigSelector::CallConfig XdsResolver::XdsConfigSelector::GetCallConfig(
}
auto it = clusters_.find(cluster_name);
GPR_ASSERT(it != clusters_.end());
- XdsResolver* resolver =
- static_cast<XdsResolver*>(resolver_->Ref().release());
- ClusterState* cluster_state = it->second->Ref().release();
- // Generate a hash
+ // Generate a hash.
absl::optional<uint64_t> hash;
for (const auto& hash_policy : entry.route.hash_policies) {
absl::optional<uint64_t> new_hash;
@@ -653,8 +704,8 @@ ConfigSelector::CallConfig XdsResolver::XdsConfigSelector::GetCallConfig(
new_hash = HeaderHashHelper(hash_policy, args.initial_metadata);
break;
case XdsApi::Route::HashPolicy::CHANNEL_ID:
- new_hash =
- static_cast<uint64_t>(reinterpret_cast<uintptr_t>(resolver));
+ new_hash = static_cast<uint64_t>(
+ reinterpret_cast<uintptr_t>(resolver_.get()));
break;
default:
GPR_ASSERT(0);
@@ -694,31 +745,8 @@ ConfigSelector::CallConfig XdsResolver::XdsConfigSelector::GetCallConfig(
memcpy(hash_value, hash_string.c_str(), hash_string.size());
hash_value[hash_string.size()] = '\0';
call_config.call_attributes[kRequestRingHashAttribute] = hash_value;
- call_config.on_call_committed = [resolver, cluster_state]() {
- cluster_state->Unref();
- ExecCtx::Run(
- // TODO(roth): This hop into the ExecCtx is being done to avoid
- // entering the WorkSerializer while holding the client channel data
- // plane mutex, since that can lead to deadlocks. However, we should
- // not have to solve this problem in each individual ConfigSelector
- // implementation. When we have time, we should fix the client channel
- // code to avoid this by not invoking the
- // CallConfig::on_call_committed callback until after it has released
- // the data plane mutex.
- DEBUG_LOCATION,
- GRPC_CLOSURE_CREATE(
- [](void* arg, grpc_error_handle /*error*/) {
- auto* resolver = static_cast<XdsResolver*>(arg);
- resolver->work_serializer_->Run(
- [resolver]() {
- resolver->MaybeRemoveUnusedClusters();
- resolver->Unref();
- },
- DEBUG_LOCATION);
- },
- resolver, nullptr),
- GRPC_ERROR_NONE);
- };
+ call_config.call_dispatch_controller =
+ args.arena->New<XdsCallDispatchController>(it->second->Ref());
return call_config;
}
return CallConfig();
diff --git a/src/core/ext/filters/client_channel/retry_filter.cc b/src/core/ext/filters/client_channel/retry_filter.cc
index 2f0432fd4e..975001d9bd 100644
--- a/src/core/ext/filters/client_channel/retry_filter.cc
+++ b/src/core/ext/filters/client_channel/retry_filter.cc
@@ -88,9 +88,7 @@
// TODO(roth): In subsequent PRs:
// - add support for transparent retries (including initial metadata)
-// - figure out how to record stats in census for retries
-// (census filter is on top of this one)
-// - add census stats for retries
+// - implement hedging
// By default, we buffer 256 KiB per RPC for retries.
// TODO(roth): Do we have any data to suggest a better value?
@@ -216,6 +214,8 @@ class RetryFilter::CallData {
explicit CallAttempt(CallData* calld);
~CallAttempt() override;
+ bool lb_call_committed() const { return lb_call_committed_; }
+
// Constructs and starts whatever batches are needed on this call
// attempt.
void StartRetriableBatches();
@@ -255,7 +255,7 @@ class RetryFilter::CallData {
// Adds retriable recv_trailing_metadata op.
void AddRetriableRecvTrailingMetadataOp();
// Adds cancel_stream op.
- void AddCancelStreamOp();
+ void AddCancelStreamOp(grpc_error_handle error);
private:
// Frees cached send ops that were completed by the completed batch in
@@ -263,21 +263,25 @@ class RetryFilter::CallData {
// committed.
void FreeCachedSendOpDataForCompletedBatch();
- // Invokes recv_initial_metadata_ready for a batch.
- static void InvokeRecvInitialMetadataCallback(void* arg,
- grpc_error_handle error);
+ // If there is a pending recv_initial_metadata op, adds a closure
+ // to closures for recv_initial_metadata_ready.
+ void MaybeAddClosureForRecvInitialMetadataCallback(
+ grpc_error_handle error, CallCombinerClosureList* closures);
// Intercepts recv_initial_metadata_ready callback for retries.
// Commits the call and returns the initial metadata up the stack.
static void RecvInitialMetadataReady(void* arg, grpc_error_handle error);
- // Invokes recv_message_ready for a batch.
- static void InvokeRecvMessageCallback(void* arg, grpc_error_handle error);
+ // If there is a pending recv_message op, adds a closure to closures
+ // for recv_message_ready.
+ void MaybeAddClosureForRecvMessageCallback(
+ grpc_error_handle error, CallCombinerClosureList* closures);
// Intercepts recv_message_ready callback for retries.
// Commits the call and returns the message up the stack.
static void RecvMessageReady(void* arg, grpc_error_handle error);
- // Adds recv_trailing_metadata_ready closure to closures.
- void AddClosureForRecvTrailingMetadataReady(
+ // If there is a pending recv_trailing_metadata op, adds a closure to
+ // closures for recv_trailing_metadata_ready.
+ void MaybeAddClosureForRecvTrailingMetadataReady(
grpc_error_handle error, CallCombinerClosureList* closures);
// Adds any necessary closures for deferred batch completion
// callbacks to closures.
@@ -306,6 +310,10 @@ class RetryFilter::CallData {
// Callback used to intercept on_complete from LB calls.
static void OnComplete(void* arg, grpc_error_handle error);
+ // Callback used to handle on_complete for internally generated
+ // cancel_stream op.
+ static void OnCompleteForCancelOp(void* arg, grpc_error_handle error);
+
RefCountedPtr<CallAttempt> call_attempt_;
// The batch to use in the LB call.
// Its payload field points to CallAttempt::batch_payload_.
@@ -314,6 +322,30 @@ class RetryFilter::CallData {
grpc_closure on_complete_;
};
+ class AttemptDispatchController
+ : public ConfigSelector::CallDispatchController {
+ public:
+ explicit AttemptDispatchController(CallAttempt* call_attempt)
+ : call_attempt_(call_attempt) {}
+
+ // Will never be called.
+ bool ShouldRetry() override { return false; }
+
+ void Commit() override {
+ call_attempt_->lb_call_committed_ = true;
+ auto* calld = call_attempt_->calld_;
+ if (calld->retry_committed_) {
+ auto* service_config_call_data = static_cast<ServiceConfigCallData*>(
+ calld->call_context_[GRPC_CONTEXT_SERVICE_CONFIG_CALL_DATA]
+ .value);
+ service_config_call_data->call_dispatch_controller()->Commit();
+ }
+ }
+
+ private:
+ CallAttempt* call_attempt_;
+ };
+
// Creates a BatchData object on the call's arena with the
// specified refcount. If set_on_complete is true, the batch's
// on_complete callback will be set to point to on_complete();
@@ -333,14 +365,26 @@ class RetryFilter::CallData {
const char* reason,
CallCombinerClosureList* closures);
+ // Helper function used to start a recv_trailing_metadata batch. This
+ // is used in the case where a recv_initial_metadata or recv_message
+ // op fails in a way that we know the call is over but when the application
+ // has not yet started its own recv_trailing_metadata op.
+ void AddBatchForInternalRecvTrailingMetadata(
+ CallCombinerClosureList* closures);
+
+ // Adds a batch to closures to cancel this call attempt.
+ void AddBatchForCancelOp(grpc_error_handle error,
+ CallCombinerClosureList* closures);
+
// Adds batches for pending batches to closures.
void AddBatchesForPendingBatches(CallCombinerClosureList* closures);
// Adds whatever batches are needed on this attempt to closures.
void AddRetriableBatches(CallCombinerClosureList* closures);
- // Returns true if any op in the batch was not yet started on this attempt.
- bool PendingBatchIsUnstarted(PendingBatch* pending);
+ // Returns true if any send op in the batch was not yet started on this
+ // attempt.
+ bool PendingBatchContainsUnstartedSendOps(PendingBatch* pending);
// Returns true if there are cached send ops to replay.
bool HaveSendOpsToReplay();
@@ -350,28 +394,23 @@ class RetryFilter::CallData {
// its ref to us.
void MaybeSwitchToFastPath();
- // Helper function used to start a recv_trailing_metadata batch. This
- // is used in the case where a recv_initial_metadata or recv_message
- // op fails in a way that we know the call is over but when the application
- // has not yet started its own recv_trailing_metadata op.
- void StartInternalRecvTrailingMetadata();
-
// Returns true if the call should be retried.
// If server_pushback_md is non-null, sets *server_pushback_ms.
bool ShouldRetry(absl::optional<grpc_status_code> status, bool is_lb_drop,
grpc_mdelem* server_pushback_md,
grpc_millis* server_pushback_ms);
- // Cancels the call attempt. Unrefs any deferred batches.
- // Adds a batch to closures to cancel this call attempt.
- void Cancel(CallCombinerClosureList* closures);
+ // Abandons the call attempt. Unrefs any deferred batches.
+ void Abandon();
static void OnPerAttemptRecvTimer(void* arg, grpc_error_handle error);
static void OnPerAttemptRecvTimerLocked(void* arg, grpc_error_handle error);
void MaybeCancelPerAttemptRecvTimer();
CallData* calld_;
- RefCountedPtr<ClientChannel::LoadBalancedCall> lb_call_;
+ AttemptDispatchController attempt_dispatch_controller_;
+ OrphanablePtr<ClientChannel::LoadBalancedCall> lb_call_;
+ bool lb_call_committed_ = false;
grpc_timer per_attempt_recv_timer_;
grpc_closure on_per_attempt_recv_timer_;
@@ -422,8 +461,16 @@ class RetryFilter::CallData {
grpc_error_handle recv_initial_metadata_error_ = GRPC_ERROR_NONE;
RefCountedPtr<BatchData> recv_message_ready_deferred_batch_;
grpc_error_handle recv_message_error_ = GRPC_ERROR_NONE;
- RefCountedPtr<BatchData> on_complete_deferred_batch_;
- grpc_error_handle on_complete_error_ = GRPC_ERROR_NONE;
+ struct OnCompleteDeferredBatch {
+ OnCompleteDeferredBatch(RefCountedPtr<BatchData> batch,
+ grpc_error_handle error)
+ : batch(std::move(batch)), error(error) {}
+ RefCountedPtr<BatchData> batch;
+ grpc_error_handle error;
+ };
+ // There cannot be more than 3 pending send op batches at a time.
+ absl::InlinedVector<OnCompleteDeferredBatch, 3>
+ on_complete_deferred_batches_;
RefCountedPtr<BatchData> recv_trailing_metadata_internal_batch_;
grpc_error_handle recv_trailing_metadata_error_ = GRPC_ERROR_NONE;
bool seen_recv_trailing_metadata_from_surface_ : 1;
@@ -431,7 +478,7 @@ class RetryFilter::CallData {
// save space but will also result in a data race because compiler
// will generate a 2 byte store which overwrites the meta-data
// fields upon setting this field.
- bool cancelled_ : 1;
+ bool abandoned_ : 1;
};
CallData(RetryFilter* chand, const grpc_call_element_args& args);
@@ -472,7 +519,8 @@ class RetryFilter::CallData {
static void OnRetryTimer(void* arg, grpc_error_handle error);
static void OnRetryTimerLocked(void* arg, grpc_error_handle error);
- RefCountedPtr<ClientChannel::LoadBalancedCall> CreateLoadBalancedCall();
+ OrphanablePtr<ClientChannel::LoadBalancedCall> CreateLoadBalancedCall(
+ ConfigSelector::CallDispatchController* call_dispatch_controller);
void CreateCallAttempt();
@@ -483,13 +531,14 @@ class RetryFilter::CallData {
BackOff retry_backoff_;
grpc_slice path_; // Request path.
- gpr_cycle_counter call_start_time_;
grpc_millis deadline_;
Arena* arena_;
grpc_call_stack* owning_call_;
CallCombiner* call_combiner_;
grpc_call_context_element* call_context_;
+ grpc_error_handle cancelled_from_surface_ = GRPC_ERROR_NONE;
+
RefCountedPtr<CallStackDestructionBarrier> call_stack_destruction_barrier_;
// TODO(roth): As part of implementing hedging, we will need to maintain a
@@ -500,7 +549,7 @@ class RetryFilter::CallData {
// LB call used when we've committed to a call attempt and the retry
// state for that attempt is no longer needed. This provides a fast
// path for long-running streaming calls that minimizes overhead.
- RefCountedPtr<ClientChannel::LoadBalancedCall> committed_call_;
+ OrphanablePtr<ClientChannel::LoadBalancedCall> committed_call_;
// When are are not yet fully committed to a particular call (i.e.,
// either we might still retry or we have committed to the call but
@@ -614,6 +663,7 @@ RetryFilter::CallData::CallAttempt::CallAttempt(CallData* calld)
: RefCounted(GRPC_TRACE_FLAG_ENABLED(grpc_retry_trace) ? "CallAttempt"
: nullptr),
calld_(calld),
+ attempt_dispatch_controller_(this),
batch_payload_(calld->call_context_),
started_send_initial_metadata_(false),
completed_send_initial_metadata_(false),
@@ -624,8 +674,8 @@ RetryFilter::CallData::CallAttempt::CallAttempt(CallData* calld)
started_recv_trailing_metadata_(false),
completed_recv_trailing_metadata_(false),
seen_recv_trailing_metadata_from_surface_(false),
- cancelled_(false) {
- lb_call_ = calld->CreateLoadBalancedCall();
+ abandoned_(false) {
+ lb_call_ = calld->CreateLoadBalancedCall(&attempt_dispatch_controller_);
if (GRPC_TRACE_FLAG_ENABLED(grpc_retry_trace)) {
gpr_log(GPR_INFO, "chand=%p calld=%p attempt=%p: create lb_call=%p",
calld->chand_, calld, this, lb_call_.get());
@@ -677,13 +727,9 @@ void RetryFilter::CallData::CallAttempt::FreeCachedSendOpDataAfterCommit() {
}
}
-bool RetryFilter::CallData::CallAttempt::PendingBatchIsUnstarted(
+bool RetryFilter::CallData::CallAttempt::PendingBatchContainsUnstartedSendOps(
PendingBatch* pending) {
- // Only look at batches containing send ops, since batches containing
- // only recv ops are always started immediately.
- if (pending->batch == nullptr || pending->batch->on_complete == nullptr) {
- return false;
- }
+ if (pending->batch->on_complete == nullptr) return false;
if (pending->batch->send_initial_metadata &&
!started_send_initial_metadata_) {
return true;
@@ -712,8 +758,8 @@ void RetryFilter::CallData::CallAttempt::MaybeSwitchToFastPath() {
// If we're not yet committed, we can't switch yet.
// TODO(roth): As part of implementing hedging, this logic needs to
// check that *this* call attempt is the one that we've committed to.
- // Might need to replace cancelled_ with an enum indicating whether we're
- // in flight, cancelled, or the winning call attempt.
+ // Might need to replace abandoned_ with an enum indicating whether we're
+ // in flight, abandoned, or the winning call attempt.
if (!calld_->retry_committed_) return;
// If we've already switched to fast path, there's nothing to do here.
if (calld_->committed_call_ != nullptr) return;
@@ -735,24 +781,6 @@ void RetryFilter::CallData::CallAttempt::MaybeSwitchToFastPath() {
calld_->call_attempt_.reset(DEBUG_LOCATION, "MaybeSwitchToFastPath");
}
-void RetryFilter::CallData::CallAttempt::StartInternalRecvTrailingMetadata() {
- if (GRPC_TRACE_FLAG_ENABLED(grpc_retry_trace)) {
- gpr_log(GPR_INFO,
- "chand=%p calld=%p attempt=%p: call failed but "
- "recv_trailing_metadata not started; starting it internally",
- calld_->chand_, calld_, this);
- }
- // Create batch_data with 2 refs, since this batch will be unreffed twice:
- // once for the recv_trailing_metadata_ready callback when the batch
- // completes, and again when we actually get a recv_trailing_metadata
- // op from the surface.
- BatchData* batch_data = CreateBatch(2, false /* set_on_complete */);
- batch_data->AddRetriableRecvTrailingMetadataOp();
- recv_trailing_metadata_internal_batch_.reset(batch_data);
- // Note: This will release the call combiner.
- lb_call_->StartTransportStreamOpBatch(batch_data->batch());
-}
-
// If there are any cached send ops that need to be replayed on the
// current call attempt, creates and returns a new batch to replay those ops.
// Otherwise, returns nullptr.
@@ -836,12 +864,40 @@ void RetryFilter::CallData::CallAttempt::AddClosureForBatch(
closures->Add(&batch->handler_private.closure, GRPC_ERROR_NONE, reason);
}
+void RetryFilter::CallData::CallAttempt::
+ AddBatchForInternalRecvTrailingMetadata(CallCombinerClosureList* closures) {
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_retry_trace)) {
+ gpr_log(GPR_INFO,
+ "chand=%p calld=%p attempt=%p: call failed but "
+ "recv_trailing_metadata not started; starting it internally",
+ calld_->chand_, calld_, this);
+ }
+ // Create batch_data with 2 refs, since this batch will be unreffed twice:
+ // once for the recv_trailing_metadata_ready callback when the batch
+ // completes, and again when we actually get a recv_trailing_metadata
+ // op from the surface.
+ BatchData* batch_data = CreateBatch(2, false /* set_on_complete */);
+ batch_data->AddRetriableRecvTrailingMetadataOp();
+ recv_trailing_metadata_internal_batch_.reset(batch_data);
+ AddClosureForBatch(batch_data->batch(),
+ "starting internal recv_trailing_metadata", closures);
+}
+
+void RetryFilter::CallData::CallAttempt::AddBatchForCancelOp(
+ grpc_error_handle error, CallCombinerClosureList* closures) {
+ BatchData* cancel_batch_data = CreateBatch(1, /*set_on_complete=*/true);
+ cancel_batch_data->AddCancelStreamOp(error);
+ AddClosureForBatch(cancel_batch_data->batch(),
+ "start cancellation batch on call attempt", closures);
+}
+
void RetryFilter::CallData::CallAttempt::AddBatchesForPendingBatches(
CallCombinerClosureList* closures) {
for (size_t i = 0; i < GPR_ARRAY_SIZE(calld_->pending_batches_); ++i) {
PendingBatch* pending = &calld_->pending_batches_[i];
grpc_transport_stream_op_batch* batch = pending->batch;
if (batch == nullptr) continue;
+ bool has_send_ops = false;
// Skip any batch that either (a) has already been started on this
// call attempt or (b) we can't start yet because we're still
// replaying send ops that need to be completed first.
@@ -852,60 +908,84 @@ void RetryFilter::CallData::CallAttempt::AddBatchesForPendingBatches(
// starting a recv op due to it being in the same batch with a send
// op. If/when we revamp the callback protocol in
// transport_stream_op_batch, we may be able to fix this.
- if (batch->send_initial_metadata && started_send_initial_metadata_) {
- continue;
+ if (batch->send_initial_metadata) {
+ if (started_send_initial_metadata_) continue;
+ has_send_ops = true;
}
- if (batch->send_message &&
- completed_send_message_count_ < started_send_message_count_) {
- continue;
+ if (batch->send_message) {
+ if (completed_send_message_count_ < started_send_message_count_) {
+ continue;
+ }
+ has_send_ops = true;
}
// Note that we only start send_trailing_metadata if we have no more
// send_message ops to start, since we can't send down any more
// send_message ops after send_trailing_metadata.
- if (batch->send_trailing_metadata &&
- (started_send_message_count_ + batch->send_message <
- calld_->send_messages_.size() ||
- started_send_trailing_metadata_)) {
- continue;
+ if (batch->send_trailing_metadata) {
+ if (started_send_message_count_ + batch->send_message <
+ calld_->send_messages_.size() ||
+ started_send_trailing_metadata_) {
+ continue;
+ }
+ has_send_ops = true;
}
- if (batch->recv_initial_metadata && started_recv_initial_metadata_) {
- continue;
+ int num_callbacks = has_send_ops; // All send ops share one callback.
+ if (batch->recv_initial_metadata) {
+ if (started_recv_initial_metadata_) continue;
+ ++num_callbacks;
}
- if (batch->recv_message &&
- completed_recv_message_count_ < started_recv_message_count_) {
- continue;
+ if (batch->recv_message) {
+ if (completed_recv_message_count_ < started_recv_message_count_) {
+ continue;
+ }
+ ++num_callbacks;
}
- if (batch->recv_trailing_metadata && started_recv_trailing_metadata_) {
- seen_recv_trailing_metadata_from_surface_ = true;
- // If we previously completed a recv_trailing_metadata op
- // initiated by StartInternalRecvTrailingMetadata(), use the
- // result of that instead of trying to re-start this op.
- if (GPR_UNLIKELY(recv_trailing_metadata_internal_batch_ != nullptr)) {
- // If the batch completed, then trigger the completion callback
- // directly, so that we return the previously returned results to
- // the application. Otherwise, just unref the internally started
- // batch, since we'll propagate the completion when it completes.
- if (completed_recv_trailing_metadata_) {
- closures->Add(
- &recv_trailing_metadata_ready_, recv_trailing_metadata_error_,
- "re-executing recv_trailing_metadata_ready to propagate "
- "internally triggered result");
- // Ref will be released by callback.
- recv_trailing_metadata_internal_batch_.release();
- } else {
- recv_trailing_metadata_internal_batch_.reset(
- DEBUG_LOCATION,
- "internally started recv_trailing_metadata batch pending and "
- "recv_trailing_metadata started from surface");
- GRPC_ERROR_UNREF(recv_trailing_metadata_error_);
+ if (batch->recv_trailing_metadata) {
+ if (started_recv_trailing_metadata_) {
+ seen_recv_trailing_metadata_from_surface_ = true;
+ // If we previously completed a recv_trailing_metadata op
+ // initiated by AddBatchForInternalRecvTrailingMetadata(), use the
+ // result of that instead of trying to re-start this op.
+ if (GPR_UNLIKELY(recv_trailing_metadata_internal_batch_ != nullptr)) {
+ // If the batch completed, then trigger the completion callback
+ // directly, so that we return the previously returned results to
+ // the application. Otherwise, just unref the internally started
+ // batch, since we'll propagate the completion when it completes.
+ if (completed_recv_trailing_metadata_) {
+ closures->Add(
+ &recv_trailing_metadata_ready_, recv_trailing_metadata_error_,
+ "re-executing recv_trailing_metadata_ready to propagate "
+ "internally triggered result");
+ // Ref will be released by callback.
+ recv_trailing_metadata_internal_batch_.release();
+ } else {
+ recv_trailing_metadata_internal_batch_.reset(
+ DEBUG_LOCATION,
+ "internally started recv_trailing_metadata batch pending and "
+ "recv_trailing_metadata started from surface");
+ GRPC_ERROR_UNREF(recv_trailing_metadata_error_);
+ }
+ recv_trailing_metadata_error_ = GRPC_ERROR_NONE;
}
- recv_trailing_metadata_error_ = GRPC_ERROR_NONE;
+ // We don't want the fact that we've already started this op internally
+ // to prevent us from adding a batch that may contain other ops.
+ // Instead, we'll just skip adding this op below.
+ if (num_callbacks == 0) continue;
+ } else {
+ ++num_callbacks;
}
- continue;
}
- // If we're already committed and these send ops aren't cached, just send
- // the batch as-is.
- if (calld_->retry_committed_ && !pending->send_ops_cached) {
+ // If we're already committed and the following conditions are met,
+ // just send the batch down as-is:
+ // - The batch contains no cached send ops. (If it does, we need
+ // the logic below to use the cached payloads.)
+ // - The batch does not contain recv_trailing_metadata when we have
+ // already started an internal recv_trailing_metadata batch. (If
+ // we've already started an internal recv_trailing_metadata batch,
+ // then we need the logic below to send all ops in the batch
+ // *except* the recv_trailing_metadata op.)
+ if (calld_->retry_committed_ && !pending->send_ops_cached &&
+ (!batch->recv_trailing_metadata || !started_recv_trailing_metadata_)) {
AddClosureForBatch(
batch,
"start non-replayable pending batch on call attempt after commit",
@@ -914,12 +994,6 @@ void RetryFilter::CallData::CallAttempt::AddBatchesForPendingBatches(
continue;
}
// Create batch with the right number of callbacks.
- const bool has_send_ops = batch->send_initial_metadata ||
- batch->send_message ||
- batch->send_trailing_metadata;
- const int num_callbacks = has_send_ops + batch->recv_initial_metadata +
- batch->recv_message +
- batch->recv_trailing_metadata;
BatchData* batch_data =
CreateBatch(num_callbacks, has_send_ops /* set_on_complete */);
// Cache send ops if needed.
@@ -947,7 +1021,7 @@ void RetryFilter::CallData::CallAttempt::AddBatchesForPendingBatches(
batch_data->AddRetriableRecvMessageOp();
}
// recv_trailing_metadata.
- if (batch->recv_trailing_metadata) {
+ if (batch->recv_trailing_metadata && !started_recv_trailing_metadata_) {
batch_data->AddRetriableRecvTrailingMetadataOp();
}
AddClosureForBatch(batch_data->batch(),
@@ -1084,14 +1158,24 @@ bool RetryFilter::CallData::CallAttempt::ShouldRetry(
*server_pushback_ms = static_cast<grpc_millis>(ms);
}
}
+ // Check with call dispatch controller.
+ auto* service_config_call_data = static_cast<ServiceConfigCallData*>(
+ calld_->call_context_[GRPC_CONTEXT_SERVICE_CONFIG_CALL_DATA].value);
+ if (!service_config_call_data->call_dispatch_controller()->ShouldRetry()) {
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_retry_trace)) {
+ gpr_log(
+ GPR_INFO,
+ "chand=%p calld=%p attempt=%p: call dispatch controller denied retry",
+ calld_->chand_, calld_, this);
+ }
+ return false;
+ }
// We should retry.
return true;
}
-void RetryFilter::CallData::CallAttempt::Cancel(
- CallCombinerClosureList* closures) {
- // Record that this attempt has been cancelled.
- cancelled_ = true;
+void RetryFilter::CallData::CallAttempt::Abandon() {
+ abandoned_ = true;
// Unref batches for deferred completion callbacks that will now never
// be invoked.
if (started_recv_trailing_metadata_ &&
@@ -1112,17 +1196,12 @@ void RetryFilter::CallData::CallAttempt::Cancel(
DEBUG_LOCATION, "unref deferred recv_message_ready batch due to retry");
GRPC_ERROR_UNREF(recv_message_error_);
recv_message_error_ = GRPC_ERROR_NONE;
- on_complete_deferred_batch_.reset(
- DEBUG_LOCATION, "unref deferred on_complete batch due to retry");
- GRPC_ERROR_UNREF(on_complete_error_);
- on_complete_error_ = GRPC_ERROR_NONE;
- // Start a cancellation op on this call attempt to make sure the
- // transport knows that this call should be cleaned up, even if it
- // hasn't received any ops.
- BatchData* cancel_batch_data = CreateBatch(1, /*set_on_complete=*/true);
- cancel_batch_data->AddCancelStreamOp();
- AddClosureForBatch(cancel_batch_data->batch(),
- "start cancellation batch on call attempt", closures);
+ for (auto& on_complete_deferred_batch : on_complete_deferred_batches_) {
+ on_complete_deferred_batch.batch.reset(
+ DEBUG_LOCATION, "unref deferred on_complete batch due to retry");
+ GRPC_ERROR_UNREF(on_complete_deferred_batch.error);
+ }
+ on_complete_deferred_batches_.clear();
}
void RetryFilter::CallData::CallAttempt::OnPerAttemptRecvTimer(
@@ -1154,11 +1233,17 @@ void RetryFilter::CallData::CallAttempt::OnPerAttemptRecvTimerLocked(
// Cancel this attempt.
// TODO(roth): When implementing hedging, we should not cancel the
// current attempt.
- call_attempt->Cancel(&closures);
+ call_attempt->AddBatchForCancelOp(
+ grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "retry perAttemptRecvTimeout exceeded"),
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_CANCELLED),
+ &closures);
// Check whether we should retry.
if (call_attempt->ShouldRetry(
/*status=*/absl::nullopt, /*is_lb_drop=*/false,
/*server_pushback_md=*/nullptr, /*server_pushback_ms=*/nullptr)) {
+ // Mark current attempt as abandoned.
+ call_attempt->Abandon();
// We are retrying. Start backoff timer.
calld->StartRetryTimer(/*server_pushback_ms=*/-1);
} else {
@@ -1212,8 +1297,7 @@ RetryFilter::CallData::CallAttempt::BatchData::BatchData(
GRPC_CALL_STACK_REF(call_attempt_->calld_->owning_call_, "Retry BatchData");
batch_.payload = &call_attempt_->batch_payload_;
if (set_on_complete) {
- GRPC_CLOSURE_INIT(&on_complete_, OnComplete, this,
- grpc_schedule_on_exec_ctx);
+ GRPC_CLOSURE_INIT(&on_complete_, OnComplete, this, nullptr);
batch_.on_complete = &on_complete_;
}
}
@@ -1264,22 +1348,27 @@ void RetryFilter::CallData::CallAttempt::BatchData::
//
void RetryFilter::CallData::CallAttempt::BatchData::
- InvokeRecvInitialMetadataCallback(void* arg, grpc_error_handle error) {
- auto* batch_data = static_cast<BatchData*>(arg);
- auto* call_attempt = batch_data->call_attempt_.get();
+ MaybeAddClosureForRecvInitialMetadataCallback(
+ grpc_error_handle error, CallCombinerClosureList* closures) {
// Find pending batch.
- PendingBatch* pending = call_attempt->calld_->PendingBatchFind(
+ PendingBatch* pending = call_attempt_->calld_->PendingBatchFind(
"invoking recv_initial_metadata_ready for",
[](grpc_transport_stream_op_batch* batch) {
return batch->recv_initial_metadata &&
batch->payload->recv_initial_metadata
.recv_initial_metadata_ready != nullptr;
});
- GPR_ASSERT(pending != nullptr);
+ if (pending == nullptr) {
+ GRPC_ERROR_UNREF(error);
+ return;
+ }
// Return metadata.
grpc_metadata_batch_move(
- &call_attempt->recv_initial_metadata_,
+ &call_attempt_->recv_initial_metadata_,
pending->batch->payload->recv_initial_metadata.recv_initial_metadata);
+ // Propagate trailing_metadata_available.
+ *pending->batch->payload->recv_initial_metadata.trailing_metadata_available =
+ call_attempt_->trailing_metadata_available_;
// Update bookkeeping.
// Note: Need to do this before invoking the callback, since invoking
// the callback will result in yielding the call combiner.
@@ -1288,11 +1377,10 @@ void RetryFilter::CallData::CallAttempt::BatchData::
.recv_initial_metadata_ready;
pending->batch->payload->recv_initial_metadata.recv_initial_metadata_ready =
nullptr;
- call_attempt->calld_->MaybeClearPendingBatch(pending);
- batch_data->Unref();
- // Invoke callback.
- Closure::Run(DEBUG_LOCATION, recv_initial_metadata_ready,
- GRPC_ERROR_REF(error));
+ call_attempt_->calld_->MaybeClearPendingBatch(pending);
+ // Add callback to closures.
+ closures->Add(recv_initial_metadata_ready, error,
+ "recv_initial_metadata_ready for pending batch");
}
void RetryFilter::CallData::CallAttempt::BatchData::RecvInitialMetadataReady(
@@ -1302,17 +1390,18 @@ void RetryFilter::CallData::CallAttempt::BatchData::RecvInitialMetadataReady(
CallData* calld = call_attempt->calld_;
if (GRPC_TRACE_FLAG_ENABLED(grpc_retry_trace)) {
gpr_log(GPR_INFO,
- "chand=%p calld=%p attempt=%p: got recv_initial_metadata_ready, "
- "error=%s",
- calld->chand_, calld, call_attempt,
+ "chand=%p calld=%p attempt=%p batch_data=%p: "
+ "got recv_initial_metadata_ready, error=%s",
+ calld->chand_, calld, call_attempt, batch_data.get(),
grpc_error_std_string(error).c_str());
}
call_attempt->completed_recv_initial_metadata_ = true;
- // If this attempt has been cancelled, then we're not going to use the
+ // If this attempt has been abandoned, then we're not going to use the
// result of this recv_initial_metadata op, so do nothing.
- if (call_attempt->cancelled_) {
- GRPC_CALL_COMBINER_STOP(calld->call_combiner_,
- "recv_initial_metadata_ready after cancellation");
+ if (call_attempt->abandoned_) {
+ GRPC_CALL_COMBINER_STOP(
+ calld->call_combiner_,
+ "recv_initial_metadata_ready for abandoned attempt");
return;
}
// Cancel per-attempt recv timer, if any.
@@ -1335,15 +1424,16 @@ void RetryFilter::CallData::CallAttempt::BatchData::RecvInitialMetadataReady(
call_attempt->recv_initial_metadata_ready_deferred_batch_ =
std::move(batch_data);
call_attempt->recv_initial_metadata_error_ = GRPC_ERROR_REF(error);
+ CallCombinerClosureList closures;
+ if (error != GRPC_ERROR_NONE) {
+ call_attempt->AddBatchForCancelOp(GRPC_ERROR_REF(error), &closures);
+ }
if (!call_attempt->started_recv_trailing_metadata_) {
// recv_trailing_metadata not yet started by application; start it
// ourselves to get status.
- call_attempt->StartInternalRecvTrailingMetadata();
- } else {
- GRPC_CALL_COMBINER_STOP(
- calld->call_combiner_,
- "recv_initial_metadata_ready trailers-only or error");
+ call_attempt->AddBatchForInternalRecvTrailingMetadata(&closures);
}
+ closures.RunClosures(calld->call_combiner_);
return;
}
// Received valid initial metadata, so commit the call.
@@ -1353,40 +1443,43 @@ void RetryFilter::CallData::CallAttempt::BatchData::RecvInitialMetadataReady(
call_attempt->MaybeSwitchToFastPath();
}
// Invoke the callback to return the result to the surface.
- // Manually invoking a callback function; it does not take ownership of error.
- InvokeRecvInitialMetadataCallback(batch_data.release(), error);
+ CallCombinerClosureList closures;
+ batch_data->MaybeAddClosureForRecvInitialMetadataCallback(
+ GRPC_ERROR_REF(error), &closures);
+ closures.RunClosures(calld->call_combiner_);
}
//
// recv_message callback handling
//
-void RetryFilter::CallData::CallAttempt::BatchData::InvokeRecvMessageCallback(
- void* arg, grpc_error_handle error) {
- auto* batch_data = static_cast<BatchData*>(arg);
- CallAttempt* call_attempt = batch_data->call_attempt_.get();
- CallData* calld = call_attempt->calld_;
+void RetryFilter::CallData::CallAttempt::BatchData::
+ MaybeAddClosureForRecvMessageCallback(grpc_error_handle error,
+ CallCombinerClosureList* closures) {
// Find pending op.
- PendingBatch* pending = calld->PendingBatchFind(
+ PendingBatch* pending = call_attempt_->calld_->PendingBatchFind(
"invoking recv_message_ready for",
[](grpc_transport_stream_op_batch* batch) {
return batch->recv_message &&
batch->payload->recv_message.recv_message_ready != nullptr;
});
- GPR_ASSERT(pending != nullptr);
+ if (pending == nullptr) {
+ GRPC_ERROR_UNREF(error);
+ return;
+ }
// Return payload.
*pending->batch->payload->recv_message.recv_message =
- std::move(call_attempt->recv_message_);
+ std::move(call_attempt_->recv_message_);
// Update bookkeeping.
// Note: Need to do this before invoking the callback, since invoking
// the callback will result in yielding the call combiner.
grpc_closure* recv_message_ready =
pending->batch->payload->recv_message.recv_message_ready;
pending->batch->payload->recv_message.recv_message_ready = nullptr;
- calld->MaybeClearPendingBatch(pending);
- batch_data->Unref();
- // Invoke callback.
- Closure::Run(DEBUG_LOCATION, recv_message_ready, GRPC_ERROR_REF(error));
+ call_attempt_->calld_->MaybeClearPendingBatch(pending);
+ // Add callback to closures.
+ closures->Add(recv_message_ready, error,
+ "recv_message_ready for pending batch");
}
void RetryFilter::CallData::CallAttempt::BatchData::RecvMessageReady(
@@ -1396,16 +1489,17 @@ void RetryFilter::CallData::CallAttempt::BatchData::RecvMessageReady(
CallData* calld = call_attempt->calld_;
if (GRPC_TRACE_FLAG_ENABLED(grpc_retry_trace)) {
gpr_log(GPR_INFO,
- "chand=%p calld=%p attempt=%p: got recv_message_ready, error=%s",
- calld->chand_, calld, call_attempt,
+ "chand=%p calld=%p attempt=%p batch_data=%p: "
+ "got recv_message_ready, error=%s",
+ calld->chand_, calld, call_attempt, batch_data.get(),
grpc_error_std_string(error).c_str());
}
++call_attempt->completed_recv_message_count_;
- // If this attempt has been cancelled, then we're not going to use the
+ // If this attempt has been abandoned, then we're not going to use the
// result of this recv_message op, so do nothing.
- if (call_attempt->cancelled_) {
+ if (call_attempt->abandoned_) {
GRPC_CALL_COMBINER_STOP(calld->call_combiner_,
- "recv_message_ready after cancellation");
+ "recv_message_ready for abandoned attempt");
return;
}
// Cancel per-attempt recv timer, if any.
@@ -1427,14 +1521,16 @@ void RetryFilter::CallData::CallAttempt::BatchData::RecvMessageReady(
}
call_attempt->recv_message_ready_deferred_batch_ = std::move(batch_data);
call_attempt->recv_message_error_ = GRPC_ERROR_REF(error);
+ CallCombinerClosureList closures;
+ if (error != GRPC_ERROR_NONE) {
+ call_attempt->AddBatchForCancelOp(GRPC_ERROR_REF(error), &closures);
+ }
if (!call_attempt->started_recv_trailing_metadata_) {
// recv_trailing_metadata not yet started by application; start it
// ourselves to get status.
- call_attempt->StartInternalRecvTrailingMetadata();
- } else {
- GRPC_CALL_COMBINER_STOP(calld->call_combiner_,
- "recv_message_ready null");
+ call_attempt->AddBatchForInternalRecvTrailingMetadata(&closures);
}
+ closures.RunClosures(calld->call_combiner_);
return;
}
// Received a valid message, so commit the call.
@@ -1444,8 +1540,10 @@ void RetryFilter::CallData::CallAttempt::BatchData::RecvMessageReady(
call_attempt->MaybeSwitchToFastPath();
}
// Invoke the callback to return the result to the surface.
- // Manually invoking a callback function; it does not take ownership of error.
- InvokeRecvMessageCallback(batch_data.release(), error);
+ CallCombinerClosureList closures;
+ batch_data->MaybeAddClosureForRecvMessageCallback(GRPC_ERROR_REF(error),
+ &closures);
+ closures.RunClosures(calld->call_combiner_);
}
//
@@ -1480,23 +1578,28 @@ void GetCallStatus(grpc_millis deadline, grpc_metadata_batch* md_batch,
} // namespace
void RetryFilter::CallData::CallAttempt::BatchData::
- AddClosureForRecvTrailingMetadataReady(grpc_error_handle error,
- CallCombinerClosureList* closures) {
+ MaybeAddClosureForRecvTrailingMetadataReady(
+ grpc_error_handle error, CallCombinerClosureList* closures) {
auto* calld = call_attempt_->calld_;
// Find pending batch.
PendingBatch* pending = calld->PendingBatchFind(
- "invoking recv_trailing_metadata for",
+ "invoking recv_trailing_metadata_ready for",
[](grpc_transport_stream_op_batch* batch) {
return batch->recv_trailing_metadata &&
batch->payload->recv_trailing_metadata
.recv_trailing_metadata_ready != nullptr;
});
// If we generated the recv_trailing_metadata op internally via
- // StartInternalRecvTrailingMetadata(), then there will be no pending batch.
+ // AddBatchForInternalRecvTrailingMetadata(), then there will be no
+ // pending batch.
if (pending == nullptr) {
call_attempt_->recv_trailing_metadata_error_ = error;
return;
}
+ // Copy transport stats to be delivered up to the surface.
+ grpc_transport_move_stats(
+ &call_attempt_->collect_stats_,
+ pending->batch->payload->recv_trailing_metadata.collect_stats);
// Return metadata.
grpc_metadata_batch_move(
&call_attempt_->recv_trailing_metadata_,
@@ -1514,38 +1617,32 @@ void RetryFilter::CallData::CallAttempt::BatchData::
void RetryFilter::CallData::CallAttempt::BatchData::
AddClosuresForDeferredCompletionCallbacks(
CallCombinerClosureList* closures) {
- if (batch_.recv_trailing_metadata) {
- // Add closure for deferred recv_initial_metadata_ready.
- if (GPR_UNLIKELY(
- call_attempt_->recv_initial_metadata_ready_deferred_batch_ !=
- nullptr)) {
- GRPC_CLOSURE_INIT(
- &call_attempt_->recv_initial_metadata_ready_,
- InvokeRecvInitialMetadataCallback,
- call_attempt_->recv_initial_metadata_ready_deferred_batch_.release(),
- grpc_schedule_on_exec_ctx);
- closures->Add(&call_attempt_->recv_initial_metadata_ready_,
- call_attempt_->recv_initial_metadata_error_,
- "resuming recv_initial_metadata_ready");
- }
- // Add closure for deferred recv_message_ready.
- if (GPR_UNLIKELY(call_attempt_->recv_message_ready_deferred_batch_ !=
- nullptr)) {
- GRPC_CLOSURE_INIT(
- &call_attempt_->recv_message_ready_, InvokeRecvMessageCallback,
- call_attempt_->recv_message_ready_deferred_batch_.release(),
- grpc_schedule_on_exec_ctx);
- closures->Add(&call_attempt_->recv_message_ready_,
- call_attempt_->recv_message_error_,
- "resuming recv_message_ready");
- }
- // Add closure for deferred on_complete.
- if (GPR_UNLIKELY(call_attempt_->on_complete_deferred_batch_ != nullptr)) {
- closures->Add(&call_attempt_->on_complete_deferred_batch_->on_complete_,
- call_attempt_->on_complete_error_, "resuming on_complete");
- call_attempt_->on_complete_deferred_batch_.release();
- }
- }
+ // Add closure for deferred recv_initial_metadata_ready.
+ if (GPR_UNLIKELY(call_attempt_->recv_initial_metadata_ready_deferred_batch_ !=
+ nullptr)) {
+ MaybeAddClosureForRecvInitialMetadataCallback(
+ call_attempt_->recv_initial_metadata_error_, closures);
+ call_attempt_->recv_initial_metadata_ready_deferred_batch_.reset(
+ DEBUG_LOCATION, "resuming deferred recv_initial_metadata_ready");
+ call_attempt_->recv_initial_metadata_error_ = GRPC_ERROR_NONE;
+ }
+ // Add closure for deferred recv_message_ready.
+ if (GPR_UNLIKELY(call_attempt_->recv_message_ready_deferred_batch_ !=
+ nullptr)) {
+ MaybeAddClosureForRecvMessageCallback(call_attempt_->recv_message_error_,
+ closures);
+ call_attempt_->recv_message_ready_deferred_batch_.reset(
+ DEBUG_LOCATION, "resuming deferred recv_message_ready");
+ call_attempt_->recv_message_error_ = GRPC_ERROR_NONE;
+ }
+ // Add closures for deferred on_complete callbacks.
+ for (auto& on_complete_deferred_batch :
+ call_attempt_->on_complete_deferred_batches_) {
+ closures->Add(&on_complete_deferred_batch.batch->on_complete_,
+ on_complete_deferred_batch.error, "resuming on_complete");
+ on_complete_deferred_batch.batch.release();
+ }
+ call_attempt_->on_complete_deferred_batches_.clear();
}
void RetryFilter::CallData::CallAttempt::BatchData::
@@ -1554,13 +1651,8 @@ void RetryFilter::CallData::CallAttempt::BatchData::
auto* calld = call_attempt_->calld_;
for (size_t i = 0; i < GPR_ARRAY_SIZE(calld->pending_batches_); ++i) {
PendingBatch* pending = &calld->pending_batches_[i];
- if (call_attempt_->PendingBatchIsUnstarted(pending)) {
- if (GRPC_TRACE_FLAG_ENABLED(grpc_retry_trace)) {
- gpr_log(GPR_INFO,
- "chand=%p calld=%p attempt=%p: failing unstarted pending "
- "batch at index %" PRIuPTR,
- calld->chand_, calld, call_attempt_.get(), i);
- }
+ if (pending->batch == nullptr) continue;
+ if (call_attempt_->PendingBatchContainsUnstartedSendOps(pending)) {
closures->Add(pending->batch->on_complete, GRPC_ERROR_REF(error),
"failing on_complete for pending batch");
pending->batch->on_complete = nullptr;
@@ -1575,7 +1667,7 @@ void RetryFilter::CallData::CallAttempt::BatchData::RunClosuresForCompletedCall(
// Construct list of closures to execute.
CallCombinerClosureList closures;
// First, add closure for recv_trailing_metadata_ready.
- AddClosureForRecvTrailingMetadataReady(GRPC_ERROR_REF(error), &closures);
+ MaybeAddClosureForRecvTrailingMetadataReady(GRPC_ERROR_REF(error), &closures);
// If there are deferred batch completion callbacks, add them to closures.
AddClosuresForDeferredCompletionCallbacks(&closures);
// Add closures to fail any pending batches that have not yet been started.
@@ -1593,17 +1685,18 @@ void RetryFilter::CallData::CallAttempt::BatchData::RecvTrailingMetadataReady(
CallData* calld = call_attempt->calld_;
if (GRPC_TRACE_FLAG_ENABLED(grpc_retry_trace)) {
gpr_log(GPR_INFO,
- "chand=%p calld=%p attempt=%p: got recv_trailing_metadata_ready, "
- "error=%s",
- calld->chand_, calld, call_attempt,
+ "chand=%p calld=%p attempt=%p batch_data=%p: "
+ "got recv_trailing_metadata_ready, error=%s",
+ calld->chand_, calld, call_attempt, batch_data.get(),
grpc_error_std_string(error).c_str());
}
call_attempt->completed_recv_trailing_metadata_ = true;
- // If this attempt has been cancelled, then we're not going to use the
+ // If this attempt has been abandoned, then we're not going to use the
// result of this recv_trailing_metadata op, so do nothing.
- if (call_attempt->cancelled_) {
- GRPC_CALL_COMBINER_STOP(calld->call_combiner_,
- "recv_trailing_metadata_ready after cancellation");
+ if (call_attempt->abandoned_) {
+ GRPC_CALL_COMBINER_STOP(
+ calld->call_combiner_,
+ "recv_trailing_metadata_ready for abandoned attempt");
return;
}
// Cancel per-attempt recv timer, if any.
@@ -1631,7 +1724,15 @@ void RetryFilter::CallData::CallAttempt::BatchData::RecvTrailingMetadataReady(
calld->StartRetryTimer(server_pushback_ms);
// Cancel call attempt.
CallCombinerClosureList closures;
- call_attempt->Cancel(&closures);
+ call_attempt->AddBatchForCancelOp(
+ error == GRPC_ERROR_NONE
+ ? grpc_error_set_int(
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("call attempt failed"),
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_CANCELLED)
+ : GRPC_ERROR_REF(error),
+ &closures);
+ // Record that this attempt has been abandoned.
+ call_attempt->Abandon();
// Yields call combiner.
closures.RunClosures(calld->call_combiner_);
return;
@@ -1668,6 +1769,11 @@ void RetryFilter::CallData::CallAttempt::BatchData::
GRPC_ERROR_UNREF(error);
return;
}
+ // Propagate payload.
+ if (batch_.send_message) {
+ pending->batch->payload->send_message.stream_write_closed =
+ batch_.payload->send_message.stream_write_closed;
+ }
// Add closure.
closures->Add(pending->batch->on_complete, error,
"on_complete for pending batch");
@@ -1711,16 +1817,17 @@ void RetryFilter::CallData::CallAttempt::BatchData::OnComplete(
CallData* calld = call_attempt->calld_;
if (GRPC_TRACE_FLAG_ENABLED(grpc_retry_trace)) {
gpr_log(GPR_INFO,
- "chand=%p calld=%p attempt=%p: got on_complete, error=%s, batch=%s",
- calld->chand_, calld, call_attempt,
+ "chand=%p calld=%p attempt=%p batch_data=%p: "
+ "got on_complete, error=%s, batch=%s",
+ calld->chand_, calld, call_attempt, batch_data.get(),
grpc_error_std_string(error).c_str(),
grpc_transport_stream_op_batch_string(&batch_data->batch_).c_str());
}
- // If this attempt has been cancelled, then we're not going to propagate
+ // If this attempt has been abandoned, then we're not going to propagate
// the completion of this batch, so do nothing.
- if (call_attempt->cancelled_) {
+ if (call_attempt->abandoned_) {
GRPC_CALL_COMBINER_STOP(calld->call_combiner_,
- "on_complete after cancellation");
+ "on_complete for abandoned attempt");
return;
}
// If we got an error and have not yet gotten the
@@ -1733,17 +1840,16 @@ void RetryFilter::CallData::CallAttempt::BatchData::OnComplete(
gpr_log(GPR_INFO, "chand=%p calld=%p attempt=%p: deferring on_complete",
calld->chand_, calld, call_attempt);
}
- call_attempt->on_complete_deferred_batch_ = std::move(batch_data);
- call_attempt->on_complete_error_ = GRPC_ERROR_REF(error);
+ call_attempt->on_complete_deferred_batches_.emplace_back(
+ std::move(batch_data), GRPC_ERROR_REF(error));
+ CallCombinerClosureList closures;
+ call_attempt->AddBatchForCancelOp(GRPC_ERROR_REF(error), &closures);
if (!call_attempt->started_recv_trailing_metadata_) {
// recv_trailing_metadata not yet started by application; start it
// ourselves to get status.
- call_attempt->StartInternalRecvTrailingMetadata();
- } else {
- GRPC_CALL_COMBINER_STOP(
- calld->call_combiner_,
- "on_complete failure before recv_trailing_metadata_ready");
+ call_attempt->AddBatchForInternalRecvTrailingMetadata(&closures);
}
+ closures.RunClosures(calld->call_combiner_);
return;
}
// Update bookkeeping in call_attempt.
@@ -1780,6 +1886,24 @@ void RetryFilter::CallData::CallAttempt::BatchData::OnComplete(
closures.RunClosures(calld->call_combiner_);
}
+void RetryFilter::CallData::CallAttempt::BatchData::OnCompleteForCancelOp(
+ void* arg, grpc_error_handle error) {
+ RefCountedPtr<BatchData> batch_data(static_cast<BatchData*>(arg));
+ CallAttempt* call_attempt = batch_data->call_attempt_.get();
+ CallData* calld = call_attempt->calld_;
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_retry_trace)) {
+ gpr_log(GPR_INFO,
+ "chand=%p calld=%p attempt=%p batch_data=%p: "
+ "got on_complete for cancel_stream batch, error=%s, batch=%s",
+ calld->chand_, calld, call_attempt, batch_data.get(),
+ grpc_error_std_string(error).c_str(),
+ grpc_transport_stream_op_batch_string(&batch_data->batch_).c_str());
+ }
+ GRPC_CALL_COMBINER_STOP(
+ calld->call_combiner_,
+ "on_complete for internally generated cancel_stream op");
+}
+
//
// retriable batch construction
//
@@ -1914,10 +2038,12 @@ void RetryFilter::CallData::CallAttempt::BatchData::
&call_attempt_->recv_trailing_metadata_ready_;
}
-void RetryFilter::CallData::CallAttempt::BatchData::AddCancelStreamOp() {
+void RetryFilter::CallData::CallAttempt::BatchData::AddCancelStreamOp(
+ grpc_error_handle error) {
batch_.cancel_stream = true;
- batch_.payload->cancel_stream.cancel_error =
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("retry attempt abandoned");
+ batch_.payload->cancel_stream.cancel_error = error;
+ // Override on_complete callback.
+ GRPC_CLOSURE_INIT(&on_complete_, OnCompleteForCancelOp, this, nullptr);
}
//
@@ -1996,7 +2122,6 @@ RetryFilter::CallData::CallData(RetryFilter* chand,
.set_max_backoff(
retry_policy_ == nullptr ? 0 : retry_policy_->max_backoff())),
path_(grpc_slice_ref_internal(args.path)),
- call_start_time_(args.start_time),
deadline_(args.deadline),
arena_(args.arena),
owning_call_(args.call_stack),
@@ -2016,6 +2141,7 @@ RetryFilter::CallData::~CallData() {
for (size_t i = 0; i < GPR_ARRAY_SIZE(pending_batches_); ++i) {
GPR_ASSERT(pending_batches_[i].batch == nullptr);
}
+ GRPC_ERROR_UNREF(cancelled_from_surface_);
}
void RetryFilter::CallData::StartTransportStreamOpBatch(
@@ -2048,6 +2174,9 @@ void RetryFilter::CallData::StartTransportStreamOpBatch(
call_attempt_->CancelFromSurface(batch);
return;
}
+ // Save cancel_error in case subsequent batches are started.
+ GRPC_ERROR_UNREF(cancelled_from_surface_);
+ cancelled_from_surface_ = GRPC_ERROR_REF(cancel_error);
// Cancel retry timer.
if (retry_timer_pending_) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_retry_trace)) {
@@ -2076,6 +2205,20 @@ void RetryFilter::CallData::StartTransportStreamOpBatch(
}
// If we do not yet have a call attempt, create one.
if (call_attempt_ == nullptr) {
+ // If we were previously cancelled from the surface, cancel this
+ // batch instead of creating a call attempt.
+ if (cancelled_from_surface_ != GRPC_ERROR_NONE) {
+ PendingBatchClear(pending);
+ // Note: This will release the call combiner.
+ grpc_transport_stream_op_batch_finish_with_failure(
+ batch, GRPC_ERROR_REF(cancelled_from_surface_), call_combiner_);
+ return;
+ }
+ // If there is no retry policy, then commit retries immediately.
+ // This ensures that the code below will always jump to the fast path.
+ // TODO(roth): Remove this special case when we implement
+ // transparent retries.
+ if (retry_policy_ == nullptr) retry_committed_ = true;
// If this is the first batch and retries are already committed
// (e.g., if this batch put the call above the buffer size limit), then
// immediately create an LB call and delegate the batch to it. This
@@ -2101,7 +2244,10 @@ void RetryFilter::CallData::StartTransportStreamOpBatch(
chand_, this);
}
PendingBatchClear(pending);
- committed_call_ = CreateLoadBalancedCall();
+ auto* service_config_call_data = static_cast<ServiceConfigCallData*>(
+ call_context_[GRPC_CONTEXT_SERVICE_CONFIG_CALL_DATA].value);
+ committed_call_ = CreateLoadBalancedCall(
+ service_config_call_data->call_dispatch_controller());
committed_call_->StartTransportStreamOpBatch(batch);
return;
}
@@ -2123,16 +2269,20 @@ void RetryFilter::CallData::StartTransportStreamOpBatch(
call_attempt_->StartRetriableBatches();
}
-RefCountedPtr<ClientChannel::LoadBalancedCall>
-RetryFilter::CallData::CreateLoadBalancedCall() {
+OrphanablePtr<ClientChannel::LoadBalancedCall>
+RetryFilter::CallData::CreateLoadBalancedCall(
+ ConfigSelector::CallDispatchController* call_dispatch_controller) {
grpc_call_element_args args = {owning_call_, nullptr, call_context_,
- path_, call_start_time_, deadline_,
+ path_, /*start_time=*/0, deadline_,
arena_, call_combiner_};
return chand_->client_channel_->CreateLoadBalancedCall(
args, pollent_,
// This callback holds a ref to the CallStackDestructionBarrier
// object until the LB call is destroyed.
- call_stack_destruction_barrier_->MakeLbCallDestructionClosure(this));
+ call_stack_destruction_barrier_->MakeLbCallDestructionClosure(this),
+ call_dispatch_controller,
+ // TODO(roth): Change this when we support transparent retries.
+ /*is_transparent_retry=*/false);
}
void RetryFilter::CallData::CreateCallAttempt() {
@@ -2384,6 +2534,18 @@ void RetryFilter::CallData::RetryCommit(CallAttempt* call_attempt) {
gpr_log(GPR_INFO, "chand=%p calld=%p: committing retries", chand_, this);
}
if (call_attempt != nullptr) {
+ // If the call attempt's LB call has been committed, inform the call
+ // dispatch controller that the call has been committed.
+ // Note: If call_attempt is null, this is happening before the first
+ // retry attempt is started, in which case we'll just pass the real
+ // call dispatch controller down into the LB call, and it won't be
+ // our problem anymore.
+ if (call_attempt->lb_call_committed()) {
+ auto* service_config_call_data = static_cast<ServiceConfigCallData*>(
+ call_context_[GRPC_CONTEXT_SERVICE_CONFIG_CALL_DATA].value);
+ service_config_call_data->call_dispatch_controller()->Commit();
+ }
+ // Free cached send ops.
call_attempt->FreeCachedSendOpDataAfterCommit();
}
}
diff --git a/src/core/ext/filters/client_channel/retry_service_config.cc b/src/core/ext/filters/client_channel/retry_service_config.cc
index cb19d2e326..7d83a949b8 100644
--- a/src/core/ext/filters/client_channel/retry_service_config.cc
+++ b/src/core/ext/filters/client_channel/retry_service_config.cc
@@ -159,9 +159,9 @@ RetryServiceConfigParser::ParseGlobalParams(const grpc_channel_args* /*args*/,
namespace {
grpc_error_handle ParseRetryPolicy(
- const Json& json, int* max_attempts, grpc_millis* initial_backoff,
- grpc_millis* max_backoff, float* backoff_multiplier,
- StatusCodeSet* retryable_status_codes,
+ const grpc_channel_args* args, const Json& json, int* max_attempts,
+ grpc_millis* initial_backoff, grpc_millis* max_backoff,
+ float* backoff_multiplier, StatusCodeSet* retryable_status_codes,
absl::optional<grpc_millis>* per_attempt_recv_timeout) {
if (json.type() != Json::Type::OBJECT) {
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
@@ -251,28 +251,38 @@ grpc_error_handle ParseRetryPolicy(
}
}
// Parse perAttemptRecvTimeout.
- it = json.object_value().find("perAttemptRecvTimeout");
- if (it != json.object_value().end()) {
- grpc_millis per_attempt_recv_timeout_value;
- if (!ParseDurationFromJson(it->second, &per_attempt_recv_timeout_value)) {
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "field:perAttemptRecvTimeout error:type must be STRING of the "
- "form given by google.proto.Duration."));
- } else {
- *per_attempt_recv_timeout = per_attempt_recv_timeout_value;
- // TODO(roth): As part of implementing hedging, relax this check such
- // that we allow a value of 0 if a hedging policy is specified.
- if (per_attempt_recv_timeout_value == 0) {
+ if (grpc_channel_args_find_bool(args, GRPC_ARG_EXPERIMENTAL_ENABLE_HEDGING,
+ false)) {
+ it = json.object_value().find("perAttemptRecvTimeout");
+ if (it != json.object_value().end()) {
+ grpc_millis per_attempt_recv_timeout_value;
+ if (!ParseDurationFromJson(it->second, &per_attempt_recv_timeout_value)) {
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "field:perAttemptRecvTimeout error:must be greater than 0"));
+ "field:perAttemptRecvTimeout error:type must be STRING of the "
+ "form given by google.proto.Duration."));
+ } else {
+ *per_attempt_recv_timeout = per_attempt_recv_timeout_value;
+ // TODO(roth): As part of implementing hedging, relax this check such
+ // that we allow a value of 0 if a hedging policy is specified.
+ if (per_attempt_recv_timeout_value == 0) {
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "field:perAttemptRecvTimeout error:must be greater than 0"));
+ }
}
+ } else if (retryable_status_codes->Empty()) {
+ // If perAttemptRecvTimeout not present, retryableStatusCodes must be
+ // non-empty.
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "field:retryableStatusCodes error:must be non-empty if "
+ "perAttemptRecvTimeout not present"));
+ }
+ } else {
+ // Hedging not enabled, so the error message for
+ // retryableStatusCodes unset should be different.
+ if (retryable_status_codes->Empty()) {
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "field:retryableStatusCodes error:must be non-empty"));
}
- } else if (retryable_status_codes->Empty()) {
- // If perAttemptRecvTimeout not present, retryableStatusCodes must be
- // non-empty.
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "field:retryableStatusCodes error:must be non-empty if "
- "perAttemptRecvTimeout not present"));
}
return GRPC_ERROR_CREATE_FROM_VECTOR("retryPolicy", &error_list);
}
@@ -280,9 +290,9 @@ grpc_error_handle ParseRetryPolicy(
} // namespace
std::unique_ptr<ServiceConfigParser::ParsedConfig>
-RetryServiceConfigParser::ParsePerMethodParams(
- const grpc_channel_args* /*args*/, const Json& json,
- grpc_error_handle* error) {
+RetryServiceConfigParser::ParsePerMethodParams(const grpc_channel_args* args,
+ const Json& json,
+ grpc_error_handle* error) {
GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE);
// Parse retry policy.
auto it = json.object_value().find("retryPolicy");
@@ -293,7 +303,7 @@ RetryServiceConfigParser::ParsePerMethodParams(
float backoff_multiplier = 0;
StatusCodeSet retryable_status_codes;
absl::optional<grpc_millis> per_attempt_recv_timeout;
- *error = ParseRetryPolicy(it->second, &max_attempts, &initial_backoff,
+ *error = ParseRetryPolicy(args, it->second, &max_attempts, &initial_backoff,
&max_backoff, &backoff_multiplier,
&retryable_status_codes, &per_attempt_recv_timeout);
if (*error != GRPC_ERROR_NONE) return nullptr;
diff --git a/src/core/ext/filters/client_channel/retry_service_config.h b/src/core/ext/filters/client_channel/retry_service_config.h
index f349b1b11a..86bda9cfbc 100644
--- a/src/core/ext/filters/client_channel/retry_service_config.h
+++ b/src/core/ext/filters/client_channel/retry_service_config.h
@@ -83,7 +83,7 @@ class RetryServiceConfigParser : public ServiceConfigParser::Parser {
grpc_error_handle* error) override;
std::unique_ptr<ServiceConfigParser::ParsedConfig> ParsePerMethodParams(
- const grpc_channel_args* /*args*/, const Json& json,
+ const grpc_channel_args* args, const Json& json,
grpc_error_handle* error) override;
static size_t ParserIndex();
diff --git a/src/core/ext/filters/client_channel/service_config_call_data.h b/src/core/ext/filters/client_channel/service_config_call_data.h
index 544683a654..e634f6d02c 100644
--- a/src/core/ext/filters/client_channel/service_config_call_data.h
+++ b/src/core/ext/filters/client_channel/service_config_call_data.h
@@ -23,6 +23,7 @@
#include "absl/strings/string_view.h"
+#include "src/core/ext/filters/client_channel/config_selector.h"
#include "src/core/ext/filters/client_channel/service_config.h"
#include "src/core/ext/filters/client_channel/service_config_parser.h"
#include "src/core/lib/channel/context.h"
@@ -39,11 +40,13 @@ class ServiceConfigCallData {
ServiceConfigCallData(
RefCountedPtr<ServiceConfig> service_config,
const ServiceConfigParser::ParsedConfigVector* method_configs,
- std::map<const char*, absl::string_view> call_attributes,
+ ConfigSelector::CallAttributes call_attributes,
+ ConfigSelector::CallDispatchController* call_dispatch_controller,
grpc_call_context_element* call_context)
: service_config_(std::move(service_config)),
method_configs_(method_configs),
- call_attributes_(std::move(call_attributes)) {
+ call_attributes_(std::move(call_attributes)),
+ call_dispatch_controller_(call_dispatch_controller) {
call_context[GRPC_CONTEXT_SERVICE_CONFIG_CALL_DATA].value = this;
call_context[GRPC_CONTEXT_SERVICE_CONFIG_CALL_DATA].destroy = Destroy;
}
@@ -53,7 +56,7 @@ class ServiceConfigCallData {
const ServiceConfigParser::ParsedConfigVector* method_configs,
grpc_call_context_element* call_context)
: ServiceConfigCallData(std::move(service_config), method_configs, {},
- call_context) {}
+ nullptr, call_context) {}
ServiceConfig* service_config() { return service_config_.get(); }
@@ -70,15 +73,52 @@ class ServiceConfigCallData {
return call_attributes_;
}
+ ConfigSelector::CallDispatchController* call_dispatch_controller() {
+ return &call_dispatch_controller_;
+ }
+
private:
+ // A wrapper for the CallDispatchController returned by the ConfigSelector.
+ // Handles the case where the ConfigSelector doees not return any
+ // CallDispatchController.
+ // Also ensures that we call Commit() at most once, which allows the
+ // client channel code to call Commit() when the call is complete in case
+ // it wasn't called earlier, without needing to know whether or not it was.
+ class SingleCommitCallDispatchController
+ : public ConfigSelector::CallDispatchController {
+ public:
+ explicit SingleCommitCallDispatchController(
+ ConfigSelector::CallDispatchController* call_dispatch_controller)
+ : call_dispatch_controller_(call_dispatch_controller) {}
+
+ bool ShouldRetry() override {
+ if (call_dispatch_controller_ != nullptr) {
+ return call_dispatch_controller_->ShouldRetry();
+ }
+ return true;
+ }
+
+ void Commit() override {
+ if (call_dispatch_controller_ != nullptr && !commit_called_) {
+ call_dispatch_controller_->Commit();
+ commit_called_ = true;
+ }
+ }
+
+ private:
+ ConfigSelector::CallDispatchController* call_dispatch_controller_;
+ bool commit_called_ = false;
+ };
+
static void Destroy(void* ptr) {
ServiceConfigCallData* self = static_cast<ServiceConfigCallData*>(ptr);
self->~ServiceConfigCallData();
}
RefCountedPtr<ServiceConfig> service_config_;
- const ServiceConfigParser::ParsedConfigVector* method_configs_ = nullptr;
- std::map<const char*, absl::string_view> call_attributes_;
+ const ServiceConfigParser::ParsedConfigVector* method_configs_;
+ ConfigSelector::CallAttributes call_attributes_;
+ SingleCommitCallDispatchController call_dispatch_controller_;
};
} // namespace grpc_core
diff --git a/src/core/ext/filters/fault_injection/fault_injection_filter.cc b/src/core/ext/filters/fault_injection/fault_injection_filter.cc
index 6197e74fd8..5f8d779441 100644
--- a/src/core/ext/filters/fault_injection/fault_injection_filter.cc
+++ b/src/core/ext/filters/fault_injection/fault_injection_filter.cc
@@ -428,12 +428,6 @@ void CallData::DelayBatch(grpc_call_element* elem,
MutexLock lock(&delay_mu_);
delayed_batch_ = batch;
resume_batch_canceller_ = new ResumeBatchCanceller(elem);
- // Without this line, ExecCtx::Get()->Now() will return a cached timestamp. If
- // there are thousands of RPCs happen on one thread, we might observe ms-level
- // error in Now(). This could mean the construction of RPC object is
- // microseconds earlier than the filter execution. But we still haven't found
- // the root cause. Read more: https://github.com/grpc/grpc/pull/25738.
- ExecCtx::Get()->InvalidateNow();
grpc_millis resume_time = ExecCtx::Get()->Now() + fi_policy_->delay;
GRPC_CLOSURE_INIT(&batch->handler_private.closure, ResumeBatch, elem,
grpc_schedule_on_exec_ctx);
diff --git a/src/core/ext/filters/http/client/http_client_filter.cc b/src/core/ext/filters/http/client/http_client_filter.cc
index ef737f0e5e..4e1ac5451d 100644
--- a/src/core/ext/filters/http/client/http_client_filter.cc
+++ b/src/core/ext/filters/http/client/http_client_filter.cc
@@ -232,6 +232,9 @@ static void send_message_on_complete(void* arg, grpc_error_handle error) {
grpc_call_element* elem = static_cast<grpc_call_element*>(arg);
call_data* calld = static_cast<call_data*>(elem->call_data);
calld->send_message_cache.Destroy();
+ // Set the batch's send_message bit back to true, so the retry code
+ // above knows what was in this batch.
+ calld->send_message_batch->send_message = true;
grpc_core::Closure::Run(DEBUG_LOCATION,
calld->original_send_message_on_complete,
GRPC_ERROR_REF(error));
@@ -474,8 +477,8 @@ static void http_client_start_transport_stream_op_batch(
done:
if (error != GRPC_ERROR_NONE) {
- grpc_transport_stream_op_batch_finish_with_failure(
- calld->send_message_batch, error, calld->call_combiner);
+ grpc_transport_stream_op_batch_finish_with_failure(batch, error,
+ calld->call_combiner);
} else if (!batch_will_be_handled_asynchronously) {
grpc_call_next_op(elem, batch);
}
diff --git a/src/core/ext/transport/binder/README.md b/src/core/ext/transport/binder/README.md
new file mode 100644
index 0000000000..2a797d3b4d
--- /dev/null
+++ b/src/core/ext/transport/binder/README.md
@@ -0,0 +1,6 @@
+# Binder transport for cross process IPC on Android
+
+Under construction.
+
+This transport implements
+[BinderChannel for native cross-process communication on Android](https://github.com/grpc/proposal/blob/master/L73-java-binderchannel.md)
diff --git a/src/core/ext/transport/binder/utils/BUILD b/src/core/ext/transport/binder/utils/BUILD
new file mode 100644
index 0000000000..b76dd6632b
--- /dev/null
+++ b/src/core/ext/transport/binder/utils/BUILD
@@ -0,0 +1,42 @@
+# Copyright 2021 gRPC authors.
+#
+# 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.
+
+load("//bazel:grpc_build_system.bzl", "grpc_cc_library")
+
+licenses(["notice"])
+
+package(
+ default_visibility = ["//visibility:public"],
+)
+
+grpc_cc_library(
+ name = "transport_stream_receiver",
+ srcs = [
+ "transport_stream_receiver_impl.cc",
+ ],
+ hdrs = [
+ "transport_stream_receiver.h",
+ "transport_stream_receiver_impl.h",
+ ],
+ external_deps = [
+ "absl/strings",
+ "absl/synchronization",
+ "absl/types:optional",
+ ],
+ deps = [
+ "//:gpr",
+ "//:gpr_base",
+ "//src/core/ext/transport/binder/wire_format:transaction",
+ ],
+)
diff --git a/src/core/ext/transport/binder/utils/transport_stream_receiver.h b/src/core/ext/transport/binder/utils/transport_stream_receiver.h
new file mode 100644
index 0000000000..b2917fc9ea
--- /dev/null
+++ b/src/core/ext/transport/binder/utils/transport_stream_receiver.h
@@ -0,0 +1,61 @@
+// Copyright 2021 gRPC authors.
+//
+// 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.
+
+#ifndef GRPC_CORE_EXT_TRANSPORT_BINDER_UTILS_TRANSPORT_STREAM_RECEIVER_H
+#define GRPC_CORE_EXT_TRANSPORT_BINDER_UTILS_TRANSPORT_STREAM_RECEIVER_H
+
+#include <grpc/impl/codegen/port_platform.h>
+
+#include <functional>
+#include <string>
+#include <vector>
+
+#include "src/core/ext/transport/binder/wire_format/transaction.h"
+
+namespace grpc_binder {
+
+typedef int StreamIdentifier;
+
+class TransportStreamReceiver {
+ public:
+ virtual ~TransportStreamReceiver() = default;
+
+ // Only handles single time invocation. Callback object will be deleted.
+ // The callback should be valid until invocation or unregister.
+ virtual void RegisterRecvInitialMetadata(
+ StreamIdentifier id, std::function<void(const Metadata&)> cb) = 0;
+ // TODO(mingcl): Use string_view
+ virtual void RegisterRecvMessage(
+ StreamIdentifier id, std::function<void(const std::string&)> cb) = 0;
+ virtual void RegisterRecvTrailingMetadata(
+ StreamIdentifier id, std::function<void(const Metadata&, int)> cb) = 0;
+
+ // TODO(mingcl): Provide a way to unregister callback?
+
+ // TODO(mingcl): Figure out how to handle the case where there is no callback
+ // registered for the stream. For now, I don't see this case happening in
+ // unary calls. So we would probably just crash the program for now.
+ // For streaming calls it does happen, for now we simply queue them.
+ virtual void NotifyRecvInitialMetadata(StreamIdentifier id,
+ const Metadata& initial_metadata) = 0;
+ virtual void NotifyRecvMessage(StreamIdentifier id,
+ const std::string& message) = 0;
+ virtual void NotifyRecvTrailingMetadata(StreamIdentifier id,
+ const Metadata& trailing_metadata,
+ int status) = 0;
+};
+
+} // namespace grpc_binder
+
+#endif // GRPC_CORE_EXT_TRANSPORT_BINDER_UTILS_TRANSPORT_STREAM_RECEIVER_H
diff --git a/src/core/ext/transport/binder/utils/transport_stream_receiver_impl.cc b/src/core/ext/transport/binder/utils/transport_stream_receiver_impl.cc
new file mode 100644
index 0000000000..f58520bd89
--- /dev/null
+++ b/src/core/ext/transport/binder/utils/transport_stream_receiver_impl.cc
@@ -0,0 +1,139 @@
+// Copyright 2021 gRPC authors.
+//
+// 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.
+
+#include <grpc/impl/codegen/port_platform.h>
+
+#include "src/core/ext/transport/binder/utils/transport_stream_receiver_impl.h"
+
+#include <grpc/support/log.h>
+
+#include <functional>
+#include <string>
+#include <utility>
+
+namespace grpc_binder {
+void TransportStreamReceiverImpl::RegisterRecvInitialMetadata(
+ StreamIdentifier id, std::function<void(const Metadata&)> cb) {
+ // TODO(mingcl): Don't lock the whole function
+ grpc_core::MutexLock l(&m_);
+ gpr_log(GPR_ERROR, "%s id = %d", __func__, id);
+ GPR_ASSERT(initial_metadata_cbs_.count(id) == 0);
+ auto iter = pending_initial_metadata_.find(id);
+ if (iter == pending_initial_metadata_.end()) {
+ initial_metadata_cbs_[id] = std::move(cb);
+ } else {
+ cb(iter->second.front());
+ iter->second.pop();
+ if (iter->second.empty()) {
+ pending_initial_metadata_.erase(iter);
+ }
+ }
+}
+
+void TransportStreamReceiverImpl::RegisterRecvMessage(
+ StreamIdentifier id, std::function<void(const std::string&)> cb) {
+ // TODO(mingcl): Don't lock the whole function
+ grpc_core::MutexLock l(&m_);
+ gpr_log(GPR_ERROR, "%s id = %d", __func__, id);
+ GPR_ASSERT(message_cbs_.count(id) == 0);
+ auto iter = pending_message_.find(id);
+ if (iter == pending_message_.end()) {
+ message_cbs_[id] = std::move(cb);
+ } else {
+ cb(iter->second.front());
+ iter->second.pop();
+ if (iter->second.empty()) {
+ pending_message_.erase(iter);
+ }
+ }
+}
+
+void TransportStreamReceiverImpl::RegisterRecvTrailingMetadata(
+ StreamIdentifier id, std::function<void(const Metadata&, int)> cb) {
+ // TODO(mingcl): Don't lock the whole function
+ grpc_core::MutexLock l(&m_);
+ gpr_log(GPR_ERROR, "%s id = %d", __func__, id);
+ GPR_ASSERT(trailing_metadata_cbs_.count(id) == 0);
+ auto iter = pending_trailing_metadata_.find(id);
+ if (iter == pending_trailing_metadata_.end()) {
+ trailing_metadata_cbs_[id] = std::move(cb);
+ } else {
+ {
+ const auto& p = iter->second.front();
+ cb(p.first, p.second);
+ }
+ iter->second.pop();
+ if (iter->second.empty()) {
+ pending_trailing_metadata_.erase(iter);
+ }
+ }
+}
+
+void TransportStreamReceiverImpl::NotifyRecvInitialMetadata(
+ StreamIdentifier id, const Metadata& initial_metadata) {
+ gpr_log(GPR_ERROR, "%s id = %d", __func__, id);
+ std::function<void(const Metadata&)> cb;
+ {
+ grpc_core::MutexLock l(&m_);
+ auto iter = initial_metadata_cbs_.find(id);
+ if (iter != initial_metadata_cbs_.end()) {
+ cb = iter->second;
+ initial_metadata_cbs_.erase(iter);
+ } else {
+ pending_initial_metadata_[id].push(initial_metadata);
+ }
+ }
+ if (cb != nullptr) {
+ cb(initial_metadata);
+ }
+}
+
+void TransportStreamReceiverImpl::NotifyRecvMessage(
+ StreamIdentifier id, const std::string& message) {
+ gpr_log(GPR_ERROR, "%s id = %d", __func__, id);
+ std::function<void(const std::string&)> cb;
+ {
+ grpc_core::MutexLock l(&m_);
+ auto iter = message_cbs_.find(id);
+ if (iter != message_cbs_.end()) {
+ cb = iter->second;
+ message_cbs_.erase(iter);
+ } else {
+ pending_message_[id].push(message);
+ }
+ }
+ if (cb != nullptr) {
+ cb(message);
+ }
+}
+
+void TransportStreamReceiverImpl::NotifyRecvTrailingMetadata(
+ StreamIdentifier id, const Metadata& trailing_metadata, int status) {
+ gpr_log(GPR_ERROR, "%s id = %d", __func__, id);
+ std::function<void(const Metadata&, int)> cb;
+ {
+ grpc_core::MutexLock l(&m_);
+ auto iter = trailing_metadata_cbs_.find(id);
+ if (iter != trailing_metadata_cbs_.end()) {
+ cb = iter->second;
+ trailing_metadata_cbs_.erase(iter);
+ } else {
+ pending_trailing_metadata_[id].emplace(trailing_metadata, status);
+ }
+ }
+ if (cb != nullptr) {
+ cb(trailing_metadata, status);
+ }
+}
+} // namespace grpc_binder
diff --git a/src/core/ext/transport/binder/utils/transport_stream_receiver_impl.h b/src/core/ext/transport/binder/utils/transport_stream_receiver_impl.h
new file mode 100644
index 0000000000..4af94fdc9e
--- /dev/null
+++ b/src/core/ext/transport/binder/utils/transport_stream_receiver_impl.h
@@ -0,0 +1,81 @@
+// Copyright 2021 gRPC authors.
+//
+// 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.
+
+#ifndef GRPC_CORE_EXT_TRANSPORT_BINDER_UTILS_TRANSPORT_STREAM_RECEIVER_IMPL_H
+#define GRPC_CORE_EXT_TRANSPORT_BINDER_UTILS_TRANSPORT_STREAM_RECEIVER_IMPL_H
+
+#include <grpc/impl/codegen/port_platform.h>
+
+#include <functional>
+#include <map>
+#include <queue>
+#include <string>
+#include <vector>
+
+#include "absl/types/optional.h"
+#include "src/core/ext/transport/binder/utils/transport_stream_receiver.h"
+#include "src/core/lib/gprpp/sync.h"
+
+namespace grpc_binder {
+
+// Routes the data received from transport to corresponding streams
+class TransportStreamReceiverImpl : public TransportStreamReceiver {
+ public:
+ void RegisterRecvInitialMetadata(
+ StreamIdentifier id, std::function<void(const Metadata&)> cb) override;
+ void RegisterRecvMessage(StreamIdentifier id,
+ std::function<void(const std::string&)> cb) override;
+ void RegisterRecvTrailingMetadata(
+ StreamIdentifier id,
+ std::function<void(const Metadata&, int)> cb) override;
+ void NotifyRecvInitialMetadata(StreamIdentifier id,
+ const Metadata& initial_metadata) override;
+ void NotifyRecvMessage(StreamIdentifier id,
+ const std::string& message) override;
+ void NotifyRecvTrailingMetadata(StreamIdentifier id,
+ const Metadata& trailing_metadata,
+ int status) override;
+
+ private:
+ std::map<StreamIdentifier, std::function<void(const Metadata&)>>
+ initial_metadata_cbs_;
+ std::map<StreamIdentifier, std::function<void(const std::string&)>>
+ message_cbs_;
+ std::map<StreamIdentifier, std::function<void(const Metadata&, int)>>
+ trailing_metadata_cbs_;
+ // TODO(waynetu): Better thread safety design. For example, use separate
+ // mutexes for different type of messages.
+ grpc_core::Mutex m_;
+ // TODO(waynetu): gRPC surface layer will not wait for the current message to
+ // be delivered before sending the next message. The following implementation
+ // is still buggy with the current implementation of wire writer if
+ // transaction issued first completes after the one issued later does. This is
+ // because we just take the first element out of the queue and assume it's the
+ // one issued first without further checking, which results in callbacks being
+ // invoked with incorrect data.
+ //
+ // This should be fixed in the wire writer level and make sure out-of-order
+ // messages will be re-ordered by it. In such case, the queueing approach will
+ // work fine. Refer to the TODO in WireWriterImpl::ProcessTransaction() at
+ // wire_reader_impl.cc for detecting and resolving out-of-order transactions.
+ std::map<StreamIdentifier, std::queue<Metadata>> pending_initial_metadata_
+ ABSL_GUARDED_BY(m_);
+ std::map<StreamIdentifier, std::queue<std::string>> pending_message_
+ ABSL_GUARDED_BY(m_);
+ std::map<StreamIdentifier, std::queue<std::pair<Metadata, int>>>
+ pending_trailing_metadata_ ABSL_GUARDED_BY(m_);
+};
+} // namespace grpc_binder
+
+#endif // GRPC_CORE_EXT_TRANSPORT_BINDER_UTILS_TRANSPORT_STREAM_RECEIVER_IMPL_H
diff --git a/src/core/ext/transport/binder/wire_format/BUILD b/src/core/ext/transport/binder/wire_format/BUILD
new file mode 100644
index 0000000000..4e1013418f
--- /dev/null
+++ b/src/core/ext/transport/binder/wire_format/BUILD
@@ -0,0 +1,111 @@
+# Copyright 2021 gRPC authors.
+#
+# 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.
+
+load("//bazel:grpc_build_system.bzl", "grpc_cc_library")
+
+licenses(["notice"])
+
+package(
+ default_visibility = ["//visibility:public"],
+)
+
+grpc_cc_library(
+ name = "transaction",
+ srcs = [
+ "transaction.cc",
+ ],
+ hdrs = [
+ "transaction.h",
+ ],
+ external_deps = [
+ "absl/base:core_headers",
+ "absl/strings",
+ ],
+ deps = [
+ "//:gpr",
+ ],
+)
+
+grpc_cc_library(
+ name = "binder",
+ srcs = [
+ "binder_constants.cc",
+ ],
+ hdrs = [
+ "binder.h",
+ "binder_constants.h",
+ ],
+ external_deps = [
+ "absl/base:core_headers",
+ "absl/status",
+ "absl/strings",
+ ],
+ deps = [
+ "//:gpr",
+ ],
+)
+
+grpc_cc_library(
+ name = "binder_android",
+ srcs = [
+ "binder_android.cc",
+ ],
+ hdrs = [
+ "binder_android.h",
+ ],
+ external_deps = [
+ "absl/synchronization",
+ "absl/memory",
+ ],
+ deps = [
+ ":binder",
+ ],
+)
+
+grpc_cc_library(
+ name = "wire_writer",
+ srcs = ["wire_writer.cc"],
+ hdrs = ["wire_writer.h"],
+ external_deps = [
+ "absl/strings",
+ ],
+ visibility = ["//visibility:public"],
+ deps = [
+ ":binder",
+ ":transaction",
+ "//:gpr",
+ "//:gpr_base",
+ ],
+)
+
+grpc_cc_library(
+ name = "wire_reader",
+ srcs = ["wire_reader_impl.cc"],
+ hdrs = [
+ "wire_reader.h",
+ "wire_reader_impl.h",
+ ],
+ external_deps = [
+ "absl/container:flat_hash_map",
+ "absl/synchronization",
+ "absl/memory",
+ "absl/status:statusor",
+ ],
+ deps = [
+ ":binder",
+ ":wire_writer",
+ "//:gpr",
+ "//src/core/ext/transport/binder/utils:transport_stream_receiver",
+ ],
+)
diff --git a/src/core/ext/transport/binder/wire_format/binder.h b/src/core/ext/transport/binder/wire_format/binder.h
new file mode 100644
index 0000000000..6b0b68b370
--- /dev/null
+++ b/src/core/ext/transport/binder/wire_format/binder.h
@@ -0,0 +1,101 @@
+// Copyright 2021 gRPC authors.
+//
+// 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.
+
+#ifndef GRPC_CORE_EXT_TRANSPORT_BINDER_WIRE_FORMAT_BINDER_H
+#define GRPC_CORE_EXT_TRANSPORT_BINDER_WIRE_FORMAT_BINDER_H
+
+#include <grpc/impl/codegen/port_platform.h>
+
+#include <cstdint>
+#include <functional>
+#include <memory>
+#include <string>
+
+#include "absl/status/status.h"
+#include "absl/strings/string_view.h"
+#include "src/core/ext/transport/binder/wire_format/binder_constants.h"
+
+namespace grpc_binder {
+
+class HasRawBinder {
+ public:
+ virtual ~HasRawBinder() = default;
+ virtual void* GetRawBinder() = 0;
+};
+
+class Binder;
+
+// TODO(waynetu): We might need other methods as well.
+// TODO(waynetu): Find a better way to express the returned status than
+// binder_status_t.
+class WritableParcel {
+ public:
+ virtual ~WritableParcel() = default;
+ virtual int32_t GetDataPosition() const = 0;
+ virtual absl::Status SetDataPosition(int32_t pos) = 0;
+ virtual absl::Status WriteInt32(int32_t data) = 0;
+ virtual absl::Status WriteBinder(HasRawBinder* binder) = 0;
+ virtual absl::Status WriteString(absl::string_view s) = 0;
+ virtual absl::Status WriteByteArray(const int8_t* buffer, int32_t length) = 0;
+
+ absl::Status WriteByteArrayWithLength(absl::string_view buffer) {
+ absl::Status status = WriteInt32(buffer.length());
+ if (!status.ok()) return status;
+ if (buffer.empty()) return absl::OkStatus();
+ return WriteByteArray(reinterpret_cast<const int8_t*>(buffer.data()),
+ buffer.length());
+ }
+};
+
+// TODO(waynetu): We might need other methods as well.
+// TODO(waynetu): Find a better way to express the returned status than
+// binder_status_t.
+class ReadableParcel {
+ public:
+ virtual ~ReadableParcel() = default;
+ virtual absl::Status ReadInt32(int32_t* data) const = 0;
+ virtual absl::Status ReadBinder(std::unique_ptr<Binder>* data) const = 0;
+ // TODO(waynetu): Provide better interfaces.
+ virtual absl::Status ReadByteArray(std::string* data) const = 0;
+ // FIXME(waynetu): This is just a temporary interface.
+ virtual absl::Status ReadString(char data[111]) const = 0;
+};
+
+class TransactionReceiver : public HasRawBinder {
+ public:
+ using OnTransactCb =
+ std::function<absl::Status(transaction_code_t, const ReadableParcel*)>;
+
+ ~TransactionReceiver() override = default;
+};
+
+class Binder : public HasRawBinder {
+ public:
+ ~Binder() override = default;
+
+ virtual void Initialize() = 0;
+ virtual absl::Status PrepareTransaction() = 0;
+ virtual absl::Status Transact(BinderTransportTxCode tx_code) = 0;
+
+ virtual WritableParcel* GetWritableParcel() const = 0;
+ virtual ReadableParcel* GetReadableParcel() const = 0;
+
+ // TODO(waynetu): Can we decouple the receiver from the binder?
+ virtual std::unique_ptr<TransactionReceiver> ConstructTxReceiver(
+ TransactionReceiver::OnTransactCb transact_cb) const = 0;
+};
+
+} // namespace grpc_binder
+
+#endif // GRPC_CORE_EXT_TRANSPORT_BINDER_WIRE_FORMAT_BINDER_H
diff --git a/src/core/ext/transport/binder/wire_format/binder_android.cc b/src/core/ext/transport/binder/wire_format/binder_android.cc
new file mode 100644
index 0000000000..8045a0f302
--- /dev/null
+++ b/src/core/ext/transport/binder/wire_format/binder_android.cc
@@ -0,0 +1,240 @@
+// Copyright 2021 gRPC authors.
+//
+// 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.
+
+#include <grpc/impl/codegen/port_platform.h>
+
+#include "src/core/ext/transport/binder/wire_format/binder_android.h"
+
+#if defined(ANDROID) || defined(__ANDROID__)
+
+#include <grpc/support/log.h>
+
+#include <map>
+
+#include "absl/memory/memory.h"
+#include "absl/strings/str_cat.h"
+#include "src/core/lib/gprpp/sync.h"
+
+namespace {
+
+struct AtomicCallback {
+ explicit AtomicCallback(void* callback) : mu{}, callback(callback) {}
+ grpc_core::Mutex mu;
+ void* callback ABSL_GUARDED_BY(mu);
+};
+
+void* f_onCreate_with_mutex(void* callback) {
+ return new AtomicCallback(callback);
+}
+
+void* f_onCreate_noop(void* args) { return nullptr; }
+void f_onDestroy_noop(void* userData) {}
+
+// TODO(mingcl): Consider if thread safety is a requirement here
+binder_status_t f_onTransact(AIBinder* binder, transaction_code_t code,
+ const AParcel* in, AParcel* out) {
+ gpr_log(GPR_INFO, __func__);
+ gpr_log(GPR_INFO, "tx code = %u", code);
+ auto* user_data =
+ reinterpret_cast<AtomicCallback*>(AIBinder_getUserData(binder));
+ grpc_core::MutexLock lock(&user_data->mu);
+
+ // TODO(waynetu): What should be returned here?
+ if (!user_data->callback) return STATUS_OK;
+
+ auto* callback =
+ reinterpret_cast<grpc_binder::TransactionReceiver::OnTransactCb*>(
+ user_data->callback);
+ // Wrap the parcel in a ReadableParcel.
+ std::unique_ptr<grpc_binder::ReadableParcel> output =
+ absl::make_unique<grpc_binder::ReadableParcelAndroid>(in);
+ // The lock should be released "after" the callback finishes.
+ absl::Status status = (*callback)(code, output.get());
+ return status.ok() ? STATUS_OK : STATUS_UNKNOWN_ERROR;
+}
+} // namespace
+
+namespace grpc_binder {
+
+ndk::SpAIBinder FromJavaBinder(JNIEnv* jni_env, jobject binder) {
+ return ndk::SpAIBinder(AIBinder_fromJavaBinder(jni_env, binder));
+}
+
+TransactionReceiverAndroid::TransactionReceiverAndroid(OnTransactCb transact_cb)
+ : transact_cb_(transact_cb) {
+ // TODO(mingcl): For now interface descriptor is always empty, figure out if
+ // we want it to be something more meaningful (we can probably manually change
+ // interface descriptor by modifying Java code's reply to
+ // os.IBinder.INTERFACE_TRANSACTION)
+ AIBinder_Class* aibinder_class = AIBinder_Class_define(
+ /*interfaceDescriptor=*/"", f_onCreate_with_mutex, f_onDestroy_noop,
+ f_onTransact);
+
+ // Pass the on-transact callback to the on-create function of the binder. The
+ // on-create function equips the callback with a mutex and gives it to the
+ // user data stored in the binder which can be retrieved later.
+ binder_ = AIBinder_new(aibinder_class, &transact_cb_);
+ GPR_ASSERT(binder_);
+ gpr_log(GPR_INFO, "AIBinder_associateClass = %d",
+ static_cast<int>(AIBinder_associateClass(binder_, aibinder_class)));
+}
+
+TransactionReceiverAndroid::~TransactionReceiverAndroid() {
+ auto* user_data =
+ reinterpret_cast<AtomicCallback*>(AIBinder_getUserData(binder_));
+ {
+ grpc_core::MutexLock lock(&user_data->mu);
+ // Set the callback to null so that future calls to on-trasact are awared
+ // that the transaction receiver had been deallocated.
+ user_data->callback = nullptr;
+ }
+ // Release the binder.
+ AIBinder_decStrong(binder_);
+}
+
+namespace {
+
+binder_status_t f_onTransact_noop(AIBinder* binder, transaction_code_t code,
+ const AParcel* in, AParcel* out) {
+ return {};
+}
+
+void AssociateWithNoopClass(AIBinder* binder) {
+ // Need to associate class before using it
+ AIBinder_Class* aibinder_class = AIBinder_Class_define(
+ "", f_onCreate_noop, f_onDestroy_noop, f_onTransact_noop);
+ gpr_log(GPR_INFO, "AIBinder_associateClass = %d",
+ static_cast<int>(AIBinder_associateClass(binder, aibinder_class)));
+}
+
+} // namespace
+
+void BinderAndroid::Initialize() {
+ AIBinder* binder = binder_.get();
+ AssociateWithNoopClass(binder);
+}
+
+absl::Status BinderAndroid::PrepareTransaction() {
+ AIBinder* binder = binder_.get();
+ return AIBinder_prepareTransaction(binder, &input_parcel_->parcel_) ==
+ STATUS_OK
+ ? absl::OkStatus()
+ : absl::InternalError("AIBinder_prepareTransaction failed");
+}
+
+absl::Status BinderAndroid::Transact(BinderTransportTxCode tx_code) {
+ AIBinder* binder = binder_.get();
+ return AIBinder_transact(binder, static_cast<transaction_code_t>(tx_code),
+ &input_parcel_->parcel_, &output_parcel_->parcel_,
+ FLAG_ONEWAY) == STATUS_OK
+ ? absl::OkStatus()
+ : absl::InternalError("AIBinder_transact failed");
+}
+
+std::unique_ptr<TransactionReceiver> BinderAndroid::ConstructTxReceiver(
+ TransactionReceiver::OnTransactCb transact_cb) const {
+ return absl::make_unique<TransactionReceiverAndroid>(transact_cb);
+}
+
+int32_t WritableParcelAndroid::GetDataPosition() const {
+ return AParcel_getDataPosition(parcel_);
+}
+
+absl::Status WritableParcelAndroid::SetDataPosition(int32_t pos) {
+ return AParcel_setDataPosition(parcel_, pos) == STATUS_OK
+ ? absl::OkStatus()
+ : absl::InternalError("AParcel_setDataPosition failed");
+}
+
+absl::Status WritableParcelAndroid::WriteInt32(int32_t data) {
+ return AParcel_writeInt32(parcel_, data) == STATUS_OK
+ ? absl::OkStatus()
+ : absl::InternalError("AParcel_writeInt32 failed");
+}
+
+absl::Status WritableParcelAndroid::WriteBinder(HasRawBinder* binder) {
+ return AParcel_writeStrongBinder(
+ parcel_, reinterpret_cast<AIBinder*>(binder->GetRawBinder())) ==
+ STATUS_OK
+ ? absl::OkStatus()
+ : absl::InternalError("AParcel_writeStrongBinder failed");
+}
+
+absl::Status WritableParcelAndroid::WriteString(absl::string_view s) {
+ return AParcel_writeString(parcel_, s.data(), s.length()) == STATUS_OK
+ ? absl::OkStatus()
+ : absl::InternalError("AParcel_writeString failed");
+}
+
+absl::Status WritableParcelAndroid::WriteByteArray(const int8_t* buffer,
+ int32_t length) {
+ return AParcel_writeByteArray(parcel_, buffer, length) == STATUS_OK
+ ? absl::OkStatus()
+ : absl::InternalError("AParcel_writeByteArray failed");
+}
+
+absl::Status ReadableParcelAndroid::ReadInt32(int32_t* data) const {
+ return AParcel_readInt32(parcel_, data) == STATUS_OK
+ ? absl::OkStatus()
+ : absl::InternalError("AParcel_readInt32 failed");
+}
+
+absl::Status ReadableParcelAndroid::ReadBinder(
+ std::unique_ptr<Binder>* data) const {
+ AIBinder* binder;
+ if (AParcel_readStrongBinder(parcel_, &binder) != STATUS_OK) {
+ *data = nullptr;
+ return absl::InternalError("AParcel_readStrongBinder failed");
+ }
+ *data = absl::make_unique<BinderAndroid>(ndk::SpAIBinder(binder));
+ return absl::OkStatus();
+}
+
+namespace {
+
+bool byte_array_allocator(void* arrayData, int32_t length, int8_t** outBuffer) {
+ std::string tmp;
+ tmp.resize(length);
+ *reinterpret_cast<std::string*>(arrayData) = tmp;
+ *outBuffer = reinterpret_cast<int8_t*>(
+ reinterpret_cast<std::string*>(arrayData)->data());
+ return true;
+}
+
+bool string_allocator(void* stringData, int32_t length, char** outBuffer) {
+ if (length > 0) {
+ // TODO(mingcl): Don't fix the length of the string
+ GPR_ASSERT(length < 100); // call should preallocate 100 bytes
+ *outBuffer = reinterpret_cast<char*>(stringData);
+ }
+ return true;
+}
+
+} // namespace
+
+absl::Status ReadableParcelAndroid::ReadByteArray(std::string* data) const {
+ return AParcel_readByteArray(parcel_, data, byte_array_allocator) == STATUS_OK
+ ? absl::OkStatus()
+ : absl::InternalError("AParcel_readByteArray failed");
+}
+
+absl::Status ReadableParcelAndroid::ReadString(char data[111]) const {
+ return AParcel_readString(parcel_, data, string_allocator) == STATUS_OK
+ ? absl::OkStatus()
+ : absl::InternalError("AParcel_readString failed");
+}
+
+} // namespace grpc_binder
+
+#endif // defined(ANDROID) || defined(__ANDROID__)
diff --git a/src/core/ext/transport/binder/wire_format/binder_android.h b/src/core/ext/transport/binder/wire_format/binder_android.h
new file mode 100644
index 0000000000..7a87cab1f1
--- /dev/null
+++ b/src/core/ext/transport/binder/wire_format/binder_android.h
@@ -0,0 +1,128 @@
+// Copyright 2021 gRPC authors.
+//
+// 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.
+
+#ifndef GRPC_CORE_EXT_TRANSPORT_BINDER_WIRE_FORMAT_BINDER_ANDROID_H
+#define GRPC_CORE_EXT_TRANSPORT_BINDER_WIRE_FORMAT_BINDER_ANDROID_H
+
+#if defined(ANDROID) || defined(__ANDROID__)
+
+#include <grpc/impl/codegen/port_platform.h>
+
+#include <android/binder_auto_utils.h>
+#include <android/binder_ibinder.h>
+#include <android/binder_ibinder_jni.h>
+#include <android/binder_interface_utils.h>
+#include <jni.h>
+
+#include <memory>
+
+#include "absl/memory/memory.h"
+#include "src/core/ext/transport/binder/wire_format/binder.h"
+
+// TODO(b/192208764): move this check to somewhere else
+#if __ANDROID_API__ < 29
+#error "We only support Android API level >= 29."
+#endif
+
+namespace grpc_binder {
+
+ndk::SpAIBinder FromJavaBinder(JNIEnv* jni_env, jobject binder);
+
+class BinderAndroid;
+
+class WritableParcelAndroid final : public WritableParcel {
+ public:
+ WritableParcelAndroid() = default;
+ explicit WritableParcelAndroid(AParcel* parcel) : parcel_(parcel) {}
+ ~WritableParcelAndroid() override = default;
+
+ int32_t GetDataPosition() const override;
+ absl::Status SetDataPosition(int32_t pos) override;
+ absl::Status WriteInt32(int32_t data) override;
+ absl::Status WriteBinder(HasRawBinder* binder) override;
+ absl::Status WriteString(absl::string_view s) override;
+ absl::Status WriteByteArray(const int8_t* buffer, int32_t length) override;
+
+ private:
+ AParcel* parcel_ = nullptr;
+
+ friend class BinderAndroid;
+};
+
+class ReadableParcelAndroid final : public ReadableParcel {
+ public:
+ ReadableParcelAndroid() = default;
+ // TODO(waynetu): Get rid of the const_cast.
+ explicit ReadableParcelAndroid(const AParcel* parcel)
+ : parcel_(const_cast<AParcel*>(parcel)) {}
+ ~ReadableParcelAndroid() override = default;
+
+ absl::Status ReadInt32(int32_t* data) const override;
+ absl::Status ReadBinder(std::unique_ptr<Binder>* data) const override;
+ absl::Status ReadByteArray(std::string* data) const override;
+ // FIXME(waynetu): Fix the interface.
+ absl::Status ReadString(char data[111]) const override;
+
+ private:
+ AParcel* parcel_ = nullptr;
+
+ friend class BinderAndroid;
+};
+
+class BinderAndroid final : public Binder {
+ public:
+ explicit BinderAndroid(ndk::SpAIBinder binder)
+ : binder_(binder),
+ input_parcel_(absl::make_unique<WritableParcelAndroid>()),
+ output_parcel_(absl::make_unique<ReadableParcelAndroid>()) {}
+ ~BinderAndroid() override = default;
+
+ void* GetRawBinder() override { return binder_.get(); }
+
+ void Initialize() override;
+ absl::Status PrepareTransaction() override;
+ absl::Status Transact(BinderTransportTxCode tx_code) override;
+
+ WritableParcel* GetWritableParcel() const override {
+ return input_parcel_.get();
+ }
+ ReadableParcel* GetReadableParcel() const override {
+ return output_parcel_.get();
+ };
+
+ std::unique_ptr<TransactionReceiver> ConstructTxReceiver(
+ TransactionReceiver::OnTransactCb transact_cb) const override;
+
+ private:
+ ndk::SpAIBinder binder_;
+ std::unique_ptr<WritableParcelAndroid> input_parcel_;
+ std::unique_ptr<ReadableParcelAndroid> output_parcel_;
+};
+
+class TransactionReceiverAndroid final : public TransactionReceiver {
+ public:
+ explicit TransactionReceiverAndroid(OnTransactCb transaction_cb);
+ ~TransactionReceiverAndroid() override;
+ void* GetRawBinder() override { return binder_; }
+
+ private:
+ AIBinder* binder_;
+ OnTransactCb transact_cb_;
+};
+
+} // namespace grpc_binder
+
+#endif // defined(ANDROID) || defined(__ANDROID__)
+
+#endif // GRPC_CORE_EXT_TRANSPORT_BINDER_WIRE_FORMAT_BINDER_ANDROID_H
diff --git a/src/core/ext/transport/binder/wire_format/binder_constants.cc b/src/core/ext/transport/binder/wire_format/binder_constants.cc
new file mode 100644
index 0000000000..edf5b7ec1e
--- /dev/null
+++ b/src/core/ext/transport/binder/wire_format/binder_constants.cc
@@ -0,0 +1,30 @@
+// Copyright 2021 gRPC authors.
+//
+// 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.
+
+#include <grpc/impl/codegen/port_platform.h>
+
+#include "src/core/ext/transport/binder/wire_format/binder_constants.h"
+
+#ifndef ANDROID
+
+const int FIRST_CALL_TRANSACTION = 0x00000001;
+const int LAST_CALL_TRANSACTION = 0x00FFFFFF;
+
+#endif // ANDROID
+
+namespace grpc_binder {
+
+const int kFirstCallId = FIRST_CALL_TRANSACTION + 1000;
+
+} // namespace grpc_binder
diff --git a/src/core/ext/transport/binder/wire_format/binder_constants.h b/src/core/ext/transport/binder/wire_format/binder_constants.h
new file mode 100644
index 0000000000..1d102be2bb
--- /dev/null
+++ b/src/core/ext/transport/binder/wire_format/binder_constants.h
@@ -0,0 +1,52 @@
+// Copyright 2021 gRPC authors.
+//
+// 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.
+
+#ifndef GRPC_CORE_EXT_TRANSPORT_BINDER_WIRE_FORMAT_BINDER_CONSTANTS_H
+#define GRPC_CORE_EXT_TRANSPORT_BINDER_WIRE_FORMAT_BINDER_CONSTANTS_H
+
+#include <grpc/impl/codegen/port_platform.h>
+
+#include "absl/base/attributes.h"
+
+#if defined(ANDROID) || defined(__ANDROID__)
+
+#include <android/binder_auto_utils.h>
+#include <android/binder_ibinder.h>
+
+#else
+
+#include <cstdint>
+
+using transaction_code_t = uint32_t;
+
+ABSL_CONST_INIT extern const int FIRST_CALL_TRANSACTION;
+ABSL_CONST_INIT extern const int LAST_CALL_TRANSACTION;
+
+#endif // defined(ANDROID) || defined(__ANDROID__)
+
+namespace grpc_binder {
+
+enum class BinderTransportTxCode {
+ SETUP_TRANSPORT = 1,
+ SHUTDOWN_TRANSPORT = 2,
+ ACKNOWLEDGE_BYTES = 3,
+ PING = 4,
+ PING_RESPONSE = 5,
+};
+
+ABSL_CONST_INIT extern const int kFirstCallId;
+
+} // namespace grpc_binder
+
+#endif // GRPC_CORE_EXT_TRANSPORT_BINDER_WIRE_FORMAT_BINDER_CONSTANTS_H
diff --git a/src/core/ext/transport/binder/wire_format/transaction.cc b/src/core/ext/transport/binder/wire_format/transaction.cc
new file mode 100644
index 0000000000..a9da9d5e40
--- /dev/null
+++ b/src/core/ext/transport/binder/wire_format/transaction.cc
@@ -0,0 +1,29 @@
+// Copyright 2021 gRPC authors.
+//
+// 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.
+
+#include <grpc/impl/codegen/port_platform.h>
+
+#include "src/core/ext/transport/binder/wire_format/transaction.h"
+
+namespace grpc_binder {
+
+const int kFlagPrefix = 0x1;
+const int kFlagMessageData = 0x2;
+const int kFlagSuffix = 0x4;
+const int kFlagOutOfBandClose = 0x8;
+const int kFlagExpectSingleMessage = 0x10;
+const int kFlagStatusDescription = 0x20;
+const int kFlagMessageDataIsParcelable = 0x40;
+
+} // namespace grpc_binder
diff --git a/src/core/ext/transport/binder/wire_format/transaction.h b/src/core/ext/transport/binder/wire_format/transaction.h
new file mode 100644
index 0000000000..74983b81b4
--- /dev/null
+++ b/src/core/ext/transport/binder/wire_format/transaction.h
@@ -0,0 +1,103 @@
+// Copyright 2021 gRPC authors.
+//
+// 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.
+
+#ifndef GRPC_CORE_EXT_TRANSPORT_BINDER_WIRE_FORMAT_TRANSACTION_H
+#define GRPC_CORE_EXT_TRANSPORT_BINDER_WIRE_FORMAT_TRANSACTION_H
+
+#include <grpc/impl/codegen/port_platform.h>
+
+#include <grpc/support/log.h>
+
+#include <string>
+#include <vector>
+
+#include "absl/strings/string_view.h"
+
+namespace grpc_binder {
+
+ABSL_CONST_INIT extern const int kFlagPrefix;
+ABSL_CONST_INIT extern const int kFlagMessageData;
+ABSL_CONST_INIT extern const int kFlagSuffix;
+ABSL_CONST_INIT extern const int kFlagOutOfBandClose;
+ABSL_CONST_INIT extern const int kFlagExpectSingleMessage;
+ABSL_CONST_INIT extern const int kFlagStatusDescription;
+ABSL_CONST_INIT extern const int kFlagMessageDataIsParcelable;
+
+using Metadata = std::vector<std::pair<std::string, std::string>>;
+
+class Transaction {
+ public:
+ Transaction(int tx_code, int seq_num, bool is_client)
+ : tx_code_(tx_code), seq_num_(seq_num), is_client_(is_client) {}
+ // TODO(mingcl): Consider using string_view
+ void SetPrefix(Metadata prefix_metadata) {
+ prefix_metadata_ = prefix_metadata;
+ GPR_ASSERT((flags_ & kFlagPrefix) == 0);
+ flags_ |= kFlagPrefix;
+ }
+ void SetMethodRef(std::string method_ref) {
+ GPR_ASSERT(is_client_);
+ method_ref_ = method_ref;
+ }
+ void SetData(std::string message_data) {
+ message_data_ = message_data;
+ GPR_ASSERT((flags_ & kFlagMessageData) == 0);
+ flags_ |= kFlagMessageData;
+ }
+ void SetSuffix(Metadata suffix_metadata) {
+ if (is_client_) GPR_ASSERT(suffix_metadata.empty());
+ suffix_metadata_ = suffix_metadata;
+ GPR_ASSERT((flags_ & kFlagSuffix) == 0);
+ flags_ |= kFlagSuffix;
+ }
+ void SetStatusDescription(std::string status_desc) {
+ GPR_ASSERT(!is_client_);
+ GPR_ASSERT((flags_ & kFlagStatusDescription) == 0);
+ status_desc_ = status_desc;
+ }
+ void SetStatus(int status) {
+ GPR_ASSERT(!is_client_);
+ GPR_ASSERT((flags_ >> 16) == 0);
+ GPR_ASSERT(status < (1 << 16));
+ flags_ |= (status << 16);
+ }
+
+ bool IsClient() const { return is_client_; }
+ bool IsServer() const { return !is_client_; }
+ int GetTxCode() const { return tx_code_; }
+ int GetSeqNum() const { return seq_num_; }
+ int GetFlags() const { return flags_; }
+
+ absl::string_view GetMethodRef() const { return method_ref_; }
+ const Metadata& GetPrefixMetadata() const { return prefix_metadata_; }
+ const Metadata& GetSuffixMetadata() const { return suffix_metadata_; }
+ absl::string_view GetMessageData() const { return message_data_; }
+ absl::string_view GetStatusDesc() const { return status_desc_; }
+
+ private:
+ int tx_code_;
+ int seq_num_;
+ bool is_client_;
+ Metadata prefix_metadata_;
+ Metadata suffix_metadata_;
+ std::string method_ref_;
+ std::string message_data_;
+ std::string status_desc_;
+
+ int flags_ = 0;
+};
+
+} // namespace grpc_binder
+
+#endif // GRPC_CORE_EXT_TRANSPORT_BINDER_WIRE_FORMAT_TRANSACTION_H
diff --git a/src/core/ext/transport/binder/wire_format/wire_reader.h b/src/core/ext/transport/binder/wire_format/wire_reader.h
new file mode 100644
index 0000000000..9857ed7072
--- /dev/null
+++ b/src/core/ext/transport/binder/wire_format/wire_reader.h
@@ -0,0 +1,37 @@
+// Copyright 2021 gRPC authors.
+//
+// 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.
+
+#ifndef GRPC_CORE_EXT_TRANSPORT_BINDER_WIRE_FORMAT_WIRE_READER_H
+#define GRPC_CORE_EXT_TRANSPORT_BINDER_WIRE_FORMAT_WIRE_READER_H
+
+#include <grpc/impl/codegen/port_platform.h>
+
+#include <memory>
+#include <utility>
+
+#include "src/core/ext/transport/binder/wire_format/binder.h"
+#include "src/core/ext/transport/binder/wire_format/wire_writer.h"
+
+namespace grpc_binder {
+
+class WireReader {
+ public:
+ virtual ~WireReader() = default;
+ virtual std::unique_ptr<WireWriter> SetupTransport(
+ std::unique_ptr<Binder> endpoint_binder) = 0;
+};
+
+} // namespace grpc_binder
+
+#endif // GRPC_CORE_EXT_TRANSPORT_BINDER_WIRE_FORMAT_WIRE_READER_H
diff --git a/src/core/ext/transport/binder/wire_format/wire_reader_impl.cc b/src/core/ext/transport/binder/wire_format/wire_reader_impl.cc
new file mode 100644
index 0000000000..793f73be56
--- /dev/null
+++ b/src/core/ext/transport/binder/wire_format/wire_reader_impl.cc
@@ -0,0 +1,273 @@
+// Copyright 2021 gRPC authors.
+//
+// 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.
+
+#include <grpc/impl/codegen/port_platform.h>
+
+#include "src/core/ext/transport/binder/wire_format/wire_reader_impl.h"
+
+#include <grpc/support/log.h>
+
+#include <functional>
+#include <limits>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "absl/memory/memory.h"
+#include "absl/status/statusor.h"
+#include "src/core/ext/transport/binder/utils/transport_stream_receiver.h"
+#include "src/core/ext/transport/binder/wire_format/binder.h"
+#include "src/core/ext/transport/binder/wire_format/wire_writer.h"
+
+#define RETURN_IF_ERROR(expr) \
+ do { \
+ const absl::Status status = (expr); \
+ if (!status.ok()) return status; \
+ } while (0)
+
+namespace grpc_binder {
+namespace {
+
+absl::StatusOr<Metadata> parse_metadata(const ReadableParcel* reader) {
+ int num_header;
+ RETURN_IF_ERROR(reader->ReadInt32(&num_header));
+ gpr_log(GPR_INFO, "num_header = %d", num_header);
+ std::vector<std::pair<std::string, std::string>> ret;
+ for (int i = 0; i != num_header; i++) {
+ int count;
+ RETURN_IF_ERROR(reader->ReadInt32(&count));
+ gpr_log(GPR_INFO, "count = %d", count);
+ std::string key{};
+ if (count > 0) RETURN_IF_ERROR(reader->ReadByteArray(&key));
+ gpr_log(GPR_INFO, "key = %s", key.c_str());
+ RETURN_IF_ERROR(reader->ReadInt32(&count));
+ gpr_log(GPR_INFO, "count = %d", count);
+ std::string value{};
+ if (count > 0) RETURN_IF_ERROR(reader->ReadByteArray(&value));
+ gpr_log(GPR_INFO, "value = %s", value.c_str());
+ ret.push_back({key, value});
+ }
+ return ret;
+}
+
+} // namespace
+
+WireReaderImpl::WireReaderImpl(
+ TransportStreamReceiver* transport_stream_receiver, bool is_client)
+ : transport_stream_receiver_(transport_stream_receiver),
+ is_client_(is_client) {}
+
+WireReaderImpl::~WireReaderImpl() = default;
+
+std::unique_ptr<WireWriter> WireReaderImpl::SetupTransport(
+ std::unique_ptr<Binder> binder) {
+ if (!is_client_) {
+ gpr_log(GPR_ERROR, "Server-side SETUP_TRANSPORT is not implemented yet.");
+ return nullptr;
+ }
+
+ gpr_log(GPR_INFO, "Setting up transport");
+ binder->Initialize();
+ gpr_log(GPR_INFO, "prepare transaction = %d",
+ binder->PrepareTransaction().ok());
+
+ // Only support client-side transport setup.
+ SendSetupTransport(binder.get());
+ RecvSetupTransport();
+ return absl::make_unique<WireWriterImpl>(std::move(other_end_binder_));
+}
+
+void WireReaderImpl::SendSetupTransport(Binder* binder) {
+ WritableParcel* writable_parcel = binder->GetWritableParcel();
+ gpr_log(GPR_INFO, "data position = %d", writable_parcel->GetDataPosition());
+ // gpr_log(GPR_INFO, "set data position to 0 = %d",
+ // writer->SetDataPosition(0));
+ gpr_log(GPR_INFO, "data position = %d", writable_parcel->GetDataPosition());
+ int32_t version = 77;
+ gpr_log(GPR_INFO, "write int32 = %d",
+ writable_parcel->WriteInt32(version).ok());
+ gpr_log(GPR_INFO, "data position = %d", writable_parcel->GetDataPosition());
+ // The lifetime of the transaction receiver is the same as the wire writer's.
+ // The transaction receiver is responsible for not calling the on-transact
+ // callback when it's dead.
+ tx_receiver_ = binder->ConstructTxReceiver(
+ [this](transaction_code_t code, const ReadableParcel* readable_parcel) {
+ return this->ProcessTransaction(code, readable_parcel);
+ });
+
+ gpr_log(GPR_INFO, "tx_receiver = %p", tx_receiver_->GetRawBinder());
+ gpr_log(GPR_INFO, "AParcel_writeStrongBinder = %d",
+ writable_parcel->WriteBinder(tx_receiver_.get()).ok());
+ gpr_log(GPR_INFO, "AIBinder_transact = %d",
+ binder->Transact(BinderTransportTxCode::SETUP_TRANSPORT).ok());
+}
+
+void WireReaderImpl::RecvSetupTransport() {
+ // TODO(b/191941760): avoid blocking, handle wire_writer_noti lifetime
+ // better
+ gpr_log(GPR_INFO, "start waiting for noti");
+ connection_noti_.WaitForNotification();
+ gpr_log(GPR_INFO, "end waiting for noti");
+}
+
+absl::Status WireReaderImpl::ProcessTransaction(transaction_code_t code,
+ const ReadableParcel* parcel) {
+ gpr_log(GPR_INFO, __func__);
+ gpr_log(GPR_INFO, "tx code = %u", code);
+ if (code >= static_cast<unsigned>(kFirstCallId)) {
+ gpr_log(GPR_INFO, "This is probably a Streaming Tx");
+ return ProcessStreamingTransaction(code, parcel);
+ }
+
+ if (!(code >= static_cast<transaction_code_t>(
+ BinderTransportTxCode::SETUP_TRANSPORT) &&
+ code <= static_cast<transaction_code_t>(
+ BinderTransportTxCode::PING_RESPONSE))) {
+ gpr_log(GPR_ERROR,
+ "Received unknown control message. Shutdown transport gracefully.");
+ // TODO(waynetu): Shutdown transport gracefully.
+ return absl::OkStatus();
+ }
+
+ switch (BinderTransportTxCode(code)) {
+ case BinderTransportTxCode::SETUP_TRANSPORT: {
+ // int datasize;
+ int version;
+ // getDataSize not supported until 31
+ // gpr_log(GPR_INFO, "getDataSize = %d", AParcel_getDataSize(in,
+ // &datasize));
+ RETURN_IF_ERROR(parcel->ReadInt32(&version));
+ // gpr_log(GPR_INFO, "data size = %d", datasize);
+ gpr_log(GPR_INFO, "version = %d", version);
+ std::unique_ptr<Binder> binder{};
+ RETURN_IF_ERROR(parcel->ReadBinder(&binder));
+ binder->Initialize();
+ other_end_binder_ = std::move(binder);
+ connection_noti_.Notify();
+ break;
+ }
+ case BinderTransportTxCode::SHUTDOWN_TRANSPORT: {
+ gpr_log(GPR_ERROR,
+ "Received SHUTDOWN_TRANSPORT request but not implemented yet.");
+ GPR_ASSERT(false);
+ break;
+ }
+ case BinderTransportTxCode::ACKNOWLEDGE_BYTES: {
+ int num_bytes = -1;
+ RETURN_IF_ERROR(parcel->ReadInt32(&num_bytes));
+ gpr_log(GPR_INFO, "received acknowledge bytes = %d", num_bytes);
+ break;
+ }
+ case BinderTransportTxCode::PING: {
+ GPR_ASSERT(!is_client_);
+ int ping_id = -1;
+ RETURN_IF_ERROR(parcel->ReadInt32(&ping_id));
+ gpr_log(GPR_INFO, "received ping id = %d", ping_id);
+ // TODO(waynetu): Ping back.
+ break;
+ }
+ case BinderTransportTxCode::PING_RESPONSE: {
+ int value = -1;
+ RETURN_IF_ERROR(parcel->ReadInt32(&value));
+ gpr_log(GPR_INFO, "received ping response = %d", value);
+ break;
+ }
+ }
+ return absl::OkStatus();
+}
+
+absl::Status WireReaderImpl::ProcessStreamingTransaction(
+ transaction_code_t code, const ReadableParcel* parcel) {
+ int flags;
+ RETURN_IF_ERROR(parcel->ReadInt32(&flags));
+ gpr_log(GPR_INFO, "flags = %d", flags);
+
+ // Ignore in-coming transaction with flag = 0 to match with Java
+ // implementation.
+ // TODO(waynetu): Check with grpc-java team to see whether this is the
+ // intended behavior.
+ // TODO(waynetu): What should be returned here?
+ if (flags == 0) return absl::OkStatus();
+
+ int status = flags >> 16;
+ gpr_log(GPR_INFO, "status = %d", status);
+ gpr_log(GPR_INFO, "FLAG_PREFIX = %d", (flags & kFlagPrefix));
+ gpr_log(GPR_INFO, "FLAG_MESSAGE_DATA = %d", (flags & kFlagMessageData));
+ gpr_log(GPR_INFO, "FLAG_SUFFIX = %d", (flags & kFlagSuffix));
+ int seq_num;
+ RETURN_IF_ERROR(parcel->ReadInt32(&seq_num));
+ // TODO(waynetu): For now we'll just assume that the transactions commit in
+ // the same order they're issued. The following assertion detects
+ // out-of-order or missing transactions. WireReaderImpl should be fixed if
+ // we indeed found such behavior.
+ int32_t& expectation = expected_seq_num_[code];
+ // TODO(mingcl): Don't assert here
+ GPR_ASSERT(seq_num >= 0);
+ GPR_ASSERT(seq_num == expectation && "Interleaved sequence number");
+ // TODO(waynetu): According to the protocol, "The sequence number will wrap
+ // around to 0 if more than 2^31 messages are sent." For now we'll just
+ // assert that it never reach such circumstances.
+ GPR_ASSERT(expectation < std::numeric_limits<int32_t>::max() &&
+ "Sequence number too large");
+ expectation++;
+ gpr_log(GPR_INFO, "sequence number = %d", seq_num);
+ if (flags & kFlagPrefix) {
+ char method_ref[111];
+ if (!is_client_) {
+ RETURN_IF_ERROR(parcel->ReadString(method_ref));
+ }
+ absl::StatusOr<Metadata> initial_metadata_or_error = parse_metadata(parcel);
+ if (!initial_metadata_or_error.ok()) {
+ return initial_metadata_or_error.status();
+ }
+ if (!is_client_) {
+ initial_metadata_or_error->emplace_back(":path", method_ref);
+ }
+ transport_stream_receiver_->NotifyRecvInitialMetadata(
+ code, *initial_metadata_or_error);
+ }
+ if (flags & kFlagMessageData) {
+ int count;
+ RETURN_IF_ERROR(parcel->ReadInt32(&count));
+ gpr_log(GPR_INFO, "count = %d", count);
+ std::string msg_data{};
+ if (count > 0) {
+ RETURN_IF_ERROR(parcel->ReadByteArray(&msg_data));
+ }
+ gpr_log(GPR_INFO, "msg_data = %s", msg_data.c_str());
+ transport_stream_receiver_->NotifyRecvMessage(code, msg_data);
+ }
+ if (flags & kFlagSuffix) {
+ if (flags & kFlagStatusDescription) {
+ // FLAG_STATUS_DESCRIPTION set
+ char desc[111];
+ RETURN_IF_ERROR(parcel->ReadString(desc));
+ gpr_log(GPR_INFO, "description = %s", desc);
+ }
+ Metadata trailing_metadata;
+ if (is_client_) {
+ absl::StatusOr<Metadata> trailing_metadata_or_error =
+ parse_metadata(parcel);
+ if (!trailing_metadata_or_error.ok()) {
+ return trailing_metadata_or_error.status();
+ }
+ trailing_metadata = *trailing_metadata_or_error;
+ }
+ transport_stream_receiver_->NotifyRecvTrailingMetadata(
+ code, trailing_metadata, status);
+ }
+ return absl::OkStatus();
+}
+
+} // namespace grpc_binder
diff --git a/src/core/ext/transport/binder/wire_format/wire_reader_impl.h b/src/core/ext/transport/binder/wire_format/wire_reader_impl.h
new file mode 100644
index 0000000000..25e3914c69
--- /dev/null
+++ b/src/core/ext/transport/binder/wire_format/wire_reader_impl.h
@@ -0,0 +1,76 @@
+// Copyright 2021 gRPC authors.
+//
+// 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.
+
+#ifndef GRPC_CORE_EXT_TRANSPORT_BINDER_WIRE_FORMAT_WIRE_READER_IMPL_H
+#define GRPC_CORE_EXT_TRANSPORT_BINDER_WIRE_FORMAT_WIRE_READER_IMPL_H
+
+#include <grpc/impl/codegen/port_platform.h>
+
+#include <memory>
+#include <utility>
+
+#include "absl/container/flat_hash_map.h"
+#include "absl/synchronization/notification.h"
+#include "src/core/ext/transport/binder/utils/transport_stream_receiver.h"
+#include "src/core/ext/transport/binder/wire_format/binder.h"
+#include "src/core/ext/transport/binder/wire_format/wire_reader.h"
+#include "src/core/ext/transport/binder/wire_format/wire_writer.h"
+
+namespace grpc_binder {
+
+class WireReaderImpl : public WireReader {
+ public:
+ explicit WireReaderImpl(TransportStreamReceiver* transport_stream_receiver,
+ bool is_client);
+ ~WireReaderImpl() override;
+
+ // Setup the transport between endpoint binders.
+ //
+ // The client and the server both call SetupTransport() when constructing
+ // transport.
+ //
+ // High-level overview of transaction setup:
+ // 0. Client obtain an |endpoint_binder| from the server.
+ // 1. Client creates a binder |client_binder| and hook its on-transaction
+ // callback to client's ProcessTransaction(). Client then sends
+ // |client_binder| through |endpoint_binder| to server.
+ // 2. Server receives |client_binder| via |endpoint_binder|.
+ // 3. Server creates a binder |server_binder| and hook its on-transaction
+ // callback to server's ProcessTransaction(). Server then sends
+ // |server_binder| through |client_binder| back to the client.
+ // 4. Client receives |server_binder| via |client_binder|'s on-transaction
+ // callback.
+ std::unique_ptr<WireWriter> SetupTransport(
+ std::unique_ptr<Binder> endpoint_binder) override;
+
+ absl::Status ProcessTransaction(transaction_code_t code,
+ const ReadableParcel* parcel);
+
+ private:
+ void SendSetupTransport(Binder* binder);
+ void RecvSetupTransport();
+ absl::Status ProcessStreamingTransaction(transaction_code_t code,
+ const ReadableParcel* parcel);
+
+ TransportStreamReceiver* transport_stream_receiver_;
+ absl::Notification connection_noti_;
+ std::unique_ptr<Binder> other_end_binder_;
+ absl::flat_hash_map<transaction_code_t, int32_t> expected_seq_num_;
+ std::unique_ptr<TransactionReceiver> tx_receiver_;
+ bool is_client_;
+};
+
+} // namespace grpc_binder
+
+#endif // GRPC_CORE_EXT_TRANSPORT_BINDER_WIRE_FORMAT_WIRE_READER_IMPL_H
diff --git a/src/core/ext/transport/binder/wire_format/wire_writer.cc b/src/core/ext/transport/binder/wire_format/wire_writer.cc
new file mode 100644
index 0000000000..074baa92f1
--- /dev/null
+++ b/src/core/ext/transport/binder/wire_format/wire_writer.cc
@@ -0,0 +1,80 @@
+// Copyright 2021 gRPC authors.
+//
+// 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.
+
+#include <grpc/impl/codegen/port_platform.h>
+
+#include "src/core/ext/transport/binder/wire_format/wire_writer.h"
+
+#include <grpc/support/log.h>
+
+#include <utility>
+
+#define RETURN_IF_ERROR(expr) \
+ do { \
+ const absl::Status status = (expr); \
+ if (!status.ok()) return status; \
+ } while (0)
+
+namespace grpc_binder {
+WireWriterImpl::WireWriterImpl(std::unique_ptr<Binder> binder)
+ : binder_(std::move(binder)) {}
+
+absl::Status WireWriterImpl::RpcCall(const Transaction& tx) {
+ // TODO(mingcl): check tx_code <= last call id
+ grpc_core::MutexLock lock(&mu_);
+ GPR_ASSERT(tx.GetTxCode() >= kFirstCallId);
+ RETURN_IF_ERROR(binder_->PrepareTransaction());
+ WritableParcel* parcel = binder_->GetWritableParcel();
+ {
+ // fill parcel
+ RETURN_IF_ERROR(parcel->WriteInt32(tx.GetFlags()));
+ RETURN_IF_ERROR(parcel->WriteInt32(tx.GetSeqNum()));
+ if (tx.GetFlags() & kFlagPrefix) {
+ // prefix set
+ if (tx.IsClient()) {
+ // Only client sends method ref.
+ RETURN_IF_ERROR(parcel->WriteString(tx.GetMethodRef()));
+ }
+ RETURN_IF_ERROR(parcel->WriteInt32(tx.GetPrefixMetadata().size()));
+ for (const auto& md : tx.GetPrefixMetadata()) {
+ RETURN_IF_ERROR(parcel->WriteByteArrayWithLength(md.first));
+ RETURN_IF_ERROR(parcel->WriteByteArrayWithLength(md.second));
+ }
+ }
+ if (tx.GetFlags() & kFlagMessageData) {
+ RETURN_IF_ERROR(parcel->WriteByteArrayWithLength(tx.GetMessageData()));
+ }
+ if (tx.GetFlags() & kFlagSuffix) {
+ if (tx.IsServer()) {
+ if (tx.GetFlags() & kFlagStatusDescription) {
+ RETURN_IF_ERROR(parcel->WriteString(tx.GetStatusDesc()));
+ }
+ RETURN_IF_ERROR(parcel->WriteInt32(tx.GetSuffixMetadata().size()));
+ for (const auto& md : tx.GetSuffixMetadata()) {
+ RETURN_IF_ERROR(parcel->WriteByteArrayWithLength(md.first));
+ RETURN_IF_ERROR(parcel->WriteByteArrayWithLength(md.second));
+ }
+ } else {
+ // client suffix currently is always empty according to the wireformat
+ if (!tx.GetSuffixMetadata().empty()) {
+ gpr_log(GPR_ERROR, "Got non-empty suffix metadata from client.");
+ }
+ }
+ }
+ }
+ // FIXME(waynetu): Construct BinderTransportTxCode from an arbitrary integer
+ // is an undefined behavior.
+ return binder_->Transact(BinderTransportTxCode(tx.GetTxCode()));
+}
+} // namespace grpc_binder
diff --git a/src/core/ext/transport/binder/wire_format/wire_writer.h b/src/core/ext/transport/binder/wire_format/wire_writer.h
new file mode 100644
index 0000000000..1f117457d4
--- /dev/null
+++ b/src/core/ext/transport/binder/wire_format/wire_writer.h
@@ -0,0 +1,49 @@
+// Copyright 2021 gRPC authors.
+//
+// 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.
+
+#ifndef GRPC_CORE_EXT_TRANSPORT_BINDER_WIRE_FORMAT_WIRE_WRITER_H
+#define GRPC_CORE_EXT_TRANSPORT_BINDER_WIRE_FORMAT_WIRE_WRITER_H
+
+#include <grpc/impl/codegen/port_platform.h>
+
+#include <grpc/support/log.h>
+
+#include <string>
+#include <vector>
+
+#include "src/core/ext/transport/binder/wire_format/binder.h"
+#include "src/core/ext/transport/binder/wire_format/transaction.h"
+#include "src/core/lib/gprpp/sync.h"
+
+namespace grpc_binder {
+
+class WireWriter {
+ public:
+ virtual ~WireWriter() = default;
+ virtual absl::Status RpcCall(const Transaction& call) = 0;
+};
+
+class WireWriterImpl : public WireWriter {
+ public:
+ explicit WireWriterImpl(std::unique_ptr<Binder> binder);
+ absl::Status RpcCall(const Transaction& tx) override;
+
+ private:
+ grpc_core::Mutex mu_;
+ std::unique_ptr<Binder> binder_ ABSL_GUARDED_BY(mu_);
+};
+
+} // namespace grpc_binder
+
+#endif // GRPC_CORE_EXT_TRANSPORT_BINDER_WIRE_FORMAT_WIRE_WRITER_H
diff --git a/src/core/ext/transport/chttp2/server/chttp2_server.cc b/src/core/ext/transport/chttp2/server/chttp2_server.cc
index 60adc7250c..1459f102d7 100644
--- a/src/core/ext/transport/chttp2/server/chttp2_server.cc
+++ b/src/core/ext/transport/chttp2/server/chttp2_server.cc
@@ -128,7 +128,7 @@ class Chttp2ServerListener : public Server::ListenerInterface {
static void OnHandshakeDone(void* arg, grpc_error_handle error);
RefCountedPtr<ActiveConnection> const connection_;
grpc_pollset* const accepting_pollset_;
- grpc_tcp_server_acceptor* const acceptor_;
+ grpc_tcp_server_acceptor* acceptor_;
RefCountedPtr<HandshakeManager> handshake_mgr_
ABSL_GUARDED_BY(&connection_->mu_);
// State for enforcing handshake timeout on receiving HTTP/2 settings.
@@ -321,6 +321,7 @@ Chttp2ServerListener::ActiveConnection::HandshakingState::HandshakingState(
Chttp2ServerListener::ActiveConnection::HandshakingState::~HandshakingState() {
grpc_pollset_set_del_pollset(interested_parties_, accepting_pollset_);
grpc_pollset_set_destroy(interested_parties_);
+ gpr_free(acceptor_);
}
void Chttp2ServerListener::ActiveConnection::HandshakingState::Orphan() {
@@ -478,6 +479,7 @@ void Chttp2ServerListener::ActiveConnection::HandshakingState::OnHandshakeDone(
handshaking_state_ref = std::move(self->connection_->handshaking_state_);
}
gpr_free(self->acceptor_);
+ self->acceptor_ = nullptr;
OrphanablePtr<ActiveConnection> connection;
if (free_resource_quota && resource_user != nullptr) {
grpc_resource_user_free(resource_user, GRPC_RESOURCE_QUOTA_CHANNEL_SIZE);
@@ -745,6 +747,8 @@ void Chttp2ServerListener::OnAccept(void* arg, grpc_endpoint* tcp,
}
auto connection =
MakeOrphanable<ActiveConnection>(accepting_pollset, acceptor, args);
+ // We no longer own acceptor
+ acceptor = nullptr;
// Hold a ref to connection to allow starting handshake outside the
// critical region
RefCountedPtr<ActiveConnection> connection_ref = connection->Ref();
diff --git a/src/core/ext/transport/chttp2/transport/bin_decoder.cc b/src/core/ext/transport/chttp2/transport/bin_decoder.cc
index 2906a5d2a0..f8d5778d4e 100644
--- a/src/core/ext/transport/chttp2/transport/bin_decoder.cc
+++ b/src/core/ext/transport/chttp2/transport/bin_decoder.cc
@@ -146,7 +146,7 @@ bool grpc_base64_decode_partial(struct grpc_base64_decode_context* ctx) {
switch (input_tail) {
case 3:
ctx->output_cur[1] = COMPOSE_OUTPUT_BYTE_1(ctx->input_cur);
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case 2:
ctx->output_cur[0] = COMPOSE_OUTPUT_BYTE_0(ctx->input_cur);
}
diff --git a/src/core/lib/event_engine/slice_allocator.cc b/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc
index ccf9facb49..1daad25bce 100644
--- a/src/core/lib/event_engine/slice_allocator.cc
+++ b/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc
@@ -17,71 +17,48 @@
#include <functional>
+#include "absl/memory/memory.h"
#include "absl/status/status.h"
+#include "src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h"
#include "src/core/lib/iomgr/resource_quota.h"
namespace grpc_event_engine {
namespace experimental {
-SliceAllocator::SliceAllocator(grpc_resource_user* user)
- : resource_user_(user) {
- grpc_resource_user_ref(resource_user_);
-};
+Chttp2SliceAllocator::Chttp2SliceAllocator(grpc_resource_user* user)
+ : resource_user_(user) {}
-SliceAllocator::~SliceAllocator() {
+Chttp2SliceAllocator::~Chttp2SliceAllocator() {
if (resource_user_ != nullptr) {
grpc_resource_user_unref(resource_user_);
}
-};
-
-SliceAllocator::SliceAllocator(SliceAllocator&& other) noexcept
- : resource_user_(other.resource_user_) {
- other.resource_user_ = nullptr;
-}
-
-SliceAllocator& SliceAllocator::operator=(SliceAllocator&& other) noexcept {
- resource_user_ = other.resource_user_;
- other.resource_user_ = nullptr;
- return *this;
}
-absl::Status SliceAllocator::Allocate(size_t size, SliceBuffer* dest,
- SliceAllocator::AllocateCallback cb) {
+absl::Status Chttp2SliceAllocator::Allocate(
+ size_t size, SliceBuffer* dest, SliceAllocator::AllocateCallback cb) {
// TODO(hork): merge the implementation from the uv-ee branch.
(void)size;
(void)dest;
(void)cb;
return absl::OkStatus();
-};
+}
-SliceAllocatorFactory::SliceAllocatorFactory(grpc_resource_quota* quota)
+Chttp2SliceAllocatorFactory::Chttp2SliceAllocatorFactory(
+ grpc_resource_quota* quota)
: resource_quota_(quota) {
grpc_resource_quota_ref_internal(resource_quota_);
-};
+}
-SliceAllocatorFactory::~SliceAllocatorFactory() {
+Chttp2SliceAllocatorFactory::~Chttp2SliceAllocatorFactory() {
if (resource_quota_ != nullptr) {
grpc_resource_quota_unref_internal(resource_quota_);
}
}
-SliceAllocatorFactory::SliceAllocatorFactory(
- SliceAllocatorFactory&& other) noexcept
- : resource_quota_(other.resource_quota_) {
- other.resource_quota_ = nullptr;
-}
-
-SliceAllocatorFactory& SliceAllocatorFactory::operator=(
- SliceAllocatorFactory&& other) noexcept {
- resource_quota_ = other.resource_quota_;
- other.resource_quota_ = nullptr;
- return *this;
-}
-
-SliceAllocator SliceAllocatorFactory::CreateSliceAllocator(
- absl::string_view peer_name) {
- return SliceAllocator(
+std::unique_ptr<SliceAllocator>
+Chttp2SliceAllocatorFactory::CreateSliceAllocator(absl::string_view peer_name) {
+ return absl::make_unique<Chttp2SliceAllocator>(
grpc_resource_user_create(resource_quota_, peer_name.data()));
}
diff --git a/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h b/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h
new file mode 100644
index 0000000000..5e37b8eb9d
--- /dev/null
+++ b/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h
@@ -0,0 +1,74 @@
+// Copyright 2021 The gRPC Authors
+//
+// 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.
+#ifndef GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_CHTTP2_SLICE_ALLOCATOR_H
+#define GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_CHTTP2_SLICE_ALLOCATOR_H
+
+#include <grpc/support/port_platform.h>
+
+#include "grpc/event_engine/slice_allocator.h"
+
+#include <functional>
+
+#include "absl/status/status.h"
+
+#include "src/core/lib/iomgr/resource_quota.h"
+
+namespace grpc_event_engine {
+namespace experimental {
+
+class Chttp2SliceAllocator
+ : public grpc_event_engine::experimental::SliceAllocator {
+ public:
+ /// gRPC-internal constructor. Takes ownership of a resource_user ref from the
+ /// caller.
+ explicit Chttp2SliceAllocator(grpc_resource_user* user);
+ // Not copyable
+ Chttp2SliceAllocator(Chttp2SliceAllocator& other) = delete;
+ Chttp2SliceAllocator& operator=(const Chttp2SliceAllocator& other) = delete;
+ // Not Moveable
+ Chttp2SliceAllocator(Chttp2SliceAllocator&& other) = delete;
+ Chttp2SliceAllocator& operator=(Chttp2SliceAllocator&& other) = delete;
+ ~Chttp2SliceAllocator() override;
+ absl::Status Allocate(size_t size, SliceBuffer* dest,
+ SliceAllocator::AllocateCallback cb) override;
+
+ private:
+ grpc_resource_user* resource_user_;
+};
+
+class Chttp2SliceAllocatorFactory
+ : public grpc_event_engine::experimental::SliceAllocatorFactory {
+ public:
+ // gRPC-internal constructor
+ explicit Chttp2SliceAllocatorFactory(grpc_resource_quota* quota);
+ // Not copyable
+ Chttp2SliceAllocatorFactory(Chttp2SliceAllocatorFactory& other) = delete;
+ Chttp2SliceAllocatorFactory& operator=(
+ const Chttp2SliceAllocatorFactory& other) = delete;
+ // Not Moveable
+ Chttp2SliceAllocatorFactory(Chttp2SliceAllocatorFactory&& other) = delete;
+ Chttp2SliceAllocatorFactory& operator=(Chttp2SliceAllocatorFactory&& other) =
+ delete;
+ ~Chttp2SliceAllocatorFactory() override;
+ std::unique_ptr<SliceAllocator> CreateSliceAllocator(
+ absl::string_view peer_name) override;
+
+ private:
+ grpc_resource_quota* resource_quota_;
+};
+
+} // namespace experimental
+} // namespace grpc_event_engine
+
+#endif // GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_CHTTP2_SLICE_ALLOCATOR_H
diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc
index ec789cb23e..1e980cf49c 100644
--- a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc
+++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc
@@ -215,7 +215,6 @@ grpc_chttp2_transport::~grpc_chttp2_transport() {
cl = nullptr;
grpc_slice_buffer_destroy_internal(&read_buffer);
- grpc_chttp2_hpack_parser_destroy(&hpack_parser);
grpc_chttp2_goaway_parser_destroy(&goaway_parser);
for (i = 0; i < STREAM_LIST_COUNT; i++) {
@@ -485,7 +484,6 @@ grpc_chttp2_transport::grpc_chttp2_transport(
settings[j][i] = grpc_chttp2_settings_parameters[i].default_value;
}
}
- grpc_chttp2_hpack_parser_init(&hpack_parser);
grpc_chttp2_goaway_parser_init(&goaway_parser);
// configure http2 the way we like it
@@ -1288,7 +1286,6 @@ static void continue_fetching_send_locked(grpc_chttp2_transport* t,
if (s->fetching_send_message == nullptr) {
// Stream was cancelled before message fetch completed
abort(); /* TODO(ctiller): what cleanup here? */
- return; /* early out */
}
if (s->fetched_send_message_length == s->fetching_send_message->length()) {
int64_t notify_offset = s->next_message_end_offset;
@@ -1593,8 +1590,7 @@ static void perform_stream_op_locked(void* stream_op,
grpc_chttp2_maybe_complete_recv_message(t, s);
if (s->id != 0) {
if (!s->read_closed && s->frame_storage.length == 0) {
- size_t after = s->frame_storage.length +
- s->unprocessed_incoming_frames_buffer_cached_length;
+ size_t after = s->unprocessed_incoming_frames_buffer_cached_length;
s->flow_control->IncomingByteStreamUpdate(GRPC_HEADER_SIZE_IN_BYTES,
before - after);
grpc_chttp2_act_on_flowctl_action(s->flow_control->MakeAction(), t, s);
@@ -2447,7 +2443,7 @@ static void WithUrgency(grpc_chttp2_transport* t,
break;
case grpc_core::chttp2::FlowControlAction::Urgency::UPDATE_IMMEDIATELY:
grpc_chttp2_initiate_write(t, reason);
- // fallthrough
+ ABSL_FALLTHROUGH_INTENDED;
case grpc_core::chttp2::FlowControlAction::Urgency::QUEUE_UPDATE:
action();
break;
diff --git a/src/core/ext/transport/chttp2/transport/flow_control.h b/src/core/ext/transport/chttp2/transport/flow_control.h
index e5088964b9..b5dce2fd59 100644
--- a/src/core/ext/transport/chttp2/transport/flow_control.h
+++ b/src/core/ext/transport/chttp2/transport/flow_control.h
@@ -479,4 +479,4 @@ extern TestOnlyTransportTargetWindowEstimatesMocker*
} // namespace chttp2
} // namespace grpc_core
-#endif
+#endif // GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_FLOW_CONTROL_H
diff --git a/src/core/ext/transport/chttp2/transport/frame_data.cc b/src/core/ext/transport/chttp2/transport/frame_data.cc
index 745f32a28f..0787968a87 100644
--- a/src/core/ext/transport/chttp2/transport/frame_data.cc
+++ b/src/core/ext/transport/chttp2/transport/frame_data.cc
@@ -148,7 +148,7 @@ grpc_error_handle grpc_deframe_unprocessed_incoming_frames(
grpc_slice_buffer_remove_first(slices);
continue;
}
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_CHTTP2_DATA_FH_1:
s->stats.incoming.framing_bytes++;
p->frame_size = (static_cast<uint32_t>(*cur)) << 24;
@@ -157,7 +157,7 @@ grpc_error_handle grpc_deframe_unprocessed_incoming_frames(
grpc_slice_buffer_remove_first(slices);
continue;
}
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_CHTTP2_DATA_FH_2:
s->stats.incoming.framing_bytes++;
p->frame_size |= (static_cast<uint32_t>(*cur)) << 16;
@@ -166,7 +166,7 @@ grpc_error_handle grpc_deframe_unprocessed_incoming_frames(
grpc_slice_buffer_remove_first(slices);
continue;
}
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_CHTTP2_DATA_FH_3:
s->stats.incoming.framing_bytes++;
p->frame_size |= (static_cast<uint32_t>(*cur)) << 8;
@@ -175,7 +175,7 @@ grpc_error_handle grpc_deframe_unprocessed_incoming_frames(
grpc_slice_buffer_remove_first(slices);
continue;
}
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_CHTTP2_DATA_FH_4:
s->stats.incoming.framing_bytes++;
GPR_ASSERT(stream_out != nullptr);
diff --git a/src/core/ext/transport/chttp2/transport/frame_goaway.cc b/src/core/ext/transport/chttp2/transport/frame_goaway.cc
index a139bea15c..ebd499a4a5 100644
--- a/src/core/ext/transport/chttp2/transport/frame_goaway.cc
+++ b/src/core/ext/transport/chttp2/transport/frame_goaway.cc
@@ -70,7 +70,7 @@ grpc_error_handle grpc_chttp2_goaway_parser_parse(void* parser,
}
p->last_stream_id = (static_cast<uint32_t>(*cur)) << 24;
++cur;
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_CHTTP2_GOAWAY_LSI1:
if (cur == end) {
p->state = GRPC_CHTTP2_GOAWAY_LSI1;
@@ -78,7 +78,7 @@ grpc_error_handle grpc_chttp2_goaway_parser_parse(void* parser,
}
p->last_stream_id |= (static_cast<uint32_t>(*cur)) << 16;
++cur;
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_CHTTP2_GOAWAY_LSI2:
if (cur == end) {
p->state = GRPC_CHTTP2_GOAWAY_LSI2;
@@ -86,7 +86,7 @@ grpc_error_handle grpc_chttp2_goaway_parser_parse(void* parser,
}
p->last_stream_id |= (static_cast<uint32_t>(*cur)) << 8;
++cur;
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_CHTTP2_GOAWAY_LSI3:
if (cur == end) {
p->state = GRPC_CHTTP2_GOAWAY_LSI3;
@@ -94,7 +94,7 @@ grpc_error_handle grpc_chttp2_goaway_parser_parse(void* parser,
}
p->last_stream_id |= (static_cast<uint32_t>(*cur));
++cur;
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_CHTTP2_GOAWAY_ERR0:
if (cur == end) {
p->state = GRPC_CHTTP2_GOAWAY_ERR0;
@@ -102,7 +102,7 @@ grpc_error_handle grpc_chttp2_goaway_parser_parse(void* parser,
}
p->error_code = (static_cast<uint32_t>(*cur)) << 24;
++cur;
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_CHTTP2_GOAWAY_ERR1:
if (cur == end) {
p->state = GRPC_CHTTP2_GOAWAY_ERR1;
@@ -110,7 +110,7 @@ grpc_error_handle grpc_chttp2_goaway_parser_parse(void* parser,
}
p->error_code |= (static_cast<uint32_t>(*cur)) << 16;
++cur;
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_CHTTP2_GOAWAY_ERR2:
if (cur == end) {
p->state = GRPC_CHTTP2_GOAWAY_ERR2;
@@ -118,7 +118,7 @@ grpc_error_handle grpc_chttp2_goaway_parser_parse(void* parser,
}
p->error_code |= (static_cast<uint32_t>(*cur)) << 8;
++cur;
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_CHTTP2_GOAWAY_ERR3:
if (cur == end) {
p->state = GRPC_CHTTP2_GOAWAY_ERR3;
@@ -126,7 +126,7 @@ grpc_error_handle grpc_chttp2_goaway_parser_parse(void* parser,
}
p->error_code |= (static_cast<uint32_t>(*cur));
++cur;
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_CHTTP2_GOAWAY_DEBUG:
if (end != cur) {
memcpy(p->debug_data + p->debug_pos, cur,
diff --git a/src/core/ext/transport/chttp2/transport/frame_settings.cc b/src/core/ext/transport/chttp2/transport/frame_settings.cc
index 576f8158c8..35400d0ff0 100644
--- a/src/core/ext/transport/chttp2/transport/frame_settings.cc
+++ b/src/core/ext/transport/chttp2/transport/frame_settings.cc
@@ -146,7 +146,7 @@ grpc_error_handle grpc_chttp2_settings_parser_parse(void* p,
}
parser->id = static_cast<uint16_t>((static_cast<uint16_t>(*cur)) << 8);
cur++;
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_CHTTP2_SPS_ID1:
if (cur == end) {
parser->state = GRPC_CHTTP2_SPS_ID1;
@@ -154,7 +154,7 @@ grpc_error_handle grpc_chttp2_settings_parser_parse(void* p,
}
parser->id = static_cast<uint16_t>(parser->id | (*cur));
cur++;
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_CHTTP2_SPS_VAL0:
if (cur == end) {
parser->state = GRPC_CHTTP2_SPS_VAL0;
@@ -162,7 +162,7 @@ grpc_error_handle grpc_chttp2_settings_parser_parse(void* p,
}
parser->value = (static_cast<uint32_t>(*cur)) << 24;
cur++;
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_CHTTP2_SPS_VAL1:
if (cur == end) {
parser->state = GRPC_CHTTP2_SPS_VAL1;
@@ -170,7 +170,7 @@ grpc_error_handle grpc_chttp2_settings_parser_parse(void* p,
}
parser->value |= (static_cast<uint32_t>(*cur)) << 16;
cur++;
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_CHTTP2_SPS_VAL2:
if (cur == end) {
parser->state = GRPC_CHTTP2_SPS_VAL2;
@@ -178,7 +178,7 @@ grpc_error_handle grpc_chttp2_settings_parser_parse(void* p,
}
parser->value |= (static_cast<uint32_t>(*cur)) << 8;
cur++;
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_CHTTP2_SPS_VAL3:
if (cur == end) {
parser->state = GRPC_CHTTP2_SPS_VAL3;
diff --git a/src/core/ext/transport/chttp2/transport/hpack_parser.cc b/src/core/ext/transport/chttp2/transport/hpack_parser.cc
index 99c308f078..3d6e1aa346 100644
--- a/src/core/ext/transport/chttp2/transport/hpack_parser.cc
+++ b/src/core/ext/transport/chttp2/transport/hpack_parser.cc
@@ -40,17 +40,17 @@
#include "src/core/lib/surface/validate_metadata.h"
#include "src/core/lib/transport/http2_errors.h"
-grpc_core::DebugOnlyTraceFlag grpc_trace_chttp2_hpack_parser(
- false, "chttp2_hpack_parser");
-
-typedef enum {
- NOT_BINARY,
- BINARY_BEGIN,
- B64_BYTE0,
- B64_BYTE1,
- B64_BYTE2,
- B64_BYTE3
-} binary_state;
+#if __cplusplus > 201103L
+#define GRPC_HPACK_CONSTEXPR_FN constexpr
+#define GRPC_HPACK_CONSTEXPR_VALUE constexpr
+#else
+#define GRPC_HPACK_CONSTEXPR_FN
+#define GRPC_HPACK_CONSTEXPR_VALUE const
+#endif
+
+namespace grpc_core {
+
+DebugOnlyTraceFlag grpc_trace_chttp2_hpack_parser(false, "chttp2_hpack_parser");
/* How parsing works:
@@ -66,184 +66,6 @@ typedef enum {
It's expected that most optimizing compilers will turn this code into
a set of indirect jumps, and so not waste stack space. */
-/* forward declarations for parsing states */
-static grpc_error_handle parse_begin(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur, const uint8_t* end);
-static grpc_error_handle parse_error(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur, const uint8_t* end,
- grpc_error_handle error);
-static grpc_error_handle still_parse_error(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end);
-static grpc_error_handle parse_illegal_op(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end);
-
-static grpc_error_handle parse_string_prefix(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end);
-static grpc_error_handle parse_key_string(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end);
-static grpc_error_handle parse_value_string_with_indexed_key(
- grpc_chttp2_hpack_parser* p, const uint8_t* cur, const uint8_t* end);
-static grpc_error_handle parse_value_string_with_literal_key(
- grpc_chttp2_hpack_parser* p, const uint8_t* cur, const uint8_t* end);
-
-static grpc_error_handle parse_value0(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur, const uint8_t* end);
-static grpc_error_handle parse_value1(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur, const uint8_t* end);
-static grpc_error_handle parse_value2(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur, const uint8_t* end);
-static grpc_error_handle parse_value3(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur, const uint8_t* end);
-static grpc_error_handle parse_value4(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur, const uint8_t* end);
-static grpc_error_handle parse_value5up(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur, const uint8_t* end);
-
-static grpc_error_handle parse_indexed_field(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end);
-static grpc_error_handle parse_indexed_field_x(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end);
-static grpc_error_handle parse_lithdr_incidx(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end);
-static grpc_error_handle parse_lithdr_incidx_x(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end);
-static grpc_error_handle parse_lithdr_incidx_v(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end);
-static grpc_error_handle parse_lithdr_notidx(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end);
-static grpc_error_handle parse_lithdr_notidx_x(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end);
-static grpc_error_handle parse_lithdr_notidx_v(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end);
-static grpc_error_handle parse_lithdr_nvridx(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end);
-static grpc_error_handle parse_lithdr_nvridx_x(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end);
-static grpc_error_handle parse_lithdr_nvridx_v(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end);
-static grpc_error_handle parse_max_tbl_size(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end);
-static grpc_error_handle parse_max_tbl_size_x(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end);
-
-/* we translate the first byte of a hpack field into one of these decoding
- cases, then use a lookup table to jump directly to the appropriate parser.
-
- _X => the integer index is all ones, meaning we need to do varint decoding
- _V => the integer index is all zeros, meaning we need to decode an additional
- string value */
-typedef enum {
- INDEXED_FIELD,
- INDEXED_FIELD_X,
- LITHDR_INCIDX,
- LITHDR_INCIDX_X,
- LITHDR_INCIDX_V,
- LITHDR_NOTIDX,
- LITHDR_NOTIDX_X,
- LITHDR_NOTIDX_V,
- LITHDR_NVRIDX,
- LITHDR_NVRIDX_X,
- LITHDR_NVRIDX_V,
- MAX_TBL_SIZE,
- MAX_TBL_SIZE_X,
- ILLEGAL
-} first_byte_type;
-
-/* jump table of parse state functions -- order must match first_byte_type
- above */
-static const grpc_chttp2_hpack_parser_state first_byte_action[] = {
- parse_indexed_field, parse_indexed_field_x, parse_lithdr_incidx,
- parse_lithdr_incidx_x, parse_lithdr_incidx_v, parse_lithdr_notidx,
- parse_lithdr_notidx_x, parse_lithdr_notidx_v, parse_lithdr_nvridx,
- parse_lithdr_nvridx_x, parse_lithdr_nvridx_v, parse_max_tbl_size,
- parse_max_tbl_size_x, parse_illegal_op};
-
-/* indexes the first byte to a parse state function - generated by
- gen_hpack_tables.c */
-static const uint8_t first_byte_lut[256] = {
- LITHDR_NOTIDX_V, LITHDR_NOTIDX, LITHDR_NOTIDX, LITHDR_NOTIDX,
- LITHDR_NOTIDX, LITHDR_NOTIDX, LITHDR_NOTIDX, LITHDR_NOTIDX,
- LITHDR_NOTIDX, LITHDR_NOTIDX, LITHDR_NOTIDX, LITHDR_NOTIDX,
- LITHDR_NOTIDX, LITHDR_NOTIDX, LITHDR_NOTIDX, LITHDR_NOTIDX_X,
- LITHDR_NVRIDX_V, LITHDR_NVRIDX, LITHDR_NVRIDX, LITHDR_NVRIDX,
- LITHDR_NVRIDX, LITHDR_NVRIDX, LITHDR_NVRIDX, LITHDR_NVRIDX,
- LITHDR_NVRIDX, LITHDR_NVRIDX, LITHDR_NVRIDX, LITHDR_NVRIDX,
- LITHDR_NVRIDX, LITHDR_NVRIDX, LITHDR_NVRIDX, LITHDR_NVRIDX_X,
- MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE,
- MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE,
- MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE,
- MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE,
- MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE,
- MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE,
- MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE,
- MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE, MAX_TBL_SIZE_X,
- LITHDR_INCIDX_V, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
- LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
- LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
- LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
- LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
- LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
- LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
- LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
- LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
- LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
- LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
- LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
- LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
- LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
- LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX,
- LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX, LITHDR_INCIDX_X,
- ILLEGAL, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD,
- INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD, INDEXED_FIELD_X,
-};
-
/* state table for huffman decoding: given a state, gives an index/16 into
next_sub_tbl. Taking that index and adding the value of the nibble being
considered returns the next state.
@@ -617,28 +439,37 @@ static const int16_t emit_sub_tbl[249 * 16] = {
13, 22, 22, 22, 22, 256, 256, 256, 256,
};
-static const uint8_t inverse_base64[256] = {
- 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 62, 255,
- 255, 255, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255,
- 255, 64, 255, 255, 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
- 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
- 25, 255, 255, 255, 255, 255, 255, 26, 27, 28, 29, 30, 31, 32, 33,
- 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
- 49, 50, 51, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
- 255,
+namespace {
+// The alphabet used for base64 encoding binary metadata.
+static constexpr char kBase64Alphabet[] =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
+
+// An inverted table: for each value in kBase64Alphabet, table contains the
+// index with which it's stored, so we can quickly invert the encoding without
+// any complicated runtime logic.
+struct Base64InverseTable {
+ uint8_t table[256]{};
+ GRPC_HPACK_CONSTEXPR_FN Base64InverseTable() {
+ for (int i = 0; i < 256; i++) {
+ table[i] = 255;
+ }
+ for (const char* p = kBase64Alphabet; *p; p++) {
+ uint8_t idx = *p;
+ uint8_t ofs = p - kBase64Alphabet;
+ table[idx] = ofs;
+ }
+ }
};
-static void GPR_ATTRIBUTE_NOINLINE on_hdr_log(grpc_mdelem md) {
+static GRPC_HPACK_CONSTEXPR_VALUE Base64InverseTable kBase64InverseTable;
+} // namespace
+
+void HPackParser::FinishFrame() {
+ sink_ = Sink();
+ dynamic_table_updates_allowed_ = 2;
+}
+
+void GPR_ATTRIBUTE_NOINLINE HPackParser::LogHeader(grpc_mdelem md) {
char* k = grpc_slice_to_c_string(GRPC_MDKEY(md));
char* v = nullptr;
if (grpc_is_binary_header_internal(GRPC_MDKEY(md))) {
@@ -657,185 +488,270 @@ static void GPR_ATTRIBUTE_NOINLINE on_hdr_log(grpc_mdelem md) {
}
/* emission helpers */
-template <bool do_add>
-static grpc_error_handle on_hdr(grpc_chttp2_hpack_parser* p, grpc_mdelem md) {
+template <HPackParser::TableAction action>
+grpc_error_handle HPackParser::FinishHeader(grpc_mdelem md) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_chttp2_hpack_parser)) {
- on_hdr_log(md);
+ LogHeader(md);
}
- if (do_add) {
+ if (action == TableAction::kAddToTable) {
GPR_DEBUG_ASSERT(GRPC_MDELEM_STORAGE(md) == GRPC_MDELEM_STORAGE_INTERNED ||
GRPC_MDELEM_STORAGE(md) == GRPC_MDELEM_STORAGE_STATIC);
- grpc_error_handle err = grpc_chttp2_hptbl_add(&p->table, md);
+ grpc_error_handle err = grpc_chttp2_hptbl_add(&table_, md);
if (GPR_UNLIKELY(err != GRPC_ERROR_NONE)) return err;
}
- return p->on_header(p->on_header_user_data, md);
+ return sink_(md);
}
-static grpc_core::UnmanagedMemorySlice take_string_extern(
- grpc_chttp2_hpack_parser* /*p*/, grpc_chttp2_hpack_parser_string* str) {
- grpc_core::UnmanagedMemorySlice s;
- if (!str->copied) {
- GPR_DEBUG_ASSERT(!grpc_slice_is_interned(str->data.referenced));
- s = static_cast<grpc_core::UnmanagedMemorySlice&>(str->data.referenced);
- str->copied = true;
- str->data.referenced = grpc_core::UnmanagedMemorySlice();
+UnmanagedMemorySlice HPackParser::String::TakeExtern() {
+ UnmanagedMemorySlice s;
+ if (!copied_) {
+ GPR_DEBUG_ASSERT(!grpc_slice_is_interned(data_.referenced));
+ s = static_cast<UnmanagedMemorySlice&>(data_.referenced);
+ copied_ = true;
+ data_.referenced = UnmanagedMemorySlice();
} else {
- s = grpc_core::UnmanagedMemorySlice(str->data.copied.str,
- str->data.copied.length);
+ s = UnmanagedMemorySlice(data_.copied.str, data_.copied.length);
}
- str->data.copied.length = 0;
+ data_.copied.length = 0;
return s;
}
-static grpc_core::ManagedMemorySlice take_string_intern(
- grpc_chttp2_hpack_parser* /*p*/, grpc_chttp2_hpack_parser_string* str) {
- grpc_core::ManagedMemorySlice s;
- if (!str->copied) {
- s = grpc_core::ManagedMemorySlice(&str->data.referenced);
- grpc_slice_unref_internal(str->data.referenced);
- str->copied = true;
- str->data.referenced = grpc_empty_slice();
+ManagedMemorySlice HPackParser::String::TakeIntern() {
+ ManagedMemorySlice s;
+ if (!copied_) {
+ s = ManagedMemorySlice(&data_.referenced);
+ grpc_slice_unref_internal(data_.referenced);
+ copied_ = true;
+ data_.referenced = grpc_empty_slice();
} else {
- s = grpc_core::ManagedMemorySlice(str->data.copied.str,
- str->data.copied.length);
+ s = ManagedMemorySlice(data_.copied.str, data_.copied.length);
}
- str->data.copied.length = 0;
+ data_.copied.length = 0;
return s;
}
-/* jump to the next state */
-static grpc_error_handle parse_next(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur, const uint8_t* end) {
- p->state = *p->next_state++;
- return p->state(p, cur, end);
+grpc_error_handle HPackParser::parse_next(const uint8_t* cur,
+ const uint8_t* end) {
+ state_ = *next_state_++;
+ return (this->*state_)(cur, end);
}
/* begin parsing a header: all functionality is encoded into lookup tables
above */
-static grpc_error_handle parse_begin(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur, const uint8_t* end) {
+grpc_error_handle HPackParser::parse_begin(const uint8_t* cur,
+ const uint8_t* end) {
if (cur == end) {
- p->state = parse_begin;
+ state_ = &HPackParser::parse_begin;
return GRPC_ERROR_NONE;
}
- return first_byte_action[first_byte_lut[*cur]](p, cur, end);
+ switch (*cur >> 4) {
+ // Literal header not indexed.
+ // First byte format: 0000xxxx
+ // Where xxxx:
+ // 0000 - literal key
+ // 1111 - indexed key, varint encoded index
+ // other - indexed key, inline encoded index
+ case 0:
+ switch (*cur & 0xf) {
+ case 0: // literal key
+ return parse_lithdr_notidx_v(cur, end);
+ case 0xf: // varint encoded key index
+ return parse_lithdr_notidx_x(cur, end);
+ default: // inline encoded key index
+ return parse_lithdr_notidx(cur, end);
+ }
+ // Literal header never indexed.
+ // First byte format: 0001xxxx
+ // Where xxxx:
+ // 0000 - literal key
+ // 1111 - indexed key, varint encoded index
+ // other - indexed key, inline encoded index
+ case 1:
+ switch (*cur & 0xf) {
+ case 0: // literal key
+ return parse_lithdr_nvridx_v(cur, end);
+ case 0xf: // varint encoded key index
+ return parse_lithdr_nvridx_x(cur, end);
+ default: // inline encoded key index
+ return parse_lithdr_nvridx(cur, end);
+ }
+ // Update max table size.
+ // First byte format: 001xxxxx
+ // Where xxxxx:
+ // 11111 - max size is varint encoded
+ // other - max size is stored inline
+ case 2:
+ // inline encoded max table size
+ return parse_max_tbl_size(cur, end);
+ case 3:
+ if (*cur == 0x3f) {
+ // varint encoded max table size
+ return parse_max_tbl_size_x(cur, end);
+ } else {
+ // inline encoded max table size
+ return parse_max_tbl_size(cur, end);
+ }
+ // Literal header with incremental indexing.
+ // First byte format: 01xxxxxx
+ // Where xxxxxx:
+ // 000000 - literal key
+ // 111111 - indexed key, varint encoded index
+ // other - indexed key, inline encoded index
+ case 4:
+ if (*cur == 0x40) {
+ // literal key
+ return parse_lithdr_incidx_v(cur, end);
+ }
+ ABSL_FALLTHROUGH_INTENDED;
+ case 5:
+ case 6:
+ // inline encoded key index
+ return parse_lithdr_incidx(cur, end);
+ case 7:
+ if (*cur == 0x7f) {
+ // varint encoded key index
+ return parse_lithdr_incidx_x(cur, end);
+ } else {
+ // inline encoded key index
+ return parse_lithdr_incidx(cur, end);
+ }
+ // Indexed Header Field Representation
+ // First byte format: 1xxxxxxx
+ // Where xxxxxxx:
+ // 0000000 - illegal
+ // 1111111 - varint encoded field index
+ // other - inline encoded field index
+ case 8:
+ if (*cur == 0x80) {
+ // illegal value.
+ return parse_illegal_op(cur, end);
+ }
+ ABSL_FALLTHROUGH_INTENDED;
+ case 9:
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ case 14:
+ // inline encoded field index
+ return parse_indexed_field(cur, end);
+ case 15:
+ if (*cur == 0xff) {
+ // varint encoded field index
+ return parse_indexed_field_x(cur, end);
+ } else {
+ // inline encoded field index
+ return parse_indexed_field(cur, end);
+ }
+ }
+ GPR_UNREACHABLE_CODE(abort());
}
/* stream dependency and prioritization data: we just skip it */
-static grpc_error_handle parse_stream_weight(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
+grpc_error_handle HPackParser::parse_stream_weight(const uint8_t* cur,
+ const uint8_t* end) {
if (cur == end) {
- p->state = parse_stream_weight;
+ state_ = &HPackParser::parse_stream_weight;
return GRPC_ERROR_NONE;
}
- return p->after_prioritization(p, cur + 1, end);
+ return (this->*after_prioritization_)(cur + 1, end);
}
-static grpc_error_handle parse_stream_dep3(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
+grpc_error_handle HPackParser::parse_stream_dep3(const uint8_t* cur,
+ const uint8_t* end) {
if (cur == end) {
- p->state = parse_stream_dep3;
+ state_ = &HPackParser::parse_stream_dep3;
return GRPC_ERROR_NONE;
}
- return parse_stream_weight(p, cur + 1, end);
+ return parse_stream_weight(cur + 1, end);
}
-static grpc_error_handle parse_stream_dep2(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
+grpc_error_handle HPackParser::parse_stream_dep2(const uint8_t* cur,
+ const uint8_t* end) {
if (cur == end) {
- p->state = parse_stream_dep2;
+ state_ = &HPackParser::parse_stream_dep2;
return GRPC_ERROR_NONE;
}
- return parse_stream_dep3(p, cur + 1, end);
+ return parse_stream_dep3(cur + 1, end);
}
-static grpc_error_handle parse_stream_dep1(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
+grpc_error_handle HPackParser::parse_stream_dep1(const uint8_t* cur,
+ const uint8_t* end) {
if (cur == end) {
- p->state = parse_stream_dep1;
+ state_ = &HPackParser::parse_stream_dep1;
return GRPC_ERROR_NONE;
}
- return parse_stream_dep2(p, cur + 1, end);
+ return parse_stream_dep2(cur + 1, end);
}
-static grpc_error_handle parse_stream_dep0(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
+grpc_error_handle HPackParser::parse_stream_dep0(const uint8_t* cur,
+ const uint8_t* end) {
if (cur == end) {
- p->state = parse_stream_dep0;
+ state_ = &HPackParser::parse_stream_dep0;
return GRPC_ERROR_NONE;
}
- return parse_stream_dep1(p, cur + 1, end);
+ return parse_stream_dep1(cur + 1, end);
}
-static grpc_error_handle GPR_ATTRIBUTE_NOINLINE
-on_invalid_hpack_idx(grpc_chttp2_hpack_parser* p) {
+grpc_error_handle HPackParser::InvalidHPackIndexError() {
return grpc_error_set_int(
grpc_error_set_int(
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Invalid HPACK index received"),
- GRPC_ERROR_INT_INDEX, static_cast<intptr_t>(p->index)),
- GRPC_ERROR_INT_SIZE, static_cast<intptr_t>(p->table.num_ents));
+ GRPC_ERROR_INT_INDEX, static_cast<intptr_t>(index_)),
+ GRPC_ERROR_INT_SIZE, static_cast<intptr_t>(table_.num_ents));
}
/* emit an indexed field; jumps to begin the next field on completion */
-static grpc_error_handle finish_indexed_field(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
- grpc_mdelem md = grpc_chttp2_hptbl_lookup<true>(&p->table, p->index);
+grpc_error_handle HPackParser::finish_indexed_field(const uint8_t* cur,
+ const uint8_t* end) {
+ grpc_mdelem md = grpc_chttp2_hptbl_lookup<true>(&table_, index_);
if (GPR_UNLIKELY(GRPC_MDISNULL(md))) {
- return on_invalid_hpack_idx(p);
+ return InvalidHPackIndexError();
}
GRPC_STATS_INC_HPACK_RECV_INDEXED();
- grpc_error_handle err = on_hdr<false>(p, md);
+ grpc_error_handle err = FinishHeader<TableAction::kOmitFromTable>(md);
if (GPR_UNLIKELY(err != GRPC_ERROR_NONE)) return err;
- return parse_begin(p, cur, end);
+ return parse_begin(cur, end);
}
/* parse an indexed field with index < 127 */
-static grpc_error_handle parse_indexed_field(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
- p->dynamic_table_update_allowed = 0;
- p->index = (*cur) & 0x7f;
- p->md_for_index.payload = 0; /* Invalidate cached md when index changes. */
- return finish_indexed_field(p, cur + 1, end);
+grpc_error_handle HPackParser::parse_indexed_field(const uint8_t* cur,
+ const uint8_t* end) {
+ dynamic_table_updates_allowed_ = 0;
+ index_ = (*cur) & 0x7f;
+ md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
+ return finish_indexed_field(cur + 1, end);
}
/* parse an indexed field with index >= 127 */
-static grpc_error_handle parse_indexed_field_x(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
- static const grpc_chttp2_hpack_parser_state and_then[] = {
- finish_indexed_field};
- p->dynamic_table_update_allowed = 0;
- p->next_state = and_then;
- p->index = 0x7f;
- p->md_for_index.payload = 0; /* Invalidate cached md when index changes. */
- p->parsing.value = &p->index;
- return parse_value0(p, cur + 1, end);
+grpc_error_handle HPackParser::parse_indexed_field_x(const uint8_t* cur,
+ const uint8_t* end) {
+ static const State and_then[] = {&HPackParser::finish_indexed_field};
+ dynamic_table_updates_allowed_ = 0;
+ next_state_ = and_then;
+ index_ = 0x7f;
+ md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
+ parsing_.value = &index_;
+ return parse_value0(cur + 1, end);
}
/* When finishing with a header, get the cached md element for this index.
This is set in parse_value_string(). We ensure (in debug mode) that the
cached metadata corresponds with the index we are examining. */
-static grpc_mdelem get_precomputed_md_for_idx(grpc_chttp2_hpack_parser* p) {
- GPR_DEBUG_ASSERT(p->md_for_index.payload != 0);
- GPR_DEBUG_ASSERT(static_cast<int64_t>(p->index) == p->precomputed_md_index);
- grpc_mdelem md = p->md_for_index;
+grpc_mdelem HPackParser::GetPrecomputedMDForIndex() {
+ GPR_DEBUG_ASSERT(md_for_index_.payload != 0);
+ GPR_DEBUG_ASSERT(static_cast<int64_t>(index_) == precomputed_md_index_);
+ grpc_mdelem md = md_for_index_;
GPR_DEBUG_ASSERT(!GRPC_MDISNULL(md)); /* handled in string parsing */
- p->md_for_index.payload = 0; /* Invalidate cached md when index changes. */
+ md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
#ifndef NDEBUG
- p->precomputed_md_index = -1;
+ precomputed_md_index_ = -1;
#endif
return md;
}
@@ -847,359 +763,340 @@ static const grpc_core::ManagedMemorySlice& get_indexed_key(grpc_mdelem md) {
}
/* finish a literal header with incremental indexing */
-static grpc_error_handle finish_lithdr_incidx(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
+grpc_error_handle HPackParser::finish_lithdr_incidx(const uint8_t* cur,
+ const uint8_t* end) {
GRPC_STATS_INC_HPACK_RECV_LITHDR_INCIDX();
- grpc_mdelem md = get_precomputed_md_for_idx(p);
- grpc_error_handle err = on_hdr<true>(
- p, grpc_mdelem_from_slices(get_indexed_key(md),
- take_string_intern(p, &p->value)));
- if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
- return parse_begin(p, cur, end);
+ grpc_mdelem md = GetPrecomputedMDForIndex();
+ grpc_error_handle err = FinishHeader<TableAction::kAddToTable>(
+ grpc_mdelem_from_slices(get_indexed_key(md), value_.TakeIntern()));
+ if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
+ return parse_begin(cur, end);
}
/* finish a literal header with incremental indexing with no index */
-static grpc_error_handle finish_lithdr_incidx_v(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
+grpc_error_handle HPackParser::finish_lithdr_incidx_v(const uint8_t* cur,
+ const uint8_t* end) {
GRPC_STATS_INC_HPACK_RECV_LITHDR_INCIDX_V();
- grpc_error_handle err = on_hdr<true>(
- p, grpc_mdelem_from_slices(take_string_intern(p, &p->key),
- take_string_intern(p, &p->value)));
- if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
- return parse_begin(p, cur, end);
+ grpc_error_handle err = FinishHeader<TableAction::kAddToTable>(
+ grpc_mdelem_from_slices(key_.TakeIntern(), value_.TakeIntern()));
+ if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
+ return parse_begin(cur, end);
}
/* parse a literal header with incremental indexing; index < 63 */
-static grpc_error_handle parse_lithdr_incidx(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
- static const grpc_chttp2_hpack_parser_state and_then[] = {
- parse_value_string_with_indexed_key, finish_lithdr_incidx};
- p->dynamic_table_update_allowed = 0;
- p->next_state = and_then;
- p->index = (*cur) & 0x3f;
- p->md_for_index.payload = 0; /* Invalidate cached md when index changes. */
- return parse_string_prefix(p, cur + 1, end);
+grpc_error_handle HPackParser::parse_lithdr_incidx(const uint8_t* cur,
+ const uint8_t* end) {
+ static const State and_then[] = {
+ &HPackParser::parse_value_string_with_indexed_key,
+ &HPackParser::finish_lithdr_incidx};
+ dynamic_table_updates_allowed_ = 0;
+ next_state_ = and_then;
+ index_ = (*cur) & 0x3f;
+ md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
+ return parse_string_prefix(cur + 1, end);
}
/* parse a literal header with incremental indexing; index >= 63 */
-static grpc_error_handle parse_lithdr_incidx_x(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
- static const grpc_chttp2_hpack_parser_state and_then[] = {
- parse_string_prefix, parse_value_string_with_indexed_key,
- finish_lithdr_incidx};
- p->dynamic_table_update_allowed = 0;
- p->next_state = and_then;
- p->index = 0x3f;
- p->md_for_index.payload = 0; /* Invalidate cached md when index changes. */
- p->parsing.value = &p->index;
- return parse_value0(p, cur + 1, end);
+grpc_error_handle HPackParser::parse_lithdr_incidx_x(const uint8_t* cur,
+ const uint8_t* end) {
+ static const State and_then[] = {
+ &HPackParser::parse_string_prefix,
+ &HPackParser::parse_value_string_with_indexed_key,
+ &HPackParser::finish_lithdr_incidx};
+ dynamic_table_updates_allowed_ = 0;
+ next_state_ = and_then;
+ index_ = 0x3f;
+ md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
+ parsing_.value = &index_;
+ return parse_value0(cur + 1, end);
}
/* parse a literal header with incremental indexing; index = 0 */
-static grpc_error_handle parse_lithdr_incidx_v(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
- static const grpc_chttp2_hpack_parser_state and_then[] = {
- parse_key_string, parse_string_prefix,
- parse_value_string_with_literal_key, finish_lithdr_incidx_v};
- p->dynamic_table_update_allowed = 0;
- p->next_state = and_then;
- return parse_string_prefix(p, cur + 1, end);
+grpc_error_handle HPackParser::parse_lithdr_incidx_v(const uint8_t* cur,
+ const uint8_t* end) {
+ static const State and_then[] = {
+ &HPackParser::parse_key_string, &HPackParser::parse_string_prefix,
+ &HPackParser::parse_value_string_with_literal_key,
+ &HPackParser::finish_lithdr_incidx_v};
+ dynamic_table_updates_allowed_ = 0;
+ next_state_ = and_then;
+ return parse_string_prefix(cur + 1, end);
}
/* finish a literal header without incremental indexing */
-static grpc_error_handle finish_lithdr_notidx(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
+grpc_error_handle HPackParser::finish_lithdr_notidx(const uint8_t* cur,
+ const uint8_t* end) {
GRPC_STATS_INC_HPACK_RECV_LITHDR_NOTIDX();
- grpc_mdelem md = get_precomputed_md_for_idx(p);
- grpc_error_handle err = on_hdr<false>(
- p, grpc_mdelem_from_slices(get_indexed_key(md),
- take_string_extern(p, &p->value)));
- if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
- return parse_begin(p, cur, end);
+ grpc_mdelem md = GetPrecomputedMDForIndex();
+ grpc_error_handle err = FinishHeader<TableAction::kOmitFromTable>(
+ grpc_mdelem_from_slices(get_indexed_key(md), value_.TakeExtern()));
+ if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
+ return parse_begin(cur, end);
}
/* finish a literal header without incremental indexing with index = 0 */
-static grpc_error_handle finish_lithdr_notidx_v(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
+grpc_error_handle HPackParser::finish_lithdr_notidx_v(const uint8_t* cur,
+ const uint8_t* end) {
GRPC_STATS_INC_HPACK_RECV_LITHDR_NOTIDX_V();
- grpc_error_handle err = on_hdr<false>(
- p, grpc_mdelem_from_slices(take_string_intern(p, &p->key),
- take_string_extern(p, &p->value)));
- if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
- return parse_begin(p, cur, end);
+ grpc_error_handle err = FinishHeader<TableAction::kOmitFromTable>(
+ grpc_mdelem_from_slices(key_.TakeIntern(), value_.TakeExtern()));
+ if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
+ return parse_begin(cur, end);
}
/* parse a literal header without incremental indexing; index < 15 */
-static grpc_error_handle parse_lithdr_notidx(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
- static const grpc_chttp2_hpack_parser_state and_then[] = {
- parse_value_string_with_indexed_key, finish_lithdr_notidx};
- p->dynamic_table_update_allowed = 0;
- p->next_state = and_then;
- p->index = (*cur) & 0xf;
- p->md_for_index.payload = 0; /* Invalidate cached md when index changes. */
- return parse_string_prefix(p, cur + 1, end);
+grpc_error_handle HPackParser::parse_lithdr_notidx(const uint8_t* cur,
+ const uint8_t* end) {
+ static const State and_then[] = {
+ &HPackParser::parse_value_string_with_indexed_key,
+ &HPackParser::finish_lithdr_notidx};
+ dynamic_table_updates_allowed_ = 0;
+ next_state_ = and_then;
+ index_ = (*cur) & 0xf;
+ md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
+ return parse_string_prefix(cur + 1, end);
}
/* parse a literal header without incremental indexing; index >= 15 */
-static grpc_error_handle parse_lithdr_notidx_x(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
- static const grpc_chttp2_hpack_parser_state and_then[] = {
- parse_string_prefix, parse_value_string_with_indexed_key,
- finish_lithdr_notidx};
- p->dynamic_table_update_allowed = 0;
- p->next_state = and_then;
- p->index = 0xf;
- p->md_for_index.payload = 0; /* Invalidate cached md when index changes. */
- p->parsing.value = &p->index;
- return parse_value0(p, cur + 1, end);
+grpc_error_handle HPackParser::parse_lithdr_notidx_x(const uint8_t* cur,
+ const uint8_t* end) {
+ static const State and_then[] = {
+ &HPackParser::parse_string_prefix,
+ &HPackParser::parse_value_string_with_indexed_key,
+ &HPackParser::finish_lithdr_notidx};
+ dynamic_table_updates_allowed_ = 0;
+ next_state_ = and_then;
+ index_ = 0xf;
+ md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
+ parsing_.value = &index_;
+ return parse_value0(cur + 1, end);
}
/* parse a literal header without incremental indexing; index == 0 */
-static grpc_error_handle parse_lithdr_notidx_v(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
- static const grpc_chttp2_hpack_parser_state and_then[] = {
- parse_key_string, parse_string_prefix,
- parse_value_string_with_literal_key, finish_lithdr_notidx_v};
- p->dynamic_table_update_allowed = 0;
- p->next_state = and_then;
- return parse_string_prefix(p, cur + 1, end);
+grpc_error_handle HPackParser::parse_lithdr_notidx_v(const uint8_t* cur,
+ const uint8_t* end) {
+ static const State and_then[] = {
+ &HPackParser::parse_key_string, &HPackParser::parse_string_prefix,
+ &HPackParser::parse_value_string_with_literal_key,
+ &HPackParser::finish_lithdr_notidx_v};
+ dynamic_table_updates_allowed_ = 0;
+ next_state_ = and_then;
+ return parse_string_prefix(cur + 1, end);
}
/* finish a literal header that is never indexed */
-static grpc_error_handle finish_lithdr_nvridx(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
+grpc_error_handle HPackParser::finish_lithdr_nvridx(const uint8_t* cur,
+ const uint8_t* end) {
GRPC_STATS_INC_HPACK_RECV_LITHDR_NVRIDX();
- grpc_mdelem md = get_precomputed_md_for_idx(p);
- grpc_error_handle err = on_hdr<false>(
- p, grpc_mdelem_from_slices(get_indexed_key(md),
- take_string_extern(p, &p->value)));
- if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
- return parse_begin(p, cur, end);
+ grpc_mdelem md = GetPrecomputedMDForIndex();
+ grpc_error_handle err = FinishHeader<TableAction::kOmitFromTable>(
+ grpc_mdelem_from_slices(get_indexed_key(md), value_.TakeExtern()));
+ if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
+ return parse_begin(cur, end);
}
/* finish a literal header that is never indexed with an extra value */
-static grpc_error_handle finish_lithdr_nvridx_v(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
+grpc_error_handle HPackParser::finish_lithdr_nvridx_v(const uint8_t* cur,
+ const uint8_t* end) {
GRPC_STATS_INC_HPACK_RECV_LITHDR_NVRIDX_V();
- grpc_error_handle err = on_hdr<false>(
- p, grpc_mdelem_from_slices(take_string_intern(p, &p->key),
- take_string_extern(p, &p->value)));
- if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
- return parse_begin(p, cur, end);
+ grpc_error_handle err = FinishHeader<TableAction::kOmitFromTable>(
+ grpc_mdelem_from_slices(key_.TakeIntern(), value_.TakeExtern()));
+ if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
+ return parse_begin(cur, end);
}
/* parse a literal header that is never indexed; index < 15 */
-static grpc_error_handle parse_lithdr_nvridx(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
- static const grpc_chttp2_hpack_parser_state and_then[] = {
- parse_value_string_with_indexed_key, finish_lithdr_nvridx};
- p->dynamic_table_update_allowed = 0;
- p->next_state = and_then;
- p->index = (*cur) & 0xf;
- p->md_for_index.payload = 0; /* Invalidate cached md when index changes. */
- return parse_string_prefix(p, cur + 1, end);
+grpc_error_handle HPackParser::parse_lithdr_nvridx(const uint8_t* cur,
+ const uint8_t* end) {
+ static const State and_then[] = {
+ &HPackParser::parse_value_string_with_indexed_key,
+ &HPackParser::finish_lithdr_nvridx};
+ dynamic_table_updates_allowed_ = 0;
+ next_state_ = and_then;
+ index_ = (*cur) & 0xf;
+ md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
+ return parse_string_prefix(cur + 1, end);
}
/* parse a literal header that is never indexed; index >= 15 */
-static grpc_error_handle parse_lithdr_nvridx_x(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
- static const grpc_chttp2_hpack_parser_state and_then[] = {
- parse_string_prefix, parse_value_string_with_indexed_key,
- finish_lithdr_nvridx};
- p->dynamic_table_update_allowed = 0;
- p->next_state = and_then;
- p->index = 0xf;
- p->md_for_index.payload = 0; /* Invalidate cached md when index changes. */
- p->parsing.value = &p->index;
- return parse_value0(p, cur + 1, end);
+grpc_error_handle HPackParser::parse_lithdr_nvridx_x(const uint8_t* cur,
+ const uint8_t* end) {
+ static const State and_then[] = {
+ &HPackParser::parse_string_prefix,
+ &HPackParser::parse_value_string_with_indexed_key,
+ &HPackParser::finish_lithdr_nvridx};
+ dynamic_table_updates_allowed_ = 0;
+ next_state_ = and_then;
+ index_ = 0xf;
+ md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
+ parsing_.value = &index_;
+ return parse_value0(cur + 1, end);
}
/* parse a literal header that is never indexed; index == 0 */
-static grpc_error_handle parse_lithdr_nvridx_v(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
- static const grpc_chttp2_hpack_parser_state and_then[] = {
- parse_key_string, parse_string_prefix,
- parse_value_string_with_literal_key, finish_lithdr_nvridx_v};
- p->dynamic_table_update_allowed = 0;
- p->next_state = and_then;
- return parse_string_prefix(p, cur + 1, end);
+grpc_error_handle HPackParser::parse_lithdr_nvridx_v(const uint8_t* cur,
+ const uint8_t* end) {
+ static const State and_then[] = {
+ &HPackParser::parse_key_string, &HPackParser::parse_string_prefix,
+ &HPackParser::parse_value_string_with_literal_key,
+ &HPackParser::finish_lithdr_nvridx_v};
+ dynamic_table_updates_allowed_ = 0;
+ next_state_ = and_then;
+ return parse_string_prefix(cur + 1, end);
}
/* finish parsing a max table size change */
-static grpc_error_handle finish_max_tbl_size(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
+grpc_error_handle HPackParser::finish_max_tbl_size(const uint8_t* cur,
+ const uint8_t* end) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_chttp2_hpack_parser)) {
- gpr_log(GPR_INFO, "MAX TABLE SIZE: %d", p->index);
+ gpr_log(GPR_INFO, "MAX TABLE SIZE: %d", index_);
}
grpc_error_handle err =
- grpc_chttp2_hptbl_set_current_table_size(&p->table, p->index);
- if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
- return parse_begin(p, cur, end);
+ grpc_chttp2_hptbl_set_current_table_size(&table_, index_);
+ if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
+ return parse_begin(cur, end);
}
/* parse a max table size change, max size < 15 */
-static grpc_error_handle parse_max_tbl_size(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
- if (p->dynamic_table_update_allowed == 0) {
+grpc_error_handle HPackParser::parse_max_tbl_size(const uint8_t* cur,
+ const uint8_t* end) {
+ if (dynamic_table_updates_allowed_ == 0) {
return parse_error(
- p, cur, end,
+ cur, end,
GRPC_ERROR_CREATE_FROM_STATIC_STRING(
"More than two max table size changes in a single frame"));
}
- p->dynamic_table_update_allowed--;
- p->index = (*cur) & 0x1f;
- p->md_for_index.payload = 0; /* Invalidate cached md when index changes. */
- return finish_max_tbl_size(p, cur + 1, end);
+ dynamic_table_updates_allowed_--;
+ index_ = (*cur) & 0x1f;
+ md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
+ return finish_max_tbl_size(cur + 1, end);
}
/* parse a max table size change, max size >= 15 */
-static grpc_error_handle parse_max_tbl_size_x(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
- static const grpc_chttp2_hpack_parser_state and_then[] = {
- finish_max_tbl_size};
- if (p->dynamic_table_update_allowed == 0) {
+grpc_error_handle HPackParser::parse_max_tbl_size_x(const uint8_t* cur,
+ const uint8_t* end) {
+ static const State and_then[] = {&HPackParser::finish_max_tbl_size};
+ if (dynamic_table_updates_allowed_ == 0) {
return parse_error(
- p, cur, end,
+ cur, end,
GRPC_ERROR_CREATE_FROM_STATIC_STRING(
"More than two max table size changes in a single frame"));
}
- p->dynamic_table_update_allowed--;
- p->next_state = and_then;
- p->index = 0x1f;
- p->md_for_index.payload = 0; /* Invalidate cached md when index changes. */
- p->parsing.value = &p->index;
- return parse_value0(p, cur + 1, end);
+ dynamic_table_updates_allowed_--;
+ next_state_ = and_then;
+ index_ = 0x1f;
+ md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
+ parsing_.value = &index_;
+ return parse_value0(cur + 1, end);
}
/* a parse error: jam the parse state into parse_error, and return error */
-static grpc_error_handle parse_error(grpc_chttp2_hpack_parser* p,
- const uint8_t* /*cur*/,
- const uint8_t* /*end*/,
- grpc_error_handle err) {
+grpc_error_handle HPackParser::parse_error(const uint8_t* /*cur*/,
+ const uint8_t* /*end*/,
+ grpc_error_handle err) {
GPR_ASSERT(err != GRPC_ERROR_NONE);
- if (p->last_error == GRPC_ERROR_NONE) {
- p->last_error = GRPC_ERROR_REF(err);
+ if (last_error_ == GRPC_ERROR_NONE) {
+ last_error_ = GRPC_ERROR_REF(err);
}
- p->state = still_parse_error;
+ state_ = &HPackParser::still_parse_error;
return err;
}
-static grpc_error_handle still_parse_error(grpc_chttp2_hpack_parser* p,
- const uint8_t* /*cur*/,
- const uint8_t* /*end*/) {
- return GRPC_ERROR_REF(p->last_error);
+grpc_error_handle HPackParser::still_parse_error(const uint8_t* /*cur*/,
+ const uint8_t* /*end*/) {
+ return GRPC_ERROR_REF(last_error_);
}
-static grpc_error_handle parse_illegal_op(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
+grpc_error_handle HPackParser::parse_illegal_op(const uint8_t* cur,
+ const uint8_t* end) {
GPR_ASSERT(cur != end);
grpc_error_handle err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
absl::StrCat("Illegal hpack op code ", *cur).c_str());
- return parse_error(p, cur, end, err);
+ return parse_error(cur, end, err);
}
-/* parse the 1st byte of a varint into p->parsing.value
+/* parse the 1st byte of a varint into parsing_.value
no overflow is possible */
-static grpc_error_handle parse_value0(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur, const uint8_t* end) {
+grpc_error_handle HPackParser::parse_value0(const uint8_t* cur,
+ const uint8_t* end) {
if (cur == end) {
- p->state = parse_value0;
+ state_ = &HPackParser::parse_value0;
return GRPC_ERROR_NONE;
}
- *p->parsing.value += (*cur) & 0x7f;
+ *parsing_.value += (*cur) & 0x7f;
if ((*cur) & 0x80) {
- return parse_value1(p, cur + 1, end);
+ return parse_value1(cur + 1, end);
} else {
- return parse_next(p, cur + 1, end);
+ return parse_next(cur + 1, end);
}
}
-/* parse the 2nd byte of a varint into p->parsing.value
+/* parse the 2nd byte of a varint into parsing_.value
no overflow is possible */
-static grpc_error_handle parse_value1(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur, const uint8_t* end) {
+grpc_error_handle HPackParser::parse_value1(const uint8_t* cur,
+ const uint8_t* end) {
if (cur == end) {
- p->state = parse_value1;
+ state_ = &HPackParser::parse_value1;
return GRPC_ERROR_NONE;
}
- *p->parsing.value += ((static_cast<uint32_t>(*cur)) & 0x7f) << 7;
+ *parsing_.value += ((static_cast<uint32_t>(*cur)) & 0x7f) << 7;
if ((*cur) & 0x80) {
- return parse_value2(p, cur + 1, end);
+ return parse_value2(cur + 1, end);
} else {
- return parse_next(p, cur + 1, end);
+ return parse_next(cur + 1, end);
}
}
-/* parse the 3rd byte of a varint into p->parsing.value
+/* parse the 3rd byte of a varint into parsing_.value
no overflow is possible */
-static grpc_error_handle parse_value2(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur, const uint8_t* end) {
+grpc_error_handle HPackParser::parse_value2(const uint8_t* cur,
+ const uint8_t* end) {
if (cur == end) {
- p->state = parse_value2;
+ state_ = &HPackParser::parse_value2;
return GRPC_ERROR_NONE;
}
- *p->parsing.value += ((static_cast<uint32_t>(*cur)) & 0x7f) << 14;
+ *parsing_.value += ((static_cast<uint32_t>(*cur)) & 0x7f) << 14;
if ((*cur) & 0x80) {
- return parse_value3(p, cur + 1, end);
+ return parse_value3(cur + 1, end);
} else {
- return parse_next(p, cur + 1, end);
+ return parse_next(cur + 1, end);
}
}
-/* parse the 4th byte of a varint into p->parsing.value
+/* parse the 4th byte of a varint into parsing_.value
no overflow is possible */
-static grpc_error_handle parse_value3(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur, const uint8_t* end) {
+grpc_error_handle HPackParser::parse_value3(const uint8_t* cur,
+ const uint8_t* end) {
if (cur == end) {
- p->state = parse_value3;
+ state_ = &HPackParser::parse_value3;
return GRPC_ERROR_NONE;
}
- *p->parsing.value += ((static_cast<uint32_t>(*cur)) & 0x7f) << 21;
+ *parsing_.value += ((static_cast<uint32_t>(*cur)) & 0x7f) << 21;
if ((*cur) & 0x80) {
- return parse_value4(p, cur + 1, end);
+ return parse_value4(cur + 1, end);
} else {
- return parse_next(p, cur + 1, end);
+ return parse_next(cur + 1, end);
}
}
-/* parse the 5th byte of a varint into p->parsing.value
+/* parse the 5th byte of a varint into parsing_.value
depending on the byte, we may overflow, and care must be taken */
-static grpc_error_handle parse_value4(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur, const uint8_t* end) {
+grpc_error_handle HPackParser::parse_value4(const uint8_t* cur,
+ const uint8_t* end) {
uint8_t c;
uint32_t cur_value;
uint32_t add_value;
if (cur == end) {
- p->state = parse_value4;
+ state_ = &HPackParser::parse_value4;
return GRPC_ERROR_NONE;
}
@@ -1208,18 +1105,18 @@ static grpc_error_handle parse_value4(grpc_chttp2_hpack_parser* p,
goto error;
}
- cur_value = *p->parsing.value;
+ cur_value = *parsing_.value;
add_value = (static_cast<uint32_t>(c)) << 28;
if (add_value > 0xffffffffu - cur_value) {
goto error;
}
- *p->parsing.value = cur_value + add_value;
+ *parsing_.value = cur_value + add_value;
if ((*cur) & 0x80) {
- return parse_value5up(p, cur + 1, end);
+ return parse_value5up(cur + 1, end);
} else {
- return parse_next(p, cur + 1, end);
+ return parse_next(cur + 1, end);
}
error:
@@ -1227,354 +1124,347 @@ error:
absl::StrFormat(
"integer overflow in hpack integer decoding: have 0x%08x, "
"got byte 0x%02x on byte 5",
- *p->parsing.value, *cur)
+ *parsing_.value, *cur)
.c_str());
- return parse_error(p, cur, end, err);
+ return parse_error(cur, end, err);
}
/* parse any trailing bytes in a varint: it's possible to append an arbitrary
number of 0x80's and not affect the value - a zero will terminate - and
anything else will overflow */
-static grpc_error_handle parse_value5up(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
+grpc_error_handle HPackParser::parse_value5up(const uint8_t* cur,
+ const uint8_t* end) {
while (cur != end && *cur == 0x80) {
++cur;
}
if (cur == end) {
- p->state = parse_value5up;
+ state_ = &HPackParser::parse_value5up;
return GRPC_ERROR_NONE;
}
if (*cur == 0) {
- return parse_next(p, cur + 1, end);
+ return parse_next(cur + 1, end);
}
grpc_error_handle err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
absl::StrFormat(
"integer overflow in hpack integer decoding: have 0x%08x, "
"got byte 0x%02x sometime after byte 5",
- *p->parsing.value, *cur)
+ *parsing_.value, *cur)
.c_str());
- return parse_error(p, cur, end, err);
+ return parse_error(cur, end, err);
}
/* parse a string prefix */
-static grpc_error_handle parse_string_prefix(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
+grpc_error_handle HPackParser::parse_string_prefix(const uint8_t* cur,
+ const uint8_t* end) {
if (cur == end) {
- p->state = parse_string_prefix;
+ state_ = &HPackParser::parse_string_prefix;
return GRPC_ERROR_NONE;
}
- p->strlen = (*cur) & 0x7f;
- p->huff = (*cur) >> 7;
- if (p->strlen == 0x7f) {
- p->parsing.value = &p->strlen;
- return parse_value0(p, cur + 1, end);
+ strlen_ = (*cur) & 0x7f;
+ huff_ = (*cur) >> 7;
+ if (strlen_ == 0x7f) {
+ parsing_.value = &strlen_;
+ return parse_value0(cur + 1, end);
} else {
- return parse_next(p, cur + 1, end);
+ return parse_next(cur + 1, end);
}
}
/* append some bytes to a string */
-static void append_bytes(grpc_chttp2_hpack_parser_string* str,
- const uint8_t* data, size_t length) {
+void HPackParser::String::AppendBytes(const uint8_t* data, size_t length) {
if (length == 0) return;
- if (length + str->data.copied.length > str->data.copied.capacity) {
- GPR_ASSERT(str->data.copied.length + length <= UINT32_MAX);
- str->data.copied.capacity =
- static_cast<uint32_t>(str->data.copied.length + length);
- str->data.copied.str = static_cast<char*>(
- gpr_realloc(str->data.copied.str, str->data.copied.capacity));
+ if (length + data_.copied.length > data_.copied.capacity) {
+ GPR_ASSERT(data_.copied.length + length <= UINT32_MAX);
+ data_.copied.capacity = static_cast<uint32_t>(data_.copied.length + length);
+ data_.copied.str = static_cast<char*>(
+ gpr_realloc(data_.copied.str, data_.copied.capacity));
}
- memcpy(str->data.copied.str + str->data.copied.length, data, length);
- GPR_ASSERT(length <= UINT32_MAX - str->data.copied.length);
- str->data.copied.length += static_cast<uint32_t>(length);
+ memcpy(data_.copied.str + data_.copied.length, data, length);
+ GPR_ASSERT(length <= UINT32_MAX - data_.copied.length);
+ data_.copied.length += static_cast<uint32_t>(length);
}
-static grpc_error_handle append_string(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur, const uint8_t* end) {
- grpc_chttp2_hpack_parser_string* str = p->parsing.str;
+grpc_error_handle HPackParser::AppendString(const uint8_t* cur,
+ const uint8_t* end) {
+ String* str = parsing_.str;
uint32_t bits;
uint8_t decoded[3];
- switch (static_cast<binary_state>(p->binary)) {
- case NOT_BINARY:
- append_bytes(str, cur, static_cast<size_t>(end - cur));
+ switch (binary_) {
+ case BinaryState::kNotBinary:
+ str->AppendBytes(cur, static_cast<size_t>(end - cur));
return GRPC_ERROR_NONE;
- case BINARY_BEGIN:
+ case BinaryState::kBinaryBegin:
if (cur == end) {
- p->binary = BINARY_BEGIN;
+ binary_ = BinaryState::kBinaryBegin;
return GRPC_ERROR_NONE;
}
if (*cur == 0) {
/* 'true-binary' case */
++cur;
- p->binary = NOT_BINARY;
+ binary_ = BinaryState::kNotBinary;
GRPC_STATS_INC_HPACK_RECV_BINARY();
- append_bytes(str, cur, static_cast<size_t>(end - cur));
+ str->AppendBytes(cur, static_cast<size_t>(end - cur));
return GRPC_ERROR_NONE;
}
GRPC_STATS_INC_HPACK_RECV_BINARY_BASE64();
- /* fallthrough */
b64_byte0:
- case B64_BYTE0:
+ ABSL_FALLTHROUGH_INTENDED;
+ case BinaryState::kBase64Byte0:
if (cur == end) {
- p->binary = B64_BYTE0;
+ binary_ = BinaryState::kBase64Byte0;
return GRPC_ERROR_NONE;
}
- bits = inverse_base64[*cur];
+ bits = kBase64InverseTable.table[*cur];
++cur;
if (bits == 255) {
return parse_error(
- p, cur, end,
+ cur, end,
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Illegal base64 character"));
} else if (bits == 64) {
goto b64_byte0;
}
- p->base64_buffer = bits << 18;
- /* fallthrough */
+ base64_buffer_ = bits << 18;
b64_byte1:
- case B64_BYTE1:
+ ABSL_FALLTHROUGH_INTENDED;
+ case BinaryState::kBase64Byte1:
if (cur == end) {
- p->binary = B64_BYTE1;
+ binary_ = BinaryState::kBase64Byte1;
return GRPC_ERROR_NONE;
}
- bits = inverse_base64[*cur];
+ bits = kBase64InverseTable.table[*cur];
++cur;
if (bits == 255) {
return parse_error(
- p, cur, end,
+ cur, end,
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Illegal base64 character"));
} else if (bits == 64) {
goto b64_byte1;
}
- p->base64_buffer |= bits << 12;
- /* fallthrough */
+ base64_buffer_ |= bits << 12;
b64_byte2:
- case B64_BYTE2:
+ ABSL_FALLTHROUGH_INTENDED;
+ case BinaryState::kBase64Byte2:
if (cur == end) {
- p->binary = B64_BYTE2;
+ binary_ = BinaryState::kBase64Byte2;
return GRPC_ERROR_NONE;
}
- bits = inverse_base64[*cur];
+ bits = kBase64InverseTable.table[*cur];
++cur;
if (bits == 255) {
return parse_error(
- p, cur, end,
+ cur, end,
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Illegal base64 character"));
} else if (bits == 64) {
goto b64_byte2;
}
- p->base64_buffer |= bits << 6;
- /* fallthrough */
+ base64_buffer_ |= bits << 6;
b64_byte3:
- case B64_BYTE3:
+ ABSL_FALLTHROUGH_INTENDED;
+ case BinaryState::kBase64Byte3:
if (cur == end) {
- p->binary = B64_BYTE3;
+ binary_ = BinaryState::kBase64Byte3;
return GRPC_ERROR_NONE;
}
- bits = inverse_base64[*cur];
+ bits = kBase64InverseTable.table[*cur];
++cur;
if (bits == 255) {
return parse_error(
- p, cur, end,
+ cur, end,
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Illegal base64 character"));
} else if (bits == 64) {
goto b64_byte3;
}
- p->base64_buffer |= bits;
- bits = p->base64_buffer;
+ base64_buffer_ |= bits;
+ bits = base64_buffer_;
decoded[0] = static_cast<uint8_t>(bits >> 16);
decoded[1] = static_cast<uint8_t>(bits >> 8);
decoded[2] = static_cast<uint8_t>(bits);
- append_bytes(str, decoded, 3);
+ str->AppendBytes(decoded, 3);
goto b64_byte0;
}
GPR_UNREACHABLE_CODE(return parse_error(
- p, cur, end,
+ cur, end,
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Should never reach here")));
}
-static grpc_error_handle finish_str(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur, const uint8_t* end) {
+grpc_error_handle HPackParser::finish_str(const uint8_t* cur,
+ const uint8_t* end) {
uint8_t decoded[2];
uint32_t bits;
- grpc_chttp2_hpack_parser_string* str = p->parsing.str;
- switch (static_cast<binary_state>(p->binary)) {
- case NOT_BINARY:
+ String* str = parsing_.str;
+ switch (binary_) {
+ case BinaryState::kNotBinary:
break;
- case BINARY_BEGIN:
+ case BinaryState::kBinaryBegin:
break;
- case B64_BYTE0:
+ case BinaryState::kBase64Byte0:
break;
- case B64_BYTE1:
- return parse_error(p, cur, end,
+ case BinaryState::kBase64Byte1:
+ return parse_error(cur, end,
GRPC_ERROR_CREATE_FROM_STATIC_STRING(
"illegal base64 encoding")); /* illegal encoding */
- case B64_BYTE2:
- bits = p->base64_buffer;
+ case BinaryState::kBase64Byte2:
+ bits = base64_buffer_;
if (bits & 0xffff) {
grpc_error_handle err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
absl::StrFormat("trailing bits in base64 encoding: 0x%04x",
bits & 0xffff)
.c_str());
- return parse_error(p, cur, end, err);
+ return parse_error(cur, end, err);
}
decoded[0] = static_cast<uint8_t>(bits >> 16);
- append_bytes(str, decoded, 1);
+ str->AppendBytes(decoded, 1);
break;
- case B64_BYTE3:
- bits = p->base64_buffer;
+ case BinaryState::kBase64Byte3:
+ bits = base64_buffer_;
if (bits & 0xff) {
grpc_error_handle err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
absl::StrFormat("trailing bits in base64 encoding: 0x%02x",
bits & 0xff)
.c_str());
- return parse_error(p, cur, end, err);
+ return parse_error(cur, end, err);
}
decoded[0] = static_cast<uint8_t>(bits >> 16);
decoded[1] = static_cast<uint8_t>(bits >> 8);
- append_bytes(str, decoded, 2);
+ str->AppendBytes(decoded, 2);
break;
}
return GRPC_ERROR_NONE;
}
/* decode a nibble from a huffman encoded stream */
-static grpc_error_handle huff_nibble(grpc_chttp2_hpack_parser* p,
- uint8_t nibble) {
- int16_t emit = emit_sub_tbl[16 * emit_tbl[p->huff_state] + nibble];
- int16_t next = next_sub_tbl[16 * next_tbl[p->huff_state] + nibble];
+grpc_error_handle HPackParser::AppendHuffNibble(uint8_t nibble) {
+ int16_t emit = emit_sub_tbl[16 * emit_tbl[huff_state_] + nibble];
+ int16_t next = next_sub_tbl[16 * next_tbl[huff_state_] + nibble];
if (emit != -1) {
if (emit >= 0 && emit < 256) {
uint8_t c = static_cast<uint8_t>(emit);
- grpc_error_handle err = append_string(p, &c, (&c) + 1);
+ grpc_error_handle err = AppendString(&c, (&c) + 1);
if (err != GRPC_ERROR_NONE) return err;
} else {
assert(emit == 256);
}
}
- p->huff_state = next;
+ huff_state_ = next;
return GRPC_ERROR_NONE;
}
/* decode full bytes from a huffman encoded stream */
-static grpc_error_handle add_huff_bytes(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
+grpc_error_handle HPackParser::AppendHuffBytes(const uint8_t* cur,
+ const uint8_t* end) {
for (; cur != end; ++cur) {
- grpc_error_handle err = huff_nibble(p, *cur >> 4);
- if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
- err = huff_nibble(p, *cur & 0xf);
- if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
+ grpc_error_handle err = AppendHuffNibble(*cur >> 4);
+ if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
+ err = AppendHuffNibble(*cur & 0xf);
+ if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
}
return GRPC_ERROR_NONE;
}
/* decode some string bytes based on the current decoding mode
(huffman or not) */
-static grpc_error_handle add_str_bytes(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur, const uint8_t* end) {
- if (p->huff) {
- return add_huff_bytes(p, cur, end);
+grpc_error_handle HPackParser::AppendStrBytes(const uint8_t* cur,
+ const uint8_t* end) {
+ if (huff_) {
+ return AppendHuffBytes(cur, end);
} else {
- return append_string(p, cur, end);
+ return AppendString(cur, end);
}
}
/* parse a string - tries to do large chunks at a time */
-static grpc_error_handle parse_string(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur, const uint8_t* end) {
- size_t remaining = p->strlen - p->strgot;
+grpc_error_handle HPackParser::parse_string(const uint8_t* cur,
+ const uint8_t* end) {
+ size_t remaining = strlen_ - strgot_;
size_t given = static_cast<size_t>(end - cur);
if (remaining <= given) {
- grpc_error_handle err = add_str_bytes(p, cur, cur + remaining);
- if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
- err = finish_str(p, cur + remaining, end);
- if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
- return parse_next(p, cur + remaining, end);
+ grpc_error_handle err = AppendStrBytes(cur, cur + remaining);
+ if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
+ err = finish_str(cur + remaining, end);
+ if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
+ return parse_next(cur + remaining, end);
} else {
- grpc_error_handle err = add_str_bytes(p, cur, cur + given);
- if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
- GPR_ASSERT(given <= UINT32_MAX - p->strgot);
- p->strgot += static_cast<uint32_t>(given);
- p->state = parse_string;
+ grpc_error_handle err = AppendStrBytes(cur, cur + given);
+ if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
+ GPR_ASSERT(given <= UINT32_MAX - strgot_);
+ strgot_ += static_cast<uint32_t>(given);
+ state_ = &HPackParser::parse_string;
return GRPC_ERROR_NONE;
}
}
/* begin parsing a string - performs setup, calls parse_string */
-static grpc_error_handle begin_parse_string(
- grpc_chttp2_hpack_parser* p, const uint8_t* cur, const uint8_t* end,
- uint8_t binary, grpc_chttp2_hpack_parser_string* str) {
- if (!p->huff && binary == NOT_BINARY &&
- static_cast<uint32_t>(end - cur) >= p->strlen &&
- p->current_slice_refcount != nullptr) {
+grpc_error_handle HPackParser::begin_parse_string(const uint8_t* cur,
+ const uint8_t* end,
+ BinaryState binary,
+ HPackParser::String* str) {
+ if (!huff_ && binary == BinaryState::kNotBinary &&
+ static_cast<uint32_t>(end - cur) >= strlen_ &&
+ current_slice_refcount_ != nullptr) {
GRPC_STATS_INC_HPACK_RECV_UNCOMPRESSED();
- str->copied = false;
- str->data.referenced.refcount = p->current_slice_refcount;
- str->data.referenced.data.refcounted.bytes = const_cast<uint8_t*>(cur);
- str->data.referenced.data.refcounted.length = p->strlen;
- grpc_slice_ref_internal(str->data.referenced);
- return parse_next(p, cur + p->strlen, end);
+ str->copied_ = false;
+ str->data_.referenced.refcount = current_slice_refcount_;
+ str->data_.referenced.data.refcounted.bytes = const_cast<uint8_t*>(cur);
+ str->data_.referenced.data.refcounted.length = strlen_;
+ grpc_slice_ref_internal(str->data_.referenced);
+ return parse_next(cur + strlen_, end);
}
- p->strgot = 0;
- str->copied = true;
- str->data.copied.length = 0;
- p->parsing.str = str;
- p->huff_state = 0;
- p->binary = binary;
- switch (p->binary) {
- case NOT_BINARY:
- if (p->huff) {
+ strgot_ = 0;
+ str->copied_ = true;
+ str->data_.copied.length = 0;
+ parsing_.str = str;
+ huff_state_ = 0;
+ binary_ = binary;
+ switch (binary_) {
+ case BinaryState::kNotBinary:
+ if (huff_) {
GRPC_STATS_INC_HPACK_RECV_HUFFMAN();
} else {
GRPC_STATS_INC_HPACK_RECV_UNCOMPRESSED();
}
break;
- case BINARY_BEGIN:
+ case BinaryState::kBinaryBegin:
/* stats incremented later: don't know true binary or not */
break;
default:
abort();
}
- return parse_string(p, cur, end);
+ return parse_string(cur, end);
}
/* parse the key string */
-static grpc_error_handle parse_key_string(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end) {
- return begin_parse_string(p, cur, end, NOT_BINARY, &p->key);
+grpc_error_handle HPackParser::parse_key_string(const uint8_t* cur,
+ const uint8_t* end) {
+ return begin_parse_string(cur, end, BinaryState::kNotBinary, &key_);
}
/* check if a key represents a binary header or not */
-static bool is_binary_literal_header(grpc_chttp2_hpack_parser* p) {
+bool HPackParser::IsBinaryLiteralHeader() {
/* We know that either argument here is a reference counter slice.
* 1. If it is a grpc_core::StaticSlice, the refcount is set to kNoopRefcount.
- * 2. If it's p->key.data.referenced, then p->key.copied was set to false,
+ * 2. If it's key_.data.referenced, then key_.copied was set to false,
* which occurs in begin_parse_string() - where the refcount is set to
- * p->current_slice_refcount, which is not null. */
+ * current_slice_refcount_, which is not null. */
return grpc_is_refcounted_slice_binary_header(
- p->key.copied ? grpc_core::ExternallyManagedSlice(
- p->key.data.copied.str, p->key.data.copied.length)
- : p->key.data.referenced);
+ key_.copied_ ? grpc_core::ExternallyManagedSlice(key_.data_.copied.str,
+ key_.data_.copied.length)
+ : key_.data_.referenced);
}
/* Cache the metadata for the given index during initial parsing. This avoids a
pointless recomputation of the metadata when finishing a header. We read the
cached value in get_precomputed_md_for_idx(). */
-static void set_precomputed_md_idx(grpc_chttp2_hpack_parser* p,
- grpc_mdelem md) {
- GPR_DEBUG_ASSERT(p->md_for_index.payload == 0);
- GPR_DEBUG_ASSERT(p->precomputed_md_index == -1);
- p->md_for_index = md;
+void HPackParser::SetPrecomputedMDIndex(grpc_mdelem md) {
+ GPR_DEBUG_ASSERT(md_for_index_.payload == 0);
+ GPR_DEBUG_ASSERT(precomputed_md_index_ == -1);
+ md_for_index_ = md;
#ifndef NDEBUG
- p->precomputed_md_index = p->index;
+ precomputed_md_index_ = index_;
#endif
}
@@ -1582,11 +1472,10 @@ static void set_precomputed_md_idx(grpc_chttp2_hpack_parser* p,
is a binary indexed header during string parsing. We'll need to revisit this
metadata when we're done parsing, so we cache the metadata for this index
here using set_precomputed_md_idx(). */
-static grpc_error_handle is_binary_indexed_header(grpc_chttp2_hpack_parser* p,
- bool* is) {
- grpc_mdelem elem = grpc_chttp2_hptbl_lookup(&p->table, p->index);
+grpc_error_handle HPackParser::IsBinaryIndexedHeader(bool* is) {
+ grpc_mdelem elem = grpc_chttp2_hptbl_lookup(&table_, index_);
if (GPR_UNLIKELY(GRPC_MDISNULL(elem))) {
- return on_invalid_hpack_idx(p);
+ return InvalidHPackIndexError();
}
/* We know that GRPC_MDKEY(elem) points to a reference counted slice since:
* 1. elem was a result of grpc_chttp2_hptbl_lookup
@@ -1597,101 +1486,104 @@ static grpc_error_handle is_binary_indexed_header(grpc_chttp2_hpack_parser* p,
* interned.
* 4. Both static and interned element slices have non-null refcounts. */
*is = grpc_is_refcounted_slice_binary_header(GRPC_MDKEY(elem));
- set_precomputed_md_idx(p, elem);
+ SetPrecomputedMDIndex(elem);
return GRPC_ERROR_NONE;
}
/* parse the value string */
-static grpc_error_handle parse_value_string(grpc_chttp2_hpack_parser* p,
- const uint8_t* cur,
- const uint8_t* end,
- bool is_binary) {
- return begin_parse_string(p, cur, end, is_binary ? BINARY_BEGIN : NOT_BINARY,
- &p->value);
+grpc_error_handle HPackParser::parse_value_string(const uint8_t* cur,
+ const uint8_t* end,
+ bool is_binary) {
+ return begin_parse_string(
+ cur, end, is_binary ? BinaryState::kBinaryBegin : BinaryState::kNotBinary,
+ &value_);
}
-static grpc_error_handle parse_value_string_with_indexed_key(
- grpc_chttp2_hpack_parser* p, const uint8_t* cur, const uint8_t* end) {
+grpc_error_handle HPackParser::parse_value_string_with_indexed_key(
+ const uint8_t* cur, const uint8_t* end) {
bool is_binary = false;
- grpc_error_handle err = is_binary_indexed_header(p, &is_binary);
- if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
- return parse_value_string(p, cur, end, is_binary);
-}
-
-static grpc_error_handle parse_value_string_with_literal_key(
- grpc_chttp2_hpack_parser* p, const uint8_t* cur, const uint8_t* end) {
- return parse_value_string(p, cur, end, is_binary_literal_header(p));
+ grpc_error_handle err = IsBinaryIndexedHeader(&is_binary);
+ if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
+ return parse_value_string(cur, end, is_binary);
}
-/* "Uninitialized" header parser to save us a branch in on_hdr(). */
-static grpc_error_handle on_header_uninitialized(void* /*user_data*/,
- grpc_mdelem md) {
- GRPC_MDELEM_UNREF(md);
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("on_header callback not set");
+grpc_error_handle HPackParser::parse_value_string_with_literal_key(
+ const uint8_t* cur, const uint8_t* end) {
+ return parse_value_string(cur, end, IsBinaryLiteralHeader());
}
/* PUBLIC INTERFACE */
-void grpc_chttp2_hpack_parser_init(grpc_chttp2_hpack_parser* p) {
- p->on_header = on_header_uninitialized;
- p->on_header_user_data = nullptr;
- p->state = parse_begin;
- p->key.data.referenced = grpc_empty_slice();
- p->key.data.copied.str = nullptr;
- p->key.data.copied.capacity = 0;
- p->key.data.copied.length = 0;
- p->value.data.referenced = grpc_empty_slice();
- p->value.data.copied.str = nullptr;
- p->value.data.copied.capacity = 0;
- p->value.data.copied.length = 0;
+HPackParser::HPackParser() {
+ state_ = &HPackParser::parse_begin;
+ key_.data_.referenced = grpc_empty_slice();
+ key_.data_.copied.str = nullptr;
+ key_.data_.copied.capacity = 0;
+ key_.data_.copied.length = 0;
+ value_.data_.referenced = grpc_empty_slice();
+ value_.data_.copied.str = nullptr;
+ value_.data_.copied.capacity = 0;
+ value_.data_.copied.length = 0;
/* Cached metadata for the current index the parser is handling. This is set
to 0 initially, invalidated when the index changes, and invalidated when it
is read (by get_precomputed_md_for_idx()). It is set during string parsing,
by set_precomputed_md_idx() - which is called by parse_value_string().
The goal here is to avoid recomputing the metadata for the index when
finishing with a header as well as the initial parse. */
- p->md_for_index.payload = 0;
+ md_for_index_.payload = 0;
#ifndef NDEBUG
/* In debug mode, this ensures that the cached metadata we're reading is in
* fact correct for the index we are examining. */
- p->precomputed_md_index = -1;
+ precomputed_md_index_ = -1;
#endif
- p->dynamic_table_update_allowed = 2;
- p->last_error = GRPC_ERROR_NONE;
+ dynamic_table_updates_allowed_ = 2;
+ last_error_ = GRPC_ERROR_NONE;
}
-void grpc_chttp2_hpack_parser_set_has_priority(grpc_chttp2_hpack_parser* p) {
- p->after_prioritization = p->state;
- p->state = parse_stream_dep0;
+void HPackParser::BeginFrame(Sink sink, Boundary boundary, Priority priority) {
+ sink_ = std::move(sink);
+ boundary_ = boundary;
+ switch (priority) {
+ case Priority::Included:
+ after_prioritization_ = state_;
+ state_ = &HPackParser::parse_stream_dep0;
+ break;
+ case Priority::None:
+ break;
+ }
}
-void grpc_chttp2_hpack_parser_destroy(grpc_chttp2_hpack_parser* p) {
- grpc_chttp2_hptbl_destroy(&p->table);
- GRPC_ERROR_UNREF(p->last_error);
- grpc_slice_unref_internal(p->key.data.referenced);
- grpc_slice_unref_internal(p->value.data.referenced);
- gpr_free(p->key.data.copied.str);
- gpr_free(p->value.data.copied.str);
+HPackParser::~HPackParser() {
+ grpc_chttp2_hptbl_destroy(&table_);
+ GRPC_ERROR_UNREF(last_error_);
+ grpc_slice_unref_internal(key_.data_.referenced);
+ grpc_slice_unref_internal(value_.data_.referenced);
+ gpr_free(key_.data_.copied.str);
+ gpr_free(value_.data_.copied.str);
}
-grpc_error_handle grpc_chttp2_hpack_parser_parse(grpc_chttp2_hpack_parser* p,
- const grpc_slice& slice) {
+grpc_error_handle HPackParser::Parse(const grpc_slice& slice) {
/* max number of bytes to parse at a time... limits call stack depth on
* compilers without TCO */
#define MAX_PARSE_LENGTH 1024
- p->current_slice_refcount = slice.refcount;
+ current_slice_refcount_ = slice.refcount;
const uint8_t* start = GRPC_SLICE_START_PTR(slice);
const uint8_t* end = GRPC_SLICE_END_PTR(slice);
grpc_error_handle error = GRPC_ERROR_NONE;
while (start != end && error == GRPC_ERROR_NONE) {
const uint8_t* target = start + GPR_MIN(MAX_PARSE_LENGTH, end - start);
- error = p->state(p, start, target);
+ error = (this->*state_)(start, target);
start = target;
}
- p->current_slice_refcount = nullptr;
+ current_slice_refcount_ = nullptr;
return error;
}
+} // namespace grpc_core
+
+// TODO(ctiller): this serves as an eviction notice for the remainder of this
+// file... it belongs elsewhere!
+
typedef void (*maybe_complete_func_type)(grpc_chttp2_transport* t,
grpc_chttp2_stream* s);
static const maybe_complete_func_type maybe_complete_funcs[] = {
@@ -1734,24 +1626,23 @@ grpc_error_handle grpc_chttp2_header_parser_parse(void* hpack_parser,
const grpc_slice& slice,
int is_last) {
GPR_TIMER_SCOPE("grpc_chttp2_header_parser_parse", 0);
- grpc_chttp2_hpack_parser* parser =
- static_cast<grpc_chttp2_hpack_parser*>(hpack_parser);
+ auto* parser = static_cast<grpc_core::HPackParser*>(hpack_parser);
if (s != nullptr) {
s->stats.incoming.header_bytes += GRPC_SLICE_LENGTH(slice);
}
- grpc_error_handle error = grpc_chttp2_hpack_parser_parse(parser, slice);
+ grpc_error_handle error = parser->Parse(slice);
if (error != GRPC_ERROR_NONE) {
return error;
}
if (is_last) {
- if (parser->is_boundary && parser->state != parse_begin) {
+ if (parser->is_boundary() && !parser->is_in_begin_state()) {
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
"end of header frame not aligned with a hpack record boundary");
}
/* need to check for null stream: this can occur if we receive an invalid
stream id on a header */
if (s != nullptr) {
- if (parser->is_boundary) {
+ if (parser->is_boundary()) {
if (s->header_frames_received == GPR_ARRAY_SIZE(s->metadata_buffer)) {
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
"Too many trailer frames");
@@ -1766,7 +1657,7 @@ grpc_error_handle grpc_chttp2_header_parser_parse(void* hpack_parser,
maybe_complete_funcs[s->header_frames_received](t, s);
s->header_frames_received++;
}
- if (parser->is_eof) {
+ if (parser->is_eof()) {
if (t->is_client && !s->write_closed) {
/* server eof ==> complete closure; we may need to forcefully close
the stream. Wait until the combiner lock is ready to be released
@@ -1780,11 +1671,7 @@ grpc_error_handle grpc_chttp2_header_parser_parse(void* hpack_parser,
grpc_chttp2_mark_stream_closed(t, s, true, false, GRPC_ERROR_NONE);
}
}
- parser->on_header = on_header_uninitialized;
- parser->on_header_user_data = nullptr;
- parser->is_boundary = 0xde;
- parser->is_eof = 0xde;
- parser->dynamic_table_update_allowed = 2;
+ parser->FinishFrame();
}
return GRPC_ERROR_NONE;
}
diff --git a/src/core/ext/transport/chttp2/transport/hpack_parser.h b/src/core/ext/transport/chttp2/transport/hpack_parser.h
index 71aa194a23..01fb833df1 100644
--- a/src/core/ext/transport/chttp2/transport/hpack_parser.h
+++ b/src/core/ext/transport/chttp2/transport/hpack_parser.h
@@ -27,84 +27,205 @@
#include "src/core/ext/transport/chttp2/transport/hpack_table.h"
#include "src/core/lib/transport/metadata.h"
-typedef struct grpc_chttp2_hpack_parser grpc_chttp2_hpack_parser;
+namespace grpc_core {
-typedef grpc_error_handle (*grpc_chttp2_hpack_parser_state)(
- grpc_chttp2_hpack_parser* p, const uint8_t* beg, const uint8_t* end);
+class HPackParser {
+ public:
+ enum class Boundary { None, EndOfHeaders, EndOfStream };
+ enum class Priority { None, Included };
-struct grpc_chttp2_hpack_parser_string {
- bool copied;
- struct {
- grpc_slice referenced;
+ // User specified structure called for each received header.
+ using Sink = std::function<grpc_error_handle(grpc_mdelem)>;
+
+ HPackParser();
+ ~HPackParser();
+
+ HPackParser(const HPackParser&) = delete;
+ HPackParser& operator=(const HPackParser&) = delete;
+
+ void BeginFrame(Sink sink, Boundary boundary, Priority priority);
+ void ResetSink(Sink sink) { sink_ = std::move(sink); }
+ grpc_error_handle Parse(const grpc_slice& slice);
+ void FinishFrame();
+
+ grpc_chttp2_hptbl* hpack_table() { return &table_; }
+ bool is_boundary() const { return boundary_ != Boundary::None; }
+ bool is_eof() const { return boundary_ == Boundary::EndOfStream; }
+ bool is_in_begin_state() const { return state_ == &HPackParser::parse_begin; }
+
+ private:
+ enum class BinaryState {
+ kNotBinary,
+ kBinaryBegin,
+ kBase64Byte0,
+ kBase64Byte1,
+ kBase64Byte2,
+ kBase64Byte3,
+ };
+
+ struct String {
+ bool copied_;
struct {
- char* str;
- uint32_t length;
- uint32_t capacity;
- } copied;
- } data;
-};
-struct grpc_chttp2_hpack_parser {
- /* user specified callback for each header output */
- grpc_error_handle (*on_header)(void* user_data, grpc_mdelem md);
- void* on_header_user_data;
-
- grpc_error_handle last_error;
-
- /* current parse state - or a function that implements it */
- grpc_chttp2_hpack_parser_state state;
- /* future states dependent on the opening op code */
- const grpc_chttp2_hpack_parser_state* next_state;
- /* what to do after skipping prioritization data */
- grpc_chttp2_hpack_parser_state after_prioritization;
- /* the refcount of the slice that we're currently parsing */
- grpc_slice_refcount* current_slice_refcount;
- /* the value we're currently parsing */
+ grpc_slice referenced;
+ struct {
+ char* str;
+ uint32_t length;
+ uint32_t capacity;
+ } copied;
+ } data_;
+
+ UnmanagedMemorySlice TakeExtern();
+ ManagedMemorySlice TakeIntern();
+ void AppendBytes(const uint8_t* data, size_t length);
+ };
+
+ using State = grpc_error_handle (HPackParser::*)(const uint8_t* beg,
+ const uint8_t* end);
+
+ // Forward declarations for parsing states.
+ // These are keeping their old (C-style) names until a future refactor where
+ // they will be eliminated.
+ grpc_error_handle parse_next(const uint8_t* cur, const uint8_t* end);
+ grpc_error_handle parse_begin(const uint8_t* cur, const uint8_t* end);
+ grpc_error_handle parse_error(const uint8_t* cur, const uint8_t* end,
+ grpc_error_handle error);
+ grpc_error_handle still_parse_error(const uint8_t* cur, const uint8_t* end);
+ grpc_error_handle parse_illegal_op(const uint8_t* cur, const uint8_t* end);
+
+ grpc_error_handle parse_string_prefix(const uint8_t* cur, const uint8_t* end);
+ grpc_error_handle parse_key_string(const uint8_t* cur, const uint8_t* end);
+ grpc_error_handle parse_value_string(const uint8_t* cur, const uint8_t* end,
+ bool is_binary);
+ grpc_error_handle parse_value_string_with_indexed_key(const uint8_t* cur,
+ const uint8_t* end);
+ grpc_error_handle parse_value_string_with_literal_key(const uint8_t* cur,
+ const uint8_t* end);
+ grpc_error_handle parse_stream_weight(const uint8_t* cur, const uint8_t* end);
+ grpc_error_handle parse_value0(const uint8_t* cur, const uint8_t* end);
+ grpc_error_handle parse_value1(const uint8_t* cur, const uint8_t* end);
+ grpc_error_handle parse_value2(const uint8_t* cur, const uint8_t* end);
+ grpc_error_handle parse_value3(const uint8_t* cur, const uint8_t* end);
+ grpc_error_handle parse_value4(const uint8_t* cur, const uint8_t* end);
+ grpc_error_handle parse_value5up(const uint8_t* cur, const uint8_t* end);
+ grpc_error_handle parse_stream_dep0(const uint8_t* cur, const uint8_t* end);
+ grpc_error_handle parse_stream_dep1(const uint8_t* cur, const uint8_t* end);
+ grpc_error_handle parse_stream_dep2(const uint8_t* cur, const uint8_t* end);
+ grpc_error_handle parse_stream_dep3(const uint8_t* cur, const uint8_t* end);
+
+ grpc_error_handle parse_indexed_field(const uint8_t* cur, const uint8_t* end);
+ grpc_error_handle parse_indexed_field_x(const uint8_t* cur,
+ const uint8_t* end);
+ grpc_error_handle parse_lithdr_incidx(const uint8_t* cur, const uint8_t* end);
+ grpc_error_handle parse_lithdr_incidx_x(const uint8_t* cur,
+ const uint8_t* end);
+ grpc_error_handle parse_lithdr_incidx_v(const uint8_t* cur,
+ const uint8_t* end);
+ grpc_error_handle parse_lithdr_notidx(const uint8_t* cur, const uint8_t* end);
+ grpc_error_handle parse_lithdr_notidx_x(const uint8_t* cur,
+ const uint8_t* end);
+ grpc_error_handle parse_lithdr_notidx_v(const uint8_t* cur,
+ const uint8_t* end);
+ grpc_error_handle parse_lithdr_nvridx(const uint8_t* cur, const uint8_t* end);
+ grpc_error_handle parse_lithdr_nvridx_x(const uint8_t* cur,
+ const uint8_t* end);
+ grpc_error_handle parse_lithdr_nvridx_v(const uint8_t* cur,
+ const uint8_t* end);
+ grpc_error_handle parse_max_tbl_size(const uint8_t* cur, const uint8_t* end);
+ grpc_error_handle parse_max_tbl_size_x(const uint8_t* cur,
+ const uint8_t* end);
+ grpc_error_handle parse_string(const uint8_t* cur, const uint8_t* end);
+ grpc_error_handle begin_parse_string(const uint8_t* cur, const uint8_t* end,
+ BinaryState binary, String* str);
+
+ grpc_error_handle finish_indexed_field(const uint8_t* cur,
+ const uint8_t* end);
+ grpc_error_handle finish_lithdr_incidx(const uint8_t* cur,
+ const uint8_t* end);
+ grpc_error_handle finish_lithdr_incidx_v(const uint8_t* cur,
+ const uint8_t* end);
+ grpc_error_handle finish_lithdr_notidx(const uint8_t* cur,
+ const uint8_t* end);
+ grpc_error_handle finish_lithdr_notidx_v(const uint8_t* cur,
+ const uint8_t* end);
+ grpc_error_handle finish_lithdr_nvridx(const uint8_t* cur,
+ const uint8_t* end);
+ grpc_error_handle finish_lithdr_nvridx_v(const uint8_t* cur,
+ const uint8_t* end);
+ grpc_error_handle finish_max_tbl_size(const uint8_t* cur, const uint8_t* end);
+ grpc_error_handle finish_str(const uint8_t* cur, const uint8_t* end);
+
+ enum class TableAction {
+ kAddToTable,
+ kOmitFromTable,
+ };
+
+ GPR_ATTRIBUTE_NOINLINE grpc_error_handle InvalidHPackIndexError();
+ GPR_ATTRIBUTE_NOINLINE void LogHeader(grpc_mdelem md);
+ grpc_error_handle AddHeaderToTable(grpc_mdelem md);
+ template <TableAction table_action>
+ grpc_error_handle FinishHeader(grpc_mdelem md);
+
+ grpc_mdelem GetPrecomputedMDForIndex();
+ void SetPrecomputedMDIndex(grpc_mdelem md);
+ bool IsBinaryLiteralHeader();
+ grpc_error_handle IsBinaryIndexedHeader(bool* is);
+
+ grpc_error_handle AppendString(const uint8_t* cur, const uint8_t* end);
+ grpc_error_handle AppendHuffNibble(uint8_t nibble);
+ grpc_error_handle AppendHuffBytes(const uint8_t* cur, const uint8_t* end);
+ grpc_error_handle AppendStrBytes(const uint8_t* cur, const uint8_t* end);
+
+ Sink sink_;
+ grpc_error_handle last_error_;
+
+ // current parse state - or a function that implements it
+ State state_;
+ // future states dependent on the opening op code
+ const State* next_state_;
+ // what to do after skipping prioritization data
+ State after_prioritization_;
+ // the refcount of the slice that we're currently parsing
+ grpc_slice_refcount* current_slice_refcount_;
+ // the value we're currently parsing
union {
uint32_t* value;
- grpc_chttp2_hpack_parser_string* str;
- } parsing;
- /* string parameters for each chunk */
- grpc_chttp2_hpack_parser_string key;
- grpc_chttp2_hpack_parser_string value;
- /* parsed index */
- uint32_t index;
- /* When we parse a value string, we determine the metadata element for a
- specific index, which we need again when we're finishing up with that
- header. To avoid calculating the metadata element for that index a second
- time at that stage, we cache (and invalidate) the element here. */
- grpc_mdelem md_for_index;
+ String* str;
+ } parsing_;
+ // string parameters for each chunk
+ String key_;
+ String value_;
+ // parsed index
+ uint32_t index_;
+ // When we parse a value string, we determine the metadata element for a
+ // specific index, which we need again when we're finishing up with that
+ // header. To avoid calculating the metadata element for that index a second
+ // time at that stage, we cache (and invalidate) the element here.
+ grpc_mdelem md_for_index_;
#ifndef NDEBUG
- int64_t precomputed_md_index;
+ int64_t precomputed_md_index_;
#endif
- /* length of source bytes for the currently parsing string */
- uint32_t strlen;
- /* number of source bytes read for the currently parsing string */
- uint32_t strgot;
- /* huffman decoding state */
- int16_t huff_state;
- /* is the string being decoded binary? */
- uint8_t binary;
- /* is the current string huffman encoded? */
- uint8_t huff;
- /* is a dynamic table update allowed? */
- uint8_t dynamic_table_update_allowed;
- /* set by higher layers, used by grpc_chttp2_header_parser_parse to signal
- it should append a metadata boundary at the end of frame */
- uint8_t is_boundary;
- uint8_t is_eof;
- uint32_t base64_buffer;
-
- /* hpack table */
- grpc_chttp2_hptbl table;
-};
+ // length of source bytes for the currently parsing string
+ uint32_t strlen_;
+ // number of source bytes read for the currently parsing string
+ uint32_t strgot_;
+ // huffman decoding state
+ int16_t huff_state_;
+ // is the string being decoded binary?
+ BinaryState binary_;
+ // is the current string huffman encoded?
+ bool huff_;
+ // is a dynamic table update allowed?
+ uint8_t dynamic_table_updates_allowed_;
+ // set by higher layers, used by grpc_chttp2_header_parser_parse to signal
+ // it should append a metadata boundary at the end of frame
+ Boundary boundary_;
+ uint32_t base64_buffer_;
-void grpc_chttp2_hpack_parser_init(grpc_chttp2_hpack_parser* p);
-void grpc_chttp2_hpack_parser_destroy(grpc_chttp2_hpack_parser* p);
-
-void grpc_chttp2_hpack_parser_set_has_priority(grpc_chttp2_hpack_parser* p);
+ // hpack table
+ grpc_chttp2_hptbl table_;
+};
-grpc_error_handle grpc_chttp2_hpack_parser_parse(grpc_chttp2_hpack_parser* p,
- const grpc_slice& slice);
+} // namespace grpc_core
/* wraps grpc_chttp2_hpack_parser_parse to provide a frame level parser for
the transport */
diff --git a/src/core/ext/transport/chttp2/transport/internal.h b/src/core/ext/transport/chttp2/transport/internal.h
index 0b79f2fccb..53d7f56729 100644
--- a/src/core/ext/transport/chttp2/transport/internal.h
+++ b/src/core/ext/transport/chttp2/transport/internal.h
@@ -394,7 +394,7 @@ struct grpc_chttp2_transport {
grpc_chttp2_server_ping_recv_state ping_recv_state;
/** parser for headers */
- grpc_chttp2_hpack_parser hpack_parser;
+ grpc_core::HPackParser hpack_parser;
/** simple one shot parsers */
union {
grpc_chttp2_window_update_parser window_update;
diff --git a/src/core/ext/transport/chttp2/transport/parsing.cc b/src/core/ext/transport/chttp2/transport/parsing.cc
index d588f554ee..5d91335810 100644
--- a/src/core/ext/transport/chttp2/transport/parsing.cc
+++ b/src/core/ext/transport/chttp2/transport/parsing.cc
@@ -36,6 +36,8 @@
#include "src/core/lib/transport/status_conversion.h"
#include "src/core/lib/transport/timeout_encoding.h"
+using grpc_core::HPackParser;
+
static grpc_error_handle init_frame_parser(grpc_chttp2_transport* t);
static grpc_error_handle init_header_frame_parser(grpc_chttp2_transport* t,
int is_continuation);
@@ -46,8 +48,8 @@ static grpc_error_handle init_window_update_frame_parser(
grpc_chttp2_transport* t);
static grpc_error_handle init_ping_parser(grpc_chttp2_transport* t);
static grpc_error_handle init_goaway_parser(grpc_chttp2_transport* t);
-static grpc_error_handle init_skip_frame_parser(grpc_chttp2_transport* t,
- int is_header);
+static grpc_error_handle init_non_header_skip_frame_parser(
+ grpc_chttp2_transport* t);
static grpc_error_handle parse_frame_slice(grpc_chttp2_transport* t,
const grpc_slice& slice,
@@ -107,8 +109,8 @@ grpc_error_handle grpc_chttp2_perform_read(grpc_chttp2_transport* t,
if (cur == end) {
return GRPC_ERROR_NONE;
}
- /* fallthrough */
dts_fh_0:
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_DTS_FH_0:
GPR_DEBUG_ASSERT(cur < end);
t->incoming_frame_size = (static_cast<uint32_t>(*cur)) << 16;
@@ -116,7 +118,7 @@ grpc_error_handle grpc_chttp2_perform_read(grpc_chttp2_transport* t,
t->deframe_state = GRPC_DTS_FH_1;
return GRPC_ERROR_NONE;
}
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_DTS_FH_1:
GPR_DEBUG_ASSERT(cur < end);
t->incoming_frame_size |= (static_cast<uint32_t>(*cur)) << 8;
@@ -124,7 +126,7 @@ grpc_error_handle grpc_chttp2_perform_read(grpc_chttp2_transport* t,
t->deframe_state = GRPC_DTS_FH_2;
return GRPC_ERROR_NONE;
}
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_DTS_FH_2:
GPR_DEBUG_ASSERT(cur < end);
t->incoming_frame_size |= *cur;
@@ -132,7 +134,7 @@ grpc_error_handle grpc_chttp2_perform_read(grpc_chttp2_transport* t,
t->deframe_state = GRPC_DTS_FH_3;
return GRPC_ERROR_NONE;
}
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_DTS_FH_3:
GPR_DEBUG_ASSERT(cur < end);
t->incoming_frame_type = *cur;
@@ -140,7 +142,7 @@ grpc_error_handle grpc_chttp2_perform_read(grpc_chttp2_transport* t,
t->deframe_state = GRPC_DTS_FH_4;
return GRPC_ERROR_NONE;
}
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_DTS_FH_4:
GPR_DEBUG_ASSERT(cur < end);
t->incoming_frame_flags = *cur;
@@ -148,7 +150,7 @@ grpc_error_handle grpc_chttp2_perform_read(grpc_chttp2_transport* t,
t->deframe_state = GRPC_DTS_FH_5;
return GRPC_ERROR_NONE;
}
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_DTS_FH_5:
GPR_DEBUG_ASSERT(cur < end);
t->incoming_stream_id = ((static_cast<uint32_t>(*cur)) & 0x7f) << 24;
@@ -156,7 +158,7 @@ grpc_error_handle grpc_chttp2_perform_read(grpc_chttp2_transport* t,
t->deframe_state = GRPC_DTS_FH_6;
return GRPC_ERROR_NONE;
}
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_DTS_FH_6:
GPR_DEBUG_ASSERT(cur < end);
t->incoming_stream_id |= (static_cast<uint32_t>(*cur)) << 16;
@@ -164,7 +166,7 @@ grpc_error_handle grpc_chttp2_perform_read(grpc_chttp2_transport* t,
t->deframe_state = GRPC_DTS_FH_7;
return GRPC_ERROR_NONE;
}
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_DTS_FH_7:
GPR_DEBUG_ASSERT(cur < end);
t->incoming_stream_id |= (static_cast<uint32_t>(*cur)) << 8;
@@ -172,7 +174,7 @@ grpc_error_handle grpc_chttp2_perform_read(grpc_chttp2_transport* t,
t->deframe_state = GRPC_DTS_FH_8;
return GRPC_ERROR_NONE;
}
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_DTS_FH_8:
GPR_DEBUG_ASSERT(cur < end);
t->incoming_stream_id |= (static_cast<uint32_t>(*cur));
@@ -206,7 +208,7 @@ grpc_error_handle grpc_chttp2_perform_read(grpc_chttp2_transport* t,
if (++cur == end) {
return GRPC_ERROR_NONE;
}
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_DTS_FRAME:
GPR_DEBUG_ASSERT(cur < end);
if (static_cast<uint32_t>(end - cur) == t->incoming_frame_size) {
@@ -301,7 +303,7 @@ static grpc_error_handle init_frame_parser(grpc_chttp2_transport* t) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
gpr_log(GPR_ERROR, "Unknown frame type %02x", t->incoming_frame_type);
}
- return init_skip_frame_parser(t, 0);
+ return init_non_header_skip_frame_parser(t);
}
}
@@ -313,29 +315,46 @@ static grpc_error_handle skip_parser(void* /*parser*/,
return GRPC_ERROR_NONE;
}
-static grpc_error_handle skip_header(void* /*tp*/, grpc_mdelem md) {
+grpc_error_handle skip_header(grpc_mdelem md) {
GRPC_MDELEM_UNREF(md);
return GRPC_ERROR_NONE;
}
-static grpc_error_handle init_skip_frame_parser(grpc_chttp2_transport* t,
- int is_header) {
- if (is_header) {
- uint8_t is_eoh = t->expect_continuation_stream_id != 0;
- t->parser = grpc_chttp2_header_parser_parse;
- t->parser_data = &t->hpack_parser;
- t->hpack_parser.on_header = skip_header;
- t->hpack_parser.on_header_user_data = nullptr;
- t->hpack_parser.is_boundary = is_eoh;
- t->hpack_parser.is_eof = static_cast<uint8_t>(is_eoh ? t->header_eof : 0);
+static HPackParser::Boundary hpack_boundary_type(grpc_chttp2_transport* t,
+ bool is_eoh) {
+ if (is_eoh) {
+ if (t->header_eof) {
+ return HPackParser::Boundary::EndOfStream;
+ } else {
+ return HPackParser::Boundary::EndOfHeaders;
+ }
} else {
- t->parser = skip_parser;
+ return HPackParser::Boundary::None;
}
+}
+
+static grpc_error_handle init_header_skip_frame_parser(
+ grpc_chttp2_transport* t, HPackParser::Priority priority_type) {
+ bool is_eoh = t->expect_continuation_stream_id != 0;
+ t->parser = grpc_chttp2_header_parser_parse;
+ t->parser_data = &t->hpack_parser;
+ t->hpack_parser.BeginFrame(skip_header, hpack_boundary_type(t, is_eoh),
+ priority_type);
+ return GRPC_ERROR_NONE;
+}
+
+static grpc_error_handle init_non_header_skip_frame_parser(
+ grpc_chttp2_transport* t) {
+ t->parser = skip_parser;
return GRPC_ERROR_NONE;
}
void grpc_chttp2_parsing_become_skip_parser(grpc_chttp2_transport* t) {
- init_skip_frame_parser(t, t->parser == grpc_chttp2_header_parser_parse);
+ if (t->parser == grpc_chttp2_header_parser_parse) {
+ t->hpack_parser.ResetSink(skip_header);
+ } else {
+ t->parser = skip_parser;
+ }
}
static grpc_error_handle init_data_frame_parser(grpc_chttp2_transport* t) {
@@ -365,12 +384,12 @@ static grpc_error_handle init_data_frame_parser(grpc_chttp2_transport* t) {
goto error_handler;
}
if (s == nullptr) {
- return init_skip_frame_parser(t, 0);
+ return init_non_header_skip_frame_parser(t);
}
s->received_bytes += t->incoming_frame_size;
s->stats.incoming.framing_bytes += 9;
if (err == GRPC_ERROR_NONE && s->read_closed) {
- return init_skip_frame_parser(t, 0);
+ return init_non_header_skip_frame_parser(t);
}
if (err == GRPC_ERROR_NONE) {
err = grpc_chttp2_data_parser_begin_frame(
@@ -393,7 +412,7 @@ error_handler:
grpc_chttp2_add_rst_stream_to_next_write(t, t->incoming_stream_id,
GRPC_HTTP2_PROTOCOL_ERROR,
&s->stats.outgoing);
- return init_skip_frame_parser(t, 0);
+ return init_non_header_skip_frame_parser(t);
} else {
return err;
}
@@ -565,7 +584,7 @@ static grpc_error_handle on_trailing_header(void* tp, grpc_mdelem md) {
static grpc_error_handle init_header_frame_parser(grpc_chttp2_transport* t,
int is_continuation) {
- uint8_t is_eoh =
+ const bool is_eoh =
(t->incoming_frame_flags & GRPC_CHTTP2_DATA_FLAG_END_HEADERS) != 0;
grpc_chttp2_stream* s;
@@ -582,6 +601,11 @@ static grpc_error_handle init_header_frame_parser(grpc_chttp2_transport* t,
(t->incoming_frame_flags & GRPC_CHTTP2_DATA_FLAG_END_STREAM) != 0;
}
+ const auto priority_type = !is_continuation && (t->incoming_frame_flags &
+ GRPC_CHTTP2_FLAG_HAS_PRIORITY)
+ ? HPackParser::Priority::Included
+ : HPackParser::Priority::None;
+
t->ping_state.last_ping_sent_time = GRPC_MILLIS_INF_PAST;
/* could be a new grpc_chttp2_stream or an existing grpc_chttp2_stream */
@@ -591,7 +615,7 @@ static grpc_error_handle init_header_frame_parser(grpc_chttp2_transport* t,
GRPC_CHTTP2_IF_TRACING(
gpr_log(GPR_ERROR,
"grpc_chttp2_stream disbanded before CONTINUATION received"));
- return init_skip_frame_parser(t, 1);
+ return init_header_skip_frame_parser(t, priority_type);
}
if (t->is_client) {
if (GPR_LIKELY((t->incoming_stream_id & 1) &&
@@ -601,11 +625,7 @@ static grpc_error_handle init_header_frame_parser(grpc_chttp2_transport* t,
GRPC_CHTTP2_IF_TRACING(gpr_log(
GPR_ERROR, "ignoring new grpc_chttp2_stream creation on client"));
}
- grpc_error_handle err = init_skip_frame_parser(t, 1);
- if (t->incoming_frame_flags & GRPC_CHTTP2_FLAG_HAS_PRIORITY) {
- grpc_chttp2_hpack_parser_set_has_priority(&t->hpack_parser);
- }
- return err;
+ return init_header_skip_frame_parser(t, priority_type);
} else if (GPR_UNLIKELY(t->last_new_stream_id >= t->incoming_stream_id)) {
GRPC_CHTTP2_IF_TRACING(gpr_log(
GPR_ERROR,
@@ -613,13 +633,13 @@ static grpc_error_handle init_header_frame_parser(grpc_chttp2_transport* t,
"last grpc_chttp2_stream "
"id=%d, new grpc_chttp2_stream id=%d",
t->last_new_stream_id, t->incoming_stream_id));
- return init_skip_frame_parser(t, 1);
+ return init_header_skip_frame_parser(t, priority_type);
} else if (GPR_UNLIKELY((t->incoming_stream_id & 1) == 0)) {
GRPC_CHTTP2_IF_TRACING(gpr_log(
GPR_ERROR,
"ignoring grpc_chttp2_stream with non-client generated index %d",
t->incoming_stream_id));
- return init_skip_frame_parser(t, 1);
+ return init_header_skip_frame_parser(t, priority_type);
} else if (GPR_UNLIKELY(
grpc_chttp2_stream_map_size(&t->stream_map) >=
t->settings[GRPC_ACKED_SETTINGS]
@@ -632,7 +652,7 @@ static grpc_error_handle init_header_frame_parser(grpc_chttp2_transport* t,
if (GPR_UNLIKELY(s == nullptr)) {
GRPC_CHTTP2_IF_TRACING(
gpr_log(GPR_ERROR, "grpc_chttp2_stream not accepted"));
- return init_skip_frame_parser(t, 1);
+ return init_header_skip_frame_parser(t, priority_type);
}
if (t->channelz_socket != nullptr) {
t->channelz_socket->RecordStreamStartedFromRemote();
@@ -646,13 +666,14 @@ static grpc_error_handle init_header_frame_parser(grpc_chttp2_transport* t,
GRPC_CHTTP2_IF_TRACING(gpr_log(
GPR_ERROR, "skipping already closed grpc_chttp2_stream header"));
t->incoming_stream = nullptr;
- return init_skip_frame_parser(t, 1);
+ return init_header_skip_frame_parser(t, priority_type);
}
t->parser = grpc_chttp2_header_parser_parse;
t->parser_data = &t->hpack_parser;
if (t->header_eof) {
s->eos_received = true;
}
+ HPackParser::Sink on_header;
switch (s->header_frames_received) {
case 0:
if (t->is_client && t->header_eof) {
@@ -660,27 +681,22 @@ static grpc_error_handle init_header_frame_parser(grpc_chttp2_transport* t,
if (s->trailing_metadata_available != nullptr) {
*s->trailing_metadata_available = true;
}
- t->hpack_parser.on_header = on_trailing_header;
+ on_header = [t](grpc_mdelem md) { return on_trailing_header(t, md); };
} else {
GRPC_CHTTP2_IF_TRACING(gpr_log(GPR_INFO, "parsing initial_metadata"));
- t->hpack_parser.on_header = on_initial_header;
+ on_header = [t](grpc_mdelem md) { return on_initial_header(t, md); };
}
break;
case 1:
GRPC_CHTTP2_IF_TRACING(gpr_log(GPR_INFO, "parsing trailing_metadata"));
- t->hpack_parser.on_header = on_trailing_header;
+ on_header = [t](grpc_mdelem md) { return on_trailing_header(t, md); };
break;
case 2:
gpr_log(GPR_ERROR, "too many header frames received");
- return init_skip_frame_parser(t, 1);
- }
- t->hpack_parser.on_header_user_data = t;
- t->hpack_parser.is_boundary = is_eoh;
- t->hpack_parser.is_eof = static_cast<uint8_t>(is_eoh ? t->header_eof : 0);
- if (!is_continuation &&
- (t->incoming_frame_flags & GRPC_CHTTP2_FLAG_HAS_PRIORITY)) {
- grpc_chttp2_hpack_parser_set_has_priority(&t->hpack_parser);
+ return init_header_skip_frame_parser(t, priority_type);
}
+ t->hpack_parser.BeginFrame(std::move(on_header),
+ hpack_boundary_type(t, is_eoh), priority_type);
return GRPC_ERROR_NONE;
}
@@ -694,7 +710,7 @@ static grpc_error_handle init_window_update_frame_parser(
grpc_chttp2_stream* s = t->incoming_stream =
grpc_chttp2_parsing_lookup_stream(t, t->incoming_stream_id);
if (s == nullptr) {
- return init_skip_frame_parser(t, 0);
+ return init_non_header_skip_frame_parser(t);
}
s->stats.incoming.framing_bytes += 9;
}
@@ -719,7 +735,7 @@ static grpc_error_handle init_rst_stream_parser(grpc_chttp2_transport* t) {
grpc_chttp2_stream* s = t->incoming_stream =
grpc_chttp2_parsing_lookup_stream(t, t->incoming_stream_id);
if (!t->incoming_stream) {
- return init_skip_frame_parser(t, 0);
+ return init_non_header_skip_frame_parser(t);
}
s->stats.incoming.framing_bytes += 9;
t->parser = grpc_chttp2_rst_stream_parser_parse;
@@ -752,7 +768,7 @@ static grpc_error_handle init_settings_frame_parser(grpc_chttp2_transport* t) {
memcpy(t->settings[GRPC_ACKED_SETTINGS], t->settings[GRPC_SENT_SETTINGS],
GRPC_CHTTP2_NUM_SETTINGS * sizeof(uint32_t));
grpc_chttp2_hptbl_set_max_bytes(
- &t->hpack_parser.table,
+ t->hpack_parser.hpack_table(),
t->settings[GRPC_ACKED_SETTINGS]
[GRPC_CHTTP2_SETTINGS_HEADER_TABLE_SIZE]);
t->sent_local_settings = false;
diff --git a/src/core/ext/transport/chttp2/transport/varint.cc b/src/core/ext/transport/chttp2/transport/varint.cc
index d4b01788b9..0d414ebcfb 100644
--- a/src/core/ext/transport/chttp2/transport/varint.cc
+++ b/src/core/ext/transport/chttp2/transport/varint.cc
@@ -20,6 +20,8 @@
#include "src/core/ext/transport/chttp2/transport/varint.h"
+#include "absl/base/attributes.h"
+
uint32_t grpc_chttp2_hpack_varint_length(uint32_t tail_value) {
if (tail_value < (1 << 7)) {
return 2;
@@ -39,16 +41,16 @@ void grpc_chttp2_hpack_write_varint_tail(uint32_t tail_value, uint8_t* target,
switch (tail_length) {
case 5:
target[4] = static_cast<uint8_t>((tail_value >> 28) | 0x80);
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case 4:
target[3] = static_cast<uint8_t>((tail_value >> 21) | 0x80);
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case 3:
target[2] = static_cast<uint8_t>((tail_value >> 14) | 0x80);
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case 2:
target[1] = static_cast<uint8_t>((tail_value >> 7) | 0x80);
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case 1:
target[0] = static_cast<uint8_t>((tail_value) | 0x80);
}
diff --git a/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c b/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c
index b7f9387b24..153cbc687c 100644
--- a/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c
+++ b/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c
@@ -9,12 +9,14 @@
#include <stddef.h>
#include "upb/msg.h"
#include "envoy/config/bootstrap/v3/bootstrap.upb.h"
+#include "envoy/config/accesslog/v3/accesslog.upb.h"
#include "envoy/config/cluster/v3/cluster.upb.h"
#include "envoy/config/core/v3/address.upb.h"
#include "envoy/config/core/v3/base.upb.h"
#include "envoy/config/core/v3/config_source.upb.h"
#include "envoy/config/core/v3/event_service_config.upb.h"
#include "envoy/config/core/v3/extension.upb.h"
+#include "envoy/config/core/v3/resolver.upb.h"
#include "envoy/config/core/v3/socket_option.upb.h"
#include "envoy/config/listener/v3/listener.upb.h"
#include "envoy/config/metrics/v3/stats.upb.h"
@@ -25,6 +27,7 @@
#include "google/protobuf/duration.upb.h"
#include "google/protobuf/struct.upb.h"
#include "google/protobuf/wrappers.upb.h"
+#include "envoy/annotations/deprecation.upb.h"
#include "udpa/annotations/migrate.upb.h"
#include "udpa/annotations/security.upb.h"
#include "udpa/annotations/status.upb.h"
@@ -33,18 +36,20 @@
#include "upb/port_def.inc"
-static const upb_msglayout *const envoy_config_bootstrap_v3_Bootstrap_submsgs[19] = {
+static const upb_msglayout *const envoy_config_bootstrap_v3_Bootstrap_submsgs[21] = {
&envoy_config_bootstrap_v3_Admin_msginit,
&envoy_config_bootstrap_v3_Bootstrap_CertificateProviderInstancesEntry_msginit,
&envoy_config_bootstrap_v3_Bootstrap_DynamicResources_msginit,
&envoy_config_bootstrap_v3_Bootstrap_StaticResources_msginit,
&envoy_config_bootstrap_v3_ClusterManager_msginit,
+ &envoy_config_bootstrap_v3_CustomInlineHeader_msginit,
&envoy_config_bootstrap_v3_FatalAction_msginit,
&envoy_config_bootstrap_v3_LayeredRuntime_msginit,
&envoy_config_bootstrap_v3_Watchdog_msginit,
&envoy_config_bootstrap_v3_Watchdogs_msginit,
&envoy_config_core_v3_ApiConfigSource_msginit,
&envoy_config_core_v3_ConfigSource_msginit,
+ &envoy_config_core_v3_DnsResolutionConfig_msginit,
&envoy_config_core_v3_Node_msginit,
&envoy_config_core_v3_TypedExtensionConfig_msginit,
&envoy_config_metrics_v3_StatsConfig_msginit,
@@ -55,40 +60,43 @@ static const upb_msglayout *const envoy_config_bootstrap_v3_Bootstrap_submsgs[19
&google_protobuf_UInt64Value_msginit,
};
-static const upb_msglayout_field envoy_config_bootstrap_v3_Bootstrap__fields[27] = {
- {1, UPB_SIZE(28, 56), 1, 11, 11, 1},
- {2, UPB_SIZE(32, 64), 2, 3, 11, 1},
- {3, UPB_SIZE(36, 72), 3, 2, 11, 1},
- {4, UPB_SIZE(40, 80), 4, 4, 11, 1},
- {5, UPB_SIZE(4, 8), 0, 0, 9, 1},
- {6, UPB_SIZE(88, 176), 0, 14, 11, 3},
- {7, UPB_SIZE(44, 88), 5, 17, 11, 1},
- {8, UPB_SIZE(48, 96), 6, 7, 11, 1},
- {9, UPB_SIZE(52, 104), 7, 16, 11, 1},
- {12, UPB_SIZE(56, 112), 8, 0, 11, 1},
- {13, UPB_SIZE(60, 120), 9, 13, 11, 1},
- {14, UPB_SIZE(64, 128), 10, 9, 11, 1},
- {15, UPB_SIZE(68, 136), 11, 15, 11, 1},
- {16, UPB_SIZE(2, 2), 0, 0, 8, 1},
- {17, UPB_SIZE(72, 144), 12, 6, 11, 1},
- {18, UPB_SIZE(12, 24), 0, 0, 9, 1},
- {19, UPB_SIZE(76, 152), 13, 18, 11, 1},
- {20, UPB_SIZE(3, 3), 0, 0, 8, 1},
- {21, UPB_SIZE(92, 184), 0, 12, 11, 3},
- {22, UPB_SIZE(96, 192), 0, 10, 11, 3},
- {23, UPB_SIZE(80, 160), 14, 10, 11, 1},
- {24, UPB_SIZE(20, 40), 0, 0, 9, 1},
- {25, UPB_SIZE(100, 200), 0, 1, 11, _UPB_LABEL_MAP},
- {26, UPB_SIZE(104, 208), 0, 0, 9, 3},
- {27, UPB_SIZE(84, 168), 15, 8, 11, 1},
- {28, UPB_SIZE(108, 216), 0, 5, 11, 3},
- {29, UPB_SIZE(112, 224), UPB_SIZE(-117, -229), 0, 8, 1},
+static const upb_msglayout_field envoy_config_bootstrap_v3_Bootstrap__fields[30] = {
+ {1, UPB_SIZE(32, 56), 1, 13, 11, 1},
+ {2, UPB_SIZE(36, 64), 2, 3, 11, 1},
+ {3, UPB_SIZE(40, 72), 3, 2, 11, 1},
+ {4, UPB_SIZE(44, 80), 4, 4, 11, 1},
+ {5, UPB_SIZE(8, 8), 0, 0, 9, 1},
+ {6, UPB_SIZE(100, 192), 0, 16, 11, 3},
+ {7, UPB_SIZE(48, 88), 5, 19, 11, 1},
+ {8, UPB_SIZE(52, 96), 6, 8, 11, 1},
+ {9, UPB_SIZE(56, 104), 7, 18, 11, 1},
+ {12, UPB_SIZE(60, 112), 8, 0, 11, 1},
+ {13, UPB_SIZE(64, 120), 9, 15, 11, 1},
+ {14, UPB_SIZE(68, 128), 10, 10, 11, 1},
+ {15, UPB_SIZE(72, 136), 11, 17, 11, 1},
+ {16, UPB_SIZE(3, 3), 0, 0, 8, 1},
+ {17, UPB_SIZE(76, 144), 12, 7, 11, 1},
+ {18, UPB_SIZE(16, 24), 0, 0, 9, 1},
+ {19, UPB_SIZE(80, 152), 13, 20, 11, 1},
+ {20, UPB_SIZE(4, 4), 0, 0, 8, 1},
+ {21, UPB_SIZE(104, 200), 0, 14, 11, 3},
+ {22, UPB_SIZE(108, 208), 0, 11, 11, 3},
+ {23, UPB_SIZE(84, 160), 14, 11, 11, 1},
+ {24, UPB_SIZE(24, 40), 0, 0, 9, 1},
+ {25, UPB_SIZE(112, 216), 0, 1, 11, _UPB_LABEL_MAP},
+ {26, UPB_SIZE(116, 224), 0, 0, 9, 3},
+ {27, UPB_SIZE(88, 168), 15, 9, 11, 1},
+ {28, UPB_SIZE(120, 232), 0, 6, 11, 3},
+ {29, UPB_SIZE(128, 248), UPB_SIZE(-133, -253), 0, 8, 1},
+ {30, UPB_SIZE(92, 176), 16, 12, 11, 1},
+ {31, UPB_SIZE(96, 184), 17, 14, 11, 1},
+ {32, UPB_SIZE(124, 240), 0, 5, 11, 3},
};
const upb_msglayout envoy_config_bootstrap_v3_Bootstrap_msginit = {
&envoy_config_bootstrap_v3_Bootstrap_submsgs[0],
&envoy_config_bootstrap_v3_Bootstrap__fields[0],
- UPB_SIZE(120, 240), 27, false, 255,
+ UPB_SIZE(136, 256), 30, false, 255,
};
static const upb_msglayout *const envoy_config_bootstrap_v3_Bootstrap_StaticResources_submsgs[3] = {
@@ -143,22 +151,24 @@ const upb_msglayout envoy_config_bootstrap_v3_Bootstrap_CertificateProviderInsta
UPB_SIZE(16, 32), 2, false, 255,
};
-static const upb_msglayout *const envoy_config_bootstrap_v3_Admin_submsgs[2] = {
+static const upb_msglayout *const envoy_config_bootstrap_v3_Admin_submsgs[3] = {
+ &envoy_config_accesslog_v3_AccessLog_msginit,
&envoy_config_core_v3_Address_msginit,
&envoy_config_core_v3_SocketOption_msginit,
};
-static const upb_msglayout_field envoy_config_bootstrap_v3_Admin__fields[4] = {
+static const upb_msglayout_field envoy_config_bootstrap_v3_Admin__fields[5] = {
{1, UPB_SIZE(4, 8), 0, 0, 9, 1},
{2, UPB_SIZE(12, 24), 0, 0, 9, 1},
- {3, UPB_SIZE(20, 40), 1, 0, 11, 1},
- {4, UPB_SIZE(24, 48), 0, 1, 11, 3},
+ {3, UPB_SIZE(20, 40), 1, 1, 11, 1},
+ {4, UPB_SIZE(24, 48), 0, 2, 11, 3},
+ {5, UPB_SIZE(28, 56), 0, 0, 11, 3},
};
const upb_msglayout envoy_config_bootstrap_v3_Admin_msginit = {
&envoy_config_bootstrap_v3_Admin_submsgs[0],
&envoy_config_bootstrap_v3_Admin__fields[0],
- UPB_SIZE(32, 64), 4, false, 255,
+ UPB_SIZE(32, 64), 5, false, 255,
};
static const upb_msglayout *const envoy_config_bootstrap_v3_ClusterManager_submsgs[3] = {
@@ -346,5 +356,16 @@ const upb_msglayout envoy_config_bootstrap_v3_LayeredRuntime_msginit = {
UPB_SIZE(8, 8), 1, false, 255,
};
+static const upb_msglayout_field envoy_config_bootstrap_v3_CustomInlineHeader__fields[2] = {
+ {1, UPB_SIZE(4, 8), 0, 0, 9, 1},
+ {2, UPB_SIZE(0, 0), 0, 0, 14, 1},
+};
+
+const upb_msglayout envoy_config_bootstrap_v3_CustomInlineHeader_msginit = {
+ NULL,
+ &envoy_config_bootstrap_v3_CustomInlineHeader__fields[0],
+ UPB_SIZE(16, 32), 2, false, 255,
+};
+
#include "upb/port_undef.inc"
diff --git a/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h b/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h
index 42e4c8583d..21152f2fb0 100644
--- a/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h
+++ b/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h
@@ -37,6 +37,7 @@ struct envoy_config_bootstrap_v3_RuntimeLayer_DiskLayer;
struct envoy_config_bootstrap_v3_RuntimeLayer_AdminLayer;
struct envoy_config_bootstrap_v3_RuntimeLayer_RtdsLayer;
struct envoy_config_bootstrap_v3_LayeredRuntime;
+struct envoy_config_bootstrap_v3_CustomInlineHeader;
typedef struct envoy_config_bootstrap_v3_Bootstrap envoy_config_bootstrap_v3_Bootstrap;
typedef struct envoy_config_bootstrap_v3_Bootstrap_StaticResources envoy_config_bootstrap_v3_Bootstrap_StaticResources;
typedef struct envoy_config_bootstrap_v3_Bootstrap_DynamicResources envoy_config_bootstrap_v3_Bootstrap_DynamicResources;
@@ -54,6 +55,7 @@ typedef struct envoy_config_bootstrap_v3_RuntimeLayer_DiskLayer envoy_config_boo
typedef struct envoy_config_bootstrap_v3_RuntimeLayer_AdminLayer envoy_config_bootstrap_v3_RuntimeLayer_AdminLayer;
typedef struct envoy_config_bootstrap_v3_RuntimeLayer_RtdsLayer envoy_config_bootstrap_v3_RuntimeLayer_RtdsLayer;
typedef struct envoy_config_bootstrap_v3_LayeredRuntime envoy_config_bootstrap_v3_LayeredRuntime;
+typedef struct envoy_config_bootstrap_v3_CustomInlineHeader envoy_config_bootstrap_v3_CustomInlineHeader;
extern const upb_msglayout envoy_config_bootstrap_v3_Bootstrap_msginit;
extern const upb_msglayout envoy_config_bootstrap_v3_Bootstrap_StaticResources_msginit;
extern const upb_msglayout envoy_config_bootstrap_v3_Bootstrap_DynamicResources_msginit;
@@ -71,11 +73,14 @@ extern const upb_msglayout envoy_config_bootstrap_v3_RuntimeLayer_DiskLayer_msgi
extern const upb_msglayout envoy_config_bootstrap_v3_RuntimeLayer_AdminLayer_msginit;
extern const upb_msglayout envoy_config_bootstrap_v3_RuntimeLayer_RtdsLayer_msginit;
extern const upb_msglayout envoy_config_bootstrap_v3_LayeredRuntime_msginit;
+extern const upb_msglayout envoy_config_bootstrap_v3_CustomInlineHeader_msginit;
+struct envoy_config_accesslog_v3_AccessLog;
struct envoy_config_cluster_v3_Cluster;
struct envoy_config_core_v3_Address;
struct envoy_config_core_v3_ApiConfigSource;
struct envoy_config_core_v3_BindConfig;
struct envoy_config_core_v3_ConfigSource;
+struct envoy_config_core_v3_DnsResolutionConfig;
struct envoy_config_core_v3_EventServiceConfig;
struct envoy_config_core_v3_Node;
struct envoy_config_core_v3_SocketOption;
@@ -90,11 +95,13 @@ struct envoy_type_v3_Percent;
struct google_protobuf_Duration;
struct google_protobuf_Struct;
struct google_protobuf_UInt64Value;
+extern const upb_msglayout envoy_config_accesslog_v3_AccessLog_msginit;
extern const upb_msglayout envoy_config_cluster_v3_Cluster_msginit;
extern const upb_msglayout envoy_config_core_v3_Address_msginit;
extern const upb_msglayout envoy_config_core_v3_ApiConfigSource_msginit;
extern const upb_msglayout envoy_config_core_v3_BindConfig_msginit;
extern const upb_msglayout envoy_config_core_v3_ConfigSource_msginit;
+extern const upb_msglayout envoy_config_core_v3_DnsResolutionConfig_msginit;
extern const upb_msglayout envoy_config_core_v3_EventServiceConfig_msginit;
extern const upb_msglayout envoy_config_core_v3_Node_msginit;
extern const upb_msglayout envoy_config_core_v3_SocketOption_msginit;
@@ -111,6 +118,13 @@ extern const upb_msglayout google_protobuf_Struct_msginit;
extern const upb_msglayout google_protobuf_UInt64Value_msginit;
typedef enum {
+ envoy_config_bootstrap_v3_CustomInlineHeader_REQUEST_HEADER = 0,
+ envoy_config_bootstrap_v3_CustomInlineHeader_REQUEST_TRAILER = 1,
+ envoy_config_bootstrap_v3_CustomInlineHeader_RESPONSE_HEADER = 2,
+ envoy_config_bootstrap_v3_CustomInlineHeader_RESPONSE_TRAILER = 3
+} envoy_config_bootstrap_v3_CustomInlineHeader_InlineHeaderType;
+
+typedef enum {
envoy_config_bootstrap_v3_Watchdog_WatchdogAction_UNKNOWN = 0,
envoy_config_bootstrap_v3_Watchdog_WatchdogAction_KILL = 1,
envoy_config_bootstrap_v3_Watchdog_WatchdogAction_MULTIKILL = 2,
@@ -143,62 +157,68 @@ typedef enum {
envoy_config_bootstrap_v3_Bootstrap_stats_flush_stats_flush_on_admin = 29,
envoy_config_bootstrap_v3_Bootstrap_stats_flush_NOT_SET = 0
} envoy_config_bootstrap_v3_Bootstrap_stats_flush_oneofcases;
-UPB_INLINE envoy_config_bootstrap_v3_Bootstrap_stats_flush_oneofcases envoy_config_bootstrap_v3_Bootstrap_stats_flush_case(const envoy_config_bootstrap_v3_Bootstrap* msg) { return (envoy_config_bootstrap_v3_Bootstrap_stats_flush_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(116, 228), int32_t); }
+UPB_INLINE envoy_config_bootstrap_v3_Bootstrap_stats_flush_oneofcases envoy_config_bootstrap_v3_Bootstrap_stats_flush_case(const envoy_config_bootstrap_v3_Bootstrap* msg) { return (envoy_config_bootstrap_v3_Bootstrap_stats_flush_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(132, 252), int32_t); }
UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_has_node(const envoy_config_bootstrap_v3_Bootstrap *msg) { return _upb_hasbit(msg, 1); }
-UPB_INLINE const struct envoy_config_core_v3_Node* envoy_config_bootstrap_v3_Bootstrap_node(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(28, 56), const struct envoy_config_core_v3_Node*); }
+UPB_INLINE const struct envoy_config_core_v3_Node* envoy_config_bootstrap_v3_Bootstrap_node(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(32, 56), const struct envoy_config_core_v3_Node*); }
UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_has_static_resources(const envoy_config_bootstrap_v3_Bootstrap *msg) { return _upb_hasbit(msg, 2); }
-UPB_INLINE const envoy_config_bootstrap_v3_Bootstrap_StaticResources* envoy_config_bootstrap_v3_Bootstrap_static_resources(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(32, 64), const envoy_config_bootstrap_v3_Bootstrap_StaticResources*); }
+UPB_INLINE const envoy_config_bootstrap_v3_Bootstrap_StaticResources* envoy_config_bootstrap_v3_Bootstrap_static_resources(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(36, 64), const envoy_config_bootstrap_v3_Bootstrap_StaticResources*); }
UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_has_dynamic_resources(const envoy_config_bootstrap_v3_Bootstrap *msg) { return _upb_hasbit(msg, 3); }
-UPB_INLINE const envoy_config_bootstrap_v3_Bootstrap_DynamicResources* envoy_config_bootstrap_v3_Bootstrap_dynamic_resources(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(36, 72), const envoy_config_bootstrap_v3_Bootstrap_DynamicResources*); }
+UPB_INLINE const envoy_config_bootstrap_v3_Bootstrap_DynamicResources* envoy_config_bootstrap_v3_Bootstrap_dynamic_resources(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(40, 72), const envoy_config_bootstrap_v3_Bootstrap_DynamicResources*); }
UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_has_cluster_manager(const envoy_config_bootstrap_v3_Bootstrap *msg) { return _upb_hasbit(msg, 4); }
-UPB_INLINE const envoy_config_bootstrap_v3_ClusterManager* envoy_config_bootstrap_v3_Bootstrap_cluster_manager(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(40, 80), const envoy_config_bootstrap_v3_ClusterManager*); }
-UPB_INLINE upb_strview envoy_config_bootstrap_v3_Bootstrap_flags_path(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview); }
-UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_has_stats_sinks(const envoy_config_bootstrap_v3_Bootstrap *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(88, 176)); }
-UPB_INLINE const struct envoy_config_metrics_v3_StatsSink* const* envoy_config_bootstrap_v3_Bootstrap_stats_sinks(const envoy_config_bootstrap_v3_Bootstrap *msg, size_t *len) { return (const struct envoy_config_metrics_v3_StatsSink* const*)_upb_array_accessor(msg, UPB_SIZE(88, 176), len); }
+UPB_INLINE const envoy_config_bootstrap_v3_ClusterManager* envoy_config_bootstrap_v3_Bootstrap_cluster_manager(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(44, 80), const envoy_config_bootstrap_v3_ClusterManager*); }
+UPB_INLINE upb_strview envoy_config_bootstrap_v3_Bootstrap_flags_path(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(8, 8), upb_strview); }
+UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_has_stats_sinks(const envoy_config_bootstrap_v3_Bootstrap *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(100, 192)); }
+UPB_INLINE const struct envoy_config_metrics_v3_StatsSink* const* envoy_config_bootstrap_v3_Bootstrap_stats_sinks(const envoy_config_bootstrap_v3_Bootstrap *msg, size_t *len) { return (const struct envoy_config_metrics_v3_StatsSink* const*)_upb_array_accessor(msg, UPB_SIZE(100, 192), len); }
UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_has_stats_flush_interval(const envoy_config_bootstrap_v3_Bootstrap *msg) { return _upb_hasbit(msg, 5); }
-UPB_INLINE const struct google_protobuf_Duration* envoy_config_bootstrap_v3_Bootstrap_stats_flush_interval(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(44, 88), const struct google_protobuf_Duration*); }
+UPB_INLINE const struct google_protobuf_Duration* envoy_config_bootstrap_v3_Bootstrap_stats_flush_interval(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(48, 88), const struct google_protobuf_Duration*); }
UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_has_watchdog(const envoy_config_bootstrap_v3_Bootstrap *msg) { return _upb_hasbit(msg, 6); }
-UPB_INLINE const envoy_config_bootstrap_v3_Watchdog* envoy_config_bootstrap_v3_Bootstrap_watchdog(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(48, 96), const envoy_config_bootstrap_v3_Watchdog*); }
+UPB_INLINE const envoy_config_bootstrap_v3_Watchdog* envoy_config_bootstrap_v3_Bootstrap_watchdog(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(52, 96), const envoy_config_bootstrap_v3_Watchdog*); }
UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_has_tracing(const envoy_config_bootstrap_v3_Bootstrap *msg) { return _upb_hasbit(msg, 7); }
-UPB_INLINE const struct envoy_config_trace_v3_Tracing* envoy_config_bootstrap_v3_Bootstrap_tracing(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(52, 104), const struct envoy_config_trace_v3_Tracing*); }
+UPB_INLINE const struct envoy_config_trace_v3_Tracing* envoy_config_bootstrap_v3_Bootstrap_tracing(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(56, 104), const struct envoy_config_trace_v3_Tracing*); }
UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_has_admin(const envoy_config_bootstrap_v3_Bootstrap *msg) { return _upb_hasbit(msg, 8); }
-UPB_INLINE const envoy_config_bootstrap_v3_Admin* envoy_config_bootstrap_v3_Bootstrap_admin(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(56, 112), const envoy_config_bootstrap_v3_Admin*); }
+UPB_INLINE const envoy_config_bootstrap_v3_Admin* envoy_config_bootstrap_v3_Bootstrap_admin(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(60, 112), const envoy_config_bootstrap_v3_Admin*); }
UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_has_stats_config(const envoy_config_bootstrap_v3_Bootstrap *msg) { return _upb_hasbit(msg, 9); }
-UPB_INLINE const struct envoy_config_metrics_v3_StatsConfig* envoy_config_bootstrap_v3_Bootstrap_stats_config(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(60, 120), const struct envoy_config_metrics_v3_StatsConfig*); }
+UPB_INLINE const struct envoy_config_metrics_v3_StatsConfig* envoy_config_bootstrap_v3_Bootstrap_stats_config(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(64, 120), const struct envoy_config_metrics_v3_StatsConfig*); }
UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_has_hds_config(const envoy_config_bootstrap_v3_Bootstrap *msg) { return _upb_hasbit(msg, 10); }
-UPB_INLINE const struct envoy_config_core_v3_ApiConfigSource* envoy_config_bootstrap_v3_Bootstrap_hds_config(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(64, 128), const struct envoy_config_core_v3_ApiConfigSource*); }
+UPB_INLINE const struct envoy_config_core_v3_ApiConfigSource* envoy_config_bootstrap_v3_Bootstrap_hds_config(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(68, 128), const struct envoy_config_core_v3_ApiConfigSource*); }
UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_has_overload_manager(const envoy_config_bootstrap_v3_Bootstrap *msg) { return _upb_hasbit(msg, 11); }
-UPB_INLINE const struct envoy_config_overload_v3_OverloadManager* envoy_config_bootstrap_v3_Bootstrap_overload_manager(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(68, 136), const struct envoy_config_overload_v3_OverloadManager*); }
-UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_enable_dispatcher_stats(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(2, 2), bool); }
+UPB_INLINE const struct envoy_config_overload_v3_OverloadManager* envoy_config_bootstrap_v3_Bootstrap_overload_manager(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(72, 136), const struct envoy_config_overload_v3_OverloadManager*); }
+UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_enable_dispatcher_stats(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(3, 3), bool); }
UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_has_layered_runtime(const envoy_config_bootstrap_v3_Bootstrap *msg) { return _upb_hasbit(msg, 12); }
-UPB_INLINE const envoy_config_bootstrap_v3_LayeredRuntime* envoy_config_bootstrap_v3_Bootstrap_layered_runtime(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(72, 144), const envoy_config_bootstrap_v3_LayeredRuntime*); }
-UPB_INLINE upb_strview envoy_config_bootstrap_v3_Bootstrap_header_prefix(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 24), upb_strview); }
+UPB_INLINE const envoy_config_bootstrap_v3_LayeredRuntime* envoy_config_bootstrap_v3_Bootstrap_layered_runtime(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(76, 144), const envoy_config_bootstrap_v3_LayeredRuntime*); }
+UPB_INLINE upb_strview envoy_config_bootstrap_v3_Bootstrap_header_prefix(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(16, 24), upb_strview); }
UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_has_stats_server_version_override(const envoy_config_bootstrap_v3_Bootstrap *msg) { return _upb_hasbit(msg, 13); }
-UPB_INLINE const struct google_protobuf_UInt64Value* envoy_config_bootstrap_v3_Bootstrap_stats_server_version_override(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(76, 152), const struct google_protobuf_UInt64Value*); }
-UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_use_tcp_for_dns_lookups(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(3, 3), bool); }
-UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_has_bootstrap_extensions(const envoy_config_bootstrap_v3_Bootstrap *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(92, 184)); }
-UPB_INLINE const struct envoy_config_core_v3_TypedExtensionConfig* const* envoy_config_bootstrap_v3_Bootstrap_bootstrap_extensions(const envoy_config_bootstrap_v3_Bootstrap *msg, size_t *len) { return (const struct envoy_config_core_v3_TypedExtensionConfig* const*)_upb_array_accessor(msg, UPB_SIZE(92, 184), len); }
-UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_has_config_sources(const envoy_config_bootstrap_v3_Bootstrap *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(96, 192)); }
-UPB_INLINE const struct envoy_config_core_v3_ConfigSource* const* envoy_config_bootstrap_v3_Bootstrap_config_sources(const envoy_config_bootstrap_v3_Bootstrap *msg, size_t *len) { return (const struct envoy_config_core_v3_ConfigSource* const*)_upb_array_accessor(msg, UPB_SIZE(96, 192), len); }
+UPB_INLINE const struct google_protobuf_UInt64Value* envoy_config_bootstrap_v3_Bootstrap_stats_server_version_override(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(80, 152), const struct google_protobuf_UInt64Value*); }
+UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_use_tcp_for_dns_lookups(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 4), bool); }
+UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_has_bootstrap_extensions(const envoy_config_bootstrap_v3_Bootstrap *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(104, 200)); }
+UPB_INLINE const struct envoy_config_core_v3_TypedExtensionConfig* const* envoy_config_bootstrap_v3_Bootstrap_bootstrap_extensions(const envoy_config_bootstrap_v3_Bootstrap *msg, size_t *len) { return (const struct envoy_config_core_v3_TypedExtensionConfig* const*)_upb_array_accessor(msg, UPB_SIZE(104, 200), len); }
+UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_has_config_sources(const envoy_config_bootstrap_v3_Bootstrap *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(108, 208)); }
+UPB_INLINE const struct envoy_config_core_v3_ConfigSource* const* envoy_config_bootstrap_v3_Bootstrap_config_sources(const envoy_config_bootstrap_v3_Bootstrap *msg, size_t *len) { return (const struct envoy_config_core_v3_ConfigSource* const*)_upb_array_accessor(msg, UPB_SIZE(108, 208), len); }
UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_has_default_config_source(const envoy_config_bootstrap_v3_Bootstrap *msg) { return _upb_hasbit(msg, 14); }
-UPB_INLINE const struct envoy_config_core_v3_ConfigSource* envoy_config_bootstrap_v3_Bootstrap_default_config_source(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(80, 160), const struct envoy_config_core_v3_ConfigSource*); }
-UPB_INLINE upb_strview envoy_config_bootstrap_v3_Bootstrap_default_socket_interface(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(20, 40), upb_strview); }
-UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_has_certificate_provider_instances(const envoy_config_bootstrap_v3_Bootstrap *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(100, 200)); }
-UPB_INLINE size_t envoy_config_bootstrap_v3_Bootstrap_certificate_provider_instances_size(const envoy_config_bootstrap_v3_Bootstrap *msg) {return _upb_msg_map_size(msg, UPB_SIZE(100, 200)); }
-UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_certificate_provider_instances_get(const envoy_config_bootstrap_v3_Bootstrap *msg, upb_strview key, struct envoy_config_core_v3_TypedExtensionConfig* *val) { return _upb_msg_map_get(msg, UPB_SIZE(100, 200), &key, 0, val, sizeof(*val)); }
-UPB_INLINE const envoy_config_bootstrap_v3_Bootstrap_CertificateProviderInstancesEntry* envoy_config_bootstrap_v3_Bootstrap_certificate_provider_instances_next(const envoy_config_bootstrap_v3_Bootstrap *msg, size_t* iter) { return (const envoy_config_bootstrap_v3_Bootstrap_CertificateProviderInstancesEntry*)_upb_msg_map_next(msg, UPB_SIZE(100, 200), iter); }
-UPB_INLINE upb_strview const* envoy_config_bootstrap_v3_Bootstrap_node_context_params(const envoy_config_bootstrap_v3_Bootstrap *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(104, 208), len); }
+UPB_INLINE const struct envoy_config_core_v3_ConfigSource* envoy_config_bootstrap_v3_Bootstrap_default_config_source(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(84, 160), const struct envoy_config_core_v3_ConfigSource*); }
+UPB_INLINE upb_strview envoy_config_bootstrap_v3_Bootstrap_default_socket_interface(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(24, 40), upb_strview); }
+UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_has_certificate_provider_instances(const envoy_config_bootstrap_v3_Bootstrap *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(112, 216)); }
+UPB_INLINE size_t envoy_config_bootstrap_v3_Bootstrap_certificate_provider_instances_size(const envoy_config_bootstrap_v3_Bootstrap *msg) {return _upb_msg_map_size(msg, UPB_SIZE(112, 216)); }
+UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_certificate_provider_instances_get(const envoy_config_bootstrap_v3_Bootstrap *msg, upb_strview key, struct envoy_config_core_v3_TypedExtensionConfig* *val) { return _upb_msg_map_get(msg, UPB_SIZE(112, 216), &key, 0, val, sizeof(*val)); }
+UPB_INLINE const envoy_config_bootstrap_v3_Bootstrap_CertificateProviderInstancesEntry* envoy_config_bootstrap_v3_Bootstrap_certificate_provider_instances_next(const envoy_config_bootstrap_v3_Bootstrap *msg, size_t* iter) { return (const envoy_config_bootstrap_v3_Bootstrap_CertificateProviderInstancesEntry*)_upb_msg_map_next(msg, UPB_SIZE(112, 216), iter); }
+UPB_INLINE upb_strview const* envoy_config_bootstrap_v3_Bootstrap_node_context_params(const envoy_config_bootstrap_v3_Bootstrap *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(116, 224), len); }
UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_has_watchdogs(const envoy_config_bootstrap_v3_Bootstrap *msg) { return _upb_hasbit(msg, 15); }
-UPB_INLINE const envoy_config_bootstrap_v3_Watchdogs* envoy_config_bootstrap_v3_Bootstrap_watchdogs(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(84, 168), const envoy_config_bootstrap_v3_Watchdogs*); }
-UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_has_fatal_actions(const envoy_config_bootstrap_v3_Bootstrap *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(108, 216)); }
-UPB_INLINE const envoy_config_bootstrap_v3_FatalAction* const* envoy_config_bootstrap_v3_Bootstrap_fatal_actions(const envoy_config_bootstrap_v3_Bootstrap *msg, size_t *len) { return (const envoy_config_bootstrap_v3_FatalAction* const*)_upb_array_accessor(msg, UPB_SIZE(108, 216), len); }
-UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_has_stats_flush_on_admin(const envoy_config_bootstrap_v3_Bootstrap *msg) { return _upb_getoneofcase(msg, UPB_SIZE(116, 228)) == 29; }
-UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_stats_flush_on_admin(const envoy_config_bootstrap_v3_Bootstrap *msg) { return UPB_READ_ONEOF(msg, bool, UPB_SIZE(112, 224), UPB_SIZE(116, 228), 29, false); }
+UPB_INLINE const envoy_config_bootstrap_v3_Watchdogs* envoy_config_bootstrap_v3_Bootstrap_watchdogs(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(88, 168), const envoy_config_bootstrap_v3_Watchdogs*); }
+UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_has_fatal_actions(const envoy_config_bootstrap_v3_Bootstrap *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(120, 232)); }
+UPB_INLINE const envoy_config_bootstrap_v3_FatalAction* const* envoy_config_bootstrap_v3_Bootstrap_fatal_actions(const envoy_config_bootstrap_v3_Bootstrap *msg, size_t *len) { return (const envoy_config_bootstrap_v3_FatalAction* const*)_upb_array_accessor(msg, UPB_SIZE(120, 232), len); }
+UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_has_stats_flush_on_admin(const envoy_config_bootstrap_v3_Bootstrap *msg) { return _upb_getoneofcase(msg, UPB_SIZE(132, 252)) == 29; }
+UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_stats_flush_on_admin(const envoy_config_bootstrap_v3_Bootstrap *msg) { return UPB_READ_ONEOF(msg, bool, UPB_SIZE(128, 248), UPB_SIZE(132, 252), 29, false); }
+UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_has_dns_resolution_config(const envoy_config_bootstrap_v3_Bootstrap *msg) { return _upb_hasbit(msg, 16); }
+UPB_INLINE const struct envoy_config_core_v3_DnsResolutionConfig* envoy_config_bootstrap_v3_Bootstrap_dns_resolution_config(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(92, 176), const struct envoy_config_core_v3_DnsResolutionConfig*); }
+UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_has_typed_dns_resolver_config(const envoy_config_bootstrap_v3_Bootstrap *msg) { return _upb_hasbit(msg, 17); }
+UPB_INLINE const struct envoy_config_core_v3_TypedExtensionConfig* envoy_config_bootstrap_v3_Bootstrap_typed_dns_resolver_config(const envoy_config_bootstrap_v3_Bootstrap *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(96, 184), const struct envoy_config_core_v3_TypedExtensionConfig*); }
+UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_has_inline_headers(const envoy_config_bootstrap_v3_Bootstrap *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(124, 240)); }
+UPB_INLINE const envoy_config_bootstrap_v3_CustomInlineHeader* const* envoy_config_bootstrap_v3_Bootstrap_inline_headers(const envoy_config_bootstrap_v3_Bootstrap *msg, size_t *len) { return (const envoy_config_bootstrap_v3_CustomInlineHeader* const*)_upb_array_accessor(msg, UPB_SIZE(124, 240), len); }
UPB_INLINE void envoy_config_bootstrap_v3_Bootstrap_set_node(envoy_config_bootstrap_v3_Bootstrap *msg, struct envoy_config_core_v3_Node* value) {
_upb_sethas(msg, 1);
- *UPB_PTR_AT(msg, UPB_SIZE(28, 56), struct envoy_config_core_v3_Node*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(32, 56), struct envoy_config_core_v3_Node*) = value;
}
UPB_INLINE struct envoy_config_core_v3_Node* envoy_config_bootstrap_v3_Bootstrap_mutable_node(envoy_config_bootstrap_v3_Bootstrap *msg, upb_arena *arena) {
struct envoy_config_core_v3_Node* sub = (struct envoy_config_core_v3_Node*)envoy_config_bootstrap_v3_Bootstrap_node(msg);
@@ -211,7 +231,7 @@ UPB_INLINE struct envoy_config_core_v3_Node* envoy_config_bootstrap_v3_Bootstrap
}
UPB_INLINE void envoy_config_bootstrap_v3_Bootstrap_set_static_resources(envoy_config_bootstrap_v3_Bootstrap *msg, envoy_config_bootstrap_v3_Bootstrap_StaticResources* value) {
_upb_sethas(msg, 2);
- *UPB_PTR_AT(msg, UPB_SIZE(32, 64), envoy_config_bootstrap_v3_Bootstrap_StaticResources*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(36, 64), envoy_config_bootstrap_v3_Bootstrap_StaticResources*) = value;
}
UPB_INLINE struct envoy_config_bootstrap_v3_Bootstrap_StaticResources* envoy_config_bootstrap_v3_Bootstrap_mutable_static_resources(envoy_config_bootstrap_v3_Bootstrap *msg, upb_arena *arena) {
struct envoy_config_bootstrap_v3_Bootstrap_StaticResources* sub = (struct envoy_config_bootstrap_v3_Bootstrap_StaticResources*)envoy_config_bootstrap_v3_Bootstrap_static_resources(msg);
@@ -224,7 +244,7 @@ UPB_INLINE struct envoy_config_bootstrap_v3_Bootstrap_StaticResources* envoy_con
}
UPB_INLINE void envoy_config_bootstrap_v3_Bootstrap_set_dynamic_resources(envoy_config_bootstrap_v3_Bootstrap *msg, envoy_config_bootstrap_v3_Bootstrap_DynamicResources* value) {
_upb_sethas(msg, 3);
- *UPB_PTR_AT(msg, UPB_SIZE(36, 72), envoy_config_bootstrap_v3_Bootstrap_DynamicResources*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(40, 72), envoy_config_bootstrap_v3_Bootstrap_DynamicResources*) = value;
}
UPB_INLINE struct envoy_config_bootstrap_v3_Bootstrap_DynamicResources* envoy_config_bootstrap_v3_Bootstrap_mutable_dynamic_resources(envoy_config_bootstrap_v3_Bootstrap *msg, upb_arena *arena) {
struct envoy_config_bootstrap_v3_Bootstrap_DynamicResources* sub = (struct envoy_config_bootstrap_v3_Bootstrap_DynamicResources*)envoy_config_bootstrap_v3_Bootstrap_dynamic_resources(msg);
@@ -237,7 +257,7 @@ UPB_INLINE struct envoy_config_bootstrap_v3_Bootstrap_DynamicResources* envoy_co
}
UPB_INLINE void envoy_config_bootstrap_v3_Bootstrap_set_cluster_manager(envoy_config_bootstrap_v3_Bootstrap *msg, envoy_config_bootstrap_v3_ClusterManager* value) {
_upb_sethas(msg, 4);
- *UPB_PTR_AT(msg, UPB_SIZE(40, 80), envoy_config_bootstrap_v3_ClusterManager*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(44, 80), envoy_config_bootstrap_v3_ClusterManager*) = value;
}
UPB_INLINE struct envoy_config_bootstrap_v3_ClusterManager* envoy_config_bootstrap_v3_Bootstrap_mutable_cluster_manager(envoy_config_bootstrap_v3_Bootstrap *msg, upb_arena *arena) {
struct envoy_config_bootstrap_v3_ClusterManager* sub = (struct envoy_config_bootstrap_v3_ClusterManager*)envoy_config_bootstrap_v3_Bootstrap_cluster_manager(msg);
@@ -249,24 +269,24 @@ UPB_INLINE struct envoy_config_bootstrap_v3_ClusterManager* envoy_config_bootstr
return sub;
}
UPB_INLINE void envoy_config_bootstrap_v3_Bootstrap_set_flags_path(envoy_config_bootstrap_v3_Bootstrap *msg, upb_strview value) {
- *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(8, 8), upb_strview) = value;
}
UPB_INLINE struct envoy_config_metrics_v3_StatsSink** envoy_config_bootstrap_v3_Bootstrap_mutable_stats_sinks(envoy_config_bootstrap_v3_Bootstrap *msg, size_t *len) {
- return (struct envoy_config_metrics_v3_StatsSink**)_upb_array_mutable_accessor(msg, UPB_SIZE(88, 176), len);
+ return (struct envoy_config_metrics_v3_StatsSink**)_upb_array_mutable_accessor(msg, UPB_SIZE(100, 192), len);
}
UPB_INLINE struct envoy_config_metrics_v3_StatsSink** envoy_config_bootstrap_v3_Bootstrap_resize_stats_sinks(envoy_config_bootstrap_v3_Bootstrap *msg, size_t len, upb_arena *arena) {
- return (struct envoy_config_metrics_v3_StatsSink**)_upb_array_resize_accessor2(msg, UPB_SIZE(88, 176), len, UPB_SIZE(2, 3), arena);
+ return (struct envoy_config_metrics_v3_StatsSink**)_upb_array_resize_accessor2(msg, UPB_SIZE(100, 192), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_config_metrics_v3_StatsSink* envoy_config_bootstrap_v3_Bootstrap_add_stats_sinks(envoy_config_bootstrap_v3_Bootstrap *msg, upb_arena *arena) {
struct envoy_config_metrics_v3_StatsSink* sub = (struct envoy_config_metrics_v3_StatsSink*)_upb_msg_new(&envoy_config_metrics_v3_StatsSink_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(88, 176), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(100, 192), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
UPB_INLINE void envoy_config_bootstrap_v3_Bootstrap_set_stats_flush_interval(envoy_config_bootstrap_v3_Bootstrap *msg, struct google_protobuf_Duration* value) {
_upb_sethas(msg, 5);
- *UPB_PTR_AT(msg, UPB_SIZE(44, 88), struct google_protobuf_Duration*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(48, 88), struct google_protobuf_Duration*) = value;
}
UPB_INLINE struct google_protobuf_Duration* envoy_config_bootstrap_v3_Bootstrap_mutable_stats_flush_interval(envoy_config_bootstrap_v3_Bootstrap *msg, upb_arena *arena) {
struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_config_bootstrap_v3_Bootstrap_stats_flush_interval(msg);
@@ -279,7 +299,7 @@ UPB_INLINE struct google_protobuf_Duration* envoy_config_bootstrap_v3_Bootstrap_
}
UPB_INLINE void envoy_config_bootstrap_v3_Bootstrap_set_watchdog(envoy_config_bootstrap_v3_Bootstrap *msg, envoy_config_bootstrap_v3_Watchdog* value) {
_upb_sethas(msg, 6);
- *UPB_PTR_AT(msg, UPB_SIZE(48, 96), envoy_config_bootstrap_v3_Watchdog*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(52, 96), envoy_config_bootstrap_v3_Watchdog*) = value;
}
UPB_INLINE struct envoy_config_bootstrap_v3_Watchdog* envoy_config_bootstrap_v3_Bootstrap_mutable_watchdog(envoy_config_bootstrap_v3_Bootstrap *msg, upb_arena *arena) {
struct envoy_config_bootstrap_v3_Watchdog* sub = (struct envoy_config_bootstrap_v3_Watchdog*)envoy_config_bootstrap_v3_Bootstrap_watchdog(msg);
@@ -292,7 +312,7 @@ UPB_INLINE struct envoy_config_bootstrap_v3_Watchdog* envoy_config_bootstrap_v3_
}
UPB_INLINE void envoy_config_bootstrap_v3_Bootstrap_set_tracing(envoy_config_bootstrap_v3_Bootstrap *msg, struct envoy_config_trace_v3_Tracing* value) {
_upb_sethas(msg, 7);
- *UPB_PTR_AT(msg, UPB_SIZE(52, 104), struct envoy_config_trace_v3_Tracing*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(56, 104), struct envoy_config_trace_v3_Tracing*) = value;
}
UPB_INLINE struct envoy_config_trace_v3_Tracing* envoy_config_bootstrap_v3_Bootstrap_mutable_tracing(envoy_config_bootstrap_v3_Bootstrap *msg, upb_arena *arena) {
struct envoy_config_trace_v3_Tracing* sub = (struct envoy_config_trace_v3_Tracing*)envoy_config_bootstrap_v3_Bootstrap_tracing(msg);
@@ -305,7 +325,7 @@ UPB_INLINE struct envoy_config_trace_v3_Tracing* envoy_config_bootstrap_v3_Boots
}
UPB_INLINE void envoy_config_bootstrap_v3_Bootstrap_set_admin(envoy_config_bootstrap_v3_Bootstrap *msg, envoy_config_bootstrap_v3_Admin* value) {
_upb_sethas(msg, 8);
- *UPB_PTR_AT(msg, UPB_SIZE(56, 112), envoy_config_bootstrap_v3_Admin*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(60, 112), envoy_config_bootstrap_v3_Admin*) = value;
}
UPB_INLINE struct envoy_config_bootstrap_v3_Admin* envoy_config_bootstrap_v3_Bootstrap_mutable_admin(envoy_config_bootstrap_v3_Bootstrap *msg, upb_arena *arena) {
struct envoy_config_bootstrap_v3_Admin* sub = (struct envoy_config_bootstrap_v3_Admin*)envoy_config_bootstrap_v3_Bootstrap_admin(msg);
@@ -318,7 +338,7 @@ UPB_INLINE struct envoy_config_bootstrap_v3_Admin* envoy_config_bootstrap_v3_Boo
}
UPB_INLINE void envoy_config_bootstrap_v3_Bootstrap_set_stats_config(envoy_config_bootstrap_v3_Bootstrap *msg, struct envoy_config_metrics_v3_StatsConfig* value) {
_upb_sethas(msg, 9);
- *UPB_PTR_AT(msg, UPB_SIZE(60, 120), struct envoy_config_metrics_v3_StatsConfig*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(64, 120), struct envoy_config_metrics_v3_StatsConfig*) = value;
}
UPB_INLINE struct envoy_config_metrics_v3_StatsConfig* envoy_config_bootstrap_v3_Bootstrap_mutable_stats_config(envoy_config_bootstrap_v3_Bootstrap *msg, upb_arena *arena) {
struct envoy_config_metrics_v3_StatsConfig* sub = (struct envoy_config_metrics_v3_StatsConfig*)envoy_config_bootstrap_v3_Bootstrap_stats_config(msg);
@@ -331,7 +351,7 @@ UPB_INLINE struct envoy_config_metrics_v3_StatsConfig* envoy_config_bootstrap_v3
}
UPB_INLINE void envoy_config_bootstrap_v3_Bootstrap_set_hds_config(envoy_config_bootstrap_v3_Bootstrap *msg, struct envoy_config_core_v3_ApiConfigSource* value) {
_upb_sethas(msg, 10);
- *UPB_PTR_AT(msg, UPB_SIZE(64, 128), struct envoy_config_core_v3_ApiConfigSource*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(68, 128), struct envoy_config_core_v3_ApiConfigSource*) = value;
}
UPB_INLINE struct envoy_config_core_v3_ApiConfigSource* envoy_config_bootstrap_v3_Bootstrap_mutable_hds_config(envoy_config_bootstrap_v3_Bootstrap *msg, upb_arena *arena) {
struct envoy_config_core_v3_ApiConfigSource* sub = (struct envoy_config_core_v3_ApiConfigSource*)envoy_config_bootstrap_v3_Bootstrap_hds_config(msg);
@@ -344,7 +364,7 @@ UPB_INLINE struct envoy_config_core_v3_ApiConfigSource* envoy_config_bootstrap_v
}
UPB_INLINE void envoy_config_bootstrap_v3_Bootstrap_set_overload_manager(envoy_config_bootstrap_v3_Bootstrap *msg, struct envoy_config_overload_v3_OverloadManager* value) {
_upb_sethas(msg, 11);
- *UPB_PTR_AT(msg, UPB_SIZE(68, 136), struct envoy_config_overload_v3_OverloadManager*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(72, 136), struct envoy_config_overload_v3_OverloadManager*) = value;
}
UPB_INLINE struct envoy_config_overload_v3_OverloadManager* envoy_config_bootstrap_v3_Bootstrap_mutable_overload_manager(envoy_config_bootstrap_v3_Bootstrap *msg, upb_arena *arena) {
struct envoy_config_overload_v3_OverloadManager* sub = (struct envoy_config_overload_v3_OverloadManager*)envoy_config_bootstrap_v3_Bootstrap_overload_manager(msg);
@@ -356,11 +376,11 @@ UPB_INLINE struct envoy_config_overload_v3_OverloadManager* envoy_config_bootstr
return sub;
}
UPB_INLINE void envoy_config_bootstrap_v3_Bootstrap_set_enable_dispatcher_stats(envoy_config_bootstrap_v3_Bootstrap *msg, bool value) {
- *UPB_PTR_AT(msg, UPB_SIZE(2, 2), bool) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(3, 3), bool) = value;
}
UPB_INLINE void envoy_config_bootstrap_v3_Bootstrap_set_layered_runtime(envoy_config_bootstrap_v3_Bootstrap *msg, envoy_config_bootstrap_v3_LayeredRuntime* value) {
_upb_sethas(msg, 12);
- *UPB_PTR_AT(msg, UPB_SIZE(72, 144), envoy_config_bootstrap_v3_LayeredRuntime*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(76, 144), envoy_config_bootstrap_v3_LayeredRuntime*) = value;
}
UPB_INLINE struct envoy_config_bootstrap_v3_LayeredRuntime* envoy_config_bootstrap_v3_Bootstrap_mutable_layered_runtime(envoy_config_bootstrap_v3_Bootstrap *msg, upb_arena *arena) {
struct envoy_config_bootstrap_v3_LayeredRuntime* sub = (struct envoy_config_bootstrap_v3_LayeredRuntime*)envoy_config_bootstrap_v3_Bootstrap_layered_runtime(msg);
@@ -372,11 +392,11 @@ UPB_INLINE struct envoy_config_bootstrap_v3_LayeredRuntime* envoy_config_bootstr
return sub;
}
UPB_INLINE void envoy_config_bootstrap_v3_Bootstrap_set_header_prefix(envoy_config_bootstrap_v3_Bootstrap *msg, upb_strview value) {
- *UPB_PTR_AT(msg, UPB_SIZE(12, 24), upb_strview) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(16, 24), upb_strview) = value;
}
UPB_INLINE void envoy_config_bootstrap_v3_Bootstrap_set_stats_server_version_override(envoy_config_bootstrap_v3_Bootstrap *msg, struct google_protobuf_UInt64Value* value) {
_upb_sethas(msg, 13);
- *UPB_PTR_AT(msg, UPB_SIZE(76, 152), struct google_protobuf_UInt64Value*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(80, 152), struct google_protobuf_UInt64Value*) = value;
}
UPB_INLINE struct google_protobuf_UInt64Value* envoy_config_bootstrap_v3_Bootstrap_mutable_stats_server_version_override(envoy_config_bootstrap_v3_Bootstrap *msg, upb_arena *arena) {
struct google_protobuf_UInt64Value* sub = (struct google_protobuf_UInt64Value*)envoy_config_bootstrap_v3_Bootstrap_stats_server_version_override(msg);
@@ -388,37 +408,37 @@ UPB_INLINE struct google_protobuf_UInt64Value* envoy_config_bootstrap_v3_Bootstr
return sub;
}
UPB_INLINE void envoy_config_bootstrap_v3_Bootstrap_set_use_tcp_for_dns_lookups(envoy_config_bootstrap_v3_Bootstrap *msg, bool value) {
- *UPB_PTR_AT(msg, UPB_SIZE(3, 3), bool) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 4), bool) = value;
}
UPB_INLINE struct envoy_config_core_v3_TypedExtensionConfig** envoy_config_bootstrap_v3_Bootstrap_mutable_bootstrap_extensions(envoy_config_bootstrap_v3_Bootstrap *msg, size_t *len) {
- return (struct envoy_config_core_v3_TypedExtensionConfig**)_upb_array_mutable_accessor(msg, UPB_SIZE(92, 184), len);
+ return (struct envoy_config_core_v3_TypedExtensionConfig**)_upb_array_mutable_accessor(msg, UPB_SIZE(104, 200), len);
}
UPB_INLINE struct envoy_config_core_v3_TypedExtensionConfig** envoy_config_bootstrap_v3_Bootstrap_resize_bootstrap_extensions(envoy_config_bootstrap_v3_Bootstrap *msg, size_t len, upb_arena *arena) {
- return (struct envoy_config_core_v3_TypedExtensionConfig**)_upb_array_resize_accessor2(msg, UPB_SIZE(92, 184), len, UPB_SIZE(2, 3), arena);
+ return (struct envoy_config_core_v3_TypedExtensionConfig**)_upb_array_resize_accessor2(msg, UPB_SIZE(104, 200), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_config_core_v3_TypedExtensionConfig* envoy_config_bootstrap_v3_Bootstrap_add_bootstrap_extensions(envoy_config_bootstrap_v3_Bootstrap *msg, upb_arena *arena) {
struct envoy_config_core_v3_TypedExtensionConfig* sub = (struct envoy_config_core_v3_TypedExtensionConfig*)_upb_msg_new(&envoy_config_core_v3_TypedExtensionConfig_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(92, 184), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(104, 200), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
UPB_INLINE struct envoy_config_core_v3_ConfigSource** envoy_config_bootstrap_v3_Bootstrap_mutable_config_sources(envoy_config_bootstrap_v3_Bootstrap *msg, size_t *len) {
- return (struct envoy_config_core_v3_ConfigSource**)_upb_array_mutable_accessor(msg, UPB_SIZE(96, 192), len);
+ return (struct envoy_config_core_v3_ConfigSource**)_upb_array_mutable_accessor(msg, UPB_SIZE(108, 208), len);
}
UPB_INLINE struct envoy_config_core_v3_ConfigSource** envoy_config_bootstrap_v3_Bootstrap_resize_config_sources(envoy_config_bootstrap_v3_Bootstrap *msg, size_t len, upb_arena *arena) {
- return (struct envoy_config_core_v3_ConfigSource**)_upb_array_resize_accessor2(msg, UPB_SIZE(96, 192), len, UPB_SIZE(2, 3), arena);
+ return (struct envoy_config_core_v3_ConfigSource**)_upb_array_resize_accessor2(msg, UPB_SIZE(108, 208), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_config_core_v3_ConfigSource* envoy_config_bootstrap_v3_Bootstrap_add_config_sources(envoy_config_bootstrap_v3_Bootstrap *msg, upb_arena *arena) {
struct envoy_config_core_v3_ConfigSource* sub = (struct envoy_config_core_v3_ConfigSource*)_upb_msg_new(&envoy_config_core_v3_ConfigSource_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(96, 192), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(108, 208), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
UPB_INLINE void envoy_config_bootstrap_v3_Bootstrap_set_default_config_source(envoy_config_bootstrap_v3_Bootstrap *msg, struct envoy_config_core_v3_ConfigSource* value) {
_upb_sethas(msg, 14);
- *UPB_PTR_AT(msg, UPB_SIZE(80, 160), struct envoy_config_core_v3_ConfigSource*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(84, 160), struct envoy_config_core_v3_ConfigSource*) = value;
}
UPB_INLINE struct envoy_config_core_v3_ConfigSource* envoy_config_bootstrap_v3_Bootstrap_mutable_default_config_source(envoy_config_bootstrap_v3_Bootstrap *msg, upb_arena *arena) {
struct envoy_config_core_v3_ConfigSource* sub = (struct envoy_config_core_v3_ConfigSource*)envoy_config_bootstrap_v3_Bootstrap_default_config_source(msg);
@@ -430,25 +450,25 @@ UPB_INLINE struct envoy_config_core_v3_ConfigSource* envoy_config_bootstrap_v3_B
return sub;
}
UPB_INLINE void envoy_config_bootstrap_v3_Bootstrap_set_default_socket_interface(envoy_config_bootstrap_v3_Bootstrap *msg, upb_strview value) {
- *UPB_PTR_AT(msg, UPB_SIZE(20, 40), upb_strview) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(24, 40), upb_strview) = value;
}
-UPB_INLINE void envoy_config_bootstrap_v3_Bootstrap_certificate_provider_instances_clear(envoy_config_bootstrap_v3_Bootstrap *msg) { _upb_msg_map_clear(msg, UPB_SIZE(100, 200)); }
-UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_certificate_provider_instances_set(envoy_config_bootstrap_v3_Bootstrap *msg, upb_strview key, struct envoy_config_core_v3_TypedExtensionConfig* val, upb_arena *a) { return _upb_msg_map_set(msg, UPB_SIZE(100, 200), &key, 0, &val, sizeof(val), a); }
-UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_certificate_provider_instances_delete(envoy_config_bootstrap_v3_Bootstrap *msg, upb_strview key) { return _upb_msg_map_delete(msg, UPB_SIZE(100, 200), &key, 0); }
-UPB_INLINE envoy_config_bootstrap_v3_Bootstrap_CertificateProviderInstancesEntry* envoy_config_bootstrap_v3_Bootstrap_certificate_provider_instances_nextmutable(envoy_config_bootstrap_v3_Bootstrap *msg, size_t* iter) { return (envoy_config_bootstrap_v3_Bootstrap_CertificateProviderInstancesEntry*)_upb_msg_map_next(msg, UPB_SIZE(100, 200), iter); }
+UPB_INLINE void envoy_config_bootstrap_v3_Bootstrap_certificate_provider_instances_clear(envoy_config_bootstrap_v3_Bootstrap *msg) { _upb_msg_map_clear(msg, UPB_SIZE(112, 216)); }
+UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_certificate_provider_instances_set(envoy_config_bootstrap_v3_Bootstrap *msg, upb_strview key, struct envoy_config_core_v3_TypedExtensionConfig* val, upb_arena *a) { return _upb_msg_map_set(msg, UPB_SIZE(112, 216), &key, 0, &val, sizeof(val), a); }
+UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_certificate_provider_instances_delete(envoy_config_bootstrap_v3_Bootstrap *msg, upb_strview key) { return _upb_msg_map_delete(msg, UPB_SIZE(112, 216), &key, 0); }
+UPB_INLINE envoy_config_bootstrap_v3_Bootstrap_CertificateProviderInstancesEntry* envoy_config_bootstrap_v3_Bootstrap_certificate_provider_instances_nextmutable(envoy_config_bootstrap_v3_Bootstrap *msg, size_t* iter) { return (envoy_config_bootstrap_v3_Bootstrap_CertificateProviderInstancesEntry*)_upb_msg_map_next(msg, UPB_SIZE(112, 216), iter); }
UPB_INLINE upb_strview* envoy_config_bootstrap_v3_Bootstrap_mutable_node_context_params(envoy_config_bootstrap_v3_Bootstrap *msg, size_t *len) {
- return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(104, 208), len);
+ return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(116, 224), len);
}
UPB_INLINE upb_strview* envoy_config_bootstrap_v3_Bootstrap_resize_node_context_params(envoy_config_bootstrap_v3_Bootstrap *msg, size_t len, upb_arena *arena) {
- return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(104, 208), len, UPB_SIZE(3, 4), arena);
+ return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(116, 224), len, UPB_SIZE(3, 4), arena);
}
UPB_INLINE bool envoy_config_bootstrap_v3_Bootstrap_add_node_context_params(envoy_config_bootstrap_v3_Bootstrap *msg, upb_strview val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(104, 208), UPB_SIZE(3, 4), &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(116, 224), UPB_SIZE(3, 4), &val,
arena);
}
UPB_INLINE void envoy_config_bootstrap_v3_Bootstrap_set_watchdogs(envoy_config_bootstrap_v3_Bootstrap *msg, envoy_config_bootstrap_v3_Watchdogs* value) {
_upb_sethas(msg, 15);
- *UPB_PTR_AT(msg, UPB_SIZE(84, 168), envoy_config_bootstrap_v3_Watchdogs*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(88, 168), envoy_config_bootstrap_v3_Watchdogs*) = value;
}
UPB_INLINE struct envoy_config_bootstrap_v3_Watchdogs* envoy_config_bootstrap_v3_Bootstrap_mutable_watchdogs(envoy_config_bootstrap_v3_Bootstrap *msg, upb_arena *arena) {
struct envoy_config_bootstrap_v3_Watchdogs* sub = (struct envoy_config_bootstrap_v3_Watchdogs*)envoy_config_bootstrap_v3_Bootstrap_watchdogs(msg);
@@ -460,20 +480,59 @@ UPB_INLINE struct envoy_config_bootstrap_v3_Watchdogs* envoy_config_bootstrap_v3
return sub;
}
UPB_INLINE envoy_config_bootstrap_v3_FatalAction** envoy_config_bootstrap_v3_Bootstrap_mutable_fatal_actions(envoy_config_bootstrap_v3_Bootstrap *msg, size_t *len) {
- return (envoy_config_bootstrap_v3_FatalAction**)_upb_array_mutable_accessor(msg, UPB_SIZE(108, 216), len);
+ return (envoy_config_bootstrap_v3_FatalAction**)_upb_array_mutable_accessor(msg, UPB_SIZE(120, 232), len);
}
UPB_INLINE envoy_config_bootstrap_v3_FatalAction** envoy_config_bootstrap_v3_Bootstrap_resize_fatal_actions(envoy_config_bootstrap_v3_Bootstrap *msg, size_t len, upb_arena *arena) {
- return (envoy_config_bootstrap_v3_FatalAction**)_upb_array_resize_accessor2(msg, UPB_SIZE(108, 216), len, UPB_SIZE(2, 3), arena);
+ return (envoy_config_bootstrap_v3_FatalAction**)_upb_array_resize_accessor2(msg, UPB_SIZE(120, 232), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_config_bootstrap_v3_FatalAction* envoy_config_bootstrap_v3_Bootstrap_add_fatal_actions(envoy_config_bootstrap_v3_Bootstrap *msg, upb_arena *arena) {
struct envoy_config_bootstrap_v3_FatalAction* sub = (struct envoy_config_bootstrap_v3_FatalAction*)_upb_msg_new(&envoy_config_bootstrap_v3_FatalAction_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(108, 216), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(120, 232), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
UPB_INLINE void envoy_config_bootstrap_v3_Bootstrap_set_stats_flush_on_admin(envoy_config_bootstrap_v3_Bootstrap *msg, bool value) {
- UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(112, 224), value, UPB_SIZE(116, 228), 29);
+ UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(128, 248), value, UPB_SIZE(132, 252), 29);
+}
+UPB_INLINE void envoy_config_bootstrap_v3_Bootstrap_set_dns_resolution_config(envoy_config_bootstrap_v3_Bootstrap *msg, struct envoy_config_core_v3_DnsResolutionConfig* value) {
+ _upb_sethas(msg, 16);
+ *UPB_PTR_AT(msg, UPB_SIZE(92, 176), struct envoy_config_core_v3_DnsResolutionConfig*) = value;
+}
+UPB_INLINE struct envoy_config_core_v3_DnsResolutionConfig* envoy_config_bootstrap_v3_Bootstrap_mutable_dns_resolution_config(envoy_config_bootstrap_v3_Bootstrap *msg, upb_arena *arena) {
+ struct envoy_config_core_v3_DnsResolutionConfig* sub = (struct envoy_config_core_v3_DnsResolutionConfig*)envoy_config_bootstrap_v3_Bootstrap_dns_resolution_config(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_config_core_v3_DnsResolutionConfig*)_upb_msg_new(&envoy_config_core_v3_DnsResolutionConfig_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_bootstrap_v3_Bootstrap_set_dns_resolution_config(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void envoy_config_bootstrap_v3_Bootstrap_set_typed_dns_resolver_config(envoy_config_bootstrap_v3_Bootstrap *msg, struct envoy_config_core_v3_TypedExtensionConfig* value) {
+ _upb_sethas(msg, 17);
+ *UPB_PTR_AT(msg, UPB_SIZE(96, 184), struct envoy_config_core_v3_TypedExtensionConfig*) = value;
+}
+UPB_INLINE struct envoy_config_core_v3_TypedExtensionConfig* envoy_config_bootstrap_v3_Bootstrap_mutable_typed_dns_resolver_config(envoy_config_bootstrap_v3_Bootstrap *msg, upb_arena *arena) {
+ struct envoy_config_core_v3_TypedExtensionConfig* sub = (struct envoy_config_core_v3_TypedExtensionConfig*)envoy_config_bootstrap_v3_Bootstrap_typed_dns_resolver_config(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_config_core_v3_TypedExtensionConfig*)_upb_msg_new(&envoy_config_core_v3_TypedExtensionConfig_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_bootstrap_v3_Bootstrap_set_typed_dns_resolver_config(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE envoy_config_bootstrap_v3_CustomInlineHeader** envoy_config_bootstrap_v3_Bootstrap_mutable_inline_headers(envoy_config_bootstrap_v3_Bootstrap *msg, size_t *len) {
+ return (envoy_config_bootstrap_v3_CustomInlineHeader**)_upb_array_mutable_accessor(msg, UPB_SIZE(124, 240), len);
+}
+UPB_INLINE envoy_config_bootstrap_v3_CustomInlineHeader** envoy_config_bootstrap_v3_Bootstrap_resize_inline_headers(envoy_config_bootstrap_v3_Bootstrap *msg, size_t len, upb_arena *arena) {
+ return (envoy_config_bootstrap_v3_CustomInlineHeader**)_upb_array_resize_accessor2(msg, UPB_SIZE(124, 240), len, UPB_SIZE(2, 3), arena);
+}
+UPB_INLINE struct envoy_config_bootstrap_v3_CustomInlineHeader* envoy_config_bootstrap_v3_Bootstrap_add_inline_headers(envoy_config_bootstrap_v3_Bootstrap *msg, upb_arena *arena) {
+ struct envoy_config_bootstrap_v3_CustomInlineHeader* sub = (struct envoy_config_bootstrap_v3_CustomInlineHeader*)_upb_msg_new(&envoy_config_bootstrap_v3_CustomInlineHeader_msginit, arena);
+ bool ok = _upb_array_append_accessor2(
+ msg, UPB_SIZE(124, 240), UPB_SIZE(2, 3), &sub, arena);
+ if (!ok) return NULL;
+ return sub;
}
/* envoy.config.bootstrap.v3.Bootstrap.StaticResources */
@@ -662,6 +721,8 @@ UPB_INLINE bool envoy_config_bootstrap_v3_Admin_has_address(const envoy_config_b
UPB_INLINE const struct envoy_config_core_v3_Address* envoy_config_bootstrap_v3_Admin_address(const envoy_config_bootstrap_v3_Admin *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(20, 40), const struct envoy_config_core_v3_Address*); }
UPB_INLINE bool envoy_config_bootstrap_v3_Admin_has_socket_options(const envoy_config_bootstrap_v3_Admin *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(24, 48)); }
UPB_INLINE const struct envoy_config_core_v3_SocketOption* const* envoy_config_bootstrap_v3_Admin_socket_options(const envoy_config_bootstrap_v3_Admin *msg, size_t *len) { return (const struct envoy_config_core_v3_SocketOption* const*)_upb_array_accessor(msg, UPB_SIZE(24, 48), len); }
+UPB_INLINE bool envoy_config_bootstrap_v3_Admin_has_access_log(const envoy_config_bootstrap_v3_Admin *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(28, 56)); }
+UPB_INLINE const struct envoy_config_accesslog_v3_AccessLog* const* envoy_config_bootstrap_v3_Admin_access_log(const envoy_config_bootstrap_v3_Admin *msg, size_t *len) { return (const struct envoy_config_accesslog_v3_AccessLog* const*)_upb_array_accessor(msg, UPB_SIZE(28, 56), len); }
UPB_INLINE void envoy_config_bootstrap_v3_Admin_set_access_log_path(envoy_config_bootstrap_v3_Admin *msg, upb_strview value) {
*UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview) = value;
@@ -695,6 +756,19 @@ UPB_INLINE struct envoy_config_core_v3_SocketOption* envoy_config_bootstrap_v3_A
if (!ok) return NULL;
return sub;
}
+UPB_INLINE struct envoy_config_accesslog_v3_AccessLog** envoy_config_bootstrap_v3_Admin_mutable_access_log(envoy_config_bootstrap_v3_Admin *msg, size_t *len) {
+ return (struct envoy_config_accesslog_v3_AccessLog**)_upb_array_mutable_accessor(msg, UPB_SIZE(28, 56), len);
+}
+UPB_INLINE struct envoy_config_accesslog_v3_AccessLog** envoy_config_bootstrap_v3_Admin_resize_access_log(envoy_config_bootstrap_v3_Admin *msg, size_t len, upb_arena *arena) {
+ return (struct envoy_config_accesslog_v3_AccessLog**)_upb_array_resize_accessor2(msg, UPB_SIZE(28, 56), len, UPB_SIZE(2, 3), arena);
+}
+UPB_INLINE struct envoy_config_accesslog_v3_AccessLog* envoy_config_bootstrap_v3_Admin_add_access_log(envoy_config_bootstrap_v3_Admin *msg, upb_arena *arena) {
+ struct envoy_config_accesslog_v3_AccessLog* sub = (struct envoy_config_accesslog_v3_AccessLog*)_upb_msg_new(&envoy_config_accesslog_v3_AccessLog_msginit, arena);
+ bool ok = _upb_array_append_accessor2(
+ msg, UPB_SIZE(28, 56), UPB_SIZE(2, 3), &sub, arena);
+ if (!ok) return NULL;
+ return sub;
+}
/* envoy.config.bootstrap.v3.ClusterManager */
@@ -1339,6 +1413,36 @@ UPB_INLINE struct envoy_config_bootstrap_v3_RuntimeLayer* envoy_config_bootstrap
return sub;
}
+/* envoy.config.bootstrap.v3.CustomInlineHeader */
+
+UPB_INLINE envoy_config_bootstrap_v3_CustomInlineHeader *envoy_config_bootstrap_v3_CustomInlineHeader_new(upb_arena *arena) {
+ return (envoy_config_bootstrap_v3_CustomInlineHeader *)_upb_msg_new(&envoy_config_bootstrap_v3_CustomInlineHeader_msginit, arena);
+}
+UPB_INLINE envoy_config_bootstrap_v3_CustomInlineHeader *envoy_config_bootstrap_v3_CustomInlineHeader_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ envoy_config_bootstrap_v3_CustomInlineHeader *ret = envoy_config_bootstrap_v3_CustomInlineHeader_new(arena);
+ return (ret && upb_decode(buf, size, ret, &envoy_config_bootstrap_v3_CustomInlineHeader_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE envoy_config_bootstrap_v3_CustomInlineHeader *envoy_config_bootstrap_v3_CustomInlineHeader_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ envoy_config_bootstrap_v3_CustomInlineHeader *ret = envoy_config_bootstrap_v3_CustomInlineHeader_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &envoy_config_bootstrap_v3_CustomInlineHeader_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *envoy_config_bootstrap_v3_CustomInlineHeader_serialize(const envoy_config_bootstrap_v3_CustomInlineHeader *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &envoy_config_bootstrap_v3_CustomInlineHeader_msginit, arena, len);
+}
+
+UPB_INLINE upb_strview envoy_config_bootstrap_v3_CustomInlineHeader_inline_header_name(const envoy_config_bootstrap_v3_CustomInlineHeader *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview); }
+UPB_INLINE int32_t envoy_config_bootstrap_v3_CustomInlineHeader_inline_header_type(const envoy_config_bootstrap_v3_CustomInlineHeader *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(0, 0), int32_t); }
+
+UPB_INLINE void envoy_config_bootstrap_v3_CustomInlineHeader_set_inline_header_name(envoy_config_bootstrap_v3_CustomInlineHeader *msg, upb_strview value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview) = value;
+}
+UPB_INLINE void envoy_config_bootstrap_v3_CustomInlineHeader_set_inline_header_type(envoy_config_bootstrap_v3_CustomInlineHeader *msg, int32_t value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(0, 0), int32_t) = value;
+}
+
#ifdef __cplusplus
} /* extern "C" */
#endif
diff --git a/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c b/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c
index 8854ed024e..1d7e99267c 100644
--- a/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c
+++ b/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c
@@ -18,6 +18,7 @@
#include "envoy/config/core/v3/extension.upb.h"
#include "envoy/config/core/v3/health_check.upb.h"
#include "envoy/config/core/v3/protocol.upb.h"
+#include "envoy/config/core/v3/resolver.upb.h"
#include "envoy/config/endpoint/v3/endpoint.upb.h"
#include "envoy/type/v3/percent.upb.h"
#include "google/protobuf/any.upb.h"
@@ -25,6 +26,8 @@
#include "google/protobuf/struct.upb.h"
#include "google/protobuf/wrappers.upb.h"
#include "xds/core/v3/collection_entry.upb.h"
+#include "envoy/annotations/deprecation.upb.h"
+#include "udpa/annotations/migrate.upb.h"
#include "udpa/annotations/security.upb.h"
#include "udpa/annotations/status.upb.h"
#include "udpa/annotations/versioning.upb.h"
@@ -46,7 +49,7 @@ const upb_msglayout envoy_config_cluster_v3_ClusterCollection_msginit = {
UPB_SIZE(8, 16), 1, false, 255,
};
-static const upb_msglayout *const envoy_config_cluster_v3_Cluster_submsgs[32] = {
+static const upb_msglayout *const envoy_config_cluster_v3_Cluster_submsgs[34] = {
&envoy_config_cluster_v3_CircuitBreakers_msginit,
&envoy_config_cluster_v3_Cluster_CommonLbConfig_msginit,
&envoy_config_cluster_v3_Cluster_CustomClusterType_msginit,
@@ -68,6 +71,7 @@ static const upb_msglayout *const envoy_config_cluster_v3_Cluster_submsgs[32] =
&envoy_config_core_v3_Address_msginit,
&envoy_config_core_v3_BindConfig_msginit,
&envoy_config_core_v3_ConfigSource_msginit,
+ &envoy_config_core_v3_DnsResolutionConfig_msginit,
&envoy_config_core_v3_HealthCheck_msginit,
&envoy_config_core_v3_Http1ProtocolOptions_msginit,
&envoy_config_core_v3_Http2ProtocolOptions_msginit,
@@ -77,64 +81,68 @@ static const upb_msglayout *const envoy_config_cluster_v3_Cluster_submsgs[32] =
&envoy_config_core_v3_TypedExtensionConfig_msginit,
&envoy_config_core_v3_UpstreamHttpProtocolOptions_msginit,
&envoy_config_endpoint_v3_ClusterLoadAssignment_msginit,
+ &google_protobuf_BoolValue_msginit,
&google_protobuf_Duration_msginit,
&google_protobuf_UInt32Value_msginit,
};
-static const upb_msglayout_field envoy_config_cluster_v3_Cluster__fields[47] = {
+static const upb_msglayout_field envoy_config_cluster_v3_Cluster__fields[50] = {
{1, UPB_SIZE(24, 24), 0, 0, 9, 1},
- {2, UPB_SIZE(160, 296), UPB_SIZE(-165, -305), 0, 14, 1},
+ {2, UPB_SIZE(172, 320), UPB_SIZE(-177, -329), 0, 14, 1},
{3, UPB_SIZE(40, 56), 1, 3, 11, 1},
- {4, UPB_SIZE(44, 64), 2, 30, 11, 1},
- {5, UPB_SIZE(48, 72), 3, 31, 11, 1},
+ {4, UPB_SIZE(44, 64), 2, 32, 11, 1},
+ {5, UPB_SIZE(48, 72), 3, 33, 11, 1},
{6, UPB_SIZE(4, 4), 0, 0, 14, 1},
- {8, UPB_SIZE(140, 256), 0, 21, 11, 3},
- {9, UPB_SIZE(52, 80), 4, 31, 11, 1},
+ {8, UPB_SIZE(152, 280), 0, 22, 11, 3},
+ {9, UPB_SIZE(52, 80), 4, 33, 11, 1},
{10, UPB_SIZE(56, 88), 5, 0, 11, 1},
- {13, UPB_SIZE(60, 96), 6, 22, 11, 1},
- {14, UPB_SIZE(64, 104), 7, 23, 11, 1},
- {16, UPB_SIZE(68, 112), 8, 30, 11, 1},
+ {13, UPB_SIZE(60, 96), 6, 23, 11, 1},
+ {14, UPB_SIZE(64, 104), 7, 24, 11, 1},
+ {16, UPB_SIZE(68, 112), 8, 32, 11, 1},
{17, UPB_SIZE(8, 8), 0, 0, 14, 1},
- {18, UPB_SIZE(144, 264), 0, 18, 11, 3},
+ {18, UPB_SIZE(156, 288), 0, 18, 11, 3},
{19, UPB_SIZE(72, 120), 9, 15, 11, 1},
- {20, UPB_SIZE(76, 128), 10, 30, 11, 1},
+ {20, UPB_SIZE(76, 128), 10, 32, 11, 1},
{21, UPB_SIZE(80, 136), 11, 19, 11, 1},
{22, UPB_SIZE(84, 144), 12, 4, 11, 1},
- {23, UPB_SIZE(168, 312), UPB_SIZE(-173, -321), 10, 11, 1},
- {24, UPB_SIZE(88, 152), 13, 26, 11, 1},
- {25, UPB_SIZE(92, 160), 14, 25, 11, 1},
+ {23, UPB_SIZE(180, 336), UPB_SIZE(-185, -345), 10, 11, 1},
+ {24, UPB_SIZE(88, 152), 13, 27, 11, 1},
+ {25, UPB_SIZE(92, 160), 14, 26, 11, 1},
{26, UPB_SIZE(12, 12), 0, 0, 14, 1},
{27, UPB_SIZE(96, 168), 15, 1, 11, 1},
{28, UPB_SIZE(32, 40), 0, 0, 9, 1},
- {29, UPB_SIZE(100, 176), 16, 24, 11, 1},
+ {29, UPB_SIZE(100, 176), 16, 25, 11, 1},
{30, UPB_SIZE(104, 184), 17, 17, 11, 1},
{31, UPB_SIZE(16, 16), 0, 0, 8, 1},
{32, UPB_SIZE(17, 17), 0, 0, 8, 1},
- {33, UPB_SIZE(108, 192), 18, 29, 11, 1},
- {34, UPB_SIZE(168, 312), UPB_SIZE(-173, -321), 7, 11, 1},
- {36, UPB_SIZE(148, 272), 0, 12, 11, _UPB_LABEL_MAP},
- {37, UPB_SIZE(168, 312), UPB_SIZE(-173, -321), 5, 11, 1},
- {38, UPB_SIZE(160, 296), UPB_SIZE(-165, -305), 2, 11, 1},
+ {33, UPB_SIZE(108, 192), 18, 30, 11, 1},
+ {34, UPB_SIZE(180, 336), UPB_SIZE(-185, -345), 7, 11, 1},
+ {36, UPB_SIZE(160, 296), 0, 12, 11, _UPB_LABEL_MAP},
+ {37, UPB_SIZE(180, 336), UPB_SIZE(-185, -345), 5, 11, 1},
+ {38, UPB_SIZE(172, 320), UPB_SIZE(-177, -329), 2, 11, 1},
{39, UPB_SIZE(18, 18), 0, 0, 8, 1},
- {40, UPB_SIZE(152, 280), 0, 13, 11, 3},
+ {40, UPB_SIZE(164, 304), 0, 13, 11, 3},
{41, UPB_SIZE(112, 200), 19, 14, 11, 1},
{42, UPB_SIZE(116, 208), 20, 20, 11, 1},
- {43, UPB_SIZE(156, 288), 0, 11, 11, 3},
+ {43, UPB_SIZE(168, 312), 0, 11, 11, 3},
{44, UPB_SIZE(120, 216), 21, 9, 11, 1},
{45, UPB_SIZE(19, 19), 0, 0, 8, 1},
- {46, UPB_SIZE(124, 224), 22, 28, 11, 1},
+ {46, UPB_SIZE(124, 224), 22, 29, 11, 1},
{47, UPB_SIZE(20, 20), 0, 0, 8, 1},
- {48, UPB_SIZE(128, 232), 23, 27, 11, 1},
+ {48, UPB_SIZE(128, 232), 23, 28, 11, 1},
{49, UPB_SIZE(132, 240), 24, 16, 11, 1},
{50, UPB_SIZE(136, 248), 25, 8, 11, 1},
{51, UPB_SIZE(21, 21), 0, 0, 8, 1},
- {52, UPB_SIZE(168, 312), UPB_SIZE(-173, -321), 6, 11, 1},
+ {52, UPB_SIZE(180, 336), UPB_SIZE(-185, -345), 6, 11, 1},
+ {53, UPB_SIZE(140, 256), 26, 21, 11, 1},
+ {54, UPB_SIZE(144, 264), 27, 31, 11, 1},
+ {55, UPB_SIZE(148, 272), 28, 28, 11, 1},
};
const upb_msglayout envoy_config_cluster_v3_Cluster_msginit = {
&envoy_config_cluster_v3_Cluster_submsgs[0],
&envoy_config_cluster_v3_Cluster__fields[0],
- UPB_SIZE(176, 336), 47, false, 255,
+ UPB_SIZE(192, 352), 50, false, 255,
};
static const upb_msglayout *const envoy_config_cluster_v3_Cluster_TransportSocketMatch_submsgs[2] = {
diff --git a/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h b/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h
index da4d62066a..84feca0618 100644
--- a/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h
+++ b/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h
@@ -95,6 +95,7 @@ struct envoy_config_cluster_v3_OutlierDetection;
struct envoy_config_core_v3_Address;
struct envoy_config_core_v3_BindConfig;
struct envoy_config_core_v3_ConfigSource;
+struct envoy_config_core_v3_DnsResolutionConfig;
struct envoy_config_core_v3_HealthCheck;
struct envoy_config_core_v3_Http1ProtocolOptions;
struct envoy_config_core_v3_Http2ProtocolOptions;
@@ -108,6 +109,7 @@ struct envoy_config_core_v3_UpstreamHttpProtocolOptions;
struct envoy_config_endpoint_v3_ClusterLoadAssignment;
struct envoy_type_v3_Percent;
struct google_protobuf_Any;
+struct google_protobuf_BoolValue;
struct google_protobuf_DoubleValue;
struct google_protobuf_Duration;
struct google_protobuf_Struct;
@@ -120,6 +122,7 @@ extern const upb_msglayout envoy_config_cluster_v3_OutlierDetection_msginit;
extern const upb_msglayout envoy_config_core_v3_Address_msginit;
extern const upb_msglayout envoy_config_core_v3_BindConfig_msginit;
extern const upb_msglayout envoy_config_core_v3_ConfigSource_msginit;
+extern const upb_msglayout envoy_config_core_v3_DnsResolutionConfig_msginit;
extern const upb_msglayout envoy_config_core_v3_HealthCheck_msginit;
extern const upb_msglayout envoy_config_core_v3_Http1ProtocolOptions_msginit;
extern const upb_msglayout envoy_config_core_v3_Http2ProtocolOptions_msginit;
@@ -133,6 +136,7 @@ extern const upb_msglayout envoy_config_core_v3_UpstreamHttpProtocolOptions_msgi
extern const upb_msglayout envoy_config_endpoint_v3_ClusterLoadAssignment_msginit;
extern const upb_msglayout envoy_type_v3_Percent_msginit;
extern const upb_msglayout google_protobuf_Any_msginit;
+extern const upb_msglayout google_protobuf_BoolValue_msginit;
extern const upb_msglayout google_protobuf_DoubleValue_msginit;
extern const upb_msglayout google_protobuf_Duration_msginit;
extern const upb_msglayout google_protobuf_Struct_msginit;
@@ -251,7 +255,7 @@ typedef enum {
envoy_config_cluster_v3_Cluster_cluster_discovery_type_cluster_type = 38,
envoy_config_cluster_v3_Cluster_cluster_discovery_type_NOT_SET = 0
} envoy_config_cluster_v3_Cluster_cluster_discovery_type_oneofcases;
-UPB_INLINE envoy_config_cluster_v3_Cluster_cluster_discovery_type_oneofcases envoy_config_cluster_v3_Cluster_cluster_discovery_type_case(const envoy_config_cluster_v3_Cluster* msg) { return (envoy_config_cluster_v3_Cluster_cluster_discovery_type_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(164, 304), int32_t); }
+UPB_INLINE envoy_config_cluster_v3_Cluster_cluster_discovery_type_oneofcases envoy_config_cluster_v3_Cluster_cluster_discovery_type_case(const envoy_config_cluster_v3_Cluster* msg) { return (envoy_config_cluster_v3_Cluster_cluster_discovery_type_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(176, 328), int32_t); }
typedef enum {
envoy_config_cluster_v3_Cluster_lb_config_ring_hash_lb_config = 23,
@@ -260,11 +264,11 @@ typedef enum {
envoy_config_cluster_v3_Cluster_lb_config_least_request_lb_config = 37,
envoy_config_cluster_v3_Cluster_lb_config_NOT_SET = 0
} envoy_config_cluster_v3_Cluster_lb_config_oneofcases;
-UPB_INLINE envoy_config_cluster_v3_Cluster_lb_config_oneofcases envoy_config_cluster_v3_Cluster_lb_config_case(const envoy_config_cluster_v3_Cluster* msg) { return (envoy_config_cluster_v3_Cluster_lb_config_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(172, 320), int32_t); }
+UPB_INLINE envoy_config_cluster_v3_Cluster_lb_config_oneofcases envoy_config_cluster_v3_Cluster_lb_config_case(const envoy_config_cluster_v3_Cluster* msg) { return (envoy_config_cluster_v3_Cluster_lb_config_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(184, 344), int32_t); }
UPB_INLINE upb_strview envoy_config_cluster_v3_Cluster_name(const envoy_config_cluster_v3_Cluster *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(24, 24), upb_strview); }
-UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_type(const envoy_config_cluster_v3_Cluster *msg) { return _upb_getoneofcase(msg, UPB_SIZE(164, 304)) == 2; }
-UPB_INLINE int32_t envoy_config_cluster_v3_Cluster_type(const envoy_config_cluster_v3_Cluster *msg) { return UPB_READ_ONEOF(msg, int32_t, UPB_SIZE(160, 296), UPB_SIZE(164, 304), 2, 0); }
+UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_type(const envoy_config_cluster_v3_Cluster *msg) { return _upb_getoneofcase(msg, UPB_SIZE(176, 328)) == 2; }
+UPB_INLINE int32_t envoy_config_cluster_v3_Cluster_type(const envoy_config_cluster_v3_Cluster *msg) { return UPB_READ_ONEOF(msg, int32_t, UPB_SIZE(172, 320), UPB_SIZE(176, 328), 2, 0); }
UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_eds_cluster_config(const envoy_config_cluster_v3_Cluster *msg) { return _upb_hasbit(msg, 1); }
UPB_INLINE const envoy_config_cluster_v3_Cluster_EdsClusterConfig* envoy_config_cluster_v3_Cluster_eds_cluster_config(const envoy_config_cluster_v3_Cluster *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(40, 56), const envoy_config_cluster_v3_Cluster_EdsClusterConfig*); }
UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_connect_timeout(const envoy_config_cluster_v3_Cluster *msg) { return _upb_hasbit(msg, 2); }
@@ -272,8 +276,8 @@ UPB_INLINE const struct google_protobuf_Duration* envoy_config_cluster_v3_Cluste
UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_per_connection_buffer_limit_bytes(const envoy_config_cluster_v3_Cluster *msg) { return _upb_hasbit(msg, 3); }
UPB_INLINE const struct google_protobuf_UInt32Value* envoy_config_cluster_v3_Cluster_per_connection_buffer_limit_bytes(const envoy_config_cluster_v3_Cluster *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(48, 72), const struct google_protobuf_UInt32Value*); }
UPB_INLINE int32_t envoy_config_cluster_v3_Cluster_lb_policy(const envoy_config_cluster_v3_Cluster *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 4), int32_t); }
-UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_health_checks(const envoy_config_cluster_v3_Cluster *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(140, 256)); }
-UPB_INLINE const struct envoy_config_core_v3_HealthCheck* const* envoy_config_cluster_v3_Cluster_health_checks(const envoy_config_cluster_v3_Cluster *msg, size_t *len) { return (const struct envoy_config_core_v3_HealthCheck* const*)_upb_array_accessor(msg, UPB_SIZE(140, 256), len); }
+UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_health_checks(const envoy_config_cluster_v3_Cluster *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(152, 280)); }
+UPB_INLINE const struct envoy_config_core_v3_HealthCheck* const* envoy_config_cluster_v3_Cluster_health_checks(const envoy_config_cluster_v3_Cluster *msg, size_t *len) { return (const struct envoy_config_core_v3_HealthCheck* const*)_upb_array_accessor(msg, UPB_SIZE(152, 280), len); }
UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_max_requests_per_connection(const envoy_config_cluster_v3_Cluster *msg) { return _upb_hasbit(msg, 4); }
UPB_INLINE const struct google_protobuf_UInt32Value* envoy_config_cluster_v3_Cluster_max_requests_per_connection(const envoy_config_cluster_v3_Cluster *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(52, 80), const struct google_protobuf_UInt32Value*); }
UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_circuit_breakers(const envoy_config_cluster_v3_Cluster *msg) { return _upb_hasbit(msg, 5); }
@@ -285,8 +289,8 @@ UPB_INLINE const struct envoy_config_core_v3_Http2ProtocolOptions* envoy_config_
UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_dns_refresh_rate(const envoy_config_cluster_v3_Cluster *msg) { return _upb_hasbit(msg, 8); }
UPB_INLINE const struct google_protobuf_Duration* envoy_config_cluster_v3_Cluster_dns_refresh_rate(const envoy_config_cluster_v3_Cluster *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(68, 112), const struct google_protobuf_Duration*); }
UPB_INLINE int32_t envoy_config_cluster_v3_Cluster_dns_lookup_family(const envoy_config_cluster_v3_Cluster *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(8, 8), int32_t); }
-UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_dns_resolvers(const envoy_config_cluster_v3_Cluster *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(144, 264)); }
-UPB_INLINE const struct envoy_config_core_v3_Address* const* envoy_config_cluster_v3_Cluster_dns_resolvers(const envoy_config_cluster_v3_Cluster *msg, size_t *len) { return (const struct envoy_config_core_v3_Address* const*)_upb_array_accessor(msg, UPB_SIZE(144, 264), len); }
+UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_dns_resolvers(const envoy_config_cluster_v3_Cluster *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(156, 288)); }
+UPB_INLINE const struct envoy_config_core_v3_Address* const* envoy_config_cluster_v3_Cluster_dns_resolvers(const envoy_config_cluster_v3_Cluster *msg, size_t *len) { return (const struct envoy_config_core_v3_Address* const*)_upb_array_accessor(msg, UPB_SIZE(156, 288), len); }
UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_outlier_detection(const envoy_config_cluster_v3_Cluster *msg) { return _upb_hasbit(msg, 9); }
UPB_INLINE const struct envoy_config_cluster_v3_OutlierDetection* envoy_config_cluster_v3_Cluster_outlier_detection(const envoy_config_cluster_v3_Cluster *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(72, 120), const struct envoy_config_cluster_v3_OutlierDetection*); }
UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_cleanup_interval(const envoy_config_cluster_v3_Cluster *msg) { return _upb_hasbit(msg, 10); }
@@ -295,8 +299,8 @@ UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_upstream_bind_config(const e
UPB_INLINE const struct envoy_config_core_v3_BindConfig* envoy_config_cluster_v3_Cluster_upstream_bind_config(const envoy_config_cluster_v3_Cluster *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(80, 136), const struct envoy_config_core_v3_BindConfig*); }
UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_lb_subset_config(const envoy_config_cluster_v3_Cluster *msg) { return _upb_hasbit(msg, 12); }
UPB_INLINE const envoy_config_cluster_v3_Cluster_LbSubsetConfig* envoy_config_cluster_v3_Cluster_lb_subset_config(const envoy_config_cluster_v3_Cluster *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(84, 144), const envoy_config_cluster_v3_Cluster_LbSubsetConfig*); }
-UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_ring_hash_lb_config(const envoy_config_cluster_v3_Cluster *msg) { return _upb_getoneofcase(msg, UPB_SIZE(172, 320)) == 23; }
-UPB_INLINE const envoy_config_cluster_v3_Cluster_RingHashLbConfig* envoy_config_cluster_v3_Cluster_ring_hash_lb_config(const envoy_config_cluster_v3_Cluster *msg) { return UPB_READ_ONEOF(msg, const envoy_config_cluster_v3_Cluster_RingHashLbConfig*, UPB_SIZE(168, 312), UPB_SIZE(172, 320), 23, NULL); }
+UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_ring_hash_lb_config(const envoy_config_cluster_v3_Cluster *msg) { return _upb_getoneofcase(msg, UPB_SIZE(184, 344)) == 23; }
+UPB_INLINE const envoy_config_cluster_v3_Cluster_RingHashLbConfig* envoy_config_cluster_v3_Cluster_ring_hash_lb_config(const envoy_config_cluster_v3_Cluster *msg) { return UPB_READ_ONEOF(msg, const envoy_config_cluster_v3_Cluster_RingHashLbConfig*, UPB_SIZE(180, 336), UPB_SIZE(184, 344), 23, NULL); }
UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_transport_socket(const envoy_config_cluster_v3_Cluster *msg) { return _upb_hasbit(msg, 13); }
UPB_INLINE const struct envoy_config_core_v3_TransportSocket* envoy_config_cluster_v3_Cluster_transport_socket(const envoy_config_cluster_v3_Cluster *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(88, 152), const struct envoy_config_core_v3_TransportSocket*); }
UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_metadata(const envoy_config_cluster_v3_Cluster *msg) { return _upb_hasbit(msg, 14); }
@@ -313,25 +317,25 @@ UPB_INLINE bool envoy_config_cluster_v3_Cluster_close_connections_on_host_health
UPB_INLINE bool envoy_config_cluster_v3_Cluster_ignore_health_on_host_removal(const envoy_config_cluster_v3_Cluster *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(17, 17), bool); }
UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_load_assignment(const envoy_config_cluster_v3_Cluster *msg) { return _upb_hasbit(msg, 18); }
UPB_INLINE const struct envoy_config_endpoint_v3_ClusterLoadAssignment* envoy_config_cluster_v3_Cluster_load_assignment(const envoy_config_cluster_v3_Cluster *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(108, 192), const struct envoy_config_endpoint_v3_ClusterLoadAssignment*); }
-UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_original_dst_lb_config(const envoy_config_cluster_v3_Cluster *msg) { return _upb_getoneofcase(msg, UPB_SIZE(172, 320)) == 34; }
-UPB_INLINE const envoy_config_cluster_v3_Cluster_OriginalDstLbConfig* envoy_config_cluster_v3_Cluster_original_dst_lb_config(const envoy_config_cluster_v3_Cluster *msg) { return UPB_READ_ONEOF(msg, const envoy_config_cluster_v3_Cluster_OriginalDstLbConfig*, UPB_SIZE(168, 312), UPB_SIZE(172, 320), 34, NULL); }
-UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_typed_extension_protocol_options(const envoy_config_cluster_v3_Cluster *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(148, 272)); }
-UPB_INLINE size_t envoy_config_cluster_v3_Cluster_typed_extension_protocol_options_size(const envoy_config_cluster_v3_Cluster *msg) {return _upb_msg_map_size(msg, UPB_SIZE(148, 272)); }
-UPB_INLINE bool envoy_config_cluster_v3_Cluster_typed_extension_protocol_options_get(const envoy_config_cluster_v3_Cluster *msg, upb_strview key, struct google_protobuf_Any* *val) { return _upb_msg_map_get(msg, UPB_SIZE(148, 272), &key, 0, val, sizeof(*val)); }
-UPB_INLINE const envoy_config_cluster_v3_Cluster_TypedExtensionProtocolOptionsEntry* envoy_config_cluster_v3_Cluster_typed_extension_protocol_options_next(const envoy_config_cluster_v3_Cluster *msg, size_t* iter) { return (const envoy_config_cluster_v3_Cluster_TypedExtensionProtocolOptionsEntry*)_upb_msg_map_next(msg, UPB_SIZE(148, 272), iter); }
-UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_least_request_lb_config(const envoy_config_cluster_v3_Cluster *msg) { return _upb_getoneofcase(msg, UPB_SIZE(172, 320)) == 37; }
-UPB_INLINE const envoy_config_cluster_v3_Cluster_LeastRequestLbConfig* envoy_config_cluster_v3_Cluster_least_request_lb_config(const envoy_config_cluster_v3_Cluster *msg) { return UPB_READ_ONEOF(msg, const envoy_config_cluster_v3_Cluster_LeastRequestLbConfig*, UPB_SIZE(168, 312), UPB_SIZE(172, 320), 37, NULL); }
-UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_cluster_type(const envoy_config_cluster_v3_Cluster *msg) { return _upb_getoneofcase(msg, UPB_SIZE(164, 304)) == 38; }
-UPB_INLINE const envoy_config_cluster_v3_Cluster_CustomClusterType* envoy_config_cluster_v3_Cluster_cluster_type(const envoy_config_cluster_v3_Cluster *msg) { return UPB_READ_ONEOF(msg, const envoy_config_cluster_v3_Cluster_CustomClusterType*, UPB_SIZE(160, 296), UPB_SIZE(164, 304), 38, NULL); }
+UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_original_dst_lb_config(const envoy_config_cluster_v3_Cluster *msg) { return _upb_getoneofcase(msg, UPB_SIZE(184, 344)) == 34; }
+UPB_INLINE const envoy_config_cluster_v3_Cluster_OriginalDstLbConfig* envoy_config_cluster_v3_Cluster_original_dst_lb_config(const envoy_config_cluster_v3_Cluster *msg) { return UPB_READ_ONEOF(msg, const envoy_config_cluster_v3_Cluster_OriginalDstLbConfig*, UPB_SIZE(180, 336), UPB_SIZE(184, 344), 34, NULL); }
+UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_typed_extension_protocol_options(const envoy_config_cluster_v3_Cluster *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(160, 296)); }
+UPB_INLINE size_t envoy_config_cluster_v3_Cluster_typed_extension_protocol_options_size(const envoy_config_cluster_v3_Cluster *msg) {return _upb_msg_map_size(msg, UPB_SIZE(160, 296)); }
+UPB_INLINE bool envoy_config_cluster_v3_Cluster_typed_extension_protocol_options_get(const envoy_config_cluster_v3_Cluster *msg, upb_strview key, struct google_protobuf_Any* *val) { return _upb_msg_map_get(msg, UPB_SIZE(160, 296), &key, 0, val, sizeof(*val)); }
+UPB_INLINE const envoy_config_cluster_v3_Cluster_TypedExtensionProtocolOptionsEntry* envoy_config_cluster_v3_Cluster_typed_extension_protocol_options_next(const envoy_config_cluster_v3_Cluster *msg, size_t* iter) { return (const envoy_config_cluster_v3_Cluster_TypedExtensionProtocolOptionsEntry*)_upb_msg_map_next(msg, UPB_SIZE(160, 296), iter); }
+UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_least_request_lb_config(const envoy_config_cluster_v3_Cluster *msg) { return _upb_getoneofcase(msg, UPB_SIZE(184, 344)) == 37; }
+UPB_INLINE const envoy_config_cluster_v3_Cluster_LeastRequestLbConfig* envoy_config_cluster_v3_Cluster_least_request_lb_config(const envoy_config_cluster_v3_Cluster *msg) { return UPB_READ_ONEOF(msg, const envoy_config_cluster_v3_Cluster_LeastRequestLbConfig*, UPB_SIZE(180, 336), UPB_SIZE(184, 344), 37, NULL); }
+UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_cluster_type(const envoy_config_cluster_v3_Cluster *msg) { return _upb_getoneofcase(msg, UPB_SIZE(176, 328)) == 38; }
+UPB_INLINE const envoy_config_cluster_v3_Cluster_CustomClusterType* envoy_config_cluster_v3_Cluster_cluster_type(const envoy_config_cluster_v3_Cluster *msg) { return UPB_READ_ONEOF(msg, const envoy_config_cluster_v3_Cluster_CustomClusterType*, UPB_SIZE(172, 320), UPB_SIZE(176, 328), 38, NULL); }
UPB_INLINE bool envoy_config_cluster_v3_Cluster_respect_dns_ttl(const envoy_config_cluster_v3_Cluster *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(18, 18), bool); }
-UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_filters(const envoy_config_cluster_v3_Cluster *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(152, 280)); }
-UPB_INLINE const struct envoy_config_cluster_v3_Filter* const* envoy_config_cluster_v3_Cluster_filters(const envoy_config_cluster_v3_Cluster *msg, size_t *len) { return (const struct envoy_config_cluster_v3_Filter* const*)_upb_array_accessor(msg, UPB_SIZE(152, 280), len); }
+UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_filters(const envoy_config_cluster_v3_Cluster *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(164, 304)); }
+UPB_INLINE const struct envoy_config_cluster_v3_Filter* const* envoy_config_cluster_v3_Cluster_filters(const envoy_config_cluster_v3_Cluster *msg, size_t *len) { return (const struct envoy_config_cluster_v3_Filter* const*)_upb_array_accessor(msg, UPB_SIZE(164, 304), len); }
UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_load_balancing_policy(const envoy_config_cluster_v3_Cluster *msg) { return _upb_hasbit(msg, 19); }
UPB_INLINE const envoy_config_cluster_v3_LoadBalancingPolicy* envoy_config_cluster_v3_Cluster_load_balancing_policy(const envoy_config_cluster_v3_Cluster *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(112, 200), const envoy_config_cluster_v3_LoadBalancingPolicy*); }
UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_lrs_server(const envoy_config_cluster_v3_Cluster *msg) { return _upb_hasbit(msg, 20); }
UPB_INLINE const struct envoy_config_core_v3_ConfigSource* envoy_config_cluster_v3_Cluster_lrs_server(const envoy_config_cluster_v3_Cluster *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(116, 208), const struct envoy_config_core_v3_ConfigSource*); }
-UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_transport_socket_matches(const envoy_config_cluster_v3_Cluster *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(156, 288)); }
-UPB_INLINE const envoy_config_cluster_v3_Cluster_TransportSocketMatch* const* envoy_config_cluster_v3_Cluster_transport_socket_matches(const envoy_config_cluster_v3_Cluster *msg, size_t *len) { return (const envoy_config_cluster_v3_Cluster_TransportSocketMatch* const*)_upb_array_accessor(msg, UPB_SIZE(156, 288), len); }
+UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_transport_socket_matches(const envoy_config_cluster_v3_Cluster *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(168, 312)); }
+UPB_INLINE const envoy_config_cluster_v3_Cluster_TransportSocketMatch* const* envoy_config_cluster_v3_Cluster_transport_socket_matches(const envoy_config_cluster_v3_Cluster *msg, size_t *len) { return (const envoy_config_cluster_v3_Cluster_TransportSocketMatch* const*)_upb_array_accessor(msg, UPB_SIZE(168, 312), len); }
UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_dns_failure_refresh_rate(const envoy_config_cluster_v3_Cluster *msg) { return _upb_hasbit(msg, 21); }
UPB_INLINE const envoy_config_cluster_v3_Cluster_RefreshRate* envoy_config_cluster_v3_Cluster_dns_failure_refresh_rate(const envoy_config_cluster_v3_Cluster *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(120, 216), const envoy_config_cluster_v3_Cluster_RefreshRate*); }
UPB_INLINE bool envoy_config_cluster_v3_Cluster_use_tcp_for_dns_lookups(const envoy_config_cluster_v3_Cluster *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(19, 19), bool); }
@@ -345,14 +349,20 @@ UPB_INLINE const envoy_config_cluster_v3_TrackClusterStats* envoy_config_cluster
UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_preconnect_policy(const envoy_config_cluster_v3_Cluster *msg) { return _upb_hasbit(msg, 25); }
UPB_INLINE const envoy_config_cluster_v3_Cluster_PreconnectPolicy* envoy_config_cluster_v3_Cluster_preconnect_policy(const envoy_config_cluster_v3_Cluster *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(136, 248), const envoy_config_cluster_v3_Cluster_PreconnectPolicy*); }
UPB_INLINE bool envoy_config_cluster_v3_Cluster_connection_pool_per_downstream_connection(const envoy_config_cluster_v3_Cluster *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(21, 21), bool); }
-UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_maglev_lb_config(const envoy_config_cluster_v3_Cluster *msg) { return _upb_getoneofcase(msg, UPB_SIZE(172, 320)) == 52; }
-UPB_INLINE const envoy_config_cluster_v3_Cluster_MaglevLbConfig* envoy_config_cluster_v3_Cluster_maglev_lb_config(const envoy_config_cluster_v3_Cluster *msg) { return UPB_READ_ONEOF(msg, const envoy_config_cluster_v3_Cluster_MaglevLbConfig*, UPB_SIZE(168, 312), UPB_SIZE(172, 320), 52, NULL); }
+UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_maglev_lb_config(const envoy_config_cluster_v3_Cluster *msg) { return _upb_getoneofcase(msg, UPB_SIZE(184, 344)) == 52; }
+UPB_INLINE const envoy_config_cluster_v3_Cluster_MaglevLbConfig* envoy_config_cluster_v3_Cluster_maglev_lb_config(const envoy_config_cluster_v3_Cluster *msg) { return UPB_READ_ONEOF(msg, const envoy_config_cluster_v3_Cluster_MaglevLbConfig*, UPB_SIZE(180, 336), UPB_SIZE(184, 344), 52, NULL); }
+UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_dns_resolution_config(const envoy_config_cluster_v3_Cluster *msg) { return _upb_hasbit(msg, 26); }
+UPB_INLINE const struct envoy_config_core_v3_DnsResolutionConfig* envoy_config_cluster_v3_Cluster_dns_resolution_config(const envoy_config_cluster_v3_Cluster *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(140, 256), const struct envoy_config_core_v3_DnsResolutionConfig*); }
+UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_wait_for_warm_on_init(const envoy_config_cluster_v3_Cluster *msg) { return _upb_hasbit(msg, 27); }
+UPB_INLINE const struct google_protobuf_BoolValue* envoy_config_cluster_v3_Cluster_wait_for_warm_on_init(const envoy_config_cluster_v3_Cluster *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(144, 264), const struct google_protobuf_BoolValue*); }
+UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_typed_dns_resolver_config(const envoy_config_cluster_v3_Cluster *msg) { return _upb_hasbit(msg, 28); }
+UPB_INLINE const struct envoy_config_core_v3_TypedExtensionConfig* envoy_config_cluster_v3_Cluster_typed_dns_resolver_config(const envoy_config_cluster_v3_Cluster *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(148, 272), const struct envoy_config_core_v3_TypedExtensionConfig*); }
UPB_INLINE void envoy_config_cluster_v3_Cluster_set_name(envoy_config_cluster_v3_Cluster *msg, upb_strview value) {
*UPB_PTR_AT(msg, UPB_SIZE(24, 24), upb_strview) = value;
}
UPB_INLINE void envoy_config_cluster_v3_Cluster_set_type(envoy_config_cluster_v3_Cluster *msg, int32_t value) {
- UPB_WRITE_ONEOF(msg, int32_t, UPB_SIZE(160, 296), value, UPB_SIZE(164, 304), 2);
+ UPB_WRITE_ONEOF(msg, int32_t, UPB_SIZE(172, 320), value, UPB_SIZE(176, 328), 2);
}
UPB_INLINE void envoy_config_cluster_v3_Cluster_set_eds_cluster_config(envoy_config_cluster_v3_Cluster *msg, envoy_config_cluster_v3_Cluster_EdsClusterConfig* value) {
_upb_sethas(msg, 1);
@@ -397,15 +407,15 @@ UPB_INLINE void envoy_config_cluster_v3_Cluster_set_lb_policy(envoy_config_clust
*UPB_PTR_AT(msg, UPB_SIZE(4, 4), int32_t) = value;
}
UPB_INLINE struct envoy_config_core_v3_HealthCheck** envoy_config_cluster_v3_Cluster_mutable_health_checks(envoy_config_cluster_v3_Cluster *msg, size_t *len) {
- return (struct envoy_config_core_v3_HealthCheck**)_upb_array_mutable_accessor(msg, UPB_SIZE(140, 256), len);
+ return (struct envoy_config_core_v3_HealthCheck**)_upb_array_mutable_accessor(msg, UPB_SIZE(152, 280), len);
}
UPB_INLINE struct envoy_config_core_v3_HealthCheck** envoy_config_cluster_v3_Cluster_resize_health_checks(envoy_config_cluster_v3_Cluster *msg, size_t len, upb_arena *arena) {
- return (struct envoy_config_core_v3_HealthCheck**)_upb_array_resize_accessor2(msg, UPB_SIZE(140, 256), len, UPB_SIZE(2, 3), arena);
+ return (struct envoy_config_core_v3_HealthCheck**)_upb_array_resize_accessor2(msg, UPB_SIZE(152, 280), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_config_core_v3_HealthCheck* envoy_config_cluster_v3_Cluster_add_health_checks(envoy_config_cluster_v3_Cluster *msg, upb_arena *arena) {
struct envoy_config_core_v3_HealthCheck* sub = (struct envoy_config_core_v3_HealthCheck*)_upb_msg_new(&envoy_config_core_v3_HealthCheck_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(140, 256), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(152, 280), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
@@ -478,15 +488,15 @@ UPB_INLINE void envoy_config_cluster_v3_Cluster_set_dns_lookup_family(envoy_conf
*UPB_PTR_AT(msg, UPB_SIZE(8, 8), int32_t) = value;
}
UPB_INLINE struct envoy_config_core_v3_Address** envoy_config_cluster_v3_Cluster_mutable_dns_resolvers(envoy_config_cluster_v3_Cluster *msg, size_t *len) {
- return (struct envoy_config_core_v3_Address**)_upb_array_mutable_accessor(msg, UPB_SIZE(144, 264), len);
+ return (struct envoy_config_core_v3_Address**)_upb_array_mutable_accessor(msg, UPB_SIZE(156, 288), len);
}
UPB_INLINE struct envoy_config_core_v3_Address** envoy_config_cluster_v3_Cluster_resize_dns_resolvers(envoy_config_cluster_v3_Cluster *msg, size_t len, upb_arena *arena) {
- return (struct envoy_config_core_v3_Address**)_upb_array_resize_accessor2(msg, UPB_SIZE(144, 264), len, UPB_SIZE(2, 3), arena);
+ return (struct envoy_config_core_v3_Address**)_upb_array_resize_accessor2(msg, UPB_SIZE(156, 288), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_config_core_v3_Address* envoy_config_cluster_v3_Cluster_add_dns_resolvers(envoy_config_cluster_v3_Cluster *msg, upb_arena *arena) {
struct envoy_config_core_v3_Address* sub = (struct envoy_config_core_v3_Address*)_upb_msg_new(&envoy_config_core_v3_Address_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(144, 264), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(156, 288), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
@@ -543,7 +553,7 @@ UPB_INLINE struct envoy_config_cluster_v3_Cluster_LbSubsetConfig* envoy_config_c
return sub;
}
UPB_INLINE void envoy_config_cluster_v3_Cluster_set_ring_hash_lb_config(envoy_config_cluster_v3_Cluster *msg, envoy_config_cluster_v3_Cluster_RingHashLbConfig* value) {
- UPB_WRITE_ONEOF(msg, envoy_config_cluster_v3_Cluster_RingHashLbConfig*, UPB_SIZE(168, 312), value, UPB_SIZE(172, 320), 23);
+ UPB_WRITE_ONEOF(msg, envoy_config_cluster_v3_Cluster_RingHashLbConfig*, UPB_SIZE(180, 336), value, UPB_SIZE(184, 344), 23);
}
UPB_INLINE struct envoy_config_cluster_v3_Cluster_RingHashLbConfig* envoy_config_cluster_v3_Cluster_mutable_ring_hash_lb_config(envoy_config_cluster_v3_Cluster *msg, upb_arena *arena) {
struct envoy_config_cluster_v3_Cluster_RingHashLbConfig* sub = (struct envoy_config_cluster_v3_Cluster_RingHashLbConfig*)envoy_config_cluster_v3_Cluster_ring_hash_lb_config(msg);
@@ -645,7 +655,7 @@ UPB_INLINE struct envoy_config_endpoint_v3_ClusterLoadAssignment* envoy_config_c
return sub;
}
UPB_INLINE void envoy_config_cluster_v3_Cluster_set_original_dst_lb_config(envoy_config_cluster_v3_Cluster *msg, envoy_config_cluster_v3_Cluster_OriginalDstLbConfig* value) {
- UPB_WRITE_ONEOF(msg, envoy_config_cluster_v3_Cluster_OriginalDstLbConfig*, UPB_SIZE(168, 312), value, UPB_SIZE(172, 320), 34);
+ UPB_WRITE_ONEOF(msg, envoy_config_cluster_v3_Cluster_OriginalDstLbConfig*, UPB_SIZE(180, 336), value, UPB_SIZE(184, 344), 34);
}
UPB_INLINE struct envoy_config_cluster_v3_Cluster_OriginalDstLbConfig* envoy_config_cluster_v3_Cluster_mutable_original_dst_lb_config(envoy_config_cluster_v3_Cluster *msg, upb_arena *arena) {
struct envoy_config_cluster_v3_Cluster_OriginalDstLbConfig* sub = (struct envoy_config_cluster_v3_Cluster_OriginalDstLbConfig*)envoy_config_cluster_v3_Cluster_original_dst_lb_config(msg);
@@ -656,12 +666,12 @@ UPB_INLINE struct envoy_config_cluster_v3_Cluster_OriginalDstLbConfig* envoy_con
}
return sub;
}
-UPB_INLINE void envoy_config_cluster_v3_Cluster_typed_extension_protocol_options_clear(envoy_config_cluster_v3_Cluster *msg) { _upb_msg_map_clear(msg, UPB_SIZE(148, 272)); }
-UPB_INLINE bool envoy_config_cluster_v3_Cluster_typed_extension_protocol_options_set(envoy_config_cluster_v3_Cluster *msg, upb_strview key, struct google_protobuf_Any* val, upb_arena *a) { return _upb_msg_map_set(msg, UPB_SIZE(148, 272), &key, 0, &val, sizeof(val), a); }
-UPB_INLINE bool envoy_config_cluster_v3_Cluster_typed_extension_protocol_options_delete(envoy_config_cluster_v3_Cluster *msg, upb_strview key) { return _upb_msg_map_delete(msg, UPB_SIZE(148, 272), &key, 0); }
-UPB_INLINE envoy_config_cluster_v3_Cluster_TypedExtensionProtocolOptionsEntry* envoy_config_cluster_v3_Cluster_typed_extension_protocol_options_nextmutable(envoy_config_cluster_v3_Cluster *msg, size_t* iter) { return (envoy_config_cluster_v3_Cluster_TypedExtensionProtocolOptionsEntry*)_upb_msg_map_next(msg, UPB_SIZE(148, 272), iter); }
+UPB_INLINE void envoy_config_cluster_v3_Cluster_typed_extension_protocol_options_clear(envoy_config_cluster_v3_Cluster *msg) { _upb_msg_map_clear(msg, UPB_SIZE(160, 296)); }
+UPB_INLINE bool envoy_config_cluster_v3_Cluster_typed_extension_protocol_options_set(envoy_config_cluster_v3_Cluster *msg, upb_strview key, struct google_protobuf_Any* val, upb_arena *a) { return _upb_msg_map_set(msg, UPB_SIZE(160, 296), &key, 0, &val, sizeof(val), a); }
+UPB_INLINE bool envoy_config_cluster_v3_Cluster_typed_extension_protocol_options_delete(envoy_config_cluster_v3_Cluster *msg, upb_strview key) { return _upb_msg_map_delete(msg, UPB_SIZE(160, 296), &key, 0); }
+UPB_INLINE envoy_config_cluster_v3_Cluster_TypedExtensionProtocolOptionsEntry* envoy_config_cluster_v3_Cluster_typed_extension_protocol_options_nextmutable(envoy_config_cluster_v3_Cluster *msg, size_t* iter) { return (envoy_config_cluster_v3_Cluster_TypedExtensionProtocolOptionsEntry*)_upb_msg_map_next(msg, UPB_SIZE(160, 296), iter); }
UPB_INLINE void envoy_config_cluster_v3_Cluster_set_least_request_lb_config(envoy_config_cluster_v3_Cluster *msg, envoy_config_cluster_v3_Cluster_LeastRequestLbConfig* value) {
- UPB_WRITE_ONEOF(msg, envoy_config_cluster_v3_Cluster_LeastRequestLbConfig*, UPB_SIZE(168, 312), value, UPB_SIZE(172, 320), 37);
+ UPB_WRITE_ONEOF(msg, envoy_config_cluster_v3_Cluster_LeastRequestLbConfig*, UPB_SIZE(180, 336), value, UPB_SIZE(184, 344), 37);
}
UPB_INLINE struct envoy_config_cluster_v3_Cluster_LeastRequestLbConfig* envoy_config_cluster_v3_Cluster_mutable_least_request_lb_config(envoy_config_cluster_v3_Cluster *msg, upb_arena *arena) {
struct envoy_config_cluster_v3_Cluster_LeastRequestLbConfig* sub = (struct envoy_config_cluster_v3_Cluster_LeastRequestLbConfig*)envoy_config_cluster_v3_Cluster_least_request_lb_config(msg);
@@ -673,7 +683,7 @@ UPB_INLINE struct envoy_config_cluster_v3_Cluster_LeastRequestLbConfig* envoy_co
return sub;
}
UPB_INLINE void envoy_config_cluster_v3_Cluster_set_cluster_type(envoy_config_cluster_v3_Cluster *msg, envoy_config_cluster_v3_Cluster_CustomClusterType* value) {
- UPB_WRITE_ONEOF(msg, envoy_config_cluster_v3_Cluster_CustomClusterType*, UPB_SIZE(160, 296), value, UPB_SIZE(164, 304), 38);
+ UPB_WRITE_ONEOF(msg, envoy_config_cluster_v3_Cluster_CustomClusterType*, UPB_SIZE(172, 320), value, UPB_SIZE(176, 328), 38);
}
UPB_INLINE struct envoy_config_cluster_v3_Cluster_CustomClusterType* envoy_config_cluster_v3_Cluster_mutable_cluster_type(envoy_config_cluster_v3_Cluster *msg, upb_arena *arena) {
struct envoy_config_cluster_v3_Cluster_CustomClusterType* sub = (struct envoy_config_cluster_v3_Cluster_CustomClusterType*)envoy_config_cluster_v3_Cluster_cluster_type(msg);
@@ -688,15 +698,15 @@ UPB_INLINE void envoy_config_cluster_v3_Cluster_set_respect_dns_ttl(envoy_config
*UPB_PTR_AT(msg, UPB_SIZE(18, 18), bool) = value;
}
UPB_INLINE struct envoy_config_cluster_v3_Filter** envoy_config_cluster_v3_Cluster_mutable_filters(envoy_config_cluster_v3_Cluster *msg, size_t *len) {
- return (struct envoy_config_cluster_v3_Filter**)_upb_array_mutable_accessor(msg, UPB_SIZE(152, 280), len);
+ return (struct envoy_config_cluster_v3_Filter**)_upb_array_mutable_accessor(msg, UPB_SIZE(164, 304), len);
}
UPB_INLINE struct envoy_config_cluster_v3_Filter** envoy_config_cluster_v3_Cluster_resize_filters(envoy_config_cluster_v3_Cluster *msg, size_t len, upb_arena *arena) {
- return (struct envoy_config_cluster_v3_Filter**)_upb_array_resize_accessor2(msg, UPB_SIZE(152, 280), len, UPB_SIZE(2, 3), arena);
+ return (struct envoy_config_cluster_v3_Filter**)_upb_array_resize_accessor2(msg, UPB_SIZE(164, 304), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_config_cluster_v3_Filter* envoy_config_cluster_v3_Cluster_add_filters(envoy_config_cluster_v3_Cluster *msg, upb_arena *arena) {
struct envoy_config_cluster_v3_Filter* sub = (struct envoy_config_cluster_v3_Filter*)_upb_msg_new(&envoy_config_cluster_v3_Filter_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(152, 280), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(164, 304), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
@@ -727,15 +737,15 @@ UPB_INLINE struct envoy_config_core_v3_ConfigSource* envoy_config_cluster_v3_Clu
return sub;
}
UPB_INLINE envoy_config_cluster_v3_Cluster_TransportSocketMatch** envoy_config_cluster_v3_Cluster_mutable_transport_socket_matches(envoy_config_cluster_v3_Cluster *msg, size_t *len) {
- return (envoy_config_cluster_v3_Cluster_TransportSocketMatch**)_upb_array_mutable_accessor(msg, UPB_SIZE(156, 288), len);
+ return (envoy_config_cluster_v3_Cluster_TransportSocketMatch**)_upb_array_mutable_accessor(msg, UPB_SIZE(168, 312), len);
}
UPB_INLINE envoy_config_cluster_v3_Cluster_TransportSocketMatch** envoy_config_cluster_v3_Cluster_resize_transport_socket_matches(envoy_config_cluster_v3_Cluster *msg, size_t len, upb_arena *arena) {
- return (envoy_config_cluster_v3_Cluster_TransportSocketMatch**)_upb_array_resize_accessor2(msg, UPB_SIZE(156, 288), len, UPB_SIZE(2, 3), arena);
+ return (envoy_config_cluster_v3_Cluster_TransportSocketMatch**)_upb_array_resize_accessor2(msg, UPB_SIZE(168, 312), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_config_cluster_v3_Cluster_TransportSocketMatch* envoy_config_cluster_v3_Cluster_add_transport_socket_matches(envoy_config_cluster_v3_Cluster *msg, upb_arena *arena) {
struct envoy_config_cluster_v3_Cluster_TransportSocketMatch* sub = (struct envoy_config_cluster_v3_Cluster_TransportSocketMatch*)_upb_msg_new(&envoy_config_cluster_v3_Cluster_TransportSocketMatch_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(156, 288), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(168, 312), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
@@ -814,7 +824,7 @@ UPB_INLINE void envoy_config_cluster_v3_Cluster_set_connection_pool_per_downstre
*UPB_PTR_AT(msg, UPB_SIZE(21, 21), bool) = value;
}
UPB_INLINE void envoy_config_cluster_v3_Cluster_set_maglev_lb_config(envoy_config_cluster_v3_Cluster *msg, envoy_config_cluster_v3_Cluster_MaglevLbConfig* value) {
- UPB_WRITE_ONEOF(msg, envoy_config_cluster_v3_Cluster_MaglevLbConfig*, UPB_SIZE(168, 312), value, UPB_SIZE(172, 320), 52);
+ UPB_WRITE_ONEOF(msg, envoy_config_cluster_v3_Cluster_MaglevLbConfig*, UPB_SIZE(180, 336), value, UPB_SIZE(184, 344), 52);
}
UPB_INLINE struct envoy_config_cluster_v3_Cluster_MaglevLbConfig* envoy_config_cluster_v3_Cluster_mutable_maglev_lb_config(envoy_config_cluster_v3_Cluster *msg, upb_arena *arena) {
struct envoy_config_cluster_v3_Cluster_MaglevLbConfig* sub = (struct envoy_config_cluster_v3_Cluster_MaglevLbConfig*)envoy_config_cluster_v3_Cluster_maglev_lb_config(msg);
@@ -825,6 +835,45 @@ UPB_INLINE struct envoy_config_cluster_v3_Cluster_MaglevLbConfig* envoy_config_c
}
return sub;
}
+UPB_INLINE void envoy_config_cluster_v3_Cluster_set_dns_resolution_config(envoy_config_cluster_v3_Cluster *msg, struct envoy_config_core_v3_DnsResolutionConfig* value) {
+ _upb_sethas(msg, 26);
+ *UPB_PTR_AT(msg, UPB_SIZE(140, 256), struct envoy_config_core_v3_DnsResolutionConfig*) = value;
+}
+UPB_INLINE struct envoy_config_core_v3_DnsResolutionConfig* envoy_config_cluster_v3_Cluster_mutable_dns_resolution_config(envoy_config_cluster_v3_Cluster *msg, upb_arena *arena) {
+ struct envoy_config_core_v3_DnsResolutionConfig* sub = (struct envoy_config_core_v3_DnsResolutionConfig*)envoy_config_cluster_v3_Cluster_dns_resolution_config(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_config_core_v3_DnsResolutionConfig*)_upb_msg_new(&envoy_config_core_v3_DnsResolutionConfig_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_cluster_v3_Cluster_set_dns_resolution_config(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void envoy_config_cluster_v3_Cluster_set_wait_for_warm_on_init(envoy_config_cluster_v3_Cluster *msg, struct google_protobuf_BoolValue* value) {
+ _upb_sethas(msg, 27);
+ *UPB_PTR_AT(msg, UPB_SIZE(144, 264), struct google_protobuf_BoolValue*) = value;
+}
+UPB_INLINE struct google_protobuf_BoolValue* envoy_config_cluster_v3_Cluster_mutable_wait_for_warm_on_init(envoy_config_cluster_v3_Cluster *msg, upb_arena *arena) {
+ struct google_protobuf_BoolValue* sub = (struct google_protobuf_BoolValue*)envoy_config_cluster_v3_Cluster_wait_for_warm_on_init(msg);
+ if (sub == NULL) {
+ sub = (struct google_protobuf_BoolValue*)_upb_msg_new(&google_protobuf_BoolValue_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_cluster_v3_Cluster_set_wait_for_warm_on_init(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void envoy_config_cluster_v3_Cluster_set_typed_dns_resolver_config(envoy_config_cluster_v3_Cluster *msg, struct envoy_config_core_v3_TypedExtensionConfig* value) {
+ _upb_sethas(msg, 28);
+ *UPB_PTR_AT(msg, UPB_SIZE(148, 272), struct envoy_config_core_v3_TypedExtensionConfig*) = value;
+}
+UPB_INLINE struct envoy_config_core_v3_TypedExtensionConfig* envoy_config_cluster_v3_Cluster_mutable_typed_dns_resolver_config(envoy_config_cluster_v3_Cluster *msg, upb_arena *arena) {
+ struct envoy_config_core_v3_TypedExtensionConfig* sub = (struct envoy_config_core_v3_TypedExtensionConfig*)envoy_config_cluster_v3_Cluster_typed_dns_resolver_config(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_config_core_v3_TypedExtensionConfig*)_upb_msg_new(&envoy_config_core_v3_TypedExtensionConfig_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_cluster_v3_Cluster_set_typed_dns_resolver_config(msg, sub);
+ }
+ return sub;
+}
/* envoy.config.cluster.v3.Cluster.TransportSocketMatch */
diff --git a/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c b/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c
index 0baf9e98b6..e534377aa6 100644
--- a/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c
+++ b/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c
@@ -17,6 +17,8 @@
#include "google/protobuf/any.upb.h"
#include "google/protobuf/struct.upb.h"
#include "google/protobuf/wrappers.upb.h"
+#include "xds/core/v3/context_params.upb.h"
+#include "envoy/annotations/deprecation.upb.h"
#include "udpa/annotations/migrate.upb.h"
#include "udpa/annotations/status.upb.h"
#include "udpa/annotations/versioning.upb.h"
@@ -70,45 +72,64 @@ const upb_msglayout envoy_config_core_v3_Extension_msginit = {
UPB_SIZE(32, 64), 5, false, 255,
};
-static const upb_msglayout *const envoy_config_core_v3_Node_submsgs[5] = {
+static const upb_msglayout *const envoy_config_core_v3_Node_submsgs[6] = {
&envoy_config_core_v3_Address_msginit,
&envoy_config_core_v3_BuildVersion_msginit,
&envoy_config_core_v3_Extension_msginit,
&envoy_config_core_v3_Locality_msginit,
+ &envoy_config_core_v3_Node_DynamicParametersEntry_msginit,
&google_protobuf_Struct_msginit,
};
-static const upb_msglayout_field envoy_config_core_v3_Node__fields[10] = {
+static const upb_msglayout_field envoy_config_core_v3_Node__fields[11] = {
{1, UPB_SIZE(4, 8), 0, 0, 9, 1},
{2, UPB_SIZE(12, 24), 0, 0, 9, 1},
- {3, UPB_SIZE(28, 56), 1, 4, 11, 1},
+ {3, UPB_SIZE(28, 56), 1, 5, 11, 1},
{4, UPB_SIZE(32, 64), 2, 3, 11, 1},
{6, UPB_SIZE(20, 40), 0, 0, 9, 1},
- {7, UPB_SIZE(48, 96), UPB_SIZE(-57, -113), 0, 9, 1},
- {8, UPB_SIZE(48, 96), UPB_SIZE(-57, -113), 1, 11, 1},
+ {7, UPB_SIZE(52, 104), UPB_SIZE(-61, -121), 0, 9, 1},
+ {8, UPB_SIZE(52, 104), UPB_SIZE(-61, -121), 1, 11, 1},
{9, UPB_SIZE(36, 72), 0, 2, 11, 3},
{10, UPB_SIZE(40, 80), 0, 0, 9, 3},
{11, UPB_SIZE(44, 88), 0, 0, 11, 3},
+ {12, UPB_SIZE(48, 96), 0, 4, 11, _UPB_LABEL_MAP},
};
const upb_msglayout envoy_config_core_v3_Node_msginit = {
&envoy_config_core_v3_Node_submsgs[0],
&envoy_config_core_v3_Node__fields[0],
- UPB_SIZE(64, 128), 10, false, 255,
+ UPB_SIZE(64, 128), 11, false, 255,
};
-static const upb_msglayout *const envoy_config_core_v3_Metadata_submsgs[1] = {
+static const upb_msglayout *const envoy_config_core_v3_Node_DynamicParametersEntry_submsgs[1] = {
+ &xds_core_v3_ContextParams_msginit,
+};
+
+static const upb_msglayout_field envoy_config_core_v3_Node_DynamicParametersEntry__fields[2] = {
+ {1, UPB_SIZE(0, 0), 0, 0, 9, 1},
+ {2, UPB_SIZE(8, 16), 0, 0, 11, 1},
+};
+
+const upb_msglayout envoy_config_core_v3_Node_DynamicParametersEntry_msginit = {
+ &envoy_config_core_v3_Node_DynamicParametersEntry_submsgs[0],
+ &envoy_config_core_v3_Node_DynamicParametersEntry__fields[0],
+ UPB_SIZE(16, 32), 2, false, 255,
+};
+
+static const upb_msglayout *const envoy_config_core_v3_Metadata_submsgs[2] = {
&envoy_config_core_v3_Metadata_FilterMetadataEntry_msginit,
+ &envoy_config_core_v3_Metadata_TypedFilterMetadataEntry_msginit,
};
-static const upb_msglayout_field envoy_config_core_v3_Metadata__fields[1] = {
+static const upb_msglayout_field envoy_config_core_v3_Metadata__fields[2] = {
{1, UPB_SIZE(0, 0), 0, 0, 11, _UPB_LABEL_MAP},
+ {2, UPB_SIZE(4, 8), 0, 1, 11, _UPB_LABEL_MAP},
};
const upb_msglayout envoy_config_core_v3_Metadata_msginit = {
&envoy_config_core_v3_Metadata_submsgs[0],
&envoy_config_core_v3_Metadata__fields[0],
- UPB_SIZE(8, 8), 1, false, 255,
+ UPB_SIZE(8, 16), 2, false, 255,
};
static const upb_msglayout *const envoy_config_core_v3_Metadata_FilterMetadataEntry_submsgs[1] = {
@@ -126,6 +147,21 @@ const upb_msglayout envoy_config_core_v3_Metadata_FilterMetadataEntry_msginit =
UPB_SIZE(16, 32), 2, false, 255,
};
+static const upb_msglayout *const envoy_config_core_v3_Metadata_TypedFilterMetadataEntry_submsgs[1] = {
+ &google_protobuf_Any_msginit,
+};
+
+static const upb_msglayout_field envoy_config_core_v3_Metadata_TypedFilterMetadataEntry__fields[2] = {
+ {1, UPB_SIZE(0, 0), 0, 0, 9, 1},
+ {2, UPB_SIZE(8, 16), 0, 0, 11, 1},
+};
+
+const upb_msglayout envoy_config_core_v3_Metadata_TypedFilterMetadataEntry_msginit = {
+ &envoy_config_core_v3_Metadata_TypedFilterMetadataEntry_submsgs[0],
+ &envoy_config_core_v3_Metadata_TypedFilterMetadataEntry__fields[0],
+ UPB_SIZE(16, 32), 2, false, 255,
+};
+
static const upb_msglayout_field envoy_config_core_v3_RuntimeUInt32__fields[2] = {
{2, UPB_SIZE(0, 0), 0, 0, 13, 1},
{3, UPB_SIZE(4, 8), 0, 0, 9, 1},
diff --git a/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h b/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h
index bfb4fd4d58..043c0b9ada 100644
--- a/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h
+++ b/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h
@@ -24,8 +24,10 @@ struct envoy_config_core_v3_Locality;
struct envoy_config_core_v3_BuildVersion;
struct envoy_config_core_v3_Extension;
struct envoy_config_core_v3_Node;
+struct envoy_config_core_v3_Node_DynamicParametersEntry;
struct envoy_config_core_v3_Metadata;
struct envoy_config_core_v3_Metadata_FilterMetadataEntry;
+struct envoy_config_core_v3_Metadata_TypedFilterMetadataEntry;
struct envoy_config_core_v3_RuntimeUInt32;
struct envoy_config_core_v3_RuntimePercent;
struct envoy_config_core_v3_RuntimeDouble;
@@ -45,8 +47,10 @@ typedef struct envoy_config_core_v3_Locality envoy_config_core_v3_Locality;
typedef struct envoy_config_core_v3_BuildVersion envoy_config_core_v3_BuildVersion;
typedef struct envoy_config_core_v3_Extension envoy_config_core_v3_Extension;
typedef struct envoy_config_core_v3_Node envoy_config_core_v3_Node;
+typedef struct envoy_config_core_v3_Node_DynamicParametersEntry envoy_config_core_v3_Node_DynamicParametersEntry;
typedef struct envoy_config_core_v3_Metadata envoy_config_core_v3_Metadata;
typedef struct envoy_config_core_v3_Metadata_FilterMetadataEntry envoy_config_core_v3_Metadata_FilterMetadataEntry;
+typedef struct envoy_config_core_v3_Metadata_TypedFilterMetadataEntry envoy_config_core_v3_Metadata_TypedFilterMetadataEntry;
typedef struct envoy_config_core_v3_RuntimeUInt32 envoy_config_core_v3_RuntimeUInt32;
typedef struct envoy_config_core_v3_RuntimePercent envoy_config_core_v3_RuntimePercent;
typedef struct envoy_config_core_v3_RuntimeDouble envoy_config_core_v3_RuntimeDouble;
@@ -66,8 +70,10 @@ extern const upb_msglayout envoy_config_core_v3_Locality_msginit;
extern const upb_msglayout envoy_config_core_v3_BuildVersion_msginit;
extern const upb_msglayout envoy_config_core_v3_Extension_msginit;
extern const upb_msglayout envoy_config_core_v3_Node_msginit;
+extern const upb_msglayout envoy_config_core_v3_Node_DynamicParametersEntry_msginit;
extern const upb_msglayout envoy_config_core_v3_Metadata_msginit;
extern const upb_msglayout envoy_config_core_v3_Metadata_FilterMetadataEntry_msginit;
+extern const upb_msglayout envoy_config_core_v3_Metadata_TypedFilterMetadataEntry_msginit;
extern const upb_msglayout envoy_config_core_v3_RuntimeUInt32_msginit;
extern const upb_msglayout envoy_config_core_v3_RuntimePercent_msginit;
extern const upb_msglayout envoy_config_core_v3_RuntimeDouble_msginit;
@@ -93,6 +99,7 @@ struct google_protobuf_Any;
struct google_protobuf_BoolValue;
struct google_protobuf_Struct;
struct google_protobuf_UInt32Value;
+struct xds_core_v3_ContextParams;
extern const upb_msglayout envoy_config_core_v3_Address_msginit;
extern const upb_msglayout envoy_config_core_v3_BackoffStrategy_msginit;
extern const upb_msglayout envoy_config_core_v3_HttpUri_msginit;
@@ -103,6 +110,7 @@ extern const upb_msglayout google_protobuf_Any_msginit;
extern const upb_msglayout google_protobuf_BoolValue_msginit;
extern const upb_msglayout google_protobuf_Struct_msginit;
extern const upb_msglayout google_protobuf_UInt32Value_msginit;
+extern const upb_msglayout xds_core_v3_ContextParams_msginit;
typedef enum {
envoy_config_core_v3_METHOD_UNSPECIFIED = 0,
@@ -293,7 +301,7 @@ typedef enum {
envoy_config_core_v3_Node_user_agent_version_type_user_agent_build_version = 8,
envoy_config_core_v3_Node_user_agent_version_type_NOT_SET = 0
} envoy_config_core_v3_Node_user_agent_version_type_oneofcases;
-UPB_INLINE envoy_config_core_v3_Node_user_agent_version_type_oneofcases envoy_config_core_v3_Node_user_agent_version_type_case(const envoy_config_core_v3_Node* msg) { return (envoy_config_core_v3_Node_user_agent_version_type_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(56, 112), int32_t); }
+UPB_INLINE envoy_config_core_v3_Node_user_agent_version_type_oneofcases envoy_config_core_v3_Node_user_agent_version_type_case(const envoy_config_core_v3_Node* msg) { return (envoy_config_core_v3_Node_user_agent_version_type_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(60, 120), int32_t); }
UPB_INLINE upb_strview envoy_config_core_v3_Node_id(const envoy_config_core_v3_Node *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview); }
UPB_INLINE upb_strview envoy_config_core_v3_Node_cluster(const envoy_config_core_v3_Node *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 24), upb_strview); }
@@ -302,15 +310,19 @@ UPB_INLINE const struct google_protobuf_Struct* envoy_config_core_v3_Node_metada
UPB_INLINE bool envoy_config_core_v3_Node_has_locality(const envoy_config_core_v3_Node *msg) { return _upb_hasbit(msg, 2); }
UPB_INLINE const envoy_config_core_v3_Locality* envoy_config_core_v3_Node_locality(const envoy_config_core_v3_Node *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(32, 64), const envoy_config_core_v3_Locality*); }
UPB_INLINE upb_strview envoy_config_core_v3_Node_user_agent_name(const envoy_config_core_v3_Node *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(20, 40), upb_strview); }
-UPB_INLINE bool envoy_config_core_v3_Node_has_user_agent_version(const envoy_config_core_v3_Node *msg) { return _upb_getoneofcase(msg, UPB_SIZE(56, 112)) == 7; }
-UPB_INLINE upb_strview envoy_config_core_v3_Node_user_agent_version(const envoy_config_core_v3_Node *msg) { return UPB_READ_ONEOF(msg, upb_strview, UPB_SIZE(48, 96), UPB_SIZE(56, 112), 7, upb_strview_make("", strlen(""))); }
-UPB_INLINE bool envoy_config_core_v3_Node_has_user_agent_build_version(const envoy_config_core_v3_Node *msg) { return _upb_getoneofcase(msg, UPB_SIZE(56, 112)) == 8; }
-UPB_INLINE const envoy_config_core_v3_BuildVersion* envoy_config_core_v3_Node_user_agent_build_version(const envoy_config_core_v3_Node *msg) { return UPB_READ_ONEOF(msg, const envoy_config_core_v3_BuildVersion*, UPB_SIZE(48, 96), UPB_SIZE(56, 112), 8, NULL); }
+UPB_INLINE bool envoy_config_core_v3_Node_has_user_agent_version(const envoy_config_core_v3_Node *msg) { return _upb_getoneofcase(msg, UPB_SIZE(60, 120)) == 7; }
+UPB_INLINE upb_strview envoy_config_core_v3_Node_user_agent_version(const envoy_config_core_v3_Node *msg) { return UPB_READ_ONEOF(msg, upb_strview, UPB_SIZE(52, 104), UPB_SIZE(60, 120), 7, upb_strview_make("", strlen(""))); }
+UPB_INLINE bool envoy_config_core_v3_Node_has_user_agent_build_version(const envoy_config_core_v3_Node *msg) { return _upb_getoneofcase(msg, UPB_SIZE(60, 120)) == 8; }
+UPB_INLINE const envoy_config_core_v3_BuildVersion* envoy_config_core_v3_Node_user_agent_build_version(const envoy_config_core_v3_Node *msg) { return UPB_READ_ONEOF(msg, const envoy_config_core_v3_BuildVersion*, UPB_SIZE(52, 104), UPB_SIZE(60, 120), 8, NULL); }
UPB_INLINE bool envoy_config_core_v3_Node_has_extensions(const envoy_config_core_v3_Node *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(36, 72)); }
UPB_INLINE const envoy_config_core_v3_Extension* const* envoy_config_core_v3_Node_extensions(const envoy_config_core_v3_Node *msg, size_t *len) { return (const envoy_config_core_v3_Extension* const*)_upb_array_accessor(msg, UPB_SIZE(36, 72), len); }
UPB_INLINE upb_strview const* envoy_config_core_v3_Node_client_features(const envoy_config_core_v3_Node *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(40, 80), len); }
UPB_INLINE bool envoy_config_core_v3_Node_has_listening_addresses(const envoy_config_core_v3_Node *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(44, 88)); }
UPB_INLINE const struct envoy_config_core_v3_Address* const* envoy_config_core_v3_Node_listening_addresses(const envoy_config_core_v3_Node *msg, size_t *len) { return (const struct envoy_config_core_v3_Address* const*)_upb_array_accessor(msg, UPB_SIZE(44, 88), len); }
+UPB_INLINE bool envoy_config_core_v3_Node_has_dynamic_parameters(const envoy_config_core_v3_Node *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(48, 96)); }
+UPB_INLINE size_t envoy_config_core_v3_Node_dynamic_parameters_size(const envoy_config_core_v3_Node *msg) {return _upb_msg_map_size(msg, UPB_SIZE(48, 96)); }
+UPB_INLINE bool envoy_config_core_v3_Node_dynamic_parameters_get(const envoy_config_core_v3_Node *msg, upb_strview key, struct xds_core_v3_ContextParams* *val) { return _upb_msg_map_get(msg, UPB_SIZE(48, 96), &key, 0, val, sizeof(*val)); }
+UPB_INLINE const envoy_config_core_v3_Node_DynamicParametersEntry* envoy_config_core_v3_Node_dynamic_parameters_next(const envoy_config_core_v3_Node *msg, size_t* iter) { return (const envoy_config_core_v3_Node_DynamicParametersEntry*)_upb_msg_map_next(msg, UPB_SIZE(48, 96), iter); }
UPB_INLINE void envoy_config_core_v3_Node_set_id(envoy_config_core_v3_Node *msg, upb_strview value) {
*UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview) = value;
@@ -348,10 +360,10 @@ UPB_INLINE void envoy_config_core_v3_Node_set_user_agent_name(envoy_config_core_
*UPB_PTR_AT(msg, UPB_SIZE(20, 40), upb_strview) = value;
}
UPB_INLINE void envoy_config_core_v3_Node_set_user_agent_version(envoy_config_core_v3_Node *msg, upb_strview value) {
- UPB_WRITE_ONEOF(msg, upb_strview, UPB_SIZE(48, 96), value, UPB_SIZE(56, 112), 7);
+ UPB_WRITE_ONEOF(msg, upb_strview, UPB_SIZE(52, 104), value, UPB_SIZE(60, 120), 7);
}
UPB_INLINE void envoy_config_core_v3_Node_set_user_agent_build_version(envoy_config_core_v3_Node *msg, envoy_config_core_v3_BuildVersion* value) {
- UPB_WRITE_ONEOF(msg, envoy_config_core_v3_BuildVersion*, UPB_SIZE(48, 96), value, UPB_SIZE(56, 112), 8);
+ UPB_WRITE_ONEOF(msg, envoy_config_core_v3_BuildVersion*, UPB_SIZE(52, 104), value, UPB_SIZE(60, 120), 8);
}
UPB_INLINE struct envoy_config_core_v3_BuildVersion* envoy_config_core_v3_Node_mutable_user_agent_build_version(envoy_config_core_v3_Node *msg, upb_arena *arena) {
struct envoy_config_core_v3_BuildVersion* sub = (struct envoy_config_core_v3_BuildVersion*)envoy_config_core_v3_Node_user_agent_build_version(msg);
@@ -398,6 +410,28 @@ UPB_INLINE struct envoy_config_core_v3_Address* envoy_config_core_v3_Node_add_li
if (!ok) return NULL;
return sub;
}
+UPB_INLINE void envoy_config_core_v3_Node_dynamic_parameters_clear(envoy_config_core_v3_Node *msg) { _upb_msg_map_clear(msg, UPB_SIZE(48, 96)); }
+UPB_INLINE bool envoy_config_core_v3_Node_dynamic_parameters_set(envoy_config_core_v3_Node *msg, upb_strview key, struct xds_core_v3_ContextParams* val, upb_arena *a) { return _upb_msg_map_set(msg, UPB_SIZE(48, 96), &key, 0, &val, sizeof(val), a); }
+UPB_INLINE bool envoy_config_core_v3_Node_dynamic_parameters_delete(envoy_config_core_v3_Node *msg, upb_strview key) { return _upb_msg_map_delete(msg, UPB_SIZE(48, 96), &key, 0); }
+UPB_INLINE envoy_config_core_v3_Node_DynamicParametersEntry* envoy_config_core_v3_Node_dynamic_parameters_nextmutable(envoy_config_core_v3_Node *msg, size_t* iter) { return (envoy_config_core_v3_Node_DynamicParametersEntry*)_upb_msg_map_next(msg, UPB_SIZE(48, 96), iter); }
+
+/* envoy.config.core.v3.Node.DynamicParametersEntry */
+
+UPB_INLINE upb_strview envoy_config_core_v3_Node_DynamicParametersEntry_key(const envoy_config_core_v3_Node_DynamicParametersEntry *msg) {
+ upb_strview ret;
+ _upb_msg_map_key(msg, &ret, 0);
+ return ret;
+}
+UPB_INLINE bool envoy_config_core_v3_Node_DynamicParametersEntry_has_value(const envoy_config_core_v3_Node_DynamicParametersEntry *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(8, 16)); }
+UPB_INLINE const struct xds_core_v3_ContextParams* envoy_config_core_v3_Node_DynamicParametersEntry_value(const envoy_config_core_v3_Node_DynamicParametersEntry *msg) {
+ struct xds_core_v3_ContextParams* ret;
+ _upb_msg_map_value(msg, &ret, sizeof(ret));
+ return ret;
+}
+
+UPB_INLINE void envoy_config_core_v3_Node_DynamicParametersEntry_set_value(envoy_config_core_v3_Node_DynamicParametersEntry *msg, struct xds_core_v3_ContextParams* value) {
+ _upb_msg_map_set_value(msg, &value, sizeof(struct xds_core_v3_ContextParams*));
+}
/* envoy.config.core.v3.Metadata */
@@ -423,11 +457,19 @@ UPB_INLINE bool envoy_config_core_v3_Metadata_has_filter_metadata(const envoy_co
UPB_INLINE size_t envoy_config_core_v3_Metadata_filter_metadata_size(const envoy_config_core_v3_Metadata *msg) {return _upb_msg_map_size(msg, UPB_SIZE(0, 0)); }
UPB_INLINE bool envoy_config_core_v3_Metadata_filter_metadata_get(const envoy_config_core_v3_Metadata *msg, upb_strview key, struct google_protobuf_Struct* *val) { return _upb_msg_map_get(msg, UPB_SIZE(0, 0), &key, 0, val, sizeof(*val)); }
UPB_INLINE const envoy_config_core_v3_Metadata_FilterMetadataEntry* envoy_config_core_v3_Metadata_filter_metadata_next(const envoy_config_core_v3_Metadata *msg, size_t* iter) { return (const envoy_config_core_v3_Metadata_FilterMetadataEntry*)_upb_msg_map_next(msg, UPB_SIZE(0, 0), iter); }
+UPB_INLINE bool envoy_config_core_v3_Metadata_has_typed_filter_metadata(const envoy_config_core_v3_Metadata *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(4, 8)); }
+UPB_INLINE size_t envoy_config_core_v3_Metadata_typed_filter_metadata_size(const envoy_config_core_v3_Metadata *msg) {return _upb_msg_map_size(msg, UPB_SIZE(4, 8)); }
+UPB_INLINE bool envoy_config_core_v3_Metadata_typed_filter_metadata_get(const envoy_config_core_v3_Metadata *msg, upb_strview key, struct google_protobuf_Any* *val) { return _upb_msg_map_get(msg, UPB_SIZE(4, 8), &key, 0, val, sizeof(*val)); }
+UPB_INLINE const envoy_config_core_v3_Metadata_TypedFilterMetadataEntry* envoy_config_core_v3_Metadata_typed_filter_metadata_next(const envoy_config_core_v3_Metadata *msg, size_t* iter) { return (const envoy_config_core_v3_Metadata_TypedFilterMetadataEntry*)_upb_msg_map_next(msg, UPB_SIZE(4, 8), iter); }
UPB_INLINE void envoy_config_core_v3_Metadata_filter_metadata_clear(envoy_config_core_v3_Metadata *msg) { _upb_msg_map_clear(msg, UPB_SIZE(0, 0)); }
UPB_INLINE bool envoy_config_core_v3_Metadata_filter_metadata_set(envoy_config_core_v3_Metadata *msg, upb_strview key, struct google_protobuf_Struct* val, upb_arena *a) { return _upb_msg_map_set(msg, UPB_SIZE(0, 0), &key, 0, &val, sizeof(val), a); }
UPB_INLINE bool envoy_config_core_v3_Metadata_filter_metadata_delete(envoy_config_core_v3_Metadata *msg, upb_strview key) { return _upb_msg_map_delete(msg, UPB_SIZE(0, 0), &key, 0); }
UPB_INLINE envoy_config_core_v3_Metadata_FilterMetadataEntry* envoy_config_core_v3_Metadata_filter_metadata_nextmutable(envoy_config_core_v3_Metadata *msg, size_t* iter) { return (envoy_config_core_v3_Metadata_FilterMetadataEntry*)_upb_msg_map_next(msg, UPB_SIZE(0, 0), iter); }
+UPB_INLINE void envoy_config_core_v3_Metadata_typed_filter_metadata_clear(envoy_config_core_v3_Metadata *msg) { _upb_msg_map_clear(msg, UPB_SIZE(4, 8)); }
+UPB_INLINE bool envoy_config_core_v3_Metadata_typed_filter_metadata_set(envoy_config_core_v3_Metadata *msg, upb_strview key, struct google_protobuf_Any* val, upb_arena *a) { return _upb_msg_map_set(msg, UPB_SIZE(4, 8), &key, 0, &val, sizeof(val), a); }
+UPB_INLINE bool envoy_config_core_v3_Metadata_typed_filter_metadata_delete(envoy_config_core_v3_Metadata *msg, upb_strview key) { return _upb_msg_map_delete(msg, UPB_SIZE(4, 8), &key, 0); }
+UPB_INLINE envoy_config_core_v3_Metadata_TypedFilterMetadataEntry* envoy_config_core_v3_Metadata_typed_filter_metadata_nextmutable(envoy_config_core_v3_Metadata *msg, size_t* iter) { return (envoy_config_core_v3_Metadata_TypedFilterMetadataEntry*)_upb_msg_map_next(msg, UPB_SIZE(4, 8), iter); }
/* envoy.config.core.v3.Metadata.FilterMetadataEntry */
@@ -447,6 +489,24 @@ UPB_INLINE void envoy_config_core_v3_Metadata_FilterMetadataEntry_set_value(envo
_upb_msg_map_set_value(msg, &value, sizeof(struct google_protobuf_Struct*));
}
+/* envoy.config.core.v3.Metadata.TypedFilterMetadataEntry */
+
+UPB_INLINE upb_strview envoy_config_core_v3_Metadata_TypedFilterMetadataEntry_key(const envoy_config_core_v3_Metadata_TypedFilterMetadataEntry *msg) {
+ upb_strview ret;
+ _upb_msg_map_key(msg, &ret, 0);
+ return ret;
+}
+UPB_INLINE bool envoy_config_core_v3_Metadata_TypedFilterMetadataEntry_has_value(const envoy_config_core_v3_Metadata_TypedFilterMetadataEntry *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(8, 16)); }
+UPB_INLINE const struct google_protobuf_Any* envoy_config_core_v3_Metadata_TypedFilterMetadataEntry_value(const envoy_config_core_v3_Metadata_TypedFilterMetadataEntry *msg) {
+ struct google_protobuf_Any* ret;
+ _upb_msg_map_value(msg, &ret, sizeof(ret));
+ return ret;
+}
+
+UPB_INLINE void envoy_config_core_v3_Metadata_TypedFilterMetadataEntry_set_value(envoy_config_core_v3_Metadata_TypedFilterMetadataEntry *msg, struct google_protobuf_Any* value) {
+ _upb_msg_map_set_value(msg, &value, sizeof(struct google_protobuf_Any*));
+}
+
/* envoy.config.core.v3.RuntimeUInt32 */
UPB_INLINE envoy_config_core_v3_RuntimeUInt32 *envoy_config_core_v3_RuntimeUInt32_new(upb_arena *arena) {
diff --git a/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c b/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c
index 67c9b102b4..827de063c1 100644
--- a/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c
+++ b/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c
@@ -9,9 +9,11 @@
#include <stddef.h>
#include "upb/msg.h"
#include "envoy/config/core/v3/protocol.upb.h"
+#include "envoy/config/core/v3/extension.upb.h"
#include "envoy/type/v3/percent.upb.h"
#include "google/protobuf/duration.upb.h"
#include "google/protobuf/wrappers.upb.h"
+#include "envoy/annotations/deprecation.upb.h"
#include "udpa/annotations/status.upb.h"
#include "udpa/annotations/versioning.upb.h"
#include "validate/validate.upb.h"
@@ -24,6 +26,22 @@ const upb_msglayout envoy_config_core_v3_TcpProtocolOptions_msginit = {
UPB_SIZE(0, 0), 0, false, 255,
};
+static const upb_msglayout *const envoy_config_core_v3_QuicProtocolOptions_submsgs[1] = {
+ &google_protobuf_UInt32Value_msginit,
+};
+
+static const upb_msglayout_field envoy_config_core_v3_QuicProtocolOptions__fields[3] = {
+ {1, UPB_SIZE(4, 8), 1, 0, 11, 1},
+ {2, UPB_SIZE(8, 16), 2, 0, 11, 1},
+ {3, UPB_SIZE(12, 24), 3, 0, 11, 1},
+};
+
+const upb_msglayout envoy_config_core_v3_QuicProtocolOptions_msginit = {
+ &envoy_config_core_v3_QuicProtocolOptions_submsgs[0],
+ &envoy_config_core_v3_QuicProtocolOptions__fields[0],
+ UPB_SIZE(16, 32), 3, false, 255,
+};
+
static const upb_msglayout_field envoy_config_core_v3_UpstreamHttpProtocolOptions__fields[2] = {
{1, UPB_SIZE(0, 0), 0, 0, 8, 1},
{2, UPB_SIZE(1, 1), 0, 0, 8, 1},
@@ -35,23 +53,39 @@ const upb_msglayout envoy_config_core_v3_UpstreamHttpProtocolOptions_msginit = {
UPB_SIZE(8, 8), 2, false, 255,
};
+static const upb_msglayout *const envoy_config_core_v3_AlternateProtocolsCacheOptions_submsgs[1] = {
+ &google_protobuf_UInt32Value_msginit,
+};
+
+static const upb_msglayout_field envoy_config_core_v3_AlternateProtocolsCacheOptions__fields[2] = {
+ {1, UPB_SIZE(4, 8), 0, 0, 9, 1},
+ {2, UPB_SIZE(12, 24), 1, 0, 11, 1},
+};
+
+const upb_msglayout envoy_config_core_v3_AlternateProtocolsCacheOptions_msginit = {
+ &envoy_config_core_v3_AlternateProtocolsCacheOptions_submsgs[0],
+ &envoy_config_core_v3_AlternateProtocolsCacheOptions__fields[0],
+ UPB_SIZE(16, 32), 2, false, 255,
+};
+
static const upb_msglayout *const envoy_config_core_v3_HttpProtocolOptions_submsgs[2] = {
&google_protobuf_Duration_msginit,
&google_protobuf_UInt32Value_msginit,
};
-static const upb_msglayout_field envoy_config_core_v3_HttpProtocolOptions__fields[5] = {
+static const upb_msglayout_field envoy_config_core_v3_HttpProtocolOptions__fields[6] = {
{1, UPB_SIZE(8, 8), 1, 0, 11, 1},
{2, UPB_SIZE(12, 16), 2, 1, 11, 1},
{3, UPB_SIZE(16, 24), 3, 0, 11, 1},
{4, UPB_SIZE(20, 32), 4, 0, 11, 1},
{5, UPB_SIZE(4, 4), 0, 0, 14, 1},
+ {6, UPB_SIZE(24, 40), 5, 1, 11, 1},
};
const upb_msglayout envoy_config_core_v3_HttpProtocolOptions_msginit = {
&envoy_config_core_v3_HttpProtocolOptions_submsgs[0],
&envoy_config_core_v3_HttpProtocolOptions__fields[0],
- UPB_SIZE(24, 40), 5, false, 255,
+ UPB_SIZE(32, 48), 6, false, 255,
};
static const upb_msglayout *const envoy_config_core_v3_Http1ProtocolOptions_submsgs[2] = {
@@ -75,18 +109,20 @@ const upb_msglayout envoy_config_core_v3_Http1ProtocolOptions_msginit = {
UPB_SIZE(24, 48), 7, false, 255,
};
-static const upb_msglayout *const envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_submsgs[1] = {
+static const upb_msglayout *const envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_submsgs[2] = {
&envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_ProperCaseWords_msginit,
+ &envoy_config_core_v3_TypedExtensionConfig_msginit,
};
-static const upb_msglayout_field envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat__fields[1] = {
+static const upb_msglayout_field envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat__fields[2] = {
{1, UPB_SIZE(0, 0), UPB_SIZE(-5, -9), 0, 11, 1},
+ {8, UPB_SIZE(0, 0), UPB_SIZE(-5, -9), 1, 11, 1},
};
const upb_msglayout envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_msginit = {
&envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_submsgs[0],
&envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat__fields[0],
- UPB_SIZE(8, 16), 1, false, 255,
+ UPB_SIZE(8, 16), 2, false, 255,
};
const upb_msglayout envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_ProperCaseWords_msginit = {
@@ -100,16 +136,17 @@ static const upb_msglayout *const envoy_config_core_v3_KeepaliveSettings_submsgs
&google_protobuf_Duration_msginit,
};
-static const upb_msglayout_field envoy_config_core_v3_KeepaliveSettings__fields[3] = {
+static const upb_msglayout_field envoy_config_core_v3_KeepaliveSettings__fields[4] = {
{1, UPB_SIZE(4, 8), 1, 1, 11, 1},
{2, UPB_SIZE(8, 16), 2, 1, 11, 1},
{3, UPB_SIZE(12, 24), 3, 0, 11, 1},
+ {4, UPB_SIZE(16, 32), 4, 1, 11, 1},
};
const upb_msglayout envoy_config_core_v3_KeepaliveSettings_msginit = {
&envoy_config_core_v3_KeepaliveSettings_submsgs[0],
&envoy_config_core_v3_KeepaliveSettings__fields[0],
- UPB_SIZE(16, 32), 3, false, 255,
+ UPB_SIZE(24, 40), 4, false, 255,
};
static const upb_msglayout *const envoy_config_core_v3_Http2ProtocolOptions_submsgs[4] = {
@@ -172,10 +209,30 @@ const upb_msglayout envoy_config_core_v3_GrpcProtocolOptions_msginit = {
UPB_SIZE(8, 16), 1, false, 255,
};
+static const upb_msglayout *const envoy_config_core_v3_Http3ProtocolOptions_submsgs[2] = {
+ &envoy_config_core_v3_QuicProtocolOptions_msginit,
+ &google_protobuf_BoolValue_msginit,
+};
+
+static const upb_msglayout_field envoy_config_core_v3_Http3ProtocolOptions__fields[2] = {
+ {1, UPB_SIZE(4, 8), 1, 0, 11, 1},
+ {2, UPB_SIZE(8, 16), 2, 1, 11, 1},
+};
+
const upb_msglayout envoy_config_core_v3_Http3ProtocolOptions_msginit = {
+ &envoy_config_core_v3_Http3ProtocolOptions_submsgs[0],
+ &envoy_config_core_v3_Http3ProtocolOptions__fields[0],
+ UPB_SIZE(16, 24), 2, false, 255,
+};
+
+static const upb_msglayout_field envoy_config_core_v3_SchemeHeaderTransformation__fields[1] = {
+ {1, UPB_SIZE(0, 0), UPB_SIZE(-9, -17), 0, 9, 1},
+};
+
+const upb_msglayout envoy_config_core_v3_SchemeHeaderTransformation_msginit = {
NULL,
- NULL,
- UPB_SIZE(0, 0), 0, false, 255,
+ &envoy_config_core_v3_SchemeHeaderTransformation__fields[0],
+ UPB_SIZE(16, 32), 1, false, 255,
};
#include "upb/port_undef.inc"
diff --git a/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h b/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h
index 8bfcae6c31..8b277ef760 100644
--- a/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h
+++ b/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h
@@ -21,7 +21,9 @@ extern "C" {
#endif
struct envoy_config_core_v3_TcpProtocolOptions;
+struct envoy_config_core_v3_QuicProtocolOptions;
struct envoy_config_core_v3_UpstreamHttpProtocolOptions;
+struct envoy_config_core_v3_AlternateProtocolsCacheOptions;
struct envoy_config_core_v3_HttpProtocolOptions;
struct envoy_config_core_v3_Http1ProtocolOptions;
struct envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat;
@@ -31,8 +33,11 @@ struct envoy_config_core_v3_Http2ProtocolOptions;
struct envoy_config_core_v3_Http2ProtocolOptions_SettingsParameter;
struct envoy_config_core_v3_GrpcProtocolOptions;
struct envoy_config_core_v3_Http3ProtocolOptions;
+struct envoy_config_core_v3_SchemeHeaderTransformation;
typedef struct envoy_config_core_v3_TcpProtocolOptions envoy_config_core_v3_TcpProtocolOptions;
+typedef struct envoy_config_core_v3_QuicProtocolOptions envoy_config_core_v3_QuicProtocolOptions;
typedef struct envoy_config_core_v3_UpstreamHttpProtocolOptions envoy_config_core_v3_UpstreamHttpProtocolOptions;
+typedef struct envoy_config_core_v3_AlternateProtocolsCacheOptions envoy_config_core_v3_AlternateProtocolsCacheOptions;
typedef struct envoy_config_core_v3_HttpProtocolOptions envoy_config_core_v3_HttpProtocolOptions;
typedef struct envoy_config_core_v3_Http1ProtocolOptions envoy_config_core_v3_Http1ProtocolOptions;
typedef struct envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat;
@@ -42,8 +47,11 @@ typedef struct envoy_config_core_v3_Http2ProtocolOptions envoy_config_core_v3_Ht
typedef struct envoy_config_core_v3_Http2ProtocolOptions_SettingsParameter envoy_config_core_v3_Http2ProtocolOptions_SettingsParameter;
typedef struct envoy_config_core_v3_GrpcProtocolOptions envoy_config_core_v3_GrpcProtocolOptions;
typedef struct envoy_config_core_v3_Http3ProtocolOptions envoy_config_core_v3_Http3ProtocolOptions;
+typedef struct envoy_config_core_v3_SchemeHeaderTransformation envoy_config_core_v3_SchemeHeaderTransformation;
extern const upb_msglayout envoy_config_core_v3_TcpProtocolOptions_msginit;
+extern const upb_msglayout envoy_config_core_v3_QuicProtocolOptions_msginit;
extern const upb_msglayout envoy_config_core_v3_UpstreamHttpProtocolOptions_msginit;
+extern const upb_msglayout envoy_config_core_v3_AlternateProtocolsCacheOptions_msginit;
extern const upb_msglayout envoy_config_core_v3_HttpProtocolOptions_msginit;
extern const upb_msglayout envoy_config_core_v3_Http1ProtocolOptions_msginit;
extern const upb_msglayout envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_msginit;
@@ -53,10 +61,13 @@ extern const upb_msglayout envoy_config_core_v3_Http2ProtocolOptions_msginit;
extern const upb_msglayout envoy_config_core_v3_Http2ProtocolOptions_SettingsParameter_msginit;
extern const upb_msglayout envoy_config_core_v3_GrpcProtocolOptions_msginit;
extern const upb_msglayout envoy_config_core_v3_Http3ProtocolOptions_msginit;
+extern const upb_msglayout envoy_config_core_v3_SchemeHeaderTransformation_msginit;
+struct envoy_config_core_v3_TypedExtensionConfig;
struct envoy_type_v3_Percent;
struct google_protobuf_BoolValue;
struct google_protobuf_Duration;
struct google_protobuf_UInt32Value;
+extern const upb_msglayout envoy_config_core_v3_TypedExtensionConfig_msginit;
extern const upb_msglayout envoy_type_v3_Percent_msginit;
extern const upb_msglayout google_protobuf_BoolValue_msginit;
extern const upb_msglayout google_protobuf_Duration_msginit;
@@ -91,6 +102,73 @@ UPB_INLINE char *envoy_config_core_v3_TcpProtocolOptions_serialize(const envoy_c
+/* envoy.config.core.v3.QuicProtocolOptions */
+
+UPB_INLINE envoy_config_core_v3_QuicProtocolOptions *envoy_config_core_v3_QuicProtocolOptions_new(upb_arena *arena) {
+ return (envoy_config_core_v3_QuicProtocolOptions *)_upb_msg_new(&envoy_config_core_v3_QuicProtocolOptions_msginit, arena);
+}
+UPB_INLINE envoy_config_core_v3_QuicProtocolOptions *envoy_config_core_v3_QuicProtocolOptions_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ envoy_config_core_v3_QuicProtocolOptions *ret = envoy_config_core_v3_QuicProtocolOptions_new(arena);
+ return (ret && upb_decode(buf, size, ret, &envoy_config_core_v3_QuicProtocolOptions_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE envoy_config_core_v3_QuicProtocolOptions *envoy_config_core_v3_QuicProtocolOptions_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ envoy_config_core_v3_QuicProtocolOptions *ret = envoy_config_core_v3_QuicProtocolOptions_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &envoy_config_core_v3_QuicProtocolOptions_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *envoy_config_core_v3_QuicProtocolOptions_serialize(const envoy_config_core_v3_QuicProtocolOptions *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &envoy_config_core_v3_QuicProtocolOptions_msginit, arena, len);
+}
+
+UPB_INLINE bool envoy_config_core_v3_QuicProtocolOptions_has_max_concurrent_streams(const envoy_config_core_v3_QuicProtocolOptions *msg) { return _upb_hasbit(msg, 1); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_config_core_v3_QuicProtocolOptions_max_concurrent_streams(const envoy_config_core_v3_QuicProtocolOptions *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), const struct google_protobuf_UInt32Value*); }
+UPB_INLINE bool envoy_config_core_v3_QuicProtocolOptions_has_initial_stream_window_size(const envoy_config_core_v3_QuicProtocolOptions *msg) { return _upb_hasbit(msg, 2); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_config_core_v3_QuicProtocolOptions_initial_stream_window_size(const envoy_config_core_v3_QuicProtocolOptions *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(8, 16), const struct google_protobuf_UInt32Value*); }
+UPB_INLINE bool envoy_config_core_v3_QuicProtocolOptions_has_initial_connection_window_size(const envoy_config_core_v3_QuicProtocolOptions *msg) { return _upb_hasbit(msg, 3); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_config_core_v3_QuicProtocolOptions_initial_connection_window_size(const envoy_config_core_v3_QuicProtocolOptions *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 24), const struct google_protobuf_UInt32Value*); }
+
+UPB_INLINE void envoy_config_core_v3_QuicProtocolOptions_set_max_concurrent_streams(envoy_config_core_v3_QuicProtocolOptions *msg, struct google_protobuf_UInt32Value* value) {
+ _upb_sethas(msg, 1);
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 8), struct google_protobuf_UInt32Value*) = value;
+}
+UPB_INLINE struct google_protobuf_UInt32Value* envoy_config_core_v3_QuicProtocolOptions_mutable_max_concurrent_streams(envoy_config_core_v3_QuicProtocolOptions *msg, upb_arena *arena) {
+ struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_config_core_v3_QuicProtocolOptions_max_concurrent_streams(msg);
+ if (sub == NULL) {
+ sub = (struct google_protobuf_UInt32Value*)_upb_msg_new(&google_protobuf_UInt32Value_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_core_v3_QuicProtocolOptions_set_max_concurrent_streams(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void envoy_config_core_v3_QuicProtocolOptions_set_initial_stream_window_size(envoy_config_core_v3_QuicProtocolOptions *msg, struct google_protobuf_UInt32Value* value) {
+ _upb_sethas(msg, 2);
+ *UPB_PTR_AT(msg, UPB_SIZE(8, 16), struct google_protobuf_UInt32Value*) = value;
+}
+UPB_INLINE struct google_protobuf_UInt32Value* envoy_config_core_v3_QuicProtocolOptions_mutable_initial_stream_window_size(envoy_config_core_v3_QuicProtocolOptions *msg, upb_arena *arena) {
+ struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_config_core_v3_QuicProtocolOptions_initial_stream_window_size(msg);
+ if (sub == NULL) {
+ sub = (struct google_protobuf_UInt32Value*)_upb_msg_new(&google_protobuf_UInt32Value_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_core_v3_QuicProtocolOptions_set_initial_stream_window_size(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void envoy_config_core_v3_QuicProtocolOptions_set_initial_connection_window_size(envoy_config_core_v3_QuicProtocolOptions *msg, struct google_protobuf_UInt32Value* value) {
+ _upb_sethas(msg, 3);
+ *UPB_PTR_AT(msg, UPB_SIZE(12, 24), struct google_protobuf_UInt32Value*) = value;
+}
+UPB_INLINE struct google_protobuf_UInt32Value* envoy_config_core_v3_QuicProtocolOptions_mutable_initial_connection_window_size(envoy_config_core_v3_QuicProtocolOptions *msg, upb_arena *arena) {
+ struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_config_core_v3_QuicProtocolOptions_initial_connection_window_size(msg);
+ if (sub == NULL) {
+ sub = (struct google_protobuf_UInt32Value*)_upb_msg_new(&google_protobuf_UInt32Value_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_core_v3_QuicProtocolOptions_set_initial_connection_window_size(msg, sub);
+ }
+ return sub;
+}
+
/* envoy.config.core.v3.UpstreamHttpProtocolOptions */
UPB_INLINE envoy_config_core_v3_UpstreamHttpProtocolOptions *envoy_config_core_v3_UpstreamHttpProtocolOptions_new(upb_arena *arena) {
@@ -121,6 +199,47 @@ UPB_INLINE void envoy_config_core_v3_UpstreamHttpProtocolOptions_set_auto_san_va
*UPB_PTR_AT(msg, UPB_SIZE(1, 1), bool) = value;
}
+/* envoy.config.core.v3.AlternateProtocolsCacheOptions */
+
+UPB_INLINE envoy_config_core_v3_AlternateProtocolsCacheOptions *envoy_config_core_v3_AlternateProtocolsCacheOptions_new(upb_arena *arena) {
+ return (envoy_config_core_v3_AlternateProtocolsCacheOptions *)_upb_msg_new(&envoy_config_core_v3_AlternateProtocolsCacheOptions_msginit, arena);
+}
+UPB_INLINE envoy_config_core_v3_AlternateProtocolsCacheOptions *envoy_config_core_v3_AlternateProtocolsCacheOptions_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ envoy_config_core_v3_AlternateProtocolsCacheOptions *ret = envoy_config_core_v3_AlternateProtocolsCacheOptions_new(arena);
+ return (ret && upb_decode(buf, size, ret, &envoy_config_core_v3_AlternateProtocolsCacheOptions_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE envoy_config_core_v3_AlternateProtocolsCacheOptions *envoy_config_core_v3_AlternateProtocolsCacheOptions_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ envoy_config_core_v3_AlternateProtocolsCacheOptions *ret = envoy_config_core_v3_AlternateProtocolsCacheOptions_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &envoy_config_core_v3_AlternateProtocolsCacheOptions_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *envoy_config_core_v3_AlternateProtocolsCacheOptions_serialize(const envoy_config_core_v3_AlternateProtocolsCacheOptions *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &envoy_config_core_v3_AlternateProtocolsCacheOptions_msginit, arena, len);
+}
+
+UPB_INLINE upb_strview envoy_config_core_v3_AlternateProtocolsCacheOptions_name(const envoy_config_core_v3_AlternateProtocolsCacheOptions *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview); }
+UPB_INLINE bool envoy_config_core_v3_AlternateProtocolsCacheOptions_has_max_entries(const envoy_config_core_v3_AlternateProtocolsCacheOptions *msg) { return _upb_hasbit(msg, 1); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_config_core_v3_AlternateProtocolsCacheOptions_max_entries(const envoy_config_core_v3_AlternateProtocolsCacheOptions *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 24), const struct google_protobuf_UInt32Value*); }
+
+UPB_INLINE void envoy_config_core_v3_AlternateProtocolsCacheOptions_set_name(envoy_config_core_v3_AlternateProtocolsCacheOptions *msg, upb_strview value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview) = value;
+}
+UPB_INLINE void envoy_config_core_v3_AlternateProtocolsCacheOptions_set_max_entries(envoy_config_core_v3_AlternateProtocolsCacheOptions *msg, struct google_protobuf_UInt32Value* value) {
+ _upb_sethas(msg, 1);
+ *UPB_PTR_AT(msg, UPB_SIZE(12, 24), struct google_protobuf_UInt32Value*) = value;
+}
+UPB_INLINE struct google_protobuf_UInt32Value* envoy_config_core_v3_AlternateProtocolsCacheOptions_mutable_max_entries(envoy_config_core_v3_AlternateProtocolsCacheOptions *msg, upb_arena *arena) {
+ struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_config_core_v3_AlternateProtocolsCacheOptions_max_entries(msg);
+ if (sub == NULL) {
+ sub = (struct google_protobuf_UInt32Value*)_upb_msg_new(&google_protobuf_UInt32Value_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_core_v3_AlternateProtocolsCacheOptions_set_max_entries(msg, sub);
+ }
+ return sub;
+}
+
/* envoy.config.core.v3.HttpProtocolOptions */
UPB_INLINE envoy_config_core_v3_HttpProtocolOptions *envoy_config_core_v3_HttpProtocolOptions_new(upb_arena *arena) {
@@ -150,6 +269,8 @@ UPB_INLINE const struct google_protobuf_Duration* envoy_config_core_v3_HttpProto
UPB_INLINE bool envoy_config_core_v3_HttpProtocolOptions_has_max_stream_duration(const envoy_config_core_v3_HttpProtocolOptions *msg) { return _upb_hasbit(msg, 4); }
UPB_INLINE const struct google_protobuf_Duration* envoy_config_core_v3_HttpProtocolOptions_max_stream_duration(const envoy_config_core_v3_HttpProtocolOptions *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(20, 32), const struct google_protobuf_Duration*); }
UPB_INLINE int32_t envoy_config_core_v3_HttpProtocolOptions_headers_with_underscores_action(const envoy_config_core_v3_HttpProtocolOptions *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 4), int32_t); }
+UPB_INLINE bool envoy_config_core_v3_HttpProtocolOptions_has_max_requests_per_connection(const envoy_config_core_v3_HttpProtocolOptions *msg) { return _upb_hasbit(msg, 5); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_config_core_v3_HttpProtocolOptions_max_requests_per_connection(const envoy_config_core_v3_HttpProtocolOptions *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(24, 40), const struct google_protobuf_UInt32Value*); }
UPB_INLINE void envoy_config_core_v3_HttpProtocolOptions_set_idle_timeout(envoy_config_core_v3_HttpProtocolOptions *msg, struct google_protobuf_Duration* value) {
_upb_sethas(msg, 1);
@@ -206,6 +327,19 @@ UPB_INLINE struct google_protobuf_Duration* envoy_config_core_v3_HttpProtocolOpt
UPB_INLINE void envoy_config_core_v3_HttpProtocolOptions_set_headers_with_underscores_action(envoy_config_core_v3_HttpProtocolOptions *msg, int32_t value) {
*UPB_PTR_AT(msg, UPB_SIZE(4, 4), int32_t) = value;
}
+UPB_INLINE void envoy_config_core_v3_HttpProtocolOptions_set_max_requests_per_connection(envoy_config_core_v3_HttpProtocolOptions *msg, struct google_protobuf_UInt32Value* value) {
+ _upb_sethas(msg, 5);
+ *UPB_PTR_AT(msg, UPB_SIZE(24, 40), struct google_protobuf_UInt32Value*) = value;
+}
+UPB_INLINE struct google_protobuf_UInt32Value* envoy_config_core_v3_HttpProtocolOptions_mutable_max_requests_per_connection(envoy_config_core_v3_HttpProtocolOptions *msg, upb_arena *arena) {
+ struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_config_core_v3_HttpProtocolOptions_max_requests_per_connection(msg);
+ if (sub == NULL) {
+ sub = (struct google_protobuf_UInt32Value*)_upb_msg_new(&google_protobuf_UInt32Value_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_core_v3_HttpProtocolOptions_set_max_requests_per_connection(msg, sub);
+ }
+ return sub;
+}
/* envoy.config.core.v3.Http1ProtocolOptions */
@@ -312,12 +446,15 @@ UPB_INLINE char *envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_seria
typedef enum {
envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_header_format_proper_case_words = 1,
+ envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_header_format_stateful_formatter = 8,
envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_header_format_NOT_SET = 0
} envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_header_format_oneofcases;
UPB_INLINE envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_header_format_oneofcases envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_header_format_case(const envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat* msg) { return (envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_header_format_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(4, 8), int32_t); }
UPB_INLINE bool envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_has_proper_case_words(const envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat *msg) { return _upb_getoneofcase(msg, UPB_SIZE(4, 8)) == 1; }
UPB_INLINE const envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_ProperCaseWords* envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_proper_case_words(const envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat *msg) { return UPB_READ_ONEOF(msg, const envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_ProperCaseWords*, UPB_SIZE(0, 0), UPB_SIZE(4, 8), 1, NULL); }
+UPB_INLINE bool envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_has_stateful_formatter(const envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat *msg) { return _upb_getoneofcase(msg, UPB_SIZE(4, 8)) == 8; }
+UPB_INLINE const struct envoy_config_core_v3_TypedExtensionConfig* envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_stateful_formatter(const envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat *msg) { return UPB_READ_ONEOF(msg, const struct envoy_config_core_v3_TypedExtensionConfig*, UPB_SIZE(0, 0), UPB_SIZE(4, 8), 8, NULL); }
UPB_INLINE void envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_set_proper_case_words(envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat *msg, envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_ProperCaseWords* value) {
UPB_WRITE_ONEOF(msg, envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_ProperCaseWords*, UPB_SIZE(0, 0), value, UPB_SIZE(4, 8), 1);
@@ -331,6 +468,18 @@ UPB_INLINE struct envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_Prop
}
return sub;
}
+UPB_INLINE void envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_set_stateful_formatter(envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat *msg, struct envoy_config_core_v3_TypedExtensionConfig* value) {
+ UPB_WRITE_ONEOF(msg, struct envoy_config_core_v3_TypedExtensionConfig*, UPB_SIZE(0, 0), value, UPB_SIZE(4, 8), 8);
+}
+UPB_INLINE struct envoy_config_core_v3_TypedExtensionConfig* envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_mutable_stateful_formatter(envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat *msg, upb_arena *arena) {
+ struct envoy_config_core_v3_TypedExtensionConfig* sub = (struct envoy_config_core_v3_TypedExtensionConfig*)envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_stateful_formatter(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_config_core_v3_TypedExtensionConfig*)_upb_msg_new(&envoy_config_core_v3_TypedExtensionConfig_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_set_stateful_formatter(msg, sub);
+ }
+ return sub;
+}
/* envoy.config.core.v3.Http1ProtocolOptions.HeaderKeyFormat.ProperCaseWords */
@@ -380,6 +529,8 @@ UPB_INLINE bool envoy_config_core_v3_KeepaliveSettings_has_timeout(const envoy_c
UPB_INLINE const struct google_protobuf_Duration* envoy_config_core_v3_KeepaliveSettings_timeout(const envoy_config_core_v3_KeepaliveSettings *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(8, 16), const struct google_protobuf_Duration*); }
UPB_INLINE bool envoy_config_core_v3_KeepaliveSettings_has_interval_jitter(const envoy_config_core_v3_KeepaliveSettings *msg) { return _upb_hasbit(msg, 3); }
UPB_INLINE const struct envoy_type_v3_Percent* envoy_config_core_v3_KeepaliveSettings_interval_jitter(const envoy_config_core_v3_KeepaliveSettings *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 24), const struct envoy_type_v3_Percent*); }
+UPB_INLINE bool envoy_config_core_v3_KeepaliveSettings_has_connection_idle_interval(const envoy_config_core_v3_KeepaliveSettings *msg) { return _upb_hasbit(msg, 4); }
+UPB_INLINE const struct google_protobuf_Duration* envoy_config_core_v3_KeepaliveSettings_connection_idle_interval(const envoy_config_core_v3_KeepaliveSettings *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(16, 32), const struct google_protobuf_Duration*); }
UPB_INLINE void envoy_config_core_v3_KeepaliveSettings_set_interval(envoy_config_core_v3_KeepaliveSettings *msg, struct google_protobuf_Duration* value) {
_upb_sethas(msg, 1);
@@ -420,6 +571,19 @@ UPB_INLINE struct envoy_type_v3_Percent* envoy_config_core_v3_KeepaliveSettings_
}
return sub;
}
+UPB_INLINE void envoy_config_core_v3_KeepaliveSettings_set_connection_idle_interval(envoy_config_core_v3_KeepaliveSettings *msg, struct google_protobuf_Duration* value) {
+ _upb_sethas(msg, 4);
+ *UPB_PTR_AT(msg, UPB_SIZE(16, 32), struct google_protobuf_Duration*) = value;
+}
+UPB_INLINE struct google_protobuf_Duration* envoy_config_core_v3_KeepaliveSettings_mutable_connection_idle_interval(envoy_config_core_v3_KeepaliveSettings *msg, upb_arena *arena) {
+ struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_config_core_v3_KeepaliveSettings_connection_idle_interval(msg);
+ if (sub == NULL) {
+ sub = (struct google_protobuf_Duration*)_upb_msg_new(&google_protobuf_Duration_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_core_v3_KeepaliveSettings_set_connection_idle_interval(msg, sub);
+ }
+ return sub;
+}
/* envoy.config.core.v3.Http2ProtocolOptions */
@@ -744,7 +908,70 @@ UPB_INLINE char *envoy_config_core_v3_Http3ProtocolOptions_serialize(const envoy
return upb_encode(msg, &envoy_config_core_v3_Http3ProtocolOptions_msginit, arena, len);
}
+UPB_INLINE bool envoy_config_core_v3_Http3ProtocolOptions_has_quic_protocol_options(const envoy_config_core_v3_Http3ProtocolOptions *msg) { return _upb_hasbit(msg, 1); }
+UPB_INLINE const envoy_config_core_v3_QuicProtocolOptions* envoy_config_core_v3_Http3ProtocolOptions_quic_protocol_options(const envoy_config_core_v3_Http3ProtocolOptions *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), const envoy_config_core_v3_QuicProtocolOptions*); }
+UPB_INLINE bool envoy_config_core_v3_Http3ProtocolOptions_has_override_stream_error_on_invalid_http_message(const envoy_config_core_v3_Http3ProtocolOptions *msg) { return _upb_hasbit(msg, 2); }
+UPB_INLINE const struct google_protobuf_BoolValue* envoy_config_core_v3_Http3ProtocolOptions_override_stream_error_on_invalid_http_message(const envoy_config_core_v3_Http3ProtocolOptions *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(8, 16), const struct google_protobuf_BoolValue*); }
+UPB_INLINE void envoy_config_core_v3_Http3ProtocolOptions_set_quic_protocol_options(envoy_config_core_v3_Http3ProtocolOptions *msg, envoy_config_core_v3_QuicProtocolOptions* value) {
+ _upb_sethas(msg, 1);
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 8), envoy_config_core_v3_QuicProtocolOptions*) = value;
+}
+UPB_INLINE struct envoy_config_core_v3_QuicProtocolOptions* envoy_config_core_v3_Http3ProtocolOptions_mutable_quic_protocol_options(envoy_config_core_v3_Http3ProtocolOptions *msg, upb_arena *arena) {
+ struct envoy_config_core_v3_QuicProtocolOptions* sub = (struct envoy_config_core_v3_QuicProtocolOptions*)envoy_config_core_v3_Http3ProtocolOptions_quic_protocol_options(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_config_core_v3_QuicProtocolOptions*)_upb_msg_new(&envoy_config_core_v3_QuicProtocolOptions_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_core_v3_Http3ProtocolOptions_set_quic_protocol_options(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void envoy_config_core_v3_Http3ProtocolOptions_set_override_stream_error_on_invalid_http_message(envoy_config_core_v3_Http3ProtocolOptions *msg, struct google_protobuf_BoolValue* value) {
+ _upb_sethas(msg, 2);
+ *UPB_PTR_AT(msg, UPB_SIZE(8, 16), struct google_protobuf_BoolValue*) = value;
+}
+UPB_INLINE struct google_protobuf_BoolValue* envoy_config_core_v3_Http3ProtocolOptions_mutable_override_stream_error_on_invalid_http_message(envoy_config_core_v3_Http3ProtocolOptions *msg, upb_arena *arena) {
+ struct google_protobuf_BoolValue* sub = (struct google_protobuf_BoolValue*)envoy_config_core_v3_Http3ProtocolOptions_override_stream_error_on_invalid_http_message(msg);
+ if (sub == NULL) {
+ sub = (struct google_protobuf_BoolValue*)_upb_msg_new(&google_protobuf_BoolValue_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_core_v3_Http3ProtocolOptions_set_override_stream_error_on_invalid_http_message(msg, sub);
+ }
+ return sub;
+}
+
+/* envoy.config.core.v3.SchemeHeaderTransformation */
+
+UPB_INLINE envoy_config_core_v3_SchemeHeaderTransformation *envoy_config_core_v3_SchemeHeaderTransformation_new(upb_arena *arena) {
+ return (envoy_config_core_v3_SchemeHeaderTransformation *)_upb_msg_new(&envoy_config_core_v3_SchemeHeaderTransformation_msginit, arena);
+}
+UPB_INLINE envoy_config_core_v3_SchemeHeaderTransformation *envoy_config_core_v3_SchemeHeaderTransformation_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ envoy_config_core_v3_SchemeHeaderTransformation *ret = envoy_config_core_v3_SchemeHeaderTransformation_new(arena);
+ return (ret && upb_decode(buf, size, ret, &envoy_config_core_v3_SchemeHeaderTransformation_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE envoy_config_core_v3_SchemeHeaderTransformation *envoy_config_core_v3_SchemeHeaderTransformation_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ envoy_config_core_v3_SchemeHeaderTransformation *ret = envoy_config_core_v3_SchemeHeaderTransformation_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &envoy_config_core_v3_SchemeHeaderTransformation_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *envoy_config_core_v3_SchemeHeaderTransformation_serialize(const envoy_config_core_v3_SchemeHeaderTransformation *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &envoy_config_core_v3_SchemeHeaderTransformation_msginit, arena, len);
+}
+
+typedef enum {
+ envoy_config_core_v3_SchemeHeaderTransformation_transformation_scheme_to_overwrite = 1,
+ envoy_config_core_v3_SchemeHeaderTransformation_transformation_NOT_SET = 0
+} envoy_config_core_v3_SchemeHeaderTransformation_transformation_oneofcases;
+UPB_INLINE envoy_config_core_v3_SchemeHeaderTransformation_transformation_oneofcases envoy_config_core_v3_SchemeHeaderTransformation_transformation_case(const envoy_config_core_v3_SchemeHeaderTransformation* msg) { return (envoy_config_core_v3_SchemeHeaderTransformation_transformation_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(8, 16), int32_t); }
+
+UPB_INLINE bool envoy_config_core_v3_SchemeHeaderTransformation_has_scheme_to_overwrite(const envoy_config_core_v3_SchemeHeaderTransformation *msg) { return _upb_getoneofcase(msg, UPB_SIZE(8, 16)) == 1; }
+UPB_INLINE upb_strview envoy_config_core_v3_SchemeHeaderTransformation_scheme_to_overwrite(const envoy_config_core_v3_SchemeHeaderTransformation *msg) { return UPB_READ_ONEOF(msg, upb_strview, UPB_SIZE(0, 0), UPB_SIZE(8, 16), 1, upb_strview_make("", strlen(""))); }
+
+UPB_INLINE void envoy_config_core_v3_SchemeHeaderTransformation_set_scheme_to_overwrite(envoy_config_core_v3_SchemeHeaderTransformation *msg, upb_strview value) {
+ UPB_WRITE_ONEOF(msg, upb_strview, UPB_SIZE(0, 0), value, UPB_SIZE(8, 16), 1);
+}
#ifdef __cplusplus
} /* extern "C" */
diff --git a/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c b/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c
new file mode 100644
index 0000000000..66b8a4ef79
--- /dev/null
+++ b/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c
@@ -0,0 +1,46 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/config/core/v3/resolver.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include <stddef.h>
+#include "upb/msg.h"
+#include "envoy/config/core/v3/resolver.upb.h"
+#include "envoy/config/core/v3/address.upb.h"
+#include "udpa/annotations/status.upb.h"
+#include "validate/validate.upb.h"
+
+#include "upb/port_def.inc"
+
+static const upb_msglayout_field envoy_config_core_v3_DnsResolverOptions__fields[2] = {
+ {1, UPB_SIZE(0, 0), 0, 0, 8, 1},
+ {2, UPB_SIZE(1, 1), 0, 0, 8, 1},
+};
+
+const upb_msglayout envoy_config_core_v3_DnsResolverOptions_msginit = {
+ NULL,
+ &envoy_config_core_v3_DnsResolverOptions__fields[0],
+ UPB_SIZE(8, 8), 2, false, 255,
+};
+
+static const upb_msglayout *const envoy_config_core_v3_DnsResolutionConfig_submsgs[2] = {
+ &envoy_config_core_v3_Address_msginit,
+ &envoy_config_core_v3_DnsResolverOptions_msginit,
+};
+
+static const upb_msglayout_field envoy_config_core_v3_DnsResolutionConfig__fields[2] = {
+ {1, UPB_SIZE(8, 16), 0, 0, 11, 3},
+ {2, UPB_SIZE(4, 8), 1, 1, 11, 1},
+};
+
+const upb_msglayout envoy_config_core_v3_DnsResolutionConfig_msginit = {
+ &envoy_config_core_v3_DnsResolutionConfig_submsgs[0],
+ &envoy_config_core_v3_DnsResolutionConfig__fields[0],
+ UPB_SIZE(16, 24), 2, false, 255,
+};
+
+#include "upb/port_undef.inc"
+
diff --git a/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h b/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h
new file mode 100644
index 0000000000..c86e29ed0a
--- /dev/null
+++ b/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h
@@ -0,0 +1,121 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/config/core/v3/resolver.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef ENVOY_CONFIG_CORE_V3_RESOLVER_PROTO_UPB_H_
+#define ENVOY_CONFIG_CORE_V3_RESOLVER_PROTO_UPB_H_
+
+#include "upb/msg.h"
+#include "upb/decode.h"
+#include "upb/decode_fast.h"
+#include "upb/encode.h"
+
+#include "upb/port_def.inc"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct envoy_config_core_v3_DnsResolverOptions;
+struct envoy_config_core_v3_DnsResolutionConfig;
+typedef struct envoy_config_core_v3_DnsResolverOptions envoy_config_core_v3_DnsResolverOptions;
+typedef struct envoy_config_core_v3_DnsResolutionConfig envoy_config_core_v3_DnsResolutionConfig;
+extern const upb_msglayout envoy_config_core_v3_DnsResolverOptions_msginit;
+extern const upb_msglayout envoy_config_core_v3_DnsResolutionConfig_msginit;
+struct envoy_config_core_v3_Address;
+extern const upb_msglayout envoy_config_core_v3_Address_msginit;
+
+
+/* envoy.config.core.v3.DnsResolverOptions */
+
+UPB_INLINE envoy_config_core_v3_DnsResolverOptions *envoy_config_core_v3_DnsResolverOptions_new(upb_arena *arena) {
+ return (envoy_config_core_v3_DnsResolverOptions *)_upb_msg_new(&envoy_config_core_v3_DnsResolverOptions_msginit, arena);
+}
+UPB_INLINE envoy_config_core_v3_DnsResolverOptions *envoy_config_core_v3_DnsResolverOptions_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ envoy_config_core_v3_DnsResolverOptions *ret = envoy_config_core_v3_DnsResolverOptions_new(arena);
+ return (ret && upb_decode(buf, size, ret, &envoy_config_core_v3_DnsResolverOptions_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE envoy_config_core_v3_DnsResolverOptions *envoy_config_core_v3_DnsResolverOptions_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ envoy_config_core_v3_DnsResolverOptions *ret = envoy_config_core_v3_DnsResolverOptions_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &envoy_config_core_v3_DnsResolverOptions_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *envoy_config_core_v3_DnsResolverOptions_serialize(const envoy_config_core_v3_DnsResolverOptions *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &envoy_config_core_v3_DnsResolverOptions_msginit, arena, len);
+}
+
+UPB_INLINE bool envoy_config_core_v3_DnsResolverOptions_use_tcp_for_dns_lookups(const envoy_config_core_v3_DnsResolverOptions *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(0, 0), bool); }
+UPB_INLINE bool envoy_config_core_v3_DnsResolverOptions_no_default_search_domain(const envoy_config_core_v3_DnsResolverOptions *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(1, 1), bool); }
+
+UPB_INLINE void envoy_config_core_v3_DnsResolverOptions_set_use_tcp_for_dns_lookups(envoy_config_core_v3_DnsResolverOptions *msg, bool value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(0, 0), bool) = value;
+}
+UPB_INLINE void envoy_config_core_v3_DnsResolverOptions_set_no_default_search_domain(envoy_config_core_v3_DnsResolverOptions *msg, bool value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(1, 1), bool) = value;
+}
+
+/* envoy.config.core.v3.DnsResolutionConfig */
+
+UPB_INLINE envoy_config_core_v3_DnsResolutionConfig *envoy_config_core_v3_DnsResolutionConfig_new(upb_arena *arena) {
+ return (envoy_config_core_v3_DnsResolutionConfig *)_upb_msg_new(&envoy_config_core_v3_DnsResolutionConfig_msginit, arena);
+}
+UPB_INLINE envoy_config_core_v3_DnsResolutionConfig *envoy_config_core_v3_DnsResolutionConfig_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ envoy_config_core_v3_DnsResolutionConfig *ret = envoy_config_core_v3_DnsResolutionConfig_new(arena);
+ return (ret && upb_decode(buf, size, ret, &envoy_config_core_v3_DnsResolutionConfig_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE envoy_config_core_v3_DnsResolutionConfig *envoy_config_core_v3_DnsResolutionConfig_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ envoy_config_core_v3_DnsResolutionConfig *ret = envoy_config_core_v3_DnsResolutionConfig_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &envoy_config_core_v3_DnsResolutionConfig_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *envoy_config_core_v3_DnsResolutionConfig_serialize(const envoy_config_core_v3_DnsResolutionConfig *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &envoy_config_core_v3_DnsResolutionConfig_msginit, arena, len);
+}
+
+UPB_INLINE bool envoy_config_core_v3_DnsResolutionConfig_has_resolvers(const envoy_config_core_v3_DnsResolutionConfig *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(8, 16)); }
+UPB_INLINE const struct envoy_config_core_v3_Address* const* envoy_config_core_v3_DnsResolutionConfig_resolvers(const envoy_config_core_v3_DnsResolutionConfig *msg, size_t *len) { return (const struct envoy_config_core_v3_Address* const*)_upb_array_accessor(msg, UPB_SIZE(8, 16), len); }
+UPB_INLINE bool envoy_config_core_v3_DnsResolutionConfig_has_dns_resolver_options(const envoy_config_core_v3_DnsResolutionConfig *msg) { return _upb_hasbit(msg, 1); }
+UPB_INLINE const envoy_config_core_v3_DnsResolverOptions* envoy_config_core_v3_DnsResolutionConfig_dns_resolver_options(const envoy_config_core_v3_DnsResolutionConfig *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), const envoy_config_core_v3_DnsResolverOptions*); }
+
+UPB_INLINE struct envoy_config_core_v3_Address** envoy_config_core_v3_DnsResolutionConfig_mutable_resolvers(envoy_config_core_v3_DnsResolutionConfig *msg, size_t *len) {
+ return (struct envoy_config_core_v3_Address**)_upb_array_mutable_accessor(msg, UPB_SIZE(8, 16), len);
+}
+UPB_INLINE struct envoy_config_core_v3_Address** envoy_config_core_v3_DnsResolutionConfig_resize_resolvers(envoy_config_core_v3_DnsResolutionConfig *msg, size_t len, upb_arena *arena) {
+ return (struct envoy_config_core_v3_Address**)_upb_array_resize_accessor2(msg, UPB_SIZE(8, 16), len, UPB_SIZE(2, 3), arena);
+}
+UPB_INLINE struct envoy_config_core_v3_Address* envoy_config_core_v3_DnsResolutionConfig_add_resolvers(envoy_config_core_v3_DnsResolutionConfig *msg, upb_arena *arena) {
+ struct envoy_config_core_v3_Address* sub = (struct envoy_config_core_v3_Address*)_upb_msg_new(&envoy_config_core_v3_Address_msginit, arena);
+ bool ok = _upb_array_append_accessor2(
+ msg, UPB_SIZE(8, 16), UPB_SIZE(2, 3), &sub, arena);
+ if (!ok) return NULL;
+ return sub;
+}
+UPB_INLINE void envoy_config_core_v3_DnsResolutionConfig_set_dns_resolver_options(envoy_config_core_v3_DnsResolutionConfig *msg, envoy_config_core_v3_DnsResolverOptions* value) {
+ _upb_sethas(msg, 1);
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 8), envoy_config_core_v3_DnsResolverOptions*) = value;
+}
+UPB_INLINE struct envoy_config_core_v3_DnsResolverOptions* envoy_config_core_v3_DnsResolutionConfig_mutable_dns_resolver_options(envoy_config_core_v3_DnsResolutionConfig *msg, upb_arena *arena) {
+ struct envoy_config_core_v3_DnsResolverOptions* sub = (struct envoy_config_core_v3_DnsResolverOptions*)envoy_config_core_v3_DnsResolutionConfig_dns_resolver_options(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_config_core_v3_DnsResolverOptions*)_upb_msg_new(&envoy_config_core_v3_DnsResolverOptions_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_core_v3_DnsResolutionConfig_set_dns_resolver_options(msg, sub);
+ }
+ return sub;
+}
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif /* ENVOY_CONFIG_CORE_V3_RESOLVER_PROTO_UPB_H_ */
diff --git a/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c b/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c
index 71781640be..17c92619de 100644
--- a/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c
+++ b/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c
@@ -12,6 +12,7 @@
#include "envoy/config/core/v3/base.upb.h"
#include "envoy/config/core/v3/extension.upb.h"
#include "google/protobuf/struct.upb.h"
+#include "envoy/annotations/deprecation.upb.h"
#include "udpa/annotations/status.upb.h"
#include "validate/validate.upb.h"
diff --git a/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c b/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c
new file mode 100644
index 0000000000..cd01106ce8
--- /dev/null
+++ b/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c
@@ -0,0 +1,35 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/config/core/v3/udp_socket_config.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include <stddef.h>
+#include "upb/msg.h"
+#include "envoy/config/core/v3/udp_socket_config.upb.h"
+#include "google/protobuf/wrappers.upb.h"
+#include "udpa/annotations/status.upb.h"
+#include "validate/validate.upb.h"
+
+#include "upb/port_def.inc"
+
+static const upb_msglayout *const envoy_config_core_v3_UdpSocketConfig_submsgs[2] = {
+ &google_protobuf_BoolValue_msginit,
+ &google_protobuf_UInt64Value_msginit,
+};
+
+static const upb_msglayout_field envoy_config_core_v3_UdpSocketConfig__fields[2] = {
+ {1, UPB_SIZE(4, 8), 1, 1, 11, 1},
+ {2, UPB_SIZE(8, 16), 2, 0, 11, 1},
+};
+
+const upb_msglayout envoy_config_core_v3_UdpSocketConfig_msginit = {
+ &envoy_config_core_v3_UdpSocketConfig_submsgs[0],
+ &envoy_config_core_v3_UdpSocketConfig__fields[0],
+ UPB_SIZE(16, 24), 2, false, 255,
+};
+
+#include "upb/port_undef.inc"
+
diff --git a/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h b/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h
new file mode 100644
index 0000000000..e61e18dbaa
--- /dev/null
+++ b/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h
@@ -0,0 +1,90 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/config/core/v3/udp_socket_config.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef ENVOY_CONFIG_CORE_V3_UDP_SOCKET_CONFIG_PROTO_UPB_H_
+#define ENVOY_CONFIG_CORE_V3_UDP_SOCKET_CONFIG_PROTO_UPB_H_
+
+#include "upb/msg.h"
+#include "upb/decode.h"
+#include "upb/decode_fast.h"
+#include "upb/encode.h"
+
+#include "upb/port_def.inc"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct envoy_config_core_v3_UdpSocketConfig;
+typedef struct envoy_config_core_v3_UdpSocketConfig envoy_config_core_v3_UdpSocketConfig;
+extern const upb_msglayout envoy_config_core_v3_UdpSocketConfig_msginit;
+struct google_protobuf_BoolValue;
+struct google_protobuf_UInt64Value;
+extern const upb_msglayout google_protobuf_BoolValue_msginit;
+extern const upb_msglayout google_protobuf_UInt64Value_msginit;
+
+
+/* envoy.config.core.v3.UdpSocketConfig */
+
+UPB_INLINE envoy_config_core_v3_UdpSocketConfig *envoy_config_core_v3_UdpSocketConfig_new(upb_arena *arena) {
+ return (envoy_config_core_v3_UdpSocketConfig *)_upb_msg_new(&envoy_config_core_v3_UdpSocketConfig_msginit, arena);
+}
+UPB_INLINE envoy_config_core_v3_UdpSocketConfig *envoy_config_core_v3_UdpSocketConfig_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ envoy_config_core_v3_UdpSocketConfig *ret = envoy_config_core_v3_UdpSocketConfig_new(arena);
+ return (ret && upb_decode(buf, size, ret, &envoy_config_core_v3_UdpSocketConfig_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE envoy_config_core_v3_UdpSocketConfig *envoy_config_core_v3_UdpSocketConfig_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ envoy_config_core_v3_UdpSocketConfig *ret = envoy_config_core_v3_UdpSocketConfig_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &envoy_config_core_v3_UdpSocketConfig_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *envoy_config_core_v3_UdpSocketConfig_serialize(const envoy_config_core_v3_UdpSocketConfig *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &envoy_config_core_v3_UdpSocketConfig_msginit, arena, len);
+}
+
+UPB_INLINE bool envoy_config_core_v3_UdpSocketConfig_has_max_rx_datagram_size(const envoy_config_core_v3_UdpSocketConfig *msg) { return _upb_hasbit(msg, 1); }
+UPB_INLINE const struct google_protobuf_UInt64Value* envoy_config_core_v3_UdpSocketConfig_max_rx_datagram_size(const envoy_config_core_v3_UdpSocketConfig *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), const struct google_protobuf_UInt64Value*); }
+UPB_INLINE bool envoy_config_core_v3_UdpSocketConfig_has_prefer_gro(const envoy_config_core_v3_UdpSocketConfig *msg) { return _upb_hasbit(msg, 2); }
+UPB_INLINE const struct google_protobuf_BoolValue* envoy_config_core_v3_UdpSocketConfig_prefer_gro(const envoy_config_core_v3_UdpSocketConfig *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(8, 16), const struct google_protobuf_BoolValue*); }
+
+UPB_INLINE void envoy_config_core_v3_UdpSocketConfig_set_max_rx_datagram_size(envoy_config_core_v3_UdpSocketConfig *msg, struct google_protobuf_UInt64Value* value) {
+ _upb_sethas(msg, 1);
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 8), struct google_protobuf_UInt64Value*) = value;
+}
+UPB_INLINE struct google_protobuf_UInt64Value* envoy_config_core_v3_UdpSocketConfig_mutable_max_rx_datagram_size(envoy_config_core_v3_UdpSocketConfig *msg, upb_arena *arena) {
+ struct google_protobuf_UInt64Value* sub = (struct google_protobuf_UInt64Value*)envoy_config_core_v3_UdpSocketConfig_max_rx_datagram_size(msg);
+ if (sub == NULL) {
+ sub = (struct google_protobuf_UInt64Value*)_upb_msg_new(&google_protobuf_UInt64Value_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_core_v3_UdpSocketConfig_set_max_rx_datagram_size(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void envoy_config_core_v3_UdpSocketConfig_set_prefer_gro(envoy_config_core_v3_UdpSocketConfig *msg, struct google_protobuf_BoolValue* value) {
+ _upb_sethas(msg, 2);
+ *UPB_PTR_AT(msg, UPB_SIZE(8, 16), struct google_protobuf_BoolValue*) = value;
+}
+UPB_INLINE struct google_protobuf_BoolValue* envoy_config_core_v3_UdpSocketConfig_mutable_prefer_gro(envoy_config_core_v3_UdpSocketConfig *msg, upb_arena *arena) {
+ struct google_protobuf_BoolValue* sub = (struct google_protobuf_BoolValue*)envoy_config_core_v3_UdpSocketConfig_prefer_gro(msg);
+ if (sub == NULL) {
+ sub = (struct google_protobuf_BoolValue*)_upb_msg_new(&google_protobuf_BoolValue_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_core_v3_UdpSocketConfig_set_prefer_gro(msg, sub);
+ }
+ return sub;
+}
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif /* ENVOY_CONFIG_CORE_V3_UDP_SOCKET_CONFIG_PROTO_UPB_H_ */
diff --git a/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c b/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c
index e7e0cad875..a75126bb58 100644
--- a/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c
+++ b/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c
@@ -12,7 +12,6 @@
#include "envoy/config/accesslog/v3/accesslog.upb.h"
#include "envoy/config/core/v3/address.upb.h"
#include "envoy/config/core/v3/base.upb.h"
-#include "envoy/config/core/v3/extension.upb.h"
#include "envoy/config/core/v3/socket_option.upb.h"
#include "envoy/config/listener/v3/api_listener.upb.h"
#include "envoy/config/listener/v3/listener_components.upb.h"
@@ -20,6 +19,7 @@
#include "google/protobuf/duration.upb.h"
#include "google/protobuf/wrappers.upb.h"
#include "xds/core/v3/collection_entry.upb.h"
+#include "envoy/annotations/deprecation.upb.h"
#include "udpa/annotations/security.upb.h"
#include "udpa/annotations/status.upb.h"
#include "udpa/annotations/versioning.upb.h"
@@ -46,11 +46,11 @@ static const upb_msglayout *const envoy_config_listener_v3_Listener_submsgs[14]
&envoy_config_core_v3_Address_msginit,
&envoy_config_core_v3_Metadata_msginit,
&envoy_config_core_v3_SocketOption_msginit,
- &envoy_config_core_v3_TypedExtensionConfig_msginit,
&envoy_config_listener_v3_ApiListener_msginit,
&envoy_config_listener_v3_FilterChain_msginit,
&envoy_config_listener_v3_Listener_ConnectionBalanceConfig_msginit,
&envoy_config_listener_v3_Listener_DeprecatedV1_msginit,
+ &envoy_config_listener_v3_Listener_InternalListenerConfig_msginit,
&envoy_config_listener_v3_ListenerFilter_msginit,
&envoy_config_listener_v3_UdpListenerConfig_msginit,
&google_protobuf_BoolValue_msginit,
@@ -58,38 +58,40 @@ static const upb_msglayout *const envoy_config_listener_v3_Listener_submsgs[14]
&google_protobuf_UInt32Value_msginit,
};
-static const upb_msglayout_field envoy_config_listener_v3_Listener__fields[25] = {
+static const upb_msglayout_field envoy_config_listener_v3_Listener__fields[27] = {
{1, UPB_SIZE(16, 16), 0, 0, 9, 1},
- {2, UPB_SIZE(24, 32), 1, 1, 11, 1},
- {3, UPB_SIZE(88, 160), 0, 6, 11, 3},
- {4, UPB_SIZE(28, 40), 2, 11, 11, 1},
- {5, UPB_SIZE(32, 48), 3, 13, 11, 1},
- {6, UPB_SIZE(36, 56), 4, 2, 11, 1},
- {7, UPB_SIZE(40, 64), 5, 8, 11, 1},
+ {2, UPB_SIZE(32, 48), 1, 1, 11, 1},
+ {3, UPB_SIZE(96, 176), 0, 5, 11, 3},
+ {4, UPB_SIZE(36, 56), 2, 11, 11, 1},
+ {5, UPB_SIZE(40, 64), 3, 13, 11, 1},
+ {6, UPB_SIZE(44, 72), 4, 2, 11, 1},
+ {7, UPB_SIZE(48, 80), 5, 7, 11, 1},
{8, UPB_SIZE(4, 4), 0, 0, 14, 1},
- {9, UPB_SIZE(92, 168), 0, 9, 11, 3},
- {10, UPB_SIZE(44, 72), 6, 11, 11, 1},
- {11, UPB_SIZE(48, 80), 7, 11, 11, 1},
- {12, UPB_SIZE(52, 88), 8, 13, 11, 1},
- {13, UPB_SIZE(96, 176), 0, 3, 11, 3},
- {15, UPB_SIZE(56, 96), 9, 12, 11, 1},
+ {9, UPB_SIZE(100, 184), 0, 9, 11, 3},
+ {10, UPB_SIZE(52, 88), 6, 11, 11, 1},
+ {11, UPB_SIZE(56, 96), 7, 11, 11, 1},
+ {12, UPB_SIZE(60, 104), 8, 13, 11, 1},
+ {13, UPB_SIZE(104, 192), 0, 3, 11, 3},
+ {15, UPB_SIZE(64, 112), 9, 12, 11, 1},
{16, UPB_SIZE(8, 8), 0, 0, 14, 1},
{17, UPB_SIZE(12, 12), 0, 0, 8, 1},
- {18, UPB_SIZE(60, 104), 10, 10, 11, 1},
- {19, UPB_SIZE(64, 112), 11, 5, 11, 1},
- {20, UPB_SIZE(68, 120), 12, 7, 11, 1},
+ {18, UPB_SIZE(68, 120), 10, 10, 11, 1},
+ {19, UPB_SIZE(72, 128), 11, 4, 11, 1},
+ {20, UPB_SIZE(76, 136), 12, 6, 11, 1},
{21, UPB_SIZE(13, 13), 0, 0, 8, 1},
- {22, UPB_SIZE(100, 184), 0, 0, 11, 3},
- {23, UPB_SIZE(72, 128), 13, 4, 11, 1},
- {24, UPB_SIZE(76, 136), 14, 13, 11, 1},
- {25, UPB_SIZE(80, 144), 15, 6, 11, 1},
- {26, UPB_SIZE(84, 152), 16, 11, 11, 1},
+ {22, UPB_SIZE(108, 200), 0, 0, 11, 3},
+ {24, UPB_SIZE(80, 144), 13, 13, 11, 1},
+ {25, UPB_SIZE(84, 152), 14, 5, 11, 1},
+ {26, UPB_SIZE(88, 160), 15, 11, 11, 1},
+ {27, UPB_SIZE(112, 208), UPB_SIZE(-117, -217), 8, 11, 1},
+ {28, UPB_SIZE(24, 32), 0, 0, 9, 1},
+ {29, UPB_SIZE(92, 168), 16, 11, 11, 1},
};
const upb_msglayout envoy_config_listener_v3_Listener_msginit = {
&envoy_config_listener_v3_Listener_submsgs[0],
&envoy_config_listener_v3_Listener__fields[0],
- UPB_SIZE(104, 192), 25, false, 255,
+ UPB_SIZE(120, 224), 27, false, 255,
};
static const upb_msglayout *const envoy_config_listener_v3_Listener_DeprecatedV1_submsgs[1] = {
@@ -126,5 +128,11 @@ const upb_msglayout envoy_config_listener_v3_Listener_ConnectionBalanceConfig_Ex
UPB_SIZE(0, 0), 0, false, 255,
};
+const upb_msglayout envoy_config_listener_v3_Listener_InternalListenerConfig_msginit = {
+ NULL,
+ NULL,
+ UPB_SIZE(0, 0), 0, false, 255,
+};
+
#include "upb/port_undef.inc"
diff --git a/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h b/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h
index 1d133733cb..56a7f7c690 100644
--- a/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h
+++ b/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h
@@ -25,21 +25,23 @@ struct envoy_config_listener_v3_Listener;
struct envoy_config_listener_v3_Listener_DeprecatedV1;
struct envoy_config_listener_v3_Listener_ConnectionBalanceConfig;
struct envoy_config_listener_v3_Listener_ConnectionBalanceConfig_ExactBalance;
+struct envoy_config_listener_v3_Listener_InternalListenerConfig;
typedef struct envoy_config_listener_v3_ListenerCollection envoy_config_listener_v3_ListenerCollection;
typedef struct envoy_config_listener_v3_Listener envoy_config_listener_v3_Listener;
typedef struct envoy_config_listener_v3_Listener_DeprecatedV1 envoy_config_listener_v3_Listener_DeprecatedV1;
typedef struct envoy_config_listener_v3_Listener_ConnectionBalanceConfig envoy_config_listener_v3_Listener_ConnectionBalanceConfig;
typedef struct envoy_config_listener_v3_Listener_ConnectionBalanceConfig_ExactBalance envoy_config_listener_v3_Listener_ConnectionBalanceConfig_ExactBalance;
+typedef struct envoy_config_listener_v3_Listener_InternalListenerConfig envoy_config_listener_v3_Listener_InternalListenerConfig;
extern const upb_msglayout envoy_config_listener_v3_ListenerCollection_msginit;
extern const upb_msglayout envoy_config_listener_v3_Listener_msginit;
extern const upb_msglayout envoy_config_listener_v3_Listener_DeprecatedV1_msginit;
extern const upb_msglayout envoy_config_listener_v3_Listener_ConnectionBalanceConfig_msginit;
extern const upb_msglayout envoy_config_listener_v3_Listener_ConnectionBalanceConfig_ExactBalance_msginit;
+extern const upb_msglayout envoy_config_listener_v3_Listener_InternalListenerConfig_msginit;
struct envoy_config_accesslog_v3_AccessLog;
struct envoy_config_core_v3_Address;
struct envoy_config_core_v3_Metadata;
struct envoy_config_core_v3_SocketOption;
-struct envoy_config_core_v3_TypedExtensionConfig;
struct envoy_config_listener_v3_ApiListener;
struct envoy_config_listener_v3_FilterChain;
struct envoy_config_listener_v3_ListenerFilter;
@@ -52,7 +54,6 @@ extern const upb_msglayout envoy_config_accesslog_v3_AccessLog_msginit;
extern const upb_msglayout envoy_config_core_v3_Address_msginit;
extern const upb_msglayout envoy_config_core_v3_Metadata_msginit;
extern const upb_msglayout envoy_config_core_v3_SocketOption_msginit;
-extern const upb_msglayout envoy_config_core_v3_TypedExtensionConfig_msginit;
extern const upb_msglayout envoy_config_listener_v3_ApiListener_msginit;
extern const upb_msglayout envoy_config_listener_v3_FilterChain_msginit;
extern const upb_msglayout envoy_config_listener_v3_ListenerFilter_msginit;
@@ -125,58 +126,67 @@ UPB_INLINE char *envoy_config_listener_v3_Listener_serialize(const envoy_config_
return upb_encode(msg, &envoy_config_listener_v3_Listener_msginit, arena, len);
}
+typedef enum {
+ envoy_config_listener_v3_Listener_listener_specifier_internal_listener = 27,
+ envoy_config_listener_v3_Listener_listener_specifier_NOT_SET = 0
+} envoy_config_listener_v3_Listener_listener_specifier_oneofcases;
+UPB_INLINE envoy_config_listener_v3_Listener_listener_specifier_oneofcases envoy_config_listener_v3_Listener_listener_specifier_case(const envoy_config_listener_v3_Listener* msg) { return (envoy_config_listener_v3_Listener_listener_specifier_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(116, 216), int32_t); }
+
UPB_INLINE upb_strview envoy_config_listener_v3_Listener_name(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(16, 16), upb_strview); }
UPB_INLINE bool envoy_config_listener_v3_Listener_has_address(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 1); }
-UPB_INLINE const struct envoy_config_core_v3_Address* envoy_config_listener_v3_Listener_address(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(24, 32), const struct envoy_config_core_v3_Address*); }
-UPB_INLINE bool envoy_config_listener_v3_Listener_has_filter_chains(const envoy_config_listener_v3_Listener *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(88, 160)); }
-UPB_INLINE const struct envoy_config_listener_v3_FilterChain* const* envoy_config_listener_v3_Listener_filter_chains(const envoy_config_listener_v3_Listener *msg, size_t *len) { return (const struct envoy_config_listener_v3_FilterChain* const*)_upb_array_accessor(msg, UPB_SIZE(88, 160), len); }
+UPB_INLINE const struct envoy_config_core_v3_Address* envoy_config_listener_v3_Listener_address(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(32, 48), const struct envoy_config_core_v3_Address*); }
+UPB_INLINE bool envoy_config_listener_v3_Listener_has_filter_chains(const envoy_config_listener_v3_Listener *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(96, 176)); }
+UPB_INLINE const struct envoy_config_listener_v3_FilterChain* const* envoy_config_listener_v3_Listener_filter_chains(const envoy_config_listener_v3_Listener *msg, size_t *len) { return (const struct envoy_config_listener_v3_FilterChain* const*)_upb_array_accessor(msg, UPB_SIZE(96, 176), len); }
UPB_INLINE bool envoy_config_listener_v3_Listener_has_use_original_dst(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 2); }
-UPB_INLINE const struct google_protobuf_BoolValue* envoy_config_listener_v3_Listener_use_original_dst(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(28, 40), const struct google_protobuf_BoolValue*); }
+UPB_INLINE const struct google_protobuf_BoolValue* envoy_config_listener_v3_Listener_use_original_dst(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(36, 56), const struct google_protobuf_BoolValue*); }
UPB_INLINE bool envoy_config_listener_v3_Listener_has_per_connection_buffer_limit_bytes(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 3); }
-UPB_INLINE const struct google_protobuf_UInt32Value* envoy_config_listener_v3_Listener_per_connection_buffer_limit_bytes(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(32, 48), const struct google_protobuf_UInt32Value*); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_config_listener_v3_Listener_per_connection_buffer_limit_bytes(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(40, 64), const struct google_protobuf_UInt32Value*); }
UPB_INLINE bool envoy_config_listener_v3_Listener_has_metadata(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 4); }
-UPB_INLINE const struct envoy_config_core_v3_Metadata* envoy_config_listener_v3_Listener_metadata(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(36, 56), const struct envoy_config_core_v3_Metadata*); }
+UPB_INLINE const struct envoy_config_core_v3_Metadata* envoy_config_listener_v3_Listener_metadata(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(44, 72), const struct envoy_config_core_v3_Metadata*); }
UPB_INLINE bool envoy_config_listener_v3_Listener_has_deprecated_v1(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 5); }
-UPB_INLINE const envoy_config_listener_v3_Listener_DeprecatedV1* envoy_config_listener_v3_Listener_deprecated_v1(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(40, 64), const envoy_config_listener_v3_Listener_DeprecatedV1*); }
+UPB_INLINE const envoy_config_listener_v3_Listener_DeprecatedV1* envoy_config_listener_v3_Listener_deprecated_v1(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(48, 80), const envoy_config_listener_v3_Listener_DeprecatedV1*); }
UPB_INLINE int32_t envoy_config_listener_v3_Listener_drain_type(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 4), int32_t); }
-UPB_INLINE bool envoy_config_listener_v3_Listener_has_listener_filters(const envoy_config_listener_v3_Listener *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(92, 168)); }
-UPB_INLINE const struct envoy_config_listener_v3_ListenerFilter* const* envoy_config_listener_v3_Listener_listener_filters(const envoy_config_listener_v3_Listener *msg, size_t *len) { return (const struct envoy_config_listener_v3_ListenerFilter* const*)_upb_array_accessor(msg, UPB_SIZE(92, 168), len); }
+UPB_INLINE bool envoy_config_listener_v3_Listener_has_listener_filters(const envoy_config_listener_v3_Listener *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(100, 184)); }
+UPB_INLINE const struct envoy_config_listener_v3_ListenerFilter* const* envoy_config_listener_v3_Listener_listener_filters(const envoy_config_listener_v3_Listener *msg, size_t *len) { return (const struct envoy_config_listener_v3_ListenerFilter* const*)_upb_array_accessor(msg, UPB_SIZE(100, 184), len); }
UPB_INLINE bool envoy_config_listener_v3_Listener_has_transparent(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 6); }
-UPB_INLINE const struct google_protobuf_BoolValue* envoy_config_listener_v3_Listener_transparent(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(44, 72), const struct google_protobuf_BoolValue*); }
+UPB_INLINE const struct google_protobuf_BoolValue* envoy_config_listener_v3_Listener_transparent(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(52, 88), const struct google_protobuf_BoolValue*); }
UPB_INLINE bool envoy_config_listener_v3_Listener_has_freebind(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 7); }
-UPB_INLINE const struct google_protobuf_BoolValue* envoy_config_listener_v3_Listener_freebind(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(48, 80), const struct google_protobuf_BoolValue*); }
+UPB_INLINE const struct google_protobuf_BoolValue* envoy_config_listener_v3_Listener_freebind(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(56, 96), const struct google_protobuf_BoolValue*); }
UPB_INLINE bool envoy_config_listener_v3_Listener_has_tcp_fast_open_queue_length(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 8); }
-UPB_INLINE const struct google_protobuf_UInt32Value* envoy_config_listener_v3_Listener_tcp_fast_open_queue_length(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(52, 88), const struct google_protobuf_UInt32Value*); }
-UPB_INLINE bool envoy_config_listener_v3_Listener_has_socket_options(const envoy_config_listener_v3_Listener *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(96, 176)); }
-UPB_INLINE const struct envoy_config_core_v3_SocketOption* const* envoy_config_listener_v3_Listener_socket_options(const envoy_config_listener_v3_Listener *msg, size_t *len) { return (const struct envoy_config_core_v3_SocketOption* const*)_upb_array_accessor(msg, UPB_SIZE(96, 176), len); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_config_listener_v3_Listener_tcp_fast_open_queue_length(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(60, 104), const struct google_protobuf_UInt32Value*); }
+UPB_INLINE bool envoy_config_listener_v3_Listener_has_socket_options(const envoy_config_listener_v3_Listener *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(104, 192)); }
+UPB_INLINE const struct envoy_config_core_v3_SocketOption* const* envoy_config_listener_v3_Listener_socket_options(const envoy_config_listener_v3_Listener *msg, size_t *len) { return (const struct envoy_config_core_v3_SocketOption* const*)_upb_array_accessor(msg, UPB_SIZE(104, 192), len); }
UPB_INLINE bool envoy_config_listener_v3_Listener_has_listener_filters_timeout(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 9); }
-UPB_INLINE const struct google_protobuf_Duration* envoy_config_listener_v3_Listener_listener_filters_timeout(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(56, 96), const struct google_protobuf_Duration*); }
+UPB_INLINE const struct google_protobuf_Duration* envoy_config_listener_v3_Listener_listener_filters_timeout(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(64, 112), const struct google_protobuf_Duration*); }
UPB_INLINE int32_t envoy_config_listener_v3_Listener_traffic_direction(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(8, 8), int32_t); }
UPB_INLINE bool envoy_config_listener_v3_Listener_continue_on_listener_filters_timeout(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 12), bool); }
UPB_INLINE bool envoy_config_listener_v3_Listener_has_udp_listener_config(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 10); }
-UPB_INLINE const struct envoy_config_listener_v3_UdpListenerConfig* envoy_config_listener_v3_Listener_udp_listener_config(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(60, 104), const struct envoy_config_listener_v3_UdpListenerConfig*); }
+UPB_INLINE const struct envoy_config_listener_v3_UdpListenerConfig* envoy_config_listener_v3_Listener_udp_listener_config(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(68, 120), const struct envoy_config_listener_v3_UdpListenerConfig*); }
UPB_INLINE bool envoy_config_listener_v3_Listener_has_api_listener(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 11); }
-UPB_INLINE const struct envoy_config_listener_v3_ApiListener* envoy_config_listener_v3_Listener_api_listener(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(64, 112), const struct envoy_config_listener_v3_ApiListener*); }
+UPB_INLINE const struct envoy_config_listener_v3_ApiListener* envoy_config_listener_v3_Listener_api_listener(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(72, 128), const struct envoy_config_listener_v3_ApiListener*); }
UPB_INLINE bool envoy_config_listener_v3_Listener_has_connection_balance_config(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 12); }
-UPB_INLINE const envoy_config_listener_v3_Listener_ConnectionBalanceConfig* envoy_config_listener_v3_Listener_connection_balance_config(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(68, 120), const envoy_config_listener_v3_Listener_ConnectionBalanceConfig*); }
+UPB_INLINE const envoy_config_listener_v3_Listener_ConnectionBalanceConfig* envoy_config_listener_v3_Listener_connection_balance_config(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(76, 136), const envoy_config_listener_v3_Listener_ConnectionBalanceConfig*); }
UPB_INLINE bool envoy_config_listener_v3_Listener_reuse_port(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(13, 13), bool); }
-UPB_INLINE bool envoy_config_listener_v3_Listener_has_access_log(const envoy_config_listener_v3_Listener *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(100, 184)); }
-UPB_INLINE const struct envoy_config_accesslog_v3_AccessLog* const* envoy_config_listener_v3_Listener_access_log(const envoy_config_listener_v3_Listener *msg, size_t *len) { return (const struct envoy_config_accesslog_v3_AccessLog* const*)_upb_array_accessor(msg, UPB_SIZE(100, 184), len); }
-UPB_INLINE bool envoy_config_listener_v3_Listener_has_udp_writer_config(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 13); }
-UPB_INLINE const struct envoy_config_core_v3_TypedExtensionConfig* envoy_config_listener_v3_Listener_udp_writer_config(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(72, 128), const struct envoy_config_core_v3_TypedExtensionConfig*); }
-UPB_INLINE bool envoy_config_listener_v3_Listener_has_tcp_backlog_size(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 14); }
-UPB_INLINE const struct google_protobuf_UInt32Value* envoy_config_listener_v3_Listener_tcp_backlog_size(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(76, 136), const struct google_protobuf_UInt32Value*); }
-UPB_INLINE bool envoy_config_listener_v3_Listener_has_default_filter_chain(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 15); }
-UPB_INLINE const struct envoy_config_listener_v3_FilterChain* envoy_config_listener_v3_Listener_default_filter_chain(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(80, 144), const struct envoy_config_listener_v3_FilterChain*); }
-UPB_INLINE bool envoy_config_listener_v3_Listener_has_bind_to_port(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 16); }
-UPB_INLINE const struct google_protobuf_BoolValue* envoy_config_listener_v3_Listener_bind_to_port(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(84, 152), const struct google_protobuf_BoolValue*); }
+UPB_INLINE bool envoy_config_listener_v3_Listener_has_access_log(const envoy_config_listener_v3_Listener *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(108, 200)); }
+UPB_INLINE const struct envoy_config_accesslog_v3_AccessLog* const* envoy_config_listener_v3_Listener_access_log(const envoy_config_listener_v3_Listener *msg, size_t *len) { return (const struct envoy_config_accesslog_v3_AccessLog* const*)_upb_array_accessor(msg, UPB_SIZE(108, 200), len); }
+UPB_INLINE bool envoy_config_listener_v3_Listener_has_tcp_backlog_size(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 13); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_config_listener_v3_Listener_tcp_backlog_size(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(80, 144), const struct google_protobuf_UInt32Value*); }
+UPB_INLINE bool envoy_config_listener_v3_Listener_has_default_filter_chain(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 14); }
+UPB_INLINE const struct envoy_config_listener_v3_FilterChain* envoy_config_listener_v3_Listener_default_filter_chain(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(84, 152), const struct envoy_config_listener_v3_FilterChain*); }
+UPB_INLINE bool envoy_config_listener_v3_Listener_has_bind_to_port(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 15); }
+UPB_INLINE const struct google_protobuf_BoolValue* envoy_config_listener_v3_Listener_bind_to_port(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(88, 160), const struct google_protobuf_BoolValue*); }
+UPB_INLINE bool envoy_config_listener_v3_Listener_has_internal_listener(const envoy_config_listener_v3_Listener *msg) { return _upb_getoneofcase(msg, UPB_SIZE(116, 216)) == 27; }
+UPB_INLINE const envoy_config_listener_v3_Listener_InternalListenerConfig* envoy_config_listener_v3_Listener_internal_listener(const envoy_config_listener_v3_Listener *msg) { return UPB_READ_ONEOF(msg, const envoy_config_listener_v3_Listener_InternalListenerConfig*, UPB_SIZE(112, 208), UPB_SIZE(116, 216), 27, NULL); }
+UPB_INLINE upb_strview envoy_config_listener_v3_Listener_stat_prefix(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(24, 32), upb_strview); }
+UPB_INLINE bool envoy_config_listener_v3_Listener_has_enable_reuse_port(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 16); }
+UPB_INLINE const struct google_protobuf_BoolValue* envoy_config_listener_v3_Listener_enable_reuse_port(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(92, 168), const struct google_protobuf_BoolValue*); }
UPB_INLINE void envoy_config_listener_v3_Listener_set_name(envoy_config_listener_v3_Listener *msg, upb_strview value) {
*UPB_PTR_AT(msg, UPB_SIZE(16, 16), upb_strview) = value;
}
UPB_INLINE void envoy_config_listener_v3_Listener_set_address(envoy_config_listener_v3_Listener *msg, struct envoy_config_core_v3_Address* value) {
_upb_sethas(msg, 1);
- *UPB_PTR_AT(msg, UPB_SIZE(24, 32), struct envoy_config_core_v3_Address*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(32, 48), struct envoy_config_core_v3_Address*) = value;
}
UPB_INLINE struct envoy_config_core_v3_Address* envoy_config_listener_v3_Listener_mutable_address(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct envoy_config_core_v3_Address* sub = (struct envoy_config_core_v3_Address*)envoy_config_listener_v3_Listener_address(msg);
@@ -188,21 +198,21 @@ UPB_INLINE struct envoy_config_core_v3_Address* envoy_config_listener_v3_Listene
return sub;
}
UPB_INLINE struct envoy_config_listener_v3_FilterChain** envoy_config_listener_v3_Listener_mutable_filter_chains(envoy_config_listener_v3_Listener *msg, size_t *len) {
- return (struct envoy_config_listener_v3_FilterChain**)_upb_array_mutable_accessor(msg, UPB_SIZE(88, 160), len);
+ return (struct envoy_config_listener_v3_FilterChain**)_upb_array_mutable_accessor(msg, UPB_SIZE(96, 176), len);
}
UPB_INLINE struct envoy_config_listener_v3_FilterChain** envoy_config_listener_v3_Listener_resize_filter_chains(envoy_config_listener_v3_Listener *msg, size_t len, upb_arena *arena) {
- return (struct envoy_config_listener_v3_FilterChain**)_upb_array_resize_accessor2(msg, UPB_SIZE(88, 160), len, UPB_SIZE(2, 3), arena);
+ return (struct envoy_config_listener_v3_FilterChain**)_upb_array_resize_accessor2(msg, UPB_SIZE(96, 176), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_config_listener_v3_FilterChain* envoy_config_listener_v3_Listener_add_filter_chains(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct envoy_config_listener_v3_FilterChain* sub = (struct envoy_config_listener_v3_FilterChain*)_upb_msg_new(&envoy_config_listener_v3_FilterChain_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(88, 160), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(96, 176), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
UPB_INLINE void envoy_config_listener_v3_Listener_set_use_original_dst(envoy_config_listener_v3_Listener *msg, struct google_protobuf_BoolValue* value) {
_upb_sethas(msg, 2);
- *UPB_PTR_AT(msg, UPB_SIZE(28, 40), struct google_protobuf_BoolValue*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(36, 56), struct google_protobuf_BoolValue*) = value;
}
UPB_INLINE struct google_protobuf_BoolValue* envoy_config_listener_v3_Listener_mutable_use_original_dst(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct google_protobuf_BoolValue* sub = (struct google_protobuf_BoolValue*)envoy_config_listener_v3_Listener_use_original_dst(msg);
@@ -215,7 +225,7 @@ UPB_INLINE struct google_protobuf_BoolValue* envoy_config_listener_v3_Listener_m
}
UPB_INLINE void envoy_config_listener_v3_Listener_set_per_connection_buffer_limit_bytes(envoy_config_listener_v3_Listener *msg, struct google_protobuf_UInt32Value* value) {
_upb_sethas(msg, 3);
- *UPB_PTR_AT(msg, UPB_SIZE(32, 48), struct google_protobuf_UInt32Value*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(40, 64), struct google_protobuf_UInt32Value*) = value;
}
UPB_INLINE struct google_protobuf_UInt32Value* envoy_config_listener_v3_Listener_mutable_per_connection_buffer_limit_bytes(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_config_listener_v3_Listener_per_connection_buffer_limit_bytes(msg);
@@ -228,7 +238,7 @@ UPB_INLINE struct google_protobuf_UInt32Value* envoy_config_listener_v3_Listener
}
UPB_INLINE void envoy_config_listener_v3_Listener_set_metadata(envoy_config_listener_v3_Listener *msg, struct envoy_config_core_v3_Metadata* value) {
_upb_sethas(msg, 4);
- *UPB_PTR_AT(msg, UPB_SIZE(36, 56), struct envoy_config_core_v3_Metadata*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(44, 72), struct envoy_config_core_v3_Metadata*) = value;
}
UPB_INLINE struct envoy_config_core_v3_Metadata* envoy_config_listener_v3_Listener_mutable_metadata(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct envoy_config_core_v3_Metadata* sub = (struct envoy_config_core_v3_Metadata*)envoy_config_listener_v3_Listener_metadata(msg);
@@ -241,7 +251,7 @@ UPB_INLINE struct envoy_config_core_v3_Metadata* envoy_config_listener_v3_Listen
}
UPB_INLINE void envoy_config_listener_v3_Listener_set_deprecated_v1(envoy_config_listener_v3_Listener *msg, envoy_config_listener_v3_Listener_DeprecatedV1* value) {
_upb_sethas(msg, 5);
- *UPB_PTR_AT(msg, UPB_SIZE(40, 64), envoy_config_listener_v3_Listener_DeprecatedV1*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(48, 80), envoy_config_listener_v3_Listener_DeprecatedV1*) = value;
}
UPB_INLINE struct envoy_config_listener_v3_Listener_DeprecatedV1* envoy_config_listener_v3_Listener_mutable_deprecated_v1(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct envoy_config_listener_v3_Listener_DeprecatedV1* sub = (struct envoy_config_listener_v3_Listener_DeprecatedV1*)envoy_config_listener_v3_Listener_deprecated_v1(msg);
@@ -256,21 +266,21 @@ UPB_INLINE void envoy_config_listener_v3_Listener_set_drain_type(envoy_config_li
*UPB_PTR_AT(msg, UPB_SIZE(4, 4), int32_t) = value;
}
UPB_INLINE struct envoy_config_listener_v3_ListenerFilter** envoy_config_listener_v3_Listener_mutable_listener_filters(envoy_config_listener_v3_Listener *msg, size_t *len) {
- return (struct envoy_config_listener_v3_ListenerFilter**)_upb_array_mutable_accessor(msg, UPB_SIZE(92, 168), len);
+ return (struct envoy_config_listener_v3_ListenerFilter**)_upb_array_mutable_accessor(msg, UPB_SIZE(100, 184), len);
}
UPB_INLINE struct envoy_config_listener_v3_ListenerFilter** envoy_config_listener_v3_Listener_resize_listener_filters(envoy_config_listener_v3_Listener *msg, size_t len, upb_arena *arena) {
- return (struct envoy_config_listener_v3_ListenerFilter**)_upb_array_resize_accessor2(msg, UPB_SIZE(92, 168), len, UPB_SIZE(2, 3), arena);
+ return (struct envoy_config_listener_v3_ListenerFilter**)_upb_array_resize_accessor2(msg, UPB_SIZE(100, 184), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_config_listener_v3_ListenerFilter* envoy_config_listener_v3_Listener_add_listener_filters(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct envoy_config_listener_v3_ListenerFilter* sub = (struct envoy_config_listener_v3_ListenerFilter*)_upb_msg_new(&envoy_config_listener_v3_ListenerFilter_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(92, 168), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(100, 184), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
UPB_INLINE void envoy_config_listener_v3_Listener_set_transparent(envoy_config_listener_v3_Listener *msg, struct google_protobuf_BoolValue* value) {
_upb_sethas(msg, 6);
- *UPB_PTR_AT(msg, UPB_SIZE(44, 72), struct google_protobuf_BoolValue*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(52, 88), struct google_protobuf_BoolValue*) = value;
}
UPB_INLINE struct google_protobuf_BoolValue* envoy_config_listener_v3_Listener_mutable_transparent(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct google_protobuf_BoolValue* sub = (struct google_protobuf_BoolValue*)envoy_config_listener_v3_Listener_transparent(msg);
@@ -283,7 +293,7 @@ UPB_INLINE struct google_protobuf_BoolValue* envoy_config_listener_v3_Listener_m
}
UPB_INLINE void envoy_config_listener_v3_Listener_set_freebind(envoy_config_listener_v3_Listener *msg, struct google_protobuf_BoolValue* value) {
_upb_sethas(msg, 7);
- *UPB_PTR_AT(msg, UPB_SIZE(48, 80), struct google_protobuf_BoolValue*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(56, 96), struct google_protobuf_BoolValue*) = value;
}
UPB_INLINE struct google_protobuf_BoolValue* envoy_config_listener_v3_Listener_mutable_freebind(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct google_protobuf_BoolValue* sub = (struct google_protobuf_BoolValue*)envoy_config_listener_v3_Listener_freebind(msg);
@@ -296,7 +306,7 @@ UPB_INLINE struct google_protobuf_BoolValue* envoy_config_listener_v3_Listener_m
}
UPB_INLINE void envoy_config_listener_v3_Listener_set_tcp_fast_open_queue_length(envoy_config_listener_v3_Listener *msg, struct google_protobuf_UInt32Value* value) {
_upb_sethas(msg, 8);
- *UPB_PTR_AT(msg, UPB_SIZE(52, 88), struct google_protobuf_UInt32Value*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(60, 104), struct google_protobuf_UInt32Value*) = value;
}
UPB_INLINE struct google_protobuf_UInt32Value* envoy_config_listener_v3_Listener_mutable_tcp_fast_open_queue_length(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_config_listener_v3_Listener_tcp_fast_open_queue_length(msg);
@@ -308,21 +318,21 @@ UPB_INLINE struct google_protobuf_UInt32Value* envoy_config_listener_v3_Listener
return sub;
}
UPB_INLINE struct envoy_config_core_v3_SocketOption** envoy_config_listener_v3_Listener_mutable_socket_options(envoy_config_listener_v3_Listener *msg, size_t *len) {
- return (struct envoy_config_core_v3_SocketOption**)_upb_array_mutable_accessor(msg, UPB_SIZE(96, 176), len);
+ return (struct envoy_config_core_v3_SocketOption**)_upb_array_mutable_accessor(msg, UPB_SIZE(104, 192), len);
}
UPB_INLINE struct envoy_config_core_v3_SocketOption** envoy_config_listener_v3_Listener_resize_socket_options(envoy_config_listener_v3_Listener *msg, size_t len, upb_arena *arena) {
- return (struct envoy_config_core_v3_SocketOption**)_upb_array_resize_accessor2(msg, UPB_SIZE(96, 176), len, UPB_SIZE(2, 3), arena);
+ return (struct envoy_config_core_v3_SocketOption**)_upb_array_resize_accessor2(msg, UPB_SIZE(104, 192), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_config_core_v3_SocketOption* envoy_config_listener_v3_Listener_add_socket_options(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct envoy_config_core_v3_SocketOption* sub = (struct envoy_config_core_v3_SocketOption*)_upb_msg_new(&envoy_config_core_v3_SocketOption_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(96, 176), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(104, 192), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
UPB_INLINE void envoy_config_listener_v3_Listener_set_listener_filters_timeout(envoy_config_listener_v3_Listener *msg, struct google_protobuf_Duration* value) {
_upb_sethas(msg, 9);
- *UPB_PTR_AT(msg, UPB_SIZE(56, 96), struct google_protobuf_Duration*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(64, 112), struct google_protobuf_Duration*) = value;
}
UPB_INLINE struct google_protobuf_Duration* envoy_config_listener_v3_Listener_mutable_listener_filters_timeout(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_config_listener_v3_Listener_listener_filters_timeout(msg);
@@ -341,7 +351,7 @@ UPB_INLINE void envoy_config_listener_v3_Listener_set_continue_on_listener_filte
}
UPB_INLINE void envoy_config_listener_v3_Listener_set_udp_listener_config(envoy_config_listener_v3_Listener *msg, struct envoy_config_listener_v3_UdpListenerConfig* value) {
_upb_sethas(msg, 10);
- *UPB_PTR_AT(msg, UPB_SIZE(60, 104), struct envoy_config_listener_v3_UdpListenerConfig*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(68, 120), struct envoy_config_listener_v3_UdpListenerConfig*) = value;
}
UPB_INLINE struct envoy_config_listener_v3_UdpListenerConfig* envoy_config_listener_v3_Listener_mutable_udp_listener_config(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct envoy_config_listener_v3_UdpListenerConfig* sub = (struct envoy_config_listener_v3_UdpListenerConfig*)envoy_config_listener_v3_Listener_udp_listener_config(msg);
@@ -354,7 +364,7 @@ UPB_INLINE struct envoy_config_listener_v3_UdpListenerConfig* envoy_config_liste
}
UPB_INLINE void envoy_config_listener_v3_Listener_set_api_listener(envoy_config_listener_v3_Listener *msg, struct envoy_config_listener_v3_ApiListener* value) {
_upb_sethas(msg, 11);
- *UPB_PTR_AT(msg, UPB_SIZE(64, 112), struct envoy_config_listener_v3_ApiListener*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(72, 128), struct envoy_config_listener_v3_ApiListener*) = value;
}
UPB_INLINE struct envoy_config_listener_v3_ApiListener* envoy_config_listener_v3_Listener_mutable_api_listener(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct envoy_config_listener_v3_ApiListener* sub = (struct envoy_config_listener_v3_ApiListener*)envoy_config_listener_v3_Listener_api_listener(msg);
@@ -367,7 +377,7 @@ UPB_INLINE struct envoy_config_listener_v3_ApiListener* envoy_config_listener_v3
}
UPB_INLINE void envoy_config_listener_v3_Listener_set_connection_balance_config(envoy_config_listener_v3_Listener *msg, envoy_config_listener_v3_Listener_ConnectionBalanceConfig* value) {
_upb_sethas(msg, 12);
- *UPB_PTR_AT(msg, UPB_SIZE(68, 120), envoy_config_listener_v3_Listener_ConnectionBalanceConfig*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(76, 136), envoy_config_listener_v3_Listener_ConnectionBalanceConfig*) = value;
}
UPB_INLINE struct envoy_config_listener_v3_Listener_ConnectionBalanceConfig* envoy_config_listener_v3_Listener_mutable_connection_balance_config(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct envoy_config_listener_v3_Listener_ConnectionBalanceConfig* sub = (struct envoy_config_listener_v3_Listener_ConnectionBalanceConfig*)envoy_config_listener_v3_Listener_connection_balance_config(msg);
@@ -382,34 +392,21 @@ UPB_INLINE void envoy_config_listener_v3_Listener_set_reuse_port(envoy_config_li
*UPB_PTR_AT(msg, UPB_SIZE(13, 13), bool) = value;
}
UPB_INLINE struct envoy_config_accesslog_v3_AccessLog** envoy_config_listener_v3_Listener_mutable_access_log(envoy_config_listener_v3_Listener *msg, size_t *len) {
- return (struct envoy_config_accesslog_v3_AccessLog**)_upb_array_mutable_accessor(msg, UPB_SIZE(100, 184), len);
+ return (struct envoy_config_accesslog_v3_AccessLog**)_upb_array_mutable_accessor(msg, UPB_SIZE(108, 200), len);
}
UPB_INLINE struct envoy_config_accesslog_v3_AccessLog** envoy_config_listener_v3_Listener_resize_access_log(envoy_config_listener_v3_Listener *msg, size_t len, upb_arena *arena) {
- return (struct envoy_config_accesslog_v3_AccessLog**)_upb_array_resize_accessor2(msg, UPB_SIZE(100, 184), len, UPB_SIZE(2, 3), arena);
+ return (struct envoy_config_accesslog_v3_AccessLog**)_upb_array_resize_accessor2(msg, UPB_SIZE(108, 200), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_config_accesslog_v3_AccessLog* envoy_config_listener_v3_Listener_add_access_log(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct envoy_config_accesslog_v3_AccessLog* sub = (struct envoy_config_accesslog_v3_AccessLog*)_upb_msg_new(&envoy_config_accesslog_v3_AccessLog_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(100, 184), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(108, 200), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
-UPB_INLINE void envoy_config_listener_v3_Listener_set_udp_writer_config(envoy_config_listener_v3_Listener *msg, struct envoy_config_core_v3_TypedExtensionConfig* value) {
- _upb_sethas(msg, 13);
- *UPB_PTR_AT(msg, UPB_SIZE(72, 128), struct envoy_config_core_v3_TypedExtensionConfig*) = value;
-}
-UPB_INLINE struct envoy_config_core_v3_TypedExtensionConfig* envoy_config_listener_v3_Listener_mutable_udp_writer_config(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
- struct envoy_config_core_v3_TypedExtensionConfig* sub = (struct envoy_config_core_v3_TypedExtensionConfig*)envoy_config_listener_v3_Listener_udp_writer_config(msg);
- if (sub == NULL) {
- sub = (struct envoy_config_core_v3_TypedExtensionConfig*)_upb_msg_new(&envoy_config_core_v3_TypedExtensionConfig_msginit, arena);
- if (!sub) return NULL;
- envoy_config_listener_v3_Listener_set_udp_writer_config(msg, sub);
- }
- return sub;
-}
UPB_INLINE void envoy_config_listener_v3_Listener_set_tcp_backlog_size(envoy_config_listener_v3_Listener *msg, struct google_protobuf_UInt32Value* value) {
- _upb_sethas(msg, 14);
- *UPB_PTR_AT(msg, UPB_SIZE(76, 136), struct google_protobuf_UInt32Value*) = value;
+ _upb_sethas(msg, 13);
+ *UPB_PTR_AT(msg, UPB_SIZE(80, 144), struct google_protobuf_UInt32Value*) = value;
}
UPB_INLINE struct google_protobuf_UInt32Value* envoy_config_listener_v3_Listener_mutable_tcp_backlog_size(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_config_listener_v3_Listener_tcp_backlog_size(msg);
@@ -421,8 +418,8 @@ UPB_INLINE struct google_protobuf_UInt32Value* envoy_config_listener_v3_Listener
return sub;
}
UPB_INLINE void envoy_config_listener_v3_Listener_set_default_filter_chain(envoy_config_listener_v3_Listener *msg, struct envoy_config_listener_v3_FilterChain* value) {
- _upb_sethas(msg, 15);
- *UPB_PTR_AT(msg, UPB_SIZE(80, 144), struct envoy_config_listener_v3_FilterChain*) = value;
+ _upb_sethas(msg, 14);
+ *UPB_PTR_AT(msg, UPB_SIZE(84, 152), struct envoy_config_listener_v3_FilterChain*) = value;
}
UPB_INLINE struct envoy_config_listener_v3_FilterChain* envoy_config_listener_v3_Listener_mutable_default_filter_chain(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct envoy_config_listener_v3_FilterChain* sub = (struct envoy_config_listener_v3_FilterChain*)envoy_config_listener_v3_Listener_default_filter_chain(msg);
@@ -434,8 +431,8 @@ UPB_INLINE struct envoy_config_listener_v3_FilterChain* envoy_config_listener_v3
return sub;
}
UPB_INLINE void envoy_config_listener_v3_Listener_set_bind_to_port(envoy_config_listener_v3_Listener *msg, struct google_protobuf_BoolValue* value) {
- _upb_sethas(msg, 16);
- *UPB_PTR_AT(msg, UPB_SIZE(84, 152), struct google_protobuf_BoolValue*) = value;
+ _upb_sethas(msg, 15);
+ *UPB_PTR_AT(msg, UPB_SIZE(88, 160), struct google_protobuf_BoolValue*) = value;
}
UPB_INLINE struct google_protobuf_BoolValue* envoy_config_listener_v3_Listener_mutable_bind_to_port(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct google_protobuf_BoolValue* sub = (struct google_protobuf_BoolValue*)envoy_config_listener_v3_Listener_bind_to_port(msg);
@@ -446,6 +443,34 @@ UPB_INLINE struct google_protobuf_BoolValue* envoy_config_listener_v3_Listener_m
}
return sub;
}
+UPB_INLINE void envoy_config_listener_v3_Listener_set_internal_listener(envoy_config_listener_v3_Listener *msg, envoy_config_listener_v3_Listener_InternalListenerConfig* value) {
+ UPB_WRITE_ONEOF(msg, envoy_config_listener_v3_Listener_InternalListenerConfig*, UPB_SIZE(112, 208), value, UPB_SIZE(116, 216), 27);
+}
+UPB_INLINE struct envoy_config_listener_v3_Listener_InternalListenerConfig* envoy_config_listener_v3_Listener_mutable_internal_listener(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
+ struct envoy_config_listener_v3_Listener_InternalListenerConfig* sub = (struct envoy_config_listener_v3_Listener_InternalListenerConfig*)envoy_config_listener_v3_Listener_internal_listener(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_config_listener_v3_Listener_InternalListenerConfig*)_upb_msg_new(&envoy_config_listener_v3_Listener_InternalListenerConfig_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_listener_v3_Listener_set_internal_listener(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void envoy_config_listener_v3_Listener_set_stat_prefix(envoy_config_listener_v3_Listener *msg, upb_strview value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(24, 32), upb_strview) = value;
+}
+UPB_INLINE void envoy_config_listener_v3_Listener_set_enable_reuse_port(envoy_config_listener_v3_Listener *msg, struct google_protobuf_BoolValue* value) {
+ _upb_sethas(msg, 16);
+ *UPB_PTR_AT(msg, UPB_SIZE(92, 168), struct google_protobuf_BoolValue*) = value;
+}
+UPB_INLINE struct google_protobuf_BoolValue* envoy_config_listener_v3_Listener_mutable_enable_reuse_port(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
+ struct google_protobuf_BoolValue* sub = (struct google_protobuf_BoolValue*)envoy_config_listener_v3_Listener_enable_reuse_port(msg);
+ if (sub == NULL) {
+ sub = (struct google_protobuf_BoolValue*)_upb_msg_new(&google_protobuf_BoolValue_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_listener_v3_Listener_set_enable_reuse_port(msg, sub);
+ }
+ return sub;
+}
/* envoy.config.listener.v3.Listener.DeprecatedV1 */
@@ -548,6 +573,28 @@ UPB_INLINE char *envoy_config_listener_v3_Listener_ConnectionBalanceConfig_Exact
+/* envoy.config.listener.v3.Listener.InternalListenerConfig */
+
+UPB_INLINE envoy_config_listener_v3_Listener_InternalListenerConfig *envoy_config_listener_v3_Listener_InternalListenerConfig_new(upb_arena *arena) {
+ return (envoy_config_listener_v3_Listener_InternalListenerConfig *)_upb_msg_new(&envoy_config_listener_v3_Listener_InternalListenerConfig_msginit, arena);
+}
+UPB_INLINE envoy_config_listener_v3_Listener_InternalListenerConfig *envoy_config_listener_v3_Listener_InternalListenerConfig_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ envoy_config_listener_v3_Listener_InternalListenerConfig *ret = envoy_config_listener_v3_Listener_InternalListenerConfig_new(arena);
+ return (ret && upb_decode(buf, size, ret, &envoy_config_listener_v3_Listener_InternalListenerConfig_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE envoy_config_listener_v3_Listener_InternalListenerConfig *envoy_config_listener_v3_Listener_InternalListenerConfig_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ envoy_config_listener_v3_Listener_InternalListenerConfig *ret = envoy_config_listener_v3_Listener_InternalListenerConfig_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &envoy_config_listener_v3_Listener_InternalListenerConfig_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *envoy_config_listener_v3_Listener_InternalListenerConfig_serialize(const envoy_config_listener_v3_Listener_InternalListenerConfig *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &envoy_config_listener_v3_Listener_InternalListenerConfig_msginit, arena, len);
+}
+
+
+
#ifdef __cplusplus
} /* extern "C" */
#endif
diff --git a/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c b/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c
index 303b6ab741..e31eab43b4 100644
--- a/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c
+++ b/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c
@@ -16,6 +16,7 @@
#include "google/protobuf/any.upb.h"
#include "google/protobuf/duration.upb.h"
#include "google/protobuf/wrappers.upb.h"
+#include "envoy/annotations/deprecation.upb.h"
#include "udpa/annotations/status.upb.h"
#include "udpa/annotations/versioning.upb.h"
#include "validate/validate.upb.h"
@@ -44,7 +45,7 @@ static const upb_msglayout *const envoy_config_listener_v3_FilterChainMatch_subm
&google_protobuf_UInt32Value_msginit,
};
-static const upb_msglayout_field envoy_config_listener_v3_FilterChainMatch__fields[10] = {
+static const upb_msglayout_field envoy_config_listener_v3_FilterChainMatch__fields[11] = {
{3, UPB_SIZE(32, 56), 0, 0, 11, 3},
{4, UPB_SIZE(8, 8), 0, 0, 9, 1},
{5, UPB_SIZE(24, 40), 1, 1, 11, 1},
@@ -55,12 +56,13 @@ static const upb_msglayout_field envoy_config_listener_v3_FilterChainMatch__fiel
{10, UPB_SIZE(44, 80), 0, 0, 9, 3},
{11, UPB_SIZE(48, 88), 0, 0, 9, 3},
{12, UPB_SIZE(4, 4), 0, 0, 14, 1},
+ {13, UPB_SIZE(52, 96), 0, 0, 11, 3},
};
const upb_msglayout envoy_config_listener_v3_FilterChainMatch_msginit = {
&envoy_config_listener_v3_FilterChainMatch_submsgs[0],
&envoy_config_listener_v3_FilterChainMatch__fields[0],
- UPB_SIZE(56, 96), 10, false, 255,
+ UPB_SIZE(56, 112), 11, false, 255,
};
static const upb_msglayout *const envoy_config_listener_v3_FilterChain_submsgs[7] = {
diff --git a/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h b/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h
index b8ef3826e3..f8ff80885f 100644
--- a/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h
+++ b/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h
@@ -162,6 +162,8 @@ UPB_INLINE upb_strview envoy_config_listener_v3_FilterChainMatch_transport_proto
UPB_INLINE upb_strview const* envoy_config_listener_v3_FilterChainMatch_application_protocols(const envoy_config_listener_v3_FilterChainMatch *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(44, 80), len); }
UPB_INLINE upb_strview const* envoy_config_listener_v3_FilterChainMatch_server_names(const envoy_config_listener_v3_FilterChainMatch *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(48, 88), len); }
UPB_INLINE int32_t envoy_config_listener_v3_FilterChainMatch_source_type(const envoy_config_listener_v3_FilterChainMatch *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 4), int32_t); }
+UPB_INLINE bool envoy_config_listener_v3_FilterChainMatch_has_direct_source_prefix_ranges(const envoy_config_listener_v3_FilterChainMatch *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(52, 96)); }
+UPB_INLINE const struct envoy_config_core_v3_CidrRange* const* envoy_config_listener_v3_FilterChainMatch_direct_source_prefix_ranges(const envoy_config_listener_v3_FilterChainMatch *msg, size_t *len) { return (const struct envoy_config_core_v3_CidrRange* const*)_upb_array_accessor(msg, UPB_SIZE(52, 96), len); }
UPB_INLINE struct envoy_config_core_v3_CidrRange** envoy_config_listener_v3_FilterChainMatch_mutable_prefix_ranges(envoy_config_listener_v3_FilterChainMatch *msg, size_t *len) {
return (struct envoy_config_core_v3_CidrRange**)_upb_array_mutable_accessor(msg, UPB_SIZE(32, 56), len);
@@ -254,6 +256,19 @@ UPB_INLINE bool envoy_config_listener_v3_FilterChainMatch_add_server_names(envoy
UPB_INLINE void envoy_config_listener_v3_FilterChainMatch_set_source_type(envoy_config_listener_v3_FilterChainMatch *msg, int32_t value) {
*UPB_PTR_AT(msg, UPB_SIZE(4, 4), int32_t) = value;
}
+UPB_INLINE struct envoy_config_core_v3_CidrRange** envoy_config_listener_v3_FilterChainMatch_mutable_direct_source_prefix_ranges(envoy_config_listener_v3_FilterChainMatch *msg, size_t *len) {
+ return (struct envoy_config_core_v3_CidrRange**)_upb_array_mutable_accessor(msg, UPB_SIZE(52, 96), len);
+}
+UPB_INLINE struct envoy_config_core_v3_CidrRange** envoy_config_listener_v3_FilterChainMatch_resize_direct_source_prefix_ranges(envoy_config_listener_v3_FilterChainMatch *msg, size_t len, upb_arena *arena) {
+ return (struct envoy_config_core_v3_CidrRange**)_upb_array_resize_accessor2(msg, UPB_SIZE(52, 96), len, UPB_SIZE(2, 3), arena);
+}
+UPB_INLINE struct envoy_config_core_v3_CidrRange* envoy_config_listener_v3_FilterChainMatch_add_direct_source_prefix_ranges(envoy_config_listener_v3_FilterChainMatch *msg, upb_arena *arena) {
+ struct envoy_config_core_v3_CidrRange* sub = (struct envoy_config_core_v3_CidrRange*)_upb_msg_new(&envoy_config_core_v3_CidrRange_msginit, arena);
+ bool ok = _upb_array_append_accessor2(
+ msg, UPB_SIZE(52, 96), UPB_SIZE(2, 3), &sub, arena);
+ if (!ok) return NULL;
+ return sub;
+}
/* envoy.config.listener.v3.FilterChain */
diff --git a/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c b/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c
new file mode 100644
index 0000000000..5ecd130fd3
--- /dev/null
+++ b/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c
@@ -0,0 +1,48 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/config/listener/v3/quic_config.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include <stddef.h>
+#include "upb/msg.h"
+#include "envoy/config/listener/v3/quic_config.upb.h"
+#include "envoy/config/core/v3/base.upb.h"
+#include "envoy/config/core/v3/extension.upb.h"
+#include "envoy/config/core/v3/protocol.upb.h"
+#include "google/protobuf/duration.upb.h"
+#include "google/protobuf/wrappers.upb.h"
+#include "udpa/annotations/status.upb.h"
+#include "udpa/annotations/versioning.upb.h"
+#include "validate/validate.upb.h"
+
+#include "upb/port_def.inc"
+
+static const upb_msglayout *const envoy_config_listener_v3_QuicProtocolOptions_submsgs[5] = {
+ &envoy_config_core_v3_QuicProtocolOptions_msginit,
+ &envoy_config_core_v3_RuntimeFeatureFlag_msginit,
+ &envoy_config_core_v3_TypedExtensionConfig_msginit,
+ &google_protobuf_Duration_msginit,
+ &google_protobuf_UInt32Value_msginit,
+};
+
+static const upb_msglayout_field envoy_config_listener_v3_QuicProtocolOptions__fields[7] = {
+ {1, UPB_SIZE(4, 8), 1, 0, 11, 1},
+ {2, UPB_SIZE(8, 16), 2, 3, 11, 1},
+ {3, UPB_SIZE(12, 24), 3, 3, 11, 1},
+ {4, UPB_SIZE(16, 32), 4, 1, 11, 1},
+ {5, UPB_SIZE(20, 40), 5, 4, 11, 1},
+ {6, UPB_SIZE(24, 48), 6, 2, 11, 1},
+ {7, UPB_SIZE(28, 56), 7, 2, 11, 1},
+};
+
+const upb_msglayout envoy_config_listener_v3_QuicProtocolOptions_msginit = {
+ &envoy_config_listener_v3_QuicProtocolOptions_submsgs[0],
+ &envoy_config_listener_v3_QuicProtocolOptions__fields[0],
+ UPB_SIZE(32, 64), 7, false, 255,
+};
+
+#include "upb/port_undef.inc"
+
diff --git a/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h b/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h
new file mode 100644
index 0000000000..a2fb916766
--- /dev/null
+++ b/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h
@@ -0,0 +1,171 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/config/listener/v3/quic_config.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef ENVOY_CONFIG_LISTENER_V3_QUIC_CONFIG_PROTO_UPB_H_
+#define ENVOY_CONFIG_LISTENER_V3_QUIC_CONFIG_PROTO_UPB_H_
+
+#include "upb/msg.h"
+#include "upb/decode.h"
+#include "upb/decode_fast.h"
+#include "upb/encode.h"
+
+#include "upb/port_def.inc"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct envoy_config_listener_v3_QuicProtocolOptions;
+typedef struct envoy_config_listener_v3_QuicProtocolOptions envoy_config_listener_v3_QuicProtocolOptions;
+extern const upb_msglayout envoy_config_listener_v3_QuicProtocolOptions_msginit;
+struct envoy_config_core_v3_QuicProtocolOptions;
+struct envoy_config_core_v3_RuntimeFeatureFlag;
+struct envoy_config_core_v3_TypedExtensionConfig;
+struct google_protobuf_Duration;
+struct google_protobuf_UInt32Value;
+extern const upb_msglayout envoy_config_core_v3_QuicProtocolOptions_msginit;
+extern const upb_msglayout envoy_config_core_v3_RuntimeFeatureFlag_msginit;
+extern const upb_msglayout envoy_config_core_v3_TypedExtensionConfig_msginit;
+extern const upb_msglayout google_protobuf_Duration_msginit;
+extern const upb_msglayout google_protobuf_UInt32Value_msginit;
+
+
+/* envoy.config.listener.v3.QuicProtocolOptions */
+
+UPB_INLINE envoy_config_listener_v3_QuicProtocolOptions *envoy_config_listener_v3_QuicProtocolOptions_new(upb_arena *arena) {
+ return (envoy_config_listener_v3_QuicProtocolOptions *)_upb_msg_new(&envoy_config_listener_v3_QuicProtocolOptions_msginit, arena);
+}
+UPB_INLINE envoy_config_listener_v3_QuicProtocolOptions *envoy_config_listener_v3_QuicProtocolOptions_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ envoy_config_listener_v3_QuicProtocolOptions *ret = envoy_config_listener_v3_QuicProtocolOptions_new(arena);
+ return (ret && upb_decode(buf, size, ret, &envoy_config_listener_v3_QuicProtocolOptions_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE envoy_config_listener_v3_QuicProtocolOptions *envoy_config_listener_v3_QuicProtocolOptions_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ envoy_config_listener_v3_QuicProtocolOptions *ret = envoy_config_listener_v3_QuicProtocolOptions_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &envoy_config_listener_v3_QuicProtocolOptions_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *envoy_config_listener_v3_QuicProtocolOptions_serialize(const envoy_config_listener_v3_QuicProtocolOptions *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &envoy_config_listener_v3_QuicProtocolOptions_msginit, arena, len);
+}
+
+UPB_INLINE bool envoy_config_listener_v3_QuicProtocolOptions_has_quic_protocol_options(const envoy_config_listener_v3_QuicProtocolOptions *msg) { return _upb_hasbit(msg, 1); }
+UPB_INLINE const struct envoy_config_core_v3_QuicProtocolOptions* envoy_config_listener_v3_QuicProtocolOptions_quic_protocol_options(const envoy_config_listener_v3_QuicProtocolOptions *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), const struct envoy_config_core_v3_QuicProtocolOptions*); }
+UPB_INLINE bool envoy_config_listener_v3_QuicProtocolOptions_has_idle_timeout(const envoy_config_listener_v3_QuicProtocolOptions *msg) { return _upb_hasbit(msg, 2); }
+UPB_INLINE const struct google_protobuf_Duration* envoy_config_listener_v3_QuicProtocolOptions_idle_timeout(const envoy_config_listener_v3_QuicProtocolOptions *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(8, 16), const struct google_protobuf_Duration*); }
+UPB_INLINE bool envoy_config_listener_v3_QuicProtocolOptions_has_crypto_handshake_timeout(const envoy_config_listener_v3_QuicProtocolOptions *msg) { return _upb_hasbit(msg, 3); }
+UPB_INLINE const struct google_protobuf_Duration* envoy_config_listener_v3_QuicProtocolOptions_crypto_handshake_timeout(const envoy_config_listener_v3_QuicProtocolOptions *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 24), const struct google_protobuf_Duration*); }
+UPB_INLINE bool envoy_config_listener_v3_QuicProtocolOptions_has_enabled(const envoy_config_listener_v3_QuicProtocolOptions *msg) { return _upb_hasbit(msg, 4); }
+UPB_INLINE const struct envoy_config_core_v3_RuntimeFeatureFlag* envoy_config_listener_v3_QuicProtocolOptions_enabled(const envoy_config_listener_v3_QuicProtocolOptions *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(16, 32), const struct envoy_config_core_v3_RuntimeFeatureFlag*); }
+UPB_INLINE bool envoy_config_listener_v3_QuicProtocolOptions_has_packets_to_read_to_connection_count_ratio(const envoy_config_listener_v3_QuicProtocolOptions *msg) { return _upb_hasbit(msg, 5); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_config_listener_v3_QuicProtocolOptions_packets_to_read_to_connection_count_ratio(const envoy_config_listener_v3_QuicProtocolOptions *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(20, 40), const struct google_protobuf_UInt32Value*); }
+UPB_INLINE bool envoy_config_listener_v3_QuicProtocolOptions_has_crypto_stream_config(const envoy_config_listener_v3_QuicProtocolOptions *msg) { return _upb_hasbit(msg, 6); }
+UPB_INLINE const struct envoy_config_core_v3_TypedExtensionConfig* envoy_config_listener_v3_QuicProtocolOptions_crypto_stream_config(const envoy_config_listener_v3_QuicProtocolOptions *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(24, 48), const struct envoy_config_core_v3_TypedExtensionConfig*); }
+UPB_INLINE bool envoy_config_listener_v3_QuicProtocolOptions_has_proof_source_config(const envoy_config_listener_v3_QuicProtocolOptions *msg) { return _upb_hasbit(msg, 7); }
+UPB_INLINE const struct envoy_config_core_v3_TypedExtensionConfig* envoy_config_listener_v3_QuicProtocolOptions_proof_source_config(const envoy_config_listener_v3_QuicProtocolOptions *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(28, 56), const struct envoy_config_core_v3_TypedExtensionConfig*); }
+
+UPB_INLINE void envoy_config_listener_v3_QuicProtocolOptions_set_quic_protocol_options(envoy_config_listener_v3_QuicProtocolOptions *msg, struct envoy_config_core_v3_QuicProtocolOptions* value) {
+ _upb_sethas(msg, 1);
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 8), struct envoy_config_core_v3_QuicProtocolOptions*) = value;
+}
+UPB_INLINE struct envoy_config_core_v3_QuicProtocolOptions* envoy_config_listener_v3_QuicProtocolOptions_mutable_quic_protocol_options(envoy_config_listener_v3_QuicProtocolOptions *msg, upb_arena *arena) {
+ struct envoy_config_core_v3_QuicProtocolOptions* sub = (struct envoy_config_core_v3_QuicProtocolOptions*)envoy_config_listener_v3_QuicProtocolOptions_quic_protocol_options(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_config_core_v3_QuicProtocolOptions*)_upb_msg_new(&envoy_config_core_v3_QuicProtocolOptions_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_listener_v3_QuicProtocolOptions_set_quic_protocol_options(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void envoy_config_listener_v3_QuicProtocolOptions_set_idle_timeout(envoy_config_listener_v3_QuicProtocolOptions *msg, struct google_protobuf_Duration* value) {
+ _upb_sethas(msg, 2);
+ *UPB_PTR_AT(msg, UPB_SIZE(8, 16), struct google_protobuf_Duration*) = value;
+}
+UPB_INLINE struct google_protobuf_Duration* envoy_config_listener_v3_QuicProtocolOptions_mutable_idle_timeout(envoy_config_listener_v3_QuicProtocolOptions *msg, upb_arena *arena) {
+ struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_config_listener_v3_QuicProtocolOptions_idle_timeout(msg);
+ if (sub == NULL) {
+ sub = (struct google_protobuf_Duration*)_upb_msg_new(&google_protobuf_Duration_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_listener_v3_QuicProtocolOptions_set_idle_timeout(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void envoy_config_listener_v3_QuicProtocolOptions_set_crypto_handshake_timeout(envoy_config_listener_v3_QuicProtocolOptions *msg, struct google_protobuf_Duration* value) {
+ _upb_sethas(msg, 3);
+ *UPB_PTR_AT(msg, UPB_SIZE(12, 24), struct google_protobuf_Duration*) = value;
+}
+UPB_INLINE struct google_protobuf_Duration* envoy_config_listener_v3_QuicProtocolOptions_mutable_crypto_handshake_timeout(envoy_config_listener_v3_QuicProtocolOptions *msg, upb_arena *arena) {
+ struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_config_listener_v3_QuicProtocolOptions_crypto_handshake_timeout(msg);
+ if (sub == NULL) {
+ sub = (struct google_protobuf_Duration*)_upb_msg_new(&google_protobuf_Duration_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_listener_v3_QuicProtocolOptions_set_crypto_handshake_timeout(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void envoy_config_listener_v3_QuicProtocolOptions_set_enabled(envoy_config_listener_v3_QuicProtocolOptions *msg, struct envoy_config_core_v3_RuntimeFeatureFlag* value) {
+ _upb_sethas(msg, 4);
+ *UPB_PTR_AT(msg, UPB_SIZE(16, 32), struct envoy_config_core_v3_RuntimeFeatureFlag*) = value;
+}
+UPB_INLINE struct envoy_config_core_v3_RuntimeFeatureFlag* envoy_config_listener_v3_QuicProtocolOptions_mutable_enabled(envoy_config_listener_v3_QuicProtocolOptions *msg, upb_arena *arena) {
+ struct envoy_config_core_v3_RuntimeFeatureFlag* sub = (struct envoy_config_core_v3_RuntimeFeatureFlag*)envoy_config_listener_v3_QuicProtocolOptions_enabled(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_config_core_v3_RuntimeFeatureFlag*)_upb_msg_new(&envoy_config_core_v3_RuntimeFeatureFlag_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_listener_v3_QuicProtocolOptions_set_enabled(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void envoy_config_listener_v3_QuicProtocolOptions_set_packets_to_read_to_connection_count_ratio(envoy_config_listener_v3_QuicProtocolOptions *msg, struct google_protobuf_UInt32Value* value) {
+ _upb_sethas(msg, 5);
+ *UPB_PTR_AT(msg, UPB_SIZE(20, 40), struct google_protobuf_UInt32Value*) = value;
+}
+UPB_INLINE struct google_protobuf_UInt32Value* envoy_config_listener_v3_QuicProtocolOptions_mutable_packets_to_read_to_connection_count_ratio(envoy_config_listener_v3_QuicProtocolOptions *msg, upb_arena *arena) {
+ struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_config_listener_v3_QuicProtocolOptions_packets_to_read_to_connection_count_ratio(msg);
+ if (sub == NULL) {
+ sub = (struct google_protobuf_UInt32Value*)_upb_msg_new(&google_protobuf_UInt32Value_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_listener_v3_QuicProtocolOptions_set_packets_to_read_to_connection_count_ratio(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void envoy_config_listener_v3_QuicProtocolOptions_set_crypto_stream_config(envoy_config_listener_v3_QuicProtocolOptions *msg, struct envoy_config_core_v3_TypedExtensionConfig* value) {
+ _upb_sethas(msg, 6);
+ *UPB_PTR_AT(msg, UPB_SIZE(24, 48), struct envoy_config_core_v3_TypedExtensionConfig*) = value;
+}
+UPB_INLINE struct envoy_config_core_v3_TypedExtensionConfig* envoy_config_listener_v3_QuicProtocolOptions_mutable_crypto_stream_config(envoy_config_listener_v3_QuicProtocolOptions *msg, upb_arena *arena) {
+ struct envoy_config_core_v3_TypedExtensionConfig* sub = (struct envoy_config_core_v3_TypedExtensionConfig*)envoy_config_listener_v3_QuicProtocolOptions_crypto_stream_config(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_config_core_v3_TypedExtensionConfig*)_upb_msg_new(&envoy_config_core_v3_TypedExtensionConfig_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_listener_v3_QuicProtocolOptions_set_crypto_stream_config(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void envoy_config_listener_v3_QuicProtocolOptions_set_proof_source_config(envoy_config_listener_v3_QuicProtocolOptions *msg, struct envoy_config_core_v3_TypedExtensionConfig* value) {
+ _upb_sethas(msg, 7);
+ *UPB_PTR_AT(msg, UPB_SIZE(28, 56), struct envoy_config_core_v3_TypedExtensionConfig*) = value;
+}
+UPB_INLINE struct envoy_config_core_v3_TypedExtensionConfig* envoy_config_listener_v3_QuicProtocolOptions_mutable_proof_source_config(envoy_config_listener_v3_QuicProtocolOptions *msg, upb_arena *arena) {
+ struct envoy_config_core_v3_TypedExtensionConfig* sub = (struct envoy_config_core_v3_TypedExtensionConfig*)envoy_config_listener_v3_QuicProtocolOptions_proof_source_config(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_config_core_v3_TypedExtensionConfig*)_upb_msg_new(&envoy_config_core_v3_TypedExtensionConfig_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_listener_v3_QuicProtocolOptions_set_proof_source_config(msg, sub);
+ }
+ return sub;
+}
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif /* ENVOY_CONFIG_LISTENER_V3_QUIC_CONFIG_PROTO_UPB_H_ */
diff --git a/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c b/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c
index 34696f6c0a..14dcdbfcd6 100644
--- a/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c
+++ b/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c
@@ -9,25 +9,27 @@
#include <stddef.h>
#include "upb/msg.h"
#include "envoy/config/listener/v3/udp_listener_config.upb.h"
-#include "google/protobuf/any.upb.h"
+#include "envoy/config/core/v3/udp_socket_config.upb.h"
+#include "envoy/config/listener/v3/quic_config.upb.h"
#include "udpa/annotations/status.upb.h"
#include "udpa/annotations/versioning.upb.h"
#include "upb/port_def.inc"
-static const upb_msglayout *const envoy_config_listener_v3_UdpListenerConfig_submsgs[1] = {
- &google_protobuf_Any_msginit,
+static const upb_msglayout *const envoy_config_listener_v3_UdpListenerConfig_submsgs[2] = {
+ &envoy_config_core_v3_UdpSocketConfig_msginit,
+ &envoy_config_listener_v3_QuicProtocolOptions_msginit,
};
static const upb_msglayout_field envoy_config_listener_v3_UdpListenerConfig__fields[2] = {
- {1, UPB_SIZE(0, 0), 0, 0, 9, 1},
- {3, UPB_SIZE(8, 16), UPB_SIZE(-13, -25), 0, 11, 1},
+ {5, UPB_SIZE(4, 8), 1, 0, 11, 1},
+ {7, UPB_SIZE(8, 16), 2, 1, 11, 1},
};
const upb_msglayout envoy_config_listener_v3_UdpListenerConfig_msginit = {
&envoy_config_listener_v3_UdpListenerConfig_submsgs[0],
&envoy_config_listener_v3_UdpListenerConfig__fields[0],
- UPB_SIZE(16, 32), 2, false, 255,
+ UPB_SIZE(16, 24), 2, false, 255,
};
const upb_msglayout envoy_config_listener_v3_ActiveRawUdpListenerConfig_msginit = {
diff --git a/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h b/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h
index 3de7e08d3b..7dc472dc22 100644
--- a/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h
+++ b/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h
@@ -26,8 +26,10 @@ typedef struct envoy_config_listener_v3_UdpListenerConfig envoy_config_listener_
typedef struct envoy_config_listener_v3_ActiveRawUdpListenerConfig envoy_config_listener_v3_ActiveRawUdpListenerConfig;
extern const upb_msglayout envoy_config_listener_v3_UdpListenerConfig_msginit;
extern const upb_msglayout envoy_config_listener_v3_ActiveRawUdpListenerConfig_msginit;
-struct google_protobuf_Any;
-extern const upb_msglayout google_protobuf_Any_msginit;
+struct envoy_config_core_v3_UdpSocketConfig;
+struct envoy_config_listener_v3_QuicProtocolOptions;
+extern const upb_msglayout envoy_config_core_v3_UdpSocketConfig_msginit;
+extern const upb_msglayout envoy_config_listener_v3_QuicProtocolOptions_msginit;
/* envoy.config.listener.v3.UdpListenerConfig */
@@ -50,28 +52,34 @@ UPB_INLINE char *envoy_config_listener_v3_UdpListenerConfig_serialize(const envo
return upb_encode(msg, &envoy_config_listener_v3_UdpListenerConfig_msginit, arena, len);
}
-typedef enum {
- envoy_config_listener_v3_UdpListenerConfig_config_type_typed_config = 3,
- envoy_config_listener_v3_UdpListenerConfig_config_type_NOT_SET = 0
-} envoy_config_listener_v3_UdpListenerConfig_config_type_oneofcases;
-UPB_INLINE envoy_config_listener_v3_UdpListenerConfig_config_type_oneofcases envoy_config_listener_v3_UdpListenerConfig_config_type_case(const envoy_config_listener_v3_UdpListenerConfig* msg) { return (envoy_config_listener_v3_UdpListenerConfig_config_type_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(12, 24), int32_t); }
+UPB_INLINE bool envoy_config_listener_v3_UdpListenerConfig_has_downstream_socket_config(const envoy_config_listener_v3_UdpListenerConfig *msg) { return _upb_hasbit(msg, 1); }
+UPB_INLINE const struct envoy_config_core_v3_UdpSocketConfig* envoy_config_listener_v3_UdpListenerConfig_downstream_socket_config(const envoy_config_listener_v3_UdpListenerConfig *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), const struct envoy_config_core_v3_UdpSocketConfig*); }
+UPB_INLINE bool envoy_config_listener_v3_UdpListenerConfig_has_quic_options(const envoy_config_listener_v3_UdpListenerConfig *msg) { return _upb_hasbit(msg, 2); }
+UPB_INLINE const struct envoy_config_listener_v3_QuicProtocolOptions* envoy_config_listener_v3_UdpListenerConfig_quic_options(const envoy_config_listener_v3_UdpListenerConfig *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(8, 16), const struct envoy_config_listener_v3_QuicProtocolOptions*); }
-UPB_INLINE upb_strview envoy_config_listener_v3_UdpListenerConfig_udp_listener_name(const envoy_config_listener_v3_UdpListenerConfig *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(0, 0), upb_strview); }
-UPB_INLINE bool envoy_config_listener_v3_UdpListenerConfig_has_typed_config(const envoy_config_listener_v3_UdpListenerConfig *msg) { return _upb_getoneofcase(msg, UPB_SIZE(12, 24)) == 3; }
-UPB_INLINE const struct google_protobuf_Any* envoy_config_listener_v3_UdpListenerConfig_typed_config(const envoy_config_listener_v3_UdpListenerConfig *msg) { return UPB_READ_ONEOF(msg, const struct google_protobuf_Any*, UPB_SIZE(8, 16), UPB_SIZE(12, 24), 3, NULL); }
-
-UPB_INLINE void envoy_config_listener_v3_UdpListenerConfig_set_udp_listener_name(envoy_config_listener_v3_UdpListenerConfig *msg, upb_strview value) {
- *UPB_PTR_AT(msg, UPB_SIZE(0, 0), upb_strview) = value;
+UPB_INLINE void envoy_config_listener_v3_UdpListenerConfig_set_downstream_socket_config(envoy_config_listener_v3_UdpListenerConfig *msg, struct envoy_config_core_v3_UdpSocketConfig* value) {
+ _upb_sethas(msg, 1);
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 8), struct envoy_config_core_v3_UdpSocketConfig*) = value;
+}
+UPB_INLINE struct envoy_config_core_v3_UdpSocketConfig* envoy_config_listener_v3_UdpListenerConfig_mutable_downstream_socket_config(envoy_config_listener_v3_UdpListenerConfig *msg, upb_arena *arena) {
+ struct envoy_config_core_v3_UdpSocketConfig* sub = (struct envoy_config_core_v3_UdpSocketConfig*)envoy_config_listener_v3_UdpListenerConfig_downstream_socket_config(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_config_core_v3_UdpSocketConfig*)_upb_msg_new(&envoy_config_core_v3_UdpSocketConfig_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_listener_v3_UdpListenerConfig_set_downstream_socket_config(msg, sub);
+ }
+ return sub;
}
-UPB_INLINE void envoy_config_listener_v3_UdpListenerConfig_set_typed_config(envoy_config_listener_v3_UdpListenerConfig *msg, struct google_protobuf_Any* value) {
- UPB_WRITE_ONEOF(msg, struct google_protobuf_Any*, UPB_SIZE(8, 16), value, UPB_SIZE(12, 24), 3);
+UPB_INLINE void envoy_config_listener_v3_UdpListenerConfig_set_quic_options(envoy_config_listener_v3_UdpListenerConfig *msg, struct envoy_config_listener_v3_QuicProtocolOptions* value) {
+ _upb_sethas(msg, 2);
+ *UPB_PTR_AT(msg, UPB_SIZE(8, 16), struct envoy_config_listener_v3_QuicProtocolOptions*) = value;
}
-UPB_INLINE struct google_protobuf_Any* envoy_config_listener_v3_UdpListenerConfig_mutable_typed_config(envoy_config_listener_v3_UdpListenerConfig *msg, upb_arena *arena) {
- struct google_protobuf_Any* sub = (struct google_protobuf_Any*)envoy_config_listener_v3_UdpListenerConfig_typed_config(msg);
+UPB_INLINE struct envoy_config_listener_v3_QuicProtocolOptions* envoy_config_listener_v3_UdpListenerConfig_mutable_quic_options(envoy_config_listener_v3_UdpListenerConfig *msg, upb_arena *arena) {
+ struct envoy_config_listener_v3_QuicProtocolOptions* sub = (struct envoy_config_listener_v3_QuicProtocolOptions*)envoy_config_listener_v3_UdpListenerConfig_quic_options(msg);
if (sub == NULL) {
- sub = (struct google_protobuf_Any*)_upb_msg_new(&google_protobuf_Any_msginit, arena);
+ sub = (struct envoy_config_listener_v3_QuicProtocolOptions*)_upb_msg_new(&envoy_config_listener_v3_QuicProtocolOptions_msginit, arena);
if (!sub) return NULL;
- envoy_config_listener_v3_UdpListenerConfig_set_typed_config(msg, sub);
+ envoy_config_listener_v3_UdpListenerConfig_set_quic_options(msg, sub);
}
return sub;
}
diff --git a/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c b/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c
index f8ac2daa4f..d4c81d1a5e 100644
--- a/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c
+++ b/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c
@@ -16,6 +16,7 @@
#include "envoy/type/matcher/v3/string.upb.h"
#include "google/api/expr/v1alpha1/checked.upb.h"
#include "google/api/expr/v1alpha1/syntax.upb.h"
+#include "envoy/annotations/deprecation.upb.h"
#include "udpa/annotations/migrate.upb.h"
#include "udpa/annotations/status.upb.h"
#include "udpa/annotations/versioning.upb.h"
diff --git a/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c b/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c
index d34e1c5050..d82eb1de41 100644
--- a/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c
+++ b/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c
@@ -11,6 +11,7 @@
#include "envoy/config/route/v3/route.upb.h"
#include "envoy/config/core/v3/base.upb.h"
#include "envoy/config/core/v3/config_source.upb.h"
+#include "envoy/config/core/v3/extension.upb.h"
#include "envoy/config/route/v3/route_components.upb.h"
#include "google/protobuf/wrappers.upb.h"
#include "udpa/annotations/status.upb.h"
@@ -19,32 +20,48 @@
#include "upb/port_def.inc"
-static const upb_msglayout *const envoy_config_route_v3_RouteConfiguration_submsgs[5] = {
+static const upb_msglayout *const envoy_config_route_v3_RouteConfiguration_submsgs[6] = {
&envoy_config_core_v3_HeaderValueOption_msginit,
+ &envoy_config_route_v3_ClusterSpecifierPlugin_msginit,
&envoy_config_route_v3_Vhds_msginit,
&envoy_config_route_v3_VirtualHost_msginit,
&google_protobuf_BoolValue_msginit,
&google_protobuf_UInt32Value_msginit,
};
-static const upb_msglayout_field envoy_config_route_v3_RouteConfiguration__fields[11] = {
+static const upb_msglayout_field envoy_config_route_v3_RouteConfiguration__fields[12] = {
{1, UPB_SIZE(4, 8), 0, 0, 9, 1},
- {2, UPB_SIZE(24, 48), 0, 2, 11, 3},
+ {2, UPB_SIZE(24, 48), 0, 3, 11, 3},
{3, UPB_SIZE(28, 56), 0, 0, 9, 3},
{4, UPB_SIZE(32, 64), 0, 0, 11, 3},
{5, UPB_SIZE(36, 72), 0, 0, 9, 3},
{6, UPB_SIZE(40, 80), 0, 0, 11, 3},
- {7, UPB_SIZE(12, 24), 1, 3, 11, 1},
+ {7, UPB_SIZE(12, 24), 1, 4, 11, 1},
{8, UPB_SIZE(44, 88), 0, 0, 9, 3},
- {9, UPB_SIZE(16, 32), 2, 1, 11, 1},
+ {9, UPB_SIZE(16, 32), 2, 2, 11, 1},
{10, UPB_SIZE(1, 1), 0, 0, 8, 1},
- {11, UPB_SIZE(20, 40), 3, 4, 11, 1},
+ {11, UPB_SIZE(20, 40), 3, 5, 11, 1},
+ {12, UPB_SIZE(48, 96), 0, 1, 11, 3},
};
const upb_msglayout envoy_config_route_v3_RouteConfiguration_msginit = {
&envoy_config_route_v3_RouteConfiguration_submsgs[0],
&envoy_config_route_v3_RouteConfiguration__fields[0],
- UPB_SIZE(48, 96), 11, false, 255,
+ UPB_SIZE(56, 112), 12, false, 255,
+};
+
+static const upb_msglayout *const envoy_config_route_v3_ClusterSpecifierPlugin_submsgs[1] = {
+ &envoy_config_core_v3_TypedExtensionConfig_msginit,
+};
+
+static const upb_msglayout_field envoy_config_route_v3_ClusterSpecifierPlugin__fields[1] = {
+ {1, UPB_SIZE(4, 8), 1, 0, 11, 1},
+};
+
+const upb_msglayout envoy_config_route_v3_ClusterSpecifierPlugin_msginit = {
+ &envoy_config_route_v3_ClusterSpecifierPlugin_submsgs[0],
+ &envoy_config_route_v3_ClusterSpecifierPlugin__fields[0],
+ UPB_SIZE(8, 16), 1, false, 255,
};
static const upb_msglayout *const envoy_config_route_v3_Vhds_submsgs[1] = {
diff --git a/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h b/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h
index b8d009fdbc..af2ed7ea87 100644
--- a/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h
+++ b/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h
@@ -21,18 +21,23 @@ extern "C" {
#endif
struct envoy_config_route_v3_RouteConfiguration;
+struct envoy_config_route_v3_ClusterSpecifierPlugin;
struct envoy_config_route_v3_Vhds;
typedef struct envoy_config_route_v3_RouteConfiguration envoy_config_route_v3_RouteConfiguration;
+typedef struct envoy_config_route_v3_ClusterSpecifierPlugin envoy_config_route_v3_ClusterSpecifierPlugin;
typedef struct envoy_config_route_v3_Vhds envoy_config_route_v3_Vhds;
extern const upb_msglayout envoy_config_route_v3_RouteConfiguration_msginit;
+extern const upb_msglayout envoy_config_route_v3_ClusterSpecifierPlugin_msginit;
extern const upb_msglayout envoy_config_route_v3_Vhds_msginit;
struct envoy_config_core_v3_ConfigSource;
struct envoy_config_core_v3_HeaderValueOption;
+struct envoy_config_core_v3_TypedExtensionConfig;
struct envoy_config_route_v3_VirtualHost;
struct google_protobuf_BoolValue;
struct google_protobuf_UInt32Value;
extern const upb_msglayout envoy_config_core_v3_ConfigSource_msginit;
extern const upb_msglayout envoy_config_core_v3_HeaderValueOption_msginit;
+extern const upb_msglayout envoy_config_core_v3_TypedExtensionConfig_msginit;
extern const upb_msglayout envoy_config_route_v3_VirtualHost_msginit;
extern const upb_msglayout google_protobuf_BoolValue_msginit;
extern const upb_msglayout google_protobuf_UInt32Value_msginit;
@@ -75,6 +80,8 @@ UPB_INLINE const envoy_config_route_v3_Vhds* envoy_config_route_v3_RouteConfigur
UPB_INLINE bool envoy_config_route_v3_RouteConfiguration_most_specific_header_mutations_wins(const envoy_config_route_v3_RouteConfiguration *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(1, 1), bool); }
UPB_INLINE bool envoy_config_route_v3_RouteConfiguration_has_max_direct_response_body_size_bytes(const envoy_config_route_v3_RouteConfiguration *msg) { return _upb_hasbit(msg, 3); }
UPB_INLINE const struct google_protobuf_UInt32Value* envoy_config_route_v3_RouteConfiguration_max_direct_response_body_size_bytes(const envoy_config_route_v3_RouteConfiguration *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(20, 40), const struct google_protobuf_UInt32Value*); }
+UPB_INLINE bool envoy_config_route_v3_RouteConfiguration_has_cluster_specifier_plugins(const envoy_config_route_v3_RouteConfiguration *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(48, 96)); }
+UPB_INLINE const envoy_config_route_v3_ClusterSpecifierPlugin* const* envoy_config_route_v3_RouteConfiguration_cluster_specifier_plugins(const envoy_config_route_v3_RouteConfiguration *msg, size_t *len) { return (const envoy_config_route_v3_ClusterSpecifierPlugin* const*)_upb_array_accessor(msg, UPB_SIZE(48, 96), len); }
UPB_INLINE void envoy_config_route_v3_RouteConfiguration_set_name(envoy_config_route_v3_RouteConfiguration *msg, upb_strview value) {
*UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview) = value;
@@ -190,6 +197,56 @@ UPB_INLINE struct google_protobuf_UInt32Value* envoy_config_route_v3_RouteConfig
}
return sub;
}
+UPB_INLINE envoy_config_route_v3_ClusterSpecifierPlugin** envoy_config_route_v3_RouteConfiguration_mutable_cluster_specifier_plugins(envoy_config_route_v3_RouteConfiguration *msg, size_t *len) {
+ return (envoy_config_route_v3_ClusterSpecifierPlugin**)_upb_array_mutable_accessor(msg, UPB_SIZE(48, 96), len);
+}
+UPB_INLINE envoy_config_route_v3_ClusterSpecifierPlugin** envoy_config_route_v3_RouteConfiguration_resize_cluster_specifier_plugins(envoy_config_route_v3_RouteConfiguration *msg, size_t len, upb_arena *arena) {
+ return (envoy_config_route_v3_ClusterSpecifierPlugin**)_upb_array_resize_accessor2(msg, UPB_SIZE(48, 96), len, UPB_SIZE(2, 3), arena);
+}
+UPB_INLINE struct envoy_config_route_v3_ClusterSpecifierPlugin* envoy_config_route_v3_RouteConfiguration_add_cluster_specifier_plugins(envoy_config_route_v3_RouteConfiguration *msg, upb_arena *arena) {
+ struct envoy_config_route_v3_ClusterSpecifierPlugin* sub = (struct envoy_config_route_v3_ClusterSpecifierPlugin*)_upb_msg_new(&envoy_config_route_v3_ClusterSpecifierPlugin_msginit, arena);
+ bool ok = _upb_array_append_accessor2(
+ msg, UPB_SIZE(48, 96), UPB_SIZE(2, 3), &sub, arena);
+ if (!ok) return NULL;
+ return sub;
+}
+
+/* envoy.config.route.v3.ClusterSpecifierPlugin */
+
+UPB_INLINE envoy_config_route_v3_ClusterSpecifierPlugin *envoy_config_route_v3_ClusterSpecifierPlugin_new(upb_arena *arena) {
+ return (envoy_config_route_v3_ClusterSpecifierPlugin *)_upb_msg_new(&envoy_config_route_v3_ClusterSpecifierPlugin_msginit, arena);
+}
+UPB_INLINE envoy_config_route_v3_ClusterSpecifierPlugin *envoy_config_route_v3_ClusterSpecifierPlugin_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ envoy_config_route_v3_ClusterSpecifierPlugin *ret = envoy_config_route_v3_ClusterSpecifierPlugin_new(arena);
+ return (ret && upb_decode(buf, size, ret, &envoy_config_route_v3_ClusterSpecifierPlugin_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE envoy_config_route_v3_ClusterSpecifierPlugin *envoy_config_route_v3_ClusterSpecifierPlugin_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ envoy_config_route_v3_ClusterSpecifierPlugin *ret = envoy_config_route_v3_ClusterSpecifierPlugin_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &envoy_config_route_v3_ClusterSpecifierPlugin_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *envoy_config_route_v3_ClusterSpecifierPlugin_serialize(const envoy_config_route_v3_ClusterSpecifierPlugin *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &envoy_config_route_v3_ClusterSpecifierPlugin_msginit, arena, len);
+}
+
+UPB_INLINE bool envoy_config_route_v3_ClusterSpecifierPlugin_has_extension(const envoy_config_route_v3_ClusterSpecifierPlugin *msg) { return _upb_hasbit(msg, 1); }
+UPB_INLINE const struct envoy_config_core_v3_TypedExtensionConfig* envoy_config_route_v3_ClusterSpecifierPlugin_extension(const envoy_config_route_v3_ClusterSpecifierPlugin *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), const struct envoy_config_core_v3_TypedExtensionConfig*); }
+
+UPB_INLINE void envoy_config_route_v3_ClusterSpecifierPlugin_set_extension(envoy_config_route_v3_ClusterSpecifierPlugin *msg, struct envoy_config_core_v3_TypedExtensionConfig* value) {
+ _upb_sethas(msg, 1);
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 8), struct envoy_config_core_v3_TypedExtensionConfig*) = value;
+}
+UPB_INLINE struct envoy_config_core_v3_TypedExtensionConfig* envoy_config_route_v3_ClusterSpecifierPlugin_mutable_extension(envoy_config_route_v3_ClusterSpecifierPlugin *msg, upb_arena *arena) {
+ struct envoy_config_core_v3_TypedExtensionConfig* sub = (struct envoy_config_core_v3_TypedExtensionConfig*)envoy_config_route_v3_ClusterSpecifierPlugin_extension(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_config_core_v3_TypedExtensionConfig*)_upb_msg_new(&envoy_config_core_v3_TypedExtensionConfig_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_route_v3_ClusterSpecifierPlugin_set_extension(msg, sub);
+ }
+ return sub;
+}
/* envoy.config.route.v3.Vhds */
diff --git a/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c b/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c
index a5c1d65da0..ca05b29d7b 100644
--- a/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c
+++ b/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c
@@ -98,12 +98,13 @@ const upb_msglayout envoy_config_route_v3_FilterAction_msginit = {
UPB_SIZE(8, 16), 1, false, 255,
};
-static const upb_msglayout *const envoy_config_route_v3_Route_submsgs[11] = {
+static const upb_msglayout *const envoy_config_route_v3_Route_submsgs[12] = {
&envoy_config_core_v3_HeaderValueOption_msginit,
&envoy_config_core_v3_Metadata_msginit,
&envoy_config_route_v3_Decorator_msginit,
&envoy_config_route_v3_DirectResponseAction_msginit,
&envoy_config_route_v3_FilterAction_msginit,
+ &envoy_config_route_v3_NonForwardingAction_msginit,
&envoy_config_route_v3_RedirectAction_msginit,
&envoy_config_route_v3_Route_TypedPerFilterConfigEntry_msginit,
&envoy_config_route_v3_RouteAction_msginit,
@@ -112,10 +113,10 @@ static const upb_msglayout *const envoy_config_route_v3_Route_submsgs[11] = {
&google_protobuf_UInt32Value_msginit,
};
-static const upb_msglayout_field envoy_config_route_v3_Route__fields[15] = {
- {1, UPB_SIZE(12, 24), 1, 8, 11, 1},
- {2, UPB_SIZE(52, 104), UPB_SIZE(-57, -113), 7, 11, 1},
- {3, UPB_SIZE(52, 104), UPB_SIZE(-57, -113), 5, 11, 1},
+static const upb_msglayout_field envoy_config_route_v3_Route__fields[16] = {
+ {1, UPB_SIZE(12, 24), 1, 9, 11, 1},
+ {2, UPB_SIZE(52, 104), UPB_SIZE(-57, -113), 8, 11, 1},
+ {3, UPB_SIZE(52, 104), UPB_SIZE(-57, -113), 6, 11, 1},
{4, UPB_SIZE(16, 32), 2, 1, 11, 1},
{5, UPB_SIZE(20, 40), 3, 2, 11, 1},
{7, UPB_SIZE(52, 104), UPB_SIZE(-57, -113), 3, 11, 1},
@@ -123,17 +124,18 @@ static const upb_msglayout_field envoy_config_route_v3_Route__fields[15] = {
{10, UPB_SIZE(36, 72), 0, 0, 11, 3},
{11, UPB_SIZE(40, 80), 0, 0, 9, 3},
{12, UPB_SIZE(44, 88), 0, 0, 9, 3},
- {13, UPB_SIZE(48, 96), 0, 6, 11, _UPB_LABEL_MAP},
+ {13, UPB_SIZE(48, 96), 0, 7, 11, _UPB_LABEL_MAP},
{14, UPB_SIZE(4, 8), 0, 0, 9, 1},
- {15, UPB_SIZE(24, 48), 4, 9, 11, 1},
- {16, UPB_SIZE(28, 56), 5, 10, 11, 1},
+ {15, UPB_SIZE(24, 48), 4, 10, 11, 1},
+ {16, UPB_SIZE(28, 56), 5, 11, 11, 1},
{17, UPB_SIZE(52, 104), UPB_SIZE(-57, -113), 4, 11, 1},
+ {18, UPB_SIZE(52, 104), UPB_SIZE(-57, -113), 5, 11, 1},
};
const upb_msglayout envoy_config_route_v3_Route_msginit = {
&envoy_config_route_v3_Route_submsgs[0],
&envoy_config_route_v3_Route__fields[0],
- UPB_SIZE(64, 128), 15, false, 255,
+ UPB_SIZE(64, 128), 16, false, 255,
};
static const upb_msglayout *const envoy_config_route_v3_Route_TypedPerFilterConfigEntry_submsgs[1] = {
@@ -175,7 +177,7 @@ static const upb_msglayout *const envoy_config_route_v3_WeightedCluster_ClusterW
&google_protobuf_UInt32Value_msginit,
};
-static const upb_msglayout_field envoy_config_route_v3_WeightedCluster_ClusterWeight__fields[8] = {
+static const upb_msglayout_field envoy_config_route_v3_WeightedCluster_ClusterWeight__fields[9] = {
{1, UPB_SIZE(4, 8), 0, 0, 9, 1},
{2, UPB_SIZE(12, 24), 1, 3, 11, 1},
{3, UPB_SIZE(16, 32), 2, 1, 11, 1},
@@ -184,12 +186,13 @@ static const upb_msglayout_field envoy_config_route_v3_WeightedCluster_ClusterWe
{6, UPB_SIZE(28, 56), 0, 0, 9, 3},
{9, UPB_SIZE(32, 64), 0, 0, 9, 3},
{10, UPB_SIZE(36, 72), 0, 2, 11, _UPB_LABEL_MAP},
+ {11, UPB_SIZE(40, 80), UPB_SIZE(-49, -97), 0, 9, 1},
};
const upb_msglayout envoy_config_route_v3_WeightedCluster_ClusterWeight_msginit = {
&envoy_config_route_v3_WeightedCluster_ClusterWeight_submsgs[0],
&envoy_config_route_v3_WeightedCluster_ClusterWeight__fields[0],
- UPB_SIZE(40, 80), 8, false, 255,
+ UPB_SIZE(56, 112), 9, false, 255,
};
static const upb_msglayout *const envoy_config_route_v3_WeightedCluster_ClusterWeight_TypedPerFilterConfigEntry_submsgs[1] = {
@@ -306,7 +309,7 @@ static const upb_msglayout *const envoy_config_route_v3_RouteAction_submsgs[16]
&google_protobuf_UInt32Value_msginit,
};
-static const upb_msglayout_field envoy_config_route_v3_RouteAction__fields[29] = {
+static const upb_msglayout_field envoy_config_route_v3_RouteAction__fields[30] = {
{1, UPB_SIZE(96, 176), UPB_SIZE(-105, -193), 0, 9, 1},
{2, UPB_SIZE(96, 176), UPB_SIZE(-105, -193), 0, 9, 1},
{3, UPB_SIZE(96, 176), UPB_SIZE(-105, -193), 10, 11, 1},
@@ -336,12 +339,13 @@ static const upb_msglayout_field envoy_config_route_v3_RouteAction__fields[29] =
{34, UPB_SIZE(72, 128), 13, 3, 11, 1},
{35, UPB_SIZE(108, 200), UPB_SIZE(-117, -217), 11, 11, 1},
{36, UPB_SIZE(76, 136), 14, 7, 11, 1},
+ {37, UPB_SIZE(96, 176), UPB_SIZE(-105, -193), 0, 9, 1},
};
const upb_msglayout envoy_config_route_v3_RouteAction_msginit = {
&envoy_config_route_v3_RouteAction_submsgs[0],
&envoy_config_route_v3_RouteAction__fields[0],
- UPB_SIZE(120, 224), 29, false, 255,
+ UPB_SIZE(120, 224), 30, false, 255,
};
static const upb_msglayout *const envoy_config_route_v3_RouteAction_RequestMirrorPolicy_submsgs[2] = {
@@ -649,6 +653,12 @@ const upb_msglayout envoy_config_route_v3_DirectResponseAction_msginit = {
UPB_SIZE(16, 16), 2, false, 255,
};
+const upb_msglayout envoy_config_route_v3_NonForwardingAction_msginit = {
+ NULL,
+ NULL,
+ UPB_SIZE(0, 0), 0, false, 255,
+};
+
static const upb_msglayout *const envoy_config_route_v3_Decorator_submsgs[1] = {
&google_protobuf_BoolValue_msginit,
};
@@ -865,27 +875,29 @@ const upb_msglayout envoy_config_route_v3_RateLimit_Override_DynamicMetadata_msg
UPB_SIZE(8, 16), 1, false, 255,
};
-static const upb_msglayout *const envoy_config_route_v3_HeaderMatcher_submsgs[2] = {
+static const upb_msglayout *const envoy_config_route_v3_HeaderMatcher_submsgs[3] = {
&envoy_type_matcher_v3_RegexMatcher_msginit,
+ &envoy_type_matcher_v3_StringMatcher_msginit,
&envoy_type_v3_Int64Range_msginit,
};
-static const upb_msglayout_field envoy_config_route_v3_HeaderMatcher__fields[9] = {
+static const upb_msglayout_field envoy_config_route_v3_HeaderMatcher__fields[10] = {
{1, UPB_SIZE(4, 8), 0, 0, 9, 1},
{4, UPB_SIZE(12, 24), UPB_SIZE(-21, -41), 0, 9, 1},
- {6, UPB_SIZE(12, 24), UPB_SIZE(-21, -41), 1, 11, 1},
+ {6, UPB_SIZE(12, 24), UPB_SIZE(-21, -41), 2, 11, 1},
{7, UPB_SIZE(12, 24), UPB_SIZE(-21, -41), 0, 8, 1},
{8, UPB_SIZE(0, 0), 0, 0, 8, 1},
{9, UPB_SIZE(12, 24), UPB_SIZE(-21, -41), 0, 9, 1},
{10, UPB_SIZE(12, 24), UPB_SIZE(-21, -41), 0, 9, 1},
{11, UPB_SIZE(12, 24), UPB_SIZE(-21, -41), 0, 11, 1},
{12, UPB_SIZE(12, 24), UPB_SIZE(-21, -41), 0, 9, 1},
+ {13, UPB_SIZE(12, 24), UPB_SIZE(-21, -41), 1, 11, 1},
};
const upb_msglayout envoy_config_route_v3_HeaderMatcher_msginit = {
&envoy_config_route_v3_HeaderMatcher_submsgs[0],
&envoy_config_route_v3_HeaderMatcher__fields[0],
- UPB_SIZE(24, 48), 9, false, 255,
+ UPB_SIZE(24, 48), 10, false, 255,
};
static const upb_msglayout *const envoy_config_route_v3_QueryParameterMatcher_submsgs[1] = {
diff --git a/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h b/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h
index 4f98c01552..f01e3596b2 100644
--- a/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h
+++ b/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h
@@ -53,6 +53,7 @@ struct envoy_config_route_v3_RetryPolicy_RateLimitedRetryBackOff;
struct envoy_config_route_v3_HedgePolicy;
struct envoy_config_route_v3_RedirectAction;
struct envoy_config_route_v3_DirectResponseAction;
+struct envoy_config_route_v3_NonForwardingAction;
struct envoy_config_route_v3_Decorator;
struct envoy_config_route_v3_Tracing;
struct envoy_config_route_v3_VirtualCluster;
@@ -105,6 +106,7 @@ typedef struct envoy_config_route_v3_RetryPolicy_RateLimitedRetryBackOff envoy_c
typedef struct envoy_config_route_v3_HedgePolicy envoy_config_route_v3_HedgePolicy;
typedef struct envoy_config_route_v3_RedirectAction envoy_config_route_v3_RedirectAction;
typedef struct envoy_config_route_v3_DirectResponseAction envoy_config_route_v3_DirectResponseAction;
+typedef struct envoy_config_route_v3_NonForwardingAction envoy_config_route_v3_NonForwardingAction;
typedef struct envoy_config_route_v3_Decorator envoy_config_route_v3_Decorator;
typedef struct envoy_config_route_v3_Tracing envoy_config_route_v3_Tracing;
typedef struct envoy_config_route_v3_VirtualCluster envoy_config_route_v3_VirtualCluster;
@@ -157,6 +159,7 @@ extern const upb_msglayout envoy_config_route_v3_RetryPolicy_RateLimitedRetryBac
extern const upb_msglayout envoy_config_route_v3_HedgePolicy_msginit;
extern const upb_msglayout envoy_config_route_v3_RedirectAction_msginit;
extern const upb_msglayout envoy_config_route_v3_DirectResponseAction_msginit;
+extern const upb_msglayout envoy_config_route_v3_NonForwardingAction_msginit;
extern const upb_msglayout envoy_config_route_v3_Decorator_msginit;
extern const upb_msglayout envoy_config_route_v3_Tracing_msginit;
extern const upb_msglayout envoy_config_route_v3_VirtualCluster_msginit;
@@ -555,6 +558,7 @@ typedef enum {
envoy_config_route_v3_Route_action_redirect = 3,
envoy_config_route_v3_Route_action_direct_response = 7,
envoy_config_route_v3_Route_action_filter_action = 17,
+ envoy_config_route_v3_Route_action_non_forwarding_action = 18,
envoy_config_route_v3_Route_action_NOT_SET = 0
} envoy_config_route_v3_Route_action_oneofcases;
UPB_INLINE envoy_config_route_v3_Route_action_oneofcases envoy_config_route_v3_Route_action_case(const envoy_config_route_v3_Route* msg) { return (envoy_config_route_v3_Route_action_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(56, 112), int32_t); }
@@ -588,6 +592,8 @@ UPB_INLINE bool envoy_config_route_v3_Route_has_per_request_buffer_limit_bytes(c
UPB_INLINE const struct google_protobuf_UInt32Value* envoy_config_route_v3_Route_per_request_buffer_limit_bytes(const envoy_config_route_v3_Route *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(28, 56), const struct google_protobuf_UInt32Value*); }
UPB_INLINE bool envoy_config_route_v3_Route_has_filter_action(const envoy_config_route_v3_Route *msg) { return _upb_getoneofcase(msg, UPB_SIZE(56, 112)) == 17; }
UPB_INLINE const envoy_config_route_v3_FilterAction* envoy_config_route_v3_Route_filter_action(const envoy_config_route_v3_Route *msg) { return UPB_READ_ONEOF(msg, const envoy_config_route_v3_FilterAction*, UPB_SIZE(52, 104), UPB_SIZE(56, 112), 17, NULL); }
+UPB_INLINE bool envoy_config_route_v3_Route_has_non_forwarding_action(const envoy_config_route_v3_Route *msg) { return _upb_getoneofcase(msg, UPB_SIZE(56, 112)) == 18; }
+UPB_INLINE const envoy_config_route_v3_NonForwardingAction* envoy_config_route_v3_Route_non_forwarding_action(const envoy_config_route_v3_Route *msg) { return UPB_READ_ONEOF(msg, const envoy_config_route_v3_NonForwardingAction*, UPB_SIZE(52, 104), UPB_SIZE(56, 112), 18, NULL); }
UPB_INLINE void envoy_config_route_v3_Route_set_match(envoy_config_route_v3_Route *msg, envoy_config_route_v3_RouteMatch* value) {
_upb_sethas(msg, 1);
@@ -755,6 +761,18 @@ UPB_INLINE struct envoy_config_route_v3_FilterAction* envoy_config_route_v3_Rout
}
return sub;
}
+UPB_INLINE void envoy_config_route_v3_Route_set_non_forwarding_action(envoy_config_route_v3_Route *msg, envoy_config_route_v3_NonForwardingAction* value) {
+ UPB_WRITE_ONEOF(msg, envoy_config_route_v3_NonForwardingAction*, UPB_SIZE(52, 104), value, UPB_SIZE(56, 112), 18);
+}
+UPB_INLINE struct envoy_config_route_v3_NonForwardingAction* envoy_config_route_v3_Route_mutable_non_forwarding_action(envoy_config_route_v3_Route *msg, upb_arena *arena) {
+ struct envoy_config_route_v3_NonForwardingAction* sub = (struct envoy_config_route_v3_NonForwardingAction*)envoy_config_route_v3_Route_non_forwarding_action(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_config_route_v3_NonForwardingAction*)_upb_msg_new(&envoy_config_route_v3_NonForwardingAction_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_route_v3_Route_set_non_forwarding_action(msg, sub);
+ }
+ return sub;
+}
/* envoy.config.route.v3.Route.TypedPerFilterConfigEntry */
@@ -850,6 +868,12 @@ UPB_INLINE char *envoy_config_route_v3_WeightedCluster_ClusterWeight_serialize(c
return upb_encode(msg, &envoy_config_route_v3_WeightedCluster_ClusterWeight_msginit, arena, len);
}
+typedef enum {
+ envoy_config_route_v3_WeightedCluster_ClusterWeight_host_rewrite_specifier_host_rewrite_literal = 11,
+ envoy_config_route_v3_WeightedCluster_ClusterWeight_host_rewrite_specifier_NOT_SET = 0
+} envoy_config_route_v3_WeightedCluster_ClusterWeight_host_rewrite_specifier_oneofcases;
+UPB_INLINE envoy_config_route_v3_WeightedCluster_ClusterWeight_host_rewrite_specifier_oneofcases envoy_config_route_v3_WeightedCluster_ClusterWeight_host_rewrite_specifier_case(const envoy_config_route_v3_WeightedCluster_ClusterWeight* msg) { return (envoy_config_route_v3_WeightedCluster_ClusterWeight_host_rewrite_specifier_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(48, 96), int32_t); }
+
UPB_INLINE upb_strview envoy_config_route_v3_WeightedCluster_ClusterWeight_name(const envoy_config_route_v3_WeightedCluster_ClusterWeight *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview); }
UPB_INLINE bool envoy_config_route_v3_WeightedCluster_ClusterWeight_has_weight(const envoy_config_route_v3_WeightedCluster_ClusterWeight *msg) { return _upb_hasbit(msg, 1); }
UPB_INLINE const struct google_protobuf_UInt32Value* envoy_config_route_v3_WeightedCluster_ClusterWeight_weight(const envoy_config_route_v3_WeightedCluster_ClusterWeight *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 24), const struct google_protobuf_UInt32Value*); }
@@ -865,6 +889,8 @@ UPB_INLINE bool envoy_config_route_v3_WeightedCluster_ClusterWeight_has_typed_pe
UPB_INLINE size_t envoy_config_route_v3_WeightedCluster_ClusterWeight_typed_per_filter_config_size(const envoy_config_route_v3_WeightedCluster_ClusterWeight *msg) {return _upb_msg_map_size(msg, UPB_SIZE(36, 72)); }
UPB_INLINE bool envoy_config_route_v3_WeightedCluster_ClusterWeight_typed_per_filter_config_get(const envoy_config_route_v3_WeightedCluster_ClusterWeight *msg, upb_strview key, struct google_protobuf_Any* *val) { return _upb_msg_map_get(msg, UPB_SIZE(36, 72), &key, 0, val, sizeof(*val)); }
UPB_INLINE const envoy_config_route_v3_WeightedCluster_ClusterWeight_TypedPerFilterConfigEntry* envoy_config_route_v3_WeightedCluster_ClusterWeight_typed_per_filter_config_next(const envoy_config_route_v3_WeightedCluster_ClusterWeight *msg, size_t* iter) { return (const envoy_config_route_v3_WeightedCluster_ClusterWeight_TypedPerFilterConfigEntry*)_upb_msg_map_next(msg, UPB_SIZE(36, 72), iter); }
+UPB_INLINE bool envoy_config_route_v3_WeightedCluster_ClusterWeight_has_host_rewrite_literal(const envoy_config_route_v3_WeightedCluster_ClusterWeight *msg) { return _upb_getoneofcase(msg, UPB_SIZE(48, 96)) == 11; }
+UPB_INLINE upb_strview envoy_config_route_v3_WeightedCluster_ClusterWeight_host_rewrite_literal(const envoy_config_route_v3_WeightedCluster_ClusterWeight *msg) { return UPB_READ_ONEOF(msg, upb_strview, UPB_SIZE(40, 80), UPB_SIZE(48, 96), 11, upb_strview_make("", strlen(""))); }
UPB_INLINE void envoy_config_route_v3_WeightedCluster_ClusterWeight_set_name(envoy_config_route_v3_WeightedCluster_ClusterWeight *msg, upb_strview value) {
*UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview) = value;
@@ -945,6 +971,9 @@ UPB_INLINE void envoy_config_route_v3_WeightedCluster_ClusterWeight_typed_per_fi
UPB_INLINE bool envoy_config_route_v3_WeightedCluster_ClusterWeight_typed_per_filter_config_set(envoy_config_route_v3_WeightedCluster_ClusterWeight *msg, upb_strview key, struct google_protobuf_Any* val, upb_arena *a) { return _upb_msg_map_set(msg, UPB_SIZE(36, 72), &key, 0, &val, sizeof(val), a); }
UPB_INLINE bool envoy_config_route_v3_WeightedCluster_ClusterWeight_typed_per_filter_config_delete(envoy_config_route_v3_WeightedCluster_ClusterWeight *msg, upb_strview key) { return _upb_msg_map_delete(msg, UPB_SIZE(36, 72), &key, 0); }
UPB_INLINE envoy_config_route_v3_WeightedCluster_ClusterWeight_TypedPerFilterConfigEntry* envoy_config_route_v3_WeightedCluster_ClusterWeight_typed_per_filter_config_nextmutable(envoy_config_route_v3_WeightedCluster_ClusterWeight *msg, size_t* iter) { return (envoy_config_route_v3_WeightedCluster_ClusterWeight_TypedPerFilterConfigEntry*)_upb_msg_map_next(msg, UPB_SIZE(36, 72), iter); }
+UPB_INLINE void envoy_config_route_v3_WeightedCluster_ClusterWeight_set_host_rewrite_literal(envoy_config_route_v3_WeightedCluster_ClusterWeight *msg, upb_strview value) {
+ UPB_WRITE_ONEOF(msg, upb_strview, UPB_SIZE(40, 80), value, UPB_SIZE(48, 96), 11);
+}
/* envoy.config.route.v3.WeightedCluster.ClusterWeight.TypedPerFilterConfigEntry */
@@ -1346,6 +1375,7 @@ typedef enum {
envoy_config_route_v3_RouteAction_cluster_specifier_cluster = 1,
envoy_config_route_v3_RouteAction_cluster_specifier_cluster_header = 2,
envoy_config_route_v3_RouteAction_cluster_specifier_weighted_clusters = 3,
+ envoy_config_route_v3_RouteAction_cluster_specifier_cluster_specifier_plugin = 37,
envoy_config_route_v3_RouteAction_cluster_specifier_NOT_SET = 0
} envoy_config_route_v3_RouteAction_cluster_specifier_oneofcases;
UPB_INLINE envoy_config_route_v3_RouteAction_cluster_specifier_oneofcases envoy_config_route_v3_RouteAction_cluster_specifier_case(const envoy_config_route_v3_RouteAction* msg) { return (envoy_config_route_v3_RouteAction_cluster_specifier_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(104, 192), int32_t); }
@@ -1413,6 +1443,8 @@ UPB_INLINE bool envoy_config_route_v3_RouteAction_has_host_rewrite_path_regex(co
UPB_INLINE const struct envoy_type_matcher_v3_RegexMatchAndSubstitute* envoy_config_route_v3_RouteAction_host_rewrite_path_regex(const envoy_config_route_v3_RouteAction *msg) { return UPB_READ_ONEOF(msg, const struct envoy_type_matcher_v3_RegexMatchAndSubstitute*, UPB_SIZE(108, 200), UPB_SIZE(116, 216), 35, NULL); }
UPB_INLINE bool envoy_config_route_v3_RouteAction_has_max_stream_duration(const envoy_config_route_v3_RouteAction *msg) { return _upb_hasbit(msg, 14); }
UPB_INLINE const envoy_config_route_v3_RouteAction_MaxStreamDuration* envoy_config_route_v3_RouteAction_max_stream_duration(const envoy_config_route_v3_RouteAction *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(76, 136), const envoy_config_route_v3_RouteAction_MaxStreamDuration*); }
+UPB_INLINE bool envoy_config_route_v3_RouteAction_has_cluster_specifier_plugin(const envoy_config_route_v3_RouteAction *msg) { return _upb_getoneofcase(msg, UPB_SIZE(104, 192)) == 37; }
+UPB_INLINE upb_strview envoy_config_route_v3_RouteAction_cluster_specifier_plugin(const envoy_config_route_v3_RouteAction *msg) { return UPB_READ_ONEOF(msg, upb_strview, UPB_SIZE(96, 176), UPB_SIZE(104, 192), 37, upb_strview_make("", strlen(""))); }
UPB_INLINE void envoy_config_route_v3_RouteAction_set_cluster(envoy_config_route_v3_RouteAction *msg, upb_strview value) {
UPB_WRITE_ONEOF(msg, upb_strview, UPB_SIZE(96, 176), value, UPB_SIZE(104, 192), 1);
@@ -1708,6 +1740,9 @@ UPB_INLINE struct envoy_config_route_v3_RouteAction_MaxStreamDuration* envoy_con
}
return sub;
}
+UPB_INLINE void envoy_config_route_v3_RouteAction_set_cluster_specifier_plugin(envoy_config_route_v3_RouteAction *msg, upb_strview value) {
+ UPB_WRITE_ONEOF(msg, upb_strview, UPB_SIZE(96, 176), value, UPB_SIZE(104, 192), 37);
+}
/* envoy.config.route.v3.RouteAction.RequestMirrorPolicy */
@@ -2770,6 +2805,28 @@ UPB_INLINE struct envoy_config_core_v3_DataSource* envoy_config_route_v3_DirectR
return sub;
}
+/* envoy.config.route.v3.NonForwardingAction */
+
+UPB_INLINE envoy_config_route_v3_NonForwardingAction *envoy_config_route_v3_NonForwardingAction_new(upb_arena *arena) {
+ return (envoy_config_route_v3_NonForwardingAction *)_upb_msg_new(&envoy_config_route_v3_NonForwardingAction_msginit, arena);
+}
+UPB_INLINE envoy_config_route_v3_NonForwardingAction *envoy_config_route_v3_NonForwardingAction_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ envoy_config_route_v3_NonForwardingAction *ret = envoy_config_route_v3_NonForwardingAction_new(arena);
+ return (ret && upb_decode(buf, size, ret, &envoy_config_route_v3_NonForwardingAction_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE envoy_config_route_v3_NonForwardingAction *envoy_config_route_v3_NonForwardingAction_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ envoy_config_route_v3_NonForwardingAction *ret = envoy_config_route_v3_NonForwardingAction_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &envoy_config_route_v3_NonForwardingAction_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *envoy_config_route_v3_NonForwardingAction_serialize(const envoy_config_route_v3_NonForwardingAction *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &envoy_config_route_v3_NonForwardingAction_msginit, arena, len);
+}
+
+
+
/* envoy.config.route.v3.Decorator */
UPB_INLINE envoy_config_route_v3_Decorator *envoy_config_route_v3_Decorator_new(upb_arena *arena) {
@@ -3554,6 +3611,7 @@ typedef enum {
envoy_config_route_v3_HeaderMatcher_header_match_specifier_prefix_match = 9,
envoy_config_route_v3_HeaderMatcher_header_match_specifier_suffix_match = 10,
envoy_config_route_v3_HeaderMatcher_header_match_specifier_contains_match = 12,
+ envoy_config_route_v3_HeaderMatcher_header_match_specifier_string_match = 13,
envoy_config_route_v3_HeaderMatcher_header_match_specifier_NOT_SET = 0
} envoy_config_route_v3_HeaderMatcher_header_match_specifier_oneofcases;
UPB_INLINE envoy_config_route_v3_HeaderMatcher_header_match_specifier_oneofcases envoy_config_route_v3_HeaderMatcher_header_match_specifier_case(const envoy_config_route_v3_HeaderMatcher* msg) { return (envoy_config_route_v3_HeaderMatcher_header_match_specifier_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(20, 40), int32_t); }
@@ -3574,6 +3632,8 @@ UPB_INLINE bool envoy_config_route_v3_HeaderMatcher_has_safe_regex_match(const e
UPB_INLINE const struct envoy_type_matcher_v3_RegexMatcher* envoy_config_route_v3_HeaderMatcher_safe_regex_match(const envoy_config_route_v3_HeaderMatcher *msg) { return UPB_READ_ONEOF(msg, const struct envoy_type_matcher_v3_RegexMatcher*, UPB_SIZE(12, 24), UPB_SIZE(20, 40), 11, NULL); }
UPB_INLINE bool envoy_config_route_v3_HeaderMatcher_has_contains_match(const envoy_config_route_v3_HeaderMatcher *msg) { return _upb_getoneofcase(msg, UPB_SIZE(20, 40)) == 12; }
UPB_INLINE upb_strview envoy_config_route_v3_HeaderMatcher_contains_match(const envoy_config_route_v3_HeaderMatcher *msg) { return UPB_READ_ONEOF(msg, upb_strview, UPB_SIZE(12, 24), UPB_SIZE(20, 40), 12, upb_strview_make("", strlen(""))); }
+UPB_INLINE bool envoy_config_route_v3_HeaderMatcher_has_string_match(const envoy_config_route_v3_HeaderMatcher *msg) { return _upb_getoneofcase(msg, UPB_SIZE(20, 40)) == 13; }
+UPB_INLINE const struct envoy_type_matcher_v3_StringMatcher* envoy_config_route_v3_HeaderMatcher_string_match(const envoy_config_route_v3_HeaderMatcher *msg) { return UPB_READ_ONEOF(msg, const struct envoy_type_matcher_v3_StringMatcher*, UPB_SIZE(12, 24), UPB_SIZE(20, 40), 13, NULL); }
UPB_INLINE void envoy_config_route_v3_HeaderMatcher_set_name(envoy_config_route_v3_HeaderMatcher *msg, upb_strview value) {
*UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview) = value;
@@ -3620,6 +3680,18 @@ UPB_INLINE struct envoy_type_matcher_v3_RegexMatcher* envoy_config_route_v3_Head
UPB_INLINE void envoy_config_route_v3_HeaderMatcher_set_contains_match(envoy_config_route_v3_HeaderMatcher *msg, upb_strview value) {
UPB_WRITE_ONEOF(msg, upb_strview, UPB_SIZE(12, 24), value, UPB_SIZE(20, 40), 12);
}
+UPB_INLINE void envoy_config_route_v3_HeaderMatcher_set_string_match(envoy_config_route_v3_HeaderMatcher *msg, struct envoy_type_matcher_v3_StringMatcher* value) {
+ UPB_WRITE_ONEOF(msg, struct envoy_type_matcher_v3_StringMatcher*, UPB_SIZE(12, 24), value, UPB_SIZE(20, 40), 13);
+}
+UPB_INLINE struct envoy_type_matcher_v3_StringMatcher* envoy_config_route_v3_HeaderMatcher_mutable_string_match(envoy_config_route_v3_HeaderMatcher *msg, upb_arena *arena) {
+ struct envoy_type_matcher_v3_StringMatcher* sub = (struct envoy_type_matcher_v3_StringMatcher*)envoy_config_route_v3_HeaderMatcher_string_match(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_type_matcher_v3_StringMatcher*)_upb_msg_new(&envoy_type_matcher_v3_StringMatcher_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_route_v3_HeaderMatcher_set_string_match(msg, sub);
+ }
+ return sub;
+}
/* envoy.config.route.v3.QueryParameterMatcher */
diff --git a/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c b/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c
index ca5144c5dc..e363a2c402 100644
--- a/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c
+++ b/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c
@@ -51,7 +51,7 @@ static const upb_msglayout *const envoy_extensions_filters_http_fault_v3_HTTPFau
&google_protobuf_UInt32Value_msginit,
};
-static const upb_msglayout_field envoy_extensions_filters_http_fault_v3_HTTPFault__fields[14] = {
+static const upb_msglayout_field envoy_extensions_filters_http_fault_v3_HTTPFault__fields[15] = {
{1, UPB_SIZE(68, 136), 1, 1, 11, 1},
{2, UPB_SIZE(72, 144), 2, 3, 11, 1},
{3, UPB_SIZE(4, 8), 0, 0, 9, 1},
@@ -66,12 +66,13 @@ static const upb_msglayout_field envoy_extensions_filters_http_fault_v3_HTTPFaul
{12, UPB_SIZE(44, 88), 0, 0, 9, 1},
{13, UPB_SIZE(52, 104), 0, 0, 9, 1},
{14, UPB_SIZE(60, 120), 0, 0, 9, 1},
+ {15, UPB_SIZE(1, 1), 0, 0, 8, 1},
};
const upb_msglayout envoy_extensions_filters_http_fault_v3_HTTPFault_msginit = {
&envoy_extensions_filters_http_fault_v3_HTTPFault_submsgs[0],
&envoy_extensions_filters_http_fault_v3_HTTPFault__fields[0],
- UPB_SIZE(96, 192), 14, false, 255,
+ UPB_SIZE(96, 192), 15, false, 255,
};
#include "upb/port_undef.inc"
diff --git a/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h b/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h
index fc618c9a53..08e71d4c4d 100644
--- a/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h
+++ b/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h
@@ -171,6 +171,7 @@ UPB_INLINE upb_strview envoy_extensions_filters_http_fault_v3_HTTPFault_abort_ht
UPB_INLINE upb_strview envoy_extensions_filters_http_fault_v3_HTTPFault_max_active_faults_runtime(const envoy_extensions_filters_http_fault_v3_HTTPFault *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(44, 88), upb_strview); }
UPB_INLINE upb_strview envoy_extensions_filters_http_fault_v3_HTTPFault_response_rate_limit_percent_runtime(const envoy_extensions_filters_http_fault_v3_HTTPFault *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(52, 104), upb_strview); }
UPB_INLINE upb_strview envoy_extensions_filters_http_fault_v3_HTTPFault_abort_grpc_status_runtime(const envoy_extensions_filters_http_fault_v3_HTTPFault *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(60, 120), upb_strview); }
+UPB_INLINE bool envoy_extensions_filters_http_fault_v3_HTTPFault_disable_downstream_cluster_stats(const envoy_extensions_filters_http_fault_v3_HTTPFault *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(1, 1), bool); }
UPB_INLINE void envoy_extensions_filters_http_fault_v3_HTTPFault_set_delay(envoy_extensions_filters_http_fault_v3_HTTPFault *msg, struct envoy_extensions_filters_common_fault_v3_FaultDelay* value) {
_upb_sethas(msg, 1);
@@ -271,6 +272,9 @@ UPB_INLINE void envoy_extensions_filters_http_fault_v3_HTTPFault_set_response_ra
UPB_INLINE void envoy_extensions_filters_http_fault_v3_HTTPFault_set_abort_grpc_status_runtime(envoy_extensions_filters_http_fault_v3_HTTPFault *msg, upb_strview value) {
*UPB_PTR_AT(msg, UPB_SIZE(60, 120), upb_strview) = value;
}
+UPB_INLINE void envoy_extensions_filters_http_fault_v3_HTTPFault_set_disable_downstream_cluster_stats(envoy_extensions_filters_http_fault_v3_HTTPFault *msg, bool value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(1, 1), bool) = value;
+}
#ifdef __cplusplus
} /* extern "C" */
diff --git a/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c b/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c
index 8e6ff697fc..b69c2cda3f 100644
--- a/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c
+++ b/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c
@@ -22,19 +22,20 @@ static const upb_msglayout *const envoy_extensions_filters_http_router_v3_Router
&google_protobuf_BoolValue_msginit,
};
-static const upb_msglayout_field envoy_extensions_filters_http_router_v3_Router__fields[6] = {
- {1, UPB_SIZE(4, 8), 1, 1, 11, 1},
+static const upb_msglayout_field envoy_extensions_filters_http_router_v3_Router__fields[7] = {
+ {1, UPB_SIZE(8, 8), 1, 1, 11, 1},
{2, UPB_SIZE(1, 1), 0, 0, 8, 1},
- {3, UPB_SIZE(8, 16), 0, 0, 11, 3},
+ {3, UPB_SIZE(12, 16), 0, 0, 11, 3},
{4, UPB_SIZE(2, 2), 0, 0, 8, 1},
- {5, UPB_SIZE(12, 24), 0, 0, 9, 3},
+ {5, UPB_SIZE(16, 24), 0, 0, 9, 3},
{6, UPB_SIZE(3, 3), 0, 0, 8, 1},
+ {7, UPB_SIZE(4, 4), 0, 0, 8, 1},
};
const upb_msglayout envoy_extensions_filters_http_router_v3_Router_msginit = {
&envoy_extensions_filters_http_router_v3_Router_submsgs[0],
&envoy_extensions_filters_http_router_v3_Router__fields[0],
- UPB_SIZE(16, 32), 6, false, 255,
+ UPB_SIZE(24, 32), 7, false, 255,
};
#include "upb/port_undef.inc"
diff --git a/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h b/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h
index 2e7084ac97..7174b6c2b0 100644
--- a/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h
+++ b/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h
@@ -50,17 +50,18 @@ UPB_INLINE char *envoy_extensions_filters_http_router_v3_Router_serialize(const
}
UPB_INLINE bool envoy_extensions_filters_http_router_v3_Router_has_dynamic_stats(const envoy_extensions_filters_http_router_v3_Router *msg) { return _upb_hasbit(msg, 1); }
-UPB_INLINE const struct google_protobuf_BoolValue* envoy_extensions_filters_http_router_v3_Router_dynamic_stats(const envoy_extensions_filters_http_router_v3_Router *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), const struct google_protobuf_BoolValue*); }
+UPB_INLINE const struct google_protobuf_BoolValue* envoy_extensions_filters_http_router_v3_Router_dynamic_stats(const envoy_extensions_filters_http_router_v3_Router *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(8, 8), const struct google_protobuf_BoolValue*); }
UPB_INLINE bool envoy_extensions_filters_http_router_v3_Router_start_child_span(const envoy_extensions_filters_http_router_v3_Router *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(1, 1), bool); }
-UPB_INLINE bool envoy_extensions_filters_http_router_v3_Router_has_upstream_log(const envoy_extensions_filters_http_router_v3_Router *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(8, 16)); }
-UPB_INLINE const struct envoy_config_accesslog_v3_AccessLog* const* envoy_extensions_filters_http_router_v3_Router_upstream_log(const envoy_extensions_filters_http_router_v3_Router *msg, size_t *len) { return (const struct envoy_config_accesslog_v3_AccessLog* const*)_upb_array_accessor(msg, UPB_SIZE(8, 16), len); }
+UPB_INLINE bool envoy_extensions_filters_http_router_v3_Router_has_upstream_log(const envoy_extensions_filters_http_router_v3_Router *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(12, 16)); }
+UPB_INLINE const struct envoy_config_accesslog_v3_AccessLog* const* envoy_extensions_filters_http_router_v3_Router_upstream_log(const envoy_extensions_filters_http_router_v3_Router *msg, size_t *len) { return (const struct envoy_config_accesslog_v3_AccessLog* const*)_upb_array_accessor(msg, UPB_SIZE(12, 16), len); }
UPB_INLINE bool envoy_extensions_filters_http_router_v3_Router_suppress_envoy_headers(const envoy_extensions_filters_http_router_v3_Router *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(2, 2), bool); }
-UPB_INLINE upb_strview const* envoy_extensions_filters_http_router_v3_Router_strict_check_headers(const envoy_extensions_filters_http_router_v3_Router *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(12, 24), len); }
+UPB_INLINE upb_strview const* envoy_extensions_filters_http_router_v3_Router_strict_check_headers(const envoy_extensions_filters_http_router_v3_Router *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(16, 24), len); }
UPB_INLINE bool envoy_extensions_filters_http_router_v3_Router_respect_expected_rq_timeout(const envoy_extensions_filters_http_router_v3_Router *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(3, 3), bool); }
+UPB_INLINE bool envoy_extensions_filters_http_router_v3_Router_suppress_grpc_request_failure_code_stats(const envoy_extensions_filters_http_router_v3_Router *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 4), bool); }
UPB_INLINE void envoy_extensions_filters_http_router_v3_Router_set_dynamic_stats(envoy_extensions_filters_http_router_v3_Router *msg, struct google_protobuf_BoolValue* value) {
_upb_sethas(msg, 1);
- *UPB_PTR_AT(msg, UPB_SIZE(4, 8), struct google_protobuf_BoolValue*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(8, 8), struct google_protobuf_BoolValue*) = value;
}
UPB_INLINE struct google_protobuf_BoolValue* envoy_extensions_filters_http_router_v3_Router_mutable_dynamic_stats(envoy_extensions_filters_http_router_v3_Router *msg, upb_arena *arena) {
struct google_protobuf_BoolValue* sub = (struct google_protobuf_BoolValue*)envoy_extensions_filters_http_router_v3_Router_dynamic_stats(msg);
@@ -75,15 +76,15 @@ UPB_INLINE void envoy_extensions_filters_http_router_v3_Router_set_start_child_s
*UPB_PTR_AT(msg, UPB_SIZE(1, 1), bool) = value;
}
UPB_INLINE struct envoy_config_accesslog_v3_AccessLog** envoy_extensions_filters_http_router_v3_Router_mutable_upstream_log(envoy_extensions_filters_http_router_v3_Router *msg, size_t *len) {
- return (struct envoy_config_accesslog_v3_AccessLog**)_upb_array_mutable_accessor(msg, UPB_SIZE(8, 16), len);
+ return (struct envoy_config_accesslog_v3_AccessLog**)_upb_array_mutable_accessor(msg, UPB_SIZE(12, 16), len);
}
UPB_INLINE struct envoy_config_accesslog_v3_AccessLog** envoy_extensions_filters_http_router_v3_Router_resize_upstream_log(envoy_extensions_filters_http_router_v3_Router *msg, size_t len, upb_arena *arena) {
- return (struct envoy_config_accesslog_v3_AccessLog**)_upb_array_resize_accessor2(msg, UPB_SIZE(8, 16), len, UPB_SIZE(2, 3), arena);
+ return (struct envoy_config_accesslog_v3_AccessLog**)_upb_array_resize_accessor2(msg, UPB_SIZE(12, 16), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_config_accesslog_v3_AccessLog* envoy_extensions_filters_http_router_v3_Router_add_upstream_log(envoy_extensions_filters_http_router_v3_Router *msg, upb_arena *arena) {
struct envoy_config_accesslog_v3_AccessLog* sub = (struct envoy_config_accesslog_v3_AccessLog*)_upb_msg_new(&envoy_config_accesslog_v3_AccessLog_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(8, 16), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(12, 16), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
@@ -91,18 +92,21 @@ UPB_INLINE void envoy_extensions_filters_http_router_v3_Router_set_suppress_envo
*UPB_PTR_AT(msg, UPB_SIZE(2, 2), bool) = value;
}
UPB_INLINE upb_strview* envoy_extensions_filters_http_router_v3_Router_mutable_strict_check_headers(envoy_extensions_filters_http_router_v3_Router *msg, size_t *len) {
- return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(12, 24), len);
+ return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(16, 24), len);
}
UPB_INLINE upb_strview* envoy_extensions_filters_http_router_v3_Router_resize_strict_check_headers(envoy_extensions_filters_http_router_v3_Router *msg, size_t len, upb_arena *arena) {
- return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(12, 24), len, UPB_SIZE(3, 4), arena);
+ return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(16, 24), len, UPB_SIZE(3, 4), arena);
}
UPB_INLINE bool envoy_extensions_filters_http_router_v3_Router_add_strict_check_headers(envoy_extensions_filters_http_router_v3_Router *msg, upb_strview val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(12, 24), UPB_SIZE(3, 4), &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(16, 24), UPB_SIZE(3, 4), &val,
arena);
}
UPB_INLINE void envoy_extensions_filters_http_router_v3_Router_set_respect_expected_rq_timeout(envoy_extensions_filters_http_router_v3_Router *msg, bool value) {
*UPB_PTR_AT(msg, UPB_SIZE(3, 3), bool) = value;
}
+UPB_INLINE void envoy_extensions_filters_http_router_v3_Router_set_suppress_grpc_request_failure_code_stats(envoy_extensions_filters_http_router_v3_Router *msg, bool value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 4), bool) = value;
+}
#ifdef __cplusplus
} /* extern "C" */
diff --git a/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c b/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c
index 6b2b6c15bb..26db63b660 100644
--- a/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c
+++ b/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c
@@ -18,11 +18,13 @@
#include "envoy/config/route/v3/route.upb.h"
#include "envoy/config/route/v3/scoped_route.upb.h"
#include "envoy/config/trace/v3/http_tracer.upb.h"
+#include "envoy/type/http/v3/path_transformation.upb.h"
#include "envoy/type/tracing/v3/custom_tag.upb.h"
#include "envoy/type/v3/percent.upb.h"
#include "google/protobuf/any.upb.h"
#include "google/protobuf/duration.upb.h"
#include "google/protobuf/wrappers.upb.h"
+#include "envoy/annotations/deprecation.upb.h"
#include "udpa/annotations/migrate.upb.h"
#include "udpa/annotations/security.upb.h"
#include "udpa/annotations/status.upb.h"
@@ -31,13 +33,17 @@
#include "upb/port_def.inc"
-static const upb_msglayout *const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_submsgs[17] = {
+static const upb_msglayout *const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_submsgs[21] = {
&envoy_config_accesslog_v3_AccessLog_msginit,
&envoy_config_core_v3_Http1ProtocolOptions_msginit,
&envoy_config_core_v3_Http2ProtocolOptions_msginit,
+ &envoy_config_core_v3_Http3ProtocolOptions_msginit,
&envoy_config_core_v3_HttpProtocolOptions_msginit,
+ &envoy_config_core_v3_SchemeHeaderTransformation_msginit,
+ &envoy_config_core_v3_TypedExtensionConfig_msginit,
&envoy_config_route_v3_RouteConfiguration_msginit,
&envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_InternalAddressConfig_msginit,
+ &envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_msginit,
&envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_SetCurrentClientCertDetails_msginit,
&envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_Tracing_msginit,
&envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig_msginit,
@@ -51,53 +57,59 @@ static const upb_msglayout *const envoy_extensions_filters_network_http_connecti
&google_protobuf_UInt32Value_msginit,
};
-static const upb_msglayout_field envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager__fields[40] = {
+static const upb_msglayout_field envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager__fields[46] = {
{1, UPB_SIZE(4, 4), 0, 0, 14, 1},
- {2, UPB_SIZE(28, 32), 0, 0, 9, 1},
- {3, UPB_SIZE(140, 256), UPB_SIZE(-145, -265), 11, 11, 1},
- {4, UPB_SIZE(140, 256), UPB_SIZE(-145, -265), 4, 11, 1},
- {5, UPB_SIZE(128, 232), 0, 9, 11, 3},
- {6, UPB_SIZE(52, 80), 1, 14, 11, 1},
- {7, UPB_SIZE(56, 88), 2, 7, 11, 1},
- {8, UPB_SIZE(60, 96), 3, 1, 11, 1},
- {9, UPB_SIZE(64, 104), 4, 2, 11, 1},
- {10, UPB_SIZE(36, 48), 0, 0, 9, 1},
- {12, UPB_SIZE(68, 112), 5, 15, 11, 1},
- {13, UPB_SIZE(132, 240), 0, 0, 11, 3},
- {14, UPB_SIZE(72, 120), 6, 14, 11, 1},
- {15, UPB_SIZE(76, 128), 7, 14, 11, 1},
+ {2, UPB_SIZE(32, 32), 0, 0, 9, 1},
+ {3, UPB_SIZE(160, 288), UPB_SIZE(-165, -297), 15, 11, 1},
+ {4, UPB_SIZE(160, 288), UPB_SIZE(-165, -297), 7, 11, 1},
+ {5, UPB_SIZE(144, 256), 0, 13, 11, 3},
+ {6, UPB_SIZE(56, 80), 1, 18, 11, 1},
+ {7, UPB_SIZE(60, 88), 2, 11, 11, 1},
+ {8, UPB_SIZE(64, 96), 3, 1, 11, 1},
+ {9, UPB_SIZE(68, 104), 4, 2, 11, 1},
+ {10, UPB_SIZE(40, 48), 0, 0, 9, 1},
+ {12, UPB_SIZE(72, 112), 5, 19, 11, 1},
+ {13, UPB_SIZE(148, 264), 0, 0, 11, 3},
+ {14, UPB_SIZE(76, 120), 6, 18, 11, 1},
+ {15, UPB_SIZE(80, 128), 7, 18, 11, 1},
{16, UPB_SIZE(8, 8), 0, 0, 14, 1},
- {17, UPB_SIZE(80, 136), 8, 6, 11, 1},
- {18, UPB_SIZE(20, 20), 0, 0, 8, 1},
- {19, UPB_SIZE(16, 16), 0, 0, 13, 1},
- {20, UPB_SIZE(21, 21), 0, 0, 8, 1},
- {21, UPB_SIZE(22, 22), 0, 0, 8, 1},
- {22, UPB_SIZE(44, 64), 0, 0, 9, 1},
- {23, UPB_SIZE(136, 248), 0, 8, 11, 3},
- {24, UPB_SIZE(84, 144), 9, 15, 11, 1},
- {25, UPB_SIZE(88, 152), 10, 5, 11, 1},
- {26, UPB_SIZE(92, 160), 11, 15, 11, 1},
- {28, UPB_SIZE(96, 168), 12, 15, 11, 1},
- {29, UPB_SIZE(100, 176), 13, 16, 11, 1},
- {30, UPB_SIZE(104, 184), 14, 14, 11, 1},
- {31, UPB_SIZE(140, 256), UPB_SIZE(-145, -265), 13, 11, 1},
- {32, UPB_SIZE(23, 23), 0, 0, 8, 1},
- {33, UPB_SIZE(24, 24), 0, 0, 8, 1},
+ {17, UPB_SIZE(84, 136), 8, 10, 11, 1},
+ {18, UPB_SIZE(24, 24), 0, 0, 8, 1},
+ {19, UPB_SIZE(20, 20), 0, 0, 13, 1},
+ {20, UPB_SIZE(25, 25), 0, 0, 8, 1},
+ {21, UPB_SIZE(26, 26), 0, 0, 8, 1},
+ {22, UPB_SIZE(48, 64), 0, 0, 9, 1},
+ {23, UPB_SIZE(152, 272), 0, 12, 11, 3},
+ {24, UPB_SIZE(88, 144), 9, 19, 11, 1},
+ {25, UPB_SIZE(92, 152), 10, 8, 11, 1},
+ {26, UPB_SIZE(96, 160), 11, 19, 11, 1},
+ {28, UPB_SIZE(100, 168), 12, 19, 11, 1},
+ {29, UPB_SIZE(104, 176), 13, 20, 11, 1},
+ {30, UPB_SIZE(108, 184), 14, 18, 11, 1},
+ {31, UPB_SIZE(160, 288), UPB_SIZE(-165, -297), 17, 11, 1},
+ {32, UPB_SIZE(27, 27), 0, 0, 8, 1},
+ {33, UPB_SIZE(28, 28), 0, 0, 8, 1},
{34, UPB_SIZE(12, 12), 0, 0, 14, 1},
- {35, UPB_SIZE(108, 192), 15, 3, 11, 1},
- {36, UPB_SIZE(112, 200), 16, 12, 11, 1},
- {37, UPB_SIZE(25, 25), 0, 0, 8, 1},
- {38, UPB_SIZE(116, 208), 17, 10, 11, 1},
- {39, UPB_SIZE(26, 26), 0, 0, 8, 1},
- {40, UPB_SIZE(120, 216), 18, 14, 11, 1},
- {41, UPB_SIZE(124, 224), 19, 15, 11, 1},
- {42, UPB_SIZE(148, 268), UPB_SIZE(-153, -273), 0, 8, 1},
+ {35, UPB_SIZE(112, 192), 15, 4, 11, 1},
+ {36, UPB_SIZE(116, 200), 16, 16, 11, 1},
+ {37, UPB_SIZE(29, 29), 0, 0, 8, 1},
+ {38, UPB_SIZE(120, 208), 17, 14, 11, 1},
+ {39, UPB_SIZE(30, 30), 0, 0, 8, 1},
+ {40, UPB_SIZE(124, 216), 18, 18, 11, 1},
+ {41, UPB_SIZE(128, 224), 19, 19, 11, 1},
+ {42, UPB_SIZE(168, 300), UPB_SIZE(-173, -305), 0, 8, 1},
+ {43, UPB_SIZE(132, 232), 20, 9, 11, 1},
+ {44, UPB_SIZE(136, 240), 21, 3, 11, 1},
+ {45, UPB_SIZE(16, 16), 0, 0, 14, 1},
+ {46, UPB_SIZE(156, 280), 0, 6, 11, 3},
+ {47, UPB_SIZE(31, 31), 0, 0, 8, 1},
+ {48, UPB_SIZE(140, 248), 22, 5, 11, 1},
};
const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_msginit = {
&envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_submsgs[0],
&envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager__fields[0],
- UPB_SIZE(160, 288), 40, false, 255,
+ UPB_SIZE(176, 320), 46, false, 255,
};
static const upb_msglayout *const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_Tracing_submsgs[4] = {
@@ -168,6 +180,21 @@ const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_
UPB_SIZE(24, 48), 3, false, 255,
};
+static const upb_msglayout *const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_submsgs[1] = {
+ &envoy_type_http_v3_PathTransformation_msginit,
+};
+
+static const upb_msglayout_field envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions__fields[2] = {
+ {1, UPB_SIZE(4, 8), 1, 0, 11, 1},
+ {2, UPB_SIZE(8, 16), 2, 0, 11, 1},
+};
+
+const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_msginit = {
+ &envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_submsgs[0],
+ &envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions__fields[0],
+ UPB_SIZE(16, 24), 2, false, 255,
+};
+
static const upb_msglayout *const envoy_extensions_filters_network_http_connection_manager_v3_LocalReplyConfig_submsgs[2] = {
&envoy_config_core_v3_SubstitutionFormatString_msginit,
&envoy_extensions_filters_network_http_connection_manager_v3_ResponseMapper_msginit,
@@ -316,14 +343,15 @@ static const upb_msglayout *const envoy_extensions_filters_network_http_connecti
&envoy_config_core_v3_ConfigSource_msginit,
};
-static const upb_msglayout_field envoy_extensions_filters_network_http_connection_manager_v3_ScopedRds__fields[1] = {
- {1, UPB_SIZE(4, 8), 1, 0, 11, 1},
+static const upb_msglayout_field envoy_extensions_filters_network_http_connection_manager_v3_ScopedRds__fields[2] = {
+ {1, UPB_SIZE(12, 24), 1, 0, 11, 1},
+ {2, UPB_SIZE(4, 8), 0, 0, 9, 1},
};
const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_ScopedRds_msginit = {
&envoy_extensions_filters_network_http_connection_manager_v3_ScopedRds_submsgs[0],
&envoy_extensions_filters_network_http_connection_manager_v3_ScopedRds__fields[0],
- UPB_SIZE(8, 16), 1, false, 255,
+ UPB_SIZE(16, 32), 2, false, 255,
};
static const upb_msglayout *const envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter_submsgs[2] = {
@@ -358,5 +386,19 @@ const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_
UPB_SIZE(8, 16), 1, false, 255,
};
+static const upb_msglayout *const envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager_submsgs[1] = {
+ &envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_msginit,
+};
+
+static const upb_msglayout_field envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager__fields[1] = {
+ {1, UPB_SIZE(4, 8), 1, 0, 11, 1},
+};
+
+const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager_msginit = {
+ &envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager_submsgs[0],
+ &envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager__fields[0],
+ UPB_SIZE(8, 16), 1, false, 255,
+};
+
#include "upb/port_undef.inc"
diff --git a/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h b/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h
index 668fa85485..3695e2a2cd 100644
--- a/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h
+++ b/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h
@@ -25,6 +25,7 @@ struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectio
struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_InternalAddressConfig;
struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_SetCurrentClientCertDetails;
struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig;
+struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions;
struct envoy_extensions_filters_network_http_connection_manager_v3_LocalReplyConfig;
struct envoy_extensions_filters_network_http_connection_manager_v3_ResponseMapper;
struct envoy_extensions_filters_network_http_connection_manager_v3_Rds;
@@ -37,11 +38,13 @@ struct envoy_extensions_filters_network_http_connection_manager_v3_ScopedRoutes_
struct envoy_extensions_filters_network_http_connection_manager_v3_ScopedRds;
struct envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter;
struct envoy_extensions_filters_network_http_connection_manager_v3_RequestIDExtension;
+struct envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager;
typedef struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager;
typedef struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_Tracing envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_Tracing;
typedef struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_InternalAddressConfig envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_InternalAddressConfig;
typedef struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_SetCurrentClientCertDetails envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_SetCurrentClientCertDetails;
typedef struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig;
+typedef struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions;
typedef struct envoy_extensions_filters_network_http_connection_manager_v3_LocalReplyConfig envoy_extensions_filters_network_http_connection_manager_v3_LocalReplyConfig;
typedef struct envoy_extensions_filters_network_http_connection_manager_v3_ResponseMapper envoy_extensions_filters_network_http_connection_manager_v3_ResponseMapper;
typedef struct envoy_extensions_filters_network_http_connection_manager_v3_Rds envoy_extensions_filters_network_http_connection_manager_v3_Rds;
@@ -54,11 +57,13 @@ typedef struct envoy_extensions_filters_network_http_connection_manager_v3_Scope
typedef struct envoy_extensions_filters_network_http_connection_manager_v3_ScopedRds envoy_extensions_filters_network_http_connection_manager_v3_ScopedRds;
typedef struct envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter;
typedef struct envoy_extensions_filters_network_http_connection_manager_v3_RequestIDExtension envoy_extensions_filters_network_http_connection_manager_v3_RequestIDExtension;
+typedef struct envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager;
extern const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_msginit;
extern const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_Tracing_msginit;
extern const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_InternalAddressConfig_msginit;
extern const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_SetCurrentClientCertDetails_msginit;
extern const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig_msginit;
+extern const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_msginit;
extern const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_LocalReplyConfig_msginit;
extern const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_ResponseMapper_msginit;
extern const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_Rds_msginit;
@@ -71,6 +76,7 @@ extern const upb_msglayout envoy_extensions_filters_network_http_connection_mana
extern const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_ScopedRds_msginit;
extern const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter_msginit;
extern const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_RequestIDExtension_msginit;
+extern const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager_msginit;
struct envoy_config_accesslog_v3_AccessLog;
struct envoy_config_accesslog_v3_AccessLogFilter;
struct envoy_config_core_v3_ConfigSource;
@@ -79,11 +85,15 @@ struct envoy_config_core_v3_ExtensionConfigSource;
struct envoy_config_core_v3_HeaderValueOption;
struct envoy_config_core_v3_Http1ProtocolOptions;
struct envoy_config_core_v3_Http2ProtocolOptions;
+struct envoy_config_core_v3_Http3ProtocolOptions;
struct envoy_config_core_v3_HttpProtocolOptions;
+struct envoy_config_core_v3_SchemeHeaderTransformation;
struct envoy_config_core_v3_SubstitutionFormatString;
+struct envoy_config_core_v3_TypedExtensionConfig;
struct envoy_config_route_v3_RouteConfiguration;
struct envoy_config_route_v3_ScopedRouteConfiguration;
struct envoy_config_trace_v3_Tracing_Http;
+struct envoy_type_http_v3_PathTransformation;
struct envoy_type_tracing_v3_CustomTag;
struct envoy_type_v3_Percent;
struct google_protobuf_Any;
@@ -98,11 +108,15 @@ extern const upb_msglayout envoy_config_core_v3_ExtensionConfigSource_msginit;
extern const upb_msglayout envoy_config_core_v3_HeaderValueOption_msginit;
extern const upb_msglayout envoy_config_core_v3_Http1ProtocolOptions_msginit;
extern const upb_msglayout envoy_config_core_v3_Http2ProtocolOptions_msginit;
+extern const upb_msglayout envoy_config_core_v3_Http3ProtocolOptions_msginit;
extern const upb_msglayout envoy_config_core_v3_HttpProtocolOptions_msginit;
+extern const upb_msglayout envoy_config_core_v3_SchemeHeaderTransformation_msginit;
extern const upb_msglayout envoy_config_core_v3_SubstitutionFormatString_msginit;
+extern const upb_msglayout envoy_config_core_v3_TypedExtensionConfig_msginit;
extern const upb_msglayout envoy_config_route_v3_RouteConfiguration_msginit;
extern const upb_msglayout envoy_config_route_v3_ScopedRouteConfiguration_msginit;
extern const upb_msglayout envoy_config_trace_v3_Tracing_Http_msginit;
+extern const upb_msglayout envoy_type_http_v3_PathTransformation_msginit;
extern const upb_msglayout envoy_type_tracing_v3_CustomTag_msginit;
extern const upb_msglayout envoy_type_v3_Percent_msginit;
extern const upb_msglayout google_protobuf_Any_msginit;
@@ -126,6 +140,14 @@ typedef enum {
} envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_ForwardClientCertDetails;
typedef enum {
+ envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_IMPLEMENTATION_SPECIFIC_DEFAULT = 0,
+ envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_KEEP_UNCHANGED = 1,
+ envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_REJECT_REQUEST = 2,
+ envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UNESCAPE_AND_REDIRECT = 3,
+ envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UNESCAPE_AND_FORWARD = 4
+} envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathWithEscapedSlashesAction;
+
+typedef enum {
envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_OVERWRITE = 0,
envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_APPEND_IF_ABSENT = 1,
envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PASS_THROUGH = 2
@@ -163,89 +185,99 @@ typedef enum {
envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_specifier_scoped_routes = 31,
envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_specifier_NOT_SET = 0
} envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_specifier_oneofcases;
-UPB_INLINE envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_specifier_oneofcases envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_specifier_case(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager* msg) { return (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_specifier_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(144, 264), int32_t); }
+UPB_INLINE envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_specifier_oneofcases envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_specifier_case(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager* msg) { return (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_specifier_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(164, 296), int32_t); }
typedef enum {
envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_strip_port_mode_strip_any_host_port = 42,
envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_strip_port_mode_NOT_SET = 0
} envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_strip_port_mode_oneofcases;
-UPB_INLINE envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_strip_port_mode_oneofcases envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_strip_port_mode_case(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager* msg) { return (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_strip_port_mode_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(152, 272), int32_t); }
+UPB_INLINE envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_strip_port_mode_oneofcases envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_strip_port_mode_case(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager* msg) { return (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_strip_port_mode_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(172, 304), int32_t); }
UPB_INLINE int32_t envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_codec_type(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 4), int32_t); }
-UPB_INLINE upb_strview envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_stat_prefix(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(28, 32), upb_strview); }
-UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_rds(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_getoneofcase(msg, UPB_SIZE(144, 264)) == 3; }
-UPB_INLINE const envoy_extensions_filters_network_http_connection_manager_v3_Rds* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_rds(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return UPB_READ_ONEOF(msg, const envoy_extensions_filters_network_http_connection_manager_v3_Rds*, UPB_SIZE(140, 256), UPB_SIZE(144, 264), 3, NULL); }
-UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_route_config(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_getoneofcase(msg, UPB_SIZE(144, 264)) == 4; }
-UPB_INLINE const struct envoy_config_route_v3_RouteConfiguration* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_config(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return UPB_READ_ONEOF(msg, const struct envoy_config_route_v3_RouteConfiguration*, UPB_SIZE(140, 256), UPB_SIZE(144, 264), 4, NULL); }
-UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_http_filters(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(128, 232)); }
-UPB_INLINE const envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter* const* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_http_filters(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, size_t *len) { return (const envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter* const*)_upb_array_accessor(msg, UPB_SIZE(128, 232), len); }
+UPB_INLINE upb_strview envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_stat_prefix(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(32, 32), upb_strview); }
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_rds(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_getoneofcase(msg, UPB_SIZE(164, 296)) == 3; }
+UPB_INLINE const envoy_extensions_filters_network_http_connection_manager_v3_Rds* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_rds(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return UPB_READ_ONEOF(msg, const envoy_extensions_filters_network_http_connection_manager_v3_Rds*, UPB_SIZE(160, 288), UPB_SIZE(164, 296), 3, NULL); }
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_route_config(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_getoneofcase(msg, UPB_SIZE(164, 296)) == 4; }
+UPB_INLINE const struct envoy_config_route_v3_RouteConfiguration* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_config(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return UPB_READ_ONEOF(msg, const struct envoy_config_route_v3_RouteConfiguration*, UPB_SIZE(160, 288), UPB_SIZE(164, 296), 4, NULL); }
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_http_filters(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(144, 256)); }
+UPB_INLINE const envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter* const* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_http_filters(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, size_t *len) { return (const envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter* const*)_upb_array_accessor(msg, UPB_SIZE(144, 256), len); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_add_user_agent(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 1); }
-UPB_INLINE const struct google_protobuf_BoolValue* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_add_user_agent(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(52, 80), const struct google_protobuf_BoolValue*); }
+UPB_INLINE const struct google_protobuf_BoolValue* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_add_user_agent(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(56, 80), const struct google_protobuf_BoolValue*); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_tracing(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 2); }
-UPB_INLINE const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_Tracing* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_tracing(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(56, 88), const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_Tracing*); }
+UPB_INLINE const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_Tracing* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_tracing(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(60, 88), const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_Tracing*); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_http_protocol_options(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 3); }
-UPB_INLINE const struct envoy_config_core_v3_Http1ProtocolOptions* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_http_protocol_options(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(60, 96), const struct envoy_config_core_v3_Http1ProtocolOptions*); }
+UPB_INLINE const struct envoy_config_core_v3_Http1ProtocolOptions* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_http_protocol_options(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(64, 96), const struct envoy_config_core_v3_Http1ProtocolOptions*); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_http2_protocol_options(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 4); }
-UPB_INLINE const struct envoy_config_core_v3_Http2ProtocolOptions* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_http2_protocol_options(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(64, 104), const struct envoy_config_core_v3_Http2ProtocolOptions*); }
-UPB_INLINE upb_strview envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_server_name(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(36, 48), upb_strview); }
+UPB_INLINE const struct envoy_config_core_v3_Http2ProtocolOptions* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_http2_protocol_options(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(68, 104), const struct envoy_config_core_v3_Http2ProtocolOptions*); }
+UPB_INLINE upb_strview envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_server_name(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(40, 48), upb_strview); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_drain_timeout(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 5); }
-UPB_INLINE const struct google_protobuf_Duration* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_drain_timeout(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(68, 112), const struct google_protobuf_Duration*); }
-UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_access_log(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(132, 240)); }
-UPB_INLINE const struct envoy_config_accesslog_v3_AccessLog* const* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_access_log(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, size_t *len) { return (const struct envoy_config_accesslog_v3_AccessLog* const*)_upb_array_accessor(msg, UPB_SIZE(132, 240), len); }
+UPB_INLINE const struct google_protobuf_Duration* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_drain_timeout(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(72, 112), const struct google_protobuf_Duration*); }
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_access_log(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(148, 264)); }
+UPB_INLINE const struct envoy_config_accesslog_v3_AccessLog* const* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_access_log(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, size_t *len) { return (const struct envoy_config_accesslog_v3_AccessLog* const*)_upb_array_accessor(msg, UPB_SIZE(148, 264), len); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_use_remote_address(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 6); }
-UPB_INLINE const struct google_protobuf_BoolValue* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_use_remote_address(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(72, 120), const struct google_protobuf_BoolValue*); }
+UPB_INLINE const struct google_protobuf_BoolValue* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_use_remote_address(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(76, 120), const struct google_protobuf_BoolValue*); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_generate_request_id(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 7); }
-UPB_INLINE const struct google_protobuf_BoolValue* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_generate_request_id(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(76, 128), const struct google_protobuf_BoolValue*); }
+UPB_INLINE const struct google_protobuf_BoolValue* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_generate_request_id(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(80, 128), const struct google_protobuf_BoolValue*); }
UPB_INLINE int32_t envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_forward_client_cert_details(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(8, 8), int32_t); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_set_current_client_cert_details(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 8); }
-UPB_INLINE const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_SetCurrentClientCertDetails* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_current_client_cert_details(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(80, 136), const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_SetCurrentClientCertDetails*); }
-UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_proxy_100_continue(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(20, 20), bool); }
-UPB_INLINE uint32_t envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_xff_num_trusted_hops(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(16, 16), uint32_t); }
-UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_represent_ipv4_remote_address_as_ipv4_mapped_ipv6(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(21, 21), bool); }
-UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_skip_xff_append(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(22, 22), bool); }
-UPB_INLINE upb_strview envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_via(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(44, 64), upb_strview); }
-UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_upgrade_configs(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(136, 248)); }
-UPB_INLINE const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig* const* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_upgrade_configs(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, size_t *len) { return (const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig* const*)_upb_array_accessor(msg, UPB_SIZE(136, 248), len); }
+UPB_INLINE const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_SetCurrentClientCertDetails* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_current_client_cert_details(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(84, 136), const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_SetCurrentClientCertDetails*); }
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_proxy_100_continue(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(24, 24), bool); }
+UPB_INLINE uint32_t envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_xff_num_trusted_hops(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(20, 20), uint32_t); }
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_represent_ipv4_remote_address_as_ipv4_mapped_ipv6(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(25, 25), bool); }
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_skip_xff_append(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(26, 26), bool); }
+UPB_INLINE upb_strview envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_via(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(48, 64), upb_strview); }
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_upgrade_configs(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(152, 272)); }
+UPB_INLINE const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig* const* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_upgrade_configs(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, size_t *len) { return (const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig* const*)_upb_array_accessor(msg, UPB_SIZE(152, 272), len); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_stream_idle_timeout(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 9); }
-UPB_INLINE const struct google_protobuf_Duration* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_stream_idle_timeout(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(84, 144), const struct google_protobuf_Duration*); }
+UPB_INLINE const struct google_protobuf_Duration* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_stream_idle_timeout(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(88, 144), const struct google_protobuf_Duration*); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_internal_address_config(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 10); }
-UPB_INLINE const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_InternalAddressConfig* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_internal_address_config(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(88, 152), const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_InternalAddressConfig*); }
+UPB_INLINE const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_InternalAddressConfig* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_internal_address_config(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(92, 152), const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_InternalAddressConfig*); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_delayed_close_timeout(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 11); }
-UPB_INLINE const struct google_protobuf_Duration* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_delayed_close_timeout(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(92, 160), const struct google_protobuf_Duration*); }
+UPB_INLINE const struct google_protobuf_Duration* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_delayed_close_timeout(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(96, 160), const struct google_protobuf_Duration*); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_request_timeout(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 12); }
-UPB_INLINE const struct google_protobuf_Duration* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_request_timeout(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(96, 168), const struct google_protobuf_Duration*); }
+UPB_INLINE const struct google_protobuf_Duration* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_request_timeout(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(100, 168), const struct google_protobuf_Duration*); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_max_request_headers_kb(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 13); }
-UPB_INLINE const struct google_protobuf_UInt32Value* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_max_request_headers_kb(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(100, 176), const struct google_protobuf_UInt32Value*); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_max_request_headers_kb(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(104, 176), const struct google_protobuf_UInt32Value*); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_normalize_path(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 14); }
-UPB_INLINE const struct google_protobuf_BoolValue* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_normalize_path(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(104, 184), const struct google_protobuf_BoolValue*); }
-UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_scoped_routes(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_getoneofcase(msg, UPB_SIZE(144, 264)) == 31; }
-UPB_INLINE const envoy_extensions_filters_network_http_connection_manager_v3_ScopedRoutes* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_scoped_routes(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return UPB_READ_ONEOF(msg, const envoy_extensions_filters_network_http_connection_manager_v3_ScopedRoutes*, UPB_SIZE(140, 256), UPB_SIZE(144, 264), 31, NULL); }
-UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_preserve_external_request_id(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(23, 23), bool); }
-UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_merge_slashes(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(24, 24), bool); }
+UPB_INLINE const struct google_protobuf_BoolValue* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_normalize_path(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(108, 184), const struct google_protobuf_BoolValue*); }
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_scoped_routes(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_getoneofcase(msg, UPB_SIZE(164, 296)) == 31; }
+UPB_INLINE const envoy_extensions_filters_network_http_connection_manager_v3_ScopedRoutes* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_scoped_routes(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return UPB_READ_ONEOF(msg, const envoy_extensions_filters_network_http_connection_manager_v3_ScopedRoutes*, UPB_SIZE(160, 288), UPB_SIZE(164, 296), 31, NULL); }
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_preserve_external_request_id(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(27, 27), bool); }
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_merge_slashes(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(28, 28), bool); }
UPB_INLINE int32_t envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_server_header_transformation(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 12), int32_t); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_common_http_protocol_options(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 15); }
-UPB_INLINE const struct envoy_config_core_v3_HttpProtocolOptions* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_common_http_protocol_options(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(108, 192), const struct envoy_config_core_v3_HttpProtocolOptions*); }
+UPB_INLINE const struct envoy_config_core_v3_HttpProtocolOptions* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_common_http_protocol_options(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(112, 192), const struct envoy_config_core_v3_HttpProtocolOptions*); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_request_id_extension(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 16); }
-UPB_INLINE const envoy_extensions_filters_network_http_connection_manager_v3_RequestIDExtension* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_request_id_extension(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(112, 200), const envoy_extensions_filters_network_http_connection_manager_v3_RequestIDExtension*); }
-UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_always_set_request_id_in_response(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(25, 25), bool); }
+UPB_INLINE const envoy_extensions_filters_network_http_connection_manager_v3_RequestIDExtension* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_request_id_extension(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(116, 200), const envoy_extensions_filters_network_http_connection_manager_v3_RequestIDExtension*); }
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_always_set_request_id_in_response(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(29, 29), bool); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_local_reply_config(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 17); }
-UPB_INLINE const envoy_extensions_filters_network_http_connection_manager_v3_LocalReplyConfig* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_local_reply_config(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(116, 208), const envoy_extensions_filters_network_http_connection_manager_v3_LocalReplyConfig*); }
-UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_strip_matching_host_port(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(26, 26), bool); }
+UPB_INLINE const envoy_extensions_filters_network_http_connection_manager_v3_LocalReplyConfig* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_local_reply_config(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(120, 208), const envoy_extensions_filters_network_http_connection_manager_v3_LocalReplyConfig*); }
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_strip_matching_host_port(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(30, 30), bool); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_stream_error_on_invalid_http_message(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 18); }
-UPB_INLINE const struct google_protobuf_BoolValue* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_stream_error_on_invalid_http_message(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(120, 216), const struct google_protobuf_BoolValue*); }
+UPB_INLINE const struct google_protobuf_BoolValue* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_stream_error_on_invalid_http_message(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(124, 216), const struct google_protobuf_BoolValue*); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_request_headers_timeout(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 19); }
-UPB_INLINE const struct google_protobuf_Duration* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_request_headers_timeout(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(124, 224), const struct google_protobuf_Duration*); }
-UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_strip_any_host_port(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_getoneofcase(msg, UPB_SIZE(152, 272)) == 42; }
-UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_strip_any_host_port(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return UPB_READ_ONEOF(msg, bool, UPB_SIZE(148, 268), UPB_SIZE(152, 272), 42, false); }
+UPB_INLINE const struct google_protobuf_Duration* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_request_headers_timeout(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(128, 224), const struct google_protobuf_Duration*); }
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_strip_any_host_port(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_getoneofcase(msg, UPB_SIZE(172, 304)) == 42; }
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_strip_any_host_port(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return UPB_READ_ONEOF(msg, bool, UPB_SIZE(168, 300), UPB_SIZE(172, 304), 42, false); }
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_path_normalization_options(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 20); }
+UPB_INLINE const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_path_normalization_options(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(132, 232), const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions*); }
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_http3_protocol_options(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 21); }
+UPB_INLINE const struct envoy_config_core_v3_Http3ProtocolOptions* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_http3_protocol_options(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(136, 240), const struct envoy_config_core_v3_Http3ProtocolOptions*); }
+UPB_INLINE int32_t envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_path_with_escaped_slashes_action(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(16, 16), int32_t); }
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_original_ip_detection_extensions(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(156, 280)); }
+UPB_INLINE const struct envoy_config_core_v3_TypedExtensionConfig* const* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_original_ip_detection_extensions(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, size_t *len) { return (const struct envoy_config_core_v3_TypedExtensionConfig* const*)_upb_array_accessor(msg, UPB_SIZE(156, 280), len); }
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_strip_trailing_host_dot(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(31, 31), bool); }
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_scheme_header_transformation(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 22); }
+UPB_INLINE const struct envoy_config_core_v3_SchemeHeaderTransformation* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_scheme_header_transformation(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(140, 248), const struct envoy_config_core_v3_SchemeHeaderTransformation*); }
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_codec_type(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, int32_t value) {
*UPB_PTR_AT(msg, UPB_SIZE(4, 4), int32_t) = value;
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_stat_prefix(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_strview value) {
- *UPB_PTR_AT(msg, UPB_SIZE(28, 32), upb_strview) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(32, 32), upb_strview) = value;
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_rds(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, envoy_extensions_filters_network_http_connection_manager_v3_Rds* value) {
- UPB_WRITE_ONEOF(msg, envoy_extensions_filters_network_http_connection_manager_v3_Rds*, UPB_SIZE(140, 256), value, UPB_SIZE(144, 264), 3);
+ UPB_WRITE_ONEOF(msg, envoy_extensions_filters_network_http_connection_manager_v3_Rds*, UPB_SIZE(160, 288), value, UPB_SIZE(164, 296), 3);
}
UPB_INLINE struct envoy_extensions_filters_network_http_connection_manager_v3_Rds* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_rds(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct envoy_extensions_filters_network_http_connection_manager_v3_Rds* sub = (struct envoy_extensions_filters_network_http_connection_manager_v3_Rds*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_rds(msg);
@@ -257,7 +289,7 @@ UPB_INLINE struct envoy_extensions_filters_network_http_connection_manager_v3_Rd
return sub;
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_route_config(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, struct envoy_config_route_v3_RouteConfiguration* value) {
- UPB_WRITE_ONEOF(msg, struct envoy_config_route_v3_RouteConfiguration*, UPB_SIZE(140, 256), value, UPB_SIZE(144, 264), 4);
+ UPB_WRITE_ONEOF(msg, struct envoy_config_route_v3_RouteConfiguration*, UPB_SIZE(160, 288), value, UPB_SIZE(164, 296), 4);
}
UPB_INLINE struct envoy_config_route_v3_RouteConfiguration* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_route_config(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct envoy_config_route_v3_RouteConfiguration* sub = (struct envoy_config_route_v3_RouteConfiguration*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_config(msg);
@@ -269,21 +301,21 @@ UPB_INLINE struct envoy_config_route_v3_RouteConfiguration* envoy_extensions_fil
return sub;
}
UPB_INLINE envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter** envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_http_filters(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, size_t *len) {
- return (envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter**)_upb_array_mutable_accessor(msg, UPB_SIZE(128, 232), len);
+ return (envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter**)_upb_array_mutable_accessor(msg, UPB_SIZE(144, 256), len);
}
UPB_INLINE envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter** envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_resize_http_filters(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, size_t len, upb_arena *arena) {
- return (envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter**)_upb_array_resize_accessor2(msg, UPB_SIZE(128, 232), len, UPB_SIZE(2, 3), arena);
+ return (envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter**)_upb_array_resize_accessor2(msg, UPB_SIZE(144, 256), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_add_http_filters(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter* sub = (struct envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter*)_upb_msg_new(&envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(128, 232), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(144, 256), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_add_user_agent(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, struct google_protobuf_BoolValue* value) {
_upb_sethas(msg, 1);
- *UPB_PTR_AT(msg, UPB_SIZE(52, 80), struct google_protobuf_BoolValue*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(56, 80), struct google_protobuf_BoolValue*) = value;
}
UPB_INLINE struct google_protobuf_BoolValue* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_add_user_agent(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct google_protobuf_BoolValue* sub = (struct google_protobuf_BoolValue*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_add_user_agent(msg);
@@ -296,7 +328,7 @@ UPB_INLINE struct google_protobuf_BoolValue* envoy_extensions_filters_network_ht
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_tracing(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_Tracing* value) {
_upb_sethas(msg, 2);
- *UPB_PTR_AT(msg, UPB_SIZE(56, 88), envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_Tracing*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(60, 88), envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_Tracing*) = value;
}
UPB_INLINE struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_Tracing* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_tracing(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_Tracing* sub = (struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_Tracing*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_tracing(msg);
@@ -309,7 +341,7 @@ UPB_INLINE struct envoy_extensions_filters_network_http_connection_manager_v3_Ht
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_http_protocol_options(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, struct envoy_config_core_v3_Http1ProtocolOptions* value) {
_upb_sethas(msg, 3);
- *UPB_PTR_AT(msg, UPB_SIZE(60, 96), struct envoy_config_core_v3_Http1ProtocolOptions*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(64, 96), struct envoy_config_core_v3_Http1ProtocolOptions*) = value;
}
UPB_INLINE struct envoy_config_core_v3_Http1ProtocolOptions* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_http_protocol_options(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct envoy_config_core_v3_Http1ProtocolOptions* sub = (struct envoy_config_core_v3_Http1ProtocolOptions*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_http_protocol_options(msg);
@@ -322,7 +354,7 @@ UPB_INLINE struct envoy_config_core_v3_Http1ProtocolOptions* envoy_extensions_fi
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_http2_protocol_options(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, struct envoy_config_core_v3_Http2ProtocolOptions* value) {
_upb_sethas(msg, 4);
- *UPB_PTR_AT(msg, UPB_SIZE(64, 104), struct envoy_config_core_v3_Http2ProtocolOptions*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(68, 104), struct envoy_config_core_v3_Http2ProtocolOptions*) = value;
}
UPB_INLINE struct envoy_config_core_v3_Http2ProtocolOptions* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_http2_protocol_options(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct envoy_config_core_v3_Http2ProtocolOptions* sub = (struct envoy_config_core_v3_Http2ProtocolOptions*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_http2_protocol_options(msg);
@@ -334,11 +366,11 @@ UPB_INLINE struct envoy_config_core_v3_Http2ProtocolOptions* envoy_extensions_fi
return sub;
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_server_name(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_strview value) {
- *UPB_PTR_AT(msg, UPB_SIZE(36, 48), upb_strview) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(40, 48), upb_strview) = value;
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_drain_timeout(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, struct google_protobuf_Duration* value) {
_upb_sethas(msg, 5);
- *UPB_PTR_AT(msg, UPB_SIZE(68, 112), struct google_protobuf_Duration*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(72, 112), struct google_protobuf_Duration*) = value;
}
UPB_INLINE struct google_protobuf_Duration* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_drain_timeout(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_drain_timeout(msg);
@@ -350,21 +382,21 @@ UPB_INLINE struct google_protobuf_Duration* envoy_extensions_filters_network_htt
return sub;
}
UPB_INLINE struct envoy_config_accesslog_v3_AccessLog** envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_access_log(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, size_t *len) {
- return (struct envoy_config_accesslog_v3_AccessLog**)_upb_array_mutable_accessor(msg, UPB_SIZE(132, 240), len);
+ return (struct envoy_config_accesslog_v3_AccessLog**)_upb_array_mutable_accessor(msg, UPB_SIZE(148, 264), len);
}
UPB_INLINE struct envoy_config_accesslog_v3_AccessLog** envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_resize_access_log(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, size_t len, upb_arena *arena) {
- return (struct envoy_config_accesslog_v3_AccessLog**)_upb_array_resize_accessor2(msg, UPB_SIZE(132, 240), len, UPB_SIZE(2, 3), arena);
+ return (struct envoy_config_accesslog_v3_AccessLog**)_upb_array_resize_accessor2(msg, UPB_SIZE(148, 264), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_config_accesslog_v3_AccessLog* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_add_access_log(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct envoy_config_accesslog_v3_AccessLog* sub = (struct envoy_config_accesslog_v3_AccessLog*)_upb_msg_new(&envoy_config_accesslog_v3_AccessLog_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(132, 240), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(148, 264), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_use_remote_address(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, struct google_protobuf_BoolValue* value) {
_upb_sethas(msg, 6);
- *UPB_PTR_AT(msg, UPB_SIZE(72, 120), struct google_protobuf_BoolValue*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(76, 120), struct google_protobuf_BoolValue*) = value;
}
UPB_INLINE struct google_protobuf_BoolValue* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_use_remote_address(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct google_protobuf_BoolValue* sub = (struct google_protobuf_BoolValue*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_use_remote_address(msg);
@@ -377,7 +409,7 @@ UPB_INLINE struct google_protobuf_BoolValue* envoy_extensions_filters_network_ht
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_generate_request_id(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, struct google_protobuf_BoolValue* value) {
_upb_sethas(msg, 7);
- *UPB_PTR_AT(msg, UPB_SIZE(76, 128), struct google_protobuf_BoolValue*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(80, 128), struct google_protobuf_BoolValue*) = value;
}
UPB_INLINE struct google_protobuf_BoolValue* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_generate_request_id(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct google_protobuf_BoolValue* sub = (struct google_protobuf_BoolValue*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_generate_request_id(msg);
@@ -393,7 +425,7 @@ UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_Http
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_set_current_client_cert_details(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_SetCurrentClientCertDetails* value) {
_upb_sethas(msg, 8);
- *UPB_PTR_AT(msg, UPB_SIZE(80, 136), envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_SetCurrentClientCertDetails*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(84, 136), envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_SetCurrentClientCertDetails*) = value;
}
UPB_INLINE struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_SetCurrentClientCertDetails* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_set_current_client_cert_details(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_SetCurrentClientCertDetails* sub = (struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_SetCurrentClientCertDetails*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_current_client_cert_details(msg);
@@ -405,36 +437,36 @@ UPB_INLINE struct envoy_extensions_filters_network_http_connection_manager_v3_Ht
return sub;
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_proxy_100_continue(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, bool value) {
- *UPB_PTR_AT(msg, UPB_SIZE(20, 20), bool) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(24, 24), bool) = value;
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_xff_num_trusted_hops(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, uint32_t value) {
- *UPB_PTR_AT(msg, UPB_SIZE(16, 16), uint32_t) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(20, 20), uint32_t) = value;
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_represent_ipv4_remote_address_as_ipv4_mapped_ipv6(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, bool value) {
- *UPB_PTR_AT(msg, UPB_SIZE(21, 21), bool) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(25, 25), bool) = value;
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_skip_xff_append(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, bool value) {
- *UPB_PTR_AT(msg, UPB_SIZE(22, 22), bool) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(26, 26), bool) = value;
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_via(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_strview value) {
- *UPB_PTR_AT(msg, UPB_SIZE(44, 64), upb_strview) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(48, 64), upb_strview) = value;
}
UPB_INLINE envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig** envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_upgrade_configs(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, size_t *len) {
- return (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig**)_upb_array_mutable_accessor(msg, UPB_SIZE(136, 248), len);
+ return (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig**)_upb_array_mutable_accessor(msg, UPB_SIZE(152, 272), len);
}
UPB_INLINE envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig** envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_resize_upgrade_configs(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, size_t len, upb_arena *arena) {
- return (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig**)_upb_array_resize_accessor2(msg, UPB_SIZE(136, 248), len, UPB_SIZE(2, 3), arena);
+ return (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig**)_upb_array_resize_accessor2(msg, UPB_SIZE(152, 272), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_add_upgrade_configs(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig* sub = (struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig*)_upb_msg_new(&envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(136, 248), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(152, 272), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_stream_idle_timeout(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, struct google_protobuf_Duration* value) {
_upb_sethas(msg, 9);
- *UPB_PTR_AT(msg, UPB_SIZE(84, 144), struct google_protobuf_Duration*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(88, 144), struct google_protobuf_Duration*) = value;
}
UPB_INLINE struct google_protobuf_Duration* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_stream_idle_timeout(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_stream_idle_timeout(msg);
@@ -447,7 +479,7 @@ UPB_INLINE struct google_protobuf_Duration* envoy_extensions_filters_network_htt
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_internal_address_config(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_InternalAddressConfig* value) {
_upb_sethas(msg, 10);
- *UPB_PTR_AT(msg, UPB_SIZE(88, 152), envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_InternalAddressConfig*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(92, 152), envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_InternalAddressConfig*) = value;
}
UPB_INLINE struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_InternalAddressConfig* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_internal_address_config(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_InternalAddressConfig* sub = (struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_InternalAddressConfig*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_internal_address_config(msg);
@@ -460,7 +492,7 @@ UPB_INLINE struct envoy_extensions_filters_network_http_connection_manager_v3_Ht
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_delayed_close_timeout(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, struct google_protobuf_Duration* value) {
_upb_sethas(msg, 11);
- *UPB_PTR_AT(msg, UPB_SIZE(92, 160), struct google_protobuf_Duration*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(96, 160), struct google_protobuf_Duration*) = value;
}
UPB_INLINE struct google_protobuf_Duration* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_delayed_close_timeout(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_delayed_close_timeout(msg);
@@ -473,7 +505,7 @@ UPB_INLINE struct google_protobuf_Duration* envoy_extensions_filters_network_htt
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_request_timeout(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, struct google_protobuf_Duration* value) {
_upb_sethas(msg, 12);
- *UPB_PTR_AT(msg, UPB_SIZE(96, 168), struct google_protobuf_Duration*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(100, 168), struct google_protobuf_Duration*) = value;
}
UPB_INLINE struct google_protobuf_Duration* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_request_timeout(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_request_timeout(msg);
@@ -486,7 +518,7 @@ UPB_INLINE struct google_protobuf_Duration* envoy_extensions_filters_network_htt
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_max_request_headers_kb(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, struct google_protobuf_UInt32Value* value) {
_upb_sethas(msg, 13);
- *UPB_PTR_AT(msg, UPB_SIZE(100, 176), struct google_protobuf_UInt32Value*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(104, 176), struct google_protobuf_UInt32Value*) = value;
}
UPB_INLINE struct google_protobuf_UInt32Value* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_max_request_headers_kb(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_max_request_headers_kb(msg);
@@ -499,7 +531,7 @@ UPB_INLINE struct google_protobuf_UInt32Value* envoy_extensions_filters_network_
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_normalize_path(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, struct google_protobuf_BoolValue* value) {
_upb_sethas(msg, 14);
- *UPB_PTR_AT(msg, UPB_SIZE(104, 184), struct google_protobuf_BoolValue*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(108, 184), struct google_protobuf_BoolValue*) = value;
}
UPB_INLINE struct google_protobuf_BoolValue* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_normalize_path(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct google_protobuf_BoolValue* sub = (struct google_protobuf_BoolValue*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_normalize_path(msg);
@@ -511,7 +543,7 @@ UPB_INLINE struct google_protobuf_BoolValue* envoy_extensions_filters_network_ht
return sub;
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_scoped_routes(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, envoy_extensions_filters_network_http_connection_manager_v3_ScopedRoutes* value) {
- UPB_WRITE_ONEOF(msg, envoy_extensions_filters_network_http_connection_manager_v3_ScopedRoutes*, UPB_SIZE(140, 256), value, UPB_SIZE(144, 264), 31);
+ UPB_WRITE_ONEOF(msg, envoy_extensions_filters_network_http_connection_manager_v3_ScopedRoutes*, UPB_SIZE(160, 288), value, UPB_SIZE(164, 296), 31);
}
UPB_INLINE struct envoy_extensions_filters_network_http_connection_manager_v3_ScopedRoutes* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_scoped_routes(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct envoy_extensions_filters_network_http_connection_manager_v3_ScopedRoutes* sub = (struct envoy_extensions_filters_network_http_connection_manager_v3_ScopedRoutes*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_scoped_routes(msg);
@@ -523,17 +555,17 @@ UPB_INLINE struct envoy_extensions_filters_network_http_connection_manager_v3_Sc
return sub;
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_preserve_external_request_id(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, bool value) {
- *UPB_PTR_AT(msg, UPB_SIZE(23, 23), bool) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(27, 27), bool) = value;
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_merge_slashes(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, bool value) {
- *UPB_PTR_AT(msg, UPB_SIZE(24, 24), bool) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(28, 28), bool) = value;
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_server_header_transformation(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, int32_t value) {
*UPB_PTR_AT(msg, UPB_SIZE(12, 12), int32_t) = value;
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_common_http_protocol_options(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, struct envoy_config_core_v3_HttpProtocolOptions* value) {
_upb_sethas(msg, 15);
- *UPB_PTR_AT(msg, UPB_SIZE(108, 192), struct envoy_config_core_v3_HttpProtocolOptions*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(112, 192), struct envoy_config_core_v3_HttpProtocolOptions*) = value;
}
UPB_INLINE struct envoy_config_core_v3_HttpProtocolOptions* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_common_http_protocol_options(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct envoy_config_core_v3_HttpProtocolOptions* sub = (struct envoy_config_core_v3_HttpProtocolOptions*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_common_http_protocol_options(msg);
@@ -546,7 +578,7 @@ UPB_INLINE struct envoy_config_core_v3_HttpProtocolOptions* envoy_extensions_fil
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_request_id_extension(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, envoy_extensions_filters_network_http_connection_manager_v3_RequestIDExtension* value) {
_upb_sethas(msg, 16);
- *UPB_PTR_AT(msg, UPB_SIZE(112, 200), envoy_extensions_filters_network_http_connection_manager_v3_RequestIDExtension*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(116, 200), envoy_extensions_filters_network_http_connection_manager_v3_RequestIDExtension*) = value;
}
UPB_INLINE struct envoy_extensions_filters_network_http_connection_manager_v3_RequestIDExtension* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_request_id_extension(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct envoy_extensions_filters_network_http_connection_manager_v3_RequestIDExtension* sub = (struct envoy_extensions_filters_network_http_connection_manager_v3_RequestIDExtension*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_request_id_extension(msg);
@@ -558,11 +590,11 @@ UPB_INLINE struct envoy_extensions_filters_network_http_connection_manager_v3_Re
return sub;
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_always_set_request_id_in_response(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, bool value) {
- *UPB_PTR_AT(msg, UPB_SIZE(25, 25), bool) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(29, 29), bool) = value;
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_local_reply_config(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, envoy_extensions_filters_network_http_connection_manager_v3_LocalReplyConfig* value) {
_upb_sethas(msg, 17);
- *UPB_PTR_AT(msg, UPB_SIZE(116, 208), envoy_extensions_filters_network_http_connection_manager_v3_LocalReplyConfig*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(120, 208), envoy_extensions_filters_network_http_connection_manager_v3_LocalReplyConfig*) = value;
}
UPB_INLINE struct envoy_extensions_filters_network_http_connection_manager_v3_LocalReplyConfig* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_local_reply_config(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct envoy_extensions_filters_network_http_connection_manager_v3_LocalReplyConfig* sub = (struct envoy_extensions_filters_network_http_connection_manager_v3_LocalReplyConfig*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_local_reply_config(msg);
@@ -574,11 +606,11 @@ UPB_INLINE struct envoy_extensions_filters_network_http_connection_manager_v3_Lo
return sub;
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_strip_matching_host_port(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, bool value) {
- *UPB_PTR_AT(msg, UPB_SIZE(26, 26), bool) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(30, 30), bool) = value;
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_stream_error_on_invalid_http_message(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, struct google_protobuf_BoolValue* value) {
_upb_sethas(msg, 18);
- *UPB_PTR_AT(msg, UPB_SIZE(120, 216), struct google_protobuf_BoolValue*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(124, 216), struct google_protobuf_BoolValue*) = value;
}
UPB_INLINE struct google_protobuf_BoolValue* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_stream_error_on_invalid_http_message(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct google_protobuf_BoolValue* sub = (struct google_protobuf_BoolValue*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_stream_error_on_invalid_http_message(msg);
@@ -591,7 +623,7 @@ UPB_INLINE struct google_protobuf_BoolValue* envoy_extensions_filters_network_ht
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_request_headers_timeout(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, struct google_protobuf_Duration* value) {
_upb_sethas(msg, 19);
- *UPB_PTR_AT(msg, UPB_SIZE(124, 224), struct google_protobuf_Duration*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(128, 224), struct google_protobuf_Duration*) = value;
}
UPB_INLINE struct google_protobuf_Duration* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_request_headers_timeout(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_request_headers_timeout(msg);
@@ -603,7 +635,65 @@ UPB_INLINE struct google_protobuf_Duration* envoy_extensions_filters_network_htt
return sub;
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_strip_any_host_port(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, bool value) {
- UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(148, 268), value, UPB_SIZE(152, 272), 42);
+ UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(168, 300), value, UPB_SIZE(172, 304), 42);
+}
+UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_path_normalization_options(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions* value) {
+ _upb_sethas(msg, 20);
+ *UPB_PTR_AT(msg, UPB_SIZE(132, 232), envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions*) = value;
+}
+UPB_INLINE struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_path_normalization_options(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
+ struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions* sub = (struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_path_normalization_options(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions*)_upb_msg_new(&envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_msginit, arena);
+ if (!sub) return NULL;
+ envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_path_normalization_options(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_http3_protocol_options(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, struct envoy_config_core_v3_Http3ProtocolOptions* value) {
+ _upb_sethas(msg, 21);
+ *UPB_PTR_AT(msg, UPB_SIZE(136, 240), struct envoy_config_core_v3_Http3ProtocolOptions*) = value;
+}
+UPB_INLINE struct envoy_config_core_v3_Http3ProtocolOptions* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_http3_protocol_options(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
+ struct envoy_config_core_v3_Http3ProtocolOptions* sub = (struct envoy_config_core_v3_Http3ProtocolOptions*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_http3_protocol_options(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_config_core_v3_Http3ProtocolOptions*)_upb_msg_new(&envoy_config_core_v3_Http3ProtocolOptions_msginit, arena);
+ if (!sub) return NULL;
+ envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_http3_protocol_options(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_path_with_escaped_slashes_action(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, int32_t value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(16, 16), int32_t) = value;
+}
+UPB_INLINE struct envoy_config_core_v3_TypedExtensionConfig** envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_original_ip_detection_extensions(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, size_t *len) {
+ return (struct envoy_config_core_v3_TypedExtensionConfig**)_upb_array_mutable_accessor(msg, UPB_SIZE(156, 280), len);
+}
+UPB_INLINE struct envoy_config_core_v3_TypedExtensionConfig** envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_resize_original_ip_detection_extensions(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, size_t len, upb_arena *arena) {
+ return (struct envoy_config_core_v3_TypedExtensionConfig**)_upb_array_resize_accessor2(msg, UPB_SIZE(156, 280), len, UPB_SIZE(2, 3), arena);
+}
+UPB_INLINE struct envoy_config_core_v3_TypedExtensionConfig* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_add_original_ip_detection_extensions(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
+ struct envoy_config_core_v3_TypedExtensionConfig* sub = (struct envoy_config_core_v3_TypedExtensionConfig*)_upb_msg_new(&envoy_config_core_v3_TypedExtensionConfig_msginit, arena);
+ bool ok = _upb_array_append_accessor2(
+ msg, UPB_SIZE(156, 280), UPB_SIZE(2, 3), &sub, arena);
+ if (!ok) return NULL;
+ return sub;
+}
+UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_strip_trailing_host_dot(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, bool value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(31, 31), bool) = value;
+}
+UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_scheme_header_transformation(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, struct envoy_config_core_v3_SchemeHeaderTransformation* value) {
+ _upb_sethas(msg, 22);
+ *UPB_PTR_AT(msg, UPB_SIZE(140, 248), struct envoy_config_core_v3_SchemeHeaderTransformation*) = value;
+}
+UPB_INLINE struct envoy_config_core_v3_SchemeHeaderTransformation* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_scheme_header_transformation(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
+ struct envoy_config_core_v3_SchemeHeaderTransformation* sub = (struct envoy_config_core_v3_SchemeHeaderTransformation*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_scheme_header_transformation(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_config_core_v3_SchemeHeaderTransformation*)_upb_msg_new(&envoy_config_core_v3_SchemeHeaderTransformation_msginit, arena);
+ if (!sub) return NULL;
+ envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_scheme_header_transformation(msg, sub);
+ }
+ return sub;
}
/* envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.Tracing */
@@ -857,6 +947,58 @@ UPB_INLINE struct google_protobuf_BoolValue* envoy_extensions_filters_network_ht
return sub;
}
+/* envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.PathNormalizationOptions */
+
+UPB_INLINE envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions *envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_new(upb_arena *arena) {
+ return (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions *)_upb_msg_new(&envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_msginit, arena);
+}
+UPB_INLINE envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions *envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions *ret = envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_new(arena);
+ return (ret && upb_decode(buf, size, ret, &envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions *envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions *ret = envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_serialize(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_msginit, arena, len);
+}
+
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_has_forwarding_transformation(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions *msg) { return _upb_hasbit(msg, 1); }
+UPB_INLINE const struct envoy_type_http_v3_PathTransformation* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_forwarding_transformation(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), const struct envoy_type_http_v3_PathTransformation*); }
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_has_http_filter_transformation(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions *msg) { return _upb_hasbit(msg, 2); }
+UPB_INLINE const struct envoy_type_http_v3_PathTransformation* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_http_filter_transformation(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(8, 16), const struct envoy_type_http_v3_PathTransformation*); }
+
+UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_set_forwarding_transformation(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions *msg, struct envoy_type_http_v3_PathTransformation* value) {
+ _upb_sethas(msg, 1);
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 8), struct envoy_type_http_v3_PathTransformation*) = value;
+}
+UPB_INLINE struct envoy_type_http_v3_PathTransformation* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_mutable_forwarding_transformation(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions *msg, upb_arena *arena) {
+ struct envoy_type_http_v3_PathTransformation* sub = (struct envoy_type_http_v3_PathTransformation*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_forwarding_transformation(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_type_http_v3_PathTransformation*)_upb_msg_new(&envoy_type_http_v3_PathTransformation_msginit, arena);
+ if (!sub) return NULL;
+ envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_set_forwarding_transformation(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_set_http_filter_transformation(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions *msg, struct envoy_type_http_v3_PathTransformation* value) {
+ _upb_sethas(msg, 2);
+ *UPB_PTR_AT(msg, UPB_SIZE(8, 16), struct envoy_type_http_v3_PathTransformation*) = value;
+}
+UPB_INLINE struct envoy_type_http_v3_PathTransformation* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_mutable_http_filter_transformation(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions *msg, upb_arena *arena) {
+ struct envoy_type_http_v3_PathTransformation* sub = (struct envoy_type_http_v3_PathTransformation*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_http_filter_transformation(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_type_http_v3_PathTransformation*)_upb_msg_new(&envoy_type_http_v3_PathTransformation_msginit, arena);
+ if (!sub) return NULL;
+ envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_set_http_filter_transformation(msg, sub);
+ }
+ return sub;
+}
+
/* envoy.extensions.filters.network.http_connection_manager.v3.LocalReplyConfig */
UPB_INLINE envoy_extensions_filters_network_http_connection_manager_v3_LocalReplyConfig *envoy_extensions_filters_network_http_connection_manager_v3_LocalReplyConfig_new(upb_arena *arena) {
@@ -1361,11 +1503,12 @@ UPB_INLINE char *envoy_extensions_filters_network_http_connection_manager_v3_Sco
}
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_ScopedRds_has_scoped_rds_config_source(const envoy_extensions_filters_network_http_connection_manager_v3_ScopedRds *msg) { return _upb_hasbit(msg, 1); }
-UPB_INLINE const struct envoy_config_core_v3_ConfigSource* envoy_extensions_filters_network_http_connection_manager_v3_ScopedRds_scoped_rds_config_source(const envoy_extensions_filters_network_http_connection_manager_v3_ScopedRds *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), const struct envoy_config_core_v3_ConfigSource*); }
+UPB_INLINE const struct envoy_config_core_v3_ConfigSource* envoy_extensions_filters_network_http_connection_manager_v3_ScopedRds_scoped_rds_config_source(const envoy_extensions_filters_network_http_connection_manager_v3_ScopedRds *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 24), const struct envoy_config_core_v3_ConfigSource*); }
+UPB_INLINE upb_strview envoy_extensions_filters_network_http_connection_manager_v3_ScopedRds_srds_resources_locator(const envoy_extensions_filters_network_http_connection_manager_v3_ScopedRds *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview); }
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_ScopedRds_set_scoped_rds_config_source(envoy_extensions_filters_network_http_connection_manager_v3_ScopedRds *msg, struct envoy_config_core_v3_ConfigSource* value) {
_upb_sethas(msg, 1);
- *UPB_PTR_AT(msg, UPB_SIZE(4, 8), struct envoy_config_core_v3_ConfigSource*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(12, 24), struct envoy_config_core_v3_ConfigSource*) = value;
}
UPB_INLINE struct envoy_config_core_v3_ConfigSource* envoy_extensions_filters_network_http_connection_manager_v3_ScopedRds_mutable_scoped_rds_config_source(envoy_extensions_filters_network_http_connection_manager_v3_ScopedRds *msg, upb_arena *arena) {
struct envoy_config_core_v3_ConfigSource* sub = (struct envoy_config_core_v3_ConfigSource*)envoy_extensions_filters_network_http_connection_manager_v3_ScopedRds_scoped_rds_config_source(msg);
@@ -1376,6 +1519,9 @@ UPB_INLINE struct envoy_config_core_v3_ConfigSource* envoy_extensions_filters_ne
}
return sub;
}
+UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_ScopedRds_set_srds_resources_locator(envoy_extensions_filters_network_http_connection_manager_v3_ScopedRds *msg, upb_strview value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview) = value;
+}
/* envoy.extensions.filters.network.http_connection_manager.v3.HttpFilter */
@@ -1479,6 +1625,43 @@ UPB_INLINE struct google_protobuf_Any* envoy_extensions_filters_network_http_con
return sub;
}
+/* envoy.extensions.filters.network.http_connection_manager.v3.EnvoyMobileHttpConnectionManager */
+
+UPB_INLINE envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager *envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager_new(upb_arena *arena) {
+ return (envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager *)_upb_msg_new(&envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager_msginit, arena);
+}
+UPB_INLINE envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager *envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager *ret = envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager_new(arena);
+ return (ret && upb_decode(buf, size, ret, &envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager *envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager *ret = envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager_serialize(const envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager_msginit, arena, len);
+}
+
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager_has_config(const envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager *msg) { return _upb_hasbit(msg, 1); }
+UPB_INLINE const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager* envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager_config(const envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager*); }
+
+UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager_set_config(envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager *msg, envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager* value) {
+ _upb_sethas(msg, 1);
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 8), envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager*) = value;
+}
+UPB_INLINE struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager* envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager_mutable_config(envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager *msg, upb_arena *arena) {
+ struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager* sub = (struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager*)envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager_config(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager*)_upb_msg_new(&envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_msginit, arena);
+ if (!sub) return NULL;
+ envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager_set_config(msg, sub);
+ }
+ return sub;
+}
+
#ifdef __cplusplus
} /* extern "C" */
#endif
diff --git a/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c b/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c
index 247f262ea0..6bd4e8d781 100644
--- a/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c
+++ b/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c
@@ -10,6 +10,7 @@
#include "upb/msg.h"
#include "envoy/extensions/transport_sockets/tls/v3/common.upb.h"
#include "envoy/config/core/v3/base.upb.h"
+#include "envoy/config/core/v3/extension.upb.h"
#include "envoy/type/matcher/v3/string.upb.h"
#include "google/protobuf/any.upb.h"
#include "google/protobuf/wrappers.upb.h"
@@ -84,29 +85,31 @@ const upb_msglayout envoy_extensions_transport_sockets_tls_v3_TlsSessionTicketKe
UPB_SIZE(8, 8), 1, false, 255,
};
-static const upb_msglayout *const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_submsgs[4] = {
+static const upb_msglayout *const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_submsgs[5] = {
&envoy_config_core_v3_DataSource_msginit,
+ &envoy_config_core_v3_TypedExtensionConfig_msginit,
&envoy_config_core_v3_WatchedDirectory_msginit,
&envoy_type_matcher_v3_StringMatcher_msginit,
&google_protobuf_BoolValue_msginit,
};
-static const upb_msglayout_field envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext__fields[9] = {
+static const upb_msglayout_field envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext__fields[10] = {
{1, UPB_SIZE(12, 16), 1, 0, 11, 1},
- {2, UPB_SIZE(28, 48), 0, 0, 9, 3},
- {3, UPB_SIZE(32, 56), 0, 0, 9, 3},
- {6, UPB_SIZE(16, 24), 2, 3, 11, 1},
+ {2, UPB_SIZE(32, 56), 0, 0, 9, 3},
+ {3, UPB_SIZE(36, 64), 0, 0, 9, 3},
+ {6, UPB_SIZE(16, 24), 2, 4, 11, 1},
{7, UPB_SIZE(20, 32), 3, 0, 11, 1},
{8, UPB_SIZE(8, 8), 0, 0, 8, 1},
- {9, UPB_SIZE(36, 64), 0, 2, 11, 3},
+ {9, UPB_SIZE(40, 72), 0, 3, 11, 3},
{10, UPB_SIZE(4, 4), 0, 0, 14, 1},
- {11, UPB_SIZE(24, 40), 4, 1, 11, 1},
+ {11, UPB_SIZE(24, 40), 4, 2, 11, 1},
+ {12, UPB_SIZE(28, 48), 5, 1, 11, 1},
};
const upb_msglayout envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_msginit = {
&envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_submsgs[0],
&envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext__fields[0],
- UPB_SIZE(40, 72), 9, false, 255,
+ UPB_SIZE(48, 80), 10, false, 255,
};
#include "upb/port_undef.inc"
diff --git a/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h b/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h
index 73b534aa25..e85f14b341 100644
--- a/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h
+++ b/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h
@@ -36,11 +36,13 @@ extern const upb_msglayout envoy_extensions_transport_sockets_tls_v3_TlsCertific
extern const upb_msglayout envoy_extensions_transport_sockets_tls_v3_TlsSessionTicketKeys_msginit;
extern const upb_msglayout envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_msginit;
struct envoy_config_core_v3_DataSource;
+struct envoy_config_core_v3_TypedExtensionConfig;
struct envoy_config_core_v3_WatchedDirectory;
struct envoy_type_matcher_v3_StringMatcher;
struct google_protobuf_Any;
struct google_protobuf_BoolValue;
extern const upb_msglayout envoy_config_core_v3_DataSource_msginit;
+extern const upb_msglayout envoy_config_core_v3_TypedExtensionConfig_msginit;
extern const upb_msglayout envoy_config_core_v3_WatchedDirectory_msginit;
extern const upb_msglayout envoy_type_matcher_v3_StringMatcher_msginit;
extern const upb_msglayout google_protobuf_Any_msginit;
@@ -344,18 +346,20 @@ UPB_INLINE char *envoy_extensions_transport_sockets_tls_v3_CertificateValidation
UPB_INLINE bool envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_has_trusted_ca(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg) { return _upb_hasbit(msg, 1); }
UPB_INLINE const struct envoy_config_core_v3_DataSource* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_trusted_ca(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 16), const struct envoy_config_core_v3_DataSource*); }
-UPB_INLINE upb_strview const* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_verify_certificate_hash(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(28, 48), len); }
-UPB_INLINE upb_strview const* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_verify_certificate_spki(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(32, 56), len); }
+UPB_INLINE upb_strview const* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_verify_certificate_hash(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(32, 56), len); }
+UPB_INLINE upb_strview const* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_verify_certificate_spki(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(36, 64), len); }
UPB_INLINE bool envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_has_require_signed_certificate_timestamp(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg) { return _upb_hasbit(msg, 2); }
UPB_INLINE const struct google_protobuf_BoolValue* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_require_signed_certificate_timestamp(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(16, 24), const struct google_protobuf_BoolValue*); }
UPB_INLINE bool envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_has_crl(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg) { return _upb_hasbit(msg, 3); }
UPB_INLINE const struct envoy_config_core_v3_DataSource* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_crl(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(20, 32), const struct envoy_config_core_v3_DataSource*); }
UPB_INLINE bool envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_allow_expired_certificate(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(8, 8), bool); }
-UPB_INLINE bool envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_has_match_subject_alt_names(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(36, 64)); }
-UPB_INLINE const struct envoy_type_matcher_v3_StringMatcher* const* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_match_subject_alt_names(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, size_t *len) { return (const struct envoy_type_matcher_v3_StringMatcher* const*)_upb_array_accessor(msg, UPB_SIZE(36, 64), len); }
+UPB_INLINE bool envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_has_match_subject_alt_names(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(40, 72)); }
+UPB_INLINE const struct envoy_type_matcher_v3_StringMatcher* const* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_match_subject_alt_names(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, size_t *len) { return (const struct envoy_type_matcher_v3_StringMatcher* const*)_upb_array_accessor(msg, UPB_SIZE(40, 72), len); }
UPB_INLINE int32_t envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_trust_chain_verification(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 4), int32_t); }
UPB_INLINE bool envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_has_watched_directory(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg) { return _upb_hasbit(msg, 4); }
UPB_INLINE const struct envoy_config_core_v3_WatchedDirectory* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_watched_directory(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(24, 40), const struct envoy_config_core_v3_WatchedDirectory*); }
+UPB_INLINE bool envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_has_custom_validator_config(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg) { return _upb_hasbit(msg, 5); }
+UPB_INLINE const struct envoy_config_core_v3_TypedExtensionConfig* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_custom_validator_config(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(28, 48), const struct envoy_config_core_v3_TypedExtensionConfig*); }
UPB_INLINE void envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_set_trusted_ca(envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, struct envoy_config_core_v3_DataSource* value) {
_upb_sethas(msg, 1);
@@ -371,23 +375,23 @@ UPB_INLINE struct envoy_config_core_v3_DataSource* envoy_extensions_transport_so
return sub;
}
UPB_INLINE upb_strview* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_mutable_verify_certificate_hash(envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, size_t *len) {
- return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(28, 48), len);
+ return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(32, 56), len);
}
UPB_INLINE upb_strview* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_resize_verify_certificate_hash(envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, size_t len, upb_arena *arena) {
- return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(28, 48), len, UPB_SIZE(3, 4), arena);
+ return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(32, 56), len, UPB_SIZE(3, 4), arena);
}
UPB_INLINE bool envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_add_verify_certificate_hash(envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, upb_strview val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(28, 48), UPB_SIZE(3, 4), &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(32, 56), UPB_SIZE(3, 4), &val,
arena);
}
UPB_INLINE upb_strview* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_mutable_verify_certificate_spki(envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, size_t *len) {
- return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(32, 56), len);
+ return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(36, 64), len);
}
UPB_INLINE upb_strview* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_resize_verify_certificate_spki(envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, size_t len, upb_arena *arena) {
- return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(32, 56), len, UPB_SIZE(3, 4), arena);
+ return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(36, 64), len, UPB_SIZE(3, 4), arena);
}
UPB_INLINE bool envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_add_verify_certificate_spki(envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, upb_strview val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(32, 56), UPB_SIZE(3, 4), &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(36, 64), UPB_SIZE(3, 4), &val,
arena);
}
UPB_INLINE void envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_set_require_signed_certificate_timestamp(envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, struct google_protobuf_BoolValue* value) {
@@ -420,15 +424,15 @@ UPB_INLINE void envoy_extensions_transport_sockets_tls_v3_CertificateValidationC
*UPB_PTR_AT(msg, UPB_SIZE(8, 8), bool) = value;
}
UPB_INLINE struct envoy_type_matcher_v3_StringMatcher** envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_mutable_match_subject_alt_names(envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, size_t *len) {
- return (struct envoy_type_matcher_v3_StringMatcher**)_upb_array_mutable_accessor(msg, UPB_SIZE(36, 64), len);
+ return (struct envoy_type_matcher_v3_StringMatcher**)_upb_array_mutable_accessor(msg, UPB_SIZE(40, 72), len);
}
UPB_INLINE struct envoy_type_matcher_v3_StringMatcher** envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_resize_match_subject_alt_names(envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, size_t len, upb_arena *arena) {
- return (struct envoy_type_matcher_v3_StringMatcher**)_upb_array_resize_accessor2(msg, UPB_SIZE(36, 64), len, UPB_SIZE(2, 3), arena);
+ return (struct envoy_type_matcher_v3_StringMatcher**)_upb_array_resize_accessor2(msg, UPB_SIZE(40, 72), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_type_matcher_v3_StringMatcher* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_add_match_subject_alt_names(envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, upb_arena *arena) {
struct envoy_type_matcher_v3_StringMatcher* sub = (struct envoy_type_matcher_v3_StringMatcher*)_upb_msg_new(&envoy_type_matcher_v3_StringMatcher_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(36, 64), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(40, 72), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
@@ -448,6 +452,19 @@ UPB_INLINE struct envoy_config_core_v3_WatchedDirectory* envoy_extensions_transp
}
return sub;
}
+UPB_INLINE void envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_set_custom_validator_config(envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, struct envoy_config_core_v3_TypedExtensionConfig* value) {
+ _upb_sethas(msg, 5);
+ *UPB_PTR_AT(msg, UPB_SIZE(28, 48), struct envoy_config_core_v3_TypedExtensionConfig*) = value;
+}
+UPB_INLINE struct envoy_config_core_v3_TypedExtensionConfig* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_mutable_custom_validator_config(envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, upb_arena *arena) {
+ struct envoy_config_core_v3_TypedExtensionConfig* sub = (struct envoy_config_core_v3_TypedExtensionConfig*)envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_custom_validator_config(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_config_core_v3_TypedExtensionConfig*)_upb_msg_new(&envoy_config_core_v3_TypedExtensionConfig_msginit, arena);
+ if (!sub) return NULL;
+ envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_set_custom_validator_config(msg, sub);
+ }
+ return sub;
+}
#ifdef __cplusplus
} /* extern "C" */
diff --git a/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c b/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c
index 40e086cba5..fa36211f0b 100644
--- a/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c
+++ b/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c
@@ -13,7 +13,9 @@
#include "envoy/config/core/v3/base.upb.h"
#include "envoy/type/matcher/v3/node.upb.h"
#include "google/api/annotations.upb.h"
-#include "udpa/annotations/migrate.upb.h"
+#include "google/protobuf/any.upb.h"
+#include "google/protobuf/timestamp.upb.h"
+#include "envoy/annotations/deprecation.upb.h"
#include "udpa/annotations/status.upb.h"
#include "udpa/annotations/versioning.upb.h"
@@ -59,20 +61,46 @@ const upb_msglayout envoy_service_status_v3_PerXdsConfig_msginit = {
UPB_SIZE(16, 24), 7, false, 255,
};
-static const upb_msglayout *const envoy_service_status_v3_ClientConfig_submsgs[2] = {
+static const upb_msglayout *const envoy_service_status_v3_ClientConfig_submsgs[3] = {
&envoy_config_core_v3_Node_msginit,
+ &envoy_service_status_v3_ClientConfig_GenericXdsConfig_msginit,
&envoy_service_status_v3_PerXdsConfig_msginit,
};
-static const upb_msglayout_field envoy_service_status_v3_ClientConfig__fields[2] = {
+static const upb_msglayout_field envoy_service_status_v3_ClientConfig__fields[3] = {
{1, UPB_SIZE(4, 8), 1, 0, 11, 1},
- {2, UPB_SIZE(8, 16), 0, 1, 11, 3},
+ {2, UPB_SIZE(8, 16), 0, 2, 11, 3},
+ {3, UPB_SIZE(12, 24), 0, 1, 11, 3},
};
const upb_msglayout envoy_service_status_v3_ClientConfig_msginit = {
&envoy_service_status_v3_ClientConfig_submsgs[0],
&envoy_service_status_v3_ClientConfig__fields[0],
- UPB_SIZE(16, 24), 2, false, 255,
+ UPB_SIZE(16, 32), 3, false, 255,
+};
+
+static const upb_msglayout *const envoy_service_status_v3_ClientConfig_GenericXdsConfig_submsgs[3] = {
+ &envoy_admin_v3_UpdateFailureState_msginit,
+ &google_protobuf_Any_msginit,
+ &google_protobuf_Timestamp_msginit,
+};
+
+static const upb_msglayout_field envoy_service_status_v3_ClientConfig_GenericXdsConfig__fields[9] = {
+ {1, UPB_SIZE(16, 16), 0, 0, 9, 1},
+ {2, UPB_SIZE(24, 32), 0, 0, 9, 1},
+ {3, UPB_SIZE(32, 48), 0, 0, 9, 1},
+ {4, UPB_SIZE(40, 64), 1, 1, 11, 1},
+ {5, UPB_SIZE(44, 72), 2, 2, 11, 1},
+ {6, UPB_SIZE(4, 4), 0, 0, 14, 1},
+ {7, UPB_SIZE(8, 8), 0, 0, 14, 1},
+ {8, UPB_SIZE(48, 80), 3, 0, 11, 1},
+ {9, UPB_SIZE(12, 12), 0, 0, 8, 1},
+};
+
+const upb_msglayout envoy_service_status_v3_ClientConfig_GenericXdsConfig_msginit = {
+ &envoy_service_status_v3_ClientConfig_GenericXdsConfig_submsgs[0],
+ &envoy_service_status_v3_ClientConfig_GenericXdsConfig__fields[0],
+ UPB_SIZE(56, 96), 9, false, 255,
};
static const upb_msglayout *const envoy_service_status_v3_ClientStatusResponse_submsgs[1] = {
diff --git a/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h b/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h
index 87f807cdf1..ffc61cddcd 100644
--- a/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h
+++ b/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h
@@ -23,29 +23,38 @@ extern "C" {
struct envoy_service_status_v3_ClientStatusRequest;
struct envoy_service_status_v3_PerXdsConfig;
struct envoy_service_status_v3_ClientConfig;
+struct envoy_service_status_v3_ClientConfig_GenericXdsConfig;
struct envoy_service_status_v3_ClientStatusResponse;
typedef struct envoy_service_status_v3_ClientStatusRequest envoy_service_status_v3_ClientStatusRequest;
typedef struct envoy_service_status_v3_PerXdsConfig envoy_service_status_v3_PerXdsConfig;
typedef struct envoy_service_status_v3_ClientConfig envoy_service_status_v3_ClientConfig;
+typedef struct envoy_service_status_v3_ClientConfig_GenericXdsConfig envoy_service_status_v3_ClientConfig_GenericXdsConfig;
typedef struct envoy_service_status_v3_ClientStatusResponse envoy_service_status_v3_ClientStatusResponse;
extern const upb_msglayout envoy_service_status_v3_ClientStatusRequest_msginit;
extern const upb_msglayout envoy_service_status_v3_PerXdsConfig_msginit;
extern const upb_msglayout envoy_service_status_v3_ClientConfig_msginit;
+extern const upb_msglayout envoy_service_status_v3_ClientConfig_GenericXdsConfig_msginit;
extern const upb_msglayout envoy_service_status_v3_ClientStatusResponse_msginit;
struct envoy_admin_v3_ClustersConfigDump;
struct envoy_admin_v3_EndpointsConfigDump;
struct envoy_admin_v3_ListenersConfigDump;
struct envoy_admin_v3_RoutesConfigDump;
struct envoy_admin_v3_ScopedRoutesConfigDump;
+struct envoy_admin_v3_UpdateFailureState;
struct envoy_config_core_v3_Node;
struct envoy_type_matcher_v3_NodeMatcher;
+struct google_protobuf_Any;
+struct google_protobuf_Timestamp;
extern const upb_msglayout envoy_admin_v3_ClustersConfigDump_msginit;
extern const upb_msglayout envoy_admin_v3_EndpointsConfigDump_msginit;
extern const upb_msglayout envoy_admin_v3_ListenersConfigDump_msginit;
extern const upb_msglayout envoy_admin_v3_RoutesConfigDump_msginit;
extern const upb_msglayout envoy_admin_v3_ScopedRoutesConfigDump_msginit;
+extern const upb_msglayout envoy_admin_v3_UpdateFailureState_msginit;
extern const upb_msglayout envoy_config_core_v3_Node_msginit;
extern const upb_msglayout envoy_type_matcher_v3_NodeMatcher_msginit;
+extern const upb_msglayout google_protobuf_Any_msginit;
+extern const upb_msglayout google_protobuf_Timestamp_msginit;
typedef enum {
envoy_service_status_v3_CLIENT_UNKNOWN = 0,
@@ -249,6 +258,8 @@ UPB_INLINE bool envoy_service_status_v3_ClientConfig_has_node(const envoy_servic
UPB_INLINE const struct envoy_config_core_v3_Node* envoy_service_status_v3_ClientConfig_node(const envoy_service_status_v3_ClientConfig *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), const struct envoy_config_core_v3_Node*); }
UPB_INLINE bool envoy_service_status_v3_ClientConfig_has_xds_config(const envoy_service_status_v3_ClientConfig *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(8, 16)); }
UPB_INLINE const envoy_service_status_v3_PerXdsConfig* const* envoy_service_status_v3_ClientConfig_xds_config(const envoy_service_status_v3_ClientConfig *msg, size_t *len) { return (const envoy_service_status_v3_PerXdsConfig* const*)_upb_array_accessor(msg, UPB_SIZE(8, 16), len); }
+UPB_INLINE bool envoy_service_status_v3_ClientConfig_has_generic_xds_configs(const envoy_service_status_v3_ClientConfig *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(12, 24)); }
+UPB_INLINE const envoy_service_status_v3_ClientConfig_GenericXdsConfig* const* envoy_service_status_v3_ClientConfig_generic_xds_configs(const envoy_service_status_v3_ClientConfig *msg, size_t *len) { return (const envoy_service_status_v3_ClientConfig_GenericXdsConfig* const*)_upb_array_accessor(msg, UPB_SIZE(12, 24), len); }
UPB_INLINE void envoy_service_status_v3_ClientConfig_set_node(envoy_service_status_v3_ClientConfig *msg, struct envoy_config_core_v3_Node* value) {
_upb_sethas(msg, 1);
@@ -276,6 +287,110 @@ UPB_INLINE struct envoy_service_status_v3_PerXdsConfig* envoy_service_status_v3_
if (!ok) return NULL;
return sub;
}
+UPB_INLINE envoy_service_status_v3_ClientConfig_GenericXdsConfig** envoy_service_status_v3_ClientConfig_mutable_generic_xds_configs(envoy_service_status_v3_ClientConfig *msg, size_t *len) {
+ return (envoy_service_status_v3_ClientConfig_GenericXdsConfig**)_upb_array_mutable_accessor(msg, UPB_SIZE(12, 24), len);
+}
+UPB_INLINE envoy_service_status_v3_ClientConfig_GenericXdsConfig** envoy_service_status_v3_ClientConfig_resize_generic_xds_configs(envoy_service_status_v3_ClientConfig *msg, size_t len, upb_arena *arena) {
+ return (envoy_service_status_v3_ClientConfig_GenericXdsConfig**)_upb_array_resize_accessor2(msg, UPB_SIZE(12, 24), len, UPB_SIZE(2, 3), arena);
+}
+UPB_INLINE struct envoy_service_status_v3_ClientConfig_GenericXdsConfig* envoy_service_status_v3_ClientConfig_add_generic_xds_configs(envoy_service_status_v3_ClientConfig *msg, upb_arena *arena) {
+ struct envoy_service_status_v3_ClientConfig_GenericXdsConfig* sub = (struct envoy_service_status_v3_ClientConfig_GenericXdsConfig*)_upb_msg_new(&envoy_service_status_v3_ClientConfig_GenericXdsConfig_msginit, arena);
+ bool ok = _upb_array_append_accessor2(
+ msg, UPB_SIZE(12, 24), UPB_SIZE(2, 3), &sub, arena);
+ if (!ok) return NULL;
+ return sub;
+}
+
+/* envoy.service.status.v3.ClientConfig.GenericXdsConfig */
+
+UPB_INLINE envoy_service_status_v3_ClientConfig_GenericXdsConfig *envoy_service_status_v3_ClientConfig_GenericXdsConfig_new(upb_arena *arena) {
+ return (envoy_service_status_v3_ClientConfig_GenericXdsConfig *)_upb_msg_new(&envoy_service_status_v3_ClientConfig_GenericXdsConfig_msginit, arena);
+}
+UPB_INLINE envoy_service_status_v3_ClientConfig_GenericXdsConfig *envoy_service_status_v3_ClientConfig_GenericXdsConfig_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ envoy_service_status_v3_ClientConfig_GenericXdsConfig *ret = envoy_service_status_v3_ClientConfig_GenericXdsConfig_new(arena);
+ return (ret && upb_decode(buf, size, ret, &envoy_service_status_v3_ClientConfig_GenericXdsConfig_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE envoy_service_status_v3_ClientConfig_GenericXdsConfig *envoy_service_status_v3_ClientConfig_GenericXdsConfig_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ envoy_service_status_v3_ClientConfig_GenericXdsConfig *ret = envoy_service_status_v3_ClientConfig_GenericXdsConfig_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &envoy_service_status_v3_ClientConfig_GenericXdsConfig_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *envoy_service_status_v3_ClientConfig_GenericXdsConfig_serialize(const envoy_service_status_v3_ClientConfig_GenericXdsConfig *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &envoy_service_status_v3_ClientConfig_GenericXdsConfig_msginit, arena, len);
+}
+
+UPB_INLINE upb_strview envoy_service_status_v3_ClientConfig_GenericXdsConfig_type_url(const envoy_service_status_v3_ClientConfig_GenericXdsConfig *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(16, 16), upb_strview); }
+UPB_INLINE upb_strview envoy_service_status_v3_ClientConfig_GenericXdsConfig_name(const envoy_service_status_v3_ClientConfig_GenericXdsConfig *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(24, 32), upb_strview); }
+UPB_INLINE upb_strview envoy_service_status_v3_ClientConfig_GenericXdsConfig_version_info(const envoy_service_status_v3_ClientConfig_GenericXdsConfig *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(32, 48), upb_strview); }
+UPB_INLINE bool envoy_service_status_v3_ClientConfig_GenericXdsConfig_has_xds_config(const envoy_service_status_v3_ClientConfig_GenericXdsConfig *msg) { return _upb_hasbit(msg, 1); }
+UPB_INLINE const struct google_protobuf_Any* envoy_service_status_v3_ClientConfig_GenericXdsConfig_xds_config(const envoy_service_status_v3_ClientConfig_GenericXdsConfig *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(40, 64), const struct google_protobuf_Any*); }
+UPB_INLINE bool envoy_service_status_v3_ClientConfig_GenericXdsConfig_has_last_updated(const envoy_service_status_v3_ClientConfig_GenericXdsConfig *msg) { return _upb_hasbit(msg, 2); }
+UPB_INLINE const struct google_protobuf_Timestamp* envoy_service_status_v3_ClientConfig_GenericXdsConfig_last_updated(const envoy_service_status_v3_ClientConfig_GenericXdsConfig *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(44, 72), const struct google_protobuf_Timestamp*); }
+UPB_INLINE int32_t envoy_service_status_v3_ClientConfig_GenericXdsConfig_config_status(const envoy_service_status_v3_ClientConfig_GenericXdsConfig *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 4), int32_t); }
+UPB_INLINE int32_t envoy_service_status_v3_ClientConfig_GenericXdsConfig_client_status(const envoy_service_status_v3_ClientConfig_GenericXdsConfig *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(8, 8), int32_t); }
+UPB_INLINE bool envoy_service_status_v3_ClientConfig_GenericXdsConfig_has_error_state(const envoy_service_status_v3_ClientConfig_GenericXdsConfig *msg) { return _upb_hasbit(msg, 3); }
+UPB_INLINE const struct envoy_admin_v3_UpdateFailureState* envoy_service_status_v3_ClientConfig_GenericXdsConfig_error_state(const envoy_service_status_v3_ClientConfig_GenericXdsConfig *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(48, 80), const struct envoy_admin_v3_UpdateFailureState*); }
+UPB_INLINE bool envoy_service_status_v3_ClientConfig_GenericXdsConfig_is_static_resource(const envoy_service_status_v3_ClientConfig_GenericXdsConfig *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 12), bool); }
+
+UPB_INLINE void envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_type_url(envoy_service_status_v3_ClientConfig_GenericXdsConfig *msg, upb_strview value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(16, 16), upb_strview) = value;
+}
+UPB_INLINE void envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_name(envoy_service_status_v3_ClientConfig_GenericXdsConfig *msg, upb_strview value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(24, 32), upb_strview) = value;
+}
+UPB_INLINE void envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_version_info(envoy_service_status_v3_ClientConfig_GenericXdsConfig *msg, upb_strview value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(32, 48), upb_strview) = value;
+}
+UPB_INLINE void envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_xds_config(envoy_service_status_v3_ClientConfig_GenericXdsConfig *msg, struct google_protobuf_Any* value) {
+ _upb_sethas(msg, 1);
+ *UPB_PTR_AT(msg, UPB_SIZE(40, 64), struct google_protobuf_Any*) = value;
+}
+UPB_INLINE struct google_protobuf_Any* envoy_service_status_v3_ClientConfig_GenericXdsConfig_mutable_xds_config(envoy_service_status_v3_ClientConfig_GenericXdsConfig *msg, upb_arena *arena) {
+ struct google_protobuf_Any* sub = (struct google_protobuf_Any*)envoy_service_status_v3_ClientConfig_GenericXdsConfig_xds_config(msg);
+ if (sub == NULL) {
+ sub = (struct google_protobuf_Any*)_upb_msg_new(&google_protobuf_Any_msginit, arena);
+ if (!sub) return NULL;
+ envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_xds_config(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_last_updated(envoy_service_status_v3_ClientConfig_GenericXdsConfig *msg, struct google_protobuf_Timestamp* value) {
+ _upb_sethas(msg, 2);
+ *UPB_PTR_AT(msg, UPB_SIZE(44, 72), struct google_protobuf_Timestamp*) = value;
+}
+UPB_INLINE struct google_protobuf_Timestamp* envoy_service_status_v3_ClientConfig_GenericXdsConfig_mutable_last_updated(envoy_service_status_v3_ClientConfig_GenericXdsConfig *msg, upb_arena *arena) {
+ struct google_protobuf_Timestamp* sub = (struct google_protobuf_Timestamp*)envoy_service_status_v3_ClientConfig_GenericXdsConfig_last_updated(msg);
+ if (sub == NULL) {
+ sub = (struct google_protobuf_Timestamp*)_upb_msg_new(&google_protobuf_Timestamp_msginit, arena);
+ if (!sub) return NULL;
+ envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_last_updated(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_config_status(envoy_service_status_v3_ClientConfig_GenericXdsConfig *msg, int32_t value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 4), int32_t) = value;
+}
+UPB_INLINE void envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_client_status(envoy_service_status_v3_ClientConfig_GenericXdsConfig *msg, int32_t value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(8, 8), int32_t) = value;
+}
+UPB_INLINE void envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_error_state(envoy_service_status_v3_ClientConfig_GenericXdsConfig *msg, struct envoy_admin_v3_UpdateFailureState* value) {
+ _upb_sethas(msg, 3);
+ *UPB_PTR_AT(msg, UPB_SIZE(48, 80), struct envoy_admin_v3_UpdateFailureState*) = value;
+}
+UPB_INLINE struct envoy_admin_v3_UpdateFailureState* envoy_service_status_v3_ClientConfig_GenericXdsConfig_mutable_error_state(envoy_service_status_v3_ClientConfig_GenericXdsConfig *msg, upb_arena *arena) {
+ struct envoy_admin_v3_UpdateFailureState* sub = (struct envoy_admin_v3_UpdateFailureState*)envoy_service_status_v3_ClientConfig_GenericXdsConfig_error_state(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_admin_v3_UpdateFailureState*)_upb_msg_new(&envoy_admin_v3_UpdateFailureState_msginit, arena);
+ if (!sub) return NULL;
+ envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_error_state(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_is_static_resource(envoy_service_status_v3_ClientConfig_GenericXdsConfig *msg, bool value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(12, 12), bool) = value;
+}
/* envoy.service.status.v3.ClientStatusResponse */
diff --git a/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c b/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c
new file mode 100644
index 0000000000..77d6d9a40e
--- /dev/null
+++ b/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c
@@ -0,0 +1,60 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/type/http/v3/path_transformation.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include <stddef.h>
+#include "upb/msg.h"
+#include "envoy/type/http/v3/path_transformation.upb.h"
+#include "udpa/annotations/status.upb.h"
+#include "validate/validate.upb.h"
+
+#include "upb/port_def.inc"
+
+static const upb_msglayout *const envoy_type_http_v3_PathTransformation_submsgs[1] = {
+ &envoy_type_http_v3_PathTransformation_Operation_msginit,
+};
+
+static const upb_msglayout_field envoy_type_http_v3_PathTransformation__fields[1] = {
+ {1, UPB_SIZE(0, 0), 0, 0, 11, 3},
+};
+
+const upb_msglayout envoy_type_http_v3_PathTransformation_msginit = {
+ &envoy_type_http_v3_PathTransformation_submsgs[0],
+ &envoy_type_http_v3_PathTransformation__fields[0],
+ UPB_SIZE(8, 8), 1, false, 255,
+};
+
+static const upb_msglayout *const envoy_type_http_v3_PathTransformation_Operation_submsgs[2] = {
+ &envoy_type_http_v3_PathTransformation_Operation_MergeSlashes_msginit,
+ &envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986_msginit,
+};
+
+static const upb_msglayout_field envoy_type_http_v3_PathTransformation_Operation__fields[2] = {
+ {2, UPB_SIZE(0, 0), UPB_SIZE(-5, -9), 1, 11, 1},
+ {3, UPB_SIZE(0, 0), UPB_SIZE(-5, -9), 0, 11, 1},
+};
+
+const upb_msglayout envoy_type_http_v3_PathTransformation_Operation_msginit = {
+ &envoy_type_http_v3_PathTransformation_Operation_submsgs[0],
+ &envoy_type_http_v3_PathTransformation_Operation__fields[0],
+ UPB_SIZE(8, 16), 2, false, 255,
+};
+
+const upb_msglayout envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986_msginit = {
+ NULL,
+ NULL,
+ UPB_SIZE(0, 0), 0, false, 255,
+};
+
+const upb_msglayout envoy_type_http_v3_PathTransformation_Operation_MergeSlashes_msginit = {
+ NULL,
+ NULL,
+ UPB_SIZE(0, 0), 0, false, 255,
+};
+
+#include "upb/port_undef.inc"
+
diff --git a/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h b/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h
new file mode 100644
index 0000000000..2aa31596dc
--- /dev/null
+++ b/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h
@@ -0,0 +1,181 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/type/http/v3/path_transformation.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef ENVOY_TYPE_HTTP_V3_PATH_TRANSFORMATION_PROTO_UPB_H_
+#define ENVOY_TYPE_HTTP_V3_PATH_TRANSFORMATION_PROTO_UPB_H_
+
+#include "upb/msg.h"
+#include "upb/decode.h"
+#include "upb/decode_fast.h"
+#include "upb/encode.h"
+
+#include "upb/port_def.inc"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct envoy_type_http_v3_PathTransformation;
+struct envoy_type_http_v3_PathTransformation_Operation;
+struct envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986;
+struct envoy_type_http_v3_PathTransformation_Operation_MergeSlashes;
+typedef struct envoy_type_http_v3_PathTransformation envoy_type_http_v3_PathTransformation;
+typedef struct envoy_type_http_v3_PathTransformation_Operation envoy_type_http_v3_PathTransformation_Operation;
+typedef struct envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986 envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986;
+typedef struct envoy_type_http_v3_PathTransformation_Operation_MergeSlashes envoy_type_http_v3_PathTransformation_Operation_MergeSlashes;
+extern const upb_msglayout envoy_type_http_v3_PathTransformation_msginit;
+extern const upb_msglayout envoy_type_http_v3_PathTransformation_Operation_msginit;
+extern const upb_msglayout envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986_msginit;
+extern const upb_msglayout envoy_type_http_v3_PathTransformation_Operation_MergeSlashes_msginit;
+
+
+/* envoy.type.http.v3.PathTransformation */
+
+UPB_INLINE envoy_type_http_v3_PathTransformation *envoy_type_http_v3_PathTransformation_new(upb_arena *arena) {
+ return (envoy_type_http_v3_PathTransformation *)_upb_msg_new(&envoy_type_http_v3_PathTransformation_msginit, arena);
+}
+UPB_INLINE envoy_type_http_v3_PathTransformation *envoy_type_http_v3_PathTransformation_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ envoy_type_http_v3_PathTransformation *ret = envoy_type_http_v3_PathTransformation_new(arena);
+ return (ret && upb_decode(buf, size, ret, &envoy_type_http_v3_PathTransformation_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE envoy_type_http_v3_PathTransformation *envoy_type_http_v3_PathTransformation_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ envoy_type_http_v3_PathTransformation *ret = envoy_type_http_v3_PathTransformation_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &envoy_type_http_v3_PathTransformation_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *envoy_type_http_v3_PathTransformation_serialize(const envoy_type_http_v3_PathTransformation *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &envoy_type_http_v3_PathTransformation_msginit, arena, len);
+}
+
+UPB_INLINE bool envoy_type_http_v3_PathTransformation_has_operations(const envoy_type_http_v3_PathTransformation *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(0, 0)); }
+UPB_INLINE const envoy_type_http_v3_PathTransformation_Operation* const* envoy_type_http_v3_PathTransformation_operations(const envoy_type_http_v3_PathTransformation *msg, size_t *len) { return (const envoy_type_http_v3_PathTransformation_Operation* const*)_upb_array_accessor(msg, UPB_SIZE(0, 0), len); }
+
+UPB_INLINE envoy_type_http_v3_PathTransformation_Operation** envoy_type_http_v3_PathTransformation_mutable_operations(envoy_type_http_v3_PathTransformation *msg, size_t *len) {
+ return (envoy_type_http_v3_PathTransformation_Operation**)_upb_array_mutable_accessor(msg, UPB_SIZE(0, 0), len);
+}
+UPB_INLINE envoy_type_http_v3_PathTransformation_Operation** envoy_type_http_v3_PathTransformation_resize_operations(envoy_type_http_v3_PathTransformation *msg, size_t len, upb_arena *arena) {
+ return (envoy_type_http_v3_PathTransformation_Operation**)_upb_array_resize_accessor2(msg, UPB_SIZE(0, 0), len, UPB_SIZE(2, 3), arena);
+}
+UPB_INLINE struct envoy_type_http_v3_PathTransformation_Operation* envoy_type_http_v3_PathTransformation_add_operations(envoy_type_http_v3_PathTransformation *msg, upb_arena *arena) {
+ struct envoy_type_http_v3_PathTransformation_Operation* sub = (struct envoy_type_http_v3_PathTransformation_Operation*)_upb_msg_new(&envoy_type_http_v3_PathTransformation_Operation_msginit, arena);
+ bool ok = _upb_array_append_accessor2(
+ msg, UPB_SIZE(0, 0), UPB_SIZE(2, 3), &sub, arena);
+ if (!ok) return NULL;
+ return sub;
+}
+
+/* envoy.type.http.v3.PathTransformation.Operation */
+
+UPB_INLINE envoy_type_http_v3_PathTransformation_Operation *envoy_type_http_v3_PathTransformation_Operation_new(upb_arena *arena) {
+ return (envoy_type_http_v3_PathTransformation_Operation *)_upb_msg_new(&envoy_type_http_v3_PathTransformation_Operation_msginit, arena);
+}
+UPB_INLINE envoy_type_http_v3_PathTransformation_Operation *envoy_type_http_v3_PathTransformation_Operation_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ envoy_type_http_v3_PathTransformation_Operation *ret = envoy_type_http_v3_PathTransformation_Operation_new(arena);
+ return (ret && upb_decode(buf, size, ret, &envoy_type_http_v3_PathTransformation_Operation_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE envoy_type_http_v3_PathTransformation_Operation *envoy_type_http_v3_PathTransformation_Operation_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ envoy_type_http_v3_PathTransformation_Operation *ret = envoy_type_http_v3_PathTransformation_Operation_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &envoy_type_http_v3_PathTransformation_Operation_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *envoy_type_http_v3_PathTransformation_Operation_serialize(const envoy_type_http_v3_PathTransformation_Operation *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &envoy_type_http_v3_PathTransformation_Operation_msginit, arena, len);
+}
+
+typedef enum {
+ envoy_type_http_v3_PathTransformation_Operation_operation_specifier_normalize_path_rfc_3986 = 2,
+ envoy_type_http_v3_PathTransformation_Operation_operation_specifier_merge_slashes = 3,
+ envoy_type_http_v3_PathTransformation_Operation_operation_specifier_NOT_SET = 0
+} envoy_type_http_v3_PathTransformation_Operation_operation_specifier_oneofcases;
+UPB_INLINE envoy_type_http_v3_PathTransformation_Operation_operation_specifier_oneofcases envoy_type_http_v3_PathTransformation_Operation_operation_specifier_case(const envoy_type_http_v3_PathTransformation_Operation* msg) { return (envoy_type_http_v3_PathTransformation_Operation_operation_specifier_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(4, 8), int32_t); }
+
+UPB_INLINE bool envoy_type_http_v3_PathTransformation_Operation_has_normalize_path_rfc_3986(const envoy_type_http_v3_PathTransformation_Operation *msg) { return _upb_getoneofcase(msg, UPB_SIZE(4, 8)) == 2; }
+UPB_INLINE const envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986* envoy_type_http_v3_PathTransformation_Operation_normalize_path_rfc_3986(const envoy_type_http_v3_PathTransformation_Operation *msg) { return UPB_READ_ONEOF(msg, const envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986*, UPB_SIZE(0, 0), UPB_SIZE(4, 8), 2, NULL); }
+UPB_INLINE bool envoy_type_http_v3_PathTransformation_Operation_has_merge_slashes(const envoy_type_http_v3_PathTransformation_Operation *msg) { return _upb_getoneofcase(msg, UPB_SIZE(4, 8)) == 3; }
+UPB_INLINE const envoy_type_http_v3_PathTransformation_Operation_MergeSlashes* envoy_type_http_v3_PathTransformation_Operation_merge_slashes(const envoy_type_http_v3_PathTransformation_Operation *msg) { return UPB_READ_ONEOF(msg, const envoy_type_http_v3_PathTransformation_Operation_MergeSlashes*, UPB_SIZE(0, 0), UPB_SIZE(4, 8), 3, NULL); }
+
+UPB_INLINE void envoy_type_http_v3_PathTransformation_Operation_set_normalize_path_rfc_3986(envoy_type_http_v3_PathTransformation_Operation *msg, envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986* value) {
+ UPB_WRITE_ONEOF(msg, envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986*, UPB_SIZE(0, 0), value, UPB_SIZE(4, 8), 2);
+}
+UPB_INLINE struct envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986* envoy_type_http_v3_PathTransformation_Operation_mutable_normalize_path_rfc_3986(envoy_type_http_v3_PathTransformation_Operation *msg, upb_arena *arena) {
+ struct envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986* sub = (struct envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986*)envoy_type_http_v3_PathTransformation_Operation_normalize_path_rfc_3986(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986*)_upb_msg_new(&envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986_msginit, arena);
+ if (!sub) return NULL;
+ envoy_type_http_v3_PathTransformation_Operation_set_normalize_path_rfc_3986(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void envoy_type_http_v3_PathTransformation_Operation_set_merge_slashes(envoy_type_http_v3_PathTransformation_Operation *msg, envoy_type_http_v3_PathTransformation_Operation_MergeSlashes* value) {
+ UPB_WRITE_ONEOF(msg, envoy_type_http_v3_PathTransformation_Operation_MergeSlashes*, UPB_SIZE(0, 0), value, UPB_SIZE(4, 8), 3);
+}
+UPB_INLINE struct envoy_type_http_v3_PathTransformation_Operation_MergeSlashes* envoy_type_http_v3_PathTransformation_Operation_mutable_merge_slashes(envoy_type_http_v3_PathTransformation_Operation *msg, upb_arena *arena) {
+ struct envoy_type_http_v3_PathTransformation_Operation_MergeSlashes* sub = (struct envoy_type_http_v3_PathTransformation_Operation_MergeSlashes*)envoy_type_http_v3_PathTransformation_Operation_merge_slashes(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_type_http_v3_PathTransformation_Operation_MergeSlashes*)_upb_msg_new(&envoy_type_http_v3_PathTransformation_Operation_MergeSlashes_msginit, arena);
+ if (!sub) return NULL;
+ envoy_type_http_v3_PathTransformation_Operation_set_merge_slashes(msg, sub);
+ }
+ return sub;
+}
+
+/* envoy.type.http.v3.PathTransformation.Operation.NormalizePathRFC3986 */
+
+UPB_INLINE envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986 *envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986_new(upb_arena *arena) {
+ return (envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986 *)_upb_msg_new(&envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986_msginit, arena);
+}
+UPB_INLINE envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986 *envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986 *ret = envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986_new(arena);
+ return (ret && upb_decode(buf, size, ret, &envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986 *envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986 *ret = envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986_serialize(const envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986 *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986_msginit, arena, len);
+}
+
+
+
+/* envoy.type.http.v3.PathTransformation.Operation.MergeSlashes */
+
+UPB_INLINE envoy_type_http_v3_PathTransformation_Operation_MergeSlashes *envoy_type_http_v3_PathTransformation_Operation_MergeSlashes_new(upb_arena *arena) {
+ return (envoy_type_http_v3_PathTransformation_Operation_MergeSlashes *)_upb_msg_new(&envoy_type_http_v3_PathTransformation_Operation_MergeSlashes_msginit, arena);
+}
+UPB_INLINE envoy_type_http_v3_PathTransformation_Operation_MergeSlashes *envoy_type_http_v3_PathTransformation_Operation_MergeSlashes_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ envoy_type_http_v3_PathTransformation_Operation_MergeSlashes *ret = envoy_type_http_v3_PathTransformation_Operation_MergeSlashes_new(arena);
+ return (ret && upb_decode(buf, size, ret, &envoy_type_http_v3_PathTransformation_Operation_MergeSlashes_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE envoy_type_http_v3_PathTransformation_Operation_MergeSlashes *envoy_type_http_v3_PathTransformation_Operation_MergeSlashes_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ envoy_type_http_v3_PathTransformation_Operation_MergeSlashes *ret = envoy_type_http_v3_PathTransformation_Operation_MergeSlashes_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &envoy_type_http_v3_PathTransformation_Operation_MergeSlashes_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *envoy_type_http_v3_PathTransformation_Operation_MergeSlashes_serialize(const envoy_type_http_v3_PathTransformation_Operation_MergeSlashes *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &envoy_type_http_v3_PathTransformation_Operation_MergeSlashes_msginit, arena, len);
+}
+
+
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif /* ENVOY_TYPE_HTTP_V3_PATH_TRANSFORMATION_PROTO_UPB_H_ */
diff --git a/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c b/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c
index 1e4232bca0..d7d645ad96 100644
--- a/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c
+++ b/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c
@@ -10,6 +10,7 @@
#include "upb/msg.h"
#include "envoy/type/matcher/v3/regex.upb.h"
#include "google/protobuf/wrappers.upb.h"
+#include "envoy/annotations/deprecation.upb.h"
#include "udpa/annotations/status.upb.h"
#include "udpa/annotations/versioning.upb.h"
#include "validate/validate.upb.h"
diff --git a/src/core/ext/upb-generated/validate/validate.upb.c b/src/core/ext/upb-generated/validate/validate.upb.c
index ec2888eeac..f210e3cb28 100644
--- a/src/core/ext/upb-generated/validate/validate.upb.c
+++ b/src/core/ext/upb-generated/validate/validate.upb.c
@@ -71,196 +71,208 @@ const upb_msglayout validate_FieldRules_msginit = {
UPB_SIZE(16, 32), 22, false, 255,
};
-static const upb_msglayout_field validate_FloatRules__fields[7] = {
+static const upb_msglayout_field validate_FloatRules__fields[8] = {
{1, UPB_SIZE(4, 4), 1, 0, 2, 1},
{2, UPB_SIZE(8, 8), 2, 0, 2, 1},
{3, UPB_SIZE(12, 12), 3, 0, 2, 1},
{4, UPB_SIZE(16, 16), 4, 0, 2, 1},
{5, UPB_SIZE(20, 20), 5, 0, 2, 1},
- {6, UPB_SIZE(24, 24), 0, 0, 2, 3},
- {7, UPB_SIZE(28, 32), 0, 0, 2, 3},
+ {6, UPB_SIZE(28, 32), 0, 0, 2, 3},
+ {7, UPB_SIZE(32, 40), 0, 0, 2, 3},
+ {8, UPB_SIZE(24, 24), 6, 0, 8, 1},
};
const upb_msglayout validate_FloatRules_msginit = {
NULL,
&validate_FloatRules__fields[0],
- UPB_SIZE(32, 40), 7, false, 255,
+ UPB_SIZE(40, 48), 8, false, 255,
};
-static const upb_msglayout_field validate_DoubleRules__fields[7] = {
+static const upb_msglayout_field validate_DoubleRules__fields[8] = {
{1, UPB_SIZE(8, 8), 1, 0, 1, 1},
{2, UPB_SIZE(16, 16), 2, 0, 1, 1},
{3, UPB_SIZE(24, 24), 3, 0, 1, 1},
{4, UPB_SIZE(32, 32), 4, 0, 1, 1},
{5, UPB_SIZE(40, 40), 5, 0, 1, 1},
- {6, UPB_SIZE(48, 48), 0, 0, 1, 3},
- {7, UPB_SIZE(52, 56), 0, 0, 1, 3},
+ {6, UPB_SIZE(52, 56), 0, 0, 1, 3},
+ {7, UPB_SIZE(56, 64), 0, 0, 1, 3},
+ {8, UPB_SIZE(48, 48), 6, 0, 8, 1},
};
const upb_msglayout validate_DoubleRules_msginit = {
NULL,
&validate_DoubleRules__fields[0],
- UPB_SIZE(56, 64), 7, false, 255,
+ UPB_SIZE(64, 72), 8, false, 255,
};
-static const upb_msglayout_field validate_Int32Rules__fields[7] = {
+static const upb_msglayout_field validate_Int32Rules__fields[8] = {
{1, UPB_SIZE(4, 4), 1, 0, 5, 1},
{2, UPB_SIZE(8, 8), 2, 0, 5, 1},
{3, UPB_SIZE(12, 12), 3, 0, 5, 1},
{4, UPB_SIZE(16, 16), 4, 0, 5, 1},
{5, UPB_SIZE(20, 20), 5, 0, 5, 1},
- {6, UPB_SIZE(24, 24), 0, 0, 5, 3},
- {7, UPB_SIZE(28, 32), 0, 0, 5, 3},
+ {6, UPB_SIZE(28, 32), 0, 0, 5, 3},
+ {7, UPB_SIZE(32, 40), 0, 0, 5, 3},
+ {8, UPB_SIZE(24, 24), 6, 0, 8, 1},
};
const upb_msglayout validate_Int32Rules_msginit = {
NULL,
&validate_Int32Rules__fields[0],
- UPB_SIZE(32, 40), 7, false, 255,
+ UPB_SIZE(40, 48), 8, false, 255,
};
-static const upb_msglayout_field validate_Int64Rules__fields[7] = {
+static const upb_msglayout_field validate_Int64Rules__fields[8] = {
{1, UPB_SIZE(8, 8), 1, 0, 3, 1},
{2, UPB_SIZE(16, 16), 2, 0, 3, 1},
{3, UPB_SIZE(24, 24), 3, 0, 3, 1},
{4, UPB_SIZE(32, 32), 4, 0, 3, 1},
{5, UPB_SIZE(40, 40), 5, 0, 3, 1},
- {6, UPB_SIZE(48, 48), 0, 0, 3, 3},
- {7, UPB_SIZE(52, 56), 0, 0, 3, 3},
+ {6, UPB_SIZE(52, 56), 0, 0, 3, 3},
+ {7, UPB_SIZE(56, 64), 0, 0, 3, 3},
+ {8, UPB_SIZE(48, 48), 6, 0, 8, 1},
};
const upb_msglayout validate_Int64Rules_msginit = {
NULL,
&validate_Int64Rules__fields[0],
- UPB_SIZE(56, 64), 7, false, 255,
+ UPB_SIZE(64, 72), 8, false, 255,
};
-static const upb_msglayout_field validate_UInt32Rules__fields[7] = {
+static const upb_msglayout_field validate_UInt32Rules__fields[8] = {
{1, UPB_SIZE(4, 4), 1, 0, 13, 1},
{2, UPB_SIZE(8, 8), 2, 0, 13, 1},
{3, UPB_SIZE(12, 12), 3, 0, 13, 1},
{4, UPB_SIZE(16, 16), 4, 0, 13, 1},
{5, UPB_SIZE(20, 20), 5, 0, 13, 1},
- {6, UPB_SIZE(24, 24), 0, 0, 13, 3},
- {7, UPB_SIZE(28, 32), 0, 0, 13, 3},
+ {6, UPB_SIZE(28, 32), 0, 0, 13, 3},
+ {7, UPB_SIZE(32, 40), 0, 0, 13, 3},
+ {8, UPB_SIZE(24, 24), 6, 0, 8, 1},
};
const upb_msglayout validate_UInt32Rules_msginit = {
NULL,
&validate_UInt32Rules__fields[0],
- UPB_SIZE(32, 40), 7, false, 255,
+ UPB_SIZE(40, 48), 8, false, 255,
};
-static const upb_msglayout_field validate_UInt64Rules__fields[7] = {
+static const upb_msglayout_field validate_UInt64Rules__fields[8] = {
{1, UPB_SIZE(8, 8), 1, 0, 4, 1},
{2, UPB_SIZE(16, 16), 2, 0, 4, 1},
{3, UPB_SIZE(24, 24), 3, 0, 4, 1},
{4, UPB_SIZE(32, 32), 4, 0, 4, 1},
{5, UPB_SIZE(40, 40), 5, 0, 4, 1},
- {6, UPB_SIZE(48, 48), 0, 0, 4, 3},
- {7, UPB_SIZE(52, 56), 0, 0, 4, 3},
+ {6, UPB_SIZE(52, 56), 0, 0, 4, 3},
+ {7, UPB_SIZE(56, 64), 0, 0, 4, 3},
+ {8, UPB_SIZE(48, 48), 6, 0, 8, 1},
};
const upb_msglayout validate_UInt64Rules_msginit = {
NULL,
&validate_UInt64Rules__fields[0],
- UPB_SIZE(56, 64), 7, false, 255,
+ UPB_SIZE(64, 72), 8, false, 255,
};
-static const upb_msglayout_field validate_SInt32Rules__fields[7] = {
+static const upb_msglayout_field validate_SInt32Rules__fields[8] = {
{1, UPB_SIZE(4, 4), 1, 0, 17, 1},
{2, UPB_SIZE(8, 8), 2, 0, 17, 1},
{3, UPB_SIZE(12, 12), 3, 0, 17, 1},
{4, UPB_SIZE(16, 16), 4, 0, 17, 1},
{5, UPB_SIZE(20, 20), 5, 0, 17, 1},
- {6, UPB_SIZE(24, 24), 0, 0, 17, 3},
- {7, UPB_SIZE(28, 32), 0, 0, 17, 3},
+ {6, UPB_SIZE(28, 32), 0, 0, 17, 3},
+ {7, UPB_SIZE(32, 40), 0, 0, 17, 3},
+ {8, UPB_SIZE(24, 24), 6, 0, 8, 1},
};
const upb_msglayout validate_SInt32Rules_msginit = {
NULL,
&validate_SInt32Rules__fields[0],
- UPB_SIZE(32, 40), 7, false, 255,
+ UPB_SIZE(40, 48), 8, false, 255,
};
-static const upb_msglayout_field validate_SInt64Rules__fields[7] = {
+static const upb_msglayout_field validate_SInt64Rules__fields[8] = {
{1, UPB_SIZE(8, 8), 1, 0, 18, 1},
{2, UPB_SIZE(16, 16), 2, 0, 18, 1},
{3, UPB_SIZE(24, 24), 3, 0, 18, 1},
{4, UPB_SIZE(32, 32), 4, 0, 18, 1},
{5, UPB_SIZE(40, 40), 5, 0, 18, 1},
- {6, UPB_SIZE(48, 48), 0, 0, 18, 3},
- {7, UPB_SIZE(52, 56), 0, 0, 18, 3},
+ {6, UPB_SIZE(52, 56), 0, 0, 18, 3},
+ {7, UPB_SIZE(56, 64), 0, 0, 18, 3},
+ {8, UPB_SIZE(48, 48), 6, 0, 8, 1},
};
const upb_msglayout validate_SInt64Rules_msginit = {
NULL,
&validate_SInt64Rules__fields[0],
- UPB_SIZE(56, 64), 7, false, 255,
+ UPB_SIZE(64, 72), 8, false, 255,
};
-static const upb_msglayout_field validate_Fixed32Rules__fields[7] = {
+static const upb_msglayout_field validate_Fixed32Rules__fields[8] = {
{1, UPB_SIZE(4, 4), 1, 0, 7, 1},
{2, UPB_SIZE(8, 8), 2, 0, 7, 1},
{3, UPB_SIZE(12, 12), 3, 0, 7, 1},
{4, UPB_SIZE(16, 16), 4, 0, 7, 1},
{5, UPB_SIZE(20, 20), 5, 0, 7, 1},
- {6, UPB_SIZE(24, 24), 0, 0, 7, 3},
- {7, UPB_SIZE(28, 32), 0, 0, 7, 3},
+ {6, UPB_SIZE(28, 32), 0, 0, 7, 3},
+ {7, UPB_SIZE(32, 40), 0, 0, 7, 3},
+ {8, UPB_SIZE(24, 24), 6, 0, 8, 1},
};
const upb_msglayout validate_Fixed32Rules_msginit = {
NULL,
&validate_Fixed32Rules__fields[0],
- UPB_SIZE(32, 40), 7, false, 255,
+ UPB_SIZE(40, 48), 8, false, 255,
};
-static const upb_msglayout_field validate_Fixed64Rules__fields[7] = {
+static const upb_msglayout_field validate_Fixed64Rules__fields[8] = {
{1, UPB_SIZE(8, 8), 1, 0, 6, 1},
{2, UPB_SIZE(16, 16), 2, 0, 6, 1},
{3, UPB_SIZE(24, 24), 3, 0, 6, 1},
{4, UPB_SIZE(32, 32), 4, 0, 6, 1},
{5, UPB_SIZE(40, 40), 5, 0, 6, 1},
- {6, UPB_SIZE(48, 48), 0, 0, 6, 3},
- {7, UPB_SIZE(52, 56), 0, 0, 6, 3},
+ {6, UPB_SIZE(52, 56), 0, 0, 6, 3},
+ {7, UPB_SIZE(56, 64), 0, 0, 6, 3},
+ {8, UPB_SIZE(48, 48), 6, 0, 8, 1},
};
const upb_msglayout validate_Fixed64Rules_msginit = {
NULL,
&validate_Fixed64Rules__fields[0],
- UPB_SIZE(56, 64), 7, false, 255,
+ UPB_SIZE(64, 72), 8, false, 255,
};
-static const upb_msglayout_field validate_SFixed32Rules__fields[7] = {
+static const upb_msglayout_field validate_SFixed32Rules__fields[8] = {
{1, UPB_SIZE(4, 4), 1, 0, 15, 1},
{2, UPB_SIZE(8, 8), 2, 0, 15, 1},
{3, UPB_SIZE(12, 12), 3, 0, 15, 1},
{4, UPB_SIZE(16, 16), 4, 0, 15, 1},
{5, UPB_SIZE(20, 20), 5, 0, 15, 1},
- {6, UPB_SIZE(24, 24), 0, 0, 15, 3},
- {7, UPB_SIZE(28, 32), 0, 0, 15, 3},
+ {6, UPB_SIZE(28, 32), 0, 0, 15, 3},
+ {7, UPB_SIZE(32, 40), 0, 0, 15, 3},
+ {8, UPB_SIZE(24, 24), 6, 0, 8, 1},
};
const upb_msglayout validate_SFixed32Rules_msginit = {
NULL,
&validate_SFixed32Rules__fields[0],
- UPB_SIZE(32, 40), 7, false, 255,
+ UPB_SIZE(40, 48), 8, false, 255,
};
-static const upb_msglayout_field validate_SFixed64Rules__fields[7] = {
+static const upb_msglayout_field validate_SFixed64Rules__fields[8] = {
{1, UPB_SIZE(8, 8), 1, 0, 16, 1},
{2, UPB_SIZE(16, 16), 2, 0, 16, 1},
{3, UPB_SIZE(24, 24), 3, 0, 16, 1},
{4, UPB_SIZE(32, 32), 4, 0, 16, 1},
{5, UPB_SIZE(40, 40), 5, 0, 16, 1},
- {6, UPB_SIZE(48, 48), 0, 0, 16, 3},
- {7, UPB_SIZE(52, 56), 0, 0, 16, 3},
+ {6, UPB_SIZE(52, 56), 0, 0, 16, 3},
+ {7, UPB_SIZE(56, 64), 0, 0, 16, 3},
+ {8, UPB_SIZE(48, 48), 6, 0, 8, 1},
};
const upb_msglayout validate_SFixed64Rules_msginit = {
NULL,
&validate_SFixed64Rules__fields[0],
- UPB_SIZE(56, 64), 7, false, 255,
+ UPB_SIZE(64, 72), 8, false, 255,
};
static const upb_msglayout_field validate_BoolRules__fields[1] = {
@@ -273,7 +285,7 @@ const upb_msglayout validate_BoolRules_msginit = {
UPB_SIZE(8, 8), 1, false, 255,
};
-static const upb_msglayout_field validate_StringRules__fields[25] = {
+static const upb_msglayout_field validate_StringRules__fields[26] = {
{1, UPB_SIZE(60, 64), 1, 0, 12, 1},
{2, UPB_SIZE(8, 8), 2, 0, 4, 1},
{3, UPB_SIZE(16, 16), 3, 0, 4, 1},
@@ -299,34 +311,36 @@ static const upb_msglayout_field validate_StringRules__fields[25] = {
{23, UPB_SIZE(100, 144), 12, 0, 12, 1},
{24, UPB_SIZE(116, 176), UPB_SIZE(-121, -181), 0, 14, 1},
{25, UPB_SIZE(56, 56), 13, 0, 8, 1},
+ {26, UPB_SIZE(57, 57), 14, 0, 8, 1},
};
const upb_msglayout validate_StringRules_msginit = {
NULL,
&validate_StringRules__fields[0],
- UPB_SIZE(128, 192), 25, false, 255,
+ UPB_SIZE(128, 192), 26, false, 255,
};
-static const upb_msglayout_field validate_BytesRules__fields[13] = {
- {1, UPB_SIZE(32, 32), 1, 0, 12, 1},
+static const upb_msglayout_field validate_BytesRules__fields[14] = {
+ {1, UPB_SIZE(36, 40), 1, 0, 12, 1},
{2, UPB_SIZE(8, 8), 2, 0, 4, 1},
{3, UPB_SIZE(16, 16), 3, 0, 4, 1},
- {4, UPB_SIZE(40, 48), 4, 0, 12, 1},
- {5, UPB_SIZE(48, 64), 5, 0, 12, 1},
- {6, UPB_SIZE(56, 80), 6, 0, 12, 1},
- {7, UPB_SIZE(64, 96), 7, 0, 12, 1},
- {8, UPB_SIZE(72, 112), 0, 0, 12, 3},
- {9, UPB_SIZE(76, 120), 0, 0, 12, 3},
- {10, UPB_SIZE(80, 128), UPB_SIZE(-85, -133), 0, 8, 1},
- {11, UPB_SIZE(80, 128), UPB_SIZE(-85, -133), 0, 8, 1},
- {12, UPB_SIZE(80, 128), UPB_SIZE(-85, -133), 0, 8, 1},
+ {4, UPB_SIZE(44, 56), 4, 0, 12, 1},
+ {5, UPB_SIZE(52, 72), 5, 0, 12, 1},
+ {6, UPB_SIZE(60, 88), 6, 0, 12, 1},
+ {7, UPB_SIZE(68, 104), 7, 0, 12, 1},
+ {8, UPB_SIZE(76, 120), 0, 0, 12, 3},
+ {9, UPB_SIZE(80, 128), 0, 0, 12, 3},
+ {10, UPB_SIZE(84, 136), UPB_SIZE(-89, -141), 0, 8, 1},
+ {11, UPB_SIZE(84, 136), UPB_SIZE(-89, -141), 0, 8, 1},
+ {12, UPB_SIZE(84, 136), UPB_SIZE(-89, -141), 0, 8, 1},
{13, UPB_SIZE(24, 24), 8, 0, 4, 1},
+ {14, UPB_SIZE(32, 32), 9, 0, 8, 1},
};
const upb_msglayout validate_BytesRules_msginit = {
NULL,
&validate_BytesRules__fields[0],
- UPB_SIZE(88, 144), 13, false, 255,
+ UPB_SIZE(96, 144), 14, false, 255,
};
static const upb_msglayout_field validate_EnumRules__fields[4] = {
@@ -357,35 +371,37 @@ static const upb_msglayout *const validate_RepeatedRules_submsgs[1] = {
&validate_FieldRules_msginit,
};
-static const upb_msglayout_field validate_RepeatedRules__fields[4] = {
+static const upb_msglayout_field validate_RepeatedRules__fields[5] = {
{1, UPB_SIZE(8, 8), 1, 0, 4, 1},
{2, UPB_SIZE(16, 16), 2, 0, 4, 1},
{3, UPB_SIZE(24, 24), 3, 0, 8, 1},
{4, UPB_SIZE(28, 32), 4, 0, 11, 1},
+ {5, UPB_SIZE(25, 25), 5, 0, 8, 1},
};
const upb_msglayout validate_RepeatedRules_msginit = {
&validate_RepeatedRules_submsgs[0],
&validate_RepeatedRules__fields[0],
- UPB_SIZE(32, 40), 4, false, 255,
+ UPB_SIZE(32, 40), 5, false, 255,
};
static const upb_msglayout *const validate_MapRules_submsgs[1] = {
&validate_FieldRules_msginit,
};
-static const upb_msglayout_field validate_MapRules__fields[5] = {
+static const upb_msglayout_field validate_MapRules__fields[6] = {
{1, UPB_SIZE(8, 8), 1, 0, 4, 1},
{2, UPB_SIZE(16, 16), 2, 0, 4, 1},
{3, UPB_SIZE(24, 24), 3, 0, 8, 1},
{4, UPB_SIZE(28, 32), 4, 0, 11, 1},
{5, UPB_SIZE(32, 40), 5, 0, 11, 1},
+ {6, UPB_SIZE(25, 25), 6, 0, 8, 1},
};
const upb_msglayout validate_MapRules_msginit = {
&validate_MapRules_submsgs[0],
&validate_MapRules__fields[0],
- UPB_SIZE(40, 48), 5, false, 255,
+ UPB_SIZE(40, 48), 6, false, 255,
};
static const upb_msglayout_field validate_AnyRules__fields[3] = {
diff --git a/src/core/ext/upb-generated/validate/validate.upb.h b/src/core/ext/upb-generated/validate/validate.upb.h
index dcde0a9b4f..640cdf9f1f 100644
--- a/src/core/ext/upb-generated/validate/validate.upb.h
+++ b/src/core/ext/upb-generated/validate/validate.upb.h
@@ -488,8 +488,10 @@ UPB_INLINE bool validate_FloatRules_has_gt(const validate_FloatRules *msg) { ret
UPB_INLINE float validate_FloatRules_gt(const validate_FloatRules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(16, 16), float); }
UPB_INLINE bool validate_FloatRules_has_gte(const validate_FloatRules *msg) { return _upb_hasbit(msg, 5); }
UPB_INLINE float validate_FloatRules_gte(const validate_FloatRules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(20, 20), float); }
-UPB_INLINE float const* validate_FloatRules_in(const validate_FloatRules *msg, size_t *len) { return (float const*)_upb_array_accessor(msg, UPB_SIZE(24, 24), len); }
-UPB_INLINE float const* validate_FloatRules_not_in(const validate_FloatRules *msg, size_t *len) { return (float const*)_upb_array_accessor(msg, UPB_SIZE(28, 32), len); }
+UPB_INLINE float const* validate_FloatRules_in(const validate_FloatRules *msg, size_t *len) { return (float const*)_upb_array_accessor(msg, UPB_SIZE(28, 32), len); }
+UPB_INLINE float const* validate_FloatRules_not_in(const validate_FloatRules *msg, size_t *len) { return (float const*)_upb_array_accessor(msg, UPB_SIZE(32, 40), len); }
+UPB_INLINE bool validate_FloatRules_has_ignore_empty(const validate_FloatRules *msg) { return _upb_hasbit(msg, 6); }
+UPB_INLINE bool validate_FloatRules_ignore_empty(const validate_FloatRules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(24, 24), bool); }
UPB_INLINE void validate_FloatRules_set_const(validate_FloatRules *msg, float value) {
_upb_sethas(msg, 1);
@@ -512,25 +514,29 @@ UPB_INLINE void validate_FloatRules_set_gte(validate_FloatRules *msg, float valu
*UPB_PTR_AT(msg, UPB_SIZE(20, 20), float) = value;
}
UPB_INLINE float* validate_FloatRules_mutable_in(validate_FloatRules *msg, size_t *len) {
- return (float*)_upb_array_mutable_accessor(msg, UPB_SIZE(24, 24), len);
+ return (float*)_upb_array_mutable_accessor(msg, UPB_SIZE(28, 32), len);
}
UPB_INLINE float* validate_FloatRules_resize_in(validate_FloatRules *msg, size_t len, upb_arena *arena) {
- return (float*)_upb_array_resize_accessor2(msg, UPB_SIZE(24, 24), len, 2, arena);
+ return (float*)_upb_array_resize_accessor2(msg, UPB_SIZE(28, 32), len, 2, arena);
}
UPB_INLINE bool validate_FloatRules_add_in(validate_FloatRules *msg, float val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(24, 24), 2, &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(28, 32), 2, &val,
arena);
}
UPB_INLINE float* validate_FloatRules_mutable_not_in(validate_FloatRules *msg, size_t *len) {
- return (float*)_upb_array_mutable_accessor(msg, UPB_SIZE(28, 32), len);
+ return (float*)_upb_array_mutable_accessor(msg, UPB_SIZE(32, 40), len);
}
UPB_INLINE float* validate_FloatRules_resize_not_in(validate_FloatRules *msg, size_t len, upb_arena *arena) {
- return (float*)_upb_array_resize_accessor2(msg, UPB_SIZE(28, 32), len, 2, arena);
+ return (float*)_upb_array_resize_accessor2(msg, UPB_SIZE(32, 40), len, 2, arena);
}
UPB_INLINE bool validate_FloatRules_add_not_in(validate_FloatRules *msg, float val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(28, 32), 2, &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(32, 40), 2, &val,
arena);
}
+UPB_INLINE void validate_FloatRules_set_ignore_empty(validate_FloatRules *msg, bool value) {
+ _upb_sethas(msg, 6);
+ *UPB_PTR_AT(msg, UPB_SIZE(24, 24), bool) = value;
+}
/* validate.DoubleRules */
@@ -562,8 +568,10 @@ UPB_INLINE bool validate_DoubleRules_has_gt(const validate_DoubleRules *msg) { r
UPB_INLINE double validate_DoubleRules_gt(const validate_DoubleRules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(32, 32), double); }
UPB_INLINE bool validate_DoubleRules_has_gte(const validate_DoubleRules *msg) { return _upb_hasbit(msg, 5); }
UPB_INLINE double validate_DoubleRules_gte(const validate_DoubleRules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(40, 40), double); }
-UPB_INLINE double const* validate_DoubleRules_in(const validate_DoubleRules *msg, size_t *len) { return (double const*)_upb_array_accessor(msg, UPB_SIZE(48, 48), len); }
-UPB_INLINE double const* validate_DoubleRules_not_in(const validate_DoubleRules *msg, size_t *len) { return (double const*)_upb_array_accessor(msg, UPB_SIZE(52, 56), len); }
+UPB_INLINE double const* validate_DoubleRules_in(const validate_DoubleRules *msg, size_t *len) { return (double const*)_upb_array_accessor(msg, UPB_SIZE(52, 56), len); }
+UPB_INLINE double const* validate_DoubleRules_not_in(const validate_DoubleRules *msg, size_t *len) { return (double const*)_upb_array_accessor(msg, UPB_SIZE(56, 64), len); }
+UPB_INLINE bool validate_DoubleRules_has_ignore_empty(const validate_DoubleRules *msg) { return _upb_hasbit(msg, 6); }
+UPB_INLINE bool validate_DoubleRules_ignore_empty(const validate_DoubleRules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(48, 48), bool); }
UPB_INLINE void validate_DoubleRules_set_const(validate_DoubleRules *msg, double value) {
_upb_sethas(msg, 1);
@@ -586,25 +594,29 @@ UPB_INLINE void validate_DoubleRules_set_gte(validate_DoubleRules *msg, double v
*UPB_PTR_AT(msg, UPB_SIZE(40, 40), double) = value;
}
UPB_INLINE double* validate_DoubleRules_mutable_in(validate_DoubleRules *msg, size_t *len) {
- return (double*)_upb_array_mutable_accessor(msg, UPB_SIZE(48, 48), len);
+ return (double*)_upb_array_mutable_accessor(msg, UPB_SIZE(52, 56), len);
}
UPB_INLINE double* validate_DoubleRules_resize_in(validate_DoubleRules *msg, size_t len, upb_arena *arena) {
- return (double*)_upb_array_resize_accessor2(msg, UPB_SIZE(48, 48), len, 3, arena);
+ return (double*)_upb_array_resize_accessor2(msg, UPB_SIZE(52, 56), len, 3, arena);
}
UPB_INLINE bool validate_DoubleRules_add_in(validate_DoubleRules *msg, double val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(48, 48), 3, &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(52, 56), 3, &val,
arena);
}
UPB_INLINE double* validate_DoubleRules_mutable_not_in(validate_DoubleRules *msg, size_t *len) {
- return (double*)_upb_array_mutable_accessor(msg, UPB_SIZE(52, 56), len);
+ return (double*)_upb_array_mutable_accessor(msg, UPB_SIZE(56, 64), len);
}
UPB_INLINE double* validate_DoubleRules_resize_not_in(validate_DoubleRules *msg, size_t len, upb_arena *arena) {
- return (double*)_upb_array_resize_accessor2(msg, UPB_SIZE(52, 56), len, 3, arena);
+ return (double*)_upb_array_resize_accessor2(msg, UPB_SIZE(56, 64), len, 3, arena);
}
UPB_INLINE bool validate_DoubleRules_add_not_in(validate_DoubleRules *msg, double val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(52, 56), 3, &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(56, 64), 3, &val,
arena);
}
+UPB_INLINE void validate_DoubleRules_set_ignore_empty(validate_DoubleRules *msg, bool value) {
+ _upb_sethas(msg, 6);
+ *UPB_PTR_AT(msg, UPB_SIZE(48, 48), bool) = value;
+}
/* validate.Int32Rules */
@@ -636,8 +648,10 @@ UPB_INLINE bool validate_Int32Rules_has_gt(const validate_Int32Rules *msg) { ret
UPB_INLINE int32_t validate_Int32Rules_gt(const validate_Int32Rules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(16, 16), int32_t); }
UPB_INLINE bool validate_Int32Rules_has_gte(const validate_Int32Rules *msg) { return _upb_hasbit(msg, 5); }
UPB_INLINE int32_t validate_Int32Rules_gte(const validate_Int32Rules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(20, 20), int32_t); }
-UPB_INLINE int32_t const* validate_Int32Rules_in(const validate_Int32Rules *msg, size_t *len) { return (int32_t const*)_upb_array_accessor(msg, UPB_SIZE(24, 24), len); }
-UPB_INLINE int32_t const* validate_Int32Rules_not_in(const validate_Int32Rules *msg, size_t *len) { return (int32_t const*)_upb_array_accessor(msg, UPB_SIZE(28, 32), len); }
+UPB_INLINE int32_t const* validate_Int32Rules_in(const validate_Int32Rules *msg, size_t *len) { return (int32_t const*)_upb_array_accessor(msg, UPB_SIZE(28, 32), len); }
+UPB_INLINE int32_t const* validate_Int32Rules_not_in(const validate_Int32Rules *msg, size_t *len) { return (int32_t const*)_upb_array_accessor(msg, UPB_SIZE(32, 40), len); }
+UPB_INLINE bool validate_Int32Rules_has_ignore_empty(const validate_Int32Rules *msg) { return _upb_hasbit(msg, 6); }
+UPB_INLINE bool validate_Int32Rules_ignore_empty(const validate_Int32Rules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(24, 24), bool); }
UPB_INLINE void validate_Int32Rules_set_const(validate_Int32Rules *msg, int32_t value) {
_upb_sethas(msg, 1);
@@ -660,25 +674,29 @@ UPB_INLINE void validate_Int32Rules_set_gte(validate_Int32Rules *msg, int32_t va
*UPB_PTR_AT(msg, UPB_SIZE(20, 20), int32_t) = value;
}
UPB_INLINE int32_t* validate_Int32Rules_mutable_in(validate_Int32Rules *msg, size_t *len) {
- return (int32_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(24, 24), len);
+ return (int32_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(28, 32), len);
}
UPB_INLINE int32_t* validate_Int32Rules_resize_in(validate_Int32Rules *msg, size_t len, upb_arena *arena) {
- return (int32_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(24, 24), len, 2, arena);
+ return (int32_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(28, 32), len, 2, arena);
}
UPB_INLINE bool validate_Int32Rules_add_in(validate_Int32Rules *msg, int32_t val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(24, 24), 2, &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(28, 32), 2, &val,
arena);
}
UPB_INLINE int32_t* validate_Int32Rules_mutable_not_in(validate_Int32Rules *msg, size_t *len) {
- return (int32_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(28, 32), len);
+ return (int32_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(32, 40), len);
}
UPB_INLINE int32_t* validate_Int32Rules_resize_not_in(validate_Int32Rules *msg, size_t len, upb_arena *arena) {
- return (int32_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(28, 32), len, 2, arena);
+ return (int32_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(32, 40), len, 2, arena);
}
UPB_INLINE bool validate_Int32Rules_add_not_in(validate_Int32Rules *msg, int32_t val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(28, 32), 2, &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(32, 40), 2, &val,
arena);
}
+UPB_INLINE void validate_Int32Rules_set_ignore_empty(validate_Int32Rules *msg, bool value) {
+ _upb_sethas(msg, 6);
+ *UPB_PTR_AT(msg, UPB_SIZE(24, 24), bool) = value;
+}
/* validate.Int64Rules */
@@ -710,8 +728,10 @@ UPB_INLINE bool validate_Int64Rules_has_gt(const validate_Int64Rules *msg) { ret
UPB_INLINE int64_t validate_Int64Rules_gt(const validate_Int64Rules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(32, 32), int64_t); }
UPB_INLINE bool validate_Int64Rules_has_gte(const validate_Int64Rules *msg) { return _upb_hasbit(msg, 5); }
UPB_INLINE int64_t validate_Int64Rules_gte(const validate_Int64Rules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(40, 40), int64_t); }
-UPB_INLINE int64_t const* validate_Int64Rules_in(const validate_Int64Rules *msg, size_t *len) { return (int64_t const*)_upb_array_accessor(msg, UPB_SIZE(48, 48), len); }
-UPB_INLINE int64_t const* validate_Int64Rules_not_in(const validate_Int64Rules *msg, size_t *len) { return (int64_t const*)_upb_array_accessor(msg, UPB_SIZE(52, 56), len); }
+UPB_INLINE int64_t const* validate_Int64Rules_in(const validate_Int64Rules *msg, size_t *len) { return (int64_t const*)_upb_array_accessor(msg, UPB_SIZE(52, 56), len); }
+UPB_INLINE int64_t const* validate_Int64Rules_not_in(const validate_Int64Rules *msg, size_t *len) { return (int64_t const*)_upb_array_accessor(msg, UPB_SIZE(56, 64), len); }
+UPB_INLINE bool validate_Int64Rules_has_ignore_empty(const validate_Int64Rules *msg) { return _upb_hasbit(msg, 6); }
+UPB_INLINE bool validate_Int64Rules_ignore_empty(const validate_Int64Rules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(48, 48), bool); }
UPB_INLINE void validate_Int64Rules_set_const(validate_Int64Rules *msg, int64_t value) {
_upb_sethas(msg, 1);
@@ -734,25 +754,29 @@ UPB_INLINE void validate_Int64Rules_set_gte(validate_Int64Rules *msg, int64_t va
*UPB_PTR_AT(msg, UPB_SIZE(40, 40), int64_t) = value;
}
UPB_INLINE int64_t* validate_Int64Rules_mutable_in(validate_Int64Rules *msg, size_t *len) {
- return (int64_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(48, 48), len);
+ return (int64_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(52, 56), len);
}
UPB_INLINE int64_t* validate_Int64Rules_resize_in(validate_Int64Rules *msg, size_t len, upb_arena *arena) {
- return (int64_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(48, 48), len, 3, arena);
+ return (int64_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(52, 56), len, 3, arena);
}
UPB_INLINE bool validate_Int64Rules_add_in(validate_Int64Rules *msg, int64_t val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(48, 48), 3, &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(52, 56), 3, &val,
arena);
}
UPB_INLINE int64_t* validate_Int64Rules_mutable_not_in(validate_Int64Rules *msg, size_t *len) {
- return (int64_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(52, 56), len);
+ return (int64_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(56, 64), len);
}
UPB_INLINE int64_t* validate_Int64Rules_resize_not_in(validate_Int64Rules *msg, size_t len, upb_arena *arena) {
- return (int64_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(52, 56), len, 3, arena);
+ return (int64_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(56, 64), len, 3, arena);
}
UPB_INLINE bool validate_Int64Rules_add_not_in(validate_Int64Rules *msg, int64_t val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(52, 56), 3, &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(56, 64), 3, &val,
arena);
}
+UPB_INLINE void validate_Int64Rules_set_ignore_empty(validate_Int64Rules *msg, bool value) {
+ _upb_sethas(msg, 6);
+ *UPB_PTR_AT(msg, UPB_SIZE(48, 48), bool) = value;
+}
/* validate.UInt32Rules */
@@ -784,8 +808,10 @@ UPB_INLINE bool validate_UInt32Rules_has_gt(const validate_UInt32Rules *msg) { r
UPB_INLINE uint32_t validate_UInt32Rules_gt(const validate_UInt32Rules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(16, 16), uint32_t); }
UPB_INLINE bool validate_UInt32Rules_has_gte(const validate_UInt32Rules *msg) { return _upb_hasbit(msg, 5); }
UPB_INLINE uint32_t validate_UInt32Rules_gte(const validate_UInt32Rules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(20, 20), uint32_t); }
-UPB_INLINE uint32_t const* validate_UInt32Rules_in(const validate_UInt32Rules *msg, size_t *len) { return (uint32_t const*)_upb_array_accessor(msg, UPB_SIZE(24, 24), len); }
-UPB_INLINE uint32_t const* validate_UInt32Rules_not_in(const validate_UInt32Rules *msg, size_t *len) { return (uint32_t const*)_upb_array_accessor(msg, UPB_SIZE(28, 32), len); }
+UPB_INLINE uint32_t const* validate_UInt32Rules_in(const validate_UInt32Rules *msg, size_t *len) { return (uint32_t const*)_upb_array_accessor(msg, UPB_SIZE(28, 32), len); }
+UPB_INLINE uint32_t const* validate_UInt32Rules_not_in(const validate_UInt32Rules *msg, size_t *len) { return (uint32_t const*)_upb_array_accessor(msg, UPB_SIZE(32, 40), len); }
+UPB_INLINE bool validate_UInt32Rules_has_ignore_empty(const validate_UInt32Rules *msg) { return _upb_hasbit(msg, 6); }
+UPB_INLINE bool validate_UInt32Rules_ignore_empty(const validate_UInt32Rules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(24, 24), bool); }
UPB_INLINE void validate_UInt32Rules_set_const(validate_UInt32Rules *msg, uint32_t value) {
_upb_sethas(msg, 1);
@@ -808,25 +834,29 @@ UPB_INLINE void validate_UInt32Rules_set_gte(validate_UInt32Rules *msg, uint32_t
*UPB_PTR_AT(msg, UPB_SIZE(20, 20), uint32_t) = value;
}
UPB_INLINE uint32_t* validate_UInt32Rules_mutable_in(validate_UInt32Rules *msg, size_t *len) {
- return (uint32_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(24, 24), len);
+ return (uint32_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(28, 32), len);
}
UPB_INLINE uint32_t* validate_UInt32Rules_resize_in(validate_UInt32Rules *msg, size_t len, upb_arena *arena) {
- return (uint32_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(24, 24), len, 2, arena);
+ return (uint32_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(28, 32), len, 2, arena);
}
UPB_INLINE bool validate_UInt32Rules_add_in(validate_UInt32Rules *msg, uint32_t val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(24, 24), 2, &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(28, 32), 2, &val,
arena);
}
UPB_INLINE uint32_t* validate_UInt32Rules_mutable_not_in(validate_UInt32Rules *msg, size_t *len) {
- return (uint32_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(28, 32), len);
+ return (uint32_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(32, 40), len);
}
UPB_INLINE uint32_t* validate_UInt32Rules_resize_not_in(validate_UInt32Rules *msg, size_t len, upb_arena *arena) {
- return (uint32_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(28, 32), len, 2, arena);
+ return (uint32_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(32, 40), len, 2, arena);
}
UPB_INLINE bool validate_UInt32Rules_add_not_in(validate_UInt32Rules *msg, uint32_t val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(28, 32), 2, &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(32, 40), 2, &val,
arena);
}
+UPB_INLINE void validate_UInt32Rules_set_ignore_empty(validate_UInt32Rules *msg, bool value) {
+ _upb_sethas(msg, 6);
+ *UPB_PTR_AT(msg, UPB_SIZE(24, 24), bool) = value;
+}
/* validate.UInt64Rules */
@@ -858,8 +888,10 @@ UPB_INLINE bool validate_UInt64Rules_has_gt(const validate_UInt64Rules *msg) { r
UPB_INLINE uint64_t validate_UInt64Rules_gt(const validate_UInt64Rules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(32, 32), uint64_t); }
UPB_INLINE bool validate_UInt64Rules_has_gte(const validate_UInt64Rules *msg) { return _upb_hasbit(msg, 5); }
UPB_INLINE uint64_t validate_UInt64Rules_gte(const validate_UInt64Rules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(40, 40), uint64_t); }
-UPB_INLINE uint64_t const* validate_UInt64Rules_in(const validate_UInt64Rules *msg, size_t *len) { return (uint64_t const*)_upb_array_accessor(msg, UPB_SIZE(48, 48), len); }
-UPB_INLINE uint64_t const* validate_UInt64Rules_not_in(const validate_UInt64Rules *msg, size_t *len) { return (uint64_t const*)_upb_array_accessor(msg, UPB_SIZE(52, 56), len); }
+UPB_INLINE uint64_t const* validate_UInt64Rules_in(const validate_UInt64Rules *msg, size_t *len) { return (uint64_t const*)_upb_array_accessor(msg, UPB_SIZE(52, 56), len); }
+UPB_INLINE uint64_t const* validate_UInt64Rules_not_in(const validate_UInt64Rules *msg, size_t *len) { return (uint64_t const*)_upb_array_accessor(msg, UPB_SIZE(56, 64), len); }
+UPB_INLINE bool validate_UInt64Rules_has_ignore_empty(const validate_UInt64Rules *msg) { return _upb_hasbit(msg, 6); }
+UPB_INLINE bool validate_UInt64Rules_ignore_empty(const validate_UInt64Rules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(48, 48), bool); }
UPB_INLINE void validate_UInt64Rules_set_const(validate_UInt64Rules *msg, uint64_t value) {
_upb_sethas(msg, 1);
@@ -882,25 +914,29 @@ UPB_INLINE void validate_UInt64Rules_set_gte(validate_UInt64Rules *msg, uint64_t
*UPB_PTR_AT(msg, UPB_SIZE(40, 40), uint64_t) = value;
}
UPB_INLINE uint64_t* validate_UInt64Rules_mutable_in(validate_UInt64Rules *msg, size_t *len) {
- return (uint64_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(48, 48), len);
+ return (uint64_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(52, 56), len);
}
UPB_INLINE uint64_t* validate_UInt64Rules_resize_in(validate_UInt64Rules *msg, size_t len, upb_arena *arena) {
- return (uint64_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(48, 48), len, 3, arena);
+ return (uint64_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(52, 56), len, 3, arena);
}
UPB_INLINE bool validate_UInt64Rules_add_in(validate_UInt64Rules *msg, uint64_t val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(48, 48), 3, &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(52, 56), 3, &val,
arena);
}
UPB_INLINE uint64_t* validate_UInt64Rules_mutable_not_in(validate_UInt64Rules *msg, size_t *len) {
- return (uint64_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(52, 56), len);
+ return (uint64_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(56, 64), len);
}
UPB_INLINE uint64_t* validate_UInt64Rules_resize_not_in(validate_UInt64Rules *msg, size_t len, upb_arena *arena) {
- return (uint64_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(52, 56), len, 3, arena);
+ return (uint64_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(56, 64), len, 3, arena);
}
UPB_INLINE bool validate_UInt64Rules_add_not_in(validate_UInt64Rules *msg, uint64_t val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(52, 56), 3, &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(56, 64), 3, &val,
arena);
}
+UPB_INLINE void validate_UInt64Rules_set_ignore_empty(validate_UInt64Rules *msg, bool value) {
+ _upb_sethas(msg, 6);
+ *UPB_PTR_AT(msg, UPB_SIZE(48, 48), bool) = value;
+}
/* validate.SInt32Rules */
@@ -932,8 +968,10 @@ UPB_INLINE bool validate_SInt32Rules_has_gt(const validate_SInt32Rules *msg) { r
UPB_INLINE int32_t validate_SInt32Rules_gt(const validate_SInt32Rules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(16, 16), int32_t); }
UPB_INLINE bool validate_SInt32Rules_has_gte(const validate_SInt32Rules *msg) { return _upb_hasbit(msg, 5); }
UPB_INLINE int32_t validate_SInt32Rules_gte(const validate_SInt32Rules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(20, 20), int32_t); }
-UPB_INLINE int32_t const* validate_SInt32Rules_in(const validate_SInt32Rules *msg, size_t *len) { return (int32_t const*)_upb_array_accessor(msg, UPB_SIZE(24, 24), len); }
-UPB_INLINE int32_t const* validate_SInt32Rules_not_in(const validate_SInt32Rules *msg, size_t *len) { return (int32_t const*)_upb_array_accessor(msg, UPB_SIZE(28, 32), len); }
+UPB_INLINE int32_t const* validate_SInt32Rules_in(const validate_SInt32Rules *msg, size_t *len) { return (int32_t const*)_upb_array_accessor(msg, UPB_SIZE(28, 32), len); }
+UPB_INLINE int32_t const* validate_SInt32Rules_not_in(const validate_SInt32Rules *msg, size_t *len) { return (int32_t const*)_upb_array_accessor(msg, UPB_SIZE(32, 40), len); }
+UPB_INLINE bool validate_SInt32Rules_has_ignore_empty(const validate_SInt32Rules *msg) { return _upb_hasbit(msg, 6); }
+UPB_INLINE bool validate_SInt32Rules_ignore_empty(const validate_SInt32Rules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(24, 24), bool); }
UPB_INLINE void validate_SInt32Rules_set_const(validate_SInt32Rules *msg, int32_t value) {
_upb_sethas(msg, 1);
@@ -956,25 +994,29 @@ UPB_INLINE void validate_SInt32Rules_set_gte(validate_SInt32Rules *msg, int32_t
*UPB_PTR_AT(msg, UPB_SIZE(20, 20), int32_t) = value;
}
UPB_INLINE int32_t* validate_SInt32Rules_mutable_in(validate_SInt32Rules *msg, size_t *len) {
- return (int32_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(24, 24), len);
+ return (int32_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(28, 32), len);
}
UPB_INLINE int32_t* validate_SInt32Rules_resize_in(validate_SInt32Rules *msg, size_t len, upb_arena *arena) {
- return (int32_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(24, 24), len, 2, arena);
+ return (int32_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(28, 32), len, 2, arena);
}
UPB_INLINE bool validate_SInt32Rules_add_in(validate_SInt32Rules *msg, int32_t val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(24, 24), 2, &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(28, 32), 2, &val,
arena);
}
UPB_INLINE int32_t* validate_SInt32Rules_mutable_not_in(validate_SInt32Rules *msg, size_t *len) {
- return (int32_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(28, 32), len);
+ return (int32_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(32, 40), len);
}
UPB_INLINE int32_t* validate_SInt32Rules_resize_not_in(validate_SInt32Rules *msg, size_t len, upb_arena *arena) {
- return (int32_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(28, 32), len, 2, arena);
+ return (int32_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(32, 40), len, 2, arena);
}
UPB_INLINE bool validate_SInt32Rules_add_not_in(validate_SInt32Rules *msg, int32_t val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(28, 32), 2, &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(32, 40), 2, &val,
arena);
}
+UPB_INLINE void validate_SInt32Rules_set_ignore_empty(validate_SInt32Rules *msg, bool value) {
+ _upb_sethas(msg, 6);
+ *UPB_PTR_AT(msg, UPB_SIZE(24, 24), bool) = value;
+}
/* validate.SInt64Rules */
@@ -1006,8 +1048,10 @@ UPB_INLINE bool validate_SInt64Rules_has_gt(const validate_SInt64Rules *msg) { r
UPB_INLINE int64_t validate_SInt64Rules_gt(const validate_SInt64Rules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(32, 32), int64_t); }
UPB_INLINE bool validate_SInt64Rules_has_gte(const validate_SInt64Rules *msg) { return _upb_hasbit(msg, 5); }
UPB_INLINE int64_t validate_SInt64Rules_gte(const validate_SInt64Rules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(40, 40), int64_t); }
-UPB_INLINE int64_t const* validate_SInt64Rules_in(const validate_SInt64Rules *msg, size_t *len) { return (int64_t const*)_upb_array_accessor(msg, UPB_SIZE(48, 48), len); }
-UPB_INLINE int64_t const* validate_SInt64Rules_not_in(const validate_SInt64Rules *msg, size_t *len) { return (int64_t const*)_upb_array_accessor(msg, UPB_SIZE(52, 56), len); }
+UPB_INLINE int64_t const* validate_SInt64Rules_in(const validate_SInt64Rules *msg, size_t *len) { return (int64_t const*)_upb_array_accessor(msg, UPB_SIZE(52, 56), len); }
+UPB_INLINE int64_t const* validate_SInt64Rules_not_in(const validate_SInt64Rules *msg, size_t *len) { return (int64_t const*)_upb_array_accessor(msg, UPB_SIZE(56, 64), len); }
+UPB_INLINE bool validate_SInt64Rules_has_ignore_empty(const validate_SInt64Rules *msg) { return _upb_hasbit(msg, 6); }
+UPB_INLINE bool validate_SInt64Rules_ignore_empty(const validate_SInt64Rules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(48, 48), bool); }
UPB_INLINE void validate_SInt64Rules_set_const(validate_SInt64Rules *msg, int64_t value) {
_upb_sethas(msg, 1);
@@ -1030,25 +1074,29 @@ UPB_INLINE void validate_SInt64Rules_set_gte(validate_SInt64Rules *msg, int64_t
*UPB_PTR_AT(msg, UPB_SIZE(40, 40), int64_t) = value;
}
UPB_INLINE int64_t* validate_SInt64Rules_mutable_in(validate_SInt64Rules *msg, size_t *len) {
- return (int64_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(48, 48), len);
+ return (int64_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(52, 56), len);
}
UPB_INLINE int64_t* validate_SInt64Rules_resize_in(validate_SInt64Rules *msg, size_t len, upb_arena *arena) {
- return (int64_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(48, 48), len, 3, arena);
+ return (int64_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(52, 56), len, 3, arena);
}
UPB_INLINE bool validate_SInt64Rules_add_in(validate_SInt64Rules *msg, int64_t val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(48, 48), 3, &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(52, 56), 3, &val,
arena);
}
UPB_INLINE int64_t* validate_SInt64Rules_mutable_not_in(validate_SInt64Rules *msg, size_t *len) {
- return (int64_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(52, 56), len);
+ return (int64_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(56, 64), len);
}
UPB_INLINE int64_t* validate_SInt64Rules_resize_not_in(validate_SInt64Rules *msg, size_t len, upb_arena *arena) {
- return (int64_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(52, 56), len, 3, arena);
+ return (int64_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(56, 64), len, 3, arena);
}
UPB_INLINE bool validate_SInt64Rules_add_not_in(validate_SInt64Rules *msg, int64_t val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(52, 56), 3, &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(56, 64), 3, &val,
arena);
}
+UPB_INLINE void validate_SInt64Rules_set_ignore_empty(validate_SInt64Rules *msg, bool value) {
+ _upb_sethas(msg, 6);
+ *UPB_PTR_AT(msg, UPB_SIZE(48, 48), bool) = value;
+}
/* validate.Fixed32Rules */
@@ -1080,8 +1128,10 @@ UPB_INLINE bool validate_Fixed32Rules_has_gt(const validate_Fixed32Rules *msg) {
UPB_INLINE uint32_t validate_Fixed32Rules_gt(const validate_Fixed32Rules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(16, 16), uint32_t); }
UPB_INLINE bool validate_Fixed32Rules_has_gte(const validate_Fixed32Rules *msg) { return _upb_hasbit(msg, 5); }
UPB_INLINE uint32_t validate_Fixed32Rules_gte(const validate_Fixed32Rules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(20, 20), uint32_t); }
-UPB_INLINE uint32_t const* validate_Fixed32Rules_in(const validate_Fixed32Rules *msg, size_t *len) { return (uint32_t const*)_upb_array_accessor(msg, UPB_SIZE(24, 24), len); }
-UPB_INLINE uint32_t const* validate_Fixed32Rules_not_in(const validate_Fixed32Rules *msg, size_t *len) { return (uint32_t const*)_upb_array_accessor(msg, UPB_SIZE(28, 32), len); }
+UPB_INLINE uint32_t const* validate_Fixed32Rules_in(const validate_Fixed32Rules *msg, size_t *len) { return (uint32_t const*)_upb_array_accessor(msg, UPB_SIZE(28, 32), len); }
+UPB_INLINE uint32_t const* validate_Fixed32Rules_not_in(const validate_Fixed32Rules *msg, size_t *len) { return (uint32_t const*)_upb_array_accessor(msg, UPB_SIZE(32, 40), len); }
+UPB_INLINE bool validate_Fixed32Rules_has_ignore_empty(const validate_Fixed32Rules *msg) { return _upb_hasbit(msg, 6); }
+UPB_INLINE bool validate_Fixed32Rules_ignore_empty(const validate_Fixed32Rules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(24, 24), bool); }
UPB_INLINE void validate_Fixed32Rules_set_const(validate_Fixed32Rules *msg, uint32_t value) {
_upb_sethas(msg, 1);
@@ -1104,25 +1154,29 @@ UPB_INLINE void validate_Fixed32Rules_set_gte(validate_Fixed32Rules *msg, uint32
*UPB_PTR_AT(msg, UPB_SIZE(20, 20), uint32_t) = value;
}
UPB_INLINE uint32_t* validate_Fixed32Rules_mutable_in(validate_Fixed32Rules *msg, size_t *len) {
- return (uint32_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(24, 24), len);
+ return (uint32_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(28, 32), len);
}
UPB_INLINE uint32_t* validate_Fixed32Rules_resize_in(validate_Fixed32Rules *msg, size_t len, upb_arena *arena) {
- return (uint32_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(24, 24), len, 2, arena);
+ return (uint32_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(28, 32), len, 2, arena);
}
UPB_INLINE bool validate_Fixed32Rules_add_in(validate_Fixed32Rules *msg, uint32_t val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(24, 24), 2, &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(28, 32), 2, &val,
arena);
}
UPB_INLINE uint32_t* validate_Fixed32Rules_mutable_not_in(validate_Fixed32Rules *msg, size_t *len) {
- return (uint32_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(28, 32), len);
+ return (uint32_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(32, 40), len);
}
UPB_INLINE uint32_t* validate_Fixed32Rules_resize_not_in(validate_Fixed32Rules *msg, size_t len, upb_arena *arena) {
- return (uint32_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(28, 32), len, 2, arena);
+ return (uint32_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(32, 40), len, 2, arena);
}
UPB_INLINE bool validate_Fixed32Rules_add_not_in(validate_Fixed32Rules *msg, uint32_t val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(28, 32), 2, &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(32, 40), 2, &val,
arena);
}
+UPB_INLINE void validate_Fixed32Rules_set_ignore_empty(validate_Fixed32Rules *msg, bool value) {
+ _upb_sethas(msg, 6);
+ *UPB_PTR_AT(msg, UPB_SIZE(24, 24), bool) = value;
+}
/* validate.Fixed64Rules */
@@ -1154,8 +1208,10 @@ UPB_INLINE bool validate_Fixed64Rules_has_gt(const validate_Fixed64Rules *msg) {
UPB_INLINE uint64_t validate_Fixed64Rules_gt(const validate_Fixed64Rules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(32, 32), uint64_t); }
UPB_INLINE bool validate_Fixed64Rules_has_gte(const validate_Fixed64Rules *msg) { return _upb_hasbit(msg, 5); }
UPB_INLINE uint64_t validate_Fixed64Rules_gte(const validate_Fixed64Rules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(40, 40), uint64_t); }
-UPB_INLINE uint64_t const* validate_Fixed64Rules_in(const validate_Fixed64Rules *msg, size_t *len) { return (uint64_t const*)_upb_array_accessor(msg, UPB_SIZE(48, 48), len); }
-UPB_INLINE uint64_t const* validate_Fixed64Rules_not_in(const validate_Fixed64Rules *msg, size_t *len) { return (uint64_t const*)_upb_array_accessor(msg, UPB_SIZE(52, 56), len); }
+UPB_INLINE uint64_t const* validate_Fixed64Rules_in(const validate_Fixed64Rules *msg, size_t *len) { return (uint64_t const*)_upb_array_accessor(msg, UPB_SIZE(52, 56), len); }
+UPB_INLINE uint64_t const* validate_Fixed64Rules_not_in(const validate_Fixed64Rules *msg, size_t *len) { return (uint64_t const*)_upb_array_accessor(msg, UPB_SIZE(56, 64), len); }
+UPB_INLINE bool validate_Fixed64Rules_has_ignore_empty(const validate_Fixed64Rules *msg) { return _upb_hasbit(msg, 6); }
+UPB_INLINE bool validate_Fixed64Rules_ignore_empty(const validate_Fixed64Rules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(48, 48), bool); }
UPB_INLINE void validate_Fixed64Rules_set_const(validate_Fixed64Rules *msg, uint64_t value) {
_upb_sethas(msg, 1);
@@ -1178,25 +1234,29 @@ UPB_INLINE void validate_Fixed64Rules_set_gte(validate_Fixed64Rules *msg, uint64
*UPB_PTR_AT(msg, UPB_SIZE(40, 40), uint64_t) = value;
}
UPB_INLINE uint64_t* validate_Fixed64Rules_mutable_in(validate_Fixed64Rules *msg, size_t *len) {
- return (uint64_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(48, 48), len);
+ return (uint64_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(52, 56), len);
}
UPB_INLINE uint64_t* validate_Fixed64Rules_resize_in(validate_Fixed64Rules *msg, size_t len, upb_arena *arena) {
- return (uint64_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(48, 48), len, 3, arena);
+ return (uint64_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(52, 56), len, 3, arena);
}
UPB_INLINE bool validate_Fixed64Rules_add_in(validate_Fixed64Rules *msg, uint64_t val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(48, 48), 3, &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(52, 56), 3, &val,
arena);
}
UPB_INLINE uint64_t* validate_Fixed64Rules_mutable_not_in(validate_Fixed64Rules *msg, size_t *len) {
- return (uint64_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(52, 56), len);
+ return (uint64_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(56, 64), len);
}
UPB_INLINE uint64_t* validate_Fixed64Rules_resize_not_in(validate_Fixed64Rules *msg, size_t len, upb_arena *arena) {
- return (uint64_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(52, 56), len, 3, arena);
+ return (uint64_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(56, 64), len, 3, arena);
}
UPB_INLINE bool validate_Fixed64Rules_add_not_in(validate_Fixed64Rules *msg, uint64_t val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(52, 56), 3, &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(56, 64), 3, &val,
arena);
}
+UPB_INLINE void validate_Fixed64Rules_set_ignore_empty(validate_Fixed64Rules *msg, bool value) {
+ _upb_sethas(msg, 6);
+ *UPB_PTR_AT(msg, UPB_SIZE(48, 48), bool) = value;
+}
/* validate.SFixed32Rules */
@@ -1228,8 +1288,10 @@ UPB_INLINE bool validate_SFixed32Rules_has_gt(const validate_SFixed32Rules *msg)
UPB_INLINE int32_t validate_SFixed32Rules_gt(const validate_SFixed32Rules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(16, 16), int32_t); }
UPB_INLINE bool validate_SFixed32Rules_has_gte(const validate_SFixed32Rules *msg) { return _upb_hasbit(msg, 5); }
UPB_INLINE int32_t validate_SFixed32Rules_gte(const validate_SFixed32Rules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(20, 20), int32_t); }
-UPB_INLINE int32_t const* validate_SFixed32Rules_in(const validate_SFixed32Rules *msg, size_t *len) { return (int32_t const*)_upb_array_accessor(msg, UPB_SIZE(24, 24), len); }
-UPB_INLINE int32_t const* validate_SFixed32Rules_not_in(const validate_SFixed32Rules *msg, size_t *len) { return (int32_t const*)_upb_array_accessor(msg, UPB_SIZE(28, 32), len); }
+UPB_INLINE int32_t const* validate_SFixed32Rules_in(const validate_SFixed32Rules *msg, size_t *len) { return (int32_t const*)_upb_array_accessor(msg, UPB_SIZE(28, 32), len); }
+UPB_INLINE int32_t const* validate_SFixed32Rules_not_in(const validate_SFixed32Rules *msg, size_t *len) { return (int32_t const*)_upb_array_accessor(msg, UPB_SIZE(32, 40), len); }
+UPB_INLINE bool validate_SFixed32Rules_has_ignore_empty(const validate_SFixed32Rules *msg) { return _upb_hasbit(msg, 6); }
+UPB_INLINE bool validate_SFixed32Rules_ignore_empty(const validate_SFixed32Rules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(24, 24), bool); }
UPB_INLINE void validate_SFixed32Rules_set_const(validate_SFixed32Rules *msg, int32_t value) {
_upb_sethas(msg, 1);
@@ -1252,25 +1314,29 @@ UPB_INLINE void validate_SFixed32Rules_set_gte(validate_SFixed32Rules *msg, int3
*UPB_PTR_AT(msg, UPB_SIZE(20, 20), int32_t) = value;
}
UPB_INLINE int32_t* validate_SFixed32Rules_mutable_in(validate_SFixed32Rules *msg, size_t *len) {
- return (int32_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(24, 24), len);
+ return (int32_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(28, 32), len);
}
UPB_INLINE int32_t* validate_SFixed32Rules_resize_in(validate_SFixed32Rules *msg, size_t len, upb_arena *arena) {
- return (int32_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(24, 24), len, 2, arena);
+ return (int32_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(28, 32), len, 2, arena);
}
UPB_INLINE bool validate_SFixed32Rules_add_in(validate_SFixed32Rules *msg, int32_t val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(24, 24), 2, &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(28, 32), 2, &val,
arena);
}
UPB_INLINE int32_t* validate_SFixed32Rules_mutable_not_in(validate_SFixed32Rules *msg, size_t *len) {
- return (int32_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(28, 32), len);
+ return (int32_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(32, 40), len);
}
UPB_INLINE int32_t* validate_SFixed32Rules_resize_not_in(validate_SFixed32Rules *msg, size_t len, upb_arena *arena) {
- return (int32_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(28, 32), len, 2, arena);
+ return (int32_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(32, 40), len, 2, arena);
}
UPB_INLINE bool validate_SFixed32Rules_add_not_in(validate_SFixed32Rules *msg, int32_t val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(28, 32), 2, &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(32, 40), 2, &val,
arena);
}
+UPB_INLINE void validate_SFixed32Rules_set_ignore_empty(validate_SFixed32Rules *msg, bool value) {
+ _upb_sethas(msg, 6);
+ *UPB_PTR_AT(msg, UPB_SIZE(24, 24), bool) = value;
+}
/* validate.SFixed64Rules */
@@ -1302,8 +1368,10 @@ UPB_INLINE bool validate_SFixed64Rules_has_gt(const validate_SFixed64Rules *msg)
UPB_INLINE int64_t validate_SFixed64Rules_gt(const validate_SFixed64Rules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(32, 32), int64_t); }
UPB_INLINE bool validate_SFixed64Rules_has_gte(const validate_SFixed64Rules *msg) { return _upb_hasbit(msg, 5); }
UPB_INLINE int64_t validate_SFixed64Rules_gte(const validate_SFixed64Rules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(40, 40), int64_t); }
-UPB_INLINE int64_t const* validate_SFixed64Rules_in(const validate_SFixed64Rules *msg, size_t *len) { return (int64_t const*)_upb_array_accessor(msg, UPB_SIZE(48, 48), len); }
-UPB_INLINE int64_t const* validate_SFixed64Rules_not_in(const validate_SFixed64Rules *msg, size_t *len) { return (int64_t const*)_upb_array_accessor(msg, UPB_SIZE(52, 56), len); }
+UPB_INLINE int64_t const* validate_SFixed64Rules_in(const validate_SFixed64Rules *msg, size_t *len) { return (int64_t const*)_upb_array_accessor(msg, UPB_SIZE(52, 56), len); }
+UPB_INLINE int64_t const* validate_SFixed64Rules_not_in(const validate_SFixed64Rules *msg, size_t *len) { return (int64_t const*)_upb_array_accessor(msg, UPB_SIZE(56, 64), len); }
+UPB_INLINE bool validate_SFixed64Rules_has_ignore_empty(const validate_SFixed64Rules *msg) { return _upb_hasbit(msg, 6); }
+UPB_INLINE bool validate_SFixed64Rules_ignore_empty(const validate_SFixed64Rules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(48, 48), bool); }
UPB_INLINE void validate_SFixed64Rules_set_const(validate_SFixed64Rules *msg, int64_t value) {
_upb_sethas(msg, 1);
@@ -1326,25 +1394,29 @@ UPB_INLINE void validate_SFixed64Rules_set_gte(validate_SFixed64Rules *msg, int6
*UPB_PTR_AT(msg, UPB_SIZE(40, 40), int64_t) = value;
}
UPB_INLINE int64_t* validate_SFixed64Rules_mutable_in(validate_SFixed64Rules *msg, size_t *len) {
- return (int64_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(48, 48), len);
+ return (int64_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(52, 56), len);
}
UPB_INLINE int64_t* validate_SFixed64Rules_resize_in(validate_SFixed64Rules *msg, size_t len, upb_arena *arena) {
- return (int64_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(48, 48), len, 3, arena);
+ return (int64_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(52, 56), len, 3, arena);
}
UPB_INLINE bool validate_SFixed64Rules_add_in(validate_SFixed64Rules *msg, int64_t val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(48, 48), 3, &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(52, 56), 3, &val,
arena);
}
UPB_INLINE int64_t* validate_SFixed64Rules_mutable_not_in(validate_SFixed64Rules *msg, size_t *len) {
- return (int64_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(52, 56), len);
+ return (int64_t*)_upb_array_mutable_accessor(msg, UPB_SIZE(56, 64), len);
}
UPB_INLINE int64_t* validate_SFixed64Rules_resize_not_in(validate_SFixed64Rules *msg, size_t len, upb_arena *arena) {
- return (int64_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(52, 56), len, 3, arena);
+ return (int64_t*)_upb_array_resize_accessor2(msg, UPB_SIZE(56, 64), len, 3, arena);
}
UPB_INLINE bool validate_SFixed64Rules_add_not_in(validate_SFixed64Rules *msg, int64_t val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(52, 56), 3, &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(56, 64), 3, &val,
arena);
}
+UPB_INLINE void validate_SFixed64Rules_set_ignore_empty(validate_SFixed64Rules *msg, bool value) {
+ _upb_sethas(msg, 6);
+ *UPB_PTR_AT(msg, UPB_SIZE(48, 48), bool) = value;
+}
/* validate.BoolRules */
@@ -1457,6 +1529,8 @@ UPB_INLINE bool validate_StringRules_has_well_known_regex(const validate_StringR
UPB_INLINE int32_t validate_StringRules_well_known_regex(const validate_StringRules *msg) { return UPB_READ_ONEOF(msg, int32_t, UPB_SIZE(116, 176), UPB_SIZE(120, 180), 24, 0); }
UPB_INLINE bool validate_StringRules_has_strict(const validate_StringRules *msg) { return _upb_hasbit(msg, 13); }
UPB_INLINE bool validate_StringRules_strict(const validate_StringRules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(56, 56), bool); }
+UPB_INLINE bool validate_StringRules_has_ignore_empty(const validate_StringRules *msg) { return _upb_hasbit(msg, 14); }
+UPB_INLINE bool validate_StringRules_ignore_empty(const validate_StringRules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(57, 57), bool); }
UPB_INLINE void validate_StringRules_set_const(validate_StringRules *msg, upb_strview value) {
_upb_sethas(msg, 1);
@@ -1560,6 +1634,10 @@ UPB_INLINE void validate_StringRules_set_strict(validate_StringRules *msg, bool
_upb_sethas(msg, 13);
*UPB_PTR_AT(msg, UPB_SIZE(56, 56), bool) = value;
}
+UPB_INLINE void validate_StringRules_set_ignore_empty(validate_StringRules *msg, bool value) {
+ _upb_sethas(msg, 14);
+ *UPB_PTR_AT(msg, UPB_SIZE(57, 57), bool) = value;
+}
/* validate.BytesRules */
@@ -1587,36 +1665,38 @@ typedef enum {
validate_BytesRules_well_known_ipv6 = 12,
validate_BytesRules_well_known_NOT_SET = 0
} validate_BytesRules_well_known_oneofcases;
-UPB_INLINE validate_BytesRules_well_known_oneofcases validate_BytesRules_well_known_case(const validate_BytesRules* msg) { return (validate_BytesRules_well_known_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(84, 132), int32_t); }
+UPB_INLINE validate_BytesRules_well_known_oneofcases validate_BytesRules_well_known_case(const validate_BytesRules* msg) { return (validate_BytesRules_well_known_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(88, 140), int32_t); }
UPB_INLINE bool validate_BytesRules_has_const(const validate_BytesRules *msg) { return _upb_hasbit(msg, 1); }
-UPB_INLINE upb_strview validate_BytesRules_const(const validate_BytesRules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(32, 32), upb_strview); }
+UPB_INLINE upb_strview validate_BytesRules_const(const validate_BytesRules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(36, 40), upb_strview); }
UPB_INLINE bool validate_BytesRules_has_min_len(const validate_BytesRules *msg) { return _upb_hasbit(msg, 2); }
UPB_INLINE uint64_t validate_BytesRules_min_len(const validate_BytesRules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(8, 8), uint64_t); }
UPB_INLINE bool validate_BytesRules_has_max_len(const validate_BytesRules *msg) { return _upb_hasbit(msg, 3); }
UPB_INLINE uint64_t validate_BytesRules_max_len(const validate_BytesRules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(16, 16), uint64_t); }
UPB_INLINE bool validate_BytesRules_has_pattern(const validate_BytesRules *msg) { return _upb_hasbit(msg, 4); }
-UPB_INLINE upb_strview validate_BytesRules_pattern(const validate_BytesRules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(40, 48), upb_strview); }
+UPB_INLINE upb_strview validate_BytesRules_pattern(const validate_BytesRules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(44, 56), upb_strview); }
UPB_INLINE bool validate_BytesRules_has_prefix(const validate_BytesRules *msg) { return _upb_hasbit(msg, 5); }
-UPB_INLINE upb_strview validate_BytesRules_prefix(const validate_BytesRules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(48, 64), upb_strview); }
+UPB_INLINE upb_strview validate_BytesRules_prefix(const validate_BytesRules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(52, 72), upb_strview); }
UPB_INLINE bool validate_BytesRules_has_suffix(const validate_BytesRules *msg) { return _upb_hasbit(msg, 6); }
-UPB_INLINE upb_strview validate_BytesRules_suffix(const validate_BytesRules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(56, 80), upb_strview); }
+UPB_INLINE upb_strview validate_BytesRules_suffix(const validate_BytesRules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(60, 88), upb_strview); }
UPB_INLINE bool validate_BytesRules_has_contains(const validate_BytesRules *msg) { return _upb_hasbit(msg, 7); }
-UPB_INLINE upb_strview validate_BytesRules_contains(const validate_BytesRules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(64, 96), upb_strview); }
-UPB_INLINE upb_strview const* validate_BytesRules_in(const validate_BytesRules *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(72, 112), len); }
-UPB_INLINE upb_strview const* validate_BytesRules_not_in(const validate_BytesRules *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(76, 120), len); }
-UPB_INLINE bool validate_BytesRules_has_ip(const validate_BytesRules *msg) { return _upb_getoneofcase(msg, UPB_SIZE(84, 132)) == 10; }
-UPB_INLINE bool validate_BytesRules_ip(const validate_BytesRules *msg) { return UPB_READ_ONEOF(msg, bool, UPB_SIZE(80, 128), UPB_SIZE(84, 132), 10, false); }
-UPB_INLINE bool validate_BytesRules_has_ipv4(const validate_BytesRules *msg) { return _upb_getoneofcase(msg, UPB_SIZE(84, 132)) == 11; }
-UPB_INLINE bool validate_BytesRules_ipv4(const validate_BytesRules *msg) { return UPB_READ_ONEOF(msg, bool, UPB_SIZE(80, 128), UPB_SIZE(84, 132), 11, false); }
-UPB_INLINE bool validate_BytesRules_has_ipv6(const validate_BytesRules *msg) { return _upb_getoneofcase(msg, UPB_SIZE(84, 132)) == 12; }
-UPB_INLINE bool validate_BytesRules_ipv6(const validate_BytesRules *msg) { return UPB_READ_ONEOF(msg, bool, UPB_SIZE(80, 128), UPB_SIZE(84, 132), 12, false); }
+UPB_INLINE upb_strview validate_BytesRules_contains(const validate_BytesRules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(68, 104), upb_strview); }
+UPB_INLINE upb_strview const* validate_BytesRules_in(const validate_BytesRules *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(76, 120), len); }
+UPB_INLINE upb_strview const* validate_BytesRules_not_in(const validate_BytesRules *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(80, 128), len); }
+UPB_INLINE bool validate_BytesRules_has_ip(const validate_BytesRules *msg) { return _upb_getoneofcase(msg, UPB_SIZE(88, 140)) == 10; }
+UPB_INLINE bool validate_BytesRules_ip(const validate_BytesRules *msg) { return UPB_READ_ONEOF(msg, bool, UPB_SIZE(84, 136), UPB_SIZE(88, 140), 10, false); }
+UPB_INLINE bool validate_BytesRules_has_ipv4(const validate_BytesRules *msg) { return _upb_getoneofcase(msg, UPB_SIZE(88, 140)) == 11; }
+UPB_INLINE bool validate_BytesRules_ipv4(const validate_BytesRules *msg) { return UPB_READ_ONEOF(msg, bool, UPB_SIZE(84, 136), UPB_SIZE(88, 140), 11, false); }
+UPB_INLINE bool validate_BytesRules_has_ipv6(const validate_BytesRules *msg) { return _upb_getoneofcase(msg, UPB_SIZE(88, 140)) == 12; }
+UPB_INLINE bool validate_BytesRules_ipv6(const validate_BytesRules *msg) { return UPB_READ_ONEOF(msg, bool, UPB_SIZE(84, 136), UPB_SIZE(88, 140), 12, false); }
UPB_INLINE bool validate_BytesRules_has_len(const validate_BytesRules *msg) { return _upb_hasbit(msg, 8); }
UPB_INLINE uint64_t validate_BytesRules_len(const validate_BytesRules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(24, 24), uint64_t); }
+UPB_INLINE bool validate_BytesRules_has_ignore_empty(const validate_BytesRules *msg) { return _upb_hasbit(msg, 9); }
+UPB_INLINE bool validate_BytesRules_ignore_empty(const validate_BytesRules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(32, 32), bool); }
UPB_INLINE void validate_BytesRules_set_const(validate_BytesRules *msg, upb_strview value) {
_upb_sethas(msg, 1);
- *UPB_PTR_AT(msg, UPB_SIZE(32, 32), upb_strview) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(36, 40), upb_strview) = value;
}
UPB_INLINE void validate_BytesRules_set_min_len(validate_BytesRules *msg, uint64_t value) {
_upb_sethas(msg, 2);
@@ -1628,53 +1708,57 @@ UPB_INLINE void validate_BytesRules_set_max_len(validate_BytesRules *msg, uint64
}
UPB_INLINE void validate_BytesRules_set_pattern(validate_BytesRules *msg, upb_strview value) {
_upb_sethas(msg, 4);
- *UPB_PTR_AT(msg, UPB_SIZE(40, 48), upb_strview) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(44, 56), upb_strview) = value;
}
UPB_INLINE void validate_BytesRules_set_prefix(validate_BytesRules *msg, upb_strview value) {
_upb_sethas(msg, 5);
- *UPB_PTR_AT(msg, UPB_SIZE(48, 64), upb_strview) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(52, 72), upb_strview) = value;
}
UPB_INLINE void validate_BytesRules_set_suffix(validate_BytesRules *msg, upb_strview value) {
_upb_sethas(msg, 6);
- *UPB_PTR_AT(msg, UPB_SIZE(56, 80), upb_strview) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(60, 88), upb_strview) = value;
}
UPB_INLINE void validate_BytesRules_set_contains(validate_BytesRules *msg, upb_strview value) {
_upb_sethas(msg, 7);
- *UPB_PTR_AT(msg, UPB_SIZE(64, 96), upb_strview) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(68, 104), upb_strview) = value;
}
UPB_INLINE upb_strview* validate_BytesRules_mutable_in(validate_BytesRules *msg, size_t *len) {
- return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(72, 112), len);
+ return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(76, 120), len);
}
UPB_INLINE upb_strview* validate_BytesRules_resize_in(validate_BytesRules *msg, size_t len, upb_arena *arena) {
- return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(72, 112), len, UPB_SIZE(3, 4), arena);
+ return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(76, 120), len, UPB_SIZE(3, 4), arena);
}
UPB_INLINE bool validate_BytesRules_add_in(validate_BytesRules *msg, upb_strview val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(72, 112), UPB_SIZE(3, 4), &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(76, 120), UPB_SIZE(3, 4), &val,
arena);
}
UPB_INLINE upb_strview* validate_BytesRules_mutable_not_in(validate_BytesRules *msg, size_t *len) {
- return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(76, 120), len);
+ return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(80, 128), len);
}
UPB_INLINE upb_strview* validate_BytesRules_resize_not_in(validate_BytesRules *msg, size_t len, upb_arena *arena) {
- return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(76, 120), len, UPB_SIZE(3, 4), arena);
+ return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(80, 128), len, UPB_SIZE(3, 4), arena);
}
UPB_INLINE bool validate_BytesRules_add_not_in(validate_BytesRules *msg, upb_strview val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(76, 120), UPB_SIZE(3, 4), &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(80, 128), UPB_SIZE(3, 4), &val,
arena);
}
UPB_INLINE void validate_BytesRules_set_ip(validate_BytesRules *msg, bool value) {
- UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(80, 128), value, UPB_SIZE(84, 132), 10);
+ UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(84, 136), value, UPB_SIZE(88, 140), 10);
}
UPB_INLINE void validate_BytesRules_set_ipv4(validate_BytesRules *msg, bool value) {
- UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(80, 128), value, UPB_SIZE(84, 132), 11);
+ UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(84, 136), value, UPB_SIZE(88, 140), 11);
}
UPB_INLINE void validate_BytesRules_set_ipv6(validate_BytesRules *msg, bool value) {
- UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(80, 128), value, UPB_SIZE(84, 132), 12);
+ UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(84, 136), value, UPB_SIZE(88, 140), 12);
}
UPB_INLINE void validate_BytesRules_set_len(validate_BytesRules *msg, uint64_t value) {
_upb_sethas(msg, 8);
*UPB_PTR_AT(msg, UPB_SIZE(24, 24), uint64_t) = value;
}
+UPB_INLINE void validate_BytesRules_set_ignore_empty(validate_BytesRules *msg, bool value) {
+ _upb_sethas(msg, 9);
+ *UPB_PTR_AT(msg, UPB_SIZE(32, 32), bool) = value;
+}
/* validate.EnumRules */
@@ -1794,6 +1878,8 @@ UPB_INLINE bool validate_RepeatedRules_has_unique(const validate_RepeatedRules *
UPB_INLINE bool validate_RepeatedRules_unique(const validate_RepeatedRules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(24, 24), bool); }
UPB_INLINE bool validate_RepeatedRules_has_items(const validate_RepeatedRules *msg) { return _upb_hasbit(msg, 4); }
UPB_INLINE const validate_FieldRules* validate_RepeatedRules_items(const validate_RepeatedRules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(28, 32), const validate_FieldRules*); }
+UPB_INLINE bool validate_RepeatedRules_has_ignore_empty(const validate_RepeatedRules *msg) { return _upb_hasbit(msg, 5); }
+UPB_INLINE bool validate_RepeatedRules_ignore_empty(const validate_RepeatedRules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(25, 25), bool); }
UPB_INLINE void validate_RepeatedRules_set_min_items(validate_RepeatedRules *msg, uint64_t value) {
_upb_sethas(msg, 1);
@@ -1820,6 +1906,10 @@ UPB_INLINE struct validate_FieldRules* validate_RepeatedRules_mutable_items(vali
}
return sub;
}
+UPB_INLINE void validate_RepeatedRules_set_ignore_empty(validate_RepeatedRules *msg, bool value) {
+ _upb_sethas(msg, 5);
+ *UPB_PTR_AT(msg, UPB_SIZE(25, 25), bool) = value;
+}
/* validate.MapRules */
@@ -1851,6 +1941,8 @@ UPB_INLINE bool validate_MapRules_has_keys(const validate_MapRules *msg) { retur
UPB_INLINE const validate_FieldRules* validate_MapRules_keys(const validate_MapRules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(28, 32), const validate_FieldRules*); }
UPB_INLINE bool validate_MapRules_has_values(const validate_MapRules *msg) { return _upb_hasbit(msg, 5); }
UPB_INLINE const validate_FieldRules* validate_MapRules_values(const validate_MapRules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(32, 40), const validate_FieldRules*); }
+UPB_INLINE bool validate_MapRules_has_ignore_empty(const validate_MapRules *msg) { return _upb_hasbit(msg, 6); }
+UPB_INLINE bool validate_MapRules_ignore_empty(const validate_MapRules *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(25, 25), bool); }
UPB_INLINE void validate_MapRules_set_min_pairs(validate_MapRules *msg, uint64_t value) {
_upb_sethas(msg, 1);
@@ -1890,6 +1982,10 @@ UPB_INLINE struct validate_FieldRules* validate_MapRules_mutable_values(validate
}
return sub;
}
+UPB_INLINE void validate_MapRules_set_ignore_empty(validate_MapRules *msg, bool value) {
+ _upb_sethas(msg, 6);
+ *UPB_PTR_AT(msg, UPB_SIZE(25, 25), bool) = value;
+}
/* validate.AnyRules */
diff --git a/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c b/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c
index ffb007703c..36563f3289 100644
--- a/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c
+++ b/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c
@@ -11,18 +11,26 @@
extern upb_def_init google_protobuf_descriptor_proto_upbdefinit;
-static const char descriptor[283] = {'\n', '#', 'e', 'n', 'v', 'o', 'y', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'd', 'e', 'p', 'r', 'e',
+static const char descriptor[490] = {'\n', '#', 'e', 'n', 'v', 'o', 'y', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'd', 'e', 'p', 'r', 'e',
'c', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\022', '\021', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'n', 'n', 'o', 't',
'a', 't', 'i', 'o', 'n', 's', '\032', ' ', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'd',
'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', '.', 'p', 'r', 'o', 't', 'o', ':', 'T', '\n', '\025', 'd', 'i', 's', 'a', 'l', 'l',
'o', 'w', 'e', 'd', '_', 'b', 'y', '_', 'd', 'e', 'f', 'a', 'u', 'l', 't', '\022', '\035', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.',
'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'F', 'i', 'e', 'l', 'd', 'O', 'p', 't', 'i', 'o', 'n', 's', '\030', '\347', '\255', '\256',
'Z', ' ', '\001', '(', '\010', 'R', '\023', 'd', 'i', 's', 'a', 'l', 'l', 'o', 'w', 'e', 'd', 'B', 'y', 'D', 'e', 'f', 'a', 'u', 'l',
-'t', ':', 'a', '\n', '\032', 'd', 'i', 's', 'a', 'l', 'l', 'o', 'w', 'e', 'd', '_', 'b', 'y', '_', 'd', 'e', 'f', 'a', 'u', 'l',
-'t', '_', 'e', 'n', 'u', 'm', '\022', '!', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.',
-'E', 'n', 'u', 'm', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i', 'o', 'n', 's', '\030', '\365', '\316', '\266', '!', ' ', '\001', '(', '\010',
-'R', '\027', 'd', 'i', 's', 'a', 'l', 'l', 'o', 'w', 'e', 'd', 'B', 'y', 'D', 'e', 'f', 'a', 'u', 'l', 't', 'E', 'n', 'u', 'm',
-'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'t', ':', '_', '\n', '\033', 'd', 'e', 'p', 'r', 'e', 'c', 'a', 't', 'e', 'd', '_', 'a', 't', '_', 'm', 'i', 'n', 'o', 'r', '_',
+'v', 'e', 'r', 's', 'i', 'o', 'n', '\022', '\035', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
+'.', 'F', 'i', 'e', 'l', 'd', 'O', 'p', 't', 'i', 'o', 'n', 's', '\030', '\362', '\350', '\200', 'K', ' ', '\001', '(', '\t', 'R', '\030', 'd',
+'e', 'p', 'r', 'e', 'c', 'a', 't', 'e', 'd', 'A', 't', 'M', 'i', 'n', 'o', 'r', 'V', 'e', 'r', 's', 'i', 'o', 'n', ':', 'a',
+'\n', '\032', 'd', 'i', 's', 'a', 'l', 'l', 'o', 'w', 'e', 'd', '_', 'b', 'y', '_', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 'e',
+'n', 'u', 'm', '\022', '!', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'E', 'n', 'u',
+'m', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i', 'o', 'n', 's', '\030', '\365', '\316', '\266', '!', ' ', '\001', '(', '\010', 'R', '\027', 'd',
+'i', 's', 'a', 'l', 'l', 'o', 'w', 'e', 'd', 'B', 'y', 'D', 'e', 'f', 'a', 'u', 'l', 't', 'E', 'n', 'u', 'm', ':', 'l', '\n',
+' ', 'd', 'e', 'p', 'r', 'e', 'c', 'a', 't', 'e', 'd', '_', 'a', 't', '_', 'm', 'i', 'n', 'o', 'r', '_', 'v', 'e', 'r', 's',
+'i', 'o', 'n', '_', 'e', 'n', 'u', 'm', '\022', '!', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u',
+'f', '.', 'E', 'n', 'u', 'm', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i', 'o', 'n', 's', '\030', '\301', '\276', '\263', 'V', ' ', '\001',
+'(', '\t', 'R', '\034', 'd', 'e', 'p', 'r', 'e', 'c', 'a', 't', 'e', 'd', 'A', 't', 'M', 'i', 'n', 'o', 'r', 'V', 'e', 'r', 's',
+'i', 'o', 'n', 'E', 'n', 'u', 'm', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
static upb_def_init *deps[2] = {
@@ -34,5 +42,5 @@ upb_def_init envoy_annotations_deprecation_proto_upbdefinit = {
deps,
NULL,
"envoy/annotations/deprecation.proto",
- UPB_STRVIEW_INIT(descriptor, 283)
+ UPB_STRVIEW_INIT(descriptor, 490)
};
diff --git a/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c b/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c
index d9e634392c..f3d0a46f93 100644
--- a/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c
+++ b/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c
@@ -52,7 +52,7 @@ static const upb_msglayout *layouts[15] = {
&envoy_config_accesslog_v3_ExtensionFilter_msginit,
};
-static const char descriptor[4388] = {'\n', ')', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '/',
+static const char descriptor[4402] = {'\n', ')', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '/',
'v', '3', '/', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'p', 'r', 'o', 't', 'o', '\022', '\031', 'e', 'n', 'v', 'o', 'y',
'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '\032', '\037', 'e', 'n', 'v',
'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'b', 'a', 's', 'e', '.', 'p', 'r',
@@ -178,56 +178,57 @@ static const char descriptor[4388] = {'\n', ')', 'e', 'n', 'v', 'o', 'y', '/', '
'u', 't', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'B', '\010', '\372', 'B', '\005',
'\212', '\001', '\002', '\020', '\001', 'R', '\006', 'h', 'e', 'a', 'd', 'e', 'r', ':', '4', '\232', '\305', '\210', '\036', '/', '\n', '-', 'e', 'n', 'v',
'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o',
-'g', '.', 'v', '2', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', '\"', '\334', '\001', '\n', '\022', 'R', 'e', 's',
-'p', 'o', 'n', 's', 'e', 'F', 'l', 'a', 'g', 'F', 'i', 'l', 't', 'e', 'r', '\022', '\211', '\001', '\n', '\005', 'f', 'l', 'a', 'g', 's',
-'\030', '\001', ' ', '\003', '(', '\t', 'B', 's', '\372', 'B', 'p', '\222', '\001', 'm', '\"', 'k', 'r', 'i', 'R', '\002', 'L', 'H', 'R', '\002', 'U',
-'H', 'R', '\002', 'U', 'T', 'R', '\002', 'L', 'R', 'R', '\002', 'U', 'R', 'R', '\002', 'U', 'F', 'R', '\002', 'U', 'C', 'R', '\002', 'U', 'O',
-'R', '\002', 'N', 'R', 'R', '\002', 'D', 'I', 'R', '\002', 'F', 'I', 'R', '\002', 'R', 'L', 'R', '\004', 'U', 'A', 'E', 'X', 'R', '\004', 'R',
-'L', 'S', 'E', 'R', '\002', 'D', 'C', 'R', '\003', 'U', 'R', 'X', 'R', '\002', 'S', 'I', 'R', '\002', 'I', 'H', 'R', '\003', 'D', 'P', 'E',
-'R', '\005', 'U', 'M', 'S', 'D', 'R', 'R', '\004', 'R', 'F', 'C', 'F', 'R', '\004', 'N', 'F', 'C', 'F', 'R', '\002', 'D', 'T', 'R', '\005',
-'f', 'l', 'a', 'g', 's', ':', ':', '\232', '\305', '\210', '\036', '5', '\n', '3', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
-'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '2', '.', 'R', 'e', 's',
-'p', 'o', 'n', 's', 'e', 'F', 'l', 'a', 'g', 'F', 'i', 'l', 't', 'e', 'r', '\"', '\200', '\004', '\n', '\020', 'G', 'r', 'p', 'c', 'S',
-'t', 'a', 't', 'u', 's', 'F', 'i', 'l', 't', 'e', 'r', '\022', ']', '\n', '\010', 's', 't', 'a', 't', 'u', 's', 'e', 's', '\030', '\001',
-' ', '\003', '(', '\016', '2', '2', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's',
-'s', 'l', 'o', 'g', '.', 'v', '3', '.', 'G', 'r', 'p', 'c', 'S', 't', 'a', 't', 'u', 's', 'F', 'i', 'l', 't', 'e', 'r', '.',
-'S', 't', 'a', 't', 'u', 's', 'B', '\r', '\372', 'B', '\n', '\222', '\001', '\007', '\"', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\010', 's', 't',
-'a', 't', 'u', 's', 'e', 's', '\022', '\030', '\n', '\007', 'e', 'x', 'c', 'l', 'u', 'd', 'e', '\030', '\002', ' ', '\001', '(', '\010', 'R', '\007',
-'e', 'x', 'c', 'l', 'u', 'd', 'e', '\"', '\270', '\002', '\n', '\006', 'S', 't', 'a', 't', 'u', 's', '\022', '\006', '\n', '\002', 'O', 'K', '\020',
-'\000', '\022', '\014', '\n', '\010', 'C', 'A', 'N', 'C', 'E', 'L', 'E', 'D', '\020', '\001', '\022', '\013', '\n', '\007', 'U', 'N', 'K', 'N', 'O', 'W',
-'N', '\020', '\002', '\022', '\024', '\n', '\020', 'I', 'N', 'V', 'A', 'L', 'I', 'D', '_', 'A', 'R', 'G', 'U', 'M', 'E', 'N', 'T', '\020', '\003',
-'\022', '\025', '\n', '\021', 'D', 'E', 'A', 'D', 'L', 'I', 'N', 'E', '_', 'E', 'X', 'C', 'E', 'E', 'D', 'E', 'D', '\020', '\004', '\022', '\r',
-'\n', '\t', 'N', 'O', 'T', '_', 'F', 'O', 'U', 'N', 'D', '\020', '\005', '\022', '\022', '\n', '\016', 'A', 'L', 'R', 'E', 'A', 'D', 'Y', '_',
-'E', 'X', 'I', 'S', 'T', 'S', '\020', '\006', '\022', '\025', '\n', '\021', 'P', 'E', 'R', 'M', 'I', 'S', 'S', 'I', 'O', 'N', '_', 'D', 'E',
-'N', 'I', 'E', 'D', '\020', '\007', '\022', '\026', '\n', '\022', 'R', 'E', 'S', 'O', 'U', 'R', 'C', 'E', '_', 'E', 'X', 'H', 'A', 'U', 'S',
-'T', 'E', 'D', '\020', '\010', '\022', '\027', '\n', '\023', 'F', 'A', 'I', 'L', 'E', 'D', '_', 'P', 'R', 'E', 'C', 'O', 'N', 'D', 'I', 'T',
-'I', 'O', 'N', '\020', '\t', '\022', '\013', '\n', '\007', 'A', 'B', 'O', 'R', 'T', 'E', 'D', '\020', '\n', '\022', '\020', '\n', '\014', 'O', 'U', 'T',
-'_', 'O', 'F', '_', 'R', 'A', 'N', 'G', 'E', '\020', '\013', '\022', '\021', '\n', '\r', 'U', 'N', 'I', 'M', 'P', 'L', 'E', 'M', 'E', 'N',
-'T', 'E', 'D', '\020', '\014', '\022', '\014', '\n', '\010', 'I', 'N', 'T', 'E', 'R', 'N', 'A', 'L', '\020', '\r', '\022', '\017', '\n', '\013', 'U', 'N',
-'A', 'V', 'A', 'I', 'L', 'A', 'B', 'L', 'E', '\020', '\016', '\022', '\r', '\n', '\t', 'D', 'A', 'T', 'A', '_', 'L', 'O', 'S', 'S', '\020',
-'\017', '\022', '\023', '\n', '\017', 'U', 'N', 'A', 'U', 'T', 'H', 'E', 'N', 'T', 'I', 'C', 'A', 'T', 'E', 'D', '\020', '\020', ':', '8', '\232',
-'\305', '\210', '\036', '3', '\n', '1', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r',
-'.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '2', '.', 'G', 'r', 'p', 'c', 'S', 't', 'a', 't', 'u', 's', 'F',
-'i', 'l', 't', 'e', 'r', '\"', '\332', '\001', '\n', '\016', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'F', 'i', 'l', 't', 'e', 'r', '\022',
-'@', '\n', '\007', 'm', 'a', 't', 'c', 'h', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\013', '2', '&', '.', 'e', 'n', 'v', 'o', 'y', '.',
-'t', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'M',
-'a', 't', 'c', 'h', 'e', 'r', 'R', '\007', 'm', 'a', 't', 'c', 'h', 'e', 'r', '\022', 'N', '\n', '\026', 'm', 'a', 't', 'c', 'h', '_',
-'i', 'f', '_', 'k', 'e', 'y', '_', 'n', 'o', 't', '_', 'f', 'o', 'u', 'n', 'd', '\030', '\002', ' ', '\001', '(', '\013', '2', '\032', '.',
-'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e',
-'R', '\022', 'm', 'a', 't', 'c', 'h', 'I', 'f', 'K', 'e', 'y', 'N', 'o', 't', 'F', 'o', 'u', 'n', 'd', ':', '6', '\232', '\305', '\210',
-'\036', '1', '\n', '/', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'a',
-'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '2', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'F', 'i', 'l', 't', 'e',
-'r', '\"', '\266', '\001', '\n', '\017', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'F', 'i', 'l', 't', 'e', 'r', '\022', '\022', '\n', '\004',
-'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '9', '\n', '\014', 't', 'y', 'p', 'e', 'd',
-'_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r',
-'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'H', '\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g',
-':', '7', '\232', '\305', '\210', '\036', '2', '\n', '0', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l',
-'t', 'e', 'r', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '2', '.', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o',
-'n', 'F', 'i', 'l', 't', 'e', 'r', 'B', '\r', '\n', '\013', 'c', 'o', 'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010',
-'\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', 'B', 'C', '\n', '\'', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r',
-'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o',
-'g', '.', 'v', '3', 'B', '\016', 'A', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310',
-'\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'g', '.', 'v', '2', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', '\"', '\352', '\001', '\n', '\022', 'R', 'e', 's',
+'p', 'o', 'n', 's', 'e', 'F', 'l', 'a', 'g', 'F', 'i', 'l', 't', 'e', 'r', '\022', '\227', '\001', '\n', '\005', 'f', 'l', 'a', 'g', 's',
+'\030', '\001', ' ', '\003', '(', '\t', 'B', '\200', '\001', '\372', 'B', '}', '\222', '\001', 'z', '\"', 'x', 'r', 'v', 'R', '\002', 'L', 'H', 'R', '\002',
+'U', 'H', 'R', '\002', 'U', 'T', 'R', '\002', 'L', 'R', 'R', '\002', 'U', 'R', 'R', '\002', 'U', 'F', 'R', '\002', 'U', 'C', 'R', '\002', 'U',
+'O', 'R', '\002', 'N', 'R', 'R', '\002', 'D', 'I', 'R', '\002', 'F', 'I', 'R', '\002', 'R', 'L', 'R', '\004', 'U', 'A', 'E', 'X', 'R', '\004',
+'R', 'L', 'S', 'E', 'R', '\002', 'D', 'C', 'R', '\003', 'U', 'R', 'X', 'R', '\002', 'S', 'I', 'R', '\002', 'I', 'H', 'R', '\003', 'D', 'P',
+'E', 'R', '\005', 'U', 'M', 'S', 'D', 'R', 'R', '\004', 'R', 'F', 'C', 'F', 'R', '\004', 'N', 'F', 'C', 'F', 'R', '\002', 'D', 'T', 'R',
+'\003', 'U', 'P', 'E', 'R', '\002', 'N', 'C', 'R', '\002', 'O', 'M', 'R', '\005', 'f', 'l', 'a', 'g', 's', ':', ':', '\232', '\305', '\210', '\036',
+'5', '\n', '3', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'a', 'c',
+'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '2', '.', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'F', 'l', 'a', 'g', 'F', 'i',
+'l', 't', 'e', 'r', '\"', '\200', '\004', '\n', '\020', 'G', 'r', 'p', 'c', 'S', 't', 'a', 't', 'u', 's', 'F', 'i', 'l', 't', 'e', 'r',
+'\022', ']', '\n', '\010', 's', 't', 'a', 't', 'u', 's', 'e', 's', '\030', '\001', ' ', '\003', '(', '\016', '2', '2', '.', 'e', 'n', 'v', 'o',
+'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'G', 'r', 'p',
+'c', 'S', 't', 'a', 't', 'u', 's', 'F', 'i', 'l', 't', 'e', 'r', '.', 'S', 't', 'a', 't', 'u', 's', 'B', '\r', '\372', 'B', '\n',
+'\222', '\001', '\007', '\"', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\010', 's', 't', 'a', 't', 'u', 's', 'e', 's', '\022', '\030', '\n', '\007', 'e',
+'x', 'c', 'l', 'u', 'd', 'e', '\030', '\002', ' ', '\001', '(', '\010', 'R', '\007', 'e', 'x', 'c', 'l', 'u', 'd', 'e', '\"', '\270', '\002', '\n',
+'\006', 'S', 't', 'a', 't', 'u', 's', '\022', '\006', '\n', '\002', 'O', 'K', '\020', '\000', '\022', '\014', '\n', '\010', 'C', 'A', 'N', 'C', 'E', 'L',
+'E', 'D', '\020', '\001', '\022', '\013', '\n', '\007', 'U', 'N', 'K', 'N', 'O', 'W', 'N', '\020', '\002', '\022', '\024', '\n', '\020', 'I', 'N', 'V', 'A',
+'L', 'I', 'D', '_', 'A', 'R', 'G', 'U', 'M', 'E', 'N', 'T', '\020', '\003', '\022', '\025', '\n', '\021', 'D', 'E', 'A', 'D', 'L', 'I', 'N',
+'E', '_', 'E', 'X', 'C', 'E', 'E', 'D', 'E', 'D', '\020', '\004', '\022', '\r', '\n', '\t', 'N', 'O', 'T', '_', 'F', 'O', 'U', 'N', 'D',
+'\020', '\005', '\022', '\022', '\n', '\016', 'A', 'L', 'R', 'E', 'A', 'D', 'Y', '_', 'E', 'X', 'I', 'S', 'T', 'S', '\020', '\006', '\022', '\025', '\n',
+'\021', 'P', 'E', 'R', 'M', 'I', 'S', 'S', 'I', 'O', 'N', '_', 'D', 'E', 'N', 'I', 'E', 'D', '\020', '\007', '\022', '\026', '\n', '\022', 'R',
+'E', 'S', 'O', 'U', 'R', 'C', 'E', '_', 'E', 'X', 'H', 'A', 'U', 'S', 'T', 'E', 'D', '\020', '\010', '\022', '\027', '\n', '\023', 'F', 'A',
+'I', 'L', 'E', 'D', '_', 'P', 'R', 'E', 'C', 'O', 'N', 'D', 'I', 'T', 'I', 'O', 'N', '\020', '\t', '\022', '\013', '\n', '\007', 'A', 'B',
+'O', 'R', 'T', 'E', 'D', '\020', '\n', '\022', '\020', '\n', '\014', 'O', 'U', 'T', '_', 'O', 'F', '_', 'R', 'A', 'N', 'G', 'E', '\020', '\013',
+'\022', '\021', '\n', '\r', 'U', 'N', 'I', 'M', 'P', 'L', 'E', 'M', 'E', 'N', 'T', 'E', 'D', '\020', '\014', '\022', '\014', '\n', '\010', 'I', 'N',
+'T', 'E', 'R', 'N', 'A', 'L', '\020', '\r', '\022', '\017', '\n', '\013', 'U', 'N', 'A', 'V', 'A', 'I', 'L', 'A', 'B', 'L', 'E', '\020', '\016',
+'\022', '\r', '\n', '\t', 'D', 'A', 'T', 'A', '_', 'L', 'O', 'S', 'S', '\020', '\017', '\022', '\023', '\n', '\017', 'U', 'N', 'A', 'U', 'T', 'H',
+'E', 'N', 'T', 'I', 'C', 'A', 'T', 'E', 'D', '\020', '\020', ':', '8', '\232', '\305', '\210', '\036', '3', '\n', '1', 'e', 'n', 'v', 'o', 'y',
+'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.',
+'v', '2', '.', 'G', 'r', 'p', 'c', 'S', 't', 'a', 't', 'u', 's', 'F', 'i', 'l', 't', 'e', 'r', '\"', '\332', '\001', '\n', '\016', 'M',
+'e', 't', 'a', 'd', 'a', 't', 'a', 'F', 'i', 'l', 't', 'e', 'r', '\022', '@', '\n', '\007', 'm', 'a', 't', 'c', 'h', 'e', 'r', '\030',
+'\001', ' ', '\001', '(', '\013', '2', '&', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e',
+'r', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'R', '\007', 'm', 'a', 't',
+'c', 'h', 'e', 'r', '\022', 'N', '\n', '\026', 'm', 'a', 't', 'c', 'h', '_', 'i', 'f', '_', 'k', 'e', 'y', '_', 'n', 'o', 't', '_',
+'f', 'o', 'u', 'n', 'd', '\030', '\002', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't',
+'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\022', 'm', 'a', 't', 'c', 'h', 'I', 'f', 'K', 'e',
+'y', 'N', 'o', 't', 'F', 'o', 'u', 'n', 'd', ':', '6', '\232', '\305', '\210', '\036', '1', '\n', '/', 'e', 'n', 'v', 'o', 'y', '.', 'c',
+'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '2',
+'.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'F', 'i', 'l', 't', 'e', 'r', '\"', '\266', '\001', '\n', '\017', 'E', 'x', 't', 'e', 'n',
+'s', 'i', 'o', 'n', 'F', 'i', 'l', 't', 'e', 'r', '\022', '\022', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'R',
+'\004', 'n', 'a', 'm', 'e', '\022', '9', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001',
+'(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'H',
+'\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', ':', '7', '\232', '\305', '\210', '\036', '2', '\n', '0', 'e', 'n',
+'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'a', 'c', 'c', 'e', 's', 's', 'l',
+'o', 'g', '.', 'v', '2', '.', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'F', 'i', 'l', 't', 'e', 'r', 'B', '\r', '\n', '\013',
+'c', 'o', 'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g',
+'B', 'C', '\n', '\'', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
+'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', 'B', '\016', 'A', 'c', 'c', 'e', 's',
+'s', 'l', 'o', 'g', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't',
+'o', '3',
};
static upb_def_init *deps[10] = {
@@ -247,5 +248,5 @@ upb_def_init envoy_config_accesslog_v3_accesslog_proto_upbdefinit = {
deps,
layouts,
"envoy/config/accesslog/v3/accesslog.proto",
- UPB_STRVIEW_INIT(descriptor, 4388)
+ UPB_STRVIEW_INIT(descriptor, 4402)
};
diff --git a/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c b/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c
index f86bfe76f4..a6ab1d6363 100644
--- a/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c
+++ b/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c
@@ -9,12 +9,14 @@
#include "upb/def.h"
#include "envoy/config/bootstrap/v3/bootstrap.upbdefs.h"
+extern upb_def_init envoy_config_accesslog_v3_accesslog_proto_upbdefinit;
extern upb_def_init envoy_config_cluster_v3_cluster_proto_upbdefinit;
extern upb_def_init envoy_config_core_v3_address_proto_upbdefinit;
extern upb_def_init envoy_config_core_v3_base_proto_upbdefinit;
extern upb_def_init envoy_config_core_v3_config_source_proto_upbdefinit;
extern upb_def_init envoy_config_core_v3_event_service_config_proto_upbdefinit;
extern upb_def_init envoy_config_core_v3_extension_proto_upbdefinit;
+extern upb_def_init envoy_config_core_v3_resolver_proto_upbdefinit;
extern upb_def_init envoy_config_core_v3_socket_option_proto_upbdefinit;
extern upb_def_init envoy_config_listener_v3_listener_proto_upbdefinit;
extern upb_def_init envoy_config_metrics_v3_stats_proto_upbdefinit;
@@ -25,6 +27,7 @@ extern upb_def_init envoy_type_v3_percent_proto_upbdefinit;
extern upb_def_init google_protobuf_duration_proto_upbdefinit;
extern upb_def_init google_protobuf_struct_proto_upbdefinit;
extern upb_def_init google_protobuf_wrappers_proto_upbdefinit;
+extern upb_def_init envoy_annotations_deprecation_proto_upbdefinit;
extern upb_def_init udpa_annotations_migrate_proto_upbdefinit;
extern upb_def_init udpa_annotations_security_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
@@ -47,8 +50,9 @@ extern const upb_msglayout envoy_config_bootstrap_v3_RuntimeLayer_DiskLayer_msgi
extern const upb_msglayout envoy_config_bootstrap_v3_RuntimeLayer_AdminLayer_msginit;
extern const upb_msglayout envoy_config_bootstrap_v3_RuntimeLayer_RtdsLayer_msginit;
extern const upb_msglayout envoy_config_bootstrap_v3_LayeredRuntime_msginit;
+extern const upb_msglayout envoy_config_bootstrap_v3_CustomInlineHeader_msginit;
-static const upb_msglayout *layouts[17] = {
+static const upb_msglayout *layouts[18] = {
&envoy_config_bootstrap_v3_Bootstrap_msginit,
&envoy_config_bootstrap_v3_Bootstrap_StaticResources_msginit,
&envoy_config_bootstrap_v3_Bootstrap_DynamicResources_msginit,
@@ -66,297 +70,333 @@ static const upb_msglayout *layouts[17] = {
&envoy_config_bootstrap_v3_RuntimeLayer_AdminLayer_msginit,
&envoy_config_bootstrap_v3_RuntimeLayer_RtdsLayer_msginit,
&envoy_config_bootstrap_v3_LayeredRuntime_msginit,
+ &envoy_config_bootstrap_v3_CustomInlineHeader_msginit,
};
-static const char descriptor[6993] = {'\n', ')', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '/',
+static const char descriptor[7815] = {'\n', ')', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '/',
'v', '3', '/', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'p', 'r', 'o', 't', 'o', '\022', '\031', 'e', 'n', 'v', 'o', 'y',
-'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '3', '\032', '%', 'e', 'n', 'v',
-'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'l', 'u', 's', 't', 'e', 'r', '/', 'v', '3', '/', 'c', 'l', 'u', 's',
-'t', 'e', 'r', '.', 'p', 'r', 'o', 't', 'o', '\032', '\"', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c',
-'o', 'r', 'e', '/', 'v', '3', '/', 'a', 'd', 'd', 'r', 'e', 's', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\037', 'e', 'n', 'v',
-'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'b', 'a', 's', 'e', '.', 'p', 'r',
-'o', 't', 'o', '\032', '(', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3',
-'/', 'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'o', 'u', 'r', 'c', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '/', 'e', 'n', 'v',
-'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'e', 'v', 'e', 'n', 't', '_', 's',
-'e', 'r', 'v', 'i', 'c', 'e', '_', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '$', 'e', 'n', 'v', 'o',
-'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o',
-'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '(', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r',
-'e', '/', 'v', '3', '/', 's', 'o', 'c', 'k', 'e', 't', '_', 'o', 'p', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032',
-'\'', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '/', 'v', '3',
-'/', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'p', 'r', 'o', 't', 'o', '\032', '#', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o',
-'n', 'f', 'i', 'g', '/', 'm', 'e', 't', 'r', 'i', 'c', 's', '/', 'v', '3', '/', 's', 't', 'a', 't', 's', '.', 'p', 'r', 'o',
-'t', 'o', '\032', '\'', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'o', 'v', 'e', 'r', 'l', 'o', 'a', 'd',
-'/', 'v', '3', '/', 'o', 'v', 'e', 'r', 'l', 'o', 'a', 'd', '.', 'p', 'r', 'o', 't', 'o', '\032', '\'', 'e', 'n', 'v', 'o', 'y',
-'/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 't', 'r', 'a', 'c', 'e', '/', 'v', '3', '/', 'h', 't', 't', 'p', '_', 't', 'r', 'a',
-'c', 'e', 'r', '.', 'p', 'r', 'o', 't', 'o', '\032', '6', 'e', 'n', 'v', 'o', 'y', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o',
-'n', 's', '/', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '/', 't', 'l', 's', '/',
-'v', '3', '/', 's', 'e', 'c', 'r', 'e', 't', '.', 'p', 'r', 'o', 't', 'o', '\032', '\033', 'e', 'n', 'v', 'o', 'y', '/', 't', 'y',
-'p', 'e', '/', 'v', '3', '/', 'p', 'e', 'r', 'c', 'e', 'n', 't', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g',
-'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't',
-'o', '\032', '\034', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 's', 't', 'r', 'u', 'c', 't',
-'.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'w',
-'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't',
-'a', 't', 'i', 'o', 'n', 's', '/', 'm', 'i', 'g', 'r', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\037', 'u', 'd', 'p',
-'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', '.', 'p', 'r',
-'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a',
-'t', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o',
-'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i',
-'d', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\341', '\026', '\n', '\t', 'B',
-'o', 'o', 't', 's', 't', 'r', 'a', 'p', '\022', '.', '\n', '\004', 'n', 'o', 'd', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\032', '.',
-'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'N', 'o', 'd', 'e',
-'R', '\004', 'n', 'o', 'd', 'e', '\022', '.', '\n', '\023', 'n', 'o', 'd', 'e', '_', 'c', 'o', 'n', 't', 'e', 'x', 't', '_', 'p', 'a',
-'r', 'a', 'm', 's', '\030', '\032', ' ', '\003', '(', '\t', 'R', '\021', 'n', 'o', 'd', 'e', 'C', 'o', 'n', 't', 'e', 'x', 't', 'P', 'a',
-'r', 'a', 'm', 's', '\022', '_', '\n', '\020', 's', 't', 'a', 't', 'i', 'c', '_', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', '\030',
-'\002', ' ', '\001', '(', '\013', '2', '4', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't',
-'s', 't', 'r', 'a', 'p', '.', 'v', '3', '.', 'B', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'S', 't', 'a', 't', 'i', 'c',
-'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', 'R', '\017', 's', 't', 'a', 't', 'i', 'c', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e',
-'s', '\022', 'b', '\n', '\021', 'd', 'y', 'n', 'a', 'm', 'i', 'c', '_', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', '\030', '\003', ' ',
-'\001', '(', '\013', '2', '5', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't',
-'r', 'a', 'p', '.', 'v', '3', '.', 'B', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'D', 'y', 'n', 'a', 'm', 'i', 'c', 'R',
-'e', 's', 'o', 'u', 'r', 'c', 'e', 's', 'R', '\020', 'd', 'y', 'n', 'a', 'm', 'i', 'c', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e',
-'s', '\022', 'R', '\n', '\017', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '\030', '\004', ' ', '\001', '(',
-'\013', '2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a',
-'p', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'M', 'a', 'n', 'a', 'g', 'e', 'r', 'R', '\016', 'c', 'l', 'u', 's',
-'t', 'e', 'r', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '\022', 'D', '\n', '\n', 'h', 'd', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030',
-'\016', ' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e',
-'.', 'v', '3', '.', 'A', 'p', 'i', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\t', 'h', 'd', 's', 'C',
-'o', 'n', 'f', 'i', 'g', '\022', '\035', '\n', '\n', 'f', 'l', 'a', 'g', 's', '_', 'p', 'a', 't', 'h', '\030', '\005', ' ', '\001', '(', '\t',
-'R', '\t', 'f', 'l', 'a', 'g', 's', 'P', 'a', 't', 'h', '\022', 'C', '\n', '\013', 's', 't', 'a', 't', 's', '_', 's', 'i', 'n', 'k',
-'s', '\030', '\006', ' ', '\003', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'm', 'e',
-'t', 'r', 'i', 'c', 's', '.', 'v', '3', '.', 'S', 't', 'a', 't', 's', 'S', 'i', 'n', 'k', 'R', '\n', 's', 't', 'a', 't', 's',
-'S', 'i', 'n', 'k', 's', '\022', 'G', '\n', '\014', 's', 't', 'a', 't', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\r', ' ', '\001',
-'(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'm', 'e', 't', 'r', 'i', 'c', 's',
-'.', 'v', '3', '.', 'S', 't', 'a', 't', 's', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\013', 's', 't', 'a', 't', 's', 'C', 'o', 'n',
-'f', 'i', 'g', '\022', 'q', '\n', '\024', 's', 't', 'a', 't', 's', '_', 'f', 'l', 'u', 's', 'h', '_', 'i', 'n', 't', 'e', 'r', 'v',
-'a', 'l', '\030', '\007', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u',
-'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '$', '\372', 'B', '\016', '\252', '\001', '\013', '\032', '\003', '\010', '\254', '\002', '2', '\004',
-'\020', '\300', '\204', '=', '\362', '\230', '\376', '\217', '\005', '\r', '\022', '\013', 's', 't', 'a', 't', 's', '_', 'f', 'l', 'u', 's', 'h', 'R', '\022',
-'s', 't', 'a', 't', 's', 'F', 'l', 'u', 's', 'h', 'I', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\022', ':', '\n', '\024', 's', 't', 'a',
-'t', 's', '_', 'f', 'l', 'u', 's', 'h', '_', 'o', 'n', '_', 'a', 'd', 'm', 'i', 'n', '\030', '\035', ' ', '\001', '(', '\010', 'B', '\007',
-'\372', 'B', '\004', 'j', '\002', '\010', '\001', 'H', '\000', 'R', '\021', 's', 't', 'a', 't', 's', 'F', 'l', 'u', 's', 'h', 'O', 'n', 'A', 'd',
-'m', 'i', 'n', '\022', 'C', '\n', '\010', 'w', 'a', 't', 'c', 'h', 'd', 'o', 'g', '\030', '\010', ' ', '\001', '(', '\013', '2', '#', '.', 'e',
-'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '3', '.',
-'W', 'a', 't', 'c', 'h', 'd', 'o', 'g', 'B', '\002', '\030', '\001', 'R', '\010', 'w', 'a', 't', 'c', 'h', 'd', 'o', 'g', '\022', 'B', '\n',
-'\t', 'w', 'a', 't', 'c', 'h', 'd', 'o', 'g', 's', '\030', '\033', ' ', '\001', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.',
-'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '3', '.', 'W', 'a', 't', 'c', 'h',
-'d', 'o', 'g', 's', 'R', '\t', 'w', 'a', 't', 'c', 'h', 'd', 'o', 'g', 's', '\022', '<', '\n', '\007', 't', 'r', 'a', 'c', 'i', 'n',
-'g', '\030', '\t', ' ', '\001', '(', '\013', '2', '\036', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 't', 'r',
-'a', 'c', 'e', '.', 'v', '3', '.', 'T', 'r', 'a', 'c', 'i', 'n', 'g', 'B', '\002', '\030', '\001', 'R', '\007', 't', 'r', 'a', 'c', 'i',
-'n', 'g', '\022', 'R', '\n', '\017', 'l', 'a', 'y', 'e', 'r', 'e', 'd', '_', 'r', 'u', 'n', 't', 'i', 'm', 'e', '\030', '\021', ' ', '\001',
-'(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r',
-'a', 'p', '.', 'v', '3', '.', 'L', 'a', 'y', 'e', 'r', 'e', 'd', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'R', '\016', 'l', 'a', 'y',
-'e', 'r', 'e', 'd', 'R', 'u', 'n', 't', 'i', 'm', 'e', '\022', '6', '\n', '\005', 'a', 'd', 'm', 'i', 'n', '\030', '\014', ' ', '\001', '(',
-'\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a',
-'p', '.', 'v', '3', '.', 'A', 'd', 'm', 'i', 'n', 'R', '\005', 'a', 'd', 'm', 'i', 'n', '\022', 'd', '\n', '\020', 'o', 'v', 'e', 'r',
-'l', 'o', 'a', 'd', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '\030', '\017', ' ', '\001', '(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o',
-'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'o', 'v', 'e', 'r', 'l', 'o', 'a', 'd', '.', 'v', '3', '.', 'O', 'v', 'e', 'r',
-'l', 'o', 'a', 'd', 'M', 'a', 'n', 'a', 'g', 'e', 'r', 'B', '\016', '\212', '\223', '\267', '*', '\002', '\010', '\001', '\212', '\223', '\267', '*', '\002',
-'\020', '\001', 'R', '\017', 'o', 'v', 'e', 'r', 'l', 'o', 'a', 'd', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '\022', '6', '\n', '\027', 'e', 'n',
-'a', 'b', 'l', 'e', '_', 'd', 'i', 's', 'p', 'a', 't', 'c', 'h', 'e', 'r', '_', 's', 't', 'a', 't', 's', '\030', '\020', ' ', '\001',
-'(', '\010', 'R', '\025', 'e', 'n', 'a', 'b', 'l', 'e', 'D', 'i', 's', 'p', 'a', 't', 'c', 'h', 'e', 'r', 'S', 't', 'a', 't', 's',
-'\022', '#', '\n', '\r', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'p', 'r', 'e', 'f', 'i', 'x', '\030', '\022', ' ', '\001', '(', '\t', 'R', '\014',
-'h', 'e', 'a', 'd', 'e', 'r', 'P', 'r', 'e', 'f', 'i', 'x', '\022', '_', '\n', '\035', 's', 't', 'a', 't', 's', '_', 's', 'e', 'r',
-'v', 'e', 'r', '_', 'v', 'e', 'r', 's', 'i', 'o', 'n', '_', 'o', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '\030', '\023', ' ', '\001', '(',
-'\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '6',
-'4', 'V', 'a', 'l', 'u', 'e', 'R', '\032', 's', 't', 'a', 't', 's', 'S', 'e', 'r', 'v', 'e', 'r', 'V', 'e', 'r', 's', 'i', 'o',
-'n', 'O', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '\022', '4', '\n', '\027', 'u', 's', 'e', '_', 't', 'c', 'p', '_', 'f', 'o', 'r', '_',
-'d', 'n', 's', '_', 'l', 'o', 'o', 'k', 'u', 'p', 's', '\030', '\024', ' ', '\001', '(', '\010', 'R', '\023', 'u', 's', 'e', 'T', 'c', 'p',
-'F', 'o', 'r', 'D', 'n', 's', 'L', 'o', 'o', 'k', 'u', 'p', 's', '\022', ']', '\n', '\024', 'b', 'o', 'o', 't', 's', 't', 'r', 'a',
-'p', '_', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '\030', '\025', ' ', '\003', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o',
-'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't',
-'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\023', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', 'E', 'x',
-'t', 'e', 'n', 's', 'i', 'o', 'n', 's', '\022', 'K', '\n', '\r', 'f', 'a', 't', 'a', 'l', '_', 'a', 'c', 't', 'i', 'o', 'n', 's',
-'\030', '\034', ' ', '\003', '(', '\013', '2', '&', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o',
-'t', 's', 't', 'r', 'a', 'p', '.', 'v', '3', '.', 'F', 'a', 't', 'a', 'l', 'A', 'c', 't', 'i', 'o', 'n', 'R', '\014', 'f', 'a',
-'t', 'a', 'l', 'A', 'c', 't', 'i', 'o', 'n', 's', '\022', 'I', '\n', '\016', 'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'o', 'u', 'r',
-'c', 'e', 's', '\030', '\026', ' ', '\003', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
-'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\r', 'c', 'o', 'n',
-'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 's', '\022', 'V', '\n', '\025', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 'c', 'o', 'n',
-'f', 'i', 'g', '_', 's', 'o', 'u', 'r', 'c', 'e', '\030', '\027', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.',
-'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r',
-'c', 'e', 'R', '\023', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', '\022', '8',
-'\n', '\030', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 's', 'o', 'c', 'k', 'e', 't', '_', 'i', 'n', 't', 'e', 'r', 'f', 'a', 'c',
-'e', '\030', '\030', ' ', '\001', '(', '\t', 'R', '\026', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'S', 'o', 'c', 'k', 'e', 't', 'I', 'n', 't',
-'e', 'r', 'f', 'a', 'c', 'e', '\022', '\214', '\001', '\n', '\036', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 'p', 'r',
-'o', 'v', 'i', 'd', 'e', 'r', '_', 'i', 'n', 's', 't', 'a', 'n', 'c', 'e', 's', '\030', '\031', ' ', '\003', '(', '\013', '2', 'F', '.',
+'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '3', '\032', ')', 'e', 'n', 'v',
+'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '/', 'v', '3', '/', 'a', 'c',
+'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '%', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f',
+'i', 'g', '/', 'c', 'l', 'u', 's', 't', 'e', 'r', '/', 'v', '3', '/', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'p', 'r', 'o',
+'t', 'o', '\032', '\"', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/',
+'a', 'd', 'd', 'r', 'e', 's', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\037', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f',
+'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'b', 'a', 's', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '(', 'e', 'n',
+'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'c', 'o', 'n', 'f', 'i', 'g',
+'_', 's', 'o', 'u', 'r', 'c', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '/', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f',
+'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'e', 'v', 'e', 'n', 't', '_', 's', 'e', 'r', 'v', 'i', 'c', 'e', '_',
+'c', 'o', 'n', 'f', 'i', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '$', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i',
+'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o',
+'\032', '#', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'r', 'e',
+'s', 'o', 'l', 'v', 'e', 'r', '.', 'p', 'r', 'o', 't', 'o', '\032', '(', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i',
+'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 's', 'o', 'c', 'k', 'e', 't', '_', 'o', 'p', 't', 'i', 'o', 'n', '.', 'p',
+'r', 'o', 't', 'o', '\032', '\'', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'l', 'i', 's', 't', 'e', 'n',
+'e', 'r', '/', 'v', '3', '/', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'p', 'r', 'o', 't', 'o', '\032', '#', 'e', 'n', 'v',
+'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'm', 'e', 't', 'r', 'i', 'c', 's', '/', 'v', '3', '/', 's', 't', 'a', 't',
+'s', '.', 'p', 'r', 'o', 't', 'o', '\032', '\'', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'o', 'v', 'e',
+'r', 'l', 'o', 'a', 'd', '/', 'v', '3', '/', 'o', 'v', 'e', 'r', 'l', 'o', 'a', 'd', '.', 'p', 'r', 'o', 't', 'o', '\032', '\'',
+'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 't', 'r', 'a', 'c', 'e', '/', 'v', '3', '/', 'h', 't', 't',
+'p', '_', 't', 'r', 'a', 'c', 'e', 'r', '.', 'p', 'r', 'o', 't', 'o', '\032', '6', 'e', 'n', 'v', 'o', 'y', '/', 'e', 'x', 't',
+'e', 'n', 's', 'i', 'o', 'n', 's', '/', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's',
+'/', 't', 'l', 's', '/', 'v', '3', '/', 's', 'e', 'c', 'r', 'e', 't', '.', 'p', 'r', 'o', 't', 'o', '\032', '\033', 'e', 'n', 'v',
+'o', 'y', '/', 't', 'y', 'p', 'e', '/', 'v', '3', '/', 'p', 'e', 'r', 'c', 'e', 'n', 't', '.', 'p', 'r', 'o', 't', 'o', '\032',
+'\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n',
+'.', 'p', 'r', 'o', 't', 'o', '\032', '\034', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 's',
+'t', 'r', 'u', 'c', 't', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o',
+'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '#', 'e', 'n', 'v', 'o', 'y',
+'/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'd', 'e', 'p', 'r', 'e', 'c', 'a', 't', 'i', 'o', 'n', '.',
+'p', 'r', 'o', 't', 'o', '\032', '\036', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'm',
+'i', 'g', 'r', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\037', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a',
+'t', 'i', 'o', 'n', 's', '/', 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p',
+'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't',
+'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i',
+'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l',
+'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\234', '\031', '\n', '\t', 'B', 'o', 'o', 't', 's', 't', 'r', 'a', 'p',
+'\022', '.', '\n', '\004', 'n', 'o', 'd', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\032', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
+'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'N', 'o', 'd', 'e', 'R', '\004', 'n', 'o', 'd', 'e', '\022', '.',
+'\n', '\023', 'n', 'o', 'd', 'e', '_', 'c', 'o', 'n', 't', 'e', 'x', 't', '_', 'p', 'a', 'r', 'a', 'm', 's', '\030', '\032', ' ', '\003',
+'(', '\t', 'R', '\021', 'n', 'o', 'd', 'e', 'C', 'o', 'n', 't', 'e', 'x', 't', 'P', 'a', 'r', 'a', 'm', 's', '\022', '_', '\n', '\020',
+'s', 't', 'a', 't', 'i', 'c', '_', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', '\030', '\002', ' ', '\001', '(', '\013', '2', '4', '.',
'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '3',
-'.', 'B', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'P', 'r', 'o',
-'v', 'i', 'd', 'e', 'r', 'I', 'n', 's', 't', 'a', 'n', 'c', 'e', 's', 'E', 'n', 't', 'r', 'y', 'R', '\034', 'c', 'e', 'r', 't',
-'i', 'f', 'i', 'c', 'a', 't', 'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 'I', 'n', 's', 't', 'a', 'n', 'c', 'e', 's', '\032',
-'\232', '\002', '\n', '\017', 'S', 't', 'a', 't', 'i', 'c', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', '\022', '@', '\n', '\t', 'l', 'i',
-'s', 't', 'e', 'n', 'e', 'r', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
-'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'R',
-'\t', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', 's', '\022', '<', '\n', '\010', 'c', 'l', 'u', 's', 't', 'e', 'r', 's', '\030', '\002', ' ',
-'\003', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e',
-'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'R', '\010', 'c', 'l', 'u', 's', 't', 'e', 'r', 's', '\022', 'K', '\n',
-'\007', 's', 'e', 'c', 'r', 'e', 't', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', '1', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x',
-'t', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't',
-'s', '.', 't', 'l', 's', '.', 'v', '3', '.', 'S', 'e', 'c', 'r', 'e', 't', 'R', '\007', 's', 'e', 'c', 'r', 'e', 't', 's', ':',
-':', '\232', '\305', '\210', '\036', '5', '\n', '3', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't',
-'s', 't', 'r', 'a', 'p', '.', 'v', '2', '.', 'B', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'S', 't', 'a', 't', 'i', 'c',
-'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', '\032', '\211', '\003', '\n', '\020', 'D', 'y', 'n', 'a', 'm', 'i', 'c', 'R', 'e', 's', 'o',
-'u', 'r', 'c', 'e', 's', '\022', 'A', '\n', '\n', 'l', 'd', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\001', ' ', '\001', '(', '\013',
-'2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C',
-'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\t', 'l', 'd', 's', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '2', '\n',
-'\025', 'l', 'd', 's', '_', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', '_', 'l', 'o', 'c', 'a', 't', 'o', 'r', '\030', '\005', ' ',
-'\001', '(', '\t', 'R', '\023', 'l', 'd', 's', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', 'L', 'o', 'c', 'a', 't', 'o', 'r', '\022',
-'A', '\n', '\n', 'c', 'd', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\002', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v',
-'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S',
-'o', 'u', 'r', 'c', 'e', 'R', '\t', 'c', 'd', 's', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '2', '\n', '\025', 'c', 'd', 's', '_', 'r',
-'e', 's', 'o', 'u', 'r', 'c', 'e', 's', '_', 'l', 'o', 'c', 'a', 't', 'o', 'r', '\030', '\006', ' ', '\001', '(', '\t', 'R', '\023', 'c',
-'d', 's', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', 'L', 'o', 'c', 'a', 't', 'o', 'r', '\022', 'D', '\n', '\n', 'a', 'd', 's',
-'_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
-'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'A', 'p', 'i', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r',
-'c', 'e', 'R', '\t', 'a', 'd', 's', 'C', 'o', 'n', 'f', 'i', 'g', ':', ';', '\232', '\305', '\210', '\036', '6', '\n', '4', 'e', 'n', 'v',
-'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '2', '.', 'B', 'o',
-'o', 't', 's', 't', 'r', 'a', 'p', '.', 'D', 'y', 'n', 'a', 'm', 'i', 'c', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', 'J',
-'\004', '\010', '\004', '\020', '\005', '\032', '{', '\n', '!', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'P', 'r', 'o', 'v', 'i',
-'d', 'e', 'r', 'I', 'n', 's', 't', 'a', 'n', 'c', 'e', 's', 'E', 'n', 't', 'r', 'y', '\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030',
-'\001', ' ', '\001', '(', '\t', 'R', '\003', 'k', 'e', 'y', '\022', '@', '\n', '\005', 'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\013',
-'2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T',
-'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\005', 'v', 'a', 'l', 'u',
-'e', ':', '\002', '8', '\001', ':', '*', '\232', '\305', '\210', '\036', '%', '\n', '#', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
-'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '2', '.', 'B', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', 'B',
-'\r', '\n', '\013', 's', 't', 'a', 't', 's', '_', 'f', 'l', 'u', 's', 'h', 'J', '\004', '\010', '\n', '\020', '\013', 'J', '\004', '\010', '\013', '\020',
-'\014', 'R', '\007', 'r', 'u', 'n', 't', 'i', 'm', 'e', '\"', '\376', '\001', '\n', '\005', 'A', 'd', 'm', 'i', 'n', '\022', '&', '\n', '\017', 'a',
-'c', 'c', 'e', 's', 's', '_', 'l', 'o', 'g', '_', 'p', 'a', 't', 'h', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\r', 'a', 'c', 'c',
-'e', 's', 's', 'L', 'o', 'g', 'P', 'a', 't', 'h', '\022', '!', '\n', '\014', 'p', 'r', 'o', 'f', 'i', 'l', 'e', '_', 'p', 'a', 't',
-'h', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\013', 'p', 'r', 'o', 'f', 'i', 'l', 'e', 'P', 'a', 't', 'h', '\022', '7', '\n', '\007', 'a',
-'d', 'd', 'r', 'e', 's', 's', '\030', '\003', ' ', '\001', '(', '\013', '2', '\035', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'A', 'd', 'd', 'r', 'e', 's', 's', 'R', '\007', 'a', 'd', 'd', 'r', 'e',
-'s', 's', '\022', 'I', '\n', '\016', 's', 'o', 'c', 'k', 'e', 't', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '\004', ' ', '\003', '(',
+'.', 'B', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'S', 't', 'a', 't', 'i', 'c', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e',
+'s', 'R', '\017', 's', 't', 'a', 't', 'i', 'c', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', '\022', 'b', '\n', '\021', 'd', 'y', 'n',
+'a', 'm', 'i', 'c', '_', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', '\030', '\003', ' ', '\001', '(', '\013', '2', '5', '.', 'e', 'n',
+'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '3', '.', 'B',
+'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'D', 'y', 'n', 'a', 'm', 'i', 'c', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's',
+'R', '\020', 'd', 'y', 'n', 'a', 'm', 'i', 'c', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', '\022', 'R', '\n', '\017', 'c', 'l', 'u',
+'s', 't', 'e', 'r', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '\030', '\004', ' ', '\001', '(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o',
+'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '3', '.', 'C', 'l', 'u',
+'s', 't', 'e', 'r', 'M', 'a', 'n', 'a', 'g', 'e', 'r', 'R', '\016', 'c', 'l', 'u', 's', 't', 'e', 'r', 'M', 'a', 'n', 'a', 'g',
+'e', 'r', '\022', 'D', '\n', '\n', 'h', 'd', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\016', ' ', '\001', '(', '\013', '2', '%', '.',
+'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'A', 'p', 'i', 'C',
+'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\t', 'h', 'd', 's', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '\035', '\n',
+'\n', 'f', 'l', 'a', 'g', 's', '_', 'p', 'a', 't', 'h', '\030', '\005', ' ', '\001', '(', '\t', 'R', '\t', 'f', 'l', 'a', 'g', 's', 'P',
+'a', 't', 'h', '\022', 'C', '\n', '\013', 's', 't', 'a', 't', 's', '_', 's', 'i', 'n', 'k', 's', '\030', '\006', ' ', '\003', '(', '\013', '2',
+'\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'm', 'e', 't', 'r', 'i', 'c', 's', '.', 'v', '3',
+'.', 'S', 't', 'a', 't', 's', 'S', 'i', 'n', 'k', 'R', '\n', 's', 't', 'a', 't', 's', 'S', 'i', 'n', 'k', 's', '\022', 'G', '\n',
+'\014', 's', 't', 'a', 't', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\r', ' ', '\001', '(', '\013', '2', '$', '.', 'e', 'n', 'v',
+'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'm', 'e', 't', 'r', 'i', 'c', 's', '.', 'v', '3', '.', 'S', 't', 'a', 't',
+'s', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\013', 's', 't', 'a', 't', 's', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'q', '\n', '\024', 's',
+'t', 'a', 't', 's', '_', 'f', 'l', 'u', 's', 'h', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\007', ' ', '\001', '(', '\013',
+'2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i',
+'o', 'n', 'B', '$', '\372', 'B', '\016', '\252', '\001', '\013', '\032', '\003', '\010', '\254', '\002', '2', '\004', '\020', '\300', '\204', '=', '\362', '\230', '\376', '\217',
+'\005', '\r', '\022', '\013', 's', 't', 'a', 't', 's', '_', 'f', 'l', 'u', 's', 'h', 'R', '\022', 's', 't', 'a', 't', 's', 'F', 'l', 'u',
+'s', 'h', 'I', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\022', ':', '\n', '\024', 's', 't', 'a', 't', 's', '_', 'f', 'l', 'u', 's', 'h',
+'_', 'o', 'n', '_', 'a', 'd', 'm', 'i', 'n', '\030', '\035', ' ', '\001', '(', '\010', 'B', '\007', '\372', 'B', '\004', 'j', '\002', '\010', '\001', 'H',
+'\000', 'R', '\021', 's', 't', 'a', 't', 's', 'F', 'l', 'u', 's', 'h', 'O', 'n', 'A', 'd', 'm', 'i', 'n', '\022', 'L', '\n', '\010', 'w',
+'a', 't', 'c', 'h', 'd', 'o', 'g', '\030', '\010', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
+'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '3', '.', 'W', 'a', 't', 'c', 'h', 'd', 'o', 'g',
+'B', '\013', '\030', '\001', '\222', '\307', '\206', '\330', '\004', '\003', '3', '.', '0', 'R', '\010', 'w', 'a', 't', 'c', 'h', 'd', 'o', 'g', '\022', 'B',
+'\n', '\t', 'w', 'a', 't', 'c', 'h', 'd', 'o', 'g', 's', '\030', '\033', ' ', '\001', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y',
+'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '3', '.', 'W', 'a', 't', 'c',
+'h', 'd', 'o', 'g', 's', 'R', '\t', 'w', 'a', 't', 'c', 'h', 'd', 'o', 'g', 's', '\022', 'E', '\n', '\007', 't', 'r', 'a', 'c', 'i',
+'n', 'g', '\030', '\t', ' ', '\001', '(', '\013', '2', '\036', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 't',
+'r', 'a', 'c', 'e', '.', 'v', '3', '.', 'T', 'r', 'a', 'c', 'i', 'n', 'g', 'B', '\013', '\030', '\001', '\222', '\307', '\206', '\330', '\004', '\003',
+'3', '.', '0', 'R', '\007', 't', 'r', 'a', 'c', 'i', 'n', 'g', '\022', 'R', '\n', '\017', 'l', 'a', 'y', 'e', 'r', 'e', 'd', '_', 'r',
+'u', 'n', 't', 'i', 'm', 'e', '\030', '\021', ' ', '\001', '(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
+'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '3', '.', 'L', 'a', 'y', 'e', 'r', 'e', 'd', 'R', 'u',
+'n', 't', 'i', 'm', 'e', 'R', '\016', 'l', 'a', 'y', 'e', 'r', 'e', 'd', 'R', 'u', 'n', 't', 'i', 'm', 'e', '\022', '6', '\n', '\005',
+'a', 'd', 'm', 'i', 'n', '\030', '\014', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '3', '.', 'A', 'd', 'm', 'i', 'n', 'R', '\005', 'a', 'd', 'm',
+'i', 'n', '\022', 'd', '\n', '\020', 'o', 'v', 'e', 'r', 'l', 'o', 'a', 'd', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '\030', '\017', ' ',
+'\001', '(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'o', 'v', 'e', 'r', 'l', 'o',
+'a', 'd', '.', 'v', '3', '.', 'O', 'v', 'e', 'r', 'l', 'o', 'a', 'd', 'M', 'a', 'n', 'a', 'g', 'e', 'r', 'B', '\016', '\212', '\223',
+'\267', '*', '\002', '\010', '\001', '\212', '\223', '\267', '*', '\002', '\020', '\001', 'R', '\017', 'o', 'v', 'e', 'r', 'l', 'o', 'a', 'd', 'M', 'a', 'n',
+'a', 'g', 'e', 'r', '\022', '6', '\n', '\027', 'e', 'n', 'a', 'b', 'l', 'e', '_', 'd', 'i', 's', 'p', 'a', 't', 'c', 'h', 'e', 'r',
+'_', 's', 't', 'a', 't', 's', '\030', '\020', ' ', '\001', '(', '\010', 'R', '\025', 'e', 'n', 'a', 'b', 'l', 'e', 'D', 'i', 's', 'p', 'a',
+'t', 'c', 'h', 'e', 'r', 'S', 't', 'a', 't', 's', '\022', '#', '\n', '\r', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'p', 'r', 'e', 'f',
+'i', 'x', '\030', '\022', ' ', '\001', '(', '\t', 'R', '\014', 'h', 'e', 'a', 'd', 'e', 'r', 'P', 'r', 'e', 'f', 'i', 'x', '\022', '_', '\n',
+'\035', 's', 't', 'a', 't', 's', '_', 's', 'e', 'r', 'v', 'e', 'r', '_', 'v', 'e', 'r', 's', 'i', 'o', 'n', '_', 'o', 'v', 'e',
+'r', 'r', 'i', 'd', 'e', '\030', '\023', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't',
+'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '6', '4', 'V', 'a', 'l', 'u', 'e', 'R', '\032', 's', 't', 'a', 't', 's', 'S', 'e',
+'r', 'v', 'e', 'r', 'V', 'e', 'r', 's', 'i', 'o', 'n', 'O', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '\022', 'A', '\n', '\027', 'u', 's',
+'e', '_', 't', 'c', 'p', '_', 'f', 'o', 'r', '_', 'd', 'n', 's', '_', 'l', 'o', 'o', 'k', 'u', 'p', 's', '\030', '\024', ' ', '\001',
+'(', '\010', 'B', '\013', '\030', '\001', '\222', '\307', '\206', '\330', '\004', '\003', '3', '.', '0', 'R', '\023', 'u', 's', 'e', 'T', 'c', 'p', 'F', 'o',
+'r', 'D', 'n', 's', 'L', 'o', 'o', 'k', 'u', 'p', 's', '\022', ']', '\n', '\025', 'd', 'n', 's', '_', 'r', 'e', 's', 'o', 'l', 'u',
+'t', 'i', 'o', 'n', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\036', ' ', '\001', '(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o', 'y',
+'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D', 'n', 's', 'R', 'e', 's', 'o', 'l', 'u',
+'t', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\023', 'd', 'n', 's', 'R', 'e', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n',
+'C', 'o', 'n', 'f', 'i', 'g', '\022', 'e', '\n', '\031', 't', 'y', 'p', 'e', 'd', '_', 'd', 'n', 's', '_', 'r', 'e', 's', 'o', 'l',
+'v', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\037', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.',
+'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n',
+'s', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\026', 't', 'y', 'p', 'e', 'd', 'D', 'n', 's', 'R', 'e', 's', 'o', 'l',
+'v', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\022', ']', '\n', '\024', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '_', 'e', 'x',
+'t', 'e', 'n', 's', 'i', 'o', 'n', 's', '\030', '\025', ' ', '\003', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
+'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i',
+'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\023', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', 'E', 'x', 't', 'e', 'n', 's',
+'i', 'o', 'n', 's', '\022', 'K', '\n', '\r', 'f', 'a', 't', 'a', 'l', '_', 'a', 'c', 't', 'i', 'o', 'n', 's', '\030', '\034', ' ', '\003',
+'(', '\013', '2', '&', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r',
+'a', 'p', '.', 'v', '3', '.', 'F', 'a', 't', 'a', 'l', 'A', 'c', 't', 'i', 'o', 'n', 'R', '\014', 'f', 'a', 't', 'a', 'l', 'A',
+'c', 't', 'i', 'o', 'n', 's', '\022', 'I', '\n', '\016', 'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'o', 'u', 'r', 'c', 'e', 's', '\030',
+'\026', ' ', '\003', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e',
+'.', 'v', '3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\r', 'c', 'o', 'n', 'f', 'i', 'g', 'S',
+'o', 'u', 'r', 'c', 'e', 's', '\022', 'V', '\n', '\025', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 'c', 'o', 'n', 'f', 'i', 'g', '_',
+'s', 'o', 'u', 'r', 'c', 'e', '\030', '\027', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
+'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\023',
+'d', 'e', 'f', 'a', 'u', 'l', 't', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', '\022', '8', '\n', '\030', 'd', 'e',
+'f', 'a', 'u', 'l', 't', '_', 's', 'o', 'c', 'k', 'e', 't', '_', 'i', 'n', 't', 'e', 'r', 'f', 'a', 'c', 'e', '\030', '\030', ' ',
+'\001', '(', '\t', 'R', '\026', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'S', 'o', 'c', 'k', 'e', 't', 'I', 'n', 't', 'e', 'r', 'f', 'a',
+'c', 'e', '\022', '\214', '\001', '\n', '\036', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 'p', 'r', 'o', 'v', 'i', 'd',
+'e', 'r', '_', 'i', 'n', 's', 't', 'a', 'n', 'c', 'e', 's', '\030', '\031', ' ', '\003', '(', '\013', '2', 'F', '.', 'e', 'n', 'v', 'o',
+'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '3', '.', 'B', 'o', 'o',
+'t', 's', 't', 'r', 'a', 'p', '.', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e',
+'r', 'I', 'n', 's', 't', 'a', 'n', 'c', 'e', 's', 'E', 'n', 't', 'r', 'y', 'R', '\034', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c',
+'a', 't', 'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 'I', 'n', 's', 't', 'a', 'n', 'c', 'e', 's', '\022', 'T', '\n', '\016', 'i',
+'n', 'l', 'i', 'n', 'e', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', ' ', ' ', '\003', '(', '\013', '2', '-', '.', 'e', 'n', 'v',
+'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '3', '.', 'C', 'u',
+'s', 't', 'o', 'm', 'I', 'n', 'l', 'i', 'n', 'e', 'H', 'e', 'a', 'd', 'e', 'r', 'R', '\r', 'i', 'n', 'l', 'i', 'n', 'e', 'H',
+'e', 'a', 'd', 'e', 'r', 's', '\032', '\232', '\002', '\n', '\017', 'S', 't', 'a', 't', 'i', 'c', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e',
+'s', '\022', '@', '\n', '\t', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', '\"', '.', 'e', 'n',
+'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i',
+'s', 't', 'e', 'n', 'e', 'r', 'R', '\t', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', 's', '\022', '<', '\n', '\010', 'c', 'l', 'u', 's',
+'t', 'e', 'r', 's', '\030', '\002', ' ', '\003', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
+'.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'R', '\010', 'c', 'l', 'u', 's',
+'t', 'e', 'r', 's', '\022', 'K', '\n', '\007', 's', 'e', 'c', 'r', 'e', 't', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', '1', '.', 'e',
+'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't',
+'_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'S', 'e', 'c', 'r', 'e', 't', 'R', '\007', 's',
+'e', 'c', 'r', 'e', 't', 's', ':', ':', '\232', '\305', '\210', '\036', '5', '\n', '3', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
+'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '2', '.', 'B', 'o', 'o', 't', 's', 't', 'r', 'a', 'p',
+'.', 'S', 't', 'a', 't', 'i', 'c', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', '\032', '\211', '\003', '\n', '\020', 'D', 'y', 'n', 'a',
+'m', 'i', 'c', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', '\022', 'A', '\n', '\n', 'l', 'd', 's', '_', 'c', 'o', 'n', 'f', 'i',
+'g', '\030', '\001', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o',
+'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\t', 'l', 'd', 's', 'C', 'o',
+'n', 'f', 'i', 'g', '\022', '2', '\n', '\025', 'l', 'd', 's', '_', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', '_', 'l', 'o', 'c',
+'a', 't', 'o', 'r', '\030', '\005', ' ', '\001', '(', '\t', 'R', '\023', 'l', 'd', 's', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', 'L',
+'o', 'c', 'a', 't', 'o', 'r', '\022', 'A', '\n', '\n', 'c', 'd', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\002', ' ', '\001', '(',
'\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.',
-'S', 'o', 'c', 'k', 'e', 't', 'O', 'p', 't', 'i', 'o', 'n', 'R', '\r', 's', 'o', 'c', 'k', 'e', 't', 'O', 'p', 't', 'i', 'o',
-'n', 's', ':', '&', '\232', '\305', '\210', '\036', '!', '\n', '\037', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b',
-'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '2', '.', 'A', 'd', 'm', 'i', 'n', '\"', '\313', '\004', '\n', '\016', 'C', 'l', 'u',
-'s', 't', 'e', 'r', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '\022', ',', '\n', '\022', 'l', 'o', 'c', 'a', 'l', '_', 'c', 'l', 'u', 's',
-'t', 'e', 'r', '_', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\020', 'l', 'o', 'c', 'a', 'l', 'C', 'l', 'u', 's',
-'t', 'e', 'r', 'N', 'a', 'm', 'e', '\022', 'g', '\n', '\021', 'o', 'u', 't', 'l', 'i', 'e', 'r', '_', 'd', 'e', 't', 'e', 'c', 't',
-'i', 'o', 'n', '\030', '\002', ' ', '\001', '(', '\013', '2', ':', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
-'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'M', 'a', 'n', 'a', 'g',
-'e', 'r', '.', 'O', 'u', 't', 'l', 'i', 'e', 'r', 'D', 'e', 't', 'e', 'c', 't', 'i', 'o', 'n', 'R', '\020', 'o', 'u', 't', 'l',
-'i', 'e', 'r', 'D', 'e', 't', 'e', 'c', 't', 'i', 'o', 'n', '\022', 'R', '\n', '\024', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', '_',
-'b', 'i', 'n', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'B', 'i', 'n', 'd', 'C', 'o', 'n', 'f', 'i',
-'g', 'R', '\022', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', 'B', 'i', 'n', 'd', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'Q', '\n', '\021',
-'l', 'o', 'a', 'd', '_', 's', 't', 'a', 't', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\004', ' ', '\001', '(', '\013', '2', '%',
-'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'A', 'p', 'i',
-'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\017', 'l', 'o', 'a', 'd', 'S', 't', 'a', 't', 's', 'C', 'o',
-'n', 'f', 'i', 'g', '\032', '\311', '\001', '\n', '\020', 'O', 'u', 't', 'l', 'i', 'e', 'r', 'D', 'e', 't', 'e', 'c', 't', 'i', 'o', 'n',
-'\022', '$', '\n', '\016', 'e', 'v', 'e', 'n', 't', '_', 'l', 'o', 'g', '_', 'p', 'a', 't', 'h', '\030', '\001', ' ', '\001', '(', '\t', 'R',
-'\014', 'e', 'v', 'e', 'n', 't', 'L', 'o', 'g', 'P', 'a', 't', 'h', '\022', 'M', '\n', '\r', 'e', 'v', 'e', 'n', 't', '_', 's', 'e',
-'r', 'v', 'i', 'c', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '(', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
-'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'E', 'v', 'e', 'n', 't', 'S', 'e', 'r', 'v', 'i', 'c', 'e', 'C', 'o', 'n',
-'f', 'i', 'g', 'R', '\014', 'e', 'v', 'e', 'n', 't', 'S', 'e', 'r', 'v', 'i', 'c', 'e', ':', '@', '\232', '\305', '\210', '\036', ';', '\n',
-'9', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v',
-'2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'O', 'u', 't', 'l', 'i', 'e', 'r', 'D',
-'e', 't', 'e', 'c', 't', 'i', 'o', 'n', ':', '/', '\232', '\305', '\210', '\036', '*', '\n', '(', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
-'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r',
-'M', 'a', 'n', 'a', 'g', 'e', 'r', '\"', '\260', '\001', '\n', '\t', 'W', 'a', 't', 'c', 'h', 'd', 'o', 'g', 's', '\022', 'U', '\n', '\024',
-'m', 'a', 'i', 'n', '_', 't', 'h', 'r', 'e', 'a', 'd', '_', 'w', 'a', 't', 'c', 'h', 'd', 'o', 'g', '\030', '\001', ' ', '\001', '(',
-'\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a',
-'p', '.', 'v', '3', '.', 'W', 'a', 't', 'c', 'h', 'd', 'o', 'g', 'R', '\022', 'm', 'a', 'i', 'n', 'T', 'h', 'r', 'e', 'a', 'd',
-'W', 'a', 't', 'c', 'h', 'd', 'o', 'g', '\022', 'L', '\n', '\017', 'w', 'o', 'r', 'k', 'e', 'r', '_', 'w', 'a', 't', 'c', 'h', 'd',
-'o', 'g', '\030', '\002', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b',
-'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '3', '.', 'W', 'a', 't', 'c', 'h', 'd', 'o', 'g', 'R', '\016', 'w', 'o', 'r',
-'k', 'e', 'r', 'W', 'a', 't', 'c', 'h', 'd', 'o', 'g', '\"', '\272', '\006', '\n', '\010', 'W', 'a', 't', 'c', 'h', 'd', 'o', 'g', '\022',
-'L', '\n', '\007', 'a', 'c', 't', 'i', 'o', 'n', 's', '\030', '\007', ' ', '\003', '(', '\013', '2', '2', '.', 'e', 'n', 'v', 'o', 'y', '.',
-'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '3', '.', 'W', 'a', 't', 'c', 'h',
-'d', 'o', 'g', '.', 'W', 'a', 't', 'c', 'h', 'd', 'o', 'g', 'A', 'c', 't', 'i', 'o', 'n', 'R', '\007', 'a', 'c', 't', 'i', 'o',
-'n', 's', '\022', '<', '\n', '\014', 'm', 'i', 's', 's', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\001', ' ', '\001', '(', '\013', '2',
-'\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o',
-'n', 'R', '\013', 'm', 'i', 's', 's', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'D', '\n', '\020', 'm', 'e', 'g', 'a', 'm', 'i', 's',
-'s', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\002', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.',
-'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\017', 'm', 'e', 'g', 'a', 'm', 'i',
-'s', 's', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', '<', '\n', '\014', 'k', 'i', 'l', 'l', '_', 't', 'i', 'm', 'e', 'o', 'u', 't',
-'\030', '\003', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.',
-'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\013', 'k', 'i', 'l', 'l', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'Z', '\n', '\027',
-'m', 'a', 'x', '_', 'k', 'i', 'l', 'l', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '_', 'j', 'i', 't', 't', 'e', 'r', '\030', '\006',
+'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\t', 'c', 'd', 's', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '2',
+'\n', '\025', 'c', 'd', 's', '_', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', '_', 'l', 'o', 'c', 'a', 't', 'o', 'r', '\030', '\006',
+' ', '\001', '(', '\t', 'R', '\023', 'c', 'd', 's', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', 'L', 'o', 'c', 'a', 't', 'o', 'r',
+'\022', 'D', '\n', '\n', 'a', 'd', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n',
+'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'A', 'p', 'i', 'C', 'o', 'n',
+'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\t', 'a', 'd', 's', 'C', 'o', 'n', 'f', 'i', 'g', ':', ';', '\232', '\305', '\210',
+'\036', '6', '\n', '4', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a',
+'p', '.', 'v', '2', '.', 'B', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'D', 'y', 'n', 'a', 'm', 'i', 'c', 'R', 'e', 's',
+'o', 'u', 'r', 'c', 'e', 's', 'J', '\004', '\010', '\004', '\020', '\005', '\032', '{', '\n', '!', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a',
+'t', 'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 'I', 'n', 's', 't', 'a', 'n', 'c', 'e', 's', 'E', 'n', 't', 'r', 'y', '\022',
+'\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\003', 'k', 'e', 'y', '\022', '@', '\n', '\005', 'v', 'a', 'l', 'u',
+'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o',
+'r', 'e', '.', 'v', '3', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i',
+'g', 'R', '\005', 'v', 'a', 'l', 'u', 'e', ':', '\002', '8', '\001', ':', '*', '\232', '\305', '\210', '\036', '%', '\n', '#', 'e', 'n', 'v', 'o',
+'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '2', '.', 'B', 'o', 'o',
+'t', 's', 't', 'r', 'a', 'p', 'B', '\r', '\n', '\013', 's', 't', 'a', 't', 's', '_', 'f', 'l', 'u', 's', 'h', 'J', '\004', '\010', '\n',
+'\020', '\013', 'J', '\004', '\010', '\013', '\020', '\014', 'R', '\007', 'r', 'u', 'n', 't', 'i', 'm', 'e', '\"', '\320', '\002', '\n', '\005', 'A', 'd', 'm',
+'i', 'n', '\022', 'C', '\n', '\n', 'a', 'c', 'c', 'e', 's', 's', '_', 'l', 'o', 'g', '\030', '\005', ' ', '\003', '(', '\013', '2', '$', '.',
+'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3',
+'.', 'A', 'c', 'c', 'e', 's', 's', 'L', 'o', 'g', 'R', '\t', 'a', 'c', 'c', 'e', 's', 's', 'L', 'o', 'g', '\022', '3', '\n', '\017',
+'a', 'c', 'c', 'e', 's', 's', '_', 'l', 'o', 'g', '_', 'p', 'a', 't', 'h', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\013', '\030', '\001',
+'\222', '\307', '\206', '\330', '\004', '\003', '3', '.', '0', 'R', '\r', 'a', 'c', 'c', 'e', 's', 's', 'L', 'o', 'g', 'P', 'a', 't', 'h', '\022',
+'!', '\n', '\014', 'p', 'r', 'o', 'f', 'i', 'l', 'e', '_', 'p', 'a', 't', 'h', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\013', 'p', 'r',
+'o', 'f', 'i', 'l', 'e', 'P', 'a', 't', 'h', '\022', '7', '\n', '\007', 'a', 'd', 'd', 'r', 'e', 's', 's', '\030', '\003', ' ', '\001', '(',
+'\013', '2', '\035', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.',
+'A', 'd', 'd', 'r', 'e', 's', 's', 'R', '\007', 'a', 'd', 'd', 'r', 'e', 's', 's', '\022', 'I', '\n', '\016', 's', 'o', 'c', 'k', 'e',
+'t', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '\004', ' ', '\003', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
+'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'S', 'o', 'c', 'k', 'e', 't', 'O', 'p', 't', 'i', 'o',
+'n', 'R', '\r', 's', 'o', 'c', 'k', 'e', 't', 'O', 'p', 't', 'i', 'o', 'n', 's', ':', '&', '\232', '\305', '\210', '\036', '!', '\n', '\037',
+'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '2',
+'.', 'A', 'd', 'm', 'i', 'n', '\"', '\313', '\004', '\n', '\016', 'C', 'l', 'u', 's', 't', 'e', 'r', 'M', 'a', 'n', 'a', 'g', 'e', 'r',
+'\022', ',', '\n', '\022', 'l', 'o', 'c', 'a', 'l', '_', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 'n', 'a', 'm', 'e', '\030', '\001', ' ',
+'\001', '(', '\t', 'R', '\020', 'l', 'o', 'c', 'a', 'l', 'C', 'l', 'u', 's', 't', 'e', 'r', 'N', 'a', 'm', 'e', '\022', 'g', '\n', '\021',
+'o', 'u', 't', 'l', 'i', 'e', 'r', '_', 'd', 'e', 't', 'e', 'c', 't', 'i', 'o', 'n', '\030', '\002', ' ', '\001', '(', '\013', '2', ':',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v',
+'3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'O', 'u', 't', 'l', 'i', 'e', 'r', 'D',
+'e', 't', 'e', 'c', 't', 'i', 'o', 'n', 'R', '\020', 'o', 'u', 't', 'l', 'i', 'e', 'r', 'D', 'e', 't', 'e', 'c', 't', 'i', 'o',
+'n', '\022', 'R', '\n', '\024', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', '_', 'b', 'i', 'n', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g',
+'\030', '\003', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r',
+'e', '.', 'v', '3', '.', 'B', 'i', 'n', 'd', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\022', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm',
+'B', 'i', 'n', 'd', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'Q', '\n', '\021', 'l', 'o', 'a', 'd', '_', 's', 't', 'a', 't', 's', '_',
+'c', 'o', 'n', 'f', 'i', 'g', '\030', '\004', ' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
+'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'A', 'p', 'i', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c',
+'e', 'R', '\017', 'l', 'o', 'a', 'd', 'S', 't', 'a', 't', 's', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\311', '\001', '\n', '\020', 'O', 'u',
+'t', 'l', 'i', 'e', 'r', 'D', 'e', 't', 'e', 'c', 't', 'i', 'o', 'n', '\022', '$', '\n', '\016', 'e', 'v', 'e', 'n', 't', '_', 'l',
+'o', 'g', '_', 'p', 'a', 't', 'h', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\014', 'e', 'v', 'e', 'n', 't', 'L', 'o', 'g', 'P', 'a',
+'t', 'h', '\022', 'M', '\n', '\r', 'e', 'v', 'e', 'n', 't', '_', 's', 'e', 'r', 'v', 'i', 'c', 'e', '\030', '\002', ' ', '\001', '(', '\013',
+'2', '(', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'E',
+'v', 'e', 'n', 't', 'S', 'e', 'r', 'v', 'i', 'c', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\014', 'e', 'v', 'e', 'n', 't', 'S',
+'e', 'r', 'v', 'i', 'c', 'e', ':', '@', '\232', '\305', '\210', '\036', ';', '\n', '9', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
+'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'M', 'a',
+'n', 'a', 'g', 'e', 'r', '.', 'O', 'u', 't', 'l', 'i', 'e', 'r', 'D', 'e', 't', 'e', 'c', 't', 'i', 'o', 'n', ':', '/', '\232',
+'\305', '\210', '\036', '*', '\n', '(', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't',
+'r', 'a', 'p', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '\"', '\260', '\001', '\n',
+'\t', 'W', 'a', 't', 'c', 'h', 'd', 'o', 'g', 's', '\022', 'U', '\n', '\024', 'm', 'a', 'i', 'n', '_', 't', 'h', 'r', 'e', 'a', 'd',
+'_', 'w', 'a', 't', 'c', 'h', 'd', 'o', 'g', '\030', '\001', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
+'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '3', '.', 'W', 'a', 't', 'c', 'h', 'd',
+'o', 'g', 'R', '\022', 'm', 'a', 'i', 'n', 'T', 'h', 'r', 'e', 'a', 'd', 'W', 'a', 't', 'c', 'h', 'd', 'o', 'g', '\022', 'L', '\n',
+'\017', 'w', 'o', 'r', 'k', 'e', 'r', '_', 'w', 'a', 't', 'c', 'h', 'd', 'o', 'g', '\030', '\002', ' ', '\001', '(', '\013', '2', '#', '.',
+'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '3',
+'.', 'W', 'a', 't', 'c', 'h', 'd', 'o', 'g', 'R', '\016', 'w', 'o', 'r', 'k', 'e', 'r', 'W', 'a', 't', 'c', 'h', 'd', 'o', 'g',
+'\"', '\272', '\006', '\n', '\010', 'W', 'a', 't', 'c', 'h', 'd', 'o', 'g', '\022', 'L', '\n', '\007', 'a', 'c', 't', 'i', 'o', 'n', 's', '\030',
+'\007', ' ', '\003', '(', '\013', '2', '2', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't',
+'s', 't', 'r', 'a', 'p', '.', 'v', '3', '.', 'W', 'a', 't', 'c', 'h', 'd', 'o', 'g', '.', 'W', 'a', 't', 'c', 'h', 'd', 'o',
+'g', 'A', 'c', 't', 'i', 'o', 'n', 'R', '\007', 'a', 'c', 't', 'i', 'o', 'n', 's', '\022', '<', '\n', '\014', 'm', 'i', 's', 's', '_',
+'t', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\001', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r',
+'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\013', 'm', 'i', 's', 's', 'T', 'i', 'm', 'e',
+'o', 'u', 't', '\022', 'D', '\n', '\020', 'm', 'e', 'g', 'a', 'm', 'i', 's', 's', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\002',
+' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u',
+'r', 'a', 't', 'i', 'o', 'n', 'R', '\017', 'm', 'e', 'g', 'a', 'm', 'i', 's', 's', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', '<',
+'\n', '\014', 'k', 'i', 'l', 'l', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\003', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o',
+'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\013', 'k',
+'i', 'l', 'l', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'Z', '\n', '\027', 'm', 'a', 'x', '_', 'k', 'i', 'l', 'l', '_', 't', 'i',
+'m', 'e', 'o', 'u', 't', '_', 'j', 'i', 't', 't', 'e', 'r', '\030', '\006', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g',
+'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005',
+'\252', '\001', '\002', '2', '\000', 'R', '\024', 'm', 'a', 'x', 'K', 'i', 'l', 'l', 'T', 'i', 'm', 'e', 'o', 'u', 't', 'J', 'i', 't', 't',
+'e', 'r', '\022', 'F', '\n', '\021', 'm', 'u', 'l', 't', 'i', 'k', 'i', 'l', 'l', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\004',
' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u',
-'r', 'a', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\252', '\001', '\002', '2', '\000', 'R', '\024', 'm', 'a', 'x', 'K', 'i', 'l', 'l',
-'T', 'i', 'm', 'e', 'o', 'u', 't', 'J', 'i', 't', 't', 'e', 'r', '\022', 'F', '\n', '\021', 'm', 'u', 'l', 't', 'i', 'k', 'i', 'l',
-'l', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\004', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.',
-'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\020', 'm', 'u', 'l', 't', 'i', 'k',
-'i', 'l', 'l', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'G', '\n', '\023', 'm', 'u', 'l', 't', 'i', 'k', 'i', 'l', 'l', '_', 't',
-'h', 'r', 'e', 's', 'h', 'o', 'l', 'd', '\030', '\005', ' ', '\001', '(', '\013', '2', '\026', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y',
-'p', 'e', '.', 'v', '3', '.', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\022', 'm', 'u', 'l', 't', 'i', 'k', 'i', 'l', 'l', 'T',
-'h', 'r', 'e', 's', 'h', 'o', 'l', 'd', '\032', '\205', '\002', '\n', '\016', 'W', 'a', 't', 'c', 'h', 'd', 'o', 'g', 'A', 'c', 't', 'i',
-'o', 'n', '\022', 'B', '\n', '\006', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\001', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o',
-'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't',
-'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', '\022', '`', '\n', '\005', 'e',
-'v', 'e', 'n', 't', '\030', '\002', ' ', '\001', '(', '\016', '2', '@', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
-'.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '3', '.', 'W', 'a', 't', 'c', 'h', 'd', 'o', 'g', '.', 'W', 'a',
-'t', 'c', 'h', 'd', 'o', 'g', 'A', 'c', 't', 'i', 'o', 'n', '.', 'W', 'a', 't', 'c', 'h', 'd', 'o', 'g', 'E', 'v', 'e', 'n',
-'t', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\005', 'e', 'v', 'e', 'n', 't', '\"', 'M', '\n', '\r', 'W', 'a', 't',
-'c', 'h', 'd', 'o', 'g', 'E', 'v', 'e', 'n', 't', '\022', '\013', '\n', '\007', 'U', 'N', 'K', 'N', 'O', 'W', 'N', '\020', '\000', '\022', '\010',
-'\n', '\004', 'K', 'I', 'L', 'L', '\020', '\001', '\022', '\r', '\n', '\t', 'M', 'U', 'L', 'T', 'I', 'K', 'I', 'L', 'L', '\020', '\002', '\022', '\014',
-'\n', '\010', 'M', 'E', 'G', 'A', 'M', 'I', 'S', 'S', '\020', '\003', '\022', '\010', '\n', '\004', 'M', 'I', 'S', 'S', '\020', '\004', ':', ')', '\232',
-'\305', '\210', '\036', '$', '\n', '\"', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't',
-'r', 'a', 'p', '.', 'v', '2', '.', 'W', 'a', 't', 'c', 'h', 'd', 'o', 'g', '\"', 'Q', '\n', '\013', 'F', 'a', 't', 'a', 'l', 'A',
-'c', 't', 'i', 'o', 'n', '\022', 'B', '\n', '\006', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\001', ' ', '\001', '(', '\013', '2', '*', '.', 'e',
-'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'y', 'p', 'e', 'd',
-'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', '\"', '\334',
-'\001', '\n', '\007', 'R', 'u', 'n', 't', 'i', 'm', 'e', '\022', '!', '\n', '\014', 's', 'y', 'm', 'l', 'i', 'n', 'k', '_', 'r', 'o', 'o',
-'t', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\013', 's', 'y', 'm', 'l', 'i', 'n', 'k', 'R', 'o', 'o', 't', '\022', '\"', '\n', '\014', 's',
-'u', 'b', 'd', 'i', 'r', 'e', 'c', 't', 'o', 'r', 'y', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\014', 's', 'u', 'b', 'd', 'i', 'r',
-'e', 'c', 't', 'o', 'r', 'y', '\022', '3', '\n', '\025', 'o', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '_', 's', 'u', 'b', 'd', 'i', 'r',
-'e', 'c', 't', 'o', 'r', 'y', '\030', '\003', ' ', '\001', '(', '\t', 'R', '\024', 'o', 'v', 'e', 'r', 'r', 'i', 'd', 'e', 'S', 'u', 'b',
-'d', 'i', 'r', 'e', 'c', 't', 'o', 'r', 'y', '\022', '+', '\n', '\004', 'b', 'a', 's', 'e', '\030', '\004', ' ', '\001', '(', '\013', '2', '\027',
-'.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'S', 't', 'r', 'u', 'c', 't', 'R', '\004',
-'b', 'a', 's', 'e', ':', '(', '\232', '\305', '\210', '\036', '#', '\n', '!', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
-'.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '2', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', '\"', '\333', '\006', '\n',
-'\014', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'L', 'a', 'y', 'e', 'r', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001',
-'(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '<', '\n', '\014', 's', 't', 'a', 't',
-'i', 'c', '_', 'l', 'a', 'y', 'e', 'r', '\030', '\002', ' ', '\001', '(', '\013', '2', '\027', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p',
-'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'S', 't', 'r', 'u', 'c', 't', 'H', '\000', 'R', '\013', 's', 't', 'a', 't', 'i', 'c', 'L',
-'a', 'y', 'e', 'r', '\022', 'R', '\n', '\n', 'd', 'i', 's', 'k', '_', 'l', 'a', 'y', 'e', 'r', '\030', '\003', ' ', '\001', '(', '\013', '2',
-'1', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.',
-'v', '3', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'L', 'a', 'y', 'e', 'r', '.', 'D', 'i', 's', 'k', 'L', 'a', 'y', 'e', 'r',
-'H', '\000', 'R', '\t', 'd', 'i', 's', 'k', 'L', 'a', 'y', 'e', 'r', '\022', 'U', '\n', '\013', 'a', 'd', 'm', 'i', 'n', '_', 'l', 'a',
-'y', 'e', 'r', '\030', '\004', ' ', '\001', '(', '\013', '2', '2', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
+'r', 'a', 't', 'i', 'o', 'n', 'R', '\020', 'm', 'u', 'l', 't', 'i', 'k', 'i', 'l', 'l', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022',
+'G', '\n', '\023', 'm', 'u', 'l', 't', 'i', 'k', 'i', 'l', 'l', '_', 't', 'h', 'r', 'e', 's', 'h', 'o', 'l', 'd', '\030', '\005', ' ',
+'\001', '(', '\013', '2', '\026', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'P', 'e', 'r', 'c', 'e',
+'n', 't', 'R', '\022', 'm', 'u', 'l', 't', 'i', 'k', 'i', 'l', 'l', 'T', 'h', 'r', 'e', 's', 'h', 'o', 'l', 'd', '\032', '\205', '\002',
+'\n', '\016', 'W', 'a', 't', 'c', 'h', 'd', 'o', 'g', 'A', 'c', 't', 'i', 'o', 'n', '\022', 'B', '\n', '\006', 'c', 'o', 'n', 'f', 'i',
+'g', '\030', '\001', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o',
+'r', 'e', '.', 'v', '3', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i',
+'g', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', '\022', '`', '\n', '\005', 'e', 'v', 'e', 'n', 't', '\030', '\002', ' ', '\001', '(', '\016', '2',
+'@', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.',
+'v', '3', '.', 'W', 'a', 't', 'c', 'h', 'd', 'o', 'g', '.', 'W', 'a', 't', 'c', 'h', 'd', 'o', 'g', 'A', 'c', 't', 'i', 'o',
+'n', '.', 'W', 'a', 't', 'c', 'h', 'd', 'o', 'g', 'E', 'v', 'e', 'n', 't', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001',
+'R', '\005', 'e', 'v', 'e', 'n', 't', '\"', 'M', '\n', '\r', 'W', 'a', 't', 'c', 'h', 'd', 'o', 'g', 'E', 'v', 'e', 'n', 't', '\022',
+'\013', '\n', '\007', 'U', 'N', 'K', 'N', 'O', 'W', 'N', '\020', '\000', '\022', '\010', '\n', '\004', 'K', 'I', 'L', 'L', '\020', '\001', '\022', '\r', '\n',
+'\t', 'M', 'U', 'L', 'T', 'I', 'K', 'I', 'L', 'L', '\020', '\002', '\022', '\014', '\n', '\010', 'M', 'E', 'G', 'A', 'M', 'I', 'S', 'S', '\020',
+'\003', '\022', '\010', '\n', '\004', 'M', 'I', 'S', 'S', '\020', '\004', ':', ')', '\232', '\305', '\210', '\036', '$', '\n', '\"', 'e', 'n', 'v', 'o', 'y',
+'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '2', '.', 'W', 'a', 't', 'c',
+'h', 'd', 'o', 'g', '\"', 'Q', '\n', '\013', 'F', 'a', 't', 'a', 'l', 'A', 'c', 't', 'i', 'o', 'n', '\022', 'B', '\n', '\006', 'c', 'o',
+'n', 'f', 'i', 'g', '\030', '\001', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
+'.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o',
+'n', 'f', 'i', 'g', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', '\"', '\334', '\001', '\n', '\007', 'R', 'u', 'n', 't', 'i', 'm', 'e', '\022',
+'!', '\n', '\014', 's', 'y', 'm', 'l', 'i', 'n', 'k', '_', 'r', 'o', 'o', 't', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\013', 's', 'y',
+'m', 'l', 'i', 'n', 'k', 'R', 'o', 'o', 't', '\022', '\"', '\n', '\014', 's', 'u', 'b', 'd', 'i', 'r', 'e', 'c', 't', 'o', 'r', 'y',
+'\030', '\002', ' ', '\001', '(', '\t', 'R', '\014', 's', 'u', 'b', 'd', 'i', 'r', 'e', 'c', 't', 'o', 'r', 'y', '\022', '3', '\n', '\025', 'o',
+'v', 'e', 'r', 'r', 'i', 'd', 'e', '_', 's', 'u', 'b', 'd', 'i', 'r', 'e', 'c', 't', 'o', 'r', 'y', '\030', '\003', ' ', '\001', '(',
+'\t', 'R', '\024', 'o', 'v', 'e', 'r', 'r', 'i', 'd', 'e', 'S', 'u', 'b', 'd', 'i', 'r', 'e', 'c', 't', 'o', 'r', 'y', '\022', '+',
+'\n', '\004', 'b', 'a', 's', 'e', '\030', '\004', ' ', '\001', '(', '\013', '2', '\027', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o',
+'t', 'o', 'b', 'u', 'f', '.', 'S', 't', 'r', 'u', 'c', 't', 'R', '\004', 'b', 'a', 's', 'e', ':', '(', '\232', '\305', '\210', '\036', '#',
+'\n', '!', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.',
+'v', '2', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', '\"', '\333', '\006', '\n', '\014', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'L', 'a', 'y',
+'e', 'r', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001',
+'R', '\004', 'n', 'a', 'm', 'e', '\022', '<', '\n', '\014', 's', 't', 'a', 't', 'i', 'c', '_', 'l', 'a', 'y', 'e', 'r', '\030', '\002', ' ',
+'\001', '(', '\013', '2', '\027', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'S', 't', 'r',
+'u', 'c', 't', 'H', '\000', 'R', '\013', 's', 't', 'a', 't', 'i', 'c', 'L', 'a', 'y', 'e', 'r', '\022', 'R', '\n', '\n', 'd', 'i', 's',
+'k', '_', 'l', 'a', 'y', 'e', 'r', '\030', '\003', ' ', '\001', '(', '\013', '2', '1', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
+'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '3', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'L',
+'a', 'y', 'e', 'r', '.', 'D', 'i', 's', 'k', 'L', 'a', 'y', 'e', 'r', 'H', '\000', 'R', '\t', 'd', 'i', 's', 'k', 'L', 'a', 'y',
+'e', 'r', '\022', 'U', '\n', '\013', 'a', 'd', 'm', 'i', 'n', '_', 'l', 'a', 'y', 'e', 'r', '\030', '\004', ' ', '\001', '(', '\013', '2', '2',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v',
+'3', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'L', 'a', 'y', 'e', 'r', '.', 'A', 'd', 'm', 'i', 'n', 'L', 'a', 'y', 'e', 'r',
+'H', '\000', 'R', '\n', 'a', 'd', 'm', 'i', 'n', 'L', 'a', 'y', 'e', 'r', '\022', 'R', '\n', '\n', 'r', 't', 'd', 's', '_', 'l', 'a',
+'y', 'e', 'r', '\030', '\005', ' ', '\001', '(', '\013', '2', '1', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '3', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'L', 'a', 'y', 'e', 'r',
-'.', 'A', 'd', 'm', 'i', 'n', 'L', 'a', 'y', 'e', 'r', 'H', '\000', 'R', '\n', 'a', 'd', 'm', 'i', 'n', 'L', 'a', 'y', 'e', 'r',
-'\022', 'R', '\n', '\n', 'r', 't', 'd', 's', '_', 'l', 'a', 'y', 'e', 'r', '\030', '\005', ' ', '\001', '(', '\013', '2', '1', '.', 'e', 'n',
-'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '3', '.', 'R',
-'u', 'n', 't', 'i', 'm', 'e', 'L', 'a', 'y', 'e', 'r', '.', 'R', 't', 'd', 's', 'L', 'a', 'y', 'e', 'r', 'H', '\000', 'R', '\t',
-'r', 't', 'd', 's', 'L', 'a', 'y', 'e', 'r', '\032', '\301', '\001', '\n', '\t', 'D', 'i', 's', 'k', 'L', 'a', 'y', 'e', 'r', '\022', '!',
-'\n', '\014', 's', 'y', 'm', 'l', 'i', 'n', 'k', '_', 'r', 'o', 'o', 't', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\013', 's', 'y', 'm',
-'l', 'i', 'n', 'k', 'R', 'o', 'o', 't', '\022', '\"', '\n', '\014', 's', 'u', 'b', 'd', 'i', 'r', 'e', 'c', 't', 'o', 'r', 'y', '\030',
-'\003', ' ', '\001', '(', '\t', 'R', '\014', 's', 'u', 'b', 'd', 'i', 'r', 'e', 'c', 't', 'o', 'r', 'y', '\022', '4', '\n', '\026', 'a', 'p',
-'p', 'e', 'n', 'd', '_', 's', 'e', 'r', 'v', 'i', 'c', 'e', '_', 'c', 'l', 'u', 's', 't', 'e', 'r', '\030', '\002', ' ', '\001', '(',
-'\010', 'R', '\024', 'a', 'p', 'p', 'e', 'n', 'd', 'S', 'e', 'r', 'v', 'i', 'c', 'e', 'C', 'l', 'u', 's', 't', 'e', 'r', ':', '7',
-'\232', '\305', '\210', '\036', '2', '\n', '0', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's',
-'t', 'r', 'a', 'p', '.', 'v', '2', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'L', 'a', 'y', 'e', 'r', '.', 'D', 'i', 's', 'k',
-'L', 'a', 'y', 'e', 'r', '\032', 'F', '\n', '\n', 'A', 'd', 'm', 'i', 'n', 'L', 'a', 'y', 'e', 'r', ':', '8', '\232', '\305', '\210', '\036',
-'3', '\n', '1', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p',
-'.', 'v', '2', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'L', 'a', 'y', 'e', 'r', '.', 'A', 'd', 'm', 'i', 'n', 'L', 'a', 'y',
-'e', 'r', '\032', '\235', '\001', '\n', '\t', 'R', 't', 'd', 's', 'L', 'a', 'y', 'e', 'r', '\022', '\022', '\n', '\004', 'n', 'a', 'm', 'e', '\030',
-'\001', ' ', '\001', '(', '\t', 'R', '\004', 'n', 'a', 'm', 'e', '\022', 'C', '\n', '\013', 'r', 't', 'd', 's', '_', 'c', 'o', 'n', 'f', 'i',
-'g', '\030', '\002', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o',
-'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\n', 'r', 't', 'd', 's', 'C',
-'o', 'n', 'f', 'i', 'g', ':', '7', '\232', '\305', '\210', '\036', '2', '\n', '0', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
-'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '2', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'L', 'a', 'y',
-'e', 'r', '.', 'R', 't', 'd', 's', 'L', 'a', 'y', 'e', 'r', ':', '-', '\232', '\305', '\210', '\036', '(', '\n', '&', 'e', 'n', 'v', 'o',
+'.', 'R', 't', 'd', 's', 'L', 'a', 'y', 'e', 'r', 'H', '\000', 'R', '\t', 'r', 't', 'd', 's', 'L', 'a', 'y', 'e', 'r', '\032', '\301',
+'\001', '\n', '\t', 'D', 'i', 's', 'k', 'L', 'a', 'y', 'e', 'r', '\022', '!', '\n', '\014', 's', 'y', 'm', 'l', 'i', 'n', 'k', '_', 'r',
+'o', 'o', 't', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\013', 's', 'y', 'm', 'l', 'i', 'n', 'k', 'R', 'o', 'o', 't', '\022', '\"', '\n',
+'\014', 's', 'u', 'b', 'd', 'i', 'r', 'e', 'c', 't', 'o', 'r', 'y', '\030', '\003', ' ', '\001', '(', '\t', 'R', '\014', 's', 'u', 'b', 'd',
+'i', 'r', 'e', 'c', 't', 'o', 'r', 'y', '\022', '4', '\n', '\026', 'a', 'p', 'p', 'e', 'n', 'd', '_', 's', 'e', 'r', 'v', 'i', 'c',
+'e', '_', 'c', 'l', 'u', 's', 't', 'e', 'r', '\030', '\002', ' ', '\001', '(', '\010', 'R', '\024', 'a', 'p', 'p', 'e', 'n', 'd', 'S', 'e',
+'r', 'v', 'i', 'c', 'e', 'C', 'l', 'u', 's', 't', 'e', 'r', ':', '7', '\232', '\305', '\210', '\036', '2', '\n', '0', 'e', 'n', 'v', 'o',
'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '2', '.', 'R', 'u', 'n',
-'t', 'i', 'm', 'e', 'L', 'a', 'y', 'e', 'r', 'B', '\026', '\n', '\017', 'l', 'a', 'y', 'e', 'r', '_', 's', 'p', 'e', 'c', 'i', 'f',
-'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', '\"', '\202', '\001', '\n', '\016', 'L', 'a', 'y', 'e', 'r', 'e', 'd', 'R', 'u', 'n', 't', 'i',
-'m', 'e', '\022', '?', '\n', '\006', 'l', 'a', 'y', 'e', 'r', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', '\'', '.', 'e', 'n', 'v', 'o',
-'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '3', '.', 'R', 'u', 'n',
-'t', 'i', 'm', 'e', 'L', 'a', 'y', 'e', 'r', 'R', '\006', 'l', 'a', 'y', 'e', 'r', 's', ':', '/', '\232', '\305', '\210', '\036', '*', '\n',
-'(', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v',
-'2', '.', 'L', 'a', 'y', 'e', 'r', 'e', 'd', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'B', 'C', '\n', '\'', 'i', 'o', '.', 'e', 'n',
-'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o',
-'t', 's', 't', 'r', 'a', 'p', '.', 'v', '3', 'B', '\016', 'B', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', 'P', 'r', 'o', 't', 'o',
-'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'t', 'i', 'm', 'e', 'L', 'a', 'y', 'e', 'r', '.', 'D', 'i', 's', 'k', 'L', 'a', 'y', 'e', 'r', '\032', 'F', '\n', '\n', 'A', 'd',
+'m', 'i', 'n', 'L', 'a', 'y', 'e', 'r', ':', '8', '\232', '\305', '\210', '\036', '3', '\n', '1', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
+'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '2', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e',
+'L', 'a', 'y', 'e', 'r', '.', 'A', 'd', 'm', 'i', 'n', 'L', 'a', 'y', 'e', 'r', '\032', '\235', '\001', '\n', '\t', 'R', 't', 'd', 's',
+'L', 'a', 'y', 'e', 'r', '\022', '\022', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\004', 'n', 'a', 'm', 'e',
+'\022', 'C', '\n', '\013', 'r', 't', 'd', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\002', ' ', '\001', '(', '\013', '2', '\"', '.', 'e',
+'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'n', 'f', 'i',
+'g', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\n', 'r', 't', 'd', 's', 'C', 'o', 'n', 'f', 'i', 'g', ':', '7', '\232', '\305', '\210', '\036',
+'2', '\n', '0', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p',
+'.', 'v', '2', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'L', 'a', 'y', 'e', 'r', '.', 'R', 't', 'd', 's', 'L', 'a', 'y', 'e',
+'r', ':', '-', '\232', '\305', '\210', '\036', '(', '\n', '&', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o',
+'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '2', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'L', 'a', 'y', 'e', 'r', 'B', '\026',
+'\n', '\017', 'l', 'a', 'y', 'e', 'r', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', '\"', '\202', '\001',
+'\n', '\016', 'L', 'a', 'y', 'e', 'r', 'e', 'd', 'R', 'u', 'n', 't', 'i', 'm', 'e', '\022', '?', '\n', '\006', 'l', 'a', 'y', 'e', 'r',
+'s', '\030', '\001', ' ', '\003', '(', '\013', '2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o',
+'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '3', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'L', 'a', 'y', 'e', 'r', 'R', '\006',
+'l', 'a', 'y', 'e', 'r', 's', ':', '/', '\232', '\305', '\210', '\036', '*', '\n', '(', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
+'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '2', '.', 'L', 'a', 'y', 'e', 'r', 'e', 'd', 'R', 'u',
+'n', 't', 'i', 'm', 'e', '\"', '\261', '\002', '\n', '\022', 'C', 'u', 's', 't', 'o', 'm', 'I', 'n', 'l', 'i', 'n', 'e', 'H', 'e', 'a',
+'d', 'e', 'r', '\022', ';', '\n', '\022', 'i', 'n', 'l', 'i', 'n', 'e', '_', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'n', 'a', 'm', 'e',
+'\030', '\001', ' ', '\001', '(', '\t', 'B', '\r', '\372', 'B', '\n', 'r', '\010', '\020', '\001', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\020', 'i', 'n',
+'l', 'i', 'n', 'e', 'H', 'e', 'a', 'd', 'e', 'r', 'N', 'a', 'm', 'e', '\022', 'v', '\n', '\022', 'i', 'n', 'l', 'i', 'n', 'e', '_',
+'h', 'e', 'a', 'd', 'e', 'r', '_', 't', 'y', 'p', 'e', '\030', '\002', ' ', '\001', '(', '\016', '2', '>', '.', 'e', 'n', 'v', 'o', 'y',
+'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', '.', 'v', '3', '.', 'C', 'u', 's', 't',
+'o', 'm', 'I', 'n', 'l', 'i', 'n', 'e', 'H', 'e', 'a', 'd', 'e', 'r', '.', 'I', 'n', 'l', 'i', 'n', 'e', 'H', 'e', 'a', 'd',
+'e', 'r', 'T', 'y', 'p', 'e', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\020', 'i', 'n', 'l', 'i', 'n', 'e', 'H',
+'e', 'a', 'd', 'e', 'r', 'T', 'y', 'p', 'e', '\"', 'f', '\n', '\020', 'I', 'n', 'l', 'i', 'n', 'e', 'H', 'e', 'a', 'd', 'e', 'r',
+'T', 'y', 'p', 'e', '\022', '\022', '\n', '\016', 'R', 'E', 'Q', 'U', 'E', 'S', 'T', '_', 'H', 'E', 'A', 'D', 'E', 'R', '\020', '\000', '\022',
+'\023', '\n', '\017', 'R', 'E', 'Q', 'U', 'E', 'S', 'T', '_', 'T', 'R', 'A', 'I', 'L', 'E', 'R', '\020', '\001', '\022', '\023', '\n', '\017', 'R',
+'E', 'S', 'P', 'O', 'N', 'S', 'E', '_', 'H', 'E', 'A', 'D', 'E', 'R', '\020', '\002', '\022', '\024', '\n', '\020', 'R', 'E', 'S', 'P', 'O',
+'N', 'S', 'E', '_', 'T', 'R', 'A', 'I', 'L', 'E', 'R', '\020', '\003', 'B', 'C', '\n', '\'', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y',
+'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'b', 'o', 'o', 't', 's', 't',
+'r', 'a', 'p', '.', 'v', '3', 'B', '\016', 'B', 'o', 'o', 't', 's', 't', 'r', 'a', 'p', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272',
+'\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[22] = {
+static upb_def_init *deps[25] = {
+ &envoy_config_accesslog_v3_accesslog_proto_upbdefinit,
&envoy_config_cluster_v3_cluster_proto_upbdefinit,
&envoy_config_core_v3_address_proto_upbdefinit,
&envoy_config_core_v3_base_proto_upbdefinit,
&envoy_config_core_v3_config_source_proto_upbdefinit,
&envoy_config_core_v3_event_service_config_proto_upbdefinit,
&envoy_config_core_v3_extension_proto_upbdefinit,
+ &envoy_config_core_v3_resolver_proto_upbdefinit,
&envoy_config_core_v3_socket_option_proto_upbdefinit,
&envoy_config_listener_v3_listener_proto_upbdefinit,
&envoy_config_metrics_v3_stats_proto_upbdefinit,
@@ -367,6 +407,7 @@ static upb_def_init *deps[22] = {
&google_protobuf_duration_proto_upbdefinit,
&google_protobuf_struct_proto_upbdefinit,
&google_protobuf_wrappers_proto_upbdefinit,
+ &envoy_annotations_deprecation_proto_upbdefinit,
&udpa_annotations_migrate_proto_upbdefinit,
&udpa_annotations_security_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
@@ -379,5 +420,5 @@ upb_def_init envoy_config_bootstrap_v3_bootstrap_proto_upbdefinit = {
deps,
layouts,
"envoy/config/bootstrap/v3/bootstrap.proto",
- UPB_STRVIEW_INIT(descriptor, 6993)
+ UPB_STRVIEW_INIT(descriptor, 7815)
};
diff --git a/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h b/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h
index 666cbed19e..5f9ac87f7e 100644
--- a/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h
+++ b/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h
@@ -106,6 +106,11 @@ UPB_INLINE const upb_msgdef *envoy_config_bootstrap_v3_LayeredRuntime_getmsgdef(
return upb_symtab_lookupmsg(s, "envoy.config.bootstrap.v3.LayeredRuntime");
}
+UPB_INLINE const upb_msgdef *envoy_config_bootstrap_v3_CustomInlineHeader_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &envoy_config_bootstrap_v3_bootstrap_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "envoy.config.bootstrap.v3.CustomInlineHeader");
+}
+
#ifdef __cplusplus
} /* extern "C" */
#endif
diff --git a/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c b/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c
index 18db991b6b..156516b7e1 100644
--- a/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c
+++ b/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c
@@ -18,6 +18,7 @@ extern upb_def_init envoy_config_core_v3_config_source_proto_upbdefinit;
extern upb_def_init envoy_config_core_v3_extension_proto_upbdefinit;
extern upb_def_init envoy_config_core_v3_health_check_proto_upbdefinit;
extern upb_def_init envoy_config_core_v3_protocol_proto_upbdefinit;
+extern upb_def_init envoy_config_core_v3_resolver_proto_upbdefinit;
extern upb_def_init envoy_config_endpoint_v3_endpoint_proto_upbdefinit;
extern upb_def_init envoy_type_v3_percent_proto_upbdefinit;
extern upb_def_init google_protobuf_any_proto_upbdefinit;
@@ -25,6 +26,8 @@ extern upb_def_init google_protobuf_duration_proto_upbdefinit;
extern upb_def_init google_protobuf_struct_proto_upbdefinit;
extern upb_def_init google_protobuf_wrappers_proto_upbdefinit;
extern upb_def_init xds_core_v3_collection_entry_proto_upbdefinit;
+extern upb_def_init envoy_annotations_deprecation_proto_upbdefinit;
+extern upb_def_init udpa_annotations_migrate_proto_upbdefinit;
extern upb_def_init udpa_annotations_security_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
extern upb_def_init udpa_annotations_versioning_proto_upbdefinit;
@@ -79,7 +82,7 @@ static const upb_msglayout *layouts[23] = {
&envoy_config_cluster_v3_TrackClusterStats_msginit,
};
-static const char descriptor[10750] = {'\n', '%', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'l', 'u', 's', 't', 'e', 'r', '/', 'v', '3',
+static const char descriptor[11266] = {'\n', '%', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'l', 'u', 's', 't', 'e', 'r', '/', 'v', '3',
'/', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'p', 'r', 'o', 't', 'o', '\022', '\027', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '\032', '-', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n',
'f', 'i', 'g', '/', 'c', 'l', 'u', 's', 't', 'e', 'r', '/', 'v', '3', '/', 'c', 'i', 'r', 'c', 'u', 'i', 't', '_', 'b', 'r',
@@ -96,422 +99,443 @@ static const char descriptor[10750] = {'\n', '%', 'e', 'n', 'v', 'o', 'y', '/',
'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'h', 'e', 'a', 'l', 't',
'h', '_', 'c', 'h', 'e', 'c', 'k', '.', 'p', 'r', 'o', 't', 'o', '\032', '#', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f',
'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '.', 'p', 'r', 'o', 't', 'o',
-'\032', '\'', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '/', 'v',
-'3', '/', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'p', 'r', 'o', 't', 'o', '\032', '\033', 'e', 'n', 'v', 'o', 'y', '/', 't',
-'y', 'p', 'e', '/', 'v', '3', '/', 'p', 'e', 'r', 'c', 'e', 'n', 't', '.', 'p', 'r', 'o', 't', 'o', '\032', '\031', 'g', 'o', 'o',
-'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'a', 'n', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g',
-'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.', 'p',
-'r', 'o', 't', 'o', '\032', '\034', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 's', 't', 'r',
-'u', 'c', 't', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u',
-'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\"', 'x', 'd', 's', '/', 'c', 'o', 'r',
-'e', '/', 'v', '3', '/', 'c', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', '_', 'e', 'n', 't', 'r', 'y', '.', 'p', 'r', 'o',
-'t', 'o', '\032', '\037', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 'e', 'c', 'u',
-'r', 'i', 't', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i',
-'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n',
-'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't',
-'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't',
-'o', '\"', 'K', '\n', '\021', 'C', 'l', 'u', 's', 't', 'e', 'r', 'C', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', '\022', '6', '\n',
-'\007', 'e', 'n', 't', 'r', 'i', 'e', 's', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'x', 'd', 's', '.', 'c', 'o', 'r', 'e',
-'.', 'v', '3', '.', 'C', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', 'E', 'n', 't', 'r', 'y', 'R', '\007', 'e', 'n', 't', 'r',
-'i', 'e', 's', '\"', '\246', 'G', '\n', '\007', 'C', 'l', 'u', 's', 't', 'e', 'r', '\022', 'o', '\n', '\030', 't', 'r', 'a', 'n', 's', 'p',
-'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', '_', 'm', 'a', 't', 'c', 'h', 'e', 's', '\030', '+', ' ', '\003', '(', '\013', '2',
-'5', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3',
-'.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', 'M',
-'a', 't', 'c', 'h', 'R', '\026', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', 'M', 'a', 't', 'c',
-'h', 'e', 's', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020',
-'\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '\"', '\n', '\r', 'a', 'l', 't', '_', 's', 't', 'a', 't', '_', 'n', 'a', 'm', 'e', '\030',
-'\034', ' ', '\001', '(', '\t', 'R', '\013', 'a', 'l', 't', 'S', 't', 'a', 't', 'N', 'a', 'm', 'e', '\022', 'N', '\n', '\004', 't', 'y', 'p',
-'e', '\030', '\002', ' ', '\001', '(', '\016', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l',
-'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r',
-'y', 'T', 'y', 'p', 'e', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'H', '\000', 'R', '\004', 't', 'y', 'p', 'e', '\022', 'W',
-'\n', '\014', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 't', 'y', 'p', 'e', '\030', '&', ' ', '\001', '(', '\013', '2', '2', '.', 'e', 'n',
-'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u',
-'s', 't', 'e', 'r', '.', 'C', 'u', 's', 't', 'o', 'm', 'C', 'l', 'u', 's', 't', 'e', 'r', 'T', 'y', 'p', 'e', 'H', '\000', 'R',
-'\013', 'c', 'l', 'u', 's', 't', 'e', 'r', 'T', 'y', 'p', 'e', '\022', '_', '\n', '\022', 'e', 'd', 's', '_', 'c', 'l', 'u', 's', 't',
-'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '1', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
-'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.',
-'E', 'd', 's', 'C', 'l', 'u', 's', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\020', 'e', 'd', 's', 'C', 'l', 'u', 's',
-'t', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'L', '\n', '\017', 'c', 'o', 'n', 'n', 'e', 'c', 't', '_', 't', 'i', 'm', 'e',
-'o', 'u', 't', '\030', '\004', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b',
-'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\252', '\001', '\002', '*', '\000', 'R', '\016', 'c', 'o',
-'n', 'n', 'e', 'c', 't', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'o', '\n', '!', 'p', 'e', 'r', '_', 'c', 'o', 'n', 'n', 'e',
-'c', 't', 'i', 'o', 'n', '_', 'b', 'u', 'f', 'f', 'e', 'r', '_', 'l', 'i', 'm', 'i', 't', '_', 'b', 'y', 't', 'e', 's', '\030',
-'\005', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U',
-'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\212', '\223', '\267', '*', '\002', '\020', '\001', 'R', '\035', 'p', 'e', 'r', 'C',
-'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'B', 'u', 'f', 'f', 'e', 'r', 'L', 'i', 'm', 'i', 't', 'B', 'y', 't', 'e', 's',
-'\022', 'R', '\n', '\t', 'l', 'b', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\006', ' ', '\001', '(', '\016', '2', ')', '.', 'e', 'n', 'v',
-'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's',
-'t', 'e', 'r', '.', 'L', 'b', 'P', 'o', 'l', 'i', 'c', 'y', 'B', '\n', '\372', 'B', '\007', '\202', '\001', '\004', '\020', '\001', ' ', '\007', 'R',
-'\010', 'l', 'b', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'X', '\n', '\017', 'l', 'o', 'a', 'd', '_', 'a', 's', 's', 'i', 'g', 'n', 'm',
-'e', 'n', 't', '\030', '!', ' ', '\001', '(', '\013', '2', '/', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
-'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'L', 'o', 'a', 'd', 'A', 's',
-'s', 'i', 'g', 'n', 'm', 'e', 'n', 't', 'R', '\016', 'l', 'o', 'a', 'd', 'A', 's', 's', 'i', 'g', 'n', 'm', 'e', 'n', 't', '\022',
-'F', '\n', '\r', 'h', 'e', 'a', 'l', 't', 'h', '_', 'c', 'h', 'e', 'c', 'k', 's', '\030', '\010', ' ', '\003', '(', '\013', '2', '!', '.',
-'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'l',
-'t', 'h', 'C', 'h', 'e', 'c', 'k', 'R', '\014', 'h', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', 's', '\022', '[', '\n', '\033',
-'m', 'a', 'x', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', 's', '_', 'p', 'e', 'r', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i',
-'o', 'n', '\030', '\t', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u',
-'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\030', 'm', 'a', 'x', 'R', 'e', 'q', 'u', 'e', 's', 't',
-'s', 'P', 'e', 'r', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '\022', 'S', '\n', '\020', 'c', 'i', 'r', 'c', 'u', 'i', 't',
-'_', 'b', 'r', 'e', 'a', 'k', 'e', 'r', 's', '\030', '\n', ' ', '\001', '(', '\013', '2', '(', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
-'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'i', 'r', 'c', 'u', 'i', 't', 'B',
-'r', 'e', 'a', 'k', 'e', 'r', 's', 'R', '\017', 'c', 'i', 'r', 'c', 'u', 'i', 't', 'B', 'r', 'e', 'a', 'k', 'e', 'r', 's', '\022',
-'z', '\n', '\036', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', '_', 'h', 't', 't', 'p', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l',
-'_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '.', ' ', '\001', '(', '\013', '2', '1', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
-'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'H', 't', 't', 'p',
-'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'B', '\002', '\030', '\001', 'R', '\033', 'u', 'p', 's', 't',
-'r', 'e', 'a', 'm', 'H', 't', 't', 'p', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', 'n',
-'\n', '\034', 'c', 'o', 'm', 'm', 'o', 'n', '_', 'h', 't', 't', 'p', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'o', 'p',
-'t', 'i', 'o', 'n', 's', '\030', '\035', ' ', '\001', '(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
-'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 't', 't', 'p', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't',
-'i', 'o', 'n', 's', 'B', '\002', '\030', '\001', 'R', '\031', 'c', 'o', 'm', 'm', 'o', 'n', 'H', 't', 't', 'p', 'P', 'r', 'o', 't', 'o',
-'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', 'b', '\n', '\025', 'h', 't', 't', 'p', '_', 'p', 'r', 'o', 't', 'o', 'c',
-'o', 'l', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '\r', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.',
-'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 't', 't', 'p', '1', 'P', 'r', 'o', 't', 'o',
-'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'B', '\002', '\030', '\001', 'R', '\023', 'h', 't', 't', 'p', 'P', 'r', 'o', 't', 'o',
-'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', 'k', '\n', '\026', 'h', 't', 't', 'p', '2', '_', 'p', 'r', 'o', 't', 'o',
+'\032', '#', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'r', 'e',
+'s', 'o', 'l', 'v', 'e', 'r', '.', 'p', 'r', 'o', 't', 'o', '\032', '\'', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i',
+'g', '/', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '/', 'v', '3', '/', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'p', 'r',
+'o', 't', 'o', '\032', '\033', 'e', 'n', 'v', 'o', 'y', '/', 't', 'y', 'p', 'e', '/', 'v', '3', '/', 'p', 'e', 'r', 'c', 'e', 'n',
+'t', '.', 'p', 'r', 'o', 't', 'o', '\032', '\031', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/',
+'a', 'n', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u',
+'f', '/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\034', 'g', 'o', 'o', 'g', 'l', 'e', '/',
+'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 's', 't', 'r', 'u', 'c', 't', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o',
+'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r',
+'o', 't', 'o', '\032', '\"', 'x', 'd', 's', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'c', 'o', 'l', 'l', 'e', 'c', 't', 'i',
+'o', 'n', '_', 'e', 'n', 't', 'r', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '#', 'e', 'n', 'v', 'o', 'y', '/', 'a', 'n', 'n',
+'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'd', 'e', 'p', 'r', 'e', 'c', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't',
+'o', '\032', '\036', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'm', 'i', 'g', 'r', 'a',
+'t', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\037', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n',
+'s', '/', 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n',
+'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u',
+'d', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n',
+'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't',
+'e', '.', 'p', 'r', 'o', 't', 'o', '\"', 'K', '\n', '\021', 'C', 'l', 'u', 's', 't', 'e', 'r', 'C', 'o', 'l', 'l', 'e', 'c', 't',
+'i', 'o', 'n', '\022', '6', '\n', '\007', 'e', 'n', 't', 'r', 'i', 'e', 's', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'x', 'd',
+'s', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', 'E', 'n', 't', 'r', 'y',
+'R', '\007', 'e', 'n', 't', 'r', 'i', 'e', 's', '\"', '\300', 'J', '\n', '\007', 'C', 'l', 'u', 's', 't', 'e', 'r', '\022', 'o', '\n', '\030',
+'t', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', '_', 'm', 'a', 't', 'c', 'h', 'e', 's', '\030',
+'+', ' ', '\003', '(', '\013', '2', '5', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's',
+'t', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S',
+'o', 'c', 'k', 'e', 't', 'M', 'a', 't', 'c', 'h', 'R', '\026', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k',
+'e', 't', 'M', 'a', 't', 'c', 'h', 'e', 's', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007',
+'\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '>', '\n', '\r', 'a', 'l', 't', '_', 's', 't', 'a', 't',
+'_', 'n', 'a', 'm', 'e', '\030', '\034', ' ', '\001', '(', '\t', 'B', '\032', '\362', '\230', '\376', '\217', '\005', '\024', '\n', '\022', 'o', 'b', 's', 'e',
+'r', 'v', 'a', 'b', 'i', 'l', 'i', 't', 'y', '_', 'n', 'a', 'm', 'e', 'R', '\013', 'a', 'l', 't', 'S', 't', 'a', 't', 'N', 'a',
+'m', 'e', '\022', 'N', '\n', '\004', 't', 'y', 'p', 'e', '\030', '\002', ' ', '\001', '(', '\016', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.',
+'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r',
+'.', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'T', 'y', 'p', 'e', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'H',
+'\000', 'R', '\004', 't', 'y', 'p', 'e', '\022', 'W', '\n', '\014', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 't', 'y', 'p', 'e', '\030', '&',
+' ', '\001', '(', '\013', '2', '2', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't',
+'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'u', 's', 't', 'o', 'm', 'C', 'l', 'u', 's', 't',
+'e', 'r', 'T', 'y', 'p', 'e', 'H', '\000', 'R', '\013', 'c', 'l', 'u', 's', 't', 'e', 'r', 'T', 'y', 'p', 'e', '\022', '_', '\n', '\022',
+'e', 'd', 's', '_', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2',
+'1', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3',
+'.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'E', 'd', 's', 'C', 'l', 'u', 's', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g',
+'R', '\020', 'e', 'd', 's', 'C', 'l', 'u', 's', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'L', '\n', '\017', 'c', 'o', 'n',
+'n', 'e', 'c', 't', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\004', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g',
+'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005',
+'\252', '\001', '\002', '*', '\000', 'R', '\016', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'o', '\n', '!',
+'p', 'e', 'r', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'b', 'u', 'f', 'f', 'e', 'r', '_', 'l', 'i', 'm',
+'i', 't', '_', 'b', 'y', 't', 'e', 's', '\030', '\005', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p',
+'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\212', '\223', '\267', '*',
+'\002', '\020', '\001', 'R', '\035', 'p', 'e', 'r', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'B', 'u', 'f', 'f', 'e', 'r', 'L',
+'i', 'm', 'i', 't', 'B', 'y', 't', 'e', 's', '\022', 'R', '\n', '\t', 'l', 'b', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\006', ' ',
+'\001', '(', '\016', '2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e',
+'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', 'b', 'P', 'o', 'l', 'i', 'c', 'y', 'B', '\n', '\372', 'B',
+'\007', '\202', '\001', '\004', '\020', '\001', ' ', '\007', 'R', '\010', 'l', 'b', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'X', '\n', '\017', 'l', 'o', 'a',
+'d', '_', 'a', 's', 's', 'i', 'g', 'n', 'm', 'e', 'n', 't', '\030', '!', ' ', '\001', '(', '\013', '2', '/', '.', 'e', 'n', 'v', 'o',
+'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'v', '3', '.', 'C', 'l', 'u', 's',
+'t', 'e', 'r', 'L', 'o', 'a', 'd', 'A', 's', 's', 'i', 'g', 'n', 'm', 'e', 'n', 't', 'R', '\016', 'l', 'o', 'a', 'd', 'A', 's',
+'s', 'i', 'g', 'n', 'm', 'e', 'n', 't', '\022', 'F', '\n', '\r', 'h', 'e', 'a', 'l', 't', 'h', '_', 'c', 'h', 'e', 'c', 'k', 's',
+'\030', '\010', ' ', '\003', '(', '\013', '2', '!', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r',
+'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', 'R', '\014', 'h', 'e', 'a', 'l', 't', 'h', 'C',
+'h', 'e', 'c', 'k', 's', '\022', 'h', '\n', '\033', 'm', 'a', 'x', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', 's', '_', 'p', 'e', 'r',
+'_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '\030', '\t', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l',
+'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\013', '\030',
+'\001', '\222', '\307', '\206', '\330', '\004', '\003', '3', '.', '0', 'R', '\030', 'm', 'a', 'x', 'R', 'e', 'q', 'u', 'e', 's', 't', 's', 'P', 'e',
+'r', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '\022', 'S', '\n', '\020', 'c', 'i', 'r', 'c', 'u', 'i', 't', '_', 'b', 'r',
+'e', 'a', 'k', 'e', 'r', 's', '\030', '\n', ' ', '\001', '(', '\013', '2', '(', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
+'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'i', 'r', 'c', 'u', 'i', 't', 'B', 'r', 'e', 'a',
+'k', 'e', 'r', 's', 'R', '\017', 'c', 'i', 'r', 'c', 'u', 'i', 't', 'B', 'r', 'e', 'a', 'k', 'e', 'r', 's', '\022', '\203', '\001', '\n',
+'\036', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', '_', 'h', 't', 't', 'p', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'o',
+'p', 't', 'i', 'o', 'n', 's', '\030', '.', ' ', '\001', '(', '\013', '2', '1', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
+'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'H', 't', 't', 'p', 'P', 'r',
+'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'B', '\013', '\030', '\001', '\222', '\307', '\206', '\330', '\004', '\003', '3', '.',
+'0', 'R', '\033', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', 'H', 't', 't', 'p', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p',
+'t', 'i', 'o', 'n', 's', '\022', 'w', '\n', '\034', 'c', 'o', 'm', 'm', 'o', 'n', '_', 'h', 't', 't', 'p', '_', 'p', 'r', 'o', 't',
+'o', 'c', 'o', 'l', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '\035', ' ', '\001', '(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o',
+'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 't', 't', 'p', 'P', 'r', 'o', 't',
+'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'B', '\013', '\030', '\001', '\222', '\307', '\206', '\330', '\004', '\003', '3', '.', '0', 'R',
+'\031', 'c', 'o', 'm', 'm', 'o', 'n', 'H', 't', 't', 'p', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n',
+'s', '\022', 'k', '\n', '\025', 'h', 't', 't', 'p', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'o', 'p', 't', 'i', 'o', 'n',
+'s', '\030', '\r', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o',
+'r', 'e', '.', 'v', '3', '.', 'H', 't', 't', 'p', '1', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n',
+'s', 'B', '\013', '\030', '\001', '\222', '\307', '\206', '\330', '\004', '\003', '3', '.', '0', 'R', '\023', 'h', 't', 't', 'p', 'P', 'r', 'o', 't', 'o',
+'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', 't', '\n', '\026', 'h', 't', 't', 'p', '2', '_', 'p', 'r', 'o', 't', 'o',
'c', 'o', 'l', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '\016', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y',
'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 't', 't', 'p', '2', 'P', 'r', 'o', 't',
-'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'B', '\t', '\030', '\001', '\212', '\223', '\267', '*', '\002', '\020', '\001', 'R', '\024', 'h',
-'t', 't', 'p', '2', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', '\214', '\001', '\n', ' ', 't',
-'y', 'p', 'e', 'd', '_', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'o',
-'p', 't', 'i', 'o', 'n', 's', '\030', '$', ' ', '\003', '(', '\013', '2', 'C', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'T', 'y', 'p',
-'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n',
-'s', 'E', 'n', 't', 'r', 'y', 'R', '\035', 't', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'P', 'r', 'o',
-'t', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', 'Q', '\n', '\020', 'd', 'n', 's', '_', 'r', 'e', 'f', 'r', 'e',
-'s', 'h', '_', 'r', 'a', 't', 'e', '\030', '\020', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r',
-'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\014', '\372', 'B', '\t', '\252', '\001', '\006', '*', '\004',
-'\020', '\300', '\204', '=', 'R', '\016', 'd', 'n', 's', 'R', 'e', 'f', 'r', 'e', 's', 'h', 'R', 'a', 't', 'e', '\022', 'e', '\n', '\030', 'd',
-'n', 's', '_', 'f', 'a', 'i', 'l', 'u', 'r', 'e', '_', 'r', 'e', 'f', 'r', 'e', 's', 'h', '_', 'r', 'a', 't', 'e', '\030', ',',
-' ', '\001', '(', '\013', '2', ',', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't',
-'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'R', 'e', 'f', 'r', 'e', 's', 'h', 'R', 'a', 't', 'e',
-'R', '\025', 'd', 'n', 's', 'F', 'a', 'i', 'l', 'u', 'r', 'e', 'R', 'e', 'f', 'r', 'e', 's', 'h', 'R', 'a', 't', 'e', '\022', '&',
-'\n', '\017', 'r', 'e', 's', 'p', 'e', 'c', 't', '_', 'd', 'n', 's', '_', 't', 't', 'l', '\030', '\'', ' ', '\001', '(', '\010', 'R', '\r',
-'r', 'e', 's', 'p', 'e', 'c', 't', 'D', 'n', 's', 'T', 't', 'l', '\022', 'f', '\n', '\021', 'd', 'n', 's', '_', 'l', 'o', 'o', 'k',
-'u', 'p', '_', 'f', 'a', 'm', 'i', 'l', 'y', '\030', '\021', ' ', '\001', '(', '\016', '2', '0', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
-'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.',
-'D', 'n', 's', 'L', 'o', 'o', 'k', 'u', 'p', 'F', 'a', 'm', 'i', 'l', 'y', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001',
-'R', '\017', 'd', 'n', 's', 'L', 'o', 'o', 'k', 'u', 'p', 'F', 'a', 'm', 'i', 'l', 'y', '\022', 'B', '\n', '\r', 'd', 'n', 's', '_',
-'r', 'e', 's', 'o', 'l', 'v', 'e', 'r', 's', '\030', '\022', ' ', '\003', '(', '\013', '2', '\035', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
-'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'A', 'd', 'd', 'r', 'e', 's', 's', 'R', '\014', 'd', 'n',
-'s', 'R', 'e', 's', 'o', 'l', 'v', 'e', 'r', 's', '\022', '4', '\n', '\027', 'u', 's', 'e', '_', 't', 'c', 'p', '_', 'f', 'o', 'r',
-'_', 'd', 'n', 's', '_', 'l', 'o', 'o', 'k', 'u', 'p', 's', '\030', '-', ' ', '\001', '(', '\010', 'R', '\023', 'u', 's', 'e', 'T', 'c',
-'p', 'F', 'o', 'r', 'D', 'n', 's', 'L', 'o', 'o', 'k', 'u', 'p', 's', '\022', 'V', '\n', '\021', 'o', 'u', 't', 'l', 'i', 'e', 'r',
-'_', 'd', 'e', 't', 'e', 'c', 't', 'i', 'o', 'n', '\030', '\023', ' ', '\001', '(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.',
-'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'O', 'u', 't', 'l', 'i', 'e', 'r',
-'D', 'e', 't', 'e', 'c', 't', 'i', 'o', 'n', 'R', '\020', 'o', 'u', 't', 'l', 'i', 'e', 'r', 'D', 'e', 't', 'e', 'c', 't', 'i',
-'o', 'n', '\022', 'N', '\n', '\020', 'c', 'l', 'e', 'a', 'n', 'u', 'p', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\024', ' ',
-'\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r',
-'a', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\252', '\001', '\002', '*', '\000', 'R', '\017', 'c', 'l', 'e', 'a', 'n', 'u', 'p', 'I',
-'n', 't', 'e', 'r', 'v', 'a', 'l', '\022', 'R', '\n', '\024', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', '_', 'b', 'i', 'n', 'd', '_',
-'c', 'o', 'n', 'f', 'i', 'g', '\030', '\025', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'B', 'i', 'n', 'd', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\022', 'u', 'p',
-'s', 't', 'r', 'e', 'a', 'm', 'B', 'i', 'n', 'd', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'Y', '\n', '\020', 'l', 'b', '_', 's', 'u',
-'b', 's', 'e', 't', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\026', ' ', '\001', '(', '\013', '2', '/', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e',
-'r', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\016', 'l', 'b', 'S', 'u', 'b', 's', 'e',
-'t', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'b', '\n', '\023', 'r', 'i', 'n', 'g', '_', 'h', 'a', 's', 'h', '_', 'l', 'b', '_', 'c',
-'o', 'n', 'f', 'i', 'g', '\030', '\027', ' ', '\001', '(', '\013', '2', '1', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
-'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'R', 'i', 'n', 'g',
-'H', 'a', 's', 'h', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'H', '\001', 'R', '\020', 'r', 'i', 'n', 'g', 'H', 'a', 's', 'h', 'L',
-'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '[', '\n', '\020', 'm', 'a', 'g', 'l', 'e', 'v', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f',
-'i', 'g', '\030', '4', ' ', '\001', '(', '\013', '2', '/', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c',
-'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'M', 'a', 'g', 'l', 'e', 'v', 'L',
-'b', 'C', 'o', 'n', 'f', 'i', 'g', 'H', '\001', 'R', '\016', 'm', 'a', 'g', 'l', 'e', 'v', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g',
-'\022', 'k', '\n', '\026', 'o', 'r', 'i', 'g', 'i', 'n', 'a', 'l', '_', 'd', 's', 't', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f', 'i',
-'g', '\030', '\"', ' ', '\001', '(', '\013', '2', '4', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l',
-'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'O', 'r', 'i', 'g', 'i', 'n', 'a', 'l',
-'D', 's', 't', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'H', '\001', 'R', '\023', 'o', 'r', 'i', 'g', 'i', 'n', 'a', 'l', 'D', 's',
-'t', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'n', '\n', '\027', 'l', 'e', 'a', 's', 't', '_', 'r', 'e', 'q', 'u', 'e', 's',
-'t', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '%', ' ', '\001', '(', '\013', '2', '5', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e',
-'r', '.', 'L', 'e', 'a', 's', 't', 'R', 'e', 'q', 'u', 'e', 's', 't', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'H', '\001', 'R',
-'\024', 'l', 'e', 'a', 's', 't', 'R', 'e', 'q', 'u', 'e', 's', 't', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'Y', '\n', '\020',
-'c', 'o', 'm', 'm', 'o', 'n', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\033', ' ', '\001', '(', '\013', '2', '/', '.',
+'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'B', '\022', '\030', '\001', '\212', '\223', '\267', '*', '\002', '\020', '\001', '\222', '\307', '\206',
+'\330', '\004', '\003', '3', '.', '0', 'R', '\024', 'h', 't', 't', 'p', '2', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i',
+'o', 'n', 's', '\022', '\214', '\001', '\n', ' ', 't', 'y', 'p', 'e', 'd', '_', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '_', 'p',
+'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '$', ' ', '\003', '(', '\013', '2', 'C', '.', 'e',
+'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l',
+'u', 's', 't', 'e', 'r', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'P', 'r', 'o', 't', 'o',
+'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'E', 'n', 't', 'r', 'y', 'R', '\035', 't', 'y', 'p', 'e', 'd', 'E', 'x', 't',
+'e', 'n', 's', 'i', 'o', 'n', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', 'Q', '\n', '\020',
+'d', 'n', 's', '_', 'r', 'e', 'f', 'r', 'e', 's', 'h', '_', 'r', 'a', 't', 'e', '\030', '\020', ' ', '\001', '(', '\013', '2', '\031', '.',
+'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B',
+'\014', '\372', 'B', '\t', '\252', '\001', '\006', '*', '\004', '\020', '\300', '\204', '=', 'R', '\016', 'd', 'n', 's', 'R', 'e', 'f', 'r', 'e', 's', 'h',
+'R', 'a', 't', 'e', '\022', 'e', '\n', '\030', 'd', 'n', 's', '_', 'f', 'a', 'i', 'l', 'u', 'r', 'e', '_', 'r', 'e', 'f', 'r', 'e',
+'s', 'h', '_', 'r', 'a', 't', 'e', '\030', ',', ' ', '\001', '(', '\013', '2', ',', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
+'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'R', 'e',
+'f', 'r', 'e', 's', 'h', 'R', 'a', 't', 'e', 'R', '\025', 'd', 'n', 's', 'F', 'a', 'i', 'l', 'u', 'r', 'e', 'R', 'e', 'f', 'r',
+'e', 's', 'h', 'R', 'a', 't', 'e', '\022', '&', '\n', '\017', 'r', 'e', 's', 'p', 'e', 'c', 't', '_', 'd', 'n', 's', '_', 't', 't',
+'l', '\030', '\'', ' ', '\001', '(', '\010', 'R', '\r', 'r', 'e', 's', 'p', 'e', 'c', 't', 'D', 'n', 's', 'T', 't', 'l', '\022', 'f', '\n',
+'\021', 'd', 'n', 's', '_', 'l', 'o', 'o', 'k', 'u', 'p', '_', 'f', 'a', 'm', 'i', 'l', 'y', '\030', '\021', ' ', '\001', '(', '\016', '2',
+'0', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3',
+'.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'D', 'n', 's', 'L', 'o', 'o', 'k', 'u', 'p', 'F', 'a', 'm', 'i', 'l', 'y', 'B',
+'\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\017', 'd', 'n', 's', 'L', 'o', 'o', 'k', 'u', 'p', 'F', 'a', 'm', 'i', 'l',
+'y', '\022', 'O', '\n', '\r', 'd', 'n', 's', '_', 'r', 'e', 's', 'o', 'l', 'v', 'e', 'r', 's', '\030', '\022', ' ', '\003', '(', '\013', '2',
+'\035', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'A', 'd',
+'d', 'r', 'e', 's', 's', 'B', '\013', '\030', '\001', '\222', '\307', '\206', '\330', '\004', '\003', '3', '.', '0', 'R', '\014', 'd', 'n', 's', 'R', 'e',
+'s', 'o', 'l', 'v', 'e', 'r', 's', '\022', 'A', '\n', '\027', 'u', 's', 'e', '_', 't', 'c', 'p', '_', 'f', 'o', 'r', '_', 'd', 'n',
+'s', '_', 'l', 'o', 'o', 'k', 'u', 'p', 's', '\030', '-', ' ', '\001', '(', '\010', 'B', '\013', '\030', '\001', '\222', '\307', '\206', '\330', '\004', '\003',
+'3', '.', '0', 'R', '\023', 'u', 's', 'e', 'T', 'c', 'p', 'F', 'o', 'r', 'D', 'n', 's', 'L', 'o', 'o', 'k', 'u', 'p', 's', '\022',
+']', '\n', '\025', 'd', 'n', 's', '_', 'r', 'e', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030',
+'5', ' ', '\001', '(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e',
+'.', 'v', '3', '.', 'D', 'n', 's', 'R', 'e', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\023',
+'d', 'n', 's', 'R', 'e', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'e', '\n', '\031', 't', 'y',
+'p', 'e', 'd', '_', 'd', 'n', 's', '_', 'r', 'e', 's', 'o', 'l', 'v', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '7',
+' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.',
+'v', '3', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\026',
+'t', 'y', 'p', 'e', 'd', 'D', 'n', 's', 'R', 'e', 's', 'o', 'l', 'v', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'L', '\n',
+'\025', 'w', 'a', 'i', 't', '_', 'f', 'o', 'r', '_', 'w', 'a', 'r', 'm', '_', 'o', 'n', '_', 'i', 'n', 'i', 't', '\030', '6', ' ',
+'\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o',
+'l', 'V', 'a', 'l', 'u', 'e', 'R', '\021', 'w', 'a', 'i', 't', 'F', 'o', 'r', 'W', 'a', 'r', 'm', 'O', 'n', 'I', 'n', 'i', 't',
+'\022', 'V', '\n', '\021', 'o', 'u', 't', 'l', 'i', 'e', 'r', '_', 'd', 'e', 't', 'e', 'c', 't', 'i', 'o', 'n', '\030', '\023', ' ', '\001',
+'(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r',
+'.', 'v', '3', '.', 'O', 'u', 't', 'l', 'i', 'e', 'r', 'D', 'e', 't', 'e', 'c', 't', 'i', 'o', 'n', 'R', '\020', 'o', 'u', 't',
+'l', 'i', 'e', 'r', 'D', 'e', 't', 'e', 'c', 't', 'i', 'o', 'n', '\022', 'N', '\n', '\020', 'c', 'l', 'e', 'a', 'n', 'u', 'p', '_',
+'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\024', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p',
+'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\252', '\001', '\002', '*',
+'\000', 'R', '\017', 'c', 'l', 'e', 'a', 'n', 'u', 'p', 'I', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\022', 'R', '\n', '\024', 'u', 'p', 's',
+'t', 'r', 'e', 'a', 'm', '_', 'b', 'i', 'n', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\025', ' ', '\001', '(', '\013', '2', ' ',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'B', 'i', 'n',
+'d', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\022', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', 'B', 'i', 'n', 'd', 'C', 'o', 'n', 'f',
+'i', 'g', '\022', 'Y', '\n', '\020', 'l', 'b', '_', 's', 'u', 'b', 's', 'e', 't', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\026', ' ',
+'\001', '(', '\013', '2', '/', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e',
+'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f',
+'i', 'g', 'R', '\016', 'l', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'b', '\n', '\023', 'r', 'i', 'n',
+'g', '_', 'h', 'a', 's', 'h', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\027', ' ', '\001', '(', '\013', '2', '1', '.',
'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C',
-'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\016', 'c', 'o',
-'m', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'P', '\n', '\020', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't',
-'_', 's', 'o', 'c', 'k', 'e', 't', '\030', '\030', ' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
-'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k',
-'e', 't', 'R', '\017', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', '\022', ':', '\n', '\010', 'm', 'e',
-'t', 'a', 'd', 'a', 't', 'a', '\030', '\031', ' ', '\001', '(', '\013', '2', '\036', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'R', '\010', 'm', 'e', 't', 'a',
-'d', 'a', 't', 'a', '\022', 'l', '\n', '\022', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 's', 'e', 'l', 'e', 'c', 't', 'i', 'o',
-'n', '\030', '\032', ' ', '\001', '(', '\016', '2', '9', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l',
-'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'P',
-'r', 'o', 't', 'o', 'c', 'o', 'l', 'S', 'e', 'l', 'e', 'c', 't', 'i', 'o', 'n', 'B', '\002', '\030', '\001', 'R', '\021', 'p', 'r', 'o',
-'t', 'o', 'c', 'o', 'l', 'S', 'e', 'l', 'e', 'c', 't', 'i', 'o', 'n', '\022', 'r', '\n', '\033', 'u', 'p', 's', 't', 'r', 'e', 'a',
-'m', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '\036', ' ', '\001', '(',
-'\013', '2', '2', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.',
-'v', '3', '.', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'O', 'p', 't', 'i',
-'o', 'n', 's', 'R', '\031', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'O', 'p',
-'t', 'i', 'o', 'n', 's', '\022', 'U', '\n', '(', 'c', 'l', 'o', 's', 'e', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n',
-'s', '_', 'o', 'n', '_', 'h', 'o', 's', 't', '_', 'h', 'e', 'a', 'l', 't', 'h', '_', 'f', 'a', 'i', 'l', 'u', 'r', 'e', '\030',
-'\037', ' ', '\001', '(', '\010', 'R', '#', 'c', 'l', 'o', 's', 'e', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 's', 'O', 'n',
-'H', 'o', 's', 't', 'H', 'e', 'a', 'l', 't', 'h', 'F', 'a', 'i', 'l', 'u', 'r', 'e', '\022', '@', '\n', '\035', 'i', 'g', 'n', 'o',
-'r', 'e', '_', 'h', 'e', 'a', 'l', 't', 'h', '_', 'o', 'n', '_', 'h', 'o', 's', 't', '_', 'r', 'e', 'm', 'o', 'v', 'a', 'l',
-'\030', ' ', ' ', '\001', '(', '\010', 'R', '\031', 'i', 'g', 'n', 'o', 'r', 'e', 'H', 'e', 'a', 'l', 't', 'h', 'O', 'n', 'H', 'o', 's',
-'t', 'R', 'e', 'm', 'o', 'v', 'a', 'l', '\022', '9', '\n', '\007', 'f', 'i', 'l', 't', 'e', 'r', 's', '\030', '(', ' ', '\003', '(', '\013',
-'2', '\037', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v',
-'3', '.', 'F', 'i', 'l', 't', 'e', 'r', 'R', '\007', 'f', 'i', 'l', 't', 'e', 'r', 's', '\022', '`', '\n', '\025', 'l', 'o', 'a', 'd',
-'_', 'b', 'a', 'l', 'a', 'n', 'c', 'i', 'n', 'g', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', ')', ' ', '\001', '(', '\013', '2', ',',
-'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.',
-'L', 'o', 'a', 'd', 'B', 'a', 'l', 'a', 'n', 'c', 'i', 'n', 'g', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\023', 'l', 'o', 'a', 'd',
-'B', 'a', 'l', 'a', 'n', 'c', 'i', 'n', 'g', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'A', '\n', '\n', 'l', 'r', 's', '_', 's', 'e',
-'r', 'v', 'e', 'r', '\030', '*', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
-'.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\t', 'l', 'r',
-'s', 'S', 'e', 'r', 'v', 'e', 'r', '\022', '6', '\n', '\025', 't', 'r', 'a', 'c', 'k', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '_',
-'b', 'u', 'd', 'g', 'e', 't', 's', '\030', '/', ' ', '\001', '(', '\010', 'B', '\002', '\030', '\001', 'R', '\023', 't', 'r', 'a', 'c', 'k', 'T',
-'i', 'm', 'e', 'o', 'u', 't', 'B', 'u', 'd', 'g', 'e', 't', 's', '\022', 'S', '\n', '\017', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm',
-'_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '0', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
-'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o',
-'n', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\016', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'Z',
-'\n', '\023', 't', 'r', 'a', 'c', 'k', '_', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 's', 't', 'a', 't', 's', '\030', '1', ' ', '\001',
-'(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r',
-'.', 'v', '3', '.', 'T', 'r', 'a', 'c', 'k', 'C', 'l', 'u', 's', 't', 'e', 'r', 'S', 't', 'a', 't', 's', 'R', '\021', 't', 'r',
-'a', 'c', 'k', 'C', 'l', 'u', 's', 't', 'e', 'r', 'S', 't', 'a', 't', 's', '\022', '^', '\n', '\021', 'p', 'r', 'e', 'c', 'o', 'n',
-'n', 'e', 'c', 't', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '2', ' ', '\001', '(', '\013', '2', '1', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e',
-'r', '.', 'P', 'r', 'e', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\020', 'p', 'r', 'e', 'c', 'o',
-'n', 'n', 'e', 'c', 't', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'X', '\n', ')', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n',
-'_', 'p', 'o', 'o', 'l', '_', 'p', 'e', 'r', '_', 'd', 'o', 'w', 'n', 's', 't', 'r', 'e', 'a', 'm', '_', 'c', 'o', 'n', 'n',
-'e', 'c', 't', 'i', 'o', 'n', '\030', '3', ' ', '\001', '(', '\010', 'R', '%', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'P',
-'o', 'o', 'l', 'P', 'e', 'r', 'D', 'o', 'w', 'n', 's', 't', 'r', 'e', 'a', 'm', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o',
-'n', '\032', '\346', '\001', '\n', '\024', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', 'M', 'a', 't', 'c',
-'h', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R',
-'\004', 'n', 'a', 'm', 'e', '\022', '-', '\n', '\005', 'm', 'a', 't', 'c', 'h', '\030', '\002', ' ', '\001', '(', '\013', '2', '\027', '.', 'g', 'o',
-'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'S', 't', 'r', 'u', 'c', 't', 'R', '\005', 'm', 'a', 't',
-'c', 'h', '\022', 'P', '\n', '\020', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', '\030', '\003', ' ',
-'\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v',
-'3', '.', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', 'R', '\017', 't', 'r', 'a', 'n', 's', 'p',
-'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', ':', '0', '\232', '\305', '\210', '\036', '+', '\n', ')', 'e', 'n', 'v', 'o', 'y', '.', 'a',
-'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o',
-'c', 'k', 'e', 't', 'M', 'a', 't', 'c', 'h', '\032', '\230', '\001', '\n', '\021', 'C', 'u', 's', 't', 'o', 'm', 'C', 'l', 'u', 's', 't',
-'e', 'r', 'T', 'y', 'p', 'e', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004',
-'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '7', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i',
-'g', '\030', '\002', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
-'.', 'A', 'n', 'y', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', ':', '-', '\232', '\305', '\210', '\036', '(', '\n',
-'&', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'u', 's',
-'t', 'o', 'm', 'C', 'l', 'u', 's', 't', 'e', 'r', 'T', 'y', 'p', 'e', '\032', '\246', '\001', '\n', '\020', 'E', 'd', 's', 'C', 'l', 'u',
-'s', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'A', '\n', '\n', 'e', 'd', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030',
-'\001', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e',
-'.', 'v', '3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\t', 'e', 'd', 's', 'C', 'o', 'n', 'f',
-'i', 'g', '\022', '!', '\n', '\014', 's', 'e', 'r', 'v', 'i', 'c', 'e', '_', 'n', 'a', 'm', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'R',
-'\013', 's', 'e', 'r', 'v', 'i', 'c', 'e', 'N', 'a', 'm', 'e', ':', ',', '\232', '\305', '\210', '\036', '\'', '\n', '%', 'e', 'n', 'v', 'o',
-'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'E', 'd', 's', 'C', 'l', 'u', 's', 't',
-'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\300', '\010', '\n', '\016', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f',
-'i', 'g', '\022', 'y', '\n', '\017', 'f', 'a', 'l', 'l', 'b', 'a', 'c', 'k', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\001', ' ', '\001',
-'(', '\016', '2', 'F', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r',
-'.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i',
-'g', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'F', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', 'B',
-'\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\016', 'f', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y',
-'\022', '>', '\n', '\016', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 's', 'u', 'b', 's', 'e', 't', '\030', '\002', ' ', '\001', '(', '\013', '2',
+'l', 'u', 's', 't', 'e', 'r', '.', 'R', 'i', 'n', 'g', 'H', 'a', 's', 'h', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'H', '\001',
+'R', '\020', 'r', 'i', 'n', 'g', 'H', 'a', 's', 'h', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '[', '\n', '\020', 'm', 'a', 'g',
+'l', 'e', 'v', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '4', ' ', '\001', '(', '\013', '2', '/', '.', 'e', 'n', 'v',
+'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's',
+'t', 'e', 'r', '.', 'M', 'a', 'g', 'l', 'e', 'v', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'H', '\001', 'R', '\016', 'm', 'a', 'g',
+'l', 'e', 'v', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'k', '\n', '\026', 'o', 'r', 'i', 'g', 'i', 'n', 'a', 'l', '_', 'd',
+'s', 't', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\"', ' ', '\001', '(', '\013', '2', '4', '.', 'e', 'n', 'v', 'o',
+'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't',
+'e', 'r', '.', 'O', 'r', 'i', 'g', 'i', 'n', 'a', 'l', 'D', 's', 't', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'H', '\001', 'R',
+'\023', 'o', 'r', 'i', 'g', 'i', 'n', 'a', 'l', 'D', 's', 't', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'n', '\n', '\027', 'l',
+'e', 'a', 's', 't', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '%', ' ',
+'\001', '(', '\013', '2', '5', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e',
+'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', 'e', 'a', 's', 't', 'R', 'e', 'q', 'u', 'e', 's', 't',
+'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'H', '\001', 'R', '\024', 'l', 'e', 'a', 's', 't', 'R', 'e', 'q', 'u', 'e', 's', 't', 'L',
+'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'Y', '\n', '\020', 'c', 'o', 'm', 'm', 'o', 'n', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f',
+'i', 'g', '\030', '\033', ' ', '\001', '(', '\013', '2', '/', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c',
+'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L',
+'b', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\016', 'c', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'P',
+'\n', '\020', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', '\030', '\030', ' ', '\001', '(', '\013', '2',
+'%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'r',
+'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', 'R', '\017', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S',
+'o', 'c', 'k', 'e', 't', '\022', ':', '\n', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030', '\031', ' ', '\001', '(', '\013', '2', '\036',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'M', 'e', 't',
+'a', 'd', 'a', 't', 'a', 'R', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\022', 'u', '\n', '\022', 'p', 'r', 'o', 't', 'o', 'c',
+'o', 'l', '_', 's', 'e', 'l', 'e', 'c', 't', 'i', 'o', 'n', '\030', '\032', ' ', '\001', '(', '\016', '2', '9', '.', 'e', 'n', 'v', 'o',
+'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't',
+'e', 'r', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'S', 'e', 'l', 'e', 'c', 't', 'i',
+'o', 'n', 'B', '\013', '\030', '\001', '\222', '\307', '\206', '\330', '\004', '\003', '3', '.', '0', 'R', '\021', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l',
+'S', 'e', 'l', 'e', 'c', 't', 'i', 'o', 'n', '\022', 'r', '\n', '\033', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', '_', 'c', 'o', 'n',
+'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '\036', ' ', '\001', '(', '\013', '2', '2', '.', 'e',
+'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'U', 'p',
+'s', 't', 'r', 'e', 'a', 'm', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'O', 'p', 't', 'i', 'o', 'n', 's', 'R', '\031',
+'u', 'p', 's', 't', 'r', 'e', 'a', 'm', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'O', 'p', 't', 'i', 'o', 'n', 's',
+'\022', 'U', '\n', '(', 'c', 'l', 'o', 's', 'e', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 's', '_', 'o', 'n', '_',
+'h', 'o', 's', 't', '_', 'h', 'e', 'a', 'l', 't', 'h', '_', 'f', 'a', 'i', 'l', 'u', 'r', 'e', '\030', '\037', ' ', '\001', '(', '\010',
+'R', '#', 'c', 'l', 'o', 's', 'e', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 's', 'O', 'n', 'H', 'o', 's', 't', 'H',
+'e', 'a', 'l', 't', 'h', 'F', 'a', 'i', 'l', 'u', 'r', 'e', '\022', '@', '\n', '\035', 'i', 'g', 'n', 'o', 'r', 'e', '_', 'h', 'e',
+'a', 'l', 't', 'h', '_', 'o', 'n', '_', 'h', 'o', 's', 't', '_', 'r', 'e', 'm', 'o', 'v', 'a', 'l', '\030', ' ', ' ', '\001', '(',
+'\010', 'R', '\031', 'i', 'g', 'n', 'o', 'r', 'e', 'H', 'e', 'a', 'l', 't', 'h', 'O', 'n', 'H', 'o', 's', 't', 'R', 'e', 'm', 'o',
+'v', 'a', 'l', '\022', '9', '\n', '\007', 'f', 'i', 'l', 't', 'e', 'r', 's', '\030', '(', ' ', '\003', '(', '\013', '2', '\037', '.', 'e', 'n',
+'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'F', 'i', 'l',
+'t', 'e', 'r', 'R', '\007', 'f', 'i', 'l', 't', 'e', 'r', 's', '\022', '`', '\n', '\025', 'l', 'o', 'a', 'd', '_', 'b', 'a', 'l', 'a',
+'n', 'c', 'i', 'n', 'g', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', ')', ' ', '\001', '(', '\013', '2', ',', '.', 'e', 'n', 'v', 'o',
+'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'L', 'o', 'a', 'd', 'B',
+'a', 'l', 'a', 'n', 'c', 'i', 'n', 'g', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\023', 'l', 'o', 'a', 'd', 'B', 'a', 'l', 'a', 'n',
+'c', 'i', 'n', 'g', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'A', '\n', '\n', 'l', 'r', 's', '_', 's', 'e', 'r', 'v', 'e', 'r', '\030',
+'*', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e',
+'.', 'v', '3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\t', 'l', 'r', 's', 'S', 'e', 'r', 'v',
+'e', 'r', '\022', '?', '\n', '\025', 't', 'r', 'a', 'c', 'k', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '_', 'b', 'u', 'd', 'g', 'e',
+'t', 's', '\030', '/', ' ', '\001', '(', '\010', 'B', '\013', '\030', '\001', '\222', '\307', '\206', '\330', '\004', '\003', '3', '.', '0', 'R', '\023', 't', 'r',
+'a', 'c', 'k', 'T', 'i', 'm', 'e', 'o', 'u', 't', 'B', 'u', 'd', 'g', 'e', 't', 's', '\022', 'S', '\n', '\017', 'u', 'p', 's', 't',
+'r', 'e', 'a', 'm', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '0', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y',
+'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e',
+'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\016', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', 'C', 'o', 'n', 'f',
+'i', 'g', '\022', 'Z', '\n', '\023', 't', 'r', 'a', 'c', 'k', '_', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 's', 't', 'a', 't', 's',
+'\030', '1', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u',
+'s', 't', 'e', 'r', '.', 'v', '3', '.', 'T', 'r', 'a', 'c', 'k', 'C', 'l', 'u', 's', 't', 'e', 'r', 'S', 't', 'a', 't', 's',
+'R', '\021', 't', 'r', 'a', 'c', 'k', 'C', 'l', 'u', 's', 't', 'e', 'r', 'S', 't', 'a', 't', 's', '\022', '^', '\n', '\021', 'p', 'r',
+'e', 'c', 'o', 'n', 'n', 'e', 'c', 't', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '2', ' ', '\001', '(', '\013', '2', '1', '.', 'e',
+'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l',
+'u', 's', 't', 'e', 'r', '.', 'P', 'r', 'e', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\020', 'p',
+'r', 'e', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'X', '\n', ')', 'c', 'o', 'n', 'n', 'e', 'c',
+'t', 'i', 'o', 'n', '_', 'p', 'o', 'o', 'l', '_', 'p', 'e', 'r', '_', 'd', 'o', 'w', 'n', 's', 't', 'r', 'e', 'a', 'm', '_',
+'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '\030', '3', ' ', '\001', '(', '\010', 'R', '%', 'c', 'o', 'n', 'n', 'e', 'c', 't',
+'i', 'o', 'n', 'P', 'o', 'o', 'l', 'P', 'e', 'r', 'D', 'o', 'w', 'n', 's', 't', 'r', 'e', 'a', 'm', 'C', 'o', 'n', 'n', 'e',
+'c', 't', 'i', 'o', 'n', '\032', '\346', '\001', '\n', '\024', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't',
+'M', 'a', 't', 'c', 'h', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r',
+'\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '-', '\n', '\005', 'm', 'a', 't', 'c', 'h', '\030', '\002', ' ', '\001', '(', '\013', '2',
'\027', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'S', 't', 'r', 'u', 'c', 't', 'R',
-'\r', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'S', 'u', 'b', 's', 'e', 't', '\022', 'k', '\n', '\020', 's', 'u', 'b', 's', 'e', 't', '_',
-'s', 'e', 'l', 'e', 'c', 't', 'o', 'r', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', '@', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
-'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.',
-'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'S', 'e',
-'l', 'e', 'c', 't', 'o', 'r', 'R', '\017', 's', 'u', 'b', 's', 'e', 't', 'S', 'e', 'l', 'e', 'c', 't', 'o', 'r', 's', '\022', '2',
-'\n', '\025', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', '_', 'w', 'e', 'i', 'g', 'h', 't', '_', 'a', 'w', 'a', 'r', 'e', '\030', '\004',
-' ', '\001', '(', '\010', 'R', '\023', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'W', 'e', 'i', 'g', 'h', 't', 'A', 'w', 'a', 'r', 'e',
-'\022', '2', '\n', '\025', 's', 'c', 'a', 'l', 'e', '_', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', '_', 'w', 'e', 'i', 'g', 'h', 't',
-'\030', '\005', ' ', '\001', '(', '\010', 'R', '\023', 's', 'c', 'a', 'l', 'e', 'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'W', 'e', 'i', 'g',
-'h', 't', '\022', '$', '\n', '\016', 'p', 'a', 'n', 'i', 'c', '_', 'm', 'o', 'd', 'e', '_', 'a', 'n', 'y', '\030', '\006', ' ', '\001', '(',
-'\010', 'R', '\014', 'p', 'a', 'n', 'i', 'c', 'M', 'o', 'd', 'e', 'A', 'n', 'y', '\022', '\036', '\n', '\013', 'l', 'i', 's', 't', '_', 'a',
-'s', '_', 'a', 'n', 'y', '\030', '\007', ' ', '\001', '(', '\010', 'R', '\t', 'l', 'i', 's', 't', 'A', 's', 'A', 'n', 'y', '\032', '\332', '\003',
-'\n', '\020', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'S', 'e', 'l', 'e', 'c', 't', 'o', 'r', '\022', '\022', '\n', '\004', 'k', 'e', 'y',
-'s', '\030', '\001', ' ', '\003', '(', '\t', 'R', '\004', 'k', 'e', 'y', 's', '\022', '3', '\n', '\026', 's', 'i', 'n', 'g', 'l', 'e', '_', 'h',
-'o', 's', 't', '_', 'p', 'e', 'r', '_', 's', 'u', 'b', 's', 'e', 't', '\030', '\004', ' ', '\001', '(', '\010', 'R', '\023', 's', 'i', 'n',
-'g', 'l', 'e', 'H', 'o', 's', 't', 'P', 'e', 'r', 'S', 'u', 'b', 's', 'e', 't', '\022', '\222', '\001', '\n', '\017', 'f', 'a', 'l', 'l',
-'b', 'a', 'c', 'k', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\002', ' ', '\001', '(', '\016', '2', '_', '.', 'e', 'n', 'v', 'o', 'y',
+'\005', 'm', 'a', 't', 'c', 'h', '\022', 'P', '\n', '\020', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e',
+'t', '\030', '\003', ' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o',
+'r', 'e', '.', 'v', '3', '.', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', 'R', '\017', 't', 'r',
+'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', ':', '0', '\232', '\305', '\210', '\036', '+', '\n', ')', 'e', 'n', 'v',
+'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'T', 'r', 'a', 'n', 's', 'p', 'o',
+'r', 't', 'S', 'o', 'c', 'k', 'e', 't', 'M', 'a', 't', 'c', 'h', '\032', '\230', '\001', '\n', '\021', 'C', 'u', 's', 't', 'o', 'm', 'C',
+'l', 'u', 's', 't', 'e', 'r', 'T', 'y', 'p', 'e', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B',
+'\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '7', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c',
+'o', 'n', 'f', 'i', 'g', '\030', '\002', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't',
+'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', ':', '-', '\232', '\305',
+'\210', '\036', '(', '\n', '&', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r',
+'.', 'C', 'u', 's', 't', 'o', 'm', 'C', 'l', 'u', 's', 't', 'e', 'r', 'T', 'y', 'p', 'e', '\032', '\246', '\001', '\n', '\020', 'E', 'd',
+'s', 'C', 'l', 'u', 's', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'A', '\n', '\n', 'e', 'd', 's', '_', 'c', 'o', 'n',
+'f', 'i', 'g', '\030', '\001', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
+'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\t', 'e', 'd', 's',
+'C', 'o', 'n', 'f', 'i', 'g', '\022', '!', '\n', '\014', 's', 'e', 'r', 'v', 'i', 'c', 'e', '_', 'n', 'a', 'm', 'e', '\030', '\002', ' ',
+'\001', '(', '\t', 'R', '\013', 's', 'e', 'r', 'v', 'i', 'c', 'e', 'N', 'a', 'm', 'e', ':', ',', '\232', '\305', '\210', '\036', '\'', '\n', '%',
+'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'E', 'd', 's', 'C',
+'l', 'u', 's', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\300', '\010', '\n', '\016', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't',
+'C', 'o', 'n', 'f', 'i', 'g', '\022', 'y', '\n', '\017', 'f', 'a', 'l', 'l', 'b', 'a', 'c', 'k', '_', 'p', 'o', 'l', 'i', 'c', 'y',
+'\030', '\001', ' ', '\001', '(', '\016', '2', 'F', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u',
+'s', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C',
+'o', 'n', 'f', 'i', 'g', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'F', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l',
+'i', 'c', 'y', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\016', 'f', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o',
+'l', 'i', 'c', 'y', '\022', '>', '\n', '\016', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 's', 'u', 'b', 's', 'e', 't', '\030', '\002', ' ',
+'\001', '(', '\013', '2', '\027', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'S', 't', 'r',
+'u', 'c', 't', 'R', '\r', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'S', 'u', 'b', 's', 'e', 't', '\022', 'k', '\n', '\020', 's', 'u', 'b',
+'s', 'e', 't', '_', 's', 'e', 'l', 'e', 'c', 't', 'o', 'r', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', '@', '.', 'e', 'n', 'v',
+'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's',
+'t', 'e', 'r', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'L', 'b', 'S', 'u', 'b', 's',
+'e', 't', 'S', 'e', 'l', 'e', 'c', 't', 'o', 'r', 'R', '\017', 's', 'u', 'b', 's', 'e', 't', 'S', 'e', 'l', 'e', 'c', 't', 'o',
+'r', 's', '\022', '2', '\n', '\025', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', '_', 'w', 'e', 'i', 'g', 'h', 't', '_', 'a', 'w', 'a',
+'r', 'e', '\030', '\004', ' ', '\001', '(', '\010', 'R', '\023', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'W', 'e', 'i', 'g', 'h', 't', 'A',
+'w', 'a', 'r', 'e', '\022', '2', '\n', '\025', 's', 'c', 'a', 'l', 'e', '_', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', '_', 'w', 'e',
+'i', 'g', 'h', 't', '\030', '\005', ' ', '\001', '(', '\010', 'R', '\023', 's', 'c', 'a', 'l', 'e', 'L', 'o', 'c', 'a', 'l', 'i', 't', 'y',
+'W', 'e', 'i', 'g', 'h', 't', '\022', '$', '\n', '\016', 'p', 'a', 'n', 'i', 'c', '_', 'm', 'o', 'd', 'e', '_', 'a', 'n', 'y', '\030',
+'\006', ' ', '\001', '(', '\010', 'R', '\014', 'p', 'a', 'n', 'i', 'c', 'M', 'o', 'd', 'e', 'A', 'n', 'y', '\022', '\036', '\n', '\013', 'l', 'i',
+'s', 't', '_', 'a', 's', '_', 'a', 'n', 'y', '\030', '\007', ' ', '\001', '(', '\010', 'R', '\t', 'l', 'i', 's', 't', 'A', 's', 'A', 'n',
+'y', '\032', '\332', '\003', '\n', '\020', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'S', 'e', 'l', 'e', 'c', 't', 'o', 'r', '\022', '\022', '\n',
+'\004', 'k', 'e', 'y', 's', '\030', '\001', ' ', '\003', '(', '\t', 'R', '\004', 'k', 'e', 'y', 's', '\022', '3', '\n', '\026', 's', 'i', 'n', 'g',
+'l', 'e', '_', 'h', 'o', 's', 't', '_', 'p', 'e', 'r', '_', 's', 'u', 'b', 's', 'e', 't', '\030', '\004', ' ', '\001', '(', '\010', 'R',
+'\023', 's', 'i', 'n', 'g', 'l', 'e', 'H', 'o', 's', 't', 'P', 'e', 'r', 'S', 'u', 'b', 's', 'e', 't', '\022', '\222', '\001', '\n', '\017',
+'f', 'a', 'l', 'l', 'b', 'a', 'c', 'k', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\002', ' ', '\001', '(', '\016', '2', '_', '.', 'e',
+'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l',
+'u', 's', 't', 'e', 'r', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'L', 'b', 'S', 'u',
+'b', 's', 'e', 't', 'S', 'e', 'l', 'e', 'c', 't', 'o', 'r', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'S', 'e', 'l', 'e',
+'c', 't', 'o', 'r', 'F', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', 'B', '\010', '\372', 'B', '\005', '\202', '\001',
+'\002', '\020', '\001', 'R', '\016', 'f', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '0', '\n', '\024', 'f', 'a',
+'l', 'l', 'b', 'a', 'c', 'k', '_', 'k', 'e', 'y', 's', '_', 's', 'u', 'b', 's', 'e', 't', '\030', '\003', ' ', '\003', '(', '\t', 'R',
+'\022', 'f', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'K', 'e', 'y', 's', 'S', 'u', 'b', 's', 'e', 't', '\"', 'y', '\n', '\036', 'L', 'b',
+'S', 'u', 'b', 's', 'e', 't', 'S', 'e', 'l', 'e', 'c', 't', 'o', 'r', 'F', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l',
+'i', 'c', 'y', '\022', '\017', '\n', '\013', 'N', 'O', 'T', '_', 'D', 'E', 'F', 'I', 'N', 'E', 'D', '\020', '\000', '\022', '\017', '\n', '\013', 'N',
+'O', '_', 'F', 'A', 'L', 'L', 'B', 'A', 'C', 'K', '\020', '\001', '\022', '\020', '\n', '\014', 'A', 'N', 'Y', '_', 'E', 'N', 'D', 'P', 'O',
+'I', 'N', 'T', '\020', '\002', '\022', '\022', '\n', '\016', 'D', 'E', 'F', 'A', 'U', 'L', 'T', '_', 'S', 'U', 'B', 'S', 'E', 'T', '\020', '\003',
+'\022', '\017', '\n', '\013', 'K', 'E', 'Y', 'S', '_', 'S', 'U', 'B', 'S', 'E', 'T', '\020', '\004', ':', ';', '\232', '\305', '\210', '\036', '6', '\n',
+'4', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', 'b', 'S',
+'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'S', 'e', 'l', 'e', 'c',
+'t', 'o', 'r', '\"', 'O', '\n', '\026', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'F', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o',
+'l', 'i', 'c', 'y', '\022', '\017', '\n', '\013', 'N', 'O', '_', 'F', 'A', 'L', 'L', 'B', 'A', 'C', 'K', '\020', '\000', '\022', '\020', '\n', '\014',
+'A', 'N', 'Y', '_', 'E', 'N', 'D', 'P', 'O', 'I', 'N', 'T', '\020', '\001', '\022', '\022', '\n', '\016', 'D', 'E', 'F', 'A', 'U', 'L', 'T',
+'_', 'S', 'U', 'B', 'S', 'E', 'T', '\020', '\002', ':', '*', '\232', '\305', '\210', '\036', '%', '\n', '#', 'e', 'n', 'v', 'o', 'y', '.', 'a',
+'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n',
+'f', 'i', 'g', '\032', '\347', '\001', '\n', '\024', 'L', 'e', 'a', 's', 't', 'R', 'e', 'q', 'u', 'e', 's', 't', 'L', 'b', 'C', 'o', 'n',
+'f', 'i', 'g', '\022', 'H', '\n', '\014', 'c', 'h', 'o', 'i', 'c', 'e', '_', 'c', 'o', 'u', 'n', 't', '\030', '\001', ' ', '\001', '(', '\013',
+'2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2',
+'V', 'a', 'l', 'u', 'e', 'B', '\007', '\372', 'B', '\004', '*', '\002', '(', '\002', 'R', '\013', 'c', 'h', 'o', 'i', 'c', 'e', 'C', 'o', 'u',
+'n', 't', '\022', 'S', '\n', '\023', 'a', 'c', 't', 'i', 'v', 'e', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'b', 'i', 'a', 's',
+'\030', '\002', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r',
+'e', '.', 'v', '3', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'D', 'o', 'u', 'b', 'l', 'e', 'R', '\021', 'a', 'c', 't', 'i', 'v',
+'e', 'R', 'e', 'q', 'u', 'e', 's', 't', 'B', 'i', 'a', 's', ':', '0', '\232', '\305', '\210', '\036', '+', '\n', ')', 'e', 'n', 'v', 'o',
+'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', 'e', 'a', 's', 't', 'R', 'e', 'q',
+'u', 'e', 's', 't', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\221', '\003', '\n', '\020', 'R', 'i', 'n', 'g', 'H', 'a', 's', 'h',
+'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'T', '\n', '\021', 'm', 'i', 'n', 'i', 'm', 'u', 'm', '_', 'r', 'i', 'n', 'g', '_',
+'s', 'i', 'z', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o',
+'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '6', '4', 'V', 'a', 'l', 'u', 'e', 'B', '\n', '\372', 'B', '\007', '2', '\005', '\030', '\200', '\200',
+'\200', '\004', 'R', '\017', 'm', 'i', 'n', 'i', 'm', 'u', 'm', 'R', 'i', 'n', 'g', 'S', 'i', 'z', 'e', '\022', 'm', '\n', '\r', 'h', 'a',
+'s', 'h', '_', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', '\030', '\003', ' ', '\001', '(', '\016', '2', '>', '.', 'e', 'n', 'v', 'o', 'y',
'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e',
-'r', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't',
-'S', 'e', 'l', 'e', 'c', 't', 'o', 'r', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'S', 'e', 'l', 'e', 'c', 't', 'o', 'r',
-'F', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R',
-'\016', 'f', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '0', '\n', '\024', 'f', 'a', 'l', 'l', 'b', 'a',
-'c', 'k', '_', 'k', 'e', 'y', 's', '_', 's', 'u', 'b', 's', 'e', 't', '\030', '\003', ' ', '\003', '(', '\t', 'R', '\022', 'f', 'a', 'l',
-'l', 'b', 'a', 'c', 'k', 'K', 'e', 'y', 's', 'S', 'u', 'b', 's', 'e', 't', '\"', 'y', '\n', '\036', 'L', 'b', 'S', 'u', 'b', 's',
-'e', 't', 'S', 'e', 'l', 'e', 'c', 't', 'o', 'r', 'F', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', '\022',
-'\017', '\n', '\013', 'N', 'O', 'T', '_', 'D', 'E', 'F', 'I', 'N', 'E', 'D', '\020', '\000', '\022', '\017', '\n', '\013', 'N', 'O', '_', 'F', 'A',
-'L', 'L', 'B', 'A', 'C', 'K', '\020', '\001', '\022', '\020', '\n', '\014', 'A', 'N', 'Y', '_', 'E', 'N', 'D', 'P', 'O', 'I', 'N', 'T', '\020',
-'\002', '\022', '\022', '\n', '\016', 'D', 'E', 'F', 'A', 'U', 'L', 'T', '_', 'S', 'U', 'B', 'S', 'E', 'T', '\020', '\003', '\022', '\017', '\n', '\013',
-'K', 'E', 'Y', 'S', '_', 'S', 'U', 'B', 'S', 'E', 'T', '\020', '\004', ':', ';', '\232', '\305', '\210', '\036', '6', '\n', '4', 'e', 'n', 'v',
-'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e',
-'t', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'S', 'e', 'l', 'e', 'c', 't', 'o', 'r', '\"',
-'O', '\n', '\026', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'F', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y',
-'\022', '\017', '\n', '\013', 'N', 'O', '_', 'F', 'A', 'L', 'L', 'B', 'A', 'C', 'K', '\020', '\000', '\022', '\020', '\n', '\014', 'A', 'N', 'Y', '_',
-'E', 'N', 'D', 'P', 'O', 'I', 'N', 'T', '\020', '\001', '\022', '\022', '\n', '\016', 'D', 'E', 'F', 'A', 'U', 'L', 'T', '_', 'S', 'U', 'B',
-'S', 'E', 'T', '\020', '\002', ':', '*', '\232', '\305', '\210', '\036', '%', '\n', '#', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v',
-'2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', '\032',
-'\347', '\001', '\n', '\024', 'L', 'e', 'a', 's', 't', 'R', 'e', 'q', 'u', 'e', 's', 't', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022',
-'H', '\n', '\014', 'c', 'h', 'o', 'i', 'c', 'e', '_', 'c', 'o', 'u', 'n', 't', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g',
-'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u',
-'e', 'B', '\007', '\372', 'B', '\004', '*', '\002', '(', '\002', 'R', '\013', 'c', 'h', 'o', 'i', 'c', 'e', 'C', 'o', 'u', 'n', 't', '\022', 'S',
-'\n', '\023', 'a', 'c', 't', 'i', 'v', 'e', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'b', 'i', 'a', 's', '\030', '\002', ' ', '\001',
-'(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3',
-'.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'D', 'o', 'u', 'b', 'l', 'e', 'R', '\021', 'a', 'c', 't', 'i', 'v', 'e', 'R', 'e', 'q',
-'u', 'e', 's', 't', 'B', 'i', 'a', 's', ':', '0', '\232', '\305', '\210', '\036', '+', '\n', ')', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
-'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', 'e', 'a', 's', 't', 'R', 'e', 'q', 'u', 'e', 's', 't',
-'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\221', '\003', '\n', '\020', 'R', 'i', 'n', 'g', 'H', 'a', 's', 'h', 'L', 'b', 'C', 'o',
-'n', 'f', 'i', 'g', '\022', 'T', '\n', '\021', 'm', 'i', 'n', 'i', 'm', 'u', 'm', '_', 'r', 'i', 'n', 'g', '_', 's', 'i', 'z', 'e',
-'\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.',
-'U', 'I', 'n', 't', '6', '4', 'V', 'a', 'l', 'u', 'e', 'B', '\n', '\372', 'B', '\007', '2', '\005', '\030', '\200', '\200', '\200', '\004', 'R', '\017',
-'m', 'i', 'n', 'i', 'm', 'u', 'm', 'R', 'i', 'n', 'g', 'S', 'i', 'z', 'e', '\022', 'm', '\n', '\r', 'h', 'a', 's', 'h', '_', 'f',
-'u', 'n', 'c', 't', 'i', 'o', 'n', '\030', '\003', ' ', '\001', '(', '\016', '2', '>', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
-'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'R', 'i',
-'n', 'g', 'H', 'a', 's', 'h', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'H', 'a', 's', 'h', 'F', 'u', 'n', 'c', 't', 'i',
-'o', 'n', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\014', 'h', 'a', 's', 'h', 'F', 'u', 'n', 'c', 't', 'i', 'o',
-'n', '\022', 'T', '\n', '\021', 'm', 'a', 'x', 'i', 'm', 'u', 'm', '_', 'r', 'i', 'n', 'g', '_', 's', 'i', 'z', 'e', '\030', '\004', ' ',
+'r', '.', 'R', 'i', 'n', 'g', 'H', 'a', 's', 'h', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'H', 'a', 's', 'h', 'F', 'u',
+'n', 'c', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\014', 'h', 'a', 's', 'h', 'F', 'u', 'n',
+'c', 't', 'i', 'o', 'n', '\022', 'T', '\n', '\021', 'm', 'a', 'x', 'i', 'm', 'u', 'm', '_', 'r', 'i', 'n', 'g', '_', 's', 'i', 'z',
+'e', '\030', '\004', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
+'.', 'U', 'I', 'n', 't', '6', '4', 'V', 'a', 'l', 'u', 'e', 'B', '\n', '\372', 'B', '\007', '2', '\005', '\030', '\200', '\200', '\200', '\004', 'R',
+'\017', 'm', 'a', 'x', 'i', 'm', 'u', 'm', 'R', 'i', 'n', 'g', 'S', 'i', 'z', 'e', '\"', '.', '\n', '\014', 'H', 'a', 's', 'h', 'F',
+'u', 'n', 'c', 't', 'i', 'o', 'n', '\022', '\013', '\n', '\007', 'X', 'X', '_', 'H', 'A', 'S', 'H', '\020', '\000', '\022', '\021', '\n', '\r', 'M',
+'U', 'R', 'M', 'U', 'R', '_', 'H', 'A', 'S', 'H', '_', '2', '\020', '\001', ':', ',', '\232', '\305', '\210', '\036', '\'', '\n', '%', 'e', 'n',
+'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'R', 'i', 'n', 'g', 'H', 'a',
+'s', 'h', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'J', '\004', '\010', '\002', '\020', '\003', '\032', 'Y', '\n', '\016', 'M', 'a', 'g', 'l', 'e',
+'v', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'G', '\n', '\n', 't', 'a', 'b', 'l', 'e', '_', 's', 'i', 'z', 'e', '\030', '\001',
+' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I',
+'n', 't', '6', '4', 'V', 'a', 'l', 'u', 'e', 'B', '\n', '\372', 'B', '\007', '2', '\005', '\030', '\313', '\226', '\261', '\002', 'R', '\t', 't', 'a',
+'b', 'l', 'e', 'S', 'i', 'z', 'e', '\032', 'n', '\n', '\023', 'O', 'r', 'i', 'g', 'i', 'n', 'a', 'l', 'D', 's', 't', 'L', 'b', 'C',
+'o', 'n', 'f', 'i', 'g', '\022', '&', '\n', '\017', 'u', 's', 'e', '_', 'h', 't', 't', 'p', '_', 'h', 'e', 'a', 'd', 'e', 'r', '\030',
+'\001', ' ', '\001', '(', '\010', 'R', '\r', 'u', 's', 'e', 'H', 't', 't', 'p', 'H', 'e', 'a', 'd', 'e', 'r', ':', '/', '\232', '\305', '\210',
+'\036', '*', '\n', '(', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.',
+'O', 'r', 'i', 'g', 'i', 'n', 'a', 'l', 'D', 's', 't', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\374', '\n', '\n', '\016', 'C',
+'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'N', '\n', '\027', 'h', 'e', 'a', 'l', 't', 'h', 'y', '_',
+'p', 'a', 'n', 'i', 'c', '_', 't', 'h', 'r', 'e', 's', 'h', 'o', 'l', 'd', '\030', '\001', ' ', '\001', '(', '\013', '2', '\026', '.', 'e',
+'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\025', 'h', 'e', 'a',
+'l', 't', 'h', 'y', 'P', 'a', 'n', 'i', 'c', 'T', 'h', 'r', 'e', 's', 'h', 'o', 'l', 'd', '\022', 't', '\n', '\024', 'z', 'o', 'n',
+'e', '_', 'a', 'w', 'a', 'r', 'e', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\002', ' ', '\001', '(', '\013', '2', 'A',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.',
+'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'Z', 'o',
+'n', 'e', 'A', 'w', 'a', 'r', 'e', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'H', '\000', 'R', '\021', 'z', 'o', 'n', 'e', 'A', 'w',
+'a', 'r', 'e', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '\211', '\001', '\n', '\033', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', '_',
+'w', 'e', 'i', 'g', 'h', 't', 'e', 'd', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2',
+'H', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3',
+'.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'L',
+'o', 'c', 'a', 'l', 'i', 't', 'y', 'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'H', '\000',
+'R', '\030', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'L', 'b', 'C', 'o', 'n', 'f', 'i',
+'g', '\022', 'I', '\n', '\023', 'u', 'p', 'd', 'a', 't', 'e', '_', 'm', 'e', 'r', 'g', 'e', '_', 'w', 'i', 'n', 'd', 'o', 'w', '\030',
+'\004', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D',
+'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\021', 'u', 'p', 'd', 'a', 't', 'e', 'M', 'e', 'r', 'g', 'e', 'W', 'i', 'n', 'd', 'o',
+'w', '\022', 'C', '\n', '\037', 'i', 'g', 'n', 'o', 'r', 'e', '_', 'n', 'e', 'w', '_', 'h', 'o', 's', 't', 's', '_', 'u', 'n', 't',
+'i', 'l', '_', 'f', 'i', 'r', 's', 't', '_', 'h', 'c', '\030', '\005', ' ', '\001', '(', '\010', 'R', '\032', 'i', 'g', 'n', 'o', 'r', 'e',
+'N', 'e', 'w', 'H', 'o', 's', 't', 's', 'U', 'n', 't', 'i', 'l', 'F', 'i', 'r', 's', 't', 'H', 'c', '\022', 'M', '\n', '$', 'c',
+'l', 'o', 's', 'e', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 's', '_', 'o', 'n', '_', 'h', 'o', 's', 't', '_',
+'s', 'e', 't', '_', 'c', 'h', 'a', 'n', 'g', 'e', '\030', '\006', ' ', '\001', '(', '\010', 'R', '\037', 'c', 'l', 'o', 's', 'e', 'C', 'o',
+'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 's', 'O', 'n', 'H', 'o', 's', 't', 'S', 'e', 't', 'C', 'h', 'a', 'n', 'g', 'e', '\022',
+'\212', '\001', '\n', '\034', 'c', 'o', 'n', 's', 'i', 's', 't', 'e', 'n', 't', '_', 'h', 'a', 's', 'h', 'i', 'n', 'g', '_', 'l', 'b',
+'_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\007', ' ', '\001', '(', '\013', '2', 'I', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
+'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o',
+'m', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'C', 'o', 'n', 's', 'i', 's', 't', 'e', 'n', 't', 'H', 'a',
+'s', 'h', 'i', 'n', 'g', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\031', 'c', 'o', 'n', 's', 'i', 's', 't', 'e', 'n', 't',
+'H', 'a', 's', 'h', 'i', 'n', 'g', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\215', '\002', '\n', '\021', 'Z', 'o', 'n', 'e', 'A',
+'w', 'a', 'r', 'e', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '?', '\n', '\017', 'r', 'o', 'u', 't', 'i', 'n', 'g', '_', 'e',
+'n', 'a', 'b', 'l', 'e', 'd', '\030', '\001', ' ', '\001', '(', '\013', '2', '\026', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e',
+'.', 'v', '3', '.', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\016', 'r', 'o', 'u', 't', 'i', 'n', 'g', 'E', 'n', 'a', 'b', 'l',
+'e', 'd', '\022', 'F', '\n', '\020', 'm', 'i', 'n', '_', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 's', 'i', 'z', 'e', '\030', '\002', ' ',
'\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n',
-'t', '6', '4', 'V', 'a', 'l', 'u', 'e', 'B', '\n', '\372', 'B', '\007', '2', '\005', '\030', '\200', '\200', '\200', '\004', 'R', '\017', 'm', 'a', 'x',
-'i', 'm', 'u', 'm', 'R', 'i', 'n', 'g', 'S', 'i', 'z', 'e', '\"', '.', '\n', '\014', 'H', 'a', 's', 'h', 'F', 'u', 'n', 'c', 't',
-'i', 'o', 'n', '\022', '\013', '\n', '\007', 'X', 'X', '_', 'H', 'A', 'S', 'H', '\020', '\000', '\022', '\021', '\n', '\r', 'M', 'U', 'R', 'M', 'U',
-'R', '_', 'H', 'A', 'S', 'H', '_', '2', '\020', '\001', ':', ',', '\232', '\305', '\210', '\036', '\'', '\n', '%', 'e', 'n', 'v', 'o', 'y', '.',
-'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'R', 'i', 'n', 'g', 'H', 'a', 's', 'h', 'L', 'b',
-'C', 'o', 'n', 'f', 'i', 'g', 'J', '\004', '\010', '\002', '\020', '\003', '\032', 'M', '\n', '\016', 'M', 'a', 'g', 'l', 'e', 'v', 'L', 'b', 'C',
-'o', 'n', 'f', 'i', 'g', '\022', ';', '\n', '\n', 't', 'a', 'b', 'l', 'e', '_', 's', 'i', 'z', 'e', '\030', '\001', ' ', '\001', '(', '\013',
-'2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '6', '4',
-'V', 'a', 'l', 'u', 'e', 'R', '\t', 't', 'a', 'b', 'l', 'e', 'S', 'i', 'z', 'e', '\032', 'n', '\n', '\023', 'O', 'r', 'i', 'g', 'i',
-'n', 'a', 'l', 'D', 's', 't', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '&', '\n', '\017', 'u', 's', 'e', '_', 'h', 't', 't',
-'p', '_', 'h', 'e', 'a', 'd', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\010', 'R', '\r', 'u', 's', 'e', 'H', 't', 't', 'p', 'H', 'e',
-'a', 'd', 'e', 'r', ':', '/', '\232', '\305', '\210', '\036', '*', '\n', '(', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2',
-'.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'O', 'r', 'i', 'g', 'i', 'n', 'a', 'l', 'D', 's', 't', 'L', 'b', 'C', 'o', 'n',
-'f', 'i', 'g', '\032', '\374', '\n', '\n', '\016', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'N', '\n',
-'\027', 'h', 'e', 'a', 'l', 't', 'h', 'y', '_', 'p', 'a', 'n', 'i', 'c', '_', 't', 'h', 'r', 'e', 's', 'h', 'o', 'l', 'd', '\030',
-'\001', ' ', '\001', '(', '\013', '2', '\026', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'P', 'e', 'r',
-'c', 'e', 'n', 't', 'R', '\025', 'h', 'e', 'a', 'l', 't', 'h', 'y', 'P', 'a', 'n', 'i', 'c', 'T', 'h', 'r', 'e', 's', 'h', 'o',
-'l', 'd', '\022', 't', '\n', '\024', 'z', 'o', 'n', 'e', '_', 'a', 'w', 'a', 'r', 'e', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f', 'i',
-'g', '\030', '\002', ' ', '\001', '(', '\013', '2', 'A', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l',
-'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b',
-'C', 'o', 'n', 'f', 'i', 'g', '.', 'Z', 'o', 'n', 'e', 'A', 'w', 'a', 'r', 'e', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'H',
-'\000', 'R', '\021', 'z', 'o', 'n', 'e', 'A', 'w', 'a', 'r', 'e', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '\211', '\001', '\n', '\033',
-'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', '_', 'w', 'e', 'i', 'g', 'h', 't', 'e', 'd', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f',
-'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', 'H', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c',
-'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L',
-'b', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'L',
-'b', 'C', 'o', 'n', 'f', 'i', 'g', 'H', '\000', 'R', '\030', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'W', 'e', 'i', 'g', 'h', 't',
-'e', 'd', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'I', '\n', '\023', 'u', 'p', 'd', 'a', 't', 'e', '_', 'm', 'e', 'r', 'g',
-'e', '_', 'w', 'i', 'n', 'd', 'o', 'w', '\030', '\004', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p',
-'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\021', 'u', 'p', 'd', 'a', 't', 'e', 'M',
-'e', 'r', 'g', 'e', 'W', 'i', 'n', 'd', 'o', 'w', '\022', 'C', '\n', '\037', 'i', 'g', 'n', 'o', 'r', 'e', '_', 'n', 'e', 'w', '_',
-'h', 'o', 's', 't', 's', '_', 'u', 'n', 't', 'i', 'l', '_', 'f', 'i', 'r', 's', 't', '_', 'h', 'c', '\030', '\005', ' ', '\001', '(',
-'\010', 'R', '\032', 'i', 'g', 'n', 'o', 'r', 'e', 'N', 'e', 'w', 'H', 'o', 's', 't', 's', 'U', 'n', 't', 'i', 'l', 'F', 'i', 'r',
-'s', 't', 'H', 'c', '\022', 'M', '\n', '$', 'c', 'l', 'o', 's', 'e', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 's',
-'_', 'o', 'n', '_', 'h', 'o', 's', 't', '_', 's', 'e', 't', '_', 'c', 'h', 'a', 'n', 'g', 'e', '\030', '\006', ' ', '\001', '(', '\010',
-'R', '\037', 'c', 'l', 'o', 's', 'e', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 's', 'O', 'n', 'H', 'o', 's', 't', 'S',
-'e', 't', 'C', 'h', 'a', 'n', 'g', 'e', '\022', '\212', '\001', '\n', '\034', 'c', 'o', 'n', 's', 'i', 's', 't', 'e', 'n', 't', '_', 'h',
-'a', 's', 'h', 'i', 'n', 'g', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\007', ' ', '\001', '(', '\013', '2', 'I', '.',
-'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C',
-'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'C', 'o', 'n',
-'s', 'i', 's', 't', 'e', 'n', 't', 'H', 'a', 's', 'h', 'i', 'n', 'g', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\031', 'c',
-'o', 'n', 's', 'i', 's', 't', 'e', 'n', 't', 'H', 'a', 's', 'h', 'i', 'n', 'g', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\032',
-'\215', '\002', '\n', '\021', 'Z', 'o', 'n', 'e', 'A', 'w', 'a', 'r', 'e', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '?', '\n', '\017',
-'r', 'o', 'u', 't', 'i', 'n', 'g', '_', 'e', 'n', 'a', 'b', 'l', 'e', 'd', '\030', '\001', ' ', '\001', '(', '\013', '2', '\026', '.', 'e',
-'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\016', 'r', 'o', 'u',
-'t', 'i', 'n', 'g', 'E', 'n', 'a', 'b', 'l', 'e', 'd', '\022', 'F', '\n', '\020', 'm', 'i', 'n', '_', 'c', 'l', 'u', 's', 't', 'e',
-'r', '_', 's', 'i', 'z', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o',
-'t', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '6', '4', 'V', 'a', 'l', 'u', 'e', 'R', '\016', 'm', 'i', 'n', 'C', 'l', 'u',
-'s', 't', 'e', 'r', 'S', 'i', 'z', 'e', '\022', '1', '\n', '\025', 'f', 'a', 'i', 'l', '_', 't', 'r', 'a', 'f', 'f', 'i', 'c', '_',
-'o', 'n', '_', 'p', 'a', 'n', 'i', 'c', '\030', '\003', ' ', '\001', '(', '\010', 'R', '\022', 'f', 'a', 'i', 'l', 'T', 'r', 'a', 'f', 'f',
-'i', 'c', 'O', 'n', 'P', 'a', 'n', 'i', 'c', ':', '<', '\232', '\305', '\210', '\036', '7', '\n', '5', 'e', 'n', 'v', 'o', 'y', '.', 'a',
-'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n',
-'f', 'i', 'g', '.', 'Z', 'o', 'n', 'e', 'A', 'w', 'a', 'r', 'e', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '_', '\n', '\030',
-'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', ':',
-'C', '\232', '\305', '\210', '\036', '>', '\n', '<', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's',
-'t', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'L', 'o', 'c', 'a', 'l', 'i',
-'t', 'y', 'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\361', '\001', '\n', '\031', 'C', 'o',
-'n', 's', 'i', 's', 't', 'e', 'n', 't', 'H', 'a', 's', 'h', 'i', 'n', 'g', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '7',
-'\n', '\030', 'u', 's', 'e', '_', 'h', 'o', 's', 't', 'n', 'a', 'm', 'e', '_', 'f', 'o', 'r', '_', 'h', 'a', 's', 'h', 'i', 'n',
-'g', '\030', '\001', ' ', '\001', '(', '\010', 'R', '\025', 'u', 's', 'e', 'H', 'o', 's', 't', 'n', 'a', 'm', 'e', 'F', 'o', 'r', 'H', 'a',
-'s', 'h', 'i', 'n', 'g', '\022', 'U', '\n', '\023', 'h', 'a', 's', 'h', '_', 'b', 'a', 'l', 'a', 'n', 'c', 'e', '_', 'f', 'a', 'c',
-'t', 'o', 'r', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b',
-'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\372', 'B', '\004', '*', '\002', '(', 'd', 'R', '\021',
-'h', 'a', 's', 'h', 'B', 'a', 'l', 'a', 'n', 'c', 'e', 'F', 'a', 'c', 't', 'o', 'r', ':', 'D', '\232', '\305', '\210', '\036', '?', '\n',
-'=', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm',
-'m', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'C', 'o', 'n', 's', 'i', 's', 't', 'e', 'n', 't', 'H', 'a', 's',
-'h', 'i', 'n', 'g', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', ':', '*', '\232', '\305', '\210', '\036', '%', '\n', '#', 'e', 'n', 'v', 'o',
-'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b',
-'C', 'o', 'n', 'f', 'i', 'g', 'B', '\033', '\n', '\031', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', '_', 'c', 'o', 'n', 'f', 'i', 'g',
-'_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\032', '\322', '\001', '\n', '\013', 'R', 'e', 'f', 'r', 'e', 's', 'h', 'R', 'a', 't',
-'e', '\022', 'N', '\n', '\r', 'b', 'a', 's', 'e', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\001', ' ', '\001', '(', '\013', '2',
-'\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o',
-'n', 'B', '\016', '\372', 'B', '\013', '\252', '\001', '\010', '\010', '\001', '*', '\004', '\020', '\300', '\204', '=', 'R', '\014', 'b', 'a', 's', 'e', 'I', 'n',
-'t', 'e', 'r', 'v', 'a', 'l', '\022', 'J', '\n', '\014', 'm', 'a', 'x', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\002', ' ',
-'\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r',
-'a', 't', 'i', 'o', 'n', 'B', '\014', '\372', 'B', '\t', '\252', '\001', '\006', '*', '\004', '\020', '\300', '\204', '=', 'R', '\013', 'm', 'a', 'x', 'I',
-'n', 't', 'e', 'r', 'v', 'a', 'l', ':', '\'', '\232', '\305', '\210', '\036', '\"', '\n', ' ', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i',
-'.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'R', 'e', 'f', 'r', 'e', 's', 'h', 'R', 'a', 't', 'e', '\032', '\203',
-'\002', '\n', '\020', 'P', 'r', 'e', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'x', '\n', '\035', 'p', 'e',
-'r', '_', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', '_', 'p', 'r', 'e', 'c', 'o', 'n', 'n', 'e', 'c', 't', '_', 'r', 'a', 't',
-'i', 'o', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u',
-'f', '.', 'D', 'o', 'u', 'b', 'l', 'e', 'V', 'a', 'l', 'u', 'e', 'B', '\027', '\372', 'B', '\024', '\022', '\022', '\031', '\000', '\000', '\000', '\000',
-'\000', '\000', '\010', '@', ')', '\000', '\000', '\000', '\000', '\000', '\000', '\360', '?', 'R', '\032', 'p', 'e', 'r', 'U', 'p', 's', 't', 'r', 'e', 'a',
-'m', 'P', 'r', 'e', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'R', 'a', 't', 'i', 'o', '\022', 'u', '\n', '\033', 'p', 'r', 'e', 'd', 'i',
-'c', 't', 'i', 'v', 'e', '_', 'p', 'r', 'e', 'c', 'o', 'n', 'n', 'e', 'c', 't', '_', 'r', 'a', 't', 'i', 'o', '\030', '\002', ' ',
-'\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'o', 'u',
-'b', 'l', 'e', 'V', 'a', 'l', 'u', 'e', 'B', '\027', '\372', 'B', '\024', '\022', '\022', '\031', '\000', '\000', '\000', '\000', '\000', '\000', '\010', '@', ')',
-'\000', '\000', '\000', '\000', '\000', '\000', '\360', '?', 'R', '\031', 'p', 'r', 'e', 'd', 'i', 'c', 't', 'i', 'v', 'e', 'P', 'r', 'e', 'c', 'o',
-'n', 'n', 'e', 'c', 't', 'R', 'a', 't', 'i', 'o', '\032', 'f', '\n', '\"', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's',
-'i', 'o', 'n', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'E', 'n', 't', 'r', 'y', '\022', '\020',
-'\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\003', 'k', 'e', 'y', '\022', '*', '\n', '\005', 'v', 'a', 'l', 'u', 'e',
-'\030', '\002', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.',
-'A', 'n', 'y', 'R', '\005', 'v', 'a', 'l', 'u', 'e', ':', '\002', '8', '\001', '\"', 'W', '\n', '\r', 'D', 'i', 's', 'c', 'o', 'v', 'e',
-'r', 'y', 'T', 'y', 'p', 'e', '\022', '\n', '\n', '\006', 'S', 'T', 'A', 'T', 'I', 'C', '\020', '\000', '\022', '\016', '\n', '\n', 'S', 'T', 'R',
-'I', 'C', 'T', '_', 'D', 'N', 'S', '\020', '\001', '\022', '\017', '\n', '\013', 'L', 'O', 'G', 'I', 'C', 'A', 'L', '_', 'D', 'N', 'S', '\020',
-'\002', '\022', '\007', '\n', '\003', 'E', 'D', 'S', '\020', '\003', '\022', '\020', '\n', '\014', 'O', 'R', 'I', 'G', 'I', 'N', 'A', 'L', '_', 'D', 'S',
-'T', '\020', '\004', '\"', '\244', '\001', '\n', '\010', 'L', 'b', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '\017', '\n', '\013', 'R', 'O', 'U', 'N', 'D',
-'_', 'R', 'O', 'B', 'I', 'N', '\020', '\000', '\022', '\021', '\n', '\r', 'L', 'E', 'A', 'S', 'T', '_', 'R', 'E', 'Q', 'U', 'E', 'S', 'T',
-'\020', '\001', '\022', '\r', '\n', '\t', 'R', 'I', 'N', 'G', '_', 'H', 'A', 'S', 'H', '\020', '\002', '\022', '\n', '\n', '\006', 'R', 'A', 'N', 'D',
-'O', 'M', '\020', '\003', '\022', '\n', '\n', '\006', 'M', 'A', 'G', 'L', 'E', 'V', '\020', '\005', '\022', '\024', '\n', '\020', 'C', 'L', 'U', 'S', 'T',
-'E', 'R', '_', 'P', 'R', 'O', 'V', 'I', 'D', 'E', 'D', '\020', '\006', '\022', ' ', '\n', '\034', 'L', 'O', 'A', 'D', '_', 'B', 'A', 'L',
-'A', 'N', 'C', 'I', 'N', 'G', '_', 'P', 'O', 'L', 'I', 'C', 'Y', '_', 'C', 'O', 'N', 'F', 'I', 'G', '\020', '\007', '\"', '\004', '\010',
-'\004', '\020', '\004', '*', '\017', 'O', 'R', 'I', 'G', 'I', 'N', 'A', 'L', '_', 'D', 'S', 'T', '_', 'L', 'B', '\"', '5', '\n', '\017', 'D',
-'n', 's', 'L', 'o', 'o', 'k', 'u', 'p', 'F', 'a', 'm', 'i', 'l', 'y', '\022', '\010', '\n', '\004', 'A', 'U', 'T', 'O', '\020', '\000', '\022',
-'\013', '\n', '\007', 'V', '4', '_', 'O', 'N', 'L', 'Y', '\020', '\001', '\022', '\013', '\n', '\007', 'V', '6', '_', 'O', 'N', 'L', 'Y', '\020', '\002',
-'\"', 'T', '\n', '\030', 'C', 'l', 'u', 's', 't', 'e', 'r', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'S', 'e', 'l', 'e', 'c', 't',
-'i', 'o', 'n', '\022', '\033', '\n', '\027', 'U', 'S', 'E', '_', 'C', 'O', 'N', 'F', 'I', 'G', 'U', 'R', 'E', 'D', '_', 'P', 'R', 'O',
-'T', 'O', 'C', 'O', 'L', '\020', '\000', '\022', '\033', '\n', '\027', 'U', 'S', 'E', '_', 'D', 'O', 'W', 'N', 'S', 'T', 'R', 'E', 'A', 'M',
-'_', 'P', 'R', 'O', 'T', 'O', 'C', 'O', 'L', '\020', '\001', ':', '\033', '\232', '\305', '\210', '\036', '\026', '\n', '\024', 'e', 'n', 'v', 'o', 'y',
-'.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'B', '\030', '\n', '\026', 'c', 'l', 'u', 's', 't', 'e',
-'r', '_', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '_', 't', 'y', 'p', 'e', 'B', '\013', '\n', '\t', 'l', 'b', '_', 'c', 'o',
-'n', 'f', 'i', 'g', 'J', '\004', '\010', '\014', '\020', '\r', 'J', '\004', '\010', '\017', '\020', '\020', 'J', '\004', '\010', '\007', '\020', '\010', 'J', '\004', '\010',
-'\013', '\020', '\014', 'J', '\004', '\010', '#', '\020', '$', 'R', '\005', 'h', 'o', 's', 't', 's', 'R', '\013', 't', 'l', 's', '_', 'c', 'o', 'n',
-'t', 'e', 'x', 't', 'R', '\032', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_',
-'o', 'p', 't', 'i', 'o', 'n', 's', '\"', '\245', '\002', '\n', '\023', 'L', 'o', 'a', 'd', 'B', 'a', 'l', 'a', 'n', 'c', 'i', 'n', 'g',
-'P', 'o', 'l', 'i', 'c', 'y', '\022', 'O', '\n', '\010', 'p', 'o', 'l', 'i', 'c', 'i', 'e', 's', '\030', '\001', ' ', '\003', '(', '\013', '2',
-'3', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3',
-'.', 'L', 'o', 'a', 'd', 'B', 'a', 'l', 'a', 'n', 'c', 'i', 'n', 'g', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'P', 'o', 'l', 'i',
-'c', 'y', 'R', '\010', 'p', 'o', 'l', 'i', 'c', 'i', 'e', 's', '\032', '\223', '\001', '\n', '\006', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '\022',
-'\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '7', '\n', '\014', 't', 'y', 'p',
-'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.',
-'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g',
-':', '.', '\232', '\305', '\210', '\036', ')', '\n', '\'', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'L', 'o', 'a',
-'d', 'B', 'a', 'l', 'a', 'n', 'c', 'i', 'n', 'g', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'P', 'o', 'l', 'i', 'c', 'y', 'J', '\004',
-'\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', ':', '\'', '\232', '\305', '\210', '\036', '\"', '\n', ' ', 'e', 'n', 'v', 'o',
-'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'L', 'o', 'a', 'd', 'B', 'a', 'l', 'a', 'n', 'c', 'i', 'n', 'g', 'P', 'o', 'l',
-'i', 'c', 'y', '\"', '\202', '\001', '\n', '\022', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'B', 'i', 'n', 'd', 'C', 'o', 'n', 'f', 'i',
-'g', '\022', 'D', '\n', '\016', 's', 'o', 'u', 'r', 'c', 'e', '_', 'a', 'd', 'd', 'r', 'e', 's', 's', '\030', '\001', ' ', '\001', '(', '\013',
-'2', '\035', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'A',
-'d', 'd', 'r', 'e', 's', 's', 'R', '\r', 's', 'o', 'u', 'r', 'c', 'e', 'A', 'd', 'd', 'r', 'e', 's', 's', ':', '&', '\232', '\305',
-'\210', '\036', '!', '\n', '\037', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'U', 'p', 's', 't', 'r', 'e', 'a',
-'m', 'B', 'i', 'n', 'd', 'C', 'o', 'n', 'f', 'i', 'g', '\"', '\223', '\001', '\n', '\031', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'C',
-'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', 'G', '\n', '\r', 't', 'c', 'p', '_', 'k',
-'e', 'e', 'p', 'a', 'l', 'i', 'v', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
-'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'c', 'p', 'K', 'e', 'e', 'p', 'a', 'l', 'i', 'v', 'e',
-'R', '\014', 't', 'c', 'p', 'K', 'e', 'e', 'p', 'a', 'l', 'i', 'v', 'e', ':', '-', '\232', '\305', '\210', '\036', '(', '\n', '&', 'e', 'n',
-'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'C', 'o', 'n', 'n', 'e', 'c',
-'t', 'i', 'o', 'n', 'O', 'p', 't', 'i', 'o', 'n', 's', '\"', 'r', '\n', '\021', 'T', 'r', 'a', 'c', 'k', 'C', 'l', 'u', 's', 't',
-'e', 'r', 'S', 't', 'a', 't', 's', '\022', '\'', '\n', '\017', 't', 'i', 'm', 'e', 'o', 'u', 't', '_', 'b', 'u', 'd', 'g', 'e', 't',
-'s', '\030', '\001', ' ', '\001', '(', '\010', 'R', '\016', 't', 'i', 'm', 'e', 'o', 'u', 't', 'B', 'u', 'd', 'g', 'e', 't', 's', '\022', '4',
-'\n', '\026', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 's', 'i', 'z', 'e', 's', '\030',
-'\002', ' ', '\001', '(', '\010', 'R', '\024', 'r', 'e', 'q', 'u', 'e', 's', 't', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'S', 'i', 'z',
-'e', 's', 'B', '?', '\n', '%', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', 'B', '\014', 'C', 'l', 'u', 's', 't',
-'e', 'r', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'t', '6', '4', 'V', 'a', 'l', 'u', 'e', 'R', '\016', 'm', 'i', 'n', 'C', 'l', 'u', 's', 't', 'e', 'r', 'S', 'i', 'z', 'e', '\022',
+'1', '\n', '\025', 'f', 'a', 'i', 'l', '_', 't', 'r', 'a', 'f', 'f', 'i', 'c', '_', 'o', 'n', '_', 'p', 'a', 'n', 'i', 'c', '\030',
+'\003', ' ', '\001', '(', '\010', 'R', '\022', 'f', 'a', 'i', 'l', 'T', 'r', 'a', 'f', 'f', 'i', 'c', 'O', 'n', 'P', 'a', 'n', 'i', 'c',
+':', '<', '\232', '\305', '\210', '\036', '7', '\n', '5', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u',
+'s', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'Z', 'o', 'n', 'e', 'A',
+'w', 'a', 'r', 'e', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '_', '\n', '\030', 'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'W',
+'e', 'i', 'g', 'h', 't', 'e', 'd', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', ':', 'C', '\232', '\305', '\210', '\036', '>', '\n', '<', 'e',
+'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o',
+'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'W', 'e', 'i', 'g', 'h', 't', 'e',
+'d', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\361', '\001', '\n', '\031', 'C', 'o', 'n', 's', 'i', 's', 't', 'e', 'n', 't', 'H',
+'a', 's', 'h', 'i', 'n', 'g', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '7', '\n', '\030', 'u', 's', 'e', '_', 'h', 'o', 's',
+'t', 'n', 'a', 'm', 'e', '_', 'f', 'o', 'r', '_', 'h', 'a', 's', 'h', 'i', 'n', 'g', '\030', '\001', ' ', '\001', '(', '\010', 'R', '\025',
+'u', 's', 'e', 'H', 'o', 's', 't', 'n', 'a', 'm', 'e', 'F', 'o', 'r', 'H', 'a', 's', 'h', 'i', 'n', 'g', '\022', 'U', '\n', '\023',
+'h', 'a', 's', 'h', '_', 'b', 'a', 'l', 'a', 'n', 'c', 'e', '_', 'f', 'a', 'c', 't', 'o', 'r', '\030', '\002', ' ', '\001', '(', '\013',
+'2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2',
+'V', 'a', 'l', 'u', 'e', 'B', '\007', '\372', 'B', '\004', '*', '\002', '(', 'd', 'R', '\021', 'h', 'a', 's', 'h', 'B', 'a', 'l', 'a', 'n',
+'c', 'e', 'F', 'a', 'c', 't', 'o', 'r', ':', 'D', '\232', '\305', '\210', '\036', '?', '\n', '=', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
+'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f',
+'i', 'g', '.', 'C', 'o', 'n', 's', 'i', 's', 't', 'e', 'n', 't', 'H', 'a', 's', 'h', 'i', 'n', 'g', 'L', 'b', 'C', 'o', 'n',
+'f', 'i', 'g', ':', '*', '\232', '\305', '\210', '\036', '%', '\n', '#', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.',
+'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'B', '\033', '\n',
+'\031', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', '_', 'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e',
+'r', '\032', '\322', '\001', '\n', '\013', 'R', 'e', 'f', 'r', 'e', 's', 'h', 'R', 'a', 't', 'e', '\022', 'N', '\n', '\r', 'b', 'a', 's', 'e',
+'_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\001', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.',
+'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\016', '\372', 'B', '\013', '\252', '\001', '\010',
+'\010', '\001', '*', '\004', '\020', '\300', '\204', '=', 'R', '\014', 'b', 'a', 's', 'e', 'I', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\022', 'J', '\n',
+'\014', 'm', 'a', 'x', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\002', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o',
+'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\014', '\372', 'B',
+'\t', '\252', '\001', '\006', '*', '\004', '\020', '\300', '\204', '=', 'R', '\013', 'm', 'a', 'x', 'I', 'n', 't', 'e', 'r', 'v', 'a', 'l', ':', '\'',
+'\232', '\305', '\210', '\036', '\"', '\n', ' ', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't',
+'e', 'r', '.', 'R', 'e', 'f', 'r', 'e', 's', 'h', 'R', 'a', 't', 'e', '\032', '\203', '\002', '\n', '\020', 'P', 'r', 'e', 'c', 'o', 'n',
+'n', 'e', 'c', 't', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'x', '\n', '\035', 'p', 'e', 'r', '_', 'u', 'p', 's', 't', 'r', 'e', 'a',
+'m', '_', 'p', 'r', 'e', 'c', 'o', 'n', 'n', 'e', 'c', 't', '_', 'r', 'a', 't', 'i', 'o', '\030', '\001', ' ', '\001', '(', '\013', '2',
+'\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'o', 'u', 'b', 'l', 'e', 'V',
+'a', 'l', 'u', 'e', 'B', '\027', '\372', 'B', '\024', '\022', '\022', '\031', '\000', '\000', '\000', '\000', '\000', '\000', '\010', '@', ')', '\000', '\000', '\000', '\000',
+'\000', '\000', '\360', '?', 'R', '\032', 'p', 'e', 'r', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'P', 'r', 'e', 'c', 'o', 'n', 'n', 'e',
+'c', 't', 'R', 'a', 't', 'i', 'o', '\022', 'u', '\n', '\033', 'p', 'r', 'e', 'd', 'i', 'c', 't', 'i', 'v', 'e', '_', 'p', 'r', 'e',
+'c', 'o', 'n', 'n', 'e', 'c', 't', '_', 'r', 'a', 't', 'i', 'o', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o',
+'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'o', 'u', 'b', 'l', 'e', 'V', 'a', 'l', 'u', 'e', 'B',
+'\027', '\372', 'B', '\024', '\022', '\022', '\031', '\000', '\000', '\000', '\000', '\000', '\000', '\010', '@', ')', '\000', '\000', '\000', '\000', '\000', '\000', '\360', '?', 'R',
+'\031', 'p', 'r', 'e', 'd', 'i', 'c', 't', 'i', 'v', 'e', 'P', 'r', 'e', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'R', 'a', 't', 'i',
+'o', '\032', 'f', '\n', '\"', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'P', 'r', 'o', 't', 'o', 'c',
+'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'E', 'n', 't', 'r', 'y', '\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001',
+'(', '\t', 'R', '\003', 'k', 'e', 'y', '\022', '*', '\n', '\005', 'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\024', '.',
+'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\005', 'v', 'a', 'l', 'u',
+'e', ':', '\002', '8', '\001', '\"', 'W', '\n', '\r', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'T', 'y', 'p', 'e', '\022', '\n', '\n',
+'\006', 'S', 'T', 'A', 'T', 'I', 'C', '\020', '\000', '\022', '\016', '\n', '\n', 'S', 'T', 'R', 'I', 'C', 'T', '_', 'D', 'N', 'S', '\020', '\001',
+'\022', '\017', '\n', '\013', 'L', 'O', 'G', 'I', 'C', 'A', 'L', '_', 'D', 'N', 'S', '\020', '\002', '\022', '\007', '\n', '\003', 'E', 'D', 'S', '\020',
+'\003', '\022', '\020', '\n', '\014', 'O', 'R', 'I', 'G', 'I', 'N', 'A', 'L', '_', 'D', 'S', 'T', '\020', '\004', '\"', '\244', '\001', '\n', '\010', 'L',
+'b', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '\017', '\n', '\013', 'R', 'O', 'U', 'N', 'D', '_', 'R', 'O', 'B', 'I', 'N', '\020', '\000', '\022',
+'\021', '\n', '\r', 'L', 'E', 'A', 'S', 'T', '_', 'R', 'E', 'Q', 'U', 'E', 'S', 'T', '\020', '\001', '\022', '\r', '\n', '\t', 'R', 'I', 'N',
+'G', '_', 'H', 'A', 'S', 'H', '\020', '\002', '\022', '\n', '\n', '\006', 'R', 'A', 'N', 'D', 'O', 'M', '\020', '\003', '\022', '\n', '\n', '\006', 'M',
+'A', 'G', 'L', 'E', 'V', '\020', '\005', '\022', '\024', '\n', '\020', 'C', 'L', 'U', 'S', 'T', 'E', 'R', '_', 'P', 'R', 'O', 'V', 'I', 'D',
+'E', 'D', '\020', '\006', '\022', ' ', '\n', '\034', 'L', 'O', 'A', 'D', '_', 'B', 'A', 'L', 'A', 'N', 'C', 'I', 'N', 'G', '_', 'P', 'O',
+'L', 'I', 'C', 'Y', '_', 'C', 'O', 'N', 'F', 'I', 'G', '\020', '\007', '\"', '\004', '\010', '\004', '\020', '\004', '*', '\017', 'O', 'R', 'I', 'G',
+'I', 'N', 'A', 'L', '_', 'D', 'S', 'T', '_', 'L', 'B', '\"', '5', '\n', '\017', 'D', 'n', 's', 'L', 'o', 'o', 'k', 'u', 'p', 'F',
+'a', 'm', 'i', 'l', 'y', '\022', '\010', '\n', '\004', 'A', 'U', 'T', 'O', '\020', '\000', '\022', '\013', '\n', '\007', 'V', '4', '_', 'O', 'N', 'L',
+'Y', '\020', '\001', '\022', '\013', '\n', '\007', 'V', '6', '_', 'O', 'N', 'L', 'Y', '\020', '\002', '\"', 'T', '\n', '\030', 'C', 'l', 'u', 's', 't',
+'e', 'r', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'S', 'e', 'l', 'e', 'c', 't', 'i', 'o', 'n', '\022', '\033', '\n', '\027', 'U', 'S',
+'E', '_', 'C', 'O', 'N', 'F', 'I', 'G', 'U', 'R', 'E', 'D', '_', 'P', 'R', 'O', 'T', 'O', 'C', 'O', 'L', '\020', '\000', '\022', '\033',
+'\n', '\027', 'U', 'S', 'E', '_', 'D', 'O', 'W', 'N', 'S', 'T', 'R', 'E', 'A', 'M', '_', 'P', 'R', 'O', 'T', 'O', 'C', 'O', 'L',
+'\020', '\001', ':', '\033', '\232', '\305', '\210', '\036', '\026', '\n', '\024', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C',
+'l', 'u', 's', 't', 'e', 'r', 'B', '\030', '\n', '\026', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 'd', 'i', 's', 'c', 'o', 'v', 'e',
+'r', 'y', '_', 't', 'y', 'p', 'e', 'B', '\013', '\n', '\t', 'l', 'b', '_', 'c', 'o', 'n', 'f', 'i', 'g', 'J', '\004', '\010', '\014', '\020',
+'\r', 'J', '\004', '\010', '\017', '\020', '\020', 'J', '\004', '\010', '\007', '\020', '\010', 'J', '\004', '\010', '\013', '\020', '\014', 'J', '\004', '\010', '#', '\020', '$',
+'R', '\005', 'h', 'o', 's', 't', 's', 'R', '\013', 't', 'l', 's', '_', 'c', 'o', 'n', 't', 'e', 'x', 't', 'R', '\032', 'e', 'x', 't',
+'e', 'n', 's', 'i', 'o', 'n', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\"', '\245',
+'\002', '\n', '\023', 'L', 'o', 'a', 'd', 'B', 'a', 'l', 'a', 'n', 'c', 'i', 'n', 'g', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'O', '\n',
+'\010', 'p', 'o', 'l', 'i', 'c', 'i', 'e', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', '3', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
+'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'L', 'o', 'a', 'd', 'B', 'a', 'l', 'a',
+'n', 'c', 'i', 'n', 'g', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\010', 'p', 'o', 'l', 'i', 'c',
+'i', 'e', 's', '\032', '\223', '\001', '\n', '\006', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '\022', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ',
+'\001', '(', '\t', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '7', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g',
+'\030', '\003', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.',
+'A', 'n', 'y', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', ':', '.', '\232', '\305', '\210', '\036', ')', '\n', '\'',
+'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'L', 'o', 'a', 'd', 'B', 'a', 'l', 'a', 'n', 'c', 'i', 'n',
+'g', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'P', 'o', 'l', 'i', 'c', 'y', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n',
+'f', 'i', 'g', ':', '\'', '\232', '\305', '\210', '\036', '\"', '\n', ' ', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.',
+'L', 'o', 'a', 'd', 'B', 'a', 'l', 'a', 'n', 'c', 'i', 'n', 'g', 'P', 'o', 'l', 'i', 'c', 'y', '\"', '\202', '\001', '\n', '\022', 'U',
+'p', 's', 't', 'r', 'e', 'a', 'm', 'B', 'i', 'n', 'd', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'D', '\n', '\016', 's', 'o', 'u', 'r',
+'c', 'e', '_', 'a', 'd', 'd', 'r', 'e', 's', 's', '\030', '\001', ' ', '\001', '(', '\013', '2', '\035', '.', 'e', 'n', 'v', 'o', 'y', '.',
+'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'A', 'd', 'd', 'r', 'e', 's', 's', 'R', '\r', 's',
+'o', 'u', 'r', 'c', 'e', 'A', 'd', 'd', 'r', 'e', 's', 's', ':', '&', '\232', '\305', '\210', '\036', '!', '\n', '\037', 'e', 'n', 'v', 'o',
+'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'B', 'i', 'n', 'd', 'C', 'o', 'n', 'f',
+'i', 'g', '\"', '\223', '\001', '\n', '\031', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n',
+'O', 'p', 't', 'i', 'o', 'n', 's', '\022', 'G', '\n', '\r', 't', 'c', 'p', '_', 'k', 'e', 'e', 'p', 'a', 'l', 'i', 'v', 'e', '\030',
+'\001', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e',
+'.', 'v', '3', '.', 'T', 'c', 'p', 'K', 'e', 'e', 'p', 'a', 'l', 'i', 'v', 'e', 'R', '\014', 't', 'c', 'p', 'K', 'e', 'e', 'p',
+'a', 'l', 'i', 'v', 'e', ':', '-', '\232', '\305', '\210', '\036', '(', '\n', '&', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v',
+'2', '.', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'O', 'p', 't', 'i', 'o',
+'n', 's', '\"', 'r', '\n', '\021', 'T', 'r', 'a', 'c', 'k', 'C', 'l', 'u', 's', 't', 'e', 'r', 'S', 't', 'a', 't', 's', '\022', '\'',
+'\n', '\017', 't', 'i', 'm', 'e', 'o', 'u', 't', '_', 'b', 'u', 'd', 'g', 'e', 't', 's', '\030', '\001', ' ', '\001', '(', '\010', 'R', '\016',
+'t', 'i', 'm', 'e', 'o', 'u', 't', 'B', 'u', 'd', 'g', 'e', 't', 's', '\022', '4', '\n', '\026', 'r', 'e', 'q', 'u', 'e', 's', 't',
+'_', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 's', 'i', 'z', 'e', 's', '\030', '\002', ' ', '\001', '(', '\010', 'R', '\024', 'r', 'e',
+'q', 'u', 'e', 's', 't', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'S', 'i', 'z', 'e', 's', 'B', '?', '\n', '%', 'i', 'o', '.',
+'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c',
+'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', 'B', '\014', 'C', 'l', 'u', 's', 't', 'e', 'r', 'P', 'r', 'o', 't', 'o', 'P', '\001',
+'\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[21] = {
+static upb_def_init *deps[24] = {
&envoy_config_cluster_v3_circuit_breaker_proto_upbdefinit,
&envoy_config_cluster_v3_filter_proto_upbdefinit,
&envoy_config_cluster_v3_outlier_detection_proto_upbdefinit,
@@ -521,6 +545,7 @@ static upb_def_init *deps[21] = {
&envoy_config_core_v3_extension_proto_upbdefinit,
&envoy_config_core_v3_health_check_proto_upbdefinit,
&envoy_config_core_v3_protocol_proto_upbdefinit,
+ &envoy_config_core_v3_resolver_proto_upbdefinit,
&envoy_config_endpoint_v3_endpoint_proto_upbdefinit,
&envoy_type_v3_percent_proto_upbdefinit,
&google_protobuf_any_proto_upbdefinit,
@@ -528,6 +553,8 @@ static upb_def_init *deps[21] = {
&google_protobuf_struct_proto_upbdefinit,
&google_protobuf_wrappers_proto_upbdefinit,
&xds_core_v3_collection_entry_proto_upbdefinit,
+ &envoy_annotations_deprecation_proto_upbdefinit,
+ &udpa_annotations_migrate_proto_upbdefinit,
&udpa_annotations_security_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
&udpa_annotations_versioning_proto_upbdefinit,
@@ -539,5 +566,5 @@ upb_def_init envoy_config_cluster_v3_cluster_proto_upbdefinit = {
deps,
layouts,
"envoy/config/cluster/v3/cluster.proto",
- UPB_STRVIEW_INIT(descriptor, 10750)
+ UPB_STRVIEW_INIT(descriptor, 11266)
};
diff --git a/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c b/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c
index a91ff3d6ac..fbc28a91fe 100644
--- a/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c
+++ b/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c
@@ -17,6 +17,8 @@ extern upb_def_init envoy_type_v3_semantic_version_proto_upbdefinit;
extern upb_def_init google_protobuf_any_proto_upbdefinit;
extern upb_def_init google_protobuf_struct_proto_upbdefinit;
extern upb_def_init google_protobuf_wrappers_proto_upbdefinit;
+extern upb_def_init xds_core_v3_context_params_proto_upbdefinit;
+extern upb_def_init envoy_annotations_deprecation_proto_upbdefinit;
extern upb_def_init udpa_annotations_migrate_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
extern upb_def_init udpa_annotations_versioning_proto_upbdefinit;
@@ -25,8 +27,10 @@ extern const upb_msglayout envoy_config_core_v3_Locality_msginit;
extern const upb_msglayout envoy_config_core_v3_BuildVersion_msginit;
extern const upb_msglayout envoy_config_core_v3_Extension_msginit;
extern const upb_msglayout envoy_config_core_v3_Node_msginit;
+extern const upb_msglayout envoy_config_core_v3_Node_DynamicParametersEntry_msginit;
extern const upb_msglayout envoy_config_core_v3_Metadata_msginit;
extern const upb_msglayout envoy_config_core_v3_Metadata_FilterMetadataEntry_msginit;
+extern const upb_msglayout envoy_config_core_v3_Metadata_TypedFilterMetadataEntry_msginit;
extern const upb_msglayout envoy_config_core_v3_RuntimeUInt32_msginit;
extern const upb_msglayout envoy_config_core_v3_RuntimePercent_msginit;
extern const upb_msglayout envoy_config_core_v3_RuntimeDouble_msginit;
@@ -43,13 +47,15 @@ extern const upb_msglayout envoy_config_core_v3_TransportSocket_msginit;
extern const upb_msglayout envoy_config_core_v3_RuntimeFractionalPercent_msginit;
extern const upb_msglayout envoy_config_core_v3_ControlPlane_msginit;
-static const upb_msglayout *layouts[21] = {
+static const upb_msglayout *layouts[23] = {
&envoy_config_core_v3_Locality_msginit,
&envoy_config_core_v3_BuildVersion_msginit,
&envoy_config_core_v3_Extension_msginit,
&envoy_config_core_v3_Node_msginit,
+ &envoy_config_core_v3_Node_DynamicParametersEntry_msginit,
&envoy_config_core_v3_Metadata_msginit,
&envoy_config_core_v3_Metadata_FilterMetadataEntry_msginit,
+ &envoy_config_core_v3_Metadata_TypedFilterMetadataEntry_msginit,
&envoy_config_core_v3_RuntimeUInt32_msginit,
&envoy_config_core_v3_RuntimePercent_msginit,
&envoy_config_core_v3_RuntimeDouble_msginit,
@@ -67,7 +73,7 @@ static const upb_msglayout *layouts[21] = {
&envoy_config_core_v3_ControlPlane_msginit,
};
-static const char descriptor[4473] = {'\n', '\037', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'b', 'a',
+static const char descriptor[4952] = {'\n', '\037', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'b', 'a',
's', 'e', '.', 'p', 'r', 'o', 't', 'o', '\022', '\024', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o',
'r', 'e', '.', 'v', '3', '\032', '\"', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/',
'v', '3', '/', 'a', 'd', 'd', 'r', 'e', 's', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\"', 'e', 'n', 'v', 'o', 'y', '/', 'c',
@@ -79,176 +85,196 @@ static const char descriptor[4473] = {'\n', '\037', 'e', 'n', 'v', 'o', 'y', '/'
'.', 'p', 'r', 'o', 't', 'o', '\032', '\031', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'a',
'n', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\034', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
'/', 's', 't', 'r', 'u', 'c', 't', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o',
-'t', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'u', 'd', 'p',
-'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'm', 'i', 'g', 'r', 'a', 't', 'e', '.', 'p', 'r', 'o',
-'t', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't',
-'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n',
-'s', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd',
-'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', 't', '\n', '\010', 'L', 'o', 'c',
-'a', 'l', 'i', 't', 'y', '\022', '\026', '\n', '\006', 'r', 'e', 'g', 'i', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\006', 'r', 'e',
-'g', 'i', 'o', 'n', '\022', '\022', '\n', '\004', 'z', 'o', 'n', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\004', 'z', 'o', 'n', 'e', '\022',
-'\031', '\n', '\010', 's', 'u', 'b', '_', 'z', 'o', 'n', 'e', '\030', '\003', ' ', '\001', '(', '\t', 'R', '\007', 's', 'u', 'b', 'Z', 'o', 'n',
-'e', ':', '!', '\232', '\305', '\210', '\036', '\034', '\n', '\032', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o',
-'r', 'e', '.', 'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', '\"', '\244', '\001', '\n', '\014', 'B', 'u', 'i', 'l', 'd', 'V', 'e', 'r', 's',
-'i', 'o', 'n', '\022', '8', '\n', '\007', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\013', '2', '\036', '.', 'e', 'n',
-'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'S', 'e', 'm', 'a', 'n', 't', 'i', 'c', 'V', 'e', 'r', 's', 'i',
-'o', 'n', 'R', '\007', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\022', '3', '\n', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030', '\002',
-' ', '\001', '(', '\013', '2', '\027', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'S', 't',
-'r', 'u', 'c', 't', 'R', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', ':', '%', '\232', '\305', '\210', '\036', ' ', '\n', '\036', 'e', 'n',
-'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'B', 'u', 'i', 'l', 'd', 'V', 'e', 'r', 's',
-'i', 'o', 'n', '\"', '\342', '\001', '\n', '\t', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '\022', '\022', '\n', '\004', 'n', 'a', 'm', 'e',
-'\030', '\001', ' ', '\001', '(', '\t', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '\032', '\n', '\010', 'c', 'a', 't', 'e', 'g', 'o', 'r', 'y', '\030',
-'\002', ' ', '\001', '(', '\t', 'R', '\010', 'c', 'a', 't', 'e', 'g', 'o', 'r', 'y', '\022', '\'', '\n', '\017', 't', 'y', 'p', 'e', '_', 'd',
-'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', '\030', '\003', ' ', '\001', '(', '\t', 'R', '\016', 't', 'y', 'p', 'e', 'D', 'e', 's', 'c',
-'r', 'i', 'p', 't', 'o', 'r', '\022', '<', '\n', '\007', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\030', '\004', ' ', '\001', '(', '\013', '2', '\"',
-'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'B', 'u', 'i',
-'l', 'd', 'V', 'e', 'r', 's', 'i', 'o', 'n', 'R', '\007', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\022', '\032', '\n', '\010', 'd', 'i', 's',
-'a', 'b', 'l', 'e', 'd', '\030', '\005', ' ', '\001', '(', '\010', 'R', '\010', 'd', 'i', 's', 'a', 'b', 'l', 'e', 'd', ':', '\"', '\232', '\305',
-'\210', '\036', '\035', '\n', '\033', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'E', 'x',
-'t', 'e', 'n', 's', 'i', 'o', 'n', '\"', '\345', '\004', '\n', '\004', 'N', 'o', 'd', 'e', '\022', '\016', '\n', '\002', 'i', 'd', '\030', '\001', ' ',
-'\001', '(', '\t', 'R', '\002', 'i', 'd', '\022', '\030', '\n', '\007', 'c', 'l', 'u', 's', 't', 'e', 'r', '\030', '\002', ' ', '\001', '(', '\t', 'R',
-'\007', 'c', 'l', 'u', 's', 't', 'e', 'r', '\022', '3', '\n', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030', '\003', ' ', '\001', '(',
-'\013', '2', '\027', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'S', 't', 'r', 'u', 'c',
-'t', 'R', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\022', ':', '\n', '\010', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', '\030', '\004',
-' ', '\001', '(', '\013', '2', '\036', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.',
-'v', '3', '.', 'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'R', '\010', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', '\022', '&', '\n', '\017',
-'u', 's', 'e', 'r', '_', 'a', 'g', 'e', 'n', 't', '_', 'n', 'a', 'm', 'e', '\030', '\006', ' ', '\001', '(', '\t', 'R', '\r', 'u', 's',
-'e', 'r', 'A', 'g', 'e', 'n', 't', 'N', 'a', 'm', 'e', '\022', '.', '\n', '\022', 'u', 's', 'e', 'r', '_', 'a', 'g', 'e', 'n', 't',
-'_', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\030', '\007', ' ', '\001', '(', '\t', 'H', '\000', 'R', '\020', 'u', 's', 'e', 'r', 'A', 'g', 'e',
-'n', 't', 'V', 'e', 'r', 's', 'i', 'o', 'n', '\022', ']', '\n', '\030', 'u', 's', 'e', 'r', '_', 'a', 'g', 'e', 'n', 't', '_', 'b',
-'u', 'i', 'l', 'd', '_', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\030', '\010', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o',
-'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'B', 'u', 'i', 'l', 'd', 'V', 'e', 'r',
-'s', 'i', 'o', 'n', 'H', '\000', 'R', '\025', 'u', 's', 'e', 'r', 'A', 'g', 'e', 'n', 't', 'B', 'u', 'i', 'l', 'd', 'V', 'e', 'r',
-'s', 'i', 'o', 'n', '\022', '?', '\n', '\n', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '\030', '\t', ' ', '\003', '(', '\013', '2',
-'\037', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'E', 'x',
-'t', 'e', 'n', 's', 'i', 'o', 'n', 'R', '\n', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '\022', '\'', '\n', '\017', 'c', 'l',
-'i', 'e', 'n', 't', '_', 'f', 'e', 'a', 't', 'u', 'r', 'e', 's', '\030', '\n', ' ', '\003', '(', '\t', 'R', '\016', 'c', 'l', 'i', 'e',
-'n', 't', 'F', 'e', 'a', 't', 'u', 'r', 'e', 's', '\022', 'R', '\n', '\023', 'l', 'i', 's', 't', 'e', 'n', 'i', 'n', 'g', '_', 'a',
-'d', 'd', 'r', 'e', 's', 's', 'e', 's', '\030', '\013', ' ', '\003', '(', '\013', '2', '\035', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
-'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'A', 'd', 'd', 'r', 'e', 's', 's', 'B', '\002', '\030', '\001', 'R',
-'\022', 'l', 'i', 's', 't', 'e', 'n', 'i', 'n', 'g', 'A', 'd', 'd', 'r', 'e', 's', 's', 'e', 's', ':', '\035', '\232', '\305', '\210', '\036',
-'\030', '\n', '\026', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'N', 'o', 'd', 'e',
-'B', '\031', '\n', '\027', 'u', 's', 'e', 'r', '_', 'a', 'g', 'e', 'n', 't', '_', 'v', 'e', 'r', 's', 'i', 'o', 'n', '_', 't', 'y',
-'p', 'e', 'J', '\004', '\010', '\005', '\020', '\006', 'R', '\r', 'b', 'u', 'i', 'l', 'd', '_', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\"', '\346',
-'\001', '\n', '\010', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', '\022', '[', '\n', '\017', 'f', 'i', 'l', 't', 'e', 'r', '_', 'm', 'e', 't',
-'a', 'd', 'a', 't', 'a', '\030', '\001', ' ', '\003', '(', '\013', '2', '2', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
-'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', '.', 'F', 'i', 'l', 't', 'e', 'r',
-'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'E', 'n', 't', 'r', 'y', 'R', '\016', 'f', 'i', 'l', 't', 'e', 'r', 'M', 'e', 't', 'a',
-'d', 'a', 't', 'a', '\032', 'Z', '\n', '\023', 'F', 'i', 'l', 't', 'e', 'r', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'E', 'n', 't',
-'r', 'y', '\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\003', 'k', 'e', 'y', '\022', '-', '\n', '\005', 'v',
-'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\027', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o',
-'b', 'u', 'f', '.', 'S', 't', 'r', 'u', 'c', 't', 'R', '\005', 'v', 'a', 'l', 'u', 'e', ':', '\002', '8', '\001', ':', '!', '\232', '\305',
-'\210', '\036', '\034', '\n', '\032', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'M', 'e',
-'t', 'a', 'd', 'a', 't', 'a', '\"', '\206', '\001', '\n', '\r', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'U', 'I', 'n', 't', '3', '2', '\022',
-'#', '\n', '\r', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\r', 'R', '\014', 'd',
-'e', 'f', 'a', 'u', 'l', 't', 'V', 'a', 'l', 'u', 'e', '\022', '(', '\n', '\013', 'r', 'u', 'n', 't', 'i', 'm', 'e', '_', 'k', 'e',
-'y', '\030', '\003', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\n', 'r', 'u', 'n', 't', 'i', 'm', 'e',
-'K', 'e', 'y', ':', '&', '\232', '\305', '\210', '\036', '!', '\n', '\037', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.',
-'c', 'o', 'r', 'e', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'U', 'I', 'n', 't', '3', '2', '\"', 'w', '\n', '\016', 'R', 'u', 'n',
-'t', 'i', 'm', 'e', 'P', 'e', 'r', 'c', 'e', 'n', 't', '\022', ';', '\n', '\r', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 'v', 'a',
-'l', 'u', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\026', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3',
-'.', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\014', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'V', 'a', 'l', 'u', 'e', '\022', '(', '\n',
-'\013', 'r', 'u', 'n', 't', 'i', 'm', 'e', '_', 'k', 'e', 'y', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002',
-'\020', '\001', 'R', '\n', 'r', 'u', 'n', 't', 'i', 'm', 'e', 'K', 'e', 'y', '\"', '\206', '\001', '\n', '\r', 'R', 'u', 'n', 't', 'i', 'm',
-'e', 'D', 'o', 'u', 'b', 'l', 'e', '\022', '#', '\n', '\r', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 'v', 'a', 'l', 'u', 'e', '\030',
-'\001', ' ', '\001', '(', '\001', 'R', '\014', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'V', 'a', 'l', 'u', 'e', '\022', '(', '\n', '\013', 'r', 'u',
-'n', 't', 'i', 'm', 'e', '_', 'k', 'e', 'y', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R',
-'\n', 'r', 'u', 'n', 't', 'i', 'm', 'e', 'K', 'e', 'y', ':', '&', '\232', '\305', '\210', '\036', '!', '\n', '\037', 'e', 'n', 'v', 'o', 'y',
-'.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'D', 'o', 'u', 'b', 'l',
-'e', '\"', '\266', '\001', '\n', '\022', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'e', 'a', 't', 'u', 'r', 'e', 'F', 'l', 'a', 'g', '\022',
-'I', '\n', '\r', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 'v', 'a', 'l', 'u', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\032', '.',
-'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e',
-'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\014', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'V', 'a', 'l', 'u', 'e', '\022',
-'(', '\n', '\013', 'r', 'u', 'n', 't', 'i', 'm', 'e', '_', 'k', 'e', 'y', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004',
-'r', '\002', '\020', '\001', 'R', '\n', 'r', 'u', 'n', 't', 'i', 'm', 'e', 'K', 'e', 'y', ':', '+', '\232', '\305', '\210', '\036', '&', '\n', '$',
-'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e',
-'F', 'e', 'a', 't', 'u', 'r', 'e', 'F', 'l', 'a', 'g', '\"', '\177', '\n', '\013', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u',
-'e', '\022', '#', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\021', '\372', 'B', '\016', 'r', '\014', '\020', '\001', '(', '\200',
-'\200', '\001', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\003', 'k', 'e', 'y', '\022', '%', '\n', '\005', 'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ',
-'\001', '(', '\t', 'B', '\017', '\372', 'B', '\014', 'r', '\n', '(', '\200', '\200', '\001', '\300', '\001', '\002', '\310', '\001', '\000', 'R', '\005', 'v', 'a', 'l',
-'u', 'e', ':', '$', '\232', '\305', '\210', '\036', '\037', '\n', '\035', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c',
-'o', 'r', 'e', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', '\"', '\270', '\001', '\n', '\021', 'H', 'e', 'a', 'd', 'e',
-'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i', 'o', 'n', '\022', 'C', '\n', '\006', 'h', 'e', 'a', 'd', 'e', 'r', '\030', '\001', ' ',
-'\001', '(', '\013', '2', '!', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v',
-'3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\006',
-'h', 'e', 'a', 'd', 'e', 'r', '\022', '2', '\n', '\006', 'a', 'p', 'p', 'e', 'n', 'd', '\030', '\002', ' ', '\001', '(', '\013', '2', '\032', '.',
-'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e',
-'R', '\006', 'a', 'p', 'p', 'e', 'n', 'd', ':', '*', '\232', '\305', '\210', '\036', '%', '\n', '#', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
-'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i',
-'o', 'n', '\"', 'l', '\n', '\t', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 'p', '\022', ';', '\n', '\007', 'h', 'e', 'a', 'd', 'e', 'r',
-'s', '\030', '\001', ' ', '\003', '(', '\013', '2', '!', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o',
-'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'R', '\007', 'h', 'e', 'a', 'd', 'e', 'r',
-'s', ':', '\"', '\232', '\305', '\210', '\036', '\035', '\n', '\033', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o',
-'r', 'e', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 'p', '\"', '/', '\n', '\020', 'W', 'a', 't', 'c', 'h', 'e', 'd', 'D', 'i',
-'r', 'e', 'c', 't', 'o', 'r', 'y', '\022', '\033', '\n', '\004', 'p', 'a', 't', 'h', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B',
-'\004', 'r', '\002', '\020', '\001', 'R', '\004', 'p', 'a', 't', 'h', '\"', '\266', '\001', '\n', '\n', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c',
-'e', '\022', '%', '\n', '\010', 'f', 'i', 'l', 'e', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r',
-'\002', '\020', '\001', 'H', '\000', 'R', '\010', 'f', 'i', 'l', 'e', 'n', 'a', 'm', 'e', '\022', '#', '\n', '\014', 'i', 'n', 'l', 'i', 'n', 'e',
-'_', 'b', 'y', 't', 'e', 's', '\030', '\002', ' ', '\001', '(', '\014', 'H', '\000', 'R', '\013', 'i', 'n', 'l', 'i', 'n', 'e', 'B', 'y', 't',
-'e', 's', '\022', '%', '\n', '\r', 'i', 'n', 'l', 'i', 'n', 'e', '_', 's', 't', 'r', 'i', 'n', 'g', '\030', '\003', ' ', '\001', '(', '\t',
-'H', '\000', 'R', '\014', 'i', 'n', 'l', 'i', 'n', 'e', 'S', 't', 'r', 'i', 'n', 'g', ':', '#', '\232', '\305', '\210', '\036', '\036', '\n', '\034',
-'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'D', 'a', 't', 'a', 'S', 'o', 'u',
-'r', 'c', 'e', 'B', '\020', '\n', '\t', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', '\"', '\324', '\001', '\n',
-'\013', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'K', '\n', '\016', 'r', 'e', 't', 'r', 'y', '_', 'b', 'a', 'c',
-'k', '_', 'o', 'f', 'f', '\030', '\001', ' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
-'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'B', 'a', 'c', 'k', 'o', 'f', 'f', 'S', 't', 'r', 'a', 't', 'e', 'g', 'y',
-'R', '\014', 'r', 'e', 't', 'r', 'y', 'B', 'a', 'c', 'k', 'O', 'f', 'f', '\022', 'R', '\n', '\013', 'n', 'u', 'm', '_', 'r', 'e', 't',
-'r', 'i', 'e', 's', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o',
-'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\023', '\362', '\230', '\376', '\217', '\005', '\r', '\n', '\013',
-'m', 'a', 'x', '_', 'r', 'e', 't', 'r', 'i', 'e', 's', 'R', '\n', 'n', 'u', 'm', 'R', 'e', 't', 'r', 'i', 'e', 's', ':', '$',
-'\232', '\305', '\210', '\036', '\037', '\n', '\035', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.',
-'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '\"', '\350', '\001', '\n', '\020', 'R', 'e', 'm', 'o', 't', 'e', 'D', 'a', 't',
-'a', 'S', 'o', 'u', 'r', 'c', 'e', '\022', 'B', '\n', '\010', 'h', 't', 't', 'p', '_', 'u', 'r', 'i', '\030', '\001', ' ', '\001', '(', '\013',
-'2', '\035', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H',
-'t', 't', 'p', 'U', 'r', 'i', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\007', 'h', 't', 't', 'p', 'U', 'r', 'i',
-'\022', '\037', '\n', '\006', 's', 'h', 'a', '2', '5', '6', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001',
-'R', '\006', 's', 'h', 'a', '2', '5', '6', '\022', 'D', '\n', '\014', 'r', 'e', 't', 'r', 'y', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030',
-'\003', ' ', '\001', '(', '\013', '2', '!', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e',
-'.', 'v', '3', '.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\013', 'r', 'e', 't', 'r', 'y', 'P', 'o', 'l',
-'i', 'c', 'y', ':', ')', '\232', '\305', '\210', '\036', '$', '\n', '\"', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.',
-'c', 'o', 'r', 'e', '.', 'R', 'e', 'm', 'o', 't', 'e', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', '\"', '\311', '\001', '\n',
-'\017', 'A', 's', 'y', 'n', 'c', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', '\022', '8', '\n', '\005', 'l', 'o', 'c', 'a', 'l',
-'\030', '\001', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r',
-'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'H', '\000', 'R', '\005', 'l', 'o', 'c', 'a', 'l', '\022',
-'@', '\n', '\006', 'r', 'e', 'm', 'o', 't', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '&', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
-'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'R', 'e', 'm', 'o', 't', 'e', 'D', 'a', 't', 'a', 'S',
-'o', 'u', 'r', 'c', 'e', 'H', '\000', 'R', '\006', 'r', 'e', 'm', 'o', 't', 'e', ':', '(', '\232', '\305', '\210', '\036', '#', '\n', '!', 'e',
-'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'A', 's', 'y', 'n', 'c', 'D', 'a', 't',
+'t', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', ' ', 'x', 'd', 's',
+'/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'c', 'o', 'n', 't', 'e', 'x', 't', '_', 'p', 'a', 'r', 'a', 'm', 's', '.', 'p',
+'r', 'o', 't', 'o', '\032', '#', 'e', 'n', 'v', 'o', 'y', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'd',
+'e', 'p', 'r', 'e', 'c', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'u', 'd', 'p', 'a', '/', 'a', 'n',
+'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'm', 'i', 'g', 'r', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035',
+'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p',
+'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e',
+'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/',
+'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', 't', '\n', '\010', 'L', 'o', 'c', 'a', 'l', 'i', 't',
+'y', '\022', '\026', '\n', '\006', 'r', 'e', 'g', 'i', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\006', 'r', 'e', 'g', 'i', 'o', 'n',
+'\022', '\022', '\n', '\004', 'z', 'o', 'n', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\004', 'z', 'o', 'n', 'e', '\022', '\031', '\n', '\010', 's',
+'u', 'b', '_', 'z', 'o', 'n', 'e', '\030', '\003', ' ', '\001', '(', '\t', 'R', '\007', 's', 'u', 'b', 'Z', 'o', 'n', 'e', ':', '!', '\232',
+'\305', '\210', '\036', '\034', '\n', '\032', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'L',
+'o', 'c', 'a', 'l', 'i', 't', 'y', '\"', '\244', '\001', '\n', '\014', 'B', 'u', 'i', 'l', 'd', 'V', 'e', 'r', 's', 'i', 'o', 'n', '\022',
+'8', '\n', '\007', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\013', '2', '\036', '.', 'e', 'n', 'v', 'o', 'y', '.',
+'t', 'y', 'p', 'e', '.', 'v', '3', '.', 'S', 'e', 'm', 'a', 'n', 't', 'i', 'c', 'V', 'e', 'r', 's', 'i', 'o', 'n', 'R', '\007',
+'v', 'e', 'r', 's', 'i', 'o', 'n', '\022', '3', '\n', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030', '\002', ' ', '\001', '(', '\013',
+'2', '\027', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'S', 't', 'r', 'u', 'c', 't',
+'R', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', ':', '%', '\232', '\305', '\210', '\036', ' ', '\n', '\036', 'e', 'n', 'v', 'o', 'y', '.',
+'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'B', 'u', 'i', 'l', 'd', 'V', 'e', 'r', 's', 'i', 'o', 'n', '\"',
+'\342', '\001', '\n', '\t', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '\022', '\022', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001',
+'(', '\t', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '\032', '\n', '\010', 'c', 'a', 't', 'e', 'g', 'o', 'r', 'y', '\030', '\002', ' ', '\001', '(',
+'\t', 'R', '\010', 'c', 'a', 't', 'e', 'g', 'o', 'r', 'y', '\022', '\'', '\n', '\017', 't', 'y', 'p', 'e', '_', 'd', 'e', 's', 'c', 'r',
+'i', 'p', 't', 'o', 'r', '\030', '\003', ' ', '\001', '(', '\t', 'R', '\016', 't', 'y', 'p', 'e', 'D', 'e', 's', 'c', 'r', 'i', 'p', 't',
+'o', 'r', '\022', '<', '\n', '\007', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\030', '\004', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v',
+'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'B', 'u', 'i', 'l', 'd', 'V', 'e',
+'r', 's', 'i', 'o', 'n', 'R', '\007', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\022', '\032', '\n', '\010', 'd', 'i', 's', 'a', 'b', 'l', 'e',
+'d', '\030', '\005', ' ', '\001', '(', '\010', 'R', '\010', 'd', 'i', 's', 'a', 'b', 'l', 'e', 'd', ':', '\"', '\232', '\305', '\210', '\036', '\035', '\n',
+'\033', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'E', 'x', 't', 'e', 'n', 's',
+'i', 'o', 'n', '\"', '\262', '\006', '\n', '\004', 'N', 'o', 'd', 'e', '\022', '\016', '\n', '\002', 'i', 'd', '\030', '\001', ' ', '\001', '(', '\t', 'R',
+'\002', 'i', 'd', '\022', '\030', '\n', '\007', 'c', 'l', 'u', 's', 't', 'e', 'r', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\007', 'c', 'l', 'u',
+'s', 't', 'e', 'r', '\022', '3', '\n', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030', '\003', ' ', '\001', '(', '\013', '2', '\027', '.',
+'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'S', 't', 'r', 'u', 'c', 't', 'R', '\010', 'm',
+'e', 't', 'a', 'd', 'a', 't', 'a', '\022', '`', '\n', '\022', 'd', 'y', 'n', 'a', 'm', 'i', 'c', '_', 'p', 'a', 'r', 'a', 'm', 'e',
+'t', 'e', 'r', 's', '\030', '\014', ' ', '\003', '(', '\013', '2', '1', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
+'.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'N', 'o', 'd', 'e', '.', 'D', 'y', 'n', 'a', 'm', 'i', 'c', 'P', 'a', 'r', 'a',
+'m', 'e', 't', 'e', 'r', 's', 'E', 'n', 't', 'r', 'y', 'R', '\021', 'd', 'y', 'n', 'a', 'm', 'i', 'c', 'P', 'a', 'r', 'a', 'm',
+'e', 't', 'e', 'r', 's', '\022', ':', '\n', '\010', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', '\030', '\004', ' ', '\001', '(', '\013', '2', '\036',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'L', 'o', 'c',
+'a', 'l', 'i', 't', 'y', 'R', '\010', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', '\022', '&', '\n', '\017', 'u', 's', 'e', 'r', '_', 'a',
+'g', 'e', 'n', 't', '_', 'n', 'a', 'm', 'e', '\030', '\006', ' ', '\001', '(', '\t', 'R', '\r', 'u', 's', 'e', 'r', 'A', 'g', 'e', 'n',
+'t', 'N', 'a', 'm', 'e', '\022', '.', '\n', '\022', 'u', 's', 'e', 'r', '_', 'a', 'g', 'e', 'n', 't', '_', 'v', 'e', 'r', 's', 'i',
+'o', 'n', '\030', '\007', ' ', '\001', '(', '\t', 'H', '\000', 'R', '\020', 'u', 's', 'e', 'r', 'A', 'g', 'e', 'n', 't', 'V', 'e', 'r', 's',
+'i', 'o', 'n', '\022', ']', '\n', '\030', 'u', 's', 'e', 'r', '_', 'a', 'g', 'e', 'n', 't', '_', 'b', 'u', 'i', 'l', 'd', '_', 'v',
+'e', 'r', 's', 'i', 'o', 'n', '\030', '\010', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
+'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'B', 'u', 'i', 'l', 'd', 'V', 'e', 'r', 's', 'i', 'o', 'n', 'H', '\000',
+'R', '\025', 'u', 's', 'e', 'r', 'A', 'g', 'e', 'n', 't', 'B', 'u', 'i', 'l', 'd', 'V', 'e', 'r', 's', 'i', 'o', 'n', '\022', '?',
+'\n', '\n', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '\030', '\t', ' ', '\003', '(', '\013', '2', '\037', '.', 'e', 'n', 'v', 'o',
+'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o',
+'n', 'R', '\n', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '\022', '\'', '\n', '\017', 'c', 'l', 'i', 'e', 'n', 't', '_', 'f',
+'e', 'a', 't', 'u', 'r', 'e', 's', '\030', '\n', ' ', '\003', '(', '\t', 'R', '\016', 'c', 'l', 'i', 'e', 'n', 't', 'F', 'e', 'a', 't',
+'u', 'r', 'e', 's', '\022', '[', '\n', '\023', 'l', 'i', 's', 't', 'e', 'n', 'i', 'n', 'g', '_', 'a', 'd', 'd', 'r', 'e', 's', 's',
+'e', 's', '\030', '\013', ' ', '\003', '(', '\013', '2', '\035', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c',
+'o', 'r', 'e', '.', 'v', '3', '.', 'A', 'd', 'd', 'r', 'e', 's', 's', 'B', '\013', '\030', '\001', '\222', '\307', '\206', '\330', '\004', '\003', '3',
+'.', '0', 'R', '\022', 'l', 'i', 's', 't', 'e', 'n', 'i', 'n', 'g', 'A', 'd', 'd', 'r', 'e', 's', 's', 'e', 's', '\032', '`', '\n',
+'\026', 'D', 'y', 'n', 'a', 'm', 'i', 'c', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 's', 'E', 'n', 't', 'r', 'y', '\022', '\020',
+'\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\003', 'k', 'e', 'y', '\022', '0', '\n', '\005', 'v', 'a', 'l', 'u', 'e',
+'\030', '\002', ' ', '\001', '(', '\013', '2', '\032', '.', 'x', 'd', 's', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'n', 't',
+'e', 'x', 't', 'P', 'a', 'r', 'a', 'm', 's', 'R', '\005', 'v', 'a', 'l', 'u', 'e', ':', '\002', '8', '\001', ':', '\035', '\232', '\305', '\210',
+'\036', '\030', '\n', '\026', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'N', 'o', 'd',
+'e', 'B', '\031', '\n', '\027', 'u', 's', 'e', 'r', '_', 'a', 'g', 'e', 'n', 't', '_', 'v', 'e', 'r', 's', 'i', 'o', 'n', '_', 't',
+'y', 'p', 'e', 'J', '\004', '\010', '\005', '\020', '\006', 'R', '\r', 'b', 'u', 'i', 'l', 'd', '_', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\"',
+'\261', '\003', '\n', '\010', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', '\022', '[', '\n', '\017', 'f', 'i', 'l', 't', 'e', 'r', '_', 'm', 'e',
+'t', 'a', 'd', 'a', 't', 'a', '\030', '\001', ' ', '\003', '(', '\013', '2', '2', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
+'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', '.', 'F', 'i', 'l', 't', 'e',
+'r', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'E', 'n', 't', 'r', 'y', 'R', '\016', 'f', 'i', 'l', 't', 'e', 'r', 'M', 'e', 't',
+'a', 'd', 'a', 't', 'a', '\022', 'k', '\n', '\025', 't', 'y', 'p', 'e', 'd', '_', 'f', 'i', 'l', 't', 'e', 'r', '_', 'm', 'e', 't',
+'a', 'd', 'a', 't', 'a', '\030', '\002', ' ', '\003', '(', '\013', '2', '7', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', '.', 'T', 'y', 'p', 'e', 'd', 'F',
+'i', 'l', 't', 'e', 'r', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'E', 'n', 't', 'r', 'y', 'R', '\023', 't', 'y', 'p', 'e', 'd',
+'F', 'i', 'l', 't', 'e', 'r', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', '\032', 'Z', '\n', '\023', 'F', 'i', 'l', 't', 'e', 'r', 'M',
+'e', 't', 'a', 'd', 'a', 't', 'a', 'E', 'n', 't', 'r', 'y', '\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t',
+'R', '\003', 'k', 'e', 'y', '\022', '-', '\n', '\005', 'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\027', '.', 'g', 'o',
+'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'S', 't', 'r', 'u', 'c', 't', 'R', '\005', 'v', 'a', 'l',
+'u', 'e', ':', '\002', '8', '\001', '\032', '\\', '\n', '\030', 'T', 'y', 'p', 'e', 'd', 'F', 'i', 'l', 't', 'e', 'r', 'M', 'e', 't', 'a',
+'d', 'a', 't', 'a', 'E', 'n', 't', 'r', 'y', '\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\003', 'k',
+'e', 'y', '\022', '*', '\n', '\005', 'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l',
+'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\005', 'v', 'a', 'l', 'u', 'e', ':', '\002', '8', '\001',
+':', '!', '\232', '\305', '\210', '\036', '\034', '\n', '\032', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r',
+'e', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', '\"', '\206', '\001', '\n', '\r', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'U', 'I', 'n',
+'t', '3', '2', '\022', '#', '\n', '\r', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(',
+'\r', 'R', '\014', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'V', 'a', 'l', 'u', 'e', '\022', '(', '\n', '\013', 'r', 'u', 'n', 't', 'i', 'm',
+'e', '_', 'k', 'e', 'y', '\030', '\003', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\n', 'r', 'u', 'n',
+'t', 'i', 'm', 'e', 'K', 'e', 'y', ':', '&', '\232', '\305', '\210', '\036', '!', '\n', '\037', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i',
+'.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'U', 'I', 'n', 't', '3', '2', '\"', 'w', '\n',
+'\016', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'P', 'e', 'r', 'c', 'e', 'n', 't', '\022', ';', '\n', '\r', 'd', 'e', 'f', 'a', 'u', 'l',
+'t', '_', 'v', 'a', 'l', 'u', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\026', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p',
+'e', '.', 'v', '3', '.', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\014', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'V', 'a', 'l', 'u',
+'e', '\022', '(', '\n', '\013', 'r', 'u', 'n', 't', 'i', 'm', 'e', '_', 'k', 'e', 'y', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\007', '\372',
+'B', '\004', 'r', '\002', '\020', '\001', 'R', '\n', 'r', 'u', 'n', 't', 'i', 'm', 'e', 'K', 'e', 'y', '\"', '\206', '\001', '\n', '\r', 'R', 'u',
+'n', 't', 'i', 'm', 'e', 'D', 'o', 'u', 'b', 'l', 'e', '\022', '#', '\n', '\r', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 'v', 'a',
+'l', 'u', 'e', '\030', '\001', ' ', '\001', '(', '\001', 'R', '\014', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'V', 'a', 'l', 'u', 'e', '\022', '(',
+'\n', '\013', 'r', 'u', 'n', 't', 'i', 'm', 'e', '_', 'k', 'e', 'y', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r',
+'\002', '\020', '\001', 'R', '\n', 'r', 'u', 'n', 't', 'i', 'm', 'e', 'K', 'e', 'y', ':', '&', '\232', '\305', '\210', '\036', '!', '\n', '\037', 'e',
+'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'D',
+'o', 'u', 'b', 'l', 'e', '\"', '\266', '\001', '\n', '\022', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'e', 'a', 't', 'u', 'r', 'e', 'F',
+'l', 'a', 'g', '\022', 'I', '\n', '\r', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 'v', 'a', 'l', 'u', 'e', '\030', '\001', ' ', '\001', '(',
+'\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V',
+'a', 'l', 'u', 'e', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\014', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'V', 'a',
+'l', 'u', 'e', '\022', '(', '\n', '\013', 'r', 'u', 'n', 't', 'i', 'm', 'e', '_', 'k', 'e', 'y', '\030', '\002', ' ', '\001', '(', '\t', 'B',
+'\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\n', 'r', 'u', 'n', 't', 'i', 'm', 'e', 'K', 'e', 'y', ':', '+', '\232', '\305', '\210',
+'\036', '&', '\n', '$', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'R', 'u', 'n',
+'t', 'i', 'm', 'e', 'F', 'e', 'a', 't', 'u', 'r', 'e', 'F', 'l', 'a', 'g', '\"', '\177', '\n', '\013', 'H', 'e', 'a', 'd', 'e', 'r',
+'V', 'a', 'l', 'u', 'e', '\022', '#', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\021', '\372', 'B', '\016', 'r', '\014',
+'\020', '\001', '(', '\200', '\200', '\001', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\003', 'k', 'e', 'y', '\022', '%', '\n', '\005', 'v', 'a', 'l', 'u',
+'e', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\017', '\372', 'B', '\014', 'r', '\n', '(', '\200', '\200', '\001', '\300', '\001', '\002', '\310', '\001', '\000', 'R',
+'\005', 'v', 'a', 'l', 'u', 'e', ':', '$', '\232', '\305', '\210', '\036', '\037', '\n', '\035', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.',
+'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', '\"', '\270', '\001', '\n', '\021', 'H',
+'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i', 'o', 'n', '\022', 'C', '\n', '\006', 'h', 'e', 'a', 'd', 'e',
+'r', '\030', '\001', ' ', '\001', '(', '\013', '2', '!', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o',
+'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002',
+'\020', '\001', 'R', '\006', 'h', 'e', 'a', 'd', 'e', 'r', '\022', '2', '\n', '\006', 'a', 'p', 'p', 'e', 'n', 'd', '\030', '\002', ' ', '\001', '(',
+'\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V',
+'a', 'l', 'u', 'e', 'R', '\006', 'a', 'p', 'p', 'e', 'n', 'd', ':', '*', '\232', '\305', '\210', '\036', '%', '\n', '#', 'e', 'n', 'v', 'o',
+'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e',
+'O', 'p', 't', 'i', 'o', 'n', '\"', 'l', '\n', '\t', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 'p', '\022', ';', '\n', '\007', 'h', 'e',
+'a', 'd', 'e', 'r', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', '!', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'R', '\007', 'h', 'e',
+'a', 'd', 'e', 'r', 's', ':', '\"', '\232', '\305', '\210', '\036', '\035', '\n', '\033', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v',
+'2', '.', 'c', 'o', 'r', 'e', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 'p', '\"', '/', '\n', '\020', 'W', 'a', 't', 'c', 'h',
+'e', 'd', 'D', 'i', 'r', 'e', 'c', 't', 'o', 'r', 'y', '\022', '\033', '\n', '\004', 'p', 'a', 't', 'h', '\030', '\001', ' ', '\001', '(', '\t',
+'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'p', 'a', 't', 'h', '\"', '\266', '\001', '\n', '\n', 'D', 'a', 't', 'a', 'S',
+'o', 'u', 'r', 'c', 'e', '\022', '%', '\n', '\010', 'f', 'i', 'l', 'e', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007',
+'\372', 'B', '\004', 'r', '\002', '\020', '\001', 'H', '\000', 'R', '\010', 'f', 'i', 'l', 'e', 'n', 'a', 'm', 'e', '\022', '#', '\n', '\014', 'i', 'n',
+'l', 'i', 'n', 'e', '_', 'b', 'y', 't', 'e', 's', '\030', '\002', ' ', '\001', '(', '\014', 'H', '\000', 'R', '\013', 'i', 'n', 'l', 'i', 'n',
+'e', 'B', 'y', 't', 'e', 's', '\022', '%', '\n', '\r', 'i', 'n', 'l', 'i', 'n', 'e', '_', 's', 't', 'r', 'i', 'n', 'g', '\030', '\003',
+' ', '\001', '(', '\t', 'H', '\000', 'R', '\014', 'i', 'n', 'l', 'i', 'n', 'e', 'S', 't', 'r', 'i', 'n', 'g', ':', '#', '\232', '\305', '\210',
+'\036', '\036', '\n', '\034', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'D', 'a', 't',
'a', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\020', '\n', '\t', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001',
-'\"', '\260', '\001', '\n', '\017', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', '\022', '\033', '\n', '\004', 'n',
-'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022',
-'9', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '\024', '.', 'g',
-'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'H', '\000', 'R', '\013', 't', 'y', 'p',
-'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', ':', '(', '\232', '\305', '\210', '\036', '#', '\n', '!', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
-'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't',
-'B', '\r', '\n', '\013', 'c', 'o', 'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o',
-'n', 'f', 'i', 'g', '\"', '\277', '\001', '\n', '\030', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a',
-'l', 'P', 'e', 'r', 'c', 'e', 'n', 't', '\022', 'O', '\n', '\r', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 'v', 'a', 'l', 'u', 'e',
-'\030', '\001', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'F', 'r',
-'a', 'c', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001',
-'R', '\014', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'V', 'a', 'l', 'u', 'e', '\022', '\037', '\n', '\013', 'r', 'u', 'n', 't', 'i', 'm', 'e',
-'_', 'k', 'e', 'y', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\n', 'r', 'u', 'n', 't', 'i', 'm', 'e', 'K', 'e', 'y', ':', '1', '\232',
-'\305', '\210', '\036', ',', '\n', '*', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'R',
-'u', 'n', 't', 'i', 'm', 'e', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'e', 'r', 'c', 'e', 'n', 't', '\"', 'U',
-'\n', '\014', 'C', 'o', 'n', 't', 'r', 'o', 'l', 'P', 'l', 'a', 'n', 'e', '\022', '\036', '\n', '\n', 'i', 'd', 'e', 'n', 't', 'i', 'f',
-'i', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\n', 'i', 'd', 'e', 'n', 't', 'i', 'f', 'i', 'e', 'r', ':', '%', '\232', '\305',
-'\210', '\036', ' ', '\n', '\036', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'C', 'o',
-'n', 't', 'r', 'o', 'l', 'P', 'l', 'a', 'n', 'e', '*', '(', '\n', '\017', 'R', 'o', 'u', 't', 'i', 'n', 'g', 'P', 'r', 'i', 'o',
-'r', 'i', 't', 'y', '\022', '\013', '\n', '\007', 'D', 'E', 'F', 'A', 'U', 'L', 'T', '\020', '\000', '\022', '\010', '\n', '\004', 'H', 'I', 'G', 'H',
-'\020', '\001', '*', '\211', '\001', '\n', '\r', 'R', 'e', 'q', 'u', 'e', 's', 't', 'M', 'e', 't', 'h', 'o', 'd', '\022', '\026', '\n', '\022', 'M',
-'E', 'T', 'H', 'O', 'D', '_', 'U', 'N', 'S', 'P', 'E', 'C', 'I', 'F', 'I', 'E', 'D', '\020', '\000', '\022', '\007', '\n', '\003', 'G', 'E',
-'T', '\020', '\001', '\022', '\010', '\n', '\004', 'H', 'E', 'A', 'D', '\020', '\002', '\022', '\010', '\n', '\004', 'P', 'O', 'S', 'T', '\020', '\003', '\022', '\007',
-'\n', '\003', 'P', 'U', 'T', '\020', '\004', '\022', '\n', '\n', '\006', 'D', 'E', 'L', 'E', 'T', 'E', '\020', '\005', '\022', '\013', '\n', '\007', 'C', 'O',
-'N', 'N', 'E', 'C', 'T', '\020', '\006', '\022', '\013', '\n', '\007', 'O', 'P', 'T', 'I', 'O', 'N', 'S', '\020', '\007', '\022', '\t', '\n', '\005', 'T',
-'R', 'A', 'C', 'E', '\020', '\010', '\022', '\t', '\n', '\005', 'P', 'A', 'T', 'C', 'H', '\020', '\t', '*', '>', '\n', '\020', 'T', 'r', 'a', 'f',
-'f', 'i', 'c', 'D', 'i', 'r', 'e', 'c', 't', 'i', 'o', 'n', '\022', '\017', '\n', '\013', 'U', 'N', 'S', 'P', 'E', 'C', 'I', 'F', 'I',
-'E', 'D', '\020', '\000', '\022', '\013', '\n', '\007', 'I', 'N', 'B', 'O', 'U', 'N', 'D', '\020', '\001', '\022', '\014', '\n', '\010', 'O', 'U', 'T', 'B',
-'O', 'U', 'N', 'D', '\020', '\002', 'B', '9', '\n', '\"', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e',
-'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', 'B', '\t', 'B', 'a', 's', 'e',
-'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'\"', '\324', '\001', '\n', '\013', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'K', '\n', '\016', 'r', 'e', 't', 'r', 'y',
+'_', 'b', 'a', 'c', 'k', '_', 'o', 'f', 'f', '\030', '\001', ' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
+'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'B', 'a', 'c', 'k', 'o', 'f', 'f', 'S', 't', 'r', 'a',
+'t', 'e', 'g', 'y', 'R', '\014', 'r', 'e', 't', 'r', 'y', 'B', 'a', 'c', 'k', 'O', 'f', 'f', '\022', 'R', '\n', '\013', 'n', 'u', 'm',
+'_', 'r', 'e', 't', 'r', 'i', 'e', 's', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p',
+'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\023', '\362', '\230', '\376', '\217',
+'\005', '\r', '\n', '\013', 'm', 'a', 'x', '_', 'r', 'e', 't', 'r', 'i', 'e', 's', 'R', '\n', 'n', 'u', 'm', 'R', 'e', 't', 'r', 'i',
+'e', 's', ':', '$', '\232', '\305', '\210', '\036', '\037', '\n', '\035', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c',
+'o', 'r', 'e', '.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '\"', '\350', '\001', '\n', '\020', 'R', 'e', 'm', 'o', 't',
+'e', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', '\022', 'B', '\n', '\010', 'h', 't', 't', 'p', '_', 'u', 'r', 'i', '\030', '\001',
+' ', '\001', '(', '\013', '2', '\035', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.',
+'v', '3', '.', 'H', 't', 't', 'p', 'U', 'r', 'i', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\007', 'h', 't', 't',
+'p', 'U', 'r', 'i', '\022', '\037', '\n', '\006', 's', 'h', 'a', '2', '5', '6', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004',
+'r', '\002', '\020', '\001', 'R', '\006', 's', 'h', 'a', '2', '5', '6', '\022', 'D', '\n', '\014', 'r', 'e', 't', 'r', 'y', '_', 'p', 'o', 'l',
+'i', 'c', 'y', '\030', '\003', ' ', '\001', '(', '\013', '2', '!', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
+'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\013', 'r', 'e', 't', 'r',
+'y', 'P', 'o', 'l', 'i', 'c', 'y', ':', ')', '\232', '\305', '\210', '\036', '$', '\n', '\"', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i',
+'.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'R', 'e', 'm', 'o', 't', 'e', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e',
+'\"', '\311', '\001', '\n', '\017', 'A', 's', 'y', 'n', 'c', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', '\022', '8', '\n', '\005', 'l',
+'o', 'c', 'a', 'l', '\030', '\001', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
+'.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'H', '\000', 'R', '\005', 'l', 'o',
+'c', 'a', 'l', '\022', '@', '\n', '\006', 'r', 'e', 'm', 'o', 't', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '&', '.', 'e', 'n', 'v',
+'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'R', 'e', 'm', 'o', 't', 'e', 'D',
+'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'H', '\000', 'R', '\006', 'r', 'e', 'm', 'o', 't', 'e', ':', '(', '\232', '\305', '\210', '\036',
+'#', '\n', '!', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'A', 's', 'y', 'n',
+'c', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\020', '\n', '\t', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022',
+'\003', '\370', 'B', '\001', '\"', '\260', '\001', '\n', '\017', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', '\022',
+'\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n',
+'a', 'm', 'e', '\022', '9', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013',
+'2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'H', '\000', 'R',
+'\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', ':', '(', '\232', '\305', '\210', '\036', '#', '\n', '!', 'e', 'n', 'v', 'o',
+'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o',
+'c', 'k', 'e', 't', 'B', '\r', '\n', '\013', 'c', 'o', 'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\002', '\020', '\003',
+'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', '\"', '\277', '\001', '\n', '\030', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'r', 'a', 'c', 't',
+'i', 'o', 'n', 'a', 'l', 'P', 'e', 'r', 'c', 'e', 'n', 't', '\022', 'O', '\n', '\r', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 'v',
+'a', 'l', 'u', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v',
+'3', '.', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'B', '\010', '\372', 'B', '\005', '\212',
+'\001', '\002', '\020', '\001', 'R', '\014', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'V', 'a', 'l', 'u', 'e', '\022', '\037', '\n', '\013', 'r', 'u', 'n',
+'t', 'i', 'm', 'e', '_', 'k', 'e', 'y', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\n', 'r', 'u', 'n', 't', 'i', 'm', 'e', 'K', 'e',
+'y', ':', '1', '\232', '\305', '\210', '\036', ',', '\n', '*', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o',
+'r', 'e', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'e', 'r', 'c', 'e',
+'n', 't', '\"', 'U', '\n', '\014', 'C', 'o', 'n', 't', 'r', 'o', 'l', 'P', 'l', 'a', 'n', 'e', '\022', '\036', '\n', '\n', 'i', 'd', 'e',
+'n', 't', 'i', 'f', 'i', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\n', 'i', 'd', 'e', 'n', 't', 'i', 'f', 'i', 'e', 'r',
+':', '%', '\232', '\305', '\210', '\036', ' ', '\n', '\036', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r',
+'e', '.', 'C', 'o', 'n', 't', 'r', 'o', 'l', 'P', 'l', 'a', 'n', 'e', '*', '(', '\n', '\017', 'R', 'o', 'u', 't', 'i', 'n', 'g',
+'P', 'r', 'i', 'o', 'r', 'i', 't', 'y', '\022', '\013', '\n', '\007', 'D', 'E', 'F', 'A', 'U', 'L', 'T', '\020', '\000', '\022', '\010', '\n', '\004',
+'H', 'I', 'G', 'H', '\020', '\001', '*', '\211', '\001', '\n', '\r', 'R', 'e', 'q', 'u', 'e', 's', 't', 'M', 'e', 't', 'h', 'o', 'd', '\022',
+'\026', '\n', '\022', 'M', 'E', 'T', 'H', 'O', 'D', '_', 'U', 'N', 'S', 'P', 'E', 'C', 'I', 'F', 'I', 'E', 'D', '\020', '\000', '\022', '\007',
+'\n', '\003', 'G', 'E', 'T', '\020', '\001', '\022', '\010', '\n', '\004', 'H', 'E', 'A', 'D', '\020', '\002', '\022', '\010', '\n', '\004', 'P', 'O', 'S', 'T',
+'\020', '\003', '\022', '\007', '\n', '\003', 'P', 'U', 'T', '\020', '\004', '\022', '\n', '\n', '\006', 'D', 'E', 'L', 'E', 'T', 'E', '\020', '\005', '\022', '\013',
+'\n', '\007', 'C', 'O', 'N', 'N', 'E', 'C', 'T', '\020', '\006', '\022', '\013', '\n', '\007', 'O', 'P', 'T', 'I', 'O', 'N', 'S', '\020', '\007', '\022',
+'\t', '\n', '\005', 'T', 'R', 'A', 'C', 'E', '\020', '\010', '\022', '\t', '\n', '\005', 'P', 'A', 'T', 'C', 'H', '\020', '\t', '*', '>', '\n', '\020',
+'T', 'r', 'a', 'f', 'f', 'i', 'c', 'D', 'i', 'r', 'e', 'c', 't', 'i', 'o', 'n', '\022', '\017', '\n', '\013', 'U', 'N', 'S', 'P', 'E',
+'C', 'I', 'F', 'I', 'E', 'D', '\020', '\000', '\022', '\013', '\n', '\007', 'I', 'N', 'B', 'O', 'U', 'N', 'D', '\020', '\001', '\022', '\014', '\n', '\010',
+'O', 'U', 'T', 'B', 'O', 'U', 'N', 'D', '\020', '\002', 'B', '9', '\n', '\"', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o',
+'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', 'B', '\t',
+'B', 'a', 's', 'e', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't',
+'o', '3',
};
-static upb_def_init *deps[13] = {
+static upb_def_init *deps[15] = {
&envoy_config_core_v3_address_proto_upbdefinit,
&envoy_config_core_v3_backoff_proto_upbdefinit,
&envoy_config_core_v3_http_uri_proto_upbdefinit,
@@ -257,6 +283,8 @@ static upb_def_init *deps[13] = {
&google_protobuf_any_proto_upbdefinit,
&google_protobuf_struct_proto_upbdefinit,
&google_protobuf_wrappers_proto_upbdefinit,
+ &xds_core_v3_context_params_proto_upbdefinit,
+ &envoy_annotations_deprecation_proto_upbdefinit,
&udpa_annotations_migrate_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
&udpa_annotations_versioning_proto_upbdefinit,
@@ -268,5 +296,5 @@ upb_def_init envoy_config_core_v3_base_proto_upbdefinit = {
deps,
layouts,
"envoy/config/core/v3/base.proto",
- UPB_STRVIEW_INIT(descriptor, 4473)
+ UPB_STRVIEW_INIT(descriptor, 4952)
};
diff --git a/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h b/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h
index 4464edaf68..dfe2c27096 100644
--- a/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h
+++ b/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h
@@ -41,6 +41,11 @@ UPB_INLINE const upb_msgdef *envoy_config_core_v3_Node_getmsgdef(upb_symtab *s)
return upb_symtab_lookupmsg(s, "envoy.config.core.v3.Node");
}
+UPB_INLINE const upb_msgdef *envoy_config_core_v3_Node_DynamicParametersEntry_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &envoy_config_core_v3_base_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "envoy.config.core.v3.Node.DynamicParametersEntry");
+}
+
UPB_INLINE const upb_msgdef *envoy_config_core_v3_Metadata_getmsgdef(upb_symtab *s) {
_upb_symtab_loaddefinit(s, &envoy_config_core_v3_base_proto_upbdefinit);
return upb_symtab_lookupmsg(s, "envoy.config.core.v3.Metadata");
@@ -51,6 +56,11 @@ UPB_INLINE const upb_msgdef *envoy_config_core_v3_Metadata_FilterMetadataEntry_g
return upb_symtab_lookupmsg(s, "envoy.config.core.v3.Metadata.FilterMetadataEntry");
}
+UPB_INLINE const upb_msgdef *envoy_config_core_v3_Metadata_TypedFilterMetadataEntry_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &envoy_config_core_v3_base_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "envoy.config.core.v3.Metadata.TypedFilterMetadataEntry");
+}
+
UPB_INLINE const upb_msgdef *envoy_config_core_v3_RuntimeUInt32_getmsgdef(upb_symtab *s) {
_upb_symtab_loaddefinit(s, &envoy_config_core_v3_base_proto_upbdefinit);
return upb_symtab_lookupmsg(s, "envoy.config.core.v3.RuntimeUInt32");
diff --git a/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c b/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c
index 6eb7709833..95be6b37a0 100644
--- a/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c
+++ b/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c
@@ -31,7 +31,7 @@ static const upb_msglayout *layouts[5] = {
&envoy_config_core_v3_ConfigSource_msginit,
};
-static const char descriptor[2238] = {'\n', '(', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'c', 'o',
+static const char descriptor[2256] = {'\n', '(', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'c', 'o',
'n', 'f', 'i', 'g', '_', 's', 'o', 'u', 'r', 'c', 'e', '.', 'p', 'r', 'o', 't', 'o', '\022', '\024', 'e', 'n', 'v', 'o', 'y', '.',
'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '\032', '\'', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n',
'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'g', 'r', 'p', 'c', '_', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.',
@@ -115,12 +115,13 @@ static const char descriptor[2238] = {'\n', '(', 'e', 'n', 'v', 'o', 'y', '/', '
'\022', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'A', 'p', 'i', 'V', 'e', 'r', 's', 'i', 'o', 'n', ':', '%', '\232', '\305', '\210', '\036',
' ', '\n', '\036', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'C', 'o', 'n', 'f',
'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\036', '\n', '\027', 'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'o', 'u', 'r', 'c', 'e',
-'_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', '*', '.', '\n', '\n', 'A', 'p', 'i', 'V', 'e', 'r',
-'s', 'i', 'o', 'n', '\022', '\014', '\n', '\004', 'A', 'U', 'T', 'O', '\020', '\000', '\032', '\002', '\010', '\001', '\022', '\n', '\n', '\002', 'V', '2', '\020',
-'\001', '\032', '\002', '\010', '\001', '\022', '\006', '\n', '\002', 'V', '3', '\020', '\002', 'B', 'A', '\n', '\"', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y',
-'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v',
-'3', 'B', '\021', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310',
-'\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', '*', '@', '\n', '\n', 'A', 'p', 'i', 'V', 'e', 'r',
+'s', 'i', 'o', 'n', '\022', '\025', '\n', '\004', 'A', 'U', 'T', 'O', '\020', '\000', '\032', '\013', '\010', '\001', '\212', '\364', '\233', '\263', '\005', '\003', '3',
+'.', '0', '\022', '\023', '\n', '\002', 'V', '2', '\020', '\001', '\032', '\013', '\010', '\001', '\212', '\364', '\233', '\263', '\005', '\003', '3', '.', '0', '\022', '\006',
+'\n', '\002', 'V', '3', '\020', '\002', 'B', 'A', '\n', '\"', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e',
+'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', 'B', '\021', 'C', 'o', 'n', 'f',
+'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006',
+'p', 'r', 'o', 't', 'o', '3',
};
static upb_def_init *deps[9] = {
@@ -139,5 +140,5 @@ upb_def_init envoy_config_core_v3_config_source_proto_upbdefinit = {
deps,
layouts,
"envoy/config/core/v3/config_source.proto",
- UPB_STRVIEW_INIT(descriptor, 2238)
+ UPB_STRVIEW_INIT(descriptor, 2256)
};
diff --git a/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c b/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c
index 0f1096b564..f8481f7ae4 100644
--- a/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c
+++ b/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c
@@ -9,14 +9,18 @@
#include "upb/def.h"
#include "envoy/config/core/v3/protocol.upbdefs.h"
+extern upb_def_init envoy_config_core_v3_extension_proto_upbdefinit;
extern upb_def_init envoy_type_v3_percent_proto_upbdefinit;
extern upb_def_init google_protobuf_duration_proto_upbdefinit;
extern upb_def_init google_protobuf_wrappers_proto_upbdefinit;
+extern upb_def_init envoy_annotations_deprecation_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
extern upb_def_init udpa_annotations_versioning_proto_upbdefinit;
extern upb_def_init validate_validate_proto_upbdefinit;
extern const upb_msglayout envoy_config_core_v3_TcpProtocolOptions_msginit;
+extern const upb_msglayout envoy_config_core_v3_QuicProtocolOptions_msginit;
extern const upb_msglayout envoy_config_core_v3_UpstreamHttpProtocolOptions_msginit;
+extern const upb_msglayout envoy_config_core_v3_AlternateProtocolsCacheOptions_msginit;
extern const upb_msglayout envoy_config_core_v3_HttpProtocolOptions_msginit;
extern const upb_msglayout envoy_config_core_v3_Http1ProtocolOptions_msginit;
extern const upb_msglayout envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_msginit;
@@ -26,10 +30,13 @@ extern const upb_msglayout envoy_config_core_v3_Http2ProtocolOptions_msginit;
extern const upb_msglayout envoy_config_core_v3_Http2ProtocolOptions_SettingsParameter_msginit;
extern const upb_msglayout envoy_config_core_v3_GrpcProtocolOptions_msginit;
extern const upb_msglayout envoy_config_core_v3_Http3ProtocolOptions_msginit;
+extern const upb_msglayout envoy_config_core_v3_SchemeHeaderTransformation_msginit;
-static const upb_msglayout *layouts[11] = {
+static const upb_msglayout *layouts[14] = {
&envoy_config_core_v3_TcpProtocolOptions_msginit,
+ &envoy_config_core_v3_QuicProtocolOptions_msginit,
&envoy_config_core_v3_UpstreamHttpProtocolOptions_msginit,
+ &envoy_config_core_v3_AlternateProtocolsCacheOptions_msginit,
&envoy_config_core_v3_HttpProtocolOptions_msginit,
&envoy_config_core_v3_Http1ProtocolOptions_msginit,
&envoy_config_core_v3_Http1ProtocolOptions_HeaderKeyFormat_msginit,
@@ -39,184 +46,233 @@ static const upb_msglayout *layouts[11] = {
&envoy_config_core_v3_Http2ProtocolOptions_SettingsParameter_msginit,
&envoy_config_core_v3_GrpcProtocolOptions_msginit,
&envoy_config_core_v3_Http3ProtocolOptions_msginit,
+ &envoy_config_core_v3_SchemeHeaderTransformation_msginit,
};
-static const char descriptor[4229] = {'\n', '#', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'p', 'r',
+static const char descriptor[5396] = {'\n', '#', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'p', 'r',
'o', 't', 'o', 'c', 'o', 'l', '.', 'p', 'r', 'o', 't', 'o', '\022', '\024', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
-'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '\032', '\033', 'e', 'n', 'v', 'o', 'y', '/', 't', 'y', 'p', 'e', '/', 'v', '3', '/',
-'p', 'e', 'r', 'c', 'e', 'n', 't', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o',
-'t', 'o', 'b', 'u', 'f', '/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o',
-'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o',
+'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '\032', '$', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c',
+'o', 'r', 'e', '/', 'v', '3', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\033', 'e',
+'n', 'v', 'o', 'y', '/', 't', 'y', 'p', 'e', '/', 'v', '3', '/', 'p', 'e', 'r', 'c', 'e', 'n', 't', '.', 'p', 'r', 'o', 't',
+'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'd', 'u', 'r', 'a', 't', 'i',
+'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
+'/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '#', 'e', 'n', 'v', 'o', 'y', '/', 'a', 'n',
+'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'd', 'e', 'p', 'r', 'e', 'c', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o',
't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't',
'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n',
's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd',
'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', 'A', '\n', '\022', 'T', 'c', 'p',
'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', ':', '+', '\232', '\305', '\210', '\036', '&', '\n', '$', 'e',
'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'T', 'c', 'p', 'P', 'r', 'o', 't', 'o',
-'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\"', '\236', '\001', '\n', '\033', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'H', 't',
-'t', 'p', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', '\031', '\n', '\010', 'a', 'u', 't', 'o',
-'_', 's', 'n', 'i', '\030', '\001', ' ', '\001', '(', '\010', 'R', '\007', 'a', 'u', 't', 'o', 'S', 'n', 'i', '\022', '.', '\n', '\023', 'a', 'u',
-'t', 'o', '_', 's', 'a', 'n', '_', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', '\030', '\002', ' ', '\001', '(', '\010', 'R', '\021',
-'a', 'u', 't', 'o', 'S', 'a', 'n', 'V', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', ':', '4', '\232', '\305', '\210', '\036', '/', '\n',
-'-', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'U', 'p', 's', 't', 'r', 'e',
-'a', 'm', 'H', 't', 't', 'p', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\"', '\322', '\004', '\n',
-'\023', 'H', 't', 't', 'p', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', '<', '\n', '\014', 'i',
-'d', 'l', 'e', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\001', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l',
-'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\013', 'i', 'd', 'l', 'e',
-'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'Q', '\n', '\027', 'm', 'a', 'x', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n',
-'_', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\030', '\003', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.',
-'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\025', 'm', 'a', 'x', 'C', 'o', 'n',
-'n', 'e', 'c', 't', 'i', 'o', 'n', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\022', 'Q', '\n', '\021', 'm', 'a', 'x', '_', 'h', 'e',
-'a', 'd', 'e', 'r', 's', '_', 'c', 'o', 'u', 'n', 't', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l',
-'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\372',
-'B', '\004', '*', '\002', '(', '\001', 'R', '\017', 'm', 'a', 'x', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'C', 'o', 'u', 'n', 't', '\022', 'I',
-'\n', '\023', 'm', 'a', 'x', '_', 's', 't', 'r', 'e', 'a', 'm', '_', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\030', '\004', ' ', '\001',
+'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\"', '\303', '\002', '\n', '\023', 'Q', 'u', 'i', 'c', 'P', 'r', 'o', 't', 'o', 'c',
+'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', 'R', '\n', '\026', 'm', 'a', 'x', '_', 'c', 'o', 'n', 'c', 'u', 'r', 'r', 'e',
+'n', 't', '_', 's', 't', 'r', 'e', 'a', 'm', 's', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e',
+'.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\024', 'm', 'a',
+'x', 'C', 'o', 'n', 'c', 'u', 'r', 'r', 'e', 'n', 't', 'S', 't', 'r', 'e', 'a', 'm', 's', '\022', 'g', '\n', '\032', 'i', 'n', 'i',
+'t', 'i', 'a', 'l', '_', 's', 't', 'r', 'e', 'a', 'm', '_', 'w', 'i', 'n', 'd', 'o', 'w', '_', 's', 'i', 'z', 'e', '\030', '\002',
+' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I',
+'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\014', '\372', 'B', '\t', '*', '\007', '\030', '\200', '\200', '\200', '\010', '(', '\001', 'R', '\027',
+'i', 'n', 'i', 't', 'i', 'a', 'l', 'S', 't', 'r', 'e', 'a', 'm', 'W', 'i', 'n', 'd', 'o', 'w', 'S', 'i', 'z', 'e', '\022', 'o',
+'\n', '\036', 'i', 'n', 'i', 't', 'i', 'a', 'l', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'w', 'i', 'n', 'd',
+'o', 'w', '_', 's', 'i', 'z', 'e', '\030', '\003', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r',
+'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\014', '\372', 'B', '\t', '*', '\007',
+'\030', '\200', '\200', '\200', '\014', '(', '\001', 'R', '\033', 'i', 'n', 'i', 't', 'i', 'a', 'l', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o',
+'n', 'W', 'i', 'n', 'd', 'o', 'w', 'S', 'i', 'z', 'e', '\"', '\236', '\001', '\n', '\033', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'H',
+'t', 't', 'p', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', '\031', '\n', '\010', 'a', 'u', 't',
+'o', '_', 's', 'n', 'i', '\030', '\001', ' ', '\001', '(', '\010', 'R', '\007', 'a', 'u', 't', 'o', 'S', 'n', 'i', '\022', '.', '\n', '\023', 'a',
+'u', 't', 'o', '_', 's', 'a', 'n', '_', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', '\030', '\002', ' ', '\001', '(', '\010', 'R',
+'\021', 'a', 'u', 't', 'o', 'S', 'a', 'n', 'V', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', ':', '4', '\232', '\305', '\210', '\036', '/',
+'\n', '-', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'U', 'p', 's', 't', 'r',
+'e', 'a', 'm', 'H', 't', 't', 'p', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\"', '\205', '\001',
+'\n', '\036', 'A', 'l', 't', 'e', 'r', 'n', 'a', 't', 'e', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 's', 'C', 'a', 'c', 'h', 'e',
+'O', 'p', 't', 'i', 'o', 'n', 's', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B',
+'\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', 'F', '\n', '\013', 'm', 'a', 'x', '_', 'e', 'n', 't', 'r', 'i', 'e',
+'s', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
+'.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\372', 'B', '\004', '*', '\002', ' ', '\000', 'R', '\n', 'm', 'a',
+'x', 'E', 'n', 't', 'r', 'i', 'e', 's', '\"', '\257', '\005', '\n', '\023', 'H', 't', 't', 'p', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l',
+'O', 'p', 't', 'i', 'o', 'n', 's', '\022', '<', '\n', '\014', 'i', 'd', 'l', 'e', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\001',
+' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u',
+'r', 'a', 't', 'i', 'o', 'n', 'R', '\013', 'i', 'd', 'l', 'e', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'Q', '\n', '\027', 'm', 'a',
+'x', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\030', '\003', ' ', '\001',
'(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a',
-'t', 'i', 'o', 'n', 'R', '\021', 'm', 'a', 'x', 'S', 't', 'r', 'e', 'a', 'm', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\022', '\215',
-'\001', '\n', '\037', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 'w', 'i', 't', 'h', '_', 'u', 'n', 'd', 'e', 'r', 's', 'c', 'o', 'r',
-'e', 's', '_', 'a', 'c', 't', 'i', 'o', 'n', '\030', '\005', ' ', '\001', '(', '\016', '2', 'F', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
-'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 't', 't', 'p', 'P', 'r', 'o', 't', 'o', 'c', 'o',
-'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '.', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'W', 'i', 't', 'h', 'U', 'n', 'd', 'e', 'r',
-'s', 'c', 'o', 'r', 'e', 's', 'A', 'c', 't', 'i', 'o', 'n', 'R', '\034', 'h', 'e', 'a', 'd', 'e', 'r', 's', 'W', 'i', 't', 'h',
-'U', 'n', 'd', 'e', 'r', 's', 'c', 'o', 'r', 'e', 's', 'A', 'c', 't', 'i', 'o', 'n', '\"', 'N', '\n', '\034', 'H', 'e', 'a', 'd',
-'e', 'r', 's', 'W', 'i', 't', 'h', 'U', 'n', 'd', 'e', 'r', 's', 'c', 'o', 'r', 'e', 's', 'A', 'c', 't', 'i', 'o', 'n', '\022',
-'\t', '\n', '\005', 'A', 'L', 'L', 'O', 'W', '\020', '\000', '\022', '\022', '\n', '\016', 'R', 'E', 'J', 'E', 'C', 'T', '_', 'R', 'E', 'Q', 'U',
-'E', 'S', 'T', '\020', '\001', '\022', '\017', '\n', '\013', 'D', 'R', 'O', 'P', '_', 'H', 'E', 'A', 'D', 'E', 'R', '\020', '\002', ':', ',', '\232',
-'\305', '\210', '\036', '\'', '\n', '%', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'H',
-'t', 't', 'p', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\"', '\361', '\006', '\n', '\024', 'H', 't',
-'t', 'p', '1', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', 'H', '\n', '\022', 'a', 'l', 'l',
-'o', 'w', '_', 'a', 'b', 's', 'o', 'l', 'u', 't', 'e', '_', 'u', 'r', 'l', '\030', '\001', ' ', '\001', '(', '\013', '2', '\032', '.', 'g',
-'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R',
-'\020', 'a', 'l', 'l', 'o', 'w', 'A', 'b', 's', 'o', 'l', 'u', 't', 'e', 'U', 'r', 'l', '\022', '$', '\n', '\016', 'a', 'c', 'c', 'e',
-'p', 't', '_', 'h', 't', 't', 'p', '_', '1', '0', '\030', '\002', ' ', '\001', '(', '\010', 'R', '\014', 'a', 'c', 'c', 'e', 'p', 't', 'H',
-'t', 't', 'p', '1', '0', '\022', '6', '\n', '\030', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 'h', 'o', 's', 't', '_', 'f', 'o', 'r',
-'_', 'h', 't', 't', 'p', '_', '1', '0', '\030', '\003', ' ', '\001', '(', '\t', 'R', '\024', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'H', 'o',
-'s', 't', 'F', 'o', 'r', 'H', 't', 't', 'p', '1', '0', '\022', 'f', '\n', '\021', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'k', 'e', 'y',
-'_', 'f', 'o', 'r', 'm', 'a', 't', '\030', '\004', ' ', '\001', '(', '\013', '2', ':', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
-'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 't', 't', 'p', '1', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l',
-'O', 'p', 't', 'i', 'o', 'n', 's', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'K', 'e', 'y', 'F', 'o', 'r', 'm', 'a', 't', 'R', '\017',
-'h', 'e', 'a', 'd', 'e', 'r', 'K', 'e', 'y', 'F', 'o', 'r', 'm', 'a', 't', '\022', '\'', '\n', '\017', 'e', 'n', 'a', 'b', 'l', 'e',
-'_', 't', 'r', 'a', 'i', 'l', 'e', 'r', 's', '\030', '\005', ' ', '\001', '(', '\010', 'R', '\016', 'e', 'n', 'a', 'b', 'l', 'e', 'T', 'r',
-'a', 'i', 'l', 'e', 'r', 's', '\022', '0', '\n', '\024', 'a', 'l', 'l', 'o', 'w', '_', 'c', 'h', 'u', 'n', 'k', 'e', 'd', '_', 'l',
-'e', 'n', 'g', 't', 'h', '\030', '\006', ' ', '\001', '(', '\010', 'R', '\022', 'a', 'l', 'l', 'o', 'w', 'C', 'h', 'u', 'n', 'k', 'e', 'd',
-'L', 'e', 'n', 'g', 't', 'h', '\022', 'z', '\n', '-', 'o', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '_', 's', 't', 'r', 'e', 'a', 'm',
-'_', 'e', 'r', 'r', 'o', 'r', '_', 'o', 'n', '_', 'i', 'n', 'v', 'a', 'l', 'i', 'd', '_', 'h', 't', 't', 'p', '_', 'm', 'e',
-'s', 's', 'a', 'g', 'e', '\030', '\007', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't',
-'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\'', 'o', 'v', 'e', 'r', 'r', 'i', 'd', 'e', 'S',
-'t', 'r', 'e', 'a', 'm', 'E', 'r', 'r', 'o', 'r', 'O', 'n', 'I', 'n', 'v', 'a', 'l', 'i', 'd', 'H', 't', 't', 'p', 'M', 'e',
-'s', 's', 'a', 'g', 'e', '\032', '\302', '\002', '\n', '\017', 'H', 'e', 'a', 'd', 'e', 'r', 'K', 'e', 'y', 'F', 'o', 'r', 'm', 'a', 't',
-'\022', 'x', '\n', '\021', 'p', 'r', 'o', 'p', 'e', 'r', '_', 'c', 'a', 's', 'e', '_', 'w', 'o', 'r', 'd', 's', '\030', '\001', ' ', '\001',
-'(', '\013', '2', 'J', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3',
-'.', 'H', 't', 't', 'p', '1', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '.', 'H', 'e', 'a',
-'d', 'e', 'r', 'K', 'e', 'y', 'F', 'o', 'r', 'm', 'a', 't', '.', 'P', 'r', 'o', 'p', 'e', 'r', 'C', 'a', 's', 'e', 'W', 'o',
-'r', 'd', 's', 'H', '\000', 'R', '\017', 'p', 'r', 'o', 'p', 'e', 'r', 'C', 'a', 's', 'e', 'W', 'o', 'r', 'd', 's', '\032', '`', '\n',
-'\017', 'P', 'r', 'o', 'p', 'e', 'r', 'C', 'a', 's', 'e', 'W', 'o', 'r', 'd', 's', ':', 'M', '\232', '\305', '\210', '\036', 'H', '\n', 'F',
-'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'H', 't', 't', 'p', '1', 'P', 'r',
-'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'K', 'e', 'y', 'F', 'o',
-'r', 'm', 'a', 't', '.', 'P', 'r', 'o', 'p', 'e', 'r', 'C', 'a', 's', 'e', 'W', 'o', 'r', 'd', 's', ':', '=', '\232', '\305', '\210',
-'\036', '8', '\n', '6', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'H', 't', 't',
-'p', '1', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'K',
-'e', 'y', 'F', 'o', 'r', 'm', 'a', 't', 'B', '\024', '\n', '\r', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'f', 'o', 'r', 'm', 'a', 't',
-'\022', '\003', '\370', 'B', '\001', ':', '-', '\232', '\305', '\210', '\036', '(', '\n', '&', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v',
-'2', '.', 'c', 'o', 'r', 'e', '.', 'H', 't', 't', 'p', '1', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o',
-'n', 's', '\"', '\340', '\001', '\n', '\021', 'K', 'e', 'e', 'p', 'a', 'l', 'i', 'v', 'e', 'S', 'e', 't', 't', 'i', 'n', 'g', 's', '\022',
-'E', '\n', '\010', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\001', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l',
-'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\016', '\372', 'B', '\013', '\252',
-'\001', '\010', '\010', '\001', '2', '\004', '\020', '\300', '\204', '=', 'R', '\010', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\022', 'C', '\n', '\007', 't',
-'i', 'm', 'e', 'o', 'u', 't', '\030', '\002', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o',
-'t', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\016', '\372', 'B', '\013', '\252', '\001', '\010', '\010', '\001', '2',
-'\004', '\020', '\300', '\204', '=', 'R', '\007', 't', 'i', 'm', 'e', 'o', 'u', 't', '\022', '?', '\n', '\017', 'i', 'n', 't', 'e', 'r', 'v', 'a',
-'l', '_', 'j', 'i', 't', 't', 'e', 'r', '\030', '\003', ' ', '\001', '(', '\013', '2', '\026', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y',
-'p', 'e', '.', 'v', '3', '.', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\016', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', 'J', 'i',
-'t', 't', 'e', 'r', '\"', '\370', '\r', '\n', '\024', 'H', 't', 't', 'p', '2', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't',
-'i', 'o', 'n', 's', '\022', 'F', '\n', '\020', 'h', 'p', 'a', 'c', 'k', '_', 't', 'a', 'b', 'l', 'e', '_', 's', 'i', 'z', 'e', '\030',
-'\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U',
-'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\016', 'h', 'p', 'a', 'c', 'k', 'T', 'a', 'b', 'l', 'e', 'S', 'i', 'z',
-'e', '\022', 'a', '\n', '\026', 'm', 'a', 'x', '_', 'c', 'o', 'n', 'c', 'u', 'r', 'r', 'e', 'n', 't', '_', 's', 't', 'r', 'e', 'a',
-'m', 's', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u',
-'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\r', '\372', 'B', '\n', '*', '\010', '\030', '\377', '\377', '\377', '\377',
-'\007', '(', '\001', 'R', '\024', 'm', 'a', 'x', 'C', 'o', 'n', 'c', 'u', 'r', 'r', 'e', 'n', 't', 'S', 't', 'r', 'e', 'a', 'm', 's',
-'\022', 'j', '\n', '\032', 'i', 'n', 'i', 't', 'i', 'a', 'l', '_', 's', 't', 'r', 'e', 'a', 'm', '_', 'w', 'i', 'n', 'd', 'o', 'w',
-'_', 's', 'i', 'z', 'e', '\030', '\003', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't',
-'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\017', '\372', 'B', '\014', '*', '\n', '\030', '\377',
-'\377', '\377', '\377', '\007', '(', '\377', '\377', '\003', 'R', '\027', 'i', 'n', 'i', 't', 'i', 'a', 'l', 'S', 't', 'r', 'e', 'a', 'm', 'W', 'i',
-'n', 'd', 'o', 'w', 'S', 'i', 'z', 'e', '\022', 'r', '\n', '\036', 'i', 'n', 'i', 't', 'i', 'a', 'l', '_', 'c', 'o', 'n', 'n', 'e',
-'c', 't', 'i', 'o', 'n', '_', 'w', 'i', 'n', 'd', 'o', 'w', '_', 's', 'i', 'z', 'e', '\030', '\004', ' ', '\001', '(', '\013', '2', '\034',
-'.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a',
-'l', 'u', 'e', 'B', '\017', '\372', 'B', '\014', '*', '\n', '\030', '\377', '\377', '\377', '\377', '\007', '(', '\377', '\377', '\003', 'R', '\033', 'i', 'n', 'i',
-'t', 'i', 'a', 'l', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'W', 'i', 'n', 'd', 'o', 'w', 'S', 'i', 'z', 'e', '\022',
-'#', '\n', '\r', 'a', 'l', 'l', 'o', 'w', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', '\030', '\005', ' ', '\001', '(', '\010', 'R', '\014', 'a',
-'l', 'l', 'o', 'w', 'C', 'o', 'n', 'n', 'e', 'c', 't', '\022', '%', '\n', '\016', 'a', 'l', 'l', 'o', 'w', '_', 'm', 'e', 't', 'a',
-'d', 'a', 't', 'a', '\030', '\006', ' ', '\001', '(', '\010', 'R', '\r', 'a', 'l', 'l', 'o', 'w', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a',
-'\022', 'U', '\n', '\023', 'm', 'a', 'x', '_', 'o', 'u', 't', 'b', 'o', 'u', 'n', 'd', '_', 'f', 'r', 'a', 'm', 'e', 's', '\030', '\007',
+'t', 'i', 'o', 'n', 'R', '\025', 'm', 'a', 'x', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'D', 'u', 'r', 'a', 't', 'i',
+'o', 'n', '\022', 'Q', '\n', '\021', 'm', 'a', 'x', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 'c', 'o', 'u', 'n', 't', '\030', '\002',
' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I',
-'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\372', 'B', '\004', '*', '\002', '(', '\001', 'R', '\021', 'm', 'a', 'x', 'O', 'u',
-'t', 'b', 'o', 'u', 'n', 'd', 'F', 'r', 'a', 'm', 'e', 's', '\022', 'd', '\n', '\033', 'm', 'a', 'x', '_', 'o', 'u', 't', 'b', 'o',
-'u', 'n', 'd', '_', 'c', 'o', 'n', 't', 'r', 'o', 'l', '_', 'f', 'r', 'a', 'm', 'e', 's', '\030', '\010', ' ', '\001', '(', '\013', '2',
-'\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V',
-'a', 'l', 'u', 'e', 'B', '\007', '\372', 'B', '\004', '*', '\002', '(', '\001', 'R', '\030', 'm', 'a', 'x', 'O', 'u', 't', 'b', 'o', 'u', 'n',
-'d', 'C', 'o', 'n', 't', 'r', 'o', 'l', 'F', 'r', 'a', 'm', 'e', 's', '\022', '\204', '\001', '\n', '1', 'm', 'a', 'x', '_', 'c', 'o',
-'n', 's', 'e', 'c', 'u', 't', 'i', 'v', 'e', '_', 'i', 'n', 'b', 'o', 'u', 'n', 'd', '_', 'f', 'r', 'a', 'm', 'e', 's', '_',
-'w', 'i', 't', 'h', '_', 'e', 'm', 'p', 't', 'y', '_', 'p', 'a', 'y', 'l', 'o', 'a', 'd', '\030', '\t', ' ', '\001', '(', '\013', '2',
-'\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V',
-'a', 'l', 'u', 'e', 'R', '+', 'm', 'a', 'x', 'C', 'o', 'n', 's', 'e', 'c', 'u', 't', 'i', 'v', 'e', 'I', 'n', 'b', 'o', 'u',
-'n', 'd', 'F', 'r', 'a', 'm', 'e', 's', 'W', 'i', 't', 'h', 'E', 'm', 'p', 't', 'y', 'P', 'a', 'y', 'l', 'o', 'a', 'd', '\022',
-'o', '\n', '&', 'm', 'a', 'x', '_', 'i', 'n', 'b', 'o', 'u', 'n', 'd', '_', 'p', 'r', 'i', 'o', 'r', 'i', 't', 'y', '_', 'f',
-'r', 'a', 'm', 'e', 's', '_', 'p', 'e', 'r', '_', 's', 't', 'r', 'e', 'a', 'm', '\030', '\n', ' ', '\001', '(', '\013', '2', '\034', '.',
-'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l',
-'u', 'e', 'R', '!', 'm', 'a', 'x', 'I', 'n', 'b', 'o', 'u', 'n', 'd', 'P', 'r', 'i', 'o', 'r', 'i', 't', 'y', 'F', 'r', 'a',
-'m', 'e', 's', 'P', 'e', 'r', 'S', 't', 'r', 'e', 'a', 'm', '\022', '\221', '\001', '\n', '4', 'm', 'a', 'x', '_', 'i', 'n', 'b', 'o',
-'u', 'n', 'd', '_', 'w', 'i', 'n', 'd', 'o', 'w', '_', 'u', 'p', 'd', 'a', 't', 'e', '_', 'f', 'r', 'a', 'm', 'e', 's', '_',
-'p', 'e', 'r', '_', 'd', 'a', 't', 'a', '_', 'f', 'r', 'a', 'm', 'e', '_', 's', 'e', 'n', 't', '\030', '\013', ' ', '\001', '(', '\013',
+'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\372', 'B', '\004', '*', '\002', '(', '\001', 'R', '\017', 'm', 'a', 'x', 'H', 'e',
+'a', 'd', 'e', 'r', 's', 'C', 'o', 'u', 'n', 't', '\022', 'I', '\n', '\023', 'm', 'a', 'x', '_', 's', 't', 'r', 'e', 'a', 'm', '_',
+'d', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\030', '\004', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p',
+'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\021', 'm', 'a', 'x', 'S', 't', 'r', 'e',
+'a', 'm', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\022', '\215', '\001', '\n', '\037', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 'w', 'i',
+'t', 'h', '_', 'u', 'n', 'd', 'e', 'r', 's', 'c', 'o', 'r', 'e', 's', '_', 'a', 'c', 't', 'i', 'o', 'n', '\030', '\005', ' ', '\001',
+'(', '\016', '2', 'F', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3',
+'.', 'H', 't', 't', 'p', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '.', 'H', 'e', 'a', 'd',
+'e', 'r', 's', 'W', 'i', 't', 'h', 'U', 'n', 'd', 'e', 'r', 's', 'c', 'o', 'r', 'e', 's', 'A', 'c', 't', 'i', 'o', 'n', 'R',
+'\034', 'h', 'e', 'a', 'd', 'e', 'r', 's', 'W', 'i', 't', 'h', 'U', 'n', 'd', 'e', 'r', 's', 'c', 'o', 'r', 'e', 's', 'A', 'c',
+'t', 'i', 'o', 'n', '\022', '[', '\n', '\033', 'm', 'a', 'x', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', 's', '_', 'p', 'e', 'r', '_',
+'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '\030', '\006', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e',
+'.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\030', 'm', 'a',
+'x', 'R', 'e', 'q', 'u', 'e', 's', 't', 's', 'P', 'e', 'r', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '\"', 'N', '\n',
+'\034', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'W', 'i', 't', 'h', 'U', 'n', 'd', 'e', 'r', 's', 'c', 'o', 'r', 'e', 's', 'A', 'c',
+'t', 'i', 'o', 'n', '\022', '\t', '\n', '\005', 'A', 'L', 'L', 'O', 'W', '\020', '\000', '\022', '\022', '\n', '\016', 'R', 'E', 'J', 'E', 'C', 'T',
+'_', 'R', 'E', 'Q', 'U', 'E', 'S', 'T', '\020', '\001', '\022', '\017', '\n', '\013', 'D', 'R', 'O', 'P', '_', 'H', 'E', 'A', 'D', 'E', 'R',
+'\020', '\002', ':', ',', '\232', '\305', '\210', '\036', '\'', '\n', '%', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c',
+'o', 'r', 'e', '.', 'H', 't', 't', 'p', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\"', '\316',
+'\007', '\n', '\024', 'H', 't', 't', 'p', '1', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', 'H',
+'\n', '\022', 'a', 'l', 'l', 'o', 'w', '_', 'a', 'b', 's', 'o', 'l', 'u', 't', 'e', '_', 'u', 'r', 'l', '\030', '\001', ' ', '\001', '(',
+'\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V',
+'a', 'l', 'u', 'e', 'R', '\020', 'a', 'l', 'l', 'o', 'w', 'A', 'b', 's', 'o', 'l', 'u', 't', 'e', 'U', 'r', 'l', '\022', '$', '\n',
+'\016', 'a', 'c', 'c', 'e', 'p', 't', '_', 'h', 't', 't', 'p', '_', '1', '0', '\030', '\002', ' ', '\001', '(', '\010', 'R', '\014', 'a', 'c',
+'c', 'e', 'p', 't', 'H', 't', 't', 'p', '1', '0', '\022', '6', '\n', '\030', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 'h', 'o', 's',
+'t', '_', 'f', 'o', 'r', '_', 'h', 't', 't', 'p', '_', '1', '0', '\030', '\003', ' ', '\001', '(', '\t', 'R', '\024', 'd', 'e', 'f', 'a',
+'u', 'l', 't', 'H', 'o', 's', 't', 'F', 'o', 'r', 'H', 't', 't', 'p', '1', '0', '\022', 'f', '\n', '\021', 'h', 'e', 'a', 'd', 'e',
+'r', '_', 'k', 'e', 'y', '_', 'f', 'o', 'r', 'm', 'a', 't', '\030', '\004', ' ', '\001', '(', '\013', '2', ':', '.', 'e', 'n', 'v', 'o',
+'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 't', 't', 'p', '1', 'P', 'r', 'o',
+'t', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'K', 'e', 'y', 'F', 'o', 'r',
+'m', 'a', 't', 'R', '\017', 'h', 'e', 'a', 'd', 'e', 'r', 'K', 'e', 'y', 'F', 'o', 'r', 'm', 'a', 't', '\022', '\'', '\n', '\017', 'e',
+'n', 'a', 'b', 'l', 'e', '_', 't', 'r', 'a', 'i', 'l', 'e', 'r', 's', '\030', '\005', ' ', '\001', '(', '\010', 'R', '\016', 'e', 'n', 'a',
+'b', 'l', 'e', 'T', 'r', 'a', 'i', 'l', 'e', 'r', 's', '\022', '0', '\n', '\024', 'a', 'l', 'l', 'o', 'w', '_', 'c', 'h', 'u', 'n',
+'k', 'e', 'd', '_', 'l', 'e', 'n', 'g', 't', 'h', '\030', '\006', ' ', '\001', '(', '\010', 'R', '\022', 'a', 'l', 'l', 'o', 'w', 'C', 'h',
+'u', 'n', 'k', 'e', 'd', 'L', 'e', 'n', 'g', 't', 'h', '\022', 'z', '\n', '-', 'o', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '_', 's',
+'t', 'r', 'e', 'a', 'm', '_', 'e', 'r', 'r', 'o', 'r', '_', 'o', 'n', '_', 'i', 'n', 'v', 'a', 'l', 'i', 'd', '_', 'h', 't',
+'t', 'p', '_', 'm', 'e', 's', 's', 'a', 'g', 'e', '\030', '\007', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e',
+'.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\'', 'o', 'v', 'e', 'r',
+'r', 'i', 'd', 'e', 'S', 't', 'r', 'e', 'a', 'm', 'E', 'r', 'r', 'o', 'r', 'O', 'n', 'I', 'n', 'v', 'a', 'l', 'i', 'd', 'H',
+'t', 't', 'p', 'M', 'e', 's', 's', 'a', 'g', 'e', '\032', '\237', '\003', '\n', '\017', 'H', 'e', 'a', 'd', 'e', 'r', 'K', 'e', 'y', 'F',
+'o', 'r', 'm', 'a', 't', '\022', 'x', '\n', '\021', 'p', 'r', 'o', 'p', 'e', 'r', '_', 'c', 'a', 's', 'e', '_', 'w', 'o', 'r', 'd',
+'s', '\030', '\001', ' ', '\001', '(', '\013', '2', 'J', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o',
+'r', 'e', '.', 'v', '3', '.', 'H', 't', 't', 'p', '1', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n',
+'s', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'K', 'e', 'y', 'F', 'o', 'r', 'm', 'a', 't', '.', 'P', 'r', 'o', 'p', 'e', 'r', 'C',
+'a', 's', 'e', 'W', 'o', 'r', 'd', 's', 'H', '\000', 'R', '\017', 'p', 'r', 'o', 'p', 'e', 'r', 'C', 'a', 's', 'e', 'W', 'o', 'r',
+'d', 's', '\022', '[', '\n', '\022', 's', 't', 'a', 't', 'e', 'f', 'u', 'l', '_', 'f', 'o', 'r', 'm', 'a', 't', 't', 'e', 'r', '\030',
+'\010', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e',
+'.', 'v', '3', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'H',
+'\000', 'R', '\021', 's', 't', 'a', 't', 'e', 'f', 'u', 'l', 'F', 'o', 'r', 'm', 'a', 't', 't', 'e', 'r', '\032', '`', '\n', '\017', 'P',
+'r', 'o', 'p', 'e', 'r', 'C', 'a', 's', 'e', 'W', 'o', 'r', 'd', 's', ':', 'M', '\232', '\305', '\210', '\036', 'H', '\n', 'F', 'e', 'n',
+'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'H', 't', 't', 'p', '1', 'P', 'r', 'o', 't',
+'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'K', 'e', 'y', 'F', 'o', 'r', 'm',
+'a', 't', '.', 'P', 'r', 'o', 'p', 'e', 'r', 'C', 'a', 's', 'e', 'W', 'o', 'r', 'd', 's', ':', '=', '\232', '\305', '\210', '\036', '8',
+'\n', '6', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'H', 't', 't', 'p', '1',
+'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'K', 'e', 'y',
+'F', 'o', 'r', 'm', 'a', 't', 'B', '\024', '\n', '\r', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'f', 'o', 'r', 'm', 'a', 't', '\022', '\003',
+'\370', 'B', '\001', ':', '-', '\232', '\305', '\210', '\036', '(', '\n', '&', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.',
+'c', 'o', 'r', 'e', '.', 'H', 't', 't', 'p', '1', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's',
+'\"', '\301', '\002', '\n', '\021', 'K', 'e', 'e', 'p', 'a', 'l', 'i', 'v', 'e', 'S', 'e', 't', 't', 'i', 'n', 'g', 's', '\022', 'C', '\n',
+'\010', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\001', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.',
+'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\014', '\372', 'B', '\t', '\252', '\001', '\006',
+'2', '\004', '\020', '\300', '\204', '=', 'R', '\010', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\022', 'C', '\n', '\007', 't', 'i', 'm', 'e', 'o',
+'u', 't', '\030', '\002', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u',
+'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\016', '\372', 'B', '\013', '\252', '\001', '\010', '\010', '\001', '2', '\004', '\020', '\300', '\204',
+'=', 'R', '\007', 't', 'i', 'm', 'e', 'o', 'u', 't', '\022', '?', '\n', '\017', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '_', 'j', 'i',
+'t', 't', 'e', 'r', '\030', '\003', ' ', '\001', '(', '\013', '2', '\026', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v',
+'3', '.', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\016', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', 'J', 'i', 't', 't', 'e', 'r',
+'\022', 'a', '\n', '\030', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'i', 'd', 'l', 'e', '_', 'i', 'n', 't', 'e', 'r',
+'v', 'a', 'l', '\030', '\004', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b',
+'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\014', '\372', 'B', '\t', '\252', '\001', '\006', '2', '\004', '\020', '\300', '\204', '=',
+'R', '\026', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'I', 'd', 'l', 'e', 'I', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\"',
+'\201', '\016', '\n', '\024', 'H', 't', 't', 'p', '2', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022',
+'F', '\n', '\020', 'h', 'p', 'a', 'c', 'k', '_', 't', 'a', 'b', 'l', 'e', '_', 's', 'i', 'z', 'e', '\030', '\001', ' ', '\001', '(', '\013',
'2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2',
-'V', 'a', 'l', 'u', 'e', 'B', '\007', '\372', 'B', '\004', '*', '\002', '(', '\001', 'R', ',', 'm', 'a', 'x', 'I', 'n', 'b', 'o', 'u', 'n',
-'d', 'W', 'i', 'n', 'd', 'o', 'w', 'U', 'p', 'd', 'a', 't', 'e', 'F', 'r', 'a', 'm', 'e', 's', 'P', 'e', 'r', 'D', 'a', 't',
-'a', 'F', 'r', 'a', 'm', 'e', 'S', 'e', 'n', 't', '\022', 'U', '\n', '&', 's', 't', 'r', 'e', 'a', 'm', '_', 'e', 'r', 'r', 'o',
-'r', '_', 'o', 'n', '_', 'i', 'n', 'v', 'a', 'l', 'i', 'd', '_', 'h', 't', 't', 'p', '_', 'm', 'e', 's', 's', 'a', 'g', 'i',
-'n', 'g', '\030', '\014', ' ', '\001', '(', '\010', 'B', '\002', '\030', '\001', 'R', '!', 's', 't', 'r', 'e', 'a', 'm', 'E', 'r', 'r', 'o', 'r',
-'O', 'n', 'I', 'n', 'v', 'a', 'l', 'i', 'd', 'H', 't', 't', 'p', 'M', 'e', 's', 's', 'a', 'g', 'i', 'n', 'g', '\022', 'z', '\n',
-'-', 'o', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '_', 's', 't', 'r', 'e', 'a', 'm', '_', 'e', 'r', 'r', 'o', 'r', '_', 'o', 'n',
-'_', 'i', 'n', 'v', 'a', 'l', 'i', 'd', '_', 'h', 't', 't', 'p', '_', 'm', 'e', 's', 's', 'a', 'g', 'e', '\030', '\016', ' ', '\001',
-'(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l',
-'V', 'a', 'l', 'u', 'e', 'R', '\'', 'o', 'v', 'e', 'r', 'r', 'i', 'd', 'e', 'S', 't', 'r', 'e', 'a', 'm', 'E', 'r', 'r', 'o',
-'r', 'O', 'n', 'I', 'n', 'v', 'a', 'l', 'i', 'd', 'H', 't', 't', 'p', 'M', 'e', 's', 's', 'a', 'g', 'e', '\022', 'z', '\n', '\032',
-'c', 'u', 's', 't', 'o', 'm', '_', 's', 'e', 't', 't', 'i', 'n', 'g', 's', '_', 'p', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r',
-'s', '\030', '\r', ' ', '\003', '(', '\013', '2', '<', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o',
-'r', 'e', '.', 'v', '3', '.', 'H', 't', 't', 'p', '2', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n',
-'s', '.', 'S', 'e', 't', 't', 'i', 'n', 'g', 's', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 'R', '\030', 'c', 'u', 's', 't',
-'o', 'm', 'S', 'e', 't', 't', 'i', 'n', 'g', 's', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 's', '\022', 'Z', '\n', '\024', 'c',
-'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'k', 'e', 'e', 'p', 'a', 'l', 'i', 'v', 'e', '\030', '\017', ' ', '\001', '(', '\013',
-'2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'K',
-'e', 'e', 'p', 'a', 'l', 'i', 'v', 'e', 'S', 'e', 't', 't', 'i', 'n', 'g', 's', 'R', '\023', 'c', 'o', 'n', 'n', 'e', 'c', 't',
-'i', 'o', 'n', 'K', 'e', 'e', 'p', 'a', 'l', 'i', 'v', 'e', '\032', '\345', '\001', '\n', '\021', 'S', 'e', 't', 't', 'i', 'n', 'g', 's',
-'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', '\022', 'Q', '\n', '\n', 'i', 'd', 'e', 'n', 't', 'i', 'f', 'i', 'e', 'r', '\030', '\001',
-' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I',
-'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\023', '\372', 'B', '\010', '*', '\006', '\030', '\377', '\377', '\003', '(', '\000', '\372', 'B', '\005',
-'\212', '\001', '\002', '\020', '\001', 'R', '\n', 'i', 'd', 'e', 'n', 't', 'i', 'f', 'i', 'e', 'r', '\022', '<', '\n', '\005', 'v', 'a', 'l', 'u',
-'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
-'.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\005', 'v',
-'a', 'l', 'u', 'e', ':', '?', '\232', '\305', '\210', '\036', ':', '\n', '8', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2',
-'.', 'c', 'o', 'r', 'e', '.', 'H', 't', 't', 'p', '2', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n',
-'s', '.', 'S', 'e', 't', 't', 'i', 'n', 'g', 's', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', ':', '-', '\232', '\305', '\210', '\036',
-'(', '\n', '&', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'H', 't', 't', 'p',
-'2', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\"', '\245', '\001', '\n', '\023', 'G', 'r', 'p', 'c',
-'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', '`', '\n', '\026', 'h', 't', 't', 'p', '2', '_',
-'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '\001', ' ', '\001', '(', '\013', '2', '*', '.',
-'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 't', 't', 'p',
-'2', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'R', '\024', 'h', 't', 't', 'p', '2', 'P', 'r',
-'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', ':', ',', '\232', '\305', '\210', '\036', '\'', '\n', '%', 'e', 'n', 'v',
-'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'G', 'r', 'p', 'c', 'P', 'r', 'o', 't', 'o', 'c',
-'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\"', '\026', '\n', '\024', 'H', 't', 't', 'p', '3', 'P', 'r', 'o', 't', 'o', 'c', 'o',
-'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'B', '=', '\n', '\"', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y',
-'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', 'B', '\r', 'P', 'r',
-'o', 't', 'o', 'c', 'o', 'l', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r',
-'o', 't', 'o', '3',
+'V', 'a', 'l', 'u', 'e', 'R', '\016', 'h', 'p', 'a', 'c', 'k', 'T', 'a', 'b', 'l', 'e', 'S', 'i', 'z', 'e', '\022', 'a', '\n', '\026',
+'m', 'a', 'x', '_', 'c', 'o', 'n', 'c', 'u', 'r', 'r', 'e', 'n', 't', '_', 's', 't', 'r', 'e', 'a', 'm', 's', '\030', '\002', ' ',
+'\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n',
+'t', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\r', '\372', 'B', '\n', '*', '\010', '\030', '\377', '\377', '\377', '\377', '\007', '(', '\001', 'R', '\024',
+'m', 'a', 'x', 'C', 'o', 'n', 'c', 'u', 'r', 'r', 'e', 'n', 't', 'S', 't', 'r', 'e', 'a', 'm', 's', '\022', 'j', '\n', '\032', 'i',
+'n', 'i', 't', 'i', 'a', 'l', '_', 's', 't', 'r', 'e', 'a', 'm', '_', 'w', 'i', 'n', 'd', 'o', 'w', '_', 's', 'i', 'z', 'e',
+'\030', '\003', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.',
+'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\017', '\372', 'B', '\014', '*', '\n', '\030', '\377', '\377', '\377', '\377', '\007', '(',
+'\377', '\377', '\003', 'R', '\027', 'i', 'n', 'i', 't', 'i', 'a', 'l', 'S', 't', 'r', 'e', 'a', 'm', 'W', 'i', 'n', 'd', 'o', 'w', 'S',
+'i', 'z', 'e', '\022', 'r', '\n', '\036', 'i', 'n', 'i', 't', 'i', 'a', 'l', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n',
+'_', 'w', 'i', 'n', 'd', 'o', 'w', '_', 's', 'i', 'z', 'e', '\030', '\004', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g',
+'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\017',
+'\372', 'B', '\014', '*', '\n', '\030', '\377', '\377', '\377', '\377', '\007', '(', '\377', '\377', '\003', 'R', '\033', 'i', 'n', 'i', 't', 'i', 'a', 'l', 'C',
+'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'W', 'i', 'n', 'd', 'o', 'w', 'S', 'i', 'z', 'e', '\022', '#', '\n', '\r', 'a', 'l',
+'l', 'o', 'w', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', '\030', '\005', ' ', '\001', '(', '\010', 'R', '\014', 'a', 'l', 'l', 'o', 'w', 'C',
+'o', 'n', 'n', 'e', 'c', 't', '\022', '%', '\n', '\016', 'a', 'l', 'l', 'o', 'w', '_', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030',
+'\006', ' ', '\001', '(', '\010', 'R', '\r', 'a', 'l', 'l', 'o', 'w', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', '\022', 'U', '\n', '\023', 'm',
+'a', 'x', '_', 'o', 'u', 't', 'b', 'o', 'u', 'n', 'd', '_', 'f', 'r', 'a', 'm', 'e', 's', '\030', '\007', ' ', '\001', '(', '\013', '2',
+'\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V',
+'a', 'l', 'u', 'e', 'B', '\007', '\372', 'B', '\004', '*', '\002', '(', '\001', 'R', '\021', 'm', 'a', 'x', 'O', 'u', 't', 'b', 'o', 'u', 'n',
+'d', 'F', 'r', 'a', 'm', 'e', 's', '\022', 'd', '\n', '\033', 'm', 'a', 'x', '_', 'o', 'u', 't', 'b', 'o', 'u', 'n', 'd', '_', 'c',
+'o', 'n', 't', 'r', 'o', 'l', '_', 'f', 'r', 'a', 'm', 'e', 's', '\030', '\010', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o',
+'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B',
+'\007', '\372', 'B', '\004', '*', '\002', '(', '\001', 'R', '\030', 'm', 'a', 'x', 'O', 'u', 't', 'b', 'o', 'u', 'n', 'd', 'C', 'o', 'n', 't',
+'r', 'o', 'l', 'F', 'r', 'a', 'm', 'e', 's', '\022', '\204', '\001', '\n', '1', 'm', 'a', 'x', '_', 'c', 'o', 'n', 's', 'e', 'c', 'u',
+'t', 'i', 'v', 'e', '_', 'i', 'n', 'b', 'o', 'u', 'n', 'd', '_', 'f', 'r', 'a', 'm', 'e', 's', '_', 'w', 'i', 't', 'h', '_',
+'e', 'm', 'p', 't', 'y', '_', 'p', 'a', 'y', 'l', 'o', 'a', 'd', '\030', '\t', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o',
+'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R',
+'+', 'm', 'a', 'x', 'C', 'o', 'n', 's', 'e', 'c', 'u', 't', 'i', 'v', 'e', 'I', 'n', 'b', 'o', 'u', 'n', 'd', 'F', 'r', 'a',
+'m', 'e', 's', 'W', 'i', 't', 'h', 'E', 'm', 'p', 't', 'y', 'P', 'a', 'y', 'l', 'o', 'a', 'd', '\022', 'o', '\n', '&', 'm', 'a',
+'x', '_', 'i', 'n', 'b', 'o', 'u', 'n', 'd', '_', 'p', 'r', 'i', 'o', 'r', 'i', 't', 'y', '_', 'f', 'r', 'a', 'm', 'e', 's',
+'_', 'p', 'e', 'r', '_', 's', 't', 'r', 'e', 'a', 'm', '\030', '\n', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l',
+'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '!', 'm',
+'a', 'x', 'I', 'n', 'b', 'o', 'u', 'n', 'd', 'P', 'r', 'i', 'o', 'r', 'i', 't', 'y', 'F', 'r', 'a', 'm', 'e', 's', 'P', 'e',
+'r', 'S', 't', 'r', 'e', 'a', 'm', '\022', '\221', '\001', '\n', '4', 'm', 'a', 'x', '_', 'i', 'n', 'b', 'o', 'u', 'n', 'd', '_', 'w',
+'i', 'n', 'd', 'o', 'w', '_', 'u', 'p', 'd', 'a', 't', 'e', '_', 'f', 'r', 'a', 'm', 'e', 's', '_', 'p', 'e', 'r', '_', 'd',
+'a', 't', 'a', '_', 'f', 'r', 'a', 'm', 'e', '_', 's', 'e', 'n', 't', '\030', '\013', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o',
+'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e',
+'B', '\007', '\372', 'B', '\004', '*', '\002', '(', '\001', 'R', ',', 'm', 'a', 'x', 'I', 'n', 'b', 'o', 'u', 'n', 'd', 'W', 'i', 'n', 'd',
+'o', 'w', 'U', 'p', 'd', 'a', 't', 'e', 'F', 'r', 'a', 'm', 'e', 's', 'P', 'e', 'r', 'D', 'a', 't', 'a', 'F', 'r', 'a', 'm',
+'e', 'S', 'e', 'n', 't', '\022', '^', '\n', '&', 's', 't', 'r', 'e', 'a', 'm', '_', 'e', 'r', 'r', 'o', 'r', '_', 'o', 'n', '_',
+'i', 'n', 'v', 'a', 'l', 'i', 'd', '_', 'h', 't', 't', 'p', '_', 'm', 'e', 's', 's', 'a', 'g', 'i', 'n', 'g', '\030', '\014', ' ',
+'\001', '(', '\010', 'B', '\013', '\030', '\001', '\222', '\307', '\206', '\330', '\004', '\003', '3', '.', '0', 'R', '!', 's', 't', 'r', 'e', 'a', 'm', 'E',
+'r', 'r', 'o', 'r', 'O', 'n', 'I', 'n', 'v', 'a', 'l', 'i', 'd', 'H', 't', 't', 'p', 'M', 'e', 's', 's', 'a', 'g', 'i', 'n',
+'g', '\022', 'z', '\n', '-', 'o', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '_', 's', 't', 'r', 'e', 'a', 'm', '_', 'e', 'r', 'r', 'o',
+'r', '_', 'o', 'n', '_', 'i', 'n', 'v', 'a', 'l', 'i', 'd', '_', 'h', 't', 't', 'p', '_', 'm', 'e', 's', 's', 'a', 'g', 'e',
+'\030', '\016', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.',
+'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\'', 'o', 'v', 'e', 'r', 'r', 'i', 'd', 'e', 'S', 't', 'r', 'e', 'a', 'm',
+'E', 'r', 'r', 'o', 'r', 'O', 'n', 'I', 'n', 'v', 'a', 'l', 'i', 'd', 'H', 't', 't', 'p', 'M', 'e', 's', 's', 'a', 'g', 'e',
+'\022', 'z', '\n', '\032', 'c', 'u', 's', 't', 'o', 'm', '_', 's', 'e', 't', 't', 'i', 'n', 'g', 's', '_', 'p', 'a', 'r', 'a', 'm',
+'e', 't', 'e', 'r', 's', '\030', '\r', ' ', '\003', '(', '\013', '2', '<', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 't', 't', 'p', '2', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p',
+'t', 'i', 'o', 'n', 's', '.', 'S', 'e', 't', 't', 'i', 'n', 'g', 's', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 'R', '\030',
+'c', 'u', 's', 't', 'o', 'm', 'S', 'e', 't', 't', 'i', 'n', 'g', 's', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 's', '\022',
+'Z', '\n', '\024', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'k', 'e', 'e', 'p', 'a', 'l', 'i', 'v', 'e', '\030', '\017',
+' ', '\001', '(', '\013', '2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.',
+'v', '3', '.', 'K', 'e', 'e', 'p', 'a', 'l', 'i', 'v', 'e', 'S', 'e', 't', 't', 'i', 'n', 'g', 's', 'R', '\023', 'c', 'o', 'n',
+'n', 'e', 'c', 't', 'i', 'o', 'n', 'K', 'e', 'e', 'p', 'a', 'l', 'i', 'v', 'e', '\032', '\345', '\001', '\n', '\021', 'S', 'e', 't', 't',
+'i', 'n', 'g', 's', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', '\022', 'Q', '\n', '\n', 'i', 'd', 'e', 'n', 't', 'i', 'f', 'i',
+'e', 'r', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u',
+'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\023', '\372', 'B', '\010', '*', '\006', '\030', '\377', '\377', '\003', '(',
+'\000', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\n', 'i', 'd', 'e', 'n', 't', 'i', 'f', 'i', 'e', 'r', '\022', '<', '\n', '\005',
+'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't',
+'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020',
+'\001', 'R', '\005', 'v', 'a', 'l', 'u', 'e', ':', '?', '\232', '\305', '\210', '\036', ':', '\n', '8', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
+'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'H', 't', 't', 'p', '2', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p',
+'t', 'i', 'o', 'n', 's', '.', 'S', 'e', 't', 't', 'i', 'n', 'g', 's', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', ':', '-',
+'\232', '\305', '\210', '\036', '(', '\n', '&', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.',
+'H', 't', 't', 'p', '2', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\"', '\245', '\001', '\n', '\023',
+'G', 'r', 'p', 'c', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', '`', '\n', '\026', 'h', 't',
+'t', 'p', '2', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '\001', ' ', '\001', '(',
+'\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.',
+'H', 't', 't', 'p', '2', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'R', '\024', 'h', 't', 't',
+'p', '2', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', ':', ',', '\232', '\305', '\210', '\036', '\'', '\n',
+'%', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'G', 'r', 'p', 'c', 'P', 'r',
+'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\"', '\361', '\001', '\n', '\024', 'H', 't', 't', 'p', '3', 'P', 'r',
+'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', ']', '\n', '\025', 'q', 'u', 'i', 'c', '_', 'p', 'r', 'o',
+'t', 'o', 'c', 'o', 'l', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '\001', ' ', '\001', '(', '\013', '2', ')', '.', 'e', 'n', 'v',
+'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'Q', 'u', 'i', 'c', 'P', 'r', 'o',
+'t', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'R', '\023', 'q', 'u', 'i', 'c', 'P', 'r', 'o', 't', 'o', 'c', 'o',
+'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', 'z', '\n', '-', 'o', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '_', 's', 't', 'r', 'e',
+'a', 'm', '_', 'e', 'r', 'r', 'o', 'r', '_', 'o', 'n', '_', 'i', 'n', 'v', 'a', 'l', 'i', 'd', '_', 'h', 't', 't', 'p', '_',
+'m', 'e', 's', 's', 'a', 'g', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r',
+'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\'', 'o', 'v', 'e', 'r', 'r', 'i', 'd',
+'e', 'S', 't', 'r', 'e', 'a', 'm', 'E', 'r', 'r', 'o', 'r', 'O', 'n', 'I', 'n', 'v', 'a', 'l', 'i', 'd', 'H', 't', 't', 'p',
+'M', 'e', 's', 's', 'a', 'g', 'e', '\"', 't', '\n', '\032', 'S', 'c', 'h', 'e', 'm', 'e', 'H', 'e', 'a', 'd', 'e', 'r', 'T', 'r',
+'a', 'n', 's', 'f', 'o', 'r', 'm', 'a', 't', 'i', 'o', 'n', '\022', 'D', '\n', '\023', 's', 'c', 'h', 'e', 'm', 'e', '_', 't', 'o',
+'_', 'o', 'v', 'e', 'r', 'w', 'r', 'i', 't', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\022', '\372', 'B', '\017', 'r', '\r', 'R', '\004',
+'h', 't', 't', 'p', 'R', '\005', 'h', 't', 't', 'p', 's', 'H', '\000', 'R', '\021', 's', 'c', 'h', 'e', 'm', 'e', 'T', 'o', 'O', 'v',
+'e', 'r', 'w', 'r', 'i', 't', 'e', 'B', '\020', '\n', '\016', 't', 'r', 'a', 'n', 's', 'f', 'o', 'r', 'm', 'a', 't', 'i', 'o', 'n',
+'B', '=', '\n', '\"', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
+'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', 'B', '\r', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'P', 'r',
+'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[7] = {
+static upb_def_init *deps[9] = {
+ &envoy_config_core_v3_extension_proto_upbdefinit,
&envoy_type_v3_percent_proto_upbdefinit,
&google_protobuf_duration_proto_upbdefinit,
&google_protobuf_wrappers_proto_upbdefinit,
+ &envoy_annotations_deprecation_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
&udpa_annotations_versioning_proto_upbdefinit,
&validate_validate_proto_upbdefinit,
@@ -227,5 +283,5 @@ upb_def_init envoy_config_core_v3_protocol_proto_upbdefinit = {
deps,
layouts,
"envoy/config/core/v3/protocol.proto",
- UPB_STRVIEW_INIT(descriptor, 4229)
+ UPB_STRVIEW_INIT(descriptor, 5396)
};
diff --git a/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h b/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h
index ddc54578df..df29eb31b2 100644
--- a/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h
+++ b/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h
@@ -26,11 +26,21 @@ UPB_INLINE const upb_msgdef *envoy_config_core_v3_TcpProtocolOptions_getmsgdef(u
return upb_symtab_lookupmsg(s, "envoy.config.core.v3.TcpProtocolOptions");
}
+UPB_INLINE const upb_msgdef *envoy_config_core_v3_QuicProtocolOptions_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &envoy_config_core_v3_protocol_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "envoy.config.core.v3.QuicProtocolOptions");
+}
+
UPB_INLINE const upb_msgdef *envoy_config_core_v3_UpstreamHttpProtocolOptions_getmsgdef(upb_symtab *s) {
_upb_symtab_loaddefinit(s, &envoy_config_core_v3_protocol_proto_upbdefinit);
return upb_symtab_lookupmsg(s, "envoy.config.core.v3.UpstreamHttpProtocolOptions");
}
+UPB_INLINE const upb_msgdef *envoy_config_core_v3_AlternateProtocolsCacheOptions_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &envoy_config_core_v3_protocol_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "envoy.config.core.v3.AlternateProtocolsCacheOptions");
+}
+
UPB_INLINE const upb_msgdef *envoy_config_core_v3_HttpProtocolOptions_getmsgdef(upb_symtab *s) {
_upb_symtab_loaddefinit(s, &envoy_config_core_v3_protocol_proto_upbdefinit);
return upb_symtab_lookupmsg(s, "envoy.config.core.v3.HttpProtocolOptions");
@@ -76,6 +86,11 @@ UPB_INLINE const upb_msgdef *envoy_config_core_v3_Http3ProtocolOptions_getmsgdef
return upb_symtab_lookupmsg(s, "envoy.config.core.v3.Http3ProtocolOptions");
}
+UPB_INLINE const upb_msgdef *envoy_config_core_v3_SchemeHeaderTransformation_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &envoy_config_core_v3_protocol_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "envoy.config.core.v3.SchemeHeaderTransformation");
+}
+
#ifdef __cplusplus
} /* extern "C" */
#endif
diff --git a/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c b/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c
new file mode 100644
index 0000000000..cf91db7757
--- /dev/null
+++ b/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c
@@ -0,0 +1,59 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/config/core/v3/resolver.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include "upb/def.h"
+#include "envoy/config/core/v3/resolver.upbdefs.h"
+
+extern upb_def_init envoy_config_core_v3_address_proto_upbdefinit;
+extern upb_def_init udpa_annotations_status_proto_upbdefinit;
+extern upb_def_init validate_validate_proto_upbdefinit;
+extern const upb_msglayout envoy_config_core_v3_DnsResolverOptions_msginit;
+extern const upb_msglayout envoy_config_core_v3_DnsResolutionConfig_msginit;
+
+static const upb_msglayout *layouts[2] = {
+ &envoy_config_core_v3_DnsResolverOptions_msginit,
+ &envoy_config_core_v3_DnsResolutionConfig_msginit,
+};
+
+static const char descriptor[543] = {'\n', '#', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'r', 'e',
+'s', 'o', 'l', 'v', 'e', 'r', '.', 'p', 'r', 'o', 't', 'o', '\022', '\024', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '\032', '\"', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c',
+'o', 'r', 'e', '/', 'v', '3', '/', 'a', 'd', 'd', 'r', 'e', 's', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p',
+'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't',
+'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't',
+'o', '\"', '\203', '\001', '\n', '\022', 'D', 'n', 's', 'R', 'e', 's', 'o', 'l', 'v', 'e', 'r', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022',
+'4', '\n', '\027', 'u', 's', 'e', '_', 't', 'c', 'p', '_', 'f', 'o', 'r', '_', 'd', 'n', 's', '_', 'l', 'o', 'o', 'k', 'u', 'p',
+'s', '\030', '\001', ' ', '\001', '(', '\010', 'R', '\023', 'u', 's', 'e', 'T', 'c', 'p', 'F', 'o', 'r', 'D', 'n', 's', 'L', 'o', 'o', 'k',
+'u', 'p', 's', '\022', '7', '\n', '\030', 'n', 'o', '_', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 's', 'e', 'a', 'r', 'c', 'h', '_',
+'d', 'o', 'm', 'a', 'i', 'n', '\030', '\002', ' ', '\001', '(', '\010', 'R', '\025', 'n', 'o', 'D', 'e', 'f', 'a', 'u', 'l', 't', 'S', 'e',
+'a', 'r', 'c', 'h', 'D', 'o', 'm', 'a', 'i', 'n', '\"', '\270', '\001', '\n', '\023', 'D', 'n', 's', 'R', 'e', 's', 'o', 'l', 'u', 't',
+'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'E', '\n', '\t', 'r', 'e', 's', 'o', 'l', 'v', 'e', 'r', 's', '\030', '\001', ' ',
+'\003', '(', '\013', '2', '\035', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v',
+'3', '.', 'A', 'd', 'd', 'r', 'e', 's', 's', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', 'R', '\t', 'r', 'e', 's', 'o',
+'l', 'v', 'e', 'r', 's', '\022', 'Z', '\n', '\024', 'd', 'n', 's', '_', 'r', 'e', 's', 'o', 'l', 'v', 'e', 'r', '_', 'o', 'p', 't',
+'i', 'o', 'n', 's', '\030', '\002', ' ', '\001', '(', '\013', '2', '(', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
+'.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D', 'n', 's', 'R', 'e', 's', 'o', 'l', 'v', 'e', 'r', 'O', 'p', 't', 'i', 'o',
+'n', 's', 'R', '\022', 'd', 'n', 's', 'R', 'e', 's', 'o', 'l', 'v', 'e', 'r', 'O', 'p', 't', 'i', 'o', 'n', 's', 'B', '=', '\n',
+'\"', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
+'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', 'B', '\r', 'R', 'e', 's', 'o', 'l', 'v', 'e', 'r', 'P', 'r', 'o', 't', 'o',
+'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+};
+
+static upb_def_init *deps[4] = {
+ &envoy_config_core_v3_address_proto_upbdefinit,
+ &udpa_annotations_status_proto_upbdefinit,
+ &validate_validate_proto_upbdefinit,
+ NULL
+};
+
+upb_def_init envoy_config_core_v3_resolver_proto_upbdefinit = {
+ deps,
+ layouts,
+ "envoy/config/core/v3/resolver.proto",
+ UPB_STRVIEW_INIT(descriptor, 543)
+};
diff --git a/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.h b/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.h
new file mode 100644
index 0000000000..67999d49b5
--- /dev/null
+++ b/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.h
@@ -0,0 +1,40 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/config/core/v3/resolver.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef ENVOY_CONFIG_CORE_V3_RESOLVER_PROTO_UPBDEFS_H_
+#define ENVOY_CONFIG_CORE_V3_RESOLVER_PROTO_UPBDEFS_H_
+
+#include "upb/def.h"
+#include "upb/port_def.inc"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "upb/def.h"
+
+#include "upb/port_def.inc"
+
+extern upb_def_init envoy_config_core_v3_resolver_proto_upbdefinit;
+
+UPB_INLINE const upb_msgdef *envoy_config_core_v3_DnsResolverOptions_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &envoy_config_core_v3_resolver_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "envoy.config.core.v3.DnsResolverOptions");
+}
+
+UPB_INLINE const upb_msgdef *envoy_config_core_v3_DnsResolutionConfig_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &envoy_config_core_v3_resolver_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "envoy.config.core.v3.DnsResolutionConfig");
+}
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif /* ENVOY_CONFIG_CORE_V3_RESOLVER_PROTO_UPBDEFS_H_ */
diff --git a/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c b/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c
index 82062b6692..a089442015 100644
--- a/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c
+++ b/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c
@@ -12,6 +12,7 @@
extern upb_def_init envoy_config_core_v3_base_proto_upbdefinit;
extern upb_def_init envoy_config_core_v3_extension_proto_upbdefinit;
extern upb_def_init google_protobuf_struct_proto_upbdefinit;
+extern upb_def_init envoy_annotations_deprecation_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
extern upb_def_init validate_validate_proto_upbdefinit;
extern const upb_msglayout envoy_config_core_v3_SubstitutionFormatString_msginit;
@@ -20,41 +21,44 @@ static const upb_msglayout *layouts[1] = {
&envoy_config_core_v3_SubstitutionFormatString_msginit,
};
-static const char descriptor[711] = {'\n', '5', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 's', 'u',
+static const char descriptor[757] = {'\n', '5', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 's', 'u',
'b', 's', 't', 'i', 't', 'u', 't', 'i', 'o', 'n', '_', 'f', 'o', 'r', 'm', 'a', 't', '_', 's', 't', 'r', 'i', 'n', 'g', '.',
'p', 'r', 'o', 't', 'o', '\022', '\024', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.',
'v', '3', '\032', '\037', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/',
'b', 'a', 's', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '$', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/',
'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\034',
'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 's', 't', 'r', 'u', 'c', 't', '.', 'p', 'r',
-'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a',
-'t', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd',
-'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\203', '\003', '\n', '\030', 'S', 'u', 'b', 's', 't', 'i', 't', 'u', 't', 'i', 'o',
-'n', 'F', 'o', 'r', 'm', 'a', 't', 'S', 't', 'r', 'i', 'n', 'g', '\022', '%', '\n', '\013', 't', 'e', 'x', 't', '_', 'f', 'o', 'r',
-'m', 'a', 't', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\002', '\030', '\001', 'H', '\000', 'R', '\n', 't', 'e', 'x', 't', 'F', 'o', 'r', 'm',
-'a', 't', '\022', 'D', '\n', '\013', 'j', 's', 'o', 'n', '_', 'f', 'o', 'r', 'm', 'a', 't', '\030', '\002', ' ', '\001', '(', '\013', '2', '\027',
-'.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'S', 't', 'r', 'u', 'c', 't', 'B', '\010',
-'\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'H', '\000', 'R', '\n', 'j', 's', 'o', 'n', 'F', 'o', 'r', 'm', 'a', 't', '\022', 'P', '\n',
-'\022', 't', 'e', 'x', 't', '_', 'f', 'o', 'r', 'm', 'a', 't', '_', 's', 'o', 'u', 'r', 'c', 'e', '\030', '\005', ' ', '\001', '(', '\013',
-'2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D',
-'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'H', '\000', 'R', '\020', 't', 'e', 'x', 't', 'F', 'o', 'r', 'm', 'a', 't', 'S', 'o',
-'u', 'r', 'c', 'e', '\022', '*', '\n', '\021', 'o', 'm', 'i', 't', '_', 'e', 'm', 'p', 't', 'y', '_', 'v', 'a', 'l', 'u', 'e', 's',
-'\030', '\003', ' ', '\001', '(', '\010', 'R', '\017', 'o', 'm', 'i', 't', 'E', 'm', 'p', 't', 'y', 'V', 'a', 'l', 'u', 'e', 's', '\022', '!',
-'\n', '\014', 'c', 'o', 'n', 't', 'e', 'n', 't', '_', 't', 'y', 'p', 'e', '\030', '\004', ' ', '\001', '(', '\t', 'R', '\013', 'c', 'o', 'n',
-'t', 'e', 'n', 't', 'T', 'y', 'p', 'e', '\022', 'J', '\n', '\n', 'f', 'o', 'r', 'm', 'a', 't', 't', 'e', 'r', 's', '\030', '\006', ' ',
-'\003', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v',
-'3', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\n', 'f',
-'o', 'r', 'm', 'a', 't', 't', 'e', 'r', 's', 'B', '\r', '\n', '\006', 'f', 'o', 'r', 'm', 'a', 't', '\022', '\003', '\370', 'B', '\001', 'B',
-'M', '\n', '\"', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
-'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', 'B', '\035', 'S', 'u', 'b', 's', 't', 'i', 't', 'u', 't', 'i', 'o',
-'n', 'F', 'o', 'r', 'm', 'a', 't', 'S', 't', 'r', 'i', 'n', 'g', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006',
-'\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'o', 't', 'o', '\032', '#', 'e', 'n', 'v', 'o', 'y', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'd', 'e',
+'p', 'r', 'e', 'c', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n',
+'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a',
+'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\214', '\003', '\n',
+'\030', 'S', 'u', 'b', 's', 't', 'i', 't', 'u', 't', 'i', 'o', 'n', 'F', 'o', 'r', 'm', 'a', 't', 'S', 't', 'r', 'i', 'n', 'g',
+'\022', '.', '\n', '\013', 't', 'e', 'x', 't', '_', 'f', 'o', 'r', 'm', 'a', 't', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\013', '\030', '\001',
+'\222', '\307', '\206', '\330', '\004', '\003', '3', '.', '0', 'H', '\000', 'R', '\n', 't', 'e', 'x', 't', 'F', 'o', 'r', 'm', 'a', 't', '\022', 'D',
+'\n', '\013', 'j', 's', 'o', 'n', '_', 'f', 'o', 'r', 'm', 'a', 't', '\030', '\002', ' ', '\001', '(', '\013', '2', '\027', '.', 'g', 'o', 'o',
+'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'S', 't', 'r', 'u', 'c', 't', 'B', '\010', '\372', 'B', '\005', '\212',
+'\001', '\002', '\020', '\001', 'H', '\000', 'R', '\n', 'j', 's', 'o', 'n', 'F', 'o', 'r', 'm', 'a', 't', '\022', 'P', '\n', '\022', 't', 'e', 'x',
+'t', '_', 'f', 'o', 'r', 'm', 'a', 't', '_', 's', 'o', 'u', 'r', 'c', 'e', '\030', '\005', ' ', '\001', '(', '\013', '2', ' ', '.', 'e',
+'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'S',
+'o', 'u', 'r', 'c', 'e', 'H', '\000', 'R', '\020', 't', 'e', 'x', 't', 'F', 'o', 'r', 'm', 'a', 't', 'S', 'o', 'u', 'r', 'c', 'e',
+'\022', '*', '\n', '\021', 'o', 'm', 'i', 't', '_', 'e', 'm', 'p', 't', 'y', '_', 'v', 'a', 'l', 'u', 'e', 's', '\030', '\003', ' ', '\001',
+'(', '\010', 'R', '\017', 'o', 'm', 'i', 't', 'E', 'm', 'p', 't', 'y', 'V', 'a', 'l', 'u', 'e', 's', '\022', '!', '\n', '\014', 'c', 'o',
+'n', 't', 'e', 'n', 't', '_', 't', 'y', 'p', 'e', '\030', '\004', ' ', '\001', '(', '\t', 'R', '\013', 'c', 'o', 'n', 't', 'e', 'n', 't',
+'T', 'y', 'p', 'e', '\022', 'J', '\n', '\n', 'f', 'o', 'r', 'm', 'a', 't', 't', 'e', 'r', 's', '\030', '\006', ' ', '\003', '(', '\013', '2',
+'*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'y',
+'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\n', 'f', 'o', 'r', 'm', 'a',
+'t', 't', 'e', 'r', 's', 'B', '\r', '\n', '\006', 'f', 'o', 'r', 'm', 'a', 't', '\022', '\003', '\370', 'B', '\001', 'B', 'M', '\n', '\"', 'i',
+'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
+'.', 'c', 'o', 'r', 'e', '.', 'v', '3', 'B', '\035', 'S', 'u', 'b', 's', 't', 'i', 't', 'u', 't', 'i', 'o', 'n', 'F', 'o', 'r',
+'m', 'a', 't', 'S', 't', 'r', 'i', 'n', 'g', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b',
+'\006', 'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[6] = {
+static upb_def_init *deps[7] = {
&envoy_config_core_v3_base_proto_upbdefinit,
&envoy_config_core_v3_extension_proto_upbdefinit,
&google_protobuf_struct_proto_upbdefinit,
+ &envoy_annotations_deprecation_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
&validate_validate_proto_upbdefinit,
NULL
@@ -64,5 +68,5 @@ upb_def_init envoy_config_core_v3_substitution_format_string_proto_upbdefinit =
deps,
layouts,
"envoy/config/core/v3/substitution_format_string.proto",
- UPB_STRVIEW_INIT(descriptor, 711)
+ UPB_STRVIEW_INIT(descriptor, 757)
};
diff --git a/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c b/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c
new file mode 100644
index 0000000000..13b62afc6b
--- /dev/null
+++ b/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c
@@ -0,0 +1,52 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/config/core/v3/udp_socket_config.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include "upb/def.h"
+#include "envoy/config/core/v3/udp_socket_config.upbdefs.h"
+
+extern upb_def_init google_protobuf_wrappers_proto_upbdefinit;
+extern upb_def_init udpa_annotations_status_proto_upbdefinit;
+extern upb_def_init validate_validate_proto_upbdefinit;
+extern const upb_msglayout envoy_config_core_v3_UdpSocketConfig_msginit;
+
+static const upb_msglayout *layouts[1] = {
+ &envoy_config_core_v3_UdpSocketConfig_msginit,
+};
+
+static const char descriptor[405] = {'\n', ',', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'u', 'd',
+'p', '_', 's', 'o', 'c', 'k', 'e', 't', '_', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'p', 'r', 'o', 't', 'o', '\022', '\024', 'e', 'n',
+'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '\032', '\036', 'g', 'o', 'o', 'g', 'l',
+'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o', 't', 'o',
+'\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's',
+'.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e',
+'.', 'p', 'r', 'o', 't', 'o', '\"', '\250', '\001', '\n', '\017', 'U', 'd', 'p', 'S', 'o', 'c', 'k', 'e', 't', 'C', 'o', 'n', 'f', 'i',
+'g', '\022', 'Z', '\n', '\024', 'm', 'a', 'x', '_', 'r', 'x', '_', 'd', 'a', 't', 'a', 'g', 'r', 'a', 'm', '_', 's', 'i', 'z', 'e',
+'\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.',
+'U', 'I', 'n', 't', '6', '4', 'V', 'a', 'l', 'u', 'e', 'B', '\013', '\372', 'B', '\010', '2', '\006', '\020', '\200', '\200', '\004', ' ', '\000', 'R',
+'\021', 'm', 'a', 'x', 'R', 'x', 'D', 'a', 't', 'a', 'g', 'r', 'a', 'm', 'S', 'i', 'z', 'e', '\022', '9', '\n', '\n', 'p', 'r', 'e',
+'f', 'e', 'r', '_', 'g', 'r', 'o', '\030', '\002', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r',
+'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\t', 'p', 'r', 'e', 'f', 'e', 'r', 'G',
+'r', 'o', 'B', 'D', '\n', '\"', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y',
+'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', 'B', '\024', 'U', 'd', 'p', 'S', 'o', 'c', 'k', 'e',
+'t', 'C', 'o', 'n', 'f', 'i', 'g', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p',
+'r', 'o', 't', 'o', '3',
+};
+
+static upb_def_init *deps[4] = {
+ &google_protobuf_wrappers_proto_upbdefinit,
+ &udpa_annotations_status_proto_upbdefinit,
+ &validate_validate_proto_upbdefinit,
+ NULL
+};
+
+upb_def_init envoy_config_core_v3_udp_socket_config_proto_upbdefinit = {
+ deps,
+ layouts,
+ "envoy/config/core/v3/udp_socket_config.proto",
+ UPB_STRVIEW_INIT(descriptor, 405)
+};
diff --git a/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.h b/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.h
new file mode 100644
index 0000000000..1b1dfbcf25
--- /dev/null
+++ b/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.h
@@ -0,0 +1,35 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/config/core/v3/udp_socket_config.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef ENVOY_CONFIG_CORE_V3_UDP_SOCKET_CONFIG_PROTO_UPBDEFS_H_
+#define ENVOY_CONFIG_CORE_V3_UDP_SOCKET_CONFIG_PROTO_UPBDEFS_H_
+
+#include "upb/def.h"
+#include "upb/port_def.inc"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "upb/def.h"
+
+#include "upb/port_def.inc"
+
+extern upb_def_init envoy_config_core_v3_udp_socket_config_proto_upbdefinit;
+
+UPB_INLINE const upb_msgdef *envoy_config_core_v3_UdpSocketConfig_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &envoy_config_core_v3_udp_socket_config_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "envoy.config.core.v3.UdpSocketConfig");
+}
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif /* ENVOY_CONFIG_CORE_V3_UDP_SOCKET_CONFIG_PROTO_UPBDEFS_H_ */
diff --git a/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c b/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c
index f1d684a89d..d402a6be0a 100644
--- a/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c
+++ b/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c
@@ -12,7 +12,6 @@
extern upb_def_init envoy_config_accesslog_v3_accesslog_proto_upbdefinit;
extern upb_def_init envoy_config_core_v3_address_proto_upbdefinit;
extern upb_def_init envoy_config_core_v3_base_proto_upbdefinit;
-extern upb_def_init envoy_config_core_v3_extension_proto_upbdefinit;
extern upb_def_init envoy_config_core_v3_socket_option_proto_upbdefinit;
extern upb_def_init envoy_config_listener_v3_api_listener_proto_upbdefinit;
extern upb_def_init envoy_config_listener_v3_listener_components_proto_upbdefinit;
@@ -20,6 +19,7 @@ extern upb_def_init envoy_config_listener_v3_udp_listener_config_proto_upbdefini
extern upb_def_init google_protobuf_duration_proto_upbdefinit;
extern upb_def_init google_protobuf_wrappers_proto_upbdefinit;
extern upb_def_init xds_core_v3_collection_entry_proto_upbdefinit;
+extern upb_def_init envoy_annotations_deprecation_proto_upbdefinit;
extern upb_def_init udpa_annotations_security_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
extern upb_def_init udpa_annotations_versioning_proto_upbdefinit;
@@ -29,150 +29,159 @@ extern const upb_msglayout envoy_config_listener_v3_Listener_msginit;
extern const upb_msglayout envoy_config_listener_v3_Listener_DeprecatedV1_msginit;
extern const upb_msglayout envoy_config_listener_v3_Listener_ConnectionBalanceConfig_msginit;
extern const upb_msglayout envoy_config_listener_v3_Listener_ConnectionBalanceConfig_ExactBalance_msginit;
+extern const upb_msglayout envoy_config_listener_v3_Listener_InternalListenerConfig_msginit;
-static const upb_msglayout *layouts[5] = {
+static const upb_msglayout *layouts[6] = {
&envoy_config_listener_v3_ListenerCollection_msginit,
&envoy_config_listener_v3_Listener_msginit,
&envoy_config_listener_v3_Listener_DeprecatedV1_msginit,
&envoy_config_listener_v3_Listener_ConnectionBalanceConfig_msginit,
&envoy_config_listener_v3_Listener_ConnectionBalanceConfig_ExactBalance_msginit,
+ &envoy_config_listener_v3_Listener_InternalListenerConfig_msginit,
};
-static const char descriptor[3185] = {'\n', '\'', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '/', 'v',
+static const char descriptor[3383] = {'\n', '\'', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '/', 'v',
'3', '/', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'p', 'r', 'o', 't', 'o', '\022', '\030', 'e', 'n', 'v', 'o', 'y', '.', 'c',
'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '\032', ')', 'e', 'n', 'v', 'o', 'y', '/',
'c', 'o', 'n', 'f', 'i', 'g', '/', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '/', 'v', '3', '/', 'a', 'c', 'c', 'e', 's',
's', 'l', 'o', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\"', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/',
'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'a', 'd', 'd', 'r', 'e', 's', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\037', 'e', 'n',
'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'b', 'a', 's', 'e', '.', 'p',
-'r', 'o', 't', 'o', '\032', '$', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v',
-'3', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '(', 'e', 'n', 'v', 'o', 'y', '/',
-'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 's', 'o', 'c', 'k', 'e', 't', '_', 'o', 'p', 't',
-'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '+', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'l',
-'i', 's', 't', 'e', 'n', 'e', 'r', '/', 'v', '3', '/', 'a', 'p', 'i', '_', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'p',
-'r', 'o', 't', 'o', '\032', '2', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'l', 'i', 's', 't', 'e', 'n',
-'e', 'r', '/', 'v', '3', '/', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '_', 'c', 'o', 'm', 'p', 'o', 'n', 'e', 'n', 't', 's',
-'.', 'p', 'r', 'o', 't', 'o', '\032', '2', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'l', 'i', 's', 't',
-'e', 'n', 'e', 'r', '/', 'v', '3', '/', 'u', 'd', 'p', '_', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '_', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
-'/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p',
-'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\"', 'x',
-'d', 's', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'c', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', '_', 'e', 'n', 't',
-'r', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\037', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n',
-'s', '/', 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n',
-'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u',
-'d', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n',
-'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't',
-'e', '.', 'p', 'r', 'o', 't', 'o', '\"', 'L', '\n', '\022', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'C', 'o', 'l', 'l', 'e', 'c',
-'t', 'i', 'o', 'n', '\022', '6', '\n', '\007', 'e', 'n', 't', 'r', 'i', 'e', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', '\034', '.', 'x',
-'d', 's', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', 'E', 'n', 't', 'r',
-'y', 'R', '\007', 'e', 'n', 't', 'r', 'i', 'e', 's', '\"', '\335', '\022', '\n', '\010', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', '\022', '\022',
-'\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\004', 'n', 'a', 'm', 'e', '\022', 'A', '\n', '\007', 'a', 'd', 'd',
-'r', 'e', 's', 's', '\030', '\002', ' ', '\001', '(', '\013', '2', '\035', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
-'.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'A', 'd', 'd', 'r', 'e', 's', 's', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020',
-'\001', 'R', '\007', 'a', 'd', 'd', 'r', 'e', 's', 's', '\022', 'J', '\n', '\r', 'f', 'i', 'l', 't', 'e', 'r', '_', 'c', 'h', 'a', 'i',
-'n', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l',
-'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'R', '\014', 'f',
-'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 's', '\022', 'D', '\n', '\020', 'u', 's', 'e', '_', 'o', 'r', 'i', 'g', 'i', 'n',
-'a', 'l', '_', 'd', 's', 't', '\030', '\004', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o',
-'t', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\016', 'u', 's', 'e', 'O', 'r', 'i', 'g', 'i',
-'n', 'a', 'l', 'D', 's', 't', '\022', 'W', '\n', '\024', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 'f', 'i', 'l', 't', 'e', 'r', '_',
-'c', 'h', 'a', 'i', 'n', '\030', '\031', ' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
-'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n',
-'R', '\022', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', '\022', 'o', '\n', '!', 'p',
-'e', 'r', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'b', 'u', 'f', 'f', 'e', 'r', '_', 'l', 'i', 'm', 'i',
-'t', '_', 'b', 'y', 't', 'e', 's', '\030', '\005', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r',
-'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\212', '\223', '\267', '*', '\002',
-'\010', '\001', 'R', '\035', 'p', 'e', 'r', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'B', 'u', 'f', 'f', 'e', 'r', 'L', 'i',
-'m', 'i', 't', 'B', 'y', 't', 'e', 's', '\022', ':', '\n', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030', '\006', ' ', '\001', '(',
-'\013', '2', '\036', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.',
-'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'R', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\022', 'X', '\n', '\r', 'd', 'e', 'p',
-'r', 'e', 'c', 'a', 't', 'e', 'd', '_', 'v', '1', '\030', '\007', ' ', '\001', '(', '\013', '2', '/', '.', 'e', 'n', 'v', 'o', 'y', '.',
-'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n',
-'e', 'r', '.', 'D', 'e', 'p', 'r', 'e', 'c', 'a', 't', 'e', 'd', 'V', '1', 'B', '\002', '\030', '\001', 'R', '\014', 'd', 'e', 'p', 'r',
-'e', 'c', 'a', 't', 'e', 'd', 'V', '1', '\022', 'K', '\n', '\n', 'd', 'r', 'a', 'i', 'n', '_', 't', 'y', 'p', 'e', '\030', '\010', ' ',
-'\001', '(', '\016', '2', ',', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n',
-'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'D', 'r', 'a', 'i', 'n', 'T', 'y', 'p', 'e', 'R',
-'\t', 'd', 'r', 'a', 'i', 'n', 'T', 'y', 'p', 'e', '\022', 'S', '\n', '\020', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '_', 'f', 'i',
-'l', 't', 'e', 'r', 's', '\030', '\t', ' ', '\003', '(', '\013', '2', '(', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
-'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l',
-'t', 'e', 'r', 'R', '\017', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 's', '\022', 'S', '\n', '\030', 'l',
-'i', 's', 't', 'e', 'n', 'e', 'r', '_', 'f', 'i', 'l', 't', 'e', 'r', 's', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\017',
-' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u',
-'r', 'a', 't', 'i', 'o', 'n', 'R', '\026', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 's', 'T', 'i',
-'m', 'e', 'o', 'u', 't', '\022', 'N', '\n', '$', 'c', 'o', 'n', 't', 'i', 'n', 'u', 'e', '_', 'o', 'n', '_', 'l', 'i', 's', 't',
-'e', 'n', 'e', 'r', '_', 'f', 'i', 'l', 't', 'e', 'r', 's', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\021', ' ', '\001', '(',
-'\010', 'R', ' ', 'c', 'o', 'n', 't', 'i', 'n', 'u', 'e', 'O', 'n', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't',
-'e', 'r', 's', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', '<', '\n', '\013', 't', 'r', 'a', 'n', 's', 'p', 'a', 'r', 'e', 'n', 't',
-'\030', '\n', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.',
-'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\013', 't', 'r', 'a', 'n', 's', 'p', 'a', 'r', 'e', 'n', 't', '\022', '6', '\n',
-'\010', 'f', 'r', 'e', 'e', 'b', 'i', 'n', 'd', '\030', '\013', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.',
-'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\010', 'f', 'r', 'e', 'e', 'b',
-'i', 'n', 'd', '\022', 'I', '\n', '\016', 's', 'o', 'c', 'k', 'e', 't', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '\r', ' ', '\003',
-'(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3',
-'.', 'S', 'o', 'c', 'k', 'e', 't', 'O', 'p', 't', 'i', 'o', 'n', 'R', '\r', 's', 'o', 'c', 'k', 'e', 't', 'O', 'p', 't', 'i',
-'o', 'n', 's', '\022', 'X', '\n', '\032', 't', 'c', 'p', '_', 'f', 'a', 's', 't', '_', 'o', 'p', 'e', 'n', '_', 'q', 'u', 'e', 'u',
-'e', '_', 'l', 'e', 'n', 'g', 't', 'h', '\030', '\014', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p',
-'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\026', 't', 'c', 'p', 'F',
-'a', 's', 't', 'O', 'p', 'e', 'n', 'Q', 'u', 'e', 'u', 'e', 'L', 'e', 'n', 'g', 't', 'h', '\022', 'S', '\n', '\021', 't', 'r', 'a',
-'f', 'f', 'i', 'c', '_', 'd', 'i', 'r', 'e', 'c', 't', 'i', 'o', 'n', '\030', '\020', ' ', '\001', '(', '\016', '2', '&', '.', 'e', 'n',
-'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'r', 'a', 'f', 'f', 'i',
-'c', 'D', 'i', 'r', 'e', 'c', 't', 'i', 'o', 'n', 'R', '\020', 't', 'r', 'a', 'f', 'f', 'i', 'c', 'D', 'i', 'r', 'e', 'c', 't',
-'i', 'o', 'n', '\022', '[', '\n', '\023', 'u', 'd', 'p', '_', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i',
-'g', '\030', '\022', ' ', '\001', '(', '\013', '2', '+', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i',
-'s', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'U', 'd', 'p', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'C', 'o', 'n', 'f',
-'i', 'g', 'R', '\021', 'u', 'd', 'p', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'H', '\n', '\014',
-'a', 'p', 'i', '_', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '\030', '\023', ' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o',
-'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'A', 'p', 'i', 'L',
-'i', 's', 't', 'e', 'n', 'e', 'r', 'R', '\013', 'a', 'p', 'i', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', '\022', 'v', '\n', '\031', 'c',
-'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'b', 'a', 'l', 'a', 'n', 'c', 'e', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030',
-'\024', ' ', '\001', '(', '\013', '2', ':', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't',
-'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i',
-'o', 'n', 'B', 'a', 'l', 'a', 'n', 'c', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\027', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i',
-'o', 'n', 'B', 'a', 'l', 'a', 'n', 'c', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '\035', '\n', '\n', 'r', 'e', 'u', 's', 'e', '_',
-'p', 'o', 'r', 't', '\030', '\025', ' ', '\001', '(', '\010', 'R', '\t', 'r', 'e', 'u', 's', 'e', 'P', 'o', 'r', 't', '\022', 'C', '\n', '\n',
-'a', 'c', 'c', 'e', 's', 's', '_', 'l', 'o', 'g', '\030', '\026', ' ', '\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.',
-'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'A', 'c', 'c', 'e', 's',
-'s', 'L', 'o', 'g', 'R', '\t', 'a', 'c', 'c', 'e', 's', 's', 'L', 'o', 'g', '\022', 'V', '\n', '\021', 'u', 'd', 'p', '_', 'w', 'r',
-'i', 't', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\027', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e',
-'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\017', 'u', 'd', 'p', 'W', 'r', 'i', 't', 'e', 'r', 'C', 'o', 'n',
-'f', 'i', 'g', '\022', 'F', '\n', '\020', 't', 'c', 'p', '_', 'b', 'a', 'c', 'k', 'l', 'o', 'g', '_', 's', 'i', 'z', 'e', '\030', '\030',
-' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I',
-'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\016', 't', 'c', 'p', 'B', 'a', 'c', 'k', 'l', 'o', 'g', 'S', 'i', 'z', 'e',
-'\022', '<', '\n', '\014', 'b', 'i', 'n', 'd', '_', 't', 'o', '_', 'p', 'o', 'r', 't', '\030', '\032', ' ', '\001', '(', '\013', '2', '\032', '.',
+'r', 'o', 't', 'o', '\032', '(', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v',
+'3', '/', 's', 'o', 'c', 'k', 'e', 't', '_', 'o', 'p', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '+', 'e', 'n',
+'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '/', 'v', '3', '/', 'a', 'p',
+'i', '_', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'p', 'r', 'o', 't', 'o', '\032', '2', 'e', 'n', 'v', 'o', 'y', '/', 'c',
+'o', 'n', 'f', 'i', 'g', '/', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '/', 'v', '3', '/', 'l', 'i', 's', 't', 'e', 'n', 'e',
+'r', '_', 'c', 'o', 'm', 'p', 'o', 'n', 'e', 'n', 't', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '2', 'e', 'n', 'v', 'o', 'y',
+'/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '/', 'v', '3', '/', 'u', 'd', 'p', '_', 'l',
+'i', 's', 't', 'e', 'n', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o',
+'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o',
+'t', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p',
+'e', 'r', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\"', 'x', 'd', 's', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'c', 'o',
+'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', '_', 'e', 'n', 't', 'r', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '#', 'e', 'n', 'v',
+'o', 'y', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'd', 'e', 'p', 'r', 'e', 'c', 'a', 't', 'i', 'o',
+'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\037', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's',
+'/', 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n',
+'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd',
+'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g',
+'.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e',
+'.', 'p', 'r', 'o', 't', 'o', '\"', 'L', '\n', '\022', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'C', 'o', 'l', 'l', 'e', 'c', 't',
+'i', 'o', 'n', '\022', '6', '\n', '\007', 'e', 'n', 't', 'r', 'i', 'e', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', '\034', '.', 'x', 'd',
+'s', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', 'E', 'n', 't', 'r', 'y',
+'R', '\007', 'e', 'n', 't', 'r', 'i', 'e', 's', '\"', '\244', '\024', '\n', '\010', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', '\022', '\022', '\n',
+'\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\004', 'n', 'a', 'm', 'e', '\022', 'A', '\n', '\007', 'a', 'd', 'd', 'r',
+'e', 's', 's', '\030', '\002', ' ', '\001', '(', '\013', '2', '\035', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
+'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'A', 'd', 'd', 'r', 'e', 's', 's', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001',
+'R', '\007', 'a', 'd', 'd', 'r', 'e', 's', 's', '\022', '\037', '\n', '\013', 's', 't', 'a', 't', '_', 'p', 'r', 'e', 'f', 'i', 'x', '\030',
+'\034', ' ', '\001', '(', '\t', 'R', '\n', 's', 't', 'a', 't', 'P', 'r', 'e', 'f', 'i', 'x', '\022', 'J', '\n', '\r', 'f', 'i', 'l', 't',
+'e', 'r', '_', 'c', 'h', 'a', 'i', 'n', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
+'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'F', 'i', 'l', 't', 'e', 'r', 'C',
+'h', 'a', 'i', 'n', 'R', '\014', 'f', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 's', '\022', 'D', '\n', '\020', 'u', 's', 'e',
+'_', 'o', 'r', 'i', 'g', 'i', 'n', 'a', 'l', '_', 'd', 's', 't', '\030', '\004', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o',
+'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\016', 'u',
+'s', 'e', 'O', 'r', 'i', 'g', 'i', 'n', 'a', 'l', 'D', 's', 't', '\022', 'W', '\n', '\024', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_',
+'f', 'i', 'l', 't', 'e', 'r', '_', 'c', 'h', 'a', 'i', 'n', '\030', '\031', ' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o',
+'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'F', 'i', 'l', 't',
+'e', 'r', 'C', 'h', 'a', 'i', 'n', 'R', '\022', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a',
+'i', 'n', '\022', 'o', '\n', '!', 'p', 'e', 'r', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'b', 'u', 'f', 'f',
+'e', 'r', '_', 'l', 'i', 'm', 'i', 't', '_', 'b', 'y', 't', 'e', 's', '\030', '\005', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o',
+'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e',
+'B', '\007', '\212', '\223', '\267', '*', '\002', '\010', '\001', 'R', '\035', 'p', 'e', 'r', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'B',
+'u', 'f', 'f', 'e', 'r', 'L', 'i', 'm', 'i', 't', 'B', 'y', 't', 'e', 's', '\022', ':', '\n', '\010', 'm', 'e', 't', 'a', 'd', 'a',
+'t', 'a', '\030', '\006', ' ', '\001', '(', '\013', '2', '\036', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c',
+'o', 'r', 'e', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'R', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a',
+'\022', 'a', '\n', '\r', 'd', 'e', 'p', 'r', 'e', 'c', 'a', 't', 'e', 'd', '_', 'v', '1', '\030', '\007', ' ', '\001', '(', '\013', '2', '/',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3',
+'.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'D', 'e', 'p', 'r', 'e', 'c', 'a', 't', 'e', 'd', 'V', '1', 'B', '\013', '\030',
+'\001', '\222', '\307', '\206', '\330', '\004', '\003', '3', '.', '0', 'R', '\014', 'd', 'e', 'p', 'r', 'e', 'c', 'a', 't', 'e', 'd', 'V', '1', '\022',
+'K', '\n', '\n', 'd', 'r', 'a', 'i', 'n', '_', 't', 'y', 'p', 'e', '\030', '\010', ' ', '\001', '(', '\016', '2', ',', '.', 'e', 'n', 'v',
+'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's',
+'t', 'e', 'n', 'e', 'r', '.', 'D', 'r', 'a', 'i', 'n', 'T', 'y', 'p', 'e', 'R', '\t', 'd', 'r', 'a', 'i', 'n', 'T', 'y', 'p',
+'e', '\022', 'S', '\n', '\020', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '_', 'f', 'i', 'l', 't', 'e', 'r', 's', '\030', '\t', ' ', '\003',
+'(', '\013', '2', '(', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e',
+'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'R', '\017', 'l', 'i', 's', 't',
+'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 's', '\022', 'S', '\n', '\030', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '_', 'f',
+'i', 'l', 't', 'e', 'r', 's', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\017', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o',
+'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\026', 'l',
+'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 's', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'N', '\n', '$',
+'c', 'o', 'n', 't', 'i', 'n', 'u', 'e', '_', 'o', 'n', '_', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '_', 'f', 'i', 'l', 't',
+'e', 'r', 's', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\021', ' ', '\001', '(', '\010', 'R', ' ', 'c', 'o', 'n', 't', 'i', 'n',
+'u', 'e', 'O', 'n', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 's', 'T', 'i', 'm', 'e', 'o', 'u',
+'t', '\022', '<', '\n', '\013', 't', 'r', 'a', 'n', 's', 'p', 'a', 'r', 'e', 'n', 't', '\030', '\n', ' ', '\001', '(', '\013', '2', '\032', '.',
'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e',
-'R', '\n', 'b', 'i', 'n', 'd', 'T', 'o', 'P', 'o', 'r', 't', '\032', 'w', '\n', '\014', 'D', 'e', 'p', 'r', 'e', 'c', 'a', 't', 'e',
-'d', 'V', '1', '\022', '<', '\n', '\014', 'b', 'i', 'n', 'd', '_', 't', 'o', '_', 'p', 'o', 'r', 't', '\030', '\001', ' ', '\001', '(', '\013',
-'2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a',
-'l', 'u', 'e', 'R', '\n', 'b', 'i', 'n', 'd', 'T', 'o', 'P', 'o', 'r', 't', ':', ')', '\232', '\305', '\210', '\036', '$', '\n', '\"', 'e',
-'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'D', 'e', 'p', 'r',
-'e', 'c', 'a', 't', 'e', 'd', 'V', '1', '\032', '\247', '\002', '\n', '\027', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'B', 'a',
-'l', 'a', 'n', 'c', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'n', '\n', '\r', 'e', 'x', 'a', 'c', 't', '_', 'b', 'a', 'l', 'a',
-'n', 'c', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', 'G', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
-'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'C', 'o', 'n', 'n',
-'e', 'c', 't', 'i', 'o', 'n', 'B', 'a', 'l', 'a', 'n', 'c', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'E', 'x', 'a', 'c', 't',
-'B', 'a', 'l', 'a', 'n', 'c', 'e', 'H', '\000', 'R', '\014', 'e', 'x', 'a', 'c', 't', 'B', 'a', 'l', 'a', 'n', 'c', 'e', '\032', 'Q',
-'\n', '\014', 'E', 'x', 'a', 'c', 't', 'B', 'a', 'l', 'a', 'n', 'c', 'e', ':', 'A', '\232', '\305', '\210', '\036', '<', '\n', ':', 'e', 'n',
-'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'C', 'o', 'n', 'n', 'e',
-'c', 't', 'i', 'o', 'n', 'B', 'a', 'l', 'a', 'n', 'c', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'E', 'x', 'a', 'c', 't', 'B',
-'a', 'l', 'a', 'n', 'c', 'e', ':', '4', '\232', '\305', '\210', '\036', '/', '\n', '-', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.',
-'v', '2', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'B', 'a', 'l',
-'a', 'n', 'c', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'B', '\023', '\n', '\014', 'b', 'a', 'l', 'a', 'n', 'c', 'e', '_', 't', 'y', 'p',
-'e', '\022', '\003', '\370', 'B', '\001', '\"', ')', '\n', '\t', 'D', 'r', 'a', 'i', 'n', 'T', 'y', 'p', 'e', '\022', '\013', '\n', '\007', 'D', 'E',
-'F', 'A', 'U', 'L', 'T', '\020', '\000', '\022', '\017', '\n', '\013', 'M', 'O', 'D', 'I', 'F', 'Y', '_', 'O', 'N', 'L', 'Y', '\020', '\001', ':',
-'\034', '\232', '\305', '\210', '\036', '\027', '\n', '\025', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'L', 'i', 's', 't',
-'e', 'n', 'e', 'r', 'J', '\004', '\010', '\016', '\020', '\017', 'B', 'A', '\n', '&', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o',
-'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.',
-'v', '3', 'B', '\r', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002',
-'\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'R', '\013', 't', 'r', 'a', 'n', 's', 'p', 'a', 'r', 'e', 'n', 't', '\022', '6', '\n', '\010', 'f', 'r', 'e', 'e', 'b', 'i', 'n', 'd',
+'\030', '\013', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.',
+'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\010', 'f', 'r', 'e', 'e', 'b', 'i', 'n', 'd', '\022', 'I', '\n', '\016', 's', 'o',
+'c', 'k', 'e', 't', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '\r', ' ', '\003', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o',
+'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'S', 'o', 'c', 'k', 'e', 't', 'O', 'p',
+'t', 'i', 'o', 'n', 'R', '\r', 's', 'o', 'c', 'k', 'e', 't', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', 'X', '\n', '\032', 't', 'c',
+'p', '_', 'f', 'a', 's', 't', '_', 'o', 'p', 'e', 'n', '_', 'q', 'u', 'e', 'u', 'e', '_', 'l', 'e', 'n', 'g', 't', 'h', '\030',
+'\014', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U',
+'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\026', 't', 'c', 'p', 'F', 'a', 's', 't', 'O', 'p', 'e', 'n', 'Q', 'u',
+'e', 'u', 'e', 'L', 'e', 'n', 'g', 't', 'h', '\022', 'S', '\n', '\021', 't', 'r', 'a', 'f', 'f', 'i', 'c', '_', 'd', 'i', 'r', 'e',
+'c', 't', 'i', 'o', 'n', '\030', '\020', ' ', '\001', '(', '\016', '2', '&', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'r', 'a', 'f', 'f', 'i', 'c', 'D', 'i', 'r', 'e', 'c', 't', 'i', 'o',
+'n', 'R', '\020', 't', 'r', 'a', 'f', 'f', 'i', 'c', 'D', 'i', 'r', 'e', 'c', 't', 'i', 'o', 'n', '\022', '[', '\n', '\023', 'u', 'd',
+'p', '_', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\022', ' ', '\001', '(', '\013', '2', '+',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3',
+'.', 'U', 'd', 'p', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\021', 'u', 'd', 'p', 'L', 'i',
+'s', 't', 'e', 'n', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'H', '\n', '\014', 'a', 'p', 'i', '_', 'l', 'i', 's', 't', 'e',
+'n', 'e', 'r', '\030', '\023', ' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
+'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'A', 'p', 'i', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'R', '\013',
+'a', 'p', 'i', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', '\022', 'v', '\n', '\031', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n',
+'_', 'b', 'a', 'l', 'a', 'n', 'c', 'e', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\024', ' ', '\001', '(', '\013', '2', ':', '.', 'e',
+'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L',
+'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'B', 'a', 'l', 'a', 'n', 'c', 'e',
+'C', 'o', 'n', 'f', 'i', 'g', 'R', '\027', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'B', 'a', 'l', 'a', 'n', 'c', 'e',
+'C', 'o', 'n', 'f', 'i', 'g', '\022', '*', '\n', '\n', 'r', 'e', 'u', 's', 'e', '_', 'p', 'o', 'r', 't', '\030', '\025', ' ', '\001', '(',
+'\010', 'B', '\013', '\030', '\001', '\222', '\307', '\206', '\330', '\004', '\003', '3', '.', '0', 'R', '\t', 'r', 'e', 'u', 's', 'e', 'P', 'o', 'r', 't',
+'\022', 'F', '\n', '\021', 'e', 'n', 'a', 'b', 'l', 'e', '_', 'r', 'e', 'u', 's', 'e', '_', 'p', 'o', 'r', 't', '\030', '\035', ' ', '\001',
+'(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l',
+'V', 'a', 'l', 'u', 'e', 'R', '\017', 'e', 'n', 'a', 'b', 'l', 'e', 'R', 'e', 'u', 's', 'e', 'P', 'o', 'r', 't', '\022', 'C', '\n',
+'\n', 'a', 'c', 'c', 'e', 's', 's', '_', 'l', 'o', 'g', '\030', '\026', ' ', '\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y',
+'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'A', 'c', 'c', 'e',
+'s', 's', 'L', 'o', 'g', 'R', '\t', 'a', 'c', 'c', 'e', 's', 's', 'L', 'o', 'g', '\022', 'F', '\n', '\020', 't', 'c', 'p', '_', 'b',
+'a', 'c', 'k', 'l', 'o', 'g', '_', 's', 'i', 'z', 'e', '\030', '\030', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l',
+'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\016', 't',
+'c', 'p', 'B', 'a', 'c', 'k', 'l', 'o', 'g', 'S', 'i', 'z', 'e', '\022', '<', '\n', '\014', 'b', 'i', 'n', 'd', '_', 't', 'o', '_',
+'p', 'o', 'r', 't', '\030', '\032', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o',
+'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\n', 'b', 'i', 'n', 'd', 'T', 'o', 'P', 'o', 'r', 't',
+'\022', 'h', '\n', '\021', 'i', 'n', 't', 'e', 'r', 'n', 'a', 'l', '_', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '\030', '\033', ' ', '\001',
+'(', '\013', '2', '9', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e',
+'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'L', 'i', 's',
+'t', 'e', 'n', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'H', '\000', 'R', '\020', 'i', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'L', 'i',
+'s', 't', 'e', 'n', 'e', 'r', '\032', 'w', '\n', '\014', 'D', 'e', 'p', 'r', 'e', 'c', 'a', 't', 'e', 'd', 'V', '1', '\022', '<', '\n',
+'\014', 'b', 'i', 'n', 'd', '_', 't', 'o', '_', 'p', 'o', 'r', 't', '\030', '\001', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o',
+'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\n', 'b',
+'i', 'n', 'd', 'T', 'o', 'P', 'o', 'r', 't', ':', ')', '\232', '\305', '\210', '\036', '$', '\n', '\"', 'e', 'n', 'v', 'o', 'y', '.', 'a',
+'p', 'i', '.', 'v', '2', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'D', 'e', 'p', 'r', 'e', 'c', 'a', 't', 'e', 'd',
+'V', '1', '\032', '\247', '\002', '\n', '\027', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'B', 'a', 'l', 'a', 'n', 'c', 'e', 'C',
+'o', 'n', 'f', 'i', 'g', '\022', 'n', '\n', '\r', 'e', 'x', 'a', 'c', 't', '_', 'b', 'a', 'l', 'a', 'n', 'c', 'e', '\030', '\001', ' ',
+'\001', '(', '\013', '2', 'G', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n',
+'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n',
+'B', 'a', 'l', 'a', 'n', 'c', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'E', 'x', 'a', 'c', 't', 'B', 'a', 'l', 'a', 'n', 'c',
+'e', 'H', '\000', 'R', '\014', 'e', 'x', 'a', 'c', 't', 'B', 'a', 'l', 'a', 'n', 'c', 'e', '\032', 'Q', '\n', '\014', 'E', 'x', 'a', 'c',
+'t', 'B', 'a', 'l', 'a', 'n', 'c', 'e', ':', 'A', '\232', '\305', '\210', '\036', '<', '\n', ':', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
+'i', '.', 'v', '2', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'B',
+'a', 'l', 'a', 'n', 'c', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'E', 'x', 'a', 'c', 't', 'B', 'a', 'l', 'a', 'n', 'c', 'e',
+':', '4', '\232', '\305', '\210', '\036', '/', '\n', '-', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'L', 'i', 's',
+'t', 'e', 'n', 'e', 'r', '.', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'B', 'a', 'l', 'a', 'n', 'c', 'e', 'C', 'o',
+'n', 'f', 'i', 'g', 'B', '\023', '\n', '\014', 'b', 'a', 'l', 'a', 'n', 'c', 'e', '_', 't', 'y', 'p', 'e', '\022', '\003', '\370', 'B', '\001',
+'\032', '\030', '\n', '\026', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'C', 'o', 'n', 'f', 'i',
+'g', '\"', ')', '\n', '\t', 'D', 'r', 'a', 'i', 'n', 'T', 'y', 'p', 'e', '\022', '\013', '\n', '\007', 'D', 'E', 'F', 'A', 'U', 'L', 'T',
+'\020', '\000', '\022', '\017', '\n', '\013', 'M', 'O', 'D', 'I', 'F', 'Y', '_', 'O', 'N', 'L', 'Y', '\020', '\001', ':', '\034', '\232', '\305', '\210', '\036',
+'\027', '\n', '\025', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'B',
+'\024', '\n', '\022', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', 'J', '\004', '\010', '\016',
+'\020', '\017', 'J', '\004', '\010', '\027', '\020', '\030', 'B', 'A', '\n', '&', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3',
+'B', '\r', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002',
+'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
static upb_def_init *deps[16] = {
&envoy_config_accesslog_v3_accesslog_proto_upbdefinit,
&envoy_config_core_v3_address_proto_upbdefinit,
&envoy_config_core_v3_base_proto_upbdefinit,
- &envoy_config_core_v3_extension_proto_upbdefinit,
&envoy_config_core_v3_socket_option_proto_upbdefinit,
&envoy_config_listener_v3_api_listener_proto_upbdefinit,
&envoy_config_listener_v3_listener_components_proto_upbdefinit,
@@ -180,6 +189,7 @@ static upb_def_init *deps[16] = {
&google_protobuf_duration_proto_upbdefinit,
&google_protobuf_wrappers_proto_upbdefinit,
&xds_core_v3_collection_entry_proto_upbdefinit,
+ &envoy_annotations_deprecation_proto_upbdefinit,
&udpa_annotations_security_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
&udpa_annotations_versioning_proto_upbdefinit,
@@ -191,5 +201,5 @@ upb_def_init envoy_config_listener_v3_listener_proto_upbdefinit = {
deps,
layouts,
"envoy/config/listener/v3/listener.proto",
- UPB_STRVIEW_INIT(descriptor, 3185)
+ UPB_STRVIEW_INIT(descriptor, 3383)
};
diff --git a/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h b/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h
index 535d37a330..23f49b02c5 100644
--- a/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h
+++ b/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h
@@ -46,6 +46,11 @@ UPB_INLINE const upb_msgdef *envoy_config_listener_v3_Listener_ConnectionBalance
return upb_symtab_lookupmsg(s, "envoy.config.listener.v3.Listener.ConnectionBalanceConfig.ExactBalance");
}
+UPB_INLINE const upb_msgdef *envoy_config_listener_v3_Listener_InternalListenerConfig_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &envoy_config_listener_v3_listener_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "envoy.config.listener.v3.Listener.InternalListenerConfig");
+}
+
#ifdef __cplusplus
} /* extern "C" */
#endif
diff --git a/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c b/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c
index ffe22ce9b6..02b4f33aaf 100644
--- a/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c
+++ b/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c
@@ -16,6 +16,7 @@ extern upb_def_init envoy_type_v3_range_proto_upbdefinit;
extern upb_def_init google_protobuf_any_proto_upbdefinit;
extern upb_def_init google_protobuf_duration_proto_upbdefinit;
extern upb_def_init google_protobuf_wrappers_proto_upbdefinit;
+extern upb_def_init envoy_annotations_deprecation_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
extern upb_def_init udpa_annotations_versioning_proto_upbdefinit;
extern upb_def_init validate_validate_proto_upbdefinit;
@@ -37,7 +38,7 @@ static const upb_msglayout *layouts[7] = {
&envoy_config_listener_v3_ListenerFilter_msginit,
};
-static const char descriptor[3284] = {'\n', '2', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '/', 'v',
+static const char descriptor[3426] = {'\n', '2', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '/', 'v',
'3', '/', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '_', 'c', 'o', 'm', 'p', 'o', 'n', 'e', 'n', 't', 's', '.', 'p', 'r', 'o',
't', 'o', '\022', '\030', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r',
'.', 'v', '3', '\032', '\"', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3',
@@ -49,129 +50,135 @@ static const char descriptor[3284] = {'\n', '2', 'e', 'n', 'v', 'o', 'y', '/', '
'o', 'b', 'u', 'f', '/', 'a', 'n', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r',
'o', 't', 'o', 'b', 'u', 'f', '/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o',
'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r',
-'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a',
-'t', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o',
-'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i',
-'d', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\202', '\002', '\n', '\006', 'F',
-'i', 'l', 't', 'e', 'r', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r',
-'\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '9', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g',
-'\030', '\004', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.',
-'A', 'n', 'y', 'H', '\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'X', '\n', '\020', 'c', 'o', 'n',
-'f', 'i', 'g', '_', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '\030', '\005', ' ', '\001', '(', '\013', '2', '+', '.', 'e', 'n', 'v',
-'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'E', 'x', 't', 'e', 'n', 's', 'i',
-'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'H', '\000', 'R', '\017', 'c', 'o', 'n', 'f', 'i', 'g', 'D',
-'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', ':', '#', '\232', '\305', '\210', '\036', '\036', '\n', '\034', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
-'i', '.', 'v', '2', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'F', 'i', 'l', 't', 'e', 'r', 'B', '\r', '\n', '\013', 'c',
-'o', 'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\003', '\020', '\004', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c',
-'o', 'n', 'f', 'i', 'g', '\"', '\212', '\006', '\n', '\020', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c',
-'h', '\022', 'T', '\n', '\020', 'd', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', '_', 'p', 'o', 'r', 't', '\030', '\010', ' ', '\001',
-'(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't',
-'3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\013', '\372', 'B', '\010', '*', '\006', '\030', '\377', '\377', '\003', '(', '\001', 'R', '\017', 'd', 'e', 's',
-'t', 'i', 'n', 'a', 't', 'i', 'o', 'n', 'P', 'o', 'r', 't', '\022', 'D', '\n', '\r', 'p', 'r', 'e', 'f', 'i', 'x', '_', 'r', 'a',
-'n', 'g', 'e', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', '\037', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
-'.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'i', 'd', 'r', 'R', 'a', 'n', 'g', 'e', 'R', '\014', 'p', 'r', 'e', 'f', 'i',
-'x', 'R', 'a', 'n', 'g', 'e', 's', '\022', '%', '\n', '\016', 'a', 'd', 'd', 'r', 'e', 's', 's', '_', 's', 'u', 'f', 'f', 'i', 'x',
-'\030', '\004', ' ', '\001', '(', '\t', 'R', '\r', 'a', 'd', 'd', 'r', 'e', 's', 's', 'S', 'u', 'f', 'f', 'i', 'x', '\022', ';', '\n', '\n',
-'s', 'u', 'f', 'f', 'i', 'x', '_', 'l', 'e', 'n', '\030', '\005', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e',
-'.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\t', 's', 'u',
-'f', 'f', 'i', 'x', 'L', 'e', 'n', '\022', 'j', '\n', '\013', 's', 'o', 'u', 'r', 'c', 'e', '_', 't', 'y', 'p', 'e', '\030', '\014', ' ',
-'\001', '(', '\016', '2', '?', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n',
-'e', 'r', '.', 'v', '3', '.', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', '.', 'C', 'o',
-'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'S', 'o', 'u', 'r', 'c', 'e', 'T', 'y', 'p', 'e', 'B', '\010', '\372', 'B', '\005', '\202', '\001',
-'\002', '\020', '\001', 'R', '\n', 's', 'o', 'u', 'r', 'c', 'e', 'T', 'y', 'p', 'e', '\022', 'Q', '\n', '\024', 's', 'o', 'u', 'r', 'c', 'e',
-'_', 'p', 'r', 'e', 'f', 'i', 'x', '_', 'r', 'a', 'n', 'g', 'e', 's', '\030', '\006', ' ', '\003', '(', '\013', '2', '\037', '.', 'e', 'n',
-'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'i', 'd', 'r', 'R', 'a',
-'n', 'g', 'e', 'R', '\022', 's', 'o', 'u', 'r', 'c', 'e', 'P', 'r', 'e', 'f', 'i', 'x', 'R', 'a', 'n', 'g', 'e', 's', '\022', '3',
-'\n', '\014', 's', 'o', 'u', 'r', 'c', 'e', '_', 'p', 'o', 'r', 't', 's', '\030', '\007', ' ', '\003', '(', '\r', 'B', '\020', '\372', 'B', '\r',
-'\222', '\001', '\n', '\"', '\010', '*', '\006', '\030', '\377', '\377', '\003', '(', '\001', 'R', '\013', 's', 'o', 'u', 'r', 'c', 'e', 'P', 'o', 'r', 't',
-'s', '\022', '!', '\n', '\014', 's', 'e', 'r', 'v', 'e', 'r', '_', 'n', 'a', 'm', 'e', 's', '\030', '\013', ' ', '\003', '(', '\t', 'R', '\013',
-'s', 'e', 'r', 'v', 'e', 'r', 'N', 'a', 'm', 'e', 's', '\022', '-', '\n', '\022', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_',
-'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '\030', '\t', ' ', '\001', '(', '\t', 'R', '\021', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't',
-'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', '\022', '3', '\n', '\025', 'a', 'p', 'p', 'l', 'i', 'c', 'a', 't', 'i', 'o', 'n', '_', 'p',
-'r', 'o', 't', 'o', 'c', 'o', 'l', 's', '\030', '\n', ' ', '\003', '(', '\t', 'R', '\024', 'a', 'p', 'p', 'l', 'i', 'c', 'a', 't', 'i',
-'o', 'n', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 's', '\"', 'F', '\n', '\024', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n',
-'S', 'o', 'u', 'r', 'c', 'e', 'T', 'y', 'p', 'e', '\022', '\007', '\n', '\003', 'A', 'N', 'Y', '\020', '\000', '\022', '\027', '\n', '\023', 'S', 'A',
-'M', 'E', '_', 'I', 'P', '_', 'O', 'R', '_', 'L', 'O', 'O', 'P', 'B', 'A', 'C', 'K', '\020', '\001', '\022', '\014', '\n', '\010', 'E', 'X',
-'T', 'E', 'R', 'N', 'A', 'L', '\020', '\002', ':', '-', '\232', '\305', '\210', '\036', '(', '\n', '&', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
-'i', '.', 'v', '2', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n',
-'M', 'a', 't', 'c', 'h', 'J', '\004', '\010', '\001', '\020', '\002', '\"', '\200', '\006', '\n', '\013', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a',
-'i', 'n', '\022', 'X', '\n', '\022', 'f', 'i', 'l', 't', 'e', 'r', '_', 'c', 'h', 'a', 'i', 'n', '_', 'm', 'a', 't', 'c', 'h', '\030',
-'\001', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't',
-'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', 'R',
-'\020', 'f', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', '\022', ':', '\n', '\007', 'f', 'i', 'l', 't',
-'e', 'r', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
-'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'F', 'i', 'l', 't', 'e', 'r', 'R', '\007', 'f', 'i', 'l', 't', 'e',
-'r', 's', '\022', 'F', '\n', '\017', 'u', 's', 'e', '_', 'p', 'r', 'o', 'x', 'y', '_', 'p', 'r', 'o', 't', 'o', '\030', '\004', ' ', '\001',
-'(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l',
-'V', 'a', 'l', 'u', 'e', 'B', '\002', '\030', '\001', 'R', '\r', 'u', 's', 'e', 'P', 'r', 'o', 'x', 'y', 'P', 'r', 'o', 't', 'o', '\022',
-':', '\n', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030', '\005', ' ', '\001', '(', '\013', '2', '\036', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'R',
-'\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\022', 'P', '\n', '\020', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o',
-'c', 'k', 'e', 't', '\030', '\006', ' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
-'.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', 'R',
-'\017', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', '\022', 'b', '\n', ' ', 't', 'r', 'a', 'n', 's',
-'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', '_', 't', 'i', 'm', 'e', 'o',
-'u', 't', '\030', '\t', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u',
-'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\035', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k',
-'e', 't', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', '\022', '\n', '\004', 'n', 'a', 'm', 'e', '\030',
-'\007', ' ', '\001', '(', '\t', 'R', '\004', 'n', 'a', 'm', 'e', '\022', 's', '\n', '\027', 'o', 'n', '_', 'd', 'e', 'm', 'a', 'n', 'd', '_',
-'c', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\030', '\010', ' ', '\001', '(', '\013', '2', ';', '.', 'e', 'n', 'v',
-'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'F', 'i', 'l',
-'t', 'e', 'r', 'C', 'h', 'a', 'i', 'n', '.', 'O', 'n', 'D', 'e', 'm', 'a', 'n', 'd', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r',
-'a', 't', 'i', 'o', 'n', 'R', '\025', 'o', 'n', 'D', 'e', 'm', 'a', 'n', 'd', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't',
-'i', 'o', 'n', '\032', '[', '\n', '\025', 'O', 'n', 'D', 'e', 'm', 'a', 'n', 'd', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't',
-'i', 'o', 'n', '\022', 'B', '\n', '\017', 'r', 'e', 'b', 'u', 'i', 'l', 'd', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\001', ' ',
-'\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r',
-'a', 't', 'i', 'o', 'n', 'R', '\016', 'r', 'e', 'b', 'u', 'i', 'l', 'd', 'T', 'i', 'm', 'e', 'o', 'u', 't', ':', '(', '\232', '\305',
-'\210', '\036', '#', '\n', '!', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'l', 'i', 's', 't', 'e', 'n', 'e',
-'r', '.', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\013', 't', 'l', 's', '_',
-'c', 'o', 'n', 't', 'e', 'x', 't', '\"', '\302', '\005', '\n', '!', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e',
-'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', '\022', 'a', '\n', '\010', 'o',
-'r', '_', 'm', 'a', 't', 'c', 'h', '\030', '\001', ' ', '\001', '(', '\013', '2', 'D', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
-'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F',
-'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', '.',
-'M', 'a', 't', 'c', 'h', 'S', 'e', 't', 'H', '\000', 'R', '\007', 'o', 'r', 'M', 'a', 't', 'c', 'h', '\022', 'c', '\n', '\t', 'a', 'n',
-'d', '_', 'm', 'a', 't', 'c', 'h', '\030', '\002', ' ', '\001', '(', '\013', '2', 'D', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
-'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F',
-'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', '.',
-'M', 'a', 't', 'c', 'h', 'S', 'e', 't', 'H', '\000', 'R', '\010', 'a', 'n', 'd', 'M', 'a', 't', 'c', 'h', '\022', 'Z', '\n', '\t', 'n',
-'o', 't', '_', 'm', 'a', 't', 'c', 'h', '\030', '\003', ' ', '\001', '(', '\013', '2', ';', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
-'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r',
-'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e',
-'H', '\000', 'R', '\010', 'n', 'o', 't', 'M', 'a', 't', 'c', 'h', '\022', '&', '\n', '\t', 'a', 'n', 'y', '_', 'm', 'a', 't', 'c', 'h',
-'\030', '\004', ' ', '\001', '(', '\010', 'B', '\007', '\372', 'B', '\004', 'j', '\002', '\010', '\001', 'H', '\000', 'R', '\010', 'a', 'n', 'y', 'M', 'a', 't',
-'c', 'h', '\022', 'Q', '\n', '\026', 'd', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', '_', 'p', 'o', 'r', 't', '_', 'r', 'a',
-'n', 'g', 'e', '\030', '\005', ' ', '\001', '(', '\013', '2', '\031', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3',
-'.', 'I', 'n', 't', '3', '2', 'R', 'a', 'n', 'g', 'e', 'H', '\000', 'R', '\024', 'd', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o',
-'n', 'P', 'o', 'r', 't', 'R', 'a', 'n', 'g', 'e', '\032', '\260', '\001', '\n', '\010', 'M', 'a', 't', 'c', 'h', 'S', 'e', 't', '\022', '[',
-'\n', '\005', 'r', 'u', 'l', 'e', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', ';', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
-'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F',
-'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', 'B',
-'\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\002', 'R', '\005', 'r', 'u', 'l', 'e', 's', ':', 'G', '\232', '\305', '\210', '\036', 'B', '\n', '@',
-'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'L', 'i', 's',
-'t', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', 'P', 'r', 'e', 'd',
-'i', 'c', 'a', 't', 'e', '.', 'M', 'a', 't', 'c', 'h', 'S', 'e', 't', ':', '>', '\232', '\305', '\210', '\036', '9', '\n', '7', 'e', 'n',
-'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'L', 'i', 's', 't', 'e',
-'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', 'P', 'r', 'e', 'd', 'i', 'c',
-'a', 't', 'e', 'B', '\013', '\n', '\004', 'r', 'u', 'l', 'e', '\022', '\003', '\370', 'B', '\001', '\"', '\230', '\002', '\n', '\016', 'L', 'i', 's', 't',
-'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B',
-'\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '9', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c',
-'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't',
-'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'H', '\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'd',
-'\n', '\017', 'f', 'i', 'l', 't', 'e', 'r', '_', 'd', 'i', 's', 'a', 'b', 'l', 'e', 'd', '\030', '\004', ' ', '\001', '(', '\013', '2', ';',
-'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3',
-'.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h',
-'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', 'R', '\016', 'f', 'i', 'l', 't', 'e', 'r', 'D', 'i', 's', 'a', 'b', 'l', 'e', 'd',
-':', '+', '\232', '\305', '\210', '\036', '&', '\n', '$', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'l', 'i', 's',
-'t', 'e', 'n', 'e', 'r', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'B', '\r', '\n', '\013', 'c',
-'o', 'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', 'B',
-'K', '\n', '&', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
-'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', 'B', '\027', 'L', 'i', 's', 't', 'e', 'n', 'e',
-'r', 'C', 'o', 'm', 'p', 'o', 'n', 'e', 'n', 't', 's', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020',
-'\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'o', 't', 'o', '\032', '#', 'e', 'n', 'v', 'o', 'y', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'd', 'e',
+'p', 'r', 'e', 'c', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n',
+'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd',
+'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g',
+'.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e',
+'.', 'p', 'r', 'o', 't', 'o', '\"', '\202', '\002', '\n', '\006', 'F', 'i', 'l', 't', 'e', 'r', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e',
+'\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '9', '\n', '\014',
+'t', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\004', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g',
+'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'H', '\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C',
+'o', 'n', 'f', 'i', 'g', '\022', 'X', '\n', '\020', 'c', 'o', 'n', 'f', 'i', 'g', '_', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y',
+'\030', '\005', ' ', '\001', '(', '\013', '2', '+', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r',
+'e', '.', 'v', '3', '.', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c',
+'e', 'H', '\000', 'R', '\017', 'c', 'o', 'n', 'f', 'i', 'g', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', ':', '#', '\232', '\305', '\210',
+'\036', '\036', '\n', '\034', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r',
+'.', 'F', 'i', 'l', 't', 'e', 'r', 'B', '\r', '\n', '\013', 'c', 'o', 'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010',
+'\003', '\020', '\004', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', '\"', '\352', '\006', '\n', '\020', 'F', 'i', 'l',
+'t', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', '\022', 'T', '\n', '\020', 'd', 'e', 's', 't', 'i', 'n', 'a', 't',
+'i', 'o', 'n', '_', 'p', 'o', 'r', 't', '\030', '\010', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p',
+'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\013', '\372', 'B', '\010', '*',
+'\006', '\030', '\377', '\377', '\003', '(', '\001', 'R', '\017', 'd', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', 'P', 'o', 'r', 't', '\022',
+'D', '\n', '\r', 'p', 'r', 'e', 'f', 'i', 'x', '_', 'r', 'a', 'n', 'g', 'e', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', '\037', '.',
+'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'i', 'd', 'r',
+'R', 'a', 'n', 'g', 'e', 'R', '\014', 'p', 'r', 'e', 'f', 'i', 'x', 'R', 'a', 'n', 'g', 'e', 's', '\022', '%', '\n', '\016', 'a', 'd',
+'d', 'r', 'e', 's', 's', '_', 's', 'u', 'f', 'f', 'i', 'x', '\030', '\004', ' ', '\001', '(', '\t', 'R', '\r', 'a', 'd', 'd', 'r', 'e',
+'s', 's', 'S', 'u', 'f', 'f', 'i', 'x', '\022', ';', '\n', '\n', 's', 'u', 'f', 'f', 'i', 'x', '_', 'l', 'e', 'n', '\030', '\005', ' ',
+'\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n',
+'t', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\t', 's', 'u', 'f', 'f', 'i', 'x', 'L', 'e', 'n', '\022', '^', '\n', '\033', 'd', 'i',
+'r', 'e', 'c', 't', '_', 's', 'o', 'u', 'r', 'c', 'e', '_', 'p', 'r', 'e', 'f', 'i', 'x', '_', 'r', 'a', 'n', 'g', 'e', 's',
+'\030', '\r', ' ', '\003', '(', '\013', '2', '\037', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r',
+'e', '.', 'v', '3', '.', 'C', 'i', 'd', 'r', 'R', 'a', 'n', 'g', 'e', 'R', '\030', 'd', 'i', 'r', 'e', 'c', 't', 'S', 'o', 'u',
+'r', 'c', 'e', 'P', 'r', 'e', 'f', 'i', 'x', 'R', 'a', 'n', 'g', 'e', 's', '\022', 'j', '\n', '\013', 's', 'o', 'u', 'r', 'c', 'e',
+'_', 't', 'y', 'p', 'e', '\030', '\014', ' ', '\001', '(', '\016', '2', '?', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n',
+'M', 'a', 't', 'c', 'h', '.', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'S', 'o', 'u', 'r', 'c', 'e', 'T', 'y', 'p',
+'e', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\n', 's', 'o', 'u', 'r', 'c', 'e', 'T', 'y', 'p', 'e', '\022', 'Q',
+'\n', '\024', 's', 'o', 'u', 'r', 'c', 'e', '_', 'p', 'r', 'e', 'f', 'i', 'x', '_', 'r', 'a', 'n', 'g', 'e', 's', '\030', '\006', ' ',
+'\003', '(', '\013', '2', '\037', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v',
+'3', '.', 'C', 'i', 'd', 'r', 'R', 'a', 'n', 'g', 'e', 'R', '\022', 's', 'o', 'u', 'r', 'c', 'e', 'P', 'r', 'e', 'f', 'i', 'x',
+'R', 'a', 'n', 'g', 'e', 's', '\022', '3', '\n', '\014', 's', 'o', 'u', 'r', 'c', 'e', '_', 'p', 'o', 'r', 't', 's', '\030', '\007', ' ',
+'\003', '(', '\r', 'B', '\020', '\372', 'B', '\r', '\222', '\001', '\n', '\"', '\010', '*', '\006', '\030', '\377', '\377', '\003', '(', '\001', 'R', '\013', 's', 'o',
+'u', 'r', 'c', 'e', 'P', 'o', 'r', 't', 's', '\022', '!', '\n', '\014', 's', 'e', 'r', 'v', 'e', 'r', '_', 'n', 'a', 'm', 'e', 's',
+'\030', '\013', ' ', '\003', '(', '\t', 'R', '\013', 's', 'e', 'r', 'v', 'e', 'r', 'N', 'a', 'm', 'e', 's', '\022', '-', '\n', '\022', 't', 'r',
+'a', 'n', 's', 'p', 'o', 'r', 't', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '\030', '\t', ' ', '\001', '(', '\t', 'R', '\021', 't',
+'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', '\022', '3', '\n', '\025', 'a', 'p', 'p', 'l', 'i',
+'c', 'a', 't', 'i', 'o', 'n', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', 's', '\030', '\n', ' ', '\003', '(', '\t', 'R', '\024', 'a',
+'p', 'p', 'l', 'i', 'c', 'a', 't', 'i', 'o', 'n', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 's', '\"', 'F', '\n', '\024', 'C', 'o',
+'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'S', 'o', 'u', 'r', 'c', 'e', 'T', 'y', 'p', 'e', '\022', '\007', '\n', '\003', 'A', 'N', 'Y',
+'\020', '\000', '\022', '\027', '\n', '\023', 'S', 'A', 'M', 'E', '_', 'I', 'P', '_', 'O', 'R', '_', 'L', 'O', 'O', 'P', 'B', 'A', 'C', 'K',
+'\020', '\001', '\022', '\014', '\n', '\010', 'E', 'X', 'T', 'E', 'R', 'N', 'A', 'L', '\020', '\002', ':', '-', '\232', '\305', '\210', '\036', '(', '\n', '&',
+'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'F', 'i', 'l',
+'t', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', 'J', '\004', '\010', '\001', '\020', '\002', '\"', '\211', '\006', '\n', '\013', 'F',
+'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', '\022', 'X', '\n', '\022', 'f', 'i', 'l', 't', 'e', 'r', '_', 'c', 'h', 'a', 'i',
+'n', '_', 'm', 'a', 't', 'c', 'h', '\030', '\001', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
+'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a',
+'i', 'n', 'M', 'a', 't', 'c', 'h', 'R', '\020', 'f', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h',
+'\022', ':', '\n', '\007', 'f', 'i', 'l', 't', 'e', 'r', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y',
+'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'F', 'i', 'l', 't', 'e',
+'r', 'R', '\007', 'f', 'i', 'l', 't', 'e', 'r', 's', '\022', 'O', '\n', '\017', 'u', 's', 'e', '_', 'p', 'r', 'o', 'x', 'y', '_', 'p',
+'r', 'o', 't', 'o', '\030', '\004', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o',
+'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'B', '\013', '\030', '\001', '\222', '\307', '\206', '\330', '\004', '\003', '3', '.',
+'0', 'R', '\r', 'u', 's', 'e', 'P', 'r', 'o', 'x', 'y', 'P', 'r', 'o', 't', 'o', '\022', ':', '\n', '\010', 'm', 'e', 't', 'a', 'd',
+'a', 't', 'a', '\030', '\005', ' ', '\001', '(', '\013', '2', '\036', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
+'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'R', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't',
+'a', '\022', 'P', '\n', '\020', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', '\030', '\006', ' ', '\001',
+'(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3',
+'.', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', 'R', '\017', 't', 'r', 'a', 'n', 's', 'p', 'o',
+'r', 't', 'S', 'o', 'c', 'k', 'e', 't', '\022', 'b', '\n', ' ', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c',
+'k', 'e', 't', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\t', ' ', '\001', '(', '\013',
+'2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i',
+'o', 'n', 'R', '\035', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', 'C', 'o', 'n', 'n', 'e', 'c',
+'t', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', '\022', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\007', ' ', '\001', '(', '\t', 'R', '\004', 'n',
+'a', 'm', 'e', '\022', 's', '\n', '\027', 'o', 'n', '_', 'd', 'e', 'm', 'a', 'n', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', 'u', 'r',
+'a', 't', 'i', 'o', 'n', '\030', '\010', ' ', '\001', '(', '\013', '2', ';', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n',
+'.', 'O', 'n', 'D', 'e', 'm', 'a', 'n', 'd', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\025', 'o',
+'n', 'D', 'e', 'm', 'a', 'n', 'd', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\032', '[', '\n', '\025', 'O',
+'n', 'D', 'e', 'm', 'a', 'n', 'd', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\022', 'B', '\n', '\017', 'r',
+'e', 'b', 'u', 'i', 'l', 'd', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\001', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o',
+'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\016', 'r',
+'e', 'b', 'u', 'i', 'l', 'd', 'T', 'i', 'm', 'e', 'o', 'u', 't', ':', '(', '\232', '\305', '\210', '\036', '#', '\n', '!', 'e', 'n', 'v',
+'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'F', 'i', 'l', 't', 'e', 'r',
+'C', 'h', 'a', 'i', 'n', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\013', 't', 'l', 's', '_', 'c', 'o', 'n', 't', 'e', 'x', 't', '\"',
+'\302', '\005', '\n', '!', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a',
+'t', 'c', 'h', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', '\022', 'a', '\n', '\010', 'o', 'r', '_', 'm', 'a', 't', 'c', 'h', '\030',
+'\001', ' ', '\001', '(', '\013', '2', 'D', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't',
+'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a',
+'i', 'n', 'M', 'a', 't', 'c', 'h', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', '.', 'M', 'a', 't', 'c', 'h', 'S', 'e', 't',
+'H', '\000', 'R', '\007', 'o', 'r', 'M', 'a', 't', 'c', 'h', '\022', 'c', '\n', '\t', 'a', 'n', 'd', '_', 'm', 'a', 't', 'c', 'h', '\030',
+'\002', ' ', '\001', '(', '\013', '2', 'D', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't',
+'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a',
+'i', 'n', 'M', 'a', 't', 'c', 'h', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', '.', 'M', 'a', 't', 'c', 'h', 'S', 'e', 't',
+'H', '\000', 'R', '\010', 'a', 'n', 'd', 'M', 'a', 't', 'c', 'h', '\022', 'Z', '\n', '\t', 'n', 'o', 't', '_', 'm', 'a', 't', 'c', 'h',
+'\030', '\003', ' ', '\001', '(', '\013', '2', ';', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's',
+'t', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h',
+'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', 'H', '\000', 'R', '\010', 'n', 'o', 't', 'M',
+'a', 't', 'c', 'h', '\022', '&', '\n', '\t', 'a', 'n', 'y', '_', 'm', 'a', 't', 'c', 'h', '\030', '\004', ' ', '\001', '(', '\010', 'B', '\007',
+'\372', 'B', '\004', 'j', '\002', '\010', '\001', 'H', '\000', 'R', '\010', 'a', 'n', 'y', 'M', 'a', 't', 'c', 'h', '\022', 'Q', '\n', '\026', 'd', 'e',
+'s', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', '_', 'p', 'o', 'r', 't', '_', 'r', 'a', 'n', 'g', 'e', '\030', '\005', ' ', '\001', '(',
+'\013', '2', '\031', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'I', 'n', 't', '3', '2', 'R', 'a',
+'n', 'g', 'e', 'H', '\000', 'R', '\024', 'd', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', 'P', 'o', 'r', 't', 'R', 'a', 'n',
+'g', 'e', '\032', '\260', '\001', '\n', '\010', 'M', 'a', 't', 'c', 'h', 'S', 'e', 't', '\022', '[', '\n', '\005', 'r', 'u', 'l', 'e', 's', '\030',
+'\001', ' ', '\003', '(', '\013', '2', ';', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't',
+'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a',
+'i', 'n', 'M', 'a', 't', 'c', 'h', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010',
+'\002', 'R', '\005', 'r', 'u', 'l', 'e', 's', ':', 'G', '\232', '\305', '\210', '\036', 'B', '\n', '@', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
+'i', '.', 'v', '2', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l',
+'t', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', '.', 'M', 'a',
+'t', 'c', 'h', 'S', 'e', 't', ':', '>', '\232', '\305', '\210', '\036', '9', '\n', '7', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.',
+'v', '2', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e',
+'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', 'B', '\013', '\n', '\004', 'r',
+'u', 'l', 'e', '\022', '\003', '\370', 'B', '\001', '\"', '\230', '\002', '\n', '\016', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't',
+'e', 'r', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001',
+'R', '\004', 'n', 'a', 'm', 'e', '\022', '9', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ',
+'\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y',
+'H', '\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'd', '\n', '\017', 'f', 'i', 'l', 't', 'e', 'r',
+'_', 'd', 'i', 's', 'a', 'b', 'l', 'e', 'd', '\030', '\004', ' ', '\001', '(', '\013', '2', ';', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
+'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e',
+'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't',
+'e', 'R', '\016', 'f', 'i', 'l', 't', 'e', 'r', 'D', 'i', 's', 'a', 'b', 'l', 'e', 'd', ':', '+', '\232', '\305', '\210', '\036', '&', '\n',
+'$', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'L', 'i',
+'s', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'B', '\r', '\n', '\013', 'c', 'o', 'n', 'f', 'i', 'g', '_', 't', 'y',
+'p', 'e', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', 'B', 'K', '\n', '&', 'i', 'o', '.', 'e', 'n',
+'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's',
+'t', 'e', 'n', 'e', 'r', '.', 'v', '3', 'B', '\027', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'C', 'o', 'm', 'p', 'o', 'n', 'e',
+'n', 't', 's', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o',
+'3',
};
-static upb_def_init *deps[11] = {
+static upb_def_init *deps[12] = {
&envoy_config_core_v3_address_proto_upbdefinit,
&envoy_config_core_v3_base_proto_upbdefinit,
&envoy_config_core_v3_extension_proto_upbdefinit,
@@ -179,6 +186,7 @@ static upb_def_init *deps[11] = {
&google_protobuf_any_proto_upbdefinit,
&google_protobuf_duration_proto_upbdefinit,
&google_protobuf_wrappers_proto_upbdefinit,
+ &envoy_annotations_deprecation_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
&udpa_annotations_versioning_proto_upbdefinit,
&validate_validate_proto_upbdefinit,
@@ -189,5 +197,5 @@ upb_def_init envoy_config_listener_v3_listener_components_proto_upbdefinit = {
deps,
layouts,
"envoy/config/listener/v3/listener_components.proto",
- UPB_STRVIEW_INIT(descriptor, 3284)
+ UPB_STRVIEW_INIT(descriptor, 3426)
};
diff --git a/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c b/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c
new file mode 100644
index 0000000000..d2527ce3c0
--- /dev/null
+++ b/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c
@@ -0,0 +1,90 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/config/listener/v3/quic_config.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include "upb/def.h"
+#include "envoy/config/listener/v3/quic_config.upbdefs.h"
+
+extern upb_def_init envoy_config_core_v3_base_proto_upbdefinit;
+extern upb_def_init envoy_config_core_v3_extension_proto_upbdefinit;
+extern upb_def_init envoy_config_core_v3_protocol_proto_upbdefinit;
+extern upb_def_init google_protobuf_duration_proto_upbdefinit;
+extern upb_def_init google_protobuf_wrappers_proto_upbdefinit;
+extern upb_def_init udpa_annotations_status_proto_upbdefinit;
+extern upb_def_init udpa_annotations_versioning_proto_upbdefinit;
+extern upb_def_init validate_validate_proto_upbdefinit;
+extern const upb_msglayout envoy_config_listener_v3_QuicProtocolOptions_msginit;
+
+static const upb_msglayout *layouts[1] = {
+ &envoy_config_listener_v3_QuicProtocolOptions_msginit,
+};
+
+static const char descriptor[1107] = {'\n', '*', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '/', 'v',
+'3', '/', 'q', 'u', 'i', 'c', '_', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'p', 'r', 'o', 't', 'o', '\022', '\030', 'e', 'n', 'v', 'o',
+'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '\032', '\037', 'e', 'n', 'v',
+'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'b', 'a', 's', 'e', '.', 'p', 'r',
+'o', 't', 'o', '\032', '$', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3',
+'/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '#', 'e', 'n', 'v', 'o', 'y', '/', 'c',
+'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '.', 'p', 'r',
+'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'd', 'u', 'r', 'a',
+'t', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b',
+'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a',
+'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!',
+'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i',
+'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a',
+'t', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\266', '\005', '\n', '\023', 'Q', 'u', 'i', 'c', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l',
+'O', 'p', 't', 'i', 'o', 'n', 's', '\022', ']', '\n', '\025', 'q', 'u', 'i', 'c', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_',
+'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '\001', ' ', '\001', '(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
+'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'Q', 'u', 'i', 'c', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O',
+'p', 't', 'i', 'o', 'n', 's', 'R', '\023', 'q', 'u', 'i', 'c', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o',
+'n', 's', '\022', '<', '\n', '\014', 'i', 'd', 'l', 'e', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\002', ' ', '\001', '(', '\013', '2',
+'\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o',
+'n', 'R', '\013', 'i', 'd', 'l', 'e', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'S', '\n', '\030', 'c', 'r', 'y', 'p', 't', 'o', '_',
+'h', 'a', 'n', 'd', 's', 'h', 'a', 'k', 'e', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\003', ' ', '\001', '(', '\013', '2', '\031',
+'.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n',
+'R', '\026', 'c', 'r', 'y', 'p', 't', 'o', 'H', 'a', 'n', 'd', 's', 'h', 'a', 'k', 'e', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022',
+'B', '\n', '\007', 'e', 'n', 'a', 'b', 'l', 'e', 'd', '\030', '\004', ' ', '\001', '(', '\013', '2', '(', '.', 'e', 'n', 'v', 'o', 'y', '.',
+'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'e', 'a',
+'t', 'u', 'r', 'e', 'F', 'l', 'a', 'g', 'R', '\007', 'e', 'n', 'a', 'b', 'l', 'e', 'd', '\022', '}', '\n', ')', 'p', 'a', 'c', 'k',
+'e', 't', 's', '_', 't', 'o', '_', 'r', 'e', 'a', 'd', '_', 't', 'o', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n',
+'_', 'c', 'o', 'u', 'n', 't', '_', 'r', 'a', 't', 'i', 'o', '\030', '\005', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g',
+'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\007',
+'\372', 'B', '\004', '*', '\002', '(', '\001', 'R', '#', 'p', 'a', 'c', 'k', 'e', 't', 's', 'T', 'o', 'R', 'e', 'a', 'd', 'T', 'o', 'C',
+'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'C', 'o', 'u', 'n', 't', 'R', 'a', 't', 'i', 'o', '\022', '\\', '\n', '\024', 'c', 'r',
+'y', 'p', 't', 'o', '_', 's', 't', 'r', 'e', 'a', 'm', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\006', ' ', '\001', '(', '\013', '2',
+'*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'y',
+'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\022', 'c', 'r', 'y', 'p', 't',
+'o', 'S', 't', 'r', 'e', 'a', 'm', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'Z', '\n', '\023', 'p', 'r', 'o', 'o', 'f', '_', 's', 'o',
+'u', 'r', 'c', 'e', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\007', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y',
+'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e',
+'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\021', 'p', 'r', 'o', 'o', 'f', 'S', 'o', 'u', 'r', 'c', 'e', 'C',
+'o', 'n', 'f', 'i', 'g', ':', '0', '\232', '\305', '\210', '\036', '+', '\n', ')', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v',
+'2', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'Q', 'u', 'i', 'c', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p',
+'t', 'i', 'o', 'n', 's', 'B', 'C', '\n', '&', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n',
+'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', 'B', '\017', 'Q',
+'u', 'i', 'c', 'C', 'o', 'n', 'f', 'i', 'g', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b',
+'\006', 'p', 'r', 'o', 't', 'o', '3',
+};
+
+static upb_def_init *deps[9] = {
+ &envoy_config_core_v3_base_proto_upbdefinit,
+ &envoy_config_core_v3_extension_proto_upbdefinit,
+ &envoy_config_core_v3_protocol_proto_upbdefinit,
+ &google_protobuf_duration_proto_upbdefinit,
+ &google_protobuf_wrappers_proto_upbdefinit,
+ &udpa_annotations_status_proto_upbdefinit,
+ &udpa_annotations_versioning_proto_upbdefinit,
+ &validate_validate_proto_upbdefinit,
+ NULL
+};
+
+upb_def_init envoy_config_listener_v3_quic_config_proto_upbdefinit = {
+ deps,
+ layouts,
+ "envoy/config/listener/v3/quic_config.proto",
+ UPB_STRVIEW_INIT(descriptor, 1107)
+};
diff --git a/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.h b/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.h
new file mode 100644
index 0000000000..782aacb268
--- /dev/null
+++ b/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.h
@@ -0,0 +1,35 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/config/listener/v3/quic_config.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef ENVOY_CONFIG_LISTENER_V3_QUIC_CONFIG_PROTO_UPBDEFS_H_
+#define ENVOY_CONFIG_LISTENER_V3_QUIC_CONFIG_PROTO_UPBDEFS_H_
+
+#include "upb/def.h"
+#include "upb/port_def.inc"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "upb/def.h"
+
+#include "upb/port_def.inc"
+
+extern upb_def_init envoy_config_listener_v3_quic_config_proto_upbdefinit;
+
+UPB_INLINE const upb_msgdef *envoy_config_listener_v3_QuicProtocolOptions_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &envoy_config_listener_v3_quic_config_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "envoy.config.listener.v3.QuicProtocolOptions");
+}
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif /* ENVOY_CONFIG_LISTENER_V3_QUIC_CONFIG_PROTO_UPBDEFS_H_ */
diff --git a/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c b/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c
index 525a38a51a..fbcae5adb3 100644
--- a/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c
+++ b/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c
@@ -9,7 +9,8 @@
#include "upb/def.h"
#include "envoy/config/listener/v3/udp_listener_config.upbdefs.h"
-extern upb_def_init google_protobuf_any_proto_upbdefinit;
+extern upb_def_init envoy_config_core_v3_udp_socket_config_proto_upbdefinit;
+extern upb_def_init envoy_config_listener_v3_quic_config_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
extern upb_def_init udpa_annotations_versioning_proto_upbdefinit;
extern const upb_msglayout envoy_config_listener_v3_UdpListenerConfig_msginit;
@@ -20,32 +21,39 @@ static const upb_msglayout *layouts[2] = {
&envoy_config_listener_v3_ActiveRawUdpListenerConfig_msginit,
};
-static const char descriptor[544] = {'\n', '2', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '/', 'v',
+static const char descriptor[692] = {'\n', '2', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '/', 'v',
'3', '/', 'u', 'd', 'p', '_', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'p', 'r', 'o',
't', 'o', '\022', '\030', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r',
-'.', 'v', '3', '\032', '\031', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'a', 'n', 'y', '.',
-'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's',
-'t', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't',
-'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\"', '\307', '\001', '\n',
-'\021', 'U', 'd', 'p', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '*', '\n', '\021', 'u', 'd', 'p',
-'_', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '_', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\017', 'u', 'd', 'p',
-'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'N', 'a', 'm', 'e', '\022', '9', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n',
-'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b',
-'u', 'f', '.', 'A', 'n', 'y', 'H', '\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', ':', '.', '\232', '\305',
-'\210', '\036', ')', '\n', '\'', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'l', 'i', 's', 't', 'e', 'n', 'e',
-'r', '.', 'U', 'd', 'p', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'B', '\r', '\n', '\013', 'c', 'o',
-'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', '\"', 'U',
-'\n', '\032', 'A', 'c', 't', 'i', 'v', 'e', 'R', 'a', 'w', 'U', 'd', 'p', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'C', 'o', 'n',
-'f', 'i', 'g', ':', '7', '\232', '\305', '\210', '\036', '2', '\n', '0', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.',
-'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'A', 'c', 't', 'i', 'v', 'e', 'R', 'a', 'w', 'U', 'd', 'p', 'L', 'i', 's', 't',
-'e', 'n', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'B', 'J', '\n', '&', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o',
-'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.',
-'v', '3', 'B', '\026', 'U', 'd', 'p', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'P', 'r', 'o', 't',
-'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'.', 'v', '3', '\032', ',', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3',
+'/', 'u', 'd', 'p', '_', 's', 'o', 'c', 'k', 'e', 't', '_', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032',
+'*', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '/', 'v', '3',
+'/', 'q', 'u', 'i', 'c', '_', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/',
+'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032',
+'!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n',
+'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\"', '\234', '\002', '\n', '\021', 'U', 'd', 'p', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r',
+'C', 'o', 'n', 'f', 'i', 'g', '\022', '_', '\n', '\030', 'd', 'o', 'w', 'n', 's', 't', 'r', 'e', 'a', 'm', '_', 's', 'o', 'c', 'k',
+'e', 't', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\005', ' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
+'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'U', 'd', 'p', 'S', 'o', 'c', 'k', 'e', 't', 'C', 'o',
+'n', 'f', 'i', 'g', 'R', '\026', 'd', 'o', 'w', 'n', 's', 't', 'r', 'e', 'a', 'm', 'S', 'o', 'c', 'k', 'e', 't', 'C', 'o', 'n',
+'f', 'i', 'g', '\022', 'P', '\n', '\014', 'q', 'u', 'i', 'c', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '\007', ' ', '\001', '(', '\013',
+'2', '-', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.',
+'v', '3', '.', 'Q', 'u', 'i', 'c', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'R', '\013', 'q',
+'u', 'i', 'c', 'O', 'p', 't', 'i', 'o', 'n', 's', ':', '.', '\232', '\305', '\210', '\036', ')', '\n', '\'', 'e', 'n', 'v', 'o', 'y', '.',
+'a', 'p', 'i', '.', 'v', '2', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'U', 'd', 'p', 'L', 'i', 's', 't', 'e', 'n',
+'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'J', '\004', '\010', '\001', '\020', '\002', 'J', '\004', '\010', '\002', '\020', '\003', 'J', '\004', '\010', '\003', '\020',
+'\004', 'J', '\004', '\010', '\004', '\020', '\005', 'J', '\004', '\010', '\006', '\020', '\007', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', '\"', 'U', '\n', '\032',
+'A', 'c', 't', 'i', 'v', 'e', 'R', 'a', 'w', 'U', 'd', 'p', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'C', 'o', 'n', 'f', 'i',
+'g', ':', '7', '\232', '\305', '\210', '\036', '2', '\n', '0', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'l', 'i',
+'s', 't', 'e', 'n', 'e', 'r', '.', 'A', 'c', 't', 'i', 'v', 'e', 'R', 'a', 'w', 'U', 'd', 'p', 'L', 'i', 's', 't', 'e', 'n',
+'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'B', 'J', '\n', '&', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3',
+'B', '\026', 'U', 'd', 'p', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'P', 'r', 'o', 't', 'o', 'P',
+'\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[4] = {
- &google_protobuf_any_proto_upbdefinit,
+static upb_def_init *deps[5] = {
+ &envoy_config_core_v3_udp_socket_config_proto_upbdefinit,
+ &envoy_config_listener_v3_quic_config_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
&udpa_annotations_versioning_proto_upbdefinit,
NULL
@@ -55,5 +63,5 @@ upb_def_init envoy_config_listener_v3_udp_listener_config_proto_upbdefinit = {
deps,
layouts,
"envoy/config/listener/v3/udp_listener_config.proto",
- UPB_STRVIEW_INIT(descriptor, 544)
+ UPB_STRVIEW_INIT(descriptor, 692)
};
diff --git a/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c b/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c
index de6422d17f..f73a9a03c5 100644
--- a/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c
+++ b/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c
@@ -16,6 +16,7 @@ extern upb_def_init envoy_type_matcher_v3_path_proto_upbdefinit;
extern upb_def_init envoy_type_matcher_v3_string_proto_upbdefinit;
extern upb_def_init google_api_expr_v1alpha1_checked_proto_upbdefinit;
extern upb_def_init google_api_expr_v1alpha1_syntax_proto_upbdefinit;
+extern upb_def_init envoy_annotations_deprecation_proto_upbdefinit;
extern upb_def_init udpa_annotations_migrate_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
extern upb_def_init udpa_annotations_versioning_proto_upbdefinit;
@@ -40,7 +41,7 @@ static const upb_msglayout *layouts[8] = {
&envoy_config_rbac_v3_Principal_Authenticated_msginit,
};
-static const char descriptor[3112] = {'\n', '\037', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'r', 'b', 'a', 'c', '/', 'v', '3', '/', 'r', 'b',
+static const char descriptor[3158] = {'\n', '\037', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'r', 'b', 'a', 'c', '/', 'v', '3', '/', 'r', 'b',
'a', 'c', '.', 'p', 'r', 'o', 't', 'o', '\022', '\024', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b',
'a', 'c', '.', 'v', '3', '\032', '\"', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/',
'v', '3', '/', 'a', 'd', 'd', 'r', 'e', 's', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', ',', 'e', 'n', 'v', 'o', 'y', '/', 'c',
@@ -53,121 +54,123 @@ static const char descriptor[3112] = {'\n', '\037', 'e', 'n', 'v', 'o', 'y', '/'
'g', 'l', 'e', '/', 'a', 'p', 'i', '/', 'e', 'x', 'p', 'r', '/', 'v', '1', 'a', 'l', 'p', 'h', 'a', '1', '/', 'c', 'h', 'e',
'c', 'k', 'e', 'd', '.', 'p', 'r', 'o', 't', 'o', '\032', '%', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'a', 'p', 'i', '/', 'e', 'x',
'p', 'r', '/', 'v', '1', 'a', 'l', 'p', 'h', 'a', '1', '/', 's', 'y', 'n', 't', 'a', 'x', '.', 'p', 'r', 'o', 't', 'o', '\032',
-'\036', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'm', 'i', 'g', 'r', 'a', 't', 'e',
-'.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/',
-'s', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a',
-'t', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v',
-'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\266', '\002',
-'\n', '\004', 'R', 'B', 'A', 'C', '\022', 'C', '\n', '\006', 'a', 'c', 't', 'i', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\016', '2', '!', '.',
-'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c', '.', 'v', '3', '.', 'R', 'B', 'A', 'C',
-'.', 'A', 'c', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\006', 'a', 'c', 't', 'i', 'o', 'n',
-'\022', 'D', '\n', '\010', 'p', 'o', 'l', 'i', 'c', 'i', 'e', 's', '\030', '\002', ' ', '\003', '(', '\013', '2', '(', '.', 'e', 'n', 'v', 'o',
-'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c', '.', 'v', '3', '.', 'R', 'B', 'A', 'C', '.', 'P', 'o', 'l',
-'i', 'c', 'i', 'e', 's', 'E', 'n', 't', 'r', 'y', 'R', '\010', 'p', 'o', 'l', 'i', 'c', 'i', 'e', 's', '\032', 'Y', '\n', '\r', 'P',
-'o', 'l', 'i', 'c', 'i', 'e', 's', 'E', 'n', 't', 'r', 'y', '\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t',
-'R', '\003', 'k', 'e', 'y', '\022', '2', '\n', '\005', 'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'e', 'n',
-'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c', '.', 'v', '3', '.', 'P', 'o', 'l', 'i', 'c', 'y',
-'R', '\005', 'v', 'a', 'l', 'u', 'e', ':', '\002', '8', '\001', '\"', '&', '\n', '\006', 'A', 'c', 't', 'i', 'o', 'n', '\022', '\t', '\n', '\005',
-'A', 'L', 'L', 'O', 'W', '\020', '\000', '\022', '\010', '\n', '\004', 'D', 'E', 'N', 'Y', '\020', '\001', '\022', '\007', '\n', '\003', 'L', 'O', 'G', '\020',
-'\002', ':', ' ', '\232', '\305', '\210', '\036', '\033', '\n', '\031', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b',
-'a', 'c', '.', 'v', '2', '.', 'R', 'B', 'A', 'C', '\"', '\223', '\003', '\n', '\006', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'L', '\n', '\013',
-'p', 'e', 'r', 'm', 'i', 's', 's', 'i', 'o', 'n', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c', '.', 'v', '3', '.', 'P', 'e', 'r', 'm', 'i', 's', 's', 'i', 'o',
-'n', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', 'R', '\013', 'p', 'e', 'r', 'm', 'i', 's', 's', 'i', 'o', 'n', 's', '\022',
-'I', '\n', '\n', 'p', 'r', 'i', 'n', 'c', 'i', 'p', 'a', 'l', 's', '\030', '\002', ' ', '\003', '(', '\013', '2', '\037', '.', 'e', 'n', 'v',
-'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c', '.', 'v', '3', '.', 'P', 'r', 'i', 'n', 'c', 'i', 'p',
-'a', 'l', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', 'R', '\n', 'p', 'r', 'i', 'n', 'c', 'i', 'p', 'a', 'l', 's', '\022',
-'Z', '\n', '\t', 'c', 'o', 'n', 'd', 'i', 't', 'i', 'o', 'n', '\030', '\003', ' ', '\001', '(', '\013', '2', '\036', '.', 'g', 'o', 'o', 'g',
-'l', 'e', '.', 'a', 'p', 'i', '.', 'e', 'x', 'p', 'r', '.', 'v', '1', 'a', 'l', 'p', 'h', 'a', '1', '.', 'E', 'x', 'p', 'r',
-'B', '\034', '\362', '\230', '\376', '\217', '\005', '\026', '\022', '\024', 'e', 'x', 'p', 'r', 'e', 's', 's', 'i', 'o', 'n', '_', 's', 'p', 'e', 'c',
-'i', 'f', 'i', 'e', 'r', 'R', '\t', 'c', 'o', 'n', 'd', 'i', 't', 'i', 'o', 'n', '\022', 'p', '\n', '\021', 'c', 'h', 'e', 'c', 'k',
-'e', 'd', '_', 'c', 'o', 'n', 'd', 'i', 't', 'i', 'o', 'n', '\030', '\004', ' ', '\001', '(', '\013', '2', '%', '.', 'g', 'o', 'o', 'g',
-'l', 'e', '.', 'a', 'p', 'i', '.', 'e', 'x', 'p', 'r', '.', 'v', '1', 'a', 'l', 'p', 'h', 'a', '1', '.', 'C', 'h', 'e', 'c',
-'k', 'e', 'd', 'E', 'x', 'p', 'r', 'B', '\034', '\362', '\230', '\376', '\217', '\005', '\026', '\022', '\024', 'e', 'x', 'p', 'r', 'e', 's', 's', 'i',
-'o', 'n', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', 'R', '\020', 'c', 'h', 'e', 'c', 'k', 'e', 'd', 'C', 'o', 'n', 'd',
-'i', 't', 'i', 'o', 'n', ':', '\"', '\232', '\305', '\210', '\036', '\035', '\n', '\033', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
-'g', '.', 'r', 'b', 'a', 'c', '.', 'v', '2', '.', 'P', 'o', 'l', 'i', 'c', 'y', '\"', '\277', '\006', '\n', '\n', 'P', 'e', 'r', 'm',
-'i', 's', 's', 'i', 'o', 'n', '\022', 'C', '\n', '\t', 'a', 'n', 'd', '_', 'r', 'u', 'l', 'e', 's', '\030', '\001', ' ', '\001', '(', '\013',
-'2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c', '.', 'v', '3', '.', 'P',
-'e', 'r', 'm', 'i', 's', 's', 'i', 'o', 'n', '.', 'S', 'e', 't', 'H', '\000', 'R', '\010', 'a', 'n', 'd', 'R', 'u', 'l', 'e', 's',
-'\022', 'A', '\n', '\010', 'o', 'r', '_', 'r', 'u', 'l', 'e', 's', '\030', '\002', ' ', '\001', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o',
-'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c', '.', 'v', '3', '.', 'P', 'e', 'r', 'm', 'i', 's', 's', 'i',
-'o', 'n', '.', 'S', 'e', 't', 'H', '\000', 'R', '\007', 'o', 'r', 'R', 'u', 'l', 'e', 's', '\022', '\033', '\n', '\003', 'a', 'n', 'y', '\030',
-'\003', ' ', '\001', '(', '\010', 'B', '\007', '\372', 'B', '\004', 'j', '\002', '\010', '\001', 'H', '\000', 'R', '\003', 'a', 'n', 'y', '\022', '>', '\n', '\006',
-'h', 'e', 'a', 'd', 'e', 'r', '\030', '\004', ' ', '\001', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r',
-'H', '\000', 'R', '\006', 'h', 'e', 'a', 'd', 'e', 'r', '\022', '?', '\n', '\010', 'u', 'r', 'l', '_', 'p', 'a', 't', 'h', '\030', '\n', ' ',
-'\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.',
-'v', '3', '.', 'P', 'a', 't', 'h', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'H', '\000', 'R', '\007', 'u', 'r', 'l', 'P', 'a', 't', 'h',
-'\022', 'H', '\n', '\016', 'd', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', '_', 'i', 'p', '\030', '\005', ' ', '\001', '(', '\013', '2',
-'\037', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'i',
-'d', 'r', 'R', 'a', 'n', 'g', 'e', 'H', '\000', 'R', '\r', 'd', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', 'I', 'p', '\022',
-'6', '\n', '\020', 'd', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', '_', 'p', 'o', 'r', 't', '\030', '\006', ' ', '\001', '(', '\r',
-'B', '\t', '\372', 'B', '\006', '*', '\004', '\030', '\377', '\377', '\003', 'H', '\000', 'R', '\017', 'd', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o',
-'n', 'P', 'o', 'r', 't', '\022', 'D', '\n', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030', '\007', ' ', '\001', '(', '\013', '2', '&',
-'.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'M', 'e',
-'t', 'a', 'd', 'a', 't', 'a', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'H', '\000', 'R', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a',
-'\022', '=', '\n', '\010', 'n', 'o', 't', '_', 'r', 'u', 'l', 'e', '\030', '\010', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o',
-'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c', '.', 'v', '3', '.', 'P', 'e', 'r', 'm', 'i', 's', 's', 'i',
-'o', 'n', 'H', '\000', 'R', '\007', 'n', 'o', 't', 'R', 'u', 'l', 'e', '\022', 'Z', '\n', '\025', 'r', 'e', 'q', 'u', 'e', 's', 't', 'e',
-'d', '_', 's', 'e', 'r', 'v', 'e', 'r', '_', 'n', 'a', 'm', 'e', '\030', '\t', ' ', '\001', '(', '\013', '2', '$', '.', 'e', 'n', 'v',
-'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'S', 't', 'r', 'i', 'n', 'g',
-'M', 'a', 't', 'c', 'h', 'e', 'r', 'H', '\000', 'R', '\023', 'r', 'e', 'q', 'u', 'e', 's', 't', 'e', 'd', 'S', 'e', 'r', 'v', 'e',
-'r', 'N', 'a', 'm', 'e', '\032', 's', '\n', '\003', 'S', 'e', 't', '\022', '@', '\n', '\005', 'r', 'u', 'l', 'e', 's', '\030', '\001', ' ', '\003',
-'(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c', '.', 'v', '3',
-'.', 'P', 'e', 'r', 'm', 'i', 's', 's', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', 'R', '\005', 'r', 'u',
-'l', 'e', 's', ':', '*', '\232', '\305', '\210', '\036', '%', '\n', '#', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
-'r', 'b', 'a', 'c', '.', 'v', '2', '.', 'P', 'e', 'r', 'm', 'i', 's', 's', 'i', 'o', 'n', '.', 'S', 'e', 't', ':', '&', '\232',
-'\305', '\210', '\036', '!', '\n', '\037', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c', '.', 'v',
-'2', '.', 'P', 'e', 'r', 'm', 'i', 's', 's', 'i', 'o', 'n', 'B', '\013', '\n', '\004', 'r', 'u', 'l', 'e', '\022', '\003', '\370', 'B', '\001',
-'\"', '\222', '\010', '\n', '\t', 'P', 'r', 'i', 'n', 'c', 'i', 'p', 'a', 'l', '\022', '>', '\n', '\007', 'a', 'n', 'd', '_', 'i', 'd', 's',
-'\030', '\001', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a',
-'c', '.', 'v', '3', '.', 'P', 'r', 'i', 'n', 'c', 'i', 'p', 'a', 'l', '.', 'S', 'e', 't', 'H', '\000', 'R', '\006', 'a', 'n', 'd',
-'I', 'd', 's', '\022', '<', '\n', '\006', 'o', 'r', '_', 'i', 'd', 's', '\030', '\002', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v',
-'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c', '.', 'v', '3', '.', 'P', 'r', 'i', 'n', 'c', 'i', 'p',
-'a', 'l', '.', 'S', 'e', 't', 'H', '\000', 'R', '\005', 'o', 'r', 'I', 'd', 's', '\022', '\033', '\n', '\003', 'a', 'n', 'y', '\030', '\003', ' ',
-'\001', '(', '\010', 'B', '\007', '\372', 'B', '\004', 'j', '\002', '\010', '\001', 'H', '\000', 'R', '\003', 'a', 'n', 'y', '\022', 'U', '\n', '\r', 'a', 'u',
-'t', 'h', 'e', 'n', 't', 'i', 'c', 'a', 't', 'e', 'd', '\030', '\004', ' ', '\001', '(', '\013', '2', '-', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c', '.', 'v', '3', '.', 'P', 'r', 'i', 'n', 'c', 'i', 'p', 'a', 'l',
-'.', 'A', 'u', 't', 'h', 'e', 'n', 't', 'i', 'c', 'a', 't', 'e', 'd', 'H', '\000', 'R', '\r', 'a', 'u', 't', 'h', 'e', 'n', 't',
-'i', 'c', 'a', 't', 'e', 'd', '\022', 'B', '\n', '\t', 's', 'o', 'u', 'r', 'c', 'e', '_', 'i', 'p', '\030', '\005', ' ', '\001', '(', '\013',
-'2', '\037', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C',
-'i', 'd', 'r', 'R', 'a', 'n', 'g', 'e', 'B', '\002', '\030', '\001', 'H', '\000', 'R', '\010', 's', 'o', 'u', 'r', 'c', 'e', 'I', 'p', '\022',
-'K', '\n', '\020', 'd', 'i', 'r', 'e', 'c', 't', '_', 'r', 'e', 'm', 'o', 't', 'e', '_', 'i', 'p', '\030', '\n', ' ', '\001', '(', '\013',
-'2', '\037', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C',
-'i', 'd', 'r', 'R', 'a', 'n', 'g', 'e', 'H', '\000', 'R', '\016', 'd', 'i', 'r', 'e', 'c', 't', 'R', 'e', 'm', 'o', 't', 'e', 'I',
-'p', '\022', '>', '\n', '\t', 'r', 'e', 'm', 'o', 't', 'e', '_', 'i', 'p', '\030', '\013', ' ', '\001', '(', '\013', '2', '\037', '.', 'e', 'n',
-'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'i', 'd', 'r', 'R', 'a',
-'n', 'g', 'e', 'H', '\000', 'R', '\010', 'r', 'e', 'm', 'o', 't', 'e', 'I', 'p', '\022', '>', '\n', '\006', 'h', 'e', 'a', 'd', 'e', 'r',
-'\030', '\006', ' ', '\001', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u',
-'t', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'H', '\000', 'R', '\006', 'h', 'e',
-'a', 'd', 'e', 'r', '\022', '?', '\n', '\010', 'u', 'r', 'l', '_', 'p', 'a', 't', 'h', '\030', '\t', ' ', '\001', '(', '\013', '2', '\"', '.',
-'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'P', 'a', 't',
-'h', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'H', '\000', 'R', '\007', 'u', 'r', 'l', 'P', 'a', 't', 'h', '\022', 'D', '\n', '\010', 'm', 'e',
-'t', 'a', 'd', 'a', 't', 'a', '\030', '\007', ' ', '\001', '(', '\013', '2', '&', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e',
-'.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'M', 'a', 't', 'c', 'h',
-'e', 'r', 'H', '\000', 'R', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\022', '8', '\n', '\006', 'n', 'o', 't', '_', 'i', 'd', '\030',
-'\010', ' ', '\001', '(', '\013', '2', '\037', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c',
-'.', 'v', '3', '.', 'P', 'r', 'i', 'n', 'c', 'i', 'p', 'a', 'l', 'H', '\000', 'R', '\005', 'n', 'o', 't', 'I', 'd', '\032', 'm', '\n',
-'\003', 'S', 'e', 't', '\022', ';', '\n', '\003', 'i', 'd', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', '\037', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c', '.', 'v', '3', '.', 'P', 'r', 'i', 'n', 'c', 'i', 'p', 'a', 'l',
-'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', 'R', '\003', 'i', 'd', 's', ':', ')', '\232', '\305', '\210', '\036', '$', '\n', '\"', 'e',
-'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c', '.', 'v', '2', '.', 'P', 'r', 'i', 'n', 'c',
-'i', 'p', 'a', 'l', '.', 'S', 'e', 't', '\032', '\227', '\001', '\n', '\r', 'A', 'u', 't', 'h', 'e', 'n', 't', 'i', 'c', 'a', 't', 'e',
-'d', '\022', 'K', '\n', '\016', 'p', 'r', 'i', 'n', 'c', 'i', 'p', 'a', 'l', '_', 'n', 'a', 'm', 'e', '\030', '\002', ' ', '\001', '(', '\013',
-'2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.',
-'S', 't', 'r', 'i', 'n', 'g', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'R', '\r', 'p', 'r', 'i', 'n', 'c', 'i', 'p', 'a', 'l', 'N',
-'a', 'm', 'e', ':', '3', '\232', '\305', '\210', '\036', '.', '\n', ',', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
-'r', 'b', 'a', 'c', '.', 'v', '2', '.', 'P', 'r', 'i', 'n', 'c', 'i', 'p', 'a', 'l', '.', 'A', 'u', 't', 'h', 'e', 'n', 't',
-'i', 'c', 'a', 't', 'e', 'd', 'J', '\004', '\010', '\001', '\020', '\002', ':', '%', '\232', '\305', '\210', '\036', ' ', '\n', '\036', 'e', 'n', 'v', 'o',
-'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c', '.', 'v', '2', '.', 'P', 'r', 'i', 'n', 'c', 'i', 'p', 'a',
-'l', 'B', '\021', '\n', '\n', 'i', 'd', 'e', 'n', 't', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', 'B', '9', '\n', '\"', 'i',
-'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
-'.', 'r', 'b', 'a', 'c', '.', 'v', '3', 'B', '\t', 'R', 'b', 'a', 'c', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321',
-'\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'#', 'e', 'n', 'v', 'o', 'y', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'd', 'e', 'p', 'r', 'e', 'c',
+'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't',
+'i', 'o', 'n', 's', '/', 'm', 'i', 'g', 'r', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/',
+'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032',
+'!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n',
+'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd',
+'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\266', '\002', '\n', '\004', 'R', 'B', 'A', 'C', '\022', 'C', '\n', '\006', 'a', 'c', 't',
+'i', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\016', '2', '!', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
+'r', 'b', 'a', 'c', '.', 'v', '3', '.', 'R', 'B', 'A', 'C', '.', 'A', 'c', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\202',
+'\001', '\002', '\020', '\001', 'R', '\006', 'a', 'c', 't', 'i', 'o', 'n', '\022', 'D', '\n', '\010', 'p', 'o', 'l', 'i', 'c', 'i', 'e', 's', '\030',
+'\002', ' ', '\003', '(', '\013', '2', '(', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c',
+'.', 'v', '3', '.', 'R', 'B', 'A', 'C', '.', 'P', 'o', 'l', 'i', 'c', 'i', 'e', 's', 'E', 'n', 't', 'r', 'y', 'R', '\010', 'p',
+'o', 'l', 'i', 'c', 'i', 'e', 's', '\032', 'Y', '\n', '\r', 'P', 'o', 'l', 'i', 'c', 'i', 'e', 's', 'E', 'n', 't', 'r', 'y', '\022',
+'\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\003', 'k', 'e', 'y', '\022', '2', '\n', '\005', 'v', 'a', 'l', 'u',
+'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b',
+'a', 'c', '.', 'v', '3', '.', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\005', 'v', 'a', 'l', 'u', 'e', ':', '\002', '8', '\001', '\"', '&',
+'\n', '\006', 'A', 'c', 't', 'i', 'o', 'n', '\022', '\t', '\n', '\005', 'A', 'L', 'L', 'O', 'W', '\020', '\000', '\022', '\010', '\n', '\004', 'D', 'E',
+'N', 'Y', '\020', '\001', '\022', '\007', '\n', '\003', 'L', 'O', 'G', '\020', '\002', ':', ' ', '\232', '\305', '\210', '\036', '\033', '\n', '\031', 'e', 'n', 'v',
+'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c', '.', 'v', '2', '.', 'R', 'B', 'A', 'C', '\"', '\223', '\003',
+'\n', '\006', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'L', '\n', '\013', 'p', 'e', 'r', 'm', 'i', 's', 's', 'i', 'o', 'n', 's', '\030', '\001',
+' ', '\003', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c', '.',
+'v', '3', '.', 'P', 'e', 'r', 'm', 'i', 's', 's', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', 'R', '\013',
+'p', 'e', 'r', 'm', 'i', 's', 's', 'i', 'o', 'n', 's', '\022', 'I', '\n', '\n', 'p', 'r', 'i', 'n', 'c', 'i', 'p', 'a', 'l', 's',
+'\030', '\002', ' ', '\003', '(', '\013', '2', '\037', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a',
+'c', '.', 'v', '3', '.', 'P', 'r', 'i', 'n', 'c', 'i', 'p', 'a', 'l', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', 'R',
+'\n', 'p', 'r', 'i', 'n', 'c', 'i', 'p', 'a', 'l', 's', '\022', 'Z', '\n', '\t', 'c', 'o', 'n', 'd', 'i', 't', 'i', 'o', 'n', '\030',
+'\003', ' ', '\001', '(', '\013', '2', '\036', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'a', 'p', 'i', '.', 'e', 'x', 'p', 'r', '.', 'v',
+'1', 'a', 'l', 'p', 'h', 'a', '1', '.', 'E', 'x', 'p', 'r', 'B', '\034', '\362', '\230', '\376', '\217', '\005', '\026', '\022', '\024', 'e', 'x', 'p',
+'r', 'e', 's', 's', 'i', 'o', 'n', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', 'R', '\t', 'c', 'o', 'n', 'd', 'i', 't',
+'i', 'o', 'n', '\022', 'p', '\n', '\021', 'c', 'h', 'e', 'c', 'k', 'e', 'd', '_', 'c', 'o', 'n', 'd', 'i', 't', 'i', 'o', 'n', '\030',
+'\004', ' ', '\001', '(', '\013', '2', '%', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'a', 'p', 'i', '.', 'e', 'x', 'p', 'r', '.', 'v',
+'1', 'a', 'l', 'p', 'h', 'a', '1', '.', 'C', 'h', 'e', 'c', 'k', 'e', 'd', 'E', 'x', 'p', 'r', 'B', '\034', '\362', '\230', '\376', '\217',
+'\005', '\026', '\022', '\024', 'e', 'x', 'p', 'r', 'e', 's', 's', 'i', 'o', 'n', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', 'R',
+'\020', 'c', 'h', 'e', 'c', 'k', 'e', 'd', 'C', 'o', 'n', 'd', 'i', 't', 'i', 'o', 'n', ':', '\"', '\232', '\305', '\210', '\036', '\035', '\n',
+'\033', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c', '.', 'v', '2', '.', 'P', 'o', 'l',
+'i', 'c', 'y', '\"', '\277', '\006', '\n', '\n', 'P', 'e', 'r', 'm', 'i', 's', 's', 'i', 'o', 'n', '\022', 'C', '\n', '\t', 'a', 'n', 'd',
+'_', 'r', 'u', 'l', 'e', 's', '\030', '\001', ' ', '\001', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
+'i', 'g', '.', 'r', 'b', 'a', 'c', '.', 'v', '3', '.', 'P', 'e', 'r', 'm', 'i', 's', 's', 'i', 'o', 'n', '.', 'S', 'e', 't',
+'H', '\000', 'R', '\010', 'a', 'n', 'd', 'R', 'u', 'l', 'e', 's', '\022', 'A', '\n', '\010', 'o', 'r', '_', 'r', 'u', 'l', 'e', 's', '\030',
+'\002', ' ', '\001', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c',
+'.', 'v', '3', '.', 'P', 'e', 'r', 'm', 'i', 's', 's', 'i', 'o', 'n', '.', 'S', 'e', 't', 'H', '\000', 'R', '\007', 'o', 'r', 'R',
+'u', 'l', 'e', 's', '\022', '\033', '\n', '\003', 'a', 'n', 'y', '\030', '\003', ' ', '\001', '(', '\010', 'B', '\007', '\372', 'B', '\004', 'j', '\002', '\010',
+'\001', 'H', '\000', 'R', '\003', 'a', 'n', 'y', '\022', '>', '\n', '\006', 'h', 'e', 'a', 'd', 'e', 'r', '\030', '\004', ' ', '\001', '(', '\013', '2',
+'$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'H',
+'e', 'a', 'd', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'H', '\000', 'R', '\006', 'h', 'e', 'a', 'd', 'e', 'r', '\022', '?', '\n',
+'\010', 'u', 'r', 'l', '_', 'p', 'a', 't', 'h', '\030', '\n', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 't',
+'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'P', 'a', 't', 'h', 'M', 'a', 't', 'c', 'h', 'e',
+'r', 'H', '\000', 'R', '\007', 'u', 'r', 'l', 'P', 'a', 't', 'h', '\022', 'H', '\n', '\016', 'd', 'e', 's', 't', 'i', 'n', 'a', 't', 'i',
+'o', 'n', '_', 'i', 'p', '\030', '\005', ' ', '\001', '(', '\013', '2', '\037', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'i', 'd', 'r', 'R', 'a', 'n', 'g', 'e', 'H', '\000', 'R', '\r', 'd', 'e',
+'s', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', 'I', 'p', '\022', '6', '\n', '\020', 'd', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o',
+'n', '_', 'p', 'o', 'r', 't', '\030', '\006', ' ', '\001', '(', '\r', 'B', '\t', '\372', 'B', '\006', '*', '\004', '\030', '\377', '\377', '\003', 'H', '\000',
+'R', '\017', 'd', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', 'P', 'o', 'r', 't', '\022', 'D', '\n', '\010', 'm', 'e', 't', 'a',
+'d', 'a', 't', 'a', '\030', '\007', ' ', '\001', '(', '\013', '2', '&', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm',
+'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'M', 'a', 't', 'c', 'h', 'e', 'r',
+'H', '\000', 'R', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\022', '=', '\n', '\010', 'n', 'o', 't', '_', 'r', 'u', 'l', 'e', '\030',
+'\010', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c',
+'.', 'v', '3', '.', 'P', 'e', 'r', 'm', 'i', 's', 's', 'i', 'o', 'n', 'H', '\000', 'R', '\007', 'n', 'o', 't', 'R', 'u', 'l', 'e',
+'\022', 'Z', '\n', '\025', 'r', 'e', 'q', 'u', 'e', 's', 't', 'e', 'd', '_', 's', 'e', 'r', 'v', 'e', 'r', '_', 'n', 'a', 'm', 'e',
+'\030', '\t', ' ', '\001', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h',
+'e', 'r', '.', 'v', '3', '.', 'S', 't', 'r', 'i', 'n', 'g', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'H', '\000', 'R', '\023', 'r', 'e',
+'q', 'u', 'e', 's', 't', 'e', 'd', 'S', 'e', 'r', 'v', 'e', 'r', 'N', 'a', 'm', 'e', '\032', 's', '\n', '\003', 'S', 'e', 't', '\022',
+'@', '\n', '\005', 'r', 'u', 'l', 'e', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
+'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c', '.', 'v', '3', '.', 'P', 'e', 'r', 'm', 'i', 's', 's', 'i', 'o', 'n', 'B', '\010',
+'\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', 'R', '\005', 'r', 'u', 'l', 'e', 's', ':', '*', '\232', '\305', '\210', '\036', '%', '\n', '#', 'e',
+'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c', '.', 'v', '2', '.', 'P', 'e', 'r', 'm', 'i',
+'s', 's', 'i', 'o', 'n', '.', 'S', 'e', 't', ':', '&', '\232', '\305', '\210', '\036', '!', '\n', '\037', 'e', 'n', 'v', 'o', 'y', '.', 'c',
+'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c', '.', 'v', '2', '.', 'P', 'e', 'r', 'm', 'i', 's', 's', 'i', 'o', 'n', 'B',
+'\013', '\n', '\004', 'r', 'u', 'l', 'e', '\022', '\003', '\370', 'B', '\001', '\"', '\233', '\010', '\n', '\t', 'P', 'r', 'i', 'n', 'c', 'i', 'p', 'a',
+'l', '\022', '>', '\n', '\007', 'a', 'n', 'd', '_', 'i', 'd', 's', '\030', '\001', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o',
+'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c', '.', 'v', '3', '.', 'P', 'r', 'i', 'n', 'c', 'i', 'p', 'a',
+'l', '.', 'S', 'e', 't', 'H', '\000', 'R', '\006', 'a', 'n', 'd', 'I', 'd', 's', '\022', '<', '\n', '\006', 'o', 'r', '_', 'i', 'd', 's',
+'\030', '\002', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a',
+'c', '.', 'v', '3', '.', 'P', 'r', 'i', 'n', 'c', 'i', 'p', 'a', 'l', '.', 'S', 'e', 't', 'H', '\000', 'R', '\005', 'o', 'r', 'I',
+'d', 's', '\022', '\033', '\n', '\003', 'a', 'n', 'y', '\030', '\003', ' ', '\001', '(', '\010', 'B', '\007', '\372', 'B', '\004', 'j', '\002', '\010', '\001', 'H',
+'\000', 'R', '\003', 'a', 'n', 'y', '\022', 'U', '\n', '\r', 'a', 'u', 't', 'h', 'e', 'n', 't', 'i', 'c', 'a', 't', 'e', 'd', '\030', '\004',
+' ', '\001', '(', '\013', '2', '-', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c', '.',
+'v', '3', '.', 'P', 'r', 'i', 'n', 'c', 'i', 'p', 'a', 'l', '.', 'A', 'u', 't', 'h', 'e', 'n', 't', 'i', 'c', 'a', 't', 'e',
+'d', 'H', '\000', 'R', '\r', 'a', 'u', 't', 'h', 'e', 'n', 't', 'i', 'c', 'a', 't', 'e', 'd', '\022', 'K', '\n', '\t', 's', 'o', 'u',
+'r', 'c', 'e', '_', 'i', 'p', '\030', '\005', ' ', '\001', '(', '\013', '2', '\037', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
+'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'i', 'd', 'r', 'R', 'a', 'n', 'g', 'e', 'B', '\013', '\030', '\001', '\222',
+'\307', '\206', '\330', '\004', '\003', '3', '.', '0', 'H', '\000', 'R', '\010', 's', 'o', 'u', 'r', 'c', 'e', 'I', 'p', '\022', 'K', '\n', '\020', 'd',
+'i', 'r', 'e', 'c', 't', '_', 'r', 'e', 'm', 'o', 't', 'e', '_', 'i', 'p', '\030', '\n', ' ', '\001', '(', '\013', '2', '\037', '.', 'e',
+'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'i', 'd', 'r', 'R',
+'a', 'n', 'g', 'e', 'H', '\000', 'R', '\016', 'd', 'i', 'r', 'e', 'c', 't', 'R', 'e', 'm', 'o', 't', 'e', 'I', 'p', '\022', '>', '\n',
+'\t', 'r', 'e', 'm', 'o', 't', 'e', '_', 'i', 'p', '\030', '\013', ' ', '\001', '(', '\013', '2', '\037', '.', 'e', 'n', 'v', 'o', 'y', '.',
+'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'i', 'd', 'r', 'R', 'a', 'n', 'g', 'e', 'H',
+'\000', 'R', '\010', 'r', 'e', 'm', 'o', 't', 'e', 'I', 'p', '\022', '>', '\n', '\006', 'h', 'e', 'a', 'd', 'e', 'r', '\030', '\006', ' ', '\001',
+'(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v',
+'3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'H', '\000', 'R', '\006', 'h', 'e', 'a', 'd', 'e', 'r',
+'\022', '?', '\n', '\010', 'u', 'r', 'l', '_', 'p', 'a', 't', 'h', '\030', '\t', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o',
+'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'P', 'a', 't', 'h', 'M', 'a', 't',
+'c', 'h', 'e', 'r', 'H', '\000', 'R', '\007', 'u', 'r', 'l', 'P', 'a', 't', 'h', '\022', 'D', '\n', '\010', 'm', 'e', 't', 'a', 'd', 'a',
+'t', 'a', '\030', '\007', ' ', '\001', '(', '\013', '2', '&', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't',
+'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'H', '\000',
+'R', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\022', '8', '\n', '\006', 'n', 'o', 't', '_', 'i', 'd', '\030', '\010', ' ', '\001', '(',
+'\013', '2', '\037', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c', '.', 'v', '3', '.',
+'P', 'r', 'i', 'n', 'c', 'i', 'p', 'a', 'l', 'H', '\000', 'R', '\005', 'n', 'o', 't', 'I', 'd', '\032', 'm', '\n', '\003', 'S', 'e', 't',
+'\022', ';', '\n', '\003', 'i', 'd', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', '\037', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
+'f', 'i', 'g', '.', 'r', 'b', 'a', 'c', '.', 'v', '3', '.', 'P', 'r', 'i', 'n', 'c', 'i', 'p', 'a', 'l', 'B', '\010', '\372', 'B',
+'\005', '\222', '\001', '\002', '\010', '\001', 'R', '\003', 'i', 'd', 's', ':', ')', '\232', '\305', '\210', '\036', '$', '\n', '\"', 'e', 'n', 'v', 'o', 'y',
+'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c', '.', 'v', '2', '.', 'P', 'r', 'i', 'n', 'c', 'i', 'p', 'a', 'l',
+'.', 'S', 'e', 't', '\032', '\227', '\001', '\n', '\r', 'A', 'u', 't', 'h', 'e', 'n', 't', 'i', 'c', 'a', 't', 'e', 'd', '\022', 'K', '\n',
+'\016', 'p', 'r', 'i', 'n', 'c', 'i', 'p', 'a', 'l', '_', 'n', 'a', 'm', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '$', '.', 'e',
+'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'S', 't', 'r', 'i',
+'n', 'g', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'R', '\r', 'p', 'r', 'i', 'n', 'c', 'i', 'p', 'a', 'l', 'N', 'a', 'm', 'e', ':',
+'3', '\232', '\305', '\210', '\036', '.', '\n', ',', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c',
+'.', 'v', '2', '.', 'P', 'r', 'i', 'n', 'c', 'i', 'p', 'a', 'l', '.', 'A', 'u', 't', 'h', 'e', 'n', 't', 'i', 'c', 'a', 't',
+'e', 'd', 'J', '\004', '\010', '\001', '\020', '\002', ':', '%', '\232', '\305', '\210', '\036', ' ', '\n', '\036', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
+'n', 'f', 'i', 'g', '.', 'r', 'b', 'a', 'c', '.', 'v', '2', '.', 'P', 'r', 'i', 'n', 'c', 'i', 'p', 'a', 'l', 'B', '\021', '\n',
+'\n', 'i', 'd', 'e', 'n', 't', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', 'B', '9', '\n', '\"', 'i', 'o', '.', 'e', 'n',
+'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'b', 'a',
+'c', '.', 'v', '3', 'B', '\t', 'R', 'b', 'a', 'c', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002',
+'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[12] = {
+static upb_def_init *deps[13] = {
&envoy_config_core_v3_address_proto_upbdefinit,
&envoy_config_route_v3_route_components_proto_upbdefinit,
&envoy_type_matcher_v3_metadata_proto_upbdefinit,
@@ -175,6 +178,7 @@ static upb_def_init *deps[12] = {
&envoy_type_matcher_v3_string_proto_upbdefinit,
&google_api_expr_v1alpha1_checked_proto_upbdefinit,
&google_api_expr_v1alpha1_syntax_proto_upbdefinit,
+ &envoy_annotations_deprecation_proto_upbdefinit,
&udpa_annotations_migrate_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
&udpa_annotations_versioning_proto_upbdefinit,
@@ -186,5 +190,5 @@ upb_def_init envoy_config_rbac_v3_rbac_proto_upbdefinit = {
deps,
layouts,
"envoy/config/rbac/v3/rbac.proto",
- UPB_STRVIEW_INIT(descriptor, 3112)
+ UPB_STRVIEW_INIT(descriptor, 3158)
};
diff --git a/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c b/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c
index 8e6490aa8d..fbaacb6964 100644
--- a/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c
+++ b/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c
@@ -11,80 +11,94 @@
extern upb_def_init envoy_config_core_v3_base_proto_upbdefinit;
extern upb_def_init envoy_config_core_v3_config_source_proto_upbdefinit;
+extern upb_def_init envoy_config_core_v3_extension_proto_upbdefinit;
extern upb_def_init envoy_config_route_v3_route_components_proto_upbdefinit;
extern upb_def_init google_protobuf_wrappers_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
extern upb_def_init udpa_annotations_versioning_proto_upbdefinit;
extern upb_def_init validate_validate_proto_upbdefinit;
extern const upb_msglayout envoy_config_route_v3_RouteConfiguration_msginit;
+extern const upb_msglayout envoy_config_route_v3_ClusterSpecifierPlugin_msginit;
extern const upb_msglayout envoy_config_route_v3_Vhds_msginit;
-static const upb_msglayout *layouts[2] = {
+static const upb_msglayout *layouts[3] = {
&envoy_config_route_v3_RouteConfiguration_msginit,
+ &envoy_config_route_v3_ClusterSpecifierPlugin_msginit,
&envoy_config_route_v3_Vhds_msginit,
};
-static const char descriptor[1389] = {'\n', '!', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'r', 'o', 'u', 't', 'e', '/', 'v', '3', '/', 'r',
+static const char descriptor[1634] = {'\n', '!', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'r', 'o', 'u', 't', 'e', '/', 'v', '3', '/', 'r',
'o', 'u', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\022', '\025', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
'r', 'o', 'u', 't', 'e', '.', 'v', '3', '\032', '\037', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o',
'r', 'e', '/', 'v', '3', '/', 'b', 'a', 's', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '(', 'e', 'n', 'v', 'o', 'y', '/', 'c',
'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'o', 'u', 'r',
-'c', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', ',', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'r', 'o',
-'u', 't', 'e', '/', 'v', '3', '/', 'r', 'o', 'u', 't', 'e', '_', 'c', 'o', 'm', 'p', 'o', 'n', 'e', 'n', 't', 's', '.', 'p',
-'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a',
-'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't',
-'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a',
-'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o',
-'t', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o',
-'t', 'o', '\"', '\202', '\007', '\n', '\022', 'R', 'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n',
-'\022', '\022', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\004', 'n', 'a', 'm', 'e', '\022', 'G', '\n', '\r', 'v',
-'i', 'r', 't', 'u', 'a', 'l', '_', 'h', 'o', 's', 't', 's', '\030', '\002', ' ', '\003', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o',
-'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'V', 'i', 'r', 't', 'u', 'a', 'l',
-'H', 'o', 's', 't', 'R', '\014', 'v', 'i', 'r', 't', 'u', 'a', 'l', 'H', 'o', 's', 't', 's', '\022', '/', '\n', '\004', 'v', 'h', 'd',
-'s', '\030', '\t', ' ', '\001', '(', '\013', '2', '\033', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o',
-'u', 't', 'e', '.', 'v', '3', '.', 'V', 'h', 'd', 's', 'R', '\004', 'v', 'h', 'd', 's', '\022', 'D', '\n', '\025', 'i', 'n', 't', 'e',
-'r', 'n', 'a', 'l', '_', 'o', 'n', 'l', 'y', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\003', ' ', '\003', '(', '\t', 'B', '\020',
-'\372', 'B', '\r', '\222', '\001', '\n', '\"', '\010', 'r', '\006', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\023', 'i', 'n', 't', 'e', 'r', 'n', 'a',
-'l', 'O', 'n', 'l', 'y', 'H', 'e', 'a', 'd', 'e', 'r', 's', '\022', 'i', '\n', '\027', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_',
-'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'a', 'd', 'd', '\030', '\004', ' ', '\003', '(', '\013', '2', '\'', '.', 'e', 'n',
-'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r',
-'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i', 'o', 'n', 'B', '\t', '\372', 'B', '\006', '\222', '\001', '\003', '\020', '\350', '\007', 'R', '\024', 'r',
-'e', 's', 'p', 'o', 'n', 's', 'e', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'A', 'd', 'd', '\022', 'M', '\n', '\032', 'r', 'e',
-'s', 'p', 'o', 'n', 's', 'e', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'r', 'e', 'm', 'o', 'v', 'e', '\030',
-'\005', ' ', '\003', '(', '\t', 'B', '\020', '\372', 'B', '\r', '\222', '\001', '\n', '\"', '\010', 'r', '\006', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\027',
-'r', 'e', 's', 'p', 'o', 'n', 's', 'e', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'R', 'e', 'm', 'o', 'v', 'e', '\022', 'g',
-'\n', '\026', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'a', 'd', 'd', '\030',
-'\006', ' ', '\003', '(', '\013', '2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e',
-'.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i', 'o', 'n', 'B', '\t', '\372', 'B',
-'\006', '\222', '\001', '\003', '\020', '\350', '\007', 'R', '\023', 'r', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o',
-'A', 'd', 'd', '\022', 'K', '\n', '\031', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o',
-'_', 'r', 'e', 'm', 'o', 'v', 'e', '\030', '\010', ' ', '\003', '(', '\t', 'B', '\020', '\372', 'B', '\r', '\222', '\001', '\n', '\"', '\010', 'r', '\006',
-'\300', '\001', '\001', '\310', '\001', '\000', 'R', '\026', 'r', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'R',
-'e', 'm', 'o', 'v', 'e', '\022', 'L', '\n', '#', 'm', 'o', 's', 't', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'c', '_', 'h', 'e',
-'a', 'd', 'e', 'r', '_', 'm', 'u', 't', 'a', 't', 'i', 'o', 'n', 's', '_', 'w', 'i', 'n', 's', '\030', '\n', ' ', '\001', '(', '\010',
-'R', '\037', 'm', 'o', 's', 't', 'S', 'p', 'e', 'c', 'i', 'f', 'i', 'c', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'u', 't', 'a', 't',
-'i', 'o', 'n', 's', 'W', 'i', 'n', 's', '\022', 'G', '\n', '\021', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '_', 'c', 'l', 'u', 's',
-'t', 'e', 'r', 's', '\030', '\007', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o',
-'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\020', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', 'C', 'l',
-'u', 's', 't', 'e', 'r', 's', '\022', 'i', '\n', '#', 'm', 'a', 'x', '_', 'd', 'i', 'r', 'e', 'c', 't', '_', 'r', 'e', 's', 'p',
-'o', 'n', 's', 'e', '_', 'b', 'o', 'd', 'y', '_', 's', 'i', 'z', 'e', '_', 'b', 'y', 't', 'e', 's', '\030', '\013', ' ', '\001', '(',
-'\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3',
-'2', 'V', 'a', 'l', 'u', 'e', 'R', '\036', 'm', 'a', 'x', 'D', 'i', 'r', 'e', 'c', 't', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e',
-'B', 'o', 'd', 'y', 'S', 'i', 'z', 'e', 'B', 'y', 't', 'e', 's', ':', '&', '\232', '\305', '\210', '\036', '!', '\n', '\037', 'e', 'n', 'v',
-'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'R', 'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't',
-'i', 'o', 'n', '\"', 's', '\n', '\004', 'V', 'h', 'd', 's', '\022', 'Q', '\n', '\r', 'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'o', 'u',
-'r', 'c', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
-'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\010', '\372', 'B', '\005',
-'\212', '\001', '\002', '\020', '\001', 'R', '\014', 'c', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', ':', '\030', '\232', '\305', '\210', '\036',
-'\023', '\n', '\021', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'V', 'h', 'd', 's', 'B', ';', '\n', '#', 'i',
-'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
-'.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', 'B', '\n', 'R', 'o', 'u', 't', 'e', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200',
-'\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'c', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '$', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o',
+'r', 'e', '/', 'v', '3', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', ',', 'e', 'n',
+'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'r', 'o', 'u', 't', 'e', '/', 'v', '3', '/', 'r', 'o', 'u', 't', 'e',
+'_', 'c', 'o', 'm', 'p', 'o', 'n', 'e', 'n', 't', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e',
+'/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o', 't', 'o', '\032',
+'\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.',
+'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v',
+'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e',
+'/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\355', '\007', '\n', '\022', 'R', 'o', 'u', 't', 'e',
+'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\022', '\022', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001',
+'(', '\t', 'R', '\004', 'n', 'a', 'm', 'e', '\022', 'G', '\n', '\r', 'v', 'i', 'r', 't', 'u', 'a', 'l', '_', 'h', 'o', 's', 't', 's',
+'\030', '\002', ' ', '\003', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u',
+'t', 'e', '.', 'v', '3', '.', 'V', 'i', 'r', 't', 'u', 'a', 'l', 'H', 'o', 's', 't', 'R', '\014', 'v', 'i', 'r', 't', 'u', 'a',
+'l', 'H', 'o', 's', 't', 's', '\022', '/', '\n', '\004', 'v', 'h', 'd', 's', '\030', '\t', ' ', '\001', '(', '\013', '2', '\033', '.', 'e', 'n',
+'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'V', 'h', 'd', 's', 'R',
+'\004', 'v', 'h', 'd', 's', '\022', 'D', '\n', '\025', 'i', 'n', 't', 'e', 'r', 'n', 'a', 'l', '_', 'o', 'n', 'l', 'y', '_', 'h', 'e',
+'a', 'd', 'e', 'r', 's', '\030', '\003', ' ', '\003', '(', '\t', 'B', '\020', '\372', 'B', '\r', '\222', '\001', '\n', '\"', '\010', 'r', '\006', '\300', '\001',
+'\001', '\310', '\001', '\000', 'R', '\023', 'i', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'O', 'n', 'l', 'y', 'H', 'e', 'a', 'd', 'e', 'r', 's',
+'\022', 'i', '\n', '\027', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'a',
+'d', 'd', '\030', '\004', ' ', '\003', '(', '\013', '2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c',
+'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i', 'o', 'n', 'B',
+'\t', '\372', 'B', '\006', '\222', '\001', '\003', '\020', '\350', '\007', 'R', '\024', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', 'H', 'e', 'a', 'd', 'e',
+'r', 's', 'T', 'o', 'A', 'd', 'd', '\022', 'M', '\n', '\032', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 'h', 'e', 'a', 'd', 'e',
+'r', 's', '_', 't', 'o', '_', 'r', 'e', 'm', 'o', 'v', 'e', '\030', '\005', ' ', '\003', '(', '\t', 'B', '\020', '\372', 'B', '\r', '\222', '\001',
+'\n', '\"', '\010', 'r', '\006', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\027', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', 'H', 'e', 'a', 'd',
+'e', 'r', 's', 'T', 'o', 'R', 'e', 'm', 'o', 'v', 'e', '\022', 'g', '\n', '\026', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'h', 'e',
+'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'a', 'd', 'd', '\030', '\006', ' ', '\003', '(', '\013', '2', '\'', '.', 'e', 'n', 'v', 'o',
+'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a',
+'l', 'u', 'e', 'O', 'p', 't', 'i', 'o', 'n', 'B', '\t', '\372', 'B', '\006', '\222', '\001', '\003', '\020', '\350', '\007', 'R', '\023', 'r', 'e', 'q',
+'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'A', 'd', 'd', '\022', 'K', '\n', '\031', 'r', 'e', 'q', 'u', 'e',
+'s', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'r', 'e', 'm', 'o', 'v', 'e', '\030', '\010', ' ', '\003', '(',
+'\t', 'B', '\020', '\372', 'B', '\r', '\222', '\001', '\n', '\"', '\010', 'r', '\006', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\026', 'r', 'e', 'q', 'u',
+'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'R', 'e', 'm', 'o', 'v', 'e', '\022', 'L', '\n', '#', 'm', 'o', 's',
+'t', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'c', '_', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'm', 'u', 't', 'a', 't', 'i', 'o',
+'n', 's', '_', 'w', 'i', 'n', 's', '\030', '\n', ' ', '\001', '(', '\010', 'R', '\037', 'm', 'o', 's', 't', 'S', 'p', 'e', 'c', 'i', 'f',
+'i', 'c', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'u', 't', 'a', 't', 'i', 'o', 'n', 's', 'W', 'i', 'n', 's', '\022', 'G', '\n', '\021',
+'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '_', 'c', 'l', 'u', 's', 't', 'e', 'r', 's', '\030', '\007', ' ', '\001', '(', '\013', '2', '\032',
+'.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u',
+'e', 'R', '\020', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', 'C', 'l', 'u', 's', 't', 'e', 'r', 's', '\022', 'i', '\n', '#', 'm', 'a',
+'x', '_', 'd', 'i', 'r', 'e', 'c', 't', '_', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 'b', 'o', 'd', 'y', '_', 's', 'i',
+'z', 'e', '_', 'b', 'y', 't', 'e', 's', '\030', '\013', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p',
+'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\036', 'm', 'a', 'x', 'D',
+'i', 'r', 'e', 'c', 't', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'B', 'o', 'd', 'y', 'S', 'i', 'z', 'e', 'B', 'y', 't', 'e',
+'s', '\022', 'i', '\n', '\031', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '_', 'p', 'l',
+'u', 'g', 'i', 'n', 's', '\030', '\014', ' ', '\003', '(', '\013', '2', '-', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'S', 'p', 'e', 'c', 'i', 'f', 'i',
+'e', 'r', 'P', 'l', 'u', 'g', 'i', 'n', 'R', '\027', 'c', 'l', 'u', 's', 't', 'e', 'r', 'S', 'p', 'e', 'c', 'i', 'f', 'i', 'e',
+'r', 'P', 'l', 'u', 'g', 'i', 'n', 's', ':', '&', '\232', '\305', '\210', '\036', '!', '\n', '\037', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
+'i', '.', 'v', '2', '.', 'R', 'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\"', 'b',
+'\n', '\026', 'C', 'l', 'u', 's', 't', 'e', 'r', 'S', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', 'P', 'l', 'u', 'g', 'i', 'n', '\022',
+'H', '\n', '\t', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o',
+'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't',
+'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\t', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '\"', 's',
+'\n', '\004', 'V', 'h', 'd', 's', '\022', 'Q', '\n', '\r', 'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'o', 'u', 'r', 'c', 'e', '\030', '\001',
+' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.',
+'v', '3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001',
+'R', '\014', 'c', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', ':', '\030', '\232', '\305', '\210', '\036', '\023', '\n', '\021', 'e', 'n',
+'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'V', 'h', 'd', 's', 'B', ';', '\n', '#', 'i', 'o', '.', 'e', 'n', 'v',
+'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't',
+'e', '.', 'v', '3', 'B', '\n', 'R', 'o', 'u', 't', 'e', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020',
+'\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[8] = {
+static upb_def_init *deps[9] = {
&envoy_config_core_v3_base_proto_upbdefinit,
&envoy_config_core_v3_config_source_proto_upbdefinit,
+ &envoy_config_core_v3_extension_proto_upbdefinit,
&envoy_config_route_v3_route_components_proto_upbdefinit,
&google_protobuf_wrappers_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
@@ -97,5 +111,5 @@ upb_def_init envoy_config_route_v3_route_proto_upbdefinit = {
deps,
layouts,
"envoy/config/route/v3/route.proto",
- UPB_STRVIEW_INIT(descriptor, 1389)
+ UPB_STRVIEW_INIT(descriptor, 1634)
};
diff --git a/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h b/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h
index 30b5dd5ec3..873757f1df 100644
--- a/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h
+++ b/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h
@@ -26,6 +26,11 @@ UPB_INLINE const upb_msgdef *envoy_config_route_v3_RouteConfiguration_getmsgdef(
return upb_symtab_lookupmsg(s, "envoy.config.route.v3.RouteConfiguration");
}
+UPB_INLINE const upb_msgdef *envoy_config_route_v3_ClusterSpecifierPlugin_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &envoy_config_route_v3_route_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "envoy.config.route.v3.ClusterSpecifierPlugin");
+}
+
UPB_INLINE const upb_msgdef *envoy_config_route_v3_Vhds_getmsgdef(upb_symtab *s) {
_upb_symtab_loaddefinit(s, &envoy_config_route_v3_route_proto_upbdefinit);
return upb_symtab_lookupmsg(s, "envoy.config.route.v3.Vhds");
diff --git a/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c b/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c
index b9e231614b..dbeb8343f8 100644
--- a/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c
+++ b/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c
@@ -59,6 +59,7 @@ extern const upb_msglayout envoy_config_route_v3_RetryPolicy_RateLimitedRetryBac
extern const upb_msglayout envoy_config_route_v3_HedgePolicy_msginit;
extern const upb_msglayout envoy_config_route_v3_RedirectAction_msginit;
extern const upb_msglayout envoy_config_route_v3_DirectResponseAction_msginit;
+extern const upb_msglayout envoy_config_route_v3_NonForwardingAction_msginit;
extern const upb_msglayout envoy_config_route_v3_Decorator_msginit;
extern const upb_msglayout envoy_config_route_v3_Tracing_msginit;
extern const upb_msglayout envoy_config_route_v3_VirtualCluster_msginit;
@@ -79,7 +80,7 @@ extern const upb_msglayout envoy_config_route_v3_QueryParameterMatcher_msginit;
extern const upb_msglayout envoy_config_route_v3_InternalRedirectPolicy_msginit;
extern const upb_msglayout envoy_config_route_v3_FilterConfig_msginit;
-static const upb_msglayout *layouts[52] = {
+static const upb_msglayout *layouts[53] = {
&envoy_config_route_v3_VirtualHost_msginit,
&envoy_config_route_v3_VirtualHost_TypedPerFilterConfigEntry_msginit,
&envoy_config_route_v3_FilterAction_msginit,
@@ -113,6 +114,7 @@ static const upb_msglayout *layouts[52] = {
&envoy_config_route_v3_HedgePolicy_msginit,
&envoy_config_route_v3_RedirectAction_msginit,
&envoy_config_route_v3_DirectResponseAction_msginit,
+ &envoy_config_route_v3_NonForwardingAction_msginit,
&envoy_config_route_v3_Decorator_msginit,
&envoy_config_route_v3_Tracing_msginit,
&envoy_config_route_v3_VirtualCluster_msginit,
@@ -134,7 +136,7 @@ static const upb_msglayout *layouts[52] = {
&envoy_config_route_v3_FilterConfig_msginit,
};
-static const char descriptor[19463] = {'\n', ',', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'r', 'o', 'u', 't', 'e', '/', 'v', '3', '/', 'r',
+static const char descriptor[19924] = {'\n', ',', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'r', 'o', 'u', 't', 'e', '/', 'v', '3', '/', 'r',
'o', 'u', 't', 'e', '_', 'c', 'o', 'm', 'p', 'o', 'n', 'e', 'n', 't', 's', '.', 'p', 'r', 'o', 't', 'o', '\022', '\025', 'e', 'n',
'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '\032', '\037', 'e', 'n', 'v', 'o',
'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'b', 'a', 's', 'e', '.', 'p', 'r', 'o',
@@ -228,7 +230,7 @@ static const char descriptor[19463] = {'\n', ',', 'e', 'n', 'v', 'o', 'y', '/',
't', 'i', 'o', 'n', '\022', ',', '\n', '\006', 'a', 'c', 't', 'i', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o',
'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\006', 'a', 'c', 't', 'i', 'o', 'n',
':', '&', '\232', '\305', '\210', '\036', '!', '\n', '\037', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u',
-'t', 'e', '.', 'F', 'i', 'l', 't', 'e', 'r', 'A', 'c', 't', 'i', 'o', 'n', '\"', '\254', '\n', '\n', '\005', 'R', 'o', 'u', 't', 'e',
+'t', 'e', '.', 'F', 'i', 'l', 't', 'e', 'r', 'A', 'c', 't', 'i', 'o', 'n', '\"', '\216', '\013', '\n', '\005', 'R', 'o', 'u', 't', 'e',
'\022', '\022', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\016', ' ', '\001', '(', '\t', 'R', '\004', 'n', 'a', 'm', 'e', '\022', 'A', '\n', '\005', 'm',
'a', 't', 'c', 'h', '\030', '\001', ' ', '\001', '(', '\013', '2', '!', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
'.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h', 'B', '\010', '\372', 'B', '\005',
@@ -244,675 +246,693 @@ static const char descriptor[19463] = {'\n', ',', 'e', 'n', 'v', 'o', 'y', '/',
'o', 'n', 's', 'e', '\022', 'J', '\n', '\r', 'f', 'i', 'l', 't', 'e', 'r', '_', 'a', 'c', 't', 'i', 'o', 'n', '\030', '\021', ' ', '\001',
'(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v',
'3', '.', 'F', 'i', 'l', 't', 'e', 'r', 'A', 'c', 't', 'i', 'o', 'n', 'H', '\000', 'R', '\014', 'f', 'i', 'l', 't', 'e', 'r', 'A',
-'c', 't', 'i', 'o', 'n', '\022', ':', '\n', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030', '\004', ' ', '\001', '(', '\013', '2', '\036',
-'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'M', 'e', 't',
-'a', 'd', 'a', 't', 'a', 'R', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\022', '>', '\n', '\t', 'd', 'e', 'c', 'o', 'r', 'a',
-'t', 'o', 'r', '\030', '\005', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
-'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'D', 'e', 'c', 'o', 'r', 'a', 't', 'o', 'r', 'R', '\t', 'd', 'e', 'c', 'o', 'r',
-'a', 't', 'o', 'r', '\022', 'm', '\n', '\027', 't', 'y', 'p', 'e', 'd', '_', 'p', 'e', 'r', '_', 'f', 'i', 'l', 't', 'e', 'r', '_',
-'c', 'o', 'n', 'f', 'i', 'g', '\030', '\r', ' ', '\003', '(', '\013', '2', '6', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', '.', 'T', 'y', 'p', 'e', 'd', 'P', 'e',
-'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'E', 'n', 't', 'r', 'y', 'R', '\024', 't', 'y', 'p', 'e', 'd',
-'P', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'g', '\n', '\026', 'r', 'e', 'q', 'u', 'e', 's',
-'t', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'a', 'd', 'd', '\030', '\t', ' ', '\003', '(', '\013', '2', '\'', '.',
-'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd',
-'e', 'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i', 'o', 'n', 'B', '\t', '\372', 'B', '\006', '\222', '\001', '\003', '\020', '\350', '\007', 'R',
-'\023', 'r', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'A', 'd', 'd', '\022', 'M', '\n', '\031', 'r',
-'e', 'q', 'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'r', 'e', 'm', 'o', 'v', 'e', '\030',
-'\014', ' ', '\003', '(', '\t', 'B', '\022', '\372', 'B', '\017', '\222', '\001', '\014', '\"', '\n', 'r', '\010', '\020', '\001', '\300', '\001', '\001', '\310', '\001', '\000',
-'R', '\026', 'r', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'R', 'e', 'm', 'o', 'v', 'e', '\022',
-'i', '\n', '\027', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'a', 'd',
-'d', '\030', '\n', ' ', '\003', '(', '\013', '2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o',
-'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i', 'o', 'n', 'B', '\t',
-'\372', 'B', '\006', '\222', '\001', '\003', '\020', '\350', '\007', 'R', '\024', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', 'H', 'e', 'a', 'd', 'e', 'r',
-'s', 'T', 'o', 'A', 'd', 'd', '\022', 'O', '\n', '\032', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 'h', 'e', 'a', 'd', 'e', 'r',
-'s', '_', 't', 'o', '_', 'r', 'e', 'm', 'o', 'v', 'e', '\030', '\013', ' ', '\003', '(', '\t', 'B', '\022', '\372', 'B', '\017', '\222', '\001', '\014',
-'\"', '\n', 'r', '\010', '\020', '\001', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\027', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', 'H', 'e', 'a',
-'d', 'e', 'r', 's', 'T', 'o', 'R', 'e', 'm', 'o', 'v', 'e', '\022', '8', '\n', '\007', 't', 'r', 'a', 'c', 'i', 'n', 'g', '\030', '\017',
-' ', '\001', '(', '\013', '2', '\036', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e',
-'.', 'v', '3', '.', 'T', 'r', 'a', 'c', 'i', 'n', 'g', 'R', '\007', 't', 'r', 'a', 'c', 'i', 'n', 'g', '\022', '`', '\n', '\036', 'p',
-'e', 'r', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'b', 'u', 'f', 'f', 'e', 'r', '_', 'l', 'i', 'm', 'i', 't', '_', 'b',
-'y', 't', 'e', 's', '\030', '\020', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o',
-'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\032', 'p', 'e', 'r', 'R', 'e', 'q', 'u', 'e',
-'s', 't', 'B', 'u', 'f', 'f', 'e', 'r', 'L', 'i', 'm', 'i', 't', 'B', 'y', 't', 'e', 's', '\032', ']', '\n', '\031', 'T', 'y', 'p',
-'e', 'd', 'P', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'E', 'n', 't', 'r', 'y', '\022', '\020', '\n',
-'\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\003', 'k', 'e', 'y', '\022', '*', '\n', '\005', 'v', 'a', 'l', 'u', 'e', '\030',
-'\002', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A',
-'n', 'y', 'R', '\005', 'v', 'a', 'l', 'u', 'e', ':', '\002', '8', '\001', ':', '\037', '\232', '\305', '\210', '\036', '\032', '\n', '\030', 'e', 'n', 'v',
-'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'B', '\r', '\n', '\006',
-'a', 'c', 't', 'i', 'o', 'n', '\022', '\003', '\370', 'B', '\001', 'J', '\004', '\010', '\006', '\020', '\007', 'J', '\004', '\010', '\010', '\020', '\t', 'R', '\021',
-'p', 'e', 'r', '_', 'f', 'i', 'l', 't', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\"', '\353', '\010', '\n', '\017', 'W', 'e', 'i',
-'g', 'h', 't', 'e', 'd', 'C', 'l', 'u', 's', 't', 'e', 'r', '\022', 'Z', '\n', '\010', 'c', 'l', 'u', 's', 't', 'e', 'r', 's', '\030',
-'\001', ' ', '\003', '(', '\013', '2', '4', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't',
-'e', '.', 'v', '3', '.', 'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'l', 'u', 's',
-'t', 'e', 'r', 'W', 'e', 'i', 'g', 'h', 't', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', 'R', '\010', 'c', 'l', 'u', 's',
-'t', 'e', 'r', 's', '\022', 'H', '\n', '\014', 't', 'o', 't', 'a', 'l', '_', 'w', 'e', 'i', 'g', 'h', 't', '\030', '\003', ' ', '\001', '(',
-'\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3',
-'2', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\372', 'B', '\004', '*', '\002', '(', '\001', 'R', '\013', 't', 'o', 't', 'a', 'l', 'W', 'e', 'i',
-'g', 'h', 't', '\022', ',', '\n', '\022', 'r', 'u', 'n', 't', 'i', 'm', 'e', '_', 'k', 'e', 'y', '_', 'p', 'r', 'e', 'f', 'i', 'x',
-'\030', '\002', ' ', '\001', '(', '\t', 'R', '\020', 'r', 'u', 'n', 't', 'i', 'm', 'e', 'K', 'e', 'y', 'P', 'r', 'e', 'f', 'i', 'x', '\032',
-'\330', '\006', '\n', '\r', 'C', 'l', 'u', 's', 't', 'e', 'r', 'W', 'e', 'i', 'g', 'h', 't', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e',
-'\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '4', '\n', '\006',
-'w', 'e', 'i', 'g', 'h', 't', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o',
-'t', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\006', 'w', 'e', 'i', 'g', 'h', 't',
-'\022', 'E', '\n', '\016', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '_', 'm', 'a', 't', 'c', 'h', '\030', '\003', ' ', '\001', '(', '\013', '2',
-'\036', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'M', 'e',
-'t', 'a', 'd', 'a', 't', 'a', 'R', '\r', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', 'M', 'a', 't', 'c', 'h', '\022', 'g', '\n', '\026',
-'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'a', 'd', 'd', '\030', '\004', ' ',
-'\003', '(', '\013', '2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v',
-'3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i', 'o', 'n', 'B', '\t', '\372', 'B', '\006', '\222',
-'\001', '\003', '\020', '\350', '\007', 'R', '\023', 'r', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'A', 'd',
-'d', '\022', 'K', '\n', '\031', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'r',
-'e', 'm', 'o', 'v', 'e', '\030', '\t', ' ', '\003', '(', '\t', 'B', '\020', '\372', 'B', '\r', '\222', '\001', '\n', '\"', '\010', 'r', '\006', '\300', '\001',
-'\001', '\310', '\001', '\000', 'R', '\026', 'r', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'R', 'e', 'm',
-'o', 'v', 'e', '\022', 'i', '\n', '\027', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't',
-'o', '_', 'a', 'd', 'd', '\030', '\005', ' ', '\003', '(', '\013', '2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
-'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i',
-'o', 'n', 'B', '\t', '\372', 'B', '\006', '\222', '\001', '\003', '\020', '\350', '\007', 'R', '\024', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', 'H', 'e',
-'a', 'd', 'e', 'r', 's', 'T', 'o', 'A', 'd', 'd', '\022', 'M', '\n', '\032', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 'h', 'e',
-'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'r', 'e', 'm', 'o', 'v', 'e', '\030', '\006', ' ', '\003', '(', '\t', 'B', '\020', '\372', 'B',
-'\r', '\222', '\001', '\n', '\"', '\010', 'r', '\006', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\027', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', 'H',
-'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'R', 'e', 'm', 'o', 'v', 'e', '\022', '\205', '\001', '\n', '\027', 't', 'y', 'p', 'e', 'd', '_',
-'p', 'e', 'r', '_', 'f', 'i', 'l', 't', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\n', ' ', '\003', '(', '\013', '2', 'N',
-'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'W', 'e',
-'i', 'g', 'h', 't', 'e', 'd', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'W', 'e', 'i', 'g',
-'h', 't', '.', 'T', 'y', 'p', 'e', 'd', 'P', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'E', 'n',
-'t', 'r', 'y', 'R', '\024', 't', 'y', 'p', 'e', 'd', 'P', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g',
-'\032', ']', '\n', '\031', 'T', 'y', 'p', 'e', 'd', 'P', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'E',
-'n', 't', 'r', 'y', '\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\003', 'k', 'e', 'y', '\022', '*', '\n',
-'\005', 'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o',
-'t', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\005', 'v', 'a', 'l', 'u', 'e', ':', '\002', '8', '\001', ':', '7', '\232', '\305', '\210',
-'\036', '2', '\n', '0', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'W', 'e',
-'i', 'g', 'h', 't', 'e', 'd', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'W', 'e', 'i', 'g',
-'h', 't', 'J', '\004', '\010', '\007', '\020', '\010', 'J', '\004', '\010', '\010', '\020', '\t', 'R', '\021', 'p', 'e', 'r', '_', 'f', 'i', 'l', 't', 'e',
-'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', ':', ')', '\232', '\305', '\210', '\036', '$', '\n', '\"', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
+'c', 't', 'i', 'o', 'n', '\022', '`', '\n', '\025', 'n', 'o', 'n', '_', 'f', 'o', 'r', 'w', 'a', 'r', 'd', 'i', 'n', 'g', '_', 'a',
+'c', 't', 'i', 'o', 'n', '\030', '\022', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'N', 'o', 'n', 'F', 'o', 'r', 'w', 'a', 'r', 'd', 'i', 'n', 'g', 'A',
+'c', 't', 'i', 'o', 'n', 'H', '\000', 'R', '\023', 'n', 'o', 'n', 'F', 'o', 'r', 'w', 'a', 'r', 'd', 'i', 'n', 'g', 'A', 'c', 't',
+'i', 'o', 'n', '\022', ':', '\n', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030', '\004', ' ', '\001', '(', '\013', '2', '\036', '.', 'e',
+'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd',
+'a', 't', 'a', 'R', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\022', '>', '\n', '\t', 'd', 'e', 'c', 'o', 'r', 'a', 't', 'o',
+'r', '\030', '\005', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o',
+'u', 't', 'e', '.', 'v', '3', '.', 'D', 'e', 'c', 'o', 'r', 'a', 't', 'o', 'r', 'R', '\t', 'd', 'e', 'c', 'o', 'r', 'a', 't',
+'o', 'r', '\022', 'm', '\n', '\027', 't', 'y', 'p', 'e', 'd', '_', 'p', 'e', 'r', '_', 'f', 'i', 'l', 't', 'e', 'r', '_', 'c', 'o',
+'n', 'f', 'i', 'g', '\030', '\r', ' ', '\003', '(', '\013', '2', '6', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
+'.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', '.', 'T', 'y', 'p', 'e', 'd', 'P', 'e', 'r', 'F',
+'i', 'l', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'E', 'n', 't', 'r', 'y', 'R', '\024', 't', 'y', 'p', 'e', 'd', 'P', 'e',
+'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'g', '\n', '\026', 'r', 'e', 'q', 'u', 'e', 's', 't', '_',
+'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'a', 'd', 'd', '\030', '\t', ' ', '\003', '(', '\013', '2', '\'', '.', 'e', 'n',
+'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r',
+'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i', 'o', 'n', 'B', '\t', '\372', 'B', '\006', '\222', '\001', '\003', '\020', '\350', '\007', 'R', '\023', 'r',
+'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'A', 'd', 'd', '\022', 'M', '\n', '\031', 'r', 'e', 'q',
+'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'r', 'e', 'm', 'o', 'v', 'e', '\030', '\014', ' ',
+'\003', '(', '\t', 'B', '\022', '\372', 'B', '\017', '\222', '\001', '\014', '\"', '\n', 'r', '\010', '\020', '\001', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\026',
+'r', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'R', 'e', 'm', 'o', 'v', 'e', '\022', 'i', '\n',
+'\027', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'a', 'd', 'd', '\030',
+'\n', ' ', '\003', '(', '\013', '2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e',
+'.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i', 'o', 'n', 'B', '\t', '\372', 'B',
+'\006', '\222', '\001', '\003', '\020', '\350', '\007', 'R', '\024', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T',
+'o', 'A', 'd', 'd', '\022', 'O', '\n', '\032', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_',
+'t', 'o', '_', 'r', 'e', 'm', 'o', 'v', 'e', '\030', '\013', ' ', '\003', '(', '\t', 'B', '\022', '\372', 'B', '\017', '\222', '\001', '\014', '\"', '\n',
+'r', '\010', '\020', '\001', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\027', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', 'H', 'e', 'a', 'd', 'e',
+'r', 's', 'T', 'o', 'R', 'e', 'm', 'o', 'v', 'e', '\022', '8', '\n', '\007', 't', 'r', 'a', 'c', 'i', 'n', 'g', '\030', '\017', ' ', '\001',
+'(', '\013', '2', '\036', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v',
+'3', '.', 'T', 'r', 'a', 'c', 'i', 'n', 'g', 'R', '\007', 't', 'r', 'a', 'c', 'i', 'n', 'g', '\022', '`', '\n', '\036', 'p', 'e', 'r',
+'_', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'b', 'u', 'f', 'f', 'e', 'r', '_', 'l', 'i', 'm', 'i', 't', '_', 'b', 'y', 't',
+'e', 's', '\030', '\020', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u',
+'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\032', 'p', 'e', 'r', 'R', 'e', 'q', 'u', 'e', 's', 't',
+'B', 'u', 'f', 'f', 'e', 'r', 'L', 'i', 'm', 'i', 't', 'B', 'y', 't', 'e', 's', '\032', ']', '\n', '\031', 'T', 'y', 'p', 'e', 'd',
+'P', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'E', 'n', 't', 'r', 'y', '\022', '\020', '\n', '\003', 'k',
+'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\003', 'k', 'e', 'y', '\022', '*', '\n', '\005', 'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ',
+'\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y',
+'R', '\005', 'v', 'a', 'l', 'u', 'e', ':', '\002', '8', '\001', ':', '\037', '\232', '\305', '\210', '\036', '\032', '\n', '\030', 'e', 'n', 'v', 'o', 'y',
+'.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'B', '\r', '\n', '\006', 'a', 'c',
+'t', 'i', 'o', 'n', '\022', '\003', '\370', 'B', '\001', 'J', '\004', '\010', '\006', '\020', '\007', 'J', '\004', '\010', '\010', '\020', '\t', 'R', '\021', 'p', 'e',
+'r', '_', 'f', 'i', 'l', 't', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\"', '\306', '\t', '\n', '\017', 'W', 'e', 'i', 'g', 'h',
+'t', 'e', 'd', 'C', 'l', 'u', 's', 't', 'e', 'r', '\022', 'Z', '\n', '\010', 'c', 'l', 'u', 's', 't', 'e', 'r', 's', '\030', '\001', ' ',
+'\003', '(', '\013', '2', '4', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.',
+'v', '3', '.', 'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'l', 'u', 's', 't', 'e',
+'r', 'W', 'e', 'i', 'g', 'h', 't', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', 'R', '\010', 'c', 'l', 'u', 's', 't', 'e',
+'r', 's', '\022', 'H', '\n', '\014', 't', 'o', 't', 'a', 'l', '_', 'w', 'e', 'i', 'g', 'h', 't', '\030', '\003', ' ', '\001', '(', '\013', '2',
+'\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V',
+'a', 'l', 'u', 'e', 'B', '\007', '\372', 'B', '\004', '*', '\002', '(', '\001', 'R', '\013', 't', 'o', 't', 'a', 'l', 'W', 'e', 'i', 'g', 'h',
+'t', '\022', ',', '\n', '\022', 'r', 'u', 'n', 't', 'i', 'm', 'e', '_', 'k', 'e', 'y', '_', 'p', 'r', 'e', 'f', 'i', 'x', '\030', '\002',
+' ', '\001', '(', '\t', 'R', '\020', 'r', 'u', 'n', 't', 'i', 'm', 'e', 'K', 'e', 'y', 'P', 'r', 'e', 'f', 'i', 'x', '\032', '\263', '\007',
+'\n', '\r', 'C', 'l', 'u', 's', 't', 'e', 'r', 'W', 'e', 'i', 'g', 'h', 't', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001',
+' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '4', '\n', '\006', 'w', 'e',
+'i', 'g', 'h', 't', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o',
+'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\006', 'w', 'e', 'i', 'g', 'h', 't', '\022', 'E',
+'\n', '\016', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '_', 'm', 'a', 't', 'c', 'h', '\030', '\003', ' ', '\001', '(', '\013', '2', '\036', '.',
+'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'M', 'e', 't', 'a',
+'d', 'a', 't', 'a', 'R', '\r', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', 'M', 'a', 't', 'c', 'h', '\022', 'g', '\n', '\026', 'r', 'e',
+'q', 'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'a', 'd', 'd', '\030', '\004', ' ', '\003', '(',
+'\013', '2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.',
+'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i', 'o', 'n', 'B', '\t', '\372', 'B', '\006', '\222', '\001', '\003',
+'\020', '\350', '\007', 'R', '\023', 'r', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'A', 'd', 'd', '\022',
+'K', '\n', '\031', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'r', 'e', 'm',
+'o', 'v', 'e', '\030', '\t', ' ', '\003', '(', '\t', 'B', '\020', '\372', 'B', '\r', '\222', '\001', '\n', '\"', '\010', 'r', '\006', '\300', '\001', '\001', '\310',
+'\001', '\000', 'R', '\026', 'r', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'R', 'e', 'm', 'o', 'v',
+'e', '\022', 'i', '\n', '\027', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_',
+'a', 'd', 'd', '\030', '\005', ' ', '\003', '(', '\013', '2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
+'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i', 'o', 'n',
+'B', '\t', '\372', 'B', '\006', '\222', '\001', '\003', '\020', '\350', '\007', 'R', '\024', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', 'H', 'e', 'a', 'd',
+'e', 'r', 's', 'T', 'o', 'A', 'd', 'd', '\022', 'M', '\n', '\032', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 'h', 'e', 'a', 'd',
+'e', 'r', 's', '_', 't', 'o', '_', 'r', 'e', 'm', 'o', 'v', 'e', '\030', '\006', ' ', '\003', '(', '\t', 'B', '\020', '\372', 'B', '\r', '\222',
+'\001', '\n', '\"', '\010', 'r', '\006', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\027', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', 'H', 'e', 'a',
+'d', 'e', 'r', 's', 'T', 'o', 'R', 'e', 'm', 'o', 'v', 'e', '\022', '\205', '\001', '\n', '\027', 't', 'y', 'p', 'e', 'd', '_', 'p', 'e',
+'r', '_', 'f', 'i', 'l', 't', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\n', ' ', '\003', '(', '\013', '2', 'N', '.', 'e',
+'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'W', 'e', 'i', 'g',
+'h', 't', 'e', 'd', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'W', 'e', 'i', 'g', 'h', 't',
+'.', 'T', 'y', 'p', 'e', 'd', 'P', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'E', 'n', 't', 'r',
+'y', 'R', '\024', 't', 'y', 'p', 'e', 'd', 'P', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '?',
+'\n', '\024', 'h', 'o', 's', 't', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '_', 'l', 'i', 't', 'e', 'r', 'a', 'l', '\030', '\013', ' ',
+'\001', '(', '\t', 'B', '\013', '\372', 'B', '\010', 'r', '\006', '\300', '\001', '\002', '\310', '\001', '\000', 'H', '\000', 'R', '\022', 'h', 'o', 's', 't', 'R',
+'e', 'w', 'r', 'i', 't', 'e', 'L', 'i', 't', 'e', 'r', 'a', 'l', '\032', ']', '\n', '\031', 'T', 'y', 'p', 'e', 'd', 'P', 'e', 'r',
+'F', 'i', 'l', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'E', 'n', 't', 'r', 'y', '\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030',
+'\001', ' ', '\001', '(', '\t', 'R', '\003', 'k', 'e', 'y', '\022', '*', '\n', '\005', 'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\013',
+'2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\005', 'v',
+'a', 'l', 'u', 'e', ':', '\002', '8', '\001', ':', '7', '\232', '\305', '\210', '\036', '2', '\n', '0', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'C', 'l', 'u', 's', 't', 'e',
-'r', '\"', '\313', '\010', '\n', '\n', 'R', 'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h', '\022', '\030', '\n', '\006', 'p', 'r', 'e', 'f', 'i',
-'x', '\030', '\001', ' ', '\001', '(', '\t', 'H', '\000', 'R', '\006', 'p', 'r', 'e', 'f', 'i', 'x', '\022', '\024', '\n', '\004', 'p', 'a', 't', 'h',
-'\030', '\002', ' ', '\001', '(', '\t', 'H', '\000', 'R', '\004', 'p', 'a', 't', 'h', '\022', 'N', '\n', '\n', 's', 'a', 'f', 'e', '_', 'r', 'e',
-'g', 'e', 'x', '\030', '\n', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a',
-'t', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'R', 'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'B', '\010', '\372', 'B',
-'\005', '\212', '\001', '\002', '\020', '\001', 'H', '\000', 'R', '\t', 's', 'a', 'f', 'e', 'R', 'e', 'g', 'e', 'x', '\022', '[', '\n', '\017', 'c', 'o',
-'n', 'n', 'e', 'c', 't', '_', 'm', 'a', 't', 'c', 'h', 'e', 'r', '\030', '\014', ' ', '\001', '(', '\013', '2', '0', '.', 'e', 'n', 'v',
-'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'M',
-'a', 't', 'c', 'h', '.', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'H', '\000', 'R', '\016', 'c', 'o',
-'n', 'n', 'e', 'c', 't', 'M', 'a', 't', 'c', 'h', 'e', 'r', '\022', 'A', '\n', '\016', 'c', 'a', 's', 'e', '_', 's', 'e', 'n', 's',
-'i', 't', 'i', 'v', 'e', '\030', '\004', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't',
-'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\r', 'c', 'a', 's', 'e', 'S', 'e', 'n', 's', 'i',
-'t', 'i', 'v', 'e', '\022', 'Y', '\n', '\020', 'r', 'u', 'n', 't', 'i', 'm', 'e', '_', 'f', 'r', 'a', 'c', 't', 'i', 'o', 'n', '\030',
-'\t', ' ', '\001', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e',
-'.', 'v', '3', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'e', 'r', 'c',
-'e', 'n', 't', 'R', '\017', 'r', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', '\022', '>', '\n', '\007', 'h',
-'e', 'a', 'd', 'e', 'r', 's', '\030', '\006', ' ', '\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r',
-'R', '\007', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\022', 'W', '\n', '\020', 'q', 'u', 'e', 'r', 'y', '_', 'p', 'a', 'r', 'a', 'm', 'e',
-'t', 'e', 'r', 's', '\030', '\007', ' ', '\003', '(', '\013', '2', ',', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
-'.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'Q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 'M',
-'a', 't', 'c', 'h', 'e', 'r', 'R', '\017', 'q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 's', '\022', 'K',
-'\n', '\004', 'g', 'r', 'p', 'c', '\030', '\010', ' ', '\001', '(', '\013', '2', '7', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h', '.', 'G', 'r',
-'p', 'c', 'R', 'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h', 'O', 'p', 't', 'i', 'o', 'n', 's', 'R', '\004', 'g', 'r', 'p', 'c',
-'\022', 'Y', '\n', '\013', 't', 'l', 's', '_', 'c', 'o', 'n', 't', 'e', 'x', 't', '\030', '\013', ' ', '\001', '(', '\013', '2', '8', '.', 'e',
-'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't',
-'e', 'M', 'a', 't', 'c', 'h', '.', 'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', 'M', 'a', 't', 'c', 'h', 'O', 'p', 't',
-'i', 'o', 'n', 's', 'R', '\n', 't', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', '\032', 'S', '\n', '\025', 'G', 'r', 'p', 'c', 'R',
-'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h', 'O', 'p', 't', 'i', 'o', 'n', 's', ':', ':', '\232', '\305', '\210', '\036', '5', '\n', '3',
-'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'M',
-'a', 't', 'c', 'h', '.', 'G', 'r', 'p', 'c', 'R', 'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h', 'O', 'p', 't', 'i', 'o', 'n',
-'s', '\032', '\311', '\001', '\n', '\026', 'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', 'M', 'a', 't', 'c', 'h', 'O', 'p', 't', 'i',
-'o', 'n', 's', '\022', '8', '\n', '\t', 'p', 'r', 'e', 's', 'e', 'n', 't', 'e', 'd', '\030', '\001', ' ', '\001', '(', '\013', '2', '\032', '.',
-'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e',
-'R', '\t', 'p', 'r', 'e', 's', 'e', 'n', 't', 'e', 'd', '\022', '8', '\n', '\t', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', 'd', '\030',
-'\002', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B',
-'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\t', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', 'd', ':', ';', '\232', '\305', '\210', '\036',
-'6', '\n', '4', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u',
-'t', 'e', 'M', 'a', 't', 'c', 'h', '.', 'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', 'M', 'a', 't', 'c', 'h', 'O', 'p',
-'t', 'i', 'o', 'n', 's', '\032', '\020', '\n', '\016', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'M', 'a', 't', 'c', 'h', 'e', 'r', ':', '$',
-'\232', '\305', '\210', '\036', '\037', '\n', '\035', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e',
-'.', 'R', 'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h', 'B', '\025', '\n', '\016', 'p', 'a', 't', 'h', '_', 's', 'p', 'e', 'c', 'i',
-'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', 'J', '\004', '\010', '\005', '\020', '\006', 'J', '\004', '\010', '\003', '\020', '\004', 'R', '\005', 'r', 'e',
-'g', 'e', 'x', '\"', '\350', '\004', '\n', '\n', 'C', 'o', 'r', 's', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '_', '\n', '\031', 'a', 'l', 'l',
-'o', 'w', '_', 'o', 'r', 'i', 'g', 'i', 'n', '_', 's', 't', 'r', 'i', 'n', 'g', '_', 'm', 'a', 't', 'c', 'h', '\030', '\013', ' ',
-'\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.',
-'v', '3', '.', 'S', 't', 'r', 'i', 'n', 'g', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'R', '\026', 'a', 'l', 'l', 'o', 'w', 'O', 'r',
-'i', 'g', 'i', 'n', 'S', 't', 'r', 'i', 'n', 'g', 'M', 'a', 't', 'c', 'h', '\022', '#', '\n', '\r', 'a', 'l', 'l', 'o', 'w', '_',
-'m', 'e', 't', 'h', 'o', 'd', 's', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\014', 'a', 'l', 'l', 'o', 'w', 'M', 'e', 't', 'h', 'o',
-'d', 's', '\022', '#', '\n', '\r', 'a', 'l', 'l', 'o', 'w', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\003', ' ', '\001', '(', '\t',
-'R', '\014', 'a', 'l', 'l', 'o', 'w', 'H', 'e', 'a', 'd', 'e', 'r', 's', '\022', '%', '\n', '\016', 'e', 'x', 'p', 'o', 's', 'e', '_',
-'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\004', ' ', '\001', '(', '\t', 'R', '\r', 'e', 'x', 'p', 'o', 's', 'e', 'H', 'e', 'a', 'd',
-'e', 'r', 's', '\022', '\027', '\n', '\007', 'm', 'a', 'x', '_', 'a', 'g', 'e', '\030', '\005', ' ', '\001', '(', '\t', 'R', '\006', 'm', 'a', 'x',
-'A', 'g', 'e', '\022', 'G', '\n', '\021', 'a', 'l', 'l', 'o', 'w', '_', 'c', 'r', 'e', 'd', 'e', 'n', 't', 'i', 'a', 'l', 's', '\030',
-'\006', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B',
-'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\020', 'a', 'l', 'l', 'o', 'w', 'C', 'r', 'e', 'd', 'e', 'n', 't', 'i', 'a', 'l',
-'s', '\022', 'W', '\n', '\016', 'f', 'i', 'l', 't', 'e', 'r', '_', 'e', 'n', 'a', 'b', 'l', 'e', 'd', '\030', '\t', ' ', '\001', '(', '\013',
-'2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'R',
-'u', 'n', 't', 'i', 'm', 'e', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'H', '\000',
-'R', '\r', 'f', 'i', 'l', 't', 'e', 'r', 'E', 'n', 'a', 'b', 'l', 'e', 'd', '\022', 'U', '\n', '\016', 's', 'h', 'a', 'd', 'o', 'w',
-'_', 'e', 'n', 'a', 'b', 'l', 'e', 'd', '\030', '\n', ' ', '\001', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
+'r', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'W', 'e', 'i', 'g', 'h', 't', 'B', '\030', '\n', '\026', 'h', 'o', 's', 't', '_', 'r',
+'e', 'w', 'r', 'i', 't', 'e', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', 'J', '\004', '\010', '\007', '\020', '\010', 'J', '\004', '\010',
+'\010', '\020', '\t', 'R', '\021', 'p', 'e', 'r', '_', 'f', 'i', 'l', 't', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', ':', ')', '\232',
+'\305', '\210', '\036', '$', '\n', '\"', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.',
+'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'C', 'l', 'u', 's', 't', 'e', 'r', '\"', '\313', '\010', '\n', '\n', 'R', 'o', 'u', 't', 'e',
+'M', 'a', 't', 'c', 'h', '\022', '\030', '\n', '\006', 'p', 'r', 'e', 'f', 'i', 'x', '\030', '\001', ' ', '\001', '(', '\t', 'H', '\000', 'R', '\006',
+'p', 'r', 'e', 'f', 'i', 'x', '\022', '\024', '\n', '\004', 'p', 'a', 't', 'h', '\030', '\002', ' ', '\001', '(', '\t', 'H', '\000', 'R', '\004', 'p',
+'a', 't', 'h', '\022', 'N', '\n', '\n', 's', 'a', 'f', 'e', '_', 'r', 'e', 'g', 'e', 'x', '\030', '\n', ' ', '\001', '(', '\013', '2', '#',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'R', 'e',
+'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'H', '\000', 'R', '\t', 's',
+'a', 'f', 'e', 'R', 'e', 'g', 'e', 'x', '\022', '[', '\n', '\017', 'c', 'o', 'n', 'n', 'e', 'c', 't', '_', 'm', 'a', 't', 'c', 'h',
+'e', 'r', '\030', '\014', ' ', '\001', '(', '\013', '2', '0', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r',
+'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h', '.', 'C', 'o', 'n', 'n', 'e', 'c',
+'t', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'H', '\000', 'R', '\016', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'M', 'a', 't', 'c', 'h', 'e',
+'r', '\022', 'A', '\n', '\016', 'c', 'a', 's', 'e', '_', 's', 'e', 'n', 's', 'i', 't', 'i', 'v', 'e', '\030', '\004', ' ', '\001', '(', '\013',
+'2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a',
+'l', 'u', 'e', 'R', '\r', 'c', 'a', 's', 'e', 'S', 'e', 'n', 's', 'i', 't', 'i', 'v', 'e', '\022', 'Y', '\n', '\020', 'r', 'u', 'n',
+'t', 'i', 'm', 'e', '_', 'f', 'r', 'a', 'c', 't', 'i', 'o', 'n', '\030', '\t', ' ', '\001', '(', '\013', '2', '.', '.', 'e', 'n', 'v',
+'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e',
+'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\017', 'r', 'u', 'n', 't', 'i', 'm',
+'e', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', '\022', '>', '\n', '\007', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\006', ' ', '\003', '(',
+'\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3',
+'.', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'R', '\007', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\022', 'W',
+'\n', '\020', 'q', 'u', 'e', 'r', 'y', '_', 'p', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 's', '\030', '\007', ' ', '\003', '(', '\013', '2',
+',', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'Q',
+'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'R', '\017', 'q', 'u', 'e',
+'r', 'y', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 's', '\022', 'K', '\n', '\004', 'g', 'r', 'p', 'c', '\030', '\010', ' ', '\001', '(',
+'\013', '2', '7', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3',
+'.', 'R', 'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h', '.', 'G', 'r', 'p', 'c', 'R', 'o', 'u', 't', 'e', 'M', 'a', 't', 'c',
+'h', 'O', 'p', 't', 'i', 'o', 'n', 's', 'R', '\004', 'g', 'r', 'p', 'c', '\022', 'Y', '\n', '\013', 't', 'l', 's', '_', 'c', 'o', 'n',
+'t', 'e', 'x', 't', '\030', '\013', ' ', '\001', '(', '\013', '2', '8', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
+'.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h', '.', 'T', 'l', 's', 'C',
+'o', 'n', 't', 'e', 'x', 't', 'M', 'a', 't', 'c', 'h', 'O', 'p', 't', 'i', 'o', 'n', 's', 'R', '\n', 't', 'l', 's', 'C', 'o',
+'n', 't', 'e', 'x', 't', '\032', 'S', '\n', '\025', 'G', 'r', 'p', 'c', 'R', 'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h', 'O', 'p',
+'t', 'i', 'o', 'n', 's', ':', ':', '\232', '\305', '\210', '\036', '5', '\n', '3', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v',
+'2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h', '.', 'G', 'r', 'p', 'c', 'R', 'o',
+'u', 't', 'e', 'M', 'a', 't', 'c', 'h', 'O', 'p', 't', 'i', 'o', 'n', 's', '\032', '\311', '\001', '\n', '\026', 'T', 'l', 's', 'C', 'o',
+'n', 't', 'e', 'x', 't', 'M', 'a', 't', 'c', 'h', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', '8', '\n', '\t', 'p', 'r', 'e', 's',
+'e', 'n', 't', 'e', 'd', '\030', '\001', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't',
+'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\t', 'p', 'r', 'e', 's', 'e', 'n', 't', 'e', 'd',
+'\022', '8', '\n', '\t', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', 'd', '\030', '\002', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o',
+'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\t', 'v',
+'a', 'l', 'i', 'd', 'a', 't', 'e', 'd', ':', ';', '\232', '\305', '\210', '\036', '6', '\n', '4', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
+'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h', '.', 'T', 'l', 's',
+'C', 'o', 'n', 't', 'e', 'x', 't', 'M', 'a', 't', 'c', 'h', 'O', 'p', 't', 'i', 'o', 'n', 's', '\032', '\020', '\n', '\016', 'C', 'o',
+'n', 'n', 'e', 'c', 't', 'M', 'a', 't', 'c', 'h', 'e', 'r', ':', '$', '\232', '\305', '\210', '\036', '\037', '\n', '\035', 'e', 'n', 'v', 'o',
+'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h',
+'B', '\025', '\n', '\016', 'p', 'a', 't', 'h', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', 'J', '\004',
+'\010', '\005', '\020', '\006', 'J', '\004', '\010', '\003', '\020', '\004', 'R', '\005', 'r', 'e', 'g', 'e', 'x', '\"', '\350', '\004', '\n', '\n', 'C', 'o', 'r',
+'s', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '_', '\n', '\031', 'a', 'l', 'l', 'o', 'w', '_', 'o', 'r', 'i', 'g', 'i', 'n', '_', 's',
+'t', 'r', 'i', 'n', 'g', '_', 'm', 'a', 't', 'c', 'h', '\030', '\013', ' ', '\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y',
+'.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'S', 't', 'r', 'i', 'n', 'g', 'M', 'a',
+'t', 'c', 'h', 'e', 'r', 'R', '\026', 'a', 'l', 'l', 'o', 'w', 'O', 'r', 'i', 'g', 'i', 'n', 'S', 't', 'r', 'i', 'n', 'g', 'M',
+'a', 't', 'c', 'h', '\022', '#', '\n', '\r', 'a', 'l', 'l', 'o', 'w', '_', 'm', 'e', 't', 'h', 'o', 'd', 's', '\030', '\002', ' ', '\001',
+'(', '\t', 'R', '\014', 'a', 'l', 'l', 'o', 'w', 'M', 'e', 't', 'h', 'o', 'd', 's', '\022', '#', '\n', '\r', 'a', 'l', 'l', 'o', 'w',
+'_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\003', ' ', '\001', '(', '\t', 'R', '\014', 'a', 'l', 'l', 'o', 'w', 'H', 'e', 'a', 'd',
+'e', 'r', 's', '\022', '%', '\n', '\016', 'e', 'x', 'p', 'o', 's', 'e', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\004', ' ', '\001',
+'(', '\t', 'R', '\r', 'e', 'x', 'p', 'o', 's', 'e', 'H', 'e', 'a', 'd', 'e', 'r', 's', '\022', '\027', '\n', '\007', 'm', 'a', 'x', '_',
+'a', 'g', 'e', '\030', '\005', ' ', '\001', '(', '\t', 'R', '\006', 'm', 'a', 'x', 'A', 'g', 'e', '\022', 'G', '\n', '\021', 'a', 'l', 'l', 'o',
+'w', '_', 'c', 'r', 'e', 'd', 'e', 'n', 't', 'i', 'a', 'l', 's', '\030', '\006', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o',
+'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\020', 'a',
+'l', 'l', 'o', 'w', 'C', 'r', 'e', 'd', 'e', 'n', 't', 'i', 'a', 'l', 's', '\022', 'W', '\n', '\016', 'f', 'i', 'l', 't', 'e', 'r',
+'_', 'e', 'n', 'a', 'b', 'l', 'e', 'd', '\030', '\t', ' ', '\001', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'r', 'a', 'c', 't',
-'i', 'o', 'n', 'a', 'l', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\r', 's', 'h', 'a', 'd', 'o', 'w', 'E', 'n', 'a', 'b', 'l',
-'e', 'd', ':', '$', '\232', '\305', '\210', '\036', '\037', '\n', '\035', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r',
-'o', 'u', 't', 'e', '.', 'C', 'o', 'r', 's', 'P', 'o', 'l', 'i', 'c', 'y', 'B', '\023', '\n', '\021', 'e', 'n', 'a', 'b', 'l', 'e',
-'d', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', 'J', '\004', '\010', '\001', '\020', '\002', 'J', '\004', '\010', '\010', '\020', '\t', 'J', '\004',
-'\010', '\007', '\020', '\010', 'R', '\014', 'a', 'l', 'l', 'o', 'w', '_', 'o', 'r', 'i', 'g', 'i', 'n', 'R', '\022', 'a', 'l', 'l', 'o', 'w',
-'_', 'o', 'r', 'i', 'g', 'i', 'n', '_', 'r', 'e', 'g', 'e', 'x', 'R', '\007', 'e', 'n', 'a', 'b', 'l', 'e', 'd', '\"', '\310', '&',
-'\n', '\013', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '\022', '#', '\n', '\007', 'c', 'l', 'u', 's', 't', 'e', 'r', '\030',
-'\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'H', '\000', 'R', '\007', 'c', 'l', 'u', 's', 't', 'e', 'r',
-'\022', '6', '\n', '\016', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 'h', 'e', 'a', 'd', 'e', 'r', '\030', '\002', ' ', '\001', '(', '\t', 'B',
-'\r', '\372', 'B', '\n', 'r', '\010', '\020', '\001', '\300', '\001', '\001', '\310', '\001', '\000', 'H', '\000', 'R', '\r', 'c', 'l', 'u', 's', 't', 'e', 'r',
-'H', 'e', 'a', 'd', 'e', 'r', '\022', 'U', '\n', '\021', 'w', 'e', 'i', 'g', 'h', 't', 'e', 'd', '_', 'c', 'l', 'u', 's', 't', 'e',
-'r', 's', '\030', '\003', ' ', '\001', '(', '\013', '2', '&', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r',
-'o', 'u', 't', 'e', '.', 'v', '3', '.', 'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'C', 'l', 'u', 's', 't', 'e', 'r', 'H', '\000',
-'R', '\020', 'w', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'C', 'l', 'u', 's', 't', 'e', 'r', 's', '\022', '\216', '\001', '\n', '\037', 'c', 'l',
-'u', 's', 't', 'e', 'r', '_', 'n', 'o', 't', '_', 'f', 'o', 'u', 'n', 'd', '_', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_',
-'c', 'o', 'd', 'e', '\030', '\024', ' ', '\001', '(', '\016', '2', '>', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
-'.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'C', 'l', 'u',
-'s', 't', 'e', 'r', 'N', 'o', 't', 'F', 'o', 'u', 'n', 'd', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'C', 'o', 'd', 'e', 'B',
-'\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\033', 'c', 'l', 'u', 's', 't', 'e', 'r', 'N', 'o', 't', 'F', 'o', 'u', 'n',
-'d', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'C', 'o', 'd', 'e', '\022', 'E', '\n', '\016', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a',
-'_', 'm', 'a', 't', 'c', 'h', '\030', '\004', ' ', '\001', '(', '\013', '2', '\036', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'R', '\r', 'm', 'e', 't', 'a',
-'d', 'a', 't', 'a', 'M', 'a', 't', 'c', 'h', '\022', '2', '\n', '\016', 'p', 'r', 'e', 'f', 'i', 'x', '_', 'r', 'e', 'w', 'r', 'i',
-'t', 'e', '\030', '\005', ' ', '\001', '(', '\t', 'B', '\013', '\372', 'B', '\010', 'r', '\006', '\300', '\001', '\002', '\310', '\001', '\000', 'R', '\r', 'p', 'r',
-'e', 'f', 'i', 'x', 'R', 'e', 'w', 'r', 'i', 't', 'e', '\022', 'S', '\n', '\r', 'r', 'e', 'g', 'e', 'x', '_', 'r', 'e', 'w', 'r',
-'i', 't', 'e', '\030', ' ', ' ', '\001', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a',
-'t', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'R', 'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'A', 'n', 'd', 'S', 'u', 'b',
-'s', 't', 'i', 't', 'u', 't', 'e', 'R', '\014', 'r', 'e', 'g', 'e', 'x', 'R', 'e', 'w', 'r', 'i', 't', 'e', '\022', '?', '\n', '\024',
-'h', 'o', 's', 't', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '_', 'l', 'i', 't', 'e', 'r', 'a', 'l', '\030', '\006', ' ', '\001', '(',
-'\t', 'B', '\013', '\372', 'B', '\010', 'r', '\006', '\300', '\001', '\002', '\310', '\001', '\000', 'H', '\001', 'R', '\022', 'h', 'o', 's', 't', 'R', 'e', 'w',
-'r', 'i', 't', 'e', 'L', 'i', 't', 'e', 'r', 'a', 'l', '\022', 'H', '\n', '\021', 'a', 'u', 't', 'o', '_', 'h', 'o', 's', 't', '_',
-'r', 'e', 'w', 'r', 'i', 't', 'e', '\030', '\007', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r',
-'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'H', '\001', 'R', '\017', 'a', 'u', 't', 'o', 'H',
-'o', 's', 't', 'R', 'e', 'w', 'r', 'i', 't', 'e', '\022', '=', '\n', '\023', 'h', 'o', 's', 't', '_', 'r', 'e', 'w', 'r', 'i', 't',
-'e', '_', 'h', 'e', 'a', 'd', 'e', 'r', '\030', '\035', ' ', '\001', '(', '\t', 'B', '\013', '\372', 'B', '\010', 'r', '\006', '\300', '\001', '\001', '\310',
-'\001', '\000', 'H', '\001', 'R', '\021', 'h', 'o', 's', 't', 'R', 'e', 'w', 'r', 'i', 't', 'e', 'H', 'e', 'a', 'd', 'e', 'r', '\022', 'g',
-'\n', '\027', 'h', 'o', 's', 't', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '_', 'p', 'a', 't', 'h', '_', 'r', 'e', 'g', 'e', 'x',
-'\030', '#', ' ', '\001', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h',
-'e', 'r', '.', 'v', '3', '.', 'R', 'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'A', 'n', 'd', 'S', 'u', 'b', 's', 't', 'i',
-'t', 'u', 't', 'e', 'H', '\001', 'R', '\024', 'h', 'o', 's', 't', 'R', 'e', 'w', 'r', 'i', 't', 'e', 'P', 'a', 't', 'h', 'R', 'e',
-'g', 'e', 'x', '\022', '3', '\n', '\007', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\010', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o',
-'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\007', 't',
-'i', 'm', 'e', 'o', 'u', 't', '\022', '<', '\n', '\014', 'i', 'd', 'l', 'e', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\030', ' ',
-'\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r',
-'a', 't', 'i', 'o', 'n', 'R', '\013', 'i', 'd', 'l', 'e', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'E', '\n', '\014', 'r', 'e', 't',
-'r', 'y', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\t', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
-'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c',
-'y', 'R', '\013', 'r', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'O', '\n', '\031', 'r', 'e', 't', 'r', 'y', '_', 'p',
-'o', 'l', 'i', 'c', 'y', '_', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '!', ' ', '\001', '(', '\013', '2',
-'\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\026', 'r', 'e',
-'t', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', 'T', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'n', '\n', '\027', 'r',
-'e', 'q', 'u', 'e', 's', 't', '_', 'm', 'i', 'r', 'r', 'o', 'r', '_', 'p', 'o', 'l', 'i', 'c', 'i', 'e', 's', '\030', '\036', ' ',
-'\003', '(', '\013', '2', '6', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.',
-'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'R', 'e', 'q', 'u', 'e', 's', 't', 'M', 'i', 'r',
-'r', 'o', 'r', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\025', 'r', 'e', 'q', 'u', 'e', 's', 't', 'M', 'i', 'r', 'r', 'o', 'r', 'P',
-'o', 'l', 'i', 'c', 'i', 'e', 's', '\022', 'K', '\n', '\010', 'p', 'r', 'i', 'o', 'r', 'i', 't', 'y', '\030', '\013', ' ', '\001', '(', '\016',
-'2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'R',
-'o', 'u', 't', 'i', 'n', 'g', 'P', 'r', 'i', 'o', 'r', 'i', 't', 'y', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R',
-'\010', 'p', 'r', 'i', 'o', 'r', 'i', 't', 'y', '\022', 'A', '\n', '\013', 'r', 'a', 't', 'e', '_', 'l', 'i', 'm', 'i', 't', 's', '\030',
-'\r', ' ', '\003', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't',
-'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', 'R', '\n', 'r', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't',
-'s', '\022', 'S', '\n', '\026', 'i', 'n', 'c', 'l', 'u', 'd', 'e', '_', 'v', 'h', '_', 'r', 'a', 't', 'e', '_', 'l', 'i', 'm', 'i',
-'t', 's', '\030', '\016', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u',
-'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'B', '\002', '\030', '\001', 'R', '\023', 'i', 'n', 'c', 'l', 'u', 'd', 'e', 'V',
-'h', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', 's', '\022', 'N', '\n', '\013', 'h', 'a', 's', 'h', '_', 'p', 'o', 'l', 'i', 'c',
-'y', '\030', '\017', ' ', '\003', '(', '\013', '2', '-', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o',
-'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P', 'o',
-'l', 'i', 'c', 'y', 'R', '\n', 'h', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '5', '\n', '\004', 'c', 'o', 'r', 's', '\030',
-'\021', ' ', '\001', '(', '\013', '2', '!', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't',
-'e', '.', 'v', '3', '.', 'C', 'o', 'r', 's', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\004', 'c', 'o', 'r', 's', '\022', 'G', '\n', '\020',
-'m', 'a', 'x', '_', 'g', 'r', 'p', 'c', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\027', ' ', '\001', '(', '\013', '2', '\031', '.',
-'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B',
-'\002', '\030', '\001', 'R', '\016', 'm', 'a', 'x', 'G', 'r', 'p', 'c', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'M', '\n', '\023', 'g', 'r',
-'p', 'c', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '_', 'o', 'f', 'f', 's', 'e', 't', '\030', '\034', ' ', '\001', '(', '\013', '2', '\031',
-'.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n',
-'B', '\002', '\030', '\001', 'R', '\021', 'g', 'r', 'p', 'c', 'T', 'i', 'm', 'e', 'o', 'u', 't', 'O', 'f', 'f', 's', 'e', 't', '\022', 'Y',
-'\n', '\017', 'u', 'p', 'g', 'r', 'a', 'd', 'e', '_', 'c', 'o', 'n', 'f', 'i', 'g', 's', '\030', '\031', ' ', '\003', '(', '\013', '2', '0',
+'i', 'o', 'n', 'a', 'l', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'H', '\000', 'R', '\r', 'f', 'i', 'l', 't', 'e', 'r', 'E', 'n', 'a',
+'b', 'l', 'e', 'd', '\022', 'U', '\n', '\016', 's', 'h', 'a', 'd', 'o', 'w', '_', 'e', 'n', 'a', 'b', 'l', 'e', 'd', '\030', '\n', ' ',
+'\001', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v',
+'3', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'e', 'r', 'c', 'e', 'n',
+'t', 'R', '\r', 's', 'h', 'a', 'd', 'o', 'w', 'E', 'n', 'a', 'b', 'l', 'e', 'd', ':', '$', '\232', '\305', '\210', '\036', '\037', '\n', '\035',
+'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'C', 'o', 'r', 's', 'P', 'o',
+'l', 'i', 'c', 'y', 'B', '\023', '\n', '\021', 'e', 'n', 'a', 'b', 'l', 'e', 'd', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r',
+'J', '\004', '\010', '\001', '\020', '\002', 'J', '\004', '\010', '\010', '\020', '\t', 'J', '\004', '\010', '\007', '\020', '\010', 'R', '\014', 'a', 'l', 'l', 'o', 'w',
+'_', 'o', 'r', 'i', 'g', 'i', 'n', 'R', '\022', 'a', 'l', 'l', 'o', 'w', '_', 'o', 'r', 'i', 'g', 'i', 'n', '_', 'r', 'e', 'g',
+'e', 'x', 'R', '\007', 'e', 'n', 'a', 'b', 'l', 'e', 'd', '\"', '\262', '\'', '\n', '\013', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i',
+'o', 'n', '\022', '#', '\n', '\007', 'c', 'l', 'u', 's', 't', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r',
+'\002', '\020', '\001', 'H', '\000', 'R', '\007', 'c', 'l', 'u', 's', 't', 'e', 'r', '\022', '6', '\n', '\016', 'c', 'l', 'u', 's', 't', 'e', 'r',
+'_', 'h', 'e', 'a', 'd', 'e', 'r', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\r', '\372', 'B', '\n', 'r', '\010', '\020', '\001', '\300', '\001', '\001',
+'\310', '\001', '\000', 'H', '\000', 'R', '\r', 'c', 'l', 'u', 's', 't', 'e', 'r', 'H', 'e', 'a', 'd', 'e', 'r', '\022', 'U', '\n', '\021', 'w',
+'e', 'i', 'g', 'h', 't', 'e', 'd', '_', 'c', 'l', 'u', 's', 't', 'e', 'r', 's', '\030', '\003', ' ', '\001', '(', '\013', '2', '&', '.',
+'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'W', 'e', 'i',
+'g', 'h', 't', 'e', 'd', 'C', 'l', 'u', 's', 't', 'e', 'r', 'H', '\000', 'R', '\020', 'w', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'C',
+'l', 'u', 's', 't', 'e', 'r', 's', '\022', ':', '\n', '\030', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 's', 'p', 'e', 'c', 'i', 'f',
+'i', 'e', 'r', '_', 'p', 'l', 'u', 'g', 'i', 'n', '\030', '%', ' ', '\001', '(', '\t', 'H', '\000', 'R', '\026', 'c', 'l', 'u', 's', 't',
+'e', 'r', 'S', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', 'P', 'l', 'u', 'g', 'i', 'n', '\022', '\216', '\001', '\n', '\037', 'c', 'l', 'u',
+'s', 't', 'e', 'r', '_', 'n', 'o', 't', '_', 'f', 'o', 'u', 'n', 'd', '_', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 'c',
+'o', 'd', 'e', '\030', '\024', ' ', '\001', '(', '\016', '2', '>', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
+'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'C', 'l', 'u', 's',
+'t', 'e', 'r', 'N', 'o', 't', 'F', 'o', 'u', 'n', 'd', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'C', 'o', 'd', 'e', 'B', '\010',
+'\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\033', 'c', 'l', 'u', 's', 't', 'e', 'r', 'N', 'o', 't', 'F', 'o', 'u', 'n', 'd',
+'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'C', 'o', 'd', 'e', '\022', 'E', '\n', '\016', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '_',
+'m', 'a', 't', 'c', 'h', '\030', '\004', ' ', '\001', '(', '\013', '2', '\036', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'R', '\r', 'm', 'e', 't', 'a', 'd',
+'a', 't', 'a', 'M', 'a', 't', 'c', 'h', '\022', '2', '\n', '\016', 'p', 'r', 'e', 'f', 'i', 'x', '_', 'r', 'e', 'w', 'r', 'i', 't',
+'e', '\030', '\005', ' ', '\001', '(', '\t', 'B', '\013', '\372', 'B', '\010', 'r', '\006', '\300', '\001', '\002', '\310', '\001', '\000', 'R', '\r', 'p', 'r', 'e',
+'f', 'i', 'x', 'R', 'e', 'w', 'r', 'i', 't', 'e', '\022', 'S', '\n', '\r', 'r', 'e', 'g', 'e', 'x', '_', 'r', 'e', 'w', 'r', 'i',
+'t', 'e', '\030', ' ', ' ', '\001', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't',
+'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'R', 'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'A', 'n', 'd', 'S', 'u', 'b', 's',
+'t', 'i', 't', 'u', 't', 'e', 'R', '\014', 'r', 'e', 'g', 'e', 'x', 'R', 'e', 'w', 'r', 'i', 't', 'e', '\022', '?', '\n', '\024', 'h',
+'o', 's', 't', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '_', 'l', 'i', 't', 'e', 'r', 'a', 'l', '\030', '\006', ' ', '\001', '(', '\t',
+'B', '\013', '\372', 'B', '\010', 'r', '\006', '\300', '\001', '\002', '\310', '\001', '\000', 'H', '\001', 'R', '\022', 'h', 'o', 's', 't', 'R', 'e', 'w', 'r',
+'i', 't', 'e', 'L', 'i', 't', 'e', 'r', 'a', 'l', '\022', 'H', '\n', '\021', 'a', 'u', 't', 'o', '_', 'h', 'o', 's', 't', '_', 'r',
+'e', 'w', 'r', 'i', 't', 'e', '\030', '\007', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o',
+'t', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'H', '\001', 'R', '\017', 'a', 'u', 't', 'o', 'H', 'o',
+'s', 't', 'R', 'e', 'w', 'r', 'i', 't', 'e', '\022', '=', '\n', '\023', 'h', 'o', 's', 't', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e',
+'_', 'h', 'e', 'a', 'd', 'e', 'r', '\030', '\035', ' ', '\001', '(', '\t', 'B', '\013', '\372', 'B', '\010', 'r', '\006', '\300', '\001', '\001', '\310', '\001',
+'\000', 'H', '\001', 'R', '\021', 'h', 'o', 's', 't', 'R', 'e', 'w', 'r', 'i', 't', 'e', 'H', 'e', 'a', 'd', 'e', 'r', '\022', 'g', '\n',
+'\027', 'h', 'o', 's', 't', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '_', 'p', 'a', 't', 'h', '_', 'r', 'e', 'g', 'e', 'x', '\030',
+'#', ' ', '\001', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e',
+'r', '.', 'v', '3', '.', 'R', 'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'A', 'n', 'd', 'S', 'u', 'b', 's', 't', 'i', 't',
+'u', 't', 'e', 'H', '\001', 'R', '\024', 'h', 'o', 's', 't', 'R', 'e', 'w', 'r', 'i', 't', 'e', 'P', 'a', 't', 'h', 'R', 'e', 'g',
+'e', 'x', '\022', '3', '\n', '\007', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\010', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o',
+'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\007', 't', 'i',
+'m', 'e', 'o', 'u', 't', '\022', '<', '\n', '\014', 'i', 'd', 'l', 'e', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\030', ' ', '\001',
+'(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a',
+'t', 'i', 'o', 'n', 'R', '\013', 'i', 'd', 'l', 'e', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'E', '\n', '\014', 'r', 'e', 't', 'r',
+'y', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\t', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
+'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y',
+'R', '\013', 'r', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'O', '\n', '\031', 'r', 'e', 't', 'r', 'y', '_', 'p', 'o',
+'l', 'i', 'c', 'y', '_', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '!', ' ', '\001', '(', '\013', '2', '\024',
+'.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\026', 'r', 'e', 't',
+'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', 'T', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'n', '\n', '\027', 'r', 'e',
+'q', 'u', 'e', 's', 't', '_', 'm', 'i', 'r', 'r', 'o', 'r', '_', 'p', 'o', 'l', 'i', 'c', 'i', 'e', 's', '\030', '\036', ' ', '\003',
+'(', '\013', '2', '6', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v',
+'3', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'R', 'e', 'q', 'u', 'e', 's', 't', 'M', 'i', 'r', 'r',
+'o', 'r', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\025', 'r', 'e', 'q', 'u', 'e', 's', 't', 'M', 'i', 'r', 'r', 'o', 'r', 'P', 'o',
+'l', 'i', 'c', 'i', 'e', 's', '\022', 'K', '\n', '\010', 'p', 'r', 'i', 'o', 'r', 'i', 't', 'y', '\030', '\013', ' ', '\001', '(', '\016', '2',
+'%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'R', 'o',
+'u', 't', 'i', 'n', 'g', 'P', 'r', 'i', 'o', 'r', 'i', 't', 'y', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\010',
+'p', 'r', 'i', 'o', 'r', 'i', 't', 'y', '\022', 'A', '\n', '\013', 'r', 'a', 't', 'e', '_', 'l', 'i', 'm', 'i', 't', 's', '\030', '\r',
+' ', '\003', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e',
+'.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', 'R', '\n', 'r', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', 's',
+'\022', '\\', '\n', '\026', 'i', 'n', 'c', 'l', 'u', 'd', 'e', '_', 'v', 'h', '_', 'r', 'a', 't', 'e', '_', 'l', 'i', 'm', 'i', 't',
+'s', '\030', '\016', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
+'.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'B', '\013', '\030', '\001', '\222', '\307', '\206', '\330', '\004', '\003', '3', '.', '0', 'R', '\023',
+'i', 'n', 'c', 'l', 'u', 'd', 'e', 'V', 'h', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', 's', '\022', 'N', '\n', '\013', 'h', 'a',
+'s', 'h', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\017', ' ', '\003', '(', '\013', '2', '-', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
+'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o',
+'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\n', 'h', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '\022',
+'5', '\n', '\004', 'c', 'o', 'r', 's', '\030', '\021', ' ', '\001', '(', '\013', '2', '!', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
+'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'C', 'o', 'r', 's', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\004',
+'c', 'o', 'r', 's', '\022', 'P', '\n', '\020', 'm', 'a', 'x', '_', 'g', 'r', 'p', 'c', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030',
+'\027', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D',
+'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\013', '\030', '\001', '\222', '\307', '\206', '\330', '\004', '\003', '3', '.', '0', 'R', '\016', 'm', 'a', 'x',
+'G', 'r', 'p', 'c', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'V', '\n', '\023', 'g', 'r', 'p', 'c', '_', 't', 'i', 'm', 'e', 'o',
+'u', 't', '_', 'o', 'f', 'f', 's', 'e', 't', '\030', '\034', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.',
+'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\013', '\030', '\001', '\222', '\307', '\206', '\330',
+'\004', '\003', '3', '.', '0', 'R', '\021', 'g', 'r', 'p', 'c', 'T', 'i', 'm', 'e', 'o', 'u', 't', 'O', 'f', 'f', 's', 'e', 't', '\022',
+'Y', '\n', '\017', 'u', 'p', 'g', 'r', 'a', 'd', 'e', '_', 'c', 'o', 'n', 'f', 'i', 'g', 's', '\030', '\031', ' ', '\003', '(', '\013', '2',
+'0', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R',
+'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'U', 'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'R',
+'\016', 'u', 'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 's', '\022', 'g', '\n', '\030', 'i', 'n', 't', 'e', 'r', 'n',
+'a', 'l', '_', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\"', ' ', '\001', '(', '\013', '2',
+'-', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'I',
+'n', 't', 'e', 'r', 'n', 'a', 'l', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\026', 'i', 'n',
+'t', 'e', 'r', 'n', 'a', 'l', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '\200', '\001', '\n', '\030',
+'i', 'n', 't', 'e', 'r', 'n', 'a', 'l', '_', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '_', 'a', 'c', 't', 'i', 'o', 'n', '\030',
+'\032', ' ', '\001', '(', '\016', '2', '9', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't',
+'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l',
+'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'A', 'c', 't', 'i', 'o', 'n', 'B', '\013', '\030', '\001', '\222', '\307', '\206', '\330', '\004', '\003', '3',
+'.', '0', 'R', '\026', 'i', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'A', 'c', 't', 'i', 'o',
+'n', '\022', '_', '\n', '\026', 'm', 'a', 'x', '_', 'i', 'n', 't', 'e', 'r', 'n', 'a', 'l', '_', 'r', 'e', 'd', 'i', 'r', 'e', 'c',
+'t', 's', '\030', '\037', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u',
+'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\013', '\030', '\001', '\222', '\307', '\206', '\330', '\004', '\003', '3', '.',
+'0', 'R', '\024', 'm', 'a', 'x', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 's', '\022', 'E',
+'\n', '\014', 'h', 'e', 'd', 'g', 'e', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\033', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n',
+'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'H', 'e', 'd', 'g', 'e',
+'P', 'o', 'l', 'i', 'c', 'y', 'R', '\013', 'h', 'e', 'd', 'g', 'e', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'd', '\n', '\023', 'm', 'a',
+'x', '_', 's', 't', 'r', 'e', 'a', 'm', '_', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\030', '$', ' ', '\001', '(', '\013', '2', '4',
'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o',
-'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'U', 'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\016',
-'u', 'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 's', '\022', 'g', '\n', '\030', 'i', 'n', 't', 'e', 'r', 'n', 'a',
-'l', '_', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\"', ' ', '\001', '(', '\013', '2', '-',
-'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'I', 'n',
-'t', 'e', 'r', 'n', 'a', 'l', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\026', 'i', 'n', 't',
-'e', 'r', 'n', 'a', 'l', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'w', '\n', '\030', 'i', 'n',
-'t', 'e', 'r', 'n', 'a', 'l', '_', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '_', 'a', 'c', 't', 'i', 'o', 'n', '\030', '\032', ' ',
-'\001', '(', '\016', '2', '9', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.',
-'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'R', 'e',
-'d', 'i', 'r', 'e', 'c', 't', 'A', 'c', 't', 'i', 'o', 'n', 'B', '\002', '\030', '\001', 'R', '\026', 'i', 'n', 't', 'e', 'r', 'n', 'a',
-'l', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'A', 'c', 't', 'i', 'o', 'n', '\022', 'V', '\n', '\026', 'm', 'a', 'x', '_', 'i', 'n',
-'t', 'e', 'r', 'n', 'a', 'l', '_', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', 's', '\030', '\037', ' ', '\001', '(', '\013', '2', '\034', '.',
-'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l',
-'u', 'e', 'B', '\002', '\030', '\001', 'R', '\024', 'm', 'a', 'x', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'R', 'e', 'd', 'i', 'r', 'e',
-'c', 't', 's', '\022', 'E', '\n', '\014', 'h', 'e', 'd', 'g', 'e', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\033', ' ', '\001', '(', '\013',
-'2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.',
-'H', 'e', 'd', 'g', 'e', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\013', 'h', 'e', 'd', 'g', 'e', 'P', 'o', 'l', 'i', 'c', 'y', '\022',
-'d', '\n', '\023', 'm', 'a', 'x', '_', 's', 't', 'r', 'e', 'a', 'm', '_', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\030', '$', ' ',
-'\001', '(', '\013', '2', '4', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.',
-'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'M', 'a', 'x', 'S', 't', 'r', 'e', 'a', 'm', 'D',
-'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\021', 'm', 'a', 'x', 'S', 't', 'r', 'e', 'a', 'm', 'D', 'u', 'r', 'a', 't', 'i', 'o',
-'n', '\032', '\242', '\002', '\n', '\023', 'R', 'e', 'q', 'u', 'e', 's', 't', 'M', 'i', 'r', 'r', 'o', 'r', 'P', 'o', 'l', 'i', 'c', 'y',
-'\022', '!', '\n', '\007', 'c', 'l', 'u', 's', 't', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020',
-'\001', 'R', '\007', 'c', 'l', 'u', 's', 't', 'e', 'r', '\022', 'Y', '\n', '\020', 'r', 'u', 'n', 't', 'i', 'm', 'e', '_', 'f', 'r', 'a',
-'c', 't', 'i', 'o', 'n', '\030', '\003', ' ', '\001', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
-'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n',
-'a', 'l', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\017', 'r', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'r', 'a', 'c', 't', 'i', 'o',
-'n', '\022', '?', '\n', '\r', 't', 'r', 'a', 'c', 'e', '_', 's', 'a', 'm', 'p', 'l', 'e', 'd', '\030', '\004', ' ', '\001', '(', '\013', '2',
-'\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l',
-'u', 'e', 'R', '\014', 't', 'r', 'a', 'c', 'e', 'S', 'a', 'm', 'p', 'l', 'e', 'd', ':', '9', '\232', '\305', '\210', '\036', '4', '\n', '2',
-'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'A',
-'c', 't', 'i', 'o', 'n', '.', 'R', 'e', 'q', 'u', 'e', 's', 't', 'M', 'i', 'r', 'r', 'o', 'r', 'P', 'o', 'l', 'i', 'c', 'y',
-'J', '\004', '\010', '\002', '\020', '\003', 'R', '\013', 'r', 'u', 'n', 't', 'i', 'm', 'e', '_', 'k', 'e', 'y', '\032', '\226', '\n', '\n', '\n', 'H',
-'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'N', '\n', '\006', 'h', 'e', 'a', 'd', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\013',
+'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'M', 'a', 'x', 'S', 't', 'r', 'e', 'a', 'm', 'D', 'u', 'r', 'a', 't', 'i',
+'o', 'n', 'R', '\021', 'm', 'a', 'x', 'S', 't', 'r', 'e', 'a', 'm', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\032', '\242', '\002', '\n',
+'\023', 'R', 'e', 'q', 'u', 'e', 's', 't', 'M', 'i', 'r', 'r', 'o', 'r', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '!', '\n', '\007', 'c',
+'l', 'u', 's', 't', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\007', 'c', 'l',
+'u', 's', 't', 'e', 'r', '\022', 'Y', '\n', '\020', 'r', 'u', 'n', 't', 'i', 'm', 'e', '_', 'f', 'r', 'a', 'c', 't', 'i', 'o', 'n',
+'\030', '\003', ' ', '\001', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r',
+'e', '.', 'v', '3', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'e', 'r',
+'c', 'e', 'n', 't', 'R', '\017', 'r', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', '\022', '?', '\n', '\r',
+'t', 'r', 'a', 'c', 'e', '_', 's', 'a', 'm', 'p', 'l', 'e', 'd', '\030', '\004', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o',
+'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\014', 't',
+'r', 'a', 'c', 'e', 'S', 'a', 'm', 'p', 'l', 'e', 'd', ':', '9', '\232', '\305', '\210', '\036', '4', '\n', '2', 'e', 'n', 'v', 'o', 'y',
+'.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n',
+'.', 'R', 'e', 'q', 'u', 'e', 's', 't', 'M', 'i', 'r', 'r', 'o', 'r', 'P', 'o', 'l', 'i', 'c', 'y', 'J', '\004', '\010', '\002', '\020',
+'\003', 'R', '\013', 'r', 'u', 'n', 't', 'i', 'm', 'e', '_', 'k', 'e', 'y', '\032', '\226', '\n', '\n', '\n', 'H', 'a', 's', 'h', 'P', 'o',
+'l', 'i', 'c', 'y', '\022', 'N', '\n', '\006', 'h', 'e', 'a', 'd', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\013', '2', '4', '.', 'e', 'n',
+'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e',
+'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'H',
+'\000', 'R', '\006', 'h', 'e', 'a', 'd', 'e', 'r', '\022', 'N', '\n', '\006', 'c', 'o', 'o', 'k', 'i', 'e', '\030', '\002', ' ', '\001', '(', '\013',
'2', '4', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.',
-'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'H', 'e',
-'a', 'd', 'e', 'r', 'H', '\000', 'R', '\006', 'h', 'e', 'a', 'd', 'e', 'r', '\022', 'N', '\n', '\006', 'c', 'o', 'o', 'k', 'i', 'e', '\030',
-'\002', ' ', '\001', '(', '\013', '2', '4', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't',
-'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i',
-'c', 'y', '.', 'C', 'o', 'o', 'k', 'i', 'e', 'H', '\000', 'R', '\006', 'c', 'o', 'o', 'k', 'i', 'e', '\022', 'y', '\n', '\025', 'c', 'o',
-'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'p', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's', '\030', '\003', ' ', '\001', '(', '\013',
-'2', 'B', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.',
'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'C', 'o',
-'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's', 'H', '\000', 'R', '\024', 'c', 'o', 'n',
-'n', 'e', 'c', 't', 'i', 'o', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's', '\022', 'g', '\n', '\017', 'q', 'u', 'e', 'r',
-'y', '_', 'p', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', '\030', '\005', ' ', '\001', '(', '\013', '2', '<', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't',
-'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'Q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a', 'm',
-'e', 't', 'e', 'r', 'H', '\000', 'R', '\016', 'q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', '\022', '^', '\n',
-'\014', 'f', 'i', 'l', 't', 'e', 'r', '_', 's', 't', 'a', 't', 'e', '\030', '\006', ' ', '\001', '(', '\013', '2', '9', '.', 'e', 'n', 'v',
-'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'A',
-'c', 't', 'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'F', 'i', 'l', 't', 'e', 'r', 'S', 't',
-'a', 't', 'e', 'H', '\000', 'R', '\013', 'f', 'i', 'l', 't', 'e', 'r', 'S', 't', 'a', 't', 'e', '\022', '\032', '\n', '\010', 't', 'e', 'r',
-'m', 'i', 'n', 'a', 'l', '\030', '\004', ' ', '\001', '(', '\010', 'R', '\010', 't', 'e', 'r', 'm', 'i', 'n', 'a', 'l', '\032', '\306', '\001', '\n',
-'\006', 'H', 'e', 'a', 'd', 'e', 'r', '\022', '.', '\n', '\013', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'n', 'a', 'm', 'e', '\030', '\001', ' ',
-'\001', '(', '\t', 'B', '\r', '\372', 'B', '\n', 'r', '\010', '\020', '\001', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\n', 'h', 'e', 'a', 'd', 'e',
-'r', 'N', 'a', 'm', 'e', '\022', 'S', '\n', '\r', 'r', 'e', 'g', 'e', 'x', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '\030', '\002', ' ',
-'\001', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.',
-'v', '3', '.', 'R', 'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'A', 'n', 'd', 'S', 'u', 'b', 's', 't', 'i', 't', 'u', 't',
-'e', 'R', '\014', 'r', 'e', 'g', 'e', 'x', 'R', 'e', 'w', 'r', 'i', 't', 'e', ':', '7', '\232', '\305', '\210', '\036', '2', '\n', '0', 'e',
-'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c',
-'t', 'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'H', 'e', 'a', 'd', 'e', 'r', '\032', '\237', '\001',
-'\n', '\006', 'C', 'o', 'o', 'k', 'i', 'e', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372',
-'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '+', '\n', '\003', 't', 't', 'l', '\030', '\002', ' ', '\001', '(', '\013',
-'2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i',
-'o', 'n', 'R', '\003', 't', 't', 'l', '\022', '\022', '\n', '\004', 'p', 'a', 't', 'h', '\030', '\003', ' ', '\001', '(', '\t', 'R', '\004', 'p', 'a',
-'t', 'h', ':', '7', '\232', '\305', '\210', '\036', '2', '\n', '0', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r',
-'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i',
-'c', 'y', '.', 'C', 'o', 'o', 'k', 'i', 'e', '\032', 'z', '\n', '\024', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'P', 'r',
-'o', 'p', 'e', 'r', 't', 'i', 'e', 's', '\022', '\033', '\n', '\t', 's', 'o', 'u', 'r', 'c', 'e', '_', 'i', 'p', '\030', '\001', ' ', '\001',
-'(', '\010', 'R', '\010', 's', 'o', 'u', 'r', 'c', 'e', 'I', 'p', ':', 'E', '\232', '\305', '\210', '\036', '@', '\n', '>', 'e', 'n', 'v', 'o',
-'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o',
-'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'P', 'r',
-'o', 'p', 'e', 'r', 't', 'i', 'e', 's', '\032', 'n', '\n', '\016', 'Q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e',
-'r', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R',
-'\004', 'n', 'a', 'm', 'e', ':', '?', '\232', '\305', '\210', '\036', ':', '\n', '8', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v',
-'2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P',
-'o', 'l', 'i', 'c', 'y', '.', 'Q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', '\032', 'f', '\n', '\013', 'F',
-'i', 'l', 't', 'e', 'r', 'S', 't', 'a', 't', 'e', '\022', '\031', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007',
-'\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\003', 'k', 'e', 'y', ':', '<', '\232', '\305', '\210', '\036', '7', '\n', '5', 'e', 'n', 'v', 'o',
-'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o',
-'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'F', 'i', 'l', 't', 'e', 'r', 'S', 't', 'a', 't', 'e', ':',
-'0', '\232', '\305', '\210', '\036', '+', '\n', ')', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't',
-'e', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', 'B',
-'\027', '\n', '\020', 'p', 'o', 'l', 'i', 'c', 'y', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', '\032',
-'\243', '\003', '\n', '\r', 'U', 'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '0', '\n', '\014', 'u', 'p', 'g', 'r',
-'a', 'd', 'e', '_', 't', 'y', 'p', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\r', '\372', 'B', '\n', 'r', '\010', '\020', '\001', '\300', '\001',
-'\002', '\310', '\001', '\000', 'R', '\013', 'u', 'p', 'g', 'r', 'a', 'd', 'e', 'T', 'y', 'p', 'e', '\022', '4', '\n', '\007', 'e', 'n', 'a', 'b',
-'l', 'e', 'd', '\030', '\002', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b',
-'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\007', 'e', 'n', 'a', 'b', 'l', 'e', 'd', '\022', 'e', '\n', '\016',
-'c', 'o', 'n', 'n', 'e', 'c', 't', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '>', '.', 'e', 'n',
+'o', 'k', 'i', 'e', 'H', '\000', 'R', '\006', 'c', 'o', 'o', 'k', 'i', 'e', '\022', 'y', '\n', '\025', 'c', 'o', 'n', 'n', 'e', 'c', 't',
+'i', 'o', 'n', '_', 'p', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's', '\030', '\003', ' ', '\001', '(', '\013', '2', 'B', '.', 'e', 'n',
'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e',
-'A', 'c', 't', 'i', 'o', 'n', '.', 'U', 'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'C', 'o', 'n', 'n',
-'e', 'c', 't', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\r', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'C', 'o', 'n', 'f', 'i', 'g', '\032',
-'\215', '\001', '\n', '\r', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'C', 'o', 'n', 'f', 'i', 'g', '\022', ']', '\n', '\025', 'p', 'r', 'o', 'x',
-'y', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\001', ' ', '\001', '(', '\013', '2', ')',
-'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'P', 'r', 'o',
-'x', 'y', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\023', 'p', 'r', 'o', 'x', 'y', 'P', 'r',
-'o', 't', 'o', 'c', 'o', 'l', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '\035', '\n', '\n', 'a', 'l', 'l', 'o', 'w', '_', 'p', 'o', 's',
-'t', '\030', '\002', ' ', '\001', '(', '\010', 'R', '\t', 'a', 'l', 'l', 'o', 'w', 'P', 'o', 's', 't', ':', '3', '\232', '\305', '\210', '\036', '.',
-'\n', ',', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't',
-'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'U', 'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\210', '\002', '\n',
-'\021', 'M', 'a', 'x', 'S', 't', 'r', 'e', 'a', 'm', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\022', 'I', '\n', '\023', 'm', 'a', 'x',
-'_', 's', 't', 'r', 'e', 'a', 'm', '_', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\013', '2', '\031', '.',
-'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R',
-'\021', 'm', 'a', 'x', 'S', 't', 'r', 'e', 'a', 'm', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\022', 'P', '\n', '\027', 'g', 'r', 'p',
-'c', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'm', 'a', 'x', '\030', '\002', ' ', '\001', '(',
-'\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't',
-'i', 'o', 'n', 'R', '\024', 'g', 'r', 'p', 'c', 'T', 'i', 'm', 'e', 'o', 'u', 't', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 'x',
-'\022', 'V', '\n', '\032', 'g', 'r', 'p', 'c', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'o',
-'f', 'f', 's', 'e', 't', '\030', '\003', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't',
-'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\027', 'g', 'r', 'p', 'c', 'T', 'i', 'm', 'e', 'o', 'u',
-'t', 'H', 'e', 'a', 'd', 'e', 'r', 'O', 'f', 'f', 's', 'e', 't', '\"', 'E', '\n', '\033', 'C', 'l', 'u', 's', 't', 'e', 'r', 'N',
-'o', 't', 'F', 'o', 'u', 'n', 'd', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'C', 'o', 'd', 'e', '\022', '\027', '\n', '\023', 'S', 'E',
-'R', 'V', 'I', 'C', 'E', '_', 'U', 'N', 'A', 'V', 'A', 'I', 'L', 'A', 'B', 'L', 'E', '\020', '\000', '\022', '\r', '\n', '\t', 'N', 'O',
-'T', '_', 'F', 'O', 'U', 'N', 'D', '\020', '\001', '\"', '^', '\n', '\026', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'R', 'e', 'd', 'i',
-'r', 'e', 'c', 't', 'A', 'c', 't', 'i', 'o', 'n', '\022', '\"', '\n', '\036', 'P', 'A', 'S', 'S', '_', 'T', 'H', 'R', 'O', 'U', 'G',
-'H', '_', 'I', 'N', 'T', 'E', 'R', 'N', 'A', 'L', '_', 'R', 'E', 'D', 'I', 'R', 'E', 'C', 'T', '\020', '\000', '\022', '\034', '\n', '\030',
-'H', 'A', 'N', 'D', 'L', 'E', '_', 'I', 'N', 'T', 'E', 'R', 'N', 'A', 'L', '_', 'R', 'E', 'D', 'I', 'R', 'E', 'C', 'T', '\020',
-'\001', '\032', '\002', '\030', '\001', ':', '%', '\232', '\305', '\210', '\036', ' ', '\n', '\036', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v',
-'2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', 'B', '\030', '\n', '\021', 'c', 'l',
-'u', 's', 't', 'e', 'r', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', 'B', '\030', '\n', '\026', 'h',
-'o', 's', 't', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', 'J', '\004', '\010', '\014',
-'\020', '\r', 'J', '\004', '\010', '\022', '\020', '\023', 'J', '\004', '\010', '\023', '\020', '\024', 'J', '\004', '\010', '\020', '\020', '\021', 'J', '\004', '\010', '\026', '\020',
-'\027', 'J', '\004', '\010', '\025', '\020', '\026', 'J', '\004', '\010', '\n', '\020', '\013', 'R', '\025', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'm', 'i',
-'r', 'r', 'o', 'r', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\"', '\215', '\017', '\n', '\013', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i',
-'c', 'y', '\022', '\031', '\n', '\010', 'r', 'e', 't', 'r', 'y', '_', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\007', 'r', 'e', 't',
-'r', 'y', 'O', 'n', '\022', 'R', '\n', '\013', 'n', 'u', 'm', '_', 'r', 'e', 't', 'r', 'i', 'e', 's', '\030', '\002', ' ', '\001', '(', '\013',
-'2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2',
-'V', 'a', 'l', 'u', 'e', 'B', '\023', '\362', '\230', '\376', '\217', '\005', '\r', '\n', '\013', 'm', 'a', 'x', '_', 'r', 'e', 't', 'r', 'i', 'e',
-'s', 'R', '\n', 'n', 'u', 'm', 'R', 'e', 't', 'r', 'i', 'e', 's', '\022', 'A', '\n', '\017', 'p', 'e', 'r', '_', 't', 'r', 'y', '_',
-'t', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\003', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r',
-'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\r', 'p', 'e', 'r', 'T', 'r', 'y', 'T', 'i',
-'m', 'e', 'o', 'u', 't', '\022', 'W', '\n', '\016', 'r', 'e', 't', 'r', 'y', '_', 'p', 'r', 'i', 'o', 'r', 'i', 't', 'y', '\030', '\004',
-' ', '\001', '(', '\013', '2', '0', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e',
-'.', 'v', '3', '.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'R', 'e', 't', 'r', 'y', 'P', 'r', 'i', 'o',
-'r', 'i', 't', 'y', 'R', '\r', 'r', 'e', 't', 'r', 'y', 'P', 'r', 'i', 'o', 'r', 'i', 't', 'y', '\022', 'g', '\n', '\024', 'r', 'e',
-'t', 'r', 'y', '_', 'h', 'o', 's', 't', '_', 'p', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', '\030', '\005', ' ', '\003', '(', '\013', '2',
-'5', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R',
-'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'R', 'e', 't', 'r', 'y', 'H', 'o', 's', 't', 'P', 'r', 'e', 'd', 'i',
-'c', 'a', 't', 'e', 'R', '\022', 'r', 'e', 't', 'r', 'y', 'H', 'o', 's', 't', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', '\022',
-'H', '\n', '!', 'h', 'o', 's', 't', '_', 's', 'e', 'l', 'e', 'c', 't', 'i', 'o', 'n', '_', 'r', 'e', 't', 'r', 'y', '_', 'm',
-'a', 'x', '_', 'a', 't', 't', 'e', 'm', 'p', 't', 's', '\030', '\006', ' ', '\001', '(', '\003', 'R', '\035', 'h', 'o', 's', 't', 'S', 'e',
-'l', 'e', 'c', 't', 'i', 'o', 'n', 'R', 'e', 't', 'r', 'y', 'M', 'a', 'x', 'A', 't', 't', 'e', 'm', 'p', 't', 's', '\022', '4',
-'\n', '\026', 'r', 'e', 't', 'r', 'i', 'a', 'b', 'l', 'e', '_', 's', 't', 'a', 't', 'u', 's', '_', 'c', 'o', 'd', 'e', 's', '\030',
-'\007', ' ', '\003', '(', '\r', 'R', '\024', 'r', 'e', 't', 'r', 'i', 'a', 'b', 'l', 'e', 'S', 't', 'a', 't', 'u', 's', 'C', 'o', 'd',
-'e', 's', '\022', 'U', '\n', '\016', 'r', 'e', 't', 'r', 'y', '_', 'b', 'a', 'c', 'k', '_', 'o', 'f', 'f', '\030', '\010', ' ', '\001', '(',
-'\013', '2', '/', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3',
-'.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'R', 'e', 't', 'r', 'y', 'B', 'a', 'c', 'k', 'O', 'f', 'f',
-'R', '\014', 'r', 'e', 't', 'r', 'y', 'B', 'a', 'c', 'k', 'O', 'f', 'f', '\022', 'x', '\n', '\033', 'r', 'a', 't', 'e', '_', 'l', 'i',
-'m', 'i', 't', 'e', 'd', '_', 'r', 'e', 't', 'r', 'y', '_', 'b', 'a', 'c', 'k', '_', 'o', 'f', 'f', '\030', '\013', ' ', '\001', '(',
-'\013', '2', ':', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3',
-'.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', 'e', 'd', 'R',
-'e', 't', 'r', 'y', 'B', 'a', 'c', 'k', 'O', 'f', 'f', 'R', '\027', 'r', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', 'e', 'd', 'R',
-'e', 't', 'r', 'y', 'B', 'a', 'c', 'k', 'O', 'f', 'f', '\022', 'Q', '\n', '\021', 'r', 'e', 't', 'r', 'i', 'a', 'b', 'l', 'e', '_',
-'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\t', ' ', '\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
-'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e',
-'r', 'R', '\020', 'r', 'e', 't', 'r', 'i', 'a', 'b', 'l', 'e', 'H', 'e', 'a', 'd', 'e', 'r', 's', '\022', '`', '\n', '\031', 'r', 'e',
-'t', 'r', 'i', 'a', 'b', 'l', 'e', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\n',
-' ', '\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e',
-'.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'R', '\027', 'r', 'e', 't', 'r', 'i', 'a',
-'b', 'l', 'e', 'R', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', '\032', '\271', '\001', '\n', '\r', 'R', 'e', 't',
-'r', 'y', 'P', 'r', 'i', 'o', 'r', 'i', 't', 'y', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B',
-'\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '9', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c',
-'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't',
-'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'H', '\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', ':', '3',
-'\232', '\305', '\210', '\036', '.', '\n', ',', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e',
-'.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'R', 'e', 't', 'r', 'y', 'P', 'r', 'i', 'o', 'r', 'i', 't',
-'y', 'B', '\r', '\n', '\013', 'c', 'o', 'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c',
-'o', 'n', 'f', 'i', 'g', '\032', '\303', '\001', '\n', '\022', 'R', 'e', 't', 'r', 'y', 'H', 'o', 's', 't', 'P', 'r', 'e', 'd', 'i', 'c',
-'a', 't', 'e', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020',
-'\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '9', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003',
-' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n',
-'y', 'H', '\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', ':', '8', '\232', '\305', '\210', '\036', '3', '\n', '1',
-'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'e', 't', 'r', 'y', 'P',
-'o', 'l', 'i', 'c', 'y', '.', 'R', 'e', 't', 'r', 'y', 'H', 'o', 's', 't', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', 'B',
-'\r', '\n', '\013', 'c', 'o', 'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n',
-'f', 'i', 'g', '\032', '\326', '\001', '\n', '\014', 'R', 'e', 't', 'r', 'y', 'B', 'a', 'c', 'k', 'O', 'f', 'f', '\022', 'J', '\n', '\r', 'b',
-'a', 's', 'e', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\001', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g',
-'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\n', '\372', 'B', '\007',
-'\252', '\001', '\004', '\010', '\001', '*', '\000', 'R', '\014', 'b', 'a', 's', 'e', 'I', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\022', 'F', '\n', '\014',
-'m', 'a', 'x', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\002', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g',
-'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005',
-'\252', '\001', '\002', '*', '\000', 'R', '\013', 'm', 'a', 'x', 'I', 'n', 't', 'e', 'r', 'v', 'a', 'l', ':', '2', '\232', '\305', '\210', '\036', '-',
-'\n', '+', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'e', 't', 'r',
-'y', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'R', 'e', 't', 'r', 'y', 'B', 'a', 'c', 'k', 'O', 'f', 'f', '\032', '\210', '\001', '\n', '\013',
-'R', 'e', 's', 'e', 't', 'H', 'e', 'a', 'd', 'e', 'r', '\022', '!', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t',
-'B', '\r', '\372', 'B', '\n', 'r', '\010', '\020', '\001', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\004', 'n', 'a', 'm', 'e', '\022', 'V', '\n', '\006',
-'f', 'o', 'r', 'm', 'a', 't', '\030', '\002', ' ', '\001', '(', '\016', '2', '4', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'R',
-'e', 's', 'e', 't', 'H', 'e', 'a', 'd', 'e', 'r', 'F', 'o', 'r', 'm', 'a', 't', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020',
-'\001', 'R', '\006', 'f', 'o', 'r', 'm', 'a', 't', '\032', '\300', '\001', '\n', '\027', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', 'e', 'd',
-'R', 'e', 't', 'r', 'y', 'B', 'a', 'c', 'k', 'O', 'f', 'f', '\022', ']', '\n', '\r', 'r', 'e', 's', 'e', 't', '_', 'h', 'e', 'a',
-'d', 'e', 'r', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
-'.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'R', 'e', 's',
-'e', 't', 'H', 'e', 'a', 'd', 'e', 'r', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', 'R', '\014', 'r', 'e', 's', 'e', 't',
-'H', 'e', 'a', 'd', 'e', 'r', 's', '\022', 'F', '\n', '\014', 'm', 'a', 'x', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\002',
-' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u',
-'r', 'a', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\252', '\001', '\002', '*', '\000', 'R', '\013', 'm', 'a', 'x', 'I', 'n', 't', 'e',
-'r', 'v', 'a', 'l', '\"', '4', '\n', '\021', 'R', 'e', 's', 'e', 't', 'H', 'e', 'a', 'd', 'e', 'r', 'F', 'o', 'r', 'm', 'a', 't',
-'\022', '\013', '\n', '\007', 'S', 'E', 'C', 'O', 'N', 'D', 'S', '\020', '\000', '\022', '\022', '\n', '\016', 'U', 'N', 'I', 'X', '_', 'T', 'I', 'M',
-'E', 'S', 'T', 'A', 'M', 'P', '\020', '\001', ':', '%', '\232', '\305', '\210', '\036', ' ', '\n', '\036', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
-'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '\"', '\234', '\002',
-'\n', '\013', 'H', 'e', 'd', 'g', 'e', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'P', '\n', '\020', 'i', 'n', 'i', 't', 'i', 'a', 'l', '_',
-'r', 'e', 'q', 'u', 'e', 's', 't', 's', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p',
-'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\372', 'B', '\004', '*',
-'\002', '(', '\001', 'R', '\017', 'i', 'n', 'i', 't', 'i', 'a', 'l', 'R', 'e', 'q', 'u', 'e', 's', 't', 's', '\022', '\\', '\n', '\031', 'a',
-'d', 'd', 'i', 't', 'i', 'o', 'n', 'a', 'l', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'c', 'h', 'a', 'n', 'c', 'e', '\030',
-'\002', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'F', 'r', 'a',
-'c', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\027', 'a', 'd', 'd', 'i', 't', 'i', 'o', 'n', 'a',
-'l', 'R', 'e', 'q', 'u', 'e', 's', 't', 'C', 'h', 'a', 'n', 'c', 'e', '\022', '6', '\n', '\030', 'h', 'e', 'd', 'g', 'e', '_', 'o',
-'n', '_', 'p', 'e', 'r', '_', 't', 'r', 'y', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\003', ' ', '\001', '(', '\010', 'R', '\024',
-'h', 'e', 'd', 'g', 'e', 'O', 'n', 'P', 'e', 'r', 'T', 'r', 'y', 'T', 'i', 'm', 'e', 'o', 'u', 't', ':', '%', '\232', '\305', '\210',
-'\036', ' ', '\n', '\036', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'H', 'e',
-'d', 'g', 'e', 'P', 'o', 'l', 'i', 'c', 'y', '\"', '\341', '\005', '\n', '\016', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'A', 'c', 't',
-'i', 'o', 'n', '\022', '\'', '\n', '\016', 'h', 't', 't', 'p', 's', '_', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\030', '\004', ' ', '\001',
-'(', '\010', 'H', '\000', 'R', '\r', 'h', 't', 't', 'p', 's', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\022', ')', '\n', '\017', 's', 'c',
-'h', 'e', 'm', 'e', '_', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\030', '\007', ' ', '\001', '(', '\t', 'H', '\000', 'R', '\016', 's', 'c',
-'h', 'e', 'm', 'e', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\022', '0', '\n', '\r', 'h', 'o', 's', 't', '_', 'r', 'e', 'd', 'i',
-'r', 'e', 'c', 't', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\013', '\372', 'B', '\010', 'r', '\006', '\300', '\001', '\002', '\310', '\001', '\000', 'R', '\014',
-'h', 'o', 's', 't', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\022', '#', '\n', '\r', 'p', 'o', 'r', 't', '_', 'r', 'e', 'd', 'i',
-'r', 'e', 'c', 't', '\030', '\010', ' ', '\001', '(', '\r', 'R', '\014', 'p', 'o', 'r', 't', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\022',
-'2', '\n', '\r', 'p', 'a', 't', 'h', '_', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\013', '\372',
-'B', '\010', 'r', '\006', '\300', '\001', '\002', '\310', '\001', '\000', 'H', '\001', 'R', '\014', 'p', 'a', 't', 'h', 'R', 'e', 'd', 'i', 'r', 'e', 'c',
-'t', '\022', '4', '\n', '\016', 'p', 'r', 'e', 'f', 'i', 'x', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '\030', '\005', ' ', '\001', '(', '\t',
-'B', '\013', '\372', 'B', '\010', 'r', '\006', '\300', '\001', '\002', '\310', '\001', '\000', 'H', '\001', 'R', '\r', 'p', 'r', 'e', 'f', 'i', 'x', 'R', 'e',
-'w', 'r', 'i', 't', 'e', '\022', 'U', '\n', '\r', 'r', 'e', 'g', 'e', 'x', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '\030', '\t', ' ',
-'\001', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.',
-'v', '3', '.', 'R', 'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'A', 'n', 'd', 'S', 'u', 'b', 's', 't', 'i', 't', 'u', 't',
-'e', 'H', '\001', 'R', '\014', 'r', 'e', 'g', 'e', 'x', 'R', 'e', 'w', 'r', 'i', 't', 'e', '\022', 'i', '\n', '\r', 'r', 'e', 's', 'p',
-'o', 'n', 's', 'e', '_', 'c', 'o', 'd', 'e', '\030', '\003', ' ', '\001', '(', '\016', '2', ':', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
-'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'A', 'c',
-'t', 'i', 'o', 'n', '.', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'C', 'o', 'd', 'e',
-'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\014', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', 'C', 'o', 'd', 'e', '\022',
-'\037', '\n', '\013', 's', 't', 'r', 'i', 'p', '_', 'q', 'u', 'e', 'r', 'y', '\030', '\006', ' ', '\001', '(', '\010', 'R', '\n', 's', 't', 'r',
-'i', 'p', 'Q', 'u', 'e', 'r', 'y', '\"', 'w', '\n', '\024', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'R', 'e', 's', 'p', 'o', 'n',
-'s', 'e', 'C', 'o', 'd', 'e', '\022', '\025', '\n', '\021', 'M', 'O', 'V', 'E', 'D', '_', 'P', 'E', 'R', 'M', 'A', 'N', 'E', 'N', 'T',
-'L', 'Y', '\020', '\000', '\022', '\t', '\n', '\005', 'F', 'O', 'U', 'N', 'D', '\020', '\001', '\022', '\r', '\n', '\t', 'S', 'E', 'E', '_', 'O', 'T',
-'H', 'E', 'R', '\020', '\002', '\022', '\026', '\n', '\022', 'T', 'E', 'M', 'P', 'O', 'R', 'A', 'R', 'Y', '_', 'R', 'E', 'D', 'I', 'R', 'E',
-'C', 'T', '\020', '\003', '\022', '\026', '\n', '\022', 'P', 'E', 'R', 'M', 'A', 'N', 'E', 'N', 'T', '_', 'R', 'E', 'D', 'I', 'R', 'E', 'C',
-'T', '\020', '\004', ':', '(', '\232', '\305', '\210', '\036', '#', '\n', '!', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.',
-'r', 'o', 'u', 't', 'e', '.', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'A', 'c', 't', 'i', 'o', 'n', 'B', '\032', '\n', '\030', 's',
-'c', 'h', 'e', 'm', 'e', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', 'B', '\030',
-'\n', '\026', 'p', 'a', 't', 'h', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\"',
-'\240', '\001', '\n', '\024', 'D', 'i', 'r', 'e', 'c', 't', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'A', 'c', 't', 'i', 'o', 'n', '\022',
-'\"', '\n', '\006', 's', 't', 'a', 't', 'u', 's', '\030', '\001', ' ', '\001', '(', '\r', 'B', '\n', '\372', 'B', '\007', '*', '\005', '\020', '\330', '\004',
-'(', 'd', 'R', '\006', 's', 't', 'a', 't', 'u', 's', '\022', '4', '\n', '\004', 'b', 'o', 'd', 'y', '\030', '\002', ' ', '\001', '(', '\013', '2',
-' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D', 'a',
-'t', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\004', 'b', 'o', 'd', 'y', ':', '.', '\232', '\305', '\210', '\036', ')', '\n', '\'', 'e', 'n',
-'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'D', 'i', 'r', 'e', 'c', 't', 'R', 'e',
-'s', 'p', 'o', 'n', 's', 'e', 'A', 'c', 't', 'i', 'o', 'n', '\"', '\221', '\001', '\n', '\t', 'D', 'e', 'c', 'o', 'r', 'a', 't', 'o',
-'r', '\022', '%', '\n', '\t', 'o', 'p', 'e', 'r', 'a', 't', 'i', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004',
-'r', '\002', '\020', '\001', 'R', '\t', 'o', 'p', 'e', 'r', 'a', 't', 'i', 'o', 'n', '\022', '8', '\n', '\t', 'p', 'r', 'o', 'p', 'a', 'g',
-'a', 't', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b',
-'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\t', 'p', 'r', 'o', 'p', 'a', 'g', 'a', 't', 'e', ':', '#',
-'\232', '\305', '\210', '\036', '\036', '\n', '\034', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e',
-'.', 'D', 'e', 'c', 'o', 'r', 'a', 't', 'o', 'r', '\"', '\322', '\002', '\n', '\007', 'T', 'r', 'a', 'c', 'i', 'n', 'g', '\022', 'I', '\n',
-'\017', 'c', 'l', 'i', 'e', 'n', 't', '_', 's', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\030', '\001', ' ', '\001', '(', '\013', '2', ' ', '.',
-'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a', 'l', 'P',
-'e', 'r', 'c', 'e', 'n', 't', 'R', '\016', 'c', 'l', 'i', 'e', 'n', 't', 'S', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\022', 'I', '\n',
-'\017', 'r', 'a', 'n', 'd', 'o', 'm', '_', 's', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\030', '\002', ' ', '\001', '(', '\013', '2', ' ', '.',
-'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a', 'l', 'P',
-'e', 'r', 'c', 'e', 'n', 't', 'R', '\016', 'r', 'a', 'n', 'd', 'o', 'm', 'S', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\022', 'K', '\n',
-'\020', 'o', 'v', 'e', 'r', 'a', 'l', 'l', '_', 's', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', ' ',
-'.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a', 'l',
-'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\017', 'o', 'v', 'e', 'r', 'a', 'l', 'l', 'S', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\022',
-'A', '\n', '\013', 'c', 'u', 's', 't', 'o', 'm', '_', 't', 'a', 'g', 's', '\030', '\004', ' ', '\003', '(', '\013', '2', ' ', '.', 'e', 'n',
-'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 't', 'r', 'a', 'c', 'i', 'n', 'g', '.', 'v', '3', '.', 'C', 'u', 's', 't', 'o',
-'m', 'T', 'a', 'g', 'R', '\n', 'c', 'u', 's', 't', 'o', 'm', 'T', 'a', 'g', 's', ':', '!', '\232', '\305', '\210', '\036', '\034', '\n', '\032',
-'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'T', 'r', 'a', 'c', 'i', 'n',
-'g', '\"', '\264', '\001', '\n', '\016', 'V', 'i', 'r', 't', 'u', 'a', 'l', 'C', 'l', 'u', 's', 't', 'e', 'r', '\022', '>', '\n', '\007', 'h',
-'e', 'a', 'd', 'e', 'r', 's', '\030', '\004', ' ', '\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r',
-'R', '\007', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\007',
-'\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', ':', '(', '\232', '\305', '\210', '\036', '#', '\n', '!', 'e', 'n', 'v',
-'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'V', 'i', 'r', 't', 'u', 'a', 'l', 'C', 'l',
-'u', 's', 't', 'e', 'r', 'J', '\004', '\010', '\001', '\020', '\002', 'J', '\004', '\010', '\003', '\020', '\004', 'R', '\007', 'p', 'a', 't', 't', 'e', 'r',
-'n', 'R', '\006', 'm', 'e', 't', 'h', 'o', 'd', '\"', '\241', '\026', '\n', '\t', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '\022', ';',
-'\n', '\005', 's', 't', 'a', 'g', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r',
-'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\372', 'B', '\004', '*', '\002',
-'\030', '\n', 'R', '\005', 's', 't', 'a', 'g', 'e', '\022', '\037', '\n', '\013', 'd', 'i', 's', 'a', 'b', 'l', 'e', '_', 'k', 'e', 'y', '\030',
-'\002', ' ', '\001', '(', '\t', 'R', '\n', 'd', 'i', 's', 'a', 'b', 'l', 'e', 'K', 'e', 'y', '\022', 'K', '\n', '\007', 'a', 'c', 't', 'i',
-'o', 'n', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
-'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n',
-'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', 'R', '\007', 'a', 'c', 't', 'i', 'o', 'n', 's', '\022', '?', '\n', '\005', 'l', 'i',
-'m', 'i', 't', '\030', '\004', ' ', '\001', '(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
-'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'O', 'v', 'e', 'r', 'r', 'i',
-'d', 'e', 'R', '\005', 'l', 'i', 'm', 'i', 't', '\032', '\215', '\022', '\n', '\006', 'A', 'c', 't', 'i', 'o', 'n', '\022', '^', '\n', '\016', 's',
-'o', 'u', 'r', 'c', 'e', '_', 'c', 'l', 'u', 's', 't', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\013', '2', '5', '.', 'e', 'n', 'v',
-'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i',
-'m', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'S', 'o', 'u', 'r', 'c', 'e', 'C', 'l', 'u', 's', 't', 'e', 'r', 'H',
-'\000', 'R', '\r', 's', 'o', 'u', 'r', 'c', 'e', 'C', 'l', 'u', 's', 't', 'e', 'r', '\022', 'm', '\n', '\023', 'd', 'e', 's', 't', 'i',
-'n', 'a', 't', 'i', 'o', 'n', '_', 'c', 'l', 'u', 's', 't', 'e', 'r', '\030', '\002', ' ', '\001', '(', '\013', '2', ':', '.', 'e', 'n',
-'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L',
-'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'D', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', 'C', 'l',
-'u', 's', 't', 'e', 'r', 'H', '\000', 'R', '\022', 'd', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', 'C', 'l', 'u', 's', 't',
-'e', 'r', '\022', 'a', '\n', '\017', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\003', ' ', '\001',
-'(', '\013', '2', '6', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v',
-'3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'R', 'e', 'q', 'u', 'e', 's',
-'t', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'H', '\000', 'R', '\016', 'r', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r',
-'s', '\022', '^', '\n', '\016', 'r', 'e', 'm', 'o', 't', 'e', '_', 'a', 'd', 'd', 'r', 'e', 's', 's', '\030', '\004', ' ', '\001', '(', '\013',
-'2', '5', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.',
-'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'R', 'e', 'm', 'o', 't', 'e', 'A', 'd',
-'d', 'r', 'e', 's', 's', 'H', '\000', 'R', '\r', 'r', 'e', 'm', 'o', 't', 'e', 'A', 'd', 'd', 'r', 'e', 's', 's', '\022', 'U', '\n',
-'\013', 'g', 'e', 'n', 'e', 'r', 'i', 'c', '_', 'k', 'e', 'y', '\030', '\005', ' ', '\001', '(', '\013', '2', '2', '.', 'e', 'n', 'v', 'o',
-'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm',
-'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'G', 'e', 'n', 'e', 'r', 'i', 'c', 'K', 'e', 'y', 'H', '\000', 'R', '\n', 'g',
-'e', 'n', 'e', 'r', 'i', 'c', 'K', 'e', 'y', '\022', 'h', '\n', '\022', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'v', 'a', 'l', 'u', 'e',
-'_', 'm', 'a', 't', 'c', 'h', '\030', '\006', ' ', '\001', '(', '\013', '2', '8', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
+'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'C', 'o', 'n', 'n', 'e', 'c', 't',
+'i', 'o', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's', 'H', '\000', 'R', '\024', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i',
+'o', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's', '\022', 'g', '\n', '\017', 'q', 'u', 'e', 'r', 'y', '_', 'p', 'a', 'r',
+'a', 'm', 'e', 't', 'e', 'r', '\030', '\005', ' ', '\001', '(', '\013', '2', '<', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
+'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H',
+'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'Q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 'H',
+'\000', 'R', '\016', 'q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', '\022', '^', '\n', '\014', 'f', 'i', 'l', 't',
+'e', 'r', '_', 's', 't', 'a', 't', 'e', '\030', '\006', ' ', '\001', '(', '\013', '2', '9', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
+'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n',
+'.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'F', 'i', 'l', 't', 'e', 'r', 'S', 't', 'a', 't', 'e', 'H', '\000',
+'R', '\013', 'f', 'i', 'l', 't', 'e', 'r', 'S', 't', 'a', 't', 'e', '\022', '\032', '\n', '\010', 't', 'e', 'r', 'm', 'i', 'n', 'a', 'l',
+'\030', '\004', ' ', '\001', '(', '\010', 'R', '\010', 't', 'e', 'r', 'm', 'i', 'n', 'a', 'l', '\032', '\306', '\001', '\n', '\006', 'H', 'e', 'a', 'd',
+'e', 'r', '\022', '.', '\n', '\013', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\r',
+'\372', 'B', '\n', 'r', '\010', '\020', '\001', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\n', 'h', 'e', 'a', 'd', 'e', 'r', 'N', 'a', 'm', 'e',
+'\022', 'S', '\n', '\r', 'r', 'e', 'g', 'e', 'x', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '.',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'R', 'e',
+'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'A', 'n', 'd', 'S', 'u', 'b', 's', 't', 'i', 't', 'u', 't', 'e', 'R', '\014', 'r', 'e',
+'g', 'e', 'x', 'R', 'e', 'w', 'r', 'i', 't', 'e', ':', '7', '\232', '\305', '\210', '\036', '2', '\n', '0', 'e', 'n', 'v', 'o', 'y', '.',
+'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.',
+'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'H', 'e', 'a', 'd', 'e', 'r', '\032', '\237', '\001', '\n', '\006', 'C', 'o', 'o',
+'k', 'i', 'e', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020',
+'\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '+', '\n', '\003', 't', 't', 'l', '\030', '\002', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o',
+'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\003', 't',
+'t', 'l', '\022', '\022', '\n', '\004', 'p', 'a', 't', 'h', '\030', '\003', ' ', '\001', '(', '\t', 'R', '\004', 'p', 'a', 't', 'h', ':', '7', '\232',
+'\305', '\210', '\036', '2', '\n', '0', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.',
+'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'C', 'o',
+'o', 'k', 'i', 'e', '\032', 'z', '\n', '\024', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't',
+'i', 'e', 's', '\022', '\033', '\n', '\t', 's', 'o', 'u', 'r', 'c', 'e', '_', 'i', 'p', '\030', '\001', ' ', '\001', '(', '\010', 'R', '\010', 's',
+'o', 'u', 'r', 'c', 'e', 'I', 'p', ':', 'E', '\232', '\305', '\210', '\036', '@', '\n', '>', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i',
+'.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'a', 's',
+'h', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't',
+'i', 'e', 's', '\032', 'n', '\n', '\016', 'Q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', '\022', '\033', '\n', '\004',
+'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e',
+':', '?', '\232', '\305', '\210', '\036', ':', '\n', '8', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u',
+'t', 'e', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y',
+'.', 'Q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', '\032', 'f', '\n', '\013', 'F', 'i', 'l', 't', 'e', 'r',
+'S', 't', 'a', 't', 'e', '\022', '\031', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002',
+'\020', '\001', 'R', '\003', 'k', 'e', 'y', ':', '<', '\232', '\305', '\210', '\036', '7', '\n', '5', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i',
+'.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'a', 's',
+'h', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'F', 'i', 'l', 't', 'e', 'r', 'S', 't', 'a', 't', 'e', ':', '0', '\232', '\305', '\210', '\036',
+'+', '\n', ')', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u',
+'t', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', 'B', '\027', '\n', '\020', 'p', 'o',
+'l', 'i', 'c', 'y', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', '\032', '\243', '\003', '\n', '\r', 'U',
+'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '0', '\n', '\014', 'u', 'p', 'g', 'r', 'a', 'd', 'e', '_', 't',
+'y', 'p', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\r', '\372', 'B', '\n', 'r', '\010', '\020', '\001', '\300', '\001', '\002', '\310', '\001', '\000', 'R',
+'\013', 'u', 'p', 'g', 'r', 'a', 'd', 'e', 'T', 'y', 'p', 'e', '\022', '4', '\n', '\007', 'e', 'n', 'a', 'b', 'l', 'e', 'd', '\030', '\002',
+' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o',
+'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\007', 'e', 'n', 'a', 'b', 'l', 'e', 'd', '\022', 'e', '\n', '\016', 'c', 'o', 'n', 'n', 'e',
+'c', 't', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '>', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
+'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o',
+'n', '.', 'U', 'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'C', 'o',
+'n', 'f', 'i', 'g', 'R', '\r', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\215', '\001', '\n', '\r', 'C',
+'o', 'n', 'n', 'e', 'c', 't', 'C', 'o', 'n', 'f', 'i', 'g', '\022', ']', '\n', '\025', 'p', 'r', 'o', 'x', 'y', '_', 'p', 'r', 'o',
+'t', 'o', 'c', 'o', 'l', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\001', ' ', '\001', '(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o',
+'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'P', 'r', 'o', 'x', 'y', 'P', 'r', 'o',
+'t', 'o', 'c', 'o', 'l', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\023', 'p', 'r', 'o', 'x', 'y', 'P', 'r', 'o', 't', 'o', 'c', 'o',
+'l', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '\035', '\n', '\n', 'a', 'l', 'l', 'o', 'w', '_', 'p', 'o', 's', 't', '\030', '\002', ' ', '\001',
+'(', '\010', 'R', '\t', 'a', 'l', 'l', 'o', 'w', 'P', 'o', 's', 't', ':', '3', '\232', '\305', '\210', '\036', '.', '\n', ',', 'e', 'n', 'v',
+'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i',
+'o', 'n', '.', 'U', 'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\210', '\002', '\n', '\021', 'M', 'a', 'x', 'S',
+'t', 'r', 'e', 'a', 'm', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\022', 'I', '\n', '\023', 'm', 'a', 'x', '_', 's', 't', 'r', 'e',
+'a', 'm', '_', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l',
+'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\021', 'm', 'a', 'x', 'S',
+'t', 'r', 'e', 'a', 'm', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\022', 'P', '\n', '\027', 'g', 'r', 'p', 'c', '_', 't', 'i', 'm',
+'e', 'o', 'u', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'm', 'a', 'x', '\030', '\002', ' ', '\001', '(', '\013', '2', '\031', '.', 'g',
+'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\024',
+'g', 'r', 'p', 'c', 'T', 'i', 'm', 'e', 'o', 'u', 't', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 'x', '\022', 'V', '\n', '\032', 'g',
+'r', 'p', 'c', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'o', 'f', 'f', 's', 'e', 't',
+'\030', '\003', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.',
+'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\027', 'g', 'r', 'p', 'c', 'T', 'i', 'm', 'e', 'o', 'u', 't', 'H', 'e', 'a', 'd',
+'e', 'r', 'O', 'f', 'f', 's', 'e', 't', '\"', 'E', '\n', '\033', 'C', 'l', 'u', 's', 't', 'e', 'r', 'N', 'o', 't', 'F', 'o', 'u',
+'n', 'd', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'C', 'o', 'd', 'e', '\022', '\027', '\n', '\023', 'S', 'E', 'R', 'V', 'I', 'C', 'E',
+'_', 'U', 'N', 'A', 'V', 'A', 'I', 'L', 'A', 'B', 'L', 'E', '\020', '\000', '\022', '\r', '\n', '\t', 'N', 'O', 'T', '_', 'F', 'O', 'U',
+'N', 'D', '\020', '\001', '\"', '^', '\n', '\026', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'A',
+'c', 't', 'i', 'o', 'n', '\022', '\"', '\n', '\036', 'P', 'A', 'S', 'S', '_', 'T', 'H', 'R', 'O', 'U', 'G', 'H', '_', 'I', 'N', 'T',
+'E', 'R', 'N', 'A', 'L', '_', 'R', 'E', 'D', 'I', 'R', 'E', 'C', 'T', '\020', '\000', '\022', '\034', '\n', '\030', 'H', 'A', 'N', 'D', 'L',
+'E', '_', 'I', 'N', 'T', 'E', 'R', 'N', 'A', 'L', '_', 'R', 'E', 'D', 'I', 'R', 'E', 'C', 'T', '\020', '\001', '\032', '\002', '\030', '\001',
+':', '%', '\232', '\305', '\210', '\036', ' ', '\n', '\036', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u',
+'t', 'e', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', 'B', '\030', '\n', '\021', 'c', 'l', 'u', 's', 't', 'e', 'r',
+'_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', 'B', '\030', '\n', '\026', 'h', 'o', 's', 't', '_', 'r',
+'e', 'w', 'r', 'i', 't', 'e', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', 'J', '\004', '\010', '\014', '\020', '\r', 'J', '\004', '\010',
+'\022', '\020', '\023', 'J', '\004', '\010', '\023', '\020', '\024', 'J', '\004', '\010', '\020', '\020', '\021', 'J', '\004', '\010', '\026', '\020', '\027', 'J', '\004', '\010', '\025',
+'\020', '\026', 'J', '\004', '\010', '\n', '\020', '\013', 'R', '\025', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'm', 'i', 'r', 'r', 'o', 'r', '_',
+'p', 'o', 'l', 'i', 'c', 'y', '\"', '\215', '\017', '\n', '\013', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '\031', '\n',
+'\010', 'r', 'e', 't', 'r', 'y', '_', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\007', 'r', 'e', 't', 'r', 'y', 'O', 'n', '\022',
+'R', '\n', '\013', 'n', 'u', 'm', '_', 'r', 'e', 't', 'r', 'i', 'e', 's', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o',
+'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e',
+'B', '\023', '\362', '\230', '\376', '\217', '\005', '\r', '\n', '\013', 'm', 'a', 'x', '_', 'r', 'e', 't', 'r', 'i', 'e', 's', 'R', '\n', 'n', 'u',
+'m', 'R', 'e', 't', 'r', 'i', 'e', 's', '\022', 'A', '\n', '\017', 'p', 'e', 'r', '_', 't', 'r', 'y', '_', 't', 'i', 'm', 'e', 'o',
+'u', 't', '\030', '\003', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u',
+'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\r', 'p', 'e', 'r', 'T', 'r', 'y', 'T', 'i', 'm', 'e', 'o', 'u', 't',
+'\022', 'W', '\n', '\016', 'r', 'e', 't', 'r', 'y', '_', 'p', 'r', 'i', 'o', 'r', 'i', 't', 'y', '\030', '\004', ' ', '\001', '(', '\013', '2',
+'0', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R',
+'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'R', 'e', 't', 'r', 'y', 'P', 'r', 'i', 'o', 'r', 'i', 't', 'y', 'R',
+'\r', 'r', 'e', 't', 'r', 'y', 'P', 'r', 'i', 'o', 'r', 'i', 't', 'y', '\022', 'g', '\n', '\024', 'r', 'e', 't', 'r', 'y', '_', 'h',
+'o', 's', 't', '_', 'p', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', '\030', '\005', ' ', '\003', '(', '\013', '2', '5', '.', 'e', 'n', 'v',
+'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'e', 't', 'r', 'y', 'P',
+'o', 'l', 'i', 'c', 'y', '.', 'R', 'e', 't', 'r', 'y', 'H', 'o', 's', 't', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', 'R',
+'\022', 'r', 'e', 't', 'r', 'y', 'H', 'o', 's', 't', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', '\022', 'H', '\n', '!', 'h', 'o',
+'s', 't', '_', 's', 'e', 'l', 'e', 'c', 't', 'i', 'o', 'n', '_', 'r', 'e', 't', 'r', 'y', '_', 'm', 'a', 'x', '_', 'a', 't',
+'t', 'e', 'm', 'p', 't', 's', '\030', '\006', ' ', '\001', '(', '\003', 'R', '\035', 'h', 'o', 's', 't', 'S', 'e', 'l', 'e', 'c', 't', 'i',
+'o', 'n', 'R', 'e', 't', 'r', 'y', 'M', 'a', 'x', 'A', 't', 't', 'e', 'm', 'p', 't', 's', '\022', '4', '\n', '\026', 'r', 'e', 't',
+'r', 'i', 'a', 'b', 'l', 'e', '_', 's', 't', 'a', 't', 'u', 's', '_', 'c', 'o', 'd', 'e', 's', '\030', '\007', ' ', '\003', '(', '\r',
+'R', '\024', 'r', 'e', 't', 'r', 'i', 'a', 'b', 'l', 'e', 'S', 't', 'a', 't', 'u', 's', 'C', 'o', 'd', 'e', 's', '\022', 'U', '\n',
+'\016', 'r', 'e', 't', 'r', 'y', '_', 'b', 'a', 'c', 'k', '_', 'o', 'f', 'f', '\030', '\010', ' ', '\001', '(', '\013', '2', '/', '.', 'e',
+'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'e', 't', 'r',
+'y', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'R', 'e', 't', 'r', 'y', 'B', 'a', 'c', 'k', 'O', 'f', 'f', 'R', '\014', 'r', 'e', 't',
+'r', 'y', 'B', 'a', 'c', 'k', 'O', 'f', 'f', '\022', 'x', '\n', '\033', 'r', 'a', 't', 'e', '_', 'l', 'i', 'm', 'i', 't', 'e', 'd',
+'_', 'r', 'e', 't', 'r', 'y', '_', 'b', 'a', 'c', 'k', '_', 'o', 'f', 'f', '\030', '\013', ' ', '\001', '(', '\013', '2', ':', '.', 'e',
+'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'e', 't', 'r',
+'y', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', 'e', 'd', 'R', 'e', 't', 'r', 'y', 'B',
+'a', 'c', 'k', 'O', 'f', 'f', 'R', '\027', 'r', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', 'e', 'd', 'R', 'e', 't', 'r', 'y', 'B',
+'a', 'c', 'k', 'O', 'f', 'f', '\022', 'Q', '\n', '\021', 'r', 'e', 't', 'r', 'i', 'a', 'b', 'l', 'e', '_', 'h', 'e', 'a', 'd', 'e',
+'r', 's', '\030', '\t', ' ', '\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r',
+'o', 'u', 't', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'R', '\020', 'r', 'e',
+'t', 'r', 'i', 'a', 'b', 'l', 'e', 'H', 'e', 'a', 'd', 'e', 'r', 's', '\022', '`', '\n', '\031', 'r', 'e', 't', 'r', 'i', 'a', 'b',
+'l', 'e', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\n', ' ', '\003', '(', '\013', '2',
+'$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'H',
+'e', 'a', 'd', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'R', '\027', 'r', 'e', 't', 'r', 'i', 'a', 'b', 'l', 'e', 'R', 'e',
+'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', '\032', '\271', '\001', '\n', '\r', 'R', 'e', 't', 'r', 'y', 'P', 'r', 'i',
+'o', 'r', 'i', 't', 'y', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r',
+'\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '9', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g',
+'\030', '\003', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.',
+'A', 'n', 'y', 'H', '\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', ':', '3', '\232', '\305', '\210', '\036', '.',
+'\n', ',', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'e', 't', 'r',
+'y', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'R', 'e', 't', 'r', 'y', 'P', 'r', 'i', 'o', 'r', 'i', 't', 'y', 'B', '\r', '\n', '\013',
+'c', 'o', 'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g',
+'\032', '\303', '\001', '\n', '\022', 'R', 'e', 't', 'r', 'y', 'H', 'o', 's', 't', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', '\022', '\033',
+'\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a',
+'m', 'e', '\022', '9', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2',
+'\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'H', '\000', 'R', '\013',
+'t', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', ':', '8', '\232', '\305', '\210', '\036', '3', '\n', '1', 'e', 'n', 'v', 'o', 'y',
+'.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y',
+'.', 'R', 'e', 't', 'r', 'y', 'H', 'o', 's', 't', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', 'B', '\r', '\n', '\013', 'c', 'o',
+'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', '\032', '\326',
+'\001', '\n', '\014', 'R', 'e', 't', 'r', 'y', 'B', 'a', 'c', 'k', 'O', 'f', 'f', '\022', 'J', '\n', '\r', 'b', 'a', 's', 'e', '_', 'i',
+'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\001', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r',
+'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\n', '\372', 'B', '\007', '\252', '\001', '\004', '\010', '\001',
+'*', '\000', 'R', '\014', 'b', 'a', 's', 'e', 'I', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\022', 'F', '\n', '\014', 'm', 'a', 'x', '_', 'i',
+'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\002', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r',
+'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\252', '\001', '\002', '*', '\000',
+'R', '\013', 'm', 'a', 'x', 'I', 'n', 't', 'e', 'r', 'v', 'a', 'l', ':', '2', '\232', '\305', '\210', '\036', '-', '\n', '+', 'e', 'n', 'v',
+'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i',
+'c', 'y', '.', 'R', 'e', 't', 'r', 'y', 'B', 'a', 'c', 'k', 'O', 'f', 'f', '\032', '\210', '\001', '\n', '\013', 'R', 'e', 's', 'e', 't',
+'H', 'e', 'a', 'd', 'e', 'r', '\022', '!', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\r', '\372', 'B', '\n',
+'r', '\010', '\020', '\001', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\004', 'n', 'a', 'm', 'e', '\022', 'V', '\n', '\006', 'f', 'o', 'r', 'm', 'a',
+'t', '\030', '\002', ' ', '\001', '(', '\016', '2', '4', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o',
+'u', 't', 'e', '.', 'v', '3', '.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'R', 'e', 's', 'e', 't', 'H',
+'e', 'a', 'd', 'e', 'r', 'F', 'o', 'r', 'm', 'a', 't', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\006', 'f', 'o',
+'r', 'm', 'a', 't', '\032', '\300', '\001', '\n', '\027', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', 'e', 'd', 'R', 'e', 't', 'r', 'y',
+'B', 'a', 'c', 'k', 'O', 'f', 'f', '\022', ']', '\n', '\r', 'r', 'e', 's', 'e', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030',
+'\001', ' ', '\003', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't',
+'e', '.', 'v', '3', '.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'R', 'e', 's', 'e', 't', 'H', 'e', 'a',
+'d', 'e', 'r', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', 'R', '\014', 'r', 'e', 's', 'e', 't', 'H', 'e', 'a', 'd', 'e',
+'r', 's', '\022', 'F', '\n', '\014', 'm', 'a', 'x', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\002', ' ', '\001', '(', '\013', '2',
+'\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o',
+'n', 'B', '\010', '\372', 'B', '\005', '\252', '\001', '\002', '*', '\000', 'R', '\013', 'm', 'a', 'x', 'I', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\"',
+'4', '\n', '\021', 'R', 'e', 's', 'e', 't', 'H', 'e', 'a', 'd', 'e', 'r', 'F', 'o', 'r', 'm', 'a', 't', '\022', '\013', '\n', '\007', 'S',
+'E', 'C', 'O', 'N', 'D', 'S', '\020', '\000', '\022', '\022', '\n', '\016', 'U', 'N', 'I', 'X', '_', 'T', 'I', 'M', 'E', 'S', 'T', 'A', 'M',
+'P', '\020', '\001', ':', '%', '\232', '\305', '\210', '\036', ' ', '\n', '\036', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.',
+'r', 'o', 'u', 't', 'e', '.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '\"', '\234', '\002', '\n', '\013', 'H', 'e', 'd',
+'g', 'e', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'P', '\n', '\020', 'i', 'n', 'i', 't', 'i', 'a', 'l', '_', 'r', 'e', 'q', 'u', 'e',
+'s', 't', 's', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b',
+'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\372', 'B', '\004', '*', '\002', '(', '\001', 'R', '\017',
+'i', 'n', 'i', 't', 'i', 'a', 'l', 'R', 'e', 'q', 'u', 'e', 's', 't', 's', '\022', '\\', '\n', '\031', 'a', 'd', 'd', 'i', 't', 'i',
+'o', 'n', 'a', 'l', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'c', 'h', 'a', 'n', 'c', 'e', '\030', '\002', ' ', '\001', '(', '\013',
+'2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n',
+'a', 'l', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\027', 'a', 'd', 'd', 'i', 't', 'i', 'o', 'n', 'a', 'l', 'R', 'e', 'q', 'u',
+'e', 's', 't', 'C', 'h', 'a', 'n', 'c', 'e', '\022', '6', '\n', '\030', 'h', 'e', 'd', 'g', 'e', '_', 'o', 'n', '_', 'p', 'e', 'r',
+'_', 't', 'r', 'y', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\003', ' ', '\001', '(', '\010', 'R', '\024', 'h', 'e', 'd', 'g', 'e',
+'O', 'n', 'P', 'e', 'r', 'T', 'r', 'y', 'T', 'i', 'm', 'e', 'o', 'u', 't', ':', '%', '\232', '\305', '\210', '\036', ' ', '\n', '\036', 'e',
+'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'H', 'e', 'd', 'g', 'e', 'P', 'o',
+'l', 'i', 'c', 'y', '\"', '\341', '\005', '\n', '\016', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'A', 'c', 't', 'i', 'o', 'n', '\022', '\'',
+'\n', '\016', 'h', 't', 't', 'p', 's', '_', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\030', '\004', ' ', '\001', '(', '\010', 'H', '\000', 'R',
+'\r', 'h', 't', 't', 'p', 's', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\022', ')', '\n', '\017', 's', 'c', 'h', 'e', 'm', 'e', '_',
+'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\030', '\007', ' ', '\001', '(', '\t', 'H', '\000', 'R', '\016', 's', 'c', 'h', 'e', 'm', 'e', 'R',
+'e', 'd', 'i', 'r', 'e', 'c', 't', '\022', '0', '\n', '\r', 'h', 'o', 's', 't', '_', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\030',
+'\001', ' ', '\001', '(', '\t', 'B', '\013', '\372', 'B', '\010', 'r', '\006', '\300', '\001', '\002', '\310', '\001', '\000', 'R', '\014', 'h', 'o', 's', 't', 'R',
+'e', 'd', 'i', 'r', 'e', 'c', 't', '\022', '#', '\n', '\r', 'p', 'o', 'r', 't', '_', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\030',
+'\010', ' ', '\001', '(', '\r', 'R', '\014', 'p', 'o', 'r', 't', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\022', '2', '\n', '\r', 'p', 'a',
+'t', 'h', '_', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\013', '\372', 'B', '\010', 'r', '\006', '\300',
+'\001', '\002', '\310', '\001', '\000', 'H', '\001', 'R', '\014', 'p', 'a', 't', 'h', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\022', '4', '\n', '\016',
+'p', 'r', 'e', 'f', 'i', 'x', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '\030', '\005', ' ', '\001', '(', '\t', 'B', '\013', '\372', 'B', '\010',
+'r', '\006', '\300', '\001', '\002', '\310', '\001', '\000', 'H', '\001', 'R', '\r', 'p', 'r', 'e', 'f', 'i', 'x', 'R', 'e', 'w', 'r', 'i', 't', 'e',
+'\022', 'U', '\n', '\r', 'r', 'e', 'g', 'e', 'x', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '\030', '\t', ' ', '\001', '(', '\013', '2', '.',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'R', 'e',
+'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'A', 'n', 'd', 'S', 'u', 'b', 's', 't', 'i', 't', 'u', 't', 'e', 'H', '\001', 'R', '\014',
+'r', 'e', 'g', 'e', 'x', 'R', 'e', 'w', 'r', 'i', 't', 'e', '\022', 'i', '\n', '\r', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_',
+'c', 'o', 'd', 'e', '\030', '\003', ' ', '\001', '(', '\016', '2', ':', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
+'.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'A', 'c', 't', 'i', 'o', 'n', '.',
+'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'C', 'o', 'd', 'e', 'B', '\010', '\372', 'B', '\005',
+'\202', '\001', '\002', '\020', '\001', 'R', '\014', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', 'C', 'o', 'd', 'e', '\022', '\037', '\n', '\013', 's', 't',
+'r', 'i', 'p', '_', 'q', 'u', 'e', 'r', 'y', '\030', '\006', ' ', '\001', '(', '\010', 'R', '\n', 's', 't', 'r', 'i', 'p', 'Q', 'u', 'e',
+'r', 'y', '\"', 'w', '\n', '\024', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'C', 'o', 'd',
+'e', '\022', '\025', '\n', '\021', 'M', 'O', 'V', 'E', 'D', '_', 'P', 'E', 'R', 'M', 'A', 'N', 'E', 'N', 'T', 'L', 'Y', '\020', '\000', '\022',
+'\t', '\n', '\005', 'F', 'O', 'U', 'N', 'D', '\020', '\001', '\022', '\r', '\n', '\t', 'S', 'E', 'E', '_', 'O', 'T', 'H', 'E', 'R', '\020', '\002',
+'\022', '\026', '\n', '\022', 'T', 'E', 'M', 'P', 'O', 'R', 'A', 'R', 'Y', '_', 'R', 'E', 'D', 'I', 'R', 'E', 'C', 'T', '\020', '\003', '\022',
+'\026', '\n', '\022', 'P', 'E', 'R', 'M', 'A', 'N', 'E', 'N', 'T', '_', 'R', 'E', 'D', 'I', 'R', 'E', 'C', 'T', '\020', '\004', ':', '(',
+'\232', '\305', '\210', '\036', '#', '\n', '!', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e',
+'.', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'A', 'c', 't', 'i', 'o', 'n', 'B', '\032', '\n', '\030', 's', 'c', 'h', 'e', 'm', 'e',
+'_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', 'B', '\030', '\n', '\026', 'p', 'a', 't',
+'h', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\"', '\240', '\001', '\n', '\024', 'D',
+'i', 'r', 'e', 'c', 't', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'A', 'c', 't', 'i', 'o', 'n', '\022', '\"', '\n', '\006', 's', 't',
+'a', 't', 'u', 's', '\030', '\001', ' ', '\001', '(', '\r', 'B', '\n', '\372', 'B', '\007', '*', '\005', '\020', '\330', '\004', '(', 'd', 'R', '\006', 's',
+'t', 'a', 't', 'u', 's', '\022', '4', '\n', '\004', 'b', 'o', 'd', 'y', '\030', '\002', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v',
+'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'S', 'o', 'u',
+'r', 'c', 'e', 'R', '\004', 'b', 'o', 'd', 'y', ':', '.', '\232', '\305', '\210', '\036', ')', '\n', '\'', 'e', 'n', 'v', 'o', 'y', '.', 'a',
+'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'D', 'i', 'r', 'e', 'c', 't', 'R', 'e', 's', 'p', 'o', 'n', 's',
+'e', 'A', 'c', 't', 'i', 'o', 'n', '\"', '\025', '\n', '\023', 'N', 'o', 'n', 'F', 'o', 'r', 'w', 'a', 'r', 'd', 'i', 'n', 'g', 'A',
+'c', 't', 'i', 'o', 'n', '\"', '\221', '\001', '\n', '\t', 'D', 'e', 'c', 'o', 'r', 'a', 't', 'o', 'r', '\022', '%', '\n', '\t', 'o', 'p',
+'e', 'r', 'a', 't', 'i', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\t', 'o',
+'p', 'e', 'r', 'a', 't', 'i', 'o', 'n', '\022', '8', '\n', '\t', 'p', 'r', 'o', 'p', 'a', 'g', 'a', 't', 'e', '\030', '\002', ' ', '\001',
+'(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l',
+'V', 'a', 'l', 'u', 'e', 'R', '\t', 'p', 'r', 'o', 'p', 'a', 'g', 'a', 't', 'e', ':', '#', '\232', '\305', '\210', '\036', '\036', '\n', '\034',
+'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'D', 'e', 'c', 'o', 'r', 'a',
+'t', 'o', 'r', '\"', '\322', '\002', '\n', '\007', 'T', 'r', 'a', 'c', 'i', 'n', 'g', '\022', 'I', '\n', '\017', 'c', 'l', 'i', 'e', 'n', 't',
+'_', 's', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\030', '\001', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 't',
+'y', 'p', 'e', '.', 'v', '3', '.', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R',
+'\016', 'c', 'l', 'i', 'e', 'n', 't', 'S', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\022', 'I', '\n', '\017', 'r', 'a', 'n', 'd', 'o', 'm',
+'_', 's', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\030', '\002', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 't',
+'y', 'p', 'e', '.', 'v', '3', '.', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R',
+'\016', 'r', 'a', 'n', 'd', 'o', 'm', 'S', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\022', 'K', '\n', '\020', 'o', 'v', 'e', 'r', 'a', 'l',
+'l', '_', 's', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.',
+'t', 'y', 'p', 'e', '.', 'v', '3', '.', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'e', 'r', 'c', 'e', 'n', 't',
+'R', '\017', 'o', 'v', 'e', 'r', 'a', 'l', 'l', 'S', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\022', 'A', '\n', '\013', 'c', 'u', 's', 't',
+'o', 'm', '_', 't', 'a', 'g', 's', '\030', '\004', ' ', '\003', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p',
+'e', '.', 't', 'r', 'a', 'c', 'i', 'n', 'g', '.', 'v', '3', '.', 'C', 'u', 's', 't', 'o', 'm', 'T', 'a', 'g', 'R', '\n', 'c',
+'u', 's', 't', 'o', 'm', 'T', 'a', 'g', 's', ':', '!', '\232', '\305', '\210', '\036', '\034', '\n', '\032', 'e', 'n', 'v', 'o', 'y', '.', 'a',
+'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'T', 'r', 'a', 'c', 'i', 'n', 'g', '\"', '\264', '\001', '\n', '\016', 'V',
+'i', 'r', 't', 'u', 'a', 'l', 'C', 'l', 'u', 's', 't', 'e', 'r', '\022', '>', '\n', '\007', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030',
+'\004', ' ', '\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't',
+'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'R', '\007', 'h', 'e', 'a', 'd', 'e',
+'r', 's', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001',
+'R', '\004', 'n', 'a', 'm', 'e', ':', '(', '\232', '\305', '\210', '\036', '#', '\n', '!', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.',
+'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'V', 'i', 'r', 't', 'u', 'a', 'l', 'C', 'l', 'u', 's', 't', 'e', 'r', 'J', '\004',
+'\010', '\001', '\020', '\002', 'J', '\004', '\010', '\003', '\020', '\004', 'R', '\007', 'p', 'a', 't', 't', 'e', 'r', 'n', 'R', '\006', 'm', 'e', 't', 'h',
+'o', 'd', '\"', '\252', '\026', '\n', '\t', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '\022', ';', '\n', '\005', 's', 't', 'a', 'g', 'e',
+'\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.',
+'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\372', 'B', '\004', '*', '\002', '\030', '\n', 'R', '\005', 's', 't', 'a',
+'g', 'e', '\022', '\037', '\n', '\013', 'd', 'i', 's', 'a', 'b', 'l', 'e', '_', 'k', 'e', 'y', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\n',
+'d', 'i', 's', 'a', 'b', 'l', 'e', 'K', 'e', 'y', '\022', 'K', '\n', '\007', 'a', 'c', 't', 'i', 'o', 'n', 's', '\030', '\003', ' ', '\003',
+'(', '\013', '2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v',
+'3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\222', '\001',
+'\002', '\010', '\001', 'R', '\007', 'a', 'c', 't', 'i', 'o', 'n', 's', '\022', '?', '\n', '\005', 'l', 'i', 'm', 'i', 't', '\030', '\004', ' ', '\001',
+'(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v',
+'3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'O', 'v', 'e', 'r', 'r', 'i', 'd', 'e', 'R', '\005', 'l', 'i', 'm',
+'i', 't', '\032', '\226', '\022', '\n', '\006', 'A', 'c', 't', 'i', 'o', 'n', '\022', '^', '\n', '\016', 's', 'o', 'u', 'r', 'c', 'e', '_', 'c',
+'l', 'u', 's', 't', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\013', '2', '5', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't',
-'i', 'o', 'n', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'M', 'a', 't', 'c', 'h', 'H', '\000', 'R', '\020', 'h',
-'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'M', 'a', 't', 'c', 'h', '\022', 'n', '\n', '\020', 'd', 'y', 'n', 'a', 'm', 'i',
-'c', '_', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030', '\007', ' ', '\001', '(', '\013', '2', '7', '.', 'e', 'n', 'v', 'o', 'y', '.',
-'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't',
-'.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'D', 'y', 'n', 'a', 'm', 'i', 'c', 'M', 'e', 't', 'a', 'D', 'a', 't', 'a', 'B', '\010',
-'\030', '\001', '\270', '\356', '\362', '\322', '\005', '\001', 'H', '\000', 'R', '\017', 'd', 'y', 'n', 'a', 'm', 'i', 'c', 'M', 'e', 't', 'a', 'd', 'a',
-'t', 'a', '\022', 'N', '\n', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030', '\010', ' ', '\001', '(', '\013', '2', '0', '.', 'e', 'n',
-'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L',
-'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'M', 'e', 't', 'a', 'D', 'a', 't', 'a', 'H', '\000', 'R', '\010', 'm',
-'e', 't', 'a', 'd', 'a', 't', 'a', '\022', 'J', '\n', '\t', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '\030', '\t', ' ', '\001', '(',
-'\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.',
-'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'H', '\000', 'R', '\t', 'e',
-'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '\032', 'I', '\n', '\r', 'S', 'o', 'u', 'r', 'c', 'e', 'C', 'l', 'u', 's', 't', 'e', 'r',
-':', '8', '\232', '\305', '\210', '\036', '3', '\n', '1', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u',
-'t', 'e', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'S', 'o', 'u', 'r', 'c',
-'e', 'C', 'l', 'u', 's', 't', 'e', 'r', '\032', 'S', '\n', '\022', 'D', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', 'C', 'l',
-'u', 's', 't', 'e', 'r', ':', '=', '\232', '\305', '\210', '\036', '8', '\n', '6', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v',
-'2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.',
-'D', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', 'C', 'l', 'u', 's', 't', 'e', 'r', '\032', '\321', '\001', '\n', '\016', 'R', 'e',
-'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', '\022', '.', '\n', '\013', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'n', 'a',
-'m', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\r', '\372', 'B', '\n', 'r', '\010', '\020', '\001', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\n',
-'h', 'e', 'a', 'd', 'e', 'r', 'N', 'a', 'm', 'e', '\022', '.', '\n', '\016', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', '_',
-'k', 'e', 'y', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\r', 'd', 'e', 's', 'c', 'r',
-'i', 'p', 't', 'o', 'r', 'K', 'e', 'y', '\022', '$', '\n', '\016', 's', 'k', 'i', 'p', '_', 'i', 'f', '_', 'a', 'b', 's', 'e', 'n',
-'t', '\030', '\003', ' ', '\001', '(', '\010', 'R', '\014', 's', 'k', 'i', 'p', 'I', 'f', 'A', 'b', 's', 'e', 'n', 't', ':', '9', '\232', '\305',
-'\210', '\036', '4', '\n', '2', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R',
-'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'R', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e',
-'a', 'd', 'e', 'r', 's', '\032', 'I', '\n', '\r', 'R', 'e', 'm', 'o', 't', 'e', 'A', 'd', 'd', 'r', 'e', 's', 's', ':', '8', '\232',
-'\305', '\210', '\036', '3', '\n', '1', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.',
-'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'R', 'e', 'm', 'o', 't', 'e', 'A', 'd',
-'d', 'r', 'e', 's', 's', '\032', '\236', '\001', '\n', '\n', 'G', 'e', 'n', 'e', 'r', 'i', 'c', 'K', 'e', 'y', '\022', '2', '\n', '\020', 'd',
-'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', '_', 'v', 'a', 'l', 'u', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B',
-'\004', 'r', '\002', '\020', '\001', 'R', '\017', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', 'V', 'a', 'l', 'u', 'e', '\022', '%', '\n',
-'\016', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', '_', 'k', 'e', 'y', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\r', 'd', 'e',
-'s', 'c', 'r', 'i', 'p', 't', 'o', 'r', 'K', 'e', 'y', ':', '5', '\232', '\305', '\210', '\036', '0', '\n', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A',
-'c', 't', 'i', 'o', 'n', '.', 'G', 'e', 'n', 'e', 'r', 'i', 'c', 'K', 'e', 'y', '\032', '\214', '\002', '\n', '\020', 'H', 'e', 'a', 'd',
-'e', 'r', 'V', 'a', 'l', 'u', 'e', 'M', 'a', 't', 'c', 'h', '\022', '2', '\n', '\020', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o',
-'r', '_', 'v', 'a', 'l', 'u', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\017', 'd',
-'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', 'V', 'a', 'l', 'u', 'e', '\022', '=', '\n', '\014', 'e', 'x', 'p', 'e', 'c', 't', '_',
-'m', 'a', 't', 'c', 'h', '\030', '\002', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't',
-'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\013', 'e', 'x', 'p', 'e', 'c', 't', 'M', 'a', 't',
-'c', 'h', '\022', 'H', '\n', '\007', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v',
-'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r',
-'M', 'a', 't', 'c', 'h', 'e', 'r', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', 'R', '\007', 'h', 'e', 'a', 'd', 'e', 'r',
-'s', ':', ';', '\232', '\305', '\210', '\036', '6', '\n', '4', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o',
-'u', 't', 'e', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'e', 'a', 'd',
-'e', 'r', 'V', 'a', 'l', 'u', 'e', 'M', 'a', 't', 'c', 'h', '\032', '\270', '\001', '\n', '\017', 'D', 'y', 'n', 'a', 'm', 'i', 'c', 'M',
-'e', 't', 'a', 'D', 'a', 't', 'a', '\022', '.', '\n', '\016', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', '_', 'k', 'e', 'y',
-'\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\r', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't',
-'o', 'r', 'K', 'e', 'y', '\022', 'P', '\n', '\014', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '_', 'k', 'e', 'y', '\030', '\002', ' ', '\001',
-'(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '.',
-'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'K', 'e', 'y', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R',
-'\013', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', 'K', 'e', 'y', '\022', '#', '\n', '\r', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 'v',
-'a', 'l', 'u', 'e', '\030', '\003', ' ', '\001', '(', '\t', 'R', '\014', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'V', 'a', 'l', 'u', 'e', '\032',
-'\264', '\002', '\n', '\010', 'M', 'e', 't', 'a', 'D', 'a', 't', 'a', '\022', '.', '\n', '\016', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o',
-'r', '_', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\r', 'd', 'e', 's',
-'c', 'r', 'i', 'p', 't', 'o', 'r', 'K', 'e', 'y', '\022', 'P', '\n', '\014', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '_', 'k', 'e',
-'y', '\030', '\002', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'e', 't', 'a',
-'d', 'a', 't', 'a', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'K', 'e', 'y', 'B', '\010', '\372', 'B', '\005', '\212',
-'\001', '\002', '\020', '\001', 'R', '\013', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', 'K', 'e', 'y', '\022', '#', '\n', '\r', 'd', 'e', 'f', 'a',
-'u', 'l', 't', '_', 'v', 'a', 'l', 'u', 'e', '\030', '\003', ' ', '\001', '(', '\t', 'R', '\014', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'V',
-'a', 'l', 'u', 'e', '\022', 'Y', '\n', '\006', 's', 'o', 'u', 'r', 'c', 'e', '\030', '\004', ' ', '\001', '(', '\016', '2', '7', '.', 'e', 'n',
+'i', 'o', 'n', '.', 'S', 'o', 'u', 'r', 'c', 'e', 'C', 'l', 'u', 's', 't', 'e', 'r', 'H', '\000', 'R', '\r', 's', 'o', 'u', 'r',
+'c', 'e', 'C', 'l', 'u', 's', 't', 'e', 'r', '\022', 'm', '\n', '\023', 'd', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', '_',
+'c', 'l', 'u', 's', 't', 'e', 'r', '\030', '\002', ' ', '\001', '(', '\013', '2', ':', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
+'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c',
+'t', 'i', 'o', 'n', '.', 'D', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', 'C', 'l', 'u', 's', 't', 'e', 'r', 'H', '\000',
+'R', '\022', 'd', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', 'C', 'l', 'u', 's', 't', 'e', 'r', '\022', 'a', '\n', '\017', 'r',
+'e', 'q', 'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\003', ' ', '\001', '(', '\013', '2', '6', '.', 'e', 'n',
'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L',
-'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'M', 'e', 't', 'a', 'D', 'a', 't', 'a', '.', 'S', 'o', 'u', 'r',
-'c', 'e', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\006', 's', 'o', 'u', 'r', 'c', 'e', '\"', '&', '\n', '\006', 'S',
-'o', 'u', 'r', 'c', 'e', '\022', '\013', '\n', '\007', 'D', 'Y', 'N', 'A', 'M', 'I', 'C', '\020', '\000', '\022', '\017', '\n', '\013', 'R', 'O', 'U',
-'T', 'E', '_', 'E', 'N', 'T', 'R', 'Y', '\020', '\001', ':', '*', '\232', '\305', '\210', '\036', '%', '\n', '#', 'e', 'n', 'v', 'o', 'y', '.',
-'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c',
-'t', 'i', 'o', 'n', 'B', '\027', '\n', '\020', 'a', 'c', 't', 'i', 'o', 'n', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022',
-'\003', '\370', 'B', '\001', '\032', '\362', '\001', '\n', '\010', 'O', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '\022', 'f', '\n', '\020', 'd', 'y', 'n', 'a',
-'m', 'i', 'c', '_', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030', '\001', ' ', '\001', '(', '\013', '2', '9', '.', 'e', 'n', 'v', 'o',
+'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'R', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r',
+'s', 'H', '\000', 'R', '\016', 'r', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', '\022', '^', '\n', '\016', 'r', 'e',
+'m', 'o', 't', 'e', '_', 'a', 'd', 'd', 'r', 'e', 's', 's', '\030', '\004', ' ', '\001', '(', '\013', '2', '5', '.', 'e', 'n', 'v', 'o',
'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm',
-'i', 't', '.', 'O', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '.', 'D', 'y', 'n', 'a', 'm', 'i', 'c', 'M', 'e', 't', 'a', 'd', 'a',
-'t', 'a', 'H', '\000', 'R', '\017', 'd', 'y', 'n', 'a', 'm', 'i', 'c', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', '\032', 'c', '\n', '\017',
-'D', 'y', 'n', 'a', 'm', 'i', 'c', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', '\022', 'P', '\n', '\014', 'm', 'e', 't', 'a', 'd', 'a',
-'t', 'a', '_', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e',
-'.', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'K', 'e', 'y', 'B',
-'\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\013', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', 'K', 'e', 'y', 'B', '\031', '\n',
-'\022', 'o', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', ':',
-'#', '\232', '\305', '\210', '\036', '\036', '\n', '\034', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't',
-'e', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '\"', '\236', '\004', '\n', '\r', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 't',
-'c', 'h', 'e', 'r', '\022', '!', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\r', '\372', 'B', '\n', 'r', '\010',
-'\020', '\001', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '!', '\n', '\013', 'e', 'x', 'a', 'c', 't', '_', 'm',
-'a', 't', 'c', 'h', '\030', '\004', ' ', '\001', '(', '\t', 'H', '\000', 'R', '\n', 'e', 'x', 'a', 'c', 't', 'M', 'a', 't', 'c', 'h', '\022',
-'O', '\n', '\020', 's', 'a', 'f', 'e', '_', 'r', 'e', 'g', 'e', 'x', '_', 'm', 'a', 't', 'c', 'h', '\030', '\013', ' ', '\001', '(', '\013',
-'2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.',
-'R', 'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'H', '\000', 'R', '\016', 's', 'a', 'f', 'e', 'R', 'e', 'g', 'e', 'x',
-'M', 'a', 't', 'c', 'h', '\022', '<', '\n', '\013', 'r', 'a', 'n', 'g', 'e', '_', 'm', 'a', 't', 'c', 'h', '\030', '\006', ' ', '\001', '(',
-'\013', '2', '\031', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'I', 'n', 't', '6', '4', 'R', 'a',
-'n', 'g', 'e', 'H', '\000', 'R', '\n', 'r', 'a', 'n', 'g', 'e', 'M', 'a', 't', 'c', 'h', '\022', '%', '\n', '\r', 'p', 'r', 'e', 's',
-'e', 'n', 't', '_', 'm', 'a', 't', 'c', 'h', '\030', '\007', ' ', '\001', '(', '\010', 'H', '\000', 'R', '\014', 'p', 'r', 'e', 's', 'e', 'n',
-'t', 'M', 'a', 't', 'c', 'h', '\022', ',', '\n', '\014', 'p', 'r', 'e', 'f', 'i', 'x', '_', 'm', 'a', 't', 'c', 'h', '\030', '\t', ' ',
-'\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'H', '\000', 'R', '\013', 'p', 'r', 'e', 'f', 'i', 'x', 'M', 'a', 't',
-'c', 'h', '\022', ',', '\n', '\014', 's', 'u', 'f', 'f', 'i', 'x', '_', 'm', 'a', 't', 'c', 'h', '\030', '\n', ' ', '\001', '(', '\t', 'B',
-'\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'H', '\000', 'R', '\013', 's', 'u', 'f', 'f', 'i', 'x', 'M', 'a', 't', 'c', 'h', '\022', '0',
-'\n', '\016', 'c', 'o', 'n', 't', 'a', 'i', 'n', 's', '_', 'm', 'a', 't', 'c', 'h', '\030', '\014', ' ', '\001', '(', '\t', 'B', '\007', '\372',
-'B', '\004', 'r', '\002', '\020', '\001', 'H', '\000', 'R', '\r', 'c', 'o', 'n', 't', 'a', 'i', 'n', 's', 'M', 'a', 't', 'c', 'h', '\022', '!',
-'\n', '\014', 'i', 'n', 'v', 'e', 'r', 't', '_', 'm', 'a', 't', 'c', 'h', '\030', '\010', ' ', '\001', '(', '\010', 'R', '\013', 'i', 'n', 'v',
-'e', 'r', 't', 'M', 'a', 't', 'c', 'h', ':', '\'', '\232', '\305', '\210', '\036', '\"', '\n', ' ', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
-'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'B',
-'\030', '\n', '\026', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'm', 'a', 't', 'c', 'h', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r',
-'J', '\004', '\010', '\002', '\020', '\003', 'J', '\004', '\010', '\003', '\020', '\004', 'J', '\004', '\010', '\005', '\020', '\006', 'R', '\013', 'r', 'e', 'g', 'e', 'x',
-'_', 'm', 'a', 't', 'c', 'h', '\"', '\241', '\002', '\n', '\025', 'Q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r',
-'M', 'a', 't', 'c', 'h', 'e', 'r', '\022', '\036', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\n', '\372', 'B',
-'\007', 'r', '\005', '\020', '\001', '(', '\200', '\010', 'R', '\004', 'n', 'a', 'm', 'e', '\022', 'S', '\n', '\014', 's', 't', 'r', 'i', 'n', 'g', '_',
-'m', 'a', 't', 'c', 'h', '\030', '\005', ' ', '\001', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.',
-'m', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'S', 't', 'r', 'i', 'n', 'g', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'B',
-'\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'H', '\000', 'R', '\013', 's', 't', 'r', 'i', 'n', 'g', 'M', 'a', 't', 'c', 'h', '\022',
-'%', '\n', '\r', 'p', 'r', 'e', 's', 'e', 'n', 't', '_', 'm', 'a', 't', 'c', 'h', '\030', '\006', ' ', '\001', '(', '\010', 'H', '\000', 'R',
-'\014', 'p', 'r', 'e', 's', 'e', 'n', 't', 'M', 'a', 't', 'c', 'h', ':', '/', '\232', '\305', '\210', '\036', '*', '\n', '(', 'e', 'n', 'v',
-'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'Q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a',
-'m', 'e', 't', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'B', '!', '\n', '\037', 'q', 'u', 'e', 'r', 'y', '_', 'p', 'a', 'r',
-'a', 'm', 'e', 't', 'e', 'r', '_', 'm', 'a', 't', 'c', 'h', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', 'J', '\004', '\010',
-'\003', '\020', '\004', 'J', '\004', '\010', '\004', '\020', '\005', 'R', '\005', 'v', 'a', 'l', 'u', 'e', 'R', '\005', 'r', 'e', 'g', 'e', 'x', '\"', '\271',
-'\002', '\n', '\026', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'P', 'o', 'l', 'i', 'c', 'y',
-'\022', 'R', '\n', '\026', 'm', 'a', 'x', '_', 'i', 'n', 't', 'e', 'r', 'n', 'a', 'l', '_', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't',
-'s', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
-'.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\024', 'm', 'a', 'x', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l',
-'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 's', '\022', '@', '\n', '\027', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '_', 'r', 'e', 's',
-'p', 'o', 'n', 's', 'e', '_', 'c', 'o', 'd', 'e', 's', '\030', '\002', ' ', '\003', '(', '\r', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002',
-'\020', '\005', 'R', '\025', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'C', 'o', 'd', 'e', 's',
-'\022', 'J', '\n', '\n', 'p', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', '*', '.', 'e', 'n',
-'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'y', 'p', 'e', 'd', 'E',
-'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\n', 'p', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e',
-'s', '\022', '=', '\n', '\033', 'a', 'l', 'l', 'o', 'w', '_', 'c', 'r', 'o', 's', 's', '_', 's', 'c', 'h', 'e', 'm', 'e', '_', 'r',
-'e', 'd', 'i', 'r', 'e', 'c', 't', '\030', '\004', ' ', '\001', '(', '\010', 'R', '\030', 'a', 'l', 'l', 'o', 'w', 'C', 'r', 'o', 's', 's',
-'S', 'c', 'h', 'e', 'm', 'e', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\"', ']', '\n', '\014', 'F', 'i', 'l', 't', 'e', 'r', 'C',
-'o', 'n', 'f', 'i', 'g', '\022', ',', '\n', '\006', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\001', ' ', '\001', '(', '\013', '2', '\024', '.', 'g',
-'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\006', 'c', 'o', 'n', 'f', 'i',
-'g', '\022', '\037', '\n', '\013', 'i', 's', '_', 'o', 'p', 't', 'i', 'o', 'n', 'a', 'l', '\030', '\002', ' ', '\001', '(', '\010', 'R', '\n', 'i',
-'s', 'O', 'p', 't', 'i', 'o', 'n', 'a', 'l', 'B', 'E', '\n', '#', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x',
-'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', 'B', '\024',
-'R', 'o', 'u', 't', 'e', 'C', 'o', 'm', 'p', 'o', 'n', 'e', 'n', 't', 's', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310',
-'\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'R', 'e', 'm', 'o', 't', 'e', 'A', 'd', 'd', 'r', 'e', 's', 's', 'H', '\000',
+'R', '\r', 'r', 'e', 'm', 'o', 't', 'e', 'A', 'd', 'd', 'r', 'e', 's', 's', '\022', 'U', '\n', '\013', 'g', 'e', 'n', 'e', 'r', 'i',
+'c', '_', 'k', 'e', 'y', '\030', '\005', ' ', '\001', '(', '\013', '2', '2', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i',
+'o', 'n', '.', 'G', 'e', 'n', 'e', 'r', 'i', 'c', 'K', 'e', 'y', 'H', '\000', 'R', '\n', 'g', 'e', 'n', 'e', 'r', 'i', 'c', 'K',
+'e', 'y', '\022', 'h', '\n', '\022', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'v', 'a', 'l', 'u', 'e', '_', 'm', 'a', 't', 'c', 'h', '\030',
+'\006', ' ', '\001', '(', '\013', '2', '8', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't',
+'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'e', 'a',
+'d', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'M', 'a', 't', 'c', 'h', 'H', '\000', 'R', '\020', 'h', 'e', 'a', 'd', 'e', 'r', 'V', 'a',
+'l', 'u', 'e', 'M', 'a', 't', 'c', 'h', '\022', 'w', '\n', '\020', 'd', 'y', 'n', 'a', 'm', 'i', 'c', '_', 'm', 'e', 't', 'a', 'd',
+'a', 't', 'a', '\030', '\007', ' ', '\001', '(', '\013', '2', '7', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
+'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n',
+'.', 'D', 'y', 'n', 'a', 'm', 'i', 'c', 'M', 'e', 't', 'a', 'D', 'a', 't', 'a', 'B', '\021', '\030', '\001', '\222', '\307', '\206', '\330', '\004',
+'\003', '3', '.', '0', '\270', '\356', '\362', '\322', '\005', '\001', 'H', '\000', 'R', '\017', 'd', 'y', 'n', 'a', 'm', 'i', 'c', 'M', 'e', 't', 'a',
+'d', 'a', 't', 'a', '\022', 'N', '\n', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030', '\010', ' ', '\001', '(', '\013', '2', '0', '.',
+'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't',
+'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'M', 'e', 't', 'a', 'D', 'a', 't', 'a', 'H', '\000', 'R',
+'\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\022', 'J', '\n', '\t', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '\030', '\t', ' ',
+'\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v',
+'3', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'H', '\000', 'R',
+'\t', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '\032', 'I', '\n', '\r', 'S', 'o', 'u', 'r', 'c', 'e', 'C', 'l', 'u', 's', 't',
+'e', 'r', ':', '8', '\232', '\305', '\210', '\036', '3', '\n', '1', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r',
+'o', 'u', 't', 'e', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'S', 'o', 'u',
+'r', 'c', 'e', 'C', 'l', 'u', 's', 't', 'e', 'r', '\032', 'S', '\n', '\022', 'D', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n',
+'C', 'l', 'u', 's', 't', 'e', 'r', ':', '=', '\232', '\305', '\210', '\036', '8', '\n', '6', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i',
+'.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o',
+'n', '.', 'D', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', 'C', 'l', 'u', 's', 't', 'e', 'r', '\032', '\321', '\001', '\n', '\016',
+'R', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', '\022', '.', '\n', '\013', 'h', 'e', 'a', 'd', 'e', 'r', '_',
+'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\r', '\372', 'B', '\n', 'r', '\010', '\020', '\001', '\300', '\001', '\001', '\310', '\001', '\000',
+'R', '\n', 'h', 'e', 'a', 'd', 'e', 'r', 'N', 'a', 'm', 'e', '\022', '.', '\n', '\016', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o',
+'r', '_', 'k', 'e', 'y', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\r', 'd', 'e', 's',
+'c', 'r', 'i', 'p', 't', 'o', 'r', 'K', 'e', 'y', '\022', '$', '\n', '\016', 's', 'k', 'i', 'p', '_', 'i', 'f', '_', 'a', 'b', 's',
+'e', 'n', 't', '\030', '\003', ' ', '\001', '(', '\010', 'R', '\014', 's', 'k', 'i', 'p', 'I', 'f', 'A', 'b', 's', 'e', 'n', 't', ':', '9',
+'\232', '\305', '\210', '\036', '4', '\n', '2', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e',
+'.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'R', 'e', 'q', 'u', 'e', 's', 't',
+'H', 'e', 'a', 'd', 'e', 'r', 's', '\032', 'I', '\n', '\r', 'R', 'e', 'm', 'o', 't', 'e', 'A', 'd', 'd', 'r', 'e', 's', 's', ':',
+'8', '\232', '\305', '\210', '\036', '3', '\n', '1', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't',
+'e', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'R', 'e', 'm', 'o', 't', 'e',
+'A', 'd', 'd', 'r', 'e', 's', 's', '\032', '\236', '\001', '\n', '\n', 'G', 'e', 'n', 'e', 'r', 'i', 'c', 'K', 'e', 'y', '\022', '2', '\n',
+'\020', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', '_', 'v', 'a', 'l', 'u', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007',
+'\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\017', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', 'V', 'a', 'l', 'u', 'e', '\022',
+'%', '\n', '\016', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', '_', 'k', 'e', 'y', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\r',
+'d', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', 'K', 'e', 'y', ':', '5', '\232', '\305', '\210', '\036', '0', '\n', '.', 'e', 'n', 'v',
+'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't',
+'.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'G', 'e', 'n', 'e', 'r', 'i', 'c', 'K', 'e', 'y', '\032', '\214', '\002', '\n', '\020', 'H', 'e',
+'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'M', 'a', 't', 'c', 'h', '\022', '2', '\n', '\020', 'd', 'e', 's', 'c', 'r', 'i', 'p',
+'t', 'o', 'r', '_', 'v', 'a', 'l', 'u', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R',
+'\017', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', 'V', 'a', 'l', 'u', 'e', '\022', '=', '\n', '\014', 'e', 'x', 'p', 'e', 'c',
+'t', '_', 'm', 'a', 't', 'c', 'h', '\030', '\002', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r',
+'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\013', 'e', 'x', 'p', 'e', 'c', 't', 'M',
+'a', 't', 'c', 'h', '\022', 'H', '\n', '\007', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', '$', '.', 'e',
+'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd',
+'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', 'R', '\007', 'h', 'e', 'a', 'd',
+'e', 'r', 's', ':', ';', '\232', '\305', '\210', '\036', '6', '\n', '4', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.',
+'r', 'o', 'u', 't', 'e', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'e',
+'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'M', 'a', 't', 'c', 'h', '\032', '\270', '\001', '\n', '\017', 'D', 'y', 'n', 'a', 'm', 'i',
+'c', 'M', 'e', 't', 'a', 'D', 'a', 't', 'a', '\022', '.', '\n', '\016', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', '_', 'k',
+'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\r', 'd', 'e', 's', 'c', 'r', 'i',
+'p', 't', 'o', 'r', 'K', 'e', 'y', '\022', 'P', '\n', '\014', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '_', 'k', 'e', 'y', '\030', '\002',
+' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'e', 't', 'a', 'd', 'a', 't',
+'a', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'K', 'e', 'y', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020',
+'\001', 'R', '\013', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', 'K', 'e', 'y', '\022', '#', '\n', '\r', 'd', 'e', 'f', 'a', 'u', 'l', 't',
+'_', 'v', 'a', 'l', 'u', 'e', '\030', '\003', ' ', '\001', '(', '\t', 'R', '\014', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'V', 'a', 'l', 'u',
+'e', '\032', '\264', '\002', '\n', '\010', 'M', 'e', 't', 'a', 'D', 'a', 't', 'a', '\022', '.', '\n', '\016', 'd', 'e', 's', 'c', 'r', 'i', 'p',
+'t', 'o', 'r', '_', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\r', 'd',
+'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', 'K', 'e', 'y', '\022', 'P', '\n', '\014', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '_',
+'k', 'e', 'y', '\030', '\002', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'e',
+'t', 'a', 'd', 'a', 't', 'a', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'K', 'e', 'y', 'B', '\010', '\372', 'B',
+'\005', '\212', '\001', '\002', '\020', '\001', 'R', '\013', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', 'K', 'e', 'y', '\022', '#', '\n', '\r', 'd', 'e',
+'f', 'a', 'u', 'l', 't', '_', 'v', 'a', 'l', 'u', 'e', '\030', '\003', ' ', '\001', '(', '\t', 'R', '\014', 'd', 'e', 'f', 'a', 'u', 'l',
+'t', 'V', 'a', 'l', 'u', 'e', '\022', 'Y', '\n', '\006', 's', 'o', 'u', 'r', 'c', 'e', '\030', '\004', ' ', '\001', '(', '\016', '2', '7', '.',
+'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't',
+'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'M', 'e', 't', 'a', 'D', 'a', 't', 'a', '.', 'S', 'o',
+'u', 'r', 'c', 'e', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\006', 's', 'o', 'u', 'r', 'c', 'e', '\"', '&', '\n',
+'\006', 'S', 'o', 'u', 'r', 'c', 'e', '\022', '\013', '\n', '\007', 'D', 'Y', 'N', 'A', 'M', 'I', 'C', '\020', '\000', '\022', '\017', '\n', '\013', 'R',
+'O', 'U', 'T', 'E', '_', 'E', 'N', 'T', 'R', 'Y', '\020', '\001', ':', '*', '\232', '\305', '\210', '\036', '%', '\n', '#', 'e', 'n', 'v', 'o',
+'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.',
+'A', 'c', 't', 'i', 'o', 'n', 'B', '\027', '\n', '\020', 'a', 'c', 't', 'i', 'o', 'n', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e',
+'r', '\022', '\003', '\370', 'B', '\001', '\032', '\362', '\001', '\n', '\010', 'O', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '\022', 'f', '\n', '\020', 'd', 'y',
+'n', 'a', 'm', 'i', 'c', '_', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030', '\001', ' ', '\001', '(', '\013', '2', '9', '.', 'e', 'n',
+'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L',
+'i', 'm', 'i', 't', '.', 'O', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '.', 'D', 'y', 'n', 'a', 'm', 'i', 'c', 'M', 'e', 't', 'a',
+'d', 'a', 't', 'a', 'H', '\000', 'R', '\017', 'd', 'y', 'n', 'a', 'm', 'i', 'c', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', '\032', 'c',
+'\n', '\017', 'D', 'y', 'n', 'a', 'm', 'i', 'c', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', '\022', 'P', '\n', '\014', 'm', 'e', 't', 'a',
+'d', 'a', 't', 'a', '_', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y',
+'p', 'e', '.', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'K', 'e',
+'y', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\013', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', 'K', 'e', 'y', 'B',
+'\031', '\n', '\022', 'o', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B',
+'\001', ':', '#', '\232', '\305', '\210', '\036', '\036', '\n', '\034', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o',
+'u', 't', 'e', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '\"', '\244', '\005', '\n', '\r', 'H', 'e', 'a', 'd', 'e', 'r', 'M',
+'a', 't', 'c', 'h', 'e', 'r', '\022', '!', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\r', '\372', 'B', '\n',
+'r', '\010', '\020', '\001', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '.', '\n', '\013', 'e', 'x', 'a', 'c', 't',
+'_', 'm', 'a', 't', 'c', 'h', '\030', '\004', ' ', '\001', '(', '\t', 'B', '\013', '\030', '\001', '\222', '\307', '\206', '\330', '\004', '\003', '3', '.', '0',
+'H', '\000', 'R', '\n', 'e', 'x', 'a', 'c', 't', 'M', 'a', 't', 'c', 'h', '\022', '\\', '\n', '\020', 's', 'a', 'f', 'e', '_', 'r', 'e',
+'g', 'e', 'x', '_', 'm', 'a', 't', 'c', 'h', '\030', '\013', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 't',
+'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'R', 'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h',
+'e', 'r', 'B', '\013', '\030', '\001', '\222', '\307', '\206', '\330', '\004', '\003', '3', '.', '0', 'H', '\000', 'R', '\016', 's', 'a', 'f', 'e', 'R', 'e',
+'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', '\022', '<', '\n', '\013', 'r', 'a', 'n', 'g', 'e', '_', 'm', 'a', 't', 'c', 'h', '\030', '\006',
+' ', '\001', '(', '\013', '2', '\031', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'I', 'n', 't', '6',
+'4', 'R', 'a', 'n', 'g', 'e', 'H', '\000', 'R', '\n', 'r', 'a', 'n', 'g', 'e', 'M', 'a', 't', 'c', 'h', '\022', '%', '\n', '\r', 'p',
+'r', 'e', 's', 'e', 'n', 't', '_', 'm', 'a', 't', 'c', 'h', '\030', '\007', ' ', '\001', '(', '\010', 'H', '\000', 'R', '\014', 'p', 'r', 'e',
+'s', 'e', 'n', 't', 'M', 'a', 't', 'c', 'h', '\022', '7', '\n', '\014', 'p', 'r', 'e', 'f', 'i', 'x', '_', 'm', 'a', 't', 'c', 'h',
+'\030', '\t', ' ', '\001', '(', '\t', 'B', '\022', '\030', '\001', '\372', 'B', '\004', 'r', '\002', '\020', '\001', '\222', '\307', '\206', '\330', '\004', '\003', '3', '.',
+'0', 'H', '\000', 'R', '\013', 'p', 'r', 'e', 'f', 'i', 'x', 'M', 'a', 't', 'c', 'h', '\022', '7', '\n', '\014', 's', 'u', 'f', 'f', 'i',
+'x', '_', 'm', 'a', 't', 'c', 'h', '\030', '\n', ' ', '\001', '(', '\t', 'B', '\022', '\030', '\001', '\372', 'B', '\004', 'r', '\002', '\020', '\001', '\222',
+'\307', '\206', '\330', '\004', '\003', '3', '.', '0', 'H', '\000', 'R', '\013', 's', 'u', 'f', 'f', 'i', 'x', 'M', 'a', 't', 'c', 'h', '\022', ';',
+'\n', '\016', 'c', 'o', 'n', 't', 'a', 'i', 'n', 's', '_', 'm', 'a', 't', 'c', 'h', '\030', '\014', ' ', '\001', '(', '\t', 'B', '\022', '\030',
+'\001', '\372', 'B', '\004', 'r', '\002', '\020', '\001', '\222', '\307', '\206', '\330', '\004', '\003', '3', '.', '0', 'H', '\000', 'R', '\r', 'c', 'o', 'n', 't',
+'a', 'i', 'n', 's', 'M', 'a', 't', 'c', 'h', '\022', 'I', '\n', '\014', 's', 't', 'r', 'i', 'n', 'g', '_', 'm', 'a', 't', 'c', 'h',
+'\030', '\r', ' ', '\001', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h',
+'e', 'r', '.', 'v', '3', '.', 'S', 't', 'r', 'i', 'n', 'g', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'H', '\000', 'R', '\013', 's', 't',
+'r', 'i', 'n', 'g', 'M', 'a', 't', 'c', 'h', '\022', '!', '\n', '\014', 'i', 'n', 'v', 'e', 'r', 't', '_', 'm', 'a', 't', 'c', 'h',
+'\030', '\010', ' ', '\001', '(', '\010', 'R', '\013', 'i', 'n', 'v', 'e', 'r', 't', 'M', 'a', 't', 'c', 'h', ':', '\'', '\232', '\305', '\210', '\036',
+'\"', '\n', ' ', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'H', 'e', 'a',
+'d', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'B', '\030', '\n', '\026', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'm', 'a', 't', 'c',
+'h', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', 'J', '\004', '\010', '\002', '\020', '\003', 'J', '\004', '\010', '\003', '\020', '\004', 'J', '\004',
+'\010', '\005', '\020', '\006', 'R', '\013', 'r', 'e', 'g', 'e', 'x', '_', 'm', 'a', 't', 'c', 'h', '\"', '\241', '\002', '\n', '\025', 'Q', 'u', 'e',
+'r', 'y', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r', '\022', '\036', '\n', '\004', 'n', 'a', 'm',
+'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\n', '\372', 'B', '\007', 'r', '\005', '\020', '\001', '(', '\200', '\010', 'R', '\004', 'n', 'a', 'm', 'e',
+'\022', 'S', '\n', '\014', 's', 't', 'r', 'i', 'n', 'g', '_', 'm', 'a', 't', 'c', 'h', '\030', '\005', ' ', '\001', '(', '\013', '2', '$', '.',
+'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'S', 't', 'r',
+'i', 'n', 'g', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'H', '\000', 'R', '\013', 's',
+'t', 'r', 'i', 'n', 'g', 'M', 'a', 't', 'c', 'h', '\022', '%', '\n', '\r', 'p', 'r', 'e', 's', 'e', 'n', 't', '_', 'm', 'a', 't',
+'c', 'h', '\030', '\006', ' ', '\001', '(', '\010', 'H', '\000', 'R', '\014', 'p', 'r', 'e', 's', 'e', 'n', 't', 'M', 'a', 't', 'c', 'h', ':',
+'/', '\232', '\305', '\210', '\036', '*', '\n', '(', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't',
+'e', '.', 'Q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'B', '!',
+'\n', '\037', 'q', 'u', 'e', 'r', 'y', '_', 'p', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', '_', 'm', 'a', 't', 'c', 'h', '_', 's',
+'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', 'J', '\004', '\010', '\003', '\020', '\004', 'J', '\004', '\010', '\004', '\020', '\005', 'R', '\005', 'v', 'a', 'l',
+'u', 'e', 'R', '\005', 'r', 'e', 'g', 'e', 'x', '\"', '\271', '\002', '\n', '\026', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'R', 'e', 'd',
+'i', 'r', 'e', 'c', 't', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'R', '\n', '\026', 'm', 'a', 'x', '_', 'i', 'n', 't', 'e', 'r', 'n',
+'a', 'l', '_', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', 's', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g',
+'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\024',
+'m', 'a', 'x', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 's', '\022', '@', '\n', '\027', 'r',
+'e', 'd', 'i', 'r', 'e', 'c', 't', '_', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 'c', 'o', 'd', 'e', 's', '\030', '\002', ' ',
+'\003', '(', '\r', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\020', '\005', 'R', '\025', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'R', 'e',
+'s', 'p', 'o', 'n', 's', 'e', 'C', 'o', 'd', 'e', 's', '\022', 'J', '\n', '\n', 'p', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', 's',
+'\030', '\003', ' ', '\003', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r',
+'e', '.', 'v', '3', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g',
+'R', '\n', 'p', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', 's', '\022', '=', '\n', '\033', 'a', 'l', 'l', 'o', 'w', '_', 'c', 'r', 'o',
+'s', 's', '_', 's', 'c', 'h', 'e', 'm', 'e', '_', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\030', '\004', ' ', '\001', '(', '\010', 'R',
+'\030', 'a', 'l', 'l', 'o', 'w', 'C', 'r', 'o', 's', 's', 'S', 'c', 'h', 'e', 'm', 'e', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't',
+'\"', ']', '\n', '\014', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\022', ',', '\n', '\006', 'c', 'o', 'n', 'f', 'i',
+'g', '\030', '\001', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
+'.', 'A', 'n', 'y', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', '\022', '\037', '\n', '\013', 'i', 's', '_', 'o', 'p', 't', 'i', 'o', 'n',
+'a', 'l', '\030', '\002', ' ', '\001', '(', '\010', 'R', '\n', 'i', 's', 'O', 'p', 't', 'i', 'o', 'n', 'a', 'l', 'B', 'E', '\n', '#', 'i',
+'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
+'.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', 'B', '\024', 'R', 'o', 'u', 't', 'e', 'C', 'o', 'm', 'p', 'o', 'n', 'e', 'n', 't',
+'s', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
static upb_def_init *deps[18] = {
@@ -940,5 +960,5 @@ upb_def_init envoy_config_route_v3_route_components_proto_upbdefinit = {
deps,
layouts,
"envoy/config/route/v3/route_components.proto",
- UPB_STRVIEW_INIT(descriptor, 19463)
+ UPB_STRVIEW_INIT(descriptor, 19924)
};
diff --git a/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h b/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h
index a3cce451d3..7ac1dfb345 100644
--- a/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h
+++ b/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h
@@ -186,6 +186,11 @@ UPB_INLINE const upb_msgdef *envoy_config_route_v3_DirectResponseAction_getmsgde
return upb_symtab_lookupmsg(s, "envoy.config.route.v3.DirectResponseAction");
}
+UPB_INLINE const upb_msgdef *envoy_config_route_v3_NonForwardingAction_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &envoy_config_route_v3_route_components_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "envoy.config.route.v3.NonForwardingAction");
+}
+
UPB_INLINE const upb_msgdef *envoy_config_route_v3_Decorator_getmsgdef(upb_symtab *s) {
_upb_symtab_loaddefinit(s, &envoy_config_route_v3_route_components_proto_upbdefinit);
return upb_symtab_lookupmsg(s, "envoy.config.route.v3.Decorator");
diff --git a/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c b/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c
index cd46e9352e..8ce42798a0 100644
--- a/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c
+++ b/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c
@@ -26,7 +26,7 @@ static const upb_msglayout *layouts[3] = {
&envoy_extensions_filters_http_fault_v3_HTTPFault_msginit,
};
-static const char descriptor[1812] = {'\n', '2', 'e', 'n', 'v', 'o', 'y', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '/', 'f', 'i', 'l', 't', 'e', 'r',
+static const char descriptor[1885] = {'\n', '2', 'e', 'n', 'v', 'o', 'y', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '/', 'f', 'i', 'l', 't', 'e', 'r',
's', '/', 'h', 't', 't', 'p', '/', 'f', 'a', 'u', 'l', 't', '/', 'v', '3', '/', 'f', 'a', 'u', 'l', 't', '.', 'p', 'r', 'o',
't', 'o', '\022', '&', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't',
'e', 'r', 's', '.', 'h', 't', 't', 'p', '.', 'f', 'a', 'u', 'l', 't', '.', 'v', '3', '\032', ',', 'e', 'n', 'v', 'o', 'y', '/',
@@ -56,7 +56,7 @@ static const char descriptor[1812] = {'\n', '2', 'e', 'n', 'v', 'o', 'y', '/', '
'r', 't', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'A', 'b', 'o', 'r', 't', ':', '3', '\232', '\305', '\210', '\036', '.', '\n', ',', 'e', 'n',
'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'h', 't', 't', 'p', '.', 'f', 'a',
'u', 'l', 't', '.', 'v', '2', '.', 'F', 'a', 'u', 'l', 't', 'A', 'b', 'o', 'r', 't', 'B', '\021', '\n', '\n', 'e', 'r', 'r', 'o',
-'r', '_', 't', 'y', 'p', 'e', '\022', '\003', '\370', 'B', '\001', 'J', '\004', '\010', '\001', '\020', '\002', '\"', '\274', '\007', '\n', '\t', 'H', 'T', 'T',
+'r', '_', 't', 'y', 'p', 'e', '\022', '\003', '\370', 'B', '\001', 'J', '\004', '\010', '\001', '\020', '\002', '\"', '\205', '\010', '\n', '\t', 'H', 'T', 'T',
'P', 'F', 'a', 'u', 'l', 't', '\022', 'J', '\n', '\005', 'd', 'e', 'l', 'a', 'y', '\030', '\001', ' ', '\001', '(', '\013', '2', '4', '.', 'e',
'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'c',
'o', 'm', 'm', 'o', 'n', '.', 'f', 'a', 'u', 'l', 't', '.', 'v', '3', '.', 'F', 'a', 'u', 'l', 't', 'D', 'e', 'l', 'a', 'y',
@@ -92,13 +92,16 @@ static const char descriptor[1812] = {'\n', '2', 'e', 'n', 'v', 'o', 'y', '/', '
'e', '\030', '\r', ' ', '\001', '(', '\t', 'R', '\037', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i',
't', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', 'u', 'n', 't', 'i', 'm', 'e', '\022', '9', '\n', '\031', 'a', 'b', 'o', 'r', 't', '_',
'g', 'r', 'p', 'c', '_', 's', 't', 'a', 't', 'u', 's', '_', 'r', 'u', 'n', 't', 'i', 'm', 'e', '\030', '\016', ' ', '\001', '(', '\t',
-'R', '\026', 'a', 'b', 'o', 'r', 't', 'G', 'r', 'p', 'c', 'S', 't', 'a', 't', 'u', 's', 'R', 'u', 'n', 't', 'i', 'm', 'e', ':',
-'2', '\232', '\305', '\210', '\036', '-', '\n', '+', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't',
-'e', 'r', '.', 'h', 't', 't', 'p', '.', 'f', 'a', 'u', 'l', 't', '.', 'v', '2', '.', 'H', 'T', 'T', 'P', 'F', 'a', 'u', 'l',
-'t', 'B', 'L', '\n', '4', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.',
-'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'h', 't', 't', 'p', '.', 'f',
-'a', 'u', 'l', 't', '.', 'v', '3', 'B', '\n', 'F', 'a', 'u', 'l', 't', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321',
-'\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'R', '\026', 'a', 'b', 'o', 'r', 't', 'G', 'r', 'p', 'c', 'S', 't', 'a', 't', 'u', 's', 'R', 'u', 'n', 't', 'i', 'm', 'e', '\022',
+'G', '\n', ' ', 'd', 'i', 's', 'a', 'b', 'l', 'e', '_', 'd', 'o', 'w', 'n', 's', 't', 'r', 'e', 'a', 'm', '_', 'c', 'l', 'u',
+'s', 't', 'e', 'r', '_', 's', 't', 'a', 't', 's', '\030', '\017', ' ', '\001', '(', '\010', 'R', '\035', 'd', 'i', 's', 'a', 'b', 'l', 'e',
+'D', 'o', 'w', 'n', 's', 't', 'r', 'e', 'a', 'm', 'C', 'l', 'u', 's', 't', 'e', 'r', 'S', 't', 'a', 't', 's', ':', '2', '\232',
+'\305', '\210', '\036', '-', '\n', '+', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r',
+'.', 'h', 't', 't', 'p', '.', 'f', 'a', 'u', 'l', 't', '.', 'v', '2', '.', 'H', 'T', 'T', 'P', 'F', 'a', 'u', 'l', 't', 'B',
+'L', '\n', '4', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x',
+'t', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'h', 't', 't', 'p', '.', 'f', 'a', 'u',
+'l', 't', '.', 'v', '3', 'B', '\n', 'F', 'a', 'u', 'l', 't', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002',
+'\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
static upb_def_init *deps[8] = {
@@ -116,5 +119,5 @@ upb_def_init envoy_extensions_filters_http_fault_v3_fault_proto_upbdefinit = {
deps,
layouts,
"envoy/extensions/filters/http/fault/v3/fault.proto",
- UPB_STRVIEW_INIT(descriptor, 1812)
+ UPB_STRVIEW_INIT(descriptor, 1885)
};
diff --git a/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c b/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c
index f1d9a57807..1d74b4a03f 100644
--- a/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c
+++ b/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c
@@ -20,7 +20,7 @@ static const upb_msglayout *layouts[1] = {
&envoy_extensions_filters_http_router_v3_Router_msginit,
};
-static const char descriptor[909] = {'\n', '4', 'e', 'n', 'v', 'o', 'y', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '/', 'f', 'i', 'l', 't', 'e', 'r',
+static const char descriptor[996] = {'\n', '4', 'e', 'n', 'v', 'o', 'y', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '/', 'f', 'i', 'l', 't', 'e', 'r',
's', '/', 'h', 't', 't', 'p', '/', 'r', 'o', 'u', 't', 'e', 'r', '/', 'v', '3', '/', 'r', 'o', 'u', 't', 'e', 'r', '.', 'p',
'r', 'o', 't', 'o', '\022', '\'', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i',
'l', 't', 'e', 'r', 's', '.', 'h', 't', 't', 'p', '.', 'r', 'o', 'u', 't', 'e', 'r', '.', 'v', '3', '\032', ')', 'e', 'n', 'v',
@@ -30,7 +30,7 @@ static const char descriptor[909] = {'\n', '4', 'e', 'n', 'v', 'o', 'y', '/', 'e
'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't',
'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i',
'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l',
-'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\255', '\004', '\n', '\006', 'R', 'o', 'u', 't', 'e', 'r', '\022', '?', '\n',
+'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\204', '\005', '\n', '\006', 'R', 'o', 'u', 't', 'e', 'r', '\022', '?', '\n',
'\r', 'd', 'y', 'n', 'a', 'm', 'i', 'c', '_', 's', 't', 'a', 't', 's', '\030', '\001', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o',
'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\014',
'd', 'y', 'n', 'a', 'm', 'i', 'c', 'S', 't', 'a', 't', 's', '\022', '(', '\n', '\020', 's', 't', 'a', 'r', 't', '_', 'c', 'h', 'i',
@@ -50,13 +50,16 @@ static const char descriptor[909] = {'\n', '4', 'e', 'n', 'v', 'o', 'y', '/', 'e
'n', 'v', 'o', 'y', '-', 'r', 'e', 't', 'r', 'y', '-', 'o', 'n', 'R', '\022', 's', 't', 'r', 'i', 'c', 't', 'C', 'h', 'e', 'c',
'k', 'H', 'e', 'a', 'd', 'e', 'r', 's', '\022', '=', '\n', '\033', 'r', 'e', 's', 'p', 'e', 'c', 't', '_', 'e', 'x', 'p', 'e', 'c',
't', 'e', 'd', '_', 'r', 'q', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\006', ' ', '\001', '(', '\010', 'R', '\030', 'r', 'e', 's',
-'p', 'e', 'c', 't', 'E', 'x', 'p', 'e', 'c', 't', 'e', 'd', 'R', 'q', 'T', 'i', 'm', 'e', 'o', 'u', 't', ':', '0', '\232', '\305',
-'\210', '\036', '+', '\n', ')', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.',
-'h', 't', 't', 'p', '.', 'r', 'o', 'u', 't', 'e', 'r', '.', 'v', '2', '.', 'R', 'o', 'u', 't', 'e', 'r', 'B', 'N', '\n', '5',
-'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n',
-'s', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'h', 't', 't', 'p', '.', 'r', 'o', 'u', 't', 'e', 'r',
-'.', 'v', '3', 'B', '\013', 'R', 'o', 'u', 't', 'e', 'r', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020',
-'\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'p', 'e', 'c', 't', 'E', 'x', 'p', 'e', 'c', 't', 'e', 'd', 'R', 'q', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'U', '\n', '(',
+'s', 'u', 'p', 'p', 'r', 'e', 's', 's', '_', 'g', 'r', 'p', 'c', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'f', 'a', 'i',
+'l', 'u', 'r', 'e', '_', 'c', 'o', 'd', 'e', '_', 's', 't', 'a', 't', 's', '\030', '\007', ' ', '\001', '(', '\010', 'R', '#', 's', 'u',
+'p', 'p', 'r', 'e', 's', 's', 'G', 'r', 'p', 'c', 'R', 'e', 'q', 'u', 'e', 's', 't', 'F', 'a', 'i', 'l', 'u', 'r', 'e', 'C',
+'o', 'd', 'e', 'S', 't', 'a', 't', 's', ':', '0', '\232', '\305', '\210', '\036', '+', '\n', ')', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
+'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'h', 't', 't', 'p', '.', 'r', 'o', 'u', 't', 'e', 'r', '.', 'v',
+'2', '.', 'R', 'o', 'u', 't', 'e', 'r', 'B', 'N', '\n', '5', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's',
+'.', 'h', 't', 't', 'p', '.', 'r', 'o', 'u', 't', 'e', 'r', '.', 'v', '3', 'B', '\013', 'R', 'o', 'u', 't', 'e', 'r', 'P', 'r',
+'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
static upb_def_init *deps[6] = {
@@ -72,5 +75,5 @@ upb_def_init envoy_extensions_filters_http_router_v3_router_proto_upbdefinit = {
deps,
layouts,
"envoy/extensions/filters/http/router/v3/router.proto",
- UPB_STRVIEW_INIT(descriptor, 909)
+ UPB_STRVIEW_INIT(descriptor, 996)
};
diff --git a/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c b/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c
index 916044e9f4..755ef0936d 100644
--- a/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c
+++ b/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c
@@ -18,11 +18,13 @@ extern upb_def_init envoy_config_core_v3_substitution_format_string_proto_upbdef
extern upb_def_init envoy_config_route_v3_route_proto_upbdefinit;
extern upb_def_init envoy_config_route_v3_scoped_route_proto_upbdefinit;
extern upb_def_init envoy_config_trace_v3_http_tracer_proto_upbdefinit;
+extern upb_def_init envoy_type_http_v3_path_transformation_proto_upbdefinit;
extern upb_def_init envoy_type_tracing_v3_custom_tag_proto_upbdefinit;
extern upb_def_init envoy_type_v3_percent_proto_upbdefinit;
extern upb_def_init google_protobuf_any_proto_upbdefinit;
extern upb_def_init google_protobuf_duration_proto_upbdefinit;
extern upb_def_init google_protobuf_wrappers_proto_upbdefinit;
+extern upb_def_init envoy_annotations_deprecation_proto_upbdefinit;
extern upb_def_init udpa_annotations_migrate_proto_upbdefinit;
extern upb_def_init udpa_annotations_security_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
@@ -33,6 +35,7 @@ extern const upb_msglayout envoy_extensions_filters_network_http_connection_mana
extern const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_InternalAddressConfig_msginit;
extern const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_SetCurrentClientCertDetails_msginit;
extern const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig_msginit;
+extern const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_msginit;
extern const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_LocalReplyConfig_msginit;
extern const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_ResponseMapper_msginit;
extern const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_Rds_msginit;
@@ -45,13 +48,15 @@ extern const upb_msglayout envoy_extensions_filters_network_http_connection_mana
extern const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_ScopedRds_msginit;
extern const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter_msginit;
extern const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_RequestIDExtension_msginit;
+extern const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager_msginit;
-static const upb_msglayout *layouts[17] = {
+static const upb_msglayout *layouts[19] = {
&envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_msginit,
&envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_Tracing_msginit,
&envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_InternalAddressConfig_msginit,
&envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_SetCurrentClientCertDetails_msginit,
&envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig_msginit,
+ &envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_msginit,
&envoy_extensions_filters_network_http_connection_manager_v3_LocalReplyConfig_msginit,
&envoy_extensions_filters_network_http_connection_manager_v3_ResponseMapper_msginit,
&envoy_extensions_filters_network_http_connection_manager_v3_Rds_msginit,
@@ -64,9 +69,10 @@ static const upb_msglayout *layouts[17] = {
&envoy_extensions_filters_network_http_connection_manager_v3_ScopedRds_msginit,
&envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter_msginit,
&envoy_extensions_filters_network_http_connection_manager_v3_RequestIDExtension_msginit,
+ &envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager_msginit,
};
-static const char descriptor[10141] = {'\n', 'Y', 'e', 'n', 'v', 'o', 'y', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '/', 'f', 'i', 'l', 't', 'e', 'r',
+static const char descriptor[11589] = {'\n', 'Y', 'e', 'n', 'v', 'o', 'y', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '/', 'f', 'i', 'l', 't', 'e', 'r',
's', '/', 'n', 'e', 't', 'w', 'o', 'r', 'k', '/', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n',
'_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '/', 'v', '3', '/', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i',
'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'p', 'r', 'o', 't', 'o', '\022', ';', 'e', 'n', 'v', 'o', 'y', '.', 'e',
@@ -86,395 +92,453 @@ static const char descriptor[10141] = {'\n', 'Y', 'e', 'n', 'v', 'o', 'y', '/',
'o', 'u', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '(', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/',
'r', 'o', 'u', 't', 'e', '/', 'v', '3', '/', 's', 'c', 'o', 'p', 'e', 'd', '_', 'r', 'o', 'u', 't', 'e', '.', 'p', 'r', 'o',
't', 'o', '\032', '\'', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 't', 'r', 'a', 'c', 'e', '/', 'v', '3',
-'/', 'h', 't', 't', 'p', '_', 't', 'r', 'a', 'c', 'e', 'r', '.', 'p', 'r', 'o', 't', 'o', '\032', '&', 'e', 'n', 'v', 'o', 'y',
-'/', 't', 'y', 'p', 'e', '/', 't', 'r', 'a', 'c', 'i', 'n', 'g', '/', 'v', '3', '/', 'c', 'u', 's', 't', 'o', 'm', '_', 't',
-'a', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\033', 'e', 'n', 'v', 'o', 'y', '/', 't', 'y', 'p', 'e', '/', 'v', '3', '/', 'p',
-'e', 'r', 'c', 'e', 'n', 't', '.', 'p', 'r', 'o', 't', 'o', '\032', '\031', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't',
-'o', 'b', 'u', 'f', '/', 'a', 'n', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r',
-'o', 't', 'o', 'b', 'u', 'f', '/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o',
-'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r',
-'o', 't', 'o', '\032', '\036', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'm', 'i', 'g',
-'r', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\037', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i',
-'o', 'n', 's', '/', 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/',
-'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032',
-'!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n',
-'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd',
-'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\222', '+', '\n', '\025', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't',
-'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '\022', '\205', '\001', '\n', '\n', 'c', 'o', 'd', 'e', 'c', '_', 't', 'y', 'p', 'e',
-'\030', '\001', ' ', '\001', '(', '\016', '2', '\\', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's',
-'.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n',
-'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'H', 't', 't', 'p', 'C', 'o',
-'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'C', 'o', 'd', 'e', 'c', 'T', 'y', 'p', 'e',
-'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\t', 'c', 'o', 'd', 'e', 'c', 'T', 'y', 'p', 'e', '\022', '(', '\n', '\013',
-'s', 't', 'a', 't', '_', 'p', 'r', 'e', 'f', 'i', 'x', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020',
-'\001', 'R', '\n', 's', 't', 'a', 't', 'P', 'r', 'e', 'f', 'i', 'x', '\022', 'T', '\n', '\003', 'r', 'd', 's', '\030', '\003', ' ', '\001', '(',
-'\013', '2', '@', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't',
-'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i',
-'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'R', 'd', 's', 'H', '\000', 'R', '\003', 'r', 'd', 's', '\022',
-'N', '\n', '\014', 'r', 'o', 'u', 't', 'e', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\004', ' ', '\001', '(', '\013', '2', ')', '.', 'e',
-'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't',
-'e', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'H', '\000', 'R', '\013', 'r', 'o', 'u', 't', 'e', 'C', 'o',
-'n', 'f', 'i', 'g', '\022', 'p', '\n', '\r', 's', 'c', 'o', 'p', 'e', 'd', '_', 'r', 'o', 'u', 't', 'e', 's', '\030', '\037', ' ', '\001',
-'(', '\013', '2', 'I', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l',
-'t', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't',
-'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't',
-'e', 's', 'H', '\000', 'R', '\014', 's', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 's', '\022', 'j', '\n', '\014', 'h', 't', 't',
-'p', '_', 'f', 'i', 'l', 't', 'e', 'r', 's', '\030', '\005', ' ', '\003', '(', '\013', '2', 'G', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e',
-'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k',
-'.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.',
-'v', '3', '.', 'H', 't', 't', 'p', 'F', 'i', 'l', 't', 'e', 'r', 'R', '\013', 'h', 't', 't', 'p', 'F', 'i', 'l', 't', 'e', 'r',
-'s', '\022', '@', '\n', '\016', 'a', 'd', 'd', '_', 'u', 's', 'e', 'r', '_', 'a', 'g', 'e', 'n', 't', '\030', '\006', ' ', '\001', '(', '\013',
-'2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a',
-'l', 'u', 'e', 'R', '\014', 'a', 'd', 'd', 'U', 's', 'e', 'r', 'A', 'g', 'e', 'n', 't', '\022', 't', '\n', '\007', 't', 'r', 'a', 'c',
-'i', 'n', 'g', '\030', '\007', ' ', '\001', '(', '\013', '2', 'Z', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i',
+'/', 'h', 't', 't', 'p', '_', 't', 'r', 'a', 'c', 'e', 'r', '.', 'p', 'r', 'o', 't', 'o', '\032', ',', 'e', 'n', 'v', 'o', 'y',
+'/', 't', 'y', 'p', 'e', '/', 'h', 't', 't', 'p', '/', 'v', '3', '/', 'p', 'a', 't', 'h', '_', 't', 'r', 'a', 'n', 's', 'f',
+'o', 'r', 'm', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '&', 'e', 'n', 'v', 'o', 'y', '/', 't', 'y', 'p',
+'e', '/', 't', 'r', 'a', 'c', 'i', 'n', 'g', '/', 'v', '3', '/', 'c', 'u', 's', 't', 'o', 'm', '_', 't', 'a', 'g', '.', 'p',
+'r', 'o', 't', 'o', '\032', '\033', 'e', 'n', 'v', 'o', 'y', '/', 't', 'y', 'p', 'e', '/', 'v', '3', '/', 'p', 'e', 'r', 'c', 'e',
+'n', 't', '.', 'p', 'r', 'o', 't', 'o', '\032', '\031', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
+'/', 'a', 'n', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b',
+'u', 'f', '/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e',
+'/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o', 't', 'o', '\032',
+'#', 'e', 'n', 'v', 'o', 'y', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'd', 'e', 'p', 'r', 'e', 'c',
+'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't',
+'i', 'o', 'n', 's', '/', 'm', 'i', 'g', 'r', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\037', 'u', 'd', 'p', 'a', '/',
+'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', '.', 'p', 'r', 'o', 't',
+'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u',
+'s', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's',
+'/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a',
+'t', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\240', '4', '\n', '\025', 'H', 't', 't',
+'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '\022', '\205', '\001', '\n', '\n', 'c', 'o',
+'d', 'e', 'c', '_', 't', 'y', 'p', 'e', '\030', '\001', ' ', '\001', '(', '\016', '2', '\\', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x',
+'t', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.',
+'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v',
+'3', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'C',
+'o', 'd', 'e', 'c', 'T', 'y', 'p', 'e', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\t', 'c', 'o', 'd', 'e', 'c',
+'T', 'y', 'p', 'e', '\022', '(', '\n', '\013', 's', 't', 'a', 't', '_', 'p', 'r', 'e', 'f', 'i', 'x', '\030', '\002', ' ', '\001', '(', '\t',
+'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\n', 's', 't', 'a', 't', 'P', 'r', 'e', 'f', 'i', 'x', '\022', 'T', '\n', '\003',
+'r', 'd', 's', '\030', '\003', ' ', '\001', '(', '\013', '2', '@', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i',
'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_',
-'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'H', 't', 't',
-'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'T', 'r', 'a', 'c', 'i', 'n',
-'g', 'R', '\007', 't', 'r', 'a', 'c', 'i', 'n', 'g', '\022', 's', '\n', '\034', 'c', 'o', 'm', 'm', 'o', 'n', '_', 'h', 't', 't', 'p',
-'_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '#', ' ', '\001', '(', '\013', '2', ')',
-'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 't', 't',
-'p', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'B', '\007', '\212', '\223', '\267', '*', '\002', '\010', '\001',
-'R', '\031', 'c', 'o', 'm', 'm', 'o', 'n', 'H', 't', 't', 'p', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o',
-'n', 's', '\022', '^', '\n', '\025', 'h', 't', 't', 'p', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'o', 'p', 't', 'i', 'o',
-'n', 's', '\030', '\010', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c',
-'o', 'r', 'e', '.', 'v', '3', '.', 'H', 't', 't', 'p', '1', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o',
-'n', 's', 'R', '\023', 'h', 't', 't', 'p', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', 'i',
-'\n', '\026', 'h', 't', 't', 'p', '2', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030',
-'\t', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e',
-'.', 'v', '3', '.', 'H', 't', 't', 'p', '2', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'B',
-'\007', '\212', '\223', '\267', '*', '\002', '\010', '\001', 'R', '\024', 'h', 't', 't', 'p', '2', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p',
-'t', 'i', 'o', 'n', 's', '\022', ',', '\n', '\013', 's', 'e', 'r', 'v', 'e', 'r', '_', 'n', 'a', 'm', 'e', '\030', '\n', ' ', '\001', '(',
-'\t', 'B', '\013', '\372', 'B', '\010', 'r', '\006', '\300', '\001', '\002', '\310', '\001', '\000', 'R', '\n', 's', 'e', 'r', 'v', 'e', 'r', 'N', 'a', 'm',
-'e', '\022', '\271', '\001', '\n', '\034', 's', 'e', 'r', 'v', 'e', 'r', '_', 'h', 'e', 'a', 'd', 'e', 'r', '_', 't', 'r', 'a', 'n', 's',
-'f', 'o', 'r', 'm', 'a', 't', 'i', 'o', 'n', '\030', '\"', ' ', '\001', '(', '\016', '2', 'm', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e',
-'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k',
-'.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.',
-'v', '3', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '.',
-'S', 'e', 'r', 'v', 'e', 'r', 'H', 'e', 'a', 'd', 'e', 'r', 'T', 'r', 'a', 'n', 's', 'f', 'o', 'r', 'm', 'a', 't', 'i', 'o',
-'n', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\032', 's', 'e', 'r', 'v', 'e', 'r', 'H', 'e', 'a', 'd', 'e', 'r',
-'T', 'r', 'a', 'n', 's', 'f', 'o', 'r', 'm', 'a', 't', 'i', 'o', 'n', '\022', '\\', '\n', '\026', 'm', 'a', 'x', '_', 'r', 'e', 'q',
-'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 'k', 'b', '\030', '\035', ' ', '\001', '(', '\013', '2', '\034', '.', 'g',
-'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u',
-'e', 'B', '\t', '\372', 'B', '\006', '*', '\004', '\030', '`', ' ', '\000', 'R', '\023', 'm', 'a', 'x', 'R', 'e', 'q', 'u', 'e', 's', 't', 'H',
-'e', 'a', 'd', 'e', 'r', 's', 'K', 'b', '\022', 'R', '\n', '\023', 's', 't', 'r', 'e', 'a', 'm', '_', 'i', 'd', 'l', 'e', '_', 't',
-'i', 'm', 'e', 'o', 'u', 't', '\030', '\030', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o',
-'t', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\007', '\212', '\223', '\267', '*', '\002', '\010', '\001', 'R', '\021',
-'s', 't', 'r', 'e', 'a', 'm', 'I', 'd', 'l', 'e', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'K', '\n', '\017', 'r', 'e', 'q', 'u',
-'e', 's', 't', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\034', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l',
-'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\007', '\212', '\223', '\267', '*',
-'\002', '\010', '\001', 'R', '\016', 'r', 'e', 'q', 'u', 'e', 's', 't', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'b', '\n', '\027', 'r', 'e',
-'q', 'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', ')', ' ', '\001',
-'(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a',
-'t', 'i', 'o', 'n', 'B', '\017', '\372', 'B', '\005', '\252', '\001', '\002', '2', '\000', '\212', '\223', '\267', '*', '\002', '\010', '\001', 'R', '\025', 'r', 'e',
-'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', '>', '\n', '\r', 'd', 'r',
-'a', 'i', 'n', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\014', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l',
-'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\014', 'd', 'r', 'a', 'i',
-'n', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'M', '\n', '\025', 'd', 'e', 'l', 'a', 'y', 'e', 'd', '_', 'c', 'l', 'o', 's', 'e',
-'_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\032', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p',
-'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\023', 'd', 'e', 'l', 'a', 'y', 'e', 'd',
-'C', 'l', 'o', 's', 'e', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'C', '\n', '\n', 'a', 'c', 'c', 'e', 's', 's', '_', 'l', 'o',
-'g', '\030', '\r', ' ', '\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c',
-'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'A', 'c', 'c', 'e', 's', 's', 'L', 'o', 'g', 'R', '\t', 'a', 'c', 'c',
-'e', 's', 's', 'L', 'o', 'g', '\022', 'Q', '\n', '\022', 'u', 's', 'e', '_', 'r', 'e', 'm', 'o', 't', 'e', '_', 'a', 'd', 'd', 'r',
-'e', 's', 's', '\030', '\016', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b',
-'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\212', '\223', '\267', '*', '\002', '\010', '\001', 'R', '\020', 'u', 's',
-'e', 'R', 'e', 'm', 'o', 't', 'e', 'A', 'd', 'd', 'r', 'e', 's', 's', '\022', '/', '\n', '\024', 'x', 'f', 'f', '_', 'n', 'u', 'm',
-'_', 't', 'r', 'u', 's', 't', 'e', 'd', '_', 'h', 'o', 'p', 's', '\030', '\023', ' ', '\001', '(', '\r', 'R', '\021', 'x', 'f', 'f', 'N',
-'u', 'm', 'T', 'r', 'u', 's', 't', 'e', 'd', 'H', 'o', 'p', 's', '\022', '\240', '\001', '\n', '\027', 'i', 'n', 't', 'e', 'r', 'n', 'a',
-'l', '_', 'a', 'd', 'd', 'r', 'e', 's', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\031', ' ', '\001', '(', '\013', '2', 'h', '.',
-'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.',
-'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm',
-'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M',
-'a', 'n', 'a', 'g', 'e', 'r', '.', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'A', 'd', 'd', 'r', 'e', 's', 's', 'C', 'o', 'n',
-'f', 'i', 'g', 'R', '\025', 'i', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'A', 'd', 'd', 'r', 'e', 's', 's', 'C', 'o', 'n', 'f', 'i',
-'g', '\022', '&', '\n', '\017', 's', 'k', 'i', 'p', '_', 'x', 'f', 'f', '_', 'a', 'p', 'p', 'e', 'n', 'd', '\030', '\025', ' ', '\001', '(',
-'\010', 'R', '\r', 's', 'k', 'i', 'p', 'X', 'f', 'f', 'A', 'p', 'p', 'e', 'n', 'd', '\022', '\020', '\n', '\003', 'v', 'i', 'a', '\030', '\026',
-' ', '\001', '(', '\t', 'R', '\003', 'v', 'i', 'a', '\022', 'J', '\n', '\023', 'g', 'e', 'n', 'e', 'r', 'a', 't', 'e', '_', 'r', 'e', 'q',
-'u', 'e', 's', 't', '_', 'i', 'd', '\030', '\017', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r',
-'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\021', 'g', 'e', 'n', 'e', 'r', 'a', 't',
-'e', 'R', 'e', 'q', 'u', 'e', 's', 't', 'I', 'd', '\022', '?', '\n', '\034', 'p', 'r', 'e', 's', 'e', 'r', 'v', 'e', '_', 'e', 'x',
-'t', 'e', 'r', 'n', 'a', 'l', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'i', 'd', '\030', ' ', ' ', '\001', '(', '\010', 'R', '\031',
-'p', 'r', 'e', 's', 'e', 'r', 'v', 'e', 'E', 'x', 't', 'e', 'r', 'n', 'a', 'l', 'R', 'e', 'q', 'u', 'e', 's', 't', 'I', 'd',
-'\022', 'G', '\n', '!', 'a', 'l', 'w', 'a', 'y', 's', '_', 's', 'e', 't', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'i', 'd',
-'_', 'i', 'n', '_', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '\030', '%', ' ', '\001', '(', '\010', 'R', '\034', 'a', 'l', 'w', 'a', 'y',
-'s', 'S', 'e', 't', 'R', 'e', 'q', 'u', 'e', 's', 't', 'I', 'd', 'I', 'n', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '\022', '\264',
-'\001', '\n', '\033', 'f', 'o', 'r', 'w', 'a', 'r', 'd', '_', 'c', 'l', 'i', 'e', 'n', 't', '_', 'c', 'e', 'r', 't', '_', 'd', 'e',
-'t', 'a', 'i', 'l', 's', '\030', '\020', ' ', '\001', '(', '\016', '2', 'k', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n',
-'s', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't',
-'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'H',
-'t', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'F', 'o', 'r', 'w',
-'a', 'r', 'd', 'C', 'l', 'i', 'e', 'n', 't', 'C', 'e', 'r', 't', 'D', 'e', 't', 'a', 'i', 'l', 's', 'B', '\010', '\372', 'B', '\005',
-'\202', '\001', '\002', '\020', '\001', 'R', '\030', 'f', 'o', 'r', 'w', 'a', 'r', 'd', 'C', 'l', 'i', 'e', 'n', 't', 'C', 'e', 'r', 't', 'D',
-'e', 't', 'a', 'i', 'l', 's', '\022', '\264', '\001', '\n', '\037', 's', 'e', 't', '_', 'c', 'u', 'r', 'r', 'e', 'n', 't', '_', 'c', 'l',
-'i', 'e', 'n', 't', '_', 'c', 'e', 'r', 't', '_', 'd', 'e', 't', 'a', 'i', 'l', 's', '\030', '\021', ' ', '\001', '(', '\013', '2', 'n',
+'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'R', 'd', 's',
+'H', '\000', 'R', '\003', 'r', 'd', 's', '\022', 'N', '\n', '\014', 'r', 'o', 'u', 't', 'e', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\004',
+' ', '\001', '(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e',
+'.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'H', '\000', 'R',
+'\013', 'r', 'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'p', '\n', '\r', 's', 'c', 'o', 'p', 'e', 'd', '_', 'r', 'o',
+'u', 't', 'e', 's', '\030', '\037', ' ', '\001', '(', '\013', '2', 'I', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's',
+'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p',
+'_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'S', 'c',
+'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 's', 'H', '\000', 'R', '\014', 's', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e',
+'s', '\022', 'j', '\n', '\014', 'h', 't', 't', 'p', '_', 'f', 'i', 'l', 't', 'e', 'r', 's', '\030', '\005', ' ', '\003', '(', '\013', '2', 'G',
'.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's',
'.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_',
-'m', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n',
-'M', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'S', 'e', 't', 'C', 'u', 'r', 'r', 'e', 'n', 't', 'C', 'l', 'i', 'e', 'n', 't', 'C',
-'e', 'r', 't', 'D', 'e', 't', 'a', 'i', 'l', 's', 'R', '\033', 's', 'e', 't', 'C', 'u', 'r', 'r', 'e', 'n', 't', 'C', 'l', 'i',
-'e', 'n', 't', 'C', 'e', 'r', 't', 'D', 'e', 't', 'a', 'i', 'l', 's', '\022', ',', '\n', '\022', 'p', 'r', 'o', 'x', 'y', '_', '1',
-'0', '0', '_', 'c', 'o', 'n', 't', 'i', 'n', 'u', 'e', '\030', '\022', ' ', '\001', '(', '\010', 'R', '\020', 'p', 'r', 'o', 'x', 'y', '1',
-'0', '0', 'C', 'o', 'n', 't', 'i', 'n', 'u', 'e', '\022', 'e', '\n', '1', 'r', 'e', 'p', 'r', 'e', 's', 'e', 'n', 't', '_', 'i',
-'p', 'v', '4', '_', 'r', 'e', 'm', 'o', 't', 'e', '_', 'a', 'd', 'd', 'r', 'e', 's', 's', '_', 'a', 's', '_', 'i', 'p', 'v',
-'4', '_', 'm', 'a', 'p', 'p', 'e', 'd', '_', 'i', 'p', 'v', '6', '\030', '\024', ' ', '\001', '(', '\010', 'R', '*', 'r', 'e', 'p', 'r',
-'e', 's', 'e', 'n', 't', 'I', 'p', 'v', '4', 'R', 'e', 'm', 'o', 't', 'e', 'A', 'd', 'd', 'r', 'e', 's', 's', 'A', 's', 'I',
-'p', 'v', '4', 'M', 'a', 'p', 'p', 'e', 'd', 'I', 'p', 'v', '6', '\022', '\211', '\001', '\n', '\017', 'u', 'p', 'g', 'r', 'a', 'd', 'e',
-'_', 'c', 'o', 'n', 'f', 'i', 'g', 's', '\030', '\027', ' ', '\003', '(', '\013', '2', '`', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x',
-'t', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.',
-'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v',
-'3', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'U',
-'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\016', 'u', 'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o', 'n', 'f',
-'i', 'g', 's', '\022', 'A', '\n', '\016', 'n', 'o', 'r', 'm', 'a', 'l', 'i', 'z', 'e', '_', 'p', 'a', 't', 'h', '\030', '\036', ' ', '\001',
-'(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l',
-'V', 'a', 'l', 'u', 'e', 'R', '\r', 'n', 'o', 'r', 'm', 'a', 'l', 'i', 'z', 'e', 'P', 'a', 't', 'h', '\022', '#', '\n', '\r', 'm',
-'e', 'r', 'g', 'e', '_', 's', 'l', 'a', 's', 'h', 'e', 's', '\030', '!', ' ', '\001', '(', '\010', 'R', '\014', 'm', 'e', 'r', 'g', 'e',
-'S', 'l', 'a', 's', 'h', 'e', 's', '\022', '\201', '\001', '\n', '\024', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'i', 'd', '_', 'e', 'x',
-'t', 'e', 'n', 's', 'i', 'o', 'n', '\030', '$', ' ', '\001', '(', '\013', '2', 'O', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't',
-'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h',
-'t', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3',
-'.', 'R', 'e', 'q', 'u', 'e', 's', 't', 'I', 'D', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'R', '\022', 'r', 'e', 'q', 'u',
-'e', 's', 't', 'I', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '\022', '{', '\n', '\022', 'l', 'o', 'c', 'a', 'l', '_', 'r',
-'e', 'p', 'l', 'y', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '&', ' ', '\001', '(', '\013', '2', 'M', '.', 'e', 'n', 'v', 'o', 'y',
+'m', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'H', 't', 't', 'p', 'F', 'i', 'l', 't', 'e', 'r', 'R', '\013', 'h', 't',
+'t', 'p', 'F', 'i', 'l', 't', 'e', 'r', 's', '\022', '@', '\n', '\016', 'a', 'd', 'd', '_', 'u', 's', 'e', 'r', '_', 'a', 'g', 'e',
+'n', 't', '\030', '\006', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u',
+'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\014', 'a', 'd', 'd', 'U', 's', 'e', 'r', 'A', 'g', 'e', 'n', 't',
+'\022', 't', '\n', '\007', 't', 'r', 'a', 'c', 'i', 'n', 'g', '\030', '\007', ' ', '\001', '(', '\013', '2', 'Z', '.', 'e', 'n', 'v', 'o', 'y',
'.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o',
'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e',
-'r', '.', 'v', '3', '.', 'L', 'o', 'c', 'a', 'l', 'R', 'e', 'p', 'l', 'y', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\020', 'l', 'o',
-'c', 'a', 'l', 'R', 'e', 'p', 'l', 'y', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'P', '\n', '\030', 's', 't', 'r', 'i', 'p', '_', 'm',
-'a', 't', 'c', 'h', 'i', 'n', 'g', '_', 'h', 'o', 's', 't', '_', 'p', 'o', 'r', 't', '\030', '\'', ' ', '\001', '(', '\010', 'B', '\027',
-'\362', '\230', '\376', '\217', '\005', '\021', '\022', '\017', 's', 't', 'r', 'i', 'p', '_', 'p', 'o', 'r', 't', '_', 'm', 'o', 'd', 'e', 'R', '\025',
-'s', 't', 'r', 'i', 'p', 'M', 'a', 't', 'c', 'h', 'i', 'n', 'g', 'H', 'o', 's', 't', 'P', 'o', 'r', 't', '\022', '/', '\n', '\023',
-'s', 't', 'r', 'i', 'p', '_', 'a', 'n', 'y', '_', 'h', 'o', 's', 't', '_', 'p', 'o', 'r', 't', '\030', '*', ' ', '\001', '(', '\010',
-'H', '\001', 'R', '\020', 's', 't', 'r', 'i', 'p', 'A', 'n', 'y', 'H', 'o', 's', 't', 'P', 'o', 'r', 't', '\022', 'i', '\n', '$', 's',
-'t', 'r', 'e', 'a', 'm', '_', 'e', 'r', 'r', 'o', 'r', '_', 'o', 'n', '_', 'i', 'n', 'v', 'a', 'l', 'i', 'd', '_', 'h', 't',
-'t', 'p', '_', 'm', 'e', 's', 's', 'a', 'g', 'e', '\030', '(', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e',
-'.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\037', 's', 't', 'r', 'e',
-'a', 'm', 'E', 'r', 'r', 'o', 'r', 'O', 'n', 'I', 'n', 'v', 'a', 'l', 'i', 'd', 'H', 't', 't', 'p', 'M', 'e', 's', 's', 'a',
-'g', 'e', '\032', '\366', '\004', '\n', '\007', 'T', 'r', 'a', 'c', 'i', 'n', 'g', '\022', '?', '\n', '\017', 'c', 'l', 'i', 'e', 'n', 't', '_',
-'s', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '\026', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y',
-'p', 'e', '.', 'v', '3', '.', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\016', 'c', 'l', 'i', 'e', 'n', 't', 'S', 'a', 'm', 'p',
-'l', 'i', 'n', 'g', '\022', '?', '\n', '\017', 'r', 'a', 'n', 'd', 'o', 'm', '_', 's', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\030', '\004',
-' ', '\001', '(', '\013', '2', '\026', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'P', 'e', 'r', 'c',
-'e', 'n', 't', 'R', '\016', 'r', 'a', 'n', 'd', 'o', 'm', 'S', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\022', 'A', '\n', '\020', 'o', 'v',
-'e', 'r', 'a', 'l', 'l', '_', 's', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\030', '\005', ' ', '\001', '(', '\013', '2', '\026', '.', 'e', 'n',
-'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\017', 'o', 'v', 'e', 'r',
-'a', 'l', 'l', 'S', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\022', '\030', '\n', '\007', 'v', 'e', 'r', 'b', 'o', 's', 'e', '\030', '\006', ' ',
-'\001', '(', '\010', 'R', '\007', 'v', 'e', 'r', 'b', 'o', 's', 'e', '\022', 'K', '\n', '\023', 'm', 'a', 'x', '_', 'p', 'a', 't', 'h', '_',
-'t', 'a', 'g', '_', 'l', 'e', 'n', 'g', 't', 'h', '\030', '\007', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e',
-'.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\020', 'm', 'a',
-'x', 'P', 'a', 't', 'h', 'T', 'a', 'g', 'L', 'e', 'n', 'g', 't', 'h', '\022', 'A', '\n', '\013', 'c', 'u', 's', 't', 'o', 'm', '_',
-'t', 'a', 'g', 's', '\030', '\010', ' ', '\003', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 't',
-'r', 'a', 'c', 'i', 'n', 'g', '.', 'v', '3', '.', 'C', 'u', 's', 't', 'o', 'm', 'T', 'a', 'g', 'R', '\n', 'c', 'u', 's', 't',
-'o', 'm', 'T', 'a', 'g', 's', '\022', '?', '\n', '\010', 'p', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '\030', '\t', ' ', '\001', '(', '\013', '2',
-'#', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 't', 'r', 'a', 'c', 'e', '.', 'v', '3', '.', 'T',
-'r', 'a', 'c', 'i', 'n', 'g', '.', 'H', 't', 't', 'p', 'R', '\010', 'p', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '\"', '(', '\n', '\r',
-'O', 'p', 'e', 'r', 'a', 't', 'i', 'o', 'n', 'N', 'a', 'm', 'e', '\022', '\013', '\n', '\007', 'I', 'N', 'G', 'R', 'E', 'S', 'S', '\020',
-'\000', '\022', '\n', '\n', '\006', 'E', 'G', 'R', 'E', 'S', 'S', '\020', '\001', ':', '[', '\232', '\305', '\210', '\036', 'V', '\n', 'T', 'e', 'n', 'v',
-'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.',
+'r', '.', 'v', '3', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e',
+'r', '.', 'T', 'r', 'a', 'c', 'i', 'n', 'g', 'R', '\007', 't', 'r', 'a', 'c', 'i', 'n', 'g', '\022', 's', '\n', '\034', 'c', 'o', 'm',
+'m', 'o', 'n', '_', 'h', 't', 't', 'p', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'o', 'p', 't', 'i', 'o', 'n', 's',
+'\030', '#', ' ', '\001', '(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r',
+'e', '.', 'v', '3', '.', 'H', 't', 't', 'p', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'B',
+'\007', '\212', '\223', '\267', '*', '\002', '\010', '\001', 'R', '\031', 'c', 'o', 'm', 'm', 'o', 'n', 'H', 't', 't', 'p', 'P', 'r', 'o', 't', 'o',
+'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', '^', '\n', '\025', 'h', 't', 't', 'p', '_', 'p', 'r', 'o', 't', 'o', 'c',
+'o', 'l', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '\010', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.',
+'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 't', 't', 'p', '1', 'P', 'r', 'o', 't', 'o',
+'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'R', '\023', 'h', 't', 't', 'p', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O',
+'p', 't', 'i', 'o', 'n', 's', '\022', 'i', '\n', '\026', 'h', 't', 't', 'p', '2', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_',
+'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '\t', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
+'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 't', 't', 'p', '2', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l',
+'O', 'p', 't', 'i', 'o', 'n', 's', 'B', '\007', '\212', '\223', '\267', '*', '\002', '\010', '\001', 'R', '\024', 'h', 't', 't', 'p', '2', 'P', 'r',
+'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', '`', '\n', '\026', 'h', 't', 't', 'p', '3', '_', 'p', 'r',
+'o', 't', 'o', 'c', 'o', 'l', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', ',', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n',
+'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 't', 't', 'p', '3', 'P',
+'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'R', '\024', 'h', 't', 't', 'p', '3', 'P', 'r', 'o', 't',
+'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', ',', '\n', '\013', 's', 'e', 'r', 'v', 'e', 'r', '_', 'n', 'a', 'm',
+'e', '\030', '\n', ' ', '\001', '(', '\t', 'B', '\013', '\372', 'B', '\010', 'r', '\006', '\300', '\001', '\002', '\310', '\001', '\000', 'R', '\n', 's', 'e', 'r',
+'v', 'e', 'r', 'N', 'a', 'm', 'e', '\022', '\271', '\001', '\n', '\034', 's', 'e', 'r', 'v', 'e', 'r', '_', 'h', 'e', 'a', 'd', 'e', 'r',
+'_', 't', 'r', 'a', 'n', 's', 'f', 'o', 'r', 'm', 'a', 't', 'i', 'o', 'n', '\030', '\"', ' ', '\001', '(', '\016', '2', 'm', '.', 'e',
+'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n',
+'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a',
+'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a',
+'n', 'a', 'g', 'e', 'r', '.', 'S', 'e', 'r', 'v', 'e', 'r', 'H', 'e', 'a', 'd', 'e', 'r', 'T', 'r', 'a', 'n', 's', 'f', 'o',
+'r', 'm', 'a', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\032', 's', 'e', 'r', 'v', 'e', 'r',
+'H', 'e', 'a', 'd', 'e', 'r', 'T', 'r', 'a', 'n', 's', 'f', 'o', 'r', 'm', 'a', 't', 'i', 'o', 'n', '\022', 'r', '\n', '\034', 's',
+'c', 'h', 'e', 'm', 'e', '_', 'h', 'e', 'a', 'd', 'e', 'r', '_', 't', 'r', 'a', 'n', 's', 'f', 'o', 'r', 'm', 'a', 't', 'i',
+'o', 'n', '\030', '0', ' ', '\001', '(', '\013', '2', '0', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c',
+'o', 'r', 'e', '.', 'v', '3', '.', 'S', 'c', 'h', 'e', 'm', 'e', 'H', 'e', 'a', 'd', 'e', 'r', 'T', 'r', 'a', 'n', 's', 'f',
+'o', 'r', 'm', 'a', 't', 'i', 'o', 'n', 'R', '\032', 's', 'c', 'h', 'e', 'm', 'e', 'H', 'e', 'a', 'd', 'e', 'r', 'T', 'r', 'a',
+'n', 's', 'f', 'o', 'r', 'm', 'a', 't', 'i', 'o', 'n', '\022', ']', '\n', '\026', 'm', 'a', 'x', '_', 'r', 'e', 'q', 'u', 'e', 's',
+'t', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 'k', 'b', '\030', '\035', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g',
+'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\n',
+'\372', 'B', '\007', '*', '\005', '\030', '\200', '@', ' ', '\000', 'R', '\023', 'm', 'a', 'x', 'R', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a',
+'d', 'e', 'r', 's', 'K', 'b', '\022', 'R', '\n', '\023', 's', 't', 'r', 'e', 'a', 'm', '_', 'i', 'd', 'l', 'e', '_', 't', 'i', 'm',
+'e', 'o', 'u', 't', '\030', '\030', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o',
+'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\007', '\212', '\223', '\267', '*', '\002', '\010', '\001', 'R', '\021', 's', 't',
+'r', 'e', 'a', 'm', 'I', 'd', 'l', 'e', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'K', '\n', '\017', 'r', 'e', 'q', 'u', 'e', 's',
+'t', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\034', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.',
+'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\007', '\212', '\223', '\267', '*', '\002', '\010',
+'\001', 'R', '\016', 'r', 'e', 'q', 'u', 'e', 's', 't', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'b', '\n', '\027', 'r', 'e', 'q', 'u',
+'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', ')', ' ', '\001', '(', '\013',
+'2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i',
+'o', 'n', 'B', '\017', '\372', 'B', '\005', '\252', '\001', '\002', '2', '\000', '\212', '\223', '\267', '*', '\002', '\010', '\001', 'R', '\025', 'r', 'e', 'q', 'u',
+'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', '>', '\n', '\r', 'd', 'r', 'a', 'i',
+'n', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\014', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.',
+'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\014', 'd', 'r', 'a', 'i', 'n', 'T',
+'i', 'm', 'e', 'o', 'u', 't', '\022', 'M', '\n', '\025', 'd', 'e', 'l', 'a', 'y', 'e', 'd', '_', 'c', 'l', 'o', 's', 'e', '_', 't',
+'i', 'm', 'e', 'o', 'u', 't', '\030', '\032', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o',
+'t', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\023', 'd', 'e', 'l', 'a', 'y', 'e', 'd', 'C', 'l',
+'o', 's', 'e', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'C', '\n', '\n', 'a', 'c', 'c', 'e', 's', 's', '_', 'l', 'o', 'g', '\030',
+'\r', ' ', '\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e',
+'s', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'A', 'c', 'c', 'e', 's', 's', 'L', 'o', 'g', 'R', '\t', 'a', 'c', 'c', 'e', 's',
+'s', 'L', 'o', 'g', '\022', 'Q', '\n', '\022', 'u', 's', 'e', '_', 'r', 'e', 'm', 'o', 't', 'e', '_', 'a', 'd', 'd', 'r', 'e', 's',
+'s', '\030', '\016', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
+'.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\212', '\223', '\267', '*', '\002', '\010', '\001', 'R', '\020', 'u', 's', 'e', 'R',
+'e', 'm', 'o', 't', 'e', 'A', 'd', 'd', 'r', 'e', 's', 's', '\022', '<', '\n', '\024', 'x', 'f', 'f', '_', 'n', 'u', 'm', '_', 't',
+'r', 'u', 's', 't', 'e', 'd', '_', 'h', 'o', 'p', 's', '\030', '\023', ' ', '\001', '(', '\r', 'B', '\013', '\030', '\001', '\222', '\307', '\206', '\330',
+'\004', '\003', '3', '.', '0', 'R', '\021', 'x', 'f', 'f', 'N', 'u', 'm', 'T', 'r', 'u', 's', 't', 'e', 'd', 'H', 'o', 'p', 's', '\022',
+'s', '\n', ' ', 'o', 'r', 'i', 'g', 'i', 'n', 'a', 'l', '_', 'i', 'p', '_', 'd', 'e', 't', 'e', 'c', 't', 'i', 'o', 'n', '_',
+'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '\030', '.', ' ', '\003', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.',
+'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n',
+'s', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\035', 'o', 'r', 'i', 'g', 'i', 'n', 'a', 'l', 'I', 'p', 'D', 'e', 't',
+'e', 'c', 't', 'i', 'o', 'n', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '\022', '\240', '\001', '\n', '\027', 'i', 'n', 't', 'e',
+'r', 'n', 'a', 'l', '_', 'a', 'd', 'd', 'r', 'e', 's', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\031', ' ', '\001', '(', '\013',
+'2', 'h', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e',
+'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o',
+'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i',
+'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'A', 'd', 'd', 'r', 'e', 's', 's',
+'C', 'o', 'n', 'f', 'i', 'g', 'R', '\025', 'i', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'A', 'd', 'd', 'r', 'e', 's', 's', 'C', 'o',
+'n', 'f', 'i', 'g', '\022', '&', '\n', '\017', 's', 'k', 'i', 'p', '_', 'x', 'f', 'f', '_', 'a', 'p', 'p', 'e', 'n', 'd', '\030', '\025',
+' ', '\001', '(', '\010', 'R', '\r', 's', 'k', 'i', 'p', 'X', 'f', 'f', 'A', 'p', 'p', 'e', 'n', 'd', '\022', '\035', '\n', '\003', 'v', 'i',
+'a', '\030', '\026', ' ', '\001', '(', '\t', 'B', '\013', '\372', 'B', '\010', 'r', '\006', '\300', '\001', '\002', '\310', '\001', '\000', 'R', '\003', 'v', 'i', 'a',
+'\022', 'J', '\n', '\023', 'g', 'e', 'n', 'e', 'r', 'a', 't', 'e', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'i', 'd', '\030', '\017',
+' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o',
+'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\021', 'g', 'e', 'n', 'e', 'r', 'a', 't', 'e', 'R', 'e', 'q', 'u', 'e', 's', 't', 'I',
+'d', '\022', '?', '\n', '\034', 'p', 'r', 'e', 's', 'e', 'r', 'v', 'e', '_', 'e', 'x', 't', 'e', 'r', 'n', 'a', 'l', '_', 'r', 'e',
+'q', 'u', 'e', 's', 't', '_', 'i', 'd', '\030', ' ', ' ', '\001', '(', '\010', 'R', '\031', 'p', 'r', 'e', 's', 'e', 'r', 'v', 'e', 'E',
+'x', 't', 'e', 'r', 'n', 'a', 'l', 'R', 'e', 'q', 'u', 'e', 's', 't', 'I', 'd', '\022', 'G', '\n', '!', 'a', 'l', 'w', 'a', 'y',
+'s', '_', 's', 'e', 't', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'i', 'd', '_', 'i', 'n', '_', 'r', 'e', 's', 'p', 'o',
+'n', 's', 'e', '\030', '%', ' ', '\001', '(', '\010', 'R', '\034', 'a', 'l', 'w', 'a', 'y', 's', 'S', 'e', 't', 'R', 'e', 'q', 'u', 'e',
+'s', 't', 'I', 'd', 'I', 'n', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '\022', '\264', '\001', '\n', '\033', 'f', 'o', 'r', 'w', 'a', 'r',
+'d', '_', 'c', 'l', 'i', 'e', 'n', 't', '_', 'c', 'e', 'r', 't', '_', 'd', 'e', 't', 'a', 'i', 'l', 's', '\030', '\020', ' ', '\001',
+'(', '\016', '2', 'k', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l',
+'t', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't',
+'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c',
+'t', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'F', 'o', 'r', 'w', 'a', 'r', 'd', 'C', 'l', 'i', 'e', 'n', 't',
+'C', 'e', 'r', 't', 'D', 'e', 't', 'a', 'i', 'l', 's', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\030', 'f', 'o',
+'r', 'w', 'a', 'r', 'd', 'C', 'l', 'i', 'e', 'n', 't', 'C', 'e', 'r', 't', 'D', 'e', 't', 'a', 'i', 'l', 's', '\022', '\264', '\001',
+'\n', '\037', 's', 'e', 't', '_', 'c', 'u', 'r', 'r', 'e', 'n', 't', '_', 'c', 'l', 'i', 'e', 'n', 't', '_', 'c', 'e', 'r', 't',
+'_', 'd', 'e', 't', 'a', 'i', 'l', 's', '\030', '\021', ' ', '\001', '(', '\013', '2', 'n', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x',
+'t', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.',
'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v',
-'2', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'T',
-'r', 'a', 'c', 'i', 'n', 'g', 'J', '\004', '\010', '\001', '\020', '\002', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\016', 'o', 'p', 'e', 'r', 'a',
-'t', 'i', 'o', 'n', '_', 'n', 'a', 'm', 'e', 'R', '\030', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r',
-'s', '_', 'f', 'o', 'r', '_', 't', 'a', 'g', 's', '\032', '\245', '\001', '\n', '\025', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'A', 'd',
-'d', 'r', 'e', 's', 's', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '!', '\n', '\014', 'u', 'n', 'i', 'x', '_', 's', 'o', 'c', 'k', 'e',
-'t', 's', '\030', '\001', ' ', '\001', '(', '\010', 'R', '\013', 'u', 'n', 'i', 'x', 'S', 'o', 'c', 'k', 'e', 't', 's', ':', 'i', '\232', '\305',
-'\210', '\036', 'd', '\n', 'b', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.',
-'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm',
-'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M',
-'a', 'n', 'a', 'g', 'e', 'r', '.', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'A', 'd', 'd', 'r', 'e', 's', 's', 'C', 'o', 'n',
-'f', 'i', 'g', '\032', '\230', '\002', '\n', '\033', 'S', 'e', 't', 'C', 'u', 'r', 'r', 'e', 'n', 't', 'C', 'l', 'i', 'e', 'n', 't', 'C',
-'e', 'r', 't', 'D', 'e', 't', 'a', 'i', 'l', 's', '\022', '4', '\n', '\007', 's', 'u', 'b', 'j', 'e', 'c', 't', '\030', '\001', ' ', '\001',
-'(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l',
-'V', 'a', 'l', 'u', 'e', 'R', '\007', 's', 'u', 'b', 'j', 'e', 'c', 't', '\022', '\022', '\n', '\004', 'c', 'e', 'r', 't', '\030', '\003', ' ',
-'\001', '(', '\010', 'R', '\004', 'c', 'e', 'r', 't', '\022', '\024', '\n', '\005', 'c', 'h', 'a', 'i', 'n', '\030', '\006', ' ', '\001', '(', '\010', 'R',
-'\005', 'c', 'h', 'a', 'i', 'n', '\022', '\020', '\n', '\003', 'd', 'n', 's', '\030', '\004', ' ', '\001', '(', '\010', 'R', '\003', 'd', 'n', 's', '\022',
-'\020', '\n', '\003', 'u', 'r', 'i', '\030', '\005', ' ', '\001', '(', '\010', 'R', '\003', 'u', 'r', 'i', ':', 'o', '\232', '\305', '\210', '\036', 'j', '\n',
-'h', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w',
-'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g',
-'e', 'r', '.', 'v', '2', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g',
-'e', 'r', '.', 'S', 'e', 't', 'C', 'u', 'r', 'r', 'e', 'n', 't', 'C', 'l', 'i', 'e', 'n', 't', 'C', 'e', 'r', 't', 'D', 'e',
-'t', 'a', 'i', 'l', 's', 'J', '\004', '\010', '\002', '\020', '\003', '\032', '\256', '\002', '\n', '\r', 'U', 'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o',
-'n', 'f', 'i', 'g', '\022', '!', '\n', '\014', 'u', 'p', 'g', 'r', 'a', 'd', 'e', '_', 't', 'y', 'p', 'e', '\030', '\001', ' ', '\001', '(',
-'\t', 'R', '\013', 'u', 'p', 'g', 'r', 'a', 'd', 'e', 'T', 'y', 'p', 'e', '\022', 'a', '\n', '\007', 'f', 'i', 'l', 't', 'e', 'r', 's',
-'\030', '\002', ' ', '\003', '(', '\013', '2', 'G', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's',
-'.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n',
-'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'H', 't', 't', 'p', 'F', 'i',
-'l', 't', 'e', 'r', 'R', '\007', 'f', 'i', 'l', 't', 'e', 'r', 's', '\022', '4', '\n', '\007', 'e', 'n', 'a', 'b', 'l', 'e', 'd', '\030',
-'\003', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B',
-'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\007', 'e', 'n', 'a', 'b', 'l', 'e', 'd', ':', 'a', '\232', '\305', '\210', '\036', '\\', '\n',
-'Z', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w',
+'3', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'S',
+'e', 't', 'C', 'u', 'r', 'r', 'e', 'n', 't', 'C', 'l', 'i', 'e', 'n', 't', 'C', 'e', 'r', 't', 'D', 'e', 't', 'a', 'i', 'l',
+'s', 'R', '\033', 's', 'e', 't', 'C', 'u', 'r', 'r', 'e', 'n', 't', 'C', 'l', 'i', 'e', 'n', 't', 'C', 'e', 'r', 't', 'D', 'e',
+'t', 'a', 'i', 'l', 's', '\022', ',', '\n', '\022', 'p', 'r', 'o', 'x', 'y', '_', '1', '0', '0', '_', 'c', 'o', 'n', 't', 'i', 'n',
+'u', 'e', '\030', '\022', ' ', '\001', '(', '\010', 'R', '\020', 'p', 'r', 'o', 'x', 'y', '1', '0', '0', 'C', 'o', 'n', 't', 'i', 'n', 'u',
+'e', '\022', 'e', '\n', '1', 'r', 'e', 'p', 'r', 'e', 's', 'e', 'n', 't', '_', 'i', 'p', 'v', '4', '_', 'r', 'e', 'm', 'o', 't',
+'e', '_', 'a', 'd', 'd', 'r', 'e', 's', 's', '_', 'a', 's', '_', 'i', 'p', 'v', '4', '_', 'm', 'a', 'p', 'p', 'e', 'd', '_',
+'i', 'p', 'v', '6', '\030', '\024', ' ', '\001', '(', '\010', 'R', '*', 'r', 'e', 'p', 'r', 'e', 's', 'e', 'n', 't', 'I', 'p', 'v', '4',
+'R', 'e', 'm', 'o', 't', 'e', 'A', 'd', 'd', 'r', 'e', 's', 's', 'A', 's', 'I', 'p', 'v', '4', 'M', 'a', 'p', 'p', 'e', 'd',
+'I', 'p', 'v', '6', '\022', '\211', '\001', '\n', '\017', 'u', 'p', 'g', 'r', 'a', 'd', 'e', '_', 'c', 'o', 'n', 'f', 'i', 'g', 's', '\030',
+'\027', ' ', '\003', '(', '\013', '2', '`', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.',
+'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n',
+'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'H', 't', 't', 'p', 'C', 'o', 'n',
+'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'U', 'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o', 'n',
+'f', 'i', 'g', 'R', '\016', 'u', 'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 's', '\022', 'A', '\n', '\016', 'n', 'o',
+'r', 'm', 'a', 'l', 'i', 'z', 'e', '_', 'p', 'a', 't', 'h', '\030', '\036', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g',
+'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\r', 'n', 'o',
+'r', 'm', 'a', 'l', 'i', 'z', 'e', 'P', 'a', 't', 'h', '\022', '#', '\n', '\r', 'm', 'e', 'r', 'g', 'e', '_', 's', 'l', 'a', 's',
+'h', 'e', 's', '\030', '!', ' ', '\001', '(', '\010', 'R', '\014', 'm', 'e', 'r', 'g', 'e', 'S', 'l', 'a', 's', 'h', 'e', 's', '\022', '\267',
+'\001', '\n', ' ', 'p', 'a', 't', 'h', '_', 'w', 'i', 't', 'h', '_', 'e', 's', 'c', 'a', 'p', 'e', 'd', '_', 's', 'l', 'a', 's',
+'h', 'e', 's', '_', 'a', 'c', 't', 'i', 'o', 'n', '\030', '-', ' ', '\001', '(', '\016', '2', 'o', '.', 'e', 'n', 'v', 'o', 'y', '.',
+'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r',
+'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r',
+'.', 'v', '3', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r',
+'.', 'P', 'a', 't', 'h', 'W', 'i', 't', 'h', 'E', 's', 'c', 'a', 'p', 'e', 'd', 'S', 'l', 'a', 's', 'h', 'e', 's', 'A', 'c',
+'t', 'i', 'o', 'n', 'R', '\034', 'p', 'a', 't', 'h', 'W', 'i', 't', 'h', 'E', 's', 'c', 'a', 'p', 'e', 'd', 'S', 'l', 'a', 's',
+'h', 'e', 's', 'A', 'c', 't', 'i', 'o', 'n', '\022', '\201', '\001', '\n', '\024', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'i', 'd', '_',
+'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '\030', '$', ' ', '\001', '(', '\013', '2', 'O', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e',
+'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k',
+'.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.',
+'v', '3', '.', 'R', 'e', 'q', 'u', 'e', 's', 't', 'I', 'D', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'R', '\022', 'r', 'e',
+'q', 'u', 'e', 's', 't', 'I', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '\022', '{', '\n', '\022', 'l', 'o', 'c', 'a', 'l',
+'_', 'r', 'e', 'p', 'l', 'y', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '&', ' ', '\001', '(', '\013', '2', 'M', '.', 'e', 'n', 'v',
+'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't',
+'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a',
+'g', 'e', 'r', '.', 'v', '3', '.', 'L', 'o', 'c', 'a', 'l', 'R', 'e', 'p', 'l', 'y', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\020',
+'l', 'o', 'c', 'a', 'l', 'R', 'e', 'p', 'l', 'y', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'P', '\n', '\030', 's', 't', 'r', 'i', 'p',
+'_', 'm', 'a', 't', 'c', 'h', 'i', 'n', 'g', '_', 'h', 'o', 's', 't', '_', 'p', 'o', 'r', 't', '\030', '\'', ' ', '\001', '(', '\010',
+'B', '\027', '\362', '\230', '\376', '\217', '\005', '\021', '\022', '\017', 's', 't', 'r', 'i', 'p', '_', 'p', 'o', 'r', 't', '_', 'm', 'o', 'd', 'e',
+'R', '\025', 's', 't', 'r', 'i', 'p', 'M', 'a', 't', 'c', 'h', 'i', 'n', 'g', 'H', 'o', 's', 't', 'P', 'o', 'r', 't', '\022', '/',
+'\n', '\023', 's', 't', 'r', 'i', 'p', '_', 'a', 'n', 'y', '_', 'h', 'o', 's', 't', '_', 'p', 'o', 'r', 't', '\030', '*', ' ', '\001',
+'(', '\010', 'H', '\001', 'R', '\020', 's', 't', 'r', 'i', 'p', 'A', 'n', 'y', 'H', 'o', 's', 't', 'P', 'o', 'r', 't', '\022', 'i', '\n',
+'$', 's', 't', 'r', 'e', 'a', 'm', '_', 'e', 'r', 'r', 'o', 'r', '_', 'o', 'n', '_', 'i', 'n', 'v', 'a', 'l', 'i', 'd', '_',
+'h', 't', 't', 'p', '_', 'm', 'e', 's', 's', 'a', 'g', 'e', '\030', '(', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g',
+'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\037', 's', 't',
+'r', 'e', 'a', 'm', 'E', 'r', 'r', 'o', 'r', 'O', 'n', 'I', 'n', 'v', 'a', 'l', 'i', 'd', 'H', 't', 't', 'p', 'M', 'e', 's',
+'s', 'a', 'g', 'e', '\022', '\251', '\001', '\n', '\032', 'p', 'a', 't', 'h', '_', 'n', 'o', 'r', 'm', 'a', 'l', 'i', 'z', 'a', 't', 'i',
+'o', 'n', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '+', ' ', '\001', '(', '\013', '2', 'k', '.', 'e', 'n', 'v', 'o', 'y', '.',
+'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r',
+'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r',
+'.', 'v', '3', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r',
+'.', 'P', 'a', 't', 'h', 'N', 'o', 'r', 'm', 'a', 'l', 'i', 'z', 'a', 't', 'i', 'o', 'n', 'O', 'p', 't', 'i', 'o', 'n', 's',
+'R', '\030', 'p', 'a', 't', 'h', 'N', 'o', 'r', 'm', 'a', 'l', 'i', 'z', 'a', 't', 'i', 'o', 'n', 'O', 'p', 't', 'i', 'o', 'n',
+'s', '\022', '5', '\n', '\027', 's', 't', 'r', 'i', 'p', '_', 't', 'r', 'a', 'i', 'l', 'i', 'n', 'g', '_', 'h', 'o', 's', 't', '_',
+'d', 'o', 't', '\030', '/', ' ', '\001', '(', '\010', 'R', '\024', 's', 't', 'r', 'i', 'p', 'T', 'r', 'a', 'i', 'l', 'i', 'n', 'g', 'H',
+'o', 's', 't', 'D', 'o', 't', '\032', '\366', '\004', '\n', '\007', 'T', 'r', 'a', 'c', 'i', 'n', 'g', '\022', '?', '\n', '\017', 'c', 'l', 'i',
+'e', 'n', 't', '_', 's', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '\026', '.', 'e', 'n', 'v', 'o',
+'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\016', 'c', 'l', 'i', 'e', 'n', 't',
+'S', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\022', '?', '\n', '\017', 'r', 'a', 'n', 'd', 'o', 'm', '_', 's', 'a', 'm', 'p', 'l', 'i',
+'n', 'g', '\030', '\004', ' ', '\001', '(', '\013', '2', '\026', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.',
+'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\016', 'r', 'a', 'n', 'd', 'o', 'm', 'S', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\022', 'A',
+'\n', '\020', 'o', 'v', 'e', 'r', 'a', 'l', 'l', '_', 's', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\030', '\005', ' ', '\001', '(', '\013', '2',
+'\026', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\017',
+'o', 'v', 'e', 'r', 'a', 'l', 'l', 'S', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\022', '\030', '\n', '\007', 'v', 'e', 'r', 'b', 'o', 's',
+'e', '\030', '\006', ' ', '\001', '(', '\010', 'R', '\007', 'v', 'e', 'r', 'b', 'o', 's', 'e', '\022', 'K', '\n', '\023', 'm', 'a', 'x', '_', 'p',
+'a', 't', 'h', '_', 't', 'a', 'g', '_', 'l', 'e', 'n', 'g', 't', 'h', '\030', '\007', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o',
+'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e',
+'R', '\020', 'm', 'a', 'x', 'P', 'a', 't', 'h', 'T', 'a', 'g', 'L', 'e', 'n', 'g', 't', 'h', '\022', 'A', '\n', '\013', 'c', 'u', 's',
+'t', 'o', 'm', '_', 't', 'a', 'g', 's', '\030', '\010', ' ', '\003', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y',
+'p', 'e', '.', 't', 'r', 'a', 'c', 'i', 'n', 'g', '.', 'v', '3', '.', 'C', 'u', 's', 't', 'o', 'm', 'T', 'a', 'g', 'R', '\n',
+'c', 'u', 's', 't', 'o', 'm', 'T', 'a', 'g', 's', '\022', '?', '\n', '\010', 'p', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '\030', '\t', ' ',
+'\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 't', 'r', 'a', 'c', 'e', '.',
+'v', '3', '.', 'T', 'r', 'a', 'c', 'i', 'n', 'g', '.', 'H', 't', 't', 'p', 'R', '\010', 'p', 'r', 'o', 'v', 'i', 'd', 'e', 'r',
+'\"', '(', '\n', '\r', 'O', 'p', 'e', 'r', 'a', 't', 'i', 'o', 'n', 'N', 'a', 'm', 'e', '\022', '\013', '\n', '\007', 'I', 'N', 'G', 'R',
+'E', 'S', 'S', '\020', '\000', '\022', '\n', '\n', '\006', 'E', 'G', 'R', 'E', 'S', 'S', '\020', '\001', ':', '[', '\232', '\305', '\210', '\036', 'V', '\n',
+'T', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w',
'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g',
'e', 'r', '.', 'v', '2', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g',
-'e', 'r', '.', 'U', 'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '\"', '6', '\n', '\t', 'C', 'o', 'd', 'e', 'c',
-'T', 'y', 'p', 'e', '\022', '\010', '\n', '\004', 'A', 'U', 'T', 'O', '\020', '\000', '\022', '\t', '\n', '\005', 'H', 'T', 'T', 'P', '1', '\020', '\001',
-'\022', '\t', '\n', '\005', 'H', 'T', 'T', 'P', '2', '\020', '\002', '\022', '\t', '\n', '\005', 'H', 'T', 'T', 'P', '3', '\020', '\003', '\"', 'S', '\n',
-'\032', 'S', 'e', 'r', 'v', 'e', 'r', 'H', 'e', 'a', 'd', 'e', 'r', 'T', 'r', 'a', 'n', 's', 'f', 'o', 'r', 'm', 'a', 't', 'i',
-'o', 'n', '\022', '\r', '\n', '\t', 'O', 'V', 'E', 'R', 'W', 'R', 'I', 'T', 'E', '\020', '\000', '\022', '\024', '\n', '\020', 'A', 'P', 'P', 'E',
-'N', 'D', '_', 'I', 'F', '_', 'A', 'B', 'S', 'E', 'N', 'T', '\020', '\001', '\022', '\020', '\n', '\014', 'P', 'A', 'S', 'S', '_', 'T', 'H',
-'R', 'O', 'U', 'G', 'H', '\020', '\002', '\"', 'y', '\n', '\030', 'F', 'o', 'r', 'w', 'a', 'r', 'd', 'C', 'l', 'i', 'e', 'n', 't', 'C',
-'e', 'r', 't', 'D', 'e', 't', 'a', 'i', 'l', 's', '\022', '\014', '\n', '\010', 'S', 'A', 'N', 'I', 'T', 'I', 'Z', 'E', '\020', '\000', '\022',
-'\020', '\n', '\014', 'F', 'O', 'R', 'W', 'A', 'R', 'D', '_', 'O', 'N', 'L', 'Y', '\020', '\001', '\022', '\022', '\n', '\016', 'A', 'P', 'P', 'E',
-'N', 'D', '_', 'F', 'O', 'R', 'W', 'A', 'R', 'D', '\020', '\002', '\022', '\020', '\n', '\014', 'S', 'A', 'N', 'I', 'T', 'I', 'Z', 'E', '_',
-'S', 'E', 'T', '\020', '\003', '\022', '\027', '\n', '\023', 'A', 'L', 'W', 'A', 'Y', 'S', '_', 'F', 'O', 'R', 'W', 'A', 'R', 'D', '_', 'O',
-'N', 'L', 'Y', '\020', '\004', ':', 'S', '\232', '\305', '\210', '\036', 'N', '\n', 'L', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
-'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n',
-'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'H', 't', 't', 'p', 'C', 'o',
-'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', 'B', '\026', '\n', '\017', 'r', 'o', 'u', 't', 'e', '_',
-'s', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', 'B', '\021', '\n', '\017', 's', 't', 'r', 'i', 'p', '_', 'p',
-'o', 'r', 't', '_', 'm', 'o', 'd', 'e', 'J', '\004', '\010', '\033', '\020', '\034', 'J', '\004', '\010', '\013', '\020', '\014', 'R', '\014', 'i', 'd', 'l',
-'e', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\"', '\312', '\001', '\n', '\020', 'L', 'o', 'c', 'a', 'l', 'R', 'e', 'p', 'l', 'y', 'C',
-'o', 'n', 'f', 'i', 'g', '\022', 'e', '\n', '\007', 'm', 'a', 'p', 'p', 'e', 'r', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', 'K', '.',
-'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.',
+'e', 'r', '.', 'T', 'r', 'a', 'c', 'i', 'n', 'g', 'J', '\004', '\010', '\001', '\020', '\002', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\016', 'o',
+'p', 'e', 'r', 'a', 't', 'i', 'o', 'n', '_', 'n', 'a', 'm', 'e', 'R', '\030', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'h', 'e',
+'a', 'd', 'e', 'r', 's', '_', 'f', 'o', 'r', '_', 't', 'a', 'g', 's', '\032', '\245', '\001', '\n', '\025', 'I', 'n', 't', 'e', 'r', 'n',
+'a', 'l', 'A', 'd', 'd', 'r', 'e', 's', 's', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '!', '\n', '\014', 'u', 'n', 'i', 'x', '_', 's',
+'o', 'c', 'k', 'e', 't', 's', '\030', '\001', ' ', '\001', '(', '\010', 'R', '\013', 'u', 'n', 'i', 'x', 'S', 'o', 'c', 'k', 'e', 't', 's',
+':', 'i', '\232', '\305', '\210', '\036', 'd', '\n', 'b', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l',
+'t', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i',
+'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't',
+'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'A', 'd', 'd', 'r', 'e', 's',
+'s', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\230', '\002', '\n', '\033', 'S', 'e', 't', 'C', 'u', 'r', 'r', 'e', 'n', 't', 'C', 'l', 'i',
+'e', 'n', 't', 'C', 'e', 'r', 't', 'D', 'e', 't', 'a', 'i', 'l', 's', '\022', '4', '\n', '\007', 's', 'u', 'b', 'j', 'e', 'c', 't',
+'\030', '\001', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.',
+'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\007', 's', 'u', 'b', 'j', 'e', 'c', 't', '\022', '\022', '\n', '\004', 'c', 'e', 'r',
+'t', '\030', '\003', ' ', '\001', '(', '\010', 'R', '\004', 'c', 'e', 'r', 't', '\022', '\024', '\n', '\005', 'c', 'h', 'a', 'i', 'n', '\030', '\006', ' ',
+'\001', '(', '\010', 'R', '\005', 'c', 'h', 'a', 'i', 'n', '\022', '\020', '\n', '\003', 'd', 'n', 's', '\030', '\004', ' ', '\001', '(', '\010', 'R', '\003',
+'d', 'n', 's', '\022', '\020', '\n', '\003', 'u', 'r', 'i', '\030', '\005', ' ', '\001', '(', '\010', 'R', '\003', 'u', 'r', 'i', ':', 'o', '\232', '\305',
+'\210', '\036', 'j', '\n', 'h', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.',
'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm',
-'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'M', 'a', 'p', 'p', 'e', 'r', 'R',
-'\007', 'm', 'a', 'p', 'p', 'e', 'r', 's', '\022', 'O', '\n', '\013', 'b', 'o', 'd', 'y', '_', 'f', 'o', 'r', 'm', 'a', 't', '\030', '\002',
-' ', '\001', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.',
-'v', '3', '.', 'S', 'u', 'b', 's', 't', 'i', 't', 'u', 't', 'i', 'o', 'n', 'F', 'o', 'r', 'm', 'a', 't', 'S', 't', 'r', 'i',
-'n', 'g', 'R', '\n', 'b', 'o', 'd', 'y', 'F', 'o', 'r', 'm', 'a', 't', '\"', '\234', '\003', '\n', '\016', 'R', 'e', 's', 'p', 'o', 'n',
-'s', 'e', 'M', 'a', 'p', 'p', 'e', 'r', '\022', 'L', '\n', '\006', 'f', 'i', 'l', 't', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\013', '2',
-'*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.',
-'v', '3', '.', 'A', 'c', 'c', 'e', 's', 's', 'L', 'o', 'g', 'F', 'i', 'l', 't', 'e', 'r', 'B', '\010', '\372', 'B', '\005', '\212', '\001',
-'\002', '\020', '\001', 'R', '\006', 'f', 'i', 'l', 't', 'e', 'r', '\022', 'J', '\n', '\013', 's', 't', 'a', 't', 'u', 's', '_', 'c', 'o', 'd',
-'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
-'.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\013', '\372', 'B', '\010', '*', '\006', '\020', '\330', '\004', '(', '\310', '\001',
-'R', '\n', 's', 't', 'a', 't', 'u', 's', 'C', 'o', 'd', 'e', '\022', '4', '\n', '\004', 'b', 'o', 'd', 'y', '\030', '\003', ' ', '\001', '(',
-'\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.',
-'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\004', 'b', 'o', 'd', 'y', '\022', '`', '\n', '\024', 'b', 'o', 'd', 'y', '_',
-'f', 'o', 'r', 'm', 'a', 't', '_', 'o', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '\030', '\004', ' ', '\001', '(', '\013', '2', '.', '.', 'e',
-'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'S', 'u', 'b', 's', 't',
-'i', 't', 'u', 't', 'i', 'o', 'n', 'F', 'o', 'r', 'm', 'a', 't', 'S', 't', 'r', 'i', 'n', 'g', 'R', '\022', 'b', 'o', 'd', 'y',
-'F', 'o', 'r', 'm', 'a', 't', 'O', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '\022', 'X', '\n', '\016', 'h', 'e', 'a', 'd', 'e', 'r', 's',
-'_', 't', 'o', '_', 'a', 'd', 'd', '\030', '\005', ' ', '\003', '(', '\013', '2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
-'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p',
-'t', 'i', 'o', 'n', 'B', '\t', '\372', 'B', '\006', '\222', '\001', '\003', '\020', '\350', '\007', 'R', '\014', 'h', 'e', 'a', 'd', 'e', 'r', 's', 'T',
-'o', 'A', 'd', 'd', '\"', '\307', '\001', '\n', '\003', 'R', 'd', 's', '\022', 'Q', '\n', '\r', 'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'o',
-'u', 'r', 'c', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
-'.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\010', '\372', 'B',
-'\005', '\212', '\001', '\002', '\020', '\001', 'R', '\014', 'c', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', '\022', '*', '\n', '\021', 'r',
-'o', 'u', 't', 'e', '_', 'c', 'o', 'n', 'f', 'i', 'g', '_', 'n', 'a', 'm', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\017', 'r',
-'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'N', 'a', 'm', 'e', ':', 'A', '\232', '\305', '\210', '\036', '<', '\n', ':', 'e', 'n',
-'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k',
-'.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.',
-'v', '2', '.', 'R', 'd', 's', '\"', '\367', '\001', '\n', '\035', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 'C', 'o', 'n',
-'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', 's', 'L', 'i', 's', 't', '\022', 'y', '\n', '\033', 's', 'c', 'o', 'p', 'e', 'd',
-'_', 'r', 'o', 'u', 't', 'e', '_', 'c', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', 's', '\030', '\001', ' ', '\003',
-'(', '\013', '2', '/', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v',
-'3', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o',
-'n', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', 'R', '\031', 's', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 'C',
-'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', 's', ':', '[', '\232', '\305', '\210', '\036', 'V', '\n', 'T', 'e', 'n', 'v',
+'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M',
+'a', 'n', 'a', 'g', 'e', 'r', '.', 'S', 'e', 't', 'C', 'u', 'r', 'r', 'e', 'n', 't', 'C', 'l', 'i', 'e', 'n', 't', 'C', 'e',
+'r', 't', 'D', 'e', 't', 'a', 'i', 'l', 's', 'J', '\004', '\010', '\002', '\020', '\003', '\032', '\256', '\002', '\n', '\r', 'U', 'p', 'g', 'r', 'a',
+'d', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '!', '\n', '\014', 'u', 'p', 'g', 'r', 'a', 'd', 'e', '_', 't', 'y', 'p', 'e', '\030',
+'\001', ' ', '\001', '(', '\t', 'R', '\013', 'u', 'p', 'g', 'r', 'a', 'd', 'e', 'T', 'y', 'p', 'e', '\022', 'a', '\n', '\007', 'f', 'i', 'l',
+'t', 'e', 'r', 's', '\030', '\002', ' ', '\003', '(', '\013', '2', 'G', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's',
+'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p',
+'_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'H', 't',
+'t', 'p', 'F', 'i', 'l', 't', 'e', 'r', 'R', '\007', 'f', 'i', 'l', 't', 'e', 'r', 's', '\022', '4', '\n', '\007', 'e', 'n', 'a', 'b',
+'l', 'e', 'd', '\030', '\003', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b',
+'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\007', 'e', 'n', 'a', 'b', 'l', 'e', 'd', ':', 'a', '\232', '\305',
+'\210', '\036', '\\', '\n', 'Z', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.',
+'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm',
+'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M',
+'a', 'n', 'a', 'g', 'e', 'r', '.', 'U', 'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\345', '\001', '\n', '\030',
+'P', 'a', 't', 'h', 'N', 'o', 'r', 'm', 'a', 'l', 'i', 'z', 'a', 't', 'i', 'o', 'n', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022',
+'c', '\n', '\031', 'f', 'o', 'r', 'w', 'a', 'r', 'd', 'i', 'n', 'g', '_', 't', 'r', 'a', 'n', 's', 'f', 'o', 'r', 'm', 'a', 't',
+'i', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\013', '2', '&', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'h', 't',
+'t', 'p', '.', 'v', '3', '.', 'P', 'a', 't', 'h', 'T', 'r', 'a', 'n', 's', 'f', 'o', 'r', 'm', 'a', 't', 'i', 'o', 'n', 'R',
+'\030', 'f', 'o', 'r', 'w', 'a', 'r', 'd', 'i', 'n', 'g', 'T', 'r', 'a', 'n', 's', 'f', 'o', 'r', 'm', 'a', 't', 'i', 'o', 'n',
+'\022', 'd', '\n', '\032', 'h', 't', 't', 'p', '_', 'f', 'i', 'l', 't', 'e', 'r', '_', 't', 'r', 'a', 'n', 's', 'f', 'o', 'r', 'm',
+'a', 't', 'i', 'o', 'n', '\030', '\002', ' ', '\001', '(', '\013', '2', '&', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.',
+'h', 't', 't', 'p', '.', 'v', '3', '.', 'P', 'a', 't', 'h', 'T', 'r', 'a', 'n', 's', 'f', 'o', 'r', 'm', 'a', 't', 'i', 'o',
+'n', 'R', '\030', 'h', 't', 't', 'p', 'F', 'i', 'l', 't', 'e', 'r', 'T', 'r', 'a', 'n', 's', 'f', 'o', 'r', 'm', 'a', 't', 'i',
+'o', 'n', '\"', '6', '\n', '\t', 'C', 'o', 'd', 'e', 'c', 'T', 'y', 'p', 'e', '\022', '\010', '\n', '\004', 'A', 'U', 'T', 'O', '\020', '\000',
+'\022', '\t', '\n', '\005', 'H', 'T', 'T', 'P', '1', '\020', '\001', '\022', '\t', '\n', '\005', 'H', 'T', 'T', 'P', '2', '\020', '\002', '\022', '\t', '\n',
+'\005', 'H', 'T', 'T', 'P', '3', '\020', '\003', '\"', 'S', '\n', '\032', 'S', 'e', 'r', 'v', 'e', 'r', 'H', 'e', 'a', 'd', 'e', 'r', 'T',
+'r', 'a', 'n', 's', 'f', 'o', 'r', 'm', 'a', 't', 'i', 'o', 'n', '\022', '\r', '\n', '\t', 'O', 'V', 'E', 'R', 'W', 'R', 'I', 'T',
+'E', '\020', '\000', '\022', '\024', '\n', '\020', 'A', 'P', 'P', 'E', 'N', 'D', '_', 'I', 'F', '_', 'A', 'B', 'S', 'E', 'N', 'T', '\020', '\001',
+'\022', '\020', '\n', '\014', 'P', 'A', 'S', 'S', '_', 'T', 'H', 'R', 'O', 'U', 'G', 'H', '\020', '\002', '\"', 'y', '\n', '\030', 'F', 'o', 'r',
+'w', 'a', 'r', 'd', 'C', 'l', 'i', 'e', 'n', 't', 'C', 'e', 'r', 't', 'D', 'e', 't', 'a', 'i', 'l', 's', '\022', '\014', '\n', '\010',
+'S', 'A', 'N', 'I', 'T', 'I', 'Z', 'E', '\020', '\000', '\022', '\020', '\n', '\014', 'F', 'O', 'R', 'W', 'A', 'R', 'D', '_', 'O', 'N', 'L',
+'Y', '\020', '\001', '\022', '\022', '\n', '\016', 'A', 'P', 'P', 'E', 'N', 'D', '_', 'F', 'O', 'R', 'W', 'A', 'R', 'D', '\020', '\002', '\022', '\020',
+'\n', '\014', 'S', 'A', 'N', 'I', 'T', 'I', 'Z', 'E', '_', 'S', 'E', 'T', '\020', '\003', '\022', '\027', '\n', '\023', 'A', 'L', 'W', 'A', 'Y',
+'S', '_', 'F', 'O', 'R', 'W', 'A', 'R', 'D', '_', 'O', 'N', 'L', 'Y', '\020', '\004', '\"', '\240', '\001', '\n', '\034', 'P', 'a', 't', 'h',
+'W', 'i', 't', 'h', 'E', 's', 'c', 'a', 'p', 'e', 'd', 'S', 'l', 'a', 's', 'h', 'e', 's', 'A', 'c', 't', 'i', 'o', 'n', '\022',
+'#', '\n', '\037', 'I', 'M', 'P', 'L', 'E', 'M', 'E', 'N', 'T', 'A', 'T', 'I', 'O', 'N', '_', 'S', 'P', 'E', 'C', 'I', 'F', 'I',
+'C', '_', 'D', 'E', 'F', 'A', 'U', 'L', 'T', '\020', '\000', '\022', '\022', '\n', '\016', 'K', 'E', 'E', 'P', '_', 'U', 'N', 'C', 'H', 'A',
+'N', 'G', 'E', 'D', '\020', '\001', '\022', '\022', '\n', '\016', 'R', 'E', 'J', 'E', 'C', 'T', '_', 'R', 'E', 'Q', 'U', 'E', 'S', 'T', '\020',
+'\002', '\022', '\031', '\n', '\025', 'U', 'N', 'E', 'S', 'C', 'A', 'P', 'E', '_', 'A', 'N', 'D', '_', 'R', 'E', 'D', 'I', 'R', 'E', 'C',
+'T', '\020', '\003', '\022', '\030', '\n', '\024', 'U', 'N', 'E', 'S', 'C', 'A', 'P', 'E', '_', 'A', 'N', 'D', '_', 'F', 'O', 'R', 'W', 'A',
+'R', 'D', '\020', '\004', ':', 'S', '\232', '\305', '\210', '\036', 'N', '\n', 'L', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
+'.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n',
+'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'H', 't', 't', 'p', 'C', 'o', 'n',
+'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', 'B', '\026', '\n', '\017', 'r', 'o', 'u', 't', 'e', '_', 's',
+'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', 'B', '\021', '\n', '\017', 's', 't', 'r', 'i', 'p', '_', 'p', 'o',
+'r', 't', '_', 'm', 'o', 'd', 'e', 'J', '\004', '\010', '\033', '\020', '\034', 'J', '\004', '\010', '\013', '\020', '\014', 'R', '\014', 'i', 'd', 'l', 'e',
+'_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\"', '\312', '\001', '\n', '\020', 'L', 'o', 'c', 'a', 'l', 'R', 'e', 'p', 'l', 'y', 'C', 'o',
+'n', 'f', 'i', 'g', '\022', 'e', '\n', '\007', 'm', 'a', 'p', 'p', 'e', 'r', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', 'K', '.', 'e',
+'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n',
+'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a',
+'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'M', 'a', 'p', 'p', 'e', 'r', 'R', '\007',
+'m', 'a', 'p', 'p', 'e', 'r', 's', '\022', 'O', '\n', '\013', 'b', 'o', 'd', 'y', '_', 'f', 'o', 'r', 'm', 'a', 't', '\030', '\002', ' ',
+'\001', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v',
+'3', '.', 'S', 'u', 'b', 's', 't', 'i', 't', 'u', 't', 'i', 'o', 'n', 'F', 'o', 'r', 'm', 'a', 't', 'S', 't', 'r', 'i', 'n',
+'g', 'R', '\n', 'b', 'o', 'd', 'y', 'F', 'o', 'r', 'm', 'a', 't', '\"', '\234', '\003', '\n', '\016', 'R', 'e', 's', 'p', 'o', 'n', 's',
+'e', 'M', 'a', 'p', 'p', 'e', 'r', '\022', 'L', '\n', '\006', 'f', 'i', 'l', 't', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\013', '2', '*',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v',
+'3', '.', 'A', 'c', 'c', 'e', 's', 's', 'L', 'o', 'g', 'F', 'i', 'l', 't', 'e', 'r', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002',
+'\020', '\001', 'R', '\006', 'f', 'i', 'l', 't', 'e', 'r', '\022', 'J', '\n', '\013', 's', 't', 'a', 't', 'u', 's', '_', 'c', 'o', 'd', 'e',
+'\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.',
+'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\013', '\372', 'B', '\010', '*', '\006', '\020', '\330', '\004', '(', '\310', '\001', 'R',
+'\n', 's', 't', 'a', 't', 'u', 's', 'C', 'o', 'd', 'e', '\022', '4', '\n', '\004', 'b', 'o', 'd', 'y', '\030', '\003', ' ', '\001', '(', '\013',
+'2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D',
+'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\004', 'b', 'o', 'd', 'y', '\022', '`', '\n', '\024', 'b', 'o', 'd', 'y', '_', 'f',
+'o', 'r', 'm', 'a', 't', '_', 'o', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '\030', '\004', ' ', '\001', '(', '\013', '2', '.', '.', 'e', 'n',
+'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'S', 'u', 'b', 's', 't', 'i',
+'t', 'u', 't', 'i', 'o', 'n', 'F', 'o', 'r', 'm', 'a', 't', 'S', 't', 'r', 'i', 'n', 'g', 'R', '\022', 'b', 'o', 'd', 'y', 'F',
+'o', 'r', 'm', 'a', 't', 'O', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '\022', 'X', '\n', '\016', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_',
+'t', 'o', '_', 'a', 'd', 'd', '\030', '\005', ' ', '\003', '(', '\013', '2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
+'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't',
+'i', 'o', 'n', 'B', '\t', '\372', 'B', '\006', '\222', '\001', '\003', '\020', '\350', '\007', 'R', '\014', 'h', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o',
+'A', 'd', 'd', '\"', '\307', '\001', '\n', '\003', 'R', 'd', 's', '\022', 'Q', '\n', '\r', 'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'o', 'u',
+'r', 'c', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
+'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\010', '\372', 'B', '\005',
+'\212', '\001', '\002', '\020', '\001', 'R', '\014', 'c', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', '\022', '*', '\n', '\021', 'r', 'o',
+'u', 't', 'e', '_', 'c', 'o', 'n', 'f', 'i', 'g', '_', 'n', 'a', 'm', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\017', 'r', 'o',
+'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'N', 'a', 'm', 'e', ':', 'A', '\232', '\305', '\210', '\036', '<', '\n', ':', 'e', 'n', 'v',
'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.',
'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v',
-'2', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o',
-'n', 's', 'L', 'i', 's', 't', '\"', '\351', '\016', '\n', '\014', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 's', '\022', '\033',
-'\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a',
-'m', 'e', '\022', '\217', '\001', '\n', '\021', 's', 'c', 'o', 'p', 'e', '_', 'k', 'e', 'y', '_', 'b', 'u', 'i', 'l', 'd', 'e', 'r', '\030',
-'\002', ' ', '\001', '(', '\013', '2', 'Y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.',
+'2', '.', 'R', 'd', 's', '\"', '\367', '\001', '\n', '\035', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 'C', 'o', 'n', 'f',
+'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', 's', 'L', 'i', 's', 't', '\022', 'y', '\n', '\033', 's', 'c', 'o', 'p', 'e', 'd', '_',
+'r', 'o', 'u', 't', 'e', '_', 'c', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', 's', '\030', '\001', ' ', '\003', '(',
+'\013', '2', '/', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3',
+'.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n',
+'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', 'R', '\031', 's', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 'C', 'o',
+'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', 's', ':', '[', '\232', '\305', '\210', '\036', 'V', '\n', 'T', 'e', 'n', 'v', 'o',
+'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h',
+'t', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2',
+'.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n',
+'s', 'L', 'i', 's', 't', '\"', '\351', '\016', '\n', '\014', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 's', '\022', '\033', '\n',
+'\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm',
+'e', '\022', '\217', '\001', '\n', '\021', 's', 'c', 'o', 'p', 'e', '_', 'k', 'e', 'y', '_', 'b', 'u', 'i', 'l', 'd', 'e', 'r', '\030', '\002',
+' ', '\001', '(', '\013', '2', 'Y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f',
+'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e',
+'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o',
+'u', 't', 'e', 's', '.', 'S', 'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', 'B', '\010', '\372', 'B', '\005',
+'\212', '\001', '\002', '\020', '\001', 'R', '\017', 's', 'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '\022', 'X', '\n',
+'\021', 'r', 'd', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'o', 'u', 'r', 'c', 'e', '\030', '\003', ' ', '\001', '(', '\013', '2',
+'\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o',
+'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\017', 'r', 'd', 's',
+'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', '\022', '\245', '\001', '\n', ' ', 's', 'c', 'o', 'p', 'e', 'd', '_', 'r',
+'o', 'u', 't', 'e', '_', 'c', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', 's', '_', 'l', 'i', 's', 't', '\030',
+'\004', ' ', '\001', '(', '\013', '2', 'Z', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.',
'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n',
'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R',
-'o', 'u', 't', 'e', 's', '.', 'S', 'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', 'B', '\010', '\372', 'B',
-'\005', '\212', '\001', '\002', '\020', '\001', 'R', '\017', 's', 'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '\022', 'X',
-'\n', '\021', 'r', 'd', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'o', 'u', 'r', 'c', 'e', '\030', '\003', ' ', '\001', '(', '\013',
-'2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C',
-'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\017', 'r', 'd',
-'s', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', '\022', '\245', '\001', '\n', ' ', 's', 'c', 'o', 'p', 'e', 'd', '_',
-'r', 'o', 'u', 't', 'e', '_', 'c', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', 's', '_', 'l', 'i', 's', 't',
-'\030', '\004', ' ', '\001', '(', '\013', '2', 'Z', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's',
+'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', 's', 'L', 'i', 's', 't', 'H', '\000', 'R',
+'\035', 's', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n',
+'s', 'L', 'i', 's', 't', '\022', 'g', '\n', '\n', 's', 'c', 'o', 'p', 'e', 'd', '_', 'r', 'd', 's', '\030', '\005', ' ', '\001', '(', '\013',
+'2', 'F', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e',
+'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o',
+'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'd', 's', 'H', '\000', 'R',
+'\t', 's', 'c', 'o', 'p', 'e', 'd', 'R', 'd', 's', '\032', '\331', '\t', '\n', '\017', 'S', 'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u',
+'i', 'l', 'd', 'e', 'r', '\022', '\221', '\001', '\n', '\t', 'f', 'r', 'a', 'g', 'm', 'e', 'n', 't', 's', '\030', '\001', ' ', '\003', '(', '\013',
+'2', 'i', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e',
+'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o',
+'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 's',
+'.', 'S', 'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'F', 'r', 'a', 'g', 'm', 'e', 'n', 't',
+'B', 'u', 'i', 'l', 'd', 'e', 'r', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', 'R', '\t', 'f', 'r', 'a', 'g', 'm', 'e',
+'n', 't', 's', '\032', '\325', '\007', '\n', '\017', 'F', 'r', 'a', 'g', 'm', 'e', 'n', 't', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '\022', '\266',
+'\001', '\n', '\026', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'v', 'a', 'l', 'u', 'e', '_', 'e', 'x', 't', 'r', 'a', 'c', 't', 'o', 'r',
+'\030', '\001', ' ', '\001', '(', '\013', '2', '~', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's',
'.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n',
'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'S', 'c', 'o', 'p', 'e', 'd',
-'R', 'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', 's', 'L', 'i', 's', 't', 'H', '\000',
-'R', '\035', 's', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o',
-'n', 's', 'L', 'i', 's', 't', '\022', 'g', '\n', '\n', 's', 'c', 'o', 'p', 'e', 'd', '_', 'r', 'd', 's', '\030', '\005', ' ', '\001', '(',
-'\013', '2', 'F', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't',
-'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i',
-'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'd', 's', 'H', '\000',
-'R', '\t', 's', 'c', 'o', 'p', 'e', 'd', 'R', 'd', 's', '\032', '\331', '\t', '\n', '\017', 'S', 'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B',
-'u', 'i', 'l', 'd', 'e', 'r', '\022', '\221', '\001', '\n', '\t', 'f', 'r', 'a', 'g', 'm', 'e', 'n', 't', 's', '\030', '\001', ' ', '\003', '(',
-'\013', '2', 'i', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't',
-'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i',
-'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e',
-'s', '.', 'S', 'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'F', 'r', 'a', 'g', 'm', 'e', 'n',
-'t', 'B', 'u', 'i', 'l', 'd', 'e', 'r', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', 'R', '\t', 'f', 'r', 'a', 'g', 'm',
-'e', 'n', 't', 's', '\032', '\325', '\007', '\n', '\017', 'F', 'r', 'a', 'g', 'm', 'e', 'n', 't', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '\022',
-'\266', '\001', '\n', '\026', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'v', 'a', 'l', 'u', 'e', '_', 'e', 'x', 't', 'r', 'a', 'c', 't', 'o',
-'r', '\030', '\001', ' ', '\001', '(', '\013', '2', '~', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n',
-'s', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o',
-'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'S', 'c', 'o', 'p', 'e',
-'d', 'R', 'o', 'u', 't', 'e', 's', '.', 'S', 'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'F',
-'r', 'a', 'g', 'm', 'e', 'n', 't', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u',
-'e', 'E', 'x', 't', 'r', 'a', 'c', 't', 'o', 'r', 'H', '\000', 'R', '\024', 'h', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e',
-'E', 'x', 't', 'r', 'a', 'c', 't', 'o', 'r', '\032', '\217', '\005', '\n', '\024', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e',
-'E', 'x', 't', 'r', 'a', 'c', 't', 'o', 'r', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007',
-'\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '+', '\n', '\021', 'e', 'l', 'e', 'm', 'e', 'n', 't', '_',
-'s', 'e', 'p', 'a', 'r', 'a', 't', 'o', 'r', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\020', 'e', 'l', 'e', 'm', 'e', 'n', 't', 'S',
-'e', 'p', 'a', 'r', 'a', 't', 'o', 'r', '\022', '\026', '\n', '\005', 'i', 'n', 'd', 'e', 'x', '\030', '\003', ' ', '\001', '(', '\r', 'H', '\000',
-'R', '\005', 'i', 'n', 'd', 'e', 'x', '\022', '\245', '\001', '\n', '\007', 'e', 'l', 'e', 'm', 'e', 'n', 't', '\030', '\004', ' ', '\001', '(', '\013',
-'2', '\210', '\001', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't',
-'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i',
-'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e',
-'s', '.', 'S', 'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'F', 'r', 'a', 'g', 'm', 'e', 'n',
-'t', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'E', 'x', 't', 'r', 'a',
-'c', 't', 'o', 'r', '.', 'K', 'v', 'E', 'l', 'e', 'm', 'e', 'n', 't', 'H', '\000', 'R', '\007', 'e', 'l', 'e', 'm', 'e', 'n', 't',
-'\032', '\333', '\001', '\n', '\t', 'K', 'v', 'E', 'l', 'e', 'm', 'e', 'n', 't', '\022', '%', '\n', '\t', 's', 'e', 'p', 'a', 'r', 'a', 't',
-'o', 'r', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\t', 's', 'e', 'p', 'a', 'r', 'a',
-'t', 'o', 'r', '\022', '\031', '\n', '\003', 'k', 'e', 'y', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001',
-'R', '\003', 'k', 'e', 'y', ':', '\213', '\001', '\232', '\305', '\210', '\036', '\205', '\001', '\n', '\202', '\001', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
-'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_',
-'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'S', 'c', 'o',
-'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 's', '.', 'S', 'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r',
-'.', 'F', 'r', 'a', 'g', 'm', 'e', 'n', 't', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a',
-'l', 'u', 'e', 'E', 'x', 't', 'r', 'a', 'c', 't', 'o', 'r', '.', 'K', 'v', 'E', 'l', 'e', 'm', 'e', 'n', 't', ':', '\177', '\232',
-'\305', '\210', '\036', 'z', '\n', 'x', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r',
-'.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_',
-'m', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 's', '.', 'S',
-'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'F', 'r', 'a', 'g', 'm', 'e', 'n', 't', 'B', 'u',
-'i', 'l', 'd', 'e', 'r', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'E', 'x', 't', 'r', 'a', 'c', 't', 'o',
-'r', 'B', '\016', '\n', '\014', 'e', 'x', 't', 'r', 'a', 'c', 't', '_', 't', 'y', 'p', 'e', ':', 'j', '\232', '\305', '\210', '\036', 'e', '\n',
-'c', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w',
-'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g',
-'e', 'r', '.', 'v', '2', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 's', '.', 'S', 'c', 'o', 'p', 'e', 'K',
-'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'F', 'r', 'a', 'g', 'm', 'e', 'n', 't', 'B', 'u', 'i', 'l', 'd', 'e', 'r',
-'B', '\013', '\n', '\004', 't', 'y', 'p', 'e', '\022', '\003', '\370', 'B', '\001', ':', 'Z', '\232', '\305', '\210', '\036', 'U', '\n', 'S', 'e', 'n', 'v',
-'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.',
-'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v',
-'2', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 's', '.', 'S', 'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u',
-'i', 'l', 'd', 'e', 'r', ':', 'J', '\232', '\305', '\210', '\036', 'E', '\n', 'C', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
-'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n',
-'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'S', 'c', 'o', 'p', 'e', 'd',
-'R', 'o', 'u', 't', 'e', 's', 'B', '\027', '\n', '\020', 'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e',
-'r', '\022', '\003', '\370', 'B', '\001', '\"', '\273', '\001', '\n', '\t', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'd', 's', '\022', 'e', '\n', '\030', 's',
-'c', 'o', 'p', 'e', 'd', '_', 'r', 'd', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'o', 'u', 'r', 'c', 'e', '\030', '\001',
-' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.',
-'v', '3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001',
-'R', '\025', 's', 'c', 'o', 'p', 'e', 'd', 'R', 'd', 's', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', ':', 'G',
-'\232', '\305', '\210', '\036', 'B', '\n', '@', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e',
-'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n',
-'_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'd', 's', '\"', '\314', '\002', '\n',
-'\n', 'H', 't', 't', 'p', 'F', 'i', 'l', 't', 'e', 'r', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t',
-'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '9', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_',
-'c', 'o', 'n', 'f', 'i', 'g', '\030', '\004', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o',
-'t', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'H', '\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', '\022',
-'X', '\n', '\020', 'c', 'o', 'n', 'f', 'i', 'g', '_', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '\030', '\005', ' ', '\001', '(', '\013',
-'2', '+', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'E',
-'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'H', '\000', 'R', '\017', 'c',
-'o', 'n', 'f', 'i', 'g', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '\022', '\037', '\n', '\013', 'i', 's', '_', 'o', 'p', 't', 'i',
-'o', 'n', 'a', 'l', '\030', '\006', ' ', '\001', '(', '\010', 'R', '\n', 'i', 's', 'O', 'p', 't', 'i', 'o', 'n', 'a', 'l', ':', 'H', '\232',
-'\305', '\210', '\036', 'C', '\n', 'A', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r',
-'.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_',
-'m', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'H', 't', 't', 'p', 'F', 'i', 'l', 't', 'e', 'r', 'B', '\r', '\n', '\013',
-'c', 'o', 'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\003', '\020', '\004', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006',
-'c', 'o', 'n', 'f', 'i', 'g', '\"', '\237', '\001', '\n', '\022', 'R', 'e', 'q', 'u', 'e', 's', 't', 'I', 'D', 'E', 'x', 't', 'e', 'n',
-'s', 'i', 'o', 'n', '\022', '7', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\001', ' ', '\001', '(',
-'\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\013',
-'t', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', ':', 'P', '\232', '\305', '\210', '\036', 'K', '\n', 'I', 'e', 'n', 'v', 'o', 'y',
-'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't',
-'t', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.',
-'R', 'e', 'q', 'u', 'e', 's', 't', 'I', 'D', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'B', 'q', '\n', 'I', 'i', 'o', '.',
-'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o',
-'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c',
-'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', 'B', '\032', 'H', 't', 't',
-'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', 'P', 'r', 'o', 't', 'o', 'P', '\001',
-'\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'R', 'o', 'u', 't', 'e', 's', '.', 'S', 'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'F', 'r',
+'a', 'g', 'm', 'e', 'n', 't', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e',
+'E', 'x', 't', 'r', 'a', 'c', 't', 'o', 'r', 'H', '\000', 'R', '\024', 'h', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'E',
+'x', 't', 'r', 'a', 'c', 't', 'o', 'r', '\032', '\217', '\005', '\n', '\024', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'E',
+'x', 't', 'r', 'a', 'c', 't', 'o', 'r', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372',
+'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '+', '\n', '\021', 'e', 'l', 'e', 'm', 'e', 'n', 't', '_', 's',
+'e', 'p', 'a', 'r', 'a', 't', 'o', 'r', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\020', 'e', 'l', 'e', 'm', 'e', 'n', 't', 'S', 'e',
+'p', 'a', 'r', 'a', 't', 'o', 'r', '\022', '\026', '\n', '\005', 'i', 'n', 'd', 'e', 'x', '\030', '\003', ' ', '\001', '(', '\r', 'H', '\000', 'R',
+'\005', 'i', 'n', 'd', 'e', 'x', '\022', '\245', '\001', '\n', '\007', 'e', 'l', 'e', 'm', 'e', 'n', 't', '\030', '\004', ' ', '\001', '(', '\013', '2',
+'\210', '\001', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e',
+'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o',
+'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 's',
+'.', 'S', 'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'F', 'r', 'a', 'g', 'm', 'e', 'n', 't',
+'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'E', 'x', 't', 'r', 'a', 'c',
+'t', 'o', 'r', '.', 'K', 'v', 'E', 'l', 'e', 'm', 'e', 'n', 't', 'H', '\000', 'R', '\007', 'e', 'l', 'e', 'm', 'e', 'n', 't', '\032',
+'\333', '\001', '\n', '\t', 'K', 'v', 'E', 'l', 'e', 'm', 'e', 'n', 't', '\022', '%', '\n', '\t', 's', 'e', 'p', 'a', 'r', 'a', 't', 'o',
+'r', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\t', 's', 'e', 'p', 'a', 'r', 'a', 't',
+'o', 'r', '\022', '\031', '\n', '\003', 'k', 'e', 'y', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R',
+'\003', 'k', 'e', 'y', ':', '\213', '\001', '\232', '\305', '\210', '\036', '\205', '\001', '\n', '\202', '\001', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
+'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c',
+'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'S', 'c', 'o', 'p',
+'e', 'd', 'R', 'o', 'u', 't', 'e', 's', '.', 'S', 'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.',
+'F', 'r', 'a', 'g', 'm', 'e', 'n', 't', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l',
+'u', 'e', 'E', 'x', 't', 'r', 'a', 'c', 't', 'o', 'r', '.', 'K', 'v', 'E', 'l', 'e', 'm', 'e', 'n', 't', ':', '\177', '\232', '\305',
+'\210', '\036', 'z', '\n', 'x', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.',
+'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm',
+'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 's', '.', 'S', 'c',
+'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'F', 'r', 'a', 'g', 'm', 'e', 'n', 't', 'B', 'u', 'i',
+'l', 'd', 'e', 'r', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'E', 'x', 't', 'r', 'a', 'c', 't', 'o', 'r',
+'B', '\016', '\n', '\014', 'e', 'x', 't', 'r', 'a', 'c', 't', '_', 't', 'y', 'p', 'e', ':', 'j', '\232', '\305', '\210', '\036', 'e', '\n', 'c',
+'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o',
+'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e',
+'r', '.', 'v', '2', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 's', '.', 'S', 'c', 'o', 'p', 'e', 'K', 'e',
+'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'F', 'r', 'a', 'g', 'm', 'e', 'n', 't', 'B', 'u', 'i', 'l', 'd', 'e', 'r', 'B',
+'\013', '\n', '\004', 't', 'y', 'p', 'e', '\022', '\003', '\370', 'B', '\001', ':', 'Z', '\232', '\305', '\210', '\036', 'U', '\n', 'S', 'e', 'n', 'v', 'o',
+'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h',
+'t', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2',
+'.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 's', '.', 'S', 'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u', 'i',
+'l', 'd', 'e', 'r', ':', 'J', '\232', '\305', '\210', '\036', 'E', '\n', 'C', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
+'.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n',
+'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R',
+'o', 'u', 't', 'e', 's', 'B', '\027', '\n', '\020', 'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r',
+'\022', '\003', '\370', 'B', '\001', '\"', '\361', '\001', '\n', '\t', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'd', 's', '\022', 'e', '\n', '\030', 's', 'c',
+'o', 'p', 'e', 'd', '_', 'r', 'd', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'o', 'u', 'r', 'c', 'e', '\030', '\001', ' ',
+'\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v',
+'3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R',
+'\025', 's', 'c', 'o', 'p', 'e', 'd', 'R', 'd', 's', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', '\022', '4', '\n',
+'\026', 's', 'r', 'd', 's', '_', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', '_', 'l', 'o', 'c', 'a', 't', 'o', 'r', '\030', '\002',
+' ', '\001', '(', '\t', 'R', '\024', 's', 'r', 'd', 's', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', 'L', 'o', 'c', 'a', 't', 'o',
+'r', ':', 'G', '\232', '\305', '\210', '\036', 'B', '\n', '@', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i',
+'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't',
+'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'd', 's', '\"',
+'\314', '\002', '\n', '\n', 'H', 't', 't', 'p', 'F', 'i', 'l', 't', 'e', 'r', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ',
+'\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '9', '\n', '\014', 't', 'y', 'p',
+'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\004', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.',
+'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'H', '\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f',
+'i', 'g', '\022', 'X', '\n', '\020', 'c', 'o', 'n', 'f', 'i', 'g', '_', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '\030', '\005', ' ',
+'\001', '(', '\013', '2', '+', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v',
+'3', '.', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'H', '\000',
+'R', '\017', 'c', 'o', 'n', 'f', 'i', 'g', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '\022', '\037', '\n', '\013', 'i', 's', '_', 'o',
+'p', 't', 'i', 'o', 'n', 'a', 'l', '\030', '\006', ' ', '\001', '(', '\010', 'R', '\n', 'i', 's', 'O', 'p', 't', 'i', 'o', 'n', 'a', 'l',
+':', 'H', '\232', '\305', '\210', '\036', 'C', '\n', 'A', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l',
+'t', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i',
+'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'H', 't', 't', 'p', 'F', 'i', 'l', 't', 'e', 'r', 'B',
+'\r', '\n', '\013', 'c', 'o', 'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\003', '\020', '\004', 'J', '\004', '\010', '\002', '\020',
+'\003', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', '\"', '\237', '\001', '\n', '\022', 'R', 'e', 'q', 'u', 'e', 's', 't', 'I', 'D', 'E', 'x',
+'t', 'e', 'n', 's', 'i', 'o', 'n', '\022', '7', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\001',
+' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n',
+'y', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', ':', 'P', '\232', '\305', '\210', '\036', 'K', '\n', 'I', 'e', 'n',
+'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k',
+'.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.',
+'v', '2', '.', 'R', 'e', 'q', 'u', 'e', 's', 't', 'I', 'D', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '\"', '\216', '\001', '\n',
+' ', 'E', 'n', 'v', 'o', 'y', 'M', 'o', 'b', 'i', 'l', 'e', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o',
+'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '\022', 'j', '\n', '\006', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\001', ' ', '\001', '(', '\013', '2',
+'R', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r',
+'s', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n',
+'_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o',
+'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', 'B', 'q', '\n', 'I', 'i', 'o', '.', 'e', 'n',
+'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's',
+'.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n',
+'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', 'B', '\032', 'H', 't', 't', 'p', 'C',
+'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200',
+'\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[20] = {
+static upb_def_init *deps[22] = {
&envoy_config_accesslog_v3_accesslog_proto_upbdefinit,
&envoy_config_core_v3_base_proto_upbdefinit,
&envoy_config_core_v3_config_source_proto_upbdefinit,
@@ -484,11 +548,13 @@ static upb_def_init *deps[20] = {
&envoy_config_route_v3_route_proto_upbdefinit,
&envoy_config_route_v3_scoped_route_proto_upbdefinit,
&envoy_config_trace_v3_http_tracer_proto_upbdefinit,
+ &envoy_type_http_v3_path_transformation_proto_upbdefinit,
&envoy_type_tracing_v3_custom_tag_proto_upbdefinit,
&envoy_type_v3_percent_proto_upbdefinit,
&google_protobuf_any_proto_upbdefinit,
&google_protobuf_duration_proto_upbdefinit,
&google_protobuf_wrappers_proto_upbdefinit,
+ &envoy_annotations_deprecation_proto_upbdefinit,
&udpa_annotations_migrate_proto_upbdefinit,
&udpa_annotations_security_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
@@ -501,5 +567,5 @@ upb_def_init envoy_extensions_filters_network_http_connection_manager_v3_http_co
deps,
layouts,
"envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.proto",
- UPB_STRVIEW_INIT(descriptor, 10141)
+ UPB_STRVIEW_INIT(descriptor, 11589)
};
diff --git a/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h b/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h
index bf8b017acf..5518b7d406 100644
--- a/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h
+++ b/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h
@@ -46,6 +46,11 @@ UPB_INLINE const upb_msgdef *envoy_extensions_filters_network_http_connection_ma
return upb_symtab_lookupmsg(s, "envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.UpgradeConfig");
}
+UPB_INLINE const upb_msgdef *envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_PathNormalizationOptions_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &envoy_extensions_filters_network_http_connection_manager_v3_http_connection_manager_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.PathNormalizationOptions");
+}
+
UPB_INLINE const upb_msgdef *envoy_extensions_filters_network_http_connection_manager_v3_LocalReplyConfig_getmsgdef(upb_symtab *s) {
_upb_symtab_loaddefinit(s, &envoy_extensions_filters_network_http_connection_manager_v3_http_connection_manager_proto_upbdefinit);
return upb_symtab_lookupmsg(s, "envoy.extensions.filters.network.http_connection_manager.v3.LocalReplyConfig");
@@ -106,6 +111,11 @@ UPB_INLINE const upb_msgdef *envoy_extensions_filters_network_http_connection_ma
return upb_symtab_lookupmsg(s, "envoy.extensions.filters.network.http_connection_manager.v3.RequestIDExtension");
}
+UPB_INLINE const upb_msgdef *envoy_extensions_filters_network_http_connection_manager_v3_EnvoyMobileHttpConnectionManager_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &envoy_extensions_filters_network_http_connection_manager_v3_http_connection_manager_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "envoy.extensions.filters.network.http_connection_manager.v3.EnvoyMobileHttpConnectionManager");
+}
+
#ifdef __cplusplus
} /* extern "C" */
#endif
diff --git a/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c b/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c
index dbf238cbbe..b858209991 100644
--- a/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c
+++ b/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c
@@ -10,6 +10,7 @@
#include "envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h"
extern upb_def_init envoy_config_core_v3_base_proto_upbdefinit;
+extern upb_def_init envoy_config_core_v3_extension_proto_upbdefinit;
extern upb_def_init envoy_type_matcher_v3_string_proto_upbdefinit;
extern upb_def_init google_protobuf_any_proto_upbdefinit;
extern upb_def_init google_protobuf_wrappers_proto_upbdefinit;
@@ -31,127 +32,134 @@ static const upb_msglayout *layouts[5] = {
&envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_msginit,
};
-static const char descriptor[2914] = {'\n', '6', 'e', 'n', 'v', 'o', 'y', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '/', 't', 'r', 'a', 'n', 's', 'p',
+static const char descriptor[3052] = {'\n', '6', 'e', 'n', 'v', 'o', 'y', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '/', 't', 'r', 'a', 'n', 's', 'p',
'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '/', 't', 'l', 's', '/', 'v', '3', '/', 'c', 'o', 'm', 'm', 'o', 'n',
'.', 'p', 'r', 'o', 't', 'o', '\022', ')', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.',
't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '\032',
'\037', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'b', 'a', 's',
-'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\"', 'e', 'n', 'v', 'o', 'y', '/', 't', 'y', 'p', 'e', '/', 'm', 'a', 't', 'c', 'h',
-'e', 'r', '/', 'v', '3', '/', 's', 't', 'r', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\031', 'g', 'o', 'o', 'g', 'l',
-'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'a', 'n', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o',
-'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o',
-'t', 'o', '\032', ' ', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 'e', 'n', 's',
-'i', 't', 'i', 'v', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't',
-'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a',
-'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o',
-'t', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o',
-'t', 'o', '\"', '\362', '\003', '\n', '\r', 'T', 'l', 's', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 's', '\022', '\217', '\001', '\n', '\034',
-'t', 'l', 's', '_', 'm', 'i', 'n', 'i', 'm', 'u', 'm', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'v', 'e', 'r', 's',
-'i', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\016', '2', 'D', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i',
-'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's',
-'.', 'v', '3', '.', 'T', 'l', 's', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 's', '.', 'T', 'l', 's', 'P', 'r', 'o', 't',
-'o', 'c', 'o', 'l', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\031', 't', 'l', 's', 'M', 'i', 'n', 'i', 'm', 'u',
-'m', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'V', 'e', 'r', 's', 'i', 'o', 'n', '\022', '\217', '\001', '\n', '\034', 't', 'l', 's', '_',
-'m', 'a', 'x', 'i', 'm', 'u', 'm', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\030',
-'\002', ' ', '\001', '(', '\016', '2', 'D', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.',
-'t', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.',
-'T', 'l', 's', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 's', '.', 'T', 'l', 's', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l',
-'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\031', 't', 'l', 's', 'M', 'a', 'x', 'i', 'm', 'u', 'm', 'P', 'r', 'o',
-'t', 'o', 'c', 'o', 'l', 'V', 'e', 'r', 's', 'i', 'o', 'n', '\022', '#', '\n', '\r', 'c', 'i', 'p', 'h', 'e', 'r', '_', 's', 'u',
-'i', 't', 'e', 's', '\030', '\003', ' ', '\003', '(', '\t', 'R', '\014', 'c', 'i', 'p', 'h', 'e', 'r', 'S', 'u', 'i', 't', 'e', 's', '\022',
-'\037', '\n', '\013', 'e', 'c', 'd', 'h', '_', 'c', 'u', 'r', 'v', 'e', 's', '\030', '\004', ' ', '\003', '(', '\t', 'R', '\n', 'e', 'c', 'd',
-'h', 'C', 'u', 'r', 'v', 'e', 's', '\"', 'O', '\n', '\013', 'T', 'l', 's', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', '\022', '\014', '\n',
-'\010', 'T', 'L', 'S', '_', 'A', 'U', 'T', 'O', '\020', '\000', '\022', '\013', '\n', '\007', 'T', 'L', 'S', 'v', '1', '_', '0', '\020', '\001', '\022',
-'\013', '\n', '\007', 'T', 'L', 'S', 'v', '1', '_', '1', '\020', '\002', '\022', '\013', '\n', '\007', 'T', 'L', 'S', 'v', '1', '_', '2', '\020', '\003',
-'\022', '\013', '\n', '\007', 'T', 'L', 'S', 'v', '1', '_', '3', '\020', '\004', ':', '&', '\232', '\305', '\210', '\036', '!', '\n', '\037', 'e', 'n', 'v',
-'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'a', 'u', 't', 'h', '.', 'T', 'l', 's', 'P', 'a', 'r', 'a', 'm', 'e', 't',
-'e', 'r', 's', '\"', '\317', '\001', '\n', '\022', 'P', 'r', 'i', 'v', 'a', 't', 'e', 'K', 'e', 'y', 'P', 'r', 'o', 'v', 'i', 'd', 'e',
-'r', '\022', ',', '\n', '\r', 'p', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '_', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B',
-'\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\014', 'p', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 'N', 'a', 'm', 'e', '\022', 'A', '\n',
-'\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o',
-'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'B', '\006', '\270', '\267', '\213', '\244', '\002', '\001', 'H',
-'\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', ':', '+', '\232', '\305', '\210', '\036', '&', '\n', '$', 'e', 'n',
-'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'a', 'u', 't', 'h', '.', 'P', 'r', 'i', 'v', 'a', 't', 'e', 'K', 'e',
-'y', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 'B', '\r', '\n', '\013', 'c', 'o', 'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J',
-'\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', '\"', '\206', '\005', '\n', '\016', 'T', 'l', 's', 'C', 'e', 'r', 't',
-'i', 'f', 'i', 'c', 'a', 't', 'e', '\022', 'M', '\n', '\021', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 'c', 'h',
-'a', 'i', 'n', '\030', '\001', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
-'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\020', 'c', 'e', 'r', 't', 'i',
-'f', 'i', 'c', 'a', 't', 'e', 'C', 'h', 'a', 'i', 'n', '\022', 'I', '\n', '\013', 'p', 'r', 'i', 'v', 'a', 't', 'e', '_', 'k', 'e',
-'y', '\030', '\002', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o',
-'r', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\006', '\270', '\267', '\213', '\244', '\002', '\001', 'R',
-'\n', 'p', 'r', 'i', 'v', 'a', 't', 'e', 'K', 'e', 'y', '\022', 'S', '\n', '\021', 'w', 'a', 't', 'c', 'h', 'e', 'd', '_', 'd', 'i',
-'r', 'e', 'c', 't', 'o', 'r', 'y', '\030', '\007', ' ', '\001', '(', '\013', '2', '&', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
-'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'W', 'a', 't', 'c', 'h', 'e', 'd', 'D', 'i', 'r', 'e', 'c', 't',
-'o', 'r', 'y', 'R', '\020', 'w', 'a', 't', 'c', 'h', 'e', 'd', 'D', 'i', 'r', 'e', 'c', 't', 'o', 'r', 'y', '\022', 'o', '\n', '\024',
-'p', 'r', 'i', 'v', 'a', 't', 'e', '_', 'k', 'e', 'y', '_', 'p', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '\030', '\006', ' ', '\001', '(',
-'\013', '2', '=', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n',
-'s', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'P', 'r', 'i', 'v',
-'a', 't', 'e', 'K', 'e', 'y', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 'R', '\022', 'p', 'r', 'i', 'v', 'a', 't', 'e', 'K', 'e',
-'y', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '\022', 'D', '\n', '\010', 'p', 'a', 's', 's', 'w', 'o', 'r', 'd', '\030', '\003', ' ', '\001',
-'(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3',
-'.', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\006', '\270', '\267', '\213', '\244', '\002', '\001', 'R', '\010', 'p', 'a', 's', 's',
-'w', 'o', 'r', 'd', '\022', 'A', '\n', '\013', 'o', 'c', 's', 'p', '_', 's', 't', 'a', 'p', 'l', 'e', '\030', '\004', ' ', '\001', '(', '\013',
-'2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D',
-'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\n', 'o', 'c', 's', 'p', 'S', 't', 'a', 'p', 'l', 'e', '\022', 'b', '\n', '\034',
-'s', 'i', 'g', 'n', 'e', 'd', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 't', 'i', 'm', 'e', 's', 't',
-'a', 'm', 'p', '\030', '\005', ' ', '\003', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
-'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\032', 's', 'i', 'g', 'n', 'e',
-'d', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'T', 'i', 'm', 'e', 's', 't', 'a', 'm', 'p', ':', '\'', '\232', '\305',
-'\210', '\036', '\"', '\n', ' ', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'a', 'u', 't', 'h', '.', 'T', 'l',
-'s', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '\"', '\213', '\001', '\n', '\024', 'T', 'l', 's', 'S', 'e', 's', 's', 'i',
-'o', 'n', 'T', 'i', 'c', 'k', 'e', 't', 'K', 'e', 'y', 's', '\022', 'D', '\n', '\004', 'k', 'e', 'y', 's', '\030', '\001', ' ', '\003', '(',
-'\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.',
-'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\016', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', '\270', '\267', '\213', '\244', '\002',
-'\001', 'R', '\004', 'k', 'e', 'y', 's', ':', '-', '\232', '\305', '\210', '\036', '(', '\n', '&', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i',
-'.', 'v', '2', '.', 'a', 'u', 't', 'h', '.', 'T', 'l', 's', 'S', 'e', 's', 's', 'i', 'o', 'n', 'T', 'i', 'c', 'k', 'e', 't',
-'K', 'e', 'y', 's', '\"', '\307', '\007', '\n', '\034', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'V', 'a', 'l', 'i', 'd',
-'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't', '\022', '?', '\n', '\n', 't', 'r', 'u', 's', 't', 'e', 'd', '_', 'c',
-'a', '\030', '\001', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o',
-'r', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\t', 't', 'r', 'u', 's', 't', 'e', 'd',
-'C', 'a', '\022', 'S', '\n', '\021', 'w', 'a', 't', 'c', 'h', 'e', 'd', '_', 'd', 'i', 'r', 'e', 'c', 't', 'o', 'r', 'y', '\030', '\013',
-' ', '\001', '(', '\013', '2', '&', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.',
-'v', '3', '.', 'W', 'a', 't', 'c', 'h', 'e', 'd', 'D', 'i', 'r', 'e', 'c', 't', 'o', 'r', 'y', 'R', '\020', 'w', 'a', 't', 'c',
-'h', 'e', 'd', 'D', 'i', 'r', 'e', 'c', 't', 'o', 'r', 'y', '\022', 'F', '\n', '\027', 'v', 'e', 'r', 'i', 'f', 'y', '_', 'c', 'e',
-'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 's', 'p', 'k', 'i', '\030', '\003', ' ', '\003', '(', '\t', 'B', '\016', '\372', 'B', '\013',
-'\222', '\001', '\010', '\"', '\006', 'r', '\004', '\020', ',', '(', ',', 'R', '\025', 'v', 'e', 'r', 'i', 'f', 'y', 'C', 'e', 'r', 't', 'i', 'f',
-'i', 'c', 'a', 't', 'e', 'S', 'p', 'k', 'i', '\022', 'F', '\n', '\027', 'v', 'e', 'r', 'i', 'f', 'y', '_', 'c', 'e', 'r', 't', 'i',
-'f', 'i', 'c', 'a', 't', 'e', '_', 'h', 'a', 's', 'h', '\030', '\002', ' ', '\003', '(', '\t', 'B', '\016', '\372', 'B', '\013', '\222', '\001', '\010',
-'\"', '\006', 'r', '\004', '\020', '@', '(', '_', 'R', '\025', 'v', 'e', 'r', 'i', 'f', 'y', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a',
-'t', 'e', 'H', 'a', 's', 'h', '\022', '[', '\n', '\027', 'm', 'a', 't', 'c', 'h', '_', 's', 'u', 'b', 'j', 'e', 'c', 't', '_', 'a',
-'l', 't', '_', 'n', 'a', 'm', 'e', 's', '\030', '\t', ' ', '\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y',
-'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'S', 't', 'r', 'i', 'n', 'g', 'M', 'a', 't', 'c', 'h',
-'e', 'r', 'R', '\024', 'm', 'a', 't', 'c', 'h', 'S', 'u', 'b', 'j', 'e', 'c', 't', 'A', 'l', 't', 'N', 'a', 'm', 'e', 's', '\022',
-'k', '\n', '$', 'r', 'e', 'q', 'u', 'i', 'r', 'e', '_', 's', 'i', 'g', 'n', 'e', 'd', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i',
-'c', 'a', 't', 'e', '_', 't', 'i', 'm', 'e', 's', 't', 'a', 'm', 'p', '\030', '\006', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o',
-'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '!',
-'r', 'e', 'q', 'u', 'i', 'r', 'e', 'S', 'i', 'g', 'n', 'e', 'd', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'T',
-'i', 'm', 'e', 's', 't', 'a', 'm', 'p', '\022', '2', '\n', '\003', 'c', 'r', 'l', '\030', '\007', ' ', '\001', '(', '\013', '2', ' ', '.', 'e',
-'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'S',
-'o', 'u', 'r', 'c', 'e', 'R', '\003', 'c', 'r', 'l', '\022', ':', '\n', '\031', 'a', 'l', 'l', 'o', 'w', '_', 'e', 'x', 'p', 'i', 'r',
-'e', 'd', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '\030', '\010', ' ', '\001', '(', '\010', 'R', '\027', 'a', 'l', 'l',
-'o', 'w', 'E', 'x', 'p', 'i', 'r', 'e', 'd', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '\022', '\242', '\001', '\n', '\030',
-'t', 'r', 'u', 's', 't', '_', 'c', 'h', 'a', 'i', 'n', '_', 'v', 'e', 'r', 'i', 'f', 'i', 'c', 'a', 't', 'i', 'o', 'n', '\030',
-'\n', ' ', '\001', '(', '\016', '2', '^', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.',
-'t', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.',
-'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'V', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't',
-'e', 'x', 't', '.', 'T', 'r', 'u', 's', 't', 'C', 'h', 'a', 'i', 'n', 'V', 'e', 'r', 'i', 'f', 'i', 'c', 'a', 't', 'i', 'o',
-'n', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\026', 't', 'r', 'u', 's', 't', 'C', 'h', 'a', 'i', 'n', 'V', 'e',
-'r', 'i', 'f', 'i', 'c', 'a', 't', 'i', 'o', 'n', '\"', 'F', '\n', '\026', 'T', 'r', 'u', 's', 't', 'C', 'h', 'a', 'i', 'n', 'V',
-'e', 'r', 'i', 'f', 'i', 'c', 'a', 't', 'i', 'o', 'n', '\022', '\026', '\n', '\022', 'V', 'E', 'R', 'I', 'F', 'Y', '_', 'T', 'R', 'U',
-'S', 'T', '_', 'C', 'H', 'A', 'I', 'N', '\020', '\000', '\022', '\024', '\n', '\020', 'A', 'C', 'C', 'E', 'P', 'T', '_', 'U', 'N', 'T', 'R',
-'U', 'S', 'T', 'E', 'D', '\020', '\001', ':', '5', '\232', '\305', '\210', '\036', '0', '\n', '.', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i',
-'.', 'v', '2', '.', 'a', 'u', 't', 'h', '.', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'V', 'a', 'l', 'i', 'd',
-'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't', 'J', '\004', '\010', '\004', '\020', '\005', 'J', '\004', '\010', '\005', '\020', '\006', 'R',
-'\027', 'v', 'e', 'r', 'i', 'f', 'y', '_', 's', 'u', 'b', 'j', 'e', 'c', 't', '_', 'a', 'l', 't', '_', 'n', 'a', 'm', 'e', 'B',
-'P', '\n', '7', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x',
+'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '$', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r',
+'e', '/', 'v', '3', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\"', 'e', 'n', 'v',
+'o', 'y', '/', 't', 'y', 'p', 'e', '/', 'm', 'a', 't', 'c', 'h', 'e', 'r', '/', 'v', '3', '/', 's', 't', 'r', 'i', 'n', 'g',
+'.', 'p', 'r', 'o', 't', 'o', '\032', '\031', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'a',
+'n', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
+'/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', ' ', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n',
+'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 'e', 'n', 's', 'i', 't', 'i', 'v', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032',
+'\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.',
+'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v',
+'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e',
+'/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\362', '\003', '\n', '\r', 'T', 'l', 's', 'P', 'a',
+'r', 'a', 'm', 'e', 't', 'e', 'r', 's', '\022', '\217', '\001', '\n', '\034', 't', 'l', 's', '_', 'm', 'i', 'n', 'i', 'm', 'u', 'm', '_',
+'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\016', '2', 'D', '.',
+'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r',
+'t', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'T', 'l', 's', 'P', 'a', 'r', 'a', 'm',
+'e', 't', 'e', 'r', 's', '.', 'T', 'l', 's', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002',
+'\020', '\001', 'R', '\031', 't', 'l', 's', 'M', 'i', 'n', 'i', 'm', 'u', 'm', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'V', 'e', 'r',
+'s', 'i', 'o', 'n', '\022', '\217', '\001', '\n', '\034', 't', 'l', 's', '_', 'm', 'a', 'x', 'i', 'm', 'u', 'm', '_', 'p', 'r', 'o', 't',
+'o', 'c', 'o', 'l', '_', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\030', '\002', ' ', '\001', '(', '\016', '2', 'D', '.', 'e', 'n', 'v', 'o',
+'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o',
+'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'T', 'l', 's', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r',
+'s', '.', 'T', 'l', 's', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\031',
+'t', 'l', 's', 'M', 'a', 'x', 'i', 'm', 'u', 'm', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'V', 'e', 'r', 's', 'i', 'o', 'n',
+'\022', '#', '\n', '\r', 'c', 'i', 'p', 'h', 'e', 'r', '_', 's', 'u', 'i', 't', 'e', 's', '\030', '\003', ' ', '\003', '(', '\t', 'R', '\014',
+'c', 'i', 'p', 'h', 'e', 'r', 'S', 'u', 'i', 't', 'e', 's', '\022', '\037', '\n', '\013', 'e', 'c', 'd', 'h', '_', 'c', 'u', 'r', 'v',
+'e', 's', '\030', '\004', ' ', '\003', '(', '\t', 'R', '\n', 'e', 'c', 'd', 'h', 'C', 'u', 'r', 'v', 'e', 's', '\"', 'O', '\n', '\013', 'T',
+'l', 's', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', '\022', '\014', '\n', '\010', 'T', 'L', 'S', '_', 'A', 'U', 'T', 'O', '\020', '\000', '\022',
+'\013', '\n', '\007', 'T', 'L', 'S', 'v', '1', '_', '0', '\020', '\001', '\022', '\013', '\n', '\007', 'T', 'L', 'S', 'v', '1', '_', '1', '\020', '\002',
+'\022', '\013', '\n', '\007', 'T', 'L', 'S', 'v', '1', '_', '2', '\020', '\003', '\022', '\013', '\n', '\007', 'T', 'L', 'S', 'v', '1', '_', '3', '\020',
+'\004', ':', '&', '\232', '\305', '\210', '\036', '!', '\n', '\037', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'a', 'u',
+'t', 'h', '.', 'T', 'l', 's', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 's', '\"', '\317', '\001', '\n', '\022', 'P', 'r', 'i', 'v',
+'a', 't', 'e', 'K', 'e', 'y', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '\022', ',', '\n', '\r', 'p', 'r', 'o', 'v', 'i', 'd', 'e',
+'r', '_', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\014', 'p', 'r',
+'o', 'v', 'i', 'd', 'e', 'r', 'N', 'a', 'm', 'e', '\022', 'A', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i',
+'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
+'.', 'A', 'n', 'y', 'B', '\006', '\270', '\267', '\213', '\244', '\002', '\001', 'H', '\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f',
+'i', 'g', ':', '+', '\232', '\305', '\210', '\036', '&', '\n', '$', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'a',
+'u', 't', 'h', '.', 'P', 'r', 'i', 'v', 'a', 't', 'e', 'K', 'e', 'y', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 'B', '\r', '\n',
+'\013', 'c', 'o', 'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n', 'f', 'i',
+'g', '\"', '\206', '\005', '\n', '\016', 'T', 'l', 's', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '\022', 'M', '\n', '\021', 'c',
+'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 'c', 'h', 'a', 'i', 'n', '\030', '\001', ' ', '\001', '(', '\013', '2', ' ', '.',
+'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a',
+'S', 'o', 'u', 'r', 'c', 'e', 'R', '\020', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'C', 'h', 'a', 'i', 'n', '\022',
+'I', '\n', '\013', 'p', 'r', 'i', 'v', 'a', 't', 'e', '_', 'k', 'e', 'y', '\030', '\002', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n',
+'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'S', 'o',
+'u', 'r', 'c', 'e', 'B', '\006', '\270', '\267', '\213', '\244', '\002', '\001', 'R', '\n', 'p', 'r', 'i', 'v', 'a', 't', 'e', 'K', 'e', 'y', '\022',
+'S', '\n', '\021', 'w', 'a', 't', 'c', 'h', 'e', 'd', '_', 'd', 'i', 'r', 'e', 'c', 't', 'o', 'r', 'y', '\030', '\007', ' ', '\001', '(',
+'\013', '2', '&', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.',
+'W', 'a', 't', 'c', 'h', 'e', 'd', 'D', 'i', 'r', 'e', 'c', 't', 'o', 'r', 'y', 'R', '\020', 'w', 'a', 't', 'c', 'h', 'e', 'd',
+'D', 'i', 'r', 'e', 'c', 't', 'o', 'r', 'y', '\022', 'o', '\n', '\024', 'p', 'r', 'i', 'v', 'a', 't', 'e', '_', 'k', 'e', 'y', '_',
+'p', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '\030', '\006', ' ', '\001', '(', '\013', '2', '=', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x',
't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't',
-'s', '.', 't', 'l', 's', '.', 'v', '3', 'B', '\013', 'C', 'o', 'm', 'm', 'o', 'n', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200',
-'\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'s', '.', 't', 'l', 's', '.', 'v', '3', '.', 'P', 'r', 'i', 'v', 'a', 't', 'e', 'K', 'e', 'y', 'P', 'r', 'o', 'v', 'i', 'd',
+'e', 'r', 'R', '\022', 'p', 'r', 'i', 'v', 'a', 't', 'e', 'K', 'e', 'y', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '\022', 'D', '\n',
+'\010', 'p', 'a', 's', 's', 'w', 'o', 'r', 'd', '\030', '\003', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
+'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'B',
+'\006', '\270', '\267', '\213', '\244', '\002', '\001', 'R', '\010', 'p', 'a', 's', 's', 'w', 'o', 'r', 'd', '\022', 'A', '\n', '\013', 'o', 'c', 's', 'p',
+'_', 's', 't', 'a', 'p', 'l', 'e', '\030', '\004', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
+'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\n', 'o',
+'c', 's', 'p', 'S', 't', 'a', 'p', 'l', 'e', '\022', 'b', '\n', '\034', 's', 'i', 'g', 'n', 'e', 'd', '_', 'c', 'e', 'r', 't', 'i',
+'f', 'i', 'c', 'a', 't', 'e', '_', 't', 'i', 'm', 'e', 's', 't', 'a', 'm', 'p', '\030', '\005', ' ', '\003', '(', '\013', '2', ' ', '.',
+'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a',
+'S', 'o', 'u', 'r', 'c', 'e', 'R', '\032', 's', 'i', 'g', 'n', 'e', 'd', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e',
+'T', 'i', 'm', 'e', 's', 't', 'a', 'm', 'p', ':', '\'', '\232', '\305', '\210', '\036', '\"', '\n', ' ', 'e', 'n', 'v', 'o', 'y', '.', 'a',
+'p', 'i', '.', 'v', '2', '.', 'a', 'u', 't', 'h', '.', 'T', 'l', 's', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e',
+'\"', '\213', '\001', '\n', '\024', 'T', 'l', 's', 'S', 'e', 's', 's', 'i', 'o', 'n', 'T', 'i', 'c', 'k', 'e', 't', 'K', 'e', 'y', 's',
+'\022', 'D', '\n', '\004', 'k', 'e', 'y', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
+'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\016',
+'\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', '\270', '\267', '\213', '\244', '\002', '\001', 'R', '\004', 'k', 'e', 'y', 's', ':', '-', '\232', '\305', '\210',
+'\036', '(', '\n', '&', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'a', 'u', 't', 'h', '.', 'T', 'l', 's',
+'S', 'e', 's', 's', 'i', 'o', 'n', 'T', 'i', 'c', 'k', 'e', 't', 'K', 'e', 'y', 's', '\"', '\253', '\010', '\n', '\034', 'C', 'e', 'r',
+'t', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'V', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't',
+'\022', '?', '\n', '\n', 't', 'r', 'u', 's', 't', 'e', 'd', '_', 'c', 'a', '\030', '\001', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n',
+'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'S', 'o',
+'u', 'r', 'c', 'e', 'R', '\t', 't', 'r', 'u', 's', 't', 'e', 'd', 'C', 'a', '\022', 'S', '\n', '\021', 'w', 'a', 't', 'c', 'h', 'e',
+'d', '_', 'd', 'i', 'r', 'e', 'c', 't', 'o', 'r', 'y', '\030', '\013', ' ', '\001', '(', '\013', '2', '&', '.', 'e', 'n', 'v', 'o', 'y',
+'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'W', 'a', 't', 'c', 'h', 'e', 'd', 'D', 'i',
+'r', 'e', 'c', 't', 'o', 'r', 'y', 'R', '\020', 'w', 'a', 't', 'c', 'h', 'e', 'd', 'D', 'i', 'r', 'e', 'c', 't', 'o', 'r', 'y',
+'\022', 'F', '\n', '\027', 'v', 'e', 'r', 'i', 'f', 'y', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 's', 'p',
+'k', 'i', '\030', '\003', ' ', '\003', '(', '\t', 'B', '\016', '\372', 'B', '\013', '\222', '\001', '\010', '\"', '\006', 'r', '\004', '\020', ',', '(', ',', 'R',
+'\025', 'v', 'e', 'r', 'i', 'f', 'y', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'S', 'p', 'k', 'i', '\022', 'F', '\n',
+'\027', 'v', 'e', 'r', 'i', 'f', 'y', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 'h', 'a', 's', 'h', '\030',
+'\002', ' ', '\003', '(', '\t', 'B', '\016', '\372', 'B', '\013', '\222', '\001', '\010', '\"', '\006', 'r', '\004', '\020', '@', '(', '_', 'R', '\025', 'v', 'e',
+'r', 'i', 'f', 'y', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'H', 'a', 's', 'h', '\022', '[', '\n', '\027', 'm', 'a',
+'t', 'c', 'h', '_', 's', 'u', 'b', 'j', 'e', 'c', 't', '_', 'a', 'l', 't', '_', 'n', 'a', 'm', 'e', 's', '\030', '\t', ' ', '\003',
+'(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v',
+'3', '.', 'S', 't', 'r', 'i', 'n', 'g', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'R', '\024', 'm', 'a', 't', 'c', 'h', 'S', 'u', 'b',
+'j', 'e', 'c', 't', 'A', 'l', 't', 'N', 'a', 'm', 'e', 's', '\022', 'k', '\n', '$', 'r', 'e', 'q', 'u', 'i', 'r', 'e', '_', 's',
+'i', 'g', 'n', 'e', 'd', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 't', 'i', 'm', 'e', 's', 't', 'a',
+'m', 'p', '\030', '\006', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u',
+'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '!', 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'S', 'i', 'g', 'n', 'e',
+'d', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'T', 'i', 'm', 'e', 's', 't', 'a', 'm', 'p', '\022', '2', '\n', '\003',
+'c', 'r', 'l', '\030', '\007', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
+'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\003', 'c', 'r', 'l', '\022', ':',
+'\n', '\031', 'a', 'l', 'l', 'o', 'w', '_', 'e', 'x', 'p', 'i', 'r', 'e', 'd', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a',
+'t', 'e', '\030', '\010', ' ', '\001', '(', '\010', 'R', '\027', 'a', 'l', 'l', 'o', 'w', 'E', 'x', 'p', 'i', 'r', 'e', 'd', 'C', 'e', 'r',
+'t', 'i', 'f', 'i', 'c', 'a', 't', 'e', '\022', '\242', '\001', '\n', '\030', 't', 'r', 'u', 's', 't', '_', 'c', 'h', 'a', 'i', 'n', '_',
+'v', 'e', 'r', 'i', 'f', 'i', 'c', 'a', 't', 'i', 'o', 'n', '\030', '\n', ' ', '\001', '(', '\016', '2', '^', '.', 'e', 'n', 'v', 'o',
+'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o',
+'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'V',
+'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't', '.', 'T', 'r', 'u', 's', 't', 'C', 'h', 'a',
+'i', 'n', 'V', 'e', 'r', 'i', 'f', 'i', 'c', 'a', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R',
+'\026', 't', 'r', 'u', 's', 't', 'C', 'h', 'a', 'i', 'n', 'V', 'e', 'r', 'i', 'f', 'i', 'c', 'a', 't', 'i', 'o', 'n', '\022', 'b',
+'\n', '\027', 'c', 'u', 's', 't', 'o', 'm', '_', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'o', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g',
+'\030', '\014', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r',
+'e', '.', 'v', '3', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g',
+'R', '\025', 'c', 'u', 's', 't', 'o', 'm', 'V', 'a', 'l', 'i', 'd', 'a', 't', 'o', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\"', 'F',
+'\n', '\026', 'T', 'r', 'u', 's', 't', 'C', 'h', 'a', 'i', 'n', 'V', 'e', 'r', 'i', 'f', 'i', 'c', 'a', 't', 'i', 'o', 'n', '\022',
+'\026', '\n', '\022', 'V', 'E', 'R', 'I', 'F', 'Y', '_', 'T', 'R', 'U', 'S', 'T', '_', 'C', 'H', 'A', 'I', 'N', '\020', '\000', '\022', '\024',
+'\n', '\020', 'A', 'C', 'C', 'E', 'P', 'T', '_', 'U', 'N', 'T', 'R', 'U', 'S', 'T', 'E', 'D', '\020', '\001', ':', '5', '\232', '\305', '\210',
+'\036', '0', '\n', '.', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'a', 'u', 't', 'h', '.', 'C', 'e', 'r',
+'t', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'V', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't',
+'J', '\004', '\010', '\004', '\020', '\005', 'J', '\004', '\010', '\005', '\020', '\006', 'R', '\027', 'v', 'e', 'r', 'i', 'f', 'y', '_', 's', 'u', 'b', 'j',
+'e', 'c', 't', '_', 'a', 'l', 't', '_', 'n', 'a', 'm', 'e', 'B', 'P', '\n', '7', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p',
+'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a',
+'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', 'B', '\013', 'C', 'o',
+'m', 'm', 'o', 'n', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't',
+'o', '3',
};
-static upb_def_init *deps[9] = {
+static upb_def_init *deps[10] = {
&envoy_config_core_v3_base_proto_upbdefinit,
+ &envoy_config_core_v3_extension_proto_upbdefinit,
&envoy_type_matcher_v3_string_proto_upbdefinit,
&google_protobuf_any_proto_upbdefinit,
&google_protobuf_wrappers_proto_upbdefinit,
@@ -166,5 +174,5 @@ upb_def_init envoy_extensions_transport_sockets_tls_v3_common_proto_upbdefinit =
deps,
layouts,
"envoy/extensions/transport_sockets/tls/v3/common.proto",
- UPB_STRVIEW_INIT(descriptor, 2914)
+ UPB_STRVIEW_INIT(descriptor, 3052)
};
diff --git a/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c b/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c
index a4651fcd68..ed4129c882 100644
--- a/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c
+++ b/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c
@@ -117,7 +117,7 @@ static const char descriptor[4707] = {'\n', '3', 'e', 'n', 'v', 'o', 'y', '/', '
'e', 'c', 'r', 'e', 't', '_', 'c', 'o', 'n', 'f', 'i', 'g', 's', '\030', '\006', ' ', '\003', '(', '\013', '2', ':', '.', 'e', 'n', 'v',
'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's',
'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'S', 'd', 's', 'S', 'e', 'c', 'r', 'e', 't', 'C', 'o',
-'n', 'f', 'i', 'g', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\020', '\001', 'R', '\036', 't', 'l', 's', 'C', 'e', 'r', 't', 'i', 'f',
+'n', 'f', 'i', 'g', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\020', '\002', 'R', '\036', 't', 'l', 's', 'C', 'e', 'r', 't', 'i', 'f',
'i', 'c', 'a', 't', 'e', 'S', 'd', 's', 'S', 'e', 'c', 'r', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', 's', '\022', '\240', '\001', '\n',
'$', 't', 'l', 's', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c',
'a', 't', 'e', '_', 'p', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '\030', '\t', ' ', '\001', '(', '\013', '2', 'O', '.', 'e', 'n', 'v', 'o',
diff --git a/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c b/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c
index 2673ebbbde..06a4da129c 100644
--- a/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c
+++ b/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c
@@ -13,110 +13,143 @@ extern upb_def_init envoy_admin_v3_config_dump_proto_upbdefinit;
extern upb_def_init envoy_config_core_v3_base_proto_upbdefinit;
extern upb_def_init envoy_type_matcher_v3_node_proto_upbdefinit;
extern upb_def_init google_api_annotations_proto_upbdefinit;
-extern upb_def_init udpa_annotations_migrate_proto_upbdefinit;
+extern upb_def_init google_protobuf_any_proto_upbdefinit;
+extern upb_def_init google_protobuf_timestamp_proto_upbdefinit;
+extern upb_def_init envoy_annotations_deprecation_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
extern upb_def_init udpa_annotations_versioning_proto_upbdefinit;
extern const upb_msglayout envoy_service_status_v3_ClientStatusRequest_msginit;
extern const upb_msglayout envoy_service_status_v3_PerXdsConfig_msginit;
extern const upb_msglayout envoy_service_status_v3_ClientConfig_msginit;
+extern const upb_msglayout envoy_service_status_v3_ClientConfig_GenericXdsConfig_msginit;
extern const upb_msglayout envoy_service_status_v3_ClientStatusResponse_msginit;
-static const upb_msglayout *layouts[4] = {
+static const upb_msglayout *layouts[5] = {
&envoy_service_status_v3_ClientStatusRequest_msginit,
&envoy_service_status_v3_PerXdsConfig_msginit,
&envoy_service_status_v3_ClientConfig_msginit,
+ &envoy_service_status_v3_ClientConfig_GenericXdsConfig_msginit,
&envoy_service_status_v3_ClientStatusResponse_msginit,
};
-static const char descriptor[2001] = {'\n', '\"', 'e', 'n', 'v', 'o', 'y', '/', 's', 'e', 'r', 'v', 'i', 'c', 'e', '/', 's', 't', 'a', 't', 'u', 's', '/', 'v', '3',
+static const char descriptor[2677] = {'\n', '\"', 'e', 'n', 'v', 'o', 'y', '/', 's', 'e', 'r', 'v', 'i', 'c', 'e', '/', 's', 't', 'a', 't', 'u', 's', '/', 'v', '3',
'/', 'c', 's', 'd', 's', '.', 'p', 'r', 'o', 't', 'o', '\022', '\027', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c',
'e', '.', 's', 't', 'a', 't', 'u', 's', '.', 'v', '3', '\032', ' ', 'e', 'n', 'v', 'o', 'y', '/', 'a', 'd', 'm', 'i', 'n', '/',
'v', '3', '/', 'c', 'o', 'n', 'f', 'i', 'g', '_', 'd', 'u', 'm', 'p', '.', 'p', 'r', 'o', 't', 'o', '\032', '\037', 'e', 'n', 'v',
'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'b', 'a', 's', 'e', '.', 'p', 'r',
'o', 't', 'o', '\032', ' ', 'e', 'n', 'v', 'o', 'y', '/', 't', 'y', 'p', 'e', '/', 'm', 'a', 't', 'c', 'h', 'e', 'r', '/', 'v',
'3', '/', 'n', 'o', 'd', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\034', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'a', 'p', 'i', '/',
-'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'u', 'd', 'p', 'a', '/', 'a',
-'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'm', 'i', 'g', 'r', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032',
-'\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.',
-'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v',
-'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\"', '\302', '\001', '\n', '\023', 'C', 'l', 'i', 'e', 'n',
-'t', 'S', 't', 'a', 't', 'u', 's', 'R', 'e', 'q', 'u', 'e', 's', 't', '\022', 'G', '\n', '\r', 'n', 'o', 'd', 'e', '_', 'm', 'a',
-'t', 'c', 'h', 'e', 'r', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e',
-'.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'N', 'o', 'd', 'e', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'R', '\014',
-'n', 'o', 'd', 'e', 'M', 'a', 't', 'c', 'h', 'e', 'r', 's', '\022', '.', '\n', '\004', 'n', 'o', 'd', 'e', '\030', '\002', ' ', '\001', '(',
-'\013', '2', '\032', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.',
-'N', 'o', 'd', 'e', 'R', '\004', 'n', 'o', 'd', 'e', ':', '2', '\232', '\305', '\210', '\036', '-', '\n', '+', 'e', 'n', 'v', 'o', 'y', '.',
-'s', 'e', 'r', 'v', 'i', 'c', 'e', '.', 's', 't', 'a', 't', 'u', 's', '.', 'v', '2', '.', 'C', 'l', 'i', 'e', 'n', 't', 'S',
-'t', 'a', 't', 'u', 's', 'R', 'e', 'q', 'u', 'e', 's', 't', '\"', '\360', '\004', '\n', '\014', 'P', 'e', 'r', 'X', 'd', 's', 'C', 'o',
-'n', 'f', 'i', 'g', '\022', '=', '\n', '\006', 's', 't', 'a', 't', 'u', 's', '\030', '\001', ' ', '\001', '(', '\016', '2', '%', '.', 'e', 'n',
-'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 's', 't', 'a', 't', 'u', 's', '.', 'v', '3', '.', 'C', 'o', 'n',
-'f', 'i', 'g', 'S', 't', 'a', 't', 'u', 's', 'R', '\006', 's', 't', 'a', 't', 'u', 's', '\022', 'T', '\n', '\r', 'c', 'l', 'i', 'e',
-'n', 't', '_', 's', 't', 'a', 't', 'u', 's', '\030', '\007', ' ', '\001', '(', '\016', '2', '+', '.', 'e', 'n', 'v', 'o', 'y', '.', 's',
+'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\031', 'g', 'o', 'o', 'g', 'l', 'e',
+'/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'a', 'n', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\037', 'g', 'o', 'o', 'g',
+'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 't', 'i', 'm', 'e', 's', 't', 'a', 'm', 'p', '.', 'p', 'r', 'o',
+'t', 'o', '\032', '#', 'e', 'n', 'v', 'o', 'y', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'd', 'e', 'p',
+'r', 'e', 'c', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o',
+'t', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p',
+'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.',
+'p', 'r', 'o', 't', 'o', '\"', '\302', '\001', '\n', '\023', 'C', 'l', 'i', 'e', 'n', 't', 'S', 't', 'a', 't', 'u', 's', 'R', 'e', 'q',
+'u', 'e', 's', 't', '\022', 'G', '\n', '\r', 'n', 'o', 'd', 'e', '_', 'm', 'a', 't', 'c', 'h', 'e', 'r', 's', '\030', '\001', ' ', '\003',
+'(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v',
+'3', '.', 'N', 'o', 'd', 'e', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'R', '\014', 'n', 'o', 'd', 'e', 'M', 'a', 't', 'c', 'h', 'e',
+'r', 's', '\022', '.', '\n', '\004', 'n', 'o', 'd', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\032', '.', 'e', 'n', 'v', 'o', 'y', '.',
+'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'N', 'o', 'd', 'e', 'R', '\004', 'n', 'o', 'd', 'e',
+':', '2', '\232', '\305', '\210', '\036', '-', '\n', '+', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 's', 't',
+'a', 't', 'u', 's', '.', 'v', '2', '.', 'C', 'l', 'i', 'e', 'n', 't', 'S', 't', 'a', 't', 'u', 's', 'R', 'e', 'q', 'u', 'e',
+'s', 't', '\"', '\371', '\004', '\n', '\014', 'P', 'e', 'r', 'X', 'd', 's', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '=', '\n', '\006', 's', 't',
+'a', 't', 'u', 's', '\030', '\001', ' ', '\001', '(', '\016', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c',
+'e', '.', 's', 't', 'a', 't', 'u', 's', '.', 'v', '3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 't', 'a', 't', 'u', 's', 'R',
+'\006', 's', 't', 'a', 't', 'u', 's', '\022', ']', '\n', '\r', 'c', 'l', 'i', 'e', 'n', 't', '_', 's', 't', 'a', 't', 'u', 's', '\030',
+'\007', ' ', '\001', '(', '\016', '2', '+', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 's', 't', 'a',
+'t', 'u', 's', '.', 'v', '3', '.', 'C', 'l', 'i', 'e', 'n', 't', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 't', 'a', 't', 'u', 's',
+'B', '\013', '\030', '\001', '\222', '\307', '\206', '\330', '\004', '\003', '3', '.', '0', 'R', '\014', 'c', 'l', 'i', 'e', 'n', 't', 'S', 't', 'a', 't',
+'u', 's', '\022', 'N', '\n', '\017', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\002', ' ', '\001',
+'(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'd', 'm', 'i', 'n', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e',
+'n', 'e', 'r', 's', 'C', 'o', 'n', 'f', 'i', 'g', 'D', 'u', 'm', 'p', 'H', '\000', 'R', '\016', 'l', 'i', 's', 't', 'e', 'n', 'e',
+'r', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'K', '\n', '\016', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g',
+'\030', '\003', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'd', 'm', 'i', 'n', '.', 'v', '3', '.', 'C',
+'l', 'u', 's', 't', 'e', 'r', 's', 'C', 'o', 'n', 'f', 'i', 'g', 'D', 'u', 'm', 'p', 'H', '\000', 'R', '\r', 'c', 'l', 'u', 's',
+'t', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'E', '\n', '\014', 'r', 'o', 'u', 't', 'e', '_', 'c', 'o', 'n', 'f', 'i', 'g',
+'\030', '\004', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'd', 'm', 'i', 'n', '.', 'v', '3', '.', 'R',
+'o', 'u', 't', 'e', 's', 'C', 'o', 'n', 'f', 'i', 'g', 'D', 'u', 'm', 'p', 'H', '\000', 'R', '\013', 'r', 'o', 'u', 't', 'e', 'C',
+'o', 'n', 'f', 'i', 'g', '\022', 'X', '\n', '\023', 's', 'c', 'o', 'p', 'e', 'd', '_', 'r', 'o', 'u', 't', 'e', '_', 'c', 'o', 'n',
+'f', 'i', 'g', '\030', '\005', ' ', '\001', '(', '\013', '2', '&', '.', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'd', 'm', 'i', 'n', '.', 'v',
+'3', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 's', 'C', 'o', 'n', 'f', 'i', 'g', 'D', 'u', 'm', 'p', 'H',
+'\000', 'R', '\021', 's', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'N', '\n', '\017', 'e',
+'n', 'd', 'p', 'o', 'i', 'n', 't', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\006', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n',
+'v', 'o', 'y', '.', 'a', 'd', 'm', 'i', 'n', '.', 'v', '3', '.', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 's', 'C', 'o', 'n',
+'f', 'i', 'g', 'D', 'u', 'm', 'p', 'H', '\000', 'R', '\016', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', 'C', 'o', 'n', 'f', 'i', 'g',
+':', '+', '\232', '\305', '\210', '\036', '&', '\n', '$', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 's', 't',
+'a', 't', 'u', 's', '.', 'v', '2', '.', 'P', 'e', 'r', 'X', 'd', 's', 'C', 'o', 'n', 'f', 'i', 'g', 'B', '\020', '\n', '\016', 'p',
+'e', 'r', '_', 'x', 'd', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\"', '\213', '\006', '\n', '\014', 'C', 'l', 'i', 'e', 'n', 't', 'C',
+'o', 'n', 'f', 'i', 'g', '\022', '.', '\n', '\004', 'n', 'o', 'd', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\032', '.', 'e', 'n', 'v',
+'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'N', 'o', 'd', 'e', 'R', '\004', 'n',
+'o', 'd', 'e', '\022', 'Q', '\n', '\n', 'x', 'd', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\002', ' ', '\003', '(', '\013', '2', '%',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 's', 't', 'a', 't', 'u', 's', '.', 'v', '3', '.',
+'P', 'e', 'r', 'X', 'd', 's', 'C', 'o', 'n', 'f', 'i', 'g', 'B', '\013', '\030', '\001', '\222', '\307', '\206', '\330', '\004', '\003', '3', '.', '0',
+'R', '\t', 'x', 'd', 's', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'f', '\n', '\023', 'g', 'e', 'n', 'e', 'r', 'i', 'c', '_', 'x', 'd',
+'s', '_', 'c', 'o', 'n', 'f', 'i', 'g', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', '6', '.', 'e', 'n', 'v', 'o', 'y', '.', 's',
'e', 'r', 'v', 'i', 'c', 'e', '.', 's', 't', 'a', 't', 'u', 's', '.', 'v', '3', '.', 'C', 'l', 'i', 'e', 'n', 't', 'C', 'o',
-'n', 'f', 'i', 'g', 'S', 't', 'a', 't', 'u', 's', 'B', '\002', '\030', '\001', 'R', '\014', 'c', 'l', 'i', 'e', 'n', 't', 'S', 't', 'a',
-'t', 'u', 's', '\022', 'N', '\n', '\017', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\002', ' ',
-'\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'd', 'm', 'i', 'n', '.', 'v', '3', '.', 'L', 'i', 's', 't',
-'e', 'n', 'e', 'r', 's', 'C', 'o', 'n', 'f', 'i', 'g', 'D', 'u', 'm', 'p', 'H', '\000', 'R', '\016', 'l', 'i', 's', 't', 'e', 'n',
-'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'K', '\n', '\016', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i',
-'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'd', 'm', 'i', 'n', '.', 'v', '3', '.',
-'C', 'l', 'u', 's', 't', 'e', 'r', 's', 'C', 'o', 'n', 'f', 'i', 'g', 'D', 'u', 'm', 'p', 'H', '\000', 'R', '\r', 'c', 'l', 'u',
-'s', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'E', '\n', '\014', 'r', 'o', 'u', 't', 'e', '_', 'c', 'o', 'n', 'f', 'i',
-'g', '\030', '\004', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'd', 'm', 'i', 'n', '.', 'v', '3', '.',
-'R', 'o', 'u', 't', 'e', 's', 'C', 'o', 'n', 'f', 'i', 'g', 'D', 'u', 'm', 'p', 'H', '\000', 'R', '\013', 'r', 'o', 'u', 't', 'e',
-'C', 'o', 'n', 'f', 'i', 'g', '\022', 'X', '\n', '\023', 's', 'c', 'o', 'p', 'e', 'd', '_', 'r', 'o', 'u', 't', 'e', '_', 'c', 'o',
-'n', 'f', 'i', 'g', '\030', '\005', ' ', '\001', '(', '\013', '2', '&', '.', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'd', 'm', 'i', 'n', '.',
-'v', '3', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 's', 'C', 'o', 'n', 'f', 'i', 'g', 'D', 'u', 'm', 'p',
-'H', '\000', 'R', '\021', 's', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'N', '\n', '\017',
-'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\006', ' ', '\001', '(', '\013', '2', '#', '.', 'e',
-'n', 'v', 'o', 'y', '.', 'a', 'd', 'm', 'i', 'n', '.', 'v', '3', '.', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 's', 'C', 'o',
-'n', 'f', 'i', 'g', 'D', 'u', 'm', 'p', 'H', '\000', 'R', '\016', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', 'C', 'o', 'n', 'f', 'i',
-'g', ':', '+', '\232', '\305', '\210', '\036', '&', '\n', '$', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 's',
-'t', 'a', 't', 'u', 's', '.', 'v', '2', '.', 'P', 'e', 'r', 'X', 'd', 's', 'C', 'o', 'n', 'f', 'i', 'g', 'B', '\020', '\n', '\016',
-'p', 'e', 'r', '_', 'x', 'd', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\"', '\261', '\001', '\n', '\014', 'C', 'l', 'i', 'e', 'n', 't',
-'C', 'o', 'n', 'f', 'i', 'g', '\022', '.', '\n', '\004', 'n', 'o', 'd', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\032', '.', 'e', 'n',
-'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'N', 'o', 'd', 'e', 'R', '\004',
-'n', 'o', 'd', 'e', '\022', 'D', '\n', '\n', 'x', 'd', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\002', ' ', '\003', '(', '\013', '2',
-'%', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 's', 't', 'a', 't', 'u', 's', '.', 'v', '3',
-'.', 'P', 'e', 'r', 'X', 'd', 's', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\t', 'x', 'd', 's', 'C', 'o', 'n', 'f', 'i', 'g', ':',
-'+', '\232', '\305', '\210', '\036', '&', '\n', '$', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 's', 't', 'a',
-'t', 'u', 's', '.', 'v', '2', '.', 'C', 'l', 'i', 'e', 'n', 't', 'C', 'o', 'n', 'f', 'i', 'g', '\"', '\212', '\001', '\n', '\024', 'C',
-'l', 'i', 'e', 'n', 't', 'S', 't', 'a', 't', 'u', 's', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '\022', '=', '\n', '\006', 'c', 'o',
-'n', 'f', 'i', 'g', '\030', '\001', ' ', '\003', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c',
-'e', '.', 's', 't', 'a', 't', 'u', 's', '.', 'v', '3', '.', 'C', 'l', 'i', 'e', 'n', 't', 'C', 'o', 'n', 'f', 'i', 'g', 'R',
-'\006', 'c', 'o', 'n', 'f', 'i', 'g', ':', '3', '\232', '\305', '\210', '\036', '.', '\n', ',', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r',
-'v', 'i', 'c', 'e', '.', 's', 't', 'a', 't', 'u', 's', '.', 'v', '2', '.', 'C', 'l', 'i', 'e', 'n', 't', 'S', 't', 'a', 't',
-'u', 's', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '*', 'K', '\n', '\014', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 't', 'a', 't', 'u',
-'s', '\022', '\013', '\n', '\007', 'U', 'N', 'K', 'N', 'O', 'W', 'N', '\020', '\000', '\022', '\n', '\n', '\006', 'S', 'Y', 'N', 'C', 'E', 'D', '\020',
-'\001', '\022', '\014', '\n', '\010', 'N', 'O', 'T', '_', 'S', 'E', 'N', 'T', '\020', '\002', '\022', '\t', '\n', '\005', 'S', 'T', 'A', 'L', 'E', '\020',
-'\003', '\022', '\t', '\n', '\005', 'E', 'R', 'R', 'O', 'R', '\020', '\004', '*', 'c', '\n', '\022', 'C', 'l', 'i', 'e', 'n', 't', 'C', 'o', 'n',
-'f', 'i', 'g', 'S', 't', 'a', 't', 'u', 's', '\022', '\022', '\n', '\016', 'C', 'L', 'I', 'E', 'N', 'T', '_', 'U', 'N', 'K', 'N', 'O',
-'W', 'N', '\020', '\000', '\022', '\024', '\n', '\020', 'C', 'L', 'I', 'E', 'N', 'T', '_', 'R', 'E', 'Q', 'U', 'E', 'S', 'T', 'E', 'D', '\020',
-'\001', '\022', '\020', '\n', '\014', 'C', 'L', 'I', 'E', 'N', 'T', '_', 'A', 'C', 'K', 'E', 'D', '\020', '\002', '\022', '\021', '\n', '\r', 'C', 'L',
-'I', 'E', 'N', 'T', '_', 'N', 'A', 'C', 'K', 'E', 'D', '\020', '\003', '2', '\270', '\002', '\n', '\034', 'C', 'l', 'i', 'e', 'n', 't', 'S',
-'t', 'a', 't', 'u', 's', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e', '\022', 'w', '\n', '\022',
-'S', 't', 'r', 'e', 'a', 'm', 'C', 'l', 'i', 'e', 'n', 't', 'S', 't', 'a', 't', 'u', 's', '\022', ',', '.', 'e', 'n', 'v', 'o',
-'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 's', 't', 'a', 't', 'u', 's', '.', 'v', '3', '.', 'C', 'l', 'i', 'e', 'n',
-'t', 'S', 't', 'a', 't', 'u', 's', 'R', 'e', 'q', 'u', 'e', 's', 't', '\032', '-', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e',
-'r', 'v', 'i', 'c', 'e', '.', 's', 't', 'a', 't', 'u', 's', '.', 'v', '3', '.', 'C', 'l', 'i', 'e', 'n', 't', 'S', 't', 'a',
-'t', 'u', 's', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '\"', '\000', '(', '\001', '0', '\001', '\022', '\236', '\001', '\n', '\021', 'F', 'e', 't',
-'c', 'h', 'C', 'l', 'i', 'e', 'n', 't', 'S', 't', 'a', 't', 'u', 's', '\022', ',', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e',
-'r', 'v', 'i', 'c', 'e', '.', 's', 't', 'a', 't', 'u', 's', '.', 'v', '3', '.', 'C', 'l', 'i', 'e', 'n', 't', 'S', 't', 'a',
-'t', 'u', 's', 'R', 'e', 'q', 'u', 'e', 's', 't', '\032', '-', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c',
-'e', '.', 's', 't', 'a', 't', 'u', 's', '.', 'v', '3', '.', 'C', 'l', 'i', 'e', 'n', 't', 'S', 't', 'a', 't', 'u', 's', 'R',
-'e', 's', 'p', 'o', 'n', 's', 'e', '\"', ',', '\202', '\323', '\344', '\223', '\002', '\035', '\"', '\033', '/', 'v', '3', '/', 'd', 'i', 's', 'c',
-'o', 'v', 'e', 'r', 'y', ':', 'c', 'l', 'i', 'e', 'n', 't', '_', 's', 't', 'a', 't', 'u', 's', '\202', '\323', '\344', '\223', '\002', '\003',
-':', '\001', '*', 'B', '?', '\n', '%', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o',
-'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 's', 't', 'a', 't', 'u', 's', '.', 'v', '3', 'B', '\t', 'C', 's', 'd', 's',
-'P', 'r', 'o', 't', 'o', 'P', '\001', '\210', '\001', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o',
-'3',
+'n', 'f', 'i', 'g', '.', 'G', 'e', 'n', 'e', 'r', 'i', 'c', 'X', 'd', 's', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\021', 'g', 'e',
+'n', 'e', 'r', 'i', 'c', 'X', 'd', 's', 'C', 'o', 'n', 'f', 'i', 'g', 's', '\032', '\342', '\003', '\n', '\020', 'G', 'e', 'n', 'e', 'r',
+'i', 'c', 'X', 'd', 's', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '\031', '\n', '\010', 't', 'y', 'p', 'e', '_', 'u', 'r', 'l', '\030', '\001',
+' ', '\001', '(', '\t', 'R', '\007', 't', 'y', 'p', 'e', 'U', 'r', 'l', '\022', '\022', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\002', ' ', '\001',
+'(', '\t', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '!', '\n', '\014', 'v', 'e', 'r', 's', 'i', 'o', 'n', '_', 'i', 'n', 'f', 'o', '\030',
+'\003', ' ', '\001', '(', '\t', 'R', '\013', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'I', 'n', 'f', 'o', '\022', '3', '\n', '\n', 'x', 'd', 's',
+'_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\004', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r',
+'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\t', 'x', 'd', 's', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '=', '\n', '\014',
+'l', 'a', 's', 't', '_', 'u', 'p', 'd', 'a', 't', 'e', 'd', '\030', '\005', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g',
+'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'T', 'i', 'm', 'e', 's', 't', 'a', 'm', 'p', 'R', '\013', 'l', 'a',
+'s', 't', 'U', 'p', 'd', 'a', 't', 'e', 'd', '\022', 'J', '\n', '\r', 'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 't', 'a', 't', 'u',
+'s', '\030', '\006', ' ', '\001', '(', '\016', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 's',
+'t', 'a', 't', 'u', 's', '.', 'v', '3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 't', 'a', 't', 'u', 's', 'R', '\014', 'c', 'o',
+'n', 'f', 'i', 'g', 'S', 't', 'a', 't', 'u', 's', '\022', 'I', '\n', '\r', 'c', 'l', 'i', 'e', 'n', 't', '_', 's', 't', 'a', 't',
+'u', 's', '\030', '\007', ' ', '\001', '(', '\016', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'd', 'm', 'i', 'n', '.', 'v', '3',
+'.', 'C', 'l', 'i', 'e', 'n', 't', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'S', 't', 'a', 't', 'u', 's', 'R', '\014', 'c', 'l',
+'i', 'e', 'n', 't', 'S', 't', 'a', 't', 'u', 's', '\022', 'C', '\n', '\013', 'e', 'r', 'r', 'o', 'r', '_', 's', 't', 'a', 't', 'e',
+'\030', '\010', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'd', 'm', 'i', 'n', '.', 'v', '3', '.', 'U',
+'p', 'd', 'a', 't', 'e', 'F', 'a', 'i', 'l', 'u', 'r', 'e', 'S', 't', 'a', 't', 'e', 'R', '\n', 'e', 'r', 'r', 'o', 'r', 'S',
+'t', 'a', 't', 'e', '\022', ',', '\n', '\022', 'i', 's', '_', 's', 't', 'a', 't', 'i', 'c', '_', 'r', 'e', 's', 'o', 'u', 'r', 'c',
+'e', '\030', '\t', ' ', '\001', '(', '\010', 'R', '\020', 'i', 's', 'S', 't', 'a', 't', 'i', 'c', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e',
+':', '+', '\232', '\305', '\210', '\036', '&', '\n', '$', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 's', 't',
+'a', 't', 'u', 's', '.', 'v', '2', '.', 'C', 'l', 'i', 'e', 'n', 't', 'C', 'o', 'n', 'f', 'i', 'g', '\"', '\212', '\001', '\n', '\024',
+'C', 'l', 'i', 'e', 'n', 't', 'S', 't', 'a', 't', 'u', 's', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '\022', '=', '\n', '\006', 'c',
+'o', 'n', 'f', 'i', 'g', '\030', '\001', ' ', '\003', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i',
+'c', 'e', '.', 's', 't', 'a', 't', 'u', 's', '.', 'v', '3', '.', 'C', 'l', 'i', 'e', 'n', 't', 'C', 'o', 'n', 'f', 'i', 'g',
+'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', ':', '3', '\232', '\305', '\210', '\036', '.', '\n', ',', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e',
+'r', 'v', 'i', 'c', 'e', '.', 's', 't', 'a', 't', 'u', 's', '.', 'v', '2', '.', 'C', 'l', 'i', 'e', 'n', 't', 'S', 't', 'a',
+'t', 'u', 's', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '*', 'K', '\n', '\014', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 't', 'a', 't',
+'u', 's', '\022', '\013', '\n', '\007', 'U', 'N', 'K', 'N', 'O', 'W', 'N', '\020', '\000', '\022', '\n', '\n', '\006', 'S', 'Y', 'N', 'C', 'E', 'D',
+'\020', '\001', '\022', '\014', '\n', '\010', 'N', 'O', 'T', '_', 'S', 'E', 'N', 'T', '\020', '\002', '\022', '\t', '\n', '\005', 'S', 'T', 'A', 'L', 'E',
+'\020', '\003', '\022', '\t', '\n', '\005', 'E', 'R', 'R', 'O', 'R', '\020', '\004', '*', 'c', '\n', '\022', 'C', 'l', 'i', 'e', 'n', 't', 'C', 'o',
+'n', 'f', 'i', 'g', 'S', 't', 'a', 't', 'u', 's', '\022', '\022', '\n', '\016', 'C', 'L', 'I', 'E', 'N', 'T', '_', 'U', 'N', 'K', 'N',
+'O', 'W', 'N', '\020', '\000', '\022', '\024', '\n', '\020', 'C', 'L', 'I', 'E', 'N', 'T', '_', 'R', 'E', 'Q', 'U', 'E', 'S', 'T', 'E', 'D',
+'\020', '\001', '\022', '\020', '\n', '\014', 'C', 'L', 'I', 'E', 'N', 'T', '_', 'A', 'C', 'K', 'E', 'D', '\020', '\002', '\022', '\021', '\n', '\r', 'C',
+'L', 'I', 'E', 'N', 'T', '_', 'N', 'A', 'C', 'K', 'E', 'D', '\020', '\003', '2', '\270', '\002', '\n', '\034', 'C', 'l', 'i', 'e', 'n', 't',
+'S', 't', 'a', 't', 'u', 's', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e', '\022', 'w', '\n',
+'\022', 'S', 't', 'r', 'e', 'a', 'm', 'C', 'l', 'i', 'e', 'n', 't', 'S', 't', 'a', 't', 'u', 's', '\022', ',', '.', 'e', 'n', 'v',
+'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 's', 't', 'a', 't', 'u', 's', '.', 'v', '3', '.', 'C', 'l', 'i', 'e',
+'n', 't', 'S', 't', 'a', 't', 'u', 's', 'R', 'e', 'q', 'u', 'e', 's', 't', '\032', '-', '.', 'e', 'n', 'v', 'o', 'y', '.', 's',
+'e', 'r', 'v', 'i', 'c', 'e', '.', 's', 't', 'a', 't', 'u', 's', '.', 'v', '3', '.', 'C', 'l', 'i', 'e', 'n', 't', 'S', 't',
+'a', 't', 'u', 's', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '\"', '\000', '(', '\001', '0', '\001', '\022', '\236', '\001', '\n', '\021', 'F', 'e',
+'t', 'c', 'h', 'C', 'l', 'i', 'e', 'n', 't', 'S', 't', 'a', 't', 'u', 's', '\022', ',', '.', 'e', 'n', 'v', 'o', 'y', '.', 's',
+'e', 'r', 'v', 'i', 'c', 'e', '.', 's', 't', 'a', 't', 'u', 's', '.', 'v', '3', '.', 'C', 'l', 'i', 'e', 'n', 't', 'S', 't',
+'a', 't', 'u', 's', 'R', 'e', 'q', 'u', 'e', 's', 't', '\032', '-', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i',
+'c', 'e', '.', 's', 't', 'a', 't', 'u', 's', '.', 'v', '3', '.', 'C', 'l', 'i', 'e', 'n', 't', 'S', 't', 'a', 't', 'u', 's',
+'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '\"', ',', '\202', '\323', '\344', '\223', '\002', '\035', '\"', '\033', '/', 'v', '3', '/', 'd', 'i', 's',
+'c', 'o', 'v', 'e', 'r', 'y', ':', 'c', 'l', 'i', 'e', 'n', 't', '_', 's', 't', 'a', 't', 'u', 's', '\202', '\323', '\344', '\223', '\002',
+'\003', ':', '\001', '*', 'B', '?', '\n', '%', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v',
+'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 's', 't', 'a', 't', 'u', 's', '.', 'v', '3', 'B', '\t', 'C', 's', 'd',
+'s', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\210', '\001', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't',
+'o', '3',
};
-static upb_def_init *deps[8] = {
+static upb_def_init *deps[10] = {
&envoy_admin_v3_config_dump_proto_upbdefinit,
&envoy_config_core_v3_base_proto_upbdefinit,
&envoy_type_matcher_v3_node_proto_upbdefinit,
&google_api_annotations_proto_upbdefinit,
- &udpa_annotations_migrate_proto_upbdefinit,
+ &google_protobuf_any_proto_upbdefinit,
+ &google_protobuf_timestamp_proto_upbdefinit,
+ &envoy_annotations_deprecation_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
&udpa_annotations_versioning_proto_upbdefinit,
NULL
@@ -126,5 +159,5 @@ upb_def_init envoy_service_status_v3_csds_proto_upbdefinit = {
deps,
layouts,
"envoy/service/status/v3/csds.proto",
- UPB_STRVIEW_INIT(descriptor, 2001)
+ UPB_STRVIEW_INIT(descriptor, 2677)
};
diff --git a/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h b/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h
index 91723cc10a..7b034cad34 100644
--- a/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h
+++ b/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h
@@ -36,6 +36,11 @@ UPB_INLINE const upb_msgdef *envoy_service_status_v3_ClientConfig_getmsgdef(upb_
return upb_symtab_lookupmsg(s, "envoy.service.status.v3.ClientConfig");
}
+UPB_INLINE const upb_msgdef *envoy_service_status_v3_ClientConfig_GenericXdsConfig_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &envoy_service_status_v3_csds_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "envoy.service.status.v3.ClientConfig.GenericXdsConfig");
+}
+
UPB_INLINE const upb_msgdef *envoy_service_status_v3_ClientStatusResponse_getmsgdef(upb_symtab *s) {
_upb_symtab_loaddefinit(s, &envoy_service_status_v3_csds_proto_upbdefinit);
return upb_symtab_lookupmsg(s, "envoy.service.status.v3.ClientStatusResponse");
diff --git a/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c b/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c
new file mode 100644
index 0000000000..361429cb55
--- /dev/null
+++ b/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c
@@ -0,0 +1,64 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/type/http/v3/path_transformation.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include "upb/def.h"
+#include "envoy/type/http/v3/path_transformation.upbdefs.h"
+
+extern upb_def_init udpa_annotations_status_proto_upbdefinit;
+extern upb_def_init validate_validate_proto_upbdefinit;
+extern const upb_msglayout envoy_type_http_v3_PathTransformation_msginit;
+extern const upb_msglayout envoy_type_http_v3_PathTransformation_Operation_msginit;
+extern const upb_msglayout envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986_msginit;
+extern const upb_msglayout envoy_type_http_v3_PathTransformation_Operation_MergeSlashes_msginit;
+
+static const upb_msglayout *layouts[4] = {
+ &envoy_type_http_v3_PathTransformation_msginit,
+ &envoy_type_http_v3_PathTransformation_Operation_msginit,
+ &envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986_msginit,
+ &envoy_type_http_v3_PathTransformation_Operation_MergeSlashes_msginit,
+};
+
+static const char descriptor[618] = {'\n', ',', 'e', 'n', 'v', 'o', 'y', '/', 't', 'y', 'p', 'e', '/', 'h', 't', 't', 'p', '/', 'v', '3', '/', 'p', 'a', 't', 'h',
+'_', 't', 'r', 'a', 'n', 's', 'f', 'o', 'r', 'm', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\022', '\022', 'e', 'n',
+'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'h', 't', 't', 'p', '.', 'v', '3', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n',
+'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v',
+'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\236', '\003',
+'\n', '\022', 'P', 'a', 't', 'h', 'T', 'r', 'a', 'n', 's', 'f', 'o', 'r', 'm', 'a', 't', 'i', 'o', 'n', '\022', 'P', '\n', '\n', 'o',
+'p', 'e', 'r', 'a', 't', 'i', 'o', 'n', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', '0', '.', 'e', 'n', 'v', 'o', 'y', '.', 't',
+'y', 'p', 'e', '.', 'h', 't', 't', 'p', '.', 'v', '3', '.', 'P', 'a', 't', 'h', 'T', 'r', 'a', 'n', 's', 'f', 'o', 'r', 'm',
+'a', 't', 'i', 'o', 'n', '.', 'O', 'p', 'e', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\n', 'o', 'p', 'e', 'r', 'a', 't', 'i', 'o',
+'n', 's', '\032', '\265', '\002', '\n', '\t', 'O', 'p', 'e', 'r', 'a', 't', 'i', 'o', 'n', '\022', '~', '\n', '\027', 'n', 'o', 'r', 'm', 'a',
+'l', 'i', 'z', 'e', '_', 'p', 'a', 't', 'h', '_', 'r', 'f', 'c', '_', '3', '9', '8', '6', '\030', '\002', ' ', '\001', '(', '\013', '2',
+'E', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'h', 't', 't', 'p', '.', 'v', '3', '.', 'P', 'a', 't', 'h',
+'T', 'r', 'a', 'n', 's', 'f', 'o', 'r', 'm', 'a', 't', 'i', 'o', 'n', '.', 'O', 'p', 'e', 'r', 'a', 't', 'i', 'o', 'n', '.',
+'N', 'o', 'r', 'm', 'a', 'l', 'i', 'z', 'e', 'P', 'a', 't', 'h', 'R', 'F', 'C', '3', '9', '8', '6', 'H', '\000', 'R', '\024', 'n',
+'o', 'r', 'm', 'a', 'l', 'i', 'z', 'e', 'P', 'a', 't', 'h', 'R', 'f', 'c', '3', '9', '8', '6', '\022', 'd', '\n', '\r', 'm', 'e',
+'r', 'g', 'e', '_', 's', 'l', 'a', 's', 'h', 'e', 's', '\030', '\003', ' ', '\001', '(', '\013', '2', '=', '.', 'e', 'n', 'v', 'o', 'y',
+'.', 't', 'y', 'p', 'e', '.', 'h', 't', 't', 'p', '.', 'v', '3', '.', 'P', 'a', 't', 'h', 'T', 'r', 'a', 'n', 's', 'f', 'o',
+'r', 'm', 'a', 't', 'i', 'o', 'n', '.', 'O', 'p', 'e', 'r', 'a', 't', 'i', 'o', 'n', '.', 'M', 'e', 'r', 'g', 'e', 'S', 'l',
+'a', 's', 'h', 'e', 's', 'H', '\000', 'R', '\014', 'm', 'e', 'r', 'g', 'e', 'S', 'l', 'a', 's', 'h', 'e', 's', '\032', '\026', '\n', '\024',
+'N', 'o', 'r', 'm', 'a', 'l', 'i', 'z', 'e', 'P', 'a', 't', 'h', 'R', 'F', 'C', '3', '9', '8', '6', '\032', '\016', '\n', '\014', 'M',
+'e', 'r', 'g', 'e', 'S', 'l', 'a', 's', 'h', 'e', 's', 'B', '\032', '\n', '\023', 'o', 'p', 'e', 'r', 'a', 't', 'i', 'o', 'n', '_',
+'s', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', 'B', 'E', '\n', ' ', 'i', 'o', '.', 'e', 'n', 'v', 'o',
+'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'h', 't', 't', 'p', '.', 'v', '3',
+'B', '\027', 'P', 'a', 't', 'h', 'T', 'r', 'a', 'n', 's', 'f', 'o', 'r', 'm', 'a', 't', 'i', 'o', 'n', 'P', 'r', 'o', 't', 'o',
+'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+};
+
+static upb_def_init *deps[3] = {
+ &udpa_annotations_status_proto_upbdefinit,
+ &validate_validate_proto_upbdefinit,
+ NULL
+};
+
+upb_def_init envoy_type_http_v3_path_transformation_proto_upbdefinit = {
+ deps,
+ layouts,
+ "envoy/type/http/v3/path_transformation.proto",
+ UPB_STRVIEW_INIT(descriptor, 618)
+};
diff --git a/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.h b/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.h
new file mode 100644
index 0000000000..10990efced
--- /dev/null
+++ b/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.h
@@ -0,0 +1,50 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/type/http/v3/path_transformation.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef ENVOY_TYPE_HTTP_V3_PATH_TRANSFORMATION_PROTO_UPBDEFS_H_
+#define ENVOY_TYPE_HTTP_V3_PATH_TRANSFORMATION_PROTO_UPBDEFS_H_
+
+#include "upb/def.h"
+#include "upb/port_def.inc"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "upb/def.h"
+
+#include "upb/port_def.inc"
+
+extern upb_def_init envoy_type_http_v3_path_transformation_proto_upbdefinit;
+
+UPB_INLINE const upb_msgdef *envoy_type_http_v3_PathTransformation_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &envoy_type_http_v3_path_transformation_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "envoy.type.http.v3.PathTransformation");
+}
+
+UPB_INLINE const upb_msgdef *envoy_type_http_v3_PathTransformation_Operation_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &envoy_type_http_v3_path_transformation_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "envoy.type.http.v3.PathTransformation.Operation");
+}
+
+UPB_INLINE const upb_msgdef *envoy_type_http_v3_PathTransformation_Operation_NormalizePathRFC3986_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &envoy_type_http_v3_path_transformation_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "envoy.type.http.v3.PathTransformation.Operation.NormalizePathRFC3986");
+}
+
+UPB_INLINE const upb_msgdef *envoy_type_http_v3_PathTransformation_Operation_MergeSlashes_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &envoy_type_http_v3_path_transformation_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "envoy.type.http.v3.PathTransformation.Operation.MergeSlashes");
+}
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif /* ENVOY_TYPE_HTTP_V3_PATH_TRANSFORMATION_PROTO_UPBDEFS_H_ */
diff --git a/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c b/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c
index 8805d24c6f..54c21808e2 100644
--- a/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c
+++ b/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c
@@ -10,6 +10,7 @@
#include "envoy/type/matcher/v3/regex.upbdefs.h"
extern upb_def_init google_protobuf_wrappers_proto_upbdefinit;
+extern upb_def_init envoy_annotations_deprecation_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
extern upb_def_init udpa_annotations_versioning_proto_upbdefinit;
extern upb_def_init validate_validate_proto_upbdefinit;
@@ -23,42 +24,44 @@ static const upb_msglayout *layouts[3] = {
&envoy_type_matcher_v3_RegexMatchAndSubstitute_msginit,
};
-static const char descriptor[776] = {'\n', '!', 'e', 'n', 'v', 'o', 'y', '/', 't', 'y', 'p', 'e', '/', 'm', 'a', 't', 'c', 'h', 'e', 'r', '/', 'v', '3', '/', 'r',
+static const char descriptor[822] = {'\n', '!', 'e', 'n', 'v', 'o', 'y', '/', 't', 'y', 'p', 'e', '/', 'm', 'a', 't', 'c', 'h', 'e', 'r', '/', 'v', '3', '/', 'r',
'e', 'g', 'e', 'x', '.', 'p', 'r', 'o', 't', 'o', '\022', '\025', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a',
't', 'c', 'h', 'e', 'r', '.', 'v', '3', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
-'/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n',
-'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd',
-'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g',
-'.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e',
-'.', 'p', 'r', 'o', 't', 'o', '\"', '\317', '\002', '\n', '\014', 'R', 'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'e', 'r', '\022', 'X',
-'\n', '\n', 'g', 'o', 'o', 'g', 'l', 'e', '_', 'r', 'e', '2', '\030', '\001', ' ', '\001', '(', '\013', '2', '-', '.', 'e', 'n', 'v', 'o',
-'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'R', 'e', 'g', 'e', 'x', 'M', 'a',
-'t', 'c', 'h', 'e', 'r', '.', 'G', 'o', 'o', 'g', 'l', 'e', 'R', 'E', '2', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001',
-'H', '\000', 'R', '\t', 'g', 'o', 'o', 'g', 'l', 'e', 'R', 'e', '2', '\022', '\035', '\n', '\005', 'r', 'e', 'g', 'e', 'x', '\030', '\002', ' ',
-'\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\005', 'r', 'e', 'g', 'e', 'x', '\032', '\211', '\001', '\n', '\t', 'G',
-'o', 'o', 'g', 'l', 'e', 'R', 'E', '2', '\022', 'J', '\n', '\020', 'm', 'a', 'x', '_', 'p', 'r', 'o', 'g', 'r', 'a', 'm', '_', 's',
-'i', 'z', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b',
-'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\002', '\030', '\001', 'R', '\016', 'm', 'a', 'x', 'P', 'r',
-'o', 'g', 'r', 'a', 'm', 'S', 'i', 'z', 'e', ':', '0', '\232', '\305', '\210', '\036', '+', '\n', ')', 'e', 'n', 'v', 'o', 'y', '.', 't',
-'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'R', 'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'e', 'r', '.',
-'G', 'o', 'o', 'g', 'l', 'e', 'R', 'E', '2', ':', '&', '\232', '\305', '\210', '\036', '!', '\n', '\037', 'e', 'n', 'v', 'o', 'y', '.', 't',
-'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'R', 'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'B',
-'\022', '\n', '\013', 'e', 'n', 'g', 'i', 'n', 'e', '_', 't', 'y', 'p', 'e', '\022', '\003', '\370', 'B', '\001', '\"', '\271', '\001', '\n', '\027', 'R',
-'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'A', 'n', 'd', 'S', 'u', 'b', 's', 't', 'i', 't', 'u', 't', 'e', '\022', 'G', '\n',
-'\007', 'p', 'a', 't', 't', 'e', 'r', 'n', '\030', '\001', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y',
-'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'R', 'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'e',
-'r', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\007', 'p', 'a', 't', 't', 'e', 'r', 'n', '\022', '\"', '\n', '\014', 's',
-'u', 'b', 's', 't', 'i', 't', 'u', 't', 'i', 'o', 'n', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\014', 's', 'u', 'b', 's', 't', 'i',
-'t', 'u', 't', 'i', 'o', 'n', ':', '1', '\232', '\305', '\210', '\036', ',', '\n', '*', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e',
-'.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'R', 'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'A', 'n', 'd', 'S', 'u', 'b',
-'s', 't', 'i', 't', 'u', 't', 'e', 'B', ';', '\n', '#', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.',
-'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', 'B', '\n', 'R', 'e',
-'g', 'e', 'x', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o',
-'3',
+'/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '#', 'e', 'n', 'v', 'o', 'y', '/', 'a', 'n',
+'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'd', 'e', 'p', 'r', 'e', 'c', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o',
+'t', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't',
+'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n',
+'s', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd',
+'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\330', '\002', '\n', '\014', 'R', 'e',
+'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'e', 'r', '\022', 'X', '\n', '\n', 'g', 'o', 'o', 'g', 'l', 'e', '_', 'r', 'e', '2', '\030',
+'\001', ' ', '\001', '(', '\013', '2', '-', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e',
+'r', '.', 'v', '3', '.', 'R', 'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'e', 'r', '.', 'G', 'o', 'o', 'g', 'l', 'e', 'R',
+'E', '2', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'H', '\000', 'R', '\t', 'g', 'o', 'o', 'g', 'l', 'e', 'R', 'e', '2',
+'\022', '\035', '\n', '\005', 'r', 'e', 'g', 'e', 'x', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R',
+'\005', 'r', 'e', 'g', 'e', 'x', '\032', '\222', '\001', '\n', '\t', 'G', 'o', 'o', 'g', 'l', 'e', 'R', 'E', '2', '\022', 'S', '\n', '\020', 'm',
+'a', 'x', '_', 'p', 'r', 'o', 'g', 'r', 'a', 'm', '_', 's', 'i', 'z', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g',
+'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u',
+'e', 'B', '\013', '\030', '\001', '\222', '\307', '\206', '\330', '\004', '\003', '3', '.', '0', 'R', '\016', 'm', 'a', 'x', 'P', 'r', 'o', 'g', 'r', 'a',
+'m', 'S', 'i', 'z', 'e', ':', '0', '\232', '\305', '\210', '\036', '+', '\n', ')', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.',
+'m', 'a', 't', 'c', 'h', 'e', 'r', '.', 'R', 'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'e', 'r', '.', 'G', 'o', 'o', 'g',
+'l', 'e', 'R', 'E', '2', ':', '&', '\232', '\305', '\210', '\036', '!', '\n', '\037', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.',
+'m', 'a', 't', 'c', 'h', 'e', 'r', '.', 'R', 'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'B', '\022', '\n', '\013', 'e',
+'n', 'g', 'i', 'n', 'e', '_', 't', 'y', 'p', 'e', '\022', '\003', '\370', 'B', '\001', '\"', '\271', '\001', '\n', '\027', 'R', 'e', 'g', 'e', 'x',
+'M', 'a', 't', 'c', 'h', 'A', 'n', 'd', 'S', 'u', 'b', 's', 't', 'i', 't', 'u', 't', 'e', '\022', 'G', '\n', '\007', 'p', 'a', 't',
+'t', 'e', 'r', 'n', '\030', '\001', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm',
+'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'R', 'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'B', '\010', '\372',
+'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\007', 'p', 'a', 't', 't', 'e', 'r', 'n', '\022', '\"', '\n', '\014', 's', 'u', 'b', 's', 't',
+'i', 't', 'u', 't', 'i', 'o', 'n', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\014', 's', 'u', 'b', 's', 't', 'i', 't', 'u', 't', 'i',
+'o', 'n', ':', '1', '\232', '\305', '\210', '\036', ',', '\n', '*', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't',
+'c', 'h', 'e', 'r', '.', 'R', 'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'A', 'n', 'd', 'S', 'u', 'b', 's', 't', 'i', 't',
+'u', 't', 'e', 'B', ';', '\n', '#', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o',
+'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', 'B', '\n', 'R', 'e', 'g', 'e', 'x', 'P',
+'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[5] = {
+static upb_def_init *deps[6] = {
&google_protobuf_wrappers_proto_upbdefinit,
+ &envoy_annotations_deprecation_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
&udpa_annotations_versioning_proto_upbdefinit,
&validate_validate_proto_upbdefinit,
@@ -69,5 +72,5 @@ upb_def_init envoy_type_matcher_v3_regex_proto_upbdefinit = {
deps,
layouts,
"envoy/type/matcher/v3/regex.proto",
- UPB_STRVIEW_INIT(descriptor, 776)
+ UPB_STRVIEW_INIT(descriptor, 822)
};
diff --git a/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c b/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c
index a4300a1eb4..bae81b8eaa 100644
--- a/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c
+++ b/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c
@@ -16,17 +16,17 @@ static const upb_msglayout *layouts[1] = {
&google_rpc_Status_msginit,
};
-static const char descriptor[272] = {'\n', '\027', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'r', 'p', 'c', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o',
+static const char descriptor[275] = {'\n', '\027', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'r', 'p', 'c', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o',
'\022', '\n', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'r', 'p', 'c', '\032', '\031', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't',
'o', 'b', 'u', 'f', '/', 'a', 'n', 'y', '.', 'p', 'r', 'o', 't', 'o', '\"', 'f', '\n', '\006', 'S', 't', 'a', 't', 'u', 's', '\022',
'\022', '\n', '\004', 'c', 'o', 'd', 'e', '\030', '\001', ' ', '\001', '(', '\005', 'R', '\004', 'c', 'o', 'd', 'e', '\022', '\030', '\n', '\007', 'm', 'e',
's', 's', 'a', 'g', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\007', 'm', 'e', 's', 's', 'a', 'g', 'e', '\022', '.', '\n', '\007', 'd',
'e', 't', 'a', 'i', 'l', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o',
-'t', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\007', 'd', 'e', 't', 'a', 'i', 'l', 's', 'B', '^', '\n', '\016', 'c', 'o', 'm',
+'t', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\007', 'd', 'e', 't', 'a', 'i', 'l', 's', 'B', 'a', '\n', '\016', 'c', 'o', 'm',
'.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'r', 'p', 'c', 'B', '\013', 'S', 't', 'a', 't', 'u', 's', 'P', 'r', 'o', 't', 'o', 'P',
'\001', 'Z', '7', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'g', 'o', 'l', 'a', 'n', 'g', '.', 'o', 'r', 'g', '/', 'g', 'e', 'n', 'p',
'r', 'o', 't', 'o', '/', 'g', 'o', 'o', 'g', 'l', 'e', 'a', 'p', 'i', 's', '/', 'r', 'p', 'c', '/', 's', 't', 'a', 't', 'u',
-'s', ';', 's', 't', 'a', 't', 'u', 's', '\242', '\002', '\003', 'R', 'P', 'C', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'s', ';', 's', 't', 'a', 't', 'u', 's', '\370', '\001', '\001', '\242', '\002', '\003', 'R', 'P', 'C', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
static upb_def_init *deps[2] = {
@@ -38,5 +38,5 @@ upb_def_init google_rpc_status_proto_upbdefinit = {
deps,
layouts,
"google/rpc/status.proto",
- UPB_STRVIEW_INIT(descriptor, 272)
+ UPB_STRVIEW_INIT(descriptor, 275)
};
diff --git a/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c b/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c
index dc751fa62b..881b75ddbc 100644
--- a/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c
+++ b/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c
@@ -62,7 +62,7 @@ static const upb_msglayout *layouts[23] = {
&validate_TimestampRules_msginit,
};
-static const char descriptor[5759] = {'\n', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o',
+static const char descriptor[6319] = {'\n', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o',
'\022', '\010', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '\032', ' ', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b',
'u', 'f', '/', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g',
'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't',
@@ -111,131 +111,152 @@ static const char descriptor[5759] = {'\n', '\027', 'v', 'a', 'l', 'i', 'd', 'a'
'R', 'u', 'l', 'e', 's', 'H', '\000', 'R', '\010', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\022', '8', '\n', '\t', 't', 'i', 'm', 'e',
's', 't', 'a', 'm', 'p', '\030', '\026', ' ', '\001', '(', '\013', '2', '\030', '.', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'T', 'i',
'm', 'e', 's', 't', 'a', 'm', 'p', 'R', 'u', 'l', 'e', 's', 'H', '\000', 'R', '\t', 't', 'i', 'm', 'e', 's', 't', 'a', 'm', 'p',
-'B', '\006', '\n', '\004', 't', 'y', 'p', 'e', '\"', '\215', '\001', '\n', '\n', 'F', 'l', 'o', 'a', 't', 'R', 'u', 'l', 'e', 's', '\022', '\024',
+'B', '\006', '\n', '\004', 't', 'y', 'p', 'e', '\"', '\260', '\001', '\n', '\n', 'F', 'l', 'o', 'a', 't', 'R', 'u', 'l', 'e', 's', '\022', '\024',
'\n', '\005', 'c', 'o', 'n', 's', 't', '\030', '\001', ' ', '\001', '(', '\002', 'R', '\005', 'c', 'o', 'n', 's', 't', '\022', '\016', '\n', '\002', 'l',
't', '\030', '\002', ' ', '\001', '(', '\002', 'R', '\002', 'l', 't', '\022', '\020', '\n', '\003', 'l', 't', 'e', '\030', '\003', ' ', '\001', '(', '\002', 'R',
'\003', 'l', 't', 'e', '\022', '\016', '\n', '\002', 'g', 't', '\030', '\004', ' ', '\001', '(', '\002', 'R', '\002', 'g', 't', '\022', '\020', '\n', '\003', 'g',
't', 'e', '\030', '\005', ' ', '\001', '(', '\002', 'R', '\003', 'g', 't', 'e', '\022', '\016', '\n', '\002', 'i', 'n', '\030', '\006', ' ', '\003', '(', '\002',
'R', '\002', 'i', 'n', '\022', '\025', '\n', '\006', 'n', 'o', 't', '_', 'i', 'n', '\030', '\007', ' ', '\003', '(', '\002', 'R', '\005', 'n', 'o', 't',
-'I', 'n', '\"', '\216', '\001', '\n', '\013', 'D', 'o', 'u', 'b', 'l', 'e', 'R', 'u', 'l', 'e', 's', '\022', '\024', '\n', '\005', 'c', 'o', 'n',
-'s', 't', '\030', '\001', ' ', '\001', '(', '\001', 'R', '\005', 'c', 'o', 'n', 's', 't', '\022', '\016', '\n', '\002', 'l', 't', '\030', '\002', ' ', '\001',
-'(', '\001', 'R', '\002', 'l', 't', '\022', '\020', '\n', '\003', 'l', 't', 'e', '\030', '\003', ' ', '\001', '(', '\001', 'R', '\003', 'l', 't', 'e', '\022',
-'\016', '\n', '\002', 'g', 't', '\030', '\004', ' ', '\001', '(', '\001', 'R', '\002', 'g', 't', '\022', '\020', '\n', '\003', 'g', 't', 'e', '\030', '\005', ' ',
-'\001', '(', '\001', 'R', '\003', 'g', 't', 'e', '\022', '\016', '\n', '\002', 'i', 'n', '\030', '\006', ' ', '\003', '(', '\001', 'R', '\002', 'i', 'n', '\022',
-'\025', '\n', '\006', 'n', 'o', 't', '_', 'i', 'n', '\030', '\007', ' ', '\003', '(', '\001', 'R', '\005', 'n', 'o', 't', 'I', 'n', '\"', '\215', '\001',
-'\n', '\n', 'I', 'n', 't', '3', '2', 'R', 'u', 'l', 'e', 's', '\022', '\024', '\n', '\005', 'c', 'o', 'n', 's', 't', '\030', '\001', ' ', '\001',
-'(', '\005', 'R', '\005', 'c', 'o', 'n', 's', 't', '\022', '\016', '\n', '\002', 'l', 't', '\030', '\002', ' ', '\001', '(', '\005', 'R', '\002', 'l', 't',
-'\022', '\020', '\n', '\003', 'l', 't', 'e', '\030', '\003', ' ', '\001', '(', '\005', 'R', '\003', 'l', 't', 'e', '\022', '\016', '\n', '\002', 'g', 't', '\030',
-'\004', ' ', '\001', '(', '\005', 'R', '\002', 'g', 't', '\022', '\020', '\n', '\003', 'g', 't', 'e', '\030', '\005', ' ', '\001', '(', '\005', 'R', '\003', 'g',
-'t', 'e', '\022', '\016', '\n', '\002', 'i', 'n', '\030', '\006', ' ', '\003', '(', '\005', 'R', '\002', 'i', 'n', '\022', '\025', '\n', '\006', 'n', 'o', 't',
-'_', 'i', 'n', '\030', '\007', ' ', '\003', '(', '\005', 'R', '\005', 'n', 'o', 't', 'I', 'n', '\"', '\215', '\001', '\n', '\n', 'I', 'n', 't', '6',
-'4', 'R', 'u', 'l', 'e', 's', '\022', '\024', '\n', '\005', 'c', 'o', 'n', 's', 't', '\030', '\001', ' ', '\001', '(', '\003', 'R', '\005', 'c', 'o',
-'n', 's', 't', '\022', '\016', '\n', '\002', 'l', 't', '\030', '\002', ' ', '\001', '(', '\003', 'R', '\002', 'l', 't', '\022', '\020', '\n', '\003', 'l', 't',
-'e', '\030', '\003', ' ', '\001', '(', '\003', 'R', '\003', 'l', 't', 'e', '\022', '\016', '\n', '\002', 'g', 't', '\030', '\004', ' ', '\001', '(', '\003', 'R',
-'\002', 'g', 't', '\022', '\020', '\n', '\003', 'g', 't', 'e', '\030', '\005', ' ', '\001', '(', '\003', 'R', '\003', 'g', 't', 'e', '\022', '\016', '\n', '\002',
-'i', 'n', '\030', '\006', ' ', '\003', '(', '\003', 'R', '\002', 'i', 'n', '\022', '\025', '\n', '\006', 'n', 'o', 't', '_', 'i', 'n', '\030', '\007', ' ',
-'\003', '(', '\003', 'R', '\005', 'n', 'o', 't', 'I', 'n', '\"', '\216', '\001', '\n', '\013', 'U', 'I', 'n', 't', '3', '2', 'R', 'u', 'l', 'e',
-'s', '\022', '\024', '\n', '\005', 'c', 'o', 'n', 's', 't', '\030', '\001', ' ', '\001', '(', '\r', 'R', '\005', 'c', 'o', 'n', 's', 't', '\022', '\016',
-'\n', '\002', 'l', 't', '\030', '\002', ' ', '\001', '(', '\r', 'R', '\002', 'l', 't', '\022', '\020', '\n', '\003', 'l', 't', 'e', '\030', '\003', ' ', '\001',
-'(', '\r', 'R', '\003', 'l', 't', 'e', '\022', '\016', '\n', '\002', 'g', 't', '\030', '\004', ' ', '\001', '(', '\r', 'R', '\002', 'g', 't', '\022', '\020',
-'\n', '\003', 'g', 't', 'e', '\030', '\005', ' ', '\001', '(', '\r', 'R', '\003', 'g', 't', 'e', '\022', '\016', '\n', '\002', 'i', 'n', '\030', '\006', ' ',
-'\003', '(', '\r', 'R', '\002', 'i', 'n', '\022', '\025', '\n', '\006', 'n', 'o', 't', '_', 'i', 'n', '\030', '\007', ' ', '\003', '(', '\r', 'R', '\005',
-'n', 'o', 't', 'I', 'n', '\"', '\216', '\001', '\n', '\013', 'U', 'I', 'n', 't', '6', '4', 'R', 'u', 'l', 'e', 's', '\022', '\024', '\n', '\005',
+'I', 'n', '\022', '!', '\n', '\014', 'i', 'g', 'n', 'o', 'r', 'e', '_', 'e', 'm', 'p', 't', 'y', '\030', '\010', ' ', '\001', '(', '\010', 'R',
+'\013', 'i', 'g', 'n', 'o', 'r', 'e', 'E', 'm', 'p', 't', 'y', '\"', '\261', '\001', '\n', '\013', 'D', 'o', 'u', 'b', 'l', 'e', 'R', 'u',
+'l', 'e', 's', '\022', '\024', '\n', '\005', 'c', 'o', 'n', 's', 't', '\030', '\001', ' ', '\001', '(', '\001', 'R', '\005', 'c', 'o', 'n', 's', 't',
+'\022', '\016', '\n', '\002', 'l', 't', '\030', '\002', ' ', '\001', '(', '\001', 'R', '\002', 'l', 't', '\022', '\020', '\n', '\003', 'l', 't', 'e', '\030', '\003',
+' ', '\001', '(', '\001', 'R', '\003', 'l', 't', 'e', '\022', '\016', '\n', '\002', 'g', 't', '\030', '\004', ' ', '\001', '(', '\001', 'R', '\002', 'g', 't',
+'\022', '\020', '\n', '\003', 'g', 't', 'e', '\030', '\005', ' ', '\001', '(', '\001', 'R', '\003', 'g', 't', 'e', '\022', '\016', '\n', '\002', 'i', 'n', '\030',
+'\006', ' ', '\003', '(', '\001', 'R', '\002', 'i', 'n', '\022', '\025', '\n', '\006', 'n', 'o', 't', '_', 'i', 'n', '\030', '\007', ' ', '\003', '(', '\001',
+'R', '\005', 'n', 'o', 't', 'I', 'n', '\022', '!', '\n', '\014', 'i', 'g', 'n', 'o', 'r', 'e', '_', 'e', 'm', 'p', 't', 'y', '\030', '\010',
+' ', '\001', '(', '\010', 'R', '\013', 'i', 'g', 'n', 'o', 'r', 'e', 'E', 'm', 'p', 't', 'y', '\"', '\260', '\001', '\n', '\n', 'I', 'n', 't',
+'3', '2', 'R', 'u', 'l', 'e', 's', '\022', '\024', '\n', '\005', 'c', 'o', 'n', 's', 't', '\030', '\001', ' ', '\001', '(', '\005', 'R', '\005', 'c',
+'o', 'n', 's', 't', '\022', '\016', '\n', '\002', 'l', 't', '\030', '\002', ' ', '\001', '(', '\005', 'R', '\002', 'l', 't', '\022', '\020', '\n', '\003', 'l',
+'t', 'e', '\030', '\003', ' ', '\001', '(', '\005', 'R', '\003', 'l', 't', 'e', '\022', '\016', '\n', '\002', 'g', 't', '\030', '\004', ' ', '\001', '(', '\005',
+'R', '\002', 'g', 't', '\022', '\020', '\n', '\003', 'g', 't', 'e', '\030', '\005', ' ', '\001', '(', '\005', 'R', '\003', 'g', 't', 'e', '\022', '\016', '\n',
+'\002', 'i', 'n', '\030', '\006', ' ', '\003', '(', '\005', 'R', '\002', 'i', 'n', '\022', '\025', '\n', '\006', 'n', 'o', 't', '_', 'i', 'n', '\030', '\007',
+' ', '\003', '(', '\005', 'R', '\005', 'n', 'o', 't', 'I', 'n', '\022', '!', '\n', '\014', 'i', 'g', 'n', 'o', 'r', 'e', '_', 'e', 'm', 'p',
+'t', 'y', '\030', '\010', ' ', '\001', '(', '\010', 'R', '\013', 'i', 'g', 'n', 'o', 'r', 'e', 'E', 'm', 'p', 't', 'y', '\"', '\260', '\001', '\n',
+'\n', 'I', 'n', 't', '6', '4', 'R', 'u', 'l', 'e', 's', '\022', '\024', '\n', '\005', 'c', 'o', 'n', 's', 't', '\030', '\001', ' ', '\001', '(',
+'\003', 'R', '\005', 'c', 'o', 'n', 's', 't', '\022', '\016', '\n', '\002', 'l', 't', '\030', '\002', ' ', '\001', '(', '\003', 'R', '\002', 'l', 't', '\022',
+'\020', '\n', '\003', 'l', 't', 'e', '\030', '\003', ' ', '\001', '(', '\003', 'R', '\003', 'l', 't', 'e', '\022', '\016', '\n', '\002', 'g', 't', '\030', '\004',
+' ', '\001', '(', '\003', 'R', '\002', 'g', 't', '\022', '\020', '\n', '\003', 'g', 't', 'e', '\030', '\005', ' ', '\001', '(', '\003', 'R', '\003', 'g', 't',
+'e', '\022', '\016', '\n', '\002', 'i', 'n', '\030', '\006', ' ', '\003', '(', '\003', 'R', '\002', 'i', 'n', '\022', '\025', '\n', '\006', 'n', 'o', 't', '_',
+'i', 'n', '\030', '\007', ' ', '\003', '(', '\003', 'R', '\005', 'n', 'o', 't', 'I', 'n', '\022', '!', '\n', '\014', 'i', 'g', 'n', 'o', 'r', 'e',
+'_', 'e', 'm', 'p', 't', 'y', '\030', '\010', ' ', '\001', '(', '\010', 'R', '\013', 'i', 'g', 'n', 'o', 'r', 'e', 'E', 'm', 'p', 't', 'y',
+'\"', '\261', '\001', '\n', '\013', 'U', 'I', 'n', 't', '3', '2', 'R', 'u', 'l', 'e', 's', '\022', '\024', '\n', '\005', 'c', 'o', 'n', 's', 't',
+'\030', '\001', ' ', '\001', '(', '\r', 'R', '\005', 'c', 'o', 'n', 's', 't', '\022', '\016', '\n', '\002', 'l', 't', '\030', '\002', ' ', '\001', '(', '\r',
+'R', '\002', 'l', 't', '\022', '\020', '\n', '\003', 'l', 't', 'e', '\030', '\003', ' ', '\001', '(', '\r', 'R', '\003', 'l', 't', 'e', '\022', '\016', '\n',
+'\002', 'g', 't', '\030', '\004', ' ', '\001', '(', '\r', 'R', '\002', 'g', 't', '\022', '\020', '\n', '\003', 'g', 't', 'e', '\030', '\005', ' ', '\001', '(',
+'\r', 'R', '\003', 'g', 't', 'e', '\022', '\016', '\n', '\002', 'i', 'n', '\030', '\006', ' ', '\003', '(', '\r', 'R', '\002', 'i', 'n', '\022', '\025', '\n',
+'\006', 'n', 'o', 't', '_', 'i', 'n', '\030', '\007', ' ', '\003', '(', '\r', 'R', '\005', 'n', 'o', 't', 'I', 'n', '\022', '!', '\n', '\014', 'i',
+'g', 'n', 'o', 'r', 'e', '_', 'e', 'm', 'p', 't', 'y', '\030', '\010', ' ', '\001', '(', '\010', 'R', '\013', 'i', 'g', 'n', 'o', 'r', 'e',
+'E', 'm', 'p', 't', 'y', '\"', '\261', '\001', '\n', '\013', 'U', 'I', 'n', 't', '6', '4', 'R', 'u', 'l', 'e', 's', '\022', '\024', '\n', '\005',
'c', 'o', 'n', 's', 't', '\030', '\001', ' ', '\001', '(', '\004', 'R', '\005', 'c', 'o', 'n', 's', 't', '\022', '\016', '\n', '\002', 'l', 't', '\030',
'\002', ' ', '\001', '(', '\004', 'R', '\002', 'l', 't', '\022', '\020', '\n', '\003', 'l', 't', 'e', '\030', '\003', ' ', '\001', '(', '\004', 'R', '\003', 'l',
't', 'e', '\022', '\016', '\n', '\002', 'g', 't', '\030', '\004', ' ', '\001', '(', '\004', 'R', '\002', 'g', 't', '\022', '\020', '\n', '\003', 'g', 't', 'e',
'\030', '\005', ' ', '\001', '(', '\004', 'R', '\003', 'g', 't', 'e', '\022', '\016', '\n', '\002', 'i', 'n', '\030', '\006', ' ', '\003', '(', '\004', 'R', '\002',
'i', 'n', '\022', '\025', '\n', '\006', 'n', 'o', 't', '_', 'i', 'n', '\030', '\007', ' ', '\003', '(', '\004', 'R', '\005', 'n', 'o', 't', 'I', 'n',
-'\"', '\216', '\001', '\n', '\013', 'S', 'I', 'n', 't', '3', '2', 'R', 'u', 'l', 'e', 's', '\022', '\024', '\n', '\005', 'c', 'o', 'n', 's', 't',
-'\030', '\001', ' ', '\001', '(', '\021', 'R', '\005', 'c', 'o', 'n', 's', 't', '\022', '\016', '\n', '\002', 'l', 't', '\030', '\002', ' ', '\001', '(', '\021',
-'R', '\002', 'l', 't', '\022', '\020', '\n', '\003', 'l', 't', 'e', '\030', '\003', ' ', '\001', '(', '\021', 'R', '\003', 'l', 't', 'e', '\022', '\016', '\n',
-'\002', 'g', 't', '\030', '\004', ' ', '\001', '(', '\021', 'R', '\002', 'g', 't', '\022', '\020', '\n', '\003', 'g', 't', 'e', '\030', '\005', ' ', '\001', '(',
-'\021', 'R', '\003', 'g', 't', 'e', '\022', '\016', '\n', '\002', 'i', 'n', '\030', '\006', ' ', '\003', '(', '\021', 'R', '\002', 'i', 'n', '\022', '\025', '\n',
-'\006', 'n', 'o', 't', '_', 'i', 'n', '\030', '\007', ' ', '\003', '(', '\021', 'R', '\005', 'n', 'o', 't', 'I', 'n', '\"', '\216', '\001', '\n', '\013',
-'S', 'I', 'n', 't', '6', '4', 'R', 'u', 'l', 'e', 's', '\022', '\024', '\n', '\005', 'c', 'o', 'n', 's', 't', '\030', '\001', ' ', '\001', '(',
-'\022', 'R', '\005', 'c', 'o', 'n', 's', 't', '\022', '\016', '\n', '\002', 'l', 't', '\030', '\002', ' ', '\001', '(', '\022', 'R', '\002', 'l', 't', '\022',
-'\020', '\n', '\003', 'l', 't', 'e', '\030', '\003', ' ', '\001', '(', '\022', 'R', '\003', 'l', 't', 'e', '\022', '\016', '\n', '\002', 'g', 't', '\030', '\004',
-' ', '\001', '(', '\022', 'R', '\002', 'g', 't', '\022', '\020', '\n', '\003', 'g', 't', 'e', '\030', '\005', ' ', '\001', '(', '\022', 'R', '\003', 'g', 't',
-'e', '\022', '\016', '\n', '\002', 'i', 'n', '\030', '\006', ' ', '\003', '(', '\022', 'R', '\002', 'i', 'n', '\022', '\025', '\n', '\006', 'n', 'o', 't', '_',
-'i', 'n', '\030', '\007', ' ', '\003', '(', '\022', 'R', '\005', 'n', 'o', 't', 'I', 'n', '\"', '\217', '\001', '\n', '\014', 'F', 'i', 'x', 'e', 'd',
-'3', '2', 'R', 'u', 'l', 'e', 's', '\022', '\024', '\n', '\005', 'c', 'o', 'n', 's', 't', '\030', '\001', ' ', '\001', '(', '\007', 'R', '\005', 'c',
-'o', 'n', 's', 't', '\022', '\016', '\n', '\002', 'l', 't', '\030', '\002', ' ', '\001', '(', '\007', 'R', '\002', 'l', 't', '\022', '\020', '\n', '\003', 'l',
-'t', 'e', '\030', '\003', ' ', '\001', '(', '\007', 'R', '\003', 'l', 't', 'e', '\022', '\016', '\n', '\002', 'g', 't', '\030', '\004', ' ', '\001', '(', '\007',
-'R', '\002', 'g', 't', '\022', '\020', '\n', '\003', 'g', 't', 'e', '\030', '\005', ' ', '\001', '(', '\007', 'R', '\003', 'g', 't', 'e', '\022', '\016', '\n',
-'\002', 'i', 'n', '\030', '\006', ' ', '\003', '(', '\007', 'R', '\002', 'i', 'n', '\022', '\025', '\n', '\006', 'n', 'o', 't', '_', 'i', 'n', '\030', '\007',
-' ', '\003', '(', '\007', 'R', '\005', 'n', 'o', 't', 'I', 'n', '\"', '\217', '\001', '\n', '\014', 'F', 'i', 'x', 'e', 'd', '6', '4', 'R', 'u',
-'l', 'e', 's', '\022', '\024', '\n', '\005', 'c', 'o', 'n', 's', 't', '\030', '\001', ' ', '\001', '(', '\006', 'R', '\005', 'c', 'o', 'n', 's', 't',
-'\022', '\016', '\n', '\002', 'l', 't', '\030', '\002', ' ', '\001', '(', '\006', 'R', '\002', 'l', 't', '\022', '\020', '\n', '\003', 'l', 't', 'e', '\030', '\003',
-' ', '\001', '(', '\006', 'R', '\003', 'l', 't', 'e', '\022', '\016', '\n', '\002', 'g', 't', '\030', '\004', ' ', '\001', '(', '\006', 'R', '\002', 'g', 't',
-'\022', '\020', '\n', '\003', 'g', 't', 'e', '\030', '\005', ' ', '\001', '(', '\006', 'R', '\003', 'g', 't', 'e', '\022', '\016', '\n', '\002', 'i', 'n', '\030',
-'\006', ' ', '\003', '(', '\006', 'R', '\002', 'i', 'n', '\022', '\025', '\n', '\006', 'n', 'o', 't', '_', 'i', 'n', '\030', '\007', ' ', '\003', '(', '\006',
-'R', '\005', 'n', 'o', 't', 'I', 'n', '\"', '\220', '\001', '\n', '\r', 'S', 'F', 'i', 'x', 'e', 'd', '3', '2', 'R', 'u', 'l', 'e', 's',
+'\022', '!', '\n', '\014', 'i', 'g', 'n', 'o', 'r', 'e', '_', 'e', 'm', 'p', 't', 'y', '\030', '\010', ' ', '\001', '(', '\010', 'R', '\013', 'i',
+'g', 'n', 'o', 'r', 'e', 'E', 'm', 'p', 't', 'y', '\"', '\261', '\001', '\n', '\013', 'S', 'I', 'n', 't', '3', '2', 'R', 'u', 'l', 'e',
+'s', '\022', '\024', '\n', '\005', 'c', 'o', 'n', 's', 't', '\030', '\001', ' ', '\001', '(', '\021', 'R', '\005', 'c', 'o', 'n', 's', 't', '\022', '\016',
+'\n', '\002', 'l', 't', '\030', '\002', ' ', '\001', '(', '\021', 'R', '\002', 'l', 't', '\022', '\020', '\n', '\003', 'l', 't', 'e', '\030', '\003', ' ', '\001',
+'(', '\021', 'R', '\003', 'l', 't', 'e', '\022', '\016', '\n', '\002', 'g', 't', '\030', '\004', ' ', '\001', '(', '\021', 'R', '\002', 'g', 't', '\022', '\020',
+'\n', '\003', 'g', 't', 'e', '\030', '\005', ' ', '\001', '(', '\021', 'R', '\003', 'g', 't', 'e', '\022', '\016', '\n', '\002', 'i', 'n', '\030', '\006', ' ',
+'\003', '(', '\021', 'R', '\002', 'i', 'n', '\022', '\025', '\n', '\006', 'n', 'o', 't', '_', 'i', 'n', '\030', '\007', ' ', '\003', '(', '\021', 'R', '\005',
+'n', 'o', 't', 'I', 'n', '\022', '!', '\n', '\014', 'i', 'g', 'n', 'o', 'r', 'e', '_', 'e', 'm', 'p', 't', 'y', '\030', '\010', ' ', '\001',
+'(', '\010', 'R', '\013', 'i', 'g', 'n', 'o', 'r', 'e', 'E', 'm', 'p', 't', 'y', '\"', '\261', '\001', '\n', '\013', 'S', 'I', 'n', 't', '6',
+'4', 'R', 'u', 'l', 'e', 's', '\022', '\024', '\n', '\005', 'c', 'o', 'n', 's', 't', '\030', '\001', ' ', '\001', '(', '\022', 'R', '\005', 'c', 'o',
+'n', 's', 't', '\022', '\016', '\n', '\002', 'l', 't', '\030', '\002', ' ', '\001', '(', '\022', 'R', '\002', 'l', 't', '\022', '\020', '\n', '\003', 'l', 't',
+'e', '\030', '\003', ' ', '\001', '(', '\022', 'R', '\003', 'l', 't', 'e', '\022', '\016', '\n', '\002', 'g', 't', '\030', '\004', ' ', '\001', '(', '\022', 'R',
+'\002', 'g', 't', '\022', '\020', '\n', '\003', 'g', 't', 'e', '\030', '\005', ' ', '\001', '(', '\022', 'R', '\003', 'g', 't', 'e', '\022', '\016', '\n', '\002',
+'i', 'n', '\030', '\006', ' ', '\003', '(', '\022', 'R', '\002', 'i', 'n', '\022', '\025', '\n', '\006', 'n', 'o', 't', '_', 'i', 'n', '\030', '\007', ' ',
+'\003', '(', '\022', 'R', '\005', 'n', 'o', 't', 'I', 'n', '\022', '!', '\n', '\014', 'i', 'g', 'n', 'o', 'r', 'e', '_', 'e', 'm', 'p', 't',
+'y', '\030', '\010', ' ', '\001', '(', '\010', 'R', '\013', 'i', 'g', 'n', 'o', 'r', 'e', 'E', 'm', 'p', 't', 'y', '\"', '\262', '\001', '\n', '\014',
+'F', 'i', 'x', 'e', 'd', '3', '2', 'R', 'u', 'l', 'e', 's', '\022', '\024', '\n', '\005', 'c', 'o', 'n', 's', 't', '\030', '\001', ' ', '\001',
+'(', '\007', 'R', '\005', 'c', 'o', 'n', 's', 't', '\022', '\016', '\n', '\002', 'l', 't', '\030', '\002', ' ', '\001', '(', '\007', 'R', '\002', 'l', 't',
+'\022', '\020', '\n', '\003', 'l', 't', 'e', '\030', '\003', ' ', '\001', '(', '\007', 'R', '\003', 'l', 't', 'e', '\022', '\016', '\n', '\002', 'g', 't', '\030',
+'\004', ' ', '\001', '(', '\007', 'R', '\002', 'g', 't', '\022', '\020', '\n', '\003', 'g', 't', 'e', '\030', '\005', ' ', '\001', '(', '\007', 'R', '\003', 'g',
+'t', 'e', '\022', '\016', '\n', '\002', 'i', 'n', '\030', '\006', ' ', '\003', '(', '\007', 'R', '\002', 'i', 'n', '\022', '\025', '\n', '\006', 'n', 'o', 't',
+'_', 'i', 'n', '\030', '\007', ' ', '\003', '(', '\007', 'R', '\005', 'n', 'o', 't', 'I', 'n', '\022', '!', '\n', '\014', 'i', 'g', 'n', 'o', 'r',
+'e', '_', 'e', 'm', 'p', 't', 'y', '\030', '\010', ' ', '\001', '(', '\010', 'R', '\013', 'i', 'g', 'n', 'o', 'r', 'e', 'E', 'm', 'p', 't',
+'y', '\"', '\262', '\001', '\n', '\014', 'F', 'i', 'x', 'e', 'd', '6', '4', 'R', 'u', 'l', 'e', 's', '\022', '\024', '\n', '\005', 'c', 'o', 'n',
+'s', 't', '\030', '\001', ' ', '\001', '(', '\006', 'R', '\005', 'c', 'o', 'n', 's', 't', '\022', '\016', '\n', '\002', 'l', 't', '\030', '\002', ' ', '\001',
+'(', '\006', 'R', '\002', 'l', 't', '\022', '\020', '\n', '\003', 'l', 't', 'e', '\030', '\003', ' ', '\001', '(', '\006', 'R', '\003', 'l', 't', 'e', '\022',
+'\016', '\n', '\002', 'g', 't', '\030', '\004', ' ', '\001', '(', '\006', 'R', '\002', 'g', 't', '\022', '\020', '\n', '\003', 'g', 't', 'e', '\030', '\005', ' ',
+'\001', '(', '\006', 'R', '\003', 'g', 't', 'e', '\022', '\016', '\n', '\002', 'i', 'n', '\030', '\006', ' ', '\003', '(', '\006', 'R', '\002', 'i', 'n', '\022',
+'\025', '\n', '\006', 'n', 'o', 't', '_', 'i', 'n', '\030', '\007', ' ', '\003', '(', '\006', 'R', '\005', 'n', 'o', 't', 'I', 'n', '\022', '!', '\n',
+'\014', 'i', 'g', 'n', 'o', 'r', 'e', '_', 'e', 'm', 'p', 't', 'y', '\030', '\010', ' ', '\001', '(', '\010', 'R', '\013', 'i', 'g', 'n', 'o',
+'r', 'e', 'E', 'm', 'p', 't', 'y', '\"', '\263', '\001', '\n', '\r', 'S', 'F', 'i', 'x', 'e', 'd', '3', '2', 'R', 'u', 'l', 'e', 's',
'\022', '\024', '\n', '\005', 'c', 'o', 'n', 's', 't', '\030', '\001', ' ', '\001', '(', '\017', 'R', '\005', 'c', 'o', 'n', 's', 't', '\022', '\016', '\n',
'\002', 'l', 't', '\030', '\002', ' ', '\001', '(', '\017', 'R', '\002', 'l', 't', '\022', '\020', '\n', '\003', 'l', 't', 'e', '\030', '\003', ' ', '\001', '(',
'\017', 'R', '\003', 'l', 't', 'e', '\022', '\016', '\n', '\002', 'g', 't', '\030', '\004', ' ', '\001', '(', '\017', 'R', '\002', 'g', 't', '\022', '\020', '\n',
'\003', 'g', 't', 'e', '\030', '\005', ' ', '\001', '(', '\017', 'R', '\003', 'g', 't', 'e', '\022', '\016', '\n', '\002', 'i', 'n', '\030', '\006', ' ', '\003',
'(', '\017', 'R', '\002', 'i', 'n', '\022', '\025', '\n', '\006', 'n', 'o', 't', '_', 'i', 'n', '\030', '\007', ' ', '\003', '(', '\017', 'R', '\005', 'n',
-'o', 't', 'I', 'n', '\"', '\220', '\001', '\n', '\r', 'S', 'F', 'i', 'x', 'e', 'd', '6', '4', 'R', 'u', 'l', 'e', 's', '\022', '\024', '\n',
-'\005', 'c', 'o', 'n', 's', 't', '\030', '\001', ' ', '\001', '(', '\020', 'R', '\005', 'c', 'o', 'n', 's', 't', '\022', '\016', '\n', '\002', 'l', 't',
-'\030', '\002', ' ', '\001', '(', '\020', 'R', '\002', 'l', 't', '\022', '\020', '\n', '\003', 'l', 't', 'e', '\030', '\003', ' ', '\001', '(', '\020', 'R', '\003',
-'l', 't', 'e', '\022', '\016', '\n', '\002', 'g', 't', '\030', '\004', ' ', '\001', '(', '\020', 'R', '\002', 'g', 't', '\022', '\020', '\n', '\003', 'g', 't',
-'e', '\030', '\005', ' ', '\001', '(', '\020', 'R', '\003', 'g', 't', 'e', '\022', '\016', '\n', '\002', 'i', 'n', '\030', '\006', ' ', '\003', '(', '\020', 'R',
-'\002', 'i', 'n', '\022', '\025', '\n', '\006', 'n', 'o', 't', '_', 'i', 'n', '\030', '\007', ' ', '\003', '(', '\020', 'R', '\005', 'n', 'o', 't', 'I',
-'n', '\"', '!', '\n', '\t', 'B', 'o', 'o', 'l', 'R', 'u', 'l', 'e', 's', '\022', '\024', '\n', '\005', 'c', 'o', 'n', 's', 't', '\030', '\001',
-' ', '\001', '(', '\010', 'R', '\005', 'c', 'o', 'n', 's', 't', '\"', '\261', '\005', '\n', '\013', 'S', 't', 'r', 'i', 'n', 'g', 'R', 'u', 'l',
-'e', 's', '\022', '\024', '\n', '\005', 'c', 'o', 'n', 's', 't', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\005', 'c', 'o', 'n', 's', 't', '\022',
-'\020', '\n', '\003', 'l', 'e', 'n', '\030', '\023', ' ', '\001', '(', '\004', 'R', '\003', 'l', 'e', 'n', '\022', '\027', '\n', '\007', 'm', 'i', 'n', '_',
-'l', 'e', 'n', '\030', '\002', ' ', '\001', '(', '\004', 'R', '\006', 'm', 'i', 'n', 'L', 'e', 'n', '\022', '\027', '\n', '\007', 'm', 'a', 'x', '_',
-'l', 'e', 'n', '\030', '\003', ' ', '\001', '(', '\004', 'R', '\006', 'm', 'a', 'x', 'L', 'e', 'n', '\022', '\033', '\n', '\t', 'l', 'e', 'n', '_',
-'b', 'y', 't', 'e', 's', '\030', '\024', ' ', '\001', '(', '\004', 'R', '\010', 'l', 'e', 'n', 'B', 'y', 't', 'e', 's', '\022', '\033', '\n', '\t',
-'m', 'i', 'n', '_', 'b', 'y', 't', 'e', 's', '\030', '\004', ' ', '\001', '(', '\004', 'R', '\010', 'm', 'i', 'n', 'B', 'y', 't', 'e', 's',
-'\022', '\033', '\n', '\t', 'm', 'a', 'x', '_', 'b', 'y', 't', 'e', 's', '\030', '\005', ' ', '\001', '(', '\004', 'R', '\010', 'm', 'a', 'x', 'B',
-'y', 't', 'e', 's', '\022', '\030', '\n', '\007', 'p', 'a', 't', 't', 'e', 'r', 'n', '\030', '\006', ' ', '\001', '(', '\t', 'R', '\007', 'p', 'a',
-'t', 't', 'e', 'r', 'n', '\022', '\026', '\n', '\006', 'p', 'r', 'e', 'f', 'i', 'x', '\030', '\007', ' ', '\001', '(', '\t', 'R', '\006', 'p', 'r',
-'e', 'f', 'i', 'x', '\022', '\026', '\n', '\006', 's', 'u', 'f', 'f', 'i', 'x', '\030', '\010', ' ', '\001', '(', '\t', 'R', '\006', 's', 'u', 'f',
-'f', 'i', 'x', '\022', '\032', '\n', '\010', 'c', 'o', 'n', 't', 'a', 'i', 'n', 's', '\030', '\t', ' ', '\001', '(', '\t', 'R', '\010', 'c', 'o',
-'n', 't', 'a', 'i', 'n', 's', '\022', '!', '\n', '\014', 'n', 'o', 't', '_', 'c', 'o', 'n', 't', 'a', 'i', 'n', 's', '\030', '\027', ' ',
-'\001', '(', '\t', 'R', '\013', 'n', 'o', 't', 'C', 'o', 'n', 't', 'a', 'i', 'n', 's', '\022', '\016', '\n', '\002', 'i', 'n', '\030', '\n', ' ',
-'\003', '(', '\t', 'R', '\002', 'i', 'n', '\022', '\025', '\n', '\006', 'n', 'o', 't', '_', 'i', 'n', '\030', '\013', ' ', '\003', '(', '\t', 'R', '\005',
-'n', 'o', 't', 'I', 'n', '\022', '\026', '\n', '\005', 'e', 'm', 'a', 'i', 'l', '\030', '\014', ' ', '\001', '(', '\010', 'H', '\000', 'R', '\005', 'e',
-'m', 'a', 'i', 'l', '\022', '\034', '\n', '\010', 'h', 'o', 's', 't', 'n', 'a', 'm', 'e', '\030', '\r', ' ', '\001', '(', '\010', 'H', '\000', 'R',
-'\010', 'h', 'o', 's', 't', 'n', 'a', 'm', 'e', '\022', '\020', '\n', '\002', 'i', 'p', '\030', '\016', ' ', '\001', '(', '\010', 'H', '\000', 'R', '\002',
-'i', 'p', '\022', '\024', '\n', '\004', 'i', 'p', 'v', '4', '\030', '\017', ' ', '\001', '(', '\010', 'H', '\000', 'R', '\004', 'i', 'p', 'v', '4', '\022',
-'\024', '\n', '\004', 'i', 'p', 'v', '6', '\030', '\020', ' ', '\001', '(', '\010', 'H', '\000', 'R', '\004', 'i', 'p', 'v', '6', '\022', '\022', '\n', '\003',
-'u', 'r', 'i', '\030', '\021', ' ', '\001', '(', '\010', 'H', '\000', 'R', '\003', 'u', 'r', 'i', '\022', '\031', '\n', '\007', 'u', 'r', 'i', '_', 'r',
-'e', 'f', '\030', '\022', ' ', '\001', '(', '\010', 'H', '\000', 'R', '\006', 'u', 'r', 'i', 'R', 'e', 'f', '\022', '\032', '\n', '\007', 'a', 'd', 'd',
-'r', 'e', 's', 's', '\030', '\025', ' ', '\001', '(', '\010', 'H', '\000', 'R', '\007', 'a', 'd', 'd', 'r', 'e', 's', 's', '\022', '\024', '\n', '\004',
-'u', 'u', 'i', 'd', '\030', '\026', ' ', '\001', '(', '\010', 'H', '\000', 'R', '\004', 'u', 'u', 'i', 'd', '\022', '@', '\n', '\020', 'w', 'e', 'l',
-'l', '_', 'k', 'n', 'o', 'w', 'n', '_', 'r', 'e', 'g', 'e', 'x', '\030', '\030', ' ', '\001', '(', '\016', '2', '\024', '.', 'v', 'a', 'l',
-'i', 'd', 'a', 't', 'e', '.', 'K', 'n', 'o', 'w', 'n', 'R', 'e', 'g', 'e', 'x', 'H', '\000', 'R', '\016', 'w', 'e', 'l', 'l', 'K',
-'n', 'o', 'w', 'n', 'R', 'e', 'g', 'e', 'x', '\022', '\034', '\n', '\006', 's', 't', 'r', 'i', 'c', 't', '\030', '\031', ' ', '\001', '(', '\010',
-':', '\004', 't', 'r', 'u', 'e', 'R', '\006', 's', 't', 'r', 'i', 'c', 't', 'B', '\014', '\n', '\n', 'w', 'e', 'l', 'l', '_', 'k', 'n',
-'o', 'w', 'n', '\"', '\277', '\002', '\n', '\n', 'B', 'y', 't', 'e', 's', 'R', 'u', 'l', 'e', 's', '\022', '\024', '\n', '\005', 'c', 'o', 'n',
-'s', 't', '\030', '\001', ' ', '\001', '(', '\014', 'R', '\005', 'c', 'o', 'n', 's', 't', '\022', '\020', '\n', '\003', 'l', 'e', 'n', '\030', '\r', ' ',
-'\001', '(', '\004', 'R', '\003', 'l', 'e', 'n', '\022', '\027', '\n', '\007', 'm', 'i', 'n', '_', 'l', 'e', 'n', '\030', '\002', ' ', '\001', '(', '\004',
-'R', '\006', 'm', 'i', 'n', 'L', 'e', 'n', '\022', '\027', '\n', '\007', 'm', 'a', 'x', '_', 'l', 'e', 'n', '\030', '\003', ' ', '\001', '(', '\004',
-'R', '\006', 'm', 'a', 'x', 'L', 'e', 'n', '\022', '\030', '\n', '\007', 'p', 'a', 't', 't', 'e', 'r', 'n', '\030', '\004', ' ', '\001', '(', '\t',
-'R', '\007', 'p', 'a', 't', 't', 'e', 'r', 'n', '\022', '\026', '\n', '\006', 'p', 'r', 'e', 'f', 'i', 'x', '\030', '\005', ' ', '\001', '(', '\014',
-'R', '\006', 'p', 'r', 'e', 'f', 'i', 'x', '\022', '\026', '\n', '\006', 's', 'u', 'f', 'f', 'i', 'x', '\030', '\006', ' ', '\001', '(', '\014', 'R',
-'\006', 's', 'u', 'f', 'f', 'i', 'x', '\022', '\032', '\n', '\010', 'c', 'o', 'n', 't', 'a', 'i', 'n', 's', '\030', '\007', ' ', '\001', '(', '\014',
-'R', '\010', 'c', 'o', 'n', 't', 'a', 'i', 'n', 's', '\022', '\016', '\n', '\002', 'i', 'n', '\030', '\010', ' ', '\003', '(', '\014', 'R', '\002', 'i',
-'n', '\022', '\025', '\n', '\006', 'n', 'o', 't', '_', 'i', 'n', '\030', '\t', ' ', '\003', '(', '\014', 'R', '\005', 'n', 'o', 't', 'I', 'n', '\022',
-'\020', '\n', '\002', 'i', 'p', '\030', '\n', ' ', '\001', '(', '\010', 'H', '\000', 'R', '\002', 'i', 'p', '\022', '\024', '\n', '\004', 'i', 'p', 'v', '4',
-'\030', '\013', ' ', '\001', '(', '\010', 'H', '\000', 'R', '\004', 'i', 'p', 'v', '4', '\022', '\024', '\n', '\004', 'i', 'p', 'v', '6', '\030', '\014', ' ',
-'\001', '(', '\010', 'H', '\000', 'R', '\004', 'i', 'p', 'v', '6', 'B', '\014', '\n', '\n', 'w', 'e', 'l', 'l', '_', 'k', 'n', 'o', 'w', 'n',
-'\"', 'k', '\n', '\t', 'E', 'n', 'u', 'm', 'R', 'u', 'l', 'e', 's', '\022', '\024', '\n', '\005', 'c', 'o', 'n', 's', 't', '\030', '\001', ' ',
-'\001', '(', '\005', 'R', '\005', 'c', 'o', 'n', 's', 't', '\022', '!', '\n', '\014', 'd', 'e', 'f', 'i', 'n', 'e', 'd', '_', 'o', 'n', 'l',
-'y', '\030', '\002', ' ', '\001', '(', '\010', 'R', '\013', 'd', 'e', 'f', 'i', 'n', 'e', 'd', 'O', 'n', 'l', 'y', '\022', '\016', '\n', '\002', 'i',
-'n', '\030', '\003', ' ', '\003', '(', '\005', 'R', '\002', 'i', 'n', '\022', '\025', '\n', '\006', 'n', 'o', 't', '_', 'i', 'n', '\030', '\004', ' ', '\003',
-'(', '\005', 'R', '\005', 'n', 'o', 't', 'I', 'n', '\"', '>', '\n', '\014', 'M', 'e', 's', 's', 'a', 'g', 'e', 'R', 'u', 'l', 'e', 's',
-'\022', '\022', '\n', '\004', 's', 'k', 'i', 'p', '\030', '\001', ' ', '\001', '(', '\010', 'R', '\004', 's', 'k', 'i', 'p', '\022', '\032', '\n', '\010', 'r',
-'e', 'q', 'u', 'i', 'r', 'e', 'd', '\030', '\002', ' ', '\001', '(', '\010', 'R', '\010', 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'd', '\"', '\215',
-'\001', '\n', '\r', 'R', 'e', 'p', 'e', 'a', 't', 'e', 'd', 'R', 'u', 'l', 'e', 's', '\022', '\033', '\n', '\t', 'm', 'i', 'n', '_', 'i',
-'t', 'e', 'm', 's', '\030', '\001', ' ', '\001', '(', '\004', 'R', '\010', 'm', 'i', 'n', 'I', 't', 'e', 'm', 's', '\022', '\033', '\n', '\t', 'm',
-'a', 'x', '_', 'i', 't', 'e', 'm', 's', '\030', '\002', ' ', '\001', '(', '\004', 'R', '\010', 'm', 'a', 'x', 'I', 't', 'e', 'm', 's', '\022',
-'\026', '\n', '\006', 'u', 'n', 'i', 'q', 'u', 'e', '\030', '\003', ' ', '\001', '(', '\010', 'R', '\006', 'u', 'n', 'i', 'q', 'u', 'e', '\022', '*',
-'\n', '\005', 'i', 't', 'e', 'm', 's', '\030', '\004', ' ', '\001', '(', '\013', '2', '\024', '.', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.',
-'F', 'i', 'e', 'l', 'd', 'R', 'u', 'l', 'e', 's', 'R', '\005', 'i', 't', 'e', 'm', 's', '\"', '\271', '\001', '\n', '\010', 'M', 'a', 'p',
+'o', 't', 'I', 'n', '\022', '!', '\n', '\014', 'i', 'g', 'n', 'o', 'r', 'e', '_', 'e', 'm', 'p', 't', 'y', '\030', '\010', ' ', '\001', '(',
+'\010', 'R', '\013', 'i', 'g', 'n', 'o', 'r', 'e', 'E', 'm', 'p', 't', 'y', '\"', '\263', '\001', '\n', '\r', 'S', 'F', 'i', 'x', 'e', 'd',
+'6', '4', 'R', 'u', 'l', 'e', 's', '\022', '\024', '\n', '\005', 'c', 'o', 'n', 's', 't', '\030', '\001', ' ', '\001', '(', '\020', 'R', '\005', 'c',
+'o', 'n', 's', 't', '\022', '\016', '\n', '\002', 'l', 't', '\030', '\002', ' ', '\001', '(', '\020', 'R', '\002', 'l', 't', '\022', '\020', '\n', '\003', 'l',
+'t', 'e', '\030', '\003', ' ', '\001', '(', '\020', 'R', '\003', 'l', 't', 'e', '\022', '\016', '\n', '\002', 'g', 't', '\030', '\004', ' ', '\001', '(', '\020',
+'R', '\002', 'g', 't', '\022', '\020', '\n', '\003', 'g', 't', 'e', '\030', '\005', ' ', '\001', '(', '\020', 'R', '\003', 'g', 't', 'e', '\022', '\016', '\n',
+'\002', 'i', 'n', '\030', '\006', ' ', '\003', '(', '\020', 'R', '\002', 'i', 'n', '\022', '\025', '\n', '\006', 'n', 'o', 't', '_', 'i', 'n', '\030', '\007',
+' ', '\003', '(', '\020', 'R', '\005', 'n', 'o', 't', 'I', 'n', '\022', '!', '\n', '\014', 'i', 'g', 'n', 'o', 'r', 'e', '_', 'e', 'm', 'p',
+'t', 'y', '\030', '\010', ' ', '\001', '(', '\010', 'R', '\013', 'i', 'g', 'n', 'o', 'r', 'e', 'E', 'm', 'p', 't', 'y', '\"', '!', '\n', '\t',
+'B', 'o', 'o', 'l', 'R', 'u', 'l', 'e', 's', '\022', '\024', '\n', '\005', 'c', 'o', 'n', 's', 't', '\030', '\001', ' ', '\001', '(', '\010', 'R',
+'\005', 'c', 'o', 'n', 's', 't', '\"', '\324', '\005', '\n', '\013', 'S', 't', 'r', 'i', 'n', 'g', 'R', 'u', 'l', 'e', 's', '\022', '\024', '\n',
+'\005', 'c', 'o', 'n', 's', 't', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\005', 'c', 'o', 'n', 's', 't', '\022', '\020', '\n', '\003', 'l', 'e',
+'n', '\030', '\023', ' ', '\001', '(', '\004', 'R', '\003', 'l', 'e', 'n', '\022', '\027', '\n', '\007', 'm', 'i', 'n', '_', 'l', 'e', 'n', '\030', '\002',
+' ', '\001', '(', '\004', 'R', '\006', 'm', 'i', 'n', 'L', 'e', 'n', '\022', '\027', '\n', '\007', 'm', 'a', 'x', '_', 'l', 'e', 'n', '\030', '\003',
+' ', '\001', '(', '\004', 'R', '\006', 'm', 'a', 'x', 'L', 'e', 'n', '\022', '\033', '\n', '\t', 'l', 'e', 'n', '_', 'b', 'y', 't', 'e', 's',
+'\030', '\024', ' ', '\001', '(', '\004', 'R', '\010', 'l', 'e', 'n', 'B', 'y', 't', 'e', 's', '\022', '\033', '\n', '\t', 'm', 'i', 'n', '_', 'b',
+'y', 't', 'e', 's', '\030', '\004', ' ', '\001', '(', '\004', 'R', '\010', 'm', 'i', 'n', 'B', 'y', 't', 'e', 's', '\022', '\033', '\n', '\t', 'm',
+'a', 'x', '_', 'b', 'y', 't', 'e', 's', '\030', '\005', ' ', '\001', '(', '\004', 'R', '\010', 'm', 'a', 'x', 'B', 'y', 't', 'e', 's', '\022',
+'\030', '\n', '\007', 'p', 'a', 't', 't', 'e', 'r', 'n', '\030', '\006', ' ', '\001', '(', '\t', 'R', '\007', 'p', 'a', 't', 't', 'e', 'r', 'n',
+'\022', '\026', '\n', '\006', 'p', 'r', 'e', 'f', 'i', 'x', '\030', '\007', ' ', '\001', '(', '\t', 'R', '\006', 'p', 'r', 'e', 'f', 'i', 'x', '\022',
+'\026', '\n', '\006', 's', 'u', 'f', 'f', 'i', 'x', '\030', '\010', ' ', '\001', '(', '\t', 'R', '\006', 's', 'u', 'f', 'f', 'i', 'x', '\022', '\032',
+'\n', '\010', 'c', 'o', 'n', 't', 'a', 'i', 'n', 's', '\030', '\t', ' ', '\001', '(', '\t', 'R', '\010', 'c', 'o', 'n', 't', 'a', 'i', 'n',
+'s', '\022', '!', '\n', '\014', 'n', 'o', 't', '_', 'c', 'o', 'n', 't', 'a', 'i', 'n', 's', '\030', '\027', ' ', '\001', '(', '\t', 'R', '\013',
+'n', 'o', 't', 'C', 'o', 'n', 't', 'a', 'i', 'n', 's', '\022', '\016', '\n', '\002', 'i', 'n', '\030', '\n', ' ', '\003', '(', '\t', 'R', '\002',
+'i', 'n', '\022', '\025', '\n', '\006', 'n', 'o', 't', '_', 'i', 'n', '\030', '\013', ' ', '\003', '(', '\t', 'R', '\005', 'n', 'o', 't', 'I', 'n',
+'\022', '\026', '\n', '\005', 'e', 'm', 'a', 'i', 'l', '\030', '\014', ' ', '\001', '(', '\010', 'H', '\000', 'R', '\005', 'e', 'm', 'a', 'i', 'l', '\022',
+'\034', '\n', '\010', 'h', 'o', 's', 't', 'n', 'a', 'm', 'e', '\030', '\r', ' ', '\001', '(', '\010', 'H', '\000', 'R', '\010', 'h', 'o', 's', 't',
+'n', 'a', 'm', 'e', '\022', '\020', '\n', '\002', 'i', 'p', '\030', '\016', ' ', '\001', '(', '\010', 'H', '\000', 'R', '\002', 'i', 'p', '\022', '\024', '\n',
+'\004', 'i', 'p', 'v', '4', '\030', '\017', ' ', '\001', '(', '\010', 'H', '\000', 'R', '\004', 'i', 'p', 'v', '4', '\022', '\024', '\n', '\004', 'i', 'p',
+'v', '6', '\030', '\020', ' ', '\001', '(', '\010', 'H', '\000', 'R', '\004', 'i', 'p', 'v', '6', '\022', '\022', '\n', '\003', 'u', 'r', 'i', '\030', '\021',
+' ', '\001', '(', '\010', 'H', '\000', 'R', '\003', 'u', 'r', 'i', '\022', '\031', '\n', '\007', 'u', 'r', 'i', '_', 'r', 'e', 'f', '\030', '\022', ' ',
+'\001', '(', '\010', 'H', '\000', 'R', '\006', 'u', 'r', 'i', 'R', 'e', 'f', '\022', '\032', '\n', '\007', 'a', 'd', 'd', 'r', 'e', 's', 's', '\030',
+'\025', ' ', '\001', '(', '\010', 'H', '\000', 'R', '\007', 'a', 'd', 'd', 'r', 'e', 's', 's', '\022', '\024', '\n', '\004', 'u', 'u', 'i', 'd', '\030',
+'\026', ' ', '\001', '(', '\010', 'H', '\000', 'R', '\004', 'u', 'u', 'i', 'd', '\022', '@', '\n', '\020', 'w', 'e', 'l', 'l', '_', 'k', 'n', 'o',
+'w', 'n', '_', 'r', 'e', 'g', 'e', 'x', '\030', '\030', ' ', '\001', '(', '\016', '2', '\024', '.', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e',
+'.', 'K', 'n', 'o', 'w', 'n', 'R', 'e', 'g', 'e', 'x', 'H', '\000', 'R', '\016', 'w', 'e', 'l', 'l', 'K', 'n', 'o', 'w', 'n', 'R',
+'e', 'g', 'e', 'x', '\022', '\034', '\n', '\006', 's', 't', 'r', 'i', 'c', 't', '\030', '\031', ' ', '\001', '(', '\010', ':', '\004', 't', 'r', 'u',
+'e', 'R', '\006', 's', 't', 'r', 'i', 'c', 't', '\022', '!', '\n', '\014', 'i', 'g', 'n', 'o', 'r', 'e', '_', 'e', 'm', 'p', 't', 'y',
+'\030', '\032', ' ', '\001', '(', '\010', 'R', '\013', 'i', 'g', 'n', 'o', 'r', 'e', 'E', 'm', 'p', 't', 'y', 'B', '\014', '\n', '\n', 'w', 'e',
+'l', 'l', '_', 'k', 'n', 'o', 'w', 'n', '\"', '\342', '\002', '\n', '\n', 'B', 'y', 't', 'e', 's', 'R', 'u', 'l', 'e', 's', '\022', '\024',
+'\n', '\005', 'c', 'o', 'n', 's', 't', '\030', '\001', ' ', '\001', '(', '\014', 'R', '\005', 'c', 'o', 'n', 's', 't', '\022', '\020', '\n', '\003', 'l',
+'e', 'n', '\030', '\r', ' ', '\001', '(', '\004', 'R', '\003', 'l', 'e', 'n', '\022', '\027', '\n', '\007', 'm', 'i', 'n', '_', 'l', 'e', 'n', '\030',
+'\002', ' ', '\001', '(', '\004', 'R', '\006', 'm', 'i', 'n', 'L', 'e', 'n', '\022', '\027', '\n', '\007', 'm', 'a', 'x', '_', 'l', 'e', 'n', '\030',
+'\003', ' ', '\001', '(', '\004', 'R', '\006', 'm', 'a', 'x', 'L', 'e', 'n', '\022', '\030', '\n', '\007', 'p', 'a', 't', 't', 'e', 'r', 'n', '\030',
+'\004', ' ', '\001', '(', '\t', 'R', '\007', 'p', 'a', 't', 't', 'e', 'r', 'n', '\022', '\026', '\n', '\006', 'p', 'r', 'e', 'f', 'i', 'x', '\030',
+'\005', ' ', '\001', '(', '\014', 'R', '\006', 'p', 'r', 'e', 'f', 'i', 'x', '\022', '\026', '\n', '\006', 's', 'u', 'f', 'f', 'i', 'x', '\030', '\006',
+' ', '\001', '(', '\014', 'R', '\006', 's', 'u', 'f', 'f', 'i', 'x', '\022', '\032', '\n', '\010', 'c', 'o', 'n', 't', 'a', 'i', 'n', 's', '\030',
+'\007', ' ', '\001', '(', '\014', 'R', '\010', 'c', 'o', 'n', 't', 'a', 'i', 'n', 's', '\022', '\016', '\n', '\002', 'i', 'n', '\030', '\010', ' ', '\003',
+'(', '\014', 'R', '\002', 'i', 'n', '\022', '\025', '\n', '\006', 'n', 'o', 't', '_', 'i', 'n', '\030', '\t', ' ', '\003', '(', '\014', 'R', '\005', 'n',
+'o', 't', 'I', 'n', '\022', '\020', '\n', '\002', 'i', 'p', '\030', '\n', ' ', '\001', '(', '\010', 'H', '\000', 'R', '\002', 'i', 'p', '\022', '\024', '\n',
+'\004', 'i', 'p', 'v', '4', '\030', '\013', ' ', '\001', '(', '\010', 'H', '\000', 'R', '\004', 'i', 'p', 'v', '4', '\022', '\024', '\n', '\004', 'i', 'p',
+'v', '6', '\030', '\014', ' ', '\001', '(', '\010', 'H', '\000', 'R', '\004', 'i', 'p', 'v', '6', '\022', '!', '\n', '\014', 'i', 'g', 'n', 'o', 'r',
+'e', '_', 'e', 'm', 'p', 't', 'y', '\030', '\016', ' ', '\001', '(', '\010', 'R', '\013', 'i', 'g', 'n', 'o', 'r', 'e', 'E', 'm', 'p', 't',
+'y', 'B', '\014', '\n', '\n', 'w', 'e', 'l', 'l', '_', 'k', 'n', 'o', 'w', 'n', '\"', 'k', '\n', '\t', 'E', 'n', 'u', 'm', 'R', 'u',
+'l', 'e', 's', '\022', '\024', '\n', '\005', 'c', 'o', 'n', 's', 't', '\030', '\001', ' ', '\001', '(', '\005', 'R', '\005', 'c', 'o', 'n', 's', 't',
+'\022', '!', '\n', '\014', 'd', 'e', 'f', 'i', 'n', 'e', 'd', '_', 'o', 'n', 'l', 'y', '\030', '\002', ' ', '\001', '(', '\010', 'R', '\013', 'd',
+'e', 'f', 'i', 'n', 'e', 'd', 'O', 'n', 'l', 'y', '\022', '\016', '\n', '\002', 'i', 'n', '\030', '\003', ' ', '\003', '(', '\005', 'R', '\002', 'i',
+'n', '\022', '\025', '\n', '\006', 'n', 'o', 't', '_', 'i', 'n', '\030', '\004', ' ', '\003', '(', '\005', 'R', '\005', 'n', 'o', 't', 'I', 'n', '\"',
+'>', '\n', '\014', 'M', 'e', 's', 's', 'a', 'g', 'e', 'R', 'u', 'l', 'e', 's', '\022', '\022', '\n', '\004', 's', 'k', 'i', 'p', '\030', '\001',
+' ', '\001', '(', '\010', 'R', '\004', 's', 'k', 'i', 'p', '\022', '\032', '\n', '\010', 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'd', '\030', '\002', ' ',
+'\001', '(', '\010', 'R', '\010', 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'd', '\"', '\260', '\001', '\n', '\r', 'R', 'e', 'p', 'e', 'a', 't', 'e',
+'d', 'R', 'u', 'l', 'e', 's', '\022', '\033', '\n', '\t', 'm', 'i', 'n', '_', 'i', 't', 'e', 'm', 's', '\030', '\001', ' ', '\001', '(', '\004',
+'R', '\010', 'm', 'i', 'n', 'I', 't', 'e', 'm', 's', '\022', '\033', '\n', '\t', 'm', 'a', 'x', '_', 'i', 't', 'e', 'm', 's', '\030', '\002',
+' ', '\001', '(', '\004', 'R', '\010', 'm', 'a', 'x', 'I', 't', 'e', 'm', 's', '\022', '\026', '\n', '\006', 'u', 'n', 'i', 'q', 'u', 'e', '\030',
+'\003', ' ', '\001', '(', '\010', 'R', '\006', 'u', 'n', 'i', 'q', 'u', 'e', '\022', '*', '\n', '\005', 'i', 't', 'e', 'm', 's', '\030', '\004', ' ',
+'\001', '(', '\013', '2', '\024', '.', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'F', 'i', 'e', 'l', 'd', 'R', 'u', 'l', 'e', 's',
+'R', '\005', 'i', 't', 'e', 'm', 's', '\022', '!', '\n', '\014', 'i', 'g', 'n', 'o', 'r', 'e', '_', 'e', 'm', 'p', 't', 'y', '\030', '\005',
+' ', '\001', '(', '\010', 'R', '\013', 'i', 'g', 'n', 'o', 'r', 'e', 'E', 'm', 'p', 't', 'y', '\"', '\334', '\001', '\n', '\010', 'M', 'a', 'p',
'R', 'u', 'l', 'e', 's', '\022', '\033', '\n', '\t', 'm', 'i', 'n', '_', 'p', 'a', 'i', 'r', 's', '\030', '\001', ' ', '\001', '(', '\004', 'R',
'\010', 'm', 'i', 'n', 'P', 'a', 'i', 'r', 's', '\022', '\033', '\n', '\t', 'm', 'a', 'x', '_', 'p', 'a', 'i', 'r', 's', '\030', '\002', ' ',
'\001', '(', '\004', 'R', '\010', 'm', 'a', 'x', 'P', 'a', 'i', 'r', 's', '\022', '\033', '\n', '\t', 'n', 'o', '_', 's', 'p', 'a', 'r', 's',
@@ -243,56 +264,57 @@ static const char descriptor[5759] = {'\n', '\027', 'v', 'a', 'l', 'i', 'd', 'a'
'\030', '\004', ' ', '\001', '(', '\013', '2', '\024', '.', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'F', 'i', 'e', 'l', 'd', 'R', 'u',
'l', 'e', 's', 'R', '\004', 'k', 'e', 'y', 's', '\022', ',', '\n', '\006', 'v', 'a', 'l', 'u', 'e', 's', '\030', '\005', ' ', '\001', '(', '\013',
'2', '\024', '.', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'F', 'i', 'e', 'l', 'd', 'R', 'u', 'l', 'e', 's', 'R', '\006', 'v',
-'a', 'l', 'u', 'e', 's', '\"', 'M', '\n', '\010', 'A', 'n', 'y', 'R', 'u', 'l', 'e', 's', '\022', '\032', '\n', '\010', 'r', 'e', 'q', 'u',
-'i', 'r', 'e', 'd', '\030', '\001', ' ', '\001', '(', '\010', 'R', '\010', 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'd', '\022', '\016', '\n', '\002', 'i',
-'n', '\030', '\002', ' ', '\003', '(', '\t', 'R', '\002', 'i', 'n', '\022', '\025', '\n', '\006', 'n', 'o', 't', '_', 'i', 'n', '\030', '\003', ' ', '\003',
-'(', '\t', 'R', '\005', 'n', 'o', 't', 'I', 'n', '\"', '\351', '\002', '\n', '\r', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', 'u', 'l',
+'a', 'l', 'u', 'e', 's', '\022', '!', '\n', '\014', 'i', 'g', 'n', 'o', 'r', 'e', '_', 'e', 'm', 'p', 't', 'y', '\030', '\006', ' ', '\001',
+'(', '\010', 'R', '\013', 'i', 'g', 'n', 'o', 'r', 'e', 'E', 'm', 'p', 't', 'y', '\"', 'M', '\n', '\010', 'A', 'n', 'y', 'R', 'u', 'l',
'e', 's', '\022', '\032', '\n', '\010', 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'd', '\030', '\001', ' ', '\001', '(', '\010', 'R', '\010', 'r', 'e', 'q',
-'u', 'i', 'r', 'e', 'd', '\022', '/', '\n', '\005', 'c', 'o', 'n', 's', 't', '\030', '\002', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o',
-'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\005', 'c',
-'o', 'n', 's', 't', '\022', ')', '\n', '\002', 'l', 't', '\030', '\003', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e',
-'.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\002', 'l', 't', '\022', '+', '\n',
-'\003', 'l', 't', 'e', '\030', '\004', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o',
-'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\003', 'l', 't', 'e', '\022', ')', '\n', '\002', 'g', 't', '\030', '\005',
-' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u',
-'r', 'a', 't', 'i', 'o', 'n', 'R', '\002', 'g', 't', '\022', '+', '\n', '\003', 'g', 't', 'e', '\030', '\006', ' ', '\001', '(', '\013', '2', '\031',
-'.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n',
-'R', '\003', 'g', 't', 'e', '\022', ')', '\n', '\002', 'i', 'n', '\030', '\007', ' ', '\003', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l',
-'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\002', 'i', 'n', '\022', '0',
-'\n', '\006', 'n', 'o', 't', '_', 'i', 'n', '\030', '\010', ' ', '\003', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p',
-'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\005', 'n', 'o', 't', 'I', 'n', '\"', '\363',
-'\002', '\n', '\016', 'T', 'i', 'm', 'e', 's', 't', 'a', 'm', 'p', 'R', 'u', 'l', 'e', 's', '\022', '\032', '\n', '\010', 'r', 'e', 'q', 'u',
-'i', 'r', 'e', 'd', '\030', '\001', ' ', '\001', '(', '\010', 'R', '\010', 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'd', '\022', '0', '\n', '\005', 'c',
-'o', 'n', 's', 't', '\030', '\002', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o',
-'b', 'u', 'f', '.', 'T', 'i', 'm', 'e', 's', 't', 'a', 'm', 'p', 'R', '\005', 'c', 'o', 'n', 's', 't', '\022', '*', '\n', '\002', 'l',
-'t', '\030', '\003', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
-'.', 'T', 'i', 'm', 'e', 's', 't', 'a', 'm', 'p', 'R', '\002', 'l', 't', '\022', ',', '\n', '\003', 'l', 't', 'e', '\030', '\004', ' ', '\001',
+'u', 'i', 'r', 'e', 'd', '\022', '\016', '\n', '\002', 'i', 'n', '\030', '\002', ' ', '\003', '(', '\t', 'R', '\002', 'i', 'n', '\022', '\025', '\n', '\006',
+'n', 'o', 't', '_', 'i', 'n', '\030', '\003', ' ', '\003', '(', '\t', 'R', '\005', 'n', 'o', 't', 'I', 'n', '\"', '\351', '\002', '\n', '\r', 'D',
+'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', 'u', 'l', 'e', 's', '\022', '\032', '\n', '\010', 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'd', '\030',
+'\001', ' ', '\001', '(', '\010', 'R', '\010', 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'd', '\022', '/', '\n', '\005', 'c', 'o', 'n', 's', 't', '\030',
+'\002', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D',
+'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\005', 'c', 'o', 'n', 's', 't', '\022', ')', '\n', '\002', 'l', 't', '\030', '\003', ' ', '\001', '(',
+'\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't',
+'i', 'o', 'n', 'R', '\002', 'l', 't', '\022', '+', '\n', '\003', 'l', 't', 'e', '\030', '\004', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o',
+'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\003', 'l',
+'t', 'e', '\022', ')', '\n', '\002', 'g', 't', '\030', '\005', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p',
+'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\002', 'g', 't', '\022', '+', '\n', '\003', 'g',
+'t', 'e', '\030', '\006', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u',
+'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\003', 'g', 't', 'e', '\022', ')', '\n', '\002', 'i', 'n', '\030', '\007', ' ', '\003',
+'(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a',
+'t', 'i', 'o', 'n', 'R', '\002', 'i', 'n', '\022', '0', '\n', '\006', 'n', 'o', 't', '_', 'i', 'n', '\030', '\010', ' ', '\003', '(', '\013', '2',
+'\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o',
+'n', 'R', '\005', 'n', 'o', 't', 'I', 'n', '\"', '\363', '\002', '\n', '\016', 'T', 'i', 'm', 'e', 's', 't', 'a', 'm', 'p', 'R', 'u', 'l',
+'e', 's', '\022', '\032', '\n', '\010', 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'd', '\030', '\001', ' ', '\001', '(', '\010', 'R', '\010', 'r', 'e', 'q',
+'u', 'i', 'r', 'e', 'd', '\022', '0', '\n', '\005', 'c', 'o', 'n', 's', 't', '\030', '\002', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o',
+'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'T', 'i', 'm', 'e', 's', 't', 'a', 'm', 'p', 'R', '\005',
+'c', 'o', 'n', 's', 't', '\022', '*', '\n', '\002', 'l', 't', '\030', '\003', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l',
+'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'T', 'i', 'm', 'e', 's', 't', 'a', 'm', 'p', 'R', '\002', 'l', 't', '\022',
+',', '\n', '\003', 'l', 't', 'e', '\030', '\004', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o',
+'t', 'o', 'b', 'u', 'f', '.', 'T', 'i', 'm', 'e', 's', 't', 'a', 'm', 'p', 'R', '\003', 'l', 't', 'e', '\022', '*', '\n', '\002', 'g',
+'t', '\030', '\005', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
+'.', 'T', 'i', 'm', 'e', 's', 't', 'a', 'm', 'p', 'R', '\002', 'g', 't', '\022', ',', '\n', '\003', 'g', 't', 'e', '\030', '\006', ' ', '\001',
'(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'T', 'i', 'm', 'e',
-'s', 't', 'a', 'm', 'p', 'R', '\003', 'l', 't', 'e', '\022', '*', '\n', '\002', 'g', 't', '\030', '\005', ' ', '\001', '(', '\013', '2', '\032', '.',
-'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'T', 'i', 'm', 'e', 's', 't', 'a', 'm', 'p',
-'R', '\002', 'g', 't', '\022', ',', '\n', '\003', 'g', 't', 'e', '\030', '\006', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l',
-'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'T', 'i', 'm', 'e', 's', 't', 'a', 'm', 'p', 'R', '\003', 'g', 't', 'e',
-'\022', '\025', '\n', '\006', 'l', 't', '_', 'n', 'o', 'w', '\030', '\007', ' ', '\001', '(', '\010', 'R', '\005', 'l', 't', 'N', 'o', 'w', '\022', '\025',
-'\n', '\006', 'g', 't', '_', 'n', 'o', 'w', '\030', '\010', ' ', '\001', '(', '\010', 'R', '\005', 'g', 't', 'N', 'o', 'w', '\022', '1', '\n', '\006',
-'w', 'i', 't', 'h', 'i', 'n', '\030', '\t', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o',
-'t', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\006', 'w', 'i', 't', 'h', 'i', 'n', '*', 'F', '\n',
-'\n', 'K', 'n', 'o', 'w', 'n', 'R', 'e', 'g', 'e', 'x', '\022', '\013', '\n', '\007', 'U', 'N', 'K', 'N', 'O', 'W', 'N', '\020', '\000', '\022',
-'\024', '\n', '\020', 'H', 'T', 'T', 'P', '_', 'H', 'E', 'A', 'D', 'E', 'R', '_', 'N', 'A', 'M', 'E', '\020', '\001', '\022', '\025', '\n', '\021',
-'H', 'T', 'T', 'P', '_', 'H', 'E', 'A', 'D', 'E', 'R', '_', 'V', 'A', 'L', 'U', 'E', '\020', '\002', ':', '<', '\n', '\010', 'd', 'i',
-'s', 'a', 'b', 'l', 'e', 'd', '\022', '\037', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.',
-'M', 'e', 's', 's', 'a', 'g', 'e', 'O', 'p', 't', 'i', 'o', 'n', 's', '\030', '\257', '\010', ' ', '\001', '(', '\010', 'R', '\010', 'd', 'i',
-'s', 'a', 'b', 'l', 'e', 'd', ':', ':', '\n', '\007', 'i', 'g', 'n', 'o', 'r', 'e', 'd', '\022', '\037', '.', 'g', 'o', 'o', 'g', 'l',
-'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'M', 'e', 's', 's', 'a', 'g', 'e', 'O', 'p', 't', 'i', 'o', 'n', 's',
-'\030', '\260', '\010', ' ', '\001', '(', '\010', 'R', '\007', 'i', 'g', 'n', 'o', 'r', 'e', 'd', ':', ':', '\n', '\010', 'r', 'e', 'q', 'u', 'i',
-'r', 'e', 'd', '\022', '\035', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'O', 'n', 'e',
-'o', 'f', 'O', 'p', 't', 'i', 'o', 'n', 's', '\030', '\257', '\010', ' ', '\001', '(', '\010', 'R', '\010', 'r', 'e', 'q', 'u', 'i', 'r', 'e',
-'d', ':', 'J', '\n', '\005', 'r', 'u', 'l', 'e', 's', '\022', '\035', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o',
-'b', 'u', 'f', '.', 'F', 'i', 'e', 'l', 'd', 'O', 'p', 't', 'i', 'o', 'n', 's', '\030', '\257', '\010', ' ', '\001', '(', '\013', '2', '\024',
-'.', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'F', 'i', 'e', 'l', 'd', 'R', 'u', 'l', 'e', 's', 'R', '\005', 'r', 'u', 'l',
-'e', 's', 'B', 'P', '\n', '\032', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'p', 'g', 'v', '.', 'v',
-'a', 'l', 'i', 'd', 'a', 't', 'e', 'Z', '2', 'g', 'i', 't', 'h', 'u', 'b', '.', 'c', 'o', 'm', '/', 'e', 'n', 'v', 'o', 'y',
-'p', 'r', 'o', 'x', 'y', '/', 'p', 'r', 'o', 't', 'o', 'c', '-', 'g', 'e', 'n', '-', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e',
-'/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e',
+'s', 't', 'a', 'm', 'p', 'R', '\003', 'g', 't', 'e', '\022', '\025', '\n', '\006', 'l', 't', '_', 'n', 'o', 'w', '\030', '\007', ' ', '\001', '(',
+'\010', 'R', '\005', 'l', 't', 'N', 'o', 'w', '\022', '\025', '\n', '\006', 'g', 't', '_', 'n', 'o', 'w', '\030', '\010', ' ', '\001', '(', '\010', 'R',
+'\005', 'g', 't', 'N', 'o', 'w', '\022', '1', '\n', '\006', 'w', 'i', 't', 'h', 'i', 'n', '\030', '\t', ' ', '\001', '(', '\013', '2', '\031', '.',
+'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R',
+'\006', 'w', 'i', 't', 'h', 'i', 'n', '*', 'F', '\n', '\n', 'K', 'n', 'o', 'w', 'n', 'R', 'e', 'g', 'e', 'x', '\022', '\013', '\n', '\007',
+'U', 'N', 'K', 'N', 'O', 'W', 'N', '\020', '\000', '\022', '\024', '\n', '\020', 'H', 'T', 'T', 'P', '_', 'H', 'E', 'A', 'D', 'E', 'R', '_',
+'N', 'A', 'M', 'E', '\020', '\001', '\022', '\025', '\n', '\021', 'H', 'T', 'T', 'P', '_', 'H', 'E', 'A', 'D', 'E', 'R', '_', 'V', 'A', 'L',
+'U', 'E', '\020', '\002', ':', '<', '\n', '\010', 'd', 'i', 's', 'a', 'b', 'l', 'e', 'd', '\022', '\037', '.', 'g', 'o', 'o', 'g', 'l', 'e',
+'.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'M', 'e', 's', 's', 'a', 'g', 'e', 'O', 'p', 't', 'i', 'o', 'n', 's', '\030',
+'\257', '\010', ' ', '\001', '(', '\010', 'R', '\010', 'd', 'i', 's', 'a', 'b', 'l', 'e', 'd', ':', ':', '\n', '\007', 'i', 'g', 'n', 'o', 'r',
+'e', 'd', '\022', '\037', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'M', 'e', 's', 's',
+'a', 'g', 'e', 'O', 'p', 't', 'i', 'o', 'n', 's', '\030', '\260', '\010', ' ', '\001', '(', '\010', 'R', '\007', 'i', 'g', 'n', 'o', 'r', 'e',
+'d', ':', ':', '\n', '\010', 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'd', '\022', '\035', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r',
+'o', 't', 'o', 'b', 'u', 'f', '.', 'O', 'n', 'e', 'o', 'f', 'O', 'p', 't', 'i', 'o', 'n', 's', '\030', '\257', '\010', ' ', '\001', '(',
+'\010', 'R', '\010', 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'd', ':', 'J', '\n', '\005', 'r', 'u', 'l', 'e', 's', '\022', '\035', '.', 'g', 'o',
+'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'F', 'i', 'e', 'l', 'd', 'O', 'p', 't', 'i', 'o', 'n',
+'s', '\030', '\257', '\010', ' ', '\001', '(', '\013', '2', '\024', '.', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'F', 'i', 'e', 'l', 'd',
+'R', 'u', 'l', 'e', 's', 'R', '\005', 'r', 'u', 'l', 'e', 's', 'B', 'P', '\n', '\032', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p',
+'r', 'o', 'x', 'y', '.', 'p', 'g', 'v', '.', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', 'Z', '2', 'g', 'i', 't', 'h', 'u', 'b',
+'.', 'c', 'o', 'm', '/', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '/', 'p', 'r', 'o', 't', 'o', 'c', '-', 'g', 'e',
+'n', '-', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e',
};
static upb_def_init *deps[4] = {
@@ -306,5 +328,5 @@ upb_def_init validate_validate_proto_upbdefinit = {
deps,
layouts,
"validate/validate.proto",
- UPB_STRVIEW_INIT(descriptor, 5759)
+ UPB_STRVIEW_INIT(descriptor, 6319)
};
diff --git a/src/core/ext/xds/OWNERS b/src/core/ext/xds/OWNERS
index d699bedc52..14a326486e 100644
--- a/src/core/ext/xds/OWNERS
+++ b/src/core/ext/xds/OWNERS
@@ -1,2 +1,3 @@
set noparent
@markdroth
+
diff --git a/src/core/ext/xds/certificate_provider_store.h b/src/core/ext/xds/certificate_provider_store.h
index fb6ca72d6d..b6095e2822 100644
--- a/src/core/ext/xds/certificate_provider_store.h
+++ b/src/core/ext/xds/certificate_provider_store.h
@@ -101,7 +101,7 @@ class CertificateProviderStore
Mutex mu_;
// Map of plugin configurations
- PluginDefinitionMap plugin_config_map_ ABSL_GUARDED_BY(mu_);
+ const PluginDefinitionMap plugin_config_map_;
// Underlying map for the providers.
std::map<absl::string_view, CertificateProviderWrapper*>
certificate_providers_map_ ABSL_GUARDED_BY(mu_);
diff --git a/src/core/ext/xds/xds_api.cc b/src/core/ext/xds/xds_api.cc
index 36f2044712..759e563b63 100644
--- a/src/core/ext/xds/xds_api.cc
+++ b/src/core/ext/xds/xds_api.cc
@@ -115,17 +115,6 @@ bool XdsAggregateAndLogicalDnsClusterEnabled() {
return parse_succeeded && parsed_value;
}
-// TODO(donnadionne): Check to see if ring hash policy is enabled, this will be
-// removed once ring hash policy is fully integration-tested and enabled by
-// default.
-bool XdsRingHashEnabled() {
- char* value = gpr_getenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH");
- bool parsed_value;
- bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value);
- gpr_free(value);
- return parse_succeeded && parsed_value;
-}
-
// TODO(yashykt): Check to see if xDS security is enabled. This will be
// removed once this feature is fully integration-tested and enabled by
// default.
@@ -215,6 +204,25 @@ std::string XdsApi::Route::HashPolicy::ToString() const {
}
//
+// XdsApi::Route::RetryPolicy
+//
+std::string XdsApi::Route::RetryPolicy::RetryBackOff::ToString() const {
+ std::vector<std::string> contents;
+ contents.push_back(
+ absl::StrCat("RetryBackOff Base: ", base_interval.ToString()));
+ contents.push_back(
+ absl::StrCat("RetryBackOff max: ", max_interval.ToString()));
+ return absl::StrJoin(contents, ",");
+}
+
+std::string XdsApi::Route::RetryPolicy::ToString() const {
+ std::vector<std::string> contents;
+ contents.push_back(absl::StrFormat("num_retries=%d", num_retries));
+ contents.push_back(retry_back_off.ToString());
+ return absl::StrJoin(contents, ",");
+}
+
+//
// XdsApi::Route
//
@@ -255,6 +263,10 @@ std::string XdsApi::Route::ToString() const {
for (const HashPolicy& hash_policy : hash_policies) {
contents.push_back(absl::StrCat("hash_policy=", hash_policy.ToString()));
}
+ if (retry_policy.has_value()) {
+ contents.push_back(
+ absl::StrCat("retry_policy={", retry_policy->ToString(), "}"));
+ }
if (!cluster_name.empty()) {
contents.push_back(absl::StrFormat("Cluster name: %s", cluster_name));
}
@@ -868,10 +880,13 @@ bool IsEds(absl::string_view type_url) {
#endif
XdsApi::XdsApi(XdsClient* client, TraceFlag* tracer,
- const XdsBootstrap::Node* node)
+ const XdsBootstrap::Node* node,
+ const CertificateProviderStore::PluginDefinitionMap*
+ certificate_provider_definition_map)
: client_(client),
tracer_(tracer),
node_(node),
+ certificate_provider_definition_map_(certificate_provider_definition_map),
build_version_(absl::StrCat("gRPC C-core ", GPR_PLATFORM_STRING, " ",
grpc_version_string(),
GRPC_XDS_USER_AGENT_NAME_SUFFIX_STRING,
@@ -903,11 +918,13 @@ XdsApi::XdsApi(XdsClient* client, TraceFlag* tracer,
namespace {
struct EncodingContext {
- XdsClient* client;
+ XdsClient* client; // Used only for logging. Unsafe for dereferencing.
TraceFlag* tracer;
upb_symtab* symtab;
upb_arena* arena;
bool use_v3;
+ const CertificateProviderStore::PluginDefinitionMap*
+ certificate_provider_definition_map;
};
// Works for both std::string and absl::string_view.
@@ -1116,8 +1133,12 @@ grpc_slice XdsApi::CreateAdsRequest(
const std::string& version, const std::string& nonce,
grpc_error_handle error, bool populate_node) {
upb::Arena arena;
- const EncodingContext context = {client_, tracer_, symtab_.ptr(), arena.ptr(),
- server.ShouldUseV3()};
+ const EncodingContext context = {client_,
+ tracer_,
+ symtab_.ptr(),
+ arena.ptr(),
+ server.ShouldUseV3(),
+ certificate_provider_definition_map_};
// Create a request.
envoy_service_discovery_v3_DiscoveryRequest* request =
envoy_service_discovery_v3_DiscoveryRequest_new(arena.ptr());
@@ -1527,6 +1548,100 @@ grpc_error_handle ParseTypedPerFilterConfig(
return GRPC_ERROR_NONE;
}
+XdsApi::Duration DurationParse(const google_protobuf_Duration* proto_duration) {
+ XdsApi::Duration duration;
+ duration.seconds = google_protobuf_Duration_seconds(proto_duration);
+ duration.nanos = google_protobuf_Duration_nanos(proto_duration);
+ return duration;
+}
+
+grpc_error_handle RetryPolicyParse(
+ const EncodingContext& context,
+ const envoy_config_route_v3_RetryPolicy* retry_policy,
+ absl::optional<XdsApi::Route::RetryPolicy>* retry) {
+ std::vector<grpc_error_handle> errors;
+ XdsApi::Route::RetryPolicy retry_to_return;
+ auto retry_on = UpbStringToStdString(
+ envoy_config_route_v3_RetryPolicy_retry_on(retry_policy));
+ std::vector<absl::string_view> codes = absl::StrSplit(retry_on, ',');
+ for (const auto& code : codes) {
+ if (code == "cancelled") {
+ retry_to_return.retry_on.Add(GRPC_STATUS_CANCELLED);
+ } else if (code == "deadline-exceeded") {
+ retry_to_return.retry_on.Add(GRPC_STATUS_DEADLINE_EXCEEDED);
+ } else if (code == "internal") {
+ retry_to_return.retry_on.Add(GRPC_STATUS_INTERNAL);
+ } else if (code == "resource-exhausted") {
+ retry_to_return.retry_on.Add(GRPC_STATUS_RESOURCE_EXHAUSTED);
+ } else if (code == "unavailable") {
+ retry_to_return.retry_on.Add(GRPC_STATUS_UNAVAILABLE);
+ } else {
+ if (GRPC_TRACE_FLAG_ENABLED(*context.tracer)) {
+ gpr_log(GPR_INFO, "Unsupported retry_on policy %s.",
+ std::string(code).c_str());
+ }
+ }
+ }
+ // TODO(donnadionne): when we add support for per_try_timeout, we will need to
+ // return a policy if per_try_timeout is set even if retry_on specified no
+ // supported policies.
+ if (retry_to_return.retry_on.Empty()) return GRPC_ERROR_NONE;
+ const google_protobuf_UInt32Value* num_retries =
+ envoy_config_route_v3_RetryPolicy_num_retries(retry_policy);
+ if (num_retries != nullptr) {
+ uint32_t num_retries_value = google_protobuf_UInt32Value_value(num_retries);
+ if (num_retries_value == 0) {
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ "RouteAction RetryPolicy num_retries set to invalid value 0."));
+ } else {
+ retry_to_return.num_retries = num_retries_value;
+ }
+ } else {
+ retry_to_return.num_retries = 1;
+ }
+ const envoy_config_route_v3_RetryPolicy_RetryBackOff* backoff =
+ envoy_config_route_v3_RetryPolicy_retry_back_off(retry_policy);
+ if (backoff != nullptr) {
+ const google_protobuf_Duration* base_interval =
+ envoy_config_route_v3_RetryPolicy_RetryBackOff_base_interval(backoff);
+ if (base_interval == nullptr) {
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ "RouteAction RetryPolicy RetryBackoff missing base interval."));
+ } else {
+ retry_to_return.retry_back_off.base_interval =
+ DurationParse(base_interval);
+ }
+ const google_protobuf_Duration* max_interval =
+ envoy_config_route_v3_RetryPolicy_RetryBackOff_max_interval(backoff);
+ XdsApi::Duration max;
+ if (max_interval != nullptr) {
+ max = DurationParse(max_interval);
+ } else {
+ // if max interval is not set, it is 10x the base, if the value in nanos
+ // can yield another second, adjust the value in seconds accordingly.
+ max.seconds = retry_to_return.retry_back_off.base_interval.seconds * 10;
+ max.nanos = retry_to_return.retry_back_off.base_interval.nanos * 10;
+ if (max.nanos > 1000000000) {
+ max.seconds += max.nanos / 1000000000;
+ max.nanos = max.nanos % 1000000000;
+ }
+ }
+ retry_to_return.retry_back_off.max_interval = max;
+ } else {
+ retry_to_return.retry_back_off.base_interval.seconds = 0;
+ retry_to_return.retry_back_off.base_interval.nanos = 25000000;
+ retry_to_return.retry_back_off.max_interval.seconds = 0;
+ retry_to_return.retry_back_off.max_interval.nanos = 250000000;
+ }
+ if (errors.empty()) {
+ *retry = retry_to_return;
+ return GRPC_ERROR_NONE;
+ } else {
+ return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing retry policy",
+ &errors);
+ }
+}
+
grpc_error_handle RouteActionParse(const EncodingContext& context,
const envoy_config_route_v3_Route* route_msg,
XdsApi::Route* route, bool* ignore_route) {
@@ -1620,89 +1735,92 @@ grpc_error_handle RouteActionParse(const EncodingContext& context,
max_stream_duration);
}
if (duration != nullptr) {
- XdsApi::Duration duration_in_route;
- duration_in_route.seconds = google_protobuf_Duration_seconds(duration);
- duration_in_route.nanos = google_protobuf_Duration_nanos(duration);
- route->max_stream_duration = duration_in_route;
+ route->max_stream_duration = DurationParse(duration);
}
}
}
// Get HashPolicy from RouteAction
- if (XdsRingHashEnabled()) {
- size_t size = 0;
- const envoy_config_route_v3_RouteAction_HashPolicy* const* hash_policies =
- envoy_config_route_v3_RouteAction_hash_policy(route_action, &size);
- for (size_t i = 0; i < size; ++i) {
- const envoy_config_route_v3_RouteAction_HashPolicy* hash_policy =
- hash_policies[i];
- XdsApi::Route::HashPolicy policy;
- policy.terminal =
- envoy_config_route_v3_RouteAction_HashPolicy_terminal(hash_policy);
- const envoy_config_route_v3_RouteAction_HashPolicy_Header* header;
- const envoy_config_route_v3_RouteAction_HashPolicy_FilterState*
- filter_state;
- if ((header = envoy_config_route_v3_RouteAction_HashPolicy_header(
- hash_policy)) != nullptr) {
- policy.type = XdsApi::Route::HashPolicy::Type::HEADER;
- policy.header_name = UpbStringToStdString(
- envoy_config_route_v3_RouteAction_HashPolicy_Header_header_name(
- header));
- const struct envoy_type_matcher_v3_RegexMatchAndSubstitute*
- regex_rewrite =
- envoy_config_route_v3_RouteAction_HashPolicy_Header_regex_rewrite(
- header);
- if (regex_rewrite != nullptr) {
- const envoy_type_matcher_v3_RegexMatcher* regex_matcher =
- envoy_type_matcher_v3_RegexMatchAndSubstitute_pattern(
- regex_rewrite);
- if (regex_matcher == nullptr) {
- gpr_log(
- GPR_DEBUG,
- "RouteAction HashPolicy contains policy specifier Header with "
- "RegexMatchAndSubstitution but RegexMatcher pattern is "
- "missing");
- continue;
- }
- RE2::Options options;
- policy.regex = absl::make_unique<RE2>(
- UpbStringToStdString(
- envoy_type_matcher_v3_RegexMatcher_regex(regex_matcher)),
- options);
- if (!policy.regex->ok()) {
- gpr_log(
- GPR_DEBUG,
- "RouteAction HashPolicy contains policy specifier Header with "
- "RegexMatchAndSubstitution but RegexMatcher pattern does not "
- "compile");
- continue;
- }
- policy.regex_substitution = UpbStringToStdString(
- envoy_type_matcher_v3_RegexMatchAndSubstitute_substitution(
- regex_rewrite));
+ size_t size = 0;
+ const envoy_config_route_v3_RouteAction_HashPolicy* const* hash_policies =
+ envoy_config_route_v3_RouteAction_hash_policy(route_action, &size);
+ for (size_t i = 0; i < size; ++i) {
+ const envoy_config_route_v3_RouteAction_HashPolicy* hash_policy =
+ hash_policies[i];
+ XdsApi::Route::HashPolicy policy;
+ policy.terminal =
+ envoy_config_route_v3_RouteAction_HashPolicy_terminal(hash_policy);
+ const envoy_config_route_v3_RouteAction_HashPolicy_Header* header;
+ const envoy_config_route_v3_RouteAction_HashPolicy_FilterState*
+ filter_state;
+ if ((header = envoy_config_route_v3_RouteAction_HashPolicy_header(
+ hash_policy)) != nullptr) {
+ policy.type = XdsApi::Route::HashPolicy::Type::HEADER;
+ policy.header_name = UpbStringToStdString(
+ envoy_config_route_v3_RouteAction_HashPolicy_Header_header_name(
+ header));
+ const struct envoy_type_matcher_v3_RegexMatchAndSubstitute*
+ regex_rewrite =
+ envoy_config_route_v3_RouteAction_HashPolicy_Header_regex_rewrite(
+ header);
+ if (regex_rewrite != nullptr) {
+ const envoy_type_matcher_v3_RegexMatcher* regex_matcher =
+ envoy_type_matcher_v3_RegexMatchAndSubstitute_pattern(
+ regex_rewrite);
+ if (regex_matcher == nullptr) {
+ gpr_log(
+ GPR_DEBUG,
+ "RouteAction HashPolicy contains policy specifier Header with "
+ "RegexMatchAndSubstitution but RegexMatcher pattern is "
+ "missing");
+ continue;
}
- } else if ((filter_state =
- envoy_config_route_v3_RouteAction_HashPolicy_filter_state(
- hash_policy)) != nullptr) {
- std::string key = UpbStringToStdString(
- envoy_config_route_v3_RouteAction_HashPolicy_FilterState_key(
- filter_state));
- if (key == "io.grpc.channel_id") {
- policy.type = XdsApi::Route::HashPolicy::Type::CHANNEL_ID;
- } else {
- gpr_log(GPR_DEBUG,
- "RouteAction HashPolicy contains policy specifier "
- "FilterState but "
- "key is not io.grpc.channel_id.");
+ RE2::Options options;
+ policy.regex = absl::make_unique<RE2>(
+ UpbStringToStdString(
+ envoy_type_matcher_v3_RegexMatcher_regex(regex_matcher)),
+ options);
+ if (!policy.regex->ok()) {
+ gpr_log(
+ GPR_DEBUG,
+ "RouteAction HashPolicy contains policy specifier Header with "
+ "RegexMatchAndSubstitution but RegexMatcher pattern does not "
+ "compile");
continue;
}
+ policy.regex_substitution = UpbStringToStdString(
+ envoy_type_matcher_v3_RegexMatchAndSubstitute_substitution(
+ regex_rewrite));
+ }
+ } else if ((filter_state =
+ envoy_config_route_v3_RouteAction_HashPolicy_filter_state(
+ hash_policy)) != nullptr) {
+ std::string key = UpbStringToStdString(
+ envoy_config_route_v3_RouteAction_HashPolicy_FilterState_key(
+ filter_state));
+ if (key == "io.grpc.channel_id") {
+ policy.type = XdsApi::Route::HashPolicy::Type::CHANNEL_ID;
} else {
- gpr_log(
- GPR_DEBUG,
- "RouteAction HashPolicy contains unsupported policy specifier.");
+ gpr_log(GPR_DEBUG,
+ "RouteAction HashPolicy contains policy specifier "
+ "FilterState but "
+ "key is not io.grpc.channel_id.");
continue;
}
- route->hash_policies.emplace_back(std::move(policy));
+ } else {
+ gpr_log(GPR_DEBUG,
+ "RouteAction HashPolicy contains unsupported policy specifier.");
+ continue;
}
+ route->hash_policies.emplace_back(std::move(policy));
+ }
+ // Get retry policy
+ const envoy_config_route_v3_RetryPolicy* retry_policy =
+ envoy_config_route_v3_RouteAction_retry_policy(route_action);
+ if (retry_policy != nullptr) {
+ absl::optional<XdsApi::Route::RetryPolicy> retry;
+ grpc_error_handle error = RetryPolicyParse(context, retry_policy, &retry);
+ if (error != GRPC_ERROR_NONE) return error;
+ route->retry_policy = retry;
}
return GRPC_ERROR_NONE;
}
@@ -1749,6 +1867,15 @@ grpc_error_handle RouteConfigParse(
&vhost.typed_per_filter_config);
if (error != GRPC_ERROR_NONE) return error;
}
+ // Parse retry policy.
+ absl::optional<XdsApi::Route::RetryPolicy> virtual_host_retry_policy;
+ const envoy_config_route_v3_RetryPolicy* retry_policy =
+ envoy_config_route_v3_VirtualHost_retry_policy(virtual_hosts[i]);
+ if (retry_policy != nullptr) {
+ grpc_error_handle error =
+ RetryPolicyParse(context, retry_policy, &virtual_host_retry_policy);
+ if (error != GRPC_ERROR_NONE) return error;
+ }
// Parse routes.
size_t num_routes;
const envoy_config_route_v3_Route* const* routes =
@@ -1783,6 +1910,9 @@ grpc_error_handle RouteConfigParse(
error = RouteActionParse(context, routes[j], &route, &ignore_route);
if (error != GRPC_ERROR_NONE) return error;
if (ignore_route) continue;
+ if (route.retry_policy == absl::nullopt && retry_policy != nullptr) {
+ route.retry_policy = virtual_host_retry_policy;
+ }
if (context.use_v3) {
grpc_error_handle error = ParseTypedPerFilterConfig<
envoy_config_route_v3_Route,
@@ -1803,24 +1933,32 @@ grpc_error_handle RouteConfigParse(
return GRPC_ERROR_NONE;
}
-XdsApi::CommonTlsContext::CertificateProviderInstance
-CertificateProviderInstanceParse(
+grpc_error_handle CertificateProviderInstanceParse(
+ const EncodingContext& context,
const envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CertificateProviderInstance*
- certificate_provider_instance_proto) {
- return {
+ certificate_provider_instance_proto,
+ XdsApi::CommonTlsContext::CertificateProviderInstance*
+ certificate_provider_instance) {
+ *certificate_provider_instance = {
UpbStringToStdString(
envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CertificateProviderInstance_instance_name(
certificate_provider_instance_proto)),
UpbStringToStdString(
envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CertificateProviderInstance_certificate_name(
certificate_provider_instance_proto))};
+ if (context.certificate_provider_definition_map->find(
+ certificate_provider_instance->instance_name) ==
+ context.certificate_provider_definition_map->end()) {
+ return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat("Unrecognized certificate provider instance name: ",
+ certificate_provider_instance->instance_name)
+ .c_str());
+ }
+ return GRPC_ERROR_NONE;
}
grpc_error_handle CommonTlsContextParse(
- const envoy_extensions_transport_sockets_tls_v3_CommonTlsContext*
- common_tls_context_proto,
- XdsApi::CommonTlsContext* common_tls_context) GRPC_MUST_USE_RESULT;
-grpc_error_handle CommonTlsContextParse(
+ const EncodingContext& context,
const envoy_extensions_transport_sockets_tls_v3_CommonTlsContext*
common_tls_context_proto,
XdsApi::CommonTlsContext* common_tls_context) {
@@ -1898,19 +2036,21 @@ grpc_error_handle CommonTlsContextParse(
envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CombinedCertificateValidationContext_validation_context_certificate_provider_instance(
combined_validation_context);
if (validation_context_certificate_provider_instance != nullptr) {
- common_tls_context->combined_validation_context
- .validation_context_certificate_provider_instance =
- CertificateProviderInstanceParse(
- validation_context_certificate_provider_instance);
+ grpc_error_handle error = CertificateProviderInstanceParse(
+ context, validation_context_certificate_provider_instance,
+ &common_tls_context->combined_validation_context
+ .validation_context_certificate_provider_instance);
+ if (error != GRPC_ERROR_NONE) return error;
}
}
auto* tls_certificate_certificate_provider_instance =
envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_tls_certificate_certificate_provider_instance(
common_tls_context_proto);
if (tls_certificate_certificate_provider_instance != nullptr) {
- common_tls_context->tls_certificate_certificate_provider_instance =
- CertificateProviderInstanceParse(
- tls_certificate_certificate_provider_instance);
+ grpc_error_handle error = CertificateProviderInstanceParse(
+ context, tls_certificate_certificate_provider_instance,
+ &common_tls_context->tls_certificate_certificate_provider_instance);
+ if (error != GRPC_ERROR_NONE) return error;
}
return GRPC_ERROR_NONE;
}
@@ -1930,10 +2070,8 @@ grpc_error_handle HttpConnectionManagerParse(
const google_protobuf_Duration* duration =
envoy_config_core_v3_HttpProtocolOptions_max_stream_duration(options);
if (duration != nullptr) {
- http_connection_manager->http_max_stream_duration.seconds =
- google_protobuf_Duration_seconds(duration);
- http_connection_manager->http_max_stream_duration.nanos =
- google_protobuf_Duration_nanos(duration);
+ http_connection_manager->http_max_stream_duration =
+ DurationParse(duration);
}
}
// Parse filters.
@@ -1989,6 +2127,23 @@ grpc_error_handle HttpConnectionManagerParse(
is_client ? "clients" : "servers")
.c_str());
}
+ if (i < num_filters - 1) {
+ // Filters before the last filter must not be terminal.
+ if (filter_impl->IsTerminalFilter()) {
+ return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat("terminal filter for config type ", filter_type,
+ " must be the last filter in the chain")
+ .c_str());
+ }
+ } else {
+ // The last filter must be terminal.
+ if (!filter_impl->IsTerminalFilter()) {
+ return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat("non-terminal filter for config type ", filter_type,
+ " is the last filter in the chain")
+ .c_str());
+ }
+ }
absl::StatusOr<XdsHttpFilterImpl::FilterConfig> filter_config =
filter_impl->GenerateFilterConfig(google_protobuf_Any_value(any),
context.arena);
@@ -2079,43 +2234,54 @@ grpc_error_handle DownstreamTlsContextParse(
XdsApi::DownstreamTlsContext* downstream_tls_context) {
absl::string_view name = UpbStringToAbsl(
envoy_config_core_v3_TransportSocket_name(transport_socket));
- if (name == "envoy.transport_sockets.tls") {
- auto* typed_config =
- envoy_config_core_v3_TransportSocket_typed_config(transport_socket);
- if (typed_config != nullptr) {
- const upb_strview encoded_downstream_tls_context =
- google_protobuf_Any_value(typed_config);
- auto* downstream_tls_context_proto =
- envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_parse(
- encoded_downstream_tls_context.data,
- encoded_downstream_tls_context.size, context.arena);
- if (downstream_tls_context_proto == nullptr) {
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "Can't decode downstream tls context.");
- }
- auto* common_tls_context =
- envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_common_tls_context(
- downstream_tls_context_proto);
- if (common_tls_context != nullptr) {
- grpc_error_handle error = CommonTlsContextParse(
- common_tls_context, &downstream_tls_context->common_tls_context);
- if (error != GRPC_ERROR_NONE) return error;
- }
- auto* require_client_certificate =
- envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_require_client_certificate(
- downstream_tls_context_proto);
- if (require_client_certificate != nullptr) {
- downstream_tls_context->require_client_certificate =
- google_protobuf_BoolValue_value(require_client_certificate);
- }
- }
- if (downstream_tls_context->common_tls_context
- .tls_certificate_certificate_provider_instance.instance_name
- .empty()) {
+ if (name != "envoy.transport_sockets.tls") {
+ return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat("Unrecognized transport socket: ", name).c_str());
+ }
+ auto* typed_config =
+ envoy_config_core_v3_TransportSocket_typed_config(transport_socket);
+ if (typed_config != nullptr) {
+ const upb_strview encoded_downstream_tls_context =
+ google_protobuf_Any_value(typed_config);
+ auto* downstream_tls_context_proto =
+ envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_parse(
+ encoded_downstream_tls_context.data,
+ encoded_downstream_tls_context.size, context.arena);
+ if (downstream_tls_context_proto == nullptr) {
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "TLS configuration provided but no "
- "tls_certificate_certificate_provider_instance found.");
+ "Can't decode downstream tls context.");
+ }
+ auto* common_tls_context =
+ envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_common_tls_context(
+ downstream_tls_context_proto);
+ if (common_tls_context != nullptr) {
+ grpc_error_handle error =
+ CommonTlsContextParse(context, common_tls_context,
+ &downstream_tls_context->common_tls_context);
+ if (error != GRPC_ERROR_NONE) return error;
}
+ auto* require_client_certificate =
+ envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_require_client_certificate(
+ downstream_tls_context_proto);
+ if (require_client_certificate != nullptr) {
+ downstream_tls_context->require_client_certificate =
+ google_protobuf_BoolValue_value(require_client_certificate);
+ }
+ }
+ if (downstream_tls_context->common_tls_context
+ .tls_certificate_certificate_provider_instance.instance_name
+ .empty()) {
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "TLS configuration provided but no "
+ "tls_certificate_certificate_provider_instance found.");
+ }
+ if (downstream_tls_context->require_client_certificate &&
+ downstream_tls_context->common_tls_context.combined_validation_context
+ .validation_context_certificate_provider_instance.instance_name
+ .empty()) {
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "TLS configuration requires client certificates but no certificate "
+ "provider instance specified for validation.");
}
return GRPC_ERROR_NONE;
}
@@ -2699,6 +2865,54 @@ grpc_error_handle RdsResponseParse(
return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing RDS response", &errors);
}
+grpc_error_handle UpstreamTlsContextParse(
+ const EncodingContext& context,
+ const envoy_config_core_v3_TransportSocket* transport_socket,
+ XdsApi::CommonTlsContext* common_tls_context) {
+ // Record Upstream tls context
+ absl::string_view name = UpbStringToAbsl(
+ envoy_config_core_v3_TransportSocket_name(transport_socket));
+ if (name != "envoy.transport_sockets.tls") {
+ return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat("Unrecognized transport socket: ", name).c_str());
+ }
+ auto* typed_config =
+ envoy_config_core_v3_TransportSocket_typed_config(transport_socket);
+ if (typed_config != nullptr) {
+ const upb_strview encoded_upstream_tls_context =
+ google_protobuf_Any_value(typed_config);
+ auto* upstream_tls_context =
+ envoy_extensions_transport_sockets_tls_v3_UpstreamTlsContext_parse(
+ encoded_upstream_tls_context.data,
+ encoded_upstream_tls_context.size, context.arena);
+ if (upstream_tls_context == nullptr) {
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "Can't decode upstream tls context.");
+ }
+ auto* common_tls_context_proto =
+ envoy_extensions_transport_sockets_tls_v3_UpstreamTlsContext_common_tls_context(
+ upstream_tls_context);
+ if (common_tls_context_proto != nullptr) {
+ grpc_error_handle error = CommonTlsContextParse(
+ context, common_tls_context_proto, common_tls_context);
+ if (error != GRPC_ERROR_NONE) {
+ return grpc_error_add_child(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "Error parsing UpstreamTlsContext"),
+ error);
+ }
+ }
+ }
+ if (common_tls_context->combined_validation_context
+ .validation_context_certificate_provider_instance.instance_name
+ .empty()) {
+ return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ "UpstreamTlsContext: TLS configuration provided but no "
+ "validation_context_certificate_provider_instance "
+ "found.");
+ }
+ return GRPC_ERROR_NONE;
+}
+
grpc_error_handle CdsResponseParse(
const EncodingContext& context,
const envoy_service_discovery_v3_DiscoveryResponse* response,
@@ -2946,9 +3160,8 @@ grpc_error_handle CdsResponseParse(
if (envoy_config_cluster_v3_Cluster_lb_policy(cluster) ==
envoy_config_cluster_v3_Cluster_ROUND_ROBIN) {
cds_update.lb_policy = "ROUND_ROBIN";
- } else if (XdsRingHashEnabled() &&
- envoy_config_cluster_v3_Cluster_lb_policy(cluster) ==
- envoy_config_cluster_v3_Cluster_RING_HASH) {
+ } else if (envoy_config_cluster_v3_Cluster_lb_policy(cluster) ==
+ envoy_config_cluster_v3_Cluster_RING_HASH) {
cds_update.lb_policy = "RING_HASH";
// Record ring hash lb config
auto* ring_hash_config =
@@ -3015,60 +3228,21 @@ grpc_error_handle CdsResponseParse(
continue;
}
if (XdsSecurityEnabled()) {
- // Record Upstream tls context
auto* transport_socket =
envoy_config_cluster_v3_Cluster_transport_socket(cluster);
if (transport_socket != nullptr) {
- absl::string_view name = UpbStringToAbsl(
- envoy_config_core_v3_TransportSocket_name(transport_socket));
- if (name == "envoy.transport_sockets.tls") {
- auto* typed_config =
- envoy_config_core_v3_TransportSocket_typed_config(
- transport_socket);
- if (typed_config != nullptr) {
- const upb_strview encoded_upstream_tls_context =
- google_protobuf_Any_value(typed_config);
- auto* upstream_tls_context =
- envoy_extensions_transport_sockets_tls_v3_UpstreamTlsContext_parse(
- encoded_upstream_tls_context.data,
- encoded_upstream_tls_context.size, context.arena);
- if (upstream_tls_context == nullptr) {
- errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
- absl::StrCat(cluster_name,
- ": Can't decode upstream tls context.")
- .c_str()));
- resource_names_failed->insert(cluster_name);
- continue;
- }
- auto* common_tls_context =
- envoy_extensions_transport_sockets_tls_v3_UpstreamTlsContext_common_tls_context(
- upstream_tls_context);
- if (common_tls_context != nullptr) {
- grpc_error_handle error = CommonTlsContextParse(
- common_tls_context, &cds_update.common_tls_context);
- if (error != GRPC_ERROR_NONE) {
- errors.push_back(grpc_error_add_child(
- GRPC_ERROR_CREATE_FROM_COPIED_STRING(
- absl::StrCat(cluster_name, ": error in TLS context")
- .c_str()),
- error));
- resource_names_failed->insert(cluster_name);
- continue;
- }
- }
- }
- if (cds_update.common_tls_context.combined_validation_context
- .validation_context_certificate_provider_instance
- .instance_name.empty()) {
- errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
- absl::StrCat(cluster_name,
- "TLS configuration provided but no "
- "validation_context_certificate_provider_instance "
- "found.")
- .c_str()));
- resource_names_failed->insert(cluster_name);
- continue;
- }
+ grpc_error_handle error = UpstreamTlsContextParse(
+ context, transport_socket, &cds_update.common_tls_context);
+ if (error != GRPC_ERROR_NONE) {
+ errors.push_back(grpc_error_add_child(
+ GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat(
+ "Error parsing security configuration for cluster: ",
+ cluster_name)
+ .c_str()),
+ error));
+ resource_names_failed->insert(cluster_name);
+ continue;
}
}
}
@@ -3404,8 +3578,12 @@ XdsApi::AdsParseResult XdsApi::ParseAdsResponse(
const std::set<absl::string_view>& expected_eds_service_names) {
AdsParseResult result;
upb::Arena arena;
- const EncodingContext context = {client_, tracer_, symtab_.ptr(), arena.ptr(),
- server.ShouldUseV3()};
+ const EncodingContext context = {client_,
+ tracer_,
+ symtab_.ptr(),
+ arena.ptr(),
+ server.ShouldUseV3(),
+ certificate_provider_definition_map_};
// Decode the response.
const envoy_service_discovery_v3_DiscoveryResponse* response =
envoy_service_discovery_v3_DiscoveryResponse_parse(
@@ -3492,8 +3670,12 @@ grpc_slice SerializeLrsRequest(
grpc_slice XdsApi::CreateLrsInitialRequest(
const XdsBootstrap::XdsServer& server) {
upb::Arena arena;
- const EncodingContext context = {client_, tracer_, symtab_.ptr(), arena.ptr(),
- server.ShouldUseV3()};
+ const EncodingContext context = {client_,
+ tracer_,
+ symtab_.ptr(),
+ arena.ptr(),
+ server.ShouldUseV3(),
+ certificate_provider_definition_map_};
// Create a request.
envoy_service_load_stats_v3_LoadStatsRequest* request =
envoy_service_load_stats_v3_LoadStatsRequest_new(arena.ptr());
@@ -3563,8 +3745,9 @@ void LocalityStatsPopulate(
grpc_slice XdsApi::CreateLrsRequest(
ClusterLoadReportMap cluster_load_report_map) {
upb::Arena arena;
- const EncodingContext context = {client_, tracer_, symtab_.ptr(), arena.ptr(),
- false};
+ const EncodingContext context = {
+ client_, tracer_, symtab_.ptr(),
+ arena.ptr(), false, certificate_provider_definition_map_};
// Create a request.
envoy_service_load_stats_v3_LoadStatsRequest* request =
envoy_service_load_stats_v3_LoadStatsRequest_new(arena.ptr());
@@ -3897,8 +4080,9 @@ std::string XdsApi::AssembleClientConfig(
// Fill-in the node information
auto* node = envoy_service_status_v3_ClientConfig_mutable_node(client_config,
arena.ptr());
- const EncodingContext context = {client_, tracer_, symtab_.ptr(), arena.ptr(),
- true};
+ const EncodingContext context = {
+ client_, tracer_, symtab_.ptr(),
+ arena.ptr(), true, certificate_provider_definition_map_};
PopulateNode(context, node_, build_version_, user_agent_name_,
user_agent_version_, node);
// Dump each xDS-type config into PerXdsConfig
diff --git a/src/core/ext/xds/xds_api.h b/src/core/ext/xds/xds_api.h
index ed41c86804..1ec95898b1 100644
--- a/src/core/ext/xds/xds_api.h
+++ b/src/core/ext/xds/xds_api.h
@@ -38,6 +38,7 @@
#include "src/core/ext/xds/xds_bootstrap.h"
#include "src/core/ext/xds/xds_client_stats.h"
#include "src/core/ext/xds/xds_http_filters.h"
+#include "src/core/lib/channel/status_util.h"
#include "src/core/lib/matchers/matchers.h"
namespace grpc_core {
@@ -109,10 +110,34 @@ class XdsApi {
bool operator==(const HashPolicy& other) const;
std::string ToString() const;
};
-
Matchers matchers;
std::vector<HashPolicy> hash_policies;
+ struct RetryPolicy {
+ internal::StatusCodeSet retry_on;
+ uint32_t num_retries;
+
+ struct RetryBackOff {
+ Duration base_interval;
+ Duration max_interval;
+
+ bool operator==(const RetryBackOff& other) const {
+ return base_interval == other.base_interval &&
+ max_interval == other.max_interval;
+ }
+ std::string ToString() const;
+ };
+ RetryBackOff retry_back_off;
+
+ bool operator==(const RetryPolicy& other) const {
+ return (retry_on == other.retry_on &&
+ num_retries == other.num_retries &&
+ retry_back_off == other.retry_back_off);
+ }
+ std::string ToString() const;
+ };
+ absl::optional<RetryPolicy> retry_policy;
+
// Action for this route.
// TODO(roth): When we can use absl::variant<>, consider using that
// here, to enforce the fact that only one of the two fields can be set.
@@ -139,6 +164,7 @@ class XdsApi {
bool operator==(const Route& other) const {
return matchers == other.matchers && cluster_name == other.cluster_name &&
+ retry_policy == other.retry_policy &&
weighted_clusters == other.weighted_clusters &&
max_stream_duration == other.max_stream_duration &&
typed_per_filter_config == other.typed_per_filter_config;
@@ -630,7 +656,8 @@ class XdsApi {
std::set<std::string> resource_names_failed;
};
- XdsApi(XdsClient* client, TraceFlag* tracer, const XdsBootstrap::Node* node);
+ XdsApi(XdsClient* client, TraceFlag* tracer, const XdsBootstrap::Node* node,
+ const CertificateProviderStore::PluginDefinitionMap* map);
// Creates an ADS request.
// Takes ownership of \a error.
@@ -671,6 +698,8 @@ class XdsApi {
XdsClient* client_;
TraceFlag* tracer_;
const XdsBootstrap::Node* node_; // Do not own.
+ const CertificateProviderStore::PluginDefinitionMap*
+ certificate_provider_definition_map_; // Do not own.
upb::SymbolTable symtab_;
const std::string build_version_;
const std::string user_agent_name_;
diff --git a/src/core/ext/xds/xds_bootstrap.cc b/src/core/ext/xds/xds_bootstrap.cc
index 33cf276d2c..d64ab35cc9 100644
--- a/src/core/ext/xds/xds_bootstrap.cc
+++ b/src/core/ext/xds/xds_bootstrap.cc
@@ -403,7 +403,10 @@ grpc_error_handle XdsBootstrap::ParseCertificateProvider(
CertificateProviderFactory* factory =
CertificateProviderRegistry::LookupCertificateProviderFactory(
plugin_name);
- if (factory != nullptr) {
+ if (factory == nullptr) {
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat("Unrecognized plugin name: ", plugin_name).c_str()));
+ } else {
RefCountedPtr<CertificateProviderFactory::Config> config;
it = certificate_provider_json->mutable_object()->find("config");
if (it != certificate_provider_json->mutable_object()->end()) {
diff --git a/src/core/ext/xds/xds_client.cc b/src/core/ext/xds/xds_client.cc
index d3549997e9..4715a231d6 100644
--- a/src/core/ext/xds/xds_client.cc
+++ b/src/core/ext/xds/xds_client.cc
@@ -275,6 +275,12 @@ class XdsClient::ChannelState::AdsCallState
XdsApi::EdsUpdateMap eds_update_map)
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
+ template <typename StateMap>
+ void RejectAdsUpdateLocked(grpc_millis update_time,
+ const XdsApi::AdsParseResult& result,
+ StateMap* state_map)
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
+
static void OnRequestSent(void* arg, grpc_error_handle error);
void OnRequestSentLocked(grpc_error_handle error)
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
@@ -1145,6 +1151,47 @@ void XdsClient::ChannelState::AdsCallState::AcceptEdsUpdateLocked(
}
}
+namespace {
+
+// Update resource_metadata for NACK.
+void UpdateResourceMetadataNacked(const std::string& version,
+ const std::string& details,
+ grpc_millis update_time,
+ XdsApi::ResourceMetadata* resource_metadata) {
+ resource_metadata->client_status = XdsApi::ResourceMetadata::NACKED;
+ resource_metadata->failed_version = version;
+ resource_metadata->failed_details = details;
+ resource_metadata->failed_update_time = update_time;
+}
+
+} // namespace
+
+template <typename StateMap>
+void XdsClient::ChannelState::AdsCallState::RejectAdsUpdateLocked(
+ grpc_millis update_time, const XdsApi::AdsParseResult& result,
+ StateMap* state_map) {
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
+ gpr_log(GPR_INFO,
+ "[xds_client %p] %s update NACKed containing %" PRIuPTR
+ " resources",
+ xds_client(), result.type_url.c_str(),
+ result.resource_names_failed.size());
+ }
+ std::string details = grpc_error_std_string(result.parse_error);
+ for (auto& name : result.resource_names_failed) {
+ auto it = state_map->find(name);
+ if (it == state_map->end()) continue;
+ auto& state = it->second;
+ // Notify watchers of error.
+ for (const auto& p : state.watchers) {
+ p.first->OnError(GRPC_ERROR_REF(result.parse_error));
+ }
+ // Update resource metadata for CSDS.
+ UpdateResourceMetadataNacked(result.version, details, update_time,
+ &state.meta);
+ }
+}
+
void XdsClient::ChannelState::AdsCallState::OnRequestSent(
void* arg, grpc_error_handle error) {
AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
@@ -1223,10 +1270,6 @@ bool XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
state.nonce = std::move(result.nonce);
// NACK or ACK the response.
if (result.parse_error != GRPC_ERROR_NONE) {
- xds_client()->UpdateResourceMetadataWithFailedParseResultLocked(
- update_time, result);
- GRPC_ERROR_UNREF(state.error);
- state.error = result.parse_error;
// NACK unacceptable update.
gpr_log(GPR_ERROR,
"[xds_client %p] ADS response invalid for resource type %s "
@@ -1234,6 +1277,23 @@ bool XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
xds_client(), result.type_url.c_str(), result.version.c_str(),
state.nonce.c_str(),
grpc_error_std_string(result.parse_error).c_str());
+ result.parse_error =
+ grpc_error_set_int(result.parse_error, GRPC_ERROR_INT_GRPC_STATUS,
+ GRPC_STATUS_UNAVAILABLE);
+ GRPC_ERROR_UNREF(state.error);
+ state.error = result.parse_error;
+ if (result.type_url == XdsApi::kLdsTypeUrl) {
+ RejectAdsUpdateLocked(update_time, result,
+ &xds_client()->listener_map_);
+ } else if (result.type_url == XdsApi::kRdsTypeUrl) {
+ RejectAdsUpdateLocked(update_time, result,
+ &xds_client()->route_config_map_);
+ } else if (result.type_url == XdsApi::kCdsTypeUrl) {
+ RejectAdsUpdateLocked(update_time, result, &xds_client()->cluster_map_);
+ } else if (result.type_url == XdsApi::kEdsTypeUrl) {
+ RejectAdsUpdateLocked(update_time, result,
+ &xds_client()->endpoint_map_);
+ }
SendMessageLocked(result.type_url);
} else {
seen_response_ = true;
@@ -1803,7 +1863,8 @@ XdsClient::XdsClient(std::unique_ptr<XdsBootstrap> bootstrap,
interested_parties_(grpc_pollset_set_create()),
certificate_provider_store_(MakeOrphanable<CertificateProviderStore>(
bootstrap_->certificate_providers())),
- api_(this, &grpc_xds_client_trace, bootstrap_->node()) {
+ api_(this, &grpc_xds_client_trace, bootstrap_->node(),
+ &bootstrap_->certificate_providers()) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
gpr_log(GPR_INFO, "[xds_client %p] creating xds client", this);
}
@@ -2252,44 +2313,6 @@ XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshotLocked(
return snapshot_map;
}
-void XdsClient::UpdateResourceMetadataWithFailedParseResultLocked(
- grpc_millis update_time, const XdsApi::AdsParseResult& result) {
- // ADS update is rejected and the resource names in the failed update is
- // available.
- std::string details = grpc_error_std_string(result.parse_error);
- for (auto& name : result.resource_names_failed) {
- XdsApi::ResourceMetadata* resource_metadata = nullptr;
- if (result.type_url == XdsApi::kLdsTypeUrl) {
- auto it = listener_map_.find(name);
- if (it != listener_map_.end()) {
- resource_metadata = &it->second.meta;
- }
- } else if (result.type_url == XdsApi::kRdsTypeUrl) {
- auto it = route_config_map_.find(name);
- if (route_config_map_.find(name) != route_config_map_.end()) {
- resource_metadata = &it->second.meta;
- }
- } else if (result.type_url == XdsApi::kCdsTypeUrl) {
- auto it = cluster_map_.find(name);
- if (cluster_map_.find(name) != cluster_map_.end()) {
- resource_metadata = &it->second.meta;
- }
- } else if (result.type_url == XdsApi::kEdsTypeUrl) {
- auto it = endpoint_map_.find(name);
- if (endpoint_map_.find(name) != endpoint_map_.end()) {
- resource_metadata = &it->second.meta;
- }
- }
- if (resource_metadata == nullptr) {
- return;
- }
- resource_metadata->client_status = XdsApi::ResourceMetadata::NACKED;
- resource_metadata->failed_version = result.version;
- resource_metadata->failed_details = details;
- resource_metadata->failed_update_time = update_time;
- }
-}
-
std::string XdsClient::DumpClientConfigBinary() {
MutexLock lock(&mu_);
XdsApi::ResourceTypeMetadataMap resource_type_metadata_map;
diff --git a/src/core/ext/xds/xds_client.h b/src/core/ext/xds/xds_client.h
index 0ee84e7866..27796f412a 100644
--- a/src/core/ext/xds/xds_client.h
+++ b/src/core/ext/xds/xds_client.h
@@ -324,10 +324,6 @@ class XdsClient : public DualRefCounted<XdsClient> {
bool send_all_clusters, const std::set<std::string>& clusters)
ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
- void UpdateResourceMetadataWithFailedParseResultLocked(
- grpc_millis update_time, const XdsApi::AdsParseResult& result)
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
-
std::unique_ptr<XdsBootstrap> bootstrap_;
grpc_channel_args* args_;
const grpc_millis request_timeout_;
diff --git a/src/core/ext/xds/xds_http_filters.cc b/src/core/ext/xds/xds_http_filters.cc
index 9bd4858b2c..4cf95eb2bd 100644
--- a/src/core/ext/xds/xds_http_filters.cc
+++ b/src/core/ext/xds/xds_http_filters.cc
@@ -52,10 +52,9 @@ class XdsHttpRouterFilter : public XdsHttpFilterImpl {
"router filter does not support config override");
}
- // No-op -- this filter is special-cased by the xds resolver.
const grpc_channel_filter* channel_filter() const override { return nullptr; }
- // No-op -- this filter is special-cased by the xds resolver.
+ // No-op. This will never be called, since channel_filter() returns null.
absl::StatusOr<ServiceConfigJsonEntry> GenerateServiceConfig(
const FilterConfig& /*hcm_filter_config*/,
const FilterConfig* /*filter_config_override*/) const override {
@@ -65,6 +64,8 @@ class XdsHttpRouterFilter : public XdsHttpFilterImpl {
bool IsSupportedOnClients() const override { return true; }
bool IsSupportedOnServers() const override { return true; }
+
+ bool IsTerminalFilter() const override { return true; }
};
using FilterOwnerList = std::vector<std::unique_ptr<XdsHttpFilterImpl>>;
diff --git a/src/core/ext/xds/xds_http_filters.h b/src/core/ext/xds/xds_http_filters.h
index 332419681e..74f4a0c626 100644
--- a/src/core/ext/xds/xds_http_filters.h
+++ b/src/core/ext/xds/xds_http_filters.h
@@ -107,6 +107,9 @@ class XdsHttpFilterImpl {
// Returns true if the filter is supported on servers; false otherwise
virtual bool IsSupportedOnServers() const = 0;
+
+ // Returns true if the filter must be the last filter in the chain.
+ virtual bool IsTerminalFilter() const { return false; }
};
class XdsHttpFilterRegistry {
diff --git a/src/core/lib/channel/call_tracer.h b/src/core/lib/channel/call_tracer.h
new file mode 100644
index 0000000000..577104ab01
--- /dev/null
+++ b/src/core/lib/channel/call_tracer.h
@@ -0,0 +1,85 @@
+//
+//
+// Copyright 2021 gRPC authors.
+//
+// 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.
+//
+//
+
+#ifndef GRPC_CORE_LIB_CHANNEL_CALL_TRACER_H
+#define GRPC_CORE_LIB_CHANNEL_CALL_TRACER_H
+
+#include <grpc/support/port_platform.h>
+
+#include "absl/strings/string_view.h"
+
+#include "src/core/lib/channel/channel_stack.h"
+#include "src/core/lib/transport/byte_stream.h"
+#include "src/core/lib/transport/metadata_batch.h"
+
+namespace grpc_core {
+
+// Interface for a tracer that records activities on a call. Actual attempts for
+// this call are traced with CallAttemptTracer after invoking RecordNewAttempt()
+// on the CallTracer object.
+class CallTracer {
+ public:
+ // Interface for a tracer that records activities on a particular call
+ // attempt.
+ // (A single RPC can have multiple attempts due to retry/hedging policies or
+ // as transparent retry attempts.)
+ class CallAttemptTracer {
+ public:
+ virtual ~CallAttemptTracer() {}
+ // Please refer to `grpc_transport_stream_op_batch_payload` for details on
+ // arguments.
+ virtual void RecordSendInitialMetadata(
+ grpc_metadata_batch* send_initial_metadata, uint32_t flags) = 0;
+ // TODO(yashkt): We are using gpr_atm here instead of absl::string_view
+ // since that's what the transport API uses, and performing an atomic load
+ // is unnecessary if the census tracer does not need it at present. Fix this
+ // when the transport API changes.
+ virtual void RecordOnDoneSendInitialMetadata(gpr_atm* peer_string) = 0;
+ virtual void RecordSendTrailingMetadata(
+ grpc_metadata_batch* send_trailing_metadata) = 0;
+ virtual void RecordSendMessage(const ByteStream& send_message) = 0;
+ // The `RecordReceivedInitialMetadata()` and `RecordReceivedMessage()`
+ // methods should only be invoked when the metadata/message was
+ // successfully received, i.e., without any error.
+ virtual void RecordReceivedInitialMetadata(
+ grpc_metadata_batch* recv_initial_metadata, uint32_t flags) = 0;
+ virtual void RecordReceivedMessage(const ByteStream& recv_message) = 0;
+ virtual void RecordReceivedTrailingMetadata(
+ absl::Status status, grpc_metadata_batch* recv_trailing_metadata,
+ const grpc_transport_stream_stats& transport_stream_stats) = 0;
+ virtual void RecordCancel(grpc_error_handle cancel_error) = 0;
+ // Should be the last API call to the object. Once invoked, the tracer
+ // library is free to destroy the object.
+ virtual void RecordEnd(const gpr_timespec& latency) = 0;
+ };
+
+ virtual ~CallTracer() {}
+
+ // Records a new attempt for the associated call. \a transparent denotes
+ // whether the attempt is being made as a transparent retry or as a
+ // non-transparent retry/heding attempt. (There will be at least one attempt
+ // even if the call is not being retried.) The `CallTracer` object retains
+ // ownership to the newly created `CallAttemptTracer` object. RecordEnd()
+ // serves as an indication that the call stack is done with all API calls, and
+ // the tracer library is free to destroy it after that.
+ virtual CallAttemptTracer* StartNewAttempt(bool is_transparent_retry) = 0;
+};
+
+} // namespace grpc_core
+
+#endif // GRPC_CORE_LIB_CHANNEL_CALL_TRACER_H
diff --git a/src/core/lib/channel/channel_stack.h b/src/core/lib/channel/channel_stack.h
index 4832303cab..5e6b3594db 100644
--- a/src/core/lib/channel/channel_stack.h
+++ b/src/core/lib/channel/channel_stack.h
@@ -78,7 +78,7 @@ struct grpc_call_element_args {
const void* server_transport_data;
grpc_call_context_element* context;
const grpc_slice& path;
- gpr_cycle_counter start_time;
+ gpr_cycle_counter start_time; // Note: not populated in subchannel stack.
grpc_millis deadline;
grpc_core::Arena* arena;
grpc_core::CallCombiner* call_combiner;
diff --git a/src/core/lib/channel/context.h b/src/core/lib/channel/context.h
index bd7fd495e4..0c0556abcd 100644
--- a/src/core/lib/channel/context.h
+++ b/src/core/lib/channel/context.h
@@ -32,6 +32,9 @@ typedef enum {
/// Value is a \a census_context.
GRPC_CONTEXT_TRACING,
+ /// Value is a CallTracer object.
+ GRPC_CONTEXT_CALL_TRACER,
+
/// Reserved for traffic_class_context.
GRPC_CONTEXT_TRAFFIC,
diff --git a/src/core/lib/channel/status_util.h b/src/core/lib/channel/status_util.h
index 969033ad6b..bab65375f0 100644
--- a/src/core/lib/channel/status_util.h
+++ b/src/core/lib/channel/status_util.h
@@ -53,6 +53,10 @@ class StatusCodeSet {
return status_code_mask_ & (1 << status);
}
+ bool operator==(const StatusCodeSet& other) const {
+ return status_code_mask_ == other.status_code_mask_;
+ }
+
private:
int status_code_mask_ = 0; // A bitfield of status codes in the set.
};
diff --git a/src/core/lib/compression/stream_compression.h b/src/core/lib/compression/stream_compression.h
index 7328c3ec0f..10ae15658c 100644
--- a/src/core/lib/compression/stream_compression.h
+++ b/src/core/lib/compression/stream_compression.h
@@ -113,4 +113,4 @@ void grpc_stream_compression_context_destroy(
int grpc_stream_compression_method_parse(
grpc_slice value, bool is_compress, grpc_stream_compression_method* method);
-#endif
+#endif // GRPC_CORE_LIB_COMPRESSION_STREAM_COMPRESSION_H
diff --git a/src/core/lib/compression/stream_compression_gzip.h b/src/core/lib/compression/stream_compression_gzip.h
index 740f09734a..0f3be6d306 100644
--- a/src/core/lib/compression/stream_compression_gzip.h
+++ b/src/core/lib/compression/stream_compression_gzip.h
@@ -25,4 +25,4 @@
extern const grpc_stream_compression_vtable grpc_stream_compression_gzip_vtable;
-#endif
+#endif // GRPC_CORE_LIB_COMPRESSION_STREAM_COMPRESSION_GZIP_H
diff --git a/src/core/lib/compression/stream_compression_identity.h b/src/core/lib/compression/stream_compression_identity.h
index cc77b63ecd..9c3693c744 100644
--- a/src/core/lib/compression/stream_compression_identity.h
+++ b/src/core/lib/compression/stream_compression_identity.h
@@ -26,4 +26,4 @@
extern const grpc_stream_compression_vtable
grpc_stream_compression_identity_vtable;
-#endif
+#endif // GRPC_CORE_LIB_COMPRESSION_STREAM_COMPRESSION_IDENTITY_H
diff --git a/src/core/lib/debug/stats.h b/src/core/lib/debug/stats.h
index 8829b093ab..be17ac5297 100644
--- a/src/core/lib/debug/stats.h
+++ b/src/core/lib/debug/stats.h
@@ -67,4 +67,4 @@ double grpc_stats_histo_percentile(const grpc_stats_data* stats,
size_t grpc_stats_histo_count(const grpc_stats_data* stats,
grpc_stats_histograms histogram);
-#endif
+#endif // GRPC_CORE_LIB_DEBUG_STATS_H
diff --git a/src/core/lib/gpr/arena.h b/src/core/lib/gpr/arena.h
deleted file mode 100644
index 4d70695149..0000000000
--- a/src/core/lib/gpr/arena.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *
- * Copyright 2017 gRPC authors.
- *
- * 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.
- *
- */
-
-// \file Arena based allocator
-// Allows very fast allocation of memory, but that memory cannot be freed until
-// the arena as a whole is freed
-// Tracks the total memory allocated against it, so that future arenas can
-// pre-allocate the right amount of memory
-// This transitional API is deprecated and will be removed soon in favour of
-// src/core/lib/gprpp/arena.h .
-
-#ifndef GRPC_CORE_LIB_GPR_ARENA_H
-#define GRPC_CORE_LIB_GPR_ARENA_H
-
-#include <grpc/support/port_platform.h>
-
-#include "src/core/lib/gprpp/arena.h"
-
-// TODO(arjunroy) : Remove deprecated gpr_arena API once all callers are gone.
-typedef class grpc_core::Arena gpr_arena;
-// Create an arena, with \a initial_size bytes in the first allocated buffer
-inline gpr_arena* gpr_arena_create(size_t initial_size) {
- return grpc_core::Arena::Create(initial_size);
-}
-// Destroy an arena, returning the total number of bytes allocated
-inline size_t gpr_arena_destroy(gpr_arena* arena) { return arena->Destroy(); }
-// Allocate \a size bytes from the arena
-inline void* gpr_arena_alloc(gpr_arena* arena, size_t size) {
- return arena->Alloc(size);
-}
-
-#endif /* GRPC_CORE_LIB_GPR_ARENA_H */
diff --git a/src/core/lib/gpr/murmur_hash.cc b/src/core/lib/gpr/murmur_hash.cc
index 95d11d3ce7..063b104b67 100644
--- a/src/core/lib/gpr/murmur_hash.cc
+++ b/src/core/lib/gpr/murmur_hash.cc
@@ -22,6 +22,8 @@
#include <string.h>
+#include "absl/base/attributes.h"
+
#define ROTL32(x, r) (((x) << (r)) | ((x) >> (32 - (r))))
#define FMIX32(h) \
@@ -61,10 +63,10 @@ uint32_t gpr_murmur_hash3(const void* key, size_t len, uint32_t seed) {
switch (len & 3) {
case 3:
k1 ^= (static_cast<uint32_t>(keyptr[2])) << 16;
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case 2:
k1 ^= (static_cast<uint32_t>(keyptr[1])) << 8;
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case 1:
k1 ^= keyptr[0];
k1 *= c1;
diff --git a/src/core/lib/gprpp/bitset.h b/src/core/lib/gprpp/bitset.h
new file mode 100644
index 0000000000..8e225bd56a
--- /dev/null
+++ b/src/core/lib/gprpp/bitset.h
@@ -0,0 +1,156 @@
+// Copyright 2021 gRPC authors.
+//
+// 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.
+
+#ifndef GRPC_CORE_LIB_GPRPP_BITSET_H
+#define GRPC_CORE_LIB_GPRPP_BITSET_H
+
+#include <grpc/impl/codegen/port_platform.h>
+
+#include <utility>
+
+namespace grpc_core {
+
+// Given a bit count as an integer, vend as member type `Type` a type with
+// exactly that number of bits. Undefined if that bit count is not available.
+template <std::size_t kBits>
+struct UintSelector;
+template <>
+struct UintSelector<8> {
+ typedef uint8_t Type;
+};
+template <>
+struct UintSelector<16> {
+ typedef uint16_t Type;
+};
+template <>
+struct UintSelector<32> {
+ typedef uint32_t Type;
+};
+template <>
+struct UintSelector<64> {
+ typedef uint64_t Type;
+};
+
+// An unsigned integer of some number of bits.
+template <std::size_t kBits>
+using Uint = typename UintSelector<kBits>::Type;
+
+// Given the total number of bits that need to be stored, choose the size of
+// 'unit' for a BitSet... We'll use an array of units to store the total set.
+// For small bit counts we are selective in the type to try and balance byte
+// size and performance
+// - the details will likely be tweaked into the future.
+// Once we get over 96 bits, we just use uint64_t for everything.
+constexpr std::size_t ChooseUnitBitsForBitSet(std::size_t total_bits) {
+ return total_bits <= 8 ? 8
+ : total_bits <= 16 ? 16
+ : total_bits <= 24 ? 8
+ : total_bits <= 32 ? 32
+ : total_bits <= 48 ? 16
+ : total_bits <= 64 ? 64
+ : total_bits <= 96 ? 32
+ : 64;
+}
+
+// A BitSet that's configurable.
+// Contains storage for kTotalBits, stored as an array of integers of size
+// kUnitBits. e.g. to store 72 bits in 8 bit chunks, we'd say BitSet<72, 8>.
+// Since most users shouldn't care about the size of unit used, we default
+// kUnitBits to whatever is selected by ChooseUnitBitsForBitSet
+template <std::size_t kTotalBits,
+ std::size_t kUnitBits = ChooseUnitBitsForBitSet(kTotalBits)>
+class BitSet {
+ static constexpr std::size_t kUnits =
+ (kTotalBits + kUnitBits - 1) / kUnitBits;
+
+ public:
+ // Initialize to all bits false
+ constexpr BitSet() : units_{} {}
+
+ // Set bit i to true
+ void set(int i) { units_[unit_for(i)] |= mask_for(i); }
+
+ // Set bit i to is_set
+ void set(int i, bool is_set) {
+ if (is_set) {
+ set(i);
+ } else {
+ clear(i);
+ }
+ }
+
+ // Set bit i to false
+ void clear(int i) { units_[unit_for(i)] &= ~mask_for(i); }
+
+ // Return true if bit i is set
+ constexpr bool is_set(int i) const {
+ return (units_[unit_for(i)] & mask_for(i)) != 0;
+ }
+
+ // Return true if all bits are set
+ bool all() const {
+ if (kTotalBits % kUnitBits == 0) {
+ // kTotalBits is a multiple of kUnitBits ==> we can just check for all
+ // ones in each unit.
+ for (std::size_t i = 0; i < kUnits; i++) {
+ if (units_[i] != all_ones()) return false;
+ }
+ return true;
+ } else {
+ // kTotalBits is not a multiple of kUnitBits ==> we need special handling
+ // for checking partial filling of the last unit (since not all of its
+ // bits are used!)
+ for (std::size_t i = 0; i < kUnits - 1; i++) {
+ if (units_[i] != all_ones()) return false;
+ }
+ return units_[kUnits - 1] == n_ones(kTotalBits % kUnitBits);
+ }
+ }
+
+ // Return true if *no* bits are set.
+ bool none() const {
+ for (std::size_t i = 0; i < kUnits; i++) {
+ if (units_[i] != 0) return false;
+ }
+ return true;
+ }
+
+ private:
+ // Given a bit index, return which unit it's stored in.
+ static constexpr std::size_t unit_for(std::size_t bit) {
+ return bit / kUnitBits;
+ }
+
+ // Given a bit index, return a mask to access that bit within it's unit.
+ static constexpr Uint<kUnitBits> mask_for(std::size_t bit) {
+ return Uint<kUnitBits>{1} << (bit % kUnitBits);
+ }
+
+ // Return a value that is all ones
+ static constexpr Uint<kUnitBits> all_ones() {
+ return Uint<kUnitBits>(~Uint<kUnitBits>(0));
+ }
+
+ // Return a value with n bottom bits ones
+ static constexpr Uint<kUnitBits> n_ones(std::size_t n) {
+ return n == kUnitBits ? all_ones() : (Uint<kUnitBits>(1) << n) - 1;
+ }
+
+ // The set of units - kUnitBits sized integers that store kUnitBits bits!
+ Uint<kUnitBits> units_[kUnits];
+};
+
+} // namespace grpc_core
+
+#endif // GRPC_CORE_LIB_GPRPP_BITSET_H
diff --git a/src/core/lib/gprpp/manual_constructor.h b/src/core/lib/gprpp/manual_constructor.h
index 7ee13796ee..48ab231e33 100644
--- a/src/core/lib/gprpp/manual_constructor.h
+++ b/src/core/lib/gprpp/manual_constructor.h
@@ -210,4 +210,4 @@ class ManualConstructor {
} // namespace grpc_core
-#endif
+#endif // GRPC_CORE_LIB_GPRPP_MANUAL_CONSTRUCTOR_H
diff --git a/src/core/lib/gprpp/match.h b/src/core/lib/gprpp/match.h
new file mode 100644
index 0000000000..caec932cc8
--- /dev/null
+++ b/src/core/lib/gprpp/match.h
@@ -0,0 +1,72 @@
+// Copyright 2021 gRPC authors.
+//
+// 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.
+
+#ifndef GRPC_CORE_LIB_GPRPP_MATCH_H
+#define GRPC_CORE_LIB_GPRPP_MATCH_H
+
+#include <grpc/impl/codegen/port_platform.h>
+
+#include "absl/types/variant.h"
+#include "src/core/lib/gprpp/overload.h"
+
+namespace grpc_core {
+
+namespace detail {
+
+template <typename... Cases>
+struct MatchPointerExtractor {
+ OverloadType<Cases...> cases;
+ template <typename T>
+ auto operator()(T& value) -> decltype(cases(&value)) {
+ return cases(&value);
+ }
+};
+
+} // namespace detail
+
+/// Match on a variant.
+/// Given variant \a value, and a set of callables \a fs, call the appropriate
+/// callable based on the type contained in \a value.
+///
+/// Example (prints "hoorah"):
+/// variant<int, string> v = 42;
+/// Match(v,
+/// [](int i) { puts("hoorah"); },
+/// [](string s) { puts("boo"); });
+template <typename... Fs, typename T0, typename... Ts>
+auto Match(const absl::variant<T0, Ts...>& value, Fs... fs)
+ -> decltype(std::declval<OverloadType<Fs...>>()(std::declval<T0>())) {
+ return absl::visit(Overload(std::move(fs)...), value);
+}
+
+/// A version of Match that takes a mutable pointer to a variant and calls its
+/// overload callables with a mutable pointer to the current variant value.
+///
+/// Example:
+/// variant<int, string> v = 42;
+/// MatchMutable(&v,
+/// [](int* i) { *i = 1; },
+/// [](string* s) { *s = "foo"; });
+/// // v now contains 1.
+template <typename... Fs, typename T0, typename... Ts>
+auto MatchMutable(absl::variant<T0, Ts...>* value, Fs... fs)
+ -> decltype(std::declval<OverloadType<Fs...>>()(std::declval<T0*>())) {
+ return absl::visit(detail::MatchPointerExtractor<Fs...>{OverloadType<Fs...>(
+ std::move(fs)...)},
+ *value);
+}
+
+} // namespace grpc_core
+
+#endif // GRPC_CORE_LIB_GPRPP_MATCH_H
diff --git a/src/core/lib/gprpp/orphanable.h b/src/core/lib/gprpp/orphanable.h
index 2a95b9df13..b73e520198 100644
--- a/src/core/lib/gprpp/orphanable.h
+++ b/src/core/lib/gprpp/orphanable.h
@@ -72,7 +72,7 @@ inline OrphanablePtr<T> MakeOrphanable(Args&&... args) {
}
// A type of Orphanable with internal ref-counting.
-template <typename Child>
+template <typename Child, UnrefBehavior UnrefBehaviorArg = kUnrefDelete>
class InternallyRefCounted : public Orphanable {
public:
// Not copyable nor movable.
@@ -102,12 +102,12 @@ class InternallyRefCounted : public Orphanable {
void Unref() {
if (GPR_UNLIKELY(refs_.Unref())) {
- delete this;
+ internal::Delete<Child, UnrefBehaviorArg>(static_cast<Child*>(this));
}
}
void Unref(const DebugLocation& location, const char* reason) {
if (GPR_UNLIKELY(refs_.Unref(location, reason))) {
- delete this;
+ internal::Delete<Child, UnrefBehaviorArg>(static_cast<Child*>(this));
}
}
diff --git a/src/core/lib/gprpp/overload.h b/src/core/lib/gprpp/overload.h
new file mode 100644
index 0000000000..d2f7be7d9b
--- /dev/null
+++ b/src/core/lib/gprpp/overload.h
@@ -0,0 +1,59 @@
+// Copyright 2021 gRPC authors.
+//
+// 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.
+
+#ifndef GRPC_CORE_LIB_GPRPP_OVERLOAD_H
+#define GRPC_CORE_LIB_GPRPP_OVERLOAD_H
+
+#include <grpc/impl/codegen/port_platform.h>
+
+#include <utility>
+
+namespace grpc_core {
+
+template <typename... Cases>
+struct OverloadType;
+// Compose one overload with N more -- use inheritance to leverage using and the
+// empty base class optimization.
+template <typename Case, typename... Cases>
+struct OverloadType<Case, Cases...> : public Case,
+ public OverloadType<Cases...> {
+ explicit OverloadType(Case&& c, Cases&&... cases)
+ : Case(std::forward<Case>(c)),
+ OverloadType<Cases...>(std::forward<Cases>(cases)...) {}
+ using Case::operator();
+ using OverloadType<Cases...>::operator();
+};
+// Overload of a single case is just that case itself
+template <typename Case>
+struct OverloadType<Case> : public Case {
+ explicit OverloadType(Case&& c) : Case(std::forward<Case>(c)) {}
+ using Case::operator();
+};
+
+/// Compose callables into a single callable.
+/// e.g. given [](int i) { puts("a"); } and [](double d) { puts("b"); },
+/// return a callable object like:
+/// struct {
+/// void operator()(int i) { puts("a"); }
+/// void operator()(double i) { puts("b"); }
+/// };
+/// Preserves all captures.
+template <typename... Cases>
+OverloadType<Cases...> Overload(Cases... cases) {
+ return OverloadType<Cases...>(std::move(cases)...);
+}
+
+} // namespace grpc_core
+
+#endif // GRPC_CORE_LIB_GPRPP_OVERLOAD_H
diff --git a/src/core/lib/gprpp/sync.h b/src/core/lib/gprpp/sync.h
index f385883d16..d53585995c 100644
--- a/src/core/lib/gprpp/sync.h
+++ b/src/core/lib/gprpp/sync.h
@@ -19,10 +19,9 @@
#ifndef GRPC_CORE_LIB_GPRPP_SYNC_H
#define GRPC_CORE_LIB_GPRPP_SYNC_H
-#include <grpc/impl/codegen/port_platform.h>
+#include <grpc/support/port_platform.h>
-#include <grpc/impl/codegen/log.h>
-#include <grpc/impl/codegen/sync.h>
+#include <grpc/support/log.h>
#include <grpc/support/sync.h>
#include <grpc/support/time.h>
@@ -145,33 +144,6 @@ class CondVar {
#endif // GPR_ABSEIL_SYNC
-template <typename Predicate>
-static void WaitUntil(CondVar* cv, Mutex* mu, Predicate pred) {
- while (!pred()) {
- cv->Wait(mu);
- }
-}
-
-// Returns true iff we timed-out
-template <typename Predicate>
-static bool WaitUntilWithTimeout(CondVar* cv, Mutex* mu, Predicate pred,
- absl::Duration timeout) {
- while (!pred()) {
- if (cv->WaitWithTimeout(mu, timeout)) return true;
- }
- return false;
-}
-
-// Returns true iff we timed-out
-template <typename Predicate>
-static bool WaitUntilWithDeadline(CondVar* cv, Mutex* mu, Predicate pred,
- absl::Time deadline) {
- while (!pred()) {
- if (cv->WaitWithDeadline(mu, deadline)) return true;
- }
- return false;
-}
-
// Deprecated. Prefer MutexLock
class MutexLockForGprMu {
public:
diff --git a/src/core/lib/gprpp/table.h b/src/core/lib/gprpp/table.h
new file mode 100644
index 0000000000..a1de10e819
--- /dev/null
+++ b/src/core/lib/gprpp/table.h
@@ -0,0 +1,386 @@
+// Copyright 2021 gRPC authors.
+//
+// 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.
+
+#ifndef GRPC_CORE_LIB_GPRPP_TABLE_H
+#define GRPC_CORE_LIB_GPRPP_TABLE_H
+
+#include <grpc/impl/codegen/port_platform.h>
+
+#include <utility>
+#include "absl/utility/utility.h"
+#include "src/core/lib/gprpp/bitset.h"
+
+namespace grpc_core {
+
+// Meta-programming detail types to aid in building up a Table
+namespace table_detail {
+
+// A tuple-like type that contains manually constructed elements.
+template <typename... Ts>
+struct Elements;
+template <typename T, typename... Ts>
+struct Elements<T, Ts...> : Elements<Ts...> {
+ union U {
+ U() {}
+ ~U() {}
+ GPR_NO_UNIQUE_ADDRESS T x;
+ };
+ U u;
+};
+template <>
+struct Elements<> {};
+
+// Element accessor for Elements<>
+// Provides a static method f that returns a pointer to the value of element I
+// for Elements<Ts...>
+template <size_t I, typename... Ts>
+struct GetElem;
+
+template <typename T, typename... Ts>
+struct GetElem<0, T, Ts...> {
+ static T* f(Elements<T, Ts...>* e) { return &e->u.x; }
+ static const T* f(const Elements<T, Ts...>* e) { return &e->u.x; }
+};
+
+template <size_t I, typename T, typename... Ts>
+struct GetElem<I, T, Ts...> {
+ static auto f(Elements<T, Ts...>* e)
+ -> decltype(GetElem<I - 1, Ts...>::f(e)) {
+ return GetElem<I - 1, Ts...>::f(e);
+ }
+ static auto f(const Elements<T, Ts...>* e)
+ -> decltype(GetElem<I - 1, Ts...>::f(e)) {
+ return GetElem<I - 1, Ts...>::f(e);
+ }
+};
+
+// CountIncludedStruct is the backing for the CountIncluded function below.
+// Sets a member constant N to the number of times Needle is in Haystack.
+template <typename Needle, typename... Haystack>
+struct CountIncludedStruct;
+template <typename Needle, typename Straw, typename... RestOfHaystack>
+struct CountIncludedStruct<Needle, Straw, RestOfHaystack...> {
+ static constexpr size_t N =
+ static_cast<size_t>(std::is_same<Needle, Straw>::value) +
+ CountIncludedStruct<Needle, RestOfHaystack...>::N;
+};
+template <typename Needle>
+struct CountIncludedStruct<Needle> {
+ static constexpr size_t N = 0;
+};
+// Returns the number of times Needle is in Haystack.
+template <typename Needle, typename... Haystack>
+constexpr size_t CountIncluded() {
+ return CountIncludedStruct<Needle, Haystack...>::N;
+}
+
+// IndexOfStruct is the backing for IndexOf below.
+// Set a member constant N to the index of Needle in Haystack.
+// Ignored should be void always, and is used for enable_if_t.
+template <typename Ignored, typename Needle, typename... Haystack>
+struct IndexOfStruct;
+template <typename Needle, typename Straw, typename... RestOfHaystack>
+struct IndexOfStruct<absl::enable_if_t<std::is_same<Needle, Straw>::value>,
+ Needle, Straw, RestOfHaystack...> {
+ // The first element is the one we're looking for. Done.
+ static constexpr size_t N = 0;
+};
+template <typename Needle, typename Straw, typename... RestOfHaystack>
+struct IndexOfStruct<absl::enable_if_t<!std::is_same<Needle, Straw>::value>,
+ Needle, Straw, RestOfHaystack...> {
+ // The first element is not the one we're looking for, recurse looking at the
+ // tail, and sum the number of recursions.
+ static constexpr size_t N =
+ 1 + IndexOfStruct<void, Needle, RestOfHaystack...>::N;
+};
+// Return the index of Needle in Haystack.
+// Guarded by CountIncluded to ensure that the return type is unambiguous.
+// If you got here from a compiler error using Table, it's likely that you've
+// used the type-based accessor/mutators, but the type you're using is repeated
+// more than once in the Table type arguments. Consider either using the indexed
+// accessor/mutator variants, or eliminating the ambiguity in type resolution.
+template <typename Needle, typename... Haystack>
+constexpr absl::enable_if_t<CountIncluded<Needle, Haystack...>() == 1, size_t>
+IndexOf() {
+ return IndexOfStruct<void, Needle, Haystack...>::N;
+}
+
+// TypeIndexStruct is the backing for TypeIndex below.
+// Sets member type Type to the type at index I in Ts.
+// Implemented as a simple type recursion.
+template <size_t I, typename... Ts>
+struct TypeIndexStruct;
+template <typename T, typename... Ts>
+struct TypeIndexStruct<0, T, Ts...> {
+ using Type = T;
+};
+template <size_t I, typename T, typename... Ts>
+struct TypeIndexStruct<I, T, Ts...> : TypeIndexStruct<I - 1, Ts...> {};
+// TypeIndex is the type at index I in Ts.
+template <size_t I, typename... Ts>
+using TypeIndex = typename TypeIndexStruct<I, Ts...>::Type;
+
+// Helper to call the destructor of p if p is non-null.
+template <typename T>
+void DestructIfNotNull(T* p) {
+ if (p) p->~T();
+}
+
+// Helper function... just ignore the initializer list passed into it.
+// Allows doing 'statements' via parameter pack expansion in C++11 - given
+// template <typename... Ts>:
+// do_these_things({(foo<Ts>(), 1)});
+// will execute foo<T>() for each T in Ts.
+// In this example we also leverage the comma operator to make the resultant
+// type of each statement be a consistant int so that C++ type deduction works
+// as we'd like (note that in the expression (a, 1) in C++, the 'result' of the
+// expression is the value after the right-most ',' -- in this case 1, with a
+// executed as a side effect.
+template <typename T>
+void do_these_things(std::initializer_list<T>) {}
+
+} // namespace table_detail
+
+// A Table<Ts> is much like a tuple<optional<Ts>...> - a set of values that are
+// optionally present. Table efficiently packs the presence bits for size, and
+// provides a slightly more convenient interface.
+template <typename... Ts>
+class Table {
+ // Helper - TypeIndex<I> is the type at index I in Ts
+ template <size_t I>
+ using TypeIndex = table_detail::TypeIndex<I, Ts...>;
+
+ public:
+ // Construct a table with no values set.
+ Table() = default;
+ // Destruct - forwards to the Destruct member with an integer sequence so we
+ // can destruct field-wise.
+ ~Table() { Destruct(absl::make_index_sequence<sizeof...(Ts)>()); }
+
+ // Copy another table
+ Table(const Table& rhs) {
+ // Since we know all fields are clear initially, pass false for or_clear.
+ Copy<false>(absl::make_index_sequence<sizeof...(Ts)>(), rhs);
+ }
+
+ // Copy another table
+ Table& operator=(const Table& rhs) {
+ // Since we may not be all clear, pass true for or_clear to have Copy()
+ // clear newly emptied fields.
+ Copy<true>(absl::make_index_sequence<sizeof...(Ts)>(), rhs);
+ return *this;
+ }
+
+ // Move from another table
+ Table(Table&& rhs) noexcept {
+ // Since we know all fields are clear initially, pass false for or_clear.
+ Move<false>(absl::make_index_sequence<sizeof...(Ts)>(),
+ std::forward<Table>(rhs));
+ }
+
+ // Move from another table
+ Table& operator=(Table&& rhs) noexcept {
+ // Since we may not be all clear, pass true for or_clear to have Move()
+ // clear newly emptied fields.
+ Move<true>(absl::make_index_sequence<sizeof...(Ts)>(),
+ std::forward<Table>(rhs));
+ return *this;
+ }
+
+ // Check if this table has a value for type T.
+ // Only available if there exists only one T in Ts.
+ template <typename T>
+ bool has() const {
+ return has<index_of<T>()>();
+ }
+
+ // Check if this table has index I.
+ template <size_t I>
+ absl::enable_if_t < I<sizeof...(Ts), bool> has() const {
+ return present_bits_.is_set(I);
+ }
+
+ // Return the value for type T, or nullptr if it is un-set.
+ // Only available if there exists only one T in Ts.
+ template <typename T>
+ T* get() {
+ return get<index_of<T>()>();
+ }
+
+ // Return the value for type T, or nullptr if it is un-set.
+ // Only available if there exists only one T in Ts.
+ template <typename T>
+ const T* get() const {
+ return get<index_of<T>()>();
+ }
+
+ // Return the value for index I, or nullptr if it is un-set.
+ template <size_t I>
+ TypeIndex<I>* get() {
+ if (has<I>()) return element_ptr<I>();
+ return nullptr;
+ }
+
+ // Return the value for index I, or nullptr if it is un-set.
+ template <size_t I>
+ const TypeIndex<I>* get() const {
+ if (has<I>()) return element_ptr<I>();
+ return nullptr;
+ }
+
+ // Return the value for type T, default constructing it if it is un-set.
+ template <typename T>
+ T* get_or_create() {
+ return get_or_create<index_of<T>()>();
+ }
+
+ // Return the value for index I, default constructing it if it is un-set.
+ template <size_t I>
+ TypeIndex<I>* get_or_create() {
+ auto* p = element_ptr<I>();
+ if (!set_present<I>(true)) {
+ new (p) TypeIndex<I>();
+ }
+ return element_ptr<I>();
+ }
+
+ // Set the value for type T - using Args as construction arguments.
+ template <typename T, typename... Args>
+ T* set(Args&&... args) {
+ return set<index_of<T>()>(std::forward<Args>(args)...);
+ }
+
+ // Set the value for index I - using Args as construction arguments.
+ template <size_t I, typename... Args>
+ TypeIndex<I>* set(Args&&... args) {
+ auto* p = element_ptr<I>();
+ if (set_present<I>(true)) {
+ *p = TypeIndex<I>(std::forward<Args>(args)...);
+ } else {
+ new (p) TypeIndex<I>(std::forward<Args>(args)...);
+ }
+ return p;
+ }
+
+ // Clear the value for type T, leaving it un-set.
+ template <typename T>
+ void clear() {
+ clear<index_of<T>()>();
+ }
+
+ // Clear the value for index I, leaving it un-set.
+ template <size_t I>
+ void clear() {
+ if (set_present<I>(false)) {
+ using T = TypeIndex<I>;
+ element_ptr<I>()->~T();
+ }
+ }
+
+ private:
+ // Bit field for which elements of the table are set (true) or un-set (false,
+ // the default) -- one bit for each type in Ts.
+ using PresentBits = BitSet<sizeof...(Ts)>;
+ // The tuple-like backing structure for Table.
+ using Elements = table_detail::Elements<Ts...>;
+ // Extractor from Elements
+ template <size_t I>
+ using GetElem = table_detail::GetElem<I, Ts...>;
+
+ // Given a T, return the unambiguous index of it within Ts.
+ template <typename T>
+ static constexpr size_t index_of() {
+ return table_detail::IndexOf<T, Ts...>();
+ }
+
+ // Given an index, return a point to the (maybe uninitialized!) data value at
+ // index I.
+ template <size_t I>
+ TypeIndex<I>* element_ptr() {
+ return GetElem<I>::f(&elements_);
+ }
+
+ // Given an index, return a point to the (maybe uninitialized!) data value at
+ // index I.
+ template <size_t I>
+ const TypeIndex<I>* element_ptr() const {
+ return GetElem<I>::f(&elements_);
+ }
+
+ // Set the present bit to value (if true - value is present/set, if false,
+ // value is un-set). Returns the old value so that calling code can note
+ // transition edges.
+ template <size_t I>
+ bool set_present(bool value) {
+ bool out = present_bits_.is_set(I);
+ present_bits_.set(I, value);
+ return out;
+ }
+
+ // Set the value of index I to the value held in rhs index I if it is set.
+ // If it is unset, if or_clear is true, then clear our value, otherwise do
+ // nothing.
+ template <bool or_clear, size_t I>
+ void CopyIf(const Table& rhs) {
+ if (auto* p = rhs.get<I>()) {
+ set<I>(*p);
+ } else if (or_clear) {
+ clear<I>();
+ }
+ }
+
+ // Set the value of index I to the value moved from rhs index I if it was set.
+ // If it is unset, if or_clear is true, then clear our value, otherwise do
+ // nothing.
+ template <bool or_clear, size_t I>
+ void MoveIf(Table&& rhs) {
+ if (auto* p = rhs.get<I>()) {
+ set<I>(std::move(*p));
+ } else if (or_clear) {
+ clear<I>();
+ }
+ }
+
+ // For each field (element I=0, 1, ...) if that field is present, call its
+ // destructor.
+ template <size_t... I>
+ void Destruct(absl::index_sequence<I...>) {
+ table_detail::do_these_things(
+ {(table_detail::DestructIfNotNull(get<I>()), 1)...});
+ }
+
+ // For each field (element I=0, 1, ...) copy that field into this table -
+ // or_clear as per CopyIf().
+ template <bool or_clear, size_t... I>
+ void Copy(absl::index_sequence<I...>, const Table& rhs) {
+ table_detail::do_these_things({(CopyIf<or_clear, I>(rhs), 1)...});
+ }
+
+ // For each field (element I=0, 1, ...) move that field into this table -
+ // or_clear as per MoveIf().
+ template <bool or_clear, size_t... I>
+ void Move(absl::index_sequence<I...>, Table&& rhs) {
+ table_detail::do_these_things(
+ {(MoveIf<or_clear, I>(std::forward<Table>(rhs)), 1)...});
+ }
+
+ // Bit field indicating which elements are set.
+ GPR_NO_UNIQUE_ADDRESS PresentBits present_bits_;
+ // The memory to store the elements themselves.
+ GPR_NO_UNIQUE_ADDRESS Elements elements_;
+};
+
+} // namespace grpc_core
+
+#endif // GRPC_CORE_LIB_GPRPP_TABLE_H
diff --git a/src/core/lib/iomgr/buffer_list.cc b/src/core/lib/iomgr/buffer_list.cc
index f92fc9b18c..fa8c4aef78 100644
--- a/src/core/lib/iomgr/buffer_list.cc
+++ b/src/core/lib/iomgr/buffer_list.cc
@@ -190,7 +190,7 @@ void extract_opt_stats_from_cmsg(ConnectionMetrics* metrics,
static int get_socket_tcp_info(grpc_core::tcp_info* info, int fd) {
memset(info, 0, sizeof(*info));
- info->length = sizeof(*info) - sizeof(socklen_t);
+ info->length = offsetof(grpc_core::tcp_info, length);
return getsockopt(fd, IPPROTO_TCP, TCP_INFO, info, &(info->length));
}
} /* namespace */
diff --git a/src/core/lib/iomgr/ev_apple.h b/src/core/lib/iomgr/ev_apple.h
index a05f91ce15..6397ed4cf0 100644
--- a/src/core/lib/iomgr/ev_apple.h
+++ b/src/core/lib/iomgr/ev_apple.h
@@ -40,4 +40,4 @@ extern grpc_pollset_set_vtable grpc_apple_pollset_set_vtable;
#endif
-#endif
+#endif // GRPC_CORE_LIB_IOMGR_EV_APPLE_H
diff --git a/src/core/lib/iomgr/event_engine/endpoint.cc b/src/core/lib/iomgr/event_engine/endpoint.cc
index ddd9566cdc..3de39a4d27 100644
--- a/src/core/lib/iomgr/event_engine/endpoint.cc
+++ b/src/core/lib/iomgr/event_engine/endpoint.cc
@@ -59,7 +59,7 @@ void endpoint_read(grpc_endpoint* ep, grpc_slice_buffer* slices,
exec_ctx.Flush();
grpc_pollset_ee_broadcast_event();
},
- read_buffer, absl::InfiniteFuture());
+ read_buffer);
}
void endpoint_write(grpc_endpoint* ep, grpc_slice_buffer* slices,
@@ -83,7 +83,7 @@ void endpoint_write(grpc_endpoint* ep, grpc_slice_buffer* slices,
exec_ctx.Flush();
grpc_pollset_ee_broadcast_event();
},
- write_buffer, absl::InfiniteFuture());
+ write_buffer);
}
void endpoint_add_to_pollset(grpc_endpoint* /* ep */,
grpc_pollset* /* pollset */) {}
@@ -123,9 +123,8 @@ absl::string_view endpoint_get_peer(grpc_endpoint* ep) {
return "";
}
if (eeep->peer_address.empty()) {
- const EventEngine::ResolvedAddress* addr = eeep->endpoint->GetPeerAddress();
- GPR_ASSERT(addr != nullptr);
- eeep->peer_address = ResolvedAddressToURI(*addr);
+ const EventEngine::ResolvedAddress& addr = eeep->endpoint->GetPeerAddress();
+ eeep->peer_address = ResolvedAddressToURI(addr);
}
return eeep->peer_address;
}
@@ -136,10 +135,9 @@ absl::string_view endpoint_get_local_address(grpc_endpoint* ep) {
return "";
}
if (eeep->local_address.empty()) {
- const EventEngine::ResolvedAddress* addr =
+ const EventEngine::ResolvedAddress& addr =
eeep->endpoint->GetLocalAddress();
- GPR_ASSERT(addr != nullptr);
- eeep->local_address = ResolvedAddressToURI(*addr);
+ eeep->local_address = ResolvedAddressToURI(addr);
}
return eeep->local_address;
}
diff --git a/src/core/lib/iomgr/event_engine/tcp.cc b/src/core/lib/iomgr/event_engine/tcp.cc
index 2815251b16..e119dfc2c1 100644
--- a/src/core/lib/iomgr/event_engine/tcp.cc
+++ b/src/core/lib/iomgr/event_engine/tcp.cc
@@ -38,20 +38,36 @@ using ::grpc_event_engine::experimental::EventEngine;
using ::grpc_event_engine::experimental::GrpcClosureToCallback;
using ::grpc_event_engine::experimental::SliceAllocator;
using ::grpc_event_engine::experimental::SliceAllocatorFactory;
+using ::grpc_event_engine::experimental::SliceBuffer;
} // namespace
+// TODO(hork): remove these classes in PR #26643, when the iomgr APIs change to
+// accept SliceAllocators and SliceAllocatorFactory(ie)s. In the meantime, the
+// libuv work has temporary implementations as well.
+class NoopSliceAllocator : public SliceAllocator {
+ public:
+ absl::Status Allocate(size_t size, SliceBuffer* dest,
+ SliceAllocator::AllocateCallback cb) {
+ return absl::OkStatus();
+ }
+};
+
+class NoopSliceAllocatorFactory : public SliceAllocatorFactory {
+ public:
+ std::unique_ptr<SliceAllocator> CreateSliceAllocator(
+ absl::string_view peer_name) {
+ return absl::make_unique<NoopSliceAllocator>();
+ };
+};
+
struct grpc_tcp_server {
- grpc_tcp_server(std::unique_ptr<EventEngine::Listener> listener,
- grpc_resource_quota* rq)
+ explicit grpc_tcp_server(std::unique_ptr<EventEngine::Listener> listener)
: refcount(1, GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace) ? "tcp" : nullptr),
- listener(std::move(listener)),
- resource_quota(rq) {
+ listener(std::move(listener)) {
shutdown_starting.head = nullptr;
shutdown_starting.tail = nullptr;
};
~grpc_tcp_server() {
- // TODO(nnoble): see if we can handle this in ~SliceAllocatorFactory
- grpc_resource_quota_unref_internal(resource_quota);
grpc_core::ExecCtx::RunList(DEBUG_LOCATION, &shutdown_starting);
grpc_core::ExecCtx::Get()->Flush();
}
@@ -59,7 +75,6 @@ struct grpc_tcp_server {
grpc_core::Mutex mu;
std::unique_ptr<EventEngine::Listener> listener;
grpc_closure_list shutdown_starting ABSL_GUARDED_BY(mu);
- grpc_resource_quota* resource_quota;
grpc_tcp_server_cb on_accept_internal;
void* on_accept_internal_arg;
};
@@ -99,7 +114,9 @@ void tcp_connect(grpc_closure* on_connect, grpc_endpoint** endpoint,
*endpoint = &ee_endpoint->base;
EventEngine::OnConnectCallback ee_on_connect =
GrpcClosureToOnConnectCallback(on_connect, endpoint);
- SliceAllocator sa(ee_endpoint->ru);
+ // TODO(hork): tcp_connect will change to accept a SliceAllocator. This is
+ // temporary.
+ auto sa = absl::make_unique<NoopSliceAllocator>();
EventEngine::ResolvedAddress ra(reinterpret_cast<const sockaddr*>(addr->addr),
addr->len);
absl::Time ee_deadline = grpc_core::ToAbslTime(
@@ -124,6 +141,9 @@ grpc_error* tcp_server_create(grpc_closure* shutdown_complete,
if (rq == nullptr) {
rq = grpc_resource_quota_create(nullptr);
}
+ // TODO(hork): tcp_server_create will change to accept a
+ // SliceAllocatorFactory. This is temporary.
+ auto saf = absl::make_unique<NoopSliceAllocatorFactory>();
EventEngine* event_engine = grpc_iomgr_event_engine();
absl::StatusOr<std::unique_ptr<EventEngine::Listener>> listener =
event_engine->CreateListener(
@@ -144,11 +164,11 @@ grpc_error* tcp_server_create(grpc_closure* shutdown_complete,
grpc_pollset_ee_broadcast_event();
},
GrpcClosureToCallback(shutdown_complete, GRPC_ERROR_NONE),
- endpoint_config, SliceAllocatorFactory(rq));
+ endpoint_config, std::move(saf));
if (!listener.ok()) {
return absl_status_to_grpc_error(listener.status());
}
- *server = new grpc_tcp_server(std::move(*listener), rq);
+ *server = new grpc_tcp_server(std::move(*listener));
return GRPC_ERROR_NONE;
}
diff --git a/src/core/lib/iomgr/python_util.h b/src/core/lib/iomgr/python_util.h
index 10c335b174..b2f4162ca1 100644
--- a/src/core/lib/iomgr/python_util.h
+++ b/src/core/lib/iomgr/python_util.h
@@ -43,4 +43,4 @@ inline int grpc_slice_buffer_length(grpc_slice_buffer* buffer, int i) {
return GRPC_SLICE_LENGTH(buffer->slices[i]);
}
-#endif
+#endif // GRPC_CORE_LIB_IOMGR_PYTHON_UTIL_H
diff --git a/src/core/lib/iomgr/resource_quota.cc b/src/core/lib/iomgr/resource_quota.cc
index a4f4107d42..8a6a11b4bf 100644
--- a/src/core/lib/iomgr/resource_quota.cc
+++ b/src/core/lib/iomgr/resource_quota.cc
@@ -805,6 +805,8 @@ grpc_resource_user* grpc_resource_user_create(
for (int i = 0; i < GRPC_RULIST_COUNT; i++) {
resource_user->links[i].next = resource_user->links[i].prev = nullptr;
}
+ // TODO(hork): the RU should own a copy of the name. See Craig's comments on
+ // the EventEngine gRFC for justification.
if (name != nullptr) {
resource_user->name = name;
} else {
diff --git a/src/core/lib/iomgr/tcp_client_windows.cc b/src/core/lib/iomgr/tcp_client_windows.cc
index ef260cad75..1f862dede5 100644
--- a/src/core/lib/iomgr/tcp_client_windows.cc
+++ b/src/core/lib/iomgr/tcp_client_windows.cc
@@ -206,8 +206,10 @@ static void tcp_connect(grpc_closure* on_done, grpc_endpoint** endpoint,
GRPC_CLOSURE_INIT(&ac->on_connect, on_connect, ac, grpc_schedule_on_exec_ctx);
GRPC_CLOSURE_INIT(&ac->on_alarm, on_alarm, ac, grpc_schedule_on_exec_ctx);
+ gpr_mu_lock(&ac->mu);
grpc_timer_init(&ac->alarm, deadline, &ac->on_alarm);
grpc_socket_notify_on_write(socket, &ac->on_connect);
+ gpr_mu_unlock(&ac->mu);
return;
failure:
diff --git a/src/core/lib/iomgr/tcp_server_posix.cc b/src/core/lib/iomgr/tcp_server_posix.cc
index 626c2fc721..41dc88282e 100644
--- a/src/core/lib/iomgr/tcp_server_posix.cc
+++ b/src/core/lib/iomgr/tcp_server_posix.cc
@@ -405,6 +405,7 @@ static grpc_error_handle clone_port(grpc_tcp_listener* listener,
static grpc_error_handle tcp_server_add_port(grpc_tcp_server* s,
const grpc_resolved_address* addr,
int* out_port) {
+ GPR_ASSERT(addr->len <= GRPC_MAX_SOCKADDR_SIZE);
grpc_tcp_listener* sp;
grpc_resolved_address sockname_temp;
grpc_resolved_address addr6_v4mapped;
diff --git a/src/core/lib/iomgr/timer_manager.cc b/src/core/lib/iomgr/timer_manager.cc
index bf467cb5c4..317e46344c 100644
--- a/src/core/lib/iomgr/timer_manager.cc
+++ b/src/core/lib/iomgr/timer_manager.cc
@@ -250,7 +250,7 @@ static void timer_main_loop() {
gpr_log(GPR_INFO, "timers not checked: expect another thread to");
}
next = GRPC_MILLIS_INF_FUTURE;
- // fallthrough
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_TIMERS_CHECKED_AND_EMPTY:
if (!wait_until(next)) {
return;
diff --git a/src/core/lib/json/json_reader.cc b/src/core/lib/json/json_reader.cc
index 2daeadf461..295970fee3 100644
--- a/src/core/lib/json/json_reader.cc
+++ b/src/core/lib/json/json_reader.cc
@@ -347,8 +347,7 @@ JsonReader::Status JsonReader::Run() {
}
if (!SetNumber()) return Status::GRPC_JSON_PARSE_ERROR;
state_ = State::GRPC_JSON_STATE_VALUE_END;
- /* The missing break here is intentional. */
- /* fallthrough */
+ ABSL_FALLTHROUGH_INTENDED;
case State::GRPC_JSON_STATE_VALUE_END:
case State::GRPC_JSON_STATE_OBJECT_KEY_BEGIN:
diff --git a/src/core/lib/matchers/matchers.cc b/src/core/lib/matchers/matchers.cc
index 489a480800..b266176fbe 100644
--- a/src/core/lib/matchers/matchers.cc
+++ b/src/core/lib/matchers/matchers.cc
@@ -32,14 +32,12 @@ absl::StatusOr<StringMatcher> StringMatcher::Create(Type type,
absl::string_view matcher,
bool case_sensitive) {
if (type == Type::kSafeRegex) {
- RE2::Options options;
- options.set_case_sensitive(case_sensitive);
- auto regex_matcher = absl::make_unique<RE2>(std::string(matcher), options);
+ auto regex_matcher = absl::make_unique<RE2>(std::string(matcher));
if (!regex_matcher->ok()) {
return absl::InvalidArgumentError(
"Invalid regex string specified in matcher.");
}
- return StringMatcher(std::move(regex_matcher), case_sensitive);
+ return StringMatcher(std::move(regex_matcher));
} else {
return StringMatcher(type, matcher, case_sensitive);
}
@@ -49,19 +47,13 @@ StringMatcher::StringMatcher(Type type, absl::string_view matcher,
bool case_sensitive)
: type_(type), string_matcher_(matcher), case_sensitive_(case_sensitive) {}
-StringMatcher::StringMatcher(std::unique_ptr<RE2> regex_matcher,
- bool case_sensitive)
- : type_(Type::kSafeRegex),
- regex_matcher_(std::move(regex_matcher)),
- case_sensitive_(case_sensitive) {}
+StringMatcher::StringMatcher(std::unique_ptr<RE2> regex_matcher)
+ : type_(Type::kSafeRegex), regex_matcher_(std::move(regex_matcher)) {}
StringMatcher::StringMatcher(const StringMatcher& other)
: type_(other.type_), case_sensitive_(other.case_sensitive_) {
if (type_ == Type::kSafeRegex) {
- RE2::Options options;
- options.set_case_sensitive(other.case_sensitive_);
- regex_matcher_ =
- absl::make_unique<RE2>(other.regex_matcher_->pattern(), options);
+ regex_matcher_ = absl::make_unique<RE2>(other.regex_matcher_->pattern());
} else {
string_matcher_ = other.string_matcher_;
}
@@ -70,10 +62,7 @@ StringMatcher::StringMatcher(const StringMatcher& other)
StringMatcher& StringMatcher::operator=(const StringMatcher& other) {
type_ = other.type_;
if (type_ == Type::kSafeRegex) {
- RE2::Options options;
- options.set_case_sensitive(other.case_sensitive_);
- regex_matcher_ =
- absl::make_unique<RE2>(other.regex_matcher_->pattern(), options);
+ regex_matcher_ = absl::make_unique<RE2>(other.regex_matcher_->pattern());
} else {
string_matcher_ = other.string_matcher_;
}
@@ -151,9 +140,8 @@ std::string StringMatcher::ToString() const {
return absl::StrFormat("StringMatcher{contains=%s%s}", string_matcher_,
case_sensitive_ ? "" : ", case_sensitive=false");
case Type::kSafeRegex:
- return absl::StrFormat("StringMatcher{safe_regex=%s%s}",
- regex_matcher_->pattern(),
- case_sensitive_ ? "" : ", case_sensitive=false");
+ return absl::StrFormat("StringMatcher{safe_regex=%s}",
+ regex_matcher_->pattern());
default:
return "";
}
diff --git a/src/core/lib/matchers/matchers.h b/src/core/lib/matchers/matchers.h
index af2ce59bf1..fa17b41610 100644
--- a/src/core/lib/matchers/matchers.h
+++ b/src/core/lib/matchers/matchers.h
@@ -39,6 +39,7 @@ class StringMatcher {
};
// Creates StringMatcher instance. Returns error status on failure.
+ // Note: case_sensitive is ignored for type kSafeRegex.
static absl::StatusOr<StringMatcher> Create(Type type,
absl::string_view matcher,
bool case_sensitive = true);
@@ -66,7 +67,7 @@ class StringMatcher {
private:
StringMatcher(Type type, absl::string_view matcher, bool case_sensitive);
- StringMatcher(std::unique_ptr<RE2> regex_matcher, bool case_sensitive);
+ explicit StringMatcher(std::unique_ptr<RE2> regex_matcher);
Type type_ = Type::kExact;
std::string string_matcher_;
diff --git a/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc b/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc
index b4b6bf556c..6e1d9342ef 100644
--- a/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc
+++ b/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc
@@ -21,6 +21,7 @@
#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
#include <grpc/support/string_util.h>
+#include <openssl/ssl.h>
#include "src/core/lib/gprpp/stat.h"
#include "src/core/lib/slice/slice_internal.h"
@@ -364,6 +365,54 @@ FileWatcherCertificateProvider::ReadIdentityKeyCertPairFromFiles(
return absl::nullopt;
}
+absl::StatusOr<bool> PrivateKeyAndCertificateMatch(
+ absl::string_view private_key, absl::string_view cert_chain) {
+ if (private_key.empty()) {
+ return absl::InvalidArgumentError("Private key string is empty.");
+ }
+ if (cert_chain.empty()) {
+ return absl::InvalidArgumentError("Certificate string is empty.");
+ }
+ BIO* cert_bio = BIO_new_mem_buf(cert_chain.data(), cert_chain.size());
+ if (cert_bio == nullptr) {
+ return absl::InvalidArgumentError(
+ "Conversion from certificate string to BIO failed.");
+ }
+ // Reads the first cert from the cert_chain which is expected to be the leaf
+ // cert
+ X509* x509 = PEM_read_bio_X509(cert_bio, nullptr, nullptr, nullptr);
+ BIO_free(cert_bio);
+ if (x509 == nullptr) {
+ return absl::InvalidArgumentError(
+ "Conversion from PEM string to X509 failed.");
+ }
+ EVP_PKEY* public_evp_pkey = X509_get_pubkey(x509);
+ X509_free(x509);
+ if (public_evp_pkey == nullptr) {
+ return absl::InvalidArgumentError(
+ "Extraction of public key from x.509 certificate failed.");
+ }
+ BIO* private_key_bio =
+ BIO_new_mem_buf(private_key.data(), private_key.size());
+ if (private_key_bio == nullptr) {
+ EVP_PKEY_free(public_evp_pkey);
+ return absl::InvalidArgumentError(
+ "Conversion from private key string to BIO failed.");
+ }
+ EVP_PKEY* private_evp_pkey =
+ PEM_read_bio_PrivateKey(private_key_bio, nullptr, nullptr, nullptr);
+ BIO_free(private_key_bio);
+ if (private_evp_pkey == nullptr) {
+ EVP_PKEY_free(public_evp_pkey);
+ return absl::InvalidArgumentError(
+ "Conversion from PEM string to EVP_PKEY failed.");
+ }
+ bool result = EVP_PKEY_cmp(private_evp_pkey, public_evp_pkey) == 1;
+ EVP_PKEY_free(private_evp_pkey);
+ EVP_PKEY_free(public_evp_pkey);
+ return result;
+}
+
} // namespace grpc_core
/** -- Wrapper APIs declared in grpc_security.h -- **/
diff --git a/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h b/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h
index 414718d28f..d8b44f23df 100644
--- a/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h
+++ b/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h
@@ -23,6 +23,7 @@
#include <string.h>
#include "absl/container/inlined_vector.h"
+#include "absl/status/statusor.h"
#include "src/core/lib/gprpp/ref_counted.h"
#include "src/core/lib/gprpp/ref_counted_ptr.h"
@@ -133,6 +134,12 @@ class FileWatcherCertificateProvider final
std::map<std::string, WatcherInfo> watcher_info_;
};
+// Checks if the private key matches the certificate's public key.
+// Returns a not-OK status on failure, or a bool indicating
+// whether the key/cert pair matches.
+absl::StatusOr<bool> PrivateKeyAndCertificateMatch(
+ absl::string_view private_key, absl::string_view cert_chain);
+
} // namespace grpc_core
#endif // GRPC_CORE_LIB_SECURITY_CREDENTIALS_TLS_GRPC_TLS_CERTIFICATE_PROVIDER_H
diff --git a/src/core/lib/security/security_connector/tls/tls_security_connector.cc b/src/core/lib/security/security_connector/tls/tls_security_connector.cc
index ea6b42e07d..a1b90f1d48 100644
--- a/src/core/lib/security/security_connector/tls/tls_security_connector.cc
+++ b/src/core/lib/security/security_connector/tls/tls_security_connector.cc
@@ -172,9 +172,9 @@ void TlsChannelSecurityConnector::add_handshakers(
const grpc_channel_args* args, grpc_pollset_set* /*interested_parties*/,
HandshakeManager* handshake_mgr) {
MutexLock lock(&mu_);
+ tsi_handshaker* tsi_hs = nullptr;
if (client_handshaker_factory_ != nullptr) {
// Instantiate TSI handshaker.
- tsi_handshaker* tsi_hs = nullptr;
tsi_result result = tsi_ssl_client_handshaker_factory_create_handshaker(
client_handshaker_factory_,
overridden_target_name_.empty() ? target_name_.c_str()
@@ -183,16 +183,10 @@ void TlsChannelSecurityConnector::add_handshakers(
if (result != TSI_OK) {
gpr_log(GPR_ERROR, "Handshaker creation failed with error %s.",
tsi_result_to_string(result));
- return;
}
- // Create handshakers.
- handshake_mgr->Add(SecurityHandshakerCreate(tsi_hs, this, args));
- return;
}
- // TODO(ZhenLian): Implement the logic(delegation to
- // BlockOnInitialCredentialHandshaker) when certificates are not ready.
- gpr_log(GPR_ERROR, "%s not supported yet.",
- "Client BlockOnInitialCredentialHandshaker");
+ // If tsi_hs is null, this will add a failing handshaker.
+ handshake_mgr->Add(SecurityHandshakerCreate(tsi_hs, this, args));
}
void TlsChannelSecurityConnector::check_peer(
@@ -549,24 +543,18 @@ void TlsServerSecurityConnector::add_handshakers(
const grpc_channel_args* args, grpc_pollset_set* /*interested_parties*/,
HandshakeManager* handshake_mgr) {
MutexLock lock(&mu_);
+ tsi_handshaker* tsi_hs = nullptr;
if (server_handshaker_factory_ != nullptr) {
// Instantiate TSI handshaker.
- tsi_handshaker* tsi_hs = nullptr;
tsi_result result = tsi_ssl_server_handshaker_factory_create_handshaker(
server_handshaker_factory_, &tsi_hs);
if (result != TSI_OK) {
gpr_log(GPR_ERROR, "Handshaker creation failed with error %s.",
tsi_result_to_string(result));
- return;
}
- // Create handshakers.
- handshake_mgr->Add(SecurityHandshakerCreate(tsi_hs, this, args));
- return;
}
- // TODO(ZhenLian): Implement the logic(delegation to
- // BlockOnInitialCredentialHandshaker) when certificates are not ready.
- gpr_log(GPR_ERROR, "%s not supported yet.",
- "Server BlockOnInitialCredentialHandshaker");
+ // If tsi_hs is null, this will add a failing handshaker.
+ handshake_mgr->Add(SecurityHandshakerCreate(tsi_hs, this, args));
}
void TlsServerSecurityConnector::check_peer(
diff --git a/src/core/lib/security/transport/security_handshaker.cc b/src/core/lib/security/transport/security_handshaker.cc
index 6d05c97078..f464218d0d 100644
--- a/src/core/lib/security/transport/security_handshaker.cc
+++ b/src/core/lib/security/transport/security_handshaker.cc
@@ -521,10 +521,18 @@ class FailHandshaker : public Handshaker {
void Shutdown(grpc_error_handle why) override { GRPC_ERROR_UNREF(why); }
void DoHandshake(grpc_tcp_server_acceptor* /*acceptor*/,
grpc_closure* on_handshake_done,
- HandshakerArgs* /*args*/) override {
- ExecCtx::Run(DEBUG_LOCATION, on_handshake_done,
- GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "Failed to create security handshaker"));
+ HandshakerArgs* args) override {
+ grpc_error_handle error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "Failed to create security handshaker");
+ grpc_endpoint_shutdown(args->endpoint, GRPC_ERROR_REF(error));
+ grpc_endpoint_destroy(args->endpoint);
+ args->endpoint = nullptr;
+ grpc_channel_args_destroy(args->args);
+ args->args = nullptr;
+ grpc_slice_buffer_destroy_internal(args->read_buffer);
+ gpr_free(args->read_buffer);
+ args->read_buffer = nullptr;
+ ExecCtx::Run(DEBUG_LOCATION, on_handshake_done, error);
}
private:
diff --git a/src/core/lib/security/transport/server_auth_filter.cc b/src/core/lib/security/transport/server_auth_filter.cc
index 65a7e40556..4e9defd971 100644
--- a/src/core/lib/security/transport/server_auth_filter.cc
+++ b/src/core/lib/security/transport/server_auth_filter.cc
@@ -306,13 +306,6 @@ static grpc_error_handle server_auth_init_channel_elem(
GPR_ASSERT(!args->is_last);
grpc_auth_context* auth_context =
grpc_find_auth_context_in_args(args->channel_args);
- if (auth_context == nullptr) {
- grpc_error_handle error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "No authorization context found. This might be a TRANSIENT failure due "
- "to certificates not having been loaded yet.");
- gpr_log(GPR_DEBUG, "%s", grpc_error_std_string(error).c_str());
- return error;
- }
GPR_ASSERT(auth_context != nullptr);
grpc_server_credentials* creds =
grpc_find_server_credentials_in_args(args->channel_args);
diff --git a/src/core/lib/slice/slice.cc b/src/core/lib/slice/slice.cc
index 5f7e9ea0c8..7f39df166b 100644
--- a/src/core/lib/slice/slice.cc
+++ b/src/core/lib/slice/slice.cc
@@ -223,11 +223,21 @@ grpc_core::UnmanagedMemorySlice::UnmanagedMemorySlice(const char* source)
strlen(source)) {}
grpc_slice grpc_slice_from_copied_buffer(const char* source, size_t length) {
- return grpc_core::UnmanagedMemorySlice(source, length);
+ grpc_slice slice;
+ if (length <= sizeof(slice.data.inlined.bytes)) {
+ slice.refcount = nullptr;
+ slice.data.inlined.length = length;
+ } else {
+ // Create a ref-counted slice.
+ slice = grpc_core::UnmanagedMemorySlice(
+ length, grpc_core::UnmanagedMemorySlice::ForceHeapAllocation());
+ }
+ memcpy(GRPC_SLICE_START_PTR(slice), source, length);
+ return slice;
}
grpc_slice grpc_slice_from_copied_string(const char* source) {
- return grpc_core::UnmanagedMemorySlice(source, strlen(source));
+ return grpc_slice_from_copied_buffer(source, strlen(source));
}
grpc_slice grpc_slice_from_moved_buffer(grpc_core::UniquePtr<char> p,
diff --git a/src/core/lib/slice/slice_internal.h b/src/core/lib/slice/slice_internal.h
index 1cbe32baf6..21140a99eb 100644
--- a/src/core/lib/slice/slice_internal.h
+++ b/src/core/lib/slice/slice_internal.h
@@ -231,6 +231,7 @@ inline int grpc_slice_refcount::Eq(const grpc_slice& a, const grpc_slice& b) {
GPR_DEBUG_ASSERT(
(GRPC_STATIC_METADATA_INDEX(a) == GRPC_STATIC_METADATA_INDEX(b)) ==
(a.refcount == b.refcount));
+ ABSL_FALLTHROUGH_INTENDED;
case Type::INTERNED:
return a.refcount == b.refcount;
case Type::NOP:
diff --git a/src/core/lib/surface/call.cc b/src/core/lib/surface/call.cc
index fd2542e173..c6cc769c7e 100644
--- a/src/core/lib/surface/call.cc
+++ b/src/core/lib/surface/call.cc
@@ -151,6 +151,11 @@ struct grpc_call {
}
~grpc_call() {
+ for (int i = 0; i < GRPC_CONTEXT_COUNT; ++i) {
+ if (context[i].destroy) {
+ context[i].destroy(context[i].value);
+ }
+ }
gpr_free(static_cast<void*>(const_cast<char*>(final_info.error_string)));
}
@@ -554,11 +559,6 @@ static void destroy_call(void* call, grpc_error_handle /*error*/) {
for (ii = 0; ii < c->send_extra_metadata_count; ii++) {
GRPC_MDELEM_UNREF(c->send_extra_metadata[ii].md);
}
- for (i = 0; i < GRPC_CONTEXT_COUNT; i++) {
- if (c->context[i].destroy) {
- c->context[i].destroy(c->context[i].value);
- }
- }
if (c->cq) {
GRPC_CQ_INTERNAL_UNREF(c->cq, "bind");
}
@@ -1625,7 +1625,6 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops,
grpc_metadata& compression_md = call->compression_md;
compression_md.key = grpc_empty_slice();
compression_md.value = grpc_empty_slice();
- compression_md.flags = 0;
size_t additional_metadata_count = 0;
grpc_compression_level effective_compression_level =
GRPC_COMPRESS_LEVEL_NONE;
diff --git a/src/core/lib/surface/server.cc b/src/core/lib/surface/server.cc
index a8b4aaaecf..558d41a7d7 100644
--- a/src/core/lib/surface/server.cc
+++ b/src/core/lib/surface/server.cc
@@ -809,7 +809,9 @@ void Server::ShutdownAndNotify(grpc_completion_queue* cq, void* tag) {
{
// Wait for startup to be finished. Locks mu_global.
MutexLock lock(&mu_global_);
- WaitUntil(&starting_cv_, &mu_global_, [this] { return !starting_; });
+ while (starting_) {
+ starting_cv_.Wait(&mu_global_);
+ }
// Stay locked, and gather up some stuff to do.
GPR_ASSERT(grpc_cq_begin_op(cq, tag));
if (shutdown_published_) {
diff --git a/src/core/lib/surface/server.h b/src/core/lib/surface/server.h
index 413a5a8a0a..7061c427b6 100644
--- a/src/core/lib/surface/server.h
+++ b/src/core/lib/surface/server.h
@@ -416,9 +416,9 @@ class Server : public InternallyRefCounted<Server> {
Mutex mu_global_; // mutex for server and channel state
Mutex mu_call_; // mutex for call-specific state
- // startup synchronization: flag is protected by mu_global_, signals whether
- // we are doing the listener start routine or not.
- bool starting_ = false;
+ // startup synchronization: flag, signals whether we are doing the listener
+ // start routine or not.
+ bool starting_ ABSL_GUARDED_BY(mu_global_) = false;
CondVar starting_cv_;
std::vector<std::unique_ptr<RegisteredMethod>> registered_methods_;
diff --git a/src/core/lib/surface/version.cc b/src/core/lib/surface/version.cc
index e0c0ac7ac1..683b43645b 100644
--- a/src/core/lib/surface/version.cc
+++ b/src/core/lib/surface/version.cc
@@ -25,6 +25,4 @@
const char* grpc_version_string(void) { return "18.0.0"; }
-const char* grpc_g_stands_for(void) {
- return "guadalupe_river_park_conservancy";
-}
+const char* grpc_g_stands_for(void) { return "guileless"; }
diff --git a/src/core/lib/transport/metadata_batch.cc b/src/core/lib/transport/metadata_batch.cc
index e85b476ca4..8207fb5ee5 100644
--- a/src/core/lib/transport/metadata_batch.cc
+++ b/src/core/lib/transport/metadata_batch.cc
@@ -401,9 +401,20 @@ void grpc_metadata_batch_copy(grpc_metadata_batch* src,
size_t i = 0;
for (grpc_linked_mdelem* elem = src->list.head; elem != nullptr;
elem = elem->next) {
+ // If the mdelem is not external, take a ref.
+ // Otherwise, create a new copy, holding its own refs to the
+ // underlying slices.
+ grpc_mdelem md;
+ if (GRPC_MDELEM_STORAGE(elem->md) != GRPC_MDELEM_STORAGE_EXTERNAL) {
+ md = GRPC_MDELEM_REF(elem->md);
+ } else {
+ md = grpc_mdelem_from_slices(
+ grpc_slice_ref_internal(GRPC_MDKEY(elem->md)),
+ grpc_slice_ref_internal(GRPC_MDVALUE(elem->md)));
+ }
// Error unused in non-debug builds.
- grpc_error_handle GRPC_UNUSED error = grpc_metadata_batch_add_tail(
- dst, &storage[i++], GRPC_MDELEM_REF(elem->md));
+ grpc_error_handle GRPC_UNUSED error =
+ grpc_metadata_batch_add_tail(dst, &storage[i++], md);
// The only way that grpc_metadata_batch_add_tail() can fail is if
// there's a duplicate entry for a callout. However, that can't be
// the case here, because we would not have been allowed to create
diff --git a/src/core/lib/transport/metadata_batch.h b/src/core/lib/transport/metadata_batch.h
index b72859fcf2..986d030c86 100644
--- a/src/core/lib/transport/metadata_batch.h
+++ b/src/core/lib/transport/metadata_batch.h
@@ -196,6 +196,13 @@ void grpc_metadata_batch_assert_ok(grpc_metadata_batch* batch);
/// Copies \a src to \a dst. \a storage must point to an array of
/// \a grpc_linked_mdelem structs of at least the same size as \a src.
+///
+/// For each mdelem in \a src, if the mdelem is of storage types
+/// GRPC_MDELEM_STORAGE_INTERNED or GRPC_MDELEM_STORAGE_ALLOCATED,
+/// refs the original mdelem for the copy. Otherwise, makes a new
+/// mdelem that will hold its own refs to the key and value slices.
+///
+/// Currently used only in the retry code.
void grpc_metadata_batch_copy(grpc_metadata_batch* src,
grpc_metadata_batch* dst,
grpc_linked_mdelem* storage);
diff --git a/src/cpp/Protobuf-C++.podspec b/src/cpp/Protobuf-C++.podspec
index 7b239a6b2b..7da23778e0 100644
--- a/src/cpp/Protobuf-C++.podspec
+++ b/src/cpp/Protobuf-C++.podspec
@@ -2,12 +2,12 @@ Pod::Spec.new do |s|
s.name = 'Protobuf-C++'
s.version = '3.15.8'
s.summary = 'Protocol Buffers v3 runtime library for C++.'
- s.homepage = 'https://github.com/google/protobuf'
+ s.homepage = 'https://github.com/protocolbuffers/protobuf'
s.license = '3-Clause BSD License'
s.authors = { 'The Protocol Buffers contributors' => 'protobuf@googlegroups.com' }
s.cocoapods_version = '>= 1.0'
- s.source = { :git => 'https://github.com/google/protobuf.git',
+ s.source = { :git => 'https://github.com/protocolbuffers/protobuf.git',
:tag => "v#{s.version}" }
s.source_files = 'src/google/protobuf/*.{h,cc,inc}',
diff --git a/src/cpp/README.md b/src/cpp/README.md
index bb825ebc8a..4b357a7522 100755
--- a/src/cpp/README.md
+++ b/src/cpp/README.md
@@ -122,6 +122,13 @@ first install gRPC C++ using CMake, and have your non-CMake project rely on the
`pkgconfig` files which are provided by gRPC installation.
[Example](../../test/distrib/cpp/run_distrib_test_cmake_pkgconfig.sh)
+**Note for CentOS 7 users**
+
+CentOS-7 ships with `pkg-config` 0.27.1, which has a
+[bug](https://bugs.freedesktop.org/show_bug.cgi?id=54716) that can make
+invocations take extremely long to complete. If you plan to use `pkg-config`,
+you'll want to upgrade it to something newer.
+
## make (deprecated)
The default choice for building on UNIX based systems used to be `make`, but we are no longer recommending it.
diff --git a/src/cpp/client/secure_credentials.cc b/src/cpp/client/secure_credentials.cc
index be99d54272..e743165c51 100644
--- a/src/cpp/client/secure_credentials.cc
+++ b/src/cpp/client/secure_credentials.cc
@@ -492,7 +492,6 @@ void MetadataCredentialsPluginWrapper::InvokePlugin(
grpc_metadata md_entry;
md_entry.key = SliceFromCopiedString(metadatum.first);
md_entry.value = SliceFromCopiedString(metadatum.second);
- md_entry.flags = 0;
md.push_back(md_entry);
}
if (creds_md != nullptr) {
@@ -507,7 +506,6 @@ void MetadataCredentialsPluginWrapper::InvokePlugin(
for (const auto& elem : md) {
creds_md[*num_creds_md].key = elem.key;
creds_md[*num_creds_md].value = elem.value;
- creds_md[*num_creds_md].flags = elem.flags;
++(*num_creds_md);
}
*status_code = static_cast<grpc_status_code>(status.error_code());
diff --git a/src/cpp/common/version_cc.cc b/src/cpp/common/version_cc.cc
index 99e0909905..8248a1c171 100644
--- a/src/cpp/common/version_cc.cc
+++ b/src/cpp/common/version_cc.cc
@@ -22,5 +22,5 @@
#include <grpcpp/grpcpp.h>
namespace grpc {
-std::string Version() { return "1.39.1"; }
+std::string Version() { return "1.40.0"; }
} // namespace grpc
diff --git a/src/cpp/ext/filters/census/client_filter.cc b/src/cpp/ext/filters/census/client_filter.cc
index 380ad5b549..362ea52925 100644
--- a/src/cpp/ext/filters/census/client_filter.cc
+++ b/src/cpp/ext/filters/census/client_filter.cc
@@ -27,6 +27,7 @@
#include "absl/strings/str_cat.h"
#include "absl/strings/string_view.h"
#include "opencensus/stats/stats.h"
+#include "opencensus/tags/context_util.h"
#include "opencensus/tags/tag_key.h"
#include "opencensus/tags/tag_map.h"
#include "src/core/lib/surface/call.h"
@@ -35,8 +36,88 @@
namespace grpc {
-constexpr uint32_t CensusClientCallData::kMaxTraceContextLen;
-constexpr uint32_t CensusClientCallData::kMaxTagsLen;
+constexpr uint32_t
+ OpenCensusCallTracer::OpenCensusCallAttemptTracer::kMaxTraceContextLen;
+constexpr uint32_t
+ OpenCensusCallTracer::OpenCensusCallAttemptTracer::kMaxTagsLen;
+
+grpc_error_handle CensusClientCallData::Init(
+ grpc_call_element* /* elem */, const grpc_call_element_args* args) {
+ auto tracer = args->arena->New<OpenCensusCallTracer>(args);
+ GPR_DEBUG_ASSERT(args->context[GRPC_CONTEXT_CALL_TRACER].value == nullptr);
+ args->context[GRPC_CONTEXT_CALL_TRACER].value = tracer;
+ args->context[GRPC_CONTEXT_CALL_TRACER].destroy = [](void* tracer) {
+ (static_cast<OpenCensusCallTracer*>(tracer))->~OpenCensusCallTracer();
+ };
+ return GRPC_ERROR_NONE;
+}
+
+//
+// OpenCensusCallTracer::OpenCensusCallAttemptTracer
+//
+
+namespace {
+
+CensusContext CreateCensusContextForCallAttempt(
+ absl::string_view method, const CensusContext& parent_context) {
+ GPR_DEBUG_ASSERT(parent_context.Context().IsValid());
+ return CensusContext(absl::StrCat("Attempt.", method), &parent_context.Span(),
+ parent_context.tags());
+}
+
+} // namespace
+
+OpenCensusCallTracer::OpenCensusCallAttemptTracer::OpenCensusCallAttemptTracer(
+ OpenCensusCallTracer* parent, uint64_t attempt_num,
+ bool is_transparent_retry, bool arena_allocated)
+ : parent_(parent),
+ arena_allocated_(arena_allocated),
+ context_(CreateCensusContextForCallAttempt(parent_->method_,
+ parent_->context_)),
+ start_time_(absl::Now()) {
+ context_.AddSpanAttribute("previous-rpc-attempts", attempt_num);
+ context_.AddSpanAttribute("transparent-retry", is_transparent_retry);
+ memset(&stats_bin_, 0, sizeof(grpc_linked_mdelem));
+ memset(&tracing_bin_, 0, sizeof(grpc_linked_mdelem));
+}
+
+void OpenCensusCallTracer::OpenCensusCallAttemptTracer::
+ RecordSendInitialMetadata(grpc_metadata_batch* send_initial_metadata,
+ uint32_t /* flags */) {
+ size_t tracing_len = TraceContextSerialize(context_.Context(), tracing_buf_,
+ kMaxTraceContextLen);
+ if (tracing_len > 0) {
+ GRPC_LOG_IF_ERROR(
+ "census grpc_filter",
+ grpc_metadata_batch_add_tail(
+ send_initial_metadata, &tracing_bin_,
+ grpc_mdelem_from_slices(
+ GRPC_MDSTR_GRPC_TRACE_BIN,
+ grpc_core::UnmanagedMemorySlice(tracing_buf_, tracing_len)),
+ GRPC_BATCH_GRPC_TRACE_BIN));
+ }
+ grpc_slice tags = grpc_empty_slice();
+ // TODO(unknown): Add in tagging serialization.
+ size_t encoded_tags_len = StatsContextSerialize(kMaxTagsLen, &tags);
+ if (encoded_tags_len > 0) {
+ GRPC_LOG_IF_ERROR(
+ "census grpc_filter",
+ grpc_metadata_batch_add_tail(
+ send_initial_metadata, &stats_bin_,
+ grpc_mdelem_from_slices(GRPC_MDSTR_GRPC_TAGS_BIN, tags),
+ GRPC_BATCH_GRPC_TAGS_BIN));
+ }
+}
+
+void OpenCensusCallTracer::OpenCensusCallAttemptTracer::RecordSendMessage(
+ const grpc_core::ByteStream& /* send_message */) {
+ ++sent_message_count_;
+}
+
+void OpenCensusCallTracer::OpenCensusCallAttemptTracer::RecordReceivedMessage(
+ const grpc_core::ByteStream& /* recv_message */) {
+ ++recv_message_count_;
+}
namespace {
@@ -53,134 +134,122 @@ void FilterTrailingMetadata(grpc_metadata_batch* b, uint64_t* elapsed_time) {
} // namespace
-void CensusClientCallData::OnDoneRecvTrailingMetadataCb(
- void* user_data, grpc_error_handle error) {
- grpc_call_element* elem = reinterpret_cast<grpc_call_element*>(user_data);
- CensusClientCallData* calld =
- reinterpret_cast<CensusClientCallData*>(elem->call_data);
- GPR_ASSERT(calld != nullptr);
- if (error == GRPC_ERROR_NONE) {
- GPR_ASSERT(calld->recv_trailing_metadata_ != nullptr);
- FilterTrailingMetadata(calld->recv_trailing_metadata_,
- &calld->elapsed_time_);
- }
- grpc_core::Closure::Run(DEBUG_LOCATION,
- calld->initial_on_done_recv_trailing_metadata_,
- GRPC_ERROR_REF(error));
+void OpenCensusCallTracer::OpenCensusCallAttemptTracer::
+ RecordReceivedTrailingMetadata(
+ absl::Status status, grpc_metadata_batch* recv_trailing_metadata,
+ const grpc_transport_stream_stats& transport_stream_stats) {
+ FilterTrailingMetadata(recv_trailing_metadata, &elapsed_time_);
+ const uint64_t request_size = transport_stream_stats.outgoing.data_bytes;
+ const uint64_t response_size = transport_stream_stats.incoming.data_bytes;
+ std::vector<std::pair<opencensus::tags::TagKey, std::string>> tags =
+ context_.tags().tags();
+ tags.emplace_back(ClientMethodTagKey(), std::string(parent_->method_));
+ status_code_ = status.code();
+ std::string final_status = absl::StatusCodeToString(status_code_);
+ tags.emplace_back(ClientStatusTagKey(), final_status);
+ ::opencensus::stats::Record(
+ {{RpcClientSentBytesPerRpc(), static_cast<double>(request_size)},
+ {RpcClientReceivedBytesPerRpc(), static_cast<double>(response_size)},
+ {RpcClientServerLatency(),
+ ToDoubleMilliseconds(absl::Nanoseconds(elapsed_time_))}},
+ tags);
}
-void CensusClientCallData::OnDoneRecvMessageCb(void* user_data,
- grpc_error_handle error) {
- grpc_call_element* elem = reinterpret_cast<grpc_call_element*>(user_data);
- CensusClientCallData* calld =
- reinterpret_cast<CensusClientCallData*>(elem->call_data);
- CensusChannelData* channeld =
- reinterpret_cast<CensusChannelData*>(elem->channel_data);
- GPR_ASSERT(calld != nullptr);
- GPR_ASSERT(channeld != nullptr);
- // Stream messages are no longer valid after receiving trailing metadata.
- if ((*calld->recv_message_) != nullptr) {
- calld->recv_message_count_++;
- }
- grpc_core::Closure::Run(DEBUG_LOCATION, calld->initial_on_done_recv_message_,
- GRPC_ERROR_REF(error));
+void OpenCensusCallTracer::OpenCensusCallAttemptTracer::RecordCancel(
+ grpc_error_handle cancel_error) {
+ status_code_ = absl::StatusCode::kCancelled;
+ GRPC_ERROR_UNREF(cancel_error);
}
-void CensusClientCallData::StartTransportStreamOpBatch(
- grpc_call_element* elem, TransportStreamOpBatch* op) {
- if (op->send_initial_metadata() != nullptr) {
- census_context* ctxt = op->get_census_context();
- GenerateClientContext(
- qualified_method_, &context_,
- (ctxt == nullptr) ? nullptr : reinterpret_cast<CensusContext*>(ctxt));
- size_t tracing_len = TraceContextSerialize(context_.Context(), tracing_buf_,
- kMaxTraceContextLen);
- if (tracing_len > 0) {
- GRPC_LOG_IF_ERROR(
- "census grpc_filter",
- grpc_metadata_batch_add_tail(
- op->send_initial_metadata()->batch(), &tracing_bin_,
- grpc_mdelem_from_slices(
- GRPC_MDSTR_GRPC_TRACE_BIN,
- grpc_core::UnmanagedMemorySlice(tracing_buf_, tracing_len)),
- GRPC_BATCH_GRPC_TRACE_BIN));
- }
- grpc_slice tags = grpc_empty_slice();
- // TODO(unknown): Add in tagging serialization.
- size_t encoded_tags_len = StatsContextSerialize(kMaxTagsLen, &tags);
- if (encoded_tags_len > 0) {
- GRPC_LOG_IF_ERROR(
- "census grpc_filter",
- grpc_metadata_batch_add_tail(
- op->send_initial_metadata()->batch(), &stats_bin_,
- grpc_mdelem_from_slices(GRPC_MDSTR_GRPC_TAGS_BIN, tags),
- GRPC_BATCH_GRPC_TAGS_BIN));
- }
- }
-
- if (op->send_message() != nullptr) {
- ++sent_message_count_;
+void OpenCensusCallTracer::OpenCensusCallAttemptTracer::RecordEnd(
+ const gpr_timespec& /* latency */) {
+ double latency_ms = absl::ToDoubleMilliseconds(absl::Now() - start_time_);
+ std::vector<std::pair<opencensus::tags::TagKey, std::string>> tags =
+ context_.tags().tags();
+ tags.emplace_back(ClientMethodTagKey(), std::string(parent_->method_));
+ tags.emplace_back(ClientStatusTagKey(), StatusCodeToString(status_code_));
+ ::opencensus::stats::Record(
+ {{RpcClientRoundtripLatency(), latency_ms},
+ {RpcClientSentMessagesPerRpc(), sent_message_count_},
+ {RpcClientReceivedMessagesPerRpc(), recv_message_count_}},
+ tags);
+ if (status_code_ != absl::StatusCode::kOk) {
+ context_.Span().SetStatus(opencensus::trace::StatusCode(status_code_),
+ StatusCodeToString(status_code_));
}
- if (op->recv_message() != nullptr) {
- recv_message_ = op->op()->payload->recv_message.recv_message;
- initial_on_done_recv_message_ =
- op->op()->payload->recv_message.recv_message_ready;
- op->op()->payload->recv_message.recv_message_ready = &on_done_recv_message_;
+ context_.EndSpan();
+ grpc_core::MutexLock lock(&parent_->mu_);
+ if (--parent_->num_active_rpcs_ == 0) {
+ parent_->time_at_last_attempt_end_ = absl::Now();
}
- if (op->recv_trailing_metadata() != nullptr) {
- recv_trailing_metadata_ = op->recv_trailing_metadata()->batch();
- initial_on_done_recv_trailing_metadata_ =
- op->op()->payload->recv_trailing_metadata.recv_trailing_metadata_ready;
- op->op()->payload->recv_trailing_metadata.recv_trailing_metadata_ready =
- &on_done_recv_trailing_metadata_;
+ if (arena_allocated_) {
+ this->~OpenCensusCallAttemptTracer();
+ } else {
+ delete this;
}
- // Call next op.
- grpc_call_next_op(elem, op->op());
}
-grpc_error_handle CensusClientCallData::Init(
- grpc_call_element* elem, const grpc_call_element_args* args) {
- path_ = grpc_slice_ref_internal(args->path);
- start_time_ = absl::Now();
- method_ = GetMethod(&path_);
- qualified_method_ = absl::StrCat("Sent.", method_);
- GRPC_CLOSURE_INIT(&on_done_recv_message_, OnDoneRecvMessageCb, elem,
- grpc_schedule_on_exec_ctx);
- GRPC_CLOSURE_INIT(&on_done_recv_trailing_metadata_,
- OnDoneRecvTrailingMetadataCb, elem,
- grpc_schedule_on_exec_ctx);
- return GRPC_ERROR_NONE;
-}
+//
+// OpenCensusCallTracer
+//
-void CensusClientCallData::Destroy(grpc_call_element* /*elem*/,
- const grpc_call_final_info* final_info,
- grpc_closure* /*then_call_closure*/) {
- const uint64_t request_size = GetOutgoingDataSize(final_info);
- const uint64_t response_size = GetIncomingDataSize(final_info);
- double latency_ms = absl::ToDoubleMilliseconds(absl::Now() - start_time_);
+OpenCensusCallTracer::OpenCensusCallTracer(const grpc_call_element_args* args)
+ : call_context_(args->context),
+ path_(grpc_slice_ref_internal(args->path)),
+ method_(GetMethod(&path_)),
+ arena_(args->arena) {}
+
+OpenCensusCallTracer::~OpenCensusCallTracer() {
std::vector<std::pair<opencensus::tags::TagKey, std::string>> tags =
context_.tags().tags();
- std::string method = absl::StrCat(method_);
- tags.emplace_back(ClientMethodTagKey(), method);
- std::string final_status =
- absl::StrCat(StatusCodeToString(final_info->final_status));
- tags.emplace_back(ClientStatusTagKey(), final_status);
+ tags.emplace_back(ClientMethodTagKey(), std::string(method_));
::opencensus::stats::Record(
- {{RpcClientSentBytesPerRpc(), static_cast<double>(request_size)},
- {RpcClientReceivedBytesPerRpc(), static_cast<double>(response_size)},
- {RpcClientRoundtripLatency(), latency_ms},
- {RpcClientServerLatency(),
- ToDoubleMilliseconds(absl::Nanoseconds(elapsed_time_))},
- {RpcClientSentMessagesPerRpc(), sent_message_count_},
- {RpcClientReceivedMessagesPerRpc(), recv_message_count_}},
+ {{RpcClientRetriesPerCall(), retries_ - 1}, // exclude first attempt
+ {RpcClientTransparentRetriesPerCall(), transparent_retries_},
+ {RpcClientRetryDelayPerCall(), ToDoubleMilliseconds(retry_delay_)}},
tags);
grpc_slice_unref_internal(path_);
- if (final_info->final_status != GRPC_STATUS_OK) {
- // TODO(unknown): Map grpc_status_code to trace::StatusCode.
- context_.Span().SetStatus(opencensus::trace::StatusCode::UNKNOWN,
- StatusCodeToString(final_info->final_status));
+}
+
+OpenCensusCallTracer::OpenCensusCallAttemptTracer*
+OpenCensusCallTracer::StartNewAttempt(bool is_transparent_retry) {
+ // We allocate the first attempt on the arena and all subsequent attempts on
+ // the heap, so that in the common case we don't require a heap allocation,
+ // nor do we unnecessarily grow the arena.
+ bool is_first_attempt = true;
+ uint64_t attempt_num;
+ {
+ grpc_core::MutexLock lock(&mu_);
+ if (transparent_retries_ != 0 || retries_ != 0) {
+ is_first_attempt = false;
+ if (num_active_rpcs_ == 0) {
+ retry_delay_ += absl::Now() - time_at_last_attempt_end_;
+ }
+ }
+ attempt_num = retries_;
+ if (is_transparent_retry) {
+ ++transparent_retries_;
+ } else {
+ ++retries_;
+ }
+ ++num_active_rpcs_;
}
- context_.EndSpan();
+ if (is_first_attempt) {
+ // Note that we are generating the overall call context here instead of in
+ // the constructor of `OpenCensusCallTracer` due to the semantics of
+ // `grpc_census_call_set_context` which allows the application to set the
+ // census context for a call anytime before the first call to
+ // `grpc_call_start_batch`.
+ auto* parent_context = reinterpret_cast<CensusContext*>(
+ call_context_[GRPC_CONTEXT_TRACING].value);
+ GenerateClientContext(
+ absl::StrCat("Sent.", method_), &context_,
+ (parent_context == nullptr) ? nullptr : parent_context);
+ return arena_->New<OpenCensusCallAttemptTracer>(
+ this, attempt_num, is_transparent_retry, true /* arena_allocated */);
+ }
+ return new OpenCensusCallAttemptTracer(
+ this, attempt_num, is_transparent_retry, false /* arena_allocated */);
}
} // namespace grpc
diff --git a/src/cpp/ext/filters/census/client_filter.h b/src/cpp/ext/filters/census/client_filter.h
index f55a4b5cdc..ea90cad31e 100644
--- a/src/cpp/ext/filters/census/client_filter.h
+++ b/src/cpp/ext/filters/census/client_filter.h
@@ -24,7 +24,7 @@
#include "absl/strings/string_view.h"
#include "absl/time/time.h"
#include "src/cpp/ext/filters/census/channel_filter.h"
-#include "src/cpp/ext/filters/census/context.h"
+#include "src/cpp/ext/filters/census/open_census_call_tracer.h"
namespace grpc {
@@ -34,71 +34,8 @@ namespace grpc {
// a call at a time.
class CensusClientCallData : public CallData {
public:
- // Maximum size of trace context is sent on the wire.
- static constexpr uint32_t kMaxTraceContextLen = 64;
- // Maximum size of tags that are sent on the wire.
- static constexpr uint32_t kMaxTagsLen = 2048;
-
- CensusClientCallData()
- : recv_trailing_metadata_(nullptr),
- initial_on_done_recv_trailing_metadata_(nullptr),
- initial_on_done_recv_message_(nullptr),
- elapsed_time_(0),
- recv_message_(nullptr),
- recv_message_count_(0),
- sent_message_count_(0) {
- memset(&stats_bin_, 0, sizeof(grpc_linked_mdelem));
- memset(&tracing_bin_, 0, sizeof(grpc_linked_mdelem));
- memset(&path_, 0, sizeof(grpc_slice));
- memset(&on_done_recv_trailing_metadata_, 0, sizeof(grpc_closure));
- memset(&on_done_recv_message_, 0, sizeof(grpc_closure));
- }
-
- grpc_error_handle Init(grpc_call_element* elem,
+ grpc_error_handle Init(grpc_call_element* /* elem */,
const grpc_call_element_args* args) override;
-
- void Destroy(grpc_call_element* elem, const grpc_call_final_info* final_info,
- grpc_closure* then_call_closure) override;
-
- void StartTransportStreamOpBatch(grpc_call_element* elem,
- TransportStreamOpBatch* op) override;
-
- static void OnDoneRecvTrailingMetadataCb(void* user_data,
- grpc_error_handle error);
-
- static void OnDoneSendInitialMetadataCb(void* user_data,
- grpc_error_handle error);
-
- static void OnDoneRecvMessageCb(void* user_data, grpc_error_handle error);
-
- private:
- CensusContext context_;
- // Metadata elements for tracing and census stats data.
- grpc_linked_mdelem stats_bin_;
- grpc_linked_mdelem tracing_bin_;
- // Client method.
- absl::string_view method_;
- std::string qualified_method_;
- grpc_slice path_;
- // The recv trailing metadata callbacks.
- grpc_metadata_batch* recv_trailing_metadata_;
- grpc_closure* initial_on_done_recv_trailing_metadata_;
- grpc_closure on_done_recv_trailing_metadata_;
- // recv message
- grpc_closure* initial_on_done_recv_message_;
- grpc_closure on_done_recv_message_;
- // Start time (for measuring latency).
- absl::Time start_time_;
- // Server elapsed time in nanoseconds.
- uint64_t elapsed_time_;
- // The received message--may be null.
- grpc_core::OrphanablePtr<grpc_core::ByteStream>* recv_message_;
- // Number of messages in this RPC.
- uint64_t recv_message_count_;
- uint64_t sent_message_count_;
- // Buffer needed for grpc_slice to reference when adding trace context
- // metatdata to outgoing message.
- char tracing_buf_[kMaxTraceContextLen];
};
} // namespace grpc
diff --git a/src/cpp/ext/filters/census/context.h b/src/cpp/ext/filters/census/context.h
index 67f5704a62..668e5ecb0a 100644
--- a/src/cpp/ext/filters/census/context.h
+++ b/src/cpp/ext/filters/census/context.h
@@ -64,6 +64,11 @@ class CensusContext {
name, parent_ctxt)),
tags_({}) {}
+ void AddSpanAttribute(absl::string_view key,
+ opencensus::trace::AttributeValueRef attribute) {
+ span_.AddAttribute(key, attribute);
+ }
+
const ::opencensus::trace::Span& Span() const { return span_; }
const ::opencensus::tags::TagMap& tags() const { return tags_; }
diff --git a/src/cpp/ext/filters/census/grpc_plugin.cc b/src/cpp/ext/filters/census/grpc_plugin.cc
index 09788a615e..f16eb526ad 100644
--- a/src/cpp/ext/filters/census/grpc_plugin.cc
+++ b/src/cpp/ext/filters/census/grpc_plugin.cc
@@ -47,6 +47,9 @@ void RegisterOpenCensusPlugin() {
RpcClientServerLatency();
RpcClientSentMessagesPerRpc();
RpcClientReceivedMessagesPerRpc();
+ RpcClientRetriesPerCall();
+ RpcClientTransparentRetriesPerCall();
+ RpcClientRetryDelayPerCall();
RpcServerSentBytesPerRpc();
RpcServerReceivedBytesPerRpc();
@@ -112,6 +115,16 @@ ABSL_CONST_INIT const absl::string_view kRpcClientRoundtripLatencyMeasureName =
ABSL_CONST_INIT const absl::string_view kRpcClientServerLatencyMeasureName =
"grpc.io/client/server_latency";
+ABSL_CONST_INIT const absl::string_view kRpcClientRetriesPerCallMeasureName =
+ "grpc.io/client/retries_per_call";
+
+ABSL_CONST_INIT const absl::string_view
+ kRpcClientTransparentRetriesPerCallMeasureName =
+ "grpc.io/client/transparent_retries_per_call";
+
+ABSL_CONST_INIT const absl::string_view kRpcClientRetryDelayPerCallMeasureName =
+ "grpc.io/client/retry_delay_per_call";
+
// Server
ABSL_CONST_INIT const absl::string_view
kRpcServerSentMessagesPerRpcMeasureName =
diff --git a/src/cpp/ext/filters/census/grpc_plugin.h b/src/cpp/ext/filters/census/grpc_plugin.h
index 1fb7c90400..83c135bfbb 100644
--- a/src/cpp/ext/filters/census/grpc_plugin.h
+++ b/src/cpp/ext/filters/census/grpc_plugin.h
@@ -42,6 +42,9 @@ extern const absl::string_view kRpcClientReceivedMessagesPerRpcMeasureName;
extern const absl::string_view kRpcClientReceivedBytesPerRpcMeasureName;
extern const absl::string_view kRpcClientRoundtripLatencyMeasureName;
extern const absl::string_view kRpcClientServerLatencyMeasureName;
+extern const absl::string_view kRpcClientRetriesPerCallMeasureName;
+extern const absl::string_view kRpcClientTransparentRetriesPerCallMeasureName;
+extern const absl::string_view kRpcClientRetryDelayPerCallMeasureName;
extern const absl::string_view kRpcServerSentMessagesPerRpcMeasureName;
extern const absl::string_view kRpcServerSentBytesPerRpcMeasureName;
@@ -59,6 +62,12 @@ ClientReceivedBytesPerRpcCumulative();
const ::opencensus::stats::ViewDescriptor& ClientRoundtripLatencyCumulative();
const ::opencensus::stats::ViewDescriptor& ClientServerLatencyCumulative();
const ::opencensus::stats::ViewDescriptor& ClientCompletedRpcsCumulative();
+const ::opencensus::stats::ViewDescriptor& ClientRetriesPerCallCumulative();
+const ::opencensus::stats::ViewDescriptor& ClientRetriesCumulative();
+const ::opencensus::stats::ViewDescriptor&
+ClientTransparentRetriesPerCallCumulative();
+const ::opencensus::stats::ViewDescriptor& ClientTransparentRetriesCumulative();
+const ::opencensus::stats::ViewDescriptor& ClientRetryDelayPerCallCumulative();
const ::opencensus::stats::ViewDescriptor& ServerSentBytesPerRpcCumulative();
const ::opencensus::stats::ViewDescriptor&
@@ -77,6 +86,12 @@ const ::opencensus::stats::ViewDescriptor& ClientReceivedBytesPerRpcMinute();
const ::opencensus::stats::ViewDescriptor& ClientRoundtripLatencyMinute();
const ::opencensus::stats::ViewDescriptor& ClientServerLatencyMinute();
const ::opencensus::stats::ViewDescriptor& ClientCompletedRpcsMinute();
+const ::opencensus::stats::ViewDescriptor& ClientRetriesPerCallMinute();
+const ::opencensus::stats::ViewDescriptor& ClientRetriesMinute();
+const ::opencensus::stats::ViewDescriptor&
+ClientTransparentRetriesPerCallMinute();
+const ::opencensus::stats::ViewDescriptor& ClientTransparentRetriesMinute();
+const ::opencensus::stats::ViewDescriptor& ClientRetryDelayPerCallMinute();
const ::opencensus::stats::ViewDescriptor& ServerSentMessagesPerRpcMinute();
const ::opencensus::stats::ViewDescriptor& ServerSentBytesPerRpcMinute();
@@ -92,6 +107,12 @@ const ::opencensus::stats::ViewDescriptor& ClientReceivedBytesPerRpcHour();
const ::opencensus::stats::ViewDescriptor& ClientRoundtripLatencyHour();
const ::opencensus::stats::ViewDescriptor& ClientServerLatencyHour();
const ::opencensus::stats::ViewDescriptor& ClientCompletedRpcsHour();
+const ::opencensus::stats::ViewDescriptor& ClientRetriesPerCallHour();
+const ::opencensus::stats::ViewDescriptor& ClientRetriesHour();
+const ::opencensus::stats::ViewDescriptor&
+ClientTransparentRetriesPerCallHour();
+const ::opencensus::stats::ViewDescriptor& ClientTransparentRetriesHour();
+const ::opencensus::stats::ViewDescriptor& ClientRetryDelayPerCallHour();
const ::opencensus::stats::ViewDescriptor& ServerSentMessagesPerRpcHour();
const ::opencensus::stats::ViewDescriptor& ServerSentBytesPerRpcHour();
diff --git a/src/cpp/ext/filters/census/measures.cc b/src/cpp/ext/filters/census/measures.cc
index b522fae09a..f8a6508760 100644
--- a/src/cpp/ext/filters/census/measures.cc
+++ b/src/cpp/ext/filters/census/measures.cc
@@ -88,6 +88,32 @@ MeasureInt64 RpcClientReceivedMessagesPerRpc() {
return measure;
}
+// Client per-overall-client-call measures
+MeasureInt64 RpcClientRetriesPerCall() {
+ static const auto measure =
+ MeasureInt64::Register(kRpcClientRetriesPerCallMeasureName,
+ "Number of retry or hedging attempts excluding "
+ "transparent retries made during the client call",
+ kCount);
+ return measure;
+}
+
+MeasureInt64 RpcClientTransparentRetriesPerCall() {
+ static const auto measure = MeasureInt64::Register(
+ kRpcClientTransparentRetriesPerCallMeasureName,
+ "Number of transparent retries made during the client call", kCount);
+ return measure;
+}
+
+MeasureDouble RpcClientRetryDelayPerCall() {
+ static const auto measure =
+ MeasureDouble::Register(kRpcClientRetryDelayPerCallMeasureName,
+ "Total time of delay while there is no active "
+ "attempt during the client call",
+ kUnitMilliseconds);
+ return measure;
+}
+
// Server
MeasureDouble RpcServerSentBytesPerRpc() {
static const auto measure = MeasureDouble::Register(
diff --git a/src/cpp/ext/filters/census/measures.h b/src/cpp/ext/filters/census/measures.h
index 8f8e72ace2..2a95cb7032 100644
--- a/src/cpp/ext/filters/census/measures.h
+++ b/src/cpp/ext/filters/census/measures.h
@@ -33,6 +33,9 @@ namespace grpc {
::opencensus::stats::MeasureDouble RpcClientRoundtripLatency();
::opencensus::stats::MeasureDouble RpcClientServerLatency();
::opencensus::stats::MeasureInt64 RpcClientCompletedRpcs();
+::opencensus::stats::MeasureInt64 RpcClientRetriesPerCall();
+::opencensus::stats::MeasureInt64 RpcClientTransparentRetriesPerCall();
+::opencensus::stats::MeasureDouble RpcClientRetryDelayPerCall();
::opencensus::stats::MeasureInt64 RpcServerSentMessagesPerRpc();
::opencensus::stats::MeasureDouble RpcServerSentBytesPerRpc();
diff --git a/src/cpp/ext/filters/census/open_census_call_tracer.h b/src/cpp/ext/filters/census/open_census_call_tracer.h
new file mode 100644
index 0000000000..66ecd75d5c
--- /dev/null
+++ b/src/cpp/ext/filters/census/open_census_call_tracer.h
@@ -0,0 +1,109 @@
+//
+//
+// Copyright 2021 gRPC authors.
+//
+// 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.
+//
+//
+
+#ifndef GRPC_INTERNAL_CPP_EXT_FILTERS_OPEN_CENSUS_CALL_TRACER_H
+#define GRPC_INTERNAL_CPP_EXT_FILTERS_OPEN_CENSUS_CALL_TRACER_H
+
+#include <grpc/support/port_platform.h>
+
+#include "src/core/lib/channel/call_tracer.h"
+#include "src/cpp/ext/filters/census/context.h"
+
+namespace grpc {
+
+class OpenCensusCallTracer : public grpc_core::CallTracer {
+ public:
+ class OpenCensusCallAttemptTracer : public CallAttemptTracer {
+ public:
+ OpenCensusCallAttemptTracer(OpenCensusCallTracer* parent,
+ uint64_t attempt_num, bool is_transparent_retry,
+ bool arena_allocated);
+ void RecordSendInitialMetadata(
+ grpc_metadata_batch* /* send_initial_metadata */,
+ uint32_t /* flags */) override;
+ void RecordOnDoneSendInitialMetadata(gpr_atm* /* peer_string */) override {}
+ void RecordSendTrailingMetadata(
+ grpc_metadata_batch* /* send_trailing_metadata */) override {}
+ void RecordSendMessage(
+ const grpc_core::ByteStream& /* send_message */) override;
+ void RecordReceivedInitialMetadata(
+ grpc_metadata_batch* /* recv_initial_metadata */,
+ uint32_t /* flags */) override {}
+ void RecordReceivedMessage(
+ const grpc_core::ByteStream& /* recv_message */) override;
+ void RecordReceivedTrailingMetadata(
+ absl::Status /* status */, grpc_metadata_batch* recv_trailing_metadata,
+ const grpc_transport_stream_stats& /* transport_stream_stats */)
+ override;
+ void RecordCancel(grpc_error_handle cancel_error) override;
+ void RecordEnd(const gpr_timespec& /* latency */) override;
+
+ CensusContext* context() { return &context_; }
+
+ private:
+ // Maximum size of trace context is sent on the wire.
+ static constexpr uint32_t kMaxTraceContextLen = 64;
+ // Maximum size of tags that are sent on the wire.
+ static constexpr uint32_t kMaxTagsLen = 2048;
+ OpenCensusCallTracer* parent_;
+ const bool arena_allocated_;
+ CensusContext context_;
+ // Metadata elements for tracing and census stats data.
+ grpc_linked_mdelem stats_bin_;
+ grpc_linked_mdelem tracing_bin_;
+ // Start time (for measuring latency).
+ absl::Time start_time_;
+ // Server elapsed time in nanoseconds.
+ uint64_t elapsed_time_ = 0;
+ // Number of messages in this RPC.
+ uint64_t recv_message_count_ = 0;
+ uint64_t sent_message_count_ = 0;
+ // End status code
+ absl::StatusCode status_code_;
+ // Buffer needed for grpc_slice to reference when adding trace context
+ // metatdata to outgoing message.
+ char tracing_buf_[kMaxTraceContextLen];
+ };
+
+ explicit OpenCensusCallTracer(const grpc_call_element_args* args);
+ ~OpenCensusCallTracer() override;
+
+ OpenCensusCallAttemptTracer* StartNewAttempt(
+ bool is_transparent_retry) override;
+
+ private:
+ const grpc_call_context_element* call_context_;
+ // Client method.
+ grpc_slice path_;
+ absl::string_view method_;
+ CensusContext context_;
+ grpc_core::Arena* arena_;
+ grpc_core::Mutex mu_;
+ // Non-transparent attempts per call
+ uint64_t retries_ ABSL_GUARDED_BY(&mu_) = 0;
+ // Transparent retries per call
+ uint64_t transparent_retries_ ABSL_GUARDED_BY(&mu_) = 0;
+ // Retry delay
+ absl::Duration retry_delay_ ABSL_GUARDED_BY(&mu_);
+ absl::Time time_at_last_attempt_end_ ABSL_GUARDED_BY(&mu_);
+ uint64_t num_active_rpcs_ ABSL_GUARDED_BY(&mu_) = 0;
+};
+
+}; // namespace grpc
+
+#endif // GRPC_INTERNAL_CPP_EXT_FILTERS_OPEN_CENSUS_CALL_TRACER_H
diff --git a/src/cpp/ext/filters/census/views.cc b/src/cpp/ext/filters/census/views.cc
index 2c0c5f7295..cd552a9849 100644
--- a/src/cpp/ext/filters/census/views.cc
+++ b/src/cpp/ext/filters/census/views.cc
@@ -158,6 +158,56 @@ const ViewDescriptor& ClientReceivedMessagesPerRpcCumulative() {
return descriptor;
}
+const ViewDescriptor& ClientRetriesPerCallCumulative() {
+ const static ViewDescriptor descriptor =
+ ViewDescriptor()
+ .set_name("grpc.io/client/retries_per_call/cumulative")
+ .set_measure(kRpcClientRetriesPerCallMeasureName)
+ .set_aggregation(CountDistributionAggregation())
+ .add_column(ClientMethodTagKey());
+ return descriptor;
+}
+
+const ViewDescriptor& ClientRetriesCumulative() {
+ const static ViewDescriptor descriptor =
+ ViewDescriptor()
+ .set_name("grpc.io/client/retries/cumulative")
+ .set_measure(kRpcClientRetriesPerCallMeasureName)
+ .set_aggregation(Aggregation::Sum())
+ .add_column(ClientMethodTagKey());
+ return descriptor;
+}
+
+const ViewDescriptor& ClientTransparentRetriesPerCallCumulative() {
+ const static ViewDescriptor descriptor =
+ ViewDescriptor()
+ .set_name("grpc.io/client/transparent_retries_per_call/cumulative")
+ .set_measure(kRpcClientTransparentRetriesPerCallMeasureName)
+ .set_aggregation(CountDistributionAggregation())
+ .add_column(ClientMethodTagKey());
+ return descriptor;
+}
+
+const ViewDescriptor& ClientTransparentRetriesCumulative() {
+ const static ViewDescriptor descriptor =
+ ViewDescriptor()
+ .set_name("grpc.io/client/transparent_retries/cumulative")
+ .set_measure(kRpcClientTransparentRetriesPerCallMeasureName)
+ .set_aggregation(Aggregation::Sum())
+ .add_column(ClientMethodTagKey());
+ return descriptor;
+}
+
+const ViewDescriptor& ClientRetryDelayPerCallCumulative() {
+ const static ViewDescriptor descriptor =
+ ViewDescriptor()
+ .set_name("grpc.io/client/retry_delay_per_call/cumulative")
+ .set_measure(kRpcClientRetryDelayPerCallMeasureName)
+ .set_aggregation(MillisDistributionAggregation())
+ .add_column(ClientMethodTagKey());
+ return descriptor;
+}
+
// server cumulative
const ViewDescriptor& ServerSentBytesPerRpcCumulative() {
const static ViewDescriptor descriptor =
@@ -292,6 +342,56 @@ const ViewDescriptor& ClientReceivedMessagesPerRpcMinute() {
return descriptor;
}
+const ViewDescriptor& ClientRetriesPerCallMinute() {
+ const static ViewDescriptor descriptor =
+ MinuteDescriptor()
+ .set_name("grpc.io/client/retries_per_call/minute")
+ .set_measure(kRpcClientRetriesPerCallMeasureName)
+ .set_aggregation(CountDistributionAggregation())
+ .add_column(ClientMethodTagKey());
+ return descriptor;
+}
+
+const ViewDescriptor& ClientRetriesMinute() {
+ const static ViewDescriptor descriptor =
+ MinuteDescriptor()
+ .set_name("grpc.io/client/retries/minute")
+ .set_measure(kRpcClientRetriesPerCallMeasureName)
+ .set_aggregation(Aggregation::Sum())
+ .add_column(ClientMethodTagKey());
+ return descriptor;
+}
+
+const ViewDescriptor& ClientTransparentRetriesPerCallMinute() {
+ const static ViewDescriptor descriptor =
+ MinuteDescriptor()
+ .set_name("grpc.io/client/transparent_retries_per_call/minute")
+ .set_measure(kRpcClientTransparentRetriesPerCallMeasureName)
+ .set_aggregation(CountDistributionAggregation())
+ .add_column(ClientMethodTagKey());
+ return descriptor;
+}
+
+const ViewDescriptor& ClientTransparentRetriesMinute() {
+ const static ViewDescriptor descriptor =
+ MinuteDescriptor()
+ .set_name("grpc.io/client/transparent_retries/minute")
+ .set_measure(kRpcClientTransparentRetriesPerCallMeasureName)
+ .set_aggregation(Aggregation::Sum())
+ .add_column(ClientMethodTagKey());
+ return descriptor;
+}
+
+const ViewDescriptor& ClientRetryDelayPerCallMinute() {
+ const static ViewDescriptor descriptor =
+ MinuteDescriptor()
+ .set_name("grpc.io/client/retry_delay_per_call/minute")
+ .set_measure(kRpcClientRetryDelayPerCallMeasureName)
+ .set_aggregation(MillisDistributionAggregation())
+ .add_column(ClientMethodTagKey());
+ return descriptor;
+}
+
// server minute
const ViewDescriptor& ServerSentBytesPerRpcMinute() {
const static ViewDescriptor descriptor =
@@ -426,6 +526,56 @@ const ViewDescriptor& ClientReceivedMessagesPerRpcHour() {
return descriptor;
}
+const ViewDescriptor& ClientRetriesPerCallHour() {
+ const static ViewDescriptor descriptor =
+ HourDescriptor()
+ .set_name("grpc.io/client/retries_per_call/hour")
+ .set_measure(kRpcClientRetriesPerCallMeasureName)
+ .set_aggregation(CountDistributionAggregation())
+ .add_column(ClientMethodTagKey());
+ return descriptor;
+}
+
+const ViewDescriptor& ClientRetriesHour() {
+ const static ViewDescriptor descriptor =
+ HourDescriptor()
+ .set_name("grpc.io/client/retries/hour")
+ .set_measure(kRpcClientRetriesPerCallMeasureName)
+ .set_aggregation(Aggregation::Sum())
+ .add_column(ClientMethodTagKey());
+ return descriptor;
+}
+
+const ViewDescriptor& ClientTransparentRetriesPerCallHour() {
+ const static ViewDescriptor descriptor =
+ HourDescriptor()
+ .set_name("grpc.io/client/transparent_retries_per_call/hour")
+ .set_measure(kRpcClientTransparentRetriesPerCallMeasureName)
+ .set_aggregation(CountDistributionAggregation())
+ .add_column(ClientMethodTagKey());
+ return descriptor;
+}
+
+const ViewDescriptor& ClientTransparentRetriesHour() {
+ const static ViewDescriptor descriptor =
+ HourDescriptor()
+ .set_name("grpc.io/client/transparent_retries/hour")
+ .set_measure(kRpcClientTransparentRetriesPerCallMeasureName)
+ .set_aggregation(Aggregation::Sum())
+ .add_column(ClientMethodTagKey());
+ return descriptor;
+}
+
+const ViewDescriptor& ClientRetryDelayPerCallHour() {
+ const static ViewDescriptor descriptor =
+ HourDescriptor()
+ .set_name("grpc.io/client/retry_delay_per_call/hour")
+ .set_measure(kRpcClientRetryDelayPerCallMeasureName)
+ .set_aggregation(MillisDistributionAggregation())
+ .add_column(ClientMethodTagKey());
+ return descriptor;
+}
+
// server hour
const ViewDescriptor& ServerSentBytesPerRpcHour() {
const static ViewDescriptor descriptor =
diff --git a/src/cpp/server/secure_server_credentials.cc b/src/cpp/server/secure_server_credentials.cc
index 4f52a879d9..53c9236569 100644
--- a/src/cpp/server/secure_server_credentials.cc
+++ b/src/cpp/server/secure_server_credentials.cc
@@ -74,7 +74,6 @@ void AuthMetadataProcessorAyncWrapper::InvokeProcessor(
grpc_metadata md_entry;
md_entry.key = SliceReferencingString(consumed.first);
md_entry.value = SliceReferencingString(consumed.second);
- md_entry.flags = 0;
consumed_md.push_back(md_entry);
}
std::vector<grpc_metadata> response_md;
@@ -82,7 +81,6 @@ void AuthMetadataProcessorAyncWrapper::InvokeProcessor(
grpc_metadata md_entry;
md_entry.key = SliceReferencingString(response.first);
md_entry.value = SliceReferencingString(response.second);
- md_entry.flags = 0;
response_md.push_back(md_entry);
}
auto consumed_md_data = consumed_md.empty() ? nullptr : &consumed_md[0];
diff --git a/src/cpp/server/server_cc.cc b/src/cpp/server/server_cc.cc
index c82c83c173..efa12aa79f 100644
--- a/src/cpp/server/server_cc.cc
+++ b/src/cpp/server/server_cc.cc
@@ -1110,9 +1110,9 @@ void Server::UnrefAndWaitLocked() {
shutdown_done_ = true;
return; // no need to wait on CV since done condition already set
}
- grpc::internal::WaitUntil(
- &shutdown_done_cv_, &mu_,
- [this]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) { return shutdown_done_; });
+ while (!shutdown_done_) {
+ shutdown_done_cv_.Wait(&mu_);
+ }
}
void Server::Start(grpc::ServerCompletionQueue** cqs, size_t num_cqs) {
diff --git a/src/csharp/Grpc.Core.Api/VersionInfo.cs b/src/csharp/Grpc.Core.Api/VersionInfo.cs
index 85a4a04d72..b40cbef5f4 100644
--- a/src/csharp/Grpc.Core.Api/VersionInfo.cs
+++ b/src/csharp/Grpc.Core.Api/VersionInfo.cs
@@ -33,11 +33,11 @@ namespace Grpc.Core
/// <summary>
/// Current <c>AssemblyFileVersion</c> of gRPC C# assemblies
/// </summary>
- public const string CurrentAssemblyFileVersion = "2.39.1.0";
+ public const string CurrentAssemblyFileVersion = "2.40.0.0";
/// <summary>
/// Current version of gRPC C#
/// </summary>
- public const string CurrentVersion = "2.39.1";
+ public const string CurrentVersion = "2.40.0";
}
}
diff --git a/src/csharp/Grpc.Tools/ProtoCompile.cs b/src/csharp/Grpc.Tools/ProtoCompile.cs
index b81656a527..7d7bd922b3 100644
--- a/src/csharp/Grpc.Tools/ProtoCompile.cs
+++ b/src/csharp/Grpc.Tools/ProtoCompile.cs
@@ -354,7 +354,7 @@ namespace Grpc.Tools
{
Log.LogError("Proto compiler currently allows only one input when " +
"--dependency_out is specified (via ProtoDepDir or DependencyOut). " +
- "Tracking issue: https://github.com/google/protobuf/pull/3959");
+ "Tracking issue: https://github.com/protocolbuffers/protobuf/pull/3959");
}
// Use ProtoDepDir to autogenerate DependencyOut
diff --git a/src/csharp/build/dependencies.props b/src/csharp/build/dependencies.props
index 36ffaed739..b6e6703123 100644
--- a/src/csharp/build/dependencies.props
+++ b/src/csharp/build/dependencies.props
@@ -1,7 +1,7 @@
<!-- This file is generated -->
<Project>
<PropertyGroup>
- <GrpcCsharpVersion>2.39.1</GrpcCsharpVersion>
+ <GrpcCsharpVersion>2.40.0</GrpcCsharpVersion>
<GoogleProtobufVersion>3.15.8</GoogleProtobufVersion>
</PropertyGroup>
</Project>
diff --git a/src/objective-c/!ProtoCompiler-gRPCCppPlugin.podspec b/src/objective-c/!ProtoCompiler-gRPCCppPlugin.podspec
index d63d6a9334..70d796081a 100644
--- a/src/objective-c/!ProtoCompiler-gRPCCppPlugin.podspec
+++ b/src/objective-c/!ProtoCompiler-gRPCCppPlugin.podspec
@@ -42,7 +42,7 @@ Pod::Spec.new do |s|
# exclamation mark ensures that other "regular" pods will be able to find it as it'll be installed
# before them.
s.name = '!ProtoCompiler-gRPCCppPlugin'
- v = '1.39.1'
+ v = '1.40.0'
s.version = v
s.summary = 'The gRPC ProtoC plugin generates C++ files from .proto services.'
s.description = <<-DESC
diff --git a/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec b/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec
index 14af8ec1e9..df57915496 100644
--- a/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec
+++ b/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec
@@ -42,7 +42,7 @@ Pod::Spec.new do |s|
# exclamation mark ensures that other "regular" pods will be able to find it as it'll be installed
# before them.
s.name = '!ProtoCompiler-gRPCPlugin'
- v = '1.39.1'
+ v = '1.40.0'
s.version = v
s.summary = 'The gRPC ProtoC plugin generates Objective-C files from .proto services.'
s.description = <<-DESC
diff --git a/src/objective-c/!ProtoCompiler.podspec b/src/objective-c/!ProtoCompiler.podspec
index 0a86fe7421..5da8b30504 100644
--- a/src/objective-c/!ProtoCompiler.podspec
+++ b/src/objective-c/!ProtoCompiler.podspec
@@ -45,7 +45,7 @@ Pod::Spec.new do |s|
The generated code will have a dependency on the Protobuf Objective-C runtime of the same
version. The runtime can be obtained as the "Protobuf" pod.
DESC
- s.homepage = 'https://github.com/google/protobuf'
+ s.homepage = 'https://github.com/protocolbuffers/protobuf'
s.license = {
:type => 'New BSD',
:text => <<-LICENSE
diff --git a/src/objective-c/GRPCClient/GRPCCallOptions.h b/src/objective-c/GRPCClient/GRPCCallOptions.h
index 389febab4a..4224f45c04 100644
--- a/src/objective-c/GRPCClient/GRPCCallOptions.h
+++ b/src/objective-c/GRPCClient/GRPCCallOptions.h
@@ -201,6 +201,12 @@ NS_ASSUME_NONNULL_BEGIN
*/
@property(readonly) NSUInteger channelOptionsHash;
+// Parameters for GTMSessionFetcher transport retry policy. This is only for internal users.
+@property(atomic, assign) NSTimeInterval maxRetryInterval;
+@property(atomic, assign) NSTimeInterval minRetryInterval;
+@property(atomic, assign) NSUInteger retryCount;
+@property(atomic, assign) double retryFactor;
+
@end
/**
diff --git a/src/objective-c/GRPCClient/private/GRPCCore/GRPCChannel.m b/src/objective-c/GRPCClient/private/GRPCCore/GRPCChannel.m
index 5ad1cb462d..5727f01c96 100644
--- a/src/objective-c/GRPCClient/private/GRPCCore/GRPCChannel.m
+++ b/src/objective-c/GRPCClient/private/GRPCCore/GRPCChannel.m
@@ -291,8 +291,11 @@
}
- (void)dealloc {
- if (_unmanagedChannel) {
- grpc_channel_destroy(_unmanagedChannel);
+ @synchronized(self) {
+ if (_unmanagedChannel) {
+ grpc_channel_destroy(_unmanagedChannel);
+ _unmanagedChannel = NULL;
+ }
}
}
diff --git a/src/objective-c/GRPCClient/version.h b/src/objective-c/GRPCClient/version.h
index 76404c579b..80279a0054 100644
--- a/src/objective-c/GRPCClient/version.h
+++ b/src/objective-c/GRPCClient/version.h
@@ -22,4 +22,4 @@
// instead. This file can be regenerated from the template by running
// `tools/buildgen/generate_projects.sh`.
-#define GRPC_OBJC_VERSION_STRING @"1.39.1"
+#define GRPC_OBJC_VERSION_STRING @"1.40.0"
diff --git a/src/objective-c/README.md b/src/objective-c/README.md
index 2f5e330bdb..c5d52ec066 100644
--- a/src/objective-c/README.md
+++ b/src/objective-c/README.md
@@ -176,8 +176,8 @@ This will download and run the [gRPC install script][].
### Install _protoc_ and the gRPC plugin without using Homebrew
First install v3 of the Protocol Buffers compiler (_protoc_), by cloning
-[its Git repository](https://github.com/google/protobuf) and following these
-[installation instructions](https://github.com/google/protobuf#c-installation---unix)
+[its Git repository](https://github.com/protocolbuffers/protobuf) and following these
+[installation instructions](https://github.com/protocolbuffers/protobuf#c-installation---unix)
(the ones titled C++; don't miss the note for Mac users).
Then clone this repository and execute the following commands from the root directory where it was
@@ -212,7 +212,7 @@ files:
* [Podspec](https://github.com/grpc/grpc/blob/master/gRPC.podspec) for the Objective-C gRPC runtime
library. This can be tedious to configure manually.
-* [Podspec](https://github.com/google/protobuf/blob/master/Protobuf.podspec) for the
+* [Podspec](https://github.com/protocolbuffers/protobuf/blob/master/Protobuf.podspec) for the
Objective-C Protobuf runtime library.
[Protocol Buffers]:https://developers.google.com/protocol-buffers/
diff --git a/src/objective-c/tests/InteropTests/InteropTests.m b/src/objective-c/tests/InteropTests/InteropTests.m
index a13b95a0d9..bae94ef239 100644
--- a/src/objective-c/tests/InteropTests/InteropTests.m
+++ b/src/objective-c/tests/InteropTests/InteropTests.m
@@ -872,7 +872,7 @@ static dispatch_once_t initGlobalInterceptorFactory;
// - If you're developing the server, consider using response streaming,
// or let clients filter
// responses by setting a google.protobuf.FieldMask in the request:
- // https://github.com/google/protobuf/blob/master/src/google/protobuf/field_mask.proto
+ // https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/field_mask.proto
XCTAssertEqualObjects(
error.localizedDescription,
@"Received message larger than max (4194305 vs. 4194304)");
diff --git a/src/objective-c/tests/version.h b/src/objective-c/tests/version.h
index 27ba6384c4..9fddeeddc5 100644
--- a/src/objective-c/tests/version.h
+++ b/src/objective-c/tests/version.h
@@ -22,5 +22,5 @@
// instead. This file can be regenerated from the template by running
// `tools/buildgen/generate_projects.sh`.
-#define GRPC_OBJC_VERSION_STRING @"1.39.1"
+#define GRPC_OBJC_VERSION_STRING @"1.40.0"
#define GRPC_C_VERSION_STRING @"18.0.0"
diff --git a/src/php/README.md b/src/php/README.md
index ae06c3577d..757b7e5ee7 100644
--- a/src/php/README.md
+++ b/src/php/README.md
@@ -141,7 +141,7 @@ v1.8.0 | 3.5.0 | v1.21.3 | 3.7.0
If `protoc` hasn't been installed, you can download the `protoc` binary from
the protocol buffers
-[Github repository](https://github.com/google/protobuf/releases).
+[Github repository](https://github.com/protocolbuffers/protobuf/releases).
Then unzip this file and update the environment variable `PATH` to include the
path to the protoc binary file.
diff --git a/src/php/bin/interop_server.sh b/src/php/bin/interop_server.sh
new file mode 100755
index 0000000000..64f031f8f8
--- /dev/null
+++ b/src/php/bin/interop_server.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+# Copyright 2020 gRPC authors.
+#
+# 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.
+
+set -e
+cd $(dirname $0)
+source ./determine_extension_dir.sh
+cd ../tests/interop
+php $extension_dir -d max_execution_time=300 \
+ interop_server.php $@ 1>&2
diff --git a/src/php/composer.json b/src/php/composer.json
index 33271637bd..6e8c0029ce 100644
--- a/src/php/composer.json
+++ b/src/php/composer.json
@@ -2,7 +2,7 @@
"name": "grpc/grpc-dev",
"description": "gRPC library for PHP - for Development use only",
"license": "Apache-2.0",
- "version": "1.39.1",
+ "version": "1.40.0",
"require": {
"php": ">=7.0.0",
"google/protobuf": "^v3.3.0"
diff --git a/src/php/ext/grpc/version.h b/src/php/ext/grpc/version.h
index fe41033a3f..8d62508532 100644
--- a/src/php/ext/grpc/version.h
+++ b/src/php/ext/grpc/version.h
@@ -20,6 +20,6 @@
#ifndef VERSION_H
#define VERSION_H
-#define PHP_GRPC_VERSION "1.39.1"
+#define PHP_GRPC_VERSION "1.40.0"
#endif /* VERSION_H */
diff --git a/src/php/tests/interop/interop_client.php b/src/php/tests/interop/interop_client.php
index 908fb3ce96..18435338d9 100755
--- a/src/php/tests/interop/interop_client.php
+++ b/src/php/tests/interop/interop_client.php
@@ -788,6 +788,7 @@ function interop_main($args, $stub = false)
break;
case 'special_status_message':
specialStatusMessage($stub);
+ break;
case 'unimplemented_service':
unimplementedService($stub);
break;
diff --git a/src/php/tests/interop/interop_server.php b/src/php/tests/interop/interop_server.php
new file mode 100644
index 0000000000..f280fe7b48
--- /dev/null
+++ b/src/php/tests/interop/interop_server.php
@@ -0,0 +1,217 @@
+<?php
+/*
+ *
+ * Copyright 2020 gRPC authors.
+ *
+ * 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.
+ *
+ */
+require_once realpath(dirname(__FILE__) . '/../../vendor/autoload.php');
+
+class TestService extends \Grpc\Testing\TestServiceStub
+{
+ private function maybeEchoMetadata(\Grpc\ServerContext $context)
+ {
+ $ECHO_INITIAL_KEY = 'x-grpc-test-echo-initial';
+ $ECHO_TRAILING_KEY = 'x-grpc-test-echo-trailing-bin';
+
+ $initial_metadata = [];
+ $trailing_metadata = [];
+ $client_metadata = $context->clientMetadata();
+ if (array_key_exists($ECHO_INITIAL_KEY, $client_metadata)) {
+ $initial_metadata = [
+ $ECHO_INITIAL_KEY =>
+ $client_metadata[$ECHO_INITIAL_KEY],
+ ];
+ }
+ if (array_key_exists($ECHO_TRAILING_KEY, $client_metadata)) {
+ $trailing_metadata = [
+ $ECHO_TRAILING_KEY =>
+ $client_metadata[$ECHO_TRAILING_KEY],
+ ];
+ }
+ return [$initial_metadata, $trailing_metadata];
+ }
+
+ private function maybeEchoStatusAndMessage(
+ $request,
+ $trailing_metadata = []
+ ) {
+ if (!$request->hasResponseStatus()) {
+ return null;
+ }
+ return \Grpc\Status::status(
+ $request->getResponseStatus()->getCode(),
+ $request->getResponseStatus()->getMessage(),
+ $trailing_metadata
+ );
+ }
+
+ public function EmptyCall(
+ \Grpc\Testing\EmptyMessage $request,
+ \Grpc\ServerContext $context
+ ): ?\Grpc\Testing\EmptyMessage {
+ list($initial_metadata, $trailing_metadata) =
+ $this->maybeEchoMetadata($context);
+ $context->setStatus(\Grpc\Status::ok($trailing_metadata));
+ $context->setInitialMetadata($initial_metadata);
+ return new \Grpc\Testing\EmptyMessage();
+ }
+
+ public function UnaryCall(
+ \Grpc\Testing\SimpleRequest $request,
+ \Grpc\ServerContext $context
+ ): ?\Grpc\Testing\SimpleResponse {
+ list($initial_metadata, $trailing_metadata) =
+ $this->maybeEchoMetadata($context);
+ $echo_status = $this->maybeEchoStatusAndMessage(
+ $request,
+ $trailing_metadata
+ );
+
+ $payload = new \Grpc\Testing\Payload([
+ 'type' => $request->getResponseType(),
+ 'body' => str_repeat("\0", $request->getResponseSize()),
+ ]);
+ $response = new \Grpc\Testing\SimpleResponse([
+ 'payload' => $payload,
+ ]);
+
+ $context->setInitialMetadata($initial_metadata);
+ $context->setStatus($echo_status ?? \Grpc\Status::ok($trailing_metadata));
+ return $response;
+ }
+
+ public function CacheableUnaryCall(
+ \Grpc\Testing\SimpleRequest $request,
+ \Grpc\ServerContext $context
+ ): ?\Grpc\Testing\SimpleResponse {
+ $context->setStatus(\Grpc\Status::unimplemented());
+ return null;
+ }
+
+ public function StreamingOutputCall(
+ \Grpc\Testing\StreamingOutputCallRequest $request,
+ \Grpc\ServerCallWriter $writter,
+ \Grpc\ServerContext $context
+ ): void {
+ $echo_status = $this->maybeEchoStatusAndMessage($request);
+
+ foreach ($request->getResponseParameters() as $parameter) {
+ if ($parameter->getIntervalUs() > 0) {
+ usleep($parameter->getIntervalUs());
+ }
+ $payload = new \Grpc\Testing\Payload([
+ 'type' => $request->getResponseType(),
+ 'body' => str_repeat("\0", $parameter->getSize()),
+ ]);
+ $response = new \Grpc\Testing\StreamingOutputCallResponse([
+ 'payload' => $payload,
+ ]);
+ $options = [];
+ $writter->write($response, $options);
+ }
+ $context->setStatus($echo_status ?? \Grpc\Status::ok());
+ $writter->finish();
+ }
+
+ public function StreamingInputCall(
+ \Grpc\ServerCallReader $reader,
+ \Grpc\ServerContext $context
+ ): ?\Grpc\Testing\StreamingInputCallResponse {
+ $aggregate_size = 0;
+ while ($request = $reader->read()) {
+ if ($request->hasPayload()) {
+ $aggregate_size += strlen($request->getPayload()->getBody());
+ }
+ }
+ $response = new \Grpc\Testing\StreamingInputCallResponse();
+ $response->setAggregatedPayloadSize($aggregate_size);
+ return $response;
+ }
+
+ public function FullDuplexCall(
+ \Grpc\ServerCallReader $reader,
+ \Grpc\ServerCallWriter $writter,
+ \Grpc\ServerContext $context
+ ): void {
+ list($initial_metadata, $trailing_metadata) =
+ $this->maybeEchoMetadata($context);
+ $context->setInitialMetadata($initial_metadata);
+ while ($request = $reader->read()) {
+ $echo_status = $this->maybeEchoStatusAndMessage(
+ $request,
+ $trailing_metadata
+ );
+ if ($echo_status) {
+ $context->setStatus($echo_status);
+ $writter->finish();
+ return;
+ }
+
+ foreach ($request->getResponseParameters() as $parameter) {
+ if ($parameter->getIntervalUs() > 0) {
+ usleep($parameter->getIntervalUs());
+ }
+ $payload = new \Grpc\Testing\Payload([
+ 'type' => $request->getResponseType(),
+ 'body' => str_repeat("\0", $parameter->getSize()),
+ ]);
+ $response = new \Grpc\Testing\StreamingOutputCallResponse([
+ 'payload' => $payload,
+ ]);
+ $options = [];
+ $writter->write($response, $options);
+ }
+ }
+ $context->setStatus(\Grpc\Status::ok($trailing_metadata));
+ $writter->finish();
+ }
+
+ public function HalfDuplexCall(
+ \Grpc\ServerCallReader $reader,
+ \Grpc\ServerCallWriter $writter,
+ \Grpc\ServerContext $context
+ ): void {
+ $context->setStatus(\Grpc\Status::unimplemented());
+ $writter->finish();
+ }
+
+ public function UnimplementedCall(
+ \Grpc\Testing\EmptyMessage $request,
+ \Grpc\ServerContext $context
+ ): ?\Grpc\Testing\EmptyMessage {
+ $context->setStatus(\Grpc\Status::unimplemented());
+ return null;
+ }
+};
+
+
+$args = getopt('', ['port:', 'use_tls::',]);
+
+$server = new \Grpc\RpcServer();
+
+$listening_address = '0.0.0.0:' . $args['port'];
+if ($args['use_tls']) {
+ $server_credentials = \Grpc\ServerCredentials::createSsl(
+ null,
+ file_get_contents(dirname(__FILE__) . '/../data/server1.key'),
+ file_get_contents(dirname(__FILE__) . '/../data/server1.pem')
+ );
+ $server->addSecureHttp2Port($listening_address, $server_credentials);
+} else {
+ $server->addHttp2Port($listening_address);
+}
+$server->handle(new TestService());
+echo 'Server running on ' . $listening_address . PHP_EOL;
+$server->run();
diff --git a/src/proto/grpc/testing/xds/v3/ads.proto b/src/proto/grpc/testing/xds/v3/ads.proto
index d576c1ddc5..4688aeedb2 100644
--- a/src/proto/grpc/testing/xds/v3/ads.proto
+++ b/src/proto/grpc/testing/xds/v3/ads.proto
@@ -40,6 +40,6 @@ service AggregatedDiscoveryService {
}
// [#not-implemented-hide:] Not configuration. Workaround c++ protobuf issue with importing
-// services: https://github.com/google/protobuf/issues/4221
+// services: https://github.com/protocolbuffers/protobuf/issues/4221
message AdsPhony {
}
diff --git a/src/proto/grpc/testing/xds/v3/route.proto b/src/proto/grpc/testing/xds/v3/route.proto
index 89260f6ff7..8b0bd1a5c1 100644
--- a/src/proto/grpc/testing/xds/v3/route.proto
+++ b/src/proto/grpc/testing/xds/v3/route.proto
@@ -31,6 +31,18 @@ import "google/protobuf/wrappers.proto";
// * Routing :ref:`architecture overview <arch_overview_http_routing>`
// * HTTP :ref:`router filter <config_http_filters_router>`
+message RetryPolicy {
+ string retry_on = 1;
+ google.protobuf.UInt32Value num_retries = 2;
+
+ message RetryBackOff {
+ google.protobuf.Duration base_interval = 1;
+ google.protobuf.Duration max_interval = 2;
+ }
+
+ RetryBackOff retry_back_off = 8;
+}
+
// The top level element in the routing configuration is a virtual host. Each virtual host has
// a logical name as well as a set of domains that get routed to it based on the incoming request's
// host header. This allows a single listener to service multiple top level domain path trees. Once
@@ -72,6 +84,8 @@ message VirtualHost {
// specific; see the :ref:`HTTP filter documentation <config_http_filters>`
// for if and how it is utilized.
map<string, google.protobuf.Any> typed_per_filter_config = 15;
+
+ RetryPolicy retry_policy = 16;
}
// A route is both a specification of how to match a request as well as an indication of what to do
@@ -318,6 +332,8 @@ message RouteAction {
repeated HashPolicy hash_policy = 15;
+ RetryPolicy retry_policy = 9;
+
// Specifies the maximum stream duration for this route.
MaxStreamDuration max_stream_duration = 36;
}
diff --git a/src/python/grpcio/commands.py b/src/python/grpcio/commands.py
index df8fc46a3c..52c6f07ee5 100644
--- a/src/python/grpcio/commands.py
+++ b/src/python/grpcio/commands.py
@@ -33,7 +33,6 @@ from setuptools.command import build_py
from setuptools.command import easy_install
from setuptools.command import install
from setuptools.command import test
-
import support
PYTHON_STEM = os.path.dirname(os.path.abspath(__file__))
diff --git a/src/python/grpcio/grpc/__init__.py b/src/python/grpcio/grpc/__init__.py
index ea393c44c5..628535da00 100644
--- a/src/python/grpcio/grpc/__init__.py
+++ b/src/python/grpcio/grpc/__init__.py
@@ -18,14 +18,18 @@ import contextlib
import enum
import logging
import sys
-import six
-from grpc._cython import cygrpc as _cygrpc
from grpc import _compression
+from grpc._cython import cygrpc as _cygrpc
+from grpc._runtime_protos import protos
+from grpc._runtime_protos import protos_and_services
+from grpc._runtime_protos import services
+import six
logging.getLogger(__name__).addHandler(logging.NullHandler())
try:
+ # pylint: disable=ungrouped-imports
from grpc._grpcio_metadata import __version__
except ImportError:
__version__ = "dev0"
@@ -2092,8 +2096,6 @@ class Compression(enum.IntEnum):
Gzip = _compression.Gzip
-from grpc._runtime_protos import protos, services, protos_and_services # pylint: disable=wrong-import-position
-
################################### __all__ #################################
__all__ = (
diff --git a/src/python/grpcio/grpc/_channel.py b/src/python/grpcio/grpc/_channel.py
index b98f3002f4..8f9d7e972a 100644
--- a/src/python/grpcio/grpc/_channel.py
+++ b/src/python/grpcio/grpc/_channel.py
@@ -22,11 +22,11 @@ import threading
import time
import grpc
-import grpc.experimental
-from grpc import _compression
from grpc import _common
+from grpc import _compression
from grpc import _grpcio_metadata
from grpc._cython import cygrpc
+import grpc.experimental
_LOGGER = logging.getLogger(__name__)
diff --git a/src/python/grpcio/grpc/_common.py b/src/python/grpcio/grpc/_common.py
index 128124c325..d8f951456e 100644
--- a/src/python/grpcio/grpc/_common.py
+++ b/src/python/grpcio/grpc/_common.py
@@ -15,10 +15,10 @@
import logging
import time
-import six
import grpc
from grpc._cython import cygrpc
+import six
_LOGGER = logging.getLogger(__name__)
diff --git a/src/python/grpcio/grpc/_grpcio_metadata.py b/src/python/grpcio/grpc/_grpcio_metadata.py
index 68fc5baccf..ac6d36e755 100644
--- a/src/python/grpcio/grpc/_grpcio_metadata.py
+++ b/src/python/grpcio/grpc/_grpcio_metadata.py
@@ -14,4 +14,4 @@
# AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio/grpc/_grpcio_metadata.py.template`!!!
-__version__ = """1.39.1"""
+__version__ = """1.40.0"""
diff --git a/src/python/grpcio/grpc/_plugin_wrapping.py b/src/python/grpcio/grpc/_plugin_wrapping.py
index 15ef131bfb..ad74b256a3 100644
--- a/src/python/grpcio/grpc/_plugin_wrapping.py
+++ b/src/python/grpcio/grpc/_plugin_wrapping.py
@@ -72,6 +72,7 @@ class _Plugin(object):
try:
import contextvars # pylint: disable=wrong-import-position
+
# The plugin may be invoked on a thread created by Core, which will not
# have the context propagated. This context is stored and installed in
# the thread invoking the plugin.
diff --git a/src/python/grpcio/grpc/_server.py b/src/python/grpcio/grpc/_server.py
index 6c6f02de8a..58ab14feb3 100644
--- a/src/python/grpcio/grpc/_server.py
+++ b/src/python/grpcio/grpc/_server.py
@@ -14,19 +14,18 @@
"""Service-side implementation of gRPC Python."""
import collections
+from concurrent import futures
import enum
import logging
import threading
import time
-from concurrent import futures
-import six
-
import grpc
from grpc import _common
from grpc import _compression
from grpc import _interceptor
from grpc._cython import cygrpc
+import six
_LOGGER = logging.getLogger(__name__)
diff --git a/src/python/grpcio/grpc/_simple_stubs.py b/src/python/grpcio/grpc/_simple_stubs.py
index 3dd44c705e..54c2a2d5db 100644
--- a/src/python/grpcio/grpc/_simple_stubs.py
+++ b/src/python/grpcio/grpc/_simple_stubs.py
@@ -15,8 +15,8 @@
import collections
import datetime
-import os
import logging
+import os
import threading
from typing import (Any, AnyStr, Callable, Dict, Iterator, Optional, Sequence,
Tuple, TypeVar, Union)
diff --git a/src/python/grpcio/grpc/_utilities.py b/src/python/grpcio/grpc/_utilities.py
index c48aaf60a2..9293c9bcef 100644
--- a/src/python/grpcio/grpc/_utilities.py
+++ b/src/python/grpcio/grpc/_utilities.py
@@ -14,14 +14,13 @@
"""Internal utilities for gRPC Python."""
import collections
+import logging
import threading
import time
-import logging
-
-import six
import grpc
from grpc import _common
+import six
_LOGGER = logging.getLogger(__name__)
diff --git a/src/python/grpcio/grpc/aio/__init__.py b/src/python/grpcio/grpc/aio/__init__.py
index 2933aa5a45..3436d2ef98 100644
--- a/src/python/grpcio/grpc/aio/__init__.py
+++ b/src/python/grpcio/grpc/aio/__init__.py
@@ -20,27 +20,41 @@ created. AsyncIO doesn't provide thread safety for most of its APIs.
from typing import Any, Optional, Sequence, Tuple
import grpc
-from grpc._cython.cygrpc import (init_grpc_aio, shutdown_grpc_aio, EOF,
- AbortError, BaseError, InternalError,
- UsageError)
+from grpc._cython.cygrpc import AbortError
+from grpc._cython.cygrpc import BaseError
+from grpc._cython.cygrpc import EOF
+from grpc._cython.cygrpc import InternalError
+from grpc._cython.cygrpc import UsageError
+from grpc._cython.cygrpc import init_grpc_aio
+from grpc._cython.cygrpc import shutdown_grpc_aio
-from ._base_call import (Call, RpcContext, StreamStreamCall, StreamUnaryCall,
- UnaryStreamCall, UnaryUnaryCall)
-from ._base_channel import (Channel, StreamStreamMultiCallable,
- StreamUnaryMultiCallable, UnaryStreamMultiCallable,
- UnaryUnaryMultiCallable)
+from ._base_call import Call
+from ._base_call import RpcContext
+from ._base_call import StreamStreamCall
+from ._base_call import StreamUnaryCall
+from ._base_call import UnaryStreamCall
+from ._base_call import UnaryUnaryCall
+from ._base_channel import Channel
+from ._base_channel import StreamStreamMultiCallable
+from ._base_channel import StreamUnaryMultiCallable
+from ._base_channel import UnaryStreamMultiCallable
+from ._base_channel import UnaryUnaryMultiCallable
+from ._base_server import Server
+from ._base_server import ServicerContext
from ._call import AioRpcError
-from ._interceptor import (ClientCallDetails, ClientInterceptor,
- InterceptedUnaryUnaryCall,
- UnaryUnaryClientInterceptor,
- UnaryStreamClientInterceptor,
- StreamUnaryClientInterceptor,
- StreamStreamClientInterceptor, ServerInterceptor)
+from ._channel import insecure_channel
+from ._channel import secure_channel
+from ._interceptor import ClientCallDetails
+from ._interceptor import ClientInterceptor
+from ._interceptor import InterceptedUnaryUnaryCall
+from ._interceptor import ServerInterceptor
+from ._interceptor import StreamStreamClientInterceptor
+from ._interceptor import StreamUnaryClientInterceptor
+from ._interceptor import UnaryStreamClientInterceptor
+from ._interceptor import UnaryUnaryClientInterceptor
+from ._metadata import Metadata
from ._server import server
-from ._base_server import Server, ServicerContext
from ._typing import ChannelArgumentType
-from ._channel import insecure_channel, secure_channel
-from ._metadata import Metadata
################################### __all__ #################################
diff --git a/src/python/grpcio/grpc/aio/_base_call.py b/src/python/grpcio/grpc/aio/_base_call.py
index 4ccbb3be13..029584e94a 100644
--- a/src/python/grpcio/grpc/aio/_base_call.py
+++ b/src/python/grpcio/grpc/aio/_base_call.py
@@ -18,13 +18,17 @@ its information. They also offer methods to manipulate the life-cycle of the
RPC, e.g. cancellation.
"""
-from abc import ABCMeta, abstractmethod
+from abc import ABCMeta
+from abc import abstractmethod
from typing import AsyncIterable, Awaitable, Generic, Optional, Union
import grpc
-from ._typing import (DoneCallbackType, EOFType, RequestType, ResponseType)
from ._metadata import Metadata
+from ._typing import DoneCallbackType
+from ._typing import EOFType
+from ._typing import RequestType
+from ._typing import ResponseType
__all__ = 'RpcContext', 'Call', 'UnaryUnaryCall', 'UnaryStreamCall'
diff --git a/src/python/grpcio/grpc/aio/_base_channel.py b/src/python/grpcio/grpc/aio/_base_channel.py
index b9a47efb41..dc307c8fd2 100644
--- a/src/python/grpcio/grpc/aio/_base_channel.py
+++ b/src/python/grpcio/grpc/aio/_base_channel.py
@@ -19,9 +19,10 @@ from typing import Any, Optional
import grpc
from . import _base_call
-from ._typing import (DeserializingFunction, RequestIterableType,
- SerializingFunction)
from ._metadata import Metadata
+from ._typing import DeserializingFunction
+from ._typing import RequestIterableType
+from ._typing import SerializingFunction
class UnaryUnaryMultiCallable(abc.ABC):
diff --git a/src/python/grpcio/grpc/aio/_base_server.py b/src/python/grpcio/grpc/aio/_base_server.py
index e22ef3e830..cddaf4a181 100644
--- a/src/python/grpcio/grpc/aio/_base_server.py
+++ b/src/python/grpcio/grpc/aio/_base_server.py
@@ -14,12 +14,13 @@
"""Abstract base classes for server-side classes."""
import abc
-from typing import Generic, Mapping, Optional, Iterable, Sequence
+from typing import Generic, Iterable, Mapping, Optional, Sequence
import grpc
-from ._typing import RequestType, ResponseType
from ._metadata import Metadata
+from ._typing import RequestType
+from ._typing import ResponseType
class Server(abc.ABC):
diff --git a/src/python/grpcio/grpc/aio/_call.py b/src/python/grpcio/grpc/aio/_call.py
index def89b4df0..ef3a624bec 100644
--- a/src/python/grpcio/grpc/aio/_call.py
+++ b/src/python/grpcio/grpc/aio/_call.py
@@ -15,9 +15,10 @@
import asyncio
import enum
+from functools import partial
import inspect
import logging
-from functools import partial
+import traceback
from typing import AsyncIterable, Optional, Tuple
import grpc
@@ -26,9 +27,13 @@ from grpc._cython import cygrpc
from . import _base_call
from ._metadata import Metadata
-from ._typing import (DeserializingFunction, DoneCallbackType, MetadatumType,
- RequestIterableType, RequestType, ResponseType,
- SerializingFunction)
+from ._typing import DeserializingFunction
+from ._typing import DoneCallbackType
+from ._typing import MetadatumType
+from ._typing import RequestIterableType
+from ._typing import RequestType
+from ._typing import ResponseType
+from ._typing import SerializingFunction
__all__ = 'AioRpcError', 'Call', 'UnaryUnaryCall', 'UnaryStreamCall'
@@ -399,18 +404,31 @@ class _StreamRequestMixin(Call):
if inspect.isasyncgen(request_iterator) or hasattr(
request_iterator, '__aiter__'):
async for request in request_iterator:
- await self._write(request)
+ try:
+ await self._write(request)
+ except AioRpcError as rpc_error:
+ _LOGGER.debug(
+ 'Exception while consuming the request_iterator: %s',
+ rpc_error)
+ return
else:
for request in request_iterator:
- await self._write(request)
+ try:
+ await self._write(request)
+ except AioRpcError as rpc_error:
+ _LOGGER.debug(
+ 'Exception while consuming the request_iterator: %s',
+ rpc_error)
+ return
await self._done_writing()
- except AioRpcError as rpc_error:
- # Rpc status should be exposed through other API. Exceptions raised
- # within this Task won't be retrieved by another coroutine. It's
- # better to suppress the error than spamming users' screen.
- _LOGGER.debug('Exception while consuming the request_iterator: %s',
- rpc_error)
+ except: # pylint: disable=bare-except
+ # Client iterators can raise exceptions, which we should handle by
+ # cancelling the RPC and logging the client's error. No exceptions
+ # should escape this function.
+ _LOGGER.debug('Client request_iterator raised exception:\n%s',
+ traceback.format_exc())
+ self.cancel()
async def _write(self, request: RequestType) -> None:
if self.done():
diff --git a/src/python/grpcio/grpc/aio/_channel.py b/src/python/grpcio/grpc/aio/_channel.py
index 99f256e0b9..560df92759 100644
--- a/src/python/grpcio/grpc/aio/_channel.py
+++ b/src/python/grpcio/grpc/aio/_channel.py
@@ -15,23 +15,34 @@
import asyncio
import sys
-from typing import Any, Iterable, Optional, Sequence, List
+from typing import Any, Iterable, List, Optional, Sequence
import grpc
-from grpc import _common, _compression, _grpcio_metadata
+from grpc import _common
+from grpc import _compression
+from grpc import _grpcio_metadata
from grpc._cython import cygrpc
-from . import _base_call, _base_channel
-from ._call import (StreamStreamCall, StreamUnaryCall, UnaryStreamCall,
- UnaryUnaryCall)
-from ._interceptor import (
- InterceptedUnaryUnaryCall, InterceptedUnaryStreamCall,
- InterceptedStreamUnaryCall, InterceptedStreamStreamCall, ClientInterceptor,
- UnaryUnaryClientInterceptor, UnaryStreamClientInterceptor,
- StreamUnaryClientInterceptor, StreamStreamClientInterceptor)
+from . import _base_call
+from . import _base_channel
+from ._call import StreamStreamCall
+from ._call import StreamUnaryCall
+from ._call import UnaryStreamCall
+from ._call import UnaryUnaryCall
+from ._interceptor import ClientInterceptor
+from ._interceptor import InterceptedStreamStreamCall
+from ._interceptor import InterceptedStreamUnaryCall
+from ._interceptor import InterceptedUnaryStreamCall
+from ._interceptor import InterceptedUnaryUnaryCall
+from ._interceptor import StreamStreamClientInterceptor
+from ._interceptor import StreamUnaryClientInterceptor
+from ._interceptor import UnaryStreamClientInterceptor
+from ._interceptor import UnaryUnaryClientInterceptor
from ._metadata import Metadata
-from ._typing import (ChannelArgumentType, DeserializingFunction,
- SerializingFunction, RequestIterableType)
+from ._typing import ChannelArgumentType
+from ._typing import DeserializingFunction
+from ._typing import RequestIterableType
+from ._typing import SerializingFunction
from ._utils import _timeout_to_deadline
_USER_AGENT = 'grpc-python-asyncio/{}'.format(_grpcio_metadata.__version__)
diff --git a/src/python/grpcio/grpc/aio/_interceptor.py b/src/python/grpcio/grpc/aio/_interceptor.py
index b40aa96308..8d6519ffc6 100644
--- a/src/python/grpcio/grpc/aio/_interceptor.py
+++ b/src/python/grpcio/grpc/aio/_interceptor.py
@@ -12,24 +12,35 @@
# See the License for the specific language governing permissions and
# limitations under the License.
"""Interceptors implementation of gRPC Asyncio Python."""
+from abc import ABCMeta
+from abc import abstractmethod
import asyncio
import collections
import functools
-from abc import ABCMeta, abstractmethod
-from typing import Callable, Optional, Iterator, Sequence, Union, Awaitable, AsyncIterable
+from typing import (AsyncIterable, Awaitable, Callable, Iterator, Optional,
+ Sequence, Union)
import grpc
from grpc._cython import cygrpc
from . import _base_call
-from ._call import UnaryUnaryCall, UnaryStreamCall, StreamUnaryCall, StreamStreamCall, AioRpcError
-from ._call import _RPC_ALREADY_FINISHED_DETAILS, _RPC_HALF_CLOSED_DETAILS
+from ._call import AioRpcError
+from ._call import StreamStreamCall
+from ._call import StreamUnaryCall
+from ._call import UnaryStreamCall
+from ._call import UnaryUnaryCall
from ._call import _API_STYLE_ERROR
-from ._utils import _timeout_to_deadline
-from ._typing import (RequestType, SerializingFunction, DeserializingFunction,
- ResponseType, DoneCallbackType, RequestIterableType,
- ResponseIterableType)
+from ._call import _RPC_ALREADY_FINISHED_DETAILS
+from ._call import _RPC_HALF_CLOSED_DETAILS
from ._metadata import Metadata
+from ._typing import DeserializingFunction
+from ._typing import DoneCallbackType
+from ._typing import RequestIterableType
+from ._typing import RequestType
+from ._typing import ResponseIterableType
+from ._typing import ResponseType
+from ._typing import SerializingFunction
+from ._utils import _timeout_to_deadline
_LOCAL_CANCELLATION_DETAILS = 'Locally cancelled by application!'
diff --git a/src/python/grpcio/grpc/aio/_metadata.py b/src/python/grpcio/grpc/aio/_metadata.py
index 3c7d924404..970f62c059 100644
--- a/src/python/grpcio/grpc/aio/_metadata.py
+++ b/src/python/grpcio/grpc/aio/_metadata.py
@@ -12,8 +12,9 @@
# See the License for the specific language governing permissions and
# limitations under the License.
"""Implementation of the metadata abstraction for gRPC Asyncio Python."""
-from typing import List, Tuple, Iterator, Any, Union
-from collections import abc, OrderedDict
+from collections import OrderedDict
+from collections import abc
+from typing import Any, Iterator, List, Tuple, Union
MetadataKey = str
MetadataValue = Union[str, bytes]
diff --git a/src/python/grpcio/grpc/aio/_server.py b/src/python/grpcio/grpc/aio/_server.py
index 4d7cb75892..c4c0891f8d 100644
--- a/src/python/grpcio/grpc/aio/_server.py
+++ b/src/python/grpcio/grpc/aio/_server.py
@@ -17,12 +17,13 @@ from concurrent.futures import Executor
from typing import Any, Optional, Sequence
import grpc
-from grpc import _common, _compression
+from grpc import _common
+from grpc import _compression
from grpc._cython import cygrpc
from . import _base_server
-from ._typing import ChannelArgumentType
from ._interceptor import ServerInterceptor
+from ._typing import ChannelArgumentType
def _augment_channel_arguments(base_options: ChannelArgumentType,
diff --git a/src/python/grpcio/grpc/aio/_typing.py b/src/python/grpcio/grpc/aio/_typing.py
index 7e2e8da8a0..0687187d32 100644
--- a/src/python/grpcio/grpc/aio/_typing.py
+++ b/src/python/grpcio/grpc/aio/_typing.py
@@ -17,7 +17,10 @@ from typing import (Any, AsyncIterable, Callable, Iterable, Sequence, Tuple,
TypeVar, Union)
from grpc._cython.cygrpc import EOF
-from ._metadata import Metadata, MetadataKey, MetadataValue
+
+from ._metadata import Metadata
+from ._metadata import MetadataKey
+from ._metadata import MetadataValue
RequestType = TypeVar('RequestType')
ResponseType = TypeVar('ResponseType')
diff --git a/src/python/grpcio/grpc/beta/implementations.py b/src/python/grpcio/grpc/beta/implementations.py
index c5507b543f..43312aac7c 100644
--- a/src/python/grpcio/grpc/beta/implementations.py
+++ b/src/python/grpcio/grpc/beta/implementations.py
@@ -25,7 +25,8 @@ from grpc.beta import _metadata
from grpc.beta import _server_adaptations
from grpc.beta import interfaces # pylint: disable=unused-import
from grpc.framework.common import cardinality # pylint: disable=unused-import
-from grpc.framework.interfaces.face import face # pylint: disable=unused-import
+from grpc.framework.interfaces.face import \
+ face # pylint: disable=unused-import
# pylint: disable=too-many-arguments
diff --git a/src/python/grpcio/grpc/beta/interfaces.py b/src/python/grpcio/grpc/beta/interfaces.py
index fb8266c74b..a1713329cc 100644
--- a/src/python/grpcio/grpc/beta/interfaces.py
+++ b/src/python/grpcio/grpc/beta/interfaces.py
@@ -15,9 +15,8 @@
import abc
-import six
-
import grpc
+import six
ChannelConnectivity = grpc.ChannelConnectivity
# FATAL_FAILURE was a Beta-API name for SHUTDOWN
diff --git a/src/python/grpcio/grpc/experimental/__init__.py b/src/python/grpcio/grpc/experimental/__init__.py
index c820bc9db3..f0d142c981 100644
--- a/src/python/grpcio/grpc/experimental/__init__.py
+++ b/src/python/grpcio/grpc/experimental/__init__.py
@@ -121,5 +121,8 @@ __all__ = (
)
if sys.version_info > (3, 6):
- from grpc._simple_stubs import unary_unary, unary_stream, stream_unary, stream_stream
+ from grpc._simple_stubs import stream_stream
+ from grpc._simple_stubs import stream_unary
+ from grpc._simple_stubs import unary_stream
+ from grpc._simple_stubs import unary_unary
__all__ = __all__ + (unary_unary, unary_stream, stream_unary, stream_stream)
diff --git a/src/python/grpcio/grpc/framework/foundation/logging_pool.py b/src/python/grpcio/grpc/framework/foundation/logging_pool.py
index 421999fb1c..53d2cd0082 100644
--- a/src/python/grpcio/grpc/framework/foundation/logging_pool.py
+++ b/src/python/grpcio/grpc/framework/foundation/logging_pool.py
@@ -13,9 +13,8 @@
# limitations under the License.
"""A thread pool that logs exceptions raised by tasks executed within it."""
-import logging
-
from concurrent import futures
+import logging
_LOGGER = logging.getLogger(__name__)
diff --git a/src/python/grpcio/grpc/framework/interfaces/base/base.py b/src/python/grpcio/grpc/framework/interfaces/base/base.py
index 82c44f9110..9e63d6a931 100644
--- a/src/python/grpcio/grpc/framework/interfaces/base/base.py
+++ b/src/python/grpcio/grpc/framework/interfaces/base/base.py
@@ -28,9 +28,6 @@ import threading # pylint: disable=unused-import
import six
-# abandonment is referenced from specification in this module.
-from grpc.framework.foundation import abandonment # pylint: disable=unused-import
-
# pylint: disable=too-many-arguments
diff --git a/src/python/grpcio/grpc/framework/interfaces/face/face.py b/src/python/grpcio/grpc/framework/interfaces/face/face.py
index 5b47f11d0d..be173978c0 100644
--- a/src/python/grpcio/grpc/framework/interfaces/face/face.py
+++ b/src/python/grpcio/grpc/framework/interfaces/face/face.py
@@ -17,15 +17,13 @@ import abc
import collections
import enum
-import six
-
# cardinality, style, abandonment, future, and stream are
# referenced from specification in this module.
from grpc.framework.common import cardinality # pylint: disable=unused-import
from grpc.framework.common import style # pylint: disable=unused-import
-from grpc.framework.foundation import abandonment # pylint: disable=unused-import
from grpc.framework.foundation import future # pylint: disable=unused-import
from grpc.framework.foundation import stream # pylint: disable=unused-import
+import six
# pylint: disable=too-many-arguments
diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py
index dff7fb1b5f..8eb2f865b5 100644
--- a/src/python/grpcio/grpc_core_dependencies.py
+++ b/src/python/grpcio/grpc_core_dependencies.py
@@ -105,6 +105,7 @@ CORE_SOURCE_FILES = [
'src/core/ext/transport/chttp2/transport/bin_decoder.cc',
'src/core/ext/transport/chttp2/transport/bin_encoder.cc',
'src/core/ext/transport/chttp2/transport/chttp2_plugin.cc',
+ 'src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc',
'src/core/ext/transport/chttp2/transport/chttp2_transport.cc',
'src/core/ext/transport/chttp2/transport/context_list.cc',
'src/core/ext/transport/chttp2/transport/flow_control.cc',
@@ -147,14 +148,17 @@ CORE_SOURCE_FILES = [
'src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c',
'src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c',
'src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c',
+ 'src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c',
'src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c',
'src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c',
+ 'src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c',
'src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c',
'src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c',
'src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c',
'src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c',
'src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c',
'src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c',
+ 'src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c',
'src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c',
'src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c',
'src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c',
@@ -181,6 +185,7 @@ CORE_SOURCE_FILES = [
'src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c',
'src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c',
'src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c',
+ 'src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c',
'src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c',
'src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c',
'src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c',
@@ -246,14 +251,17 @@ CORE_SOURCE_FILES = [
'src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c',
@@ -279,6 +287,7 @@ CORE_SOURCE_FILES = [
'src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c',
@@ -353,7 +362,6 @@ CORE_SOURCE_FILES = [
'src/core/lib/debug/trace.cc',
'src/core/lib/event_engine/endpoint_config.cc',
'src/core/lib/event_engine/event_engine.cc',
- 'src/core/lib/event_engine/slice_allocator.cc',
'src/core/lib/event_engine/sockaddr.cc',
'src/core/lib/gpr/alloc.cc',
'src/core/lib/gpr/atm.cc',
diff --git a/src/python/grpcio/grpc_version.py b/src/python/grpcio/grpc_version.py
index 30b1d5c2eb..96693cfb70 100644
--- a/src/python/grpcio/grpc_version.py
+++ b/src/python/grpcio/grpc_version.py
@@ -14,4 +14,4 @@
# AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio/grpc_version.py.template`!!!
-VERSION = '1.39.1'
+VERSION = '1.40.0'
diff --git a/src/python/grpcio/support.py b/src/python/grpcio/support.py
index 217f3cb9ed..3d64b3170c 100644
--- a/src/python/grpcio/support.py
+++ b/src/python/grpcio/support.py
@@ -12,14 +12,13 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+from distutils import errors
import os
import os.path
import shutil
import sys
import tempfile
-from distutils import errors
-
import commands
C_PYTHON_DEV = """
diff --git a/src/python/grpcio_admin/grpc_admin/__init__.py b/src/python/grpcio_admin/grpc_admin/__init__.py
index 96dfca1e31..95e70858b3 100644
--- a/src/python/grpcio_admin/grpc_admin/__init__.py
+++ b/src/python/grpcio_admin/grpc_admin/__init__.py
@@ -13,8 +13,8 @@
# limitations under the License.
"""gRPC Python's Admin interface."""
-import grpc_csds
from grpc_channelz.v1 import channelz
+import grpc_csds
def add_admin_servicers(server):
diff --git a/src/python/grpcio_admin/grpc_version.py b/src/python/grpcio_admin/grpc_version.py
index b750234142..4b5a8b2374 100644
--- a/src/python/grpcio_admin/grpc_version.py
+++ b/src/python/grpcio_admin/grpc_version.py
@@ -14,4 +14,4 @@
# AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_admin/grpc_version.py.template`!!!
-VERSION = '1.39.1'
+VERSION = '1.40.0'
diff --git a/src/python/grpcio_admin/setup.py b/src/python/grpcio_admin/setup.py
index 6c2438ef5e..08f2a6e7da 100644
--- a/src/python/grpcio_admin/setup.py
+++ b/src/python/grpcio_admin/setup.py
@@ -30,7 +30,6 @@ import grpc_version
CLASSIFIERS = [
'Development Status :: 5 - Production/Stable',
'Programming Language :: Python',
- 'Programming Language :: Python :: 2',
'Programming Language :: Python :: 3',
'License :: OSI Approved :: Apache Software License',
]
diff --git a/src/python/grpcio_channelz/grpc_channelz/v1/_async.py b/src/python/grpcio_channelz/grpc_channelz/v1/_async.py
index 3f0d93fdc3..463f5e14dc 100644
--- a/src/python/grpcio_channelz/grpc_channelz/v1/_async.py
+++ b/src/python/grpcio_channelz/grpc_channelz/v1/_async.py
@@ -14,10 +14,10 @@
"""AsyncIO version of Channelz servicer."""
from grpc.experimental import aio
-
+from grpc_channelz.v1._servicer import \
+ ChannelzServicer as _SyncChannelzServicer
import grpc_channelz.v1.channelz_pb2 as _channelz_pb2
import grpc_channelz.v1.channelz_pb2_grpc as _channelz_pb2_grpc
-from grpc_channelz.v1._servicer import ChannelzServicer as _SyncChannelzServicer
class ChannelzServicer(_channelz_pb2_grpc.ChannelzServicer):
diff --git a/src/python/grpcio_channelz/grpc_channelz/v1/_servicer.py b/src/python/grpcio_channelz/grpc_channelz/v1/_servicer.py
index 6ba28f56a3..2d44976ec1 100644
--- a/src/python/grpcio_channelz/grpc_channelz/v1/_servicer.py
+++ b/src/python/grpcio_channelz/grpc_channelz/v1/_servicer.py
@@ -13,14 +13,12 @@
# limitations under the License.
"""Channelz debug service implementation in gRPC Python."""
+from google.protobuf import json_format
import grpc
from grpc._cython import cygrpc
-
import grpc_channelz.v1.channelz_pb2 as _channelz_pb2
import grpc_channelz.v1.channelz_pb2_grpc as _channelz_pb2_grpc
-from google.protobuf import json_format
-
class ChannelzServicer(_channelz_pb2_grpc.ChannelzServicer):
"""Servicer handling RPCs for service statuses."""
diff --git a/src/python/grpcio_channelz/grpc_channelz/v1/channelz.py b/src/python/grpcio_channelz/grpc_channelz/v1/channelz.py
index 508fad5397..605150b79a 100644
--- a/src/python/grpcio_channelz/grpc_channelz/v1/channelz.py
+++ b/src/python/grpcio_channelz/grpc_channelz/v1/channelz.py
@@ -14,10 +14,10 @@
"""Channelz debug service implementation in gRPC Python."""
import sys
-import grpc
-import grpc_channelz.v1.channelz_pb2_grpc as _channelz_pb2_grpc
+import grpc
from grpc_channelz.v1._servicer import ChannelzServicer
+import grpc_channelz.v1.channelz_pb2_grpc as _channelz_pb2_grpc
_add_channelz_servicer_doc = """Add Channelz servicer to a server.
diff --git a/src/python/grpcio_channelz/grpc_version.py b/src/python/grpcio_channelz/grpc_version.py
index 54ed6b9689..4c490a2170 100644
--- a/src/python/grpcio_channelz/grpc_version.py
+++ b/src/python/grpcio_channelz/grpc_version.py
@@ -14,4 +14,4 @@
# AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_channelz/grpc_version.py.template`!!!
-VERSION = '1.39.1'
+VERSION = '1.40.0'
diff --git a/src/python/grpcio_channelz/setup.py b/src/python/grpcio_channelz/setup.py
index 678b5ef13f..8982a4a061 100644
--- a/src/python/grpcio_channelz/setup.py
+++ b/src/python/grpcio_channelz/setup.py
@@ -47,8 +47,6 @@ class _NoOpCommand(setuptools.Command):
CLASSIFIERS = [
'Development Status :: 5 - Production/Stable',
'Programming Language :: Python',
- 'Programming Language :: Python :: 2',
- 'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
@@ -70,6 +68,7 @@ INSTALL_REQUIRES = (
try:
import channelz_commands as _channelz_commands
+
# we are in the build environment, otherwise the above import fails
SETUP_REQUIRES = ('grpcio-tools=={version}'.format(
version=grpc_version.VERSION),)
diff --git a/src/python/grpcio_csds/grpc_csds/__init__.py b/src/python/grpcio_csds/grpc_csds/__init__.py
index e30925585c..aa83465c61 100644
--- a/src/python/grpcio_csds/grpc_csds/__init__.py
+++ b/src/python/grpcio_csds/grpc_csds/__init__.py
@@ -13,13 +13,15 @@
# limitations under the License.
"""Channelz debug service implementation in gRPC Python."""
+from google.protobuf import json_format
from grpc._cython import cygrpc
-from google.protobuf import json_format
try:
- from envoy.service.status.v3 import csds_pb2, csds_pb2_grpc
+ from envoy.service.status.v3 import csds_pb2
+ from envoy.service.status.v3 import csds_pb2_grpc
except ImportError:
- from src.proto.grpc.testing.xds.v3 import csds_pb2, csds_pb2_grpc
+ from src.proto.grpc.testing.xds.v3 import csds_pb2
+ from src.proto.grpc.testing.xds.v3 import csds_pb2_grpc
class ClientStatusDiscoveryServiceServicer(
diff --git a/src/python/grpcio_csds/grpc_version.py b/src/python/grpcio_csds/grpc_version.py
index 98c413b24b..7bb8687ca9 100644
--- a/src/python/grpcio_csds/grpc_version.py
+++ b/src/python/grpcio_csds/grpc_version.py
@@ -14,4 +14,4 @@
# AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_csds/grpc_version.py.template`!!!
-VERSION = '1.39.1'
+VERSION = '1.40.0'
diff --git a/src/python/grpcio_csds/setup.py b/src/python/grpcio_csds/setup.py
index c699fc7d92..e0eb60a2de 100644
--- a/src/python/grpcio_csds/setup.py
+++ b/src/python/grpcio_csds/setup.py
@@ -30,7 +30,6 @@ import grpc_version
CLASSIFIERS = [
'Development Status :: 5 - Production/Stable',
'Programming Language :: Python',
- 'Programming Language :: Python :: 2',
'Programming Language :: Python :: 3',
'License :: OSI Approved :: Apache Software License',
]
diff --git a/src/python/grpcio_health_checking/grpc_health/v1/_async.py b/src/python/grpcio_health_checking/grpc_health/v1/_async.py
index de9712a7c5..b56a945c61 100644
--- a/src/python/grpcio_health_checking/grpc_health/v1/_async.py
+++ b/src/python/grpcio_health_checking/grpc_health/v1/_async.py
@@ -16,8 +16,8 @@
import asyncio
import collections
from typing import MutableMapping
-import grpc
+import grpc
from grpc_health.v1 import health_pb2 as _health_pb2
from grpc_health.v1 import health_pb2_grpc as _health_pb2_grpc
diff --git a/src/python/grpcio_health_checking/grpc_health/v1/health.py b/src/python/grpcio_health_checking/grpc_health/v1/health.py
index f7ee639ec8..e5f0e03213 100644
--- a/src/python/grpcio_health_checking/grpc_health/v1/health.py
+++ b/src/python/grpcio_health_checking/grpc_health/v1/health.py
@@ -14,10 +14,10 @@
"""Reference implementation for health checking in gRPC Python."""
import collections
-import threading
import sys
-import grpc
+import threading
+import grpc
from grpc_health.v1 import health_pb2 as _health_pb2
from grpc_health.v1 import health_pb2_grpc as _health_pb2_grpc
diff --git a/src/python/grpcio_health_checking/grpc_version.py b/src/python/grpcio_health_checking/grpc_version.py
index 458da90e6b..7ef3035269 100644
--- a/src/python/grpcio_health_checking/grpc_version.py
+++ b/src/python/grpcio_health_checking/grpc_version.py
@@ -14,4 +14,4 @@
# AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_health_checking/grpc_version.py.template`!!!
-VERSION = '1.39.1'
+VERSION = '1.40.0'
diff --git a/src/python/grpcio_health_checking/setup.py b/src/python/grpcio_health_checking/setup.py
index fa1fbbd55a..d2ed495a2d 100644
--- a/src/python/grpcio_health_checking/setup.py
+++ b/src/python/grpcio_health_checking/setup.py
@@ -46,8 +46,6 @@ class _NoOpCommand(setuptools.Command):
CLASSIFIERS = [
'Development Status :: 5 - Production/Stable',
'Programming Language :: Python',
- 'Programming Language :: Python :: 2',
- 'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
@@ -69,6 +67,7 @@ INSTALL_REQUIRES = (
try:
import health_commands as _health_commands
+
# we are in the build environment, otherwise the above import fails
SETUP_REQUIRES = ('grpcio-tools=={version}'.format(
version=grpc_version.VERSION),)
diff --git a/src/python/grpcio_reflection/grpc_reflection/v1alpha/_async.py b/src/python/grpcio_reflection/grpc_reflection/v1alpha/_async.py
index 6117dd25e5..1806fe35bc 100644
--- a/src/python/grpcio_reflection/grpc_reflection/v1alpha/_async.py
+++ b/src/python/grpcio_reflection/grpc_reflection/v1alpha/_async.py
@@ -16,7 +16,6 @@
from typing import AsyncIterable
import grpc
-
from grpc_reflection.v1alpha import reflection_pb2 as _reflection_pb2
from grpc_reflection.v1alpha._base import BaseReflectionServicer
diff --git a/src/python/grpcio_reflection/grpc_reflection/v1alpha/_base.py b/src/python/grpcio_reflection/grpc_reflection/v1alpha/_base.py
index 2c9e79c9dd..28eb2a36a7 100644
--- a/src/python/grpcio_reflection/grpc_reflection/v1alpha/_base.py
+++ b/src/python/grpcio_reflection/grpc_reflection/v1alpha/_base.py
@@ -13,10 +13,9 @@
# limitations under the License.
"""Base implementation of reflection servicer."""
-import grpc
from google.protobuf import descriptor_pb2
from google.protobuf import descriptor_pool
-
+import grpc
from grpc_reflection.v1alpha import reflection_pb2 as _reflection_pb2
from grpc_reflection.v1alpha import reflection_pb2_grpc as _reflection_pb2_grpc
diff --git a/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py b/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py
index 219f10ab61..3f0eb982b9 100644
--- a/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py
+++ b/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py
@@ -14,11 +14,10 @@
"""Reference implementation for reflection in gRPC Python."""
import sys
-import grpc
+import grpc
from grpc_reflection.v1alpha import reflection_pb2 as _reflection_pb2
from grpc_reflection.v1alpha import reflection_pb2_grpc as _reflection_pb2_grpc
-
from grpc_reflection.v1alpha._base import BaseReflectionServicer
SERVICE_NAME = _reflection_pb2.DESCRIPTOR.services_by_name[
@@ -64,9 +63,10 @@ Args:
if sys.version_info[0] >= 3 and sys.version_info[1] >= 6:
# Exposes AsyncReflectionServicer as public API.
- from . import _async as aio
from grpc.experimental import aio as grpc_aio # pylint: disable=ungrouped-imports
+ from . import _async as aio
+
def enable_server_reflection(service_names, server, pool=None):
if isinstance(server, grpc_aio.Server):
_reflection_pb2_grpc.add_ServerReflectionServicer_to_server(
diff --git a/src/python/grpcio_reflection/grpc_version.py b/src/python/grpcio_reflection/grpc_version.py
index b6dec680c0..647fabbe5b 100644
--- a/src/python/grpcio_reflection/grpc_version.py
+++ b/src/python/grpcio_reflection/grpc_version.py
@@ -14,4 +14,4 @@
# AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_reflection/grpc_version.py.template`!!!
-VERSION = '1.39.1'
+VERSION = '1.40.0'
diff --git a/src/python/grpcio_reflection/setup.py b/src/python/grpcio_reflection/setup.py
index 2d0a3fcdaa..c88bfd1afd 100644
--- a/src/python/grpcio_reflection/setup.py
+++ b/src/python/grpcio_reflection/setup.py
@@ -47,8 +47,6 @@ class _NoOpCommand(setuptools.Command):
CLASSIFIERS = [
'Development Status :: 5 - Production/Stable',
'Programming Language :: Python',
- 'Programming Language :: Python :: 2',
- 'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
@@ -70,6 +68,7 @@ INSTALL_REQUIRES = (
try:
import reflection_commands as _reflection_commands
+
# we are in the build environment, otherwise the above import fails
SETUP_REQUIRES = ('grpcio-tools=={version}'.format(
version=grpc_version.VERSION),)
diff --git a/src/python/grpcio_status/grpc_status/_async.py b/src/python/grpcio_status/grpc_status/_async.py
index a6a6f7ef6a..bbd3be8971 100644
--- a/src/python/grpcio_status/grpc_status/_async.py
+++ b/src/python/grpcio_status/grpc_status/_async.py
@@ -13,11 +13,11 @@
# limitations under the License.
"""Reference implementation for status mapping in gRPC Python."""
-from grpc.experimental import aio
-
from google.rpc import status_pb2
+from grpc.experimental import aio
-from ._common import code_to_grpc_status_code, GRPC_DETAILS_METADATA_KEY
+from ._common import GRPC_DETAILS_METADATA_KEY
+from ._common import code_to_grpc_status_code
async def from_call(call: aio.Call):
diff --git a/src/python/grpcio_status/grpc_status/rpc_status.py b/src/python/grpcio_status/grpc_status/rpc_status.py
index d0ec08e3a5..432e414f70 100644
--- a/src/python/grpcio_status/grpc_status/rpc_status.py
+++ b/src/python/grpcio_status/grpc_status/rpc_status.py
@@ -16,10 +16,11 @@
import collections
import sys
+from google.rpc import status_pb2
import grpc
-from google.rpc import status_pb2
-from ._common import code_to_grpc_status_code, GRPC_DETAILS_METADATA_KEY
+from ._common import GRPC_DETAILS_METADATA_KEY
+from ._common import code_to_grpc_status_code
class _Status(
diff --git a/src/python/grpcio_status/grpc_version.py b/src/python/grpcio_status/grpc_version.py
index 76c72e87c8..49380adc45 100644
--- a/src/python/grpcio_status/grpc_version.py
+++ b/src/python/grpcio_status/grpc_version.py
@@ -14,4 +14,4 @@
# AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_status/grpc_version.py.template`!!!
-VERSION = '1.39.1'
+VERSION = '1.40.0'
diff --git a/src/python/grpcio_status/setup.py b/src/python/grpcio_status/setup.py
index eb49069c34..5f1633ad23 100644
--- a/src/python/grpcio_status/setup.py
+++ b/src/python/grpcio_status/setup.py
@@ -46,8 +46,6 @@ class _NoOpCommand(setuptools.Command):
CLASSIFIERS = [
'Development Status :: 5 - Production/Stable',
'Programming Language :: Python',
- 'Programming Language :: Python :: 2',
- 'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
@@ -70,6 +68,7 @@ INSTALL_REQUIRES = (
try:
import status_commands as _status_commands
+
# we are in the build environment, otherwise the above import fails
COMMAND_CLASS = {
# Run preprocess from the repository *before* doing any packaging!
diff --git a/src/python/grpcio_testing/grpc_testing/__init__.py b/src/python/grpcio_testing/grpc_testing/__init__.py
index 65fdd1b8ca..235b3afcf4 100644
--- a/src/python/grpcio_testing/grpc_testing/__init__.py
+++ b/src/python/grpcio_testing/grpc_testing/__init__.py
@@ -14,11 +14,10 @@
"""Objects for use in testing gRPC Python-using application code."""
import abc
-import six
from google.protobuf import descriptor
-
import grpc
+import six
class UnaryUnaryChannelRpc(six.with_metaclass(abc.ABCMeta)):
diff --git a/src/python/grpcio_testing/grpc_testing/_server/_service.py b/src/python/grpcio_testing/grpc_testing/_server/_service.py
index a65628a121..661257e275 100644
--- a/src/python/grpcio_testing/grpc_testing/_server/_service.py
+++ b/src/python/grpcio_testing/grpc_testing/_server/_service.py
@@ -13,6 +13,7 @@
# limitations under the License.
import copy
+
import grpc
diff --git a/src/python/grpcio_testing/grpc_version.py b/src/python/grpcio_testing/grpc_version.py
index 547e5bd34c..020a2f65c3 100644
--- a/src/python/grpcio_testing/grpc_version.py
+++ b/src/python/grpcio_testing/grpc_version.py
@@ -14,4 +14,4 @@
# AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_testing/grpc_version.py.template`!!!
-VERSION = '1.39.1'
+VERSION = '1.40.0'
diff --git a/src/python/grpcio_testing/setup.py b/src/python/grpcio_testing/setup.py
index 1946793fe6..b976620484 100644
--- a/src/python/grpcio_testing/setup.py
+++ b/src/python/grpcio_testing/setup.py
@@ -55,6 +55,7 @@ INSTALL_REQUIRES = (
try:
import testing_commands as _testing_commands
+
# we are in the build environment, otherwise the above import fails
COMMAND_CLASS = {
# Run preprocess from the repository *before* doing any packaging!
diff --git a/src/python/grpcio_tests/commands.py b/src/python/grpcio_tests/commands.py
index ab7dbc5caa..84331aed63 100644
--- a/src/python/grpcio_tests/commands.py
+++ b/src/python/grpcio_tests/commands.py
@@ -248,9 +248,9 @@ class TestGevent(setuptools.Command):
from gevent import monkey
monkey.patch_all()
- import tests
-
import grpc.experimental.gevent
+
+ import tests
grpc.experimental.gevent.init_gevent()
import gevent
@@ -308,6 +308,7 @@ class RunInterop(test.test):
# edit the Python system path.
if self.use_asyncio:
import asyncio
+
from tests_aio.interop import server
sys.argv[1:] = self.args.split()
asyncio.get_event_loop().run_until_complete(server.serve())
diff --git a/src/python/grpcio_tests/grpc_version.py b/src/python/grpcio_tests/grpc_version.py
index 8256808a2e..c2f59633d6 100644
--- a/src/python/grpcio_tests/grpc_version.py
+++ b/src/python/grpcio_tests/grpc_version.py
@@ -14,4 +14,4 @@
# AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_tests/grpc_version.py.template`!!!
-VERSION = '1.39.1'
+VERSION = '1.40.0'
diff --git a/src/python/grpcio_tests/setup.py b/src/python/grpcio_tests/setup.py
index 87cccda425..90f722cc27 100644
--- a/src/python/grpcio_tests/setup.py
+++ b/src/python/grpcio_tests/setup.py
@@ -18,9 +18,8 @@ import os
import os.path
import sys
-import setuptools
-
import grpc_tools.command
+import setuptools
PY3 = sys.version_info.major == 3
diff --git a/src/python/grpcio_tests/tests/admin/test_admin.py b/src/python/grpcio_tests/tests/admin/test_admin.py
index 484cfa04db..5524f2f21b 100644
--- a/src/python/grpcio_tests/tests/admin/test_admin.py
+++ b/src/python/grpcio_tests/tests/admin/test_admin.py
@@ -13,14 +13,16 @@
# limitations under the License.
"""A test to ensure that admin services are registered correctly."""
+from concurrent.futures import ThreadPoolExecutor
import logging
import unittest
-from concurrent.futures import ThreadPoolExecutor
import grpc
import grpc_admin
-from grpc_csds import csds_pb2, csds_pb2_grpc
-from grpc_channelz.v1 import channelz_pb2, channelz_pb2_grpc
+from grpc_channelz.v1 import channelz_pb2
+from grpc_channelz.v1 import channelz_pb2_grpc
+from grpc_csds import csds_pb2
+from grpc_csds import csds_pb2_grpc
class TestAdmin(unittest.TestCase):
diff --git a/src/python/grpcio_tests/tests/channelz/_channelz_servicer_test.py b/src/python/grpcio_tests/tests/channelz/_channelz_servicer_test.py
index a500897029..a077a2d7ba 100644
--- a/src/python/grpcio_tests/tests/channelz/_channelz_servicer_test.py
+++ b/src/python/grpcio_tests/tests/channelz/_channelz_servicer_test.py
@@ -13,12 +13,10 @@
# limitations under the License.
"""Tests of grpc_channelz.v1.channelz."""
-import unittest
-
from concurrent import futures
+import unittest
import grpc
-
from grpc_channelz.v1 import channelz
from grpc_channelz.v1 import channelz_pb2
from grpc_channelz.v1 import channelz_pb2_grpc
diff --git a/src/python/grpcio_tests/tests/csds/test_csds.py b/src/python/grpcio_tests/tests/csds/test_csds.py
index f970943592..34b575d233 100644
--- a/src/python/grpcio_tests/tests/csds/test_csds.py
+++ b/src/python/grpcio_tests/tests/csds/test_csds.py
@@ -13,21 +13,23 @@
# limitations under the License.
"""A simple test to ensure that the Python wrapper can get xDS config."""
+from concurrent.futures import ThreadPoolExecutor
import logging
import os
import time
-from six.moves import queue
import unittest
-from concurrent.futures import ThreadPoolExecutor
+from google.protobuf import json_format
import grpc
import grpc_csds
+from six.moves import queue
-from google.protobuf import json_format
try:
- from envoy.service.status.v3 import csds_pb2, csds_pb2_grpc
+ from envoy.service.status.v3 import csds_pb2
+ from envoy.service.status.v3 import csds_pb2_grpc
except ImportError:
- from src.proto.grpc.testing.xds.v3 import csds_pb2, csds_pb2_grpc
+ from src.proto.grpc.testing.xds.v3 import csds_pb2
+ from src.proto.grpc.testing.xds.v3 import csds_pb2_grpc
_DUMMY_XDS_ADDRESS = 'xds:///foo.bar'
_DUMMY_BOOTSTRAP_FILE = """
diff --git a/src/python/grpcio_tests/tests/fork/_fork_interop_test.py b/src/python/grpcio_tests/tests/fork/_fork_interop_test.py
index a6fd5f8624..bf44ae1515 100644
--- a/src/python/grpcio_tests/tests/fork/_fork_interop_test.py
+++ b/src/python/grpcio_tests/tests/fork/_fork_interop_test.py
@@ -13,13 +13,15 @@
# limitations under the License.
"""Client-side fork interop tests as a unit test."""
-import six
import subprocess
import sys
import tempfile
import threading
import unittest
+
from grpc._cython import cygrpc
+import six
+
from tests.fork import methods
# New instance of multiprocessing.Process using fork without exec can and will
diff --git a/src/python/grpcio_tests/tests/fork/methods.py b/src/python/grpcio_tests/tests/fork/methods.py
index 3ccebcf651..a991272c6f 100644
--- a/src/python/grpcio_tests/tests/fork/methods.py
+++ b/src/python/grpcio_tests/tests/fork/methods.py
@@ -22,7 +22,6 @@ import threading
import time
import grpc
-
from six.moves import queue
from src.proto.grpc.testing import empty_pb2
diff --git a/src/python/grpcio_tests/tests/health_check/_health_servicer_test.py b/src/python/grpcio_tests/tests/health_check/_health_servicer_test.py
index 01345aaca0..eb187be21f 100644
--- a/src/python/grpcio_tests/tests/health_check/_health_servicer_test.py
+++ b/src/python/grpcio_tests/tests/health_check/_health_servicer_test.py
@@ -19,17 +19,15 @@ import time
import unittest
import grpc
-
from grpc_health.v1 import health
from grpc_health.v1 import health_pb2
from grpc_health.v1 import health_pb2_grpc
+from six.moves import queue
from tests.unit import test_common
from tests.unit import thread_pool
from tests.unit.framework.common import test_constants
-from six.moves import queue
-
_SERVING_SERVICE = 'grpc.test.TestServiceServing'
_UNKNOWN_SERVICE = 'grpc.test.TestServiceUnknown'
_NOT_SERVING_SERVICE = 'grpc.test.TestServiceNotServing'
diff --git a/src/python/grpcio_tests/tests/http2/negative_http2_client.py b/src/python/grpcio_tests/tests/http2/negative_http2_client.py
index 0753872b5e..138f61995c 100644
--- a/src/python/grpcio_tests/tests/http2/negative_http2_client.py
+++ b/src/python/grpcio_tests/tests/http2/negative_http2_client.py
@@ -14,11 +14,12 @@
"""The Python client used to test negative http2 conditions."""
import argparse
+import time
import grpc
-import time
-from src.proto.grpc.testing import test_pb2_grpc
+
from src.proto.grpc.testing import messages_pb2
+from src.proto.grpc.testing import test_pb2_grpc
def _validate_payload_type_and_length(response, expected_type, expected_length):
diff --git a/src/python/grpcio_tests/tests/interop/_insecure_intraop_test.py b/src/python/grpcio_tests/tests/interop/_insecure_intraop_test.py
index fecf31767a..4101dfb1c7 100644
--- a/src/python/grpcio_tests/tests/interop/_insecure_intraop_test.py
+++ b/src/python/grpcio_tests/tests/interop/_insecure_intraop_test.py
@@ -16,11 +16,11 @@
import unittest
import grpc
-from src.proto.grpc.testing import test_pb2_grpc
+from src.proto.grpc.testing import test_pb2_grpc
from tests.interop import _intraop_test_case
-from tests.interop import service
from tests.interop import server
+from tests.interop import service
from tests.unit import test_common
diff --git a/src/python/grpcio_tests/tests/interop/_secure_intraop_test.py b/src/python/grpcio_tests/tests/interop/_secure_intraop_test.py
index bf1f1b118b..cdd9b15fee 100644
--- a/src/python/grpcio_tests/tests/interop/_secure_intraop_test.py
+++ b/src/python/grpcio_tests/tests/interop/_secure_intraop_test.py
@@ -16,11 +16,11 @@
import unittest
import grpc
-from src.proto.grpc.testing import test_pb2_grpc
+from src.proto.grpc.testing import test_pb2_grpc
from tests.interop import _intraop_test_case
-from tests.interop import service
from tests.interop import resources
+from tests.interop import service
from tests.unit import test_common
_SERVER_HOST_OVERRIDE = 'foo.test.google.fr'
diff --git a/src/python/grpcio_tests/tests/interop/client.py b/src/python/grpcio_tests/tests/interop/client.py
index 4d35f7ca32..c95e81353d 100644
--- a/src/python/grpcio_tests/tests/interop/client.py
+++ b/src/python/grpcio_tests/tests/interop/client.py
@@ -19,8 +19,8 @@ import os
from google import auth as google_auth
from google.auth import jwt as google_auth_jwt
import grpc
-from src.proto.grpc.testing import test_pb2_grpc
+from src.proto.grpc.testing import test_pb2_grpc
from tests.interop import methods
from tests.interop import resources
diff --git a/src/python/grpcio_tests/tests/interop/resources.py b/src/python/grpcio_tests/tests/interop/resources.py
index a55919a60a..a47228a355 100644
--- a/src/python/grpcio_tests/tests/interop/resources.py
+++ b/src/python/grpcio_tests/tests/interop/resources.py
@@ -14,8 +14,8 @@
"""Constants and functions for data used in interoperability testing."""
import argparse
-import pkgutil
import os
+import pkgutil
_ROOT_CERTIFICATES_RESOURCE_PATH = 'credentials/ca.pem'
_PRIVATE_KEY_RESOURCE_PATH = 'credentials/server1.key'
diff --git a/src/python/grpcio_tests/tests/interop/server.py b/src/python/grpcio_tests/tests/interop/server.py
index c85adb0b0b..6286733edd 100644
--- a/src/python/grpcio_tests/tests/interop/server.py
+++ b/src/python/grpcio_tests/tests/interop/server.py
@@ -18,10 +18,10 @@ from concurrent import futures
import logging
import grpc
-from src.proto.grpc.testing import test_pb2_grpc
-from tests.interop import service
+from src.proto.grpc.testing import test_pb2_grpc
from tests.interop import resources
+from tests.interop import service
from tests.unit import test_common
logging.basicConfig()
diff --git a/src/python/grpcio_tests/tests/protoc_plugin/_python_plugin_test.py b/src/python/grpcio_tests/tests/protoc_plugin/_python_plugin_test.py
index 08bb7d4a4e..0899a19392 100644
--- a/src/python/grpcio_tests/tests/protoc_plugin/_python_plugin_test.py
+++ b/src/python/grpcio_tests/tests/protoc_plugin/_python_plugin_test.py
@@ -24,17 +24,16 @@ import tempfile
import threading
import unittest
-from six import moves
-
import grpc
import grpc.experimental
-from tests.unit import test_common
-from tests.unit.framework.common import test_constants
+from six import moves
import tests.protoc_plugin.protos.payload.test_payload_pb2 as payload_pb2
import tests.protoc_plugin.protos.requests.r.test_requests_pb2 as request_pb2
import tests.protoc_plugin.protos.responses.test_responses_pb2 as response_pb2
import tests.protoc_plugin.protos.service.test_service_pb2_grpc as service_pb2_grpc
+from tests.unit import test_common
+from tests.unit.framework.common import test_constants
# Identifiers of entities we expect to find in the generated module.
STUB_IDENTIFIER = 'TestServiceStub'
diff --git a/src/python/grpcio_tests/tests/protoc_plugin/_split_definitions_test.py b/src/python/grpcio_tests/tests/protoc_plugin/_split_definitions_test.py
index bb895e374c..3da93722e3 100644
--- a/src/python/grpcio_tests/tests/protoc_plugin/_split_definitions_test.py
+++ b/src/python/grpcio_tests/tests/protoc_plugin/_split_definitions_test.py
@@ -24,10 +24,10 @@ import sys
import tempfile
import unittest
-import six
-
import grpc
from grpc_tools import protoc
+import six
+
from tests.unit import test_common
_MESSAGES_IMPORT = b'import "messages.proto";'
diff --git a/src/python/grpcio_tests/tests/protoc_plugin/beta_python_plugin_test.py b/src/python/grpcio_tests/tests/protoc_plugin/beta_python_plugin_test.py
index 56f6871e5c..94de343166 100644
--- a/src/python/grpcio_tests/tests/protoc_plugin/beta_python_plugin_test.py
+++ b/src/python/grpcio_tests/tests/protoc_plugin/beta_python_plugin_test.py
@@ -23,13 +23,13 @@ import tempfile
import threading
import unittest
-from six import moves
-
from grpc.beta import implementations
from grpc.beta import interfaces
from grpc.framework.foundation import future
from grpc.framework.interfaces.face import face
from grpc_tools import protoc
+from six import moves
+
from tests.unit.framework.common import test_constants
_RELATIVE_PROTO_PATH = 'relative_proto_path'
diff --git a/src/python/grpcio_tests/tests/qps/benchmark_client.py b/src/python/grpcio_tests/tests/qps/benchmark_client.py
index 29cd35efb1..81d11c1865 100644
--- a/src/python/grpcio_tests/tests/qps/benchmark_client.py
+++ b/src/python/grpcio_tests/tests/qps/benchmark_client.py
@@ -14,15 +14,15 @@
"""Defines test client behaviors (UNARY/STREAMING) (SYNC/ASYNC)."""
import abc
+from concurrent import futures
import threading
import time
-from concurrent import futures
+import grpc
from six.moves import queue
-import grpc
-from src.proto.grpc.testing import messages_pb2
from src.proto.grpc.testing import benchmark_service_pb2_grpc
+from src.proto.grpc.testing import messages_pb2
from tests.unit import resources
from tests.unit import test_common
diff --git a/src/python/grpcio_tests/tests/qps/benchmark_server.py b/src/python/grpcio_tests/tests/qps/benchmark_server.py
index 75280bd771..644543086b 100644
--- a/src/python/grpcio_tests/tests/qps/benchmark_server.py
+++ b/src/python/grpcio_tests/tests/qps/benchmark_server.py
@@ -12,8 +12,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-from src.proto.grpc.testing import messages_pb2
from src.proto.grpc.testing import benchmark_service_pb2_grpc
+from src.proto.grpc.testing import messages_pb2
class BenchmarkServer(benchmark_service_pb2_grpc.BenchmarkServiceServicer):
diff --git a/src/python/grpcio_tests/tests/qps/qps_worker.py b/src/python/grpcio_tests/tests/qps/qps_worker.py
index de8eefbd7f..0708cc06f3 100644
--- a/src/python/grpcio_tests/tests/qps/qps_worker.py
+++ b/src/python/grpcio_tests/tests/qps/qps_worker.py
@@ -18,8 +18,8 @@ import logging
import time
import grpc
-from src.proto.grpc.testing import worker_service_pb2_grpc
+from src.proto.grpc.testing import worker_service_pb2_grpc
from tests.qps import worker_server
from tests.unit import test_common
diff --git a/src/python/grpcio_tests/tests/qps/worker_server.py b/src/python/grpcio_tests/tests/qps/worker_server.py
index 327b8e3b4c..1b5a7593b5 100644
--- a/src/python/grpcio_tests/tests/qps/worker_server.py
+++ b/src/python/grpcio_tests/tests/qps/worker_server.py
@@ -12,18 +12,18 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+from concurrent import futures
import multiprocessing
import random
import threading
import time
-from concurrent import futures
import grpc
-from src.proto.grpc.testing import control_pb2
+
from src.proto.grpc.testing import benchmark_service_pb2_grpc
-from src.proto.grpc.testing import worker_service_pb2_grpc
+from src.proto.grpc.testing import control_pb2
from src.proto.grpc.testing import stats_pb2
-
+from src.proto.grpc.testing import worker_service_pb2_grpc
from tests.qps import benchmark_client
from tests.qps import benchmark_server
from tests.qps import client_runner
diff --git a/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py b/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py
index 169e55022d..53f2857e3e 100644
--- a/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py
+++ b/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py
@@ -15,18 +15,15 @@
import unittest
+from google.protobuf import descriptor_pb2
+from google.protobuf import descriptor_pool
import grpc
-
from grpc_reflection.v1alpha import reflection
from grpc_reflection.v1alpha import reflection_pb2
from grpc_reflection.v1alpha import reflection_pb2_grpc
-from google.protobuf import descriptor_pool
-from google.protobuf import descriptor_pb2
-
from src.proto.grpc.testing import empty_pb2
from src.proto.grpc.testing.proto2 import empty2_extensions_pb2
-
from tests.unit import test_common
_EMPTY_PROTO_FILE_NAME = 'src/proto/grpc/testing/empty.proto'
diff --git a/src/python/grpcio_tests/tests/status/_grpc_status_test.py b/src/python/grpcio_tests/tests/status/_grpc_status_test.py
index 54a3b62420..efb1314c14 100644
--- a/src/python/grpcio_tests/tests/status/_grpc_status_test.py
+++ b/src/python/grpcio_tests/tests/status/_grpc_status_test.py
@@ -11,7 +11,10 @@
# 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.
-"""Tests of grpc_status."""
+"""Tests of grpc_status.
+
+isort:skip_file
+"""
# NOTE(lidiz) This module only exists in Bazel BUILD file, for more details
# please refer to comments in the "bazel_namespace_package_hack" module.
diff --git a/src/python/grpcio_tests/tests/stress/client.py b/src/python/grpcio_tests/tests/stress/client.py
index 01c14ba3e2..4481e61696 100644
--- a/src/python/grpcio_tests/tests/stress/client.py
+++ b/src/python/grpcio_tests/tests/stress/client.py
@@ -19,9 +19,9 @@ import threading
import grpc
from six.moves import queue
+
from src.proto.grpc.testing import metrics_pb2_grpc
from src.proto.grpc.testing import test_pb2_grpc
-
from tests.interop import methods
from tests.interop import resources
from tests.qps import histogram
diff --git a/src/python/grpcio_tests/tests/stress/unary_stream_benchmark.py b/src/python/grpcio_tests/tests/stress/unary_stream_benchmark.py
index cd872ece29..21d7e6c608 100644
--- a/src/python/grpcio_tests/tests/stress/unary_stream_benchmark.py
+++ b/src/python/grpcio_tests/tests/stress/unary_stream_benchmark.py
@@ -12,14 +12,15 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+import contextlib
import datetime
-import threading
-import grpc
-import grpc.experimental
import subprocess
import sys
+import threading
import time
-import contextlib
+
+import grpc
+import grpc.experimental
_PORT = 5741
_MESSAGE_SIZE = 4
@@ -49,8 +50,9 @@ server.wait_for_termination()
""" % _PORT
try:
+ from src.python.grpcio_tests.tests.stress import \
+ unary_stream_benchmark_pb2_grpc
from src.python.grpcio_tests.tests.stress import unary_stream_benchmark_pb2
- from src.python.grpcio_tests.tests.stress import unary_stream_benchmark_pb2_grpc
_GRPC_CHANNEL_OPTIONS = [
('grpc.max_metadata_size', 16 * 1024 * 1024),
diff --git a/src/python/grpcio_tests/tests/testing/_application_testing_common.py b/src/python/grpcio_tests/tests/testing/_application_testing_common.py
index 9c9e485a78..cac813c04d 100644
--- a/src/python/grpcio_tests/tests/testing/_application_testing_common.py
+++ b/src/python/grpcio_tests/tests/testing/_application_testing_common.py
@@ -18,7 +18,7 @@ from tests.testing.proto import requests_pb2
from tests.testing.proto import services_pb2
# TODO(https://github.com/grpc/grpc/issues/11657): Eliminate this entirely.
-# TODO(https://github.com/google/protobuf/issues/3452): Eliminate this if/else.
+# TODO(https://github.com/protocolbuffers/protobuf/issues/3452): Eliminate this if/else.
if services_pb2.DESCRIPTOR.services_by_name.get('FirstService') is None:
FIRST_SERVICE = 'Fix protobuf issue 3452!'
FIRST_SERVICE_UNUN = 'Fix protobuf issue 3452!'
diff --git a/src/python/grpcio_tests/tests/testing/_client_application.py b/src/python/grpcio_tests/tests/testing/_client_application.py
index 57fa510913..548ed30c93 100644
--- a/src/python/grpcio_tests/tests/testing/_client_application.py
+++ b/src/python/grpcio_tests/tests/testing/_client_application.py
@@ -19,13 +19,12 @@ import threading
import time
import grpc
-from tests.unit.framework.common import test_constants
+from tests.testing import _application_common
from tests.testing.proto import requests_pb2
from tests.testing.proto import services_pb2
from tests.testing.proto import services_pb2_grpc
-
-from tests.testing import _application_common
+from tests.unit.framework.common import test_constants
@enum.unique
diff --git a/src/python/grpcio_tests/tests/testing/_client_test.py b/src/python/grpcio_tests/tests/testing/_client_test.py
index 5b051c3939..d92a1a9733 100644
--- a/src/python/grpcio_tests/tests/testing/_client_test.py
+++ b/src/python/grpcio_tests/tests/testing/_client_test.py
@@ -18,7 +18,6 @@ import unittest
import grpc
from grpc.framework.foundation import logging_pool
-from tests.unit.framework.common import test_constants
import grpc_testing
from tests.testing import _application_common
@@ -26,9 +25,10 @@ from tests.testing import _application_testing_common
from tests.testing import _client_application
from tests.testing.proto import requests_pb2
from tests.testing.proto import services_pb2
+from tests.unit.framework.common import test_constants
-# TODO(https://github.com/google/protobuf/issues/3452): Drop this skip.
+# TODO(https://github.com/protocolbuffers/protobuf/issues/3452): Drop this skip.
@unittest.skipIf(
services_pb2.DESCRIPTOR.services_by_name.get('FirstService') is None,
'Fix protobuf issue 3452!')
diff --git a/src/python/grpcio_tests/tests/testing/_server_application.py b/src/python/grpcio_tests/tests/testing/_server_application.py
index 51ed977b8f..ffab6f5b93 100644
--- a/src/python/grpcio_tests/tests/testing/_server_application.py
+++ b/src/python/grpcio_tests/tests/testing/_server_application.py
@@ -13,10 +13,10 @@
# limitations under the License.
"""An example gRPC Python-using server-side application."""
-import grpc
-
import threading
+import grpc
+
# requests_pb2 is a semantic dependency of this module.
from tests.testing import _application_common
from tests.testing.proto import requests_pb2 # pylint: disable=unused-import
diff --git a/src/python/grpcio_tests/tests/unit/_abort_test.py b/src/python/grpcio_tests/tests/unit/_abort_test.py
index d2eaf97d5f..84604726c9 100644
--- a/src/python/grpcio_tests/tests/unit/_abort_test.py
+++ b/src/python/grpcio_tests/tests/unit/_abort_test.py
@@ -13,10 +13,10 @@
# limitations under the License.
"""Tests server context abort mechanism"""
-import unittest
import collections
import gc
import logging
+import unittest
import weakref
import grpc
diff --git a/src/python/grpcio_tests/tests/unit/_api_test.py b/src/python/grpcio_tests/tests/unit/_api_test.py
index e98632d0d2..bf3c72dd23 100644
--- a/src/python/grpcio_tests/tests/unit/_api_test.py
+++ b/src/python/grpcio_tests/tests/unit/_api_test.py
@@ -13,12 +13,11 @@
# limitations under the License.
"""Test of gRPC Python's application-layer API."""
-import unittest
import logging
-
-import six
+import unittest
import grpc
+import six
from tests.unit import _from_grpc_import_star
diff --git a/src/python/grpcio_tests/tests/unit/_auth_context_test.py b/src/python/grpcio_tests/tests/unit/_auth_context_test.py
index 817c528237..97a1308574 100644
--- a/src/python/grpcio_tests/tests/unit/_auth_context_test.py
+++ b/src/python/grpcio_tests/tests/unit/_auth_context_test.py
@@ -13,17 +13,17 @@
# limitations under the License.
"""Tests exposure of SSL auth context"""
+import logging
import pickle
import unittest
-import logging
import grpc
from grpc import _channel
from grpc.experimental import session_cache
import six
-from tests.unit import test_common
from tests.unit import resources
+from tests.unit import test_common
_REQUEST = b'\x00\x00\x00'
_RESPONSE = b'\x00\x00\x00'
diff --git a/src/python/grpcio_tests/tests/unit/_auth_test.py b/src/python/grpcio_tests/tests/unit/_auth_test.py
index d9df2add4f..345239e0b8 100644
--- a/src/python/grpcio_tests/tests/unit/_auth_test.py
+++ b/src/python/grpcio_tests/tests/unit/_auth_test.py
@@ -14,9 +14,9 @@
"""Tests of standard AuthMetadataPlugins."""
import collections
+import logging
import threading
import unittest
-import logging
from grpc import _auth
diff --git a/src/python/grpcio_tests/tests/unit/_channel_args_test.py b/src/python/grpcio_tests/tests/unit/_channel_args_test.py
index 2f2eea61db..d71906f6f4 100644
--- a/src/python/grpcio_tests/tests/unit/_channel_args_test.py
+++ b/src/python/grpcio_tests/tests/unit/_channel_args_test.py
@@ -14,8 +14,8 @@
"""Tests of channel arguments on client/server side."""
from concurrent import futures
-import unittest
import logging
+import unittest
import grpc
diff --git a/src/python/grpcio_tests/tests/unit/_channel_connectivity_test.py b/src/python/grpcio_tests/tests/unit/_channel_connectivity_test.py
index d1b4c3c932..912d8290a4 100644
--- a/src/python/grpcio_tests/tests/unit/_channel_connectivity_test.py
+++ b/src/python/grpcio_tests/tests/unit/_channel_connectivity_test.py
@@ -19,8 +19,9 @@ import time
import unittest
import grpc
-from tests.unit.framework.common import test_constants
+
from tests.unit import thread_pool
+from tests.unit.framework.common import test_constants
def _ready_in_connectivities(connectivities):
diff --git a/src/python/grpcio_tests/tests/unit/_channel_ready_future_test.py b/src/python/grpcio_tests/tests/unit/_channel_ready_future_test.py
index ca9ebc16fe..84a6f9196b 100644
--- a/src/python/grpcio_tests/tests/unit/_channel_ready_future_test.py
+++ b/src/python/grpcio_tests/tests/unit/_channel_ready_future_test.py
@@ -13,13 +13,14 @@
# limitations under the License.
"""Tests of grpc.channel_ready_future."""
+import logging
import threading
import unittest
-import logging
import grpc
-from tests.unit.framework.common import test_constants
+
from tests.unit import thread_pool
+from tests.unit.framework.common import test_constants
class _Callback(object):
diff --git a/src/python/grpcio_tests/tests/unit/_compression_test.py b/src/python/grpcio_tests/tests/unit/_compression_test.py
index bc58e1032c..9789afbfe7 100644
--- a/src/python/grpcio_tests/tests/unit/_compression_test.py
+++ b/src/python/grpcio_tests/tests/unit/_compression_test.py
@@ -13,21 +13,20 @@
# limitations under the License.
"""Tests server and client side compression."""
-import unittest
-
-import contextlib
from concurrent import futures
+import contextlib
import functools
import itertools
import logging
import os
+import unittest
import grpc
from grpc import _grpcio_metadata
+from tests.unit import _tcp_proxy
from tests.unit import test_common
from tests.unit.framework.common import test_constants
-from tests.unit import _tcp_proxy
_UNARY_UNARY = '/test/UnaryUnary'
_UNARY_STREAM = '/test/UnaryStream'
diff --git a/src/python/grpcio_tests/tests/unit/_contextvars_propagation_test.py b/src/python/grpcio_tests/tests/unit/_contextvars_propagation_test.py
index d97990aff9..9c94be5a1d 100644
--- a/src/python/grpcio_tests/tests/unit/_contextvars_propagation_test.py
+++ b/src/python/grpcio_tests/tests/unit/_contextvars_propagation_test.py
@@ -21,9 +21,9 @@ import threading
import unittest
import grpc
+from six.moves import queue
from tests.unit import test_common
-from six.moves import queue
_UNARY_UNARY = "/test/UnaryUnary"
_REQUEST = b"0000"
diff --git a/src/python/grpcio_tests/tests/unit/_credentials_test.py b/src/python/grpcio_tests/tests/unit/_credentials_test.py
index 187a6f0388..5b420eb73a 100644
--- a/src/python/grpcio_tests/tests/unit/_credentials_test.py
+++ b/src/python/grpcio_tests/tests/unit/_credentials_test.py
@@ -13,11 +13,11 @@
# limitations under the License.
"""Tests of credentials."""
-import unittest
import logging
-import six
+import unittest
import grpc
+import six
class CredentialsTest(unittest.TestCase):
diff --git a/src/python/grpcio_tests/tests/unit/_cython/_cancel_many_calls_test.py b/src/python/grpcio_tests/tests/unit/_cython/_cancel_many_calls_test.py
index c84dff614a..3ca0d686d6 100644
--- a/src/python/grpcio_tests/tests/unit/_cython/_cancel_many_calls_test.py
+++ b/src/python/grpcio_tests/tests/unit/_cython/_cancel_many_calls_test.py
@@ -18,8 +18,9 @@ import unittest
from grpc._cython import cygrpc
from grpc.framework.foundation import logging_pool
-from tests.unit.framework.common import test_constants
+
from tests.unit._cython import test_utilities
+from tests.unit.framework.common import test_constants
_EMPTY_FLAGS = 0
_EMPTY_METADATA = ()
diff --git a/src/python/grpcio_tests/tests/unit/_cython/_channel_test.py b/src/python/grpcio_tests/tests/unit/_cython/_channel_test.py
index 54f620523e..8f0b6fedc0 100644
--- a/src/python/grpcio_tests/tests/unit/_cython/_channel_test.py
+++ b/src/python/grpcio_tests/tests/unit/_cython/_channel_test.py
@@ -12,8 +12,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-import time
import threading
+import time
import unittest
from grpc._cython import cygrpc
diff --git a/src/python/grpcio_tests/tests/unit/_cython/_read_some_but_not_all_responses_test.py b/src/python/grpcio_tests/tests/unit/_cython/_read_some_but_not_all_responses_test.py
index 4aad924427..701ebcee5c 100644
--- a/src/python/grpcio_tests/tests/unit/_cython/_read_some_but_not_all_responses_test.py
+++ b/src/python/grpcio_tests/tests/unit/_cython/_read_some_but_not_all_responses_test.py
@@ -17,6 +17,7 @@ import threading
import unittest
from grpc._cython import cygrpc
+
from tests.unit._cython import test_utilities
_EMPTY_FLAGS = 0
diff --git a/src/python/grpcio_tests/tests/unit/_cython/cygrpc_test.py b/src/python/grpcio_tests/tests/unit/_cython/cygrpc_test.py
index 30cd5078ff..9021dc08d1 100644
--- a/src/python/grpcio_tests/tests/unit/_cython/cygrpc_test.py
+++ b/src/python/grpcio_tests/tests/unit/_cython/cygrpc_test.py
@@ -12,15 +12,16 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-import time
+import platform
import threading
+import time
import unittest
-import platform
from grpc._cython import cygrpc
-from tests.unit._cython import test_utilities
-from tests.unit import test_common
+
from tests.unit import resources
+from tests.unit import test_common
+from tests.unit._cython import test_utilities
_SSL_HOST_OVERRIDE = b'foo.test.google.fr'
_CALL_CREDENTIALS_METADATA_KEY = 'call-creds-key'
diff --git a/src/python/grpcio_tests/tests/unit/_dns_resolver_test.py b/src/python/grpcio_tests/tests/unit/_dns_resolver_test.py
index 43141255f1..22c4d52390 100644
--- a/src/python/grpcio_tests/tests/unit/_dns_resolver_test.py
+++ b/src/python/grpcio_tests/tests/unit/_dns_resolver_test.py
@@ -13,11 +13,12 @@
# limitations under the License.
"""Tests for an actual dns resolution."""
-import unittest
import logging
-import six
+import unittest
import grpc
+import six
+
from tests.unit import test_common
from tests.unit.framework.common import test_constants
diff --git a/src/python/grpcio_tests/tests/unit/_empty_message_test.py b/src/python/grpcio_tests/tests/unit/_empty_message_test.py
index f27ea422d0..918dbe73d1 100644
--- a/src/python/grpcio_tests/tests/unit/_empty_message_test.py
+++ b/src/python/grpcio_tests/tests/unit/_empty_message_test.py
@@ -12,8 +12,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-import unittest
import logging
+import unittest
import grpc
diff --git a/src/python/grpcio_tests/tests/unit/_exit_scenarios.py b/src/python/grpcio_tests/tests/unit/_exit_scenarios.py
index 48ea054d2d..301afb6c27 100644
--- a/src/python/grpcio_tests/tests/unit/_exit_scenarios.py
+++ b/src/python/grpcio_tests/tests/unit/_exit_scenarios.py
@@ -14,9 +14,9 @@
"""Defines a number of module-scope gRPC scenarios to test clean exit."""
import argparse
+import logging
import threading
import time
-import logging
import grpc
diff --git a/src/python/grpcio_tests/tests/unit/_exit_test.py b/src/python/grpcio_tests/tests/unit/_exit_test.py
index 925b37e05e..193491b822 100644
--- a/src/python/grpcio_tests/tests/unit/_exit_test.py
+++ b/src/python/grpcio_tests/tests/unit/_exit_test.py
@@ -18,16 +18,17 @@ test is considered successful if it doesn't freeze/timeout.
"""
import atexit
+import datetime
+import logging
import os
import signal
-import six
import subprocess
import sys
import threading
-import datetime
import time
import unittest
-import logging
+
+import six
from tests.unit import _exit_scenarios
diff --git a/src/python/grpcio_tests/tests/unit/_grpc_shutdown_test.py b/src/python/grpcio_tests/tests/unit/_grpc_shutdown_test.py
index 1c4890b97f..b1f43e061b 100644
--- a/src/python/grpcio_tests/tests/unit/_grpc_shutdown_test.py
+++ b/src/python/grpcio_tests/tests/unit/_grpc_shutdown_test.py
@@ -13,10 +13,10 @@
# limitations under the License.
"""Tests the gRPC Core shutdown path."""
-import time
+import datetime
import threading
+import time
import unittest
-import datetime
import grpc
diff --git a/src/python/grpcio_tests/tests/unit/_interceptor_test.py b/src/python/grpcio_tests/tests/unit/_interceptor_test.py
index 619db7b3ff..d8f3c90f41 100644
--- a/src/python/grpcio_tests/tests/unit/_interceptor_test.py
+++ b/src/python/grpcio_tests/tests/unit/_interceptor_test.py
@@ -14,12 +14,12 @@
"""Test of gRPC Python interceptors."""
import collections
+from concurrent import futures
import itertools
-import threading
-import unittest
import logging
import os
-from concurrent import futures
+import threading
+import unittest
import grpc
from grpc.framework.foundation import logging_pool
diff --git a/src/python/grpcio_tests/tests/unit/_invalid_metadata_test.py b/src/python/grpcio_tests/tests/unit/_invalid_metadata_test.py
index d1f1499d8c..c56b719c40 100644
--- a/src/python/grpcio_tests/tests/unit/_invalid_metadata_test.py
+++ b/src/python/grpcio_tests/tests/unit/_invalid_metadata_test.py
@@ -13,8 +13,8 @@
# limitations under the License.
"""Test of RPCs made against gRPC Python's application-layer API."""
-import unittest
import logging
+import unittest
import grpc
diff --git a/src/python/grpcio_tests/tests/unit/_invocation_defects_test.py b/src/python/grpcio_tests/tests/unit/_invocation_defects_test.py
index a0208b51df..cacb028c3b 100644
--- a/src/python/grpcio_tests/tests/unit/_invocation_defects_test.py
+++ b/src/python/grpcio_tests/tests/unit/_invocation_defects_test.py
@@ -12,8 +12,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-import unittest
import logging
+import unittest
import grpc
diff --git a/src/python/grpcio_tests/tests/unit/_local_credentials_test.py b/src/python/grpcio_tests/tests/unit/_local_credentials_test.py
index cd1f71dbee..ce92feed4b 100644
--- a/src/python/grpcio_tests/tests/unit/_local_credentials_test.py
+++ b/src/python/grpcio_tests/tests/unit/_local_credentials_test.py
@@ -13,9 +13,10 @@
# limitations under the License.
"""Test of RPCs made using local credentials."""
-import unittest
-import os
from concurrent.futures import ThreadPoolExecutor
+import os
+import unittest
+
import grpc
diff --git a/src/python/grpcio_tests/tests/unit/_logging_test.py b/src/python/grpcio_tests/tests/unit/_logging_test.py
index 1b8335a52a..8103a6d5fe 100644
--- a/src/python/grpcio_tests/tests/unit/_logging_test.py
+++ b/src/python/grpcio_tests/tests/unit/_logging_test.py
@@ -13,11 +13,12 @@
# limitations under the License.
"""Test of gRPC Python's interaction with the python logging module"""
-import unittest
import logging
-import grpc
import subprocess
import sys
+import unittest
+
+import grpc
INTERPRETER = sys.executable
diff --git a/src/python/grpcio_tests/tests/unit/_metadata_code_details_test.py b/src/python/grpcio_tests/tests/unit/_metadata_code_details_test.py
index 900fabd19a..89c028b307 100644
--- a/src/python/grpcio_tests/tests/unit/_metadata_code_details_test.py
+++ b/src/python/grpcio_tests/tests/unit/_metadata_code_details_test.py
@@ -13,9 +13,9 @@
# limitations under the License.
"""Tests application-provided metadata, status code, and details."""
+import logging
import threading
import unittest
-import logging
import grpc
diff --git a/src/python/grpcio_tests/tests/unit/_metadata_flags_test.py b/src/python/grpcio_tests/tests/unit/_metadata_flags_test.py
index 0dafc9e982..982ec90333 100644
--- a/src/python/grpcio_tests/tests/unit/_metadata_flags_test.py
+++ b/src/python/grpcio_tests/tests/unit/_metadata_flags_test.py
@@ -13,20 +13,20 @@
# limitations under the License.
"""Tests metadata flags feature by testing wait-for-ready semantics"""
-import time
-import weakref
-import unittest
-import threading
import logging
import socket
-from six.moves import queue
+import threading
+import time
+import unittest
+import weakref
import grpc
+from six.moves import queue
from tests.unit import test_common
-from tests.unit.framework.common import test_constants
import tests.unit.framework.common
from tests.unit.framework.common import get_socket
+from tests.unit.framework.common import test_constants
_UNARY_UNARY = '/test/UnaryUnary'
_UNARY_STREAM = '/test/UnaryStream'
diff --git a/src/python/grpcio_tests/tests/unit/_metadata_test.py b/src/python/grpcio_tests/tests/unit/_metadata_test.py
index 3e7717b04c..d975228d3b 100644
--- a/src/python/grpcio_tests/tests/unit/_metadata_test.py
+++ b/src/python/grpcio_tests/tests/unit/_metadata_test.py
@@ -13,9 +13,9 @@
# limitations under the License.
"""Tests server and client side metadata API."""
+import logging
import unittest
import weakref
-import logging
import grpc
from grpc import _channel
diff --git a/src/python/grpcio_tests/tests/unit/_reconnect_test.py b/src/python/grpcio_tests/tests/unit/_reconnect_test.py
index 16feb4b1ff..90d010b936 100644
--- a/src/python/grpcio_tests/tests/unit/_reconnect_test.py
+++ b/src/python/grpcio_tests/tests/unit/_reconnect_test.py
@@ -13,16 +13,16 @@
# limitations under the License.
"""Tests that a channel will reconnect if a connection is dropped"""
+import logging
import socket
import time
-import logging
import unittest
import grpc
from grpc.framework.foundation import logging_pool
-from tests.unit.framework.common import test_constants
from tests.unit.framework.common import bound_socket
+from tests.unit.framework.common import test_constants
_REQUEST = b'\x00\x00\x00'
_RESPONSE = b'\x00\x00\x01'
diff --git a/src/python/grpcio_tests/tests/unit/_resource_exhausted_test.py b/src/python/grpcio_tests/tests/unit/_resource_exhausted_test.py
index ecd2ccadbd..bd3272176e 100644
--- a/src/python/grpcio_tests/tests/unit/_resource_exhausted_test.py
+++ b/src/python/grpcio_tests/tests/unit/_resource_exhausted_test.py
@@ -13,9 +13,9 @@
# limitations under the License.
"""Tests server responding with RESOURCE_EXHAUSTED."""
+import logging
import threading
import unittest
-import logging
import grpc
from grpc import _channel
diff --git a/src/python/grpcio_tests/tests/unit/_rpc_part_1_test.py b/src/python/grpcio_tests/tests/unit/_rpc_part_1_test.py
index 9b0cb29a0d..1f85cd6f91 100644
--- a/src/python/grpcio_tests/tests/unit/_rpc_part_1_test.py
+++ b/src/python/grpcio_tests/tests/unit/_rpc_part_1_test.py
@@ -13,20 +13,26 @@
# limitations under the License.
"""Test of RPCs made against gRPC Python's application-layer API."""
+from concurrent import futures
import itertools
+import logging
import threading
import unittest
-import logging
-from concurrent import futures
import grpc
from grpc.framework.foundation import logging_pool
-from tests.unit._rpc_test_helpers import (
- TIMEOUT_SHORT, Callback, unary_unary_multi_callable,
- unary_stream_multi_callable, unary_stream_non_blocking_multi_callable,
- stream_unary_multi_callable, stream_stream_multi_callable,
- stream_stream_non_blocking_multi_callable, BaseRPCTest)
+from tests.unit._rpc_test_helpers import BaseRPCTest
+from tests.unit._rpc_test_helpers import Callback
+from tests.unit._rpc_test_helpers import TIMEOUT_SHORT
+from tests.unit._rpc_test_helpers import \
+ stream_stream_non_blocking_multi_callable
+from tests.unit._rpc_test_helpers import \
+ unary_stream_non_blocking_multi_callable
+from tests.unit._rpc_test_helpers import stream_stream_multi_callable
+from tests.unit._rpc_test_helpers import stream_unary_multi_callable
+from tests.unit._rpc_test_helpers import unary_stream_multi_callable
+from tests.unit._rpc_test_helpers import unary_unary_multi_callable
from tests.unit.framework.common import test_constants
diff --git a/src/python/grpcio_tests/tests/unit/_rpc_part_2_test.py b/src/python/grpcio_tests/tests/unit/_rpc_part_2_test.py
index 0e559efec2..a8e6ddeb53 100644
--- a/src/python/grpcio_tests/tests/unit/_rpc_part_2_test.py
+++ b/src/python/grpcio_tests/tests/unit/_rpc_part_2_test.py
@@ -13,20 +13,26 @@
# limitations under the License.
"""Test of RPCs made against gRPC Python's application-layer API."""
+from concurrent import futures
import itertools
+import logging
import threading
import unittest
-import logging
-from concurrent import futures
import grpc
from grpc.framework.foundation import logging_pool
-from tests.unit._rpc_test_helpers import (
- TIMEOUT_SHORT, Callback, unary_unary_multi_callable,
- unary_stream_multi_callable, unary_stream_non_blocking_multi_callable,
- stream_unary_multi_callable, stream_stream_multi_callable,
- stream_stream_non_blocking_multi_callable, BaseRPCTest)
+from tests.unit._rpc_test_helpers import BaseRPCTest
+from tests.unit._rpc_test_helpers import Callback
+from tests.unit._rpc_test_helpers import TIMEOUT_SHORT
+from tests.unit._rpc_test_helpers import \
+ stream_stream_non_blocking_multi_callable
+from tests.unit._rpc_test_helpers import \
+ unary_stream_non_blocking_multi_callable
+from tests.unit._rpc_test_helpers import stream_stream_multi_callable
+from tests.unit._rpc_test_helpers import stream_unary_multi_callable
+from tests.unit._rpc_test_helpers import unary_stream_multi_callable
+from tests.unit._rpc_test_helpers import unary_unary_multi_callable
from tests.unit.framework.common import test_constants
diff --git a/src/python/grpcio_tests/tests/unit/_server_shutdown_scenarios.py b/src/python/grpcio_tests/tests/unit/_server_shutdown_scenarios.py
index 1d1fdba11e..42f69ebe88 100644
--- a/src/python/grpcio_tests/tests/unit/_server_shutdown_scenarios.py
+++ b/src/python/grpcio_tests/tests/unit/_server_shutdown_scenarios.py
@@ -14,17 +14,17 @@
"""Defines a number of module-scope gRPC scenarios to test server shutdown."""
import argparse
+from concurrent import futures
+import logging
import os
import threading
import time
-import logging
import grpc
-from tests.unit import test_common
-
-from concurrent import futures
from six.moves import queue
+from tests.unit import test_common
+
WAIT_TIME = 1000
REQUEST = b'request'
diff --git a/src/python/grpcio_tests/tests/unit/_server_shutdown_test.py b/src/python/grpcio_tests/tests/unit/_server_shutdown_test.py
index 70ad1eb802..7067f1f4e3 100644
--- a/src/python/grpcio_tests/tests/unit/_server_shutdown_test.py
+++ b/src/python/grpcio_tests/tests/unit/_server_shutdown_test.py
@@ -18,12 +18,12 @@ test is considered successful if it doesn't freeze/timeout.
"""
import atexit
+import logging
import os
import subprocess
import sys
import threading
import unittest
-import logging
from tests.unit import _server_shutdown_scenarios
diff --git a/src/python/grpcio_tests/tests/unit/_server_ssl_cert_config_test.py b/src/python/grpcio_tests/tests/unit/_server_ssl_cert_config_test.py
index 35d992a33d..c20226830b 100644
--- a/src/python/grpcio_tests/tests/unit/_server_ssl_cert_config_test.py
+++ b/src/python/grpcio_tests/tests/unit/_server_ssl_cert_config_test.py
@@ -31,20 +31,20 @@ Core by extension, support for server certificate rotation.
import abc
import collections
+from concurrent import futures
+import logging
import os
-import six
import threading
import unittest
-import logging
-
-from concurrent import futures
import grpc
-from tests.unit import resources
-from tests.unit import test_common
+import six
+
from tests.testing import _application_common
from tests.testing import _server_application
from tests.testing.proto import services_pb2_grpc
+from tests.unit import resources
+from tests.unit import test_common
CA_1_PEM = resources.cert_hier_1_root_ca_cert()
CA_2_PEM = resources.cert_hier_2_root_ca_cert()
diff --git a/src/python/grpcio_tests/tests/unit/_server_test.py b/src/python/grpcio_tests/tests/unit/_server_test.py
index 3c519219d5..2cddaf4b81 100644
--- a/src/python/grpcio_tests/tests/unit/_server_test.py
+++ b/src/python/grpcio_tests/tests/unit/_server_test.py
@@ -13,8 +13,8 @@
# limitations under the License.
from concurrent import futures
-import unittest
import logging
+import unittest
import grpc
diff --git a/src/python/grpcio_tests/tests/unit/_server_wait_for_termination_test.py b/src/python/grpcio_tests/tests/unit/_server_wait_for_termination_test.py
index 3dd95ea8bf..065285a83c 100644
--- a/src/python/grpcio_tests/tests/unit/_server_wait_for_termination_test.py
+++ b/src/python/grpcio_tests/tests/unit/_server_wait_for_termination_test.py
@@ -14,14 +14,15 @@
from __future__ import division
-import datetime
from concurrent import futures
-import unittest
-import time
+import datetime
import threading
-import six
+import time
+import unittest
import grpc
+import six
+
from tests.unit.framework.common import test_constants
_WAIT_FOR_BLOCKING = datetime.timedelta(seconds=1)
diff --git a/src/python/grpcio_tests/tests/unit/_session_cache_test.py b/src/python/grpcio_tests/tests/unit/_session_cache_test.py
index 9bff4d2af0..6091219126 100644
--- a/src/python/grpcio_tests/tests/unit/_session_cache_test.py
+++ b/src/python/grpcio_tests/tests/unit/_session_cache_test.py
@@ -13,16 +13,16 @@
# limitations under the License.
"""Tests experimental TLS Session Resumption API"""
+import logging
import pickle
import unittest
-import logging
import grpc
from grpc import _channel
from grpc.experimental import session_cache
-from tests.unit import test_common
from tests.unit import resources
+from tests.unit import test_common
_REQUEST = b'\x00\x00\x00'
_RESPONSE = b'\x00\x00\x00'
diff --git a/src/python/grpcio_tests/tests/unit/_signal_handling_test.py b/src/python/grpcio_tests/tests/unit/_signal_handling_test.py
index 6f81e0b2d3..600bd8fce6 100644
--- a/src/python/grpcio_tests/tests/unit/_signal_handling_test.py
+++ b/src/python/grpcio_tests/tests/unit/_signal_handling_test.py
@@ -17,15 +17,15 @@ import logging
import os
import signal
import subprocess
+import sys
import tempfile
import threading
import unittest
-import sys
import grpc
-from tests.unit import test_common
from tests.unit import _signal_client
+from tests.unit import test_common
_CLIENT_PATH = None
if sys.executable is not None:
diff --git a/src/python/grpcio_tests/tests/unit/_version_test.py b/src/python/grpcio_tests/tests/unit/_version_test.py
index 3d37b319e5..a81e51e56c 100644
--- a/src/python/grpcio_tests/tests/unit/_version_test.py
+++ b/src/python/grpcio_tests/tests/unit/_version_test.py
@@ -13,9 +13,10 @@
# limitations under the License.
"""Test for grpc.__version__"""
+import logging
import unittest
+
import grpc
-import logging
from grpc import _grpcio_metadata
diff --git a/src/python/grpcio_tests/tests/unit/_xds_credentials_test.py b/src/python/grpcio_tests/tests/unit/_xds_credentials_test.py
index 91d30c68ad..64594061c0 100644
--- a/src/python/grpcio_tests/tests/unit/_xds_credentials_test.py
+++ b/src/python/grpcio_tests/tests/unit/_xds_credentials_test.py
@@ -13,16 +13,16 @@
# limitations under the License.
"""Tests xDS server and channel credentials."""
-import unittest
-
-import logging
from concurrent import futures
import contextlib
+import logging
+import unittest
import grpc
import grpc.experimental
-from tests.unit import test_common
+
from tests.unit import resources
+from tests.unit import test_common
class _GenericHandler(grpc.GenericRpcHandler):
diff --git a/src/python/grpcio_tests/tests/unit/beta/_beta_features_test.py b/src/python/grpcio_tests/tests/unit/beta/_beta_features_test.py
index a111d68764..0ce3a12739 100644
--- a/src/python/grpcio_tests/tests/unit/beta/_beta_features_test.py
+++ b/src/python/grpcio_tests/tests/unit/beta/_beta_features_test.py
@@ -20,6 +20,7 @@ from grpc.beta import implementations
from grpc.beta import interfaces
from grpc.framework.common import cardinality
from grpc.framework.interfaces.face import utilities
+
from tests.unit import resources
from tests.unit.beta import test_utilities
from tests.unit.framework.common import test_constants
diff --git a/src/python/grpcio_tests/tests/unit/beta/_implementations_test.py b/src/python/grpcio_tests/tests/unit/beta/_implementations_test.py
index 75a615eeff..cc2a2ea0a8 100644
--- a/src/python/grpcio_tests/tests/unit/beta/_implementations_test.py
+++ b/src/python/grpcio_tests/tests/unit/beta/_implementations_test.py
@@ -16,9 +16,9 @@
import datetime
import unittest
+from grpc.beta import implementations
from oauth2client import client as oauth2client_client
-from grpc.beta import implementations
from tests.unit import resources
diff --git a/src/python/grpcio_tests/tests/unit/beta/_not_found_test.py b/src/python/grpcio_tests/tests/unit/beta/_not_found_test.py
index 837d2bbebf..27fdecb8b7 100644
--- a/src/python/grpcio_tests/tests/unit/beta/_not_found_test.py
+++ b/src/python/grpcio_tests/tests/unit/beta/_not_found_test.py
@@ -18,6 +18,7 @@ import unittest
from grpc.beta import implementations
from grpc.beta import interfaces
from grpc.framework.interfaces.face import face
+
from tests.unit.framework.common import test_constants
diff --git a/src/python/grpcio_tests/tests/unit/beta/_utilities_test.py b/src/python/grpcio_tests/tests/unit/beta/_utilities_test.py
index e042262796..25773036f1 100644
--- a/src/python/grpcio_tests/tests/unit/beta/_utilities_test.py
+++ b/src/python/grpcio_tests/tests/unit/beta/_utilities_test.py
@@ -20,6 +20,7 @@ import unittest
from grpc.beta import implementations
from grpc.beta import utilities
from grpc.framework.foundation import future
+
from tests.unit.framework.common import test_constants
diff --git a/src/python/grpcio_tests/tests/unit/framework/common/__init__.py b/src/python/grpcio_tests/tests/unit/framework/common/__init__.py
index 8b58a0c46a..709f6175b2 100644
--- a/src/python/grpcio_tests/tests/unit/framework/common/__init__.py
+++ b/src/python/grpcio_tests/tests/unit/framework/common/__init__.py
@@ -13,9 +13,9 @@
# limitations under the License.
import contextlib
+import errno
import os
import socket
-import errno
_DEFAULT_SOCK_OPTIONS = (socket.SO_REUSEADDR,
socket.SO_REUSEPORT) if os.name != 'nt' else (
diff --git a/src/python/grpcio_tests/tests/unit/test_common.py b/src/python/grpcio_tests/tests/unit/test_common.py
index 59ded0752f..3b1e344247 100644
--- a/src/python/grpcio_tests/tests/unit/test_common.py
+++ b/src/python/grpcio_tests/tests/unit/test_common.py
@@ -14,9 +14,9 @@
"""Common code used throughout tests of gRPC."""
import collections
+from concurrent import futures
import threading
-from concurrent import futures
import grpc
import six
diff --git a/src/python/grpcio_tests/tests/unit/thread_pool.py b/src/python/grpcio_tests/tests/unit/thread_pool.py
index 094e203cd9..971806fd93 100644
--- a/src/python/grpcio_tests/tests/unit/thread_pool.py
+++ b/src/python/grpcio_tests/tests/unit/thread_pool.py
@@ -12,8 +12,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-import threading
from concurrent import futures
+import threading
class RecordingThreadPool(futures.ThreadPoolExecutor):
diff --git a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py
index 1f925ba3cd..301dba4bae 100644
--- a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py
+++ b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_client.py
@@ -15,15 +15,16 @@
import abc
import asyncio
-import time
import logging
import random
+import time
import grpc
from grpc.experimental import aio
-from src.proto.grpc.testing import (benchmark_service_pb2_grpc, control_pb2,
- messages_pb2)
+from src.proto.grpc.testing import benchmark_service_pb2_grpc
+from src.proto.grpc.testing import control_pb2
+from src.proto.grpc.testing import messages_pb2
from tests.qps import histogram
from tests.unit import resources
diff --git a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_servicer.py b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_servicer.py
index 50d3065cd1..b519554a56 100644
--- a/src/python/grpcio_tests/tests_aio/benchmark/benchmark_servicer.py
+++ b/src/python/grpcio_tests/tests_aio/benchmark/benchmark_servicer.py
@@ -19,7 +19,8 @@ import unittest
from grpc.experimental import aio
-from src.proto.grpc.testing import benchmark_service_pb2_grpc, messages_pb2
+from src.proto.grpc.testing import benchmark_service_pb2_grpc
+from src.proto.grpc.testing import messages_pb2
class BenchmarkServicer(benchmark_service_pb2_grpc.BenchmarkServiceServicer):
diff --git a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py
index 1893bb9f19..684beddb4a 100644
--- a/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py
+++ b/src/python/grpcio_tests/tests_aio/benchmark/worker_servicer.py
@@ -24,12 +24,15 @@ from typing import Tuple
import grpc
from grpc.experimental import aio
-from src.proto.grpc.testing import (benchmark_service_pb2_grpc, control_pb2,
- stats_pb2, worker_service_pb2_grpc)
+from src.proto.grpc.testing import benchmark_service_pb2_grpc
+from src.proto.grpc.testing import control_pb2
+from src.proto.grpc.testing import stats_pb2
+from src.proto.grpc.testing import worker_service_pb2_grpc
from tests.qps import histogram
from tests.unit import resources
from tests.unit.framework.common import get_socket
-from tests_aio.benchmark import benchmark_client, benchmark_servicer
+from tests_aio.benchmark import benchmark_client
+from tests_aio.benchmark import benchmark_servicer
_NUM_CORES = multiprocessing.cpu_count()
_WORKER_ENTRY_FILE = os.path.join(
diff --git a/src/python/grpcio_tests/tests_aio/channelz/channelz_servicer_test.py b/src/python/grpcio_tests/tests_aio/channelz/channelz_servicer_test.py
index d6e9fd4279..e400dc87dc 100644
--- a/src/python/grpcio_tests/tests_aio/channelz/channelz_servicer_test.py
+++ b/src/python/grpcio_tests/tests_aio/channelz/channelz_servicer_test.py
@@ -13,13 +13,12 @@
# limitations under the License.
"""Tests of grpc_channelz.v1.channelz."""
-import unittest
-import logging
import asyncio
+import logging
+import unittest
import grpc
from grpc.experimental import aio
-
from grpc_channelz.v1 import channelz
from grpc_channelz.v1 import channelz_pb2
from grpc_channelz.v1 import channelz_pb2_grpc
diff --git a/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py b/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py
index a539dbf140..7c6776ecd7 100644
--- a/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py
+++ b/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py
@@ -15,19 +15,17 @@
import asyncio
import logging
-import time
import random
+import time
import unittest
import grpc
-
+from grpc.experimental import aio
from grpc_health.v1 import health
from grpc_health.v1 import health_pb2
from grpc_health.v1 import health_pb2_grpc
-from grpc.experimental import aio
from tests.unit.framework.common import test_constants
-
from tests_aio.unit._test_base import AioTestBase
_SERVING_SERVICE = 'grpc.test.TestServiceServing'
diff --git a/src/python/grpcio_tests/tests_aio/interop/methods.py b/src/python/grpcio_tests/tests_aio/interop/methods.py
index 24681aa698..6524a5ed0b 100644
--- a/src/python/grpcio_tests/tests_aio/interop/methods.py
+++ b/src/python/grpcio_tests/tests_aio/interop/methods.py
@@ -25,14 +25,16 @@ import threading
import time
from typing import Any, Optional, Union
-import grpc
from google import auth as google_auth
from google.auth import environment_vars as google_auth_environment_vars
from google.auth.transport import grpc as google_auth_transport_grpc
from google.auth.transport import requests as google_auth_transport_requests
+import grpc
from grpc.experimental import aio
-from src.proto.grpc.testing import empty_pb2, messages_pb2, test_pb2_grpc
+from src.proto.grpc.testing import empty_pb2
+from src.proto.grpc.testing import messages_pb2
+from src.proto.grpc.testing import test_pb2_grpc
_INITIAL_METADATA_KEY = "x-grpc-test-echo-initial"
_TRAILING_METADATA_KEY = "x-grpc-test-echo-trailing-bin"
diff --git a/src/python/grpcio_tests/tests_aio/interop/server.py b/src/python/grpcio_tests/tests_aio/interop/server.py
index 509abdf0b2..e40c831a87 100644
--- a/src/python/grpcio_tests/tests_aio/interop/server.py
+++ b/src/python/grpcio_tests/tests_aio/interop/server.py
@@ -13,8 +13,8 @@
# limitations under the License.
"""The gRPC interoperability test server using AsyncIO stack."""
-import asyncio
import argparse
+import asyncio
import logging
import grpc
diff --git a/src/python/grpcio_tests/tests_aio/reflection/reflection_servicer_test.py b/src/python/grpcio_tests/tests_aio/reflection/reflection_servicer_test.py
index edd2d79eab..8e5c9df664 100644
--- a/src/python/grpcio_tests/tests_aio/reflection/reflection_servicer_test.py
+++ b/src/python/grpcio_tests/tests_aio/reflection/reflection_servicer_test.py
@@ -16,12 +16,13 @@
import logging
import unittest
-import grpc
from google.protobuf import descriptor_pb2
+import grpc
from grpc.experimental import aio
+from grpc_reflection.v1alpha import reflection
+from grpc_reflection.v1alpha import reflection_pb2
+from grpc_reflection.v1alpha import reflection_pb2_grpc
-from grpc_reflection.v1alpha import (reflection, reflection_pb2,
- reflection_pb2_grpc)
from src.proto.grpc.testing import empty_pb2
from src.proto.grpc.testing.proto2 import empty2_extensions_pb2
from tests_aio.unit._test_base import AioTestBase
diff --git a/src/python/grpcio_tests/tests_aio/status/grpc_status_test.py b/src/python/grpcio_tests/tests_aio/status/grpc_status_test.py
index 980cf5a67e..df5b75b9cd 100644
--- a/src/python/grpcio_tests/tests_aio/status/grpc_status_test.py
+++ b/src/python/grpcio_tests/tests_aio/status/grpc_status_test.py
@@ -17,12 +17,14 @@ import logging
import traceback
import unittest
-import grpc
from google.protobuf import any_pb2
-from google.rpc import code_pb2, error_details_pb2, status_pb2
+from google.rpc import code_pb2
+from google.rpc import error_details_pb2
+from google.rpc import status_pb2
+import grpc
from grpc.experimental import aio
-
from grpc_status import rpc_status
+
from tests_aio.unit._test_base import AioTestBase
_STATUS_OK = '/test/StatusOK'
diff --git a/src/python/grpcio_tests/tests_aio/unit/_common.py b/src/python/grpcio_tests/tests_aio/unit/_common.py
index 11513a722c..05947733a0 100644
--- a/src/python/grpcio_tests/tests_aio/unit/_common.py
+++ b/src/python/grpcio_tests/tests_aio/unit/_common.py
@@ -13,11 +13,14 @@
# limitations under the License.
import asyncio
-import grpc
from typing import AsyncIterable
-from grpc.experimental import aio
-from grpc.aio._typing import MetadatumType, MetadataKey, MetadataValue
+
+import grpc
from grpc.aio._metadata import Metadata
+from grpc.aio._typing import MetadataKey
+from grpc.aio._typing import MetadataValue
+from grpc.aio._typing import MetadatumType
+from grpc.experimental import aio
from tests.unit.framework.common import test_constants
diff --git a/src/python/grpcio_tests/tests_aio/unit/_test_base.py b/src/python/grpcio_tests/tests_aio/unit/_test_base.py
index ec5f2112da..fcd1e90a5a 100644
--- a/src/python/grpcio_tests/tests_aio/unit/_test_base.py
+++ b/src/python/grpcio_tests/tests_aio/unit/_test_base.py
@@ -12,11 +12,12 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-import logging
-import functools
import asyncio
+import functools
+import logging
from typing import Callable
import unittest
+
from grpc.experimental import aio
__all__ = 'AioTestBase'
diff --git a/src/python/grpcio_tests/tests_aio/unit/_test_server.py b/src/python/grpcio_tests/tests_aio/unit/_test_server.py
index ee137dedb6..0119fda37c 100644
--- a/src/python/grpcio_tests/tests_aio/unit/_test_server.py
+++ b/src/python/grpcio_tests/tests_aio/unit/_test_server.py
@@ -17,9 +17,11 @@ import datetime
import grpc
from grpc.experimental import aio
-from tests.unit import resources
-from src.proto.grpc.testing import empty_pb2, messages_pb2, test_pb2_grpc
+from src.proto.grpc.testing import empty_pb2
+from src.proto.grpc.testing import messages_pb2
+from src.proto.grpc.testing import test_pb2_grpc
+from tests.unit import resources
from tests_aio.unit import _constants
_INITIAL_METADATA_KEY = "x-grpc-test-echo-initial"
diff --git a/src/python/grpcio_tests/tests_aio/unit/abort_test.py b/src/python/grpcio_tests/tests_aio/unit/abort_test.py
index 487c8c972e..45ef9481a8 100644
--- a/src/python/grpcio_tests/tests_aio/unit/abort_test.py
+++ b/src/python/grpcio_tests/tests_aio/unit/abort_test.py
@@ -13,15 +13,16 @@
# limitations under the License.
import asyncio
+import gc
import logging
-import unittest
import time
-import gc
+import unittest
import grpc
from grpc.experimental import aio
-from tests_aio.unit._test_base import AioTestBase
+
from tests.unit.framework.common import test_constants
+from tests_aio.unit._test_base import AioTestBase
_UNARY_UNARY_ABORT = '/test/UnaryUnaryAbort'
_SUPPRESS_ABORT = '/test/SuppressAbort'
diff --git a/src/python/grpcio_tests/tests_aio/unit/aio_rpc_error_test.py b/src/python/grpcio_tests/tests_aio/unit/aio_rpc_error_test.py
index b7b18e08f6..730871d1be 100644
--- a/src/python/grpcio_tests/tests_aio/unit/aio_rpc_error_test.py
+++ b/src/python/grpcio_tests/tests_aio/unit/aio_rpc_error_test.py
@@ -17,9 +17,9 @@ import logging
import unittest
import grpc
-
-from grpc.experimental import aio
from grpc.aio._call import AioRpcError
+from grpc.experimental import aio
+
from tests_aio.unit._test_base import AioTestBase
_TEST_INITIAL_METADATA = aio.Metadata(
diff --git a/src/python/grpcio_tests/tests_aio/unit/auth_context_test.py b/src/python/grpcio_tests/tests_aio/unit/auth_context_test.py
index fb30371468..698f94b48e 100644
--- a/src/python/grpcio_tests/tests_aio/unit/auth_context_test.py
+++ b/src/python/grpcio_tests/tests_aio/unit/auth_context_test.py
@@ -13,9 +13,9 @@
# limitations under the License.
"""Porting auth context tests from sync stack."""
+import logging
import pickle
import unittest
-import logging
import grpc
from grpc.experimental import aio
diff --git a/src/python/grpcio_tests/tests_aio/unit/call_test.py b/src/python/grpcio_tests/tests_aio/unit/call_test.py
index c7d99a20c4..ab8dc19f48 100644
--- a/src/python/grpcio_tests/tests_aio/unit/call_test.py
+++ b/src/python/grpcio_tests/tests_aio/unit/call_test.py
@@ -14,17 +14,18 @@
"""Tests behavior of the Call classes."""
import asyncio
+import datetime
import logging
import unittest
-import datetime
import grpc
from grpc.experimental import aio
-from src.proto.grpc.testing import messages_pb2, test_pb2_grpc
+from src.proto.grpc.testing import messages_pb2
+from src.proto.grpc.testing import test_pb2_grpc
+from tests_aio.unit._constants import UNREACHABLE_TARGET
from tests_aio.unit._test_base import AioTestBase
from tests_aio.unit._test_server import start_test_server
-from tests_aio.unit._constants import UNREACHABLE_TARGET
_SHORT_TIMEOUT_S = datetime.timedelta(seconds=1).total_seconds()
diff --git a/src/python/grpcio_tests/tests_aio/unit/channel_argument_test.py b/src/python/grpcio_tests/tests_aio/unit/channel_argument_test.py
index e80d593453..6eb4c3c2d5 100644
--- a/src/python/grpcio_tests/tests_aio/unit/channel_argument_test.py
+++ b/src/python/grpcio_tests/tests_aio/unit/channel_argument_test.py
@@ -14,16 +14,17 @@
"""Tests behavior around the Core channel arguments."""
import asyncio
+import errno
import logging
import platform
import random
-import errno
import unittest
import grpc
from grpc.experimental import aio
-from src.proto.grpc.testing import messages_pb2, test_pb2_grpc
+from src.proto.grpc.testing import messages_pb2
+from src.proto.grpc.testing import test_pb2_grpc
from tests.unit.framework import common
from tests_aio.unit._test_base import AioTestBase
from tests_aio.unit._test_server import start_test_server
diff --git a/src/python/grpcio_tests/tests_aio/unit/channel_ready_test.py b/src/python/grpcio_tests/tests_aio/unit/channel_ready_test.py
index 75e4703d86..46e4d208cc 100644
--- a/src/python/grpcio_tests/tests_aio/unit/channel_ready_test.py
+++ b/src/python/grpcio_tests/tests_aio/unit/channel_ready_test.py
@@ -23,7 +23,8 @@ import unittest
import grpc
from grpc.experimental import aio
-from tests.unit.framework.common import get_socket, test_constants
+from tests.unit.framework.common import get_socket
+from tests.unit.framework.common import test_constants
from tests_aio.unit import _common
from tests_aio.unit._test_base import AioTestBase
from tests_aio.unit._test_server import start_test_server
diff --git a/src/python/grpcio_tests/tests_aio/unit/channel_test.py b/src/python/grpcio_tests/tests_aio/unit/channel_test.py
index 58cd555491..699fe798f8 100644
--- a/src/python/grpcio_tests/tests_aio/unit/channel_test.py
+++ b/src/python/grpcio_tests/tests_aio/unit/channel_test.py
@@ -20,10 +20,11 @@ import unittest
import grpc
from grpc.experimental import aio
-from src.proto.grpc.testing import messages_pb2, test_pb2_grpc
+from src.proto.grpc.testing import messages_pb2
+from src.proto.grpc.testing import test_pb2_grpc
from tests.unit.framework.common import test_constants
-from tests_aio.unit._constants import (UNARY_CALL_WITH_SLEEP_VALUE,
- UNREACHABLE_TARGET)
+from tests_aio.unit._constants import UNARY_CALL_WITH_SLEEP_VALUE
+from tests_aio.unit._constants import UNREACHABLE_TARGET
from tests_aio.unit._test_base import AioTestBase
from tests_aio.unit._test_server import start_test_server
diff --git a/src/python/grpcio_tests/tests_aio/unit/client_stream_stream_interceptor_test.py b/src/python/grpcio_tests/tests_aio/unit/client_stream_stream_interceptor_test.py
index ce6a7bc04d..13ad9b075d 100644
--- a/src/python/grpcio_tests/tests_aio/unit/client_stream_stream_interceptor_test.py
+++ b/src/python/grpcio_tests/tests_aio/unit/client_stream_stream_interceptor_test.py
@@ -15,12 +15,14 @@ import logging
import unittest
import grpc
-
from grpc.experimental import aio
-from tests_aio.unit._common import CountingResponseIterator, CountingRequestIterator
-from tests_aio.unit._test_server import start_test_server
+
+from src.proto.grpc.testing import messages_pb2
+from src.proto.grpc.testing import test_pb2_grpc
+from tests_aio.unit._common import CountingRequestIterator
+from tests_aio.unit._common import CountingResponseIterator
from tests_aio.unit._test_base import AioTestBase
-from src.proto.grpc.testing import messages_pb2, test_pb2_grpc
+from tests_aio.unit._test_server import start_test_server
_NUM_STREAM_RESPONSES = 5
_NUM_STREAM_REQUESTS = 5
diff --git a/src/python/grpcio_tests/tests_aio/unit/client_stream_unary_interceptor_test.py b/src/python/grpcio_tests/tests_aio/unit/client_stream_unary_interceptor_test.py
index b9a04af00d..ff99920c7f 100644
--- a/src/python/grpcio_tests/tests_aio/unit/client_stream_unary_interceptor_test.py
+++ b/src/python/grpcio_tests/tests_aio/unit/client_stream_unary_interceptor_test.py
@@ -12,20 +12,21 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import asyncio
+import datetime
import logging
import unittest
-import datetime
import grpc
-
from grpc.experimental import aio
-from tests_aio.unit._constants import UNREACHABLE_TARGET
-from tests_aio.unit._common import inject_callbacks
+
+from src.proto.grpc.testing import messages_pb2
+from src.proto.grpc.testing import test_pb2_grpc
+from tests.unit.framework.common import test_constants
from tests_aio.unit._common import CountingRequestIterator
-from tests_aio.unit._test_server import start_test_server
+from tests_aio.unit._common import inject_callbacks
+from tests_aio.unit._constants import UNREACHABLE_TARGET
from tests_aio.unit._test_base import AioTestBase
-from tests.unit.framework.common import test_constants
-from src.proto.grpc.testing import messages_pb2, test_pb2_grpc
+from tests_aio.unit._test_server import start_test_server
_SHORT_TIMEOUT_S = 1.0
diff --git a/src/python/grpcio_tests/tests_aio/unit/client_unary_stream_interceptor_test.py b/src/python/grpcio_tests/tests_aio/unit/client_unary_stream_interceptor_test.py
index fd542fd16e..f0c0cba8eb 100644
--- a/src/python/grpcio_tests/tests_aio/unit/client_unary_stream_interceptor_test.py
+++ b/src/python/grpcio_tests/tests_aio/unit/client_unary_stream_interceptor_test.py
@@ -12,20 +12,21 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import asyncio
+import datetime
import logging
import unittest
-import datetime
import grpc
-
from grpc.experimental import aio
-from tests_aio.unit._constants import UNREACHABLE_TARGET
-from tests_aio.unit._common import inject_callbacks
+
+from src.proto.grpc.testing import messages_pb2
+from src.proto.grpc.testing import test_pb2_grpc
+from tests.unit.framework.common import test_constants
from tests_aio.unit._common import CountingResponseIterator
-from tests_aio.unit._test_server import start_test_server
+from tests_aio.unit._common import inject_callbacks
+from tests_aio.unit._constants import UNREACHABLE_TARGET
from tests_aio.unit._test_base import AioTestBase
-from tests.unit.framework.common import test_constants
-from src.proto.grpc.testing import messages_pb2, test_pb2_grpc
+from tests_aio.unit._test_server import start_test_server
_SHORT_TIMEOUT_S = 1.0
diff --git a/src/python/grpcio_tests/tests_aio/unit/client_unary_unary_interceptor_test.py b/src/python/grpcio_tests/tests_aio/unit/client_unary_unary_interceptor_test.py
index e64daec7df..7367c454fa 100644
--- a/src/python/grpcio_tests/tests_aio/unit/client_unary_unary_interceptor_test.py
+++ b/src/python/grpcio_tests/tests_aio/unit/client_unary_unary_interceptor_test.py
@@ -16,13 +16,16 @@ import logging
import unittest
import grpc
-
from grpc.experimental import aio
-from tests_aio.unit._test_server import start_test_server, _INITIAL_METADATA_KEY, _TRAILING_METADATA_KEY
-from tests_aio.unit import _constants
+
+from src.proto.grpc.testing import messages_pb2
+from src.proto.grpc.testing import test_pb2_grpc
from tests_aio.unit import _common
+from tests_aio.unit import _constants
from tests_aio.unit._test_base import AioTestBase
-from src.proto.grpc.testing import messages_pb2, test_pb2_grpc
+from tests_aio.unit._test_server import _INITIAL_METADATA_KEY
+from tests_aio.unit._test_server import _TRAILING_METADATA_KEY
+from tests_aio.unit._test_server import start_test_server
_LOCAL_CANCEL_DETAILS_EXPECTATION = 'Locally cancelled by application!'
_INITIAL_METADATA_TO_INJECT = aio.Metadata(
diff --git a/src/python/grpcio_tests/tests_aio/unit/close_channel_test.py b/src/python/grpcio_tests/tests_aio/unit/close_channel_test.py
index 20543e95bf..8d481a9a3b 100644
--- a/src/python/grpcio_tests/tests_aio/unit/close_channel_test.py
+++ b/src/python/grpcio_tests/tests_aio/unit/close_channel_test.py
@@ -18,10 +18,11 @@ import logging
import unittest
import grpc
-from grpc.experimental import aio
from grpc.aio import _base_call
+from grpc.experimental import aio
-from src.proto.grpc.testing import messages_pb2, test_pb2_grpc
+from src.proto.grpc.testing import messages_pb2
+from src.proto.grpc.testing import test_pb2_grpc
from tests_aio.unit._test_base import AioTestBase
from tests_aio.unit._test_server import start_test_server
diff --git a/src/python/grpcio_tests/tests_aio/unit/compatibility_test.py b/src/python/grpcio_tests/tests_aio/unit/compatibility_test.py
index e1f0f4d584..64e2d1f21a 100644
--- a/src/python/grpcio_tests/tests_aio/unit/compatibility_test.py
+++ b/src/python/grpcio_tests/tests_aio/unit/compatibility_test.py
@@ -14,22 +14,24 @@
"""Testing the compatibility between AsyncIO stack and the old stack."""
import asyncio
+from concurrent.futures import ThreadPoolExecutor
import logging
import os
import random
import threading
-import unittest
-from concurrent.futures import ThreadPoolExecutor
from typing import Callable, Iterable, Sequence, Tuple
+import unittest
import grpc
from grpc.experimental import aio
-from src.proto.grpc.testing import messages_pb2, test_pb2_grpc
+from src.proto.grpc.testing import messages_pb2
+from src.proto.grpc.testing import test_pb2_grpc
from tests.unit.framework.common import test_constants
from tests_aio.unit import _common
from tests_aio.unit._test_base import AioTestBase
-from tests_aio.unit._test_server import TestServiceServicer, start_test_server
+from tests_aio.unit._test_server import TestServiceServicer
+from tests_aio.unit._test_server import start_test_server
_NUM_STREAM_RESPONSES = 5
_REQUEST_PAYLOAD_SIZE = 7
diff --git a/src/python/grpcio_tests/tests_aio/unit/compression_test.py b/src/python/grpcio_tests/tests_aio/unit/compression_test.py
index 9d93885ea2..eb28a93f58 100644
--- a/src/python/grpcio_tests/tests_aio/unit/compression_test.py
+++ b/src/python/grpcio_tests/tests_aio/unit/compression_test.py
@@ -22,8 +22,8 @@ import unittest
import grpc
from grpc.experimental import aio
-from tests_aio.unit._test_base import AioTestBase
from tests_aio.unit import _common
+from tests_aio.unit._test_base import AioTestBase
_GZIP_CHANNEL_ARGUMENT = ('grpc.default_compression_algorithm', 2)
_GZIP_DISABLED_CHANNEL_ARGUMENT = ('grpc.compression_enabled_algorithms_bitset',
diff --git a/src/python/grpcio_tests/tests_aio/unit/context_peer_test.py b/src/python/grpcio_tests/tests_aio/unit/context_peer_test.py
index ea5f4621af..743d6599ef 100644
--- a/src/python/grpcio_tests/tests_aio/unit/context_peer_test.py
+++ b/src/python/grpcio_tests/tests_aio/unit/context_peer_test.py
@@ -16,17 +16,19 @@
import asyncio
import logging
import os
-import unittest
from typing import Callable, Iterable, Sequence, Tuple
+import unittest
import grpc
from grpc.experimental import aio
-from src.proto.grpc.testing import messages_pb2, test_pb2_grpc
+from src.proto.grpc.testing import messages_pb2
+from src.proto.grpc.testing import test_pb2_grpc
from tests.unit.framework.common import test_constants
from tests_aio.unit import _common
from tests_aio.unit._test_base import AioTestBase
-from tests_aio.unit._test_server import TestServiceServicer, start_test_server
+from tests_aio.unit._test_server import TestServiceServicer
+from tests_aio.unit._test_server import start_test_server
_REQUEST = b'\x03\x07'
_TEST_METHOD = '/test/UnaryUnary'
diff --git a/src/python/grpcio_tests/tests_aio/unit/done_callback_test.py b/src/python/grpcio_tests/tests_aio/unit/done_callback_test.py
index 481bafd567..b3a327df2c 100644
--- a/src/python/grpcio_tests/tests_aio/unit/done_callback_test.py
+++ b/src/python/grpcio_tests/tests_aio/unit/done_callback_test.py
@@ -14,17 +14,19 @@
"""Testing the done callbacks mechanism."""
import asyncio
+import gc
import logging
-import unittest
import time
-import gc
+import unittest
import grpc
from grpc.experimental import aio
+
+from src.proto.grpc.testing import messages_pb2
+from src.proto.grpc.testing import test_pb2_grpc
+from tests.unit.framework.common import test_constants
from tests_aio.unit._common import inject_callbacks
from tests_aio.unit._test_base import AioTestBase
-from tests.unit.framework.common import test_constants
-from src.proto.grpc.testing import messages_pb2, test_pb2_grpc
from tests_aio.unit._test_server import start_test_server
_NUM_STREAM_RESPONSES = 5
diff --git a/src/python/grpcio_tests/tests_aio/unit/metadata_test.py b/src/python/grpcio_tests/tests_aio/unit/metadata_test.py
index 8f8c39214c..4043d19e31 100644
--- a/src/python/grpcio_tests/tests_aio/unit/metadata_test.py
+++ b/src/python/grpcio_tests/tests_aio/unit/metadata_test.py
@@ -22,8 +22,8 @@ import unittest
import grpc
from grpc.experimental import aio
-from tests_aio.unit._test_base import AioTestBase
from tests_aio.unit import _common
+from tests_aio.unit._test_base import AioTestBase
_TEST_CLIENT_TO_SERVER = '/test/TestClientToServer'
_TEST_SERVER_TO_CLIENT = '/test/TestServerToClient'
diff --git a/src/python/grpcio_tests/tests_aio/unit/outside_init_test.py b/src/python/grpcio_tests/tests_aio/unit/outside_init_test.py
index 879796cf0f..79a7518585 100644
--- a/src/python/grpcio_tests/tests_aio/unit/outside_init_test.py
+++ b/src/python/grpcio_tests/tests_aio/unit/outside_init_test.py
@@ -16,11 +16,13 @@
import asyncio
import logging
import unittest
-from grpc.experimental import aio
+
import grpc
+from grpc.experimental import aio
+from src.proto.grpc.testing import messages_pb2
+from src.proto.grpc.testing import test_pb2_grpc
from tests_aio.unit._test_server import start_test_server
-from src.proto.grpc.testing import messages_pb2, test_pb2_grpc
_NUM_OF_LOOPS = 50
diff --git a/src/python/grpcio_tests/tests_aio/unit/secure_call_test.py b/src/python/grpcio_tests/tests_aio/unit/secure_call_test.py
index 7efaddd607..a5b03f43ae 100644
--- a/src/python/grpcio_tests/tests_aio/unit/secure_call_test.py
+++ b/src/python/grpcio_tests/tests_aio/unit/secure_call_test.py
@@ -13,15 +13,17 @@
# limitations under the License.
"""Tests the behaviour of the Call classes under a secure channel."""
-import unittest
import logging
+import unittest
import grpc
from grpc.experimental import aio
-from src.proto.grpc.testing import messages_pb2, test_pb2_grpc
+
+from src.proto.grpc.testing import messages_pb2
+from src.proto.grpc.testing import test_pb2_grpc
+from tests.unit import resources
from tests_aio.unit._test_base import AioTestBase
from tests_aio.unit._test_server import start_test_server
-from tests.unit import resources
_SERVER_HOST_OVERRIDE = 'foo.test.google.fr'
_NUM_STREAM_RESPONSES = 5
diff --git a/src/python/grpcio_tests/tests_aio/unit/server_interceptor_test.py b/src/python/grpcio_tests/tests_aio/unit/server_interceptor_test.py
index 8eb846201a..18f5df09de 100644
--- a/src/python/grpcio_tests/tests_aio/unit/server_interceptor_test.py
+++ b/src/python/grpcio_tests/tests_aio/unit/server_interceptor_test.py
@@ -16,13 +16,15 @@
import asyncio
import functools
import logging
-import unittest
from typing import Any, Awaitable, Callable, Tuple
+import unittest
import grpc
-from grpc.experimental import aio, wrap_server_method_handler
+from grpc.experimental import aio
+from grpc.experimental import wrap_server_method_handler
-from src.proto.grpc.testing import messages_pb2, test_pb2_grpc
+from src.proto.grpc.testing import messages_pb2
+from src.proto.grpc.testing import test_pb2_grpc
from tests_aio.unit._test_base import AioTestBase
from tests_aio.unit._test_server import start_test_server
diff --git a/src/python/grpcio_tests/tests_aio/unit/server_time_remaining_test.py b/src/python/grpcio_tests/tests_aio/unit/server_time_remaining_test.py
index 0de87b532f..340e4cc350 100644
--- a/src/python/grpcio_tests/tests_aio/unit/server_time_remaining_test.py
+++ b/src/python/grpcio_tests/tests_aio/unit/server_time_remaining_test.py
@@ -14,14 +14,15 @@
"""Test the time_remaining() method of async ServicerContext."""
import asyncio
+import datetime
import logging
import unittest
-import datetime
import grpc
from grpc import aio
-from tests_aio.unit._common import ADHOC_METHOD, AdhocGenericHandler
+from tests_aio.unit._common import ADHOC_METHOD
+from tests_aio.unit._common import AdhocGenericHandler
from tests_aio.unit._test_base import AioTestBase
_REQUEST = b'\x09\x05'
diff --git a/src/python/grpcio_tests/tests_aio/unit/timeout_test.py b/src/python/grpcio_tests/tests_aio/unit/timeout_test.py
index b5bcc027ec..dab0f5113f 100644
--- a/src/python/grpcio_tests/tests_aio/unit/timeout_test.py
+++ b/src/python/grpcio_tests/tests_aio/unit/timeout_test.py
@@ -14,17 +14,17 @@
"""Tests behavior of the timeout mechanism on client side."""
import asyncio
+import datetime
import logging
import platform
import random
import unittest
-import datetime
import grpc
from grpc.experimental import aio
-from tests_aio.unit._test_base import AioTestBase
from tests_aio.unit import _common
+from tests_aio.unit._test_base import AioTestBase
_SLEEP_TIME_UNIT_S = datetime.timedelta(seconds=1).total_seconds()
diff --git a/src/python/grpcio_tests/tests_aio/unit/wait_for_connection_test.py b/src/python/grpcio_tests/tests_aio/unit/wait_for_connection_test.py
index 4fbe074740..a49a1241c4 100644
--- a/src/python/grpcio_tests/tests_aio/unit/wait_for_connection_test.py
+++ b/src/python/grpcio_tests/tests_aio/unit/wait_for_connection_test.py
@@ -14,19 +14,20 @@
"""Tests behavior of the wait for connection API on client side."""
import asyncio
-import logging
-import unittest
import datetime
+import logging
from typing import Callable, Tuple
+import unittest
import grpc
from grpc.experimental import aio
-from tests_aio.unit._test_base import AioTestBase
-from tests_aio.unit._test_server import start_test_server
+from src.proto.grpc.testing import messages_pb2
+from src.proto.grpc.testing import test_pb2_grpc
from tests_aio.unit import _common
-from src.proto.grpc.testing import messages_pb2, test_pb2_grpc
from tests_aio.unit._constants import UNREACHABLE_TARGET
+from tests_aio.unit._test_base import AioTestBase
+from tests_aio.unit._test_server import start_test_server
_REQUEST = b'\x01\x02\x03'
_TEST_METHOD = '/test/Test'
diff --git a/src/python/grpcio_tests/tests_aio/unit/wait_for_ready_test.py b/src/python/grpcio_tests/tests_aio/unit/wait_for_ready_test.py
index 5bcfd54856..303c138642 100644
--- a/src/python/grpcio_tests/tests_aio/unit/wait_for_ready_test.py
+++ b/src/python/grpcio_tests/tests_aio/unit/wait_for_ready_test.py
@@ -14,19 +14,22 @@
"""Testing the done callbacks mechanism."""
import asyncio
+import gc
import logging
-import unittest
+import platform
import time
-import gc
+import unittest
import grpc
from grpc.experimental import aio
-from tests_aio.unit._test_base import AioTestBase
-from tests.unit.framework.common import test_constants
+
+from src.proto.grpc.testing import messages_pb2
+from src.proto.grpc.testing import test_pb2_grpc
from tests.unit.framework.common import get_socket
-from src.proto.grpc.testing import messages_pb2, test_pb2_grpc
-from tests_aio.unit._test_server import start_test_server
+from tests.unit.framework.common import test_constants
from tests_aio.unit import _common
+from tests_aio.unit._test_base import AioTestBase
+from tests_aio.unit._test_server import start_test_server
_NUM_STREAM_RESPONSES = 5
_REQUEST_PAYLOAD_SIZE = 7
@@ -119,6 +122,8 @@ class TestWaitForReady(AioTestBase):
"""RPC should fail immediately after connection failed."""
await self._connection_fails_fast(False)
+ @unittest.skipIf(platform.system() == 'Windows',
+ 'https://github.com/grpc/grpc/pull/26729')
async def test_call_wait_for_ready_enabled(self):
"""RPC will wait until the connection is ready."""
for action in _RPC_ACTIONS:
diff --git a/src/python/grpcio_tests/tests_gevent/unit/_test_server.py b/src/python/grpcio_tests/tests_gevent/unit/_test_server.py
index f1ba23e093..82327aa709 100644
--- a/src/python/grpcio_tests/tests_gevent/unit/_test_server.py
+++ b/src/python/grpcio_tests/tests_gevent/unit/_test_server.py
@@ -13,11 +13,14 @@
# limitations under the License.
from concurrent import futures
-from src.proto.grpc.testing import messages_pb2, test_pb2_grpc
-import grpc
-import gevent
from typing import Any, Tuple
+import gevent
+import grpc
+
+from src.proto.grpc.testing import messages_pb2
+from src.proto.grpc.testing import test_pb2_grpc
+
LONG_UNARY_CALL_WITH_SLEEP_VALUE = 1
diff --git a/src/python/grpcio_tests/tests_gevent/unit/close_channel_test.py b/src/python/grpcio_tests/tests_gevent/unit/close_channel_test.py
index 54f13611da..ca73fd685d 100644
--- a/src/python/grpcio_tests/tests_gevent/unit/close_channel_test.py
+++ b/src/python/grpcio_tests/tests_gevent/unit/close_channel_test.py
@@ -12,12 +12,15 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+import sys
import unittest
-from src.proto.grpc.testing import messages_pb2, test_pb2_grpc
-import grpc
+
import gevent
-import sys
from gevent.pool import Group
+import grpc
+
+from src.proto.grpc.testing import messages_pb2
+from src.proto.grpc.testing import test_pb2_grpc
from tests_gevent.unit._test_server import start_test_server
_UNARY_CALL_METHOD_WITH_SLEEP = '/grpc.testing.TestService/UnaryCallWithSleep'
diff --git a/src/python/grpcio_tests/tests_py3_only/interop/xds_interop_client.py b/src/python/grpcio_tests/tests_py3_only/interop/xds_interop_client.py
index dd9d504653..e796eb5ef2 100644
--- a/src/python/grpcio_tests/tests_py3_only/interop/xds_interop_client.py
+++ b/src/python/grpcio_tests/tests_py3_only/interop/xds_interop_client.py
@@ -14,26 +14,23 @@
import argparse
import collections
+from concurrent import futures
import datetime
import logging
import signal
+import sys
import threading
import time
-import sys
-
-from typing import DefaultDict, Dict, List, Mapping, Set, Sequence, Tuple
-import collections
-
-from concurrent import futures
+from typing import DefaultDict, Dict, List, Mapping, Sequence, Set, Tuple
import grpc
-from grpc_channelz.v1 import channelz
import grpc_admin
+from grpc_channelz.v1 import channelz
+from src.proto.grpc.testing import empty_pb2
+from src.proto.grpc.testing import messages_pb2
from src.proto.grpc.testing import test_pb2
from src.proto.grpc.testing import test_pb2_grpc
-from src.proto.grpc.testing import messages_pb2
-from src.proto.grpc.testing import empty_pb2
logger = logging.getLogger()
console_handler = logging.StreamHandler()
@@ -330,7 +327,7 @@ class _XdsUpdateClientConfigureServicer(
context: grpc.ServicerContext
) -> messages_pb2.ClientConfigureResponse:
logger.info("Received Configure RPC: %s", request)
- method_strs = (_METHOD_ENUM_TO_STR[t] for t in request.types)
+ method_strs = [_METHOD_ENUM_TO_STR[t] for t in request.types]
for method in _SUPPORTED_METHODS:
method_enum = _METHOD_STR_TO_ENUM[method]
channel_config = self._per_method_configs[method]
diff --git a/src/python/grpcio_tests/tests_py3_only/interop/xds_interop_server.py b/src/python/grpcio_tests/tests_py3_only/interop/xds_interop_server.py
index bc94dcbcf0..2c44b42e2e 100644
--- a/src/python/grpcio_tests/tests_py3_only/interop/xds_interop_server.py
+++ b/src/python/grpcio_tests/tests_py3_only/interop/xds_interop_server.py
@@ -13,29 +13,28 @@
# limitations under the License.
import argparse
+import collections
+from concurrent import futures
import logging
import signal
-import threading
-import time
import socket
import sys
-
-from typing import DefaultDict, Dict, List, Mapping, Set, Sequence, Tuple
-import collections
-
-from concurrent import futures
+import threading
+import time
+from typing import DefaultDict, Dict, List, Mapping, Sequence, Set, Tuple
import grpc
from grpc_channelz.v1 import channelz
from grpc_channelz.v1 import channelz_pb2
-from grpc_health.v1 import health_pb2, health_pb2_grpc
from grpc_health.v1 import health as grpc_health
+from grpc_health.v1 import health_pb2
+from grpc_health.v1 import health_pb2_grpc
from grpc_reflection.v1alpha import reflection
+from src.proto.grpc.testing import empty_pb2
+from src.proto.grpc.testing import messages_pb2
from src.proto.grpc.testing import test_pb2
from src.proto.grpc.testing import test_pb2_grpc
-from src.proto.grpc.testing import messages_pb2
-from src.proto.grpc.testing import empty_pb2
# NOTE: This interop server is not fully compatible with all xDS interop tests.
# It currently only implements enough functionality to pass the xDS security
diff --git a/src/python/grpcio_tests/tests_py3_only/unit/_leak_test.py b/src/python/grpcio_tests/tests_py3_only/unit/_leak_test.py
index 3b3f12fa1f..f8b8382e31 100644
--- a/src/python/grpcio_tests/tests_py3_only/unit/_leak_test.py
+++ b/src/python/grpcio_tests/tests_py3_only/unit/_leak_test.py
@@ -18,12 +18,12 @@ explicitly invoked. The recommended way of using Channel object is using `with`
clause, and let context manager automatically close the channel.
"""
+from concurrent.futures import ThreadPoolExecutor
import logging
import os
import resource
import sys
import unittest
-from concurrent.futures import ThreadPoolExecutor
import grpc
diff --git a/src/python/grpcio_tests/tests_py3_only/unit/_simple_stubs_test.py b/src/python/grpcio_tests/tests_py3_only/unit/_simple_stubs_test.py
index 08d5a882eb..f0365e15e7 100644
--- a/src/python/grpcio_tests/tests_py3_only/unit/_simple_stubs_test.py
+++ b/src/python/grpcio_tests/tests_py3_only/unit/_simple_stubs_test.py
@@ -29,18 +29,19 @@ import contextlib
import datetime
import inspect
import logging
-import threading
-import unittest
import sys
+import threading
import time
from typing import Callable, Optional
+import unittest
-from tests.unit import test_common
-from tests.unit.framework.common import get_socket
-from tests.unit import resources
import grpc
import grpc.experimental
+from tests.unit import resources
+from tests.unit import test_common
+from tests.unit.framework.common import get_socket
+
_REQUEST = b"0000"
_CACHE_EPOCHS = 8
diff --git a/src/ruby/ext/grpc/extconf.rb b/src/ruby/ext/grpc/extconf.rb
index 06ec919a4b..93fbdffb23 100644
--- a/src/ruby/ext/grpc/extconf.rb
+++ b/src/ruby/ext/grpc/extconf.rb
@@ -57,7 +57,7 @@ end
ENV['CPPFLAGS'] = '-DGPR_BACKWARDS_COMPATIBILITY_MODE'
ENV['CPPFLAGS'] += ' -DGRPC_XDS_USER_AGENT_NAME_SUFFIX="\"RUBY\"" '
-ENV['CPPFLAGS'] += ' -DGRPC_XDS_USER_AGENT_VERSION_SUFFIX="\"1.39.1\"" '
+ENV['CPPFLAGS'] += ' -DGRPC_XDS_USER_AGENT_VERSION_SUFFIX="\"1.40.0\"" '
output_dir = File.expand_path(RbConfig::CONFIG['topdir'])
grpc_lib_dir = File.join(output_dir, 'libs', grpc_config)
diff --git a/src/ruby/lib/grpc/version.rb b/src/ruby/lib/grpc/version.rb
index 6f2ef6d3f1..e72d84ae1b 100644
--- a/src/ruby/lib/grpc/version.rb
+++ b/src/ruby/lib/grpc/version.rb
@@ -14,5 +14,5 @@
# GRPC contains the General RPC module.
module GRPC
- VERSION = '1.39.1'
+ VERSION = '1.40.0'
end
diff --git a/src/ruby/tools/version.rb b/src/ruby/tools/version.rb
index 6b2c09c4a2..144a8676cb 100644
--- a/src/ruby/tools/version.rb
+++ b/src/ruby/tools/version.rb
@@ -14,6 +14,6 @@
module GRPC
module Tools
- VERSION = '1.39.1'
+ VERSION = '1.40.0'
end
end
diff --git a/templates/BUILD.gn.template b/templates/BUILD.gn.template
deleted file mode 100644
index e92f1199d2..0000000000
--- a/templates/BUILD.gn.template
+++ /dev/null
@@ -1,205 +0,0 @@
-%YAML 1.2
---- |
- # GRPC Fuchsia GN build file
-
- # This file has been automatically generated from a template file.
- # Please look at the templates directory instead.
- # This file can be regenerated from the template by running
- # tools/buildgen/generate_projects.sh
-
- # Copyright 2019 gRPC authors.
- #
- # 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.
-
- config("grpc_config") {
- include_dirs = [
- ".",
- "include/",
- ]
- defines = [
- "GRPC_USE_PROTO_LITE",
- "GPR_SUPPORT_CHANNELS_FROM_FD",
- "PB_FIELD_16BIT",
- ]
- }
- <%!
- def get_deps(target_dict):
- deps = []
- if target_dict.get("build", None) == "protoc":
- deps.append("//third_party/protobuf:protoc_lib")
- name = target_dict.get("name", None)
- if name in ("grpc++", "grpc++_codegen_lib"):
- deps.append("//third_party/protobuf:protobuf_lite")
- elif name in ("grpc", "grpc_unsecure"):
- deps.append("//third_party/zlib")
- for d in target_dict.get("deps", []):
- if d == "libssl":
- deps.append("//third_party/boringssl")
- elif d.startswith(("//", ":")):
- deps.append(d)
- else:
- deps.append(":%s" % d)
- if needs_ares(target_dict.src):
- deps.append("//third_party/cares")
- deps.append(":address_sorting")
- if needs_health_proto(target_dict.src) and target_dict.name != "health_proto":
- deps.append(":health_proto")
- return deps
-
- %><%!
- def needs_ares(srcs):
- return any("/c_ares/" in f for f in srcs) if srcs else False
-
- %><%!
- def needs_address_sorting(sources):
- return needs_ares(sources) or any("address_sorting" in s for s in sources)
-
- %><%!
- def needs_health_proto(srcs):
- return any("health.pb" in f for f in srcs)
-
- %><%!
- def get_include_dirs(sources):
- dirs = []
- if needs_ares(sources):
- dirs = ["third_party/cares"]
- if needs_address_sorting(sources):
- dirs.append("third_party/address_sorting/include")
- return dirs
-
- %><%!
- def strip_sources(sources, name):
- return [f for f in sources
- if "ruby_generator" not in f
- and ("health.pb" not in f or name == "health_proto")]
-
- %><%!
- def get_sources(target):
- return ((target.public_headers or []) +
- (target.headers or []) +
- (target.src or []))
-
- %><%!
- def get_extra_configs(target_dict):
- if target_dict.get("name", "") == "grpc_cpp_plugin":
- return ["//third_party/protobuf:protobuf_config"]
- return []
-
- %><%!
- def wanted_lib(lib):
- wanted_libs = ("gpr", "grpc", "grpc++", "grpc_plugin_support", "address_sorting")
- return lib.build in ("all", "protoc") and lib.get("name", "") in wanted_libs
-
- %><%!
- def wanted_binary(tgt):
- wanted_binaries = ("grpc_cpp_plugin",)
- return tgt.build == "protoc" and tgt.get("name", "") in wanted_binaries
-
- %><%!
- def only_on_host_toolchain(tgt):
- return tgt.get("name", "") in ("grpc_plugin_support", "grpc_cpp_plugin")
-
- %>
- % for lib in filegroups:
- % if lib.name in ("health_proto"):
- ${cc_library(lib)}
- %endif
- %endfor
- % for lib in libs:
- % if wanted_lib(lib):
- % if only_on_host_toolchain(lib):
- # Only compile the plugin for the host architecture.
- if (current_toolchain == host_toolchain) {
- ${cc_library(lib)}
- }
- % else:
- ${cc_library(lib)}
- % endif
- % endif
- % endfor
- % for tgt in targets:
- % if wanted_binary(tgt):
- % if only_on_host_toolchain(tgt):
- # Only compile the plugin for the host architecture.
- if (current_toolchain == host_toolchain) {
- ${cc_binary(tgt)}
- }
- % else:
- ${cc_binary(tgt)}
- % endif
- % endif
- % endfor
- <%def name="cc_library(lib)">
- <%
- sources = get_sources(lib)
- include_dirs = get_include_dirs(sources)
- sources = strip_sources(sources, lib.name)
- sources.sort()
- %>
- source_set("${lib.name}") {
- %if sources:
- sources = [
- % for src in sources:
- "${src}",
- % endfor
- ]
- %endif
- deps = [
- % for dep in get_deps(lib):
- "${dep}",
- % endfor
- ]
- <% extra_configs = get_extra_configs(lib) %>
- % if extra_configs:
- configs += [
- % for config in extra_configs:
- "${config}",
- % endfor
- ]
- % endif
- public_configs = [
- ":grpc_config",
- ]
- %if include_dirs:
- include_dirs = [
- %for d in include_dirs:
- "${d}",
- %endfor
- ]
- %endif
- }
- </%def>
- <%def name="cc_binary(tgt)">
- executable("${tgt.name}") {
- sources = [
- % for src in tgt.src:
- "${src}",
- % endfor
- ]
- deps = [
- % for dep in get_deps(tgt):
- "${dep}",
- % endfor
- ]
- <% extra_configs = get_extra_configs(tgt) %>
- % if extra_configs:
- configs += [
- % for config in extra_configs:
- "${config}",
- % endfor
- ]
- % endif
- public_configs = [ ":grpc_config" ]
- }
- </%def>
- ## vim: set ft=mako:ts=2:et:sw=2
diff --git a/templates/src/core/lib/surface/version.cc.template b/templates/src/core/lib/surface/version.cc.template
index 4e9f2c36ad..0cb3154725 100644
--- a/templates/src/core/lib/surface/version.cc.template
+++ b/templates/src/core/lib/surface/version.cc.template
@@ -27,6 +27,4 @@
const char* grpc_version_string(void) { return "${settings.core_version}"; }
- const char* grpc_g_stands_for(void) {
- return "${settings.g_stands_for}";
- }
+ const char* grpc_g_stands_for(void) { return "${settings.g_stands_for}"; }
diff --git a/templates/src/objective-c/!ProtoCompiler.podspec.template b/templates/src/objective-c/!ProtoCompiler.podspec.template
index c1ca9da0df..7955357811 100644
--- a/templates/src/objective-c/!ProtoCompiler.podspec.template
+++ b/templates/src/objective-c/!ProtoCompiler.podspec.template
@@ -47,7 +47,7 @@
The generated code will have a dependency on the Protobuf Objective-C runtime of the same
version. The runtime can be obtained as the "Protobuf" pod.
DESC
- s.homepage = 'https://github.com/google/protobuf'
+ s.homepage = 'https://github.com/protocolbuffers/protobuf'
s.license = {
:type => 'New BSD',
:text => <<-LICENSE
diff --git a/templates/test/core/end2end/end2end_defs.include b/templates/test/core/end2end/end2end_defs.include
index 91fa1d9502..a0c53addcd 100644
--- a/templates/test/core/end2end/end2end_defs.include
+++ b/templates/test/core/end2end/end2end_defs.include
@@ -43,6 +43,7 @@ void grpc_end2end_tests_pre_init(void) {
% endfor
}
+// NOLINTNEXTLINE(readability-function-size)
void grpc_end2end_tests(int argc, char **argv,
grpc_end2end_test_config config) {
int i;
diff --git a/templates/test/cpp/naming/resolver_component_tests_defs.include b/templates/test/cpp/naming/resolver_component_tests_defs.include
index 433036993f..94d403d52d 100644
--- a/templates/test/cpp/naming/resolver_component_tests_defs.include
+++ b/templates/test/cpp/naming/resolver_component_tests_defs.include
@@ -16,14 +16,13 @@
# This file is auto-generated
import argparse
-import sys
+import os
+import platform
+import signal
import subprocess
+import sys
import tempfile
-import os
import time
-import signal
-import platform
-
argp = argparse.ArgumentParser(description='Run c-ares resolver tests')
argp.add_argument('--test_bin_path', default=None, type=str,
diff --git a/templates/tools/dockerfile/test/bazel/Dockerfile.template b/templates/tools/dockerfile/test/bazel/Dockerfile.template
index 111c1bfa5b..4ff8e65b4a 100644
--- a/templates/tools/dockerfile/test/bazel/Dockerfile.template
+++ b/templates/tools/dockerfile/test/bazel/Dockerfile.template
@@ -17,10 +17,8 @@
# Pinned version of the base image is used to avoid regressions caused
# by rebuilding of this docker image. To see available versions, you can run
# "gcloud container images list-tags gcr.io/oss-fuzz-base/base-builder"
- # TODO(jtattermusch): with the latest version we'd get clang12+
- # which makes our build fail due to new warnings being treated
- # as errors.
- FROM gcr.io/oss-fuzz-base/base-builder@sha256:de220fd2433cd53bd06b215770dcd14a5e74632e0215acea7401fee8cafb18da
+ # Image(c7f1523ebd92) is built on Jul 29, 2021
+ FROM gcr.io/oss-fuzz-base/base-builder@sha256:c7f1523ebd9234b9ff57e5240f8c06569143373be019c92f1e6df18a1e048f37
# -------------------------- WARNING --------------------------------------
# If you are making changes to this file, consider changing
@@ -41,7 +39,14 @@
openjdk-8-jdk ${'\\'}
vim
- <%include file="../../python_deps.include"/>
+ #====================
+ # Python dependencies
+
+ # Install dependencies
+ RUN apt-get update && apt-get install -y ${'\\'}
+ python-all-dev ${'\\'}
+ python3-all-dev ${'\\'}
+ python-setuptools
<%include file="../../compile_python_36.include"/>
diff --git a/test/core/client_channel/service_config_test.cc b/test/core/client_channel/service_config_test.cc
index fde73fc7b8..e22a26f73d 100644
--- a/test/core/client_channel/service_config_test.cc
+++ b/test/core/client_channel/service_config_test.cc
@@ -1189,8 +1189,7 @@ TEST_F(RetryParserTest, InvalidRetryPolicyEmptyRetryableStatusCodes) {
"Method Params.*referenced_errors.*"
"methodConfig.*referenced_errors.*"
"retryPolicy.*referenced_errors.*"
- "field:retryableStatusCodes error:must be non-empty if "
- "perAttemptRecvTimeout not present"));
+ "field:retryableStatusCodes error:must be non-empty"));
GRPC_ERROR_UNREF(error);
}
@@ -1271,7 +1270,10 @@ TEST_F(RetryParserTest, ValidRetryPolicyWithPerAttemptRecvTimeout) {
" } ]\n"
"}";
grpc_error_handle error = GRPC_ERROR_NONE;
- auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
+ grpc_arg arg = grpc_channel_arg_integer_create(
+ const_cast<char*>(GRPC_ARG_EXPERIMENTAL_ENABLE_HEDGING), 1);
+ grpc_channel_args args = {1, &arg};
+ auto svc_cfg = ServiceConfig::Create(&args, test_json, &error);
ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_std_string(error);
const auto* vector_ptr = svc_cfg->GetMethodParsedConfigVector(
grpc_slice_from_static_string("/TestServ/TestMethod"));
@@ -1290,6 +1292,43 @@ TEST_F(RetryParserTest, ValidRetryPolicyWithPerAttemptRecvTimeout) {
}
TEST_F(RetryParserTest,
+ ValidRetryPolicyWithPerAttemptRecvTimeoutIgnoredWhenHedgingDisabled) {
+ const char* test_json =
+ "{\n"
+ " \"methodConfig\": [ {\n"
+ " \"name\": [\n"
+ " { \"service\": \"TestServ\", \"method\": \"TestMethod\" }\n"
+ " ],\n"
+ " \"retryPolicy\": {\n"
+ " \"maxAttempts\": 2,\n"
+ " \"initialBackoff\": \"1s\",\n"
+ " \"maxBackoff\": \"120s\",\n"
+ " \"backoffMultiplier\": 1.6,\n"
+ " \"perAttemptRecvTimeout\": \"1s\",\n"
+ " \"retryableStatusCodes\": [\"ABORTED\"]\n"
+ " }\n"
+ " } ]\n"
+ "}";
+ grpc_error_handle error = GRPC_ERROR_NONE;
+ auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
+ ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_std_string(error);
+ const auto* vector_ptr = svc_cfg->GetMethodParsedConfigVector(
+ grpc_slice_from_static_string("/TestServ/TestMethod"));
+ ASSERT_NE(vector_ptr, nullptr);
+ const auto* parsed_config =
+ static_cast<grpc_core::internal::RetryMethodConfig*>(
+ ((*vector_ptr)[0]).get());
+ ASSERT_NE(parsed_config, nullptr);
+ EXPECT_EQ(parsed_config->max_attempts(), 2);
+ EXPECT_EQ(parsed_config->initial_backoff(), 1000);
+ EXPECT_EQ(parsed_config->max_backoff(), 120000);
+ EXPECT_EQ(parsed_config->backoff_multiplier(), 1.6f);
+ EXPECT_EQ(parsed_config->per_attempt_recv_timeout(), absl::nullopt);
+ EXPECT_TRUE(
+ parsed_config->retryable_status_codes().Contains(GRPC_STATUS_ABORTED));
+}
+
+TEST_F(RetryParserTest,
ValidRetryPolicyWithPerAttemptRecvTimeoutAndUnsetRetryableStatusCodes) {
const char* test_json =
"{\n"
@@ -1307,7 +1346,10 @@ TEST_F(RetryParserTest,
" } ]\n"
"}";
grpc_error_handle error = GRPC_ERROR_NONE;
- auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
+ grpc_arg arg = grpc_channel_arg_integer_create(
+ const_cast<char*>(GRPC_ARG_EXPERIMENTAL_ENABLE_HEDGING), 1);
+ grpc_channel_args args = {1, &arg};
+ auto svc_cfg = ServiceConfig::Create(&args, test_json, &error);
ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_std_string(error);
const auto* vector_ptr = svc_cfg->GetMethodParsedConfigVector(
grpc_slice_from_static_string("/TestServ/TestMethod"));
@@ -1342,7 +1384,10 @@ TEST_F(RetryParserTest, InvalidRetryPolicyPerAttemptRecvTimeoutUnparseable) {
" } ]\n"
"}";
grpc_error_handle error = GRPC_ERROR_NONE;
- auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
+ grpc_arg arg = grpc_channel_arg_integer_create(
+ const_cast<char*>(GRPC_ARG_EXPERIMENTAL_ENABLE_HEDGING), 1);
+ grpc_channel_args args = {1, &arg};
+ auto svc_cfg = ServiceConfig::Create(&args, test_json, &error);
EXPECT_THAT(grpc_error_std_string(error),
::testing::ContainsRegex(
"Service config parsing error.*referenced_errors.*"
@@ -1372,7 +1417,10 @@ TEST_F(RetryParserTest, InvalidRetryPolicyPerAttemptRecvTimeoutWrongType) {
" } ]\n"
"}";
grpc_error_handle error = GRPC_ERROR_NONE;
- auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
+ grpc_arg arg = grpc_channel_arg_integer_create(
+ const_cast<char*>(GRPC_ARG_EXPERIMENTAL_ENABLE_HEDGING), 1);
+ grpc_channel_args args = {1, &arg};
+ auto svc_cfg = ServiceConfig::Create(&args, test_json, &error);
EXPECT_THAT(grpc_error_std_string(error),
::testing::ContainsRegex(
"Service config parsing error.*referenced_errors.*"
@@ -1402,7 +1450,10 @@ TEST_F(RetryParserTest, InvalidRetryPolicyPerAttemptRecvTimeoutBadValue) {
" } ]\n"
"}";
grpc_error_handle error = GRPC_ERROR_NONE;
- auto svc_cfg = ServiceConfig::Create(nullptr, test_json, &error);
+ grpc_arg arg = grpc_channel_arg_integer_create(
+ const_cast<char*>(GRPC_ARG_EXPERIMENTAL_ENABLE_HEDGING), 1);
+ grpc_channel_args args = {1, &arg};
+ auto svc_cfg = ServiceConfig::Create(&args, test_json, &error);
EXPECT_THAT(grpc_error_std_string(error),
::testing::ContainsRegex(
"Service config parsing error.*referenced_errors.*"
diff --git a/test/core/end2end/end2end_nosec_tests.cc b/test/core/end2end/end2end_nosec_tests.cc
index 1b738572dc..68c9c3356f 100644
--- a/test/core/end2end/end2end_nosec_tests.cc
+++ b/test/core/end2end/end2end_nosec_tests.cc
@@ -127,6 +127,8 @@ extern void retry(grpc_end2end_test_config config);
extern void retry_pre_init(void);
extern void retry_cancel_during_delay(grpc_end2end_test_config config);
extern void retry_cancel_during_delay_pre_init(void);
+extern void retry_cancel_with_multiple_send_batches(grpc_end2end_test_config config);
+extern void retry_cancel_with_multiple_send_batches_pre_init(void);
extern void retry_cancellation(grpc_end2end_test_config config);
extern void retry_cancellation_pre_init(void);
extern void retry_disabled(grpc_end2end_test_config config);
@@ -139,18 +141,24 @@ extern void retry_exceeds_buffer_size_in_subsequent_batch(grpc_end2end_test_conf
extern void retry_exceeds_buffer_size_in_subsequent_batch_pre_init(void);
extern void retry_lb_drop(grpc_end2end_test_config config);
extern void retry_lb_drop_pre_init(void);
+extern void retry_lb_fail(grpc_end2end_test_config config);
+extern void retry_lb_fail_pre_init(void);
extern void retry_non_retriable_status(grpc_end2end_test_config config);
extern void retry_non_retriable_status_pre_init(void);
extern void retry_non_retriable_status_before_recv_trailing_metadata_started(grpc_end2end_test_config config);
extern void retry_non_retriable_status_before_recv_trailing_metadata_started_pre_init(void);
extern void retry_per_attempt_recv_timeout(grpc_end2end_test_config config);
extern void retry_per_attempt_recv_timeout_pre_init(void);
+extern void retry_per_attempt_recv_timeout_on_last_attempt(grpc_end2end_test_config config);
+extern void retry_per_attempt_recv_timeout_on_last_attempt_pre_init(void);
extern void retry_recv_initial_metadata(grpc_end2end_test_config config);
extern void retry_recv_initial_metadata_pre_init(void);
extern void retry_recv_message(grpc_end2end_test_config config);
extern void retry_recv_message_pre_init(void);
extern void retry_recv_trailing_metadata_error(grpc_end2end_test_config config);
extern void retry_recv_trailing_metadata_error_pre_init(void);
+extern void retry_send_initial_metadata_refs(grpc_end2end_test_config config);
+extern void retry_send_initial_metadata_refs_pre_init(void);
extern void retry_send_op_fails(grpc_end2end_test_config config);
extern void retry_send_op_fails_pre_init(void);
extern void retry_server_pushback_delay(grpc_end2end_test_config config);
@@ -252,18 +260,22 @@ void grpc_end2end_tests_pre_init(void) {
resource_quota_server_pre_init();
retry_pre_init();
retry_cancel_during_delay_pre_init();
+ retry_cancel_with_multiple_send_batches_pre_init();
retry_cancellation_pre_init();
retry_disabled_pre_init();
retry_exceeds_buffer_size_in_delay_pre_init();
retry_exceeds_buffer_size_in_initial_batch_pre_init();
retry_exceeds_buffer_size_in_subsequent_batch_pre_init();
retry_lb_drop_pre_init();
+ retry_lb_fail_pre_init();
retry_non_retriable_status_pre_init();
retry_non_retriable_status_before_recv_trailing_metadata_started_pre_init();
retry_per_attempt_recv_timeout_pre_init();
+ retry_per_attempt_recv_timeout_on_last_attempt_pre_init();
retry_recv_initial_metadata_pre_init();
retry_recv_message_pre_init();
retry_recv_trailing_metadata_error_pre_init();
+ retry_send_initial_metadata_refs_pre_init();
retry_send_op_fails_pre_init();
retry_server_pushback_delay_pre_init();
retry_server_pushback_disabled_pre_init();
@@ -290,6 +302,7 @@ void grpc_end2end_tests_pre_init(void) {
write_buffering_at_end_pre_init();
}
+// NOLINTNEXTLINE(readability-function-size)
void grpc_end2end_tests(int argc, char **argv,
grpc_end2end_test_config config) {
int i;
@@ -346,18 +359,22 @@ void grpc_end2end_tests(int argc, char **argv,
resource_quota_server(config);
retry(config);
retry_cancel_during_delay(config);
+ retry_cancel_with_multiple_send_batches(config);
retry_cancellation(config);
retry_disabled(config);
retry_exceeds_buffer_size_in_delay(config);
retry_exceeds_buffer_size_in_initial_batch(config);
retry_exceeds_buffer_size_in_subsequent_batch(config);
retry_lb_drop(config);
+ retry_lb_fail(config);
retry_non_retriable_status(config);
retry_non_retriable_status_before_recv_trailing_metadata_started(config);
retry_per_attempt_recv_timeout(config);
+ retry_per_attempt_recv_timeout_on_last_attempt(config);
retry_recv_initial_metadata(config);
retry_recv_message(config);
retry_recv_trailing_metadata_error(config);
+ retry_send_initial_metadata_refs(config);
retry_send_op_fails(config);
retry_server_pushback_delay(config);
retry_server_pushback_disabled(config);
@@ -582,6 +599,10 @@ void grpc_end2end_tests(int argc, char **argv,
retry_cancel_during_delay(config);
continue;
}
+ if (0 == strcmp("retry_cancel_with_multiple_send_batches", argv[i])) {
+ retry_cancel_with_multiple_send_batches(config);
+ continue;
+ }
if (0 == strcmp("retry_cancellation", argv[i])) {
retry_cancellation(config);
continue;
@@ -606,6 +627,10 @@ void grpc_end2end_tests(int argc, char **argv,
retry_lb_drop(config);
continue;
}
+ if (0 == strcmp("retry_lb_fail", argv[i])) {
+ retry_lb_fail(config);
+ continue;
+ }
if (0 == strcmp("retry_non_retriable_status", argv[i])) {
retry_non_retriable_status(config);
continue;
@@ -618,6 +643,10 @@ void grpc_end2end_tests(int argc, char **argv,
retry_per_attempt_recv_timeout(config);
continue;
}
+ if (0 == strcmp("retry_per_attempt_recv_timeout_on_last_attempt", argv[i])) {
+ retry_per_attempt_recv_timeout_on_last_attempt(config);
+ continue;
+ }
if (0 == strcmp("retry_recv_initial_metadata", argv[i])) {
retry_recv_initial_metadata(config);
continue;
@@ -630,6 +659,10 @@ void grpc_end2end_tests(int argc, char **argv,
retry_recv_trailing_metadata_error(config);
continue;
}
+ if (0 == strcmp("retry_send_initial_metadata_refs", argv[i])) {
+ retry_send_initial_metadata_refs(config);
+ continue;
+ }
if (0 == strcmp("retry_send_op_fails", argv[i])) {
retry_send_op_fails(config);
continue;
diff --git a/test/core/end2end/end2end_tests.cc b/test/core/end2end/end2end_tests.cc
index cd27d33b54..f99a6267bc 100644
--- a/test/core/end2end/end2end_tests.cc
+++ b/test/core/end2end/end2end_tests.cc
@@ -129,6 +129,8 @@ extern void retry(grpc_end2end_test_config config);
extern void retry_pre_init(void);
extern void retry_cancel_during_delay(grpc_end2end_test_config config);
extern void retry_cancel_during_delay_pre_init(void);
+extern void retry_cancel_with_multiple_send_batches(grpc_end2end_test_config config);
+extern void retry_cancel_with_multiple_send_batches_pre_init(void);
extern void retry_cancellation(grpc_end2end_test_config config);
extern void retry_cancellation_pre_init(void);
extern void retry_disabled(grpc_end2end_test_config config);
@@ -141,18 +143,24 @@ extern void retry_exceeds_buffer_size_in_subsequent_batch(grpc_end2end_test_conf
extern void retry_exceeds_buffer_size_in_subsequent_batch_pre_init(void);
extern void retry_lb_drop(grpc_end2end_test_config config);
extern void retry_lb_drop_pre_init(void);
+extern void retry_lb_fail(grpc_end2end_test_config config);
+extern void retry_lb_fail_pre_init(void);
extern void retry_non_retriable_status(grpc_end2end_test_config config);
extern void retry_non_retriable_status_pre_init(void);
extern void retry_non_retriable_status_before_recv_trailing_metadata_started(grpc_end2end_test_config config);
extern void retry_non_retriable_status_before_recv_trailing_metadata_started_pre_init(void);
extern void retry_per_attempt_recv_timeout(grpc_end2end_test_config config);
extern void retry_per_attempt_recv_timeout_pre_init(void);
+extern void retry_per_attempt_recv_timeout_on_last_attempt(grpc_end2end_test_config config);
+extern void retry_per_attempt_recv_timeout_on_last_attempt_pre_init(void);
extern void retry_recv_initial_metadata(grpc_end2end_test_config config);
extern void retry_recv_initial_metadata_pre_init(void);
extern void retry_recv_message(grpc_end2end_test_config config);
extern void retry_recv_message_pre_init(void);
extern void retry_recv_trailing_metadata_error(grpc_end2end_test_config config);
extern void retry_recv_trailing_metadata_error_pre_init(void);
+extern void retry_send_initial_metadata_refs(grpc_end2end_test_config config);
+extern void retry_send_initial_metadata_refs_pre_init(void);
extern void retry_send_op_fails(grpc_end2end_test_config config);
extern void retry_send_op_fails_pre_init(void);
extern void retry_server_pushback_delay(grpc_end2end_test_config config);
@@ -255,18 +263,22 @@ void grpc_end2end_tests_pre_init(void) {
resource_quota_server_pre_init();
retry_pre_init();
retry_cancel_during_delay_pre_init();
+ retry_cancel_with_multiple_send_batches_pre_init();
retry_cancellation_pre_init();
retry_disabled_pre_init();
retry_exceeds_buffer_size_in_delay_pre_init();
retry_exceeds_buffer_size_in_initial_batch_pre_init();
retry_exceeds_buffer_size_in_subsequent_batch_pre_init();
retry_lb_drop_pre_init();
+ retry_lb_fail_pre_init();
retry_non_retriable_status_pre_init();
retry_non_retriable_status_before_recv_trailing_metadata_started_pre_init();
retry_per_attempt_recv_timeout_pre_init();
+ retry_per_attempt_recv_timeout_on_last_attempt_pre_init();
retry_recv_initial_metadata_pre_init();
retry_recv_message_pre_init();
retry_recv_trailing_metadata_error_pre_init();
+ retry_send_initial_metadata_refs_pre_init();
retry_send_op_fails_pre_init();
retry_server_pushback_delay_pre_init();
retry_server_pushback_disabled_pre_init();
@@ -293,6 +305,7 @@ void grpc_end2end_tests_pre_init(void) {
write_buffering_at_end_pre_init();
}
+// NOLINTNEXTLINE(readability-function-size)
void grpc_end2end_tests(int argc, char **argv,
grpc_end2end_test_config config) {
int i;
@@ -350,18 +363,22 @@ void grpc_end2end_tests(int argc, char **argv,
resource_quota_server(config);
retry(config);
retry_cancel_during_delay(config);
+ retry_cancel_with_multiple_send_batches(config);
retry_cancellation(config);
retry_disabled(config);
retry_exceeds_buffer_size_in_delay(config);
retry_exceeds_buffer_size_in_initial_batch(config);
retry_exceeds_buffer_size_in_subsequent_batch(config);
retry_lb_drop(config);
+ retry_lb_fail(config);
retry_non_retriable_status(config);
retry_non_retriable_status_before_recv_trailing_metadata_started(config);
retry_per_attempt_recv_timeout(config);
+ retry_per_attempt_recv_timeout_on_last_attempt(config);
retry_recv_initial_metadata(config);
retry_recv_message(config);
retry_recv_trailing_metadata_error(config);
+ retry_send_initial_metadata_refs(config);
retry_send_op_fails(config);
retry_server_pushback_delay(config);
retry_server_pushback_disabled(config);
@@ -590,6 +607,10 @@ void grpc_end2end_tests(int argc, char **argv,
retry_cancel_during_delay(config);
continue;
}
+ if (0 == strcmp("retry_cancel_with_multiple_send_batches", argv[i])) {
+ retry_cancel_with_multiple_send_batches(config);
+ continue;
+ }
if (0 == strcmp("retry_cancellation", argv[i])) {
retry_cancellation(config);
continue;
@@ -614,6 +635,10 @@ void grpc_end2end_tests(int argc, char **argv,
retry_lb_drop(config);
continue;
}
+ if (0 == strcmp("retry_lb_fail", argv[i])) {
+ retry_lb_fail(config);
+ continue;
+ }
if (0 == strcmp("retry_non_retriable_status", argv[i])) {
retry_non_retriable_status(config);
continue;
@@ -626,6 +651,10 @@ void grpc_end2end_tests(int argc, char **argv,
retry_per_attempt_recv_timeout(config);
continue;
}
+ if (0 == strcmp("retry_per_attempt_recv_timeout_on_last_attempt", argv[i])) {
+ retry_per_attempt_recv_timeout_on_last_attempt(config);
+ continue;
+ }
if (0 == strcmp("retry_recv_initial_metadata", argv[i])) {
retry_recv_initial_metadata(config);
continue;
@@ -638,6 +667,10 @@ void grpc_end2end_tests(int argc, char **argv,
retry_recv_trailing_metadata_error(config);
continue;
}
+ if (0 == strcmp("retry_send_initial_metadata_refs", argv[i])) {
+ retry_send_initial_metadata_refs(config);
+ continue;
+ }
if (0 == strcmp("retry_send_op_fails", argv[i])) {
retry_send_op_fails(config);
continue;
diff --git a/test/core/end2end/gen_build_yaml.py b/test/core/end2end/gen_build_yaml.py
index fb21f65be2..144b2ce5d4 100755
--- a/test/core/end2end/gen_build_yaml.py
+++ b/test/core/end2end/gen_build_yaml.py
@@ -15,6 +15,7 @@
import os
import sys
+
import yaml
_ROOT = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), '../../..'))
diff --git a/test/core/end2end/generate_tests.bzl b/test/core/end2end/generate_tests.bzl
index 94a41e0430..4066a5491b 100755
--- a/test/core/end2end/generate_tests.bzl
+++ b/test/core/end2end/generate_tests.bzl
@@ -275,6 +275,12 @@ END2END_TESTS = {
"retry": _test_options(needs_client_channel = True),
"retry_cancellation": _test_options(needs_client_channel = True),
"retry_cancel_during_delay": _test_options(needs_client_channel = True),
+ "retry_cancel_with_multiple_send_batches": _test_options(
+ # TODO(jtattermusch): too long bazel test name makes the test flaky on Windows RBE
+ # See b/151617965
+ short_name = "retry_cancel3",
+ needs_client_channel = True,
+ ),
"retry_disabled": _test_options(needs_client_channel = True),
"retry_exceeds_buffer_size_in_delay": _test_options(
needs_client_channel = True,
@@ -292,6 +298,7 @@ END2END_TESTS = {
short_name = "retry_exceeds_buffer_size_in_subseq",
),
"retry_lb_drop": _test_options(needs_client_channel = True),
+ "retry_lb_fail": _test_options(needs_client_channel = True),
"retry_non_retriable_status": _test_options(needs_client_channel = True),
"retry_non_retriable_status_before_recv_trailing_metadata_started": _test_options(
needs_client_channel = True,
@@ -302,11 +309,20 @@ END2END_TESTS = {
"retry_per_attempt_recv_timeout": _test_options(
needs_client_channel = True,
),
+ "retry_per_attempt_recv_timeout_on_last_attempt": _test_options(
+ needs_client_channel = True,
+ # TODO(jtattermusch): too long bazel test name makes the test flaky on Windows RBE
+ # See b/151617965
+ short_name = "retry_per_attempt_recv_timeout2",
+ ),
"retry_recv_initial_metadata": _test_options(needs_client_channel = True),
"retry_recv_message": _test_options(needs_client_channel = True),
"retry_recv_trailing_metadata_error": _test_options(
needs_client_channel = True,
),
+ "retry_send_initial_metadata_refs": _test_options(
+ needs_client_channel = True,
+ ),
"retry_send_op_fails": _test_options(needs_client_channel = True),
"retry_server_pushback_delay": _test_options(needs_client_channel = True),
"retry_server_pushback_disabled": _test_options(needs_client_channel = True),
diff --git a/test/core/end2end/tests/authority_not_supported.cc b/test/core/end2end/tests/authority_not_supported.cc
index 18cc6f5f12..95e38f563a 100644
--- a/test/core/end2end/tests/authority_not_supported.cc
+++ b/test/core/end2end/tests/authority_not_supported.cc
@@ -92,11 +92,9 @@ static void test_with_authority_header(grpc_end2end_test_config config) {
grpc_raw_byte_buffer_create(&request_payload_slice, 1);
grpc_metadata meta_c[2] = {{grpc_slice_from_static_string("key1"),
grpc_slice_from_static_string("val1"),
- 0,
{{nullptr, nullptr, nullptr, nullptr}}},
{grpc_slice_from_static_string("key2"),
grpc_slice_from_static_string("val2"),
- 0,
{{nullptr, nullptr, nullptr, nullptr}}}};
grpc_end2end_test_fixture f =
begin_test(config, "test_with_authority_header", nullptr, nullptr);
diff --git a/test/core/end2end/tests/binary_metadata.cc b/test/core/end2end/tests/binary_metadata.cc
index 6bcaac5e83..96c386122d 100644
--- a/test/core/end2end/tests/binary_metadata.cc
+++ b/test/core/end2end/tests/binary_metadata.cc
@@ -100,23 +100,19 @@ static void test_request_response_with_metadata_and_payload(
{grpc_slice_from_static_string("key1-bin"),
grpc_slice_from_static_string(
"\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc"),
- 0,
{{nullptr, nullptr, nullptr, nullptr}}},
{grpc_slice_from_static_string("key2-bin"),
grpc_slice_from_static_string(
"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d"),
- 0,
{{nullptr, nullptr, nullptr, nullptr}}}};
grpc_metadata meta_s[2] = {
{grpc_slice_from_static_string("key3-bin"),
grpc_slice_from_static_string(
"\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee"),
- 0,
{{nullptr, nullptr, nullptr, nullptr}}},
{grpc_slice_from_static_string("key4-bin"),
grpc_slice_from_static_string(
"\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"),
- 0,
{{nullptr, nullptr, nullptr, nullptr}}}};
grpc_end2end_test_fixture f =
begin_test(config, "test_request_response_with_metadata_and_payload",
diff --git a/test/core/end2end/tests/retry.cc b/test/core/end2end/tests/retry.cc
index 1c82b51b62..5e75494b60 100644
--- a/test/core/end2end/tests/retry.cc
+++ b/test/core/end2end/tests/retry.cc
@@ -121,8 +121,6 @@ static void test_retry(grpc_end2end_test_config config) {
char* peer;
grpc_arg args[] = {
- grpc_channel_arg_integer_create(
- const_cast<char*>(GRPC_ARG_ENABLE_RETRIES), 1),
grpc_channel_arg_string_create(
const_cast<char*>(GRPC_ARG_SERVICE_CONFIG),
const_cast<char*>(
diff --git a/test/core/end2end/tests/retry_cancel_during_delay.cc b/test/core/end2end/tests/retry_cancel_during_delay.cc
index 161b7aa16d..05d1f94164 100644
--- a/test/core/end2end/tests/retry_cancel_during_delay.cc
+++ b/test/core/end2end/tests/retry_cancel_during_delay.cc
@@ -120,8 +120,6 @@ static void test_retry_cancel_during_delay(grpc_end2end_test_config config,
char* peer;
grpc_arg args[] = {
- grpc_channel_arg_integer_create(
- const_cast<char*>(GRPC_ARG_ENABLE_RETRIES), 1),
grpc_channel_arg_string_create(
const_cast<char*>(GRPC_ARG_SERVICE_CONFIG),
const_cast<char*>(
diff --git a/test/core/end2end/tests/retry_cancel_with_multiple_send_batches.cc b/test/core/end2end/tests/retry_cancel_with_multiple_send_batches.cc
new file mode 100644
index 0000000000..a86e23b379
--- /dev/null
+++ b/test/core/end2end/tests/retry_cancel_with_multiple_send_batches.cc
@@ -0,0 +1,346 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * 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.
+ *
+ */
+
+#include "test/core/end2end/end2end_tests.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#include "absl/strings/str_format.h"
+
+#include <grpc/byte_buffer.h>
+#include <grpc/grpc.h>
+#include <grpc/support/alloc.h>
+#include <grpc/support/log.h>
+#include <grpc/support/string_util.h>
+#include <grpc/support/time.h>
+
+#include "src/core/lib/channel/channel_args.h"
+#include "src/core/lib/channel/channel_stack.h"
+#include "src/core/lib/channel/channel_stack_builder.h"
+#include "src/core/lib/gpr/string.h"
+#include "src/core/lib/gpr/useful.h"
+#include "src/core/lib/iomgr/exec_ctx.h"
+#include "src/core/lib/surface/channel_init.h"
+#include "src/core/lib/transport/static_metadata.h"
+
+#include "test/core/end2end/cq_verifier.h"
+#include "test/core/end2end/tests/cancel_test_helpers.h"
+
+static void* tag(intptr_t t) { return reinterpret_cast<void*>(t); }
+
+static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
+ const char* test_name,
+ grpc_channel_args* client_args,
+ grpc_channel_args* server_args) {
+ grpc_end2end_test_fixture f;
+ gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
+ f = config.create_fixture(client_args, server_args);
+ config.init_server(&f, server_args);
+ config.init_client(&f, client_args);
+ return f;
+}
+
+static gpr_timespec n_seconds_from_now(int n) {
+ return grpc_timeout_seconds_to_deadline(n);
+}
+
+static gpr_timespec five_seconds_from_now(void) {
+ return n_seconds_from_now(5);
+}
+
+static void drain_cq(grpc_completion_queue* cq) {
+ grpc_event ev;
+ do {
+ ev = grpc_completion_queue_next(cq, five_seconds_from_now(), nullptr);
+ } while (ev.type != GRPC_QUEUE_SHUTDOWN);
+}
+
+static void shutdown_server(grpc_end2end_test_fixture* f) {
+ if (!f->server) return;
+ grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
+ GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
+ grpc_timeout_seconds_to_deadline(5),
+ nullptr)
+ .type == GRPC_OP_COMPLETE);
+ grpc_server_destroy(f->server);
+ f->server = nullptr;
+}
+
+static void shutdown_client(grpc_end2end_test_fixture* f) {
+ if (!f->client) return;
+ grpc_channel_destroy(f->client);
+ f->client = nullptr;
+}
+
+static void end_test(grpc_end2end_test_fixture* f) {
+ shutdown_server(f);
+ shutdown_client(f);
+
+ grpc_completion_queue_shutdown(f->cq);
+ drain_cq(f->cq);
+ grpc_completion_queue_destroy(f->cq);
+ grpc_completion_queue_destroy(f->shutdown_cq);
+}
+
+// Tests cancellation with multiple send op batches.
+static void test_retry_cancel_with_multiple_send_batches(
+ grpc_end2end_test_config config, cancellation_mode mode) {
+ grpc_call* c;
+ grpc_op ops[6];
+ grpc_op* op;
+ grpc_metadata_array initial_metadata_recv;
+ grpc_metadata_array trailing_metadata_recv;
+ grpc_slice request_payload_slice = grpc_slice_from_static_string("foo");
+ grpc_byte_buffer* request_payload =
+ grpc_raw_byte_buffer_create(&request_payload_slice, 1);
+ grpc_byte_buffer* response_payload_recv = nullptr;
+ grpc_status_code status;
+ grpc_call_error error;
+ grpc_slice details;
+ char* peer;
+
+ std::string service_config_string = absl::StrFormat(
+ "{\n"
+ " \"methodConfig\": [ {\n"
+ " \"name\": [\n"
+ " { \"service\": \"service\", \"method\": \"method\" }\n"
+ " ],\n"
+ " \"retryPolicy\": {\n"
+ " \"maxAttempts\": 2,\n"
+ " \"initialBackoff\": \"%ds\",\n"
+ " \"maxBackoff\": \"120s\",\n"
+ " \"backoffMultiplier\": 1.6,\n"
+ " \"retryableStatusCodes\": [ \"ABORTED\" ]\n"
+ " }\n"
+ " } ]\n"
+ "}",
+ 5 * grpc_test_slowdown_factor());
+
+ grpc_arg args[] = {
+ grpc_channel_arg_integer_create(
+ const_cast<char*>(GRPC_ARG_ENABLE_RETRIES), 1),
+ grpc_channel_arg_string_create(
+ const_cast<char*>(GRPC_ARG_SERVICE_CONFIG),
+ const_cast<char*>(service_config_string.c_str())),
+ };
+ grpc_channel_args client_args = {GPR_ARRAY_SIZE(args), args};
+ std::string name =
+ absl::StrCat("retry_cancel_with_multiple_send_batches/", mode.name);
+ grpc_end2end_test_fixture f =
+ begin_test(config, name.c_str(), &client_args, nullptr);
+
+ cq_verifier* cqv = cq_verifier_create(f.cq);
+
+ gpr_timespec deadline = n_seconds_from_now(3);
+ c = grpc_channel_create_call(f.client, nullptr, GRPC_PROPAGATE_DEFAULTS, f.cq,
+ grpc_slice_from_static_string("/service/method"),
+ nullptr, deadline, nullptr);
+ GPR_ASSERT(c);
+
+ peer = grpc_call_get_peer(c);
+ GPR_ASSERT(peer != nullptr);
+ gpr_log(GPR_DEBUG, "client_peer_before_call=%s", peer);
+ gpr_free(peer);
+
+ grpc_metadata_array_init(&initial_metadata_recv);
+ grpc_metadata_array_init(&trailing_metadata_recv);
+
+ // Start a batch containing send_initial_metadata.
+ memset(ops, 0, sizeof(ops));
+ op = ops;
+ op->op = GRPC_OP_SEND_INITIAL_METADATA;
+ op->data.send_initial_metadata.count = 0;
+ op++;
+ error = grpc_call_start_batch(c, ops, static_cast<size_t>(op - ops), tag(1),
+ nullptr);
+ GPR_ASSERT(GRPC_CALL_OK == error);
+
+ // Start a batch containing send_message.
+ memset(ops, 0, sizeof(ops));
+ op = ops;
+ op->op = GRPC_OP_SEND_MESSAGE;
+ op->data.send_message.send_message = request_payload;
+ op++;
+ error = grpc_call_start_batch(c, ops, static_cast<size_t>(op - ops), tag(2),
+ nullptr);
+ GPR_ASSERT(GRPC_CALL_OK == error);
+
+ // Start a batch containing send_trailing_metadata.
+ memset(ops, 0, sizeof(ops));
+ op = ops;
+ op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
+ op++;
+ error = grpc_call_start_batch(c, ops, static_cast<size_t>(op - ops), tag(3),
+ nullptr);
+ GPR_ASSERT(GRPC_CALL_OK == error);
+
+ // Start a batch containing recv ops.
+ memset(ops, 0, sizeof(ops));
+ op = ops;
+ op->op = GRPC_OP_RECV_MESSAGE;
+ op->data.recv_message.recv_message = &response_payload_recv;
+ op++;
+ op->op = GRPC_OP_RECV_INITIAL_METADATA;
+ op->data.recv_initial_metadata.recv_initial_metadata = &initial_metadata_recv;
+ op++;
+ op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
+ op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv;
+ op->data.recv_status_on_client.status = &status;
+ op->data.recv_status_on_client.status_details = &details;
+ op++;
+ error = grpc_call_start_batch(c, ops, static_cast<size_t>(op - ops), tag(4),
+ nullptr);
+ GPR_ASSERT(GRPC_CALL_OK == error);
+
+ // Initiate cancellation.
+ GPR_ASSERT(GRPC_CALL_OK == mode.initiate_cancel(c, nullptr));
+
+ // Client ops should now complete.
+ CQ_EXPECT_COMPLETION(cqv, tag(1), false);
+ CQ_EXPECT_COMPLETION(cqv, tag(2), false);
+ CQ_EXPECT_COMPLETION(cqv, tag(3), false);
+ CQ_EXPECT_COMPLETION(cqv, tag(4), true);
+ cq_verify(cqv);
+
+ gpr_log(GPR_INFO, "status=%d expected=%d", status, mode.expect_status);
+ GPR_ASSERT(status == mode.expect_status);
+
+ grpc_slice_unref(details);
+ grpc_metadata_array_destroy(&initial_metadata_recv);
+ grpc_metadata_array_destroy(&trailing_metadata_recv);
+ grpc_byte_buffer_destroy(request_payload);
+ grpc_byte_buffer_destroy(response_payload_recv);
+
+ grpc_call_unref(c);
+
+ cq_verifier_destroy(cqv);
+
+ end_test(&f);
+ config.tear_down_data(&f);
+}
+
+namespace {
+
+// A filter that fails all batches with send ops.
+class FailSendOpsFilter {
+ public:
+ static grpc_channel_filter kFilterVtable;
+
+ public:
+ class CallData {
+ public:
+ static grpc_error_handle Init(grpc_call_element* elem,
+ const grpc_call_element_args* args) {
+ new (elem->call_data) CallData(args);
+ return GRPC_ERROR_NONE;
+ }
+
+ static void Destroy(grpc_call_element* elem,
+ const grpc_call_final_info* /*final_info*/,
+ grpc_closure* /*ignored*/) {
+ auto* calld = static_cast<CallData*>(elem->call_data);
+ calld->~CallData();
+ }
+
+ static void StartTransportStreamOpBatch(
+ grpc_call_element* elem, grpc_transport_stream_op_batch* batch) {
+ auto* calld = static_cast<CallData*>(elem->call_data);
+ if (batch->send_initial_metadata || batch->send_message ||
+ batch->send_trailing_metadata) {
+ grpc_transport_stream_op_batch_finish_with_failure(
+ batch,
+ grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "FailSendOpsFilter failing batch"),
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_ABORTED),
+ calld->call_combiner_);
+ return;
+ }
+ grpc_call_next_op(elem, batch);
+ }
+
+ private:
+ explicit CallData(const grpc_call_element_args* args)
+ : call_combiner_(args->call_combiner) {}
+
+ grpc_core::CallCombiner* call_combiner_;
+ };
+
+ static grpc_error_handle Init(grpc_channel_element* elem,
+ grpc_channel_element_args* /*args*/) {
+ new (elem->channel_data) FailSendOpsFilter();
+ return GRPC_ERROR_NONE;
+ }
+
+ static void Destroy(grpc_channel_element* elem) {
+ auto* chand = static_cast<FailSendOpsFilter*>(elem->channel_data);
+ chand->~FailSendOpsFilter();
+ }
+};
+
+grpc_channel_filter FailSendOpsFilter::kFilterVtable = {
+ CallData::StartTransportStreamOpBatch,
+ grpc_channel_next_op,
+ sizeof(CallData),
+ CallData::Init,
+ grpc_call_stack_ignore_set_pollset_or_pollset_set,
+ CallData::Destroy,
+ sizeof(FailSendOpsFilter),
+ Init,
+ Destroy,
+ grpc_channel_next_get_info,
+ "FailSendOpsFilter",
+};
+
+bool g_enable_filter = false;
+
+bool MaybeAddFilter(grpc_channel_stack_builder* builder, void* /*arg*/) {
+ // Skip if filter is not enabled.
+ if (!g_enable_filter) return true;
+ // Skip on proxy (which explicitly disables retries).
+ const grpc_channel_args* args =
+ grpc_channel_stack_builder_get_channel_arguments(builder);
+ if (!grpc_channel_args_find_bool(args, GRPC_ARG_ENABLE_RETRIES, true)) {
+ return true;
+ }
+ // Install filter.
+ return grpc_channel_stack_builder_prepend_filter(
+ builder, &FailSendOpsFilter::kFilterVtable, nullptr, nullptr);
+}
+
+void InitPlugin(void) {
+ grpc_channel_init_register_stage(GRPC_CLIENT_SUBCHANNEL, 0, MaybeAddFilter,
+ nullptr);
+}
+
+void DestroyPlugin(void) {}
+
+} // namespace
+
+void retry_cancel_with_multiple_send_batches(grpc_end2end_test_config config) {
+ GPR_ASSERT(config.feature_mask & FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL);
+ g_enable_filter = true;
+ for (size_t i = 0; i < GPR_ARRAY_SIZE(cancellation_modes); ++i) {
+ test_retry_cancel_with_multiple_send_batches(config, cancellation_modes[i]);
+ }
+ g_enable_filter = false;
+}
+
+void retry_cancel_with_multiple_send_batches_pre_init(void) {
+ grpc_register_plugin(InitPlugin, DestroyPlugin);
+}
diff --git a/test/core/end2end/tests/retry_cancellation.cc b/test/core/end2end/tests/retry_cancellation.cc
index c4f1b943ea..654ad59609 100644
--- a/test/core/end2end/tests/retry_cancellation.cc
+++ b/test/core/end2end/tests/retry_cancellation.cc
@@ -122,8 +122,6 @@ static void test_retry_cancellation(grpc_end2end_test_config config,
char* peer;
grpc_arg args[] = {
- grpc_channel_arg_integer_create(
- const_cast<char*>(GRPC_ARG_ENABLE_RETRIES), 1),
grpc_channel_arg_string_create(
const_cast<char*>(GRPC_ARG_SERVICE_CONFIG),
const_cast<char*>(
diff --git a/test/core/end2end/tests/retry_disabled.cc b/test/core/end2end/tests/retry_disabled.cc
index dc953db7ef..83deb41113 100644
--- a/test/core/end2end/tests/retry_disabled.cc
+++ b/test/core/end2end/tests/retry_disabled.cc
@@ -93,13 +93,11 @@ static void end_test(grpc_end2end_test_fixture* f) {
grpc_completion_queue_destroy(f->shutdown_cq);
}
-// Tests that we don't retry when retries are not enabled via the
+// Tests that we don't retry when retries are disabled via the
// GRPC_ARG_ENABLE_RETRIES channel arg, even when there is retry
// configuration in the service config.
// - 1 retry allowed for ABORTED status
// - first attempt returns ABORTED but does not retry
-// TODO(roth): Update this when we change the default of
-// GRPC_ARG_ENABLE_RETRIES to true.
static void test_retry_disabled(grpc_end2end_test_config config) {
grpc_call* c;
grpc_call* s;
@@ -123,24 +121,28 @@ static void test_retry_disabled(grpc_end2end_test_config config) {
int was_cancelled = 2;
char* peer;
- grpc_arg arg = grpc_channel_arg_string_create(
- const_cast<char*>(GRPC_ARG_SERVICE_CONFIG),
- const_cast<char*>(
- "{\n"
- " \"methodConfig\": [ {\n"
- " \"name\": [\n"
- " { \"service\": \"service\", \"method\": \"method\" }\n"
- " ],\n"
- " \"retryPolicy\": {\n"
- " \"maxAttempts\": 2,\n"
- " \"initialBackoff\": \"1s\",\n"
- " \"maxBackoff\": \"120s\",\n"
- " \"backoffMultiplier\": 1.6,\n"
- " \"retryableStatusCodes\": [ \"ABORTED\" ]\n"
- " }\n"
- " } ]\n"
- "}"));
- grpc_channel_args client_args = {1, &arg};
+ grpc_arg args[] = {
+ grpc_channel_arg_integer_create(
+ const_cast<char*>(GRPC_ARG_ENABLE_RETRIES), 0),
+ grpc_channel_arg_string_create(
+ const_cast<char*>(GRPC_ARG_SERVICE_CONFIG),
+ const_cast<char*>(
+ "{\n"
+ " \"methodConfig\": [ {\n"
+ " \"name\": [\n"
+ " { \"service\": \"service\", \"method\": \"method\" }\n"
+ " ],\n"
+ " \"retryPolicy\": {\n"
+ " \"maxAttempts\": 2,\n"
+ " \"initialBackoff\": \"1s\",\n"
+ " \"maxBackoff\": \"120s\",\n"
+ " \"backoffMultiplier\": 1.6,\n"
+ " \"retryableStatusCodes\": [ \"ABORTED\" ]\n"
+ " }\n"
+ " } ]\n"
+ "}")),
+ };
+ grpc_channel_args client_args = {GPR_ARRAY_SIZE(args), args};
grpc_end2end_test_fixture f =
begin_test(config, "retry_disabled", &client_args, nullptr);
diff --git a/test/core/end2end/tests/retry_exceeds_buffer_size_in_delay.cc b/test/core/end2end/tests/retry_exceeds_buffer_size_in_delay.cc
index 79b03dd1cf..d515bc46b8 100644
--- a/test/core/end2end/tests/retry_exceeds_buffer_size_in_delay.cc
+++ b/test/core/end2end/tests/retry_exceeds_buffer_size_in_delay.cc
@@ -127,8 +127,6 @@ static void test_retry_exceeds_buffer_size_in_delay(
char* peer;
grpc_arg args[] = {
- grpc_channel_arg_integer_create(
- const_cast<char*>(GRPC_ARG_ENABLE_RETRIES), 1),
grpc_channel_arg_string_create(
const_cast<char*>(GRPC_ARG_SERVICE_CONFIG),
const_cast<char*>(
diff --git a/test/core/end2end/tests/retry_exceeds_buffer_size_in_initial_batch.cc b/test/core/end2end/tests/retry_exceeds_buffer_size_in_initial_batch.cc
index 3a7f42b05a..286e81ec29 100644
--- a/test/core/end2end/tests/retry_exceeds_buffer_size_in_initial_batch.cc
+++ b/test/core/end2end/tests/retry_exceeds_buffer_size_in_initial_batch.cc
@@ -124,8 +124,6 @@ static void test_retry_exceeds_buffer_size_in_initial_batch(
char* peer;
grpc_arg args[] = {
- grpc_channel_arg_integer_create(
- const_cast<char*>(GRPC_ARG_ENABLE_RETRIES), 1),
grpc_channel_arg_string_create(
const_cast<char*>(GRPC_ARG_SERVICE_CONFIG),
const_cast<char*>(
diff --git a/test/core/end2end/tests/retry_exceeds_buffer_size_in_subsequent_batch.cc b/test/core/end2end/tests/retry_exceeds_buffer_size_in_subsequent_batch.cc
index 7c84297d3d..6c2abcca56 100644
--- a/test/core/end2end/tests/retry_exceeds_buffer_size_in_subsequent_batch.cc
+++ b/test/core/end2end/tests/retry_exceeds_buffer_size_in_subsequent_batch.cc
@@ -129,8 +129,6 @@ static void test_retry_exceeds_buffer_size_in_subsequent_batch(
char* peer;
grpc_arg args[] = {
- grpc_channel_arg_integer_create(
- const_cast<char*>(GRPC_ARG_ENABLE_RETRIES), 1),
grpc_channel_arg_string_create(
const_cast<char*>(GRPC_ARG_SERVICE_CONFIG),
const_cast<char*>(
diff --git a/test/core/end2end/tests/retry_lb_drop.cc b/test/core/end2end/tests/retry_lb_drop.cc
index d81b04aaf2..2a72910456 100644
--- a/test/core/end2end/tests/retry_lb_drop.cc
+++ b/test/core/end2end/tests/retry_lb_drop.cc
@@ -60,9 +60,8 @@ class DropPolicy : public LoadBalancingPolicy {
class DropPicker : public SubchannelPicker {
public:
PickResult Pick(PickArgs /*args*/) override {
- PickResult result;
- result.type = PickResult::PICK_COMPLETE;
- return result;
+ return PickResult::Drop(
+ absl::UnavailableError("Call dropped by drop LB policy"));
}
};
};
@@ -159,11 +158,10 @@ static void end_test(grpc_end2end_test_fixture* f) {
grpc_completion_queue_destroy(f->shutdown_cq);
}
-// Tests that we don't retry when retries are disabled via the
-// GRPC_ARG_ENABLE_RETRIES channel arg, even when there is retry
-// configuration in the service config.
-// - 1 retry allowed for ABORTED status
-// - first attempt returns ABORTED but does not retry
+// Tests that we don't retry when the LB policy drops a call,
+// even when there is retry configuration in the service config.
+// - 1 retry allowed for UNAVAILABLE status
+// - first attempt returns UNAVAILABLE due to LB drop but does not retry
static void test_retry_lb_drop(grpc_end2end_test_config config) {
grpc_call* c;
grpc_op ops[6];
@@ -182,8 +180,6 @@ static void test_retry_lb_drop(grpc_end2end_test_config config) {
grpc_core::g_pick_args_vector = &pick_args_seen;
grpc_arg args[] = {
- grpc_channel_arg_integer_create(
- const_cast<char*>(GRPC_ARG_ENABLE_RETRIES), 1),
grpc_channel_arg_string_create(
const_cast<char*>(GRPC_ARG_SERVICE_CONFIG),
const_cast<char*>(
@@ -249,8 +245,8 @@ static void test_retry_lb_drop(grpc_end2end_test_config config) {
cq_verify(cqv);
GPR_ASSERT(status == GRPC_STATUS_UNAVAILABLE);
- GPR_ASSERT(0 == grpc_slice_str_cmp(details,
- "Call dropped by load balancing policy"));
+ GPR_ASSERT(0 ==
+ grpc_slice_str_cmp(details, "Call dropped by drop LB policy"));
grpc_slice_unref(details);
grpc_metadata_array_destroy(&initial_metadata_recv);
diff --git a/test/core/end2end/tests/retry_lb_fail.cc b/test/core/end2end/tests/retry_lb_fail.cc
new file mode 100644
index 0000000000..ba77767684
--- /dev/null
+++ b/test/core/end2end/tests/retry_lb_fail.cc
@@ -0,0 +1,276 @@
+//
+// Copyright 2017 gRPC authors.
+//
+// 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.
+//
+
+#include "test/core/end2end/end2end_tests.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#include <grpc/byte_buffer.h>
+#include <grpc/grpc.h>
+#include <grpc/support/alloc.h>
+#include <grpc/support/log.h>
+#include <grpc/support/string_util.h>
+#include <grpc/support/time.h>
+
+#include "src/core/ext/filters/client_channel/lb_policy_registry.h"
+#include "src/core/lib/channel/channel_args.h"
+#include "src/core/lib/gpr/string.h"
+#include "src/core/lib/gpr/useful.h"
+#include "src/core/lib/iomgr/exec_ctx.h"
+#include "src/core/lib/transport/error_utils.h"
+#include "src/core/lib/transport/static_metadata.h"
+
+#include "test/core/end2end/cq_verifier.h"
+#include "test/core/end2end/tests/cancel_test_helpers.h"
+
+namespace grpc_core {
+namespace {
+
+const char* kFailPolicyName = "fail_lb";
+
+Atomic<int> g_num_lb_picks;
+
+class FailPolicy : public LoadBalancingPolicy {
+ public:
+ explicit FailPolicy(Args args) : LoadBalancingPolicy(std::move(args)) {}
+
+ const char* name() const override { return kFailPolicyName; }
+
+ void UpdateLocked(UpdateArgs) override {
+ absl::Status status = absl::AbortedError("LB pick failed");
+ channel_control_helper()->UpdateState(
+ GRPC_CHANNEL_TRANSIENT_FAILURE, status,
+ absl::make_unique<FailPicker>(status));
+ }
+
+ void ResetBackoffLocked() override {}
+ void ShutdownLocked() override {}
+
+ private:
+ class FailPicker : public SubchannelPicker {
+ public:
+ explicit FailPicker(absl::Status status) : status_(status) {}
+
+ PickResult Pick(PickArgs /*args*/) override {
+ g_num_lb_picks.FetchAdd(1);
+ return PickResult::Fail(status_);
+ }
+
+ private:
+ absl::Status status_;
+ };
+};
+
+class FailLbConfig : public LoadBalancingPolicy::Config {
+ public:
+ const char* name() const override { return kFailPolicyName; }
+};
+
+class FailPolicyFactory : public LoadBalancingPolicyFactory {
+ public:
+ OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
+ LoadBalancingPolicy::Args args) const override {
+ return MakeOrphanable<FailPolicy>(std::move(args));
+ }
+
+ const char* name() const override { return kFailPolicyName; }
+
+ RefCountedPtr<LoadBalancingPolicy::Config> ParseLoadBalancingConfig(
+ const Json& /*json*/, grpc_error_handle* /*error*/) const override {
+ return MakeRefCounted<FailLbConfig>();
+ }
+};
+
+void RegisterFailPolicy() {
+ LoadBalancingPolicyRegistry::Builder::RegisterLoadBalancingPolicyFactory(
+ absl::make_unique<FailPolicyFactory>());
+}
+
+} // namespace
+} // namespace grpc_core
+
+static void* tag(intptr_t t) { return reinterpret_cast<void*>(t); }
+
+static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
+ const char* test_name,
+ grpc_channel_args* client_args,
+ grpc_channel_args* server_args) {
+ grpc_end2end_test_fixture f;
+ gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
+ f = config.create_fixture(client_args, server_args);
+ config.init_server(&f, server_args);
+ config.init_client(&f, client_args);
+ return f;
+}
+
+static gpr_timespec n_seconds_from_now(int n) {
+ return grpc_timeout_seconds_to_deadline(n);
+}
+
+static gpr_timespec five_seconds_from_now(void) {
+ return n_seconds_from_now(5);
+}
+
+static void drain_cq(grpc_completion_queue* cq) {
+ grpc_event ev;
+ do {
+ ev = grpc_completion_queue_next(cq, five_seconds_from_now(), nullptr);
+ } while (ev.type != GRPC_QUEUE_SHUTDOWN);
+}
+
+static void shutdown_server(grpc_end2end_test_fixture* f) {
+ if (!f->server) return;
+ grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
+ GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
+ grpc_timeout_seconds_to_deadline(5),
+ nullptr)
+ .type == GRPC_OP_COMPLETE);
+ grpc_server_destroy(f->server);
+ f->server = nullptr;
+}
+
+static void shutdown_client(grpc_end2end_test_fixture* f) {
+ if (!f->client) return;
+ grpc_channel_destroy(f->client);
+ f->client = nullptr;
+}
+
+static void end_test(grpc_end2end_test_fixture* f) {
+ shutdown_server(f);
+ shutdown_client(f);
+
+ grpc_completion_queue_shutdown(f->cq);
+ drain_cq(f->cq);
+ grpc_completion_queue_destroy(f->cq);
+ grpc_completion_queue_destroy(f->shutdown_cq);
+}
+
+// Tests that we retry properly when the LB policy fails the call before
+// it ever gets to the transport, even if recv_trailing_metadata isn't
+// started by the application until after the LB pick fails.
+// - 1 retry allowed for ABORTED status
+// - on first attempt, LB policy fails with ABORTED before application
+// starts recv_trailing_metadata op
+static void test_retry_lb_fail(grpc_end2end_test_config config) {
+ grpc_call* c;
+ grpc_op ops[6];
+ grpc_op* op;
+ grpc_metadata_array initial_metadata_recv;
+ grpc_metadata_array trailing_metadata_recv;
+ grpc_slice request_payload_slice = grpc_slice_from_static_string("foo");
+ grpc_byte_buffer* request_payload =
+ grpc_raw_byte_buffer_create(&request_payload_slice, 1);
+ grpc_byte_buffer* response_payload_recv = nullptr;
+ grpc_status_code status;
+ grpc_call_error error;
+ grpc_slice details;
+
+ grpc_core::g_num_lb_picks.Store(0, grpc_core::MemoryOrder::RELAXED);
+
+ grpc_arg args[] = {
+ grpc_channel_arg_integer_create(
+ const_cast<char*>(GRPC_ARG_ENABLE_RETRIES), 1),
+ grpc_channel_arg_string_create(
+ const_cast<char*>(GRPC_ARG_SERVICE_CONFIG),
+ const_cast<char*>(
+ "{\n"
+ " \"loadBalancingConfig\": [ {\n"
+ " \"fail_lb\": {}\n"
+ " } ],\n"
+ " \"methodConfig\": [ {\n"
+ " \"name\": [\n"
+ " { \"service\": \"service\", \"method\": \"method\" }\n"
+ " ],\n"
+ " \"retryPolicy\": {\n"
+ " \"maxAttempts\": 2,\n"
+ " \"initialBackoff\": \"1s\",\n"
+ " \"maxBackoff\": \"120s\",\n"
+ " \"backoffMultiplier\": 1.6,\n"
+ " \"retryableStatusCodes\": [ \"ABORTED\" ]\n"
+ " }\n"
+ " } ]\n"
+ "}")),
+ };
+ grpc_channel_args client_args = {GPR_ARRAY_SIZE(args), args};
+ grpc_end2end_test_fixture f =
+ begin_test(config, "retry_lb_fail", &client_args, nullptr);
+
+ cq_verifier* cqv = cq_verifier_create(f.cq);
+
+ gpr_timespec deadline = five_seconds_from_now();
+ c = grpc_channel_create_call(f.client, nullptr, GRPC_PROPAGATE_DEFAULTS, f.cq,
+ grpc_slice_from_static_string("/service/method"),
+ nullptr, deadline, nullptr);
+ GPR_ASSERT(c);
+
+ grpc_metadata_array_init(&initial_metadata_recv);
+ grpc_metadata_array_init(&trailing_metadata_recv);
+
+ memset(ops, 0, sizeof(ops));
+ op = ops;
+ op->op = GRPC_OP_SEND_INITIAL_METADATA;
+ op->data.send_initial_metadata.count = 0;
+ op++;
+ error = grpc_call_start_batch(c, ops, static_cast<size_t>(op - ops), tag(1),
+ nullptr);
+ GPR_ASSERT(GRPC_CALL_OK == error);
+
+ CQ_EXPECT_COMPLETION(cqv, tag(1), false);
+ cq_verify(cqv);
+
+ memset(ops, 0, sizeof(ops));
+ op = ops;
+ op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
+ op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv;
+ op->data.recv_status_on_client.status = &status;
+ op->data.recv_status_on_client.status_details = &details;
+ op++;
+ error = grpc_call_start_batch(c, ops, static_cast<size_t>(op - ops), tag(2),
+ nullptr);
+ GPR_ASSERT(GRPC_CALL_OK == error);
+
+ CQ_EXPECT_COMPLETION(cqv, tag(2), true);
+ cq_verify(cqv);
+
+ GPR_ASSERT(status == GRPC_STATUS_ABORTED);
+ GPR_ASSERT(0 == grpc_slice_str_cmp(details, "LB pick failed"));
+
+ grpc_slice_unref(details);
+ grpc_metadata_array_destroy(&initial_metadata_recv);
+ grpc_metadata_array_destroy(&trailing_metadata_recv);
+ grpc_byte_buffer_destroy(request_payload);
+ grpc_byte_buffer_destroy(response_payload_recv);
+
+ grpc_call_unref(c);
+
+ cq_verifier_destroy(cqv);
+
+ int num_picks =
+ grpc_core::g_num_lb_picks.Load(grpc_core::MemoryOrder::RELAXED);
+ gpr_log(GPR_INFO, "NUM LB PICKS: %d", num_picks);
+ GPR_ASSERT(num_picks == 2);
+
+ end_test(&f);
+ config.tear_down_data(&f);
+}
+
+void retry_lb_fail(grpc_end2end_test_config config) {
+ GPR_ASSERT(config.feature_mask & FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL);
+ test_retry_lb_fail(config);
+}
+
+void retry_lb_fail_pre_init(void) { grpc_core::RegisterFailPolicy(); }
diff --git a/test/core/end2end/tests/retry_non_retriable_status.cc b/test/core/end2end/tests/retry_non_retriable_status.cc
index 3ad91ea59e..aeab8772a9 100644
--- a/test/core/end2end/tests/retry_non_retriable_status.cc
+++ b/test/core/end2end/tests/retry_non_retriable_status.cc
@@ -120,8 +120,6 @@ static void test_retry_non_retriable_status(grpc_end2end_test_config config) {
char* peer;
grpc_arg args[] = {
- grpc_channel_arg_integer_create(
- const_cast<char*>(GRPC_ARG_ENABLE_RETRIES), 1),
grpc_channel_arg_string_create(
const_cast<char*>(GRPC_ARG_SERVICE_CONFIG),
const_cast<char*>(
diff --git a/test/core/end2end/tests/retry_non_retriable_status_before_recv_trailing_metadata_started.cc b/test/core/end2end/tests/retry_non_retriable_status_before_recv_trailing_metadata_started.cc
index cc854b8ae4..6436553439 100644
--- a/test/core/end2end/tests/retry_non_retriable_status_before_recv_trailing_metadata_started.cc
+++ b/test/core/end2end/tests/retry_non_retriable_status_before_recv_trailing_metadata_started.cc
@@ -123,8 +123,6 @@ test_retry_non_retriable_status_before_recv_trailing_metadata_started(
char* peer;
grpc_arg args[] = {
- grpc_channel_arg_integer_create(
- const_cast<char*>(GRPC_ARG_ENABLE_RETRIES), 1),
grpc_channel_arg_string_create(
const_cast<char*>(GRPC_ARG_SERVICE_CONFIG),
const_cast<char*>(
@@ -176,9 +174,6 @@ test_retry_non_retriable_status_before_recv_trailing_metadata_started(
op->op = GRPC_OP_SEND_MESSAGE;
op->data.send_message.send_message = request_payload;
op++;
- op->op = GRPC_OP_RECV_MESSAGE;
- op->data.recv_message.recv_message = &response_payload_recv;
- op++;
op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
op++;
op->op = GRPC_OP_RECV_INITIAL_METADATA;
@@ -227,6 +222,9 @@ test_retry_non_retriable_status_before_recv_trailing_metadata_started(
memset(ops, 0, sizeof(ops));
op = ops;
+ op->op = GRPC_OP_RECV_MESSAGE;
+ op->data.recv_message.recv_message = &response_payload_recv;
+ op++;
op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv;
op->data.recv_status_on_client.status = &status;
diff --git a/test/core/end2end/tests/retry_per_attempt_recv_timeout.cc b/test/core/end2end/tests/retry_per_attempt_recv_timeout.cc
index 016b6e9811..74a09ba81a 100644
--- a/test/core/end2end/tests/retry_per_attempt_recv_timeout.cc
+++ b/test/core/end2end/tests/retry_per_attempt_recv_timeout.cc
@@ -123,7 +123,7 @@ static void test_retry_per_attempt_recv_timeout(
grpc_arg args[] = {
grpc_channel_arg_integer_create(
- const_cast<char*>(GRPC_ARG_ENABLE_RETRIES), 1),
+ const_cast<char*>(GRPC_ARG_EXPERIMENTAL_ENABLE_HEDGING), 1),
grpc_channel_arg_string_create(
const_cast<char*>(GRPC_ARG_SERVICE_CONFIG),
const_cast<char*>(
@@ -137,7 +137,7 @@ static void test_retry_per_attempt_recv_timeout(
" \"initialBackoff\": \"1s\",\n"
" \"maxBackoff\": \"120s\",\n"
" \"backoffMultiplier\": 1.6,\n"
- " \"perAttemptRecvTimeout\": \"1s\",\n"
+ " \"perAttemptRecvTimeout\": \"2s\",\n"
" \"retryableStatusCodes\": [ \"ABORTED\" ]\n"
" }\n"
" } ]\n"
diff --git a/test/core/end2end/tests/retry_per_attempt_recv_timeout_on_last_attempt.cc b/test/core/end2end/tests/retry_per_attempt_recv_timeout_on_last_attempt.cc
new file mode 100644
index 0000000000..597b16759a
--- /dev/null
+++ b/test/core/end2end/tests/retry_per_attempt_recv_timeout_on_last_attempt.cc
@@ -0,0 +1,263 @@
+//
+// Copyright 2017 gRPC authors.
+//
+// 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.
+//
+
+#include "test/core/end2end/end2end_tests.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#include <grpc/byte_buffer.h>
+#include <grpc/grpc.h>
+#include <grpc/support/alloc.h>
+#include <grpc/support/log.h>
+#include <grpc/support/string_util.h>
+#include <grpc/support/time.h>
+
+#include "src/core/lib/channel/channel_args.h"
+#include "src/core/lib/gpr/string.h"
+#include "src/core/lib/gpr/useful.h"
+#include "src/core/lib/iomgr/exec_ctx.h"
+#include "src/core/lib/transport/static_metadata.h"
+
+#include "test/core/end2end/cq_verifier.h"
+#include "test/core/end2end/tests/cancel_test_helpers.h"
+
+static void* tag(intptr_t t) { return reinterpret_cast<void*>(t); }
+
+static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
+ const char* test_name,
+ grpc_channel_args* client_args,
+ grpc_channel_args* server_args) {
+ grpc_end2end_test_fixture f;
+ gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
+ f = config.create_fixture(client_args, server_args);
+ config.init_server(&f, server_args);
+ config.init_client(&f, client_args);
+ return f;
+}
+
+static gpr_timespec n_seconds_from_now(int n) {
+ return grpc_timeout_seconds_to_deadline(n);
+}
+
+static gpr_timespec five_seconds_from_now(void) {
+ return n_seconds_from_now(5);
+}
+
+static void drain_cq(grpc_completion_queue* cq) {
+ grpc_event ev;
+ do {
+ ev = grpc_completion_queue_next(cq, five_seconds_from_now(), nullptr);
+ } while (ev.type != GRPC_QUEUE_SHUTDOWN);
+}
+
+static void shutdown_server(grpc_end2end_test_fixture* f) {
+ if (!f->server) return;
+ grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
+ GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
+ grpc_timeout_seconds_to_deadline(5),
+ nullptr)
+ .type == GRPC_OP_COMPLETE);
+ grpc_server_destroy(f->server);
+ f->server = nullptr;
+}
+
+static void shutdown_client(grpc_end2end_test_fixture* f) {
+ if (!f->client) return;
+ grpc_channel_destroy(f->client);
+ f->client = nullptr;
+}
+
+static void end_test(grpc_end2end_test_fixture* f) {
+ shutdown_server(f);
+ shutdown_client(f);
+
+ grpc_completion_queue_shutdown(f->cq);
+ drain_cq(f->cq);
+ grpc_completion_queue_destroy(f->cq);
+ grpc_completion_queue_destroy(f->shutdown_cq);
+}
+
+// Tests perAttemptRecvTimeout:
+// - 1 retry allowed for ABORTED status
+// - both attempts do not receive a response until after perAttemptRecvTimeout
+static void test_retry_per_attempt_recv_timeout_on_last_attempt(
+ grpc_end2end_test_config config) {
+ grpc_call* c;
+ grpc_call* s;
+ grpc_call* s0;
+ grpc_op ops[6];
+ grpc_op* op;
+ grpc_metadata_array initial_metadata_recv;
+ grpc_metadata_array trailing_metadata_recv;
+ grpc_metadata_array request_metadata_recv;
+ grpc_call_details call_details;
+ grpc_slice request_payload_slice = grpc_slice_from_static_string("foo");
+ grpc_slice response_payload_slice = grpc_slice_from_static_string("bar");
+ grpc_byte_buffer* request_payload =
+ grpc_raw_byte_buffer_create(&request_payload_slice, 1);
+ grpc_byte_buffer* response_payload =
+ grpc_raw_byte_buffer_create(&response_payload_slice, 1);
+ grpc_byte_buffer* request_payload_recv = nullptr;
+ grpc_byte_buffer* response_payload_recv = nullptr;
+ grpc_status_code status;
+ grpc_call_error error;
+ grpc_slice details;
+
+ grpc_arg args[] = {
+ grpc_channel_arg_integer_create(
+ const_cast<char*>(GRPC_ARG_EXPERIMENTAL_ENABLE_HEDGING), 1),
+ grpc_channel_arg_string_create(
+ const_cast<char*>(GRPC_ARG_SERVICE_CONFIG),
+ const_cast<char*>(
+ "{\n"
+ " \"methodConfig\": [ {\n"
+ " \"name\": [\n"
+ " { \"service\": \"service\", \"method\": \"method\" }\n"
+ " ],\n"
+ " \"retryPolicy\": {\n"
+ " \"maxAttempts\": 2,\n"
+ " \"initialBackoff\": \"1s\",\n"
+ " \"maxBackoff\": \"120s\",\n"
+ " \"backoffMultiplier\": 1.6,\n"
+ " \"perAttemptRecvTimeout\": \"2s\",\n"
+ " \"retryableStatusCodes\": [ \"ABORTED\" ]\n"
+ " }\n"
+ " } ]\n"
+ "}")),
+ };
+ grpc_channel_args client_args = {GPR_ARRAY_SIZE(args), args};
+ grpc_end2end_test_fixture f =
+ begin_test(config, "retry", &client_args, nullptr);
+
+ cq_verifier* cqv = cq_verifier_create(f.cq);
+
+ gpr_timespec deadline = n_seconds_from_now(10);
+ c = grpc_channel_create_call(f.client, nullptr, GRPC_PROPAGATE_DEFAULTS, f.cq,
+ grpc_slice_from_static_string("/service/method"),
+ nullptr, deadline, nullptr);
+ GPR_ASSERT(c);
+
+ grpc_metadata_array_init(&initial_metadata_recv);
+ grpc_metadata_array_init(&trailing_metadata_recv);
+ grpc_metadata_array_init(&request_metadata_recv);
+ grpc_call_details_init(&call_details);
+
+ memset(ops, 0, sizeof(ops));
+ op = ops;
+ op->op = GRPC_OP_SEND_INITIAL_METADATA;
+ op->data.send_initial_metadata.count = 0;
+ op++;
+ op->op = GRPC_OP_SEND_MESSAGE;
+ op->data.send_message.send_message = request_payload;
+ op++;
+ op->op = GRPC_OP_RECV_MESSAGE;
+ op->data.recv_message.recv_message = &response_payload_recv;
+ op++;
+ op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
+ op++;
+ op->op = GRPC_OP_RECV_INITIAL_METADATA;
+ op->data.recv_initial_metadata.recv_initial_metadata = &initial_metadata_recv;
+ op++;
+ op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
+ op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv;
+ op->data.recv_status_on_client.status = &status;
+ op->data.recv_status_on_client.status_details = &details;
+ op++;
+ error = grpc_call_start_batch(c, ops, static_cast<size_t>(op - ops), tag(1),
+ nullptr);
+ GPR_ASSERT(GRPC_CALL_OK == error);
+
+ // Server gets a call but does not respond to the call.
+ error =
+ grpc_server_request_call(f.server, &s0, &call_details,
+ &request_metadata_recv, f.cq, f.cq, tag(101));
+ GPR_ASSERT(GRPC_CALL_OK == error);
+ CQ_EXPECT_COMPLETION(cqv, tag(101), true);
+ cq_verify(cqv);
+
+ // Make sure the "grpc-previous-rpc-attempts" header was not sent in the
+ // initial attempt.
+ for (size_t i = 0; i < request_metadata_recv.count; ++i) {
+ GPR_ASSERT(!grpc_slice_eq(request_metadata_recv.metadata[i].key,
+ GRPC_MDSTR_GRPC_PREVIOUS_RPC_ATTEMPTS));
+ }
+
+ grpc_metadata_array_destroy(&request_metadata_recv);
+ grpc_metadata_array_init(&request_metadata_recv);
+ grpc_call_details_destroy(&call_details);
+ grpc_call_details_init(&call_details);
+
+ // Server gets a second call, which it also does not respond to.
+ error =
+ grpc_server_request_call(f.server, &s, &call_details,
+ &request_metadata_recv, f.cq, f.cq, tag(201));
+ GPR_ASSERT(GRPC_CALL_OK == error);
+ CQ_EXPECT_COMPLETION(cqv, tag(201), true);
+ cq_verify(cqv);
+
+ // Now we can unref the first call.
+ grpc_call_unref(s0);
+
+ // Make sure the "grpc-previous-rpc-attempts" header was sent in the retry.
+ bool found_retry_header = false;
+ for (size_t i = 0; i < request_metadata_recv.count; ++i) {
+ if (grpc_slice_eq(request_metadata_recv.metadata[i].key,
+ GRPC_MDSTR_GRPC_PREVIOUS_RPC_ATTEMPTS)) {
+ GPR_ASSERT(
+ grpc_slice_eq(request_metadata_recv.metadata[i].value, GRPC_MDSTR_1));
+ found_retry_header = true;
+ break;
+ }
+ }
+ GPR_ASSERT(found_retry_header);
+
+ // Client sees call completion.
+ CQ_EXPECT_COMPLETION(cqv, tag(1), true);
+ cq_verify(cqv);
+
+ GPR_ASSERT(status == GRPC_STATUS_CANCELLED);
+ GPR_ASSERT(
+ 0 == grpc_slice_str_cmp(details, "retry perAttemptRecvTimeout exceeded"));
+ GPR_ASSERT(0 == grpc_slice_str_cmp(call_details.method, "/service/method"));
+ GPR_ASSERT(0 == call_details.flags);
+
+ grpc_slice_unref(details);
+ grpc_metadata_array_destroy(&initial_metadata_recv);
+ grpc_metadata_array_destroy(&trailing_metadata_recv);
+ grpc_metadata_array_destroy(&request_metadata_recv);
+ grpc_call_details_destroy(&call_details);
+ grpc_byte_buffer_destroy(request_payload);
+ grpc_byte_buffer_destroy(response_payload);
+ grpc_byte_buffer_destroy(request_payload_recv);
+ grpc_byte_buffer_destroy(response_payload_recv);
+
+ grpc_call_unref(c);
+ grpc_call_unref(s);
+
+ cq_verifier_destroy(cqv);
+
+ end_test(&f);
+ config.tear_down_data(&f);
+}
+
+void retry_per_attempt_recv_timeout_on_last_attempt(
+ grpc_end2end_test_config config) {
+ GPR_ASSERT(config.feature_mask & FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL);
+ test_retry_per_attempt_recv_timeout_on_last_attempt(config);
+}
+
+void retry_per_attempt_recv_timeout_on_last_attempt_pre_init(void) {}
diff --git a/test/core/end2end/tests/retry_recv_initial_metadata.cc b/test/core/end2end/tests/retry_recv_initial_metadata.cc
index ac13110709..b58b33dbc0 100644
--- a/test/core/end2end/tests/retry_recv_initial_metadata.cc
+++ b/test/core/end2end/tests/retry_recv_initial_metadata.cc
@@ -119,10 +119,12 @@ static void test_retry_recv_initial_metadata(grpc_end2end_test_config config) {
grpc_slice details;
int was_cancelled = 2;
char* peer;
+ grpc_metadata initial_metadata_from_server = {
+ grpc_slice_from_static_string("key1"),
+ grpc_slice_from_static_string("val1"),
+ {{nullptr, nullptr, nullptr, nullptr}}};
grpc_arg args[] = {
- grpc_channel_arg_integer_create(
- const_cast<char*>(GRPC_ARG_ENABLE_RETRIES), 1),
grpc_channel_arg_string_create(
const_cast<char*>(GRPC_ARG_SERVICE_CONFIG),
const_cast<char*>(
@@ -207,10 +209,16 @@ static void test_retry_recv_initial_metadata(grpc_end2end_test_config config) {
// Server sends initial metadata in its own batch, before sending
// trailing metadata.
+ // Ideally, this would not require actually sending any metadata
+ // entries, but we do so to avoid sporadic failures in the proxy
+ // tests, where the proxy may wind up combining the batches, depending
+ // on timing. Sending a metadata entry ensures that the transport
+ // won't send a Trailers-Only response, even if the batches are combined.
memset(ops, 0, sizeof(ops));
op = ops;
op->op = GRPC_OP_SEND_INITIAL_METADATA;
- op->data.send_initial_metadata.count = 0;
+ op->data.send_initial_metadata.count = 1;
+ op->data.send_initial_metadata.metadata = &initial_metadata_from_server;
op++;
error = grpc_call_start_batch(s, ops, static_cast<size_t>(op - ops), tag(102),
nullptr);
diff --git a/test/core/end2end/tests/retry_recv_message.cc b/test/core/end2end/tests/retry_recv_message.cc
index 24a33e231f..a6fb07cd6d 100644
--- a/test/core/end2end/tests/retry_recv_message.cc
+++ b/test/core/end2end/tests/retry_recv_message.cc
@@ -121,8 +121,6 @@ static void test_retry_recv_message(grpc_end2end_test_config config) {
char* peer;
grpc_arg args[] = {
- grpc_channel_arg_integer_create(
- const_cast<char*>(GRPC_ARG_ENABLE_RETRIES), 1),
grpc_channel_arg_string_create(
const_cast<char*>(GRPC_ARG_SERVICE_CONFIG),
const_cast<char*>(
diff --git a/test/core/end2end/tests/retry_recv_trailing_metadata_error.cc b/test/core/end2end/tests/retry_recv_trailing_metadata_error.cc
index 584bcd2516..c91c7c83d6 100644
--- a/test/core/end2end/tests/retry_recv_trailing_metadata_error.cc
+++ b/test/core/end2end/tests/retry_recv_trailing_metadata_error.cc
@@ -125,8 +125,6 @@ static void test_retry_recv_trailing_metadata_error(
char* peer;
grpc_arg args[] = {
- grpc_channel_arg_integer_create(
- const_cast<char*>(GRPC_ARG_ENABLE_RETRIES), 1),
grpc_channel_arg_string_create(
const_cast<char*>(GRPC_ARG_SERVICE_CONFIG),
const_cast<char*>(
diff --git a/test/core/end2end/tests/retry_send_initial_metadata_refs.cc b/test/core/end2end/tests/retry_send_initial_metadata_refs.cc
new file mode 100644
index 0000000000..08a3691a07
--- /dev/null
+++ b/test/core/end2end/tests/retry_send_initial_metadata_refs.cc
@@ -0,0 +1,359 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * 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.
+ *
+ */
+
+#include "test/core/end2end/end2end_tests.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#include <grpc/byte_buffer.h>
+#include <grpc/grpc.h>
+#include <grpc/support/alloc.h>
+#include <grpc/support/log.h>
+#include <grpc/support/string_util.h>
+#include <grpc/support/time.h>
+
+#include "src/core/lib/channel/channel_args.h"
+#include "src/core/lib/gpr/string.h"
+#include "src/core/lib/gpr/useful.h"
+#include "src/core/lib/iomgr/exec_ctx.h"
+#include "src/core/lib/transport/static_metadata.h"
+
+#include "test/core/end2end/cq_verifier.h"
+#include "test/core/end2end/tests/cancel_test_helpers.h"
+
+static void* tag(intptr_t t) { return reinterpret_cast<void*>(t); }
+
+static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
+ const char* test_name,
+ grpc_channel_args* client_args,
+ grpc_channel_args* server_args) {
+ grpc_end2end_test_fixture f;
+ gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
+ f = config.create_fixture(client_args, server_args);
+ config.init_server(&f, server_args);
+ config.init_client(&f, client_args);
+ return f;
+}
+
+static gpr_timespec n_seconds_from_now(int n) {
+ return grpc_timeout_seconds_to_deadline(n);
+}
+
+static gpr_timespec five_seconds_from_now(void) {
+ return n_seconds_from_now(5);
+}
+
+static void drain_cq(grpc_completion_queue* cq) {
+ grpc_event ev;
+ do {
+ ev = grpc_completion_queue_next(cq, five_seconds_from_now(), nullptr);
+ } while (ev.type != GRPC_QUEUE_SHUTDOWN);
+}
+
+static void shutdown_server(grpc_end2end_test_fixture* f) {
+ if (!f->server) return;
+ grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
+ GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
+ grpc_timeout_seconds_to_deadline(5),
+ nullptr)
+ .type == GRPC_OP_COMPLETE);
+ grpc_server_destroy(f->server);
+ f->server = nullptr;
+}
+
+static void shutdown_client(grpc_end2end_test_fixture* f) {
+ if (!f->client) return;
+ grpc_channel_destroy(f->client);
+ f->client = nullptr;
+}
+
+static void end_test(grpc_end2end_test_fixture* f) {
+ shutdown_server(f);
+ shutdown_client(f);
+
+ grpc_completion_queue_shutdown(f->cq);
+ drain_cq(f->cq);
+ grpc_completion_queue_destroy(f->cq);
+ grpc_completion_queue_destroy(f->shutdown_cq);
+}
+
+// Tests that we hold refs to send_initial_metadata payload while
+// cached, even after the caller has released its refs:
+// - 2 retries allowed for ABORTED status
+// - first attempt returns ABORTED
+// - second attempt returns OK
+static void test_retry_send_initial_metadata_refs(
+ grpc_end2end_test_config config) {
+ grpc_call* c;
+ grpc_call* s;
+ grpc_op ops[6];
+ grpc_op* op;
+ grpc_metadata_array client_send_initial_metadata;
+ grpc_metadata_array initial_metadata_recv;
+ grpc_metadata_array trailing_metadata_recv;
+ grpc_metadata_array request_metadata_recv;
+ grpc_call_details call_details;
+ grpc_slice request_payload_slice = grpc_slice_from_static_string("foo");
+ grpc_slice response_payload_slice = grpc_slice_from_static_string("bar");
+ grpc_byte_buffer* request_payload =
+ grpc_raw_byte_buffer_create(&request_payload_slice, 1);
+ grpc_byte_buffer* response_payload =
+ grpc_raw_byte_buffer_create(&response_payload_slice, 1);
+ grpc_byte_buffer* request_payload_recv = nullptr;
+ grpc_byte_buffer* response_payload_recv = nullptr;
+ grpc_status_code status;
+ grpc_call_error error;
+ grpc_slice details;
+ int was_cancelled = 2;
+ char* peer;
+
+ grpc_arg args[] = {
+ grpc_channel_arg_string_create(
+ const_cast<char*>(GRPC_ARG_SERVICE_CONFIG),
+ const_cast<char*>(
+ "{\n"
+ " \"methodConfig\": [ {\n"
+ " \"name\": [\n"
+ " { \"service\": \"service\", \"method\": \"method\" }\n"
+ " ],\n"
+ " \"retryPolicy\": {\n"
+ " \"maxAttempts\": 3,\n"
+ " \"initialBackoff\": \"1s\",\n"
+ " \"maxBackoff\": \"120s\",\n"
+ " \"backoffMultiplier\": 1.6,\n"
+ " \"retryableStatusCodes\": [ \"ABORTED\" ]\n"
+ " }\n"
+ " } ]\n"
+ "}")),
+ };
+ grpc_channel_args client_args = {GPR_ARRAY_SIZE(args), args};
+ grpc_end2end_test_fixture f = begin_test(
+ config, "retry_send_initial_metadata_refs", &client_args, nullptr);
+
+ cq_verifier* cqv = cq_verifier_create(f.cq);
+
+ gpr_timespec deadline = five_seconds_from_now();
+ c = grpc_channel_create_call(f.client, nullptr, GRPC_PROPAGATE_DEFAULTS, f.cq,
+ grpc_slice_from_static_string("/service/method"),
+ nullptr, deadline, nullptr);
+ GPR_ASSERT(c);
+
+ peer = grpc_call_get_peer(c);
+ GPR_ASSERT(peer != nullptr);
+ gpr_log(GPR_DEBUG, "client_peer_before_call=%s", peer);
+ gpr_free(peer);
+
+ grpc_metadata_array_init(&client_send_initial_metadata);
+ client_send_initial_metadata.count = 2;
+ client_send_initial_metadata.metadata = static_cast<grpc_metadata*>(
+ gpr_malloc(client_send_initial_metadata.count * sizeof(grpc_metadata)));
+ // First element is short enough for slices to be inlined.
+ client_send_initial_metadata.metadata[0].key =
+ grpc_slice_from_copied_string(std::string("foo").c_str());
+ client_send_initial_metadata.metadata[0].value =
+ grpc_slice_from_copied_string(std::string("bar").c_str());
+ // Second element requires slice allocation.
+ client_send_initial_metadata.metadata[1].key = grpc_slice_from_copied_string(
+ std::string(GRPC_SLICE_INLINED_SIZE + 1, 'x').c_str());
+ client_send_initial_metadata.metadata[1].value =
+ grpc_slice_from_copied_string(
+ std::string(GRPC_SLICE_INLINED_SIZE + 1, 'y').c_str());
+
+ grpc_metadata_array_init(&initial_metadata_recv);
+ grpc_metadata_array_init(&trailing_metadata_recv);
+ grpc_metadata_array_init(&request_metadata_recv);
+ grpc_call_details_init(&call_details);
+ grpc_slice status_details = grpc_slice_from_static_string("xyz");
+
+ memset(ops, 0, sizeof(ops));
+ op = ops;
+ op->op = GRPC_OP_SEND_INITIAL_METADATA;
+ op->data.send_initial_metadata.count = client_send_initial_metadata.count;
+ op->data.send_initial_metadata.metadata =
+ client_send_initial_metadata.metadata;
+ op++;
+ op->op = GRPC_OP_SEND_MESSAGE;
+ op->data.send_message.send_message = request_payload;
+ op++;
+ op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
+ op++;
+ error = grpc_call_start_batch(c, ops, static_cast<size_t>(op - ops), tag(1),
+ nullptr);
+ GPR_ASSERT(GRPC_CALL_OK == error);
+ CQ_EXPECT_COMPLETION(cqv, tag(1), true);
+ cq_verify(cqv);
+
+ for (size_t i = 0; i < client_send_initial_metadata.count; ++i) {
+ grpc_slice_unref(client_send_initial_metadata.metadata[i].key);
+ grpc_slice_unref(client_send_initial_metadata.metadata[i].value);
+ }
+ grpc_metadata_array_destroy(&client_send_initial_metadata);
+
+ memset(ops, 0, sizeof(ops));
+ op = ops;
+ op->op = GRPC_OP_RECV_MESSAGE;
+ op->data.recv_message.recv_message = &response_payload_recv;
+ op++;
+ op->op = GRPC_OP_RECV_INITIAL_METADATA;
+ op->data.recv_initial_metadata.recv_initial_metadata = &initial_metadata_recv;
+ op++;
+ op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
+ op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv;
+ op->data.recv_status_on_client.status = &status;
+ op->data.recv_status_on_client.status_details = &details;
+ op++;
+ error = grpc_call_start_batch(c, ops, static_cast<size_t>(op - ops), tag(2),
+ nullptr);
+ GPR_ASSERT(GRPC_CALL_OK == error);
+
+ error =
+ grpc_server_request_call(f.server, &s, &call_details,
+ &request_metadata_recv, f.cq, f.cq, tag(101));
+ GPR_ASSERT(GRPC_CALL_OK == error);
+ CQ_EXPECT_COMPLETION(cqv, tag(101), true);
+ cq_verify(cqv);
+
+ // Make sure the "grpc-previous-rpc-attempts" header was not sent in the
+ // initial attempt.
+ for (size_t i = 0; i < request_metadata_recv.count; ++i) {
+ GPR_ASSERT(!grpc_slice_eq(request_metadata_recv.metadata[i].key,
+ GRPC_MDSTR_GRPC_PREVIOUS_RPC_ATTEMPTS));
+ }
+
+ peer = grpc_call_get_peer(s);
+ GPR_ASSERT(peer != nullptr);
+ gpr_log(GPR_DEBUG, "server_peer=%s", peer);
+ gpr_free(peer);
+ peer = grpc_call_get_peer(c);
+ GPR_ASSERT(peer != nullptr);
+ gpr_log(GPR_DEBUG, "client_peer=%s", peer);
+ gpr_free(peer);
+
+ memset(ops, 0, sizeof(ops));
+ op = ops;
+ op->op = GRPC_OP_SEND_INITIAL_METADATA;
+ op->data.send_initial_metadata.count = 0;
+ op++;
+ op->op = GRPC_OP_SEND_STATUS_FROM_SERVER;
+ op->data.send_status_from_server.trailing_metadata_count = 0;
+ op->data.send_status_from_server.status = GRPC_STATUS_ABORTED;
+ op->data.send_status_from_server.status_details = &status_details;
+ op++;
+ op->op = GRPC_OP_RECV_CLOSE_ON_SERVER;
+ op->data.recv_close_on_server.cancelled = &was_cancelled;
+ op++;
+ error = grpc_call_start_batch(s, ops, static_cast<size_t>(op - ops), tag(102),
+ nullptr);
+ GPR_ASSERT(GRPC_CALL_OK == error);
+
+ CQ_EXPECT_COMPLETION(cqv, tag(102), true);
+ cq_verify(cqv);
+
+ grpc_call_unref(s);
+ grpc_metadata_array_destroy(&request_metadata_recv);
+ grpc_metadata_array_init(&request_metadata_recv);
+ grpc_call_details_destroy(&call_details);
+ grpc_call_details_init(&call_details);
+
+ error =
+ grpc_server_request_call(f.server, &s, &call_details,
+ &request_metadata_recv, f.cq, f.cq, tag(201));
+ GPR_ASSERT(GRPC_CALL_OK == error);
+ CQ_EXPECT_COMPLETION(cqv, tag(201), true);
+ cq_verify(cqv);
+
+ // Make sure the "grpc-previous-rpc-attempts" header was sent in the retry.
+ GPR_ASSERT(contains_metadata_slices(&request_metadata_recv,
+ GRPC_MDSTR_GRPC_PREVIOUS_RPC_ATTEMPTS,
+ GRPC_MDSTR_1));
+ // It should also contain the initial metadata, even though the client
+ // freed it already.
+ GPR_ASSERT(contains_metadata(&request_metadata_recv, "foo", "bar"));
+ GPR_ASSERT(
+ contains_metadata(&request_metadata_recv,
+ std::string(GRPC_SLICE_INLINED_SIZE + 1, 'x').c_str(),
+ std::string(GRPC_SLICE_INLINED_SIZE + 1, 'y').c_str()));
+
+ peer = grpc_call_get_peer(s);
+ GPR_ASSERT(peer != nullptr);
+ gpr_log(GPR_DEBUG, "server_peer=%s", peer);
+ gpr_free(peer);
+ peer = grpc_call_get_peer(c);
+ GPR_ASSERT(peer != nullptr);
+ gpr_log(GPR_DEBUG, "client_peer=%s", peer);
+ gpr_free(peer);
+
+ memset(ops, 0, sizeof(ops));
+ op = ops;
+ op->op = GRPC_OP_SEND_INITIAL_METADATA;
+ op->data.send_initial_metadata.count = 0;
+ op++;
+ op->op = GRPC_OP_RECV_MESSAGE;
+ op->data.recv_message.recv_message = &request_payload_recv;
+ op++;
+ op->op = GRPC_OP_SEND_MESSAGE;
+ op->data.send_message.send_message = response_payload;
+ op++;
+ op->op = GRPC_OP_SEND_STATUS_FROM_SERVER;
+ op->data.send_status_from_server.trailing_metadata_count = 0;
+ op->data.send_status_from_server.status = GRPC_STATUS_OK;
+ op->data.send_status_from_server.status_details = &status_details;
+ op++;
+ op->op = GRPC_OP_RECV_CLOSE_ON_SERVER;
+ op->data.recv_close_on_server.cancelled = &was_cancelled;
+ op++;
+ error = grpc_call_start_batch(s, ops, static_cast<size_t>(op - ops), tag(202),
+ nullptr);
+ GPR_ASSERT(GRPC_CALL_OK == error);
+
+ CQ_EXPECT_COMPLETION(cqv, tag(202), true);
+ CQ_EXPECT_COMPLETION(cqv, tag(2), true);
+ cq_verify(cqv);
+
+ GPR_ASSERT(status == GRPC_STATUS_OK);
+ GPR_ASSERT(0 == grpc_slice_str_cmp(details, "xyz"));
+ GPR_ASSERT(0 == grpc_slice_str_cmp(call_details.method, "/service/method"));
+ GPR_ASSERT(0 == call_details.flags);
+ GPR_ASSERT(was_cancelled == 0);
+
+ grpc_slice_unref(details);
+ grpc_metadata_array_destroy(&initial_metadata_recv);
+ grpc_metadata_array_destroy(&trailing_metadata_recv);
+ grpc_metadata_array_destroy(&request_metadata_recv);
+ grpc_call_details_destroy(&call_details);
+ grpc_byte_buffer_destroy(request_payload);
+ grpc_byte_buffer_destroy(response_payload);
+ grpc_byte_buffer_destroy(request_payload_recv);
+ grpc_byte_buffer_destroy(response_payload_recv);
+
+ grpc_call_unref(c);
+ grpc_call_unref(s);
+
+ cq_verifier_destroy(cqv);
+
+ end_test(&f);
+ config.tear_down_data(&f);
+}
+
+void retry_send_initial_metadata_refs(grpc_end2end_test_config config) {
+ GPR_ASSERT(config.feature_mask & FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL);
+ test_retry_send_initial_metadata_refs(config);
+}
+
+void retry_send_initial_metadata_refs_pre_init(void) {}
diff --git a/test/core/end2end/tests/retry_send_op_fails.cc b/test/core/end2end/tests/retry_send_op_fails.cc
index 8f70e8c0fe..61e6743e21 100644
--- a/test/core/end2end/tests/retry_send_op_fails.cc
+++ b/test/core/end2end/tests/retry_send_op_fails.cc
@@ -127,8 +127,6 @@ static void test_retry_send_op_fails(grpc_end2end_test_config config) {
char* peer;
grpc_arg args[] = {
- grpc_channel_arg_integer_create(
- const_cast<char*>(GRPC_ARG_ENABLE_RETRIES), 1),
grpc_channel_arg_string_create(
const_cast<char*>(GRPC_ARG_SERVICE_CONFIG),
const_cast<char*>(
diff --git a/test/core/end2end/tests/retry_server_pushback_delay.cc b/test/core/end2end/tests/retry_server_pushback_delay.cc
index 4990c6fe1f..c7d25dacc0 100644
--- a/test/core/end2end/tests/retry_server_pushback_delay.cc
+++ b/test/core/end2end/tests/retry_server_pushback_delay.cc
@@ -126,8 +126,6 @@ static void test_retry_server_pushback_delay(grpc_end2end_test_config config) {
pushback_md.value = grpc_slice_from_static_string("2000");
grpc_arg args[] = {
- grpc_channel_arg_integer_create(
- const_cast<char*>(GRPC_ARG_ENABLE_RETRIES), 1),
grpc_channel_arg_string_create(
const_cast<char*>(GRPC_ARG_SERVICE_CONFIG),
const_cast<char*>(
diff --git a/test/core/end2end/tests/retry_server_pushback_disabled.cc b/test/core/end2end/tests/retry_server_pushback_disabled.cc
index 75744d33cd..580f75aa41 100644
--- a/test/core/end2end/tests/retry_server_pushback_disabled.cc
+++ b/test/core/end2end/tests/retry_server_pushback_disabled.cc
@@ -127,8 +127,6 @@ static void test_retry_server_pushback_disabled(
pushback_md.value = grpc_slice_from_static_string("-1");
grpc_arg args[] = {
- grpc_channel_arg_integer_create(
- const_cast<char*>(GRPC_ARG_ENABLE_RETRIES), 1),
grpc_channel_arg_string_create(
const_cast<char*>(GRPC_ARG_SERVICE_CONFIG),
const_cast<char*>(
diff --git a/test/core/end2end/tests/retry_streaming.cc b/test/core/end2end/tests/retry_streaming.cc
index 3d2e9dc654..25219102b8 100644
--- a/test/core/end2end/tests/retry_streaming.cc
+++ b/test/core/end2end/tests/retry_streaming.cc
@@ -138,8 +138,6 @@ static void test_retry_streaming(grpc_end2end_test_config config) {
grpc_arg args[] = {
grpc_channel_arg_integer_create(
- const_cast<char*>(GRPC_ARG_ENABLE_RETRIES), 1),
- grpc_channel_arg_integer_create(
const_cast<char*>(GRPC_ARG_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE),
1024 * 8),
grpc_channel_arg_integer_create(
diff --git a/test/core/end2end/tests/retry_streaming_after_commit.cc b/test/core/end2end/tests/retry_streaming_after_commit.cc
index a3ea534ea3..4fc3aaa26d 100644
--- a/test/core/end2end/tests/retry_streaming_after_commit.cc
+++ b/test/core/end2end/tests/retry_streaming_after_commit.cc
@@ -127,8 +127,6 @@ static void test_retry_streaming_after_commit(grpc_end2end_test_config config) {
char* peer;
grpc_arg args[] = {
- grpc_channel_arg_integer_create(
- const_cast<char*>(GRPC_ARG_ENABLE_RETRIES), 1),
grpc_channel_arg_string_create(
const_cast<char*>(GRPC_ARG_SERVICE_CONFIG),
const_cast<char*>(
diff --git a/test/core/end2end/tests/retry_streaming_succeeds_before_replay_finished.cc b/test/core/end2end/tests/retry_streaming_succeeds_before_replay_finished.cc
index aee927c43e..f3e90d3a5b 100644
--- a/test/core/end2end/tests/retry_streaming_succeeds_before_replay_finished.cc
+++ b/test/core/end2end/tests/retry_streaming_succeeds_before_replay_finished.cc
@@ -128,8 +128,6 @@ static void test_retry_streaming_succeeds_before_replay_finished(
char* peer;
grpc_arg args[] = {
- grpc_channel_arg_integer_create(
- const_cast<char*>(GRPC_ARG_ENABLE_RETRIES), 1),
grpc_channel_arg_string_create(
const_cast<char*>(GRPC_ARG_SERVICE_CONFIG),
const_cast<char*>(
diff --git a/test/core/end2end/tests/retry_throttled.cc b/test/core/end2end/tests/retry_throttled.cc
index 91c60fa6a4..1ff6ddaf6c 100644
--- a/test/core/end2end/tests/retry_throttled.cc
+++ b/test/core/end2end/tests/retry_throttled.cc
@@ -120,8 +120,6 @@ static void test_retry_throttled(grpc_end2end_test_config config) {
char* peer;
grpc_arg args[] = {
- grpc_channel_arg_integer_create(
- const_cast<char*>(GRPC_ARG_ENABLE_RETRIES), 1),
grpc_channel_arg_string_create(
const_cast<char*>(GRPC_ARG_SERVICE_CONFIG),
const_cast<char*>(
diff --git a/test/core/end2end/tests/retry_too_many_attempts.cc b/test/core/end2end/tests/retry_too_many_attempts.cc
index bdb1a67a8e..15ec44f698 100644
--- a/test/core/end2end/tests/retry_too_many_attempts.cc
+++ b/test/core/end2end/tests/retry_too_many_attempts.cc
@@ -121,8 +121,6 @@ static void test_retry_too_many_attempts(grpc_end2end_test_config config) {
char* peer;
grpc_arg args[] = {
- grpc_channel_arg_integer_create(
- const_cast<char*>(GRPC_ARG_ENABLE_RETRIES), 1),
grpc_channel_arg_string_create(
const_cast<char*>(GRPC_ARG_SERVICE_CONFIG),
const_cast<char*>(
diff --git a/test/core/end2end/tests/simple_cacheable_request.cc b/test/core/end2end/tests/simple_cacheable_request.cc
index 25a09a765f..8817da10d4 100644
--- a/test/core/end2end/tests/simple_cacheable_request.cc
+++ b/test/core/end2end/tests/simple_cacheable_request.cc
@@ -100,19 +100,15 @@ static void test_cacheable_request_response_with_metadata_and_payload(
grpc_raw_byte_buffer_create(&response_payload_slice, 1);
grpc_metadata meta_c[2] = {{grpc_slice_from_static_string("key1"),
grpc_slice_from_static_string("val1"),
- 0,
{{nullptr, nullptr, nullptr, nullptr}}},
{grpc_slice_from_static_string("key2"),
grpc_slice_from_static_string("val2"),
- 0,
{{nullptr, nullptr, nullptr, nullptr}}}};
grpc_metadata meta_s[2] = {{grpc_slice_from_static_string("key3"),
grpc_slice_from_static_string("val3"),
- 0,
{{nullptr, nullptr, nullptr, nullptr}}},
{grpc_slice_from_static_string("key4"),
grpc_slice_from_static_string("val4"),
- 0,
{{nullptr, nullptr, nullptr, nullptr}}}};
grpc_end2end_test_fixture f = begin_test(
config, "test_cacheable_request_response_with_metadata_and_payload",
diff --git a/test/core/end2end/tests/simple_metadata.cc b/test/core/end2end/tests/simple_metadata.cc
index 9e1a18b7af..e56ed5377b 100644
--- a/test/core/end2end/tests/simple_metadata.cc
+++ b/test/core/end2end/tests/simple_metadata.cc
@@ -98,19 +98,15 @@ static void test_request_response_with_metadata_and_payload(
grpc_raw_byte_buffer_create(&response_payload_slice, 1);
grpc_metadata meta_c[2] = {{grpc_slice_from_static_string("key1"),
grpc_slice_from_static_string("val1"),
- 0,
{{nullptr, nullptr, nullptr, nullptr}}},
{grpc_slice_from_static_string("key2"),
grpc_slice_from_static_string("val2"),
- 0,
{{nullptr, nullptr, nullptr, nullptr}}}};
grpc_metadata meta_s[2] = {{grpc_slice_from_static_string("key3"),
grpc_slice_from_static_string("val3"),
- 0,
{{nullptr, nullptr, nullptr, nullptr}}},
{grpc_slice_from_static_string("key4"),
grpc_slice_from_static_string("val4"),
- 0,
{{nullptr, nullptr, nullptr, nullptr}}}};
grpc_end2end_test_fixture f =
begin_test(config, "test_request_response_with_metadata_and_payload",
diff --git a/test/core/end2end/tests/trailing_metadata.cc b/test/core/end2end/tests/trailing_metadata.cc
index 1201729909..a674bb7462 100644
--- a/test/core/end2end/tests/trailing_metadata.cc
+++ b/test/core/end2end/tests/trailing_metadata.cc
@@ -98,27 +98,21 @@ static void test_request_response_with_metadata_and_payload(
grpc_raw_byte_buffer_create(&response_payload_slice, 1);
grpc_metadata meta_c[2] = {{grpc_slice_from_static_string("key1"),
grpc_slice_from_static_string("val1"),
- 0,
{{nullptr, nullptr, nullptr, nullptr}}},
{grpc_slice_from_static_string("key2"),
grpc_slice_from_static_string("val2"),
- 0,
{{nullptr, nullptr, nullptr, nullptr}}}};
grpc_metadata meta_s[2] = {{grpc_slice_from_static_string("key3"),
grpc_slice_from_static_string("val3"),
- 0,
{{nullptr, nullptr, nullptr, nullptr}}},
{grpc_slice_from_static_string("key4"),
grpc_slice_from_static_string("val4"),
- 0,
{{nullptr, nullptr, nullptr, nullptr}}}};
grpc_metadata meta_t[2] = {{grpc_slice_from_static_string("key5"),
grpc_slice_from_static_string("val5"),
- 0,
{{nullptr, nullptr, nullptr, nullptr}}},
{grpc_slice_from_static_string("key6"),
grpc_slice_from_static_string("val6"),
- 0,
{{nullptr, nullptr, nullptr, nullptr}}}};
grpc_end2end_test_fixture f =
begin_test(config, "test_request_response_with_metadata_and_payload",
diff --git a/test/core/gprpp/BUILD b/test/core/gprpp/BUILD
index caa6f5da24..7408a17199 100644
--- a/test/core/gprpp/BUILD
+++ b/test/core/gprpp/BUILD
@@ -90,6 +90,57 @@ grpc_cc_test(
)
grpc_cc_test(
+ name = "bitset_test",
+ srcs = ["bitset_test.cc"],
+ external_deps = ["gtest"],
+ language = "C++",
+ uses_polling = False,
+ deps = [
+ "//:bitset",
+ "//test/core/util:grpc_suppressions",
+ ],
+)
+
+grpc_cc_test(
+ name = "match_test",
+ srcs = ["match_test.cc"],
+ external_deps = ["gtest"],
+ language = "C++",
+ uses_polling = False,
+ deps = [
+ "//:match",
+ "//test/core/util:grpc_suppressions",
+ ],
+)
+
+grpc_cc_test(
+ name = "overload_test",
+ srcs = ["overload_test.cc"],
+ external_deps = ["gtest"],
+ language = "C++",
+ uses_polling = False,
+ deps = [
+ "//:overload",
+ "//test/core/util:grpc_suppressions",
+ ],
+)
+
+grpc_cc_test(
+ name = "table_test",
+ srcs = ["table_test.cc"],
+ external_deps = [
+ "gtest",
+ "absl/types:optional",
+ ],
+ language = "C++",
+ uses_polling = False,
+ deps = [
+ "//:table",
+ "//test/core/util:grpc_suppressions",
+ ],
+)
+
+grpc_cc_test(
name = "host_port_test",
srcs = ["host_port_test.cc"],
language = "C++",
diff --git a/test/core/gprpp/bitset_test.cc b/test/core/gprpp/bitset_test.cc
new file mode 100644
index 0000000000..bbd0a70ae1
--- /dev/null
+++ b/test/core/gprpp/bitset_test.cc
@@ -0,0 +1,82 @@
+// Copyright 2021 gRPC authors.
+//
+// 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.
+
+#include "src/core/lib/gprpp/bitset.h"
+#include <gtest/gtest.h>
+
+namespace grpc_core {
+namespace testing {
+
+// Stand in type to make the size to test a type
+template <std::size_t K>
+struct Size {
+ static constexpr std::size_t kBits = K;
+};
+
+using TestSizes = ::testing::Types<
+ // All sizes up to 17 bits
+ Size<1>, Size<2>, Size<3>, Size<4>, Size<5>, Size<6>, Size<7>, Size<8>,
+ Size<9>, Size<10>, Size<11>, Size<12>, Size<13>, Size<14>, Size<15>,
+ Size<16>, Size<17>,
+ // Values around 32 bits
+ Size<24>, Size<25>, Size<26>, Size<27>, Size<28>, Size<29>, Size<30>,
+ Size<31>, Size<32>, Size<33>,
+ // Values around 48 bits
+ Size<47>, Size<48>, Size<49>,
+ // Values around 64 bits
+ Size<62>, Size<63>, Size<64>, Size<65>, Size<66>,
+ // Values around 96 bits
+ Size<95>, Size<96>, Size<97>,
+ // Silly numbers of bits
+ Size<1024>, Size<4000>, Size<4321> >;
+
+template <typename S>
+struct BitSetTest : public ::testing::Test {};
+
+TYPED_TEST_SUITE(BitSetTest, TestSizes);
+
+TYPED_TEST(BitSetTest, NoneAtInit) {
+ BitSet<TypeParam::kBits> b;
+ EXPECT_TRUE(b.none());
+}
+
+TYPED_TEST(BitSetTest, OneBit) {
+ constexpr std::size_t kBits = TypeParam::kBits;
+ for (std::size_t i = 0; i < kBits; i++) {
+ BitSet<kBits> b;
+ b.set(i);
+ EXPECT_FALSE(b.none());
+ for (std::size_t j = 0; j < kBits; j++) {
+ EXPECT_EQ(b.is_set(j), i == j);
+ }
+ }
+}
+
+TYPED_TEST(BitSetTest, AllSet) {
+ constexpr std::size_t kBits = TypeParam::kBits;
+ BitSet<kBits> b;
+ for (std::size_t i = 0; i < kBits; i++) {
+ EXPECT_FALSE(b.all());
+ b.set(i);
+ }
+ EXPECT_TRUE(b.all());
+}
+
+} // namespace testing
+} // namespace grpc_core
+
+int main(int argc, char** argv) {
+ ::testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}
diff --git a/test/core/gprpp/match_test.cc b/test/core/gprpp/match_test.cc
new file mode 100644
index 0000000000..a3b9cd7c48
--- /dev/null
+++ b/test/core/gprpp/match_test.cc
@@ -0,0 +1,75 @@
+// Copyright 2021 gRPC authors.
+//
+// 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.
+
+#include "src/core/lib/gprpp/match.h"
+#include <gtest/gtest.h>
+
+namespace grpc_core {
+namespace testing {
+
+TEST(MatchTest, Test) {
+ EXPECT_EQ(Match(
+ absl::variant<int, double>(1.9), [](int) -> int { abort(); },
+ [](double x) -> int {
+ EXPECT_EQ(x, 1.9);
+ return 42;
+ }),
+ 42);
+ EXPECT_EQ(Match(
+ absl::variant<int, double>(3),
+ [](int x) -> int {
+ EXPECT_EQ(x, 3);
+ return 42;
+ },
+ [](double) -> int { abort(); }),
+ 42);
+}
+
+TEST(MatchTest, TestVoidReturn) {
+ bool triggered = false;
+ Match(
+ absl::variant<int, double>(1.9), [](int) { abort(); },
+ [&triggered](double x) {
+ EXPECT_EQ(x, 1.9);
+ triggered = true;
+ });
+ EXPECT_TRUE(triggered);
+}
+
+TEST(MatchTest, TestMutable) {
+ absl::variant<int, double> v = 1.9;
+ MatchMutable(
+ &v, [](int*) { abort(); }, [](double* x) { *x = 0.0; });
+ EXPECT_EQ(v, (absl::variant<int, double>(0.0)));
+}
+
+TEST(MatchTest, TestMutableWithReturn) {
+ absl::variant<int, double> v = 1.9;
+ EXPECT_EQ(MatchMutable(
+ &v, [](int*) -> int { abort(); },
+ [](double* x) -> int {
+ *x = 0.0;
+ return 1;
+ }),
+ 1);
+ EXPECT_EQ(v, (absl::variant<int, double>(0.0)));
+}
+
+} // namespace testing
+} // namespace grpc_core
+
+int main(int argc, char** argv) {
+ ::testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}
diff --git a/test/core/gprpp/overload_test.cc b/test/core/gprpp/overload_test.cc
new file mode 100644
index 0000000000..1e7f346b7b
--- /dev/null
+++ b/test/core/gprpp/overload_test.cc
@@ -0,0 +1,36 @@
+// Copyright 2021 gRPC authors.
+//
+// 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.
+
+#include "src/core/lib/gprpp/overload.h"
+#include <gtest/gtest.h>
+
+namespace grpc_core {
+namespace testing {
+
+TEST(Overload, Test) {
+ auto a = [](int x) { return x; };
+ auto b = [](std::string x) -> int { return x.length(); };
+ auto overload = Overload(a, b);
+ EXPECT_EQ(overload(1), 1);
+ EXPECT_EQ(overload("1"), 1);
+ EXPECT_EQ(overload("abc"), 3);
+}
+
+} // namespace testing
+} // namespace grpc_core
+
+int main(int argc, char** argv) {
+ ::testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}
diff --git a/test/core/gprpp/table_test.cc b/test/core/gprpp/table_test.cc
new file mode 100644
index 0000000000..0f3957bb13
--- /dev/null
+++ b/test/core/gprpp/table_test.cc
@@ -0,0 +1,151 @@
+// Copyright 2021 gRPC authors.
+//
+// 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.
+
+#include "src/core/lib/gprpp/table.h"
+#include <gtest/gtest.h>
+#include <string>
+#include <tuple>
+#include "absl/types/optional.h"
+
+namespace grpc_core {
+namespace testing {
+
+TEST(Table, NoOp) {
+ Table<int, double, std::string> t;
+ EXPECT_EQ(t.get<int>(), nullptr);
+ EXPECT_EQ(t.get<double>(), nullptr);
+ EXPECT_EQ(t.get<std::string>(), nullptr);
+ EXPECT_EQ(t.get<0>(), nullptr);
+ EXPECT_EQ(t.get<1>(), nullptr);
+ EXPECT_EQ(t.get<2>(), nullptr);
+}
+
+TEST(Table, SetTheThings) {
+ Table<int, double, std::string> t;
+ t.set<int>(3);
+ t.set<double>(2.9);
+ t.set<std::string>("Hello world!");
+ EXPECT_EQ(*t.get<int>(), 3);
+ EXPECT_EQ(*t.get<double>(), 2.9);
+ EXPECT_EQ(*t.get<std::string>(), "Hello world!");
+ EXPECT_EQ(*t.get<0>(), 3);
+ EXPECT_EQ(*t.get<1>(), 2.9);
+ EXPECT_EQ(*t.get<2>(), "Hello world!");
+}
+
+TEST(Table, GetDefault) {
+ Table<int, double, std::string> t;
+ EXPECT_EQ(*t.get_or_create<std::string>(), "");
+ EXPECT_EQ(*t.get_or_create<double>(), 0.0);
+ EXPECT_EQ(*t.get_or_create<int>(), 0);
+}
+
+TEST(Table, GetDefaultIndexed) {
+ Table<int, double, std::string> t;
+ EXPECT_EQ(*t.get_or_create<2>(), "");
+ EXPECT_EQ(*t.get_or_create<1>(), 0.0);
+ EXPECT_EQ(*t.get_or_create<0>(), 0);
+}
+
+TEST(Table, Copy) {
+ Table<int, std::string> t;
+ t.set<std::string>("abcdefghijklmnopqrstuvwxyz");
+ EXPECT_EQ(*t.get<std::string>(), "abcdefghijklmnopqrstuvwxyz");
+ EXPECT_EQ(t.get<int>(), nullptr);
+ Table<int, std::string> u(t);
+ EXPECT_EQ(*u.get<std::string>(), "abcdefghijklmnopqrstuvwxyz");
+ EXPECT_EQ(*t.get<std::string>(), "abcdefghijklmnopqrstuvwxyz");
+ EXPECT_EQ(t.get<int>(), nullptr);
+ EXPECT_EQ(u.get<int>(), nullptr);
+ u.set<std::string>("hello");
+ EXPECT_EQ(*u.get<1>(), "hello");
+ EXPECT_EQ(*t.get<1>(), "abcdefghijklmnopqrstuvwxyz");
+ t = u;
+ EXPECT_EQ(*u.get<std::string>(), "hello");
+ EXPECT_EQ(*t.get<std::string>(), "hello");
+}
+
+TEST(Table, Move) {
+ Table<int, std::string> t;
+ t.set<std::string>("abcdefghijklmnopqrstuvwxyz");
+ EXPECT_EQ(*t.get<std::string>(), "abcdefghijklmnopqrstuvwxyz");
+ EXPECT_EQ(t.get<int>(), nullptr);
+ Table<int, std::string> u(std::move(t));
+ EXPECT_NE(t.get<std::string>(), nullptr); // NOLINT(bugprone-use-after-move)
+ EXPECT_EQ(*u.get<std::string>(), "abcdefghijklmnopqrstuvwxyz");
+ EXPECT_EQ(t.get<int>(), nullptr);
+ EXPECT_EQ(u.get<int>(), nullptr);
+ u.set<std::string>("hello");
+ EXPECT_EQ(*u.get<1>(), "hello");
+ t = std::move(u);
+ EXPECT_NE(u.get<std::string>(), nullptr); // NOLINT(bugprone-use-after-move)
+ EXPECT_EQ(*t.get<std::string>(), "hello");
+}
+
+TEST(Table, SameTypes) {
+ Table<std::string, std::string, std::string> t;
+ // The following lines should not compile:
+ // t.get<std::string>();
+ // t.has<4>();
+ // t.get<4>();
+ // t.clear<4>();
+ EXPECT_EQ(t.get<0>(), nullptr);
+ EXPECT_EQ(t.get<1>(), nullptr);
+ EXPECT_EQ(t.get<2>(), nullptr);
+ t.set<1>("Hello!");
+ EXPECT_EQ(t.get<0>(), nullptr);
+ EXPECT_EQ(*t.get<1>(), "Hello!");
+ EXPECT_EQ(t.get<2>(), nullptr);
+}
+
+#if !defined(_MSC_VER)
+// Test suite proving this is memory efficient compared to
+// tuple<optional<Ts>...>
+// TODO(ctiller): determine why this test doesn't compile under MSVC.
+// For now whether it passes or not in that one environment is probably
+// immaterial.
+
+template <typename T>
+struct TableSizeTest : public ::testing::Test {};
+
+using SizeTests = ::testing::Types<
+ std::tuple<char>, std::tuple<char, char>, std::tuple<char, char, char>,
+ std::tuple<int>, std::tuple<std::string>,
+ std::tuple<int, int, int, int, int, int, int, int, int, int>>;
+
+TYPED_TEST_SUITE(TableSizeTest, SizeTests);
+
+template <typename... Ts>
+int sizeof_tuple_of_optionals(std::tuple<Ts...>*) {
+ return sizeof(std::tuple<absl::optional<Ts>...>);
+}
+
+template <typename... Ts>
+int sizeof_table(std::tuple<Ts...>*) {
+ return sizeof(Table<Ts...>);
+}
+
+TYPED_TEST(TableSizeTest, SmallerThanTupleOfOptionals) {
+ EXPECT_GE(sizeof_tuple_of_optionals(static_cast<TypeParam*>(nullptr)),
+ sizeof_table(static_cast<TypeParam*>(nullptr)));
+}
+#endif
+
+} // namespace testing
+} // namespace grpc_core
+
+int main(int argc, char** argv) {
+ ::testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}
diff --git a/test/core/handshake/client_ssl.cc b/test/core/handshake/client_ssl.cc
index 8ec239ab23..78413cc463 100644
--- a/test/core/handshake/client_ssl.cc
+++ b/test/core/handshake/client_ssl.cc
@@ -63,13 +63,15 @@ class SslLibraryInfo {
void Await() {
grpc_core::MutexLock lock(&mu_);
- grpc_core::WaitUntil(&cv_, &mu_, [this] { return ready_; });
+ while (!ready_) {
+ cv_.Wait(&mu_);
+ }
}
private:
grpc_core::Mutex mu_;
grpc_core::CondVar cv_;
- bool ready_ = false;
+ bool ready_ ABSL_GUARDED_BY(mu_) = false;
};
// Arguments for TLS server thread.
diff --git a/test/core/handshake/server_ssl_common.cc b/test/core/handshake/server_ssl_common.cc
index 026a52c69e..ce410520f3 100644
--- a/test/core/handshake/server_ssl_common.cc
+++ b/test/core/handshake/server_ssl_common.cc
@@ -86,14 +86,16 @@ class ServerInfo {
void Await() {
grpc_core::MutexLock lock(&mu_);
- grpc_core::WaitUntil(&cv_, &mu_, [this] { return ready_; });
+ while (!ready_) {
+ cv_.Wait(&mu_);
+ }
}
private:
const int port_;
grpc_core::Mutex mu_;
grpc_core::CondVar cv_;
- bool ready_ = false;
+ bool ready_ ABSL_GUARDED_BY(mu_) = false;
};
// Simple gRPC server. This listens until client_handshake_complete occurs.
diff --git a/test/core/http/test_server.py b/test/core/http/test_server.py
index 87f0a958d4..c3a867e676 100755
--- a/test/core/http/test_server.py
+++ b/test/core/http/test_server.py
@@ -15,11 +15,12 @@
"""Server for httpcli_test"""
import argparse
-import BaseHTTPServer
import os
import ssl
import sys
+import BaseHTTPServer
+
_PEM = os.path.abspath(
os.path.join(os.path.dirname(sys.argv[0]), '../../..',
'src/core/tsi/test_creds/server1.pem'))
diff --git a/test/core/iomgr/tcp_client_posix_test.cc b/test/core/iomgr/tcp_client_posix_test.cc
index 4e21292c51..247753e145 100644
--- a/test/core/iomgr/tcp_client_posix_test.cc
+++ b/test/core/iomgr/tcp_client_posix_test.cc
@@ -170,7 +170,7 @@ void test_fails(void) {
break;
case GRPC_TIMERS_NOT_CHECKED:
polling_deadline = 0;
- // fallthrough
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_TIMERS_CHECKED_AND_EMPTY:
GPR_ASSERT(GRPC_LOG_IF_ERROR(
"pollset_work",
diff --git a/test/core/iomgr/tcp_client_uv_test.cc b/test/core/iomgr/tcp_client_uv_test.cc
index 6b73833319..d6e3a5ef26 100644
--- a/test/core/iomgr/tcp_client_uv_test.cc
+++ b/test/core/iomgr/tcp_client_uv_test.cc
@@ -166,7 +166,7 @@ void test_fails(void) {
break;
case GRPC_TIMERS_NOT_CHECKED:
polling_deadline = grpc_timespec_to_millis_round_up(now);
- // fallthrough
+ ABSL_FALLTHROUGH_INTENDED;
case GRPC_TIMERS_CHECKED_AND_EMPTY:
GPR_ASSERT(GRPC_LOG_IF_ERROR(
"pollset_work",
diff --git a/test/core/security/grpc_tls_certificate_provider_test.cc b/test/core/security/grpc_tls_certificate_provider_test.cc
index 9d67556955..fe65c60de7 100644
--- a/test/core/security/grpc_tls_certificate_provider_test.cc
+++ b/test/core/security/grpc_tls_certificate_provider_test.cc
@@ -495,8 +495,55 @@ TEST_F(GrpcTlsCertificateProviderTest,
CancelWatch(watcher_state_1);
}
-} // namespace testing
+TEST_F(GrpcTlsCertificateProviderTest, FailedKeyCertMatchOnEmptyPrivateKey) {
+ absl::StatusOr<bool> status =
+ PrivateKeyAndCertificateMatch(/*private_key=*/"", cert_chain_);
+ EXPECT_FALSE(status.ok());
+ EXPECT_EQ(status.status().code(), absl::StatusCode::kInvalidArgument);
+ EXPECT_EQ(status.status().message(), "Private key string is empty.");
+}
+
+TEST_F(GrpcTlsCertificateProviderTest, FailedKeyCertMatchOnEmptyCertificate) {
+ absl::StatusOr<bool> status =
+ PrivateKeyAndCertificateMatch(private_key_2_, /*cert_chain=*/"");
+ EXPECT_FALSE(status.ok());
+ EXPECT_EQ(status.status().code(), absl::StatusCode::kInvalidArgument);
+ EXPECT_EQ(status.status().message(), "Certificate string is empty.");
+}
+
+TEST_F(GrpcTlsCertificateProviderTest, FailedKeyCertMatchOnInvalidCertFormat) {
+ absl::StatusOr<bool> status =
+ PrivateKeyAndCertificateMatch(private_key_2_, "invalid_certificate");
+ EXPECT_FALSE(status.ok());
+ EXPECT_EQ(status.status().code(), absl::StatusCode::kInvalidArgument);
+ EXPECT_EQ(status.status().message(),
+ "Conversion from PEM string to X509 failed.");
+}
+
+TEST_F(GrpcTlsCertificateProviderTest,
+ FailedKeyCertMatchOnInvalidPrivateKeyFormat) {
+ absl::StatusOr<bool> status =
+ PrivateKeyAndCertificateMatch("invalid_private_key", cert_chain_2_);
+ EXPECT_EQ(status.status().code(), absl::StatusCode::kInvalidArgument);
+ EXPECT_EQ(status.status().message(),
+ "Conversion from PEM string to EVP_PKEY failed.");
+}
+
+TEST_F(GrpcTlsCertificateProviderTest, SuccessfulKeyCertMatch) {
+ absl::StatusOr<bool> status =
+ PrivateKeyAndCertificateMatch(private_key_2_, cert_chain_2_);
+ EXPECT_TRUE(status.ok());
+ EXPECT_TRUE(*status);
+}
+TEST_F(GrpcTlsCertificateProviderTest, FailedKeyCertMatchOnInvalidPair) {
+ absl::StatusOr<bool> status =
+ PrivateKeyAndCertificateMatch(private_key_2_, cert_chain_);
+ EXPECT_TRUE(status.ok());
+ EXPECT_FALSE(*status);
+}
+
+} // namespace testing
} // namespace grpc_core
int main(int argc, char** argv) {
diff --git a/test/core/security/matchers_test.cc b/test/core/security/matchers_test.cc
index 0bacd167e9..d569b09f44 100644
--- a/test/core/security/matchers_test.cc
+++ b/test/core/security/matchers_test.cc
@@ -91,8 +91,7 @@ TEST(StringMatcherTest, InvalidRegex) {
TEST(StringMatcherTest, SafeRegexMatchCaseSensitive) {
auto string_matcher = StringMatcher::Create(StringMatcher::Type::kSafeRegex,
- /*matcher=*/"regex.*",
- /*case_sensitive=*/true);
+ /*matcher=*/"regex.*");
ASSERT_TRUE(string_matcher.ok());
EXPECT_TRUE(string_matcher->Match("regex-test"));
EXPECT_FALSE(string_matcher->Match("xx-regex-test"));
@@ -100,17 +99,6 @@ TEST(StringMatcherTest, SafeRegexMatchCaseSensitive) {
EXPECT_FALSE(string_matcher->Match("test-regex"));
}
-TEST(StringMatcherTest, SafeRegexMatchCaseInSensitive) {
- auto string_matcher = StringMatcher::Create(StringMatcher::Type::kSafeRegex,
- /*matcher=*/"regex.*",
- /*case_sensitive=*/false);
- ASSERT_TRUE(string_matcher.ok());
- EXPECT_TRUE(string_matcher->Match("regex-test"));
- EXPECT_TRUE(string_matcher->Match("Regex-test"));
- EXPECT_FALSE(string_matcher->Match("xx-Regex-test"));
- EXPECT_FALSE(string_matcher->Match("test-regex"));
-}
-
TEST(StringMatcherTest, ContainsMatchCaseSensitive) {
auto string_matcher = StringMatcher::Create(StringMatcher::Type::kContains,
/*matcher=*/"contains",
diff --git a/test/core/transport/binder/BUILD b/test/core/transport/binder/BUILD
new file mode 100644
index 0000000000..7478fb6358
--- /dev/null
+++ b/test/core/transport/binder/BUILD
@@ -0,0 +1,34 @@
+# Copyright 2021 gRPC authors.
+#
+# 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.
+
+load("//bazel:grpc_build_system.bzl", "grpc_cc_test", "grpc_package")
+
+licenses(["notice"])
+
+grpc_package(name = "test/core/transport/binder")
+
+grpc_cc_test(
+ name = "binder_smoke_test",
+ srcs = ["binder_smoke_test.cc"],
+ external_deps = [
+ "gtest",
+ ],
+ language = "C++",
+ uses_polling = False,
+ deps = [
+ "//:gpr",
+ "//:grpc",
+ "//test/core/util:grpc_test_util",
+ ],
+)
diff --git a/test/core/transport/binder/binder_smoke_test.cc b/test/core/transport/binder/binder_smoke_test.cc
new file mode 100644
index 0000000000..565d6765f3
--- /dev/null
+++ b/test/core/transport/binder/binder_smoke_test.cc
@@ -0,0 +1,38 @@
+//
+// Copyright 2021 gRPC authors.
+//
+// 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.
+//
+
+#include <grpc/grpc.h>
+#include <grpc/support/log.h>
+#include <gtest/gtest.h>
+
+#include "test/core/util/test_config.h"
+
+namespace grpc_core {
+namespace testing {
+namespace {
+TEST(SmokeTest, Empty) { gpr_log(GPR_INFO, __func__); }
+} // namespace
+} // namespace testing
+} // namespace grpc_core
+
+int main(int argc, char** argv) {
+ ::testing::InitGoogleTest(&argc, argv);
+ grpc::testing::TestEnvironment env(argc, argv);
+ grpc_init();
+ int ret = RUN_ALL_TESTS();
+ grpc_shutdown();
+ return ret;
+}
diff --git a/test/core/transport/chttp2/hpack_parser_fuzzer_test.cc b/test/core/transport/chttp2/hpack_parser_fuzzer_test.cc
index e86cdef98f..7be46ab6cb 100644
--- a/test/core/transport/chttp2/hpack_parser_fuzzer_test.cc
+++ b/test/core/transport/chttp2/hpack_parser_fuzzer_test.cc
@@ -30,7 +30,7 @@
bool squelch = true;
bool leak_check = true;
-static grpc_error_handle onhdr(void* /*ud*/, grpc_mdelem md) {
+static grpc_error_handle onhdr(grpc_mdelem md) {
GRPC_MDELEM_UNREF(md);
return GRPC_ERROR_NONE;
}
@@ -40,14 +40,12 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
grpc_test_only_set_slice_hash_seed(0);
if (squelch) gpr_set_log_function(dont_log);
grpc_init();
- grpc_chttp2_hpack_parser parser;
{
grpc_core::ExecCtx exec_ctx;
- grpc_chttp2_hpack_parser_init(&parser);
- parser.on_header = onhdr;
- GRPC_ERROR_UNREF(grpc_chttp2_hpack_parser_parse(
- &parser, grpc_slice_from_static_buffer(data, size)));
- grpc_chttp2_hpack_parser_destroy(&parser);
+ grpc_core::HPackParser parser;
+ parser.BeginFrame(onhdr, grpc_core::HPackParser::Boundary::None,
+ grpc_core::HPackParser::Priority::None);
+ GRPC_ERROR_UNREF(parser.Parse(grpc_slice_from_static_buffer(data, size)));
}
grpc_shutdown();
return 0;
diff --git a/test/core/transport/chttp2/hpack_parser_test.cc b/test/core/transport/chttp2/hpack_parser_test.cc
index bc48881530..1328366f1b 100644
--- a/test/core/transport/chttp2/hpack_parser_test.cc
+++ b/test/core/transport/chttp2/hpack_parser_test.cc
@@ -30,44 +30,42 @@
#include "test/core/util/slice_splitter.h"
#include "test/core/util/test_config.h"
-typedef struct {
- va_list args;
-} test_checker;
-
-static grpc_error_handle onhdr(void* ud, grpc_mdelem md) {
- const char *ekey, *evalue;
- test_checker* chk = static_cast<test_checker*>(ud);
- ekey = va_arg(chk->args, char*);
- GPR_ASSERT(ekey);
- evalue = va_arg(chk->args, char*);
- GPR_ASSERT(evalue);
- GPR_ASSERT(grpc_slice_str_cmp(GRPC_MDKEY(md), ekey) == 0);
- GPR_ASSERT(grpc_slice_str_cmp(GRPC_MDVALUE(md), evalue) == 0);
- GRPC_MDELEM_UNREF(md);
- return GRPC_ERROR_NONE;
-}
+using MDVec = std::vector<std::pair<const char*, const char*>>;
+
+struct TestChecker {
+ MDVec* expect;
+
+ explicit TestChecker(MDVec* expect) : expect(expect) {}
+
+ grpc_error_handle operator()(grpc_mdelem md) {
+ GPR_ASSERT(!expect->empty());
+ auto e = expect->begin();
+ GPR_ASSERT(grpc_slice_str_cmp(GRPC_MDKEY(md), e->first) == 0);
+ GPR_ASSERT(grpc_slice_str_cmp(GRPC_MDVALUE(md), e->second) == 0);
+ GRPC_MDELEM_UNREF(md);
+ expect->erase(e);
+ return GRPC_ERROR_NONE;
+ }
+};
-static void test_vector(grpc_chttp2_hpack_parser* parser,
+static void test_vector(grpc_core::HPackParser* parser,
grpc_slice_split_mode mode, const char* hexstring,
- ... /* char *key, char *value */) {
+ MDVec expect) {
grpc_slice input = parse_hexstring(hexstring);
grpc_slice* slices;
size_t nslices;
size_t i;
- test_checker chk;
-
- va_start(chk.args, hexstring);
- parser->on_header = onhdr;
- parser->on_header_user_data = &chk;
+ parser->BeginFrame(TestChecker(&expect),
+ grpc_core::HPackParser::Boundary::None,
+ grpc_core::HPackParser::Priority::None);
grpc_split_slices(mode, &input, 1, &slices, &nslices);
grpc_slice_unref(input);
for (i = 0; i < nslices; i++) {
grpc_core::ExecCtx exec_ctx;
- GPR_ASSERT(grpc_chttp2_hpack_parser_parse(parser, slices[i]) ==
- GRPC_ERROR_NONE);
+ GPR_ASSERT(parser->Parse(slices[i]) == GRPC_ERROR_NONE);
}
for (i = 0; i < nslices; i++) {
@@ -75,141 +73,167 @@ static void test_vector(grpc_chttp2_hpack_parser* parser,
}
gpr_free(slices);
- GPR_ASSERT(nullptr == va_arg(chk.args, char*));
-
- va_end(chk.args);
+ GPR_ASSERT(expect.empty());
}
static void test_vectors(grpc_slice_split_mode mode) {
- grpc_chttp2_hpack_parser parser;
grpc_core::ExecCtx exec_ctx;
- grpc_chttp2_hpack_parser_init(&parser);
- /* D.2.1 */
- test_vector(&parser, mode,
- "400a 6375 7374 6f6d 2d6b 6579 0d63 7573"
- "746f 6d2d 6865 6164 6572",
- "custom-key", "custom-header", NULL);
- /* D.2.2 */
- test_vector(&parser, mode, "040c 2f73 616d 706c 652f 7061 7468", ":path",
- "/sample/path", NULL);
- /* D.2.3 */
- test_vector(&parser, mode,
- "1008 7061 7373 776f 7264 0673 6563 7265"
- "74",
- "password", "secret", NULL);
- /* D.2.4 */
- test_vector(&parser, mode, "82", ":method", "GET", NULL);
- grpc_chttp2_hpack_parser_destroy(&parser);
-
- grpc_chttp2_hpack_parser_init(&parser);
- new (&parser.table) grpc_chttp2_hptbl();
- /* D.3.1 */
- test_vector(&parser, mode,
- "8286 8441 0f77 7777 2e65 7861 6d70 6c65"
- "2e63 6f6d",
- ":method", "GET", ":scheme", "http", ":path", "/", ":authority",
- "www.example.com", NULL);
- /* D.3.2 */
- test_vector(&parser, mode, "8286 84be 5808 6e6f 2d63 6163 6865", ":method",
- "GET", ":scheme", "http", ":path", "/", ":authority",
- "www.example.com", "cache-control", "no-cache", NULL);
- /* D.3.3 */
- test_vector(&parser, mode,
- "8287 85bf 400a 6375 7374 6f6d 2d6b 6579"
- "0c63 7573 746f 6d2d 7661 6c75 65",
- ":method", "GET", ":scheme", "https", ":path", "/index.html",
- ":authority", "www.example.com", "custom-key", "custom-value",
- NULL);
- grpc_chttp2_hpack_parser_destroy(&parser);
-
- grpc_chttp2_hpack_parser_init(&parser);
- new (&parser.table) grpc_chttp2_hptbl();
- /* D.4.1 */
- test_vector(&parser, mode,
- "8286 8441 8cf1 e3c2 e5f2 3a6b a0ab 90f4"
- "ff",
- ":method", "GET", ":scheme", "http", ":path", "/", ":authority",
- "www.example.com", NULL);
- /* D.4.2 */
- test_vector(&parser, mode, "8286 84be 5886 a8eb 1064 9cbf", ":method", "GET",
- ":scheme", "http", ":path", "/", ":authority", "www.example.com",
- "cache-control", "no-cache", NULL);
- /* D.4.3 */
- test_vector(&parser, mode,
- "8287 85bf 4088 25a8 49e9 5ba9 7d7f 8925"
- "a849 e95b b8e8 b4bf",
- ":method", "GET", ":scheme", "https", ":path", "/index.html",
- ":authority", "www.example.com", "custom-key", "custom-value",
- NULL);
- grpc_chttp2_hpack_parser_destroy(&parser);
-
- grpc_chttp2_hpack_parser_init(&parser);
- new (&parser.table) grpc_chttp2_hptbl();
- grpc_chttp2_hptbl_set_max_bytes(&parser.table, 256);
- grpc_chttp2_hptbl_set_current_table_size(&parser.table, 256);
- /* D.5.1 */
- test_vector(&parser, mode,
- "4803 3330 3258 0770 7269 7661 7465 611d"
- "4d6f 6e2c 2032 3120 4f63 7420 3230 3133"
- "2032 303a 3133 3a32 3120 474d 546e 1768"
- "7474 7073 3a2f 2f77 7777 2e65 7861 6d70"
- "6c65 2e63 6f6d",
- ":status", "302", "cache-control", "private", "date",
- "Mon, 21 Oct 2013 20:13:21 GMT", "location",
- "https://www.example.com", NULL);
- /* D.5.2 */
- test_vector(&parser, mode, "4803 3330 37c1 c0bf", ":status", "307",
- "cache-control", "private", "date",
- "Mon, 21 Oct 2013 20:13:21 GMT", "location",
- "https://www.example.com", NULL);
- /* D.5.3 */
- test_vector(&parser, mode,
- "88c1 611d 4d6f 6e2c 2032 3120 4f63 7420"
- "3230 3133 2032 303a 3133 3a32 3220 474d"
- "54c0 5a04 677a 6970 7738 666f 6f3d 4153"
- "444a 4b48 514b 425a 584f 5157 454f 5049"
- "5541 5851 5745 4f49 553b 206d 6178 2d61"
- "6765 3d33 3630 303b 2076 6572 7369 6f6e"
- "3d31",
- ":status", "200", "cache-control", "private", "date",
- "Mon, 21 Oct 2013 20:13:22 GMT", "location",
- "https://www.example.com", "content-encoding", "gzip",
- "set-cookie",
- "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1", NULL);
- grpc_chttp2_hpack_parser_destroy(&parser);
-
- grpc_chttp2_hpack_parser_init(&parser);
- new (&parser.table) grpc_chttp2_hptbl();
- grpc_chttp2_hptbl_set_max_bytes(&parser.table, 256);
- grpc_chttp2_hptbl_set_current_table_size(&parser.table, 256);
- /* D.6.1 */
- test_vector(&parser, mode,
- "4882 6402 5885 aec3 771a 4b61 96d0 7abe"
- "9410 54d4 44a8 2005 9504 0b81 66e0 82a6"
- "2d1b ff6e 919d 29ad 1718 63c7 8f0b 97c8"
- "e9ae 82ae 43d3",
- ":status", "302", "cache-control", "private", "date",
- "Mon, 21 Oct 2013 20:13:21 GMT", "location",
- "https://www.example.com", NULL);
- /* D.6.2 */
- test_vector(&parser, mode, "4883 640e ffc1 c0bf", ":status", "307",
- "cache-control", "private", "date",
- "Mon, 21 Oct 2013 20:13:21 GMT", "location",
- "https://www.example.com", NULL);
- /* D.6.3 */
- test_vector(&parser, mode,
- "88c1 6196 d07a be94 1054 d444 a820 0595"
- "040b 8166 e084 a62d 1bff c05a 839b d9ab"
- "77ad 94e7 821d d7f2 e6c7 b335 dfdf cd5b"
- "3960 d5af 2708 7f36 72c1 ab27 0fb5 291f"
- "9587 3160 65c0 03ed 4ee5 b106 3d50 07",
- ":status", "200", "cache-control", "private", "date",
- "Mon, 21 Oct 2013 20:13:22 GMT", "location",
- "https://www.example.com", "content-encoding", "gzip",
- "set-cookie",
- "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1", NULL);
- grpc_chttp2_hpack_parser_destroy(&parser);
+ {
+ grpc_core::HPackParser parser;
+ /* D.2.1 */
+ test_vector(&parser, mode,
+ "400a 6375 7374 6f6d 2d6b 6579 0d63 7573"
+ "746f 6d2d 6865 6164 6572",
+ {std::make_pair("custom-key", "custom-header")});
+ /* D.2.2 */
+ test_vector(&parser, mode, "040c 2f73 616d 706c 652f 7061 7468",
+ {std::make_pair(":path", "/sample/path")});
+ /* D.2.3 */
+ test_vector(&parser, mode,
+ "1008 7061 7373 776f 7264 0673 6563 7265"
+ "74",
+ {std::make_pair("password", "secret")});
+ /* D.2.4 */
+ test_vector(&parser, mode, "82", {std::make_pair(":method", "GET")});
+ }
+
+ {
+ grpc_core::HPackParser parser;
+ /* D.3.1 */
+ test_vector(
+ &parser, mode,
+ "8286 8441 0f77 7777 2e65 7861 6d70 6c65"
+ "2e63 6f6d",
+ {std::make_pair(":method", "GET"), std::make_pair(":scheme", "http"),
+ std::make_pair(":path", "/"),
+ std::make_pair(":authority", "www.example.com")});
+ /* D.3.2 */
+ test_vector(
+ &parser, mode, "8286 84be 5808 6e6f 2d63 6163 6865",
+ {std::make_pair(":method", "GET"), std::make_pair(":scheme", "http"),
+ std::make_pair(":path", "/"),
+ std::make_pair(":authority", "www.example.com"),
+ std::make_pair("cache-control", "no-cache")});
+ /* D.3.3 */
+ test_vector(&parser, mode,
+ "8287 85bf 400a 6375 7374 6f6d 2d6b 6579"
+ "0c63 7573 746f 6d2d 7661 6c75 65",
+ {
+ std::make_pair(":method", "GET"),
+ std::make_pair(":scheme", "https"),
+ std::make_pair(":path", "/index.html"),
+ std::make_pair(":authority", "www.example.com"),
+ std::make_pair("custom-key", "custom-value"),
+ });
+ }
+
+ {
+ grpc_core::HPackParser parser;
+ /* D.4.1 */
+ test_vector(
+ &parser, mode,
+ "8286 8441 8cf1 e3c2 e5f2 3a6b a0ab 90f4"
+ "ff",
+ {std::make_pair(":method", "GET"), std::make_pair(":scheme", "http"),
+ std::make_pair(":path", "/"),
+ std::make_pair(":authority", "www.example.com")});
+ /* D.4.2 */
+ test_vector(
+ &parser, mode, "8286 84be 5886 a8eb 1064 9cbf",
+ {std::make_pair(":method", "GET"), std::make_pair(":scheme", "http"),
+ std::make_pair(":path", "/"),
+ std::make_pair(":authority", "www.example.com"),
+ std::make_pair("cache-control", "no-cache")});
+ /* D.4.3 */
+ test_vector(
+ &parser, mode,
+ "8287 85bf 4088 25a8 49e9 5ba9 7d7f 8925"
+ "a849 e95b b8e8 b4bf",
+ {std::make_pair(":method", "GET"), std::make_pair(":scheme", "https"),
+ std::make_pair(":path", "/index.html"),
+ std::make_pair(":authority", "www.example.com"),
+ std::make_pair("custom-key", "custom-value")});
+ }
+
+ {
+ grpc_core::HPackParser parser;
+ grpc_chttp2_hptbl_set_max_bytes(parser.hpack_table(), 256);
+ grpc_chttp2_hptbl_set_current_table_size(parser.hpack_table(), 256);
+ /* D.5.1 */
+ test_vector(&parser, mode,
+ "4803 3330 3258 0770 7269 7661 7465 611d"
+ "4d6f 6e2c 2032 3120 4f63 7420 3230 3133"
+ "2032 303a 3133 3a32 3120 474d 546e 1768"
+ "7474 7073 3a2f 2f77 7777 2e65 7861 6d70"
+ "6c65 2e63 6f6d",
+ {std::make_pair(":status", "302"),
+ std::make_pair("cache-control", "private"),
+ std::make_pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"),
+ std::make_pair("location", "https://www.example.com")});
+ /* D.5.2 */
+ test_vector(&parser, mode, "4803 3330 37c1 c0bf",
+ {std::make_pair(":status", "307"),
+ std::make_pair("cache-control", "private"),
+ std::make_pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"),
+ std::make_pair("location", "https://www.example.com")});
+ /* D.5.3 */
+ test_vector(
+ &parser, mode,
+ "88c1 611d 4d6f 6e2c 2032 3120 4f63 7420"
+ "3230 3133 2032 303a 3133 3a32 3220 474d"
+ "54c0 5a04 677a 6970 7738 666f 6f3d 4153"
+ "444a 4b48 514b 425a 584f 5157 454f 5049"
+ "5541 5851 5745 4f49 553b 206d 6178 2d61"
+ "6765 3d33 3630 303b 2076 6572 7369 6f6e"
+ "3d31",
+ {std::make_pair(":status", "200"),
+ std::make_pair("cache-control", "private"),
+ std::make_pair("date", "Mon, 21 Oct 2013 20:13:22 GMT"),
+ std::make_pair("location", "https://www.example.com"),
+ std::make_pair("content-encoding", "gzip"),
+ std::make_pair(
+ "set-cookie",
+ "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1")});
+ }
+
+ {
+ grpc_core::HPackParser parser;
+ grpc_chttp2_hptbl_set_max_bytes(parser.hpack_table(), 256);
+ grpc_chttp2_hptbl_set_current_table_size(parser.hpack_table(), 256);
+ /* D.6.1 */
+ test_vector(&parser, mode,
+ "4882 6402 5885 aec3 771a 4b61 96d0 7abe"
+ "9410 54d4 44a8 2005 9504 0b81 66e0 82a6"
+ "2d1b ff6e 919d 29ad 1718 63c7 8f0b 97c8"
+ "e9ae 82ae 43d3",
+ {std::make_pair(":status", "302"),
+ std::make_pair("cache-control", "private"),
+ std::make_pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"),
+ std::make_pair("location", "https://www.example.com")});
+ /* D.6.2 */
+ test_vector(&parser, mode, "4883 640e ffc1 c0bf",
+ {std::make_pair(":status", "307"),
+ std::make_pair("cache-control", "private"),
+ std::make_pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"),
+ std::make_pair("location", "https://www.example.com")});
+ /* D.6.3 */
+ test_vector(
+ &parser, mode,
+ "88c1 6196 d07a be94 1054 d444 a820 0595"
+ "040b 8166 e084 a62d 1bff c05a 839b d9ab"
+ "77ad 94e7 821d d7f2 e6c7 b335 dfdf cd5b"
+ "3960 d5af 2708 7f36 72c1 ab27 0fb5 291f"
+ "9587 3160 65c0 03ed 4ee5 b106 3d50 07",
+ {std::make_pair(":status", "200"),
+ std::make_pair("cache-control", "private"),
+ std::make_pair("date", "Mon, 21 Oct 2013 20:13:22 GMT"),
+ std::make_pair("location", "https://www.example.com"),
+ std::make_pair("content-encoding", "gzip"),
+ std::make_pair(
+ "set-cookie",
+ "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1")});
+ }
}
int main(int argc, char** argv) {
diff --git a/test/core/util/BUILD b/test/core/util/BUILD
index 765037e965..84eea84a3a 100644
--- a/test/core/util/BUILD
+++ b/test/core/util/BUILD
@@ -22,6 +22,15 @@ grpc_package(
)
grpc_cc_library(
+ name = "grpc_suppressions",
+ data = [
+ "lsan_suppressions.txt",
+ "tsan_suppressions.txt",
+ "ubsan_suppressions.txt",
+ ],
+)
+
+grpc_cc_library(
name = "grpc_test_util_base",
srcs = [
"cmdline.cc",
@@ -67,17 +76,13 @@ grpc_cc_library(
"tracer_util.h",
"trickle_endpoint.h",
],
- data = [
- "lsan_suppressions.txt",
- "tsan_suppressions.txt",
- "ubsan_suppressions.txt",
- ],
external_deps = [
"absl/debugging:failure_signal_handler",
"absl/debugging:symbolize",
],
language = "C++",
deps = [
+ ":grpc_suppressions",
":stack_tracer",
"//:gpr",
"//:grpc_base_c",
diff --git a/test/core/util/test_lb_policies.cc b/test/core/util/test_lb_policies.cc
index 452212e9a4..f8a19b7989 100644
--- a/test/core/util/test_lb_policies.cc
+++ b/test/core/util/test_lb_policies.cc
@@ -229,10 +229,10 @@ class InterceptRecvTrailingMetadataLoadBalancingPolicy
// Do pick.
PickResult result = delegate_picker_->Pick(args);
// Intercept trailing metadata.
- if (result.type == PickResult::PICK_COMPLETE &&
- result.subchannel != nullptr) {
+ auto* complete_pick = absl::get_if<PickResult::Complete>(&result.result);
+ if (complete_pick != nullptr) {
new (args.call_state->Alloc(sizeof(TrailingMetadataHandler)))
- TrailingMetadataHandler(&result, cb_);
+ TrailingMetadataHandler(complete_pick, cb_);
}
return result;
}
@@ -277,19 +277,18 @@ class InterceptRecvTrailingMetadataLoadBalancingPolicy
class TrailingMetadataHandler {
public:
- TrailingMetadataHandler(PickResult* result,
+ TrailingMetadataHandler(PickResult::Complete* result,
InterceptRecvTrailingMetadataCallback cb)
: cb_(std::move(cb)) {
- result->recv_trailing_metadata_ready = [this](grpc_error_handle error,
+ result->recv_trailing_metadata_ready = [this](absl::Status /*status*/,
MetadataInterface* metadata,
CallState* call_state) {
- RecordRecvTrailingMetadata(error, metadata, call_state);
+ RecordRecvTrailingMetadata(metadata, call_state);
};
}
private:
- void RecordRecvTrailingMetadata(grpc_error_handle /*error*/,
- MetadataInterface* recv_trailing_metadata,
+ void RecordRecvTrailingMetadata(MetadataInterface* recv_trailing_metadata,
CallState* call_state) {
TrailingMetadataArgsSeen args_seen;
args_seen.backend_metric_data = call_state->GetBackendMetricData();
diff --git a/test/core/util/test_tcp_server.cc b/test/core/util/test_tcp_server.cc
index 0004369dc9..3d8f33b774 100644
--- a/test/core/util/test_tcp_server.cc
+++ b/test/core/util/test_tcp_server.cc
@@ -63,6 +63,7 @@ void test_tcp_server_start(test_tcp_server* server, int port) {
addr->sin_family = GRPC_AF_INET;
addr->sin_port = grpc_htons(static_cast<uint16_t>(port));
memset(&addr->sin_addr, 0, sizeof(addr->sin_addr));
+ resolved_addr.len = static_cast<socklen_t>(sizeof(grpc_sockaddr_in));
grpc_error_handle error = grpc_tcp_server_create(
&server->shutdown_complete, nullptr, &server->tcp_server);
diff --git a/test/core/util/tsan_suppressions.txt b/test/core/util/tsan_suppressions.txt
index e0c7907228..ffafdea6f1 100644
--- a/test/core/util/tsan_suppressions.txt
+++ b/test/core/util/tsan_suppressions.txt
@@ -7,7 +7,7 @@ race:ssleay_rand_add
race:ssleay_rand_bytes
race:__sleep_for
# protobuf has an idempotent write race in ByteSize/GetCachedSize
-# https://github.com/google/protobuf/issues/2169
+# https://github.com/protocolbuffers/protobuf/issues/2169
race:ByteSize
race:ByteSizeLong
race:GetCachedSize
diff --git a/test/core/xds/xds_bootstrap_test.cc b/test/core/xds/xds_bootstrap_test.cc
index 09c8dd4c30..2b90a5fd2a 100644
--- a/test/core/xds/xds_bootstrap_test.cc
+++ b/test/core/xds/xds_bootstrap_test.cc
@@ -469,6 +469,37 @@ TEST_P(XdsBootstrapTest, CertificateProvidersPluginNameWrongType) {
GRPC_ERROR_UNREF(error);
}
+TEST_P(XdsBootstrapTest, CertificateProvidersUnrecognizedPluginName) {
+ const char* json_str =
+ "{"
+ " \"xds_servers\": ["
+ " {"
+ " \"server_uri\": \"fake:///lb\","
+ " \"channel_creds\": [{\"type\": \"fake\"}]"
+ " }"
+ " ],"
+ " \"certificate_providers\": {"
+ " \"plugin\": {"
+ " \"plugin_name\":\"unknown\""
+ " }"
+ " }"
+ "}";
+ grpc_error_handle error = GRPC_ERROR_NONE;
+ Json json = Json::Parse(json_str, &error);
+ ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_std_string(error);
+ XdsBootstrap bootstrap(std::move(json), &error);
+ if (GetParam().parse_xds_certificate_providers()) {
+ EXPECT_THAT(grpc_error_std_string(error),
+ ::testing::ContainsRegex(
+ "errors parsing \"certificate_providers\" object.*"
+ "errors parsing element \"plugin\".*"
+ "Unrecognized plugin name: unknown"));
+ } else {
+ EXPECT_EQ(error, GRPC_ERROR_NONE) << grpc_error_std_string(error);
+ }
+ GRPC_ERROR_UNREF(error);
+}
+
class FakeCertificateProviderFactory : public CertificateProviderFactory {
public:
class Config : public CertificateProviderFactory::Config {
diff --git a/test/cpp/codegen/compiler_test_golden b/test/cpp/codegen/compiler_test_golden
index b509a93353..56a2cf0942 100644
--- a/test/cpp/codegen/compiler_test_golden
+++ b/test/cpp/codegen/compiler_test_golden
@@ -129,7 +129,7 @@ class ServiceA final {
typedef class async_interface experimental_async_interface;
virtual class async_interface* async() { return nullptr; }
class async_interface* experimental_async() { return async(); }
- private:
+ private:
virtual ::grpc::ClientAsyncResponseReaderInterface< ::grpc::testing::Response>* AsyncMethodA1Raw(::grpc::ClientContext* context, const ::grpc::testing::Request& request, ::grpc::CompletionQueue* cq) = 0;
virtual ::grpc::ClientAsyncResponseReaderInterface< ::grpc::testing::Response>* PrepareAsyncMethodA1Raw(::grpc::ClientContext* context, const ::grpc::testing::Request& request, ::grpc::CompletionQueue* cq) = 0;
virtual ::grpc::ClientWriterInterface< ::grpc::testing::Request>* MethodA2Raw(::grpc::ClientContext* context, ::grpc::testing::Response* response) = 0;
@@ -738,7 +738,7 @@ class ServiceB final {
typedef class async_interface experimental_async_interface;
virtual class async_interface* async() { return nullptr; }
class async_interface* experimental_async() { return async(); }
- private:
+ private:
virtual ::grpc::ClientAsyncResponseReaderInterface< ::grpc::testing::Response>* AsyncMethodB1Raw(::grpc::ClientContext* context, const ::grpc::testing::Request& request, ::grpc::CompletionQueue* cq) = 0;
virtual ::grpc::ClientAsyncResponseReaderInterface< ::grpc::testing::Response>* PrepareAsyncMethodB1Raw(::grpc::ClientContext* context, const ::grpc::testing::Request& request, ::grpc::CompletionQueue* cq) = 0;
};
diff --git a/test/cpp/end2end/client_lb_end2end_test.cc b/test/cpp/end2end/client_lb_end2end_test.cc
index 33f882bda0..4e0ab6e35f 100644
--- a/test/cpp/end2end/client_lb_end2end_test.cc
+++ b/test/cpp/end2end/client_lb_end2end_test.cc
@@ -26,6 +26,8 @@
#include "absl/memory/memory.h"
#include "absl/strings/str_cat.h"
+#include "absl/strings/str_format.h"
+#include "absl/strings/str_join.h"
#include <grpc/grpc.h>
#include <grpc/support/alloc.h>
@@ -355,32 +357,33 @@ class ClientLbEnd2endTest : public ::testing::Test {
}
struct ServerData {
- int port_;
+ const int port_;
std::unique_ptr<Server> server_;
MyTestServiceImpl service_;
std::unique_ptr<std::thread> thread_;
- bool server_ready_ = false;
- bool started_ = false;
- explicit ServerData(int port = 0) {
- port_ = port > 0 ? port : grpc_pick_unused_port_or_die();
- }
+ grpc::internal::Mutex mu_;
+ grpc::internal::CondVar cond_;
+ bool server_ready_ ABSL_GUARDED_BY(mu_) = false;
+ bool started_ ABSL_GUARDED_BY(mu_) = false;
+
+ explicit ServerData(int port = 0)
+ : port_(port > 0 ? port : grpc_pick_unused_port_or_die()) {}
void Start(const std::string& server_host) {
gpr_log(GPR_INFO, "starting server on port %d", port_);
+ grpc::internal::MutexLock lock(&mu_);
started_ = true;
- grpc::internal::Mutex mu;
- grpc::internal::MutexLock lock(&mu);
- grpc::internal::CondVar cond;
thread_ = absl::make_unique<std::thread>(
- std::bind(&ServerData::Serve, this, server_host, &mu, &cond));
- grpc::internal::WaitUntil(&cond, &mu, [this] { return server_ready_; });
+ std::bind(&ServerData::Serve, this, server_host));
+ while (!server_ready_) {
+ cond_.Wait(&mu_);
+ }
server_ready_ = false;
gpr_log(GPR_INFO, "server startup complete");
}
- void Serve(const std::string& server_host, grpc::internal::Mutex* mu,
- grpc::internal::CondVar* cond) {
+ void Serve(const std::string& server_host) {
std::ostringstream server_address;
server_address << server_host << ":" << port_;
ServerBuilder builder;
@@ -389,12 +392,13 @@ class ClientLbEnd2endTest : public ::testing::Test {
builder.AddListeningPort(server_address.str(), std::move(creds));
builder.RegisterService(&service_);
server_ = builder.BuildAndStart();
- grpc::internal::MutexLock lock(mu);
+ grpc::internal::MutexLock lock(&mu_);
server_ready_ = true;
- cond->Signal();
+ cond_.Signal();
}
void Shutdown() {
+ grpc::internal::MutexLock lock(&mu_);
if (!started_) return;
server_->Shutdown(grpc_timeout_milliseconds_to_deadline(0));
thread_->join();
@@ -1679,11 +1683,26 @@ class ClientLbPickArgsTest : public ClientLbEnd2endTest {
static void TearDownTestCase() { grpc_shutdown(); }
- const std::vector<grpc_core::PickArgsSeen>& args_seen_list() {
+ std::vector<grpc_core::PickArgsSeen> args_seen_list() {
grpc::internal::MutexLock lock(&mu_);
return args_seen_list_;
}
+ static std::string ArgsSeenListString(
+ const std::vector<grpc_core::PickArgsSeen>& args_seen_list) {
+ std::vector<std::string> entries;
+ for (const auto& args_seen : args_seen_list) {
+ std::vector<std::string> metadata;
+ for (const auto& p : args_seen.metadata) {
+ metadata.push_back(absl::StrCat(p.first, "=", p.second));
+ }
+ entries.push_back(absl::StrFormat("{path=\"%s\", metadata=[%s]}",
+ args_seen.path,
+ absl::StrJoin(metadata, ", ")));
+ }
+ return absl::StrCat("[", absl::StrJoin(entries, ", "), "]");
+ }
+
private:
static void SavePickArgs(const grpc_core::PickArgsSeen& args_seen) {
ClientLbPickArgsTest* self = current_test_instance_;
@@ -1705,29 +1724,26 @@ TEST_F(ClientLbPickArgsTest, Basic) {
auto channel = BuildChannel("test_pick_args_lb", response_generator);
auto stub = BuildStub(channel);
response_generator.SetNextResolution(GetServersPorts());
- CheckRpcSendOk(stub, DEBUG_LOCATION, /*wait_for_ready=*/true);
+ // Proactively connect the channel, so that the LB policy will always
+ // be connected before it sees the pick. Otherwise, the test would be
+ // flaky because sometimes the pick would be seen twice (once in
+ // CONNECTING and again in READY) and other times only once (in READY).
+ ASSERT_TRUE(channel->WaitForConnected(gpr_inf_future(GPR_CLOCK_MONOTONIC)));
// Check LB policy name for the channel.
EXPECT_EQ("test_pick_args_lb", channel->GetLoadBalancingPolicyName());
- // There will be two entries, one for the pick tried in state
- // CONNECTING and another for the pick tried in state READY.
- EXPECT_THAT(args_seen_list(),
- ::testing::ElementsAre(
- ::testing::AllOf(
- ::testing::Field(&grpc_core::PickArgsSeen::path,
- "/grpc.testing.EchoTestService/Echo"),
- ::testing::Field(&grpc_core::PickArgsSeen::metadata,
- ::testing::UnorderedElementsAre(
- ::testing::Pair("foo", "1"),
- ::testing::Pair("bar", "2"),
- ::testing::Pair("baz", "3")))),
- ::testing::AllOf(
- ::testing::Field(&grpc_core::PickArgsSeen::path,
- "/grpc.testing.EchoTestService/Echo"),
- ::testing::Field(&grpc_core::PickArgsSeen::metadata,
- ::testing::UnorderedElementsAre(
- ::testing::Pair("foo", "1"),
- ::testing::Pair("bar", "2"),
- ::testing::Pair("baz", "3"))))));
+ // Now send an RPC and check that the picker sees the expected data.
+ CheckRpcSendOk(stub, DEBUG_LOCATION, /*wait_for_ready=*/true);
+ auto pick_args_seen_list = args_seen_list();
+ EXPECT_THAT(pick_args_seen_list,
+ ::testing::ElementsAre(::testing::AllOf(
+ ::testing::Field(&grpc_core::PickArgsSeen::path,
+ "/grpc.testing.EchoTestService/Echo"),
+ ::testing::Field(&grpc_core::PickArgsSeen::metadata,
+ ::testing::UnorderedElementsAre(
+ ::testing::Pair("foo", "1"),
+ ::testing::Pair("bar", "2"),
+ ::testing::Pair("baz", "3"))))))
+ << ArgsSeenListString(pick_args_seen_list);
}
class ClientLbInterceptTrailingMetadataTest : public ClientLbEnd2endTest {
diff --git a/test/cpp/end2end/end2end_test.cc b/test/cpp/end2end/end2end_test.cc
index b36b5473f6..34183f2f42 100644
--- a/test/cpp/end2end/end2end_test.cc
+++ b/test/cpp/end2end/end2end_test.cc
@@ -23,7 +23,6 @@
#include <grpcpp/channel.h>
#include <grpcpp/client_context.h>
#include <grpcpp/create_channel.h>
-#include <grpcpp/impl/codegen/status_code_enum.h>
#include <grpcpp/resource_quota.h>
#include <grpcpp/security/auth_metadata_processor.h>
#include <grpcpp/security/credentials.h>
diff --git a/test/cpp/end2end/grpclb_end2end_test.cc b/test/cpp/end2end/grpclb_end2end_test.cc
index 8b6affa236..e6e2e9fdc3 100644
--- a/test/cpp/end2end/grpclb_end2end_test.cc
+++ b/test/cpp/end2end/grpclb_end2end_test.cc
@@ -274,8 +274,9 @@ class BalancerServiceImpl : public BalancerService {
}
{
grpc::internal::MutexLock lock(&mu_);
- grpc::internal::WaitUntil(&serverlist_cond_, &mu_,
- [this] { return serverlist_done_; });
+ while (!serverlist_done_) {
+ serverlist_cond_.Wait(&mu_);
+ }
}
if (client_load_reporting_interval_seconds_ > 0) {
@@ -304,7 +305,7 @@ class BalancerServiceImpl : public BalancerService {
// below from firing before its corresponding wait is executed.
grpc::internal::MutexLock lock(&mu_);
load_report_queue_.emplace_back(std::move(load_report));
- if (load_report_cond_ != nullptr) load_report_cond_->Signal();
+ load_report_cond_.Signal();
}
}
}
@@ -332,12 +333,10 @@ class BalancerServiceImpl : public BalancerService {
ClientStats WaitForLoadReport() {
grpc::internal::MutexLock lock(&mu_);
- grpc::internal::CondVar cv;
if (load_report_queue_.empty()) {
- load_report_cond_ = &cv;
- grpc::internal::WaitUntil(load_report_cond_, &mu_,
- [this] { return !load_report_queue_.empty(); });
- load_report_cond_ = nullptr;
+ while (load_report_queue_.empty()) {
+ load_report_cond_.Wait(&mu_);
+ }
}
ClientStats load_report = std::move(load_report_queue_.front());
load_report_queue_.pop_front();
@@ -376,9 +375,9 @@ class BalancerServiceImpl : public BalancerService {
grpc::internal::Mutex mu_;
grpc::internal::CondVar serverlist_cond_;
- bool serverlist_done_ = false;
- grpc::internal::CondVar* load_report_cond_ = nullptr;
- std::deque<ClientStats> load_report_queue_;
+ bool serverlist_done_ ABSL_GUARDED_BY(mu_) = false;
+ grpc::internal::CondVar load_report_cond_;
+ std::deque<ClientStats> load_report_queue_ ABSL_GUARDED_BY(mu_);
};
class GrpclbEnd2endTest : public ::testing::Test {
@@ -495,7 +494,7 @@ class GrpclbEnd2endTest : public ::testing::Test {
if (status.ok()) {
++*num_ok;
} else {
- if (status.error_message() == "Call dropped by load balancing policy") {
+ if (status.error_message() == "drop directed by grpclb balancer") {
++*num_drops;
} else {
++*num_failure;
@@ -1781,7 +1780,7 @@ TEST_F(SingleBalancerTest, Drop) {
EchoResponse response;
const Status status = SendRpc(&response);
if (!status.ok() &&
- status.error_message() == "Call dropped by load balancing policy") {
+ status.error_message() == "drop directed by grpclb balancer") {
++num_drops;
} else {
EXPECT_TRUE(status.ok()) << "code=" << status.error_code()
@@ -1813,7 +1812,7 @@ TEST_F(SingleBalancerTest, DropAllFirst) {
0);
const Status status = SendRpc(nullptr, 1000, true);
EXPECT_FALSE(status.ok());
- EXPECT_EQ(status.error_message(), "Call dropped by load balancing policy");
+ EXPECT_EQ(status.error_message(), "drop directed by grpclb balancer");
}
TEST_F(SingleBalancerTest, DropAll) {
@@ -1838,7 +1837,7 @@ TEST_F(SingleBalancerTest, DropAll) {
status = SendRpc(nullptr, 1000, true);
} while (status.ok());
EXPECT_FALSE(status.ok());
- EXPECT_EQ(status.error_message(), "Call dropped by load balancing policy");
+ EXPECT_EQ(status.error_message(), "drop directed by grpclb balancer");
}
class SingleBalancerWithClientLoadReportingTest : public GrpclbEnd2endTest {
@@ -1970,7 +1969,7 @@ TEST_F(SingleBalancerWithClientLoadReportingTest, Drop) {
EchoResponse response;
const Status status = SendRpc(&response);
if (!status.ok() &&
- status.error_message() == "Call dropped by load balancing policy") {
+ status.error_message() == "drop directed by grpclb balancer") {
++num_drops;
} else {
EXPECT_TRUE(status.ok()) << "code=" << status.error_code()
diff --git a/test/cpp/end2end/mock_test.cc b/test/cpp/end2end/mock_test.cc
index 82b955d3c4..40a8b137a9 100644
--- a/test/cpp/end2end/mock_test.cc
+++ b/test/cpp/end2end/mock_test.cc
@@ -29,6 +29,8 @@
#include <grpcpp/server_context.h>
#include <grpcpp/test/default_reactor_test_peer.h>
+#include "absl/types/optional.h"
+
#include "src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h"
#include "src/proto/grpc/testing/echo.grpc.pb.h"
#include "src/proto/grpc/testing/echo_mock.grpc.pb.h"
@@ -191,28 +193,30 @@ TEST_F(MockCallbackTest, MockedCallSucceedsWithWait) {
CallbackServerContext ctx;
EchoRequest req;
EchoResponse resp;
- grpc::internal::Mutex mu;
- grpc::internal::CondVar cv;
- grpc::Status status;
- bool status_set = false;
+ struct {
+ grpc::internal::Mutex mu;
+ grpc::internal::CondVar cv;
+ absl::optional<grpc::Status> ABSL_GUARDED_BY(mu) status;
+ } status;
DefaultReactorTestPeer peer(&ctx, [&](::grpc::Status s) {
- grpc::internal::MutexLock l(&mu);
- status_set = true;
- status = std::move(s);
- cv.Signal();
+ grpc::internal::MutexLock l(&status.mu);
+ status.status = std::move(s);
+ status.cv.Signal();
});
req.set_message("mock 1");
auto* reactor = service_.Echo(&ctx, &req, &resp);
- grpc::internal::WaitUntil(&cv, &mu, [&] {
- grpc::internal::MutexLock l(&mu);
- return status_set;
- });
+
+ grpc::internal::MutexLock l(&status.mu);
+ while (!status.status.has_value()) {
+ status.cv.Wait(&status.mu);
+ }
+
EXPECT_EQ(reactor, peer.reactor());
EXPECT_TRUE(peer.test_status_set());
EXPECT_TRUE(peer.test_status().ok());
- EXPECT_TRUE(status_set);
- EXPECT_TRUE(status.ok());
+ EXPECT_TRUE(status.status.has_value());
+ EXPECT_TRUE(status.status.value().ok());
EXPECT_EQ(req.message(), resp.message());
}
diff --git a/test/cpp/end2end/service_config_end2end_test.cc b/test/cpp/end2end/service_config_end2end_test.cc
index 67e02bc72a..5b3f2f71a4 100644
--- a/test/cpp/end2end/service_config_end2end_test.cc
+++ b/test/cpp/end2end/service_config_end2end_test.cc
@@ -300,32 +300,33 @@ class ServiceConfigEnd2endTest : public ::testing::Test {
}
struct ServerData {
- int port_;
+ const int port_;
std::unique_ptr<Server> server_;
MyTestServiceImpl service_;
std::unique_ptr<std::thread> thread_;
- bool server_ready_ = false;
- bool started_ = false;
- explicit ServerData(int port = 0) {
- port_ = port > 0 ? port : grpc_pick_unused_port_or_die();
- }
+ grpc::internal::Mutex mu_;
+ grpc::internal::CondVar cond_;
+ bool server_ready_ ABSL_GUARDED_BY(mu_) = false;
+ bool started_ ABSL_GUARDED_BY(mu_) = false;
+
+ explicit ServerData(int port = 0)
+ : port_(port > 0 ? port : grpc_pick_unused_port_or_die()) {}
void Start(const std::string& server_host) {
gpr_log(GPR_INFO, "starting server on port %d", port_);
+ grpc::internal::MutexLock lock(&mu_);
started_ = true;
- grpc::internal::Mutex mu;
- grpc::internal::MutexLock lock(&mu);
- grpc::internal::CondVar cond;
thread_ = absl::make_unique<std::thread>(
- std::bind(&ServerData::Serve, this, server_host, &mu, &cond));
- grpc::internal::WaitUntil(&cond, &mu, [this] { return server_ready_; });
+ std::bind(&ServerData::Serve, this, server_host));
+ while (!server_ready_) {
+ cond_.Wait(&mu_);
+ }
server_ready_ = false;
gpr_log(GPR_INFO, "server startup complete");
}
- void Serve(const std::string& server_host, grpc::internal::Mutex* mu,
- grpc::internal::CondVar* cond) {
+ void Serve(const std::string& server_host) {
std::ostringstream server_address;
server_address << server_host << ":" << port_;
ServerBuilder builder;
@@ -334,12 +335,13 @@ class ServiceConfigEnd2endTest : public ::testing::Test {
builder.AddListeningPort(server_address.str(), std::move(creds));
builder.RegisterService(&service_);
server_ = builder.BuildAndStart();
- grpc::internal::MutexLock lock(mu);
+ grpc::internal::MutexLock lock(&mu_);
server_ready_ = true;
- cond->Signal();
+ cond_.Signal();
}
void Shutdown() {
+ grpc::internal::MutexLock lock(&mu_);
if (!started_) return;
server_->Shutdown(grpc_timeout_milliseconds_to_deadline(0));
thread_->join();
diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc
index 61f413fafd..8329d1b9bb 100644
--- a/test/cpp/end2end/xds_end2end_test.cc
+++ b/test/cpp/end2end/xds_end2end_test.cc
@@ -31,6 +31,7 @@
#include "absl/functional/bind_front.h"
#include "absl/memory/memory.h"
+#include "absl/strings/match.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/str_format.h"
#include "absl/strings/str_join.h"
@@ -791,20 +792,17 @@ class AdsServiceImpl : public std::enable_shared_from_this<AdsServiceImpl> {
response->DebugString().c_str());
stream->Write(response.value());
}
- // If we didn't find anything to do, delay before the next loop
- // iteration; otherwise, check whether we should exit and then
- // immediately continue.
- gpr_timespec deadline =
- grpc_timeout_milliseconds_to_deadline(did_work ? 0 : 10);
{
grpc_core::MutexLock lock(&parent_->ads_mu_);
- if (!grpc_core::WaitUntilWithDeadline(
- &parent_->ads_cond_, &parent_->ads_mu_,
- [this] { return parent_->ads_done_; },
- grpc_core::ToAbslTime(deadline))) {
+ if (parent_->ads_done_) {
break;
}
}
+ // If we didn't find anything to do, delay before the next loop
+ // iteration; otherwise, check whether we should exit and then
+ // immediately continue.
+ gpr_sleep_until(
+ grpc_timeout_milliseconds_to_deadline(did_work ? 0 : 10));
}
// Done with main loop. Clean up before returning.
// Join reader thread.
@@ -1213,8 +1211,9 @@ class LrsServiceImpl : public std::enable_shared_from_this<LrsServiceImpl> {
grpc_core::CondVar cv;
if (result_queue_.empty()) {
load_report_cond_ = &cv;
- grpc_core::WaitUntil(load_report_cond_, &load_report_mu_,
- [this] { return !result_queue_.empty(); });
+ while (result_queue_.empty()) {
+ cv.Wait(&load_report_mu_);
+ }
load_report_cond_ = nullptr;
}
std::vector<ClientStats> result = std::move(result_queue_.front());
@@ -1281,8 +1280,9 @@ class LrsServiceImpl : public std::enable_shared_from_this<LrsServiceImpl> {
}
// Wait until notified done.
grpc_core::MutexLock lock(&parent_->lrs_mu_);
- grpc_core::WaitUntil(&parent_->lrs_cv_, &parent_->lrs_mu_,
- [this] { return parent_->lrs_done_; });
+ while (!parent_->lrs_done_) {
+ parent_->lrs_cv_.Wait(&parent_->lrs_mu_);
+ }
}
gpr_log(GPR_INFO, "LRS[%p]: StreamLoadStats done", this);
return Status::OK;
@@ -1615,28 +1615,25 @@ grpc_millis NowFromCycleCounter() {
return grpc_cycle_counter_to_millis_round_up(now);
}
-// Returns the number of RPCs needed to pass error_tolerance at 99.995% chance.
-// Rolling dices in drop/fault-injection generates a binomial distribution (if
-// our code is not horribly wrong). Let's make "n" the number of samples, "p"
-// the probabilty. If we have np>5 & n(1-p)>5, we can approximately treat the
-// binomial distribution as a normal distribution.
+// Returns the number of RPCs needed to pass error_tolerance at 99.99994%
+// chance. Rolling dices in drop/fault-injection generates a binomial
+// distribution (if our code is not horribly wrong). Let's make "n" the number
+// of samples, "p" the probability. If we have np>5 & n(1-p)>5, we can
+// approximately treat the binomial distribution as a normal distribution.
//
// For normal distribution, we can easily look up how many standard deviation we
// need to reach 99.995%. Based on Wiki's table
-// https://en.wikipedia.org/wiki/Standard_normal_table, we need 4.00 sigma
-// (standard deviation) to cover the probability area of 99.995%. In another
-// word, for a sample with size "n" probability "p" error-tolerance "k", we want
-// the error always land within 4.00 sigma. The sigma of binominal distribution
-// and be computed as sqrt(np(1-p)). Hence, we have the equation:
+// https://en.wikipedia.org/wiki/68%E2%80%9395%E2%80%9399.7_rule, we need 5.00
+// sigma (standard deviation) to cover the probability area of 99.99994%. In
+// another word, for a sample with size "n" probability "p" error-tolerance "k",
+// we want the error always land within 5.00 sigma. The sigma of binominal
+// distribution and be computed as sqrt(np(1-p)). Hence, we have the equation:
//
-// kn <= 4.00 * sqrt(np(1-p))
-//
-// E.g., with p=0.5 k=0.1, n >= 400; with p=0.5 k=0.05, n >= 1600; with p=0.5
-// k=0.01, n >= 40000.
+// kn <= 5.00 * sqrt(np(1-p))
size_t ComputeIdealNumRpcs(double p, double error_tolerance) {
GPR_ASSERT(p >= 0 && p <= 1);
size_t num_rpcs =
- ceil(p * (1 - p) * 4.00 * 4.00 / error_tolerance / error_tolerance);
+ ceil(p * (1 - p) * 5.00 * 5.00 / error_tolerance / error_tolerance);
gpr_log(GPR_INFO,
"Sending %" PRIuPTR " RPCs for percentage=%.3f error_tolerance=%.3f",
num_rpcs, p, error_tolerance);
@@ -1880,8 +1877,10 @@ class XdsEnd2endTest : public ::testing::TestWithParam<TestType> {
bool wait_for_ready = false;
bool server_fail = false;
std::vector<std::pair<std::string, std::string>> metadata;
+ int server_sleep_us = 0;
int client_cancel_after_us = 0;
bool skip_cancelled_check = false;
+ StatusCode server_expected_error = StatusCode::OK;
RpcOptions() {}
@@ -1921,11 +1920,21 @@ class XdsEnd2endTest : public ::testing::TestWithParam<TestType> {
return *this;
}
+ RpcOptions& set_server_sleep_us(int rpc_server_sleep_us) {
+ server_sleep_us = rpc_server_sleep_us;
+ return *this;
+ }
+
RpcOptions& set_client_cancel_after_us(int rpc_client_cancel_after_us) {
client_cancel_after_us = rpc_client_cancel_after_us;
return *this;
}
+ RpcOptions& set_server_expected_error(StatusCode code) {
+ server_expected_error = code;
+ return *this;
+ }
+
// Populates context and request.
void SetupRpc(ClientContext* context, EchoRequest* request) const {
for (const auto& item : metadata) {
@@ -1941,6 +1950,9 @@ class XdsEnd2endTest : public ::testing::TestWithParam<TestType> {
request->mutable_param()->mutable_expected_error()->set_code(
GRPC_STATUS_FAILED_PRECONDITION);
}
+ if (server_sleep_us != 0) {
+ request->mutable_param()->set_server_sleep_us(server_sleep_us);
+ }
if (client_cancel_after_us != 0) {
request->mutable_param()->set_client_cancel_after_us(
client_cancel_after_us);
@@ -2008,16 +2020,15 @@ class XdsEnd2endTest : public ::testing::TestWithParam<TestType> {
return true;
}
- void SendRpcAndCount(int* num_total, int* num_ok, int* num_failure,
- int* num_drops,
- const RpcOptions& rpc_options = RpcOptions(),
- const char* drop_error_message =
- "Call dropped by load balancing policy") {
+ void SendRpcAndCount(
+ int* num_total, int* num_ok, int* num_failure, int* num_drops,
+ const RpcOptions& rpc_options = RpcOptions(),
+ const char* drop_error_message_prefix = "EDS-configured drop: ") {
const Status status = SendRpc(rpc_options);
if (status.ok()) {
++*num_ok;
} else {
- if (status.error_message() == drop_error_message) {
+ if (absl::StartsWith(status.error_message(), drop_error_message_prefix)) {
++*num_drops;
} else {
++*num_failure;
@@ -2188,6 +2199,10 @@ class XdsEnd2endTest : public ::testing::TestWithParam<TestType> {
if (local_response) response = new EchoResponse;
ClientContext context;
EchoRequest request;
+ if (rpc_options.server_expected_error != StatusCode::OK) {
+ auto* error = request.mutable_param()->mutable_expected_error();
+ error->set_code(rpc_options.server_expected_error);
+ }
rpc_options.SetupRpc(&context, &request);
Status status;
switch (rpc_options.service) {
@@ -2219,18 +2234,91 @@ class XdsEnd2endTest : public ::testing::TestWithParam<TestType> {
}
}
- void CheckRpcSendFailure(
- const size_t times = 1, const RpcOptions& rpc_options = RpcOptions(),
- const StatusCode expected_error_code = StatusCode::OK) {
- for (size_t i = 0; i < times; ++i) {
- const Status status = SendRpc(rpc_options);
+ struct CheckRpcSendFailureOptions {
+ std::function<bool(size_t)> continue_predicate = [](size_t i) {
+ return i < 1;
+ };
+ RpcOptions rpc_options;
+ StatusCode expected_error_code = StatusCode::OK;
+
+ CheckRpcSendFailureOptions() {}
+
+ CheckRpcSendFailureOptions& set_times(size_t times) {
+ continue_predicate = [times](size_t i) { return i < times; };
+ return *this;
+ }
+
+ CheckRpcSendFailureOptions& set_continue_predicate(
+ std::function<bool(size_t)> pred) {
+ continue_predicate = std::move(pred);
+ return *this;
+ }
+
+ CheckRpcSendFailureOptions& set_rpc_options(const RpcOptions& options) {
+ rpc_options = options;
+ return *this;
+ }
+
+ CheckRpcSendFailureOptions& set_expected_error_code(StatusCode code) {
+ expected_error_code = code;
+ return *this;
+ }
+ };
+
+ void CheckRpcSendFailure(const CheckRpcSendFailureOptions& options =
+ CheckRpcSendFailureOptions()) {
+ for (size_t i = 0; options.continue_predicate(i); ++i) {
+ const Status status = SendRpc(options.rpc_options);
EXPECT_FALSE(status.ok());
- if (expected_error_code != StatusCode::OK) {
- EXPECT_EQ(expected_error_code, status.error_code());
+ if (options.expected_error_code != StatusCode::OK) {
+ EXPECT_EQ(options.expected_error_code, status.error_code());
}
}
}
+ bool WaitForNack(
+ std::function<AdsServiceImpl::ResponseState::State()> get_state,
+ StatusCode expected_status = StatusCode::UNAVAILABLE) {
+ auto deadline = absl::Now() + absl::Seconds(30);
+ bool success = true;
+ CheckRpcSendFailure(CheckRpcSendFailureOptions()
+ .set_continue_predicate([&](size_t) {
+ if (absl::Now() >= deadline) {
+ success = false;
+ return false;
+ }
+ return get_state() !=
+ AdsServiceImpl::ResponseState::NACKED;
+ })
+ .set_expected_error_code(expected_status));
+ return success;
+ }
+
+ bool WaitForLdsNack(StatusCode expected_status = StatusCode::UNAVAILABLE) {
+ return WaitForNack(
+ [&]() {
+ return balancers_[0]->ads_service()->lds_response_state().state;
+ },
+ expected_status);
+ }
+
+ bool WaitForRdsNack() {
+ return WaitForNack(
+ [&]() { return RouteConfigurationResponseState(0).state; });
+ }
+
+ bool WaitForCdsNack() {
+ return WaitForNack([&]() {
+ return balancers_[0]->ads_service()->cds_response_state().state;
+ });
+ }
+
+ bool WaitForEdsNack() {
+ return WaitForNack([&]() {
+ return balancers_[0]->ads_service()->eds_response_state().state;
+ });
+ }
+
static Listener BuildListener(const RouteConfiguration& route_config) {
HttpConnectionManager http_connection_manager;
*(http_connection_manager.mutable_route_config()) = route_config;
@@ -2894,7 +2982,7 @@ TEST_P(BasicTest, BackendsRestart) {
// below (which we expect to succeed), if the callbacks happen in the wrong
// order, the same race condition could happen again due to the client not
// yet having noticed that the backends were all down.
- CheckRpcSendFailure(num_backends_);
+ CheckRpcSendFailure(CheckRpcSendFailureOptions().set_times(num_backends_));
// Restart all backends. RPCs should start succeeding again.
StartAllBackends();
CheckRpcSendOk(1, RpcOptions().set_timeout_ms(2000).set_wait_for_ready(true));
@@ -3011,7 +3099,7 @@ TEST_P(XdsResolverOnlyTest, ClusterRemoved) {
do {
} while (SendRpc(RpcOptions(), nullptr).ok());
// Make sure RPCs are still failing.
- CheckRpcSendFailure(1000);
+ CheckRpcSendFailure(CheckRpcSendFailureOptions().set_times(1000));
// Make sure we ACK'ed the update.
EXPECT_EQ(balancers_[0]->ads_service()->cds_response_state().state,
AdsServiceImpl::ResponseState::ACKED);
@@ -3121,7 +3209,7 @@ TEST_P(XdsResolverOnlyTest, CircuitBreaking) {
// we hit the max concurrent requests limit and got dropped.
Status status = SendRpc();
EXPECT_FALSE(status.ok());
- EXPECT_EQ(status.error_message(), "Call dropped by load balancing policy");
+ EXPECT_EQ(status.error_message(), "circuit breaker drop");
// Cancel one RPC to allow another one through
rpcs[0].CancelRpc();
status = SendRpc();
@@ -3182,7 +3270,7 @@ TEST_P(XdsResolverOnlyTest, CircuitBreakingMultipleChannelsShareCallCounter) {
// we hit the max concurrent requests limit and got dropped.
Status status = SendRpc();
EXPECT_FALSE(status.ok());
- EXPECT_EQ(status.error_message(), "Call dropped by load balancing policy");
+ EXPECT_EQ(status.error_message(), "circuit breaker drop");
// Cancel one RPC to allow another one through
rpcs[0].CancelRpc();
status = SendRpc();
@@ -3279,17 +3367,30 @@ TEST_P(GlobalXdsClientTest, MultipleBadResources) {
EchoResponse response;
grpc::Status status = stub2->Echo(&context, request, &response);
EXPECT_FALSE(status.ok());
- const auto response_state =
- balancers_[0]->ads_service()->lds_response_state();
- EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_THAT(
- response_state.error_message,
- ::testing::AllOf(
- ::testing::HasSubstr(absl::StrCat(
- kServerName, ": Listener has neither address nor ApiListener")),
- ::testing::HasSubstr(
- absl::StrCat(kServerName2,
- ": Listener has neither address nor ApiListener"))));
+ // Wait for second NACK to be reported to xDS server.
+ auto deadline = absl::Now() + absl::Seconds(30);
+ bool timed_out = false;
+ CheckRpcSendFailure(
+ CheckRpcSendFailureOptions().set_continue_predicate([&](size_t) {
+ if (absl::Now() >= deadline) {
+ timed_out = true;
+ return false;
+ }
+ const auto response_state =
+ balancers_[0]->ads_service()->lds_response_state();
+ return response_state.state != AdsServiceImpl::ResponseState::NACKED ||
+ !absl::StrContains(
+ response_state.error_message,
+ absl::StrCat(
+ kServerName,
+ ": Listener has neither address nor ApiListener")) ||
+ !absl::StrContains(
+ response_state.error_message,
+ absl::StrCat(
+ kServerName2,
+ ": Listener has neither address nor ApiListener"));
+ }));
+ ASSERT_FALSE(timed_out);
}
class XdsResolverLoadReportingOnlyTest : public XdsEnd2endTest {
@@ -3463,9 +3564,8 @@ TEST_P(LdsTest, NoApiListener) {
auto listener = default_listener_;
listener.clear_api_listener();
balancers_[0]->ads_service()->SetLdsResource(listener);
- SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForLdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->lds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -3485,9 +3585,8 @@ TEST_P(LdsTest, WrongRouteSpecifier) {
listener.mutable_api_listener()->mutable_api_listener()->PackFrom(
http_connection_manager);
balancers_[0]->ads_service()->SetLdsResource(listener);
- SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForLdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->lds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -3509,9 +3608,8 @@ TEST_P(LdsTest, RdsMissingConfigSource) {
listener.mutable_api_listener()->mutable_api_listener()->PackFrom(
http_connection_manager);
balancers_[0]->ads_service()->SetLdsResource(listener);
- SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForLdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->lds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -3534,9 +3632,8 @@ TEST_P(LdsTest, RdsConfigSourceDoesNotSpecifyAds) {
listener.mutable_api_listener()->mutable_api_listener()->PackFrom(
http_connection_manager);
balancers_[0]->ads_service()->SetLdsResource(listener);
- SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForLdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->lds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -3545,55 +3642,53 @@ TEST_P(LdsTest, RdsConfigSourceDoesNotSpecifyAds) {
"RDS does not specify ADS."));
}
-// Tests that we ignore filters after the router filter.
-TEST_P(LdsTest, IgnoresHttpFiltersAfterRouterFilter) {
+// Tests that we NACK non-terminal filters at the end of the list.
+TEST_P(LdsTest, NacksNonTerminalHttpFilterAtEndOfList) {
SetNextResolutionForLbChannelAllBalancers();
auto listener = default_listener_;
HttpConnectionManager http_connection_manager;
listener.mutable_api_listener()->mutable_api_listener()->UnpackTo(
&http_connection_manager);
- auto* filter = http_connection_manager.add_http_filters();
+ auto* filter = http_connection_manager.mutable_http_filters(0);
filter->set_name("unknown");
filter->mutable_typed_config()->set_type_url(
"grpc.testing.client_only_http_filter");
listener.mutable_api_listener()->mutable_api_listener()->PackFrom(
http_connection_manager);
SetListenerAndRouteConfiguration(0, listener, default_route_config_);
- AdsServiceImpl::EdsResourceArgs args({
- {"locality0", CreateEndpointsForBackends()},
- });
- balancers_[0]->ads_service()->SetEdsResource(
- BuildEdsResource(args, DefaultEdsServiceName()));
- WaitForAllBackends();
+ SetNextResolutionForLbChannelAllBalancers();
+ ASSERT_TRUE(WaitForLdsNack()) << "timed out waiting for NACK";
+ const auto response_state =
+ balancers_[0]->ads_service()->lds_response_state();
+ EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr(
+ "non-terminal filter for config type grpc.testing"
+ ".client_only_http_filter is the last filter in the chain"));
}
-// Test that we fail RPCs if there is no router filter.
-TEST_P(LdsTest, FailRpcsIfNoHttpRouterFilter) {
+// Test that we NACK terminal filters that are not at the end of the list.
+TEST_P(LdsTest, NacksTerminalFilterBeforeEndOfList) {
SetNextResolutionForLbChannelAllBalancers();
auto listener = default_listener_;
HttpConnectionManager http_connection_manager;
listener.mutable_api_listener()->mutable_api_listener()->UnpackTo(
&http_connection_manager);
- http_connection_manager.clear_http_filters();
+ *http_connection_manager.add_http_filters() =
+ http_connection_manager.http_filters(0);
listener.mutable_api_listener()->mutable_api_listener()->PackFrom(
http_connection_manager);
SetListenerAndRouteConfiguration(0, listener, default_route_config_);
- AdsServiceImpl::EdsResourceArgs args({
- {"locality0", CreateEndpointsForBackends()},
- });
- balancers_[0]->ads_service()->SetEdsResource(
- BuildEdsResource(args, DefaultEdsServiceName()));
- Status status = SendRpc();
- EXPECT_EQ(status.error_code(), StatusCode::UNAVAILABLE);
- EXPECT_EQ(status.error_message(), "no xDS HTTP router filter configured");
- // Wait until xDS server sees ACK.
- while (balancers_[0]->ads_service()->lds_response_state().state ==
- AdsServiceImpl::ResponseState::SENT) {
- CheckRpcSendFailure();
- }
+ SetNextResolutionForLbChannelAllBalancers();
+ ASSERT_TRUE(WaitForLdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->lds_response_state();
- EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::ACKED);
+ EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
+ EXPECT_THAT(
+ response_state.error_message,
+ ::testing::HasSubstr(
+ "terminal filter for config type envoy.extensions.filters.http"
+ ".router.v3.Router must be the last filter in the chain"));
}
// Test that we NACK empty filter names.
@@ -3602,23 +3697,21 @@ TEST_P(LdsTest, RejectsEmptyHttpFilterName) {
HttpConnectionManager http_connection_manager;
listener.mutable_api_listener()->mutable_api_listener()->UnpackTo(
&http_connection_manager);
- auto* filter = http_connection_manager.add_http_filters();
+ *http_connection_manager.add_http_filters() =
+ http_connection_manager.http_filters(0);
+ auto* filter = http_connection_manager.mutable_http_filters(0);
+ filter->Clear();
filter->mutable_typed_config()->PackFrom(Listener());
listener.mutable_api_listener()->mutable_api_listener()->PackFrom(
http_connection_manager);
SetListenerAndRouteConfiguration(0, listener, default_route_config_);
- SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- // Wait until xDS server sees NACK.
- do {
- CheckRpcSendFailure();
- } while (balancers_[0]->ads_service()->lds_response_state().state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForLdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->lds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(response_state.error_message,
- ::testing::HasSubstr("empty filter name at index 1"));
+ ::testing::HasSubstr("empty filter name at index 0"));
}
// Test that we NACK duplicate HTTP filter names.
@@ -3629,16 +3722,14 @@ TEST_P(LdsTest, RejectsDuplicateHttpFilterName) {
&http_connection_manager);
*http_connection_manager.add_http_filters() =
http_connection_manager.http_filters(0);
+ http_connection_manager.mutable_http_filters(0)
+ ->mutable_typed_config()
+ ->PackFrom(HTTPFault());
listener.mutable_api_listener()->mutable_api_listener()->PackFrom(
http_connection_manager);
SetListenerAndRouteConfiguration(0, listener, default_route_config_);
- SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- // Wait until xDS server sees NACK.
- do {
- CheckRpcSendFailure();
- } while (balancers_[0]->ads_service()->lds_response_state().state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForLdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->lds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -3652,19 +3743,16 @@ TEST_P(LdsTest, RejectsUnknownHttpFilterType) {
HttpConnectionManager http_connection_manager;
listener.mutable_api_listener()->mutable_api_listener()->UnpackTo(
&http_connection_manager);
- auto* filter = http_connection_manager.add_http_filters();
+ *http_connection_manager.add_http_filters() =
+ http_connection_manager.http_filters(0);
+ auto* filter = http_connection_manager.mutable_http_filters(0);
filter->set_name("unknown");
filter->mutable_typed_config()->PackFrom(Listener());
listener.mutable_api_listener()->mutable_api_listener()->PackFrom(
http_connection_manager);
SetListenerAndRouteConfiguration(0, listener, default_route_config_);
- SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- // Wait until xDS server sees NACK.
- do {
- CheckRpcSendFailure();
- } while (balancers_[0]->ads_service()->lds_response_state().state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForLdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->lds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -3679,7 +3767,9 @@ TEST_P(LdsTest, IgnoresOptionalUnknownHttpFilterType) {
HttpConnectionManager http_connection_manager;
listener.mutable_api_listener()->mutable_api_listener()->UnpackTo(
&http_connection_manager);
- auto* filter = http_connection_manager.add_http_filters();
+ *http_connection_manager.add_http_filters() =
+ http_connection_manager.http_filters(0);
+ auto* filter = http_connection_manager.mutable_http_filters(0);
filter->set_name("unknown");
filter->mutable_typed_config()->PackFrom(Listener());
filter->set_is_optional(true);
@@ -3703,18 +3793,16 @@ TEST_P(LdsTest, RejectsHttpFilterWithoutConfig) {
HttpConnectionManager http_connection_manager;
listener.mutable_api_listener()->mutable_api_listener()->UnpackTo(
&http_connection_manager);
- auto* filter = http_connection_manager.add_http_filters();
+ *http_connection_manager.add_http_filters() =
+ http_connection_manager.http_filters(0);
+ auto* filter = http_connection_manager.mutable_http_filters(0);
+ filter->Clear();
filter->set_name("unknown");
listener.mutable_api_listener()->mutable_api_listener()->PackFrom(
http_connection_manager);
SetListenerAndRouteConfiguration(0, listener, default_route_config_);
- SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- // Wait until xDS server sees NACK.
- do {
- CheckRpcSendFailure();
- } while (balancers_[0]->ads_service()->lds_response_state().state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForLdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->lds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -3729,7 +3817,10 @@ TEST_P(LdsTest, IgnoresOptionalHttpFilterWithoutConfig) {
HttpConnectionManager http_connection_manager;
listener.mutable_api_listener()->mutable_api_listener()->UnpackTo(
&http_connection_manager);
- auto* filter = http_connection_manager.add_http_filters();
+ *http_connection_manager.add_http_filters() =
+ http_connection_manager.http_filters(0);
+ auto* filter = http_connection_manager.mutable_http_filters(0);
+ filter->Clear();
filter->set_name("unknown");
filter->set_is_optional(true);
listener.mutable_api_listener()->mutable_api_listener()->PackFrom(
@@ -3752,21 +3843,18 @@ TEST_P(LdsTest, RejectsUnparseableHttpFilterType) {
HttpConnectionManager http_connection_manager;
listener.mutable_api_listener()->mutable_api_listener()->UnpackTo(
&http_connection_manager);
- auto* filter = http_connection_manager.add_http_filters();
+ *http_connection_manager.add_http_filters() =
+ http_connection_manager.http_filters(0);
+ auto* filter = http_connection_manager.mutable_http_filters(0);
filter->set_name("unknown");
filter->mutable_typed_config()->PackFrom(listener);
filter->mutable_typed_config()->set_type_url(
- "type.googleapis.com/envoy.extensions.filters.http.router.v3.Router");
+ "type.googleapis.com/envoy.extensions.filters.http.fault.v3.HTTPFault");
listener.mutable_api_listener()->mutable_api_listener()->PackFrom(
http_connection_manager);
SetListenerAndRouteConfiguration(0, listener, default_route_config_);
- SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- // Wait until xDS server sees NACK.
- do {
- CheckRpcSendFailure();
- } while (balancers_[0]->ads_service()->lds_response_state().state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForLdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->lds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -3774,7 +3862,7 @@ TEST_P(LdsTest, RejectsUnparseableHttpFilterType) {
response_state.error_message,
::testing::HasSubstr(
"filter config for type "
- "envoy.extensions.filters.http.router.v3.Router failed to parse"));
+ "envoy.extensions.filters.http.fault.v3.HTTPFault failed to parse"));
}
// Test that we NACK HTTP filters unsupported on client-side.
@@ -3783,20 +3871,17 @@ TEST_P(LdsTest, RejectsHttpFiltersNotSupportedOnClients) {
HttpConnectionManager http_connection_manager;
listener.mutable_api_listener()->mutable_api_listener()->UnpackTo(
&http_connection_manager);
- auto* filter = http_connection_manager.add_http_filters();
+ *http_connection_manager.add_http_filters() =
+ http_connection_manager.http_filters(0);
+ auto* filter = http_connection_manager.mutable_http_filters(0);
filter->set_name("grpc.testing.server_only_http_filter");
filter->mutable_typed_config()->set_type_url(
"grpc.testing.server_only_http_filter");
listener.mutable_api_listener()->mutable_api_listener()->PackFrom(
http_connection_manager);
SetListenerAndRouteConfiguration(0, listener, default_route_config_);
- SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- // Wait until xDS server sees NACK.
- do {
- CheckRpcSendFailure();
- } while (balancers_[0]->ads_service()->lds_response_state().state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForLdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->lds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -3812,7 +3897,9 @@ TEST_P(LdsTest, IgnoresOptionalHttpFiltersNotSupportedOnClients) {
HttpConnectionManager http_connection_manager;
listener.mutable_api_listener()->mutable_api_listener()->UnpackTo(
&http_connection_manager);
- auto* filter = http_connection_manager.add_http_filters();
+ *http_connection_manager.add_http_filters() =
+ http_connection_manager.http_filters(0);
+ auto* filter = http_connection_manager.mutable_http_filters(0);
filter->set_name("grpc.testing.server_only_http_filter");
filter->mutable_typed_config()->set_type_url(
"grpc.testing.server_only_http_filter");
@@ -3825,7 +3912,6 @@ TEST_P(LdsTest, IgnoresOptionalHttpFiltersNotSupportedOnClients) {
});
balancers_[0]->ads_service()->SetEdsResource(
BuildEdsResource(args, DefaultEdsServiceName()));
- SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
WaitForBackend(0);
EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state().state,
@@ -3891,7 +3977,7 @@ TEST_P(LdsRdsTest, ListenerRemoved) {
do {
} while (SendRpc(RpcOptions(), nullptr).ok());
// Make sure RPCs are still failing.
- CheckRpcSendFailure(1000);
+ CheckRpcSendFailure(CheckRpcSendFailureOptions().set_times(1000));
// Make sure we ACK'ed the update.
EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state().state,
AdsServiceImpl::ResponseState::ACKED);
@@ -3955,7 +4041,7 @@ TEST_P(LdsRdsTest, RouteMatchHasQueryParameters) {
SetRouteConfiguration(0, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(response_state.error_message,
@@ -3988,7 +4074,7 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixNoLeadingSlash) {
SetRouteConfiguration(0, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(response_state.error_message,
@@ -4004,7 +4090,7 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixExtraContent) {
SetRouteConfiguration(0, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(response_state.error_message,
@@ -4020,7 +4106,7 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixDoubleSlash) {
SetRouteConfiguration(0, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(response_state.error_message,
@@ -4036,7 +4122,7 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathEmptyPath) {
SetRouteConfiguration(0, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(response_state.error_message,
@@ -4052,7 +4138,7 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathNoLeadingSlash) {
SetRouteConfiguration(0, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(response_state.error_message,
@@ -4068,7 +4154,7 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathTooManySlashes) {
SetRouteConfiguration(0, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(response_state.error_message,
@@ -4084,7 +4170,7 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathOnlyOneSlash) {
SetRouteConfiguration(0, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(response_state.error_message,
@@ -4100,7 +4186,7 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathMissingService) {
SetRouteConfiguration(0, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(response_state.error_message,
@@ -4116,7 +4202,7 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathMissingMethod) {
SetRouteConfiguration(0, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(response_state.error_message,
@@ -4133,7 +4219,7 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathRegex) {
SetRouteConfiguration(0, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(response_state.error_message,
@@ -4149,7 +4235,7 @@ TEST_P(LdsRdsTest, RouteHasNoRouteAction) {
SetRouteConfiguration(0, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(response_state.error_message,
@@ -4167,7 +4253,7 @@ TEST_P(LdsRdsTest, RouteActionClusterHasEmptyClusterName) {
SetRouteConfiguration(0, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(
@@ -4195,7 +4281,7 @@ TEST_P(LdsRdsTest, RouteActionWeightedTargetHasIncorrectTotalWeightSet) {
SetRouteConfiguration(0, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(response_state.error_message,
@@ -4222,7 +4308,7 @@ TEST_P(LdsRdsTest, RouteActionWeightedClusterHasZeroTotalWeight) {
SetRouteConfiguration(0, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(
@@ -4250,7 +4336,7 @@ TEST_P(LdsRdsTest, RouteActionWeightedTargetClusterHasEmptyClusterName) {
SetRouteConfiguration(0, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(response_state.error_message,
@@ -4277,7 +4363,7 @@ TEST_P(LdsRdsTest, RouteActionWeightedTargetClusterHasNoWeight) {
SetRouteConfiguration(0, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(response_state.error_message,
@@ -4297,7 +4383,7 @@ TEST_P(LdsRdsTest, RouteHeaderMatchInvalidRegex) {
SetRouteConfiguration(0, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(
@@ -4319,7 +4405,7 @@ TEST_P(LdsRdsTest, RouteHeaderMatchInvalidRange) {
SetRouteConfiguration(0, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(
@@ -4679,72 +4765,6 @@ TEST_P(LdsRdsTest, XdsRoutingPathRegexMatching) {
EXPECT_EQ(kNumEcho2Rpcs, backends_[3]->backend_service2()->request_count());
}
-TEST_P(LdsRdsTest, XdsRoutingPathRegexMatchingCaseInsensitive) {
- const char* kNewCluster1Name = "new_cluster_1";
- const char* kNewEdsService1Name = "new_eds_service_name_1";
- const char* kNewCluster2Name = "new_cluster_2";
- const char* kNewEdsService2Name = "new_eds_service_name_2";
- const size_t kNumEcho1Rpcs = 10;
- const size_t kNumEchoRpcs = 30;
- SetNextResolution({});
- SetNextResolutionForLbChannelAllBalancers();
- // Populate new EDS resources.
- AdsServiceImpl::EdsResourceArgs args({
- {"locality0", CreateEndpointsForBackends(0, 1)},
- });
- AdsServiceImpl::EdsResourceArgs args1({
- {"locality0", CreateEndpointsForBackends(1, 2)},
- });
- AdsServiceImpl::EdsResourceArgs args2({
- {"locality0", CreateEndpointsForBackends(2, 3)},
- });
- balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
- balancers_[0]->ads_service()->SetEdsResource(
- BuildEdsResource(args1, kNewEdsService1Name));
- balancers_[0]->ads_service()->SetEdsResource(
- BuildEdsResource(args2, kNewEdsService2Name));
- // Populate new CDS resources.
- Cluster new_cluster1 = default_cluster_;
- new_cluster1.set_name(kNewCluster1Name);
- new_cluster1.mutable_eds_cluster_config()->set_service_name(
- kNewEdsService1Name);
- balancers_[0]->ads_service()->SetCdsResource(new_cluster1);
- Cluster new_cluster2 = default_cluster_;
- new_cluster2.set_name(kNewCluster2Name);
- new_cluster2.mutable_eds_cluster_config()->set_service_name(
- kNewEdsService2Name);
- balancers_[0]->ads_service()->SetCdsResource(new_cluster2);
- // Populating Route Configurations for LDS.
- RouteConfiguration new_route_config = default_route_config_;
- // First route will not match, since it's case-sensitive.
- // Second route will match with same path.
- auto* route1 = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
- route1->mutable_match()->mutable_safe_regex()->set_regex(
- ".*EcHoTeSt1SErViCe.*");
- route1->mutable_route()->set_cluster(kNewCluster1Name);
- auto* route2 = new_route_config.mutable_virtual_hosts(0)->add_routes();
- route2->mutable_match()->mutable_safe_regex()->set_regex(
- ".*EcHoTeSt1SErViCe.*");
- route2->mutable_match()->mutable_case_sensitive()->set_value(false);
- route2->mutable_route()->set_cluster(kNewCluster2Name);
- auto* default_route = new_route_config.mutable_virtual_hosts(0)->add_routes();
- default_route->mutable_match()->set_prefix("");
- default_route->mutable_route()->set_cluster(kDefaultClusterName);
- SetRouteConfiguration(0, new_route_config);
- CheckRpcSendOk(kNumEchoRpcs, RpcOptions().set_wait_for_ready(true));
- CheckRpcSendOk(kNumEcho1Rpcs, RpcOptions()
- .set_rpc_service(SERVICE_ECHO1)
- .set_rpc_method(METHOD_ECHO1)
- .set_wait_for_ready(true));
- // Make sure RPCs all go to the correct backend.
- EXPECT_EQ(kNumEchoRpcs, backends_[0]->backend_service()->request_count());
- EXPECT_EQ(0, backends_[0]->backend_service1()->request_count());
- EXPECT_EQ(0, backends_[1]->backend_service()->request_count());
- EXPECT_EQ(0, backends_[1]->backend_service1()->request_count());
- EXPECT_EQ(0, backends_[2]->backend_service()->request_count());
- EXPECT_EQ(kNumEcho1Rpcs, backends_[2]->backend_service1()->request_count());
-}
-
TEST_P(LdsRdsTest, XdsRoutingWeightedCluster) {
const char* kNewCluster1Name = "new_cluster_1";
const char* kNewEdsService1Name = "new_eds_service_name_1";
@@ -5385,13 +5405,15 @@ TEST_P(LdsRdsTest, XdsRoutingApplyXdsTimeout) {
grpc_millis t1 =
t0 + kTimeoutGrpcTimeoutHeaderMaxSecond * 1000 + kTimeoutMillis;
grpc_millis t2 = t0 + kTimeoutMaxStreamDurationSecond * 1000 + kTimeoutMillis;
- CheckRpcSendFailure(1,
- RpcOptions()
- .set_rpc_service(SERVICE_ECHO1)
- .set_rpc_method(METHOD_ECHO1)
- .set_wait_for_ready(true)
- .set_timeout_ms(kTimeoutApplicationSecond * 1000),
- StatusCode::DEADLINE_EXCEEDED);
+ CheckRpcSendFailure(
+ CheckRpcSendFailureOptions()
+ .set_rpc_options(
+ RpcOptions()
+ .set_rpc_service(SERVICE_ECHO1)
+ .set_rpc_method(METHOD_ECHO1)
+ .set_wait_for_ready(true)
+ .set_timeout_ms(kTimeoutApplicationSecond * 1000))
+ .set_expected_error_code(StatusCode::DEADLINE_EXCEEDED));
t0 = NowFromCycleCounter();
EXPECT_GE(t0, t1);
EXPECT_LT(t0, t2);
@@ -5399,13 +5421,15 @@ TEST_P(LdsRdsTest, XdsRoutingApplyXdsTimeout) {
t0 = NowFromCycleCounter();
t1 = t0 + kTimeoutMaxStreamDurationSecond * 1000 + kTimeoutMillis;
t2 = t0 + kTimeoutHttpMaxStreamDurationSecond * 1000 + kTimeoutMillis;
- CheckRpcSendFailure(1,
- RpcOptions()
- .set_rpc_service(SERVICE_ECHO2)
- .set_rpc_method(METHOD_ECHO2)
- .set_wait_for_ready(true)
- .set_timeout_ms(kTimeoutApplicationSecond * 1000),
- StatusCode::DEADLINE_EXCEEDED);
+ CheckRpcSendFailure(
+ CheckRpcSendFailureOptions()
+ .set_rpc_options(
+ RpcOptions()
+ .set_rpc_service(SERVICE_ECHO2)
+ .set_rpc_method(METHOD_ECHO2)
+ .set_wait_for_ready(true)
+ .set_timeout_ms(kTimeoutApplicationSecond * 1000))
+ .set_expected_error_code(StatusCode::DEADLINE_EXCEEDED));
t0 = NowFromCycleCounter();
EXPECT_GE(t0, t1);
EXPECT_LT(t0, t2);
@@ -5413,10 +5437,11 @@ TEST_P(LdsRdsTest, XdsRoutingApplyXdsTimeout) {
t0 = NowFromCycleCounter();
t1 = t0 + kTimeoutHttpMaxStreamDurationSecond * 1000 + kTimeoutMillis;
t2 = t0 + kTimeoutApplicationSecond * 1000 + kTimeoutMillis;
- CheckRpcSendFailure(1,
- RpcOptions().set_wait_for_ready(true).set_timeout_ms(
- kTimeoutApplicationSecond * 1000),
- StatusCode::DEADLINE_EXCEEDED);
+ CheckRpcSendFailure(
+ CheckRpcSendFailureOptions()
+ .set_rpc_options(RpcOptions().set_wait_for_ready(true).set_timeout_ms(
+ kTimeoutApplicationSecond * 1000))
+ .set_expected_error_code(StatusCode::DEADLINE_EXCEEDED));
t0 = NowFromCycleCounter();
EXPECT_GE(t0, t1);
EXPECT_LT(t0, t2);
@@ -5496,13 +5521,15 @@ TEST_P(LdsRdsTest, XdsRoutingApplyApplicationTimeoutWhenXdsTimeoutExplicit0) {
SetListenerAndRouteConfiguration(0, std::move(listener), new_route_config);
// Test application timeout is applied for route 1
auto t0 = system_clock::now();
- CheckRpcSendFailure(1,
- RpcOptions()
- .set_rpc_service(SERVICE_ECHO1)
- .set_rpc_method(METHOD_ECHO1)
- .set_wait_for_ready(true)
- .set_timeout_ms(kTimeoutApplicationSecond * 1000),
- StatusCode::DEADLINE_EXCEEDED);
+ CheckRpcSendFailure(
+ CheckRpcSendFailureOptions()
+ .set_rpc_options(
+ RpcOptions()
+ .set_rpc_service(SERVICE_ECHO1)
+ .set_rpc_method(METHOD_ECHO1)
+ .set_wait_for_ready(true)
+ .set_timeout_ms(kTimeoutApplicationSecond * 1000))
+ .set_expected_error_code(StatusCode::DEADLINE_EXCEEDED));
auto ellapsed_nano_seconds =
std::chrono::duration_cast<std::chrono::nanoseconds>(system_clock::now() -
t0);
@@ -5510,13 +5537,15 @@ TEST_P(LdsRdsTest, XdsRoutingApplyApplicationTimeoutWhenXdsTimeoutExplicit0) {
kTimeoutApplicationSecond * 1000000000);
// Test application timeout is applied for route 2
t0 = system_clock::now();
- CheckRpcSendFailure(1,
- RpcOptions()
- .set_rpc_service(SERVICE_ECHO2)
- .set_rpc_method(METHOD_ECHO2)
- .set_wait_for_ready(true)
- .set_timeout_ms(kTimeoutApplicationSecond * 1000),
- StatusCode::DEADLINE_EXCEEDED);
+ CheckRpcSendFailure(
+ CheckRpcSendFailureOptions()
+ .set_rpc_options(
+ RpcOptions()
+ .set_rpc_service(SERVICE_ECHO2)
+ .set_rpc_method(METHOD_ECHO2)
+ .set_wait_for_ready(true)
+ .set_timeout_ms(kTimeoutApplicationSecond * 1000))
+ .set_expected_error_code(StatusCode::DEADLINE_EXCEEDED));
ellapsed_nano_seconds = std::chrono::duration_cast<std::chrono::nanoseconds>(
system_clock::now() - t0);
EXPECT_GT(ellapsed_nano_seconds.count(),
@@ -5548,10 +5577,11 @@ TEST_P(LdsRdsTest, XdsRoutingApplyApplicationTimeoutWhenHttpTimeoutExplicit0) {
default_route_config_);
// Test application timeout is applied for route 1
auto t0 = system_clock::now();
- CheckRpcSendFailure(1,
- RpcOptions().set_wait_for_ready(true).set_timeout_ms(
- kTimeoutApplicationSecond * 1000),
- StatusCode::DEADLINE_EXCEEDED);
+ CheckRpcSendFailure(
+ CheckRpcSendFailureOptions()
+ .set_rpc_options(RpcOptions().set_wait_for_ready(true).set_timeout_ms(
+ kTimeoutApplicationSecond * 1000))
+ .set_expected_error_code(StatusCode::DEADLINE_EXCEEDED));
auto ellapsed_nano_seconds =
std::chrono::duration_cast<std::chrono::nanoseconds>(system_clock::now() -
t0);
@@ -5570,10 +5600,11 @@ TEST_P(LdsRdsTest, XdsRoutingWithOnlyApplicationTimeout) {
{{"locality0", {MakeNonExistantEndpoint()}}});
balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
auto t0 = system_clock::now();
- CheckRpcSendFailure(1,
- RpcOptions().set_wait_for_ready(true).set_timeout_ms(
- kTimeoutApplicationSecond * 1000),
- StatusCode::DEADLINE_EXCEEDED);
+ CheckRpcSendFailure(
+ CheckRpcSendFailureOptions()
+ .set_rpc_options(RpcOptions().set_wait_for_ready(true).set_timeout_ms(
+ kTimeoutApplicationSecond * 1000))
+ .set_expected_error_code(StatusCode::DEADLINE_EXCEEDED));
auto ellapsed_nano_seconds =
std::chrono::duration_cast<std::chrono::nanoseconds>(system_clock::now() -
t0);
@@ -5581,6 +5612,253 @@ TEST_P(LdsRdsTest, XdsRoutingWithOnlyApplicationTimeout) {
kTimeoutApplicationSecond * 1000000000);
}
+TEST_P(LdsRdsTest, XdsRetryPolicyNumRetries) {
+ const size_t kNumRetries = 3;
+ SetNextResolution({});
+ SetNextResolutionForLbChannelAllBalancers();
+ // Populate new EDS resources.
+ AdsServiceImpl::EdsResourceArgs args({
+ {"locality0", CreateEndpointsForBackends(0, 1)},
+ });
+ balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
+ // Construct route config to set retry policy.
+ RouteConfiguration new_route_config = default_route_config_;
+ auto* route1 = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
+ auto* retry_policy = route1->mutable_route()->mutable_retry_policy();
+ retry_policy->set_retry_on(
+ "5xx,cancelled,deadline-exceeded,internal,resource-exhausted,"
+ "unavailable");
+ retry_policy->mutable_num_retries()->set_value(kNumRetries);
+ SetRouteConfiguration(0, new_route_config);
+ // Ensure we retried the correct number of times on all supported status.
+ CheckRpcSendFailure(
+ CheckRpcSendFailureOptions()
+ .set_rpc_options(
+ RpcOptions().set_server_expected_error(StatusCode::CANCELLED))
+ .set_expected_error_code(StatusCode::CANCELLED));
+ EXPECT_EQ(kNumRetries + 1, backends_[0]->backend_service()->request_count());
+ ResetBackendCounters();
+ CheckRpcSendFailure(
+ CheckRpcSendFailureOptions()
+ .set_rpc_options(RpcOptions().set_server_expected_error(
+ StatusCode::DEADLINE_EXCEEDED))
+ .set_expected_error_code(StatusCode::DEADLINE_EXCEEDED));
+ EXPECT_EQ(kNumRetries + 1, backends_[0]->backend_service()->request_count());
+ ResetBackendCounters();
+ CheckRpcSendFailure(
+ CheckRpcSendFailureOptions()
+ .set_rpc_options(
+ RpcOptions().set_server_expected_error(StatusCode::INTERNAL))
+ .set_expected_error_code(StatusCode::INTERNAL));
+ EXPECT_EQ(kNumRetries + 1, backends_[0]->backend_service()->request_count());
+ ResetBackendCounters();
+ CheckRpcSendFailure(
+ CheckRpcSendFailureOptions()
+ .set_rpc_options(RpcOptions().set_server_expected_error(
+ StatusCode::RESOURCE_EXHAUSTED))
+ .set_expected_error_code(StatusCode::RESOURCE_EXHAUSTED));
+ EXPECT_EQ(kNumRetries + 1, backends_[0]->backend_service()->request_count());
+ ResetBackendCounters();
+ CheckRpcSendFailure(
+ CheckRpcSendFailureOptions()
+ .set_rpc_options(
+ RpcOptions().set_server_expected_error(StatusCode::UNAVAILABLE))
+ .set_expected_error_code(StatusCode::UNAVAILABLE));
+ EXPECT_EQ(kNumRetries + 1, backends_[0]->backend_service()->request_count());
+ ResetBackendCounters();
+ // Ensure we don't retry on an unsupported status.
+ CheckRpcSendFailure(
+ CheckRpcSendFailureOptions()
+ .set_rpc_options(RpcOptions().set_server_expected_error(
+ StatusCode::UNAUTHENTICATED))
+ .set_expected_error_code(StatusCode::UNAUTHENTICATED));
+ EXPECT_EQ(1, backends_[0]->backend_service()->request_count());
+}
+
+TEST_P(LdsRdsTest, XdsRetryPolicyAtVirtualHostLevel) {
+ const size_t kNumRetries = 3;
+ SetNextResolution({});
+ SetNextResolutionForLbChannelAllBalancers();
+ // Populate new EDS resources.
+ AdsServiceImpl::EdsResourceArgs args({
+ {"locality0", CreateEndpointsForBackends(0, 1)},
+ });
+ balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
+ // Construct route config to set retry policy.
+ RouteConfiguration new_route_config = default_route_config_;
+ auto* retry_policy =
+ new_route_config.mutable_virtual_hosts(0)->mutable_retry_policy();
+ retry_policy->set_retry_on(
+ "cancelled,deadline-exceeded,internal,resource-exhausted,unavailable");
+ retry_policy->mutable_num_retries()->set_value(kNumRetries);
+ SetRouteConfiguration(0, new_route_config);
+ // Ensure we retried the correct number of times on a supported status.
+ CheckRpcSendFailure(
+ CheckRpcSendFailureOptions()
+ .set_rpc_options(RpcOptions().set_server_expected_error(
+ StatusCode::DEADLINE_EXCEEDED))
+ .set_expected_error_code(StatusCode::DEADLINE_EXCEEDED));
+ EXPECT_EQ(kNumRetries + 1, backends_[0]->backend_service()->request_count());
+}
+
+TEST_P(LdsRdsTest, XdsRetryPolicyLongBackOff) {
+ // Set num retries to 3, but due to longer back off, we expect only 1 retry
+ // will take place.
+ const size_t kNumRetries = 3;
+ SetNextResolution({});
+ SetNextResolutionForLbChannelAllBalancers();
+ // Populate new EDS resources.
+ AdsServiceImpl::EdsResourceArgs args({
+ {"locality0", CreateEndpointsForBackends(0, 1)},
+ });
+ balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
+ // Construct route config to set retry policy.
+ RouteConfiguration new_route_config = default_route_config_;
+ auto* route1 = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
+ auto* retry_policy = route1->mutable_route()->mutable_retry_policy();
+ retry_policy->set_retry_on(
+ "5xx,cancelled,deadline-exceeded,internal,resource-exhausted,"
+ "unavailable");
+ retry_policy->mutable_num_retries()->set_value(kNumRetries);
+ auto base_interval =
+ retry_policy->mutable_retry_back_off()->mutable_base_interval();
+ // Set backoff to 1 second, 1/2 of rpc timeout of 2 second.
+ base_interval->set_seconds(1 * grpc_test_slowdown_factor());
+ base_interval->set_nanos(0);
+ SetRouteConfiguration(0, new_route_config);
+ // No need to set max interval and just let it be the default of 10x of base.
+ // We expect 1 retry before the RPC times out with DEADLINE_EXCEEDED.
+ CheckRpcSendFailure(
+ CheckRpcSendFailureOptions()
+ .set_rpc_options(
+ RpcOptions().set_timeout_ms(2500).set_server_expected_error(
+ StatusCode::CANCELLED))
+ .set_expected_error_code(StatusCode::DEADLINE_EXCEEDED));
+ EXPECT_EQ(1 + 1, backends_[0]->backend_service()->request_count());
+}
+
+TEST_P(LdsRdsTest, XdsRetryPolicyMaxBackOff) {
+ // Set num retries to 3, but due to longer back off, we expect only 2 retry
+ // will take place, while the 2nd one will obey the max backoff.
+ const size_t kNumRetries = 3;
+ SetNextResolution({});
+ SetNextResolutionForLbChannelAllBalancers();
+ // Populate new EDS resources.
+ AdsServiceImpl::EdsResourceArgs args({
+ {"locality0", CreateEndpointsForBackends(0, 1)},
+ });
+ balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
+ // Construct route config to set retry policy.
+ RouteConfiguration new_route_config = default_route_config_;
+ auto* route1 = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
+ auto* retry_policy = route1->mutable_route()->mutable_retry_policy();
+ retry_policy->set_retry_on(
+ "5xx,cancelled,deadline-exceeded,internal,resource-exhausted,"
+ "unavailable");
+ retry_policy->mutable_num_retries()->set_value(kNumRetries);
+ auto base_interval =
+ retry_policy->mutable_retry_back_off()->mutable_base_interval();
+ // Set backoff to 1 second.
+ base_interval->set_seconds(1 * grpc_test_slowdown_factor());
+ base_interval->set_nanos(0);
+ auto max_interval =
+ retry_policy->mutable_retry_back_off()->mutable_max_interval();
+ // Set max interval to be the same as base, so 2 retries will take 2 seconds
+ // and both retries will take place before the 2.5 seconds rpc timeout.
+ // Tested to ensure if max is not set, this test will be the same as
+ // XdsRetryPolicyLongBackOff and we will only see 1 retry in that case.
+ max_interval->set_seconds(1 * grpc_test_slowdown_factor());
+ max_interval->set_nanos(0);
+ SetRouteConfiguration(0, new_route_config);
+ // We expect 2 retry before the RPC times out with DEADLINE_EXCEEDED.
+ CheckRpcSendFailure(
+ CheckRpcSendFailureOptions()
+ .set_rpc_options(
+ RpcOptions().set_timeout_ms(2500).set_server_expected_error(
+ StatusCode::CANCELLED))
+ .set_expected_error_code(StatusCode::DEADLINE_EXCEEDED));
+ EXPECT_EQ(2 + 1, backends_[0]->backend_service()->request_count());
+}
+
+TEST_P(LdsRdsTest, XdsRetryPolicyUnsupportedStatusCode) {
+ const size_t kNumRetries = 3;
+ SetNextResolution({});
+ SetNextResolutionForLbChannelAllBalancers();
+ // Populate new EDS resources.
+ AdsServiceImpl::EdsResourceArgs args({
+ {"locality0", CreateEndpointsForBackends(0, 1)},
+ });
+ balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
+ // Construct route config to set retry policy.
+ RouteConfiguration new_route_config = default_route_config_;
+ auto* route1 = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
+ auto* retry_policy = route1->mutable_route()->mutable_retry_policy();
+ retry_policy->set_retry_on("5xx");
+ retry_policy->mutable_num_retries()->set_value(kNumRetries);
+ SetRouteConfiguration(0, new_route_config);
+ // We expect no retry.
+ CheckRpcSendFailure(
+ CheckRpcSendFailureOptions()
+ .set_rpc_options(RpcOptions().set_server_expected_error(
+ StatusCode::DEADLINE_EXCEEDED))
+ .set_expected_error_code(StatusCode::DEADLINE_EXCEEDED));
+ EXPECT_EQ(1, backends_[0]->backend_service()->request_count());
+}
+
+TEST_P(LdsRdsTest, XdsRetryPolicyInvalidNumRetriesZero) {
+ SetNextResolution({});
+ SetNextResolutionForLbChannelAllBalancers();
+ // Populate new EDS resources.
+ AdsServiceImpl::EdsResourceArgs args({
+ {"locality0", CreateEndpointsForBackends(0, 1)},
+ });
+ balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
+ // Construct route config to set retry policy.
+ RouteConfiguration new_route_config = default_route_config_;
+ auto* route1 = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
+ auto* retry_policy = route1->mutable_route()->mutable_retry_policy();
+ retry_policy->set_retry_on("deadline-exceeded");
+ // Setting num_retries to zero is not valid.
+ retry_policy->mutable_num_retries()->set_value(0);
+ SetRouteConfiguration(0, new_route_config);
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
+ const auto response_state = RouteConfigurationResponseState(0);
+ EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
+ EXPECT_THAT(
+ response_state.error_message,
+ ::testing::HasSubstr(
+ "RouteAction RetryPolicy num_retries set to invalid value 0."));
+}
+
+TEST_P(LdsRdsTest, XdsRetryPolicyRetryBackOffMissingBaseInterval) {
+ SetNextResolution({});
+ SetNextResolutionForLbChannelAllBalancers();
+ // Populate new EDS resources.
+ AdsServiceImpl::EdsResourceArgs args({
+ {"locality0", CreateEndpointsForBackends(0, 1)},
+ });
+ balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
+ // Construct route config to set retry policy.
+ RouteConfiguration new_route_config = default_route_config_;
+ auto* route1 = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
+ auto* retry_policy = route1->mutable_route()->mutable_retry_policy();
+ retry_policy->set_retry_on("deadline-exceeded");
+ retry_policy->mutable_num_retries()->set_value(1);
+ // RetryBackoff is there but base interval is missing.
+ auto max_interval =
+ retry_policy->mutable_retry_back_off()->mutable_max_interval();
+ max_interval->set_seconds(0);
+ max_interval->set_nanos(250000000);
+ SetRouteConfiguration(0, new_route_config);
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
+ const auto response_state = RouteConfigurationResponseState(0);
+ EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
+ EXPECT_THAT(
+ response_state.error_message,
+ ::testing::HasSubstr(
+ "RouteAction RetryPolicy RetryBackoff missing base interval."));
+}
+
TEST_P(LdsRdsTest, XdsRoutingHeadersMatching) {
const char* kNewClusterName = "new_cluster";
const char* kNewEdsServiceName = "new_eds_service_name";
@@ -5991,11 +6269,7 @@ TEST_P(LdsRdsTest, RejectsUnknownHttpFilterTypeInVirtualHost) {
SetListenerAndRouteConfiguration(0, default_listener_, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- // Wait until xDS server sees NACK.
- do {
- CheckRpcSendFailure();
- } while (RouteConfigurationResponseState(0).state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(response_state.error_message,
@@ -6036,11 +6310,7 @@ TEST_P(LdsRdsTest, RejectsHttpFilterWithoutConfigInVirtualHost) {
SetListenerAndRouteConfiguration(0, default_listener_, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- // Wait until xDS server sees NACK.
- do {
- CheckRpcSendFailure();
- } while (RouteConfigurationResponseState(0).state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(response_state.error_message,
@@ -6059,11 +6329,7 @@ TEST_P(LdsRdsTest, RejectsHttpFilterWithoutConfigInFilterConfigInVirtualHost) {
SetListenerAndRouteConfiguration(0, default_listener_, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- // Wait until xDS server sees NACK.
- do {
- CheckRpcSendFailure();
- } while (RouteConfigurationResponseState(0).state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(response_state.error_message,
@@ -6104,11 +6370,7 @@ TEST_P(LdsRdsTest, RejectsUnparseableHttpFilterTypeInVirtualHost) {
SetListenerAndRouteConfiguration(0, default_listener_, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- // Wait until xDS server sees NACK.
- do {
- CheckRpcSendFailure();
- } while (RouteConfigurationResponseState(0).state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(
@@ -6127,11 +6389,7 @@ TEST_P(LdsRdsTest, RejectsUnknownHttpFilterTypeInRoute) {
SetListenerAndRouteConfiguration(0, default_listener_, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- // Wait until xDS server sees NACK.
- do {
- CheckRpcSendFailure();
- } while (RouteConfigurationResponseState(0).state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(response_state.error_message,
@@ -6174,11 +6432,7 @@ TEST_P(LdsRdsTest, RejectsHttpFilterWithoutConfigInRoute) {
SetListenerAndRouteConfiguration(0, default_listener_, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- // Wait until xDS server sees NACK.
- do {
- CheckRpcSendFailure();
- } while (RouteConfigurationResponseState(0).state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(response_state.error_message,
@@ -6198,11 +6452,7 @@ TEST_P(LdsRdsTest, RejectsHttpFilterWithoutConfigInFilterConfigInRoute) {
SetListenerAndRouteConfiguration(0, default_listener_, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- // Wait until xDS server sees NACK.
- do {
- CheckRpcSendFailure();
- } while (RouteConfigurationResponseState(0).state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(response_state.error_message,
@@ -6245,11 +6495,7 @@ TEST_P(LdsRdsTest, RejectsUnparseableHttpFilterTypeInRoute) {
SetListenerAndRouteConfiguration(0, default_listener_, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- // Wait until xDS server sees NACK.
- do {
- CheckRpcSendFailure();
- } while (RouteConfigurationResponseState(0).state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(
@@ -6273,11 +6519,7 @@ TEST_P(LdsRdsTest, RejectsUnknownHttpFilterTypeInClusterWeight) {
SetListenerAndRouteConfiguration(0, default_listener_, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- // Wait until xDS server sees NACK.
- do {
- CheckRpcSendFailure();
- } while (RouteConfigurationResponseState(0).state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(response_state.error_message,
@@ -6330,11 +6572,7 @@ TEST_P(LdsRdsTest, RejectsHttpFilterWithoutConfigInClusterWeight) {
SetListenerAndRouteConfiguration(0, default_listener_, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- // Wait until xDS server sees NACK.
- do {
- CheckRpcSendFailure();
- } while (RouteConfigurationResponseState(0).state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(response_state.error_message,
@@ -6360,11 +6598,7 @@ TEST_P(LdsRdsTest,
SetListenerAndRouteConfiguration(0, default_listener_, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- // Wait until xDS server sees NACK.
- do {
- CheckRpcSendFailure();
- } while (RouteConfigurationResponseState(0).state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(response_state.error_message,
@@ -6417,11 +6651,7 @@ TEST_P(LdsRdsTest, RejectsUnparseableHttpFilterTypeInClusterWeight) {
SetListenerAndRouteConfiguration(0, default_listener_, route_config);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- // Wait until xDS server sees NACK.
- do {
- CheckRpcSendFailure();
- } while (RouteConfigurationResponseState(0).state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForRdsNack()) << "timed out waiting for NACK";
const auto response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(
@@ -6480,11 +6710,7 @@ TEST_P(CdsTest, LogicalDNSClusterTypeMissingLoadAssignment) {
auto cluster = default_cluster_;
cluster.set_type(Cluster::LOGICAL_DNS);
balancers_[0]->ads_service()->SetCdsResource(cluster);
- // Wait until xDS server sees NACK.
- do {
- CheckRpcSendFailure();
- } while (balancers_[0]->ads_service()->cds_response_state().state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForCdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -6505,11 +6731,7 @@ TEST_P(CdsTest, LogicalDNSClusterTypeMissingLocalities) {
cluster.set_type(Cluster::LOGICAL_DNS);
cluster.mutable_load_assignment();
balancers_[0]->ads_service()->SetCdsResource(cluster);
- // Wait until xDS server sees NACK.
- do {
- CheckRpcSendFailure();
- } while (balancers_[0]->ads_service()->cds_response_state().state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForCdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -6533,11 +6755,7 @@ TEST_P(CdsTest, LogicalDNSClusterTypeMultipleLocalities) {
load_assignment->add_endpoints();
load_assignment->add_endpoints();
balancers_[0]->ads_service()->SetCdsResource(cluster);
- // Wait until xDS server sees NACK.
- do {
- CheckRpcSendFailure();
- } while (balancers_[0]->ads_service()->cds_response_state().state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForCdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -6559,11 +6777,7 @@ TEST_P(CdsTest, LogicalDNSClusterTypeMissingEndpoints) {
cluster.set_type(Cluster::LOGICAL_DNS);
cluster.mutable_load_assignment()->add_endpoints();
balancers_[0]->ads_service()->SetCdsResource(cluster);
- // Wait until xDS server sees NACK.
- do {
- CheckRpcSendFailure();
- } while (balancers_[0]->ads_service()->cds_response_state().state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForCdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -6587,11 +6801,7 @@ TEST_P(CdsTest, LogicalDNSClusterTypeMultipleEndpoints) {
locality->add_lb_endpoints();
locality->add_lb_endpoints();
balancers_[0]->ads_service()->SetCdsResource(cluster);
- // Wait until xDS server sees NACK.
- do {
- CheckRpcSendFailure();
- } while (balancers_[0]->ads_service()->cds_response_state().state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForCdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -6613,11 +6823,7 @@ TEST_P(CdsTest, LogicalDNSClusterTypeEmptyEndpoint) {
cluster.set_type(Cluster::LOGICAL_DNS);
cluster.mutable_load_assignment()->add_endpoints()->add_lb_endpoints();
balancers_[0]->ads_service()->SetCdsResource(cluster);
- // Wait until xDS server sees NACK.
- do {
- CheckRpcSendFailure();
- } while (balancers_[0]->ads_service()->cds_response_state().state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForCdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -6640,11 +6846,7 @@ TEST_P(CdsTest, LogicalDNSClusterTypeEndpointMissingAddress) {
->add_lb_endpoints()
->mutable_endpoint();
balancers_[0]->ads_service()->SetCdsResource(cluster);
- // Wait until xDS server sees NACK.
- do {
- CheckRpcSendFailure();
- } while (balancers_[0]->ads_service()->cds_response_state().state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForCdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -6668,11 +6870,7 @@ TEST_P(CdsTest, LogicalDNSClusterTypeAddressMissingSocketAddress) {
->mutable_endpoint()
->mutable_address();
balancers_[0]->ads_service()->SetCdsResource(cluster);
- // Wait until xDS server sees NACK.
- do {
- CheckRpcSendFailure();
- } while (balancers_[0]->ads_service()->cds_response_state().state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForCdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -6698,11 +6896,7 @@ TEST_P(CdsTest, LogicalDNSClusterTypeSocketAddressHasResolverName) {
->mutable_socket_address()
->set_resolver_name("foo");
balancers_[0]->ads_service()->SetCdsResource(cluster);
- // Wait until xDS server sees NACK.
- do {
- CheckRpcSendFailure();
- } while (balancers_[0]->ads_service()->cds_response_state().state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForCdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -6728,11 +6922,7 @@ TEST_P(CdsTest, LogicalDNSClusterTypeSocketAddressMissingAddress) {
->mutable_address()
->mutable_socket_address();
balancers_[0]->ads_service()->SetCdsResource(cluster);
- // Wait until xDS server sees NACK.
- do {
- CheckRpcSendFailure();
- } while (balancers_[0]->ads_service()->cds_response_state().state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForCdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -6758,11 +6948,7 @@ TEST_P(CdsTest, LogicalDNSClusterTypeSocketAddressMissingPort) {
->mutable_socket_address()
->set_address(kServerName);
balancers_[0]->ads_service()->SetCdsResource(cluster);
- // Wait until xDS server sees NACK.
- do {
- CheckRpcSendFailure();
- } while (balancers_[0]->ads_service()->cds_response_state().state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForCdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -6962,7 +7148,7 @@ TEST_P(CdsTest, LogicalDNSClusterTypeDisabled) {
balancers_[0]->ads_service()->SetCdsResource(cluster);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForCdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -6984,7 +7170,7 @@ TEST_P(CdsTest, AggregateClusterTypeDisabled) {
balancers_[0]->ads_service()->SetCdsResource(cluster);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForCdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -7000,7 +7186,7 @@ TEST_P(CdsTest, UnsupportedClusterType) {
balancers_[0]->ads_service()->SetCdsResource(cluster);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForCdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -7027,7 +7213,7 @@ TEST_P(CdsTest, MultipleBadResources) {
// Send RPC.
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForCdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -7047,7 +7233,7 @@ TEST_P(CdsTest, WrongEdsConfig) {
balancers_[0]->ads_service()->SetCdsResource(cluster);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForCdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -7063,7 +7249,7 @@ TEST_P(CdsTest, WrongLbPolicy) {
balancers_[0]->ads_service()->SetCdsResource(cluster);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForCdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -7079,7 +7265,7 @@ TEST_P(CdsTest, WrongLrsServer) {
balancers_[0]->ads_service()->SetCdsResource(cluster);
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForCdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -7090,7 +7276,6 @@ TEST_P(CdsTest, WrongLrsServer) {
// Tests that ring hash policy that hashes using channel id ensures all RPCs
// to go 1 particular backend.
TEST_P(CdsTest, RingHashChannelIdHashing) {
- gpr_setenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH", "true");
auto cluster = default_cluster_;
cluster.set_lb_policy(Cluster::RING_HASH);
balancers_[0]->ads_service()->SetCdsResource(cluster);
@@ -7116,13 +7301,11 @@ TEST_P(CdsTest, RingHashChannelIdHashing) {
}
}
EXPECT_TRUE(found);
- gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH");
}
// Tests that ring hash policy that hashes using a header value can spread
// RPCs across all the backends.
TEST_P(CdsTest, RingHashHeaderHashing) {
- gpr_setenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH", "true");
auto cluster = default_cluster_;
cluster.set_lb_policy(Cluster::RING_HASH);
balancers_[0]->ads_service()->SetCdsResource(cluster);
@@ -7163,13 +7346,11 @@ TEST_P(CdsTest, RingHashHeaderHashing) {
for (size_t i = 0; i < backends_.size(); ++i) {
EXPECT_EQ(100, backends_[i]->backend_service()->request_count());
}
- gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH");
}
// Tests that ring hash policy that hashes using a header value and regex
// rewrite to aggregate RPCs to 1 backend.
TEST_P(CdsTest, RingHashHeaderHashingWithRegexRewrite) {
- gpr_setenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH", "true");
auto cluster = default_cluster_;
cluster.set_lb_policy(Cluster::RING_HASH);
balancers_[0]->ads_service()->SetCdsResource(cluster);
@@ -7216,12 +7397,10 @@ TEST_P(CdsTest, RingHashHeaderHashingWithRegexRewrite) {
}
}
EXPECT_TRUE(found);
- gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH");
}
// Tests that ring hash policy that hashes using a random value.
TEST_P(CdsTest, RingHashNoHashPolicy) {
- gpr_setenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH", "true");
const double kDistribution50Percent = 0.5;
const double kErrorTolerance = 0.05;
const uint32_t kRpcTimeoutMs = 10000;
@@ -7249,13 +7428,11 @@ TEST_P(CdsTest, RingHashNoHashPolicy) {
::testing::DoubleNear(kDistribution50Percent, kErrorTolerance));
EXPECT_THAT(static_cast<double>(request_count_2) / kNumRpcs,
::testing::DoubleNear(kDistribution50Percent, kErrorTolerance));
- gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH");
}
// Test that ring hash policy evaluation will continue past the terminal
// policy if no results are produced yet.
TEST_P(CdsTest, RingHashContinuesPastTerminalPolicyThatDoesNotProduceResult) {
- gpr_setenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH", "true");
auto cluster = default_cluster_;
cluster.set_lb_policy(Cluster::RING_HASH);
balancers_[0]->ads_service()->SetCdsResource(cluster);
@@ -7278,13 +7455,11 @@ TEST_P(CdsTest, RingHashContinuesPastTerminalPolicyThatDoesNotProduceResult) {
CheckRpcSendOk(100, rpc_options);
EXPECT_EQ(backends_[0]->backend_service()->request_count(), 100);
EXPECT_EQ(backends_[1]->backend_service()->request_count(), 0);
- gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH");
}
// Test random hash is used when header hashing specified a header field that
// the RPC did not have.
TEST_P(CdsTest, RingHashOnHeaderThatIsNotPresent) {
- gpr_setenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH", "true");
const double kDistribution50Percent = 0.5;
const double kErrorTolerance = 0.05;
const uint32_t kRpcTimeoutMs = 10000;
@@ -7321,13 +7496,11 @@ TEST_P(CdsTest, RingHashOnHeaderThatIsNotPresent) {
::testing::DoubleNear(kDistribution50Percent, kErrorTolerance));
EXPECT_THAT(static_cast<double>(request_count_2) / kNumRpcs,
::testing::DoubleNear(kDistribution50Percent, kErrorTolerance));
- gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH");
}
// Test random hash is used when only unsupported hash policies are
// configured.
TEST_P(CdsTest, RingHashUnsupportedHashPolicyDefaultToRandomHashing) {
- gpr_setenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH", "true");
const double kDistribution50Percent = 0.5;
const double kErrorTolerance = 0.05;
const uint32_t kRpcTimeoutMs = 10000;
@@ -7366,13 +7539,11 @@ TEST_P(CdsTest, RingHashUnsupportedHashPolicyDefaultToRandomHashing) {
::testing::DoubleNear(kDistribution50Percent, kErrorTolerance));
EXPECT_THAT(static_cast<double>(request_count_2) / kNumRpcs,
::testing::DoubleNear(kDistribution50Percent, kErrorTolerance));
- gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH");
}
// Tests that ring hash policy that hashes using a random value can spread
// RPCs across all the backends according to locality weight.
TEST_P(CdsTest, RingHashRandomHashingDistributionAccordingToEndpointWeight) {
- gpr_setenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH", "true");
const size_t kWeight1 = 1;
const size_t kWeight2 = 2;
const size_t kWeightTotal = kWeight1 + kWeight2;
@@ -7408,14 +7579,12 @@ TEST_P(CdsTest, RingHashRandomHashingDistributionAccordingToEndpointWeight) {
::testing::DoubleNear(kWeight33Percent, kErrorTolerance));
EXPECT_THAT(static_cast<double>(weight_66_request_count) / kNumRpcs,
::testing::DoubleNear(kWeight66Percent, kErrorTolerance));
- gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH");
}
// Tests that ring hash policy that hashes using a random value can spread
// RPCs across all the backends according to locality weight.
TEST_P(CdsTest,
RingHashRandomHashingDistributionAccordingToLocalityAndEndpointWeight) {
- gpr_setenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH", "true");
const size_t kWeight1 = 1 * 1;
const size_t kWeight2 = 2 * 2;
const size_t kWeightTotal = kWeight1 + kWeight2;
@@ -7450,7 +7619,6 @@ TEST_P(CdsTest,
::testing::DoubleNear(kWeight20Percent, kErrorTolerance));
EXPECT_THAT(static_cast<double>(weight_80_request_count) / kNumRpcs,
::testing::DoubleNear(kWeight80Percent, kErrorTolerance));
- gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH");
}
// Tests round robin is not implacted by the endpoint weight, and that the
@@ -7500,7 +7668,6 @@ TEST_P(CdsTest, RingHashEndpointWeightDoesNotImpactWeightedRoundRobin) {
// RPCs to go 1 particular backend; and that subsequent hashing policies are
// ignored due to the setting of terminal.
TEST_P(CdsTest, RingHashFixedHashingTerminalPolicy) {
- gpr_setenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH", "true");
auto cluster = default_cluster_;
cluster.set_lb_policy(Cluster::RING_HASH);
balancers_[0]->ads_service()->SetCdsResource(cluster);
@@ -7534,14 +7701,12 @@ TEST_P(CdsTest, RingHashFixedHashingTerminalPolicy) {
}
}
EXPECT_TRUE(found);
- gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH");
}
// Test that the channel will go from idle to ready via connecting;
// (tho it is not possible to catch the connecting state before moving to
// ready)
TEST_P(CdsTest, RingHashIdleToReady) {
- gpr_setenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH", "true");
auto cluster = default_cluster_;
cluster.set_lb_policy(Cluster::RING_HASH);
balancers_[0]->ads_service()->SetCdsResource(cluster);
@@ -7559,13 +7724,11 @@ TEST_P(CdsTest, RingHashIdleToReady) {
EXPECT_EQ(GRPC_CHANNEL_IDLE, channel_->GetState(false));
CheckRpcSendOk();
EXPECT_EQ(GRPC_CHANNEL_READY, channel_->GetState(false));
- gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH");
}
// Test that when the first pick is down leading to a transient failure, we
// will move on to the next ring hash entry.
TEST_P(CdsTest, RingHashTransientFailureCheckNextOne) {
- gpr_setenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH", "true");
auto cluster = default_cluster_;
cluster.set_lb_policy(Cluster::RING_HASH);
balancers_[0]->ads_service()->SetCdsResource(cluster);
@@ -7592,14 +7755,12 @@ TEST_P(CdsTest, RingHashTransientFailureCheckNextOne) {
CheckRpcSendOk(100, rpc_options);
EXPECT_EQ(0, backends_[0]->backend_service()->request_count());
EXPECT_EQ(100, backends_[1]->backend_service()->request_count());
- gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH");
}
// Test that when a backend goes down, we will move on to the next subchannel
// (with a lower priority). When the backend comes back up, traffic will move
// back.
TEST_P(CdsTest, RingHashSwitchToLowerPrioirtyAndThenBack) {
- gpr_setenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH", "true");
auto cluster = default_cluster_;
cluster.set_lb_policy(Cluster::RING_HASH);
balancers_[0]->ads_service()->SetCdsResource(cluster);
@@ -7629,12 +7790,10 @@ TEST_P(CdsTest, RingHashSwitchToLowerPrioirtyAndThenBack) {
CheckRpcSendOk(100, rpc_options);
EXPECT_EQ(100, backends_[0]->backend_service()->request_count());
EXPECT_EQ(0, backends_[1]->backend_service()->request_count());
- gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH");
}
// Test that when all backends are down, we will keep reattempting.
TEST_P(CdsTest, RingHashAllFailReattempt) {
- gpr_setenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH", "true");
const uint32_t kConnectionTimeoutMilliseconds = 5000;
auto cluster = default_cluster_;
cluster.set_lb_policy(Cluster::RING_HASH);
@@ -7655,21 +7814,19 @@ TEST_P(CdsTest, RingHashAllFailReattempt) {
SetNextResolutionForLbChannelAllBalancers();
std::vector<std::pair<std::string, std::string>> metadata = {
{"address_hash", CreateMetadataValueThatHashesToBackend(0)}};
- const auto rpc_options = RpcOptions().set_metadata(std::move(metadata));
EXPECT_EQ(GRPC_CHANNEL_IDLE, channel_->GetState(false));
ShutdownBackend(1);
- CheckRpcSendFailure(1, rpc_options);
+ CheckRpcSendFailure(CheckRpcSendFailureOptions().set_rpc_options(
+ RpcOptions().set_metadata(std::move(metadata))));
StartBackend(1);
// Ensure we are actively connecting without any traffic.
EXPECT_TRUE(channel_->WaitForConnected(
grpc_timeout_milliseconds_to_deadline(kConnectionTimeoutMilliseconds)));
- gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH");
}
// Test that when all backends are down and then up, we may pick a TF backend
// and we will then jump to ready backend.
TEST_P(CdsTest, RingHashTransientFailureSkipToAvailableReady) {
- gpr_setenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH", "true");
const uint32_t kConnectionTimeoutMilliseconds = 5000;
auto cluster = default_cluster_;
cluster.set_lb_policy(Cluster::RING_HASH);
@@ -7697,7 +7854,8 @@ TEST_P(CdsTest, RingHashTransientFailureSkipToAvailableReady) {
EXPECT_EQ(GRPC_CHANNEL_IDLE, channel_->GetState(false));
ShutdownBackend(0);
ShutdownBackend(1);
- CheckRpcSendFailure(1, rpc_options);
+ CheckRpcSendFailure(
+ CheckRpcSendFailureOptions().set_rpc_options(rpc_options));
EXPECT_EQ(GRPC_CHANNEL_TRANSIENT_FAILURE, channel_->GetState(false));
// Bring up 0, should be picked as the RPC is hashed to it.
StartBackend(0);
@@ -7715,18 +7873,17 @@ TEST_P(CdsTest, RingHashTransientFailureSkipToAvailableReady) {
// unused ports to fill the ring, it is almost guaranteed that the Picker
// will go through some non-READY entries and skip them as per design.
ShutdownBackend(0);
- CheckRpcSendFailure(1, rpc_options);
+ CheckRpcSendFailure(
+ CheckRpcSendFailureOptions().set_rpc_options(rpc_options));
StartBackend(1);
EXPECT_TRUE(channel_->WaitForConnected(
grpc_timeout_milliseconds_to_deadline(kConnectionTimeoutMilliseconds)));
WaitForBackend(1, WaitForBackendOptions(), rpc_options);
- gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH");
}
// Test unspported hash policy types are all ignored before a supported
// policy.
TEST_P(CdsTest, RingHashUnsupportedHashPolicyUntilChannelIdHashing) {
- gpr_setenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH", "true");
auto cluster = default_cluster_;
cluster.set_lb_policy(Cluster::RING_HASH);
balancers_[0]->ads_service()->SetCdsResource(cluster);
@@ -7760,13 +7917,11 @@ TEST_P(CdsTest, RingHashUnsupportedHashPolicyUntilChannelIdHashing) {
}
}
EXPECT_TRUE(found);
- gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH");
}
// Test we nack when ring hash policy has invalid hash function (something
// other than XX_HASH.
TEST_P(CdsTest, RingHashPolicyHasInvalidHashFunction) {
- gpr_setenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH", "true");
auto cluster = default_cluster_;
cluster.set_lb_policy(Cluster::RING_HASH);
cluster.mutable_ring_hash_lb_config()->set_hash_function(
@@ -7783,19 +7938,17 @@ TEST_P(CdsTest, RingHashPolicyHasInvalidHashFunction) {
balancers_[0]->ads_service()->SetEdsResource(
BuildEdsResource(args, DefaultEdsServiceName()));
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForCdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(
response_state.error_message,
::testing::HasSubstr("ring hash lb config has invalid hash function."));
- gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH");
}
// Test we nack when ring hash policy has invalid ring size.
TEST_P(CdsTest, RingHashPolicyHasInvalidMinimumRingSize) {
- gpr_setenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH", "true");
auto cluster = default_cluster_;
cluster.set_lb_policy(Cluster::RING_HASH);
cluster.mutable_ring_hash_lb_config()->mutable_minimum_ring_size()->set_value(
@@ -7812,19 +7965,17 @@ TEST_P(CdsTest, RingHashPolicyHasInvalidMinimumRingSize) {
balancers_[0]->ads_service()->SetEdsResource(
BuildEdsResource(args, DefaultEdsServiceName()));
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForCdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(response_state.error_message,
::testing::HasSubstr(
"min_ring_size is not in the range of 1 to 8388608."));
- gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH");
}
// Test we nack when ring hash policy has invalid ring size.
TEST_P(CdsTest, RingHashPolicyHasInvalidMaxmumRingSize) {
- gpr_setenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH", "true");
auto cluster = default_cluster_;
cluster.set_lb_policy(Cluster::RING_HASH);
cluster.mutable_ring_hash_lb_config()->mutable_maximum_ring_size()->set_value(
@@ -7841,19 +7992,17 @@ TEST_P(CdsTest, RingHashPolicyHasInvalidMaxmumRingSize) {
balancers_[0]->ads_service()->SetEdsResource(
BuildEdsResource(args, DefaultEdsServiceName()));
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForCdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(response_state.error_message,
::testing::HasSubstr(
"max_ring_size is not in the range of 1 to 8388608."));
- gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH");
}
// Test we nack when ring hash policy has invalid ring size.
TEST_P(CdsTest, RingHashPolicyHasInvalidRingSizeMinGreaterThanMax) {
- gpr_setenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH", "true");
auto cluster = default_cluster_;
cluster.set_lb_policy(Cluster::RING_HASH);
cluster.mutable_ring_hash_lb_config()->mutable_maximum_ring_size()->set_value(
@@ -7872,14 +8021,13 @@ TEST_P(CdsTest, RingHashPolicyHasInvalidRingSizeMinGreaterThanMax) {
balancers_[0]->ads_service()->SetEdsResource(
BuildEdsResource(args, DefaultEdsServiceName()));
SetNextResolutionForLbChannelAllBalancers();
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForCdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
EXPECT_THAT(response_state.error_message,
::testing::HasSubstr(
"min_ring_size cannot be greater than max_ring_size."));
- gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH");
}
class XdsSecurityTest : public BasicTest {
@@ -8036,13 +8184,27 @@ class XdsSecurityTest : public BasicTest {
std::vector<std::string> fallback_authenticated_identity_;
};
+TEST_P(XdsSecurityTest, UnknownTransportSocket) {
+ auto cluster = default_cluster_;
+ auto* transport_socket = cluster.mutable_transport_socket();
+ transport_socket->set_name("unknown_transport_socket");
+ balancers_[0]->ads_service()->SetCdsResource(cluster);
+ ASSERT_TRUE(WaitForCdsNack()) << "timed out waiting for NACK";
+ const auto response_state =
+ balancers_[0]->ads_service()->cds_response_state();
+ EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr(
+ "Unrecognized transport socket: unknown_transport_socket"));
+}
+
TEST_P(XdsSecurityTest,
TLSConfigurationWithoutValidationContextCertificateProviderInstance) {
auto cluster = default_cluster_;
auto* transport_socket = cluster.mutable_transport_socket();
transport_socket->set_name("envoy.transport_sockets.tls");
balancers_[0]->ads_service()->SetCdsResource(cluster);
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForCdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -8065,7 +8227,7 @@ TEST_P(
*validation_context->add_match_subject_alt_names() = server_san_exact_;
transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
balancers_[0]->ads_service()->SetCdsResource(cluster);
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForCdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -8084,10 +8246,10 @@ TEST_P(
UpstreamTlsContext upstream_tls_context;
upstream_tls_context.mutable_common_tls_context()
->mutable_tls_certificate_certificate_provider_instance()
- ->set_instance_name(std::string("instance_name"));
+ ->set_instance_name(std::string("fake_plugin1"));
transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
balancers_[0]->ads_service()->SetCdsResource(cluster);
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForCdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -8117,7 +8279,7 @@ TEST_P(XdsSecurityTest, RegexSanMatcherDoesNotAllowIgnoreCase) {
*validation_context->add_match_subject_alt_names() = matcher;
transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
balancers_[0]->ads_service()->SetCdsResource(cluster);
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForCdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -8137,7 +8299,13 @@ TEST_P(XdsSecurityTest, UnknownRootCertificateProvider) {
->set_instance_name("unknown");
transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
balancers_[0]->ads_service()->SetCdsResource(cluster);
- CheckRpcSendFailure(1, RpcOptions(), StatusCode::UNAVAILABLE);
+ ASSERT_TRUE(WaitForCdsNack()) << "timed out waiting for NACK";
+ const auto response_state =
+ balancers_[0]->ads_service()->cds_response_state();
+ EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr(
+ "Unrecognized certificate provider instance name: unknown"));
}
TEST_P(XdsSecurityTest, UnknownIdentityCertificateProvider) {
@@ -8157,7 +8325,13 @@ TEST_P(XdsSecurityTest, UnknownIdentityCertificateProvider) {
->set_instance_name("fake_plugin1");
transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
balancers_[0]->ads_service()->SetCdsResource(cluster);
- CheckRpcSendFailure(1, RpcOptions(), StatusCode::UNAVAILABLE);
+ ASSERT_TRUE(WaitForCdsNack()) << "timed out waiting for NACK";
+ const auto response_state =
+ balancers_[0]->ads_service()->cds_response_state();
+ EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr(
+ "Unrecognized certificate provider instance name: unknown"));
g_fake1_cert_data_map = nullptr;
}
@@ -8543,10 +8717,7 @@ TEST_P(XdsEnabledServerTest, BadLdsUpdateNoApiListenerNorAddress) {
listener.add_filter_chains()->add_filters()->mutable_typed_config()->PackFrom(
HttpConnectionManager());
balancers_[0]->ads_service()->SetLdsResource(listener);
- do {
- CheckRpcSendFailure();
- } while (balancers_[0]->ads_service()->lds_response_state().state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForLdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->lds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -8570,10 +8741,7 @@ TEST_P(XdsEnabledServerTest, BadLdsUpdateBothApiListenerAndAddress) {
HttpConnectionManager());
listener.mutable_api_listener();
balancers_[0]->ads_service()->SetLdsResource(listener);
- do {
- CheckRpcSendFailure();
- } while (balancers_[0]->ads_service()->lds_response_state().state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForLdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->lds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -8594,10 +8762,7 @@ TEST_P(XdsEnabledServerTest, UnsupportedL4Filter) {
backends_[0]->port());
listener.add_filter_chains()->add_filters()->mutable_typed_config()->PackFrom(default_listener_ /* any proto object other than HttpConnectionManager */);
balancers_[0]->ads_service()->SetLdsResource(listener);
- do {
- CheckRpcSendFailure();
- } while (balancers_[0]->ads_service()->lds_response_state().state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForLdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->lds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -8626,10 +8791,7 @@ TEST_P(XdsEnabledServerTest, UnsupportedHttpFilter) {
absl::StrCat("grpc/server?xds.resource.listening_address=[::1]:",
backends_[0]->port()));
balancers_[0]->ads_service()->SetLdsResource(listener);
- do {
- CheckRpcSendFailure();
- } while (balancers_[0]->ads_service()->lds_response_state().state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForLdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->lds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -8652,6 +8814,10 @@ TEST_P(XdsEnabledServerTest, HttpFilterNotSupportedOnServer) {
http_filter->set_name("grpc.testing.client_only_http_filter");
http_filter->mutable_typed_config()->set_type_url(
"grpc.testing.client_only_http_filter");
+ http_filter = http_connection_manager.add_http_filters();
+ http_filter->set_name("router");
+ http_filter->mutable_typed_config()->PackFrom(
+ envoy::extensions::filters::http::router::v3::Router());
listener.add_filter_chains()->add_filters()->mutable_typed_config()->PackFrom(
http_connection_manager);
balancers_[0]->ads_service()->SetLdsResource(listener);
@@ -8659,10 +8825,7 @@ TEST_P(XdsEnabledServerTest, HttpFilterNotSupportedOnServer) {
absl::StrCat("grpc/server?xds.resource.listening_address=[::1]:",
backends_[0]->port()));
balancers_[0]->ads_service()->SetLdsResource(listener);
- do {
- CheckRpcSendFailure();
- } while (balancers_[0]->ads_service()->lds_response_state().state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForLdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->lds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -8739,10 +8902,7 @@ TEST_P(XdsEnabledServerTest, UseOriginalDstNotSupported) {
HttpConnectionManager());
listener.mutable_use_original_dst()->set_value(true);
balancers_[0]->ads_service()->SetLdsResource(listener);
- do {
- CheckRpcSendFailure();
- } while (balancers_[0]->ads_service()->lds_response_state().state ==
- AdsServiceImpl::ResponseState::SENT);
+ ASSERT_TRUE(WaitForLdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->lds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -8985,12 +9145,69 @@ class XdsServerSecurityTest : public XdsEnd2endTest {
std::vector<std::string> client_authenticated_identity_;
};
-TEST_P(XdsServerSecurityTest, TlsConfigurationWithoutRootProviderInstance) {
+TEST_P(XdsServerSecurityTest, UnknownTransportSocket) {
Listener listener;
listener.set_name(
absl::StrCat("grpc/server?xds.resource.listening_address=",
ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()));
+ auto* socket_address = listener.mutable_address()->mutable_socket_address();
+ socket_address->set_address(ipv6_only_ ? "::1" : "127.0.0.1");
+ socket_address->set_port_value(backends_[0]->port());
+ auto* filter_chain = listener.add_filter_chains();
+ filter_chain->add_filters()->mutable_typed_config()->PackFrom(
+ HttpConnectionManager());
+ auto* transport_socket = filter_chain->mutable_transport_socket();
+ transport_socket->set_name("unknown_transport_socket");
+ balancers_[0]->ads_service()->SetLdsResource(listener);
+ ASSERT_TRUE(WaitForLdsNack(StatusCode::DEADLINE_EXCEEDED))
+ << "timed out waiting for NACK";
+ const auto response_state =
+ balancers_[0]->ads_service()->lds_response_state();
+ EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr(
+ "Unrecognized transport socket: unknown_transport_socket"));
+}
+
+TEST_P(
+ XdsServerSecurityTest,
+ NacksRequiringClientCertificateWithoutValidationCertificateProviderInstance) {
+ Listener listener;
+ listener.set_name(
+ absl::StrCat("grpc/server?xds.resource.listening_address=",
+ ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()));
+ auto* socket_address = listener.mutable_address()->mutable_socket_address();
+ socket_address->set_address(ipv6_only_ ? "::1" : "127.0.0.1");
+ socket_address->set_port_value(backends_[0]->port());
+ auto* filter_chain = listener.add_filter_chains();
+ filter_chain->add_filters()->mutable_typed_config()->PackFrom(
+ HttpConnectionManager());
+ auto* transport_socket = filter_chain->mutable_transport_socket();
+ transport_socket->set_name("envoy.transport_sockets.tls");
+ DownstreamTlsContext downstream_tls_context;
+ downstream_tls_context.mutable_common_tls_context()
+ ->mutable_tls_certificate_certificate_provider_instance()
+ ->set_instance_name("fake_plugin1");
+ downstream_tls_context.mutable_require_client_certificate()->set_value(true);
+ transport_socket->mutable_typed_config()->PackFrom(downstream_tls_context);
balancers_[0]->ads_service()->SetLdsResource(listener);
+ ASSERT_TRUE(WaitForLdsNack(StatusCode::DEADLINE_EXCEEDED))
+ << "timed out waiting for NACK";
+ const auto response_state =
+ balancers_[0]->ads_service()->lds_response_state();
+ EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr(
+ "TLS configuration requires client certificates but no "
+ "certificate provider instance specified for validation."));
+}
+
+TEST_P(XdsServerSecurityTest,
+ NacksTlsConfigurationWithoutIdentityProviderInstance) {
+ Listener listener;
+ listener.set_name(
+ absl::StrCat("grpc/server?xds.resource.listening_address=",
+ ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()));
auto* socket_address = listener.mutable_address()->mutable_socket_address();
socket_address->set_address(ipv6_only_ ? "::1" : "127.0.0.1");
socket_address->set_port_value(backends_[0]->port());
@@ -9002,7 +9219,8 @@ TEST_P(XdsServerSecurityTest, TlsConfigurationWithoutRootProviderInstance) {
DownstreamTlsContext downstream_tls_context;
transport_socket->mutable_typed_config()->PackFrom(downstream_tls_context);
balancers_[0]->ads_service()->SetLdsResource(listener);
- CheckRpcSendFailure(1, RpcOptions().set_wait_for_ready(true));
+ ASSERT_TRUE(WaitForLdsNack(StatusCode::DEADLINE_EXCEEDED))
+ << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->lds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -9016,13 +9234,35 @@ TEST_P(XdsServerSecurityTest, UnknownIdentityCertificateProvider) {
SetLdsUpdate("", "", "unknown", "", false);
SendRpc([this]() { return CreateTlsChannel(); }, {}, {},
true /* test_expects_failure */);
+ ASSERT_TRUE(WaitForLdsNack(StatusCode::DEADLINE_EXCEEDED))
+ << "timed out waiting for NACK";
+ const auto response_state =
+ balancers_[0]->ads_service()->lds_response_state();
+ EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr(
+ "Unrecognized certificate provider instance name: unknown"));
}
TEST_P(XdsServerSecurityTest, UnknownRootCertificateProvider) {
FakeCertificateProvider::CertDataMap fake1_cert_map = {
{"", {root_cert_, identity_pair_}}};
SetLdsUpdate("unknown", "", "fake_plugin1", "", false);
- SendRpc([this]() { return CreateTlsChannel(); }, {}, {},
+ ASSERT_TRUE(WaitForLdsNack(StatusCode::DEADLINE_EXCEEDED))
+ << "timed out waiting for NACK";
+ const auto response_state =
+ balancers_[0]->ads_service()->lds_response_state();
+ EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr(
+ "Unrecognized certificate provider instance name: unknown"));
+}
+
+TEST_P(XdsServerSecurityTest, CertificatesNotAvailable) {
+ FakeCertificateProvider::CertDataMap fake1_cert_map;
+ g_fake1_cert_data_map = &fake1_cert_map;
+ SetLdsUpdate("fake_plugin1", "", "fake_plugin1", "", true);
+ SendRpc([this]() { return CreateMtlsChannel(); }, {}, {},
true /* test_expects_failure */);
}
@@ -9747,7 +9987,7 @@ TEST_P(XdsServerFilterChainMatchTest,
for (int i = 1; i < 65536; i++) {
filter_chain->mutable_filter_chain_match()->add_source_ports(i);
}
- // Add another filter chain with no source prefix range mentioned with a bad
+ // Add another filter chain with no source port mentioned with a bad
// DownstreamTlsContext configuration.
filter_chain = listener.add_filter_chains();
filter_chain->add_filters()->mutable_typed_config()->PackFrom(
@@ -9757,7 +9997,7 @@ TEST_P(XdsServerFilterChainMatchTest,
DownstreamTlsContext downstream_tls_context;
downstream_tls_context.mutable_common_tls_context()
->mutable_tls_certificate_certificate_provider_instance()
- ->set_instance_name("unknown");
+ ->set_instance_name("fake_plugin1");
transport_socket->mutable_typed_config()->PackFrom(downstream_tls_context);
balancers_[0]->ads_service()->SetLdsResource(listener);
// A successful RPC proves that the filter chain with matching source port
@@ -9782,12 +10022,8 @@ TEST_P(XdsServerFilterChainMatchTest, DuplicateMatchNacked) {
filter_chain->add_filters()->mutable_typed_config()->PackFrom(
HttpConnectionManager());
balancers_[0]->ads_service()->SetLdsResource(listener);
- auto initial_time = absl::Now();
- do {
- CheckRpcSendFailure();
- } while (balancers_[0]->ads_service()->lds_response_state().state !=
- AdsServiceImpl::ResponseState::NACKED &&
- initial_time + absl::Seconds(60) > absl::Now());
+ ASSERT_TRUE(WaitForLdsNack(StatusCode::DEADLINE_EXCEEDED))
+ << "timed out waiting for NACK";
EXPECT_THAT(
balancers_[0]->ads_service()->lds_response_state().error_message,
::testing::HasSubstr(
@@ -9827,12 +10063,8 @@ TEST_P(XdsServerFilterChainMatchTest, DuplicateMatchOnPrefixRangesNacked) {
prefix_range->set_address_prefix(ipv6_only_ ? "::1" : "127.0.0.1");
prefix_range->mutable_prefix_len()->set_value(32);
balancers_[0]->ads_service()->SetLdsResource(listener);
- auto initial_time = absl::Now();
- do {
- CheckRpcSendFailure();
- } while (balancers_[0]->ads_service()->lds_response_state().state !=
- AdsServiceImpl::ResponseState::NACKED &&
- initial_time + absl::Seconds(60) > absl::Now());
+ ASSERT_TRUE(WaitForLdsNack(StatusCode::DEADLINE_EXCEEDED))
+ << "timed out waiting for NACK";
if (ipv6_only_) {
EXPECT_THAT(
balancers_[0]->ads_service()->lds_response_state().error_message,
@@ -9872,12 +10104,8 @@ TEST_P(XdsServerFilterChainMatchTest, DuplicateMatchOnTransportProtocolNacked) {
filter_chain->mutable_filter_chain_match()->set_transport_protocol(
"raw_buffer");
balancers_[0]->ads_service()->SetLdsResource(listener);
- auto initial_time = absl::Now();
- do {
- CheckRpcSendFailure();
- } while (balancers_[0]->ads_service()->lds_response_state().state !=
- AdsServiceImpl::ResponseState::NACKED &&
- initial_time + absl::Seconds(60) > absl::Now());
+ ASSERT_TRUE(WaitForLdsNack(StatusCode::DEADLINE_EXCEEDED))
+ << "timed out waiting for NACK";
EXPECT_THAT(
balancers_[0]->ads_service()->lds_response_state().error_message,
::testing::HasSubstr("Duplicate matching rules detected when adding "
@@ -9905,12 +10133,8 @@ TEST_P(XdsServerFilterChainMatchTest, DuplicateMatchOnLocalSourceTypeNacked) {
filter_chain->mutable_filter_chain_match()->set_source_type(
FilterChainMatch::SAME_IP_OR_LOOPBACK);
balancers_[0]->ads_service()->SetLdsResource(listener);
- auto initial_time = absl::Now();
- do {
- CheckRpcSendFailure();
- } while (balancers_[0]->ads_service()->lds_response_state().state !=
- AdsServiceImpl::ResponseState::NACKED &&
- initial_time + absl::Seconds(60) > absl::Now());
+ ASSERT_TRUE(WaitForLdsNack(StatusCode::DEADLINE_EXCEEDED))
+ << "timed out waiting for NACK";
EXPECT_THAT(
balancers_[0]->ads_service()->lds_response_state().error_message,
::testing::HasSubstr("Duplicate matching rules detected when adding "
@@ -9939,12 +10163,8 @@ TEST_P(XdsServerFilterChainMatchTest,
filter_chain->mutable_filter_chain_match()->set_source_type(
FilterChainMatch::EXTERNAL);
balancers_[0]->ads_service()->SetLdsResource(listener);
- auto initial_time = absl::Now();
- do {
- CheckRpcSendFailure();
- } while (balancers_[0]->ads_service()->lds_response_state().state !=
- AdsServiceImpl::ResponseState::NACKED &&
- initial_time + absl::Seconds(60) > absl::Now());
+ ASSERT_TRUE(WaitForLdsNack(StatusCode::DEADLINE_EXCEEDED))
+ << "timed out waiting for NACK";
EXPECT_THAT(
balancers_[0]->ads_service()->lds_response_state().error_message,
::testing::HasSubstr("Duplicate matching rules detected when adding "
@@ -9985,12 +10205,8 @@ TEST_P(XdsServerFilterChainMatchTest,
prefix_range->set_address_prefix(ipv6_only_ ? "::1" : "127.0.0.1");
prefix_range->mutable_prefix_len()->set_value(32);
balancers_[0]->ads_service()->SetLdsResource(listener);
- auto initial_time = absl::Now();
- do {
- CheckRpcSendFailure();
- } while (balancers_[0]->ads_service()->lds_response_state().state !=
- AdsServiceImpl::ResponseState::NACKED &&
- initial_time + absl::Seconds(60) > absl::Now());
+ ASSERT_TRUE(WaitForLdsNack(StatusCode::DEADLINE_EXCEEDED))
+ << "timed out waiting for NACK";
if (ipv6_only_) {
EXPECT_THAT(
balancers_[0]->ads_service()->lds_response_state().error_message,
@@ -10028,12 +10244,8 @@ TEST_P(XdsServerFilterChainMatchTest, DuplicateMatchOnSourcePortNacked) {
HttpConnectionManager());
filter_chain->mutable_filter_chain_match()->add_source_ports(8080);
balancers_[0]->ads_service()->SetLdsResource(listener);
- auto initial_time = absl::Now();
- do {
- CheckRpcSendFailure();
- } while (balancers_[0]->ads_service()->lds_response_state().state !=
- AdsServiceImpl::ResponseState::NACKED &&
- initial_time + absl::Seconds(60) > absl::Now());
+ ASSERT_TRUE(WaitForLdsNack(StatusCode::DEADLINE_EXCEEDED))
+ << "timed out waiting for NACK";
EXPECT_THAT(
balancers_[0]->ads_service()->lds_response_state().error_message,
::testing::HasSubstr("Duplicate matching rules detected when adding "
@@ -10051,7 +10263,7 @@ TEST_P(EdsTest, NacksSparsePriorityList) {
{"locality0", CreateEndpointsForBackends(), kDefaultLocalityWeight, 1},
});
balancers_[0]->ads_service()->SetEdsResource(BuildEdsResource(args));
- CheckRpcSendFailure();
+ ASSERT_TRUE(WaitForEdsNack()) << "timed out waiting for NACK";
const auto response_state =
balancers_[0]->ads_service()->eds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
@@ -10634,7 +10846,7 @@ TEST_P(DropTest, Vanilla) {
EchoResponse response;
const Status status = SendRpc(RpcOptions(), &response);
if (!status.ok() &&
- status.error_message() == "Call dropped by load balancing policy") {
+ absl::StartsWith(status.error_message(), "EDS-configured drop: ")) {
++num_drops;
} else {
EXPECT_TRUE(status.ok()) << "code=" << status.error_code()
@@ -10671,7 +10883,7 @@ TEST_P(DropTest, DropPerHundred) {
EchoResponse response;
const Status status = SendRpc(RpcOptions(), &response);
if (!status.ok() &&
- status.error_message() == "Call dropped by load balancing policy") {
+ absl::StartsWith(status.error_message(), "EDS-configured drop: ")) {
++num_drops;
} else {
EXPECT_TRUE(status.ok()) << "code=" << status.error_code()
@@ -10708,7 +10920,7 @@ TEST_P(DropTest, DropPerTenThousand) {
EchoResponse response;
const Status status = SendRpc(RpcOptions(), &response);
if (!status.ok() &&
- status.error_message() == "Call dropped by load balancing policy") {
+ absl::StartsWith(status.error_message(), "EDS-configured drop: ")) {
++num_drops;
} else {
EXPECT_TRUE(status.ok()) << "code=" << status.error_code()
@@ -10752,7 +10964,7 @@ TEST_P(DropTest, Update) {
EchoResponse response;
const Status status = SendRpc(RpcOptions(), &response);
if (!status.ok() &&
- status.error_message() == "Call dropped by load balancing policy") {
+ absl::StartsWith(status.error_message(), "EDS-configured drop: ")) {
++num_drops;
} else {
EXPECT_TRUE(status.ok()) << "code=" << status.error_code()
@@ -10782,7 +10994,7 @@ TEST_P(DropTest, Update) {
const Status status = SendRpc(RpcOptions(), &response);
++num_rpcs;
if (!status.ok() &&
- status.error_message() == "Call dropped by load balancing policy") {
+ absl::StartsWith(status.error_message(), "EDS-configured drop: ")) {
++num_drops;
} else {
EXPECT_TRUE(status.ok()) << "code=" << status.error_code()
@@ -10798,7 +11010,7 @@ TEST_P(DropTest, Update) {
EchoResponse response;
const Status status = SendRpc(RpcOptions(), &response);
if (!status.ok() &&
- status.error_message() == "Call dropped by load balancing policy") {
+ absl::StartsWith(status.error_message(), "EDS-configured drop: ")) {
++num_drops;
} else {
EXPECT_TRUE(status.ok()) << "code=" << status.error_code()
@@ -10832,7 +11044,8 @@ TEST_P(DropTest, DropAll) {
EchoResponse response;
const Status status = SendRpc(RpcOptions(), &response);
EXPECT_EQ(status.error_code(), StatusCode::UNAVAILABLE);
- EXPECT_EQ(status.error_message(), "Call dropped by load balancing policy");
+ EXPECT_THAT(status.error_message(),
+ ::testing::StartsWith("EDS-configured drop: "));
}
}
@@ -11080,8 +11293,9 @@ TEST_P(ClientLoadReportingTest, Vanilla) {
std::tie(num_ok, num_failure, num_drops) = WaitForAllBackends();
// Send kNumRpcsPerAddress RPCs per server.
CheckRpcSendOk(kNumRpcsPerAddress * num_backends_);
- CheckRpcSendFailure(kNumFailuresPerAddress * num_backends_,
- RpcOptions().set_server_fail(true));
+ CheckRpcSendFailure(CheckRpcSendFailureOptions()
+ .set_times(kNumFailuresPerAddress * num_backends_)
+ .set_rpc_options(RpcOptions().set_server_fail(true)));
// Check that each backend got the right number of requests.
for (size_t i = 0; i < backends_.size(); ++i) {
EXPECT_EQ(kNumRpcsPerAddress + kNumFailuresPerAddress,
@@ -11127,8 +11341,9 @@ TEST_P(ClientLoadReportingTest, SendAllClusters) {
std::tie(num_ok, num_failure, num_drops) = WaitForAllBackends();
// Send kNumRpcsPerAddress RPCs per server.
CheckRpcSendOk(kNumRpcsPerAddress * num_backends_);
- CheckRpcSendFailure(kNumFailuresPerAddress * num_backends_,
- RpcOptions().set_server_fail(true));
+ CheckRpcSendFailure(CheckRpcSendFailureOptions()
+ .set_times(kNumFailuresPerAddress * num_backends_)
+ .set_rpc_options(RpcOptions().set_server_fail(true)));
// Check that each backend got the right number of requests.
for (size_t i = 0; i < backends_.size(); ++i) {
EXPECT_EQ(kNumRpcsPerAddress + kNumFailuresPerAddress,
@@ -11297,7 +11512,7 @@ TEST_P(ClientLoadReportingWithDropTest, Vanilla) {
EchoResponse response;
const Status status = SendRpc(RpcOptions(), &response);
if (!status.ok() &&
- status.error_message() == "Call dropped by load balancing policy") {
+ absl::StartsWith(status.error_message(), "EDS-configured drop: ")) {
++num_drops;
} else {
EXPECT_TRUE(status.ok()) << "code=" << status.error_code()
@@ -11401,8 +11616,11 @@ TEST_P(FaultInjectionTest, XdsFaultInjectionAlwaysAbort) {
// Config fault injection via different setup
SetFilterConfig(http_fault);
// Fire several RPCs, and expect all of them to be aborted.
- CheckRpcSendFailure(5, RpcOptions().set_wait_for_ready(true),
- StatusCode::ABORTED);
+ CheckRpcSendFailure(
+ CheckRpcSendFailureOptions()
+ .set_times(5)
+ .set_rpc_options(RpcOptions().set_wait_for_ready(true))
+ .set_expected_error_code(StatusCode::ABORTED));
}
// Without the listener config, the fault injection won't be enabled.
@@ -11514,6 +11732,7 @@ TEST_P(FaultInjectionTest, XdsFaultInjectionPercentageDelay) {
const double kDelayRate = kDelayPercentagePerHundred / 100.0;
const double kErrorTolerance = 0.05;
const size_t kNumRpcs = ComputeIdealNumRpcs(kDelayRate, kErrorTolerance);
+ const size_t kMaxConcurrentRequests = kNumRpcs;
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
// Create an EDS resource
@@ -11522,6 +11741,12 @@ TEST_P(FaultInjectionTest, XdsFaultInjectionPercentageDelay) {
});
balancers_[0]->ads_service()->SetEdsResource(
BuildEdsResource(args, DefaultEdsServiceName()));
+ // Loosen the max concurrent request limit
+ Cluster cluster = default_cluster_;
+ auto* threshold = cluster.mutable_circuit_breakers()->add_thresholds();
+ threshold->set_priority(RoutingPriority::DEFAULT);
+ threshold->mutable_max_requests()->set_value(kMaxConcurrentRequests);
+ balancers_[0]->ads_service()->SetCdsResource(cluster);
// Construct the fault injection filter config
HTTPFault http_fault;
auto* delay_percentage = http_fault.mutable_delay()->mutable_percentage();
@@ -11557,6 +11782,7 @@ TEST_P(FaultInjectionTest, XdsFaultInjectionPercentageDelayViaHeaders) {
const double kDelayRate = kDelayPercentage / 100.0;
const double kErrorTolerance = 0.05;
const size_t kNumRpcs = ComputeIdealNumRpcs(kDelayRate, kErrorTolerance);
+ const size_t kMaxConcurrentRequests = kNumRpcs;
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
// Create an EDS resource
@@ -11565,6 +11791,12 @@ TEST_P(FaultInjectionTest, XdsFaultInjectionPercentageDelayViaHeaders) {
});
balancers_[0]->ads_service()->SetEdsResource(
BuildEdsResource(args, DefaultEdsServiceName()));
+ // Loosen the max concurrent request limit
+ Cluster cluster = default_cluster_;
+ auto* threshold = cluster.mutable_circuit_breakers()->add_thresholds();
+ threshold->set_priority(RoutingPriority::DEFAULT);
+ threshold->mutable_max_requests()->set_value(kMaxConcurrentRequests);
+ balancers_[0]->ads_service()->SetCdsResource(cluster);
// Construct the fault injection filter config
HTTPFault http_fault;
http_fault.mutable_delay()->mutable_header_delay();
@@ -11605,6 +11837,7 @@ TEST_P(FaultInjectionTest, XdsFaultInjectionAlwaysDelayPercentageAbort) {
10 * 1000; // 10s should not reach
const double kErrorTolerance = 0.05;
const size_t kNumRpcs = ComputeIdealNumRpcs(kAbortRate, kErrorTolerance);
+ const size_t kMaxConcurrentRequests = kNumRpcs;
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
// Create an EDS resource
@@ -11613,6 +11846,12 @@ TEST_P(FaultInjectionTest, XdsFaultInjectionAlwaysDelayPercentageAbort) {
});
balancers_[0]->ads_service()->SetEdsResource(
BuildEdsResource(args, DefaultEdsServiceName()));
+ // Loosen the max concurrent request limit
+ Cluster cluster = default_cluster_;
+ auto* threshold = cluster.mutable_circuit_breakers()->add_thresholds();
+ threshold->set_priority(RoutingPriority::DEFAULT);
+ threshold->mutable_max_requests()->set_value(kMaxConcurrentRequests);
+ balancers_[0]->ads_service()->SetCdsResource(cluster);
// Construct the fault injection filter config
HTTPFault http_fault;
auto* abort_percentage = http_fault.mutable_abort()->mutable_percentage();
@@ -11662,6 +11901,7 @@ TEST_P(FaultInjectionTest,
10 * 1000; // 10s should not reach
const double kErrorTolerance = 0.05;
const size_t kNumRpcs = ComputeIdealNumRpcs(kAbortRate, kErrorTolerance);
+ const size_t kMaxConcurrentRequests = kNumRpcs;
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
// Create an EDS resource
@@ -11670,6 +11910,12 @@ TEST_P(FaultInjectionTest,
});
balancers_[0]->ads_service()->SetEdsResource(
BuildEdsResource(args, DefaultEdsServiceName()));
+ // Loosen the max concurrent request limit
+ Cluster cluster = default_cluster_;
+ auto* threshold = cluster.mutable_circuit_breakers()->add_thresholds();
+ threshold->set_priority(RoutingPriority::DEFAULT);
+ threshold->mutable_max_requests()->set_value(kMaxConcurrentRequests);
+ balancers_[0]->ads_service()->SetCdsResource(cluster);
// Construct the fault injection filter config
HTTPFault http_fault;
auto* abort_percentage = http_fault.mutable_abort()->mutable_percentage();
@@ -11746,6 +11992,74 @@ TEST_P(FaultInjectionTest, XdsFaultInjectionMaxFault) {
EXPECT_EQ(kMaxFault, num_delayed);
}
+TEST_P(FaultInjectionTest, XdsFaultInjectionBidiStreamDelayOk) {
+ // kRpcTimeoutMilliseconds is 10s should never be reached.
+ const uint32_t kRpcTimeoutMilliseconds = grpc_test_slowdown_factor() * 10000;
+ const uint32_t kFixedDelaySeconds = 1;
+ const uint32_t kDelayPercentagePerHundred = 100;
+ SetNextResolution({});
+ SetNextResolutionForLbChannelAllBalancers();
+ // Create an EDS resource
+ AdsServiceImpl::EdsResourceArgs args({
+ {"locality0", CreateEndpointsForBackends()},
+ });
+ balancers_[0]->ads_service()->SetEdsResource(
+ BuildEdsResource(args, DefaultEdsServiceName()));
+ // Construct the fault injection filter config
+ HTTPFault http_fault;
+ auto* delay_percentage = http_fault.mutable_delay()->mutable_percentage();
+ delay_percentage->set_numerator(kDelayPercentagePerHundred);
+ delay_percentage->set_denominator(FractionalPercent::HUNDRED);
+ auto* fixed_delay = http_fault.mutable_delay()->mutable_fixed_delay();
+ fixed_delay->set_seconds(kFixedDelaySeconds);
+ // Config fault injection via different setup
+ SetFilterConfig(http_fault);
+ ClientContext context;
+ context.set_deadline(
+ grpc_timeout_milliseconds_to_deadline(kRpcTimeoutMilliseconds));
+ auto stream = stub_->BidiStream(&context);
+ stream->WritesDone();
+ auto status = stream->Finish();
+ EXPECT_TRUE(status.ok()) << status.error_message() << ", "
+ << status.error_details() << ", "
+ << context.debug_error_string();
+}
+
+// This case catches a bug in the retry code that was triggered by a bad
+// interaction with the FI code. See https://github.com/grpc/grpc/pull/27217
+// for description.
+TEST_P(FaultInjectionTest, XdsFaultInjectionBidiStreamDelayError) {
+ const uint32_t kRpcTimeoutMilliseconds = grpc_test_slowdown_factor() * 500;
+ const uint32_t kFixedDelaySeconds = 100;
+ const uint32_t kDelayPercentagePerHundred = 100;
+ SetNextResolution({});
+ SetNextResolutionForLbChannelAllBalancers();
+ // Create an EDS resource
+ AdsServiceImpl::EdsResourceArgs args({
+ {"locality0", CreateEndpointsForBackends()},
+ });
+ balancers_[0]->ads_service()->SetEdsResource(
+ BuildEdsResource(args, DefaultEdsServiceName()));
+ // Construct the fault injection filter config
+ HTTPFault http_fault;
+ auto* delay_percentage = http_fault.mutable_delay()->mutable_percentage();
+ delay_percentage->set_numerator(kDelayPercentagePerHundred);
+ delay_percentage->set_denominator(FractionalPercent::HUNDRED);
+ auto* fixed_delay = http_fault.mutable_delay()->mutable_fixed_delay();
+ fixed_delay->set_seconds(kFixedDelaySeconds);
+ // Config fault injection via different setup
+ SetFilterConfig(http_fault);
+ ClientContext context;
+ context.set_deadline(
+ grpc_timeout_milliseconds_to_deadline(kRpcTimeoutMilliseconds));
+ auto stream = stub_->BidiStream(&context);
+ stream->WritesDone();
+ auto status = stream->Finish();
+ EXPECT_EQ(StatusCode::DEADLINE_EXCEEDED, status.error_code())
+ << status.error_message() << ", " << status.error_details() << ", "
+ << context.debug_error_string();
+}
+
class BootstrapSourceTest : public XdsEnd2endTest {
public:
BootstrapSourceTest() : XdsEnd2endTest(4, 1) {}
@@ -12388,8 +12702,10 @@ TEST_P(ClientStatusDiscoveryServiceTest, XdsConfigDumpEndpointError) {
TEST_P(ClientStatusDiscoveryServiceTest, XdsConfigDumpListenerRequested) {
int kTimeoutMillisecond = 1000;
balancers_[0]->ads_service()->UnsetResource(kLdsTypeUrl, kServerName);
- CheckRpcSendFailure(1, RpcOptions().set_timeout_ms(kTimeoutMillisecond),
- StatusCode::DEADLINE_EXCEEDED);
+ CheckRpcSendFailure(
+ CheckRpcSendFailureOptions()
+ .set_rpc_options(RpcOptions().set_timeout_ms(kTimeoutMillisecond))
+ .set_expected_error_code(StatusCode::DEADLINE_EXCEEDED));
auto csds_response = FetchCsdsResponse();
EXPECT_THAT(csds_response.config(0).xds_config(),
::testing::Contains(::testing::Property(
@@ -12422,8 +12738,10 @@ TEST_P(ClientStatusDiscoveryServiceTest, XdsConfigDumpClusterRequested) {
routes2->mutable_route()->set_cluster(kClusterName2);
SetRouteConfiguration(0, route_config);
// Try to get the configs plumb through
- CheckRpcSendFailure(1, RpcOptions().set_timeout_ms(kTimeoutMillisecond),
- StatusCode::DEADLINE_EXCEEDED);
+ CheckRpcSendFailure(
+ CheckRpcSendFailureOptions()
+ .set_rpc_options(RpcOptions().set_timeout_ms(kTimeoutMillisecond))
+ .set_expected_error_code(StatusCode::DEADLINE_EXCEEDED));
auto csds_response = FetchCsdsResponse();
EXPECT_THAT(csds_response.config(0).xds_config(),
::testing::Contains(::testing::Property(
@@ -12450,8 +12768,10 @@ class CsdsShortAdsTimeoutTest : public ClientStatusDiscoveryServiceTest {
TEST_P(CsdsShortAdsTimeoutTest, XdsConfigDumpListenerDoesNotExist) {
int kTimeoutMillisecond = 1000000; // 1000s wait for the transient failure.
balancers_[0]->ads_service()->UnsetResource(kLdsTypeUrl, kServerName);
- CheckRpcSendFailure(1, RpcOptions().set_timeout_ms(kTimeoutMillisecond),
- grpc::UNAVAILABLE);
+ CheckRpcSendFailure(
+ CheckRpcSendFailureOptions()
+ .set_rpc_options(RpcOptions().set_timeout_ms(kTimeoutMillisecond))
+ .set_expected_error_code(grpc::UNAVAILABLE));
auto csds_response = FetchCsdsResponse();
EXPECT_THAT(csds_response.config(0).xds_config(),
::testing::Contains(::testing::Property(
@@ -12470,8 +12790,10 @@ TEST_P(CsdsShortAdsTimeoutTest, XdsConfigDumpRouteConfigDoesNotExist) {
SetNextResolutionForLbChannelAllBalancers();
balancers_[0]->ads_service()->UnsetResource(kRdsTypeUrl,
kDefaultRouteConfigurationName);
- CheckRpcSendFailure(1, RpcOptions().set_timeout_ms(kTimeoutMillisecond),
- grpc::UNAVAILABLE);
+ CheckRpcSendFailure(
+ CheckRpcSendFailureOptions()
+ .set_rpc_options(RpcOptions().set_timeout_ms(kTimeoutMillisecond))
+ .set_expected_error_code(grpc::UNAVAILABLE));
auto csds_response = FetchCsdsResponse();
EXPECT_THAT(
csds_response.config(0).xds_config(),
@@ -12488,8 +12810,10 @@ TEST_P(CsdsShortAdsTimeoutTest, XdsConfigDumpClusterDoesNotExist) {
SetNextResolution({});
SetNextResolutionForLbChannelAllBalancers();
balancers_[0]->ads_service()->UnsetResource(kCdsTypeUrl, kDefaultClusterName);
- CheckRpcSendFailure(1, RpcOptions().set_timeout_ms(kTimeoutMillisecond),
- grpc::UNAVAILABLE);
+ CheckRpcSendFailure(
+ CheckRpcSendFailureOptions()
+ .set_rpc_options(RpcOptions().set_timeout_ms(kTimeoutMillisecond))
+ .set_expected_error_code(grpc::UNAVAILABLE));
auto csds_response = FetchCsdsResponse();
EXPECT_THAT(csds_response.config(0).xds_config(),
::testing::Contains(::testing::Property(
@@ -12507,8 +12831,10 @@ TEST_P(CsdsShortAdsTimeoutTest, XdsConfigDumpEndpointDoesNotExist) {
SetNextResolutionForLbChannelAllBalancers();
balancers_[0]->ads_service()->UnsetResource(kEdsTypeUrl,
kDefaultEdsServiceName);
- CheckRpcSendFailure(1, RpcOptions().set_timeout_ms(kTimeoutMillisecond),
- grpc::UNAVAILABLE);
+ CheckRpcSendFailure(
+ CheckRpcSendFailureOptions()
+ .set_rpc_options(RpcOptions().set_timeout_ms(kTimeoutMillisecond))
+ .set_expected_error_code(grpc::UNAVAILABLE));
auto csds_response = FetchCsdsResponse();
EXPECT_THAT(
csds_response.config(0).xds_config(),
diff --git a/test/cpp/ext/filters/census/stats_plugin_end2end_test.cc b/test/cpp/ext/filters/census/stats_plugin_end2end_test.cc
index 8ad46dd9c3..74ab36574a 100644
--- a/test/cpp/ext/filters/census/stats_plugin_end2end_test.cc
+++ b/test/cpp/ext/filters/census/stats_plugin_end2end_test.cc
@@ -31,6 +31,7 @@
#include "opencensus/stats/testing/test_utils.h"
#include "opencensus/tags/tag_map.h"
#include "opencensus/tags/with_tag_map.h"
+#include "src/cpp/ext/filters/census/context.h"
#include "src/cpp/ext/filters/census/grpc_plugin.h"
#include "src/proto/grpc/testing/echo.grpc.pb.h"
#include "test/core/util/test_config.h"
@@ -49,11 +50,23 @@ using ::opencensus::tags::WithTagMap;
static const auto TEST_TAG_KEY = TagKey::Register("my_key");
static const auto TEST_TAG_VALUE = "my_value";
+const char* kExpectedTraceIdKey = "expected_trace_id";
class EchoServer final : public EchoTestService::Service {
- ::grpc::Status Echo(::grpc::ServerContext* /*context*/,
+ ::grpc::Status Echo(::grpc::ServerContext* context,
const EchoRequest* request,
EchoResponse* response) override {
+ for (const auto& metadata : context->client_metadata()) {
+ if (metadata.first == kExpectedTraceIdKey) {
+ EXPECT_EQ(metadata.second, reinterpret_cast<const grpc::CensusContext*>(
+ context->census_context())
+ ->Span()
+ .context()
+ .trace_id()
+ .ToHex());
+ break;
+ }
+ }
if (request->param().expected_error().code() == 0) {
response->set_message(request->message());
return ::grpc::Status::OK;
@@ -88,6 +101,10 @@ class StatsPluginEnd2EndTest : public ::testing::Test {
server_address_, ::grpc::InsecureChannelCredentials()));
}
+ void ResetStub(std::shared_ptr<Channel> channel) {
+ stub_ = EchoTestService::NewStub(channel);
+ }
+
void TearDown() override {
server_->Shutdown();
server_thread_.join();
@@ -414,6 +431,121 @@ TEST_F(StatsPluginEnd2EndTest, RequestReceivedMessagesPerRpc) {
}
}
+TEST_F(StatsPluginEnd2EndTest, TestRetryStatsWithoutAdditionalRetries) {
+ View client_retries_cumulative_view(ClientRetriesCumulative());
+ View client_transparent_retries_cumulative_view(
+ ClientTransparentRetriesCumulative());
+ View client_retry_delay_per_call_view(ClientRetryDelayPerCallCumulative());
+ EchoRequest request;
+ request.set_message("foo");
+ EchoResponse response;
+ const int count = 5;
+ for (int i = 0; i < count; ++i) {
+ {
+ ::grpc::ClientContext context;
+ ::grpc::Status status = stub_->Echo(&context, request, &response);
+ ASSERT_TRUE(status.ok());
+ EXPECT_EQ("foo", response.message());
+ }
+ absl::SleepFor(absl::Milliseconds(500));
+ TestUtils::Flush();
+ EXPECT_THAT(
+ client_retries_cumulative_view.GetData().int_data(),
+ ::testing::UnorderedElementsAre(::testing::Pair(
+ ::testing::ElementsAre(client_method_name_), ::testing::Eq(0))));
+ EXPECT_THAT(
+ client_transparent_retries_cumulative_view.GetData().int_data(),
+ ::testing::UnorderedElementsAre(::testing::Pair(
+ ::testing::ElementsAre(client_method_name_), ::testing::Eq(0))));
+ EXPECT_THAT(
+ client_retry_delay_per_call_view.GetData().distribution_data(),
+ ::testing::UnorderedElementsAre(::testing::Pair(
+ ::testing::ElementsAre(client_method_name_),
+ ::testing::Property(&Distribution::mean, ::testing::Eq(0)))));
+ }
+}
+
+TEST_F(StatsPluginEnd2EndTest, TestRetryStatsWithAdditionalRetries) {
+ View client_retries_cumulative_view(ClientRetriesCumulative());
+ View client_transparent_retries_cumulative_view(
+ ClientTransparentRetriesCumulative());
+ View client_retry_delay_per_call_view(ClientRetryDelayPerCallCumulative());
+ ChannelArguments args;
+ args.SetInt(GRPC_ARG_ENABLE_RETRIES, 1);
+ args.SetString(GRPC_ARG_SERVICE_CONFIG,
+ "{\n"
+ " \"methodConfig\": [ {\n"
+ " \"name\": [\n"
+ " { \"service\": \"grpc.testing.EchoTestService\" }\n"
+ " ],\n"
+ " \"retryPolicy\": {\n"
+ " \"maxAttempts\": 3,\n"
+ " \"initialBackoff\": \"0.1s\",\n"
+ " \"maxBackoff\": \"120s\",\n"
+ " \"backoffMultiplier\": 1,\n"
+ " \"retryableStatusCodes\": [ \"ABORTED\" ]\n"
+ " }\n"
+ " } ]\n"
+ "}");
+ auto channel =
+ CreateCustomChannel(server_address_, InsecureChannelCredentials(), args);
+ ResetStub(channel);
+ EchoRequest request;
+ request.mutable_param()->mutable_expected_error()->set_code(
+ StatusCode::ABORTED);
+ request.set_message("foo");
+ EchoResponse response;
+ const int count = 5;
+ for (int i = 0; i < count; ++i) {
+ {
+ ::grpc::ClientContext context;
+ ::grpc::Status status = stub_->Echo(&context, request, &response);
+ EXPECT_EQ(status.error_code(), StatusCode::ABORTED);
+ }
+ absl::SleepFor(absl::Milliseconds(500));
+ TestUtils::Flush();
+ EXPECT_THAT(client_retries_cumulative_view.GetData().int_data(),
+ ::testing::UnorderedElementsAre(
+ ::testing::Pair(::testing::ElementsAre(client_method_name_),
+ ::testing::Eq((i + 1) * 2))));
+ EXPECT_THAT(
+ client_transparent_retries_cumulative_view.GetData().int_data(),
+ ::testing::UnorderedElementsAre(::testing::Pair(
+ ::testing::ElementsAre(client_method_name_), ::testing::Eq(0))));
+ auto data = client_retry_delay_per_call_view.GetData().distribution_data();
+ for (const auto& entry : data) {
+ gpr_log(GPR_ERROR, "Mean Retry Delay %s: %lf ms", entry.first[0].c_str(),
+ entry.second.mean());
+ }
+ // We expect the retry delay to be around 100ms.
+ EXPECT_THAT(
+ client_retry_delay_per_call_view.GetData().distribution_data(),
+ ::testing::UnorderedElementsAre(::testing::Pair(
+ ::testing::ElementsAre(client_method_name_),
+ ::testing::Property(
+ &Distribution::mean,
+ ::testing::AllOf(::testing::Ge(50), ::testing::Le(300))))));
+ }
+}
+
+// Test that CensusContext object set by application is used.
+TEST_F(StatsPluginEnd2EndTest, TestApplicationCensusContextFlows) {
+ auto channel = CreateChannel(server_address_, InsecureChannelCredentials());
+ ResetStub(channel);
+ EchoRequest request;
+ request.set_message("foo");
+ EchoResponse response;
+ ::grpc::ClientContext context;
+ ::grpc::CensusContext app_census_context("root",
+ ::opencensus::tags::TagMap{});
+ context.set_census_context(
+ reinterpret_cast<census_context*>(&app_census_context));
+ context.AddMetadata(kExpectedTraceIdKey,
+ app_census_context.Span().context().trace_id().ToHex());
+ ::grpc::Status status = stub_->Echo(&context, request, &response);
+ EXPECT_TRUE(status.ok());
+}
+
} // namespace
} // namespace testing
} // namespace grpc
diff --git a/test/cpp/interop/xds_interop_client.cc b/test/cpp/interop/xds_interop_client.cc
index f8ced82930..6204538c36 100644
--- a/test/cpp/interop/xds_interop_client.cc
+++ b/test/cpp/interop/xds_interop_client.cc
@@ -465,12 +465,15 @@ class XdsUpdateClientConfigureServiceImpl
void RunTestLoop(std::chrono::duration<double> duration_per_query,
StatsWatchers* stats_watchers,
RpcConfigurationsQueue* rpc_configs_queue) {
+ grpc::ChannelArguments channel_args;
+ channel_args.SetInt(GRPC_ARG_ENABLE_RETRIES, 1);
TestClient client(
- grpc::CreateChannel(absl::GetFlag(FLAGS_server),
- absl::GetFlag(FLAGS_secure_mode)
- ? grpc::experimental::XdsCredentials(
- grpc::InsecureChannelCredentials())
- : grpc::InsecureChannelCredentials()),
+ grpc::CreateCustomChannel(absl::GetFlag(FLAGS_server),
+ absl::GetFlag(FLAGS_secure_mode)
+ ? grpc::experimental::XdsCredentials(
+ grpc::InsecureChannelCredentials())
+ : grpc::InsecureChannelCredentials(),
+ channel_args),
stats_watchers);
std::chrono::time_point<std::chrono::system_clock> start =
std::chrono::system_clock::now();
diff --git a/test/cpp/microbenchmarks/bm_chttp2_hpack.cc b/test/cpp/microbenchmarks/bm_chttp2_hpack.cc
index 1a1de051da..5a29df607d 100644
--- a/test/cpp/microbenchmarks/bm_chttp2_hpack.cc
+++ b/test/cpp/microbenchmarks/bm_chttp2_hpack.cc
@@ -434,17 +434,8 @@ BENCHMARK_TEMPLATE(BM_HpackEncoderEncodeHeader,
static void BM_HpackParserInitDestroy(benchmark::State& state) {
TrackCounters track_counters;
grpc_core::ExecCtx exec_ctx;
- grpc_chttp2_hpack_parser p;
- // Initial destruction so we don't leak memory in the loop.
- grpc_chttp2_hptbl_destroy(&p.table);
for (auto _ : state) {
- grpc_chttp2_hpack_parser_init(&p);
- // Note that grpc_chttp2_hpack_parser_destroy frees the table dynamic
- // elements so we need to recreate it here. In actual operation,
- // new grpc_chttp2_hpack_parser_destroy allocates the table once
- // and for all.
- new (&p.table) grpc_chttp2_hptbl();
- grpc_chttp2_hpack_parser_destroy(&p);
+ { grpc_core::HPackParser(); }
grpc_core::ExecCtx::Get()->Flush();
}
@@ -463,30 +454,33 @@ static void BM_HpackParserParseHeader(benchmark::State& state) {
grpc_core::ExecCtx exec_ctx;
std::vector<grpc_slice> init_slices = Fixture::GetInitSlices();
std::vector<grpc_slice> benchmark_slices = Fixture::GetBenchmarkSlices();
- grpc_chttp2_hpack_parser p;
- grpc_chttp2_hpack_parser_init(&p);
+ grpc_core::HPackParser p;
const int kArenaSize = 4096 * 4096;
- p.on_header_user_data = grpc_core::Arena::Create(kArenaSize);
- p.on_header = OnHeader;
+ auto* arena = grpc_core::Arena::Create(kArenaSize);
+ p.BeginFrame([arena](grpc_mdelem e) { return OnHeader(arena, e); },
+ grpc_core::HPackParser::Boundary::None,
+ grpc_core::HPackParser::Priority::None);
for (auto slice : init_slices) {
- GPR_ASSERT(GRPC_ERROR_NONE == grpc_chttp2_hpack_parser_parse(&p, slice));
+ GPR_ASSERT(GRPC_ERROR_NONE == p.Parse(slice));
}
while (state.KeepRunning()) {
for (auto slice : benchmark_slices) {
- GPR_ASSERT(GRPC_ERROR_NONE == grpc_chttp2_hpack_parser_parse(&p, slice));
+ GPR_ASSERT(GRPC_ERROR_NONE == p.Parse(slice));
}
grpc_core::ExecCtx::Get()->Flush();
// Recreate arena every 4k iterations to avoid oom
if (0 == (state.iterations() & 0xfff)) {
- static_cast<grpc_core::Arena*>(p.on_header_user_data)->Destroy();
- p.on_header_user_data = grpc_core::Arena::Create(kArenaSize);
+ arena->Destroy();
+ arena = grpc_core::Arena::Create(kArenaSize);
+ p.BeginFrame([arena](grpc_mdelem e) { return OnHeader(arena, e); },
+ grpc_core::HPackParser::Boundary::None,
+ grpc_core::HPackParser::Priority::None);
}
}
// Clean up
- static_cast<grpc_core::Arena*>(p.on_header_user_data)->Destroy();
+ arena->Destroy();
for (auto slice : init_slices) grpc_slice_unref(slice);
for (auto slice : benchmark_slices) grpc_slice_unref(slice);
- grpc_chttp2_hpack_parser_destroy(&p);
track_counters.Finish(state);
}
diff --git a/test/cpp/naming/gen_build_yaml.py b/test/cpp/naming/gen_build_yaml.py
index eb278572af..842e624af2 100755
--- a/test/cpp/naming/gen_build_yaml.py
+++ b/test/cpp/naming/gen_build_yaml.py
@@ -14,11 +14,12 @@
# limitations under the License.
"""Generates the appropriate build.json data for all the naming tests."""
-import yaml
import collections
import hashlib
import json
+import yaml
+
_LOCAL_DNS_SERVER_ADDRESS = '127.0.0.1:15353'
diff --git a/test/cpp/naming/resolver_component_tests_runner.py b/test/cpp/naming/resolver_component_tests_runner.py
index 6a1bff3078..fbf0d22183 100755
--- a/test/cpp/naming/resolver_component_tests_runner.py
+++ b/test/cpp/naming/resolver_component_tests_runner.py
@@ -16,14 +16,13 @@
# This file is auto-generated
import argparse
-import sys
+import os
+import platform
+import signal
import subprocess
+import sys
import tempfile
-import os
import time
-import signal
-import platform
-
argp = argparse.ArgumentParser(description='Run c-ares resolver tests')
argp.add_argument('--test_bin_path', default=None, type=str,
diff --git a/test/cpp/naming/utils/dns_resolver.py b/test/cpp/naming/utils/dns_resolver.py
index 53f2301ca6..773f0c1e79 100755
--- a/test/cpp/naming/utils/dns_resolver.py
+++ b/test/cpp/naming/utils/dns_resolver.py
@@ -17,9 +17,10 @@
import argparse
import threading
import time
+
+import twisted.internet.reactor as reactor
import twisted.internet.task as task
import twisted.names.client as client
-import twisted.internet.reactor as reactor
def main():
diff --git a/test/cpp/naming/utils/dns_server.py b/test/cpp/naming/utils/dns_server.py
index d70751f6eb..d4434e4cec 100755
--- a/test/cpp/naming/utils/dns_server.py
+++ b/test/cpp/naming/utils/dns_server.py
@@ -15,26 +15,29 @@
"""Starts a local DNS server for use in tests"""
import argparse
-import sys
-import yaml
-import signal
import os
+import platform
+import signal
+import sys
import threading
import time
import twisted
import twisted.internet
-import twisted.internet.reactor
-import twisted.internet.threads
import twisted.internet.defer
import twisted.internet.protocol
+import twisted.internet.reactor
+import twisted.internet.threads
import twisted.names
+from twisted.names import authority
+from twisted.names import client
+from twisted.names import common
+from twisted.names import dns
+from twisted.names import server
import twisted.names.client
import twisted.names.dns
import twisted.names.server
-from twisted.names import client, server, common, authority, dns
-import argparse
-import platform
+import yaml
_SERVER_HEALTH_CHECK_RECORD_NAME = 'health-check-local-dns-server-is-alive.resolver-tests.grpctestingexp' # missing end '.' for twisted syntax
_SERVER_HEALTH_CHECK_RECORD_DATA = '123.123.123.123'
diff --git a/test/cpp/naming/utils/run_dns_server_for_lb_interop_tests.py b/test/cpp/naming/utils/run_dns_server_for_lb_interop_tests.py
index 217af5c0eb..0c9cf9f238 100755
--- a/test/cpp/naming/utils/run_dns_server_for_lb_interop_tests.py
+++ b/test/cpp/naming/utils/run_dns_server_for_lb_interop_tests.py
@@ -14,12 +14,13 @@
# limitations under the License.
import argparse
-import subprocess
import os
-import tempfile
+import signal
+import subprocess
import sys
+import tempfile
import time
-import signal
+
import yaml
argp = argparse.ArgumentParser(
diff --git a/test/cpp/naming/utils/tcp_connect.py b/test/cpp/naming/utils/tcp_connect.py
index 5f7273f4a9..e41f870b74 100755
--- a/test/cpp/naming/utils/tcp_connect.py
+++ b/test/cpp/naming/utils/tcp_connect.py
@@ -16,9 +16,9 @@
import argparse
import socket
+import sys
import threading
import time
-import sys
def main():
diff --git a/test/cpp/qps/gen_build_yaml.py b/test/cpp/qps/gen_build_yaml.py
index 4438b3ceb9..75a4cd4e71 100755
--- a/test/cpp/qps/gen_build_yaml.py
+++ b/test/cpp/qps/gen_build_yaml.py
@@ -15,11 +15,13 @@
# limitations under the License.
from __future__ import print_function
+
import json
+import os
import pipes
import shutil
import sys
-import os
+
import yaml
run_tests_root = os.path.abspath(
diff --git a/test/cpp/qps/json_run_localhost_scenario_gen.py b/test/cpp/qps/json_run_localhost_scenario_gen.py
index e633c7e83d..8ee66c656c 100755
--- a/test/cpp/qps/json_run_localhost_scenario_gen.py
+++ b/test/cpp/qps/json_run_localhost_scenario_gen.py
@@ -14,9 +14,10 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-import gen_build_yaml as gen
import json
+import gen_build_yaml as gen
+
COPYRIGHT = """
# Copyright 2021 The gRPC Authors
#
diff --git a/test/cpp/qps/qps_json_driver_scenario_gen.py b/test/cpp/qps/qps_json_driver_scenario_gen.py
index 5c0fde0cad..3604605638 100755
--- a/test/cpp/qps/qps_json_driver_scenario_gen.py
+++ b/test/cpp/qps/qps_json_driver_scenario_gen.py
@@ -14,9 +14,10 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-import gen_build_yaml as gen
import json
+import gen_build_yaml as gen
+
COPYRIGHT = """
# Copyright 2021 The gRPC Authors
#
diff --git a/test/distrib/python/test_packages.sh b/test/distrib/python/test_packages.sh
index e9f494310d..a68eba401b 100755
--- a/test/distrib/python/test_packages.sh
+++ b/test/distrib/python/test_packages.sh
@@ -35,7 +35,7 @@ REFLECTION_ARCHIVES=("$EXTERNAL_GIT_ROOT"/input_artifacts/grpcio-reflection-[0-9
TESTING_ARCHIVES=("$EXTERNAL_GIT_ROOT"/input_artifacts/grpcio-testing-[0-9]*.tar.gz)
VIRTUAL_ENV=$(mktemp -d)
-virtualenv "$VIRTUAL_ENV"
+python3 -m virtualenv "$VIRTUAL_ENV"
PYTHON=$VIRTUAL_ENV/bin/python
"$PYTHON" -m pip install --upgrade six pip wheel
diff --git a/test/distrib/ruby/run_distrib_test.sh b/test/distrib/ruby/run_distrib_test.sh
index e2128c03cb..a611fd1b37 100755
--- a/test/distrib/ruby/run_distrib_test.sh
+++ b/test/distrib/ruby/run_distrib_test.sh
@@ -51,7 +51,7 @@ bundle install
bundle exec ./distribtest.rb
[[ "$PACKAGE_TYPE" == "source" ]] && exit 0
-# Attempt to repro https://github.com/google/protobuf/issues/4210.
+# Attempt to repro https://github.com/protocolbuffers/protobuf/issues/4210.
# This sanity check only works for linux-based distrib tests and for
# binary gRPC packages.
INSTALLATION_DIR="$(gem env | grep '\- INSTALLATION DIRECTORY' | awk '{ print $4 }')"
diff --git a/test/http2_test/http2_base_server.py b/test/http2_test/http2_base_server.py
index 44884692bf..dff2bbdb87 100644
--- a/test/http2_test/http2_base_server.py
+++ b/test/http2_test/http2_base_server.py
@@ -13,11 +13,11 @@
# limitations under the License.
import logging
-import messages_pb2
import struct
import h2
import h2.connection
+import messages_pb2
import twisted
import twisted.internet
import twisted.internet.protocol
diff --git a/test/http2_test/http2_server_health_check.py b/test/http2_test/http2_server_health_check.py
index d5ac49f3e5..11cf40793e 100644
--- a/test/http2_test/http2_server_health_check.py
+++ b/test/http2_test/http2_server_health_check.py
@@ -13,9 +13,10 @@
# limitations under the License.
import argparse
-import hyper
import sys
+import hyper
+
# Utility to healthcheck the http2 server. Used when starting the server to
# verify that the server is live before tests begin.
if __name__ == '__main__':
diff --git a/test/http2_test/http2_test_server.py b/test/http2_test/http2_test_server.py
index 5946895ee8..ed402e0970 100644
--- a/test/http2_test/http2_test_server.py
+++ b/test/http2_test/http2_test_server.py
@@ -16,19 +16,19 @@
import argparse
import logging
import sys
-import twisted
-import twisted.internet
-import twisted.internet.endpoints
-import twisted.internet.reactor
import http2_base_server
+import test_data_frame_padding
import test_goaway
import test_max_streams
import test_ping
import test_rst_after_data
import test_rst_after_header
import test_rst_during_data
-import test_data_frame_padding
+import twisted
+import twisted.internet
+import twisted.internet.endpoints
+import twisted.internet.reactor
_TEST_CASE_MAPPING = {
'rst_after_header': test_rst_after_header.TestcaseRstStreamAfterHeader,
diff --git a/test/http2_test/test_data_frame_padding.py b/test/http2_test/test_data_frame_padding.py
index d675869076..cfd86956e8 100644
--- a/test/http2_test/test_data_frame_padding.py
+++ b/test/http2_test/test_data_frame_padding.py
@@ -12,8 +12,9 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-import http2_base_server
import logging
+
+import http2_base_server
import messages_pb2
# Set the number of padding bytes per data frame to be very large
diff --git a/test/http2_test/test_max_streams.py b/test/http2_test/test_max_streams.py
index 401307482c..62538433ae 100644
--- a/test/http2_test/test_max_streams.py
+++ b/test/http2_test/test_max_streams.py
@@ -12,10 +12,10 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-import hyperframe.frame
import logging
import http2_base_server
+import hyperframe.frame
class TestcaseSettingsMaxStreams(object):
diff --git a/third_party/README.md b/third_party/README.md
index b93570f1a9..907f26d927 100644
--- a/third_party/README.md
+++ b/third_party/README.md
@@ -112,3 +112,28 @@ Apart from the above steps, please perform the following two steps to generate t
1. Bump the version in the `tools/distrib/python/xds_protos/setup.py`;
2. Run `tools/distrib/python/xds_protos/build_validate_upload.sh` to upload the built wheel.
+
+### Updating third_party/upb
+
+Since upb is vendored in the gRPC repo, you cannot use submodule to update it. Please follow the steps below.
+
+1. Update third_party/upb directory by running
+ `git subtree pull --squash --prefix=third_party/upb https://github.com/protocolbuffers/upb.git master`
+2. Update the dependency in `grpc_deps.bzl` to the same commit
+3. Populate the bazel download mirror by running `bazel/update_mirror.sh`
+4. Update `src/upb/gen_build_yaml.py` for newly added or removed upb files
+5. Run `tools/buildgen/generate_projects.sh` to regenerate the generated files
+6. Run `tools/codegen/core/gen_upb_api.sh` to regenerate upb files.
+ If you see breaking changes here, you may want to import upb into Google3 along with gRPC.
+
+### Updating third_party/xxhash
+
+The upstream xxhash repository contains a bunch of files that we don't want, so
+we employ a rather manual update flow to pick up just the bits we care about:
+
+```
+git remote add xxhash https://github.com/Cyan4973/xxHash.git
+git fetch xxhash
+for file in LICENSE xxhash.h; do git show xxhash/dev:$file > third_party/xxhash/$file; done
+git commit
+```
diff --git a/third_party/py/python_configure.bzl b/third_party/py/python_configure.bzl
index fa47d89ebc..d06fa2b558 100644
--- a/third_party/py/python_configure.bzl
+++ b/third_party/py/python_configure.bzl
@@ -256,7 +256,7 @@ def _get_python_include(repository_ctx, python_bin):
python_bin,
"-c",
"import os;" +
- "main_header = os.path.join('{}', 'Python.h');".format(include_path) +
+ "main_header = os.path.join(r'{}', 'Python.h');".format(include_path) +
"assert os.path.exists(main_header), main_header + ' does not exist.'",
],
error_msg = "Unable to find Python headers for {}".format(python_bin),
diff --git a/third_party/xxhash/.gitattributes b/third_party/xxhash/.gitattributes
deleted file mode 100644
index fbcf75b555..0000000000
--- a/third_party/xxhash/.gitattributes
+++ /dev/null
@@ -1,10 +0,0 @@
-# Set the default behavior
-* text eol=lf
-
-# Explicitly declare source files
-*.c text eol=lf
-*.h text eol=lf
-
-# Denote files that should not be modified.
-*.odt binary
-
diff --git a/third_party/xxhash/.gitignore b/third_party/xxhash/.gitignore
deleted file mode 100644
index d0ce9aac3b..0000000000
--- a/third_party/xxhash/.gitignore
+++ /dev/null
@@ -1,47 +0,0 @@
-# objects
-*.o
-*.obj
-*.s
-
-# libraries
-libxxhash.*
-!libxxhash.pc.in
-
-# Executables
-*.exe
-xxh32sum
-xxh64sum
-xxh128sum
-xxhsum
-xxhsum32
-xxhsum_privateXXH
-xxhsum_inlinedXXH
-dispatch
-tests/generate_unicode_test
-
-# compilation chain
-.clang_complete
-
-# Mac OS-X artefacts
-*.dSYM
-.DS_Store
-
-# Wasm / emcc / emscripten artefacts
-*.html
-*.wasm
-*.js
-
-# CMake build directories
-build*/
-
-# project managers artifacts
-.projectile
-
-# analyzer artifacts
-infer-out
-
-# test artifacts
-.test*
-tmp*
-tests/*.unicode
-tests/unicode_test*
diff --git a/third_party/xxhash/.travis.yml b/third_party/xxhash/.travis.yml
deleted file mode 100644
index 834768699c..0000000000
--- a/third_party/xxhash/.travis.yml
+++ /dev/null
@@ -1,138 +0,0 @@
-language: c
-
-# Dump CPU info before start
-before_install:
- - cat /proc/cpuinfo || echo /proc/cpuinfo is not present
-
-matrix:
- fast_finish: true
- include:
-
- - name: General linux x64 tests
- arch: amd64
- addons:
- apt:
- packages:
- - g++-multilib
- - gcc-multilib
- - cppcheck
- script:
- - make -B test-all
- - make clean
- - CFLAGS="-Werror" MOREFLAGS="-Wno-sign-conversion" make dispatch # removing sign conversion warnings due to a bug in gcc-5's definition of some AVX512 intrinsics
- - make clean
- - CC=g++ CFLAGS="-O1 -mavx512f -Werror" make
- - make clean
- - CC=g++ CFLAGS="-Wall -Wextra -Werror" make DISPATCH=1
-
-
- - name: Check results consistency on x64
- arch: amd64
- script:
- - CPPFLAGS=-DXXH_VECTOR=XXH_SCALAR make check # Scalar code path
- - make clean
- - CPPFLAGS=-DXXH_VECTOR=XXH_SSE2 make check # SSE2 code path
- - make clean
- - CPPFLAGS="-mavx2 -DXXH_VECTOR=XXH_AVX2" make check # AVX2 code path
- - make clean
- - CPPFLAGS="-mavx512f -DXXH_VECTOR=XXH_AVX512" make check # AVX512 code path
- - make clean
- - CPPFLAGS=-DXXH_REROLL=1 make check # reroll code path (#240)
- - make -C tests/bench
-
- - name: macOS General Test
- os: osx
- compiler: clang
- script:
- - CFLAGS="-Werror" make # test library build
- - make clean
- - make test MOREFLAGS='-Werror' | tee # test scenario where `stdout` is not the console
-
- - name: ARM compilation and consistency checks (Qemu)
- dist: xenial
- arch: amd64
- addons:
- apt:
- packages:
- - qemu-system-arm
- - qemu-user-static
- - gcc-arm-linux-gnueabi
- - libc6-dev-armel-cross
- script:
- # arm (32-bit)
- - CC=arm-linux-gnueabi-gcc CPPFLAGS=-DXXH_VECTOR=XXH_SCALAR LDFLAGS=-static RUN_ENV=qemu-arm-static make check # Scalar code path
- - make clean
- # NEON (32-bit)
- - CC=arm-linux-gnueabi-gcc CPPFLAGS=-DXXH_VECTOR=XXH_NEON CFLAGS="-O3 -march=armv7-a -fPIC -mfloat-abi=softfp -mfpu=neon-vfpv4" LDFLAGS=-static RUN_ENV=qemu-arm-static make check # NEON code path
-
- - name: aarch64 compilation and consistency checks
- dist: xenial
- arch: arm64
- script:
- # aarch64
- - CPPFLAGS=-DXXH_VECTOR=XXH_SCALAR make check # Scalar code path
- # NEON (64-bit)
- - make clean
- - CPPFLAGS=-DXXH_VECTOR=XXH_NEON make check # NEON code path
- # clang
- - make clean
- - CC=clang CPPFLAGS=-DXXH_VECTOR=XXH_SCALAR make check # Scalar code path
- # clang + NEON
- - make clean
- - CC=clang CPPFLAGS=-DXXH_VECTOR=XXH_NEON make check # NEON code path
-
- # We need Bionic here because the QEMU versions shipped in the older repos
- # do not support POWER8 emulation, and compiling QEMU from source is a pain.
- - name: PowerPC + PPC64 compilation and consistency checks (Qemu on Bionic)
- dist: bionic
- arch: amd64
- addons:
- apt:
- packages:
- - qemu-system-ppc
- - qemu-user-static
- - gcc-powerpc-linux-gnu
- - gcc-powerpc64-linux-gnu
- - libc6-dev-powerpc-cross
- - libc6-dev-ppc64-cross
- script:
- - CC=powerpc-linux-gnu-gcc RUN_ENV=qemu-ppc-static LDFLAGS=-static make check # Scalar code path
- - make clean
- - CC=powerpc64-linux-gnu-gcc RUN_ENV=qemu-ppc64-static CPPFLAGS=-DXXH_VECTOR=XXH_SCALAR CFLAGS="-O3" LDFLAGS="-static -m64" make check # Scalar code path
- # VSX code
- - make clean
- - CC=powerpc64-linux-gnu-gcc RUN_ENV="qemu-ppc64-static -cpu power8" CPPFLAGS=-DXXH_VECTOR=XXH_VSX CFLAGS="-O3 -maltivec -mvsx -mcpu=power8 -mpower8-vector" LDFLAGS="-static -m64" make check # VSX code path
- # altivec.h redefinition issue #426
- - make clean
- - CC=powerpc64-linux-gnu-gcc CPPFLAGS=-DXXH_VECTOR=XXH_VSX CFLAGS="-maltivec -mvsx -mcpu=power8 -mpower8-vector" make -C tests test_ppc_redefine
-
- - name: PPC64LE compilation and consistency checks
- dist: xenial
- arch: ppc64le
- script:
- # Scalar (universal) code path
- - CPPFLAGS=-DXXH_VECTOR=XXH_SCALAR LDFLAGS=-static make check
- # VSX code path (64-bit)
- - make clean
- - CPPFLAGS=-DXXH_VECTOR=XXH_VSX CFLAGS="-O3 -maltivec -mvsx -mpower8-vector -mcpu=power8" LDFLAGS="-static" make check
- # altivec.h redefinition issue #426
- - make clean
- - CPPFLAGS=-DXXH_VECTOR=XXH_VSX CFLAGS="-maltivec -mvsx -mcpu=power8 -mpower8-vector" make -C tests test_ppc_redefine
-
- - name: IBM s390x compilation and consistency checks
- dist: bionic
- arch: s390x
- script:
- # Scalar (universal) code path
- - CPPFLAGS=-DXXH_VECTOR=XXH_SCALAR LDFLAGS=-static make check
- # s390x code path (64-bit)
- - make clean
- - CPPFLAGS=-DXXH_VECTOR=XXH_VSX CFLAGS="-O3 -march=arch11 -mzvector" LDFLAGS="-static" make check
-
- - name: cmake build test
- script:
- - cd cmake_unofficial
- - mkdir build
- - cd build
- - cmake ..
- - CFLAGS=-Werror make
diff --git a/third_party/xxhash/Android.bp b/third_party/xxhash/Android.bp
index 8a9373987f..0b054e2742 100644
--- a/third_party/xxhash/Android.bp
+++ b/third_party/xxhash/Android.bp
@@ -16,26 +16,5 @@ license {
cc_library_static {
name: "libgrpc_third_party_xxhash",
defaults: ["grpc_deps_defaults"],
- srcs: [
- "xxhash.c",
- ],
export_include_dirs: ["."],
}
-
-filegroup {
- name: "libgrpc_xxhsum_files",
- srcs: [
- "cli/xsum_arch.h",
- "cli/xsum_config.h",
- "cli/xsum_os_specific.c",
- "cli/xsum_os_specific.h",
- "cli/xsum_output.c",
- "cli/xsum_output.h",
- "cli/xsum_sanity_check.c",
- "cli/xsum_sanity_check.h",
- "xxhsum.c",
- "xxhsum.1",
- "xxhsum.1.md",
- ],
- visibility: ["//visibility:private"],
-}
diff --git a/third_party/xxhash/CHANGELOG b/third_party/xxhash/CHANGELOG
deleted file mode 100644
index 23870756bb..0000000000
--- a/third_party/xxhash/CHANGELOG
+++ /dev/null
@@ -1,52 +0,0 @@
-v0.8.0
-- api : stabilize XXH3
-- cli : xxhsum can parse BSD-style --check lines, by @WayneD
-- cli : `xxhsum -` accepts console input, requested by @jaki
-- cli : xxhsum accepts -- separator, by @jaki
-- cli : fix : print correct default algo for symlinked helpers, by @martinetd
-- install: improved pkgconfig script, allowing custom install locations, requested by @ellert
-
-v0.7.4
-- perf: automatic vector detection and selection at runtime (`xxh_x86dispatch.h`), initiated by @easyaspi314
-- perf: added AVX512 support, by @gzm55
-- api : new: secret generator `XXH_generateSecret()`, suggested by @koraa
-- api : fix: XXH3_state_t is movable, identified by @koraa
-- api : fix: state is correctly aligned in AVX mode (unlike `malloc()`), by @easyaspi314
-- api : fix: streaming generated wrong values in some combination of random ingestion lengths, reported by @WayneD
-- cli : fix unicode print on Windows, by @easyaspi314
-- cli : can `-c` check file generated by sfv
-- build: `make DISPATCH=1` generates `xxhsum` and `libxxhash` with runtime vector detection (x86/x64 only)
-- install: cygwin installation support
-- doc : Cryptol specification of XXH32 and XXH64, by @weaversa
-
-v0.7.3
-- perf: improved speed for large inputs (~+20%)
-- perf: improved latency for small inputs (~10%)
-- perf: s390x Vectorial code, by @easyaspi314
-- cli: improved support for Unicode filenames on Windows, thanks to @easyaspi314 and @t-mat
-- api: `xxhash.h` can now be included in any order, with and without `XXH_STATIC_LINKING_ONLY` and `XXH_INLINE_ALL`
-- build: xxHash's implementation transferred into `xxhash.h`. No more need to have `xxhash.c` in the `/include` directory for `XXH_INLINE_ALL` to work
-- install: created pkg-config file, by @bket
-- install: VCpkg installation instructions, by @LilyWangL
-- doc: Highly improved code documentation, by @easyaspi314
-- misc: New test tool in `/tests/collisions`: brute force collision tester for 64-bit hashes
-
-v0.7.2
-- Fixed collision ratio of `XXH128` for some specific input lengths, reported by @svpv
-- Improved `VSX` and `NEON` variants, by @easyaspi314
-- Improved performance of scalar code path (`XXH_VECTOR=0`), by @easyaspi314
-- `xxhsum`: can generate 128-bit hashes with the `-H2` option (note: for experimental purposes only! `XXH128` is not yet frozen)
-- `xxhsum`: option `-q` removes status notifications
-
-v0.7.1
-- Secret first: the algorithm computation can be altered by providing a "secret", which is any blob of bytes, of size >= `XXH3_SECRET_SIZE_MIN`.
-- `seed` is still available, and acts as a secret generator
-- updated `ARM NEON` variant by @easyaspi314
-- Streaming implementation is available
-- Improve compatibility and performance with Visual Studio, with help from @aras-p
-- Better integration when using `XXH_INLINE_ALL`: do not pollute host namespace, use its own macros, such as `XXH_ASSERT()`, `XXH_ALIGN`, etc.
-- 128-bit variant provides helper functions for comparison of hashes.
-- Better `clang` generation of `rotl` instruction, thanks to @easyaspi314
-- `XXH_REROLL` build macro to reduce binary size, by @easyaspi314
-- Improved `cmake` script, by @Mezozoysky
-- Full benchmark program provided in `/tests/bench`
diff --git a/third_party/xxhash/Doxyfile b/third_party/xxhash/Doxyfile
deleted file mode 100644
index 634e1e1a38..0000000000
--- a/third_party/xxhash/Doxyfile
+++ /dev/null
@@ -1,58 +0,0 @@
-# Doxygen config for xxHash
-DOXYFILE_ENCODING = UTF-8
-
-PROJECT_NAME = "xxHash"
-PROJECT_NUMBER = "0.8.0"
-PROJECT_BRIEF = "Extremely fast non-cryptographic hash function"
-OUTPUT_DIRECTORY = doxygen
-OUTPUT_LANGUAGE = English
-
-# We already separate the internal docs.
-INTERNAL_DOCS = YES
-# Consistency
-SORT_MEMBER_DOCS = NO
-BRIEF_MEMBER_DESC = YES
-REPEAT_BRIEF = YES
-
-# Warnings
-QUIET = YES
-# Until we document everything
-WARN_IF_UNDOCUMENTED = NO
-
-# TODO: Add the other files. It is just xxhash.h for now.
-FILE_PATTERNS = xxhash.h xxh_x86dispatch.c
-# Note: xxHash's source files are technically ASCII only.
-INPUT_ENCODING = UTF-8
-TAB_SIZE = 4
-MARKDOWN_SUPPORT = YES
-
-# xxHash is a C library
-OPTIMIZE_OUTPUT_FOR_C = YES
-# So we can document the internals
-EXTRACT_STATIC = YES
-# Document the macros
-MACRO_EXPANSION = YES
-EXPAND_ONLY_PREDEF = YES
-# Predefine some macros to clean up the output.
-PREDEFINED = "XXH_DOXYGEN=" \
- "XXH_PUBLIC_API=" \
- "XXH_FORCE_INLINE=static inline" \
- "XXH_NO_INLINE=static" \
- "XXH_RESTRICT=restrict" \
- "XSUM_API=" \
- "XXH_STATIC_LINKING_ONLY" \
- "XXH_IMPLEMENTATION" \
- "XXH_ALIGN(N)=alignas(N)" \
- "XXH_ALIGN_MEMBER(align,type)=alignas(align) type"
-
-# We want HTML docs
-GENERATE_HTML = YES
-HTML_OUTPUT = html
-HTML_FILE_EXTENSION = .html
-# Tweak the colors a bit
-HTML_COLORSTYLE_HUE = 220
-HTML_COLORSTYLE_GAMMA = 100
-HTML_COLORSTYLE_SAT = 100
-
-# We don't want LaTeX.
-GENERATE_LATEX = NO
diff --git a/third_party/xxhash/Makefile b/third_party/xxhash/Makefile
deleted file mode 100644
index 23cf4a8c7f..0000000000
--- a/third_party/xxhash/Makefile
+++ /dev/null
@@ -1,506 +0,0 @@
-# ################################################################
-# xxHash Makefile
-# Copyright (C) 2012-2020 Yann Collet
-#
-# GPL v2 License
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# You can contact the author at:
-# - xxHash homepage: https://www.xxhash.com
-# - xxHash source repository: https://github.com/Cyan4973/xxHash
-# ################################################################
-# xxhsum: provides 32/64 bits hash of one or multiple files, or stdin
-# ################################################################
-Q = $(if $(filter 1,$(V) $(VERBOSE)),,@)
-
-# Version numbers
-SED ?= sed
-SED_ERE_OPT ?= -E
-LIBVER_MAJOR_SCRIPT:=`$(SED) -n '/define XXH_VERSION_MAJOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < xxhash.h`
-LIBVER_MINOR_SCRIPT:=`$(SED) -n '/define XXH_VERSION_MINOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < xxhash.h`
-LIBVER_PATCH_SCRIPT:=`$(SED) -n '/define XXH_VERSION_RELEASE/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < xxhash.h`
-LIBVER_MAJOR := $(shell echo $(LIBVER_MAJOR_SCRIPT))
-LIBVER_MINOR := $(shell echo $(LIBVER_MINOR_SCRIPT))
-LIBVER_PATCH := $(shell echo $(LIBVER_PATCH_SCRIPT))
-LIBVER := $(LIBVER_MAJOR).$(LIBVER_MINOR).$(LIBVER_PATCH)
-
-CFLAGS ?= -O3
-DEBUGFLAGS+=-Wall -Wextra -Wconversion -Wcast-qual -Wcast-align -Wshadow \
- -Wstrict-aliasing=1 -Wswitch-enum -Wdeclaration-after-statement \
- -Wstrict-prototypes -Wundef -Wpointer-arith -Wformat-security \
- -Wvla -Wformat=2 -Winit-self -Wfloat-equal -Wwrite-strings \
- -Wredundant-decls -Wstrict-overflow=2
-CFLAGS += $(DEBUGFLAGS) $(MOREFLAGS)
-FLAGS = $(CFLAGS) $(CPPFLAGS)
-XXHSUM_VERSION = $(LIBVER)
-UNAME := $(shell uname)
-
-# Define *.exe as extension for Windows systems
-ifneq (,$(filter Windows%,$(OS)))
-EXT =.exe
-else
-EXT =
-endif
-
-# OS X linker doesn't support -soname, and use different extension
-# see: https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/DynamicLibraries/100-Articles/DynamicLibraryDesignGuidelines.html
-ifeq ($(UNAME), Darwin)
- SHARED_EXT = dylib
- SHARED_EXT_MAJOR = $(LIBVER_MAJOR).$(SHARED_EXT)
- SHARED_EXT_VER = $(LIBVER).$(SHARED_EXT)
- SONAME_FLAGS = -install_name $(LIBDIR)/libxxhash.$(SHARED_EXT_MAJOR) -compatibility_version $(LIBVER_MAJOR) -current_version $(LIBVER)
-else
- SONAME_FLAGS = -Wl,-soname=libxxhash.$(SHARED_EXT).$(LIBVER_MAJOR)
- SHARED_EXT = so
- SHARED_EXT_MAJOR = $(SHARED_EXT).$(LIBVER_MAJOR)
- SHARED_EXT_VER = $(SHARED_EXT).$(LIBVER)
-endif
-
-LIBXXH = libxxhash.$(SHARED_EXT_VER)
-
-XXHSUM_SRC_DIR = cli
-XXHSUM_SPLIT_SRCS = $(XXHSUM_SRC_DIR)/xsum_os_specific.c \
- $(XXHSUM_SRC_DIR)/xsum_output.c \
- $(XXHSUM_SRC_DIR)/xsum_sanity_check.c
-XXHSUM_SPLIT_OBJS = $(XXHSUM_SPLIT_SRCS:.c=.o)
-XXHSUM_HEADERS = $(XXHSUM_SRC_DIR)/xsum_config.h \
- $(XXHSUM_SRC_DIR)/xsum_arch.h \
- $(XXHSUM_SRC_DIR)/xsum_os_specific.h \
- $(XXHSUM_SRC_DIR)/xsum_output.h \
- $(XXHSUM_SRC_DIR)/xsum_sanity_check.h
-
-## generate CLI and libraries in release mode (default for `make`)
-.PHONY: default
-default: DEBUGFLAGS=
-default: lib xxhsum_and_links
-
-.PHONY: all
-all: lib xxhsum xxhsum_inlinedXXH
-
-## xxhsum is the command line interface (CLI)
-ifeq ($(DISPATCH),1)
-xxhsum: CPPFLAGS += -DXXHSUM_DISPATCH=1
-xxhsum: xxh_x86dispatch.o
-endif
-xxhsum: xxhash.o xxhsum.o $(XXHSUM_SPLIT_OBJS)
- $(CC) $(FLAGS) $^ $(LDFLAGS) -o $@$(EXT)
-
-xxhsum32: CFLAGS += -m32 ## generate CLI in 32-bits mode
-xxhsum32: xxhash.c xxhsum.c $(XXHSUM_SPLIT_SRCS) ## do not generate object (avoid mixing different ABI)
- $(CC) $(FLAGS) $^ $(LDFLAGS) -o $@$(EXT)
-
-## dispatch only works for x86/x64 systems
-dispatch: CPPFLAGS += -DXXHSUM_DISPATCH=1
-dispatch: xxhash.o xxh_x86dispatch.o xxhsum.c $(XXHSUM_SPLIT_SRCS)
- $(CC) $(FLAGS) $^ $(LDFLAGS) -o $@$(EXT)
-
-xxhash.o: xxhash.c xxhash.h
-xxhsum.o: xxhsum.c $(XXHSUM_HEADERS) \
- xxhash.h xxh_x86dispatch.h
-xxh_x86dispatch.o: xxh_x86dispatch.c xxh_x86dispatch.h xxhash.h
-
-.PHONY: xxhsum_and_links
-xxhsum_and_links: xxhsum xxh32sum xxh64sum xxh128sum
-
-xxh32sum xxh64sum xxh128sum: xxhsum
- ln -sf $<$(EXT) $@$(EXT)
-
-xxhsum_inlinedXXH: CPPFLAGS += -DXXH_INLINE_ALL
-xxhsum_inlinedXXH: xxhsum.c $(XXHSUM_SPLIT_SRCS)
- $(CC) $(FLAGS) $< -o $@$(EXT)
-
-
-# library
-
-libxxhash.a: ARFLAGS = rcs
-libxxhash.a: xxhash.o
- $(AR) $(ARFLAGS) $@ $^
-
-$(LIBXXH): LDFLAGS += -shared
-ifeq (,$(filter Windows%,$(OS)))
-$(LIBXXH): CFLAGS += -fPIC
-endif
-ifeq ($(DISPATCH),1)
-$(LIBXXH): xxh_x86dispatch.c
-endif
-$(LIBXXH): xxhash.c
- $(CC) $(FLAGS) $^ $(LDFLAGS) $(SONAME_FLAGS) -o $@
- ln -sf $@ libxxhash.$(SHARED_EXT_MAJOR)
- ln -sf $@ libxxhash.$(SHARED_EXT)
-
-.PHONY: libxxhash
-libxxhash: ## generate dynamic xxhash library
-libxxhash: $(LIBXXH)
-
-.PHONY: lib
-lib: ## generate static and dynamic xxhash libraries
-lib: libxxhash.a libxxhash
-
-# helper targets
-
-AWK = awk
-GREP = grep
-SORT = sort
-
-.PHONY: list
-list: ## list all Makefile targets
- $(Q)$(MAKE) -pRrq -f $(lastword $(MAKEFILE_LIST)) : 2>/dev/null | $(AWK) -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | $(SORT) | egrep -v -e '^[^[:alnum:]]' -e '^$@$$' | xargs
-
-.PHONY: help
-help: ## list documented targets
- $(Q)$(GREP) -E '^[0-9a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
- $(SORT) | \
- $(AWK) 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
-
-.PHONY: clean
-clean: ## remove all build artifacts
- $(Q)$(RM) -r *.dSYM # Mac OS-X specific
- $(Q)$(RM) core *.o *.obj *.$(SHARED_EXT) *.$(SHARED_EXT).* *.a libxxhash.pc
- $(Q)$(RM) xxhsum$(EXT) xxhsum32$(EXT) xxhsum_inlinedXXH$(EXT) dispatch$(EXT)
- $(Q)$(RM) xxh32sum$(EXT) xxh64sum$(EXT) xxh128sum$(EXT)
- $(Q)$(RM) $(XXHSUM_SRC_DIR)/*.o $(XXHSUM_SRC_DIR)/*.obj
- @echo cleaning completed
-
-
-# =================================================
-# tests
-# =================================================
-
-# make check can be run with cross-compiled binaries on emulated environments (qemu user mode)
-# by setting $(RUN_ENV) to the target emulation environment
-.PHONY: check
-check: xxhsum ## basic tests for xxhsum CLI, set RUN_ENV for emulated environments
- # stdin
- $(RUN_ENV) ./xxhsum$(EXT) < xxhash.c
- # multiple files
- $(RUN_ENV) ./xxhsum$(EXT) xxhash.* xxhsum.*
- # internal bench
- $(RUN_ENV) ./xxhsum$(EXT) -bi0
- # long bench command
- $(RUN_ENV) ./xxhsum$(EXT) --benchmark-all -i0
- # bench multiple variants
- $(RUN_ENV) ./xxhsum$(EXT) -b1,2,3 -i0
- # file bench
- $(RUN_ENV) ./xxhsum$(EXT) -bi0 xxhash.c
- # 32-bit
- $(RUN_ENV) ./xxhsum$(EXT) -H0 xxhash.c
- # 128-bit
- $(RUN_ENV) ./xxhsum$(EXT) -H2 xxhash.c
- # request incorrect variant
- $(RUN_ENV) ./xxhsum$(EXT) -H9 xxhash.c ; test $$? -eq 1
- @printf "\n ....... checks completed successfully ....... \n"
-
-.PHONY: test-unicode
-test-unicode:
- $(MAKE) -C tests test_unicode
-
-.PHONY: test-mem
-VALGRIND = valgrind --leak-check=yes --error-exitcode=1
-test-mem: RUN_ENV = $(VALGRIND)
-test-mem: xxhsum check
-
-.PHONY: test32
-test32: clean xxhsum32
- @echo ---- test 32-bit ----
- ./xxhsum32 -bi1 xxhash.c
-
-.PHONY: test-xxhsum-c
-test-xxhsum-c: xxhsum
- # xxhsum to/from pipe
- ./xxhsum xxh* | ./xxhsum -c -
- ./xxhsum -H0 xxh* | ./xxhsum -c -
- # xxhsum -q does not display "Loading" message into stderr (#251)
- ! ./xxhsum -q xxh* 2>&1 | grep Loading
- # xxhsum does not display "Loading" message into stderr either
- ! ./xxhsum xxh* 2>&1 | grep Loading
- # Check that xxhsum do display filename that it failed to open.
- LC_ALL=C ./xxhsum nonexistent 2>&1 | grep "Error: Could not open 'nonexistent'"
- # xxhsum to/from file, shell redirection
- ./xxhsum xxh* > .test.xxh64
- ./xxhsum --tag xxh* > .test.xxh64_tag
- ./xxhsum --little-endian xxh* > .test.le_xxh64
- ./xxhsum --tag --little-endian xxh* > .test.le_xxh64_tag
- ./xxhsum -H0 xxh* > .test.xxh32
- ./xxhsum -H0 --tag xxh* > .test.xxh32_tag
- ./xxhsum -H0 --little-endian xxh* > .test.le_xxh32
- ./xxhsum -H0 --tag --little-endian xxh* > .test.le_xxh32_tag
- ./xxhsum -H2 xxh* > .test.xxh128
- ./xxhsum -H2 --tag xxh* > .test.xxh128_tag
- ./xxhsum -H2 --little-endian xxh* > .test.le_xxh128
- ./xxhsum -H2 --tag --little-endian xxh* > .test.le_xxh128_tag
- ./xxhsum -c .test.xxh*
- ./xxhsum -c --little-endian .test.le_xxh*
- ./xxhsum -c .test.*_tag
- # read list of files from stdin
- ./xxhsum -c < .test.xxh64
- ./xxhsum -c < .test.xxh32
- cat .test.xxh* | ./xxhsum -c -
- # check variant with '*' marker as second separator
- $(SED) 's/ / \*/' .test.xxh32 | ./xxhsum -c
- # bsd-style output
- ./xxhsum --tag xxhsum* | $(GREP) XXH64
- ./xxhsum --tag -H0 xxhsum* | $(GREP) XXH32
- ./xxhsum --tag -H1 xxhsum* | $(GREP) XXH64
- ./xxhsum --tag -H2 xxhsum* | $(GREP) XXH128
- ./xxhsum --tag -H32 xxhsum* | $(GREP) XXH32
- ./xxhsum --tag -H64 xxhsum* | $(GREP) XXH64
- ./xxhsum --tag -H128 xxhsum* | $(GREP) XXH128
- ./xxhsum --tag -H0 --little-endian xxhsum* | $(GREP) XXH32_LE
- ./xxhsum --tag -H1 --little-endian xxhsum* | $(GREP) XXH64_LE
- ./xxhsum --tag -H2 --little-endian xxhsum* | $(GREP) XXH128_LE
- ./xxhsum --tag -H32 --little-endian xxhsum* | $(GREP) XXH32_LE
- ./xxhsum --tag -H64 --little-endian xxhsum* | $(GREP) XXH64_LE
- ./xxhsum --tag -H128 --little-endian xxhsum* | $(GREP) XXH128_LE
- # check bsd-style
- ./xxhsum --tag xxhsum* | ./xxhsum -c
- ./xxhsum --tag -H32 --little-endian xxhsum* | ./xxhsum -c
- # xxhsum -c warns improperly format lines.
- echo '12345678 ' >>.test.xxh32
- ./xxhsum -c .test.xxh32 | $(GREP) improperly
- echo '123456789 file' >>.test.xxh64
- ./xxhsum -c .test.xxh64 | $(GREP) improperly
- # Expects "FAILED"
- echo "0000000000000000 LICENSE" | ./xxhsum -c -; test $$? -eq 1
- echo "00000000 LICENSE" | ./xxhsum -c -; test $$? -eq 1
- # Expects "FAILED open or read"
- echo "0000000000000000 test-expects-file-not-found" | ./xxhsum -c -; test $$? -eq 1
- echo "00000000 test-expects-file-not-found" | ./xxhsum -c -; test $$? -eq 1
- @$(RM) .test.*
-
-.PHONY: armtest
-armtest: clean
- @echo ---- test ARM compilation ----
- CC=arm-linux-gnueabi-gcc MOREFLAGS="-Werror -static" $(MAKE) xxhsum
-
-.PHONY: clangtest
-clangtest: clean
- @echo ---- test clang compilation ----
- CC=clang MOREFLAGS="-Werror -Wconversion -Wno-sign-conversion" $(MAKE) all
-
-.PHONY: cxxtest
-cxxtest: clean
- @echo ---- test C++ compilation ----
- CC="$(CXX) -Wno-deprecated" $(MAKE) all CFLAGS="-O3 -Wall -Wextra -Wundef -Wshadow -Wcast-align -Werror -fPIC"
-
-.PHONY: c90test
-ifeq ($(NO_C90_TEST),true)
-c90test:
- @echo no c90 compatibility test
-else
-c90test: CPPFLAGS += -DXXH_NO_LONG_LONG
-c90test: CFLAGS += -std=c90 -Werror -pedantic
-c90test: xxhash.c
- @echo ---- test strict C90 compilation [xxh32 only] ----
- $(RM) xxhash.o
- $(CC) $(FLAGS) $^ $(LDFLAGS) -c
- $(RM) xxhash.o
-endif
-
-.PHONY: usan
-usan: CC=clang
-usan: CXX=clang++
-usan: ## check CLI runtime for undefined behavior, using clang's sanitizer
- @echo ---- check undefined behavior - sanitize ----
- $(MAKE) clean
- $(MAKE) test CC=$(CC) CXX=$(CXX) MOREFLAGS="-g -fsanitize=undefined -fno-sanitize-recover=all"
-
-.PHONY: staticAnalyze
-SCANBUILD ?= scan-build
-staticAnalyze: clean ## check C source files using $(SCANBUILD) static analyzer
- @echo ---- static analyzer - $(SCANBUILD) ----
- CFLAGS="-g -Werror" $(SCANBUILD) --status-bugs -v $(MAKE) all
-
-CPPCHECK ?= cppcheck
-.PHONY: cppcheck
-cppcheck: ## check C source files using $(CPPCHECK) static analyzer
- @echo ---- static analyzer - $(CPPCHECK) ----
- $(CPPCHECK) . --force --enable=warning,portability,performance,style --error-exitcode=1 > /dev/null
-
-.PHONY: namespaceTest
-namespaceTest: ## ensure XXH_NAMESPACE redefines all public symbols
- $(CC) -c xxhash.c
- $(CC) -DXXH_NAMESPACE=TEST_ -c xxhash.c -o xxhash2.o
- $(CC) xxhash.o xxhash2.o xxhsum.c $(XXHSUM_SPLIT_SRCS) -o xxhsum2 # will fail if one namespace missing (symbol collision)
- $(RM) *.o xxhsum2 # clean
-
-MD2ROFF ?= ronn
-MD2ROFF_FLAGS ?= --roff --warnings --manual="User Commands" --organization="xxhsum $(XXHSUM_VERSION)"
-xxhsum.1: xxhsum.1.md xxhash.h
- cat $< | $(MD2ROFF) $(MD2ROFF_FLAGS) | $(SED) -n '/^\.\\\".*/!p' > $@
-
-.PHONY: man
-man: xxhsum.1 ## generate man page from markdown source
-
-.PHONY: clean-man
-clean-man:
- $(RM) xxhsum.1
-
-.PHONY: preview-man
-preview-man: man
- man ./xxhsum.1
-
-.PHONY: test
-test: DEBUGFLAGS += -DXXH_DEBUGLEVEL=1
-test: all namespaceTest check test-xxhsum-c c90test test-tools
-
-.PHONY: test-inline
-test-inline:
- $(MAKE) -C tests test_multiInclude
-
-.PHONY: test-all
-test-all: CFLAGS += -Werror
-test-all: test test32 clangtest cxxtest usan test-inline listL120 trailingWhitespace test-unicode
-
-.PHONY: test-tools
-test-tools:
- CFLAGS=-Werror $(MAKE) -C tests/bench
- CFLAGS=-Werror $(MAKE) -C tests/collisions
-
-.PHONY: listL120
-listL120: # extract lines >= 120 characters in *.{c,h}, by Takayuki Matsuoka (note: $$, for Makefile compatibility)
- find . -type f -name '*.c' -o -name '*.h' | while read -r filename; do awk 'length > 120 {print FILENAME "(" FNR "): " $$0}' $$filename; done
-
-.PHONY: trailingWhitespace
-trailingWhitespace:
- ! $(GREP) -E "`printf '[ \\t]$$'`" xxhsum.1 *.c *.h LICENSE Makefile cmake_unofficial/CMakeLists.txt
-
-
-# =========================================================
-# make install is validated only for the following targets
-# =========================================================
-ifneq (,$(filter Linux Darwin GNU/kFreeBSD GNU Haiku OpenBSD FreeBSD NetBSD DragonFly SunOS CYGWIN% , $(UNAME)))
-
-DESTDIR ?=
-# directory variables: GNU conventions prefer lowercase
-# see https://www.gnu.org/prep/standards/html_node/Makefile-Conventions.html
-# support both lower and uppercase (BSD), use uppercase in script
-prefix ?= /usr/local
-PREFIX ?= $(prefix)
-exec_prefix ?= $(PREFIX)
-EXEC_PREFIX ?= $(exec_prefix)
-libdir ?= $(EXEC_PREFIX)/lib
-LIBDIR ?= $(libdir)
-includedir ?= $(PREFIX)/include
-INCLUDEDIR ?= $(includedir)
-bindir ?= $(EXEC_PREFIX)/bin
-BINDIR ?= $(bindir)
-datarootdir ?= $(PREFIX)/share
-mandir ?= $(datarootdir)/man
-man1dir ?= $(mandir)/man1
-
-ifneq (,$(filter $(UNAME),FreeBSD NetBSD DragonFly))
-PKGCONFIGDIR ?= $(PREFIX)/libdata/pkgconfig
-else
-PKGCONFIGDIR ?= $(LIBDIR)/pkgconfig
-endif
-
-ifneq (,$(filter $(UNAME),OpenBSD FreeBSD NetBSD DragonFly SunOS))
-MANDIR ?= $(PREFIX)/man/man1
-else
-MANDIR ?= $(man1dir)
-endif
-
-ifneq (,$(filter $(UNAME),SunOS))
-INSTALL ?= ginstall
-else
-INSTALL ?= install
-endif
-
-INSTALL_PROGRAM ?= $(INSTALL)
-INSTALL_DATA ?= $(INSTALL) -m 644
-
-
-PCLIBDIR ?= $(shell echo "$(LIBDIR)" | $(SED) -n $(SED_ERE_OPT) -e "s@^$(EXEC_PREFIX)(/|$$)@@p")
-PCINCDIR ?= $(shell echo "$(INCLUDEDIR)" | $(SED) -n $(SED_ERE_OPT) -e "s@^$(PREFIX)(/|$$)@@p")
-PCEXECDIR?= $(if $(filter $(PREFIX),$(EXEC_PREFIX)),$$\{prefix\},$(EXEC_PREFIX))
-
-ifeq (,$(PCLIBDIR))
-# Additional prefix check is required, since the empty string is technically a
-# valid PCLIBDIR
-ifeq (,$(shell echo "$(LIBDIR)" | $(SED) -n $(SED_ERE_OPT) -e "\\@^$(EXEC_PREFIX)(/|$$)@ p"))
-$(error configured libdir ($(LIBDIR)) is outside of exec_prefix ($(EXEC_PREFIX)), can't generate pkg-config file)
-endif
-endif
-
-ifeq (,$(PCINCDIR))
-# Additional prefix check is required, since the empty string is technically a
-# valid PCINCDIR
-ifeq (,$(shell echo "$(INCLUDEDIR)" | $(SED) -n $(SED_ERE_OPT) -e "\\@^$(PREFIX)(/|$$)@ p"))
-$(error configured includedir ($(INCLUDEDIR)) is outside of prefix ($(PREFIX)), can't generate pkg-config file)
-endif
-endif
-
-libxxhash.pc: libxxhash.pc.in
- @echo creating pkgconfig
- $(Q)$(SED) $(SED_ERE_OPT) -e 's|@PREFIX@|$(PREFIX)|' \
- -e 's|@EXECPREFIX@|$(PCEXECDIR)|' \
- -e 's|@LIBDIR@|$(PCLIBDIR)|' \
- -e 's|@INCLUDEDIR@|$(PCINCDIR)|' \
- -e 's|@VERSION@|$(LIBVER)|' \
- $< > $@
-
-
-.PHONY: install
-install: lib libxxhash.pc xxhsum ## install libraries, CLI, links and man page
- @echo Installing libxxhash
- $(Q)$(INSTALL) -d -m 755 $(DESTDIR)$(LIBDIR)
- $(Q)$(INSTALL_DATA) libxxhash.a $(DESTDIR)$(LIBDIR)
- $(Q)$(INSTALL_PROGRAM) $(LIBXXH) $(DESTDIR)$(LIBDIR)
- $(Q)ln -sf $(LIBXXH) $(DESTDIR)$(LIBDIR)/libxxhash.$(SHARED_EXT_MAJOR)
- $(Q)ln -sf $(LIBXXH) $(DESTDIR)$(LIBDIR)/libxxhash.$(SHARED_EXT)
- $(Q)$(INSTALL) -d -m 755 $(DESTDIR)$(INCLUDEDIR) # includes
- $(Q)$(INSTALL_DATA) xxhash.h $(DESTDIR)$(INCLUDEDIR)
- $(Q)$(INSTALL_DATA) xxh3.h $(DESTDIR)$(INCLUDEDIR) # for compatibility, will be removed in v0.9.0
-ifeq ($(DISPATCH),1)
- $(Q)$(INSTALL_DATA) xxh_x86dispatch.h $(DESTDIR)$(INCLUDEDIR)
-endif
- @echo Installing pkgconfig
- $(Q)$(INSTALL) -d -m 755 $(DESTDIR)$(PKGCONFIGDIR)/
- $(Q)$(INSTALL_DATA) libxxhash.pc $(DESTDIR)$(PKGCONFIGDIR)/
- @echo Installing xxhsum
- $(Q)$(INSTALL) -d -m 755 $(DESTDIR)$(BINDIR)/ $(DESTDIR)$(MANDIR)/
- $(Q)$(INSTALL_PROGRAM) xxhsum $(DESTDIR)$(BINDIR)/xxhsum
- $(Q)ln -sf xxhsum $(DESTDIR)$(BINDIR)/xxh32sum
- $(Q)ln -sf xxhsum $(DESTDIR)$(BINDIR)/xxh64sum
- $(Q)ln -sf xxhsum $(DESTDIR)$(BINDIR)/xxh128sum
- @echo Installing man pages
- $(Q)$(INSTALL_DATA) xxhsum.1 $(DESTDIR)$(MANDIR)/xxhsum.1
- $(Q)ln -sf xxhsum.1 $(DESTDIR)$(MANDIR)/xxh32sum.1
- $(Q)ln -sf xxhsum.1 $(DESTDIR)$(MANDIR)/xxh64sum.1
- $(Q)ln -sf xxhsum.1 $(DESTDIR)$(MANDIR)/xxh128sum.1
- @echo xxhash installation completed
-
-.PHONY: uninstall
-uninstall: ## uninstall libraries, CLI, links and man page
- $(Q)$(RM) $(DESTDIR)$(LIBDIR)/libxxhash.a
- $(Q)$(RM) $(DESTDIR)$(LIBDIR)/libxxhash.$(SHARED_EXT)
- $(Q)$(RM) $(DESTDIR)$(LIBDIR)/libxxhash.$(SHARED_EXT_MAJOR)
- $(Q)$(RM) $(DESTDIR)$(LIBDIR)/$(LIBXXH)
- $(Q)$(RM) $(DESTDIR)$(INCLUDEDIR)/xxhash.h
- $(Q)$(RM) $(DESTDIR)$(INCLUDEDIR)/xxh3.h
- $(Q)$(RM) $(DESTDIR)$(INCLUDEDIR)/xxh_x86dispatch.h
- $(Q)$(RM) $(DESTDIR)$(PKGCONFIGDIR)/libxxhash.pc
- $(Q)$(RM) $(DESTDIR)$(BINDIR)/xxh32sum
- $(Q)$(RM) $(DESTDIR)$(BINDIR)/xxh64sum
- $(Q)$(RM) $(DESTDIR)$(BINDIR)/xxh128sum
- $(Q)$(RM) $(DESTDIR)$(BINDIR)/xxhsum
- $(Q)$(RM) $(DESTDIR)$(MANDIR)/xxh32sum.1
- $(Q)$(RM) $(DESTDIR)$(MANDIR)/xxh64sum.1
- $(Q)$(RM) $(DESTDIR)$(MANDIR)/xxh128sum.1
- $(Q)$(RM) $(DESTDIR)$(MANDIR)/xxhsum.1
- @echo xxhsum successfully uninstalled
-
-endif
diff --git a/third_party/xxhash/README.md b/third_party/xxhash/README.md
deleted file mode 100644
index 7d9ae9dd46..0000000000
--- a/third_party/xxhash/README.md
+++ /dev/null
@@ -1,235 +0,0 @@
-
-xxHash - Extremely fast hash algorithm
-======================================
-
-xxHash is an Extremely fast Hash algorithm, running at RAM speed limits.
-It successfully completes the [SMHasher](https://code.google.com/p/smhasher/wiki/SMHasher) test suite
-which evaluates collision, dispersion and randomness qualities of hash functions.
-Code is highly portable, and hashes are identical across all platforms (little / big endian).
-
-|Branch |Status |
-|------------|---------|
-|dev | [![Build Status](https://travis-ci.org/Cyan4973/xxHash.svg?branch=dev)](https://travis-ci.org/Cyan4973/xxHash?branch=dev) |
-
-
-Benchmarks
--------------------------
-
-The reference system uses an Intel i7-9700K cpu, and runs Ubuntu x64 20.04.
-The [open source benchmark program] is compiled with `clang` v10.0 using `-O3` flag.
-
-| Hash Name | Width | Bandwidth (GB/s) | Small Data Velocity | Quality | Comment |
-| --------- | ----- | ---------------- | ----- | --- | --- |
-| __XXH3__ (SSE2) | 64 | 31.5 GB/s | 133.1 | 10
-| __XXH128__ (SSE2) | 128 | 29.6 GB/s | 118.1 | 10
-| _RAM sequential read_ | N/A | 28.0 GB/s | N/A | N/A | _for reference_
-| City64 | 64 | 22.0 GB/s | 76.6 | 10
-| T1ha2 | 64 | 22.0 GB/s | 99.0 | 9 | Slightly worse [collisions]
-| City128 | 128 | 21.7 GB/s | 57.7 | 10
-| __XXH64__ | 64 | 19.4 GB/s | 71.0 | 10
-| SpookyHash | 64 | 19.3 GB/s | 53.2 | 10
-| Mum | 64 | 18.0 GB/s | 67.0 | 9 | Slightly worse [collisions]
-| __XXH32__ | 32 | 9.7 GB/s | 71.9 | 10
-| City32 | 32 | 9.1 GB/s | 66.0 | 10
-| Murmur3 | 32 | 3.9 GB/s | 56.1 | 10
-| SipHash | 64 | 3.0 GB/s | 43.2 | 10
-| FNV64 | 64 | 1.2 GB/s | 62.7 | 5 | Poor avalanche properties
-| Blake2 | 256 | 1.1 GB/s | 5.1 | 10 | Cryptographic
-| SHA1 | 160 | 0.8 GB/s | 5.6 | 10 | Cryptographic but broken
-| MD5 | 128 | 0.6 GB/s | 7.8 | 10 | Cryptographic but broken
-
-[open source benchmark program]: https://github.com/Cyan4973/xxHash/tree/release/tests/bench
-[collisions]: https://github.com/Cyan4973/xxHash/wiki/Collision-ratio-comparison#collision-study
-
-note 1: Small data velocity is a _rough_ evaluation of algorithm's efficiency on small data. For more detailed analysis, please refer to next paragraph.
-
-note 2: some algorithms feature _faster than RAM_ speed. In which case, they can only reach their full speed when input data is already in CPU cache (L3 or better). Otherwise, they max out on RAM speed limit.
-
-### Small data
-
-Performance on large data is only one part of the picture.
-Hashing is also very useful in constructions like hash tables and bloom filters.
-In these use cases, it's frequent to hash a lot of small data (starting at a few bytes).
-Algorithm's performance can be very different for such scenarios, since parts of the algorithm,
-such as initialization or finalization, become fixed cost.
-The impact of branch mis-prediction also becomes much more present.
-
-XXH3 has been designed for excellent performance on both long and small inputs,
-which can be observed in the following graph:
-
-![XXH3, latency, random size](https://user-images.githubusercontent.com/750081/61976089-aedeab00-af9f-11e9-9239-e5375d6c080f.png)
-
-For a more detailed analysis, visit the wiki :
-https://github.com/Cyan4973/xxHash/wiki/Performance-comparison#benchmarks-concentrating-on-small-data-
-
-Quality
--------------------------
-
-Speed is not the only property that matters.
-Produced hash values must respect excellent dispersion and randomness properties,
-so that any sub-section of it can be used to maximally spread out a table or index,
-as well as reduce the amount of collisions to the minimal theoretical level, following the [birthday paradox].
-
-`xxHash` has been tested with Austin Appleby's excellent SMHasher test suite,
-and passes all tests, ensuring reasonable quality levels.
-It also passes extended tests from [newer forks of SMHasher], featuring additional scenarios and conditions.
-
-Finally, xxHash provides its own [massive collision tester](https://github.com/Cyan4973/xxHash/tree/dev/tests/collisions),
-able to generate and compare billions of hash to test the limits of 64-bit hash algorithms.
-On this front too, xxHash features good results, in line with the [birthday paradox].
-A more detailed analysis is documented [in the wiki](https://github.com/Cyan4973/xxHash/wiki/Collision-ratio-comparison).
-
-[birthday paradox]: https://en.wikipedia.org/wiki/Birthday_problem
-[newer forks of SMHasher]: https://github.com/rurban/smhasher
-
-
-### Build modifiers
-
-The following macros can be set at compilation time to modify libxxhash's behavior. They are generally disabled by default.
-
-- `XXH_INLINE_ALL`: Make all functions `inline`, with implementations being directly included within `xxhash.h`.
- Inlining functions is beneficial for speed on small keys.
- It's _extremely effective_ when key length is expressed as _a compile time constant_,
- with performance improvements observed in the +200% range .
- See [this article](https://fastcompression.blogspot.com/2018/03/xxhash-for-small-keys-impressive-power.html) for details.
-- `XXH_PRIVATE_API`: same outcome as `XXH_INLINE_ALL`. Still available for legacy support.
- The name underlines that `XXH_*` symbols will not be exported.
-- `XXH_NAMESPACE`: Prefixes all symbols with the value of `XXH_NAMESPACE`.
- This macro can only use compilable character set.
- Useful to evade symbol naming collisions,
- in case of multiple inclusions of xxHash's source code.
- Client applications still use the regular function names,
- as symbols are automatically translated through `xxhash.h`.
-- `XXH_FORCE_MEMORY_ACCESS`: The default method `0` uses a portable `memcpy()` notation.
- Method `1` uses a gcc-specific `packed` attribute, which can provide better performance for some targets.
- Method `2` forces unaligned reads, which is not standards compliant, but might sometimes be the only way to extract better read performance.
- Method `3` uses a byteshift operation, which is best for old compilers which don't inline `memcpy()` or big-endian systems without a byteswap instruction
-- `XXH_FORCE_ALIGN_CHECK`: Use a faster direct read path when input is aligned.
- This option can result in dramatic performance improvement when input to hash is aligned on 32 or 64-bit boundaries,
- when running on architectures unable to load memory from unaligned addresses, or suffering a performance penalty from it.
- It is (slightly) detrimental on platform with good unaligned memory access performance (same instruction for both aligned and unaligned accesses).
- This option is automatically disabled on `x86`, `x64` and `aarch64`, and enabled on all other platforms.
-- `XXH_VECTOR` : manually select a vector instruction set (default: auto-selected at compilation time). Available instruction sets are `XXH_SCALAR`, `XXH_SSE2`, `XXH_AVX2`, `XXH_AVX512`, `XXH_NEON` and `XXH_VSX`. Compiler may require additional flags to ensure proper support (for example, `gcc` on linux will require `-mavx2` for AVX2, and `-mavx512f` for AVX512).
-- `XXH_NO_PREFETCH` : disable prefetching. XXH3 only.
-- `XXH_PREFETCH_DIST` : select prefecting distance. XXH3 only.
-- `XXH_NO_INLINE_HINTS`: By default, xxHash uses `__attribute__((always_inline))` and `__forceinline` to improve performance at the cost of code size.
- Defining this macro to 1 will mark all internal functions as `static`, allowing the compiler to decide whether to inline a function or not.
- This is very useful when optimizing for smallest binary size,
- and is automatically defined when compiling with `-O0`, `-Os`, `-Oz`, or `-fno-inline` on GCC and Clang.
- This may also increase performance depending on compiler and architecture.
-- `XXH_REROLL`: Reduces the size of the generated code by not unrolling some loops.
- Impact on performance may vary, depending on platform and algorithm.
-- `XXH_ACCEPT_NULL_INPUT_POINTER`: if set to `1`, when input is a `NULL` pointer,
- xxHash'd result is the same as a zero-length input
- (instead of a dereference segfault).
- Adds one branch at the beginning of each hash.
-- `XXH_STATIC_LINKING_ONLY`: gives access to the state declaration for static allocation.
- Incompatible with dynamic linking, due to risks of ABI changes.
-- `XXH_NO_LONG_LONG`: removes compilation of algorithms relying on 64-bit types (XXH3 and XXH64). Only XXH32 will be compiled.
- Useful for targets (architectures and compilers) without 64-bit support.
-- `XXH_IMPORT`: MSVC specific: should only be defined for dynamic linking, as it prevents linkage errors.
-- `XXH_CPU_LITTLE_ENDIAN`: By default, endianess is determined by a runtime test resolved at compile time.
- If, for some reason, the compiler cannot simplify the runtime test, it can cost performance.
- It's possible to skip auto-detection and simply state that the architecture is little-endian by setting this macro to 1.
- Setting it to 0 states big-endian.
-
-For the Command Line Interface `xxhsum`, the following environment variables can also be set :
-- `DISPATCH=1` : use `xxh_x86dispatch.c`, to automatically select between `scalar`, `sse2`, `avx2` or `avx512` instruction set at runtime, depending on local host. This option is only valid for `x86`/`x64` systems.
-
-
-### Building xxHash - Using vcpkg
-
-You can download and install xxHash using the [vcpkg](https://github.com/Microsoft/vcpkg) dependency manager:
-
- git clone https://github.com/Microsoft/vcpkg.git
- cd vcpkg
- ./bootstrap-vcpkg.sh
- ./vcpkg integrate install
- ./vcpkg install xxhash
-
-The xxHash port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository.
-
-
-### Example
-
-The simplest example calls xxhash 64-bit variant as a one-shot function
-generating a hash value from a single buffer, and invoked from a C/C++ program:
-
-```C
-#include "xxhash.h"
-
- (...)
- XXH64_hash_t hash = XXH64(buffer, size, seed);
-}
-```
-
-Streaming variant is more involved, but makes it possible to provide data incrementally:
-
-```C
-#include "stdlib.h" /* abort() */
-#include "xxhash.h"
-
-
-XXH64_hash_t calcul_hash_streaming(FileHandler fh)
-{
- /* create a hash state */
- XXH64_state_t* const state = XXH64_createState();
- if (state==NULL) abort();
-
- size_t const bufferSize = SOME_SIZE;
- void* const buffer = malloc(bufferSize);
- if (buffer==NULL) abort();
-
- /* Initialize state with selected seed */
- XXH64_hash_t const seed = 0; /* or any other value */
- if (XXH64_reset(state, seed) == XXH_ERROR) abort();
-
- /* Feed the state with input data, any size, any number of times */
- (...)
- while ( /* some data left */ ) {
- size_t const length = get_more_data(buffer, bufferSize, fh);
- if (XXH64_update(state, buffer, length) == XXH_ERROR) abort();
- (...)
- }
- (...)
-
- /* Produce the final hash value */
- XXH64_hash_t const hash = XXH64_digest(state);
-
- /* State could be re-used; but in this example, it is simply freed */
- free(buffer);
- XXH64_freeState(state);
-
- return hash;
-}
-```
-
-
-### License
-
-The library files `xxhash.c` and `xxhash.h` are BSD licensed.
-The utility `xxhsum` is GPL licensed.
-
-
-### Other programming languages
-
-Beyond the C reference version,
-xxHash is also available from many different programming languages,
-thanks to great contributors.
-They are [listed here](http://www.xxhash.com/#other-languages).
-
-
-### Packaging status
-
-Many distributions bundle a package manager
-which allows easy xxhash installation as both a `libxxhash` library
-and `xxhsum` command line interface.
-
-[![Packaging status](https://repology.org/badge/vertical-allrepos/xxhash.svg)](https://repology.org/project/xxhash/versions)
-
-
-### Special Thanks
-
-- Takayuki Matsuoka, aka @t-mat, for creating `xxhsum -c` and great support during early xxh releases
-- Mathias Westerdahl, aka @JCash, for introducing the first version of `XXH64`
-- Devin Hussey, aka @easyaspi314, for incredible low-level optimizations on `XXH3` and `XXH128`
diff --git a/third_party/xxhash/appveyor.yml b/third_party/xxhash/appveyor.yml
deleted file mode 100644
index 850f48b14d..0000000000
--- a/third_party/xxhash/appveyor.yml
+++ /dev/null
@@ -1,111 +0,0 @@
-#---------------------------------#
-# general configuration #
-#---------------------------------#
-version: 1.0.{build}
-max_jobs: 2
-
-#---------------------------------#
-# environment configuration #
-#---------------------------------#
-clone_depth: 2
-environment:
- matrix:
- - COMPILER: "visual"
- ARCH: "x64"
- TEST_XXHSUM: "true"
- - COMPILER: "visual"
- ARCH: "x64"
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
- TEST_XXHSUM: "true"
- - COMPILER: "visual"
- ARCH: "Win32"
- TEST_XXHSUM: "true"
- - COMPILER: "visual"
- ARCH: "Win32"
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
- TEST_XXHSUM: "true"
- - COMPILER: "visual"
- ARCH: "ARM"
- - COMPILER: "visual"
- ARCH: "ARM64"
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
- # note: ARM64 is not available with Visual Studio 14 2015, which is default for Appveyor
- - COMPILER: "gcc"
- PLATFORM: "mingw64"
- - COMPILER: "gcc"
- PLATFORM: "mingw32"
- - COMPILER: "gcc"
- PLATFORM: "clang"
-
-install:
- - ECHO Installing %COMPILER% %PLATFORM% %ARCH%
- - MKDIR bin
- - if [%COMPILER%]==[gcc] SET PATH_ORIGINAL=%PATH%
- - if [%COMPILER%]==[gcc] (
- SET "PATH_MINGW32=c:\MinGW\bin;c:\MinGW\usr\bin" &&
- SET "PATH_MINGW64=c:\msys64\mingw64\bin;c:\msys64\usr\bin" &&
- COPY C:\MinGW\bin\mingw32-make.exe C:\MinGW\bin\make.exe &&
- COPY C:\MinGW\bin\gcc.exe C:\MinGW\bin\cc.exe
- )
-
-#---------------------------------#
-# build configuration #
-#---------------------------------#
-build_script:
- - if [%PLATFORM%]==[mingw32] SET PATH=%PATH_MINGW32%;%PATH_ORIGINAL%
- - if [%PLATFORM%]==[mingw64] SET PATH=%PATH_MINGW64%;%PATH_ORIGINAL%
- - if [%PLATFORM%]==[clang] SET PATH=%PATH_MINGW64%;%PATH_ORIGINAL%
- - ECHO ***
- - ECHO Building %COMPILER% %PLATFORM% %ARCH%
- - ECHO ***
-
- - if [%COMPILER%]==[gcc] (
- if [%PLATFORM%]==[clang] (
- clang -v
- ) ELSE (
- gcc -v
- )
- )
- - if [%COMPILER%]==[gcc] (
- echo ----- &&
- make -v &&
- echo ----- &&
- if not [%PLATFORM%]==[clang] (
- if [%PLATFORM%]==[mingw32] ( SET CPPFLAGS=-DPOOL_MT=0 ) &&
- make -B clean test MOREFLAGS=-Werror
- ) ELSE (
- SET CXXFLAGS=--std=c++14 &&
- make -B clean test CC=clang CXX=clang++ MOREFLAGS="--target=x86_64-w64-mingw32 -Werror -Wno-pass-failed" NO_C90_TEST=true
- ) &&
- make -C tests/bench
- )
- # note 1: strict c90 tests with clang fail, due to (erroneous) presence on `inline` keyword in some included system file
- # note 2: multi-threading code doesn't work with mingw32, disabled through POOL_MT=0
- # note 3: clang requires C++14 to compile sort because its own code contains c++14-only code
-
- - if [%COMPILER%]==[visual] (
- cd cmake_unofficial &&
- cmake . -DCMAKE_BUILD_TYPE=Release -A %ARCH% -DXXHASH_C_FLAGS="/WX" &&
- cmake --build . --config Release
- )
-
-#---------------------------------#
-# tests configuration #
-#---------------------------------#
-test_script:
- # note: can only run x86 and x64 binaries on Appveyor
- # note: if %COMPILER%==gcc, xxhsum was already tested within `make test`
- - if [%TEST_XXHSUM%]==[true] (
- ECHO *** &&
- ECHO Testing %COMPILER% %PLATFORM% %ARCH% &&
- ECHO *** &&
- cd Release &&
- xxhsum.exe -bi1 &&
- ECHO ------- xxhsum tested -------
- )
-
-
-#---------------------------------#
-# artifacts configuration #
-#---------------------------------#
-# none yet
diff --git a/third_party/xxhash/cli/xsum_arch.h b/third_party/xxhash/cli/xsum_arch.h
deleted file mode 100644
index cc39297972..0000000000
--- a/third_party/xxhash/cli/xsum_arch.h
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * xxhsum - Command line interface for xxhash algorithms
- * Copyright (C) 2013-2020 Yann Collet
- *
- * GPL v2 License
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * You can contact the author at:
- * - xxHash homepage: https://www.xxhash.com
- * - xxHash source repository: https://github.com/Cyan4973/xxHash
- */
-
-/*
- * Checks for predefined macros by the compiler to try and get both the arch
- * and the compiler version.
- */
-#ifndef XSUM_ARCH_H
-#define XSUM_ARCH_H
-
-#include "xsum_config.h"
-
-#define XSUM_LIB_VERSION XXH_VERSION_MAJOR.XXH_VERSION_MINOR.XXH_VERSION_RELEASE
-#define XSUM_QUOTE(str) #str
-#define XSUM_EXPAND_AND_QUOTE(str) XSUM_QUOTE(str)
-#define XSUM_PROGRAM_VERSION XSUM_EXPAND_AND_QUOTE(XSUM_LIB_VERSION)
-
-
-/* Show compiler versions in WELCOME_MESSAGE. XSUM_CC_VERSION_FMT will return the printf specifiers,
- * and VERSION will contain the comma separated list of arguments to the XSUM_CC_VERSION_FMT string. */
-#if defined(__clang_version__)
-/* Clang does its own thing. */
-# ifdef __apple_build_version__
-# define XSUM_CC_VERSION_FMT "Apple Clang %s"
-# else
-# define XSUM_CC_VERSION_FMT "Clang %s"
-# endif
-# define XSUM_CC_VERSION __clang_version__
-#elif defined(__VERSION__)
-/* GCC and ICC */
-# define XSUM_CC_VERSION_FMT "%s"
-# ifdef __INTEL_COMPILER /* icc adds its prefix */
-# define XSUM_CC_VERSION __VERSION__
-# else /* assume GCC */
-# define XSUM_CC_VERSION "GCC " __VERSION__
-# endif
-#elif defined(_MSC_FULL_VER) && defined(_MSC_BUILD)
-/*
- * MSVC
- * "For example, if the version number of the Visual C++ compiler is
- * 15.00.20706.01, the _MSC_FULL_VER macro evaluates to 150020706."
- *
- * https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=vs-2017
- */
-# define XSUM_CC_VERSION_FMT "MSVC %02i.%02i.%05i.%02i"
-# define XSUM_CC_VERSION _MSC_FULL_VER / 10000000 % 100, _MSC_FULL_VER / 100000 % 100, _MSC_FULL_VER % 100000, _MSC_BUILD
-#elif defined(_MSC_VER) /* old MSVC */
-# define XSUM_CC_VERSION_FMT "MSVC %02i.%02i"
-# define XSUM_CC_VERSION _MSC_VER / 100, _MSC_VER % 100
-#elif defined(__TINYC__)
-/* tcc stores its version in the __TINYC__ macro. */
-# define XSUM_CC_VERSION_FMT "tcc %i.%i.%i"
-# define XSUM_CC_VERSION __TINYC__ / 10000 % 100, __TINYC__ / 100 % 100, __TINYC__ % 100
-#else
-# define XSUM_CC_VERSION_FMT "%s"
-# define XSUM_CC_VERSION "unknown compiler"
-#endif
-
-/* makes the next part easier */
-#if defined(__x86_64__) || defined(_M_AMD64) || defined(_M_X64)
-# define XSUM_ARCH_X64 1
-# define XSUM_ARCH_X86 "x86_64"
-#elif defined(__i386__) || defined(_M_IX86) || defined(_M_IX86_FP)
-# define XSUM_ARCH_X86 "i386"
-#endif
-
-/* Try to detect the architecture. */
-#if defined(XSUM_ARCH_X86)
-# if defined(XXHSUM_DISPATCH)
-# define XSUM_ARCH XSUM_ARCH_X86 " autoVec"
-# elif defined(__AVX512F__)
-# define XSUM_ARCH XSUM_ARCH_X86 " + AVX512"
-# elif defined(__AVX2__)
-# define XSUM_ARCH XSUM_ARCH_X86 " + AVX2"
-# elif defined(__AVX__)
-# define XSUM_ARCH XSUM_ARCH_X86 " + AVX"
-# elif defined(_M_X64) || defined(_M_AMD64) || defined(__x86_64__) \
- || defined(__SSE2__) || (defined(_M_IX86_FP) && _M_IX86_FP == 2)
-# define XSUM_ARCH XSUM_ARCH_X86 " + SSE2"
-# else
-# define XSUM_ARCH XSUM_ARCH_X86
-# endif
-#elif defined(__aarch64__) || defined(__arm64__) || defined(_M_ARM64)
-# define XSUM_ARCH "aarch64 + NEON"
-#elif defined(__arm__) || defined(__thumb__) || defined(__thumb2__) || defined(_M_ARM)
-/* ARM has a lot of different features that can change xxHash significantly. */
-# if defined(__thumb2__) || (defined(__thumb__) && (__thumb__ == 2 || __ARM_ARCH >= 7))
-# define XSUM_ARCH_THUMB " Thumb-2"
-# elif defined(__thumb__)
-# define XSUM_ARCH_THUMB " Thumb-1"
-# else
-# define XSUM_ARCH_THUMB ""
-# endif
-/* ARMv7 has unaligned by default */
-# if defined(__ARM_FEATURE_UNALIGNED) || __ARM_ARCH >= 7 || defined(_M_ARMV7VE)
-# define XSUM_ARCH_UNALIGNED " + unaligned"
-# else
-# define XSUM_ARCH_UNALIGNED ""
-# endif
-# if defined(__ARM_NEON) || defined(__ARM_NEON__)
-# define XSUM_ARCH_NEON " + NEON"
-# else
-# define XSUM_ARCH_NEON ""
-# endif
-# define XSUM_ARCH "ARMv" XSUM_EXPAND_AND_QUOTE(__ARM_ARCH) XSUM_ARCH_THUMB XSUM_ARCH_NEON XSUM_ARCH_UNALIGNED
-#elif defined(__powerpc64__) || defined(__ppc64__) || defined(__PPC64__)
-# if defined(__GNUC__) && defined(__POWER9_VECTOR__)
-# define XSUM_ARCH "ppc64 + POWER9 vector"
-# elif defined(__GNUC__) && defined(__POWER8_VECTOR__)
-# define XSUM_ARCH "ppc64 + POWER8 vector"
-# else
-# define XSUM_ARCH "ppc64"
-# endif
-#elif defined(__powerpc__) || defined(__ppc__) || defined(__PPC__)
-# define XSUM_ARCH "ppc"
-#elif defined(__AVR)
-# define XSUM_ARCH "AVR"
-#elif defined(__mips64)
-# define XSUM_ARCH "mips64"
-#elif defined(__mips)
-# define XSUM_ARCH "mips"
-#elif defined(__s390x__)
-# define XSUM_ARCH "s390x"
-#elif defined(__s390__)
-# define XSUM_ARCH "s390"
-#else
-# define XSUM_ARCH "unknown"
-#endif
-
-
-#endif /* XSUM_ARCH_H */
diff --git a/third_party/xxhash/cli/xsum_config.h b/third_party/xxhash/cli/xsum_config.h
deleted file mode 100644
index 9222144d0e..0000000000
--- a/third_party/xxhash/cli/xsum_config.h
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * xxhsum - Command line interface for xxhash algorithms
- * Copyright (C) 2013-2020 Yann Collet
- *
- * GPL v2 License
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * You can contact the author at:
- * - xxHash homepage: https://www.xxhash.com
- * - xxHash source repository: https://github.com/Cyan4973/xxHash
- */
-
-/*
- * This contains various configuration parameters and feature detection for
- * xxhsum.
- *
- * Similar to config.h in Autotools, this should be the first header included.
- */
-
-#ifndef XSUM_CONFIG_H
-#define XSUM_CONFIG_H
-
-
-/* ************************************
- * Compiler Options
- **************************************/
-/*
- * Disable Visual C's warnings when using the "insecure" CRT functions instead
- * of the "secure" _s functions.
- *
- * These functions are not portable, and aren't necessary if you are using the
- * original functions properly.
- */
-#if defined(_MSC_VER) || defined(_WIN32)
-# ifndef _CRT_SECURE_NO_WARNINGS
-# define _CRT_SECURE_NO_WARNINGS
-# endif
-#endif
-
-/* Under Linux at least, pull in the *64 commands */
-#ifndef _LARGEFILE64_SOURCE
-# define _LARGEFILE64_SOURCE
-#endif
-#ifndef _FILE_OFFSET_BITS
-# define _FILE_OFFSET_BITS 64
-#endif
-
-/*
- * So we can use __attribute__((__format__))
- */
-#ifdef __GNUC__
-# define XSUM_ATTRIBUTE(x) __attribute__(x)
-#else
-# define XSUM_ATTRIBUTE(x)
-#endif
-
-#if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__)) /* UNIX-like OS */ \
- || defined(__midipix__) || defined(__VMS))
-# if (defined(__APPLE__) && defined(__MACH__)) || defined(__SVR4) || defined(_AIX) || defined(__hpux) /* POSIX.1-2001 (SUSv3) conformant */ \
- || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) /* BSD distros */
-# define XSUM_PLATFORM_POSIX_VERSION 200112L
-# else
-# if defined(__linux__) || defined(__linux)
-# ifndef _POSIX_C_SOURCE
-# define _POSIX_C_SOURCE 200112L /* use feature test macro */
-# endif
-# endif
-# include <unistd.h> /* declares _POSIX_VERSION */
-# if defined(_POSIX_VERSION) /* POSIX compliant */
-# define XSUM_PLATFORM_POSIX_VERSION _POSIX_VERSION
-# else
-# define XSUM_PLATFORM_POSIX_VERSION 0
-# endif
-# endif
-#endif
-#if !defined(XSUM_PLATFORM_POSIX_VERSION)
-# define XSUM_PLATFORM_POSIX_VERSION -1
-#endif
-
-#if !defined(S_ISREG)
-# define S_ISREG(x) (((x) & S_IFMT) == S_IFREG)
-#endif
-
-
-/* ************************************
- * Windows helpers
- **************************************/
-
-/*
- * Whether to use the Windows UTF-16 APIs instead of the portable libc 8-bit
- * ("ANSI") APIs.
- *
- * Windows is not UTF-8 clean by default, and the only way to access every file
- * on the OS is to use UTF-16.
- *
- * Do note that xxhsum uses UTF-8 internally and only uses UTF-16 for command
- * line arguments, console I/O, and opening files.
- *
- * Additionally, this guarantees all piped output is UTF-8.
- */
-#if defined(XSUM_WIN32_USE_WCHAR) && !defined(_WIN32)
-/* We use Windows APIs, only use this on Windows. */
-# undef XSUM_WIN32_USE_WCHAR
-#endif
-
-#ifndef XSUM_WIN32_USE_WCHAR
-# if defined(_WIN32)
-# include <wchar.h>
-# if WCHAR_MAX == 0xFFFFU /* UTF-16 wchar_t */
-# define XSUM_WIN32_USE_WCHAR 1
-# else
-# define XSUM_WIN32_USE_WCHAR 0
-# endif
-# else
-# define XSUM_WIN32_USE_WCHAR 0
-# endif
-#endif
-
-#if !XSUM_WIN32_USE_WCHAR
-/*
- * It doesn't make sense to have one without the other.
- * Due to XSUM_WIN32_USE_WCHAR being undef'd, this also handles
- * non-WIN32 platforms.
- */
-# undef XSUM_WIN32_USE_WMAIN
-# define XSUM_WIN32_USE_WMAIN 0
-#else
-/*
- * Whether to use wmain() or main().
- *
- * wmain() is preferred because we don't have to mess with internal hidden
- * APIs.
- *
- * It always works on MSVC, but in MinGW, it only works on MinGW-w64 with the
- * -municode flag.
- *
- * Therefore we have to use main() -- there is no better option.
- */
-# ifndef XSUM_WIN32_USE_WMAIN
-# if defined(_UNICODE) || defined(UNICODE) /* MinGW -municode */ \
- || defined(_MSC_VER) /* MSVC */
-# define XSUM_WIN32_USE_WMAIN 1
-# else
-# define XSUM_WIN32_USE_WMAIN 0
-# endif
-# endif
-/*
- * It is always good practice to define these to prevent accidental use of the
- * ANSI APIs, even if the program primarily uses UTF-8.
- */
-# ifndef _UNICODE
-# define _UNICODE
-# endif
-# ifndef UNICODE
-# define UNICODE
-# endif
-#endif /* XSUM_WIN32_USE_WCHAR */
-
-#ifndef XSUM_API
-# ifdef XXH_INLINE_ALL
-# define XSUM_API static
-# else
-# define XSUM_API
-# endif
-#endif
-
-#ifndef XSUM_NO_TESTS
-# define XSUM_NO_TESTS 0
-#endif
-
-/* ***************************
- * Basic types
- * ***************************/
-
-#if defined(__cplusplus) /* C++ */ \
- || (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) /* C99 */
-# include <stdint.h>
- typedef uint8_t XSUM_U8;
- typedef uint32_t XSUM_U32;
- typedef uint64_t XSUM_U64;
-# else
-# include <limits.h>
- typedef unsigned char XSUM_U8;
-# if UINT_MAX == 0xFFFFFFFFUL
- typedef unsigned int XSUM_U32;
-# else
- typedef unsigned long XSUM_U32;
-# endif
- typedef unsigned long long XSUM_U64;
-#endif /* not C++/C99 */
-
-#endif /* XSUM_CONFIG_H */
diff --git a/third_party/xxhash/cli/xsum_os_specific.c b/third_party/xxhash/cli/xsum_os_specific.c
deleted file mode 100644
index 8f48ce0762..0000000000
--- a/third_party/xxhash/cli/xsum_os_specific.c
+++ /dev/null
@@ -1,487 +0,0 @@
-/*
- * xxhsum - Command line interface for xxhash algorithms
- * Copyright (C) 2013-2020 Yann Collet
- *
- * GPL v2 License
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * You can contact the author at:
- * - xxHash homepage: https://www.xxhash.com
- * - xxHash source repository: https://github.com/Cyan4973/xxHash
- */
-
-#include "xsum_config.h"
-#include "xsum_os_specific.h"
-#include <stdio.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <sys/types.h> /* struct stat / __wstat64 */
-#include <sys/stat.h> /* stat() / _stat64() */
-
-/*
- * This file contains all of the ugly boilerplate to make xxhsum work across
- * platforms.
- */
-#if defined(_MSC_VER) || XSUM_WIN32_USE_WCHAR
- typedef struct __stat64 XSUM_stat_t;
-# if defined(_MSC_VER)
- typedef int mode_t;
-# endif
-#else
- typedef struct stat XSUM_stat_t;
-#endif
-
-#if (defined(__linux__) && (XSUM_PLATFORM_POSIX_VERSION >= 1)) \
- || (XSUM_PLATFORM_POSIX_VERSION >= 200112L) \
- || defined(__DJGPP__) \
- || defined(__MSYS__)
-# include <unistd.h> /* isatty */
-# define XSUM_IS_CONSOLE(stdStream) isatty(fileno(stdStream))
-#elif defined(MSDOS) || defined(OS2)
-# include <io.h> /* _isatty */
-# define XSUM_IS_CONSOLE(stdStream) _isatty(_fileno(stdStream))
-#elif defined(WIN32) || defined(_WIN32)
-# include <io.h> /* _isatty */
-# include <windows.h> /* DeviceIoControl, HANDLE, FSCTL_SET_SPARSE */
-# include <stdio.h> /* FILE */
-static __inline int XSUM_IS_CONSOLE(FILE* stdStream)
-{
- DWORD dummy;
- return _isatty(_fileno(stdStream)) && GetConsoleMode((HANDLE)_get_osfhandle(_fileno(stdStream)), &dummy);
-}
-#else
-# define XSUM_IS_CONSOLE(stdStream) 0
-#endif
-
-#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(_WIN32)
-# include <fcntl.h> /* _O_BINARY */
-# include <io.h> /* _setmode, _fileno, _get_osfhandle */
-# if !defined(__DJGPP__)
-# include <windows.h> /* DeviceIoControl, HANDLE, FSCTL_SET_SPARSE */
-# include <winioctl.h> /* FSCTL_SET_SPARSE */
-# define XSUM_SET_BINARY_MODE(file) { int const unused=_setmode(_fileno(file), _O_BINARY); (void)unused; }
-# else
-# define XSUM_SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY)
-# endif
-#else
-# define XSUM_SET_BINARY_MODE(file) ((void)file)
-#endif
-
-XSUM_API int XSUM_isConsole(FILE* stream)
-{
- return XSUM_IS_CONSOLE(stream);
-}
-
-XSUM_API void XSUM_setBinaryMode(FILE* stream)
-{
- XSUM_SET_BINARY_MODE(stream);
-}
-
-#if !XSUM_WIN32_USE_WCHAR
-
-XSUM_API FILE* XSUM_fopen(const char* filename, const char* mode)
-{
- return fopen(filename, mode);
-}
-XSUM_ATTRIBUTE((__format__(__printf__, 2, 0)))
-XSUM_API int XSUM_vfprintf(FILE* stream, const char* format, va_list ap)
-{
- return vfprintf(stream, format, ap);
-}
-
-static int XSUM_stat(const char* infilename, XSUM_stat_t* statbuf)
-{
-#if defined(_MSC_VER)
- return _stat64(infilename, statbuf);
-#else
- return stat(infilename, statbuf);
-#endif
-}
-
-#ifndef XSUM_NO_MAIN
-int main(int argc, char* argv[])
-{
- return XSUM_main(argc, argv);
-}
-#endif
-
-/* Unicode helpers for Windows to make UTF-8 act as it should. */
-#else
-# include <windows.h>
-# include <wchar.h>
-
-/*****************************************************************************
- * Unicode conversion tools
- *****************************************************************************/
-
-/*
- * Converts a UTF-8 string to UTF-16. Acts like strdup. The string must be freed afterwards.
- * This version allows keeping the output length.
- */
-static wchar_t* XSUM_widenString(const char* str, int* lenOut)
-{
- int const len = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
- if (lenOut != NULL) *lenOut = len;
- if (len == 0) return NULL;
- { wchar_t* buf = (wchar_t*)malloc((size_t)len * sizeof(wchar_t));
- if (buf != NULL) {
- if (MultiByteToWideChar(CP_UTF8, 0, str, -1, buf, len) == 0) {
- free(buf);
- return NULL;
- } }
- return buf;
- }
-}
-
-/*
- * Converts a UTF-16 string to UTF-8. Acts like strdup. The string must be freed afterwards.
- * This version allows keeping the output length.
- */
-static char* XSUM_narrowString(const wchar_t *str, int *lenOut)
-{
- int len = WideCharToMultiByte(CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL);
- if (lenOut != NULL) *lenOut = len;
- if (len == 0) return NULL;
- { char* const buf = (char*)malloc((size_t)len * sizeof(char));
- if (buf != NULL) {
- if (WideCharToMultiByte(CP_UTF8, 0, str, -1, buf, len, NULL, NULL) == 0) {
- free(buf);
- return NULL;
- } }
- return buf;
- }
-}
-
-
-
-/*****************************************************************************
- * File helpers
- *****************************************************************************/
-/*
- * fopen wrapper that supports UTF-8
- *
- * fopen will only accept ANSI filenames, which means that we can't open Unicode filenames.
- *
- * In order to open a Unicode filename, we need to convert filenames to UTF-16 and use _wfopen.
- */
-XSUM_API FILE* XSUM_fopen(const char* filename, const char* mode)
-{
- FILE* f = NULL;
- wchar_t* const wide_filename = XSUM_widenString(filename, NULL);
- if (wide_filename != NULL) {
- wchar_t* const wide_mode = XSUM_widenString(mode, NULL);
- if (wide_mode != NULL) {
- f = _wfopen(wide_filename, wide_mode);
- free(wide_mode);
- }
- free(wide_filename);
- }
- return f;
-}
-
-/*
- * stat() wrapper which supports UTF-8 filenames.
- */
-static int XSUM_stat(const char* infilename, XSUM_stat_t* statbuf)
-{
- int r = -1;
- wchar_t* const wide_filename = XSUM_widenString(infilename, NULL);
- if (wide_filename != NULL) {
- r = _wstat64(wide_filename, statbuf);
- free(wide_filename);
- }
- return r;
-}
-
-/*
- * In case it isn't available, this is what MSVC 2019 defines in stdarg.h.
- */
-#if defined(_MSC_VER) && !defined(__clang__) && !defined(va_copy)
-# define XSUM_va_copy(destination, source) ((destination) = (source))
-#else
-# define XSUM_va_copy(destination, source) va_copy(destination, source)
-#endif
-
-/*
- * vasprintf for Windows.
- */
-XSUM_ATTRIBUTE((__format__(__printf__, 2, 0)))
-static int XSUM_vasprintf(char** strp, const char* format, va_list ap)
-{
- int ret;
- int size;
- va_list copy;
- /*
- * To be safe, make a va_copy.
- *
- * Note that Microsoft doesn't use va_copy in its sample code:
- * https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/vsprintf-vsprintf-l-vswprintf-vswprintf-l-vswprintf-l?view=vs-2019
- */
- XSUM_va_copy(copy, ap);
- /* Calculate how many characters we need */
- size = _vscprintf(format, ap);
- va_end(copy);
-
- if (size < 0) {
- *strp = NULL;
- return size;
- } else {
- *strp = (char*) malloc((size_t)size + 1);
- if (*strp == NULL) {
- return -1;
- }
- /* vsprintf into the new buffer */
- ret = vsprintf(*strp, format, ap);
- if (ret < 0) {
- free(*strp);
- *strp = NULL;
- }
- return ret;
- }
-}
-
-/*
- * fprintf wrapper that supports UTF-8.
- *
- * fprintf doesn't properly handle Unicode on Windows.
- *
- * Additionally, it is codepage sensitive on console and may crash the program.
- *
- * Instead, we use vsnprintf, and either print with fwrite or convert to UTF-16
- * for console output and use the codepage-independent WriteConsoleW.
- *
- * Credit to t-mat: https://github.com/t-mat/xxHash/commit/5691423
- */
-XSUM_ATTRIBUTE((__format__(__printf__, 2, 0)))
-XSUM_API int XSUM_vfprintf(FILE *stream, const char *format, va_list ap)
-{
- int result;
- char* u8_str = NULL;
-
- /*
- * Generate the UTF-8 output string with vasprintf.
- */
- result = XSUM_vasprintf(&u8_str, format, ap);
-
- if (result >= 0) {
- const size_t nchar = (size_t)result + 1;
-
- /*
- * Check if we are outputting to a console. Don't use XSUM_isConsole
- * directly -- we don't need to call _get_osfhandle twice.
- */
- int fileNb = _fileno(stream);
- intptr_t handle_raw = _get_osfhandle(fileNb);
- HANDLE handle = (HANDLE)handle_raw;
- DWORD dwTemp;
-
- if (handle_raw < 0) {
- result = -1;
- } else if (_isatty(fileNb) && GetConsoleMode(handle, &dwTemp)) {
- /*
- * Convert to UTF-16 and output with WriteConsoleW.
- *
- * This is codepage independent and works on Windows XP's default
- * msvcrt.dll.
- */
- int len;
- wchar_t* const u16_buf = XSUM_widenString(u8_str, &len);
- if (u16_buf == NULL) {
- result = -1;
- } else {
- if (WriteConsoleW(handle, u16_buf, (DWORD)len - 1, &dwTemp, NULL)) {
- result = (int)dwTemp;
- } else {
- result = -1;
- }
- free(u16_buf);
- }
- } else {
- /* fwrite the UTF-8 string if we are printing to a file */
- result = (int)fwrite(u8_str, 1, nchar - 1, stream);
- if (result == 0) {
- result = -1;
- }
- }
- free(u8_str);
- }
- return result;
-}
-
-#ifndef XSUM_NO_MAIN
-/*****************************************************************************
- * Command Line argument parsing
- *****************************************************************************/
-
-/* Converts a UTF-16 argv to UTF-8. */
-static char** XSUM_convertArgv(int argc, wchar_t* utf16_argv[])
-{
- char** const utf8_argv = (char**)malloc((size_t)(argc + 1) * sizeof(char*));
- if (utf8_argv != NULL) {
- int i;
- for (i = 0; i < argc; i++) {
- utf8_argv[i] = XSUM_narrowString(utf16_argv[i], NULL);
- if (utf8_argv[i] == NULL) {
- /* Out of memory, whoops. */
- while (i-- > 0) {
- free(utf8_argv[i]);
- }
- free(utf8_argv);
- return NULL;
- }
- }
- utf8_argv[argc] = NULL;
- }
- return utf8_argv;
-}
-/* Frees arguments returned by XSUM_convertArgv */
-static void XSUM_freeArgv(int argc, char** argv)
-{
- int i;
- if (argv == NULL) {
- return;
- }
- for (i = 0; i < argc; i++) {
- free(argv[i]);
- }
- free(argv);
-}
-
-static int XSUM_wmain(int argc, wchar_t* utf16_argv[])
-{
- /* Convert the UTF-16 arguments to UTF-8. */
- char** utf8_argv = XSUM_convertArgv(argc, utf16_argv);
-
- if (utf8_argv == NULL) {
- /* An unfortunate but incredibly unlikely error. */
- fprintf(stderr, "xxhsum: error converting command line arguments!\n");
- abort();
- } else {
- int ret;
-
- /*
- * MinGW's terminal uses full block buffering for stderr.
- *
- * This is nonstandard behavior and causes text to not display until
- * the buffer fills.
- *
- * `setvbuf()` can easily correct this to make text display instantly.
- */
- setvbuf(stderr, NULL, _IONBF, 0);
-
- /* Call our real main function */
- ret = XSUM_main(argc, utf8_argv);
-
- /* Cleanup */
- XSUM_freeArgv(argc, utf8_argv);
- return ret;
- }
-}
-
-#if XSUM_WIN32_USE_WMAIN
-
-/*
- * The preferred method of obtaining the real UTF-16 arguments. Always works
- * on MSVC, sometimes works on MinGW-w64 depending on the compiler flags.
- */
-#ifdef __cplusplus
-extern "C"
-#endif
-int __cdecl wmain(int argc, wchar_t* utf16_argv[])
-{
- return XSUM_wmain(argc, utf16_argv);
-}
-#else /* !XSUM_WIN32_USE_WMAIN */
-
-/*
- * Wrap `XSUM_wmain()` using `main()` and `__wgetmainargs()` on MinGW without
- * Unicode support.
- *
- * `__wgetmainargs()` is used in the CRT startup to retrieve the arguments for
- * `wmain()`, so we use it on MinGW to emulate `wmain()`.
- *
- * It is an internal function and not declared in any public headers, so we
- * have to declare it manually.
- *
- * An alternative that doesn't mess with internal APIs is `GetCommandLineW()`
- * with `CommandLineToArgvW()`, but the former doesn't expand wildcards and the
- * latter requires linking to Shell32.dll and its numerous dependencies.
- *
- * This method keeps our dependencies to kernel32.dll and the CRT.
- *
- * https://docs.microsoft.com/en-us/cpp/c-runtime-library/getmainargs-wgetmainargs?view=vs-2019
- */
-typedef struct {
- int newmode;
-} _startupinfo;
-
-#ifdef __cplusplus
-extern "C"
-#endif
-int __cdecl __wgetmainargs(
- int* Argc,
- wchar_t*** Argv,
- wchar_t*** Env,
- int DoWildCard,
- _startupinfo* StartInfo
-);
-
-int main(int ansi_argc, char* ansi_argv[])
-{
- int utf16_argc;
- wchar_t** utf16_argv;
- wchar_t** utf16_envp; /* Unused but required */
- _startupinfo startinfo = {0}; /* 0 == don't change new mode */
-
- /* Get wmain's UTF-16 arguments. Make sure we expand wildcards. */
- if (__wgetmainargs(&utf16_argc, &utf16_argv, &utf16_envp, 1, &startinfo) < 0)
- /* In the very unlikely case of an error, use the ANSI arguments. */
- return XSUM_main(ansi_argc, ansi_argv);
-
- /* Call XSUM_wmain with our UTF-16 arguments */
- return XSUM_wmain(utf16_argc, utf16_argv);
-}
-
-#endif /* !XSUM_WIN32_USE_WMAIN */
-#endif /* !XSUM_NO_MAIN */
-#endif /* XSUM_WIN32_USE_WCHAR */
-
-
-/*
- * Determines whether the file at filename is a directory.
- */
-XSUM_API int XSUM_isDirectory(const char* filename)
-{
- XSUM_stat_t statbuf;
- int r = XSUM_stat(filename, &statbuf);
-#ifdef _MSC_VER
- if (!r && (statbuf.st_mode & _S_IFDIR)) return 1;
-#else
- if (!r && S_ISDIR(statbuf.st_mode)) return 1;
-#endif
- return 0;
-}
-
-/*
- * Returns the filesize of the file at filename.
- */
-XSUM_API XSUM_U64 XSUM_getFileSize(const char* filename)
-{
- XSUM_stat_t statbuf;
- int r = XSUM_stat(filename, &statbuf);
- if (r || !S_ISREG(statbuf.st_mode)) return 0; /* No good... */
- return (XSUM_U64)statbuf.st_size;
-}
diff --git a/third_party/xxhash/cli/xsum_os_specific.h b/third_party/xxhash/cli/xsum_os_specific.h
deleted file mode 100644
index b3562b260d..0000000000
--- a/third_party/xxhash/cli/xsum_os_specific.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * xxhsum - Command line interface for xxhash algorithms
- * Copyright (C) 2013-2020 Yann Collet
- *
- * GPL v2 License
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * You can contact the author at:
- * - xxHash homepage: https://www.xxhash.com
- * - xxHash source repository: https://github.com/Cyan4973/xxHash
- */
-
-#ifndef XSUM_OS_SPECIFIC_H
-#define XSUM_OS_SPECIFIC_H
-
-#include "xsum_config.h"
-#include <stdio.h>
-#include <stdarg.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * Declared here to be implemented in user code.
- *
- * Functions like main(), but is passed UTF-8 arguments even on Windows.
- */
-XSUM_API int XSUM_main(int argc, char* argv[]);
-
-/*
- * Returns whether stream is a console.
- *
- * Functionally equivalent to isatty(fileno(stream)).
- */
-XSUM_API int XSUM_isConsole(FILE* stream);
-
-/*
- * Sets stream to pure binary mode (a.k.a. no CRLF conversions).
- */
-XSUM_API void XSUM_setBinaryMode(FILE* stream);
-
-/*
- * Returns whether the file at filename is a directory.
- */
-XSUM_API int XSUM_isDirectory(const char* filename);
-
-/*
- * Returns the file size of the file at filename.
- */
-XSUM_API XSUM_U64 XSUM_getFileSize(const char* filename);
-
-/*
- * UTF-8 stdio wrappers primarily for Windows
- */
-
-/*
- * fopen() wrapper. Accepts UTF-8 filenames on Windows.
- *
- * Specifically, on Windows, the arguments will be converted to UTF-16
- * and passed to _wfopen().
- */
-XSUM_API FILE* XSUM_fopen(const char* filename, const char* mode);
-
-/*
- * vfprintf() wrapper which prints UTF-8 strings to Windows consoles
- * if applicable.
- */
-XSUM_ATTRIBUTE((__format__(__printf__, 2, 0)))
-XSUM_API int XSUM_vfprintf(FILE* stream, const char* format, va_list ap);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* XSUM_OS_SPECIFIC_H */
diff --git a/third_party/xxhash/cli/xsum_output.c b/third_party/xxhash/cli/xsum_output.c
deleted file mode 100644
index a4d741154d..0000000000
--- a/third_party/xxhash/cli/xsum_output.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * xxhsum - Command line interface for xxhash algorithms
- * Copyright (C) 2013-2020 Yann Collet
- *
- * GPL v2 License
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * You can contact the author at:
- * - xxHash homepage: https://www.xxhash.com
- * - xxHash source repository: https://github.com/Cyan4973/xxHash
- */
-
-#include "xsum_output.h"
-#include "xsum_os_specific.h"
-#include <stdio.h>
-
-int XSUM_logLevel = 2;
-
-XSUM_ATTRIBUTE((__format__(__printf__, 1, 2)))
-XSUM_API int XSUM_log(const char* format, ...)
-{
- int ret;
- va_list ap;
- va_start(ap, format);
- ret = XSUM_vfprintf(stderr, format, ap);
- va_end(ap);
- return ret;
-}
-
-
-XSUM_ATTRIBUTE((__format__(__printf__, 1, 2)))
-XSUM_API int XSUM_output(const char* format, ...)
-{
- int ret;
- va_list ap;
- va_start(ap, format);
- ret = XSUM_vfprintf(stdout, format, ap);
- va_end(ap);
- return ret;
-}
-
-XSUM_ATTRIBUTE((__format__(__printf__, 2, 3)))
-XSUM_API int XSUM_logVerbose(int minLevel, const char* format, ...)
-{
- if (XSUM_logLevel >= minLevel) {
- int ret;
- va_list ap;
- va_start(ap, format);
- ret = XSUM_vfprintf(stderr, format, ap);
- va_end(ap);
- return ret;
- }
- return 0;
-}
diff --git a/third_party/xxhash/cli/xsum_output.h b/third_party/xxhash/cli/xsum_output.h
deleted file mode 100644
index 8a02c1b777..0000000000
--- a/third_party/xxhash/cli/xsum_output.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * xxhsum - Command line interface for xxhash algorithms
- * Copyright (C) 2013-2020 Yann Collet
- *
- * GPL v2 License
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * You can contact the author at:
- * - xxHash homepage: https://www.xxhash.com
- * - xxHash source repository: https://github.com/Cyan4973/xxHash
- */
-
-#ifndef XSUM_OUTPUT_H
-#define XSUM_OUTPUT_H
-
-#include "xsum_config.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * How verbose the output is.
- */
-extern int XSUM_logLevel;
-
-/*
- * Same as fprintf(stderr, format, ...)
- */
-XSUM_ATTRIBUTE((__format__(__printf__, 1, 2)))
-XSUM_API int XSUM_log(const char *format, ...);
-
-/*
- * Like XSUM_log, but only outputs if XSUM_logLevel >= minLevel.
- */
-XSUM_ATTRIBUTE((__format__(__printf__, 2, 3)))
-XSUM_API int XSUM_logVerbose(int minLevel, const char *format, ...);
-
-/*
- * Same as printf(format, ...)
- */
-XSUM_ATTRIBUTE((__format__(__printf__, 1, 2)))
-XSUM_API int XSUM_output(const char *format, ...);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* XSUM_OUTPUT_H */
diff --git a/third_party/xxhash/cli/xsum_sanity_check.c b/third_party/xxhash/cli/xsum_sanity_check.c
deleted file mode 100644
index 347d1db58e..0000000000
--- a/third_party/xxhash/cli/xsum_sanity_check.c
+++ /dev/null
@@ -1,602 +0,0 @@
-/*
- * xxhsum - Command line interface for xxhash algorithms
- * Copyright (C) 2013-2020 Yann Collet
- *
- * GPL v2 License
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * You can contact the author at:
- * - xxHash homepage: https://www.xxhash.com
- * - xxHash source repository: https://github.com/Cyan4973/xxHash
- */
-
-#include "xsum_config.h"
-#include "xsum_sanity_check.h"
-#include "xsum_output.h"
-#include <stdlib.h>
-#include <assert.h>
-#include <string.h>
-#ifndef XXH_STATIC_LINKING_ONLY
-# define XXH_STATIC_LINKING_ONLY
-#endif
-#include "../xxhash.h"
-
-/* use #define to make them constant, required for initialization */
-#define PRIME32 2654435761U
-#define PRIME64 11400714785074694797ULL
-
-/*
- * Fills a test buffer with pseudorandom data.
- *
- * This is used in the sanity check - its values must not be changed.
- */
-XSUM_API void XSUM_fillTestBuffer(XSUM_U8* buffer, size_t len)
-{
- XSUM_U64 byteGen = PRIME32;
- size_t i;
-
- assert(buffer != NULL);
-
- for (i=0; i<len; i++) {
- buffer[i] = (XSUM_U8)(byteGen>>56);
- byteGen *= PRIME64;
- }
-}
-
-
-
-/* ************************************************
- * Self-test:
- * ensure results consistency accross platforms
- *********************************************** */
-#if XSUM_NO_TESTS
-XSUM_API void XSUM_sanityCheck(void)
-{
- XSUM_log("This version of xxhsum is not verified.\n");
-}
-#else
-
-/*
- * Test data vectors
- */
-typedef struct {
- XSUM_U32 len;
- XSUM_U32 seed;
- XSUM_U32 Nresult;
-} XSUM_testdata32_t;
-
-typedef struct {
- XSUM_U32 len;
- XSUM_U64 seed;
- XSUM_U64 Nresult;
-} XSUM_testdata64_t;
-
-typedef struct {
- XSUM_U32 len;
- XSUM_U64 seed;
- XXH128_hash_t Nresult;
-} XSUM_testdata128_t;
-
-#define SECRET_SAMPLE_NBBYTES 4
-typedef struct {
- XSUM_U32 len;
- XSUM_U8 byte[SECRET_SAMPLE_NBBYTES];
-} XSUM_testdata_sample_t;
-
-/* XXH32 */
-static const XSUM_testdata32_t XSUM_XXH32_testdata[] = {
- { 0, 0, 0x02CC5D05U },
- { 0, PRIME32, 0x36B78AE7U },
- { 1, 0, 0xCF65B03EU },
- { 1, PRIME32, 0xB4545AA4U },
- { 14, 0, 0x1208E7E2U },
- { 14, PRIME32, 0x6AF1D1FEU },
- { 222, 0, 0x5BD11DBDU },
- { 222, PRIME32, 0x58803C5FU }
-};
-
-/* XXH64 */
-static const XSUM_testdata64_t XSUM_XXH64_testdata[] = {
- { 0, 0, 0xEF46DB3751D8E999ULL },
- { 0, PRIME32, 0xAC75FDA2929B17EFULL },
- { 1, 0, 0xE934A84ADB052768ULL },
- { 1, PRIME32, 0x5014607643A9B4C3ULL },
- { 4, 0, 0x9136A0DCA57457EEULL },
- { 14, 0, 0x8282DCC4994E35C8ULL },
- { 14, PRIME32, 0xC3BD6BF63DEB6DF0ULL },
- { 222, 0, 0xB641AE8CB691C174ULL },
- { 222, PRIME32, 0x20CB8AB7AE10C14AULL }
-};
-/*
- * XXH3:
- * Due to being a more complex hash function with specializations for certain
- * lengths, a more extensive test is used for XXH3.
- */
-
-/* XXH3_64bits, seeded */
-static const XSUM_testdata64_t XSUM_XXH3_testdata[] = {
- { 0, 0, 0x2D06800538D394C2ULL }, /* empty string */
- { 0, PRIME64, 0xA8A6B918B2F0364AULL }, /* empty string */
- { 1, 0, 0xC44BDFF4074EECDBULL }, /* 1 - 3 */
- { 1, PRIME64, 0x032BE332DD766EF8ULL }, /* 1 - 3 */
- { 6, 0, 0x27B56A84CD2D7325ULL }, /* 4 - 8 */
- { 6, PRIME64, 0x84589C116AB59AB9ULL }, /* 4 - 8 */
- { 12, 0, 0xA713DAF0DFBB77E7ULL }, /* 9 - 16 */
- { 12, PRIME64, 0xE7303E1B2336DE0EULL }, /* 9 - 16 */
- { 24, 0, 0xA3FE70BF9D3510EBULL }, /* 17 - 32 */
- { 24, PRIME64, 0x850E80FC35BDD690ULL }, /* 17 - 32 */
- { 48, 0, 0x397DA259ECBA1F11ULL }, /* 33 - 64 */
- { 48, PRIME64, 0xADC2CBAA44ACC616ULL }, /* 33 - 64 */
- { 80, 0, 0xBCDEFBBB2C47C90AULL }, /* 65 - 96 */
- { 80, PRIME64, 0xC6DD0CB699532E73ULL }, /* 65 - 96 */
- { 195, 0, 0xCD94217EE362EC3AULL }, /* 129-240 */
- { 195, PRIME64, 0xBA68003D370CB3D9ULL }, /* 129-240 */
-
- { 403, 0, 0xCDEB804D65C6DEA4ULL }, /* one block, last stripe is overlapping */
- { 403, PRIME64, 0x6259F6ECFD6443FDULL }, /* one block, last stripe is overlapping */
- { 512, 0, 0x617E49599013CB6BULL }, /* one block, finishing at stripe boundary */
- { 512, PRIME64, 0x3CE457DE14C27708ULL }, /* one block, finishing at stripe boundary */
- { 2048, 0, 0xDD59E2C3A5F038E0ULL }, /* 2 blocks, finishing at block boundary */
- { 2048, PRIME64, 0x66F81670669ABABCULL }, /* 2 blocks, finishing at block boundary */
- { 2240, 0, 0x6E73A90539CF2948ULL }, /* 3 blocks, finishing at stripe boundary */
- { 2240, PRIME64, 0x757BA8487D1B5247ULL }, /* 3 blocks, finishing at stripe boundary */
- { 2367, 0, 0xCB37AEB9E5D361EDULL }, /* 3 blocks, last stripe is overlapping */
- { 2367, PRIME64, 0xD2DB3415B942B42AULL } /* 3 blocks, last stripe is overlapping */
-};
-/* XXH3_64bits, custom secret */
-static const XSUM_testdata64_t XSUM_XXH3_withSecret_testdata[] = {
- { 0, 0, 0x3559D64878C5C66CULL }, /* empty string */
- { 1, 0, 0x8A52451418B2DA4DULL }, /* 1 - 3 */
- { 6, 0, 0x82C90AB0519369ADULL }, /* 4 - 8 */
- { 12, 0, 0x14631E773B78EC57ULL }, /* 9 - 16 */
- { 24, 0, 0xCDD5542E4A9D9FE8ULL }, /* 17 - 32 */
- { 48, 0, 0x33ABD54D094B2534ULL }, /* 33 - 64 */
- { 80, 0, 0xE687BA1684965297ULL }, /* 65 - 96 */
- { 195, 0, 0xA057273F5EECFB20ULL }, /* 129-240 */
-
- { 403, 0, 0x14546019124D43B8ULL }, /* one block, last stripe is overlapping */
- { 512, 0, 0x7564693DD526E28DULL }, /* one block, finishing at stripe boundary */
- { 2048, 0, 0xD32E975821D6519FULL }, /* >= 2 blodcks, at least one scrambling */
- { 2367, 0, 0x293FA8E5173BB5E7ULL }, /* >= 2 blocks, at least one scrambling, last stripe unaligned */
-
- { 64*10*3, 0, 0x751D2EC54BC6038BULL } /* exactly 3 full blocks, not a multiple of 256 */
-};
-/* XXH3_128bits, seeded */
-static const XSUM_testdata128_t XSUM_XXH128_testdata[] = {
- { 0, 0, { 0x6001C324468D497FULL, 0x99AA06D3014798D8ULL } }, /* empty string */
- { 0, PRIME32, { 0x5444F7869C671AB0ULL, 0x92220AE55E14AB50ULL } }, /* empty string */
- { 1, 0, { 0xC44BDFF4074EECDBULL, 0xA6CD5E9392000F6AULL } }, /* 1 - 3 */
- { 1, PRIME32, { 0xB53D5557E7F76F8DULL, 0x89B99554BA22467CULL } }, /* 1 - 3 */
- { 6, 0, { 0x3E7039BDDA43CFC6ULL, 0x082AFE0B8162D12AULL } }, /* 4 - 8 */
- { 6, PRIME32, { 0x269D8F70BE98856EULL, 0x5A865B5389ABD2B1ULL } }, /* 4 - 8 */
- { 12, 0, { 0x061A192713F69AD9ULL, 0x6E3EFD8FC7802B18ULL } }, /* 9 - 16 */
- { 12, PRIME32, { 0x9BE9F9A67F3C7DFBULL, 0xD7E09D518A3405D3ULL } }, /* 9 - 16 */
- { 24, 0, { 0x1E7044D28B1B901DULL, 0x0CE966E4678D3761ULL } }, /* 17 - 32 */
- { 24, PRIME32, { 0xD7304C54EBAD40A9ULL, 0x3162026714A6A243ULL } }, /* 17 - 32 */
- { 48, 0, { 0xF942219AED80F67BULL, 0xA002AC4E5478227EULL } }, /* 33 - 64 */
- { 48, PRIME32, { 0x7BA3C3E453A1934EULL, 0x163ADDE36C072295ULL } }, /* 33 - 64 */
- { 81, 0, { 0x5E8BAFB9F95FB803ULL, 0x4952F58181AB0042ULL } }, /* 65 - 96 */
- { 81, PRIME32, { 0x703FBB3D7A5F755CULL, 0x2724EC7ADC750FB6ULL } }, /* 65 - 96 */
- { 222, 0, { 0xF1AEBD597CEC6B3AULL, 0x337E09641B948717ULL } }, /* 129-240 */
- { 222, PRIME32, { 0xAE995BB8AF917A8DULL, 0x91820016621E97F1ULL } }, /* 129-240 */
-
- { 403, 0, { 0xCDEB804D65C6DEA4ULL, 0x1B6DE21E332DD73DULL } }, /* one block, last stripe is overlapping */
- { 403, PRIME64, { 0x6259F6ECFD6443FDULL, 0xBED311971E0BE8F2ULL } }, /* one block, last stripe is overlapping */
- { 512, 0, { 0x617E49599013CB6BULL, 0x18D2D110DCC9BCA1ULL } }, /* one block, finishing at stripe boundary */
- { 512, PRIME64, { 0x3CE457DE14C27708ULL, 0x925D06B8EC5B8040ULL } }, /* one block, finishing at stripe boundary */
- { 2048, 0, { 0xDD59E2C3A5F038E0ULL, 0xF736557FD47073A5ULL } }, /* 2 blocks, finishing at block boundary */
- { 2048, PRIME32, { 0x230D43F30206260BULL, 0x7FB03F7E7186C3EAULL } }, /* 2 blocks, finishing at block boundary */
- { 2240, 0, { 0x6E73A90539CF2948ULL, 0xCCB134FBFA7CE49DULL } }, /* 3 blocks, finishing at stripe boundary */
- { 2240, PRIME32, { 0xED385111126FBA6FULL, 0x50A1FE17B338995FULL } }, /* 3 blocks, finishing at stripe boundary */
- { 2367, 0, { 0xCB37AEB9E5D361EDULL, 0xE89C0F6FF369B427ULL } }, /* 3 blocks, last stripe is overlapping */
- { 2367, PRIME32, { 0x6F5360AE69C2F406ULL, 0xD23AAE4B76C31ECBULL } } /* 3 blocks, last stripe is overlapping */
-};
-
-/* XXH128, custom secret */
-static const XSUM_testdata128_t XSUM_XXH128_withSecret_testdata[] = {
- { 0, 0, { 0x005923CCEECBE8AEULL, 0x5F70F4EA232F1D38ULL } }, /* empty string */
- { 1, 0, { 0x8A52451418B2DA4DULL, 0x3A66AF5A9819198EULL } }, /* 1 - 3 */
- { 6, 0, { 0x0B61C8ACA7D4778FULL, 0x376BD91B6432F36DULL } }, /* 4 - 8 */
- { 12, 0, { 0xAF82F6EBA263D7D8ULL, 0x90A3C2D839F57D0FULL } } /* 9 - 16 */
-};
-
-static const XSUM_testdata_sample_t XSUM_XXH3_generateSecret_testdata[] = {
- { 0, { 0xB8, 0x26, 0x83, 0x7E } },
- { 1, { 0xA6, 0x16, 0x06, 0x7B } },
- { XXH3_SECRET_SIZE_MIN - 1, { 0xDA, 0x2A, 0x12, 0x11 } },
- { XXH3_SECRET_DEFAULT_SIZE + 500, { 0x7E, 0x48, 0x0C, 0xA7 } }
-};
-
-static void XSUM_checkResult32(XXH32_hash_t r1, XXH32_hash_t r2)
-{
- static int nbTests = 1;
- if (r1!=r2) {
- XSUM_log("\rError: 32-bit hash test %i: Internal sanity check failed!\n", nbTests);
- XSUM_log("\rGot 0x%08X, expected 0x%08X.\n", (unsigned)r1, (unsigned)r2);
- XSUM_log("\rNote: If you modified the hash functions, make sure to either update the values\n"
- "or temporarily recompile with XSUM_NO_TESTS=1.\n");
- exit(1);
- }
- nbTests++;
-}
-
-static void XSUM_checkResult64(XXH64_hash_t r1, XXH64_hash_t r2)
-{
- static int nbTests = 1;
- if (r1!=r2) {
- XSUM_log("\rError: 64-bit hash test %i: Internal sanity check failed!\n", nbTests);
- XSUM_log("\rGot 0x%08X%08XULL, expected 0x%08X%08XULL.\n",
- (unsigned)(r1>>32), (unsigned)r1, (unsigned)(r2>>32), (unsigned)r2);
- XSUM_log("\rNote: If you modified the hash functions, make sure to either update the values\n"
- "or temporarily recompile with XSUM_NO_TESTS=1.\n");
- exit(1);
- }
- nbTests++;
-}
-
-static void XSUM_checkResult128(XXH128_hash_t r1, XXH128_hash_t r2)
-{
- static int nbTests = 1;
- if ((r1.low64 != r2.low64) || (r1.high64 != r2.high64)) {
- XSUM_log("\rError: 128-bit hash test %i: Internal sanity check failed.\n", nbTests);
- XSUM_log("\rGot { 0x%08X%08XULL, 0x%08X%08XULL }, expected { 0x%08X%08XULL, 0x%08X%08XULL } \n",
- (unsigned)(r1.low64>>32), (unsigned)r1.low64, (unsigned)(r1.high64>>32), (unsigned)r1.high64,
- (unsigned)(r2.low64>>32), (unsigned)r2.low64, (unsigned)(r2.high64>>32), (unsigned)r2.high64 );
- XSUM_log("\rNote: If you modified the hash functions, make sure to either update the values\n"
- "or temporarily recompile with XSUM_NO_TESTS=1.\n");
- exit(1);
- }
- nbTests++;
-}
-
-
-static void XSUM_testXXH32(const void* data, const XSUM_testdata32_t* testData)
-{
- XXH32_state_t *state = XXH32_createState();
- size_t pos;
-
- size_t len = testData->len;
- XSUM_U32 seed = testData->seed;
- XSUM_U32 Nresult = testData->Nresult;
-
- if (len == 0) {
- data = NULL;
- } else {
- assert(data != NULL);
- }
-
- assert(state != NULL);
-
- XSUM_checkResult32(XXH32(data, len, seed), Nresult);
-
- (void)XXH32_reset(state, seed);
- (void)XXH32_update(state, data, len);
- XSUM_checkResult32(XXH32_digest(state), Nresult);
-
- (void)XXH32_reset(state, seed);
- for (pos=0; pos<len; pos++)
- (void)XXH32_update(state, ((const char*)data)+pos, 1);
- XSUM_checkResult32(XXH32_digest(state), Nresult);
- XXH32_freeState(state);
-}
-
-static void XSUM_testXXH64(const void* data, const XSUM_testdata64_t* testData)
-{
- XXH64_state_t *state = XXH64_createState();
- size_t pos;
-
- size_t len = (size_t)testData->len;
- XSUM_U64 seed = testData->seed;
- XSUM_U64 Nresult = testData->Nresult;
-
- if (len == 0) {
- data = NULL;
- } else {
- assert(data != NULL);
- }
-
- assert(state != NULL);
-
- XSUM_checkResult64(XXH64(data, len, seed), Nresult);
-
- (void)XXH64_reset(state, seed);
- (void)XXH64_update(state, data, len);
- XSUM_checkResult64(XXH64_digest(state), Nresult);
-
- (void)XXH64_reset(state, seed);
- for (pos=0; pos<len; pos++)
- (void)XXH64_update(state, ((const char*)data)+pos, 1);
- XSUM_checkResult64(XXH64_digest(state), Nresult);
- XXH64_freeState(state);
-}
-
-/*
- * Used to get "random" (but actually 100% reproducible) lengths for
- * XSUM_XXH3_randomUpdate.
- */
-static XSUM_U32 XSUM_rand(void)
-{
- static XSUM_U64 seed = PRIME32;
- seed *= PRIME64;
- return (XSUM_U32)(seed >> 40);
-}
-
-/*
- * Technically, XXH3_64bits_update is identical to XXH3_128bits_update as of
- * v0.8.0, but we treat them as separate.
- */
-typedef XXH_errorcode (*XSUM_XXH3_update_t)(XXH3_state_t* state, const void* input, size_t length);
-
-/*
- * Runs the passed XXH3_update variant on random lengths. This is to test the
- * more complex logic of the update function, catching bugs like this one:
- * https://github.com/Cyan4973/xxHash/issues/378
- */
-static void XSUM_XXH3_randomUpdate(XXH3_state_t* state, const void* data,
- size_t len, XSUM_XXH3_update_t update_fn)
-{
- size_t p = 0;
- while (p < len) {
- size_t const modulo = len > 2 ? len : 2;
- size_t l = (size_t)(XSUM_rand()) % modulo;
- if (p + l > len) l = len - p;
- (void)update_fn(state, (const char*)data+p, l);
- p += l;
- }
-}
-
-static void XSUM_testXXH3(const void* data, const XSUM_testdata64_t* testData)
-{
- size_t len = testData->len;
- XSUM_U64 seed = testData->seed;
- XSUM_U64 Nresult = testData->Nresult;
- if (len == 0) {
- data = NULL;
- } else {
- assert(data != NULL);
- }
- { XSUM_U64 const Dresult = XXH3_64bits_withSeed(data, len, seed);
- XSUM_checkResult64(Dresult, Nresult);
- }
-
- /* check that the no-seed variant produces same result as seed==0 */
- if (seed == 0) {
- XSUM_U64 const Dresult = XXH3_64bits(data, len);
- XSUM_checkResult64(Dresult, Nresult);
- }
-
- /* streaming API test */
- { XXH3_state_t* const state = XXH3_createState();
- assert(state != NULL);
- /* single ingestion */
- (void)XXH3_64bits_reset_withSeed(state, seed);
- (void)XXH3_64bits_update(state, data, len);
- XSUM_checkResult64(XXH3_64bits_digest(state), Nresult);
-
- /* random ingestion */
- (void)XXH3_64bits_reset_withSeed(state, seed);
- XSUM_XXH3_randomUpdate(state, data, len, &XXH3_64bits_update);
- XSUM_checkResult64(XXH3_64bits_digest(state), Nresult);
-
- /* byte by byte ingestion */
- { size_t pos;
- (void)XXH3_64bits_reset_withSeed(state, seed);
- for (pos=0; pos<len; pos++)
- (void)XXH3_64bits_update(state, ((const char*)data)+pos, 1);
- XSUM_checkResult64(XXH3_64bits_digest(state), Nresult);
- }
- XXH3_freeState(state);
- }
-}
-
-static void XSUM_testXXH3_withSecret(const void* data, const void* secret,
- size_t secretSize, const XSUM_testdata64_t* testData)
-{
- size_t len = (size_t)testData->len;
- XSUM_U64 Nresult = testData->Nresult;
-
- if (len == 0) {
- data = NULL;
- } else {
- assert(data != NULL);
- }
- { XSUM_U64 const Dresult = XXH3_64bits_withSecret(data, len, secret, secretSize);
- XSUM_checkResult64(Dresult, Nresult);
- }
-
- /* streaming API test */
- { XXH3_state_t *state = XXH3_createState();
- assert(state != NULL);
- (void)XXH3_64bits_reset_withSecret(state, secret, secretSize);
- (void)XXH3_64bits_update(state, data, len);
- XSUM_checkResult64(XXH3_64bits_digest(state), Nresult);
-
- /* random ingestion */
- (void)XXH3_64bits_reset_withSecret(state, secret, secretSize);
- XSUM_XXH3_randomUpdate(state, data, len, &XXH3_64bits_update);
- XSUM_checkResult64(XXH3_64bits_digest(state), Nresult);
-
- /* byte by byte ingestion */
- { size_t pos;
- (void)XXH3_64bits_reset_withSecret(state, secret, secretSize);
- for (pos=0; pos<len; pos++)
- (void)XXH3_64bits_update(state, ((const char*)data)+pos, 1);
- XSUM_checkResult64(XXH3_64bits_digest(state), Nresult);
- }
- XXH3_freeState(state);
- }
-}
-
-static void XSUM_testXXH128(const void* data, const XSUM_testdata128_t* testData)
-{
- size_t len = (size_t)testData->len;
- XSUM_U64 seed = testData->seed;
- XXH128_hash_t const Nresult = testData->Nresult;
- if (len == 0) {
- data = NULL;
- } else {
- assert(data != NULL);
- }
-
- { XXH128_hash_t const Dresult = XXH3_128bits_withSeed(data, len, seed);
- XSUM_checkResult128(Dresult, Nresult);
- }
-
- /* check that XXH128() is identical to XXH3_128bits_withSeed() */
- { XXH128_hash_t const Dresult2 = XXH128(data, len, seed);
- XSUM_checkResult128(Dresult2, Nresult);
- }
-
- /* check that the no-seed variant produces same result as seed==0 */
- if (seed == 0) {
- XXH128_hash_t const Dresult = XXH3_128bits(data, len);
- XSUM_checkResult128(Dresult, Nresult);
- }
-
- /* streaming API test */
- { XXH3_state_t *state = XXH3_createState();
- assert(state != NULL);
-
- /* single ingestion */
- (void)XXH3_128bits_reset_withSeed(state, seed);
- (void)XXH3_128bits_update(state, data, len);
- XSUM_checkResult128(XXH3_128bits_digest(state), Nresult);
-
- /* random ingestion */
- (void)XXH3_128bits_reset_withSeed(state, seed);
- XSUM_XXH3_randomUpdate(state, data, len, &XXH3_128bits_update);
- XSUM_checkResult128(XXH3_128bits_digest(state), Nresult);
-
- /* byte by byte ingestion */
- { size_t pos;
- (void)XXH3_128bits_reset_withSeed(state, seed);
- for (pos=0; pos<len; pos++)
- (void)XXH3_128bits_update(state, ((const char*)data)+pos, 1);
- XSUM_checkResult128(XXH3_128bits_digest(state), Nresult);
- }
- XXH3_freeState(state);
- }
-}
-
-static void XSUM_testXXH128_withSecret(const void* data, const void* secret, size_t secretSize, const XSUM_testdata128_t* testData)
-{
- size_t len = testData->len;
- XXH128_hash_t Nresult = testData->Nresult;
- if (len == 0) {
- data = NULL;
- } else if (len>0) {
- assert(data != NULL);
- }
- { XXH128_hash_t const Dresult = XXH3_128bits_withSecret(data, len, secret, secretSize);
- XSUM_checkResult128(Dresult, Nresult);
- }
-
- /* streaming API test */
- { XXH3_state_t* const state = XXH3_createState();
- assert(state != NULL);
- (void)XXH3_128bits_reset_withSecret(state, secret, secretSize);
- (void)XXH3_128bits_update(state, data, len);
- XSUM_checkResult128(XXH3_128bits_digest(state), Nresult);
-
- /* random ingestion */
- (void)XXH3_128bits_reset_withSecret(state, secret, secretSize);
- XSUM_XXH3_randomUpdate(state, data, len, &XXH3_128bits_update);
- XSUM_checkResult128(XXH3_128bits_digest(state), Nresult);
-
- /* byte by byte ingestion */
- { size_t pos;
- (void)XXH3_128bits_reset_withSecret(state, secret, secretSize);
- for (pos=0; pos<len; pos++)
- (void)XXH3_128bits_update(state, ((const char*)data)+pos, 1);
- XSUM_checkResult128(XXH3_128bits_digest(state), Nresult);
- }
- XXH3_freeState(state);
- }
-}
-
-static void XSUM_testSecretGenerator(const void* customSeed, const XSUM_testdata_sample_t* testData)
-{
- static int nbTests = 1;
- const int sampleIndex[SECRET_SAMPLE_NBBYTES] = { 0, 62, 131, 191};
- XSUM_U8 secretBuffer[XXH3_SECRET_DEFAULT_SIZE] = {0};
- XSUM_U8 samples[SECRET_SAMPLE_NBBYTES];
- int i;
-
- XXH3_generateSecret(secretBuffer, customSeed, testData->len);
- for (i=0; i<SECRET_SAMPLE_NBBYTES; i++) {
- samples[i] = secretBuffer[sampleIndex[i]];
- }
- if (memcmp(samples, testData->byte, sizeof(testData->byte))) {
- XSUM_log("\rError: Secret generation test %i: Internal sanity check failed. \n", nbTests);
- XSUM_log("\rGot { 0x%02X, 0x%02X, 0x%02X, 0x%02X }, expected { 0x%02X, 0x%02X, 0x%02X, 0x%02X } \n",
- samples[0], samples[1], samples[2], samples[3],
- testData->byte[0], testData->byte[1], testData->byte[2], testData->byte[3] );
- exit(1);
- }
- nbTests++;
-}
-
-/*!
- * XSUM_sanityCheck():
- * Runs a sanity check before the benchmark.
- *
- * Exits on an incorrect output.
- */
-XSUM_API void XSUM_sanityCheck(void)
-{
- size_t i;
-#define SANITY_BUFFER_SIZE 2367
- XSUM_U8 sanityBuffer[SANITY_BUFFER_SIZE];
- const void* const secret = sanityBuffer + 7;
- const size_t secretSize = XXH3_SECRET_SIZE_MIN + 11;
- assert(sizeof(sanityBuffer) >= 7 + secretSize);
-
- XSUM_fillTestBuffer(sanityBuffer, sizeof(sanityBuffer));
-
- /* XXH32 */
- for (i = 0; i < (sizeof(XSUM_XXH32_testdata)/sizeof(XSUM_XXH32_testdata[0])); i++) {
- XSUM_testXXH32(sanityBuffer, &XSUM_XXH32_testdata[i]);
- }
- /* XXH64 */
- for (i = 0; i < (sizeof(XSUM_XXH64_testdata)/sizeof(XSUM_XXH64_testdata[0])); i++) {
- XSUM_testXXH64(sanityBuffer, &XSUM_XXH64_testdata[i]);
- }
- /* XXH3_64bits, seeded */
- for (i = 0; i < (sizeof(XSUM_XXH3_testdata)/sizeof(XSUM_XXH3_testdata[0])); i++) {
- XSUM_testXXH3(sanityBuffer, &XSUM_XXH3_testdata[i]);
- }
- /* XXH3_64bits, custom secret */
- for (i = 0; i < (sizeof(XSUM_XXH3_withSecret_testdata)/sizeof(XSUM_XXH3_withSecret_testdata[0])); i++) {
- XSUM_testXXH3_withSecret(sanityBuffer, secret, secretSize, &XSUM_XXH3_withSecret_testdata[i]);
- }
- /* XXH128 */
- for (i = 0; i < (sizeof(XSUM_XXH128_testdata)/sizeof(XSUM_XXH128_testdata[0])); i++) {
- XSUM_testXXH128(sanityBuffer, &XSUM_XXH128_testdata[i]);
- }
- /* XXH128 with custom Secret */
- for (i = 0; i < (sizeof(XSUM_XXH128_withSecret_testdata)/sizeof(XSUM_XXH128_withSecret_testdata[0])); i++) {
- XSUM_testXXH128_withSecret(sanityBuffer, secret, secretSize, &XSUM_XXH128_withSecret_testdata[i]);
- }
- /* secret generator */
- for (i = 0; i < (sizeof(XSUM_XXH3_generateSecret_testdata)/sizeof(XSUM_XXH3_generateSecret_testdata[0])); i++) {
- XSUM_testSecretGenerator(sanityBuffer, &XSUM_XXH3_generateSecret_testdata[i]);
- }
-
- XSUM_logVerbose(3, "\r%70s\r", ""); /* Clean display line */
- XSUM_logVerbose(3, "Sanity check -- all tests ok\n");
-}
-
-#endif /* !XSUM_NO_TESTS */
diff --git a/third_party/xxhash/cli/xsum_sanity_check.h b/third_party/xxhash/cli/xsum_sanity_check.h
deleted file mode 100644
index 9f3f2b85f5..0000000000
--- a/third_party/xxhash/cli/xsum_sanity_check.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * xxhsum - Command line interface for xxhash algorithms
- * Copyright (C) 2013-2020 Yann Collet
- *
- * GPL v2 License
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * You can contact the author at:
- * - xxHash homepage: https://www.xxhash.com
- * - xxHash source repository: https://github.com/Cyan4973/xxHash
- */
-
-#ifndef XSUM_SANITY_CHECK_H
-#define XSUM_SANITY_CHECK_H
-
-#include "xsum_config.h" /* XSUM_API, XSUM_U8 */
-
-#include <stddef.h> /* size_t */
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * Runs a series of self-tests.
- *
- * Exits if any of these tests fail, printing a message to stderr.
- *
- * If XSUM_NO_TESTS is defined to non-zero, this will instead print a warning
- * if this is called (e.g. via xxhsum -b).
- */
-XSUM_API void XSUM_sanityCheck(void);
-
-/*
- * Fills a test buffer with pseudorandom data.
- *
- * This is used in the sanity check and the benchmarks - its values must not be
- * changed.
- */
-XSUM_API void XSUM_fillTestBuffer(XSUM_U8* buffer, size_t len);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* XSUM_SANITY_CHECK_H */
diff --git a/third_party/xxhash/cmake_unofficial/.gitignore b/third_party/xxhash/cmake_unofficial/.gitignore
deleted file mode 100644
index 93d9fe4f6d..0000000000
--- a/third_party/xxhash/cmake_unofficial/.gitignore
+++ /dev/null
@@ -1,12 +0,0 @@
-# cmake artifacts
-
-CMakeCache.txt
-CMakeFiles
-Makefile
-cmake_install.cmake
-
-
-# make compilation results
-
-*.dylib
-*.a
diff --git a/third_party/xxhash/cmake_unofficial/CMakeLists.txt b/third_party/xxhash/cmake_unofficial/CMakeLists.txt
deleted file mode 100644
index 41c71121d7..0000000000
--- a/third_party/xxhash/cmake_unofficial/CMakeLists.txt
+++ /dev/null
@@ -1,173 +0,0 @@
-# To the extent possible under law, the author(s) have dedicated all
-# copyright and related and neighboring rights to this software to
-# the public domain worldwide. This software is distributed without
-# any warranty.
-#
-# For details, see <https://creativecommons.org/publicdomain/zero/1.0/>.
-
-cmake_minimum_required (VERSION 2.8.12 FATAL_ERROR)
-
-set(XXHASH_DIR "${CMAKE_CURRENT_SOURCE_DIR}/..")
-
-file(STRINGS "${XXHASH_DIR}/xxhash.h" XXHASH_VERSION_MAJOR REGEX "^#define XXH_VERSION_MAJOR +([0-9]+) *$")
-string(REGEX REPLACE "^#define XXH_VERSION_MAJOR +([0-9]+) *$" "\\1" XXHASH_VERSION_MAJOR "${XXHASH_VERSION_MAJOR}")
-file(STRINGS "${XXHASH_DIR}/xxhash.h" XXHASH_VERSION_MINOR REGEX "^#define XXH_VERSION_MINOR +([0-9]+) *$")
-string(REGEX REPLACE "^#define XXH_VERSION_MINOR +([0-9]+) *$" "\\1" XXHASH_VERSION_MINOR "${XXHASH_VERSION_MINOR}")
-file(STRINGS "${XXHASH_DIR}/xxhash.h" XXHASH_VERSION_RELEASE REGEX "^#define XXH_VERSION_RELEASE +([0-9]+) *$")
-string(REGEX REPLACE "^#define XXH_VERSION_RELEASE +([0-9]+) *$" "\\1" XXHASH_VERSION_RELEASE "${XXHASH_VERSION_RELEASE}")
-set(XXHASH_VERSION_STRING "${XXHASH_VERSION_MAJOR}.${XXHASH_VERSION_MINOR}.${XXHASH_VERSION_RELEASE}")
-set(XXHASH_LIB_VERSION ${XXHASH_VERSION_STRING})
-set(XXHASH_LIB_SOVERSION "${XXHASH_VERSION_MAJOR}")
-mark_as_advanced(XXHASH_VERSION_MAJOR XXHASH_VERSION_MINOR XXHASH_VERSION_RELEASE XXHASH_VERSION_STRING XXHASH_LIB_VERSION XXHASH_LIB_SOVERSION)
-
-if("${CMAKE_VERSION}" VERSION_LESS "3.13")
- #message(WARNING "CMake ${CMAKE_VERSION} has no CMP0077 policy: options will erase uncached/untyped normal vars!")
-else()
- cmake_policy (SET CMP0077 NEW)
-endif()
-if("${CMAKE_VERSION}" VERSION_LESS "3.0")
- project(xxHash C)
-else()
- cmake_policy (SET CMP0048 NEW)
- project(xxHash
- VERSION ${XXHASH_VERSION_STRING}
- LANGUAGES C)
-endif()
-
-if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
- set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Project build type" FORCE)
- set_property(CACHE CMAKE_BUILD_TYPE
- PROPERTY STRINGS "Debug" "Release" "RelWithDebInfo" "MinSizeRel")
-endif()
-if(NOT CMAKE_CONFIGURATION_TYPES)
- message(STATUS "xxHash build type: ${CMAKE_BUILD_TYPE}")
-endif()
-
-option(BUILD_SHARED_LIBS "Build shared library" ON)
-option(XXHASH_BUILD_XXHSUM "Build the xxhsum binary" ON)
-
-# If XXHASH is being bundled in another project, we don't want to
-# install anything. However, we want to let people override this, so
-# we'll use the XXHASH_BUNDLED_MODE variable to let them do that; just
-# set it to OFF in your project before you add_subdirectory(xxhash/cmake_unofficial).
-if(NOT DEFINED XXHASH_BUNDLED_MODE)
- if("${PROJECT_SOURCE_DIR}" STREQUAL "${CMAKE_SOURCE_DIR}")
- set(XXHASH_BUNDLED_MODE OFF)
- else()
- set(XXHASH_BUNDLED_MODE ON)
- endif()
-endif()
-set(XXHASH_BUNDLED_MODE ${XXHASH_BUNDLED_MODE} CACHE BOOL "" FORCE)
-mark_as_advanced(XXHASH_BUNDLED_MODE)
-
-# Allow people to choose whether to build shared or static libraries
-# via the BUILD_SHARED_LIBS option unless we are in bundled mode, in
-# which case we always use static libraries.
-include(CMakeDependentOption)
-CMAKE_DEPENDENT_OPTION(BUILD_SHARED_LIBS "Build shared libraries" ON "NOT XXHASH_BUNDLED_MODE" OFF)
-
-# libxxhash
-add_library(xxhash "${XXHASH_DIR}/xxhash.c")
-add_library(${PROJECT_NAME}::xxhash ALIAS xxhash)
-
-target_include_directories(xxhash
- PUBLIC
- $<BUILD_INTERFACE:${XXHASH_DIR}>
- $<INSTALL_INTERFACE:include/>)
-if (BUILD_SHARED_LIBS)
- target_compile_definitions(xxhash PUBLIC XXH_EXPORT)
-endif ()
-set_target_properties(xxhash PROPERTIES
- SOVERSION "${XXHASH_VERSION_STRING}"
- VERSION "${XXHASH_VERSION_STRING}")
-
-if(XXHASH_BUILD_XXHSUM)
- set(XXHSUM_DIR "${XXHASH_DIR}/cli")
- # xxhsum
- add_executable(xxhsum "${XXHASH_DIR}/xxhsum.c"
- "${XXHSUM_DIR}/xsum_os_specific.c"
- "${XXHSUM_DIR}/xsum_output.c"
- "${XXHSUM_DIR}/xsum_sanity_check.c"
- )
- add_executable(${PROJECT_NAME}::xxhsum ALIAS xxhsum)
-
- target_link_libraries(xxhsum PRIVATE xxhash)
- target_include_directories(xxhsum PRIVATE "${XXHASH_DIR}")
-endif(XXHASH_BUILD_XXHSUM)
-
-# Extra warning flags
-include (CheckCCompilerFlag)
-if (XXHASH_C_FLAGS)
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${XXHASH_C_FLAGS}")
-endif()
-foreach (flag
- -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow
- -Wstrict-aliasing=1 -Wswitch-enum -Wdeclaration-after-statement
- -Wstrict-prototypes -Wundef)
- # Because https://gcc.gnu.org/wiki/FAQ#wnowarning
- string(REGEX REPLACE "\\-Wno\\-(.+)" "-W\\1" flag_to_test "${flag}")
- string(REGEX REPLACE "[^a-zA-Z0-9]+" "_" test_name "CFLAG_${flag_to_test}")
-
- check_c_compiler_flag("${ADD_COMPILER_FLAGS_PREPEND} ${flag_to_test}" ${test_name})
-
- if(${test_name})
- set(CMAKE_C_FLAGS "${flag} ${CMAKE_C_FLAGS}")
- endif()
-
- unset(test_name)
- unset(flag_to_test)
-endforeach (flag)
-
-if(NOT XXHASH_BUNDLED_MODE)
- include(GNUInstallDirs)
-
- install(TARGETS xxhash
- EXPORT xxHashTargets
- RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
- LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
- ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}")
- install(FILES "${XXHASH_DIR}/xxhash.h"
- DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
- install(FILES "${XXHASH_DIR}/xxh3.h"
- DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
- if(XXHASH_BUILD_XXHSUM)
- install(TARGETS xxhsum
- EXPORT xxHashTargets
- RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
- install(FILES "${XXHASH_DIR}/xxhsum.1"
- DESTINATION "${CMAKE_INSTALL_MANDIR}/man1")
- endif(XXHASH_BUILD_XXHSUM)
-
- include(CMakePackageConfigHelpers)
-
- set(xxHash_VERSION_CONFIG "${PROJECT_BINARY_DIR}/xxHashConfigVersion.cmake")
- set(xxHash_PROJECT_CONFIG "${PROJECT_BINARY_DIR}/xxHashConfig.cmake")
- set(xxHash_TARGETS_CONFIG "${PROJECT_BINARY_DIR}/xxHashTargets.cmake")
- set(xxHash_CONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/xxHash/")
- write_basic_package_version_file(${xxHash_VERSION_CONFIG}
- VERSION ${XXHASH_VERSION_STRING}
- COMPATIBILITY AnyNewerVersion)
- configure_package_config_file(
- ${PROJECT_SOURCE_DIR}/xxHashConfig.cmake.in
- ${xxHash_PROJECT_CONFIG}
- INSTALL_DESTINATION ${xxHash_CONFIG_INSTALL_DIR})
- if("${CMAKE_VERSION}" VERSION_LESS "3.0")
- set(XXHASH_EXPORT_SET xxhash)
- if(XXHASH_BUILD_XXHSUM)
- set(XXHASH_EXPORT_SET ${XXHASH_EXPORT_SET} xxhsum)
- endif()
- export(TARGETS ${XXHASH_EXPORT_SET}
- FILE ${xxHash_TARGETS_CONFIG}
- NAMESPACE ${PROJECT_NAME}::)
- else()
- export(EXPORT xxHashTargets
- FILE ${xxHash_TARGETS_CONFIG}
- NAMESPACE ${PROJECT_NAME}::)
- endif()
-
- install(FILES ${xxHash_PROJECT_CONFIG} ${xxHash_VERSION_CONFIG}
- DESTINATION ${xxHash_CONFIG_INSTALL_DIR})
- install(EXPORT xxHashTargets
- DESTINATION ${xxHash_CONFIG_INSTALL_DIR}
- NAMESPACE ${PROJECT_NAME}::)
-endif(NOT XXHASH_BUNDLED_MODE)
diff --git a/third_party/xxhash/cmake_unofficial/README.md b/third_party/xxhash/cmake_unofficial/README.md
deleted file mode 100644
index 66df7909a7..0000000000
--- a/third_party/xxhash/cmake_unofficial/README.md
+++ /dev/null
@@ -1,36 +0,0 @@
-
-## Usage
-
-### Way 1: import targets
-Build xxHash targets:
-
- cd </path/to/xxHash/>
- mkdir build
- cd build
- cmake ../cmake_unofficial [options]
- cmake --build .
- cmake --build . --target install #optional
-
-Where possible options are:
-- `-DXXHASH_BUILD_ENABLE_INLINE_API=<ON|OFF>`: adds xxhash.c for the `-DXXH_INLINE_ALL` api. ON by default.
-- `-DXXHASH_BUILD_XXHSUM=<ON|OFF>`: build the command line binary. ON by default
-- `-DBUILD_SHARED_LIBS=<ON|OFF>`: build dynamic library. ON by default.
-- `-DCMAKE_INSTALL_PREFIX=<path>`: use custom install prefix path.
-
-Add lines into downstream CMakeLists.txt:
-
- find_package(xxHash 0.7 CONFIG REQUIRED)
- ...
- target_link_libraries(MyTarget PRIVATE xxHash::xxhash)
-
-### Way 2: Add subdirectory
-Add lines into downstream CMakeLists.txt:
-
- option(BUILD_SHARED_LIBS "Build shared libs" OFF) #optional
- ...
- set(XXHASH_BUILD_ENABLE_INLINE_API OFF) #optional
- set(XXHASH_BUILD_XXHSUM OFF) #optional
- add_subdirectory(</path/to/xxHash/cmake_unofficial/> </path/to/xxHash/build/> EXCLUDE_FROM_ALL)
- ...
- target_link_libraries(MyTarget PRIVATE xxHash::xxhash)
-
diff --git a/third_party/xxhash/cmake_unofficial/xxHashConfig.cmake.in b/third_party/xxhash/cmake_unofficial/xxHashConfig.cmake.in
deleted file mode 100644
index fd282bee66..0000000000
--- a/third_party/xxhash/cmake_unofficial/xxHashConfig.cmake.in
+++ /dev/null
@@ -1,4 +0,0 @@
-@PACKAGE_INIT@
-
-include(${CMAKE_CURRENT_LIST_DIR}/xxHashTargets.cmake)
-
diff --git a/third_party/xxhash/doc/README.md b/third_party/xxhash/doc/README.md
deleted file mode 100644
index a73ad72907..0000000000
--- a/third_party/xxhash/doc/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
-xxHash Specification
-=======================
-
-This directory contains material defining the xxHash algorithm.
-It's described in [this specification document](xxhash_spec.md).
-
-The algorithm is also be illustrated by a [simple educational library](https://github.com/easyaspi314/xxhash-clean),
-written by @easyaspi314 and designed for readability
-(as opposed to the reference library which is designed for speed).
diff --git a/third_party/xxhash/doc/xxhash.cry b/third_party/xxhash/doc/xxhash.cry
deleted file mode 100644
index 984e1c8b6b..0000000000
--- a/third_party/xxhash/doc/xxhash.cry
+++ /dev/null
@@ -1,206 +0,0 @@
-module xxhash where
-
-/**
- * The 32-bit variant of xxHash. The first argument is the sequence
- * of L bytes to hash. The second argument is a seed value.
- */
-XXH32 : {L} (fin L) => [L][8] -> [32] -> [32]
-XXH32 input seed = XXH32_avalanche acc1
- where (stripes16 # stripes4 # stripes1) = input
- accR = foldl XXH32_rounds (XXH32_init seed) (split stripes16 : [L/16][16][8])
- accL = `(L % 2^^32) + if (`L:Integer) < 16
- then seed + PRIME32_5
- else XXH32_converge accR
- acc4 = foldl XXH32_digest4 accL (split stripes4 : [(L%16)/4][4][8])
- acc1 = foldl XXH32_digest1 acc4 (stripes1 : [L%4][8])
-
-/**
- * The 64-bit variant of xxHash. The first argument is the sequence
- * of L bytes to hash. The second argument is a seed value.
- */
-XXH64 : {L} (fin L) => [L][8] -> [64] -> [64]
-XXH64 input seed = XXH64_avalanche acc1
- where (stripes32 # stripes8 # stripes4 # stripes1) = input
- accR = foldl XXH64_rounds (XXH64_init seed) (split stripes32 : [L/32][32][8])
- accL = `(L % 2^^64) + if (`L:Integer) < 32
- then seed + PRIME64_5
- else XXH64_converge accR
- acc8 = foldl XXH64_digest8 accL (split stripes8 : [(L%32)/8][8][8])
- acc4 = foldl XXH64_digest4 acc8 (split stripes4 : [(L%8)/4][4][8])
- acc1 = foldl XXH64_digest1 acc4 (stripes1 : [L%4][8])
-
-private
-
- //Utility functions
-
- /**
- * Combines a sequence of bytes into a word using the little-endian
- * convention.
- */
- toLE bytes = join (reverse bytes)
-
- //32-bit xxHash helper functions
-
- //32-bit prime number constants
- PRIME32_1 = 0x9E3779B1 : [32]
- PRIME32_2 = 0x85EBCA77 : [32]
- PRIME32_3 = 0xC2B2AE3D : [32]
- PRIME32_4 = 0x27D4EB2F : [32]
- PRIME32_5 = 0x165667B1 : [32]
-
- /**
- * The property shows that the hexadecimal representation of the
- * PRIME32 constants is the same as the binary representation.
- */
- property PRIME32s_as_bits_correct =
- (PRIME32_1 == 0b10011110001101110111100110110001) /\
- (PRIME32_2 == 0b10000101111010111100101001110111) /\
- (PRIME32_3 == 0b11000010101100101010111000111101) /\
- (PRIME32_4 == 0b00100111110101001110101100101111) /\
- (PRIME32_5 == 0b00010110010101100110011110110001)
-
- /**
- * This function initializes the four internal accumulators of XXH32.
- */
- XXH32_init : [32] -> [4][32]
- XXH32_init seed = [acc1, acc2, acc3, acc4]
- where acc1 = seed + PRIME32_1 + PRIME32_2
- acc2 = seed + PRIME32_2
- acc3 = seed + 0
- acc4 = seed - PRIME32_1
-
- /**
- * This processes a single lane of the main round function of XXH32.
- */
- XXH32_round : [32] -> [32] -> [32]
- XXH32_round accN laneN = ((accN + laneN * PRIME32_2) <<< 13) * PRIME32_1
-
- /**
- * This is the main round function of XXH32 and processes a stripe,
- * i.e. 4 lanes with 4 bytes each.
- */
- XXH32_rounds : [4][32] -> [16][8] -> [4][32]
- XXH32_rounds accs stripe =
- [ XXH32_round accN (toLE laneN) | accN <- accs | laneN <- split stripe ]
-
- /**
- * This function combines the four lane accumulators into a single
- * 32-bit value.
- */
- XXH32_converge : [4][32] -> [32]
- XXH32_converge [acc1, acc2, acc3, acc4] =
- (acc1 <<< 1) + (acc2 <<< 7) + (acc3 <<< 12) + (acc4 <<< 18)
-
- /**
- * This function digests a four byte lane
- */
- XXH32_digest4 : [32] -> [4][8] -> [32]
- XXH32_digest4 acc lane = ((acc + toLE lane * PRIME32_3) <<< 17) * PRIME32_4
-
- /**
- * This function digests a single byte lane
- */
- XXH32_digest1 : [32] -> [8] -> [32]
- XXH32_digest1 acc lane = ((acc + (0 # lane) * PRIME32_5) <<< 11) * PRIME32_1
-
- /**
- * This function ensures that all input bits have a chance to impact
- * any bit in the output digest, resulting in an unbiased
- * distribution.
- */
- XXH32_avalanche : [32] -> [32]
- XXH32_avalanche acc0 = acc5
- where acc1 = acc0 ^ (acc0 >> 15)
- acc2 = acc1 * PRIME32_2
- acc3 = acc2 ^ (acc2 >> 13)
- acc4 = acc3 * PRIME32_3
- acc5 = acc4 ^ (acc4 >> 16)
-
- //64-bit xxHash helper functions
-
- //64-bit prime number constants
- PRIME64_1 = 0x9E3779B185EBCA87 : [64]
- PRIME64_2 = 0xC2B2AE3D27D4EB4F : [64]
- PRIME64_3 = 0x165667B19E3779F9 : [64]
- PRIME64_4 = 0x85EBCA77C2B2AE63 : [64]
- PRIME64_5 = 0x27D4EB2F165667C5 : [64]
-
- /**
- * The property shows that the hexadecimal representation of the
- * PRIME64 constants is the same as the binary representation.
- */
- property PRIME64s_as_bits_correct =
- (PRIME64_1 == 0b1001111000110111011110011011000110000101111010111100101010000111) /\
- (PRIME64_2 == 0b1100001010110010101011100011110100100111110101001110101101001111) /\
- (PRIME64_3 == 0b0001011001010110011001111011000110011110001101110111100111111001) /\
- (PRIME64_4 == 0b1000010111101011110010100111011111000010101100101010111001100011) /\
- (PRIME64_5 == 0b0010011111010100111010110010111100010110010101100110011111000101)
-
- /**
- * This function initializes the four internal accumulators of XXH64.
- */
- XXH64_init : [64] -> [4][64]
- XXH64_init seed = [acc1, acc2, acc3, acc4]
- where acc1 = seed + PRIME64_1 + PRIME64_2
- acc2 = seed + PRIME64_2
- acc3 = seed + 0
- acc4 = seed - PRIME64_1
-
- /**
- * This processes a single lane of the main round function of XXH64.
- */
- XXH64_round : [64] -> [64] -> [64]
- XXH64_round accN laneN = ((accN + laneN * PRIME64_2) <<< 31) * PRIME64_1
-
- /**
- * This is the main round function of XXH64 and processes a stripe,
- * i.e. 4 lanes with 8 bytes each.
- */
- XXH64_rounds : [4][64] -> [32][8] -> [4][64]
- XXH64_rounds accs stripe =
- [ XXH64_round accN (toLE laneN) | accN <- accs | laneN <- split stripe ]
-
- /**
- * This is a helper function, used to merge the four lane accumulators.
- */
- mergeAccumulator : [64] -> [64] -> [64]
- mergeAccumulator acc accN = (acc ^ XXH64_round 0 accN) * PRIME64_1 + PRIME64_4
-
- /**
- * This function combines the four lane accumulators into a single
- * 64-bit value.
- */
- XXH64_converge : [4][64] -> [64]
- XXH64_converge [acc1, acc2, acc3, acc4] =
- foldl mergeAccumulator ((acc1 <<< 1) + (acc2 <<< 7) + (acc3 <<< 12) + (acc4 <<< 18)) [acc1, acc2, acc3, acc4]
-
- /**
- * This function digests an eight byte lane
- */
- XXH64_digest8 : [64] -> [8][8] -> [64]
- XXH64_digest8 acc lane = ((acc ^ XXH64_round 0 (toLE lane)) <<< 27) * PRIME64_1 + PRIME64_4
-
- /**
- * This function digests a four byte lane
- */
- XXH64_digest4 : [64] -> [4][8] -> [64]
- XXH64_digest4 acc lane = ((acc ^ (0 # toLE lane) * PRIME64_1) <<< 23) * PRIME64_2 + PRIME64_3
-
- /**
- * This function digests a single byte lane
- */
- XXH64_digest1 : [64] -> [8] -> [64]
- XXH64_digest1 acc lane = ((acc ^ (0 # lane) * PRIME64_5) <<< 11) * PRIME64_1
-
- /**
- * This function ensures that all input bits have a chance to impact
- * any bit in the output digest, resulting in an unbiased
- * distribution.
- */
- XXH64_avalanche : [64] -> [64]
- XXH64_avalanche acc0 = acc5
- where acc1 = acc0 ^ (acc0 >> 33)
- acc2 = acc1 * PRIME64_2
- acc3 = acc2 ^ (acc2 >> 29)
- acc4 = acc3 * PRIME64_3
- acc5 = acc4 ^ (acc4 >> 32)
diff --git a/third_party/xxhash/doc/xxhash_spec.md b/third_party/xxhash/doc/xxhash_spec.md
deleted file mode 100644
index af7ba90d9d..0000000000
--- a/third_party/xxhash/doc/xxhash_spec.md
+++ /dev/null
@@ -1,317 +0,0 @@
-xxHash fast digest algorithm
-======================
-
-### Notices
-
-Copyright (c) Yann Collet
-
-Permission is granted to copy and distribute this document
-for any purpose and without charge,
-including translations into other languages
-and incorporation into compilations,
-provided that the copyright notice and this notice are preserved,
-and that any substantive changes or deletions from the original
-are clearly marked.
-Distribution of this document is unlimited.
-
-### Version
-
-0.1.1 (10/10/18)
-
-
-Table of Contents
----------------------
-- [Introduction](#introduction)
-- [XXH32 algorithm description](#xxh32-algorithm-description)
-- [XXH64 algorithm description](#xxh64-algorithm-description)
-- [Performance considerations](#performance-considerations)
-- [Reference Implementation](#reference-implementation)
-
-
-Introduction
-----------------
-
-This document describes the xxHash digest algorithm for both 32-bit and 64-bit variants, named `XXH32` and `XXH64`. The algorithm takes an input a message of arbitrary length and an optional seed value, then produces an output of 32 or 64-bit as "fingerprint" or "digest".
-
-xxHash is primarily designed for speed. It is labeled non-cryptographic, and is not meant to avoid intentional collisions (same digest for 2 different messages), or to prevent producing a message with a predefined digest.
-
-XXH32 is designed to be fast on 32-bit machines.
-XXH64 is designed to be fast on 64-bit machines.
-Both variants produce different output.
-However, a given variant shall produce exactly the same output, irrespective of the cpu / os used. In particular, the result remains identical whatever the endianness and width of the cpu is.
-
-### Operation notations
-
-All operations are performed modulo {32,64} bits. Arithmetic overflows are expected.
-`XXH32` uses 32-bit modular operations. `XXH64` uses 64-bit modular operations.
-
-- `+`: denotes modular addition
-- `*`: denotes modular multiplication
-- `X <<< s`: denotes the value obtained by circularly shifting (rotating) `X` left by `s` bit positions.
-- `X >> s`: denotes the value obtained by shifting `X` right by s bit positions. Upper `s` bits become `0`.
-- `X xor Y`: denotes the bit-wise XOR of `X` and `Y` (same width).
-
-
-XXH32 Algorithm Description
--------------------------------------
-
-### Overview
-
-We begin by supposing that we have a message of any length `L` as input, and that we wish to find its digest. Here `L` is an arbitrary nonnegative integer; `L` may be zero. The following steps are performed to compute the digest of the message.
-
-The algorithm collect and transform input in _stripes_ of 16 bytes. The transforms are stored inside 4 "accumulators", each one storing an unsigned 32-bit value. Each accumulator can be processed independently in parallel, speeding up processing for cpu with multiple execution units.
-
-The algorithm uses 32-bits addition, multiplication, rotate, shift and xor operations. Many operations require some 32-bits prime number constants, all defined below:
-
- static const u32 PRIME32_1 = 0x9E3779B1U; // 0b10011110001101110111100110110001
- static const u32 PRIME32_2 = 0x85EBCA77U; // 0b10000101111010111100101001110111
- static const u32 PRIME32_3 = 0xC2B2AE3DU; // 0b11000010101100101010111000111101
- static const u32 PRIME32_4 = 0x27D4EB2FU; // 0b00100111110101001110101100101111
- static const u32 PRIME32_5 = 0x165667B1U; // 0b00010110010101100110011110110001
-
-These constants are prime numbers, and feature a good mix of bits 1 and 0, neither too regular, nor too dissymmetric. These properties help dispersion capabilities.
-
-### Step 1. Initialize internal accumulators
-
-Each accumulator gets an initial value based on optional `seed` input. Since the `seed` is optional, it can be `0`.
-
- u32 acc1 = seed + PRIME32_1 + PRIME32_2;
- u32 acc2 = seed + PRIME32_2;
- u32 acc3 = seed + 0;
- u32 acc4 = seed - PRIME32_1;
-
-#### Special case: input is less than 16 bytes
-
-When the input is too small (< 16 bytes), the algorithm will not process any stripes. Consequently, it will not make use of parallel accumulators.
-
-In this case, a simplified initialization is performed, using a single accumulator:
-
- u32 acc = seed + PRIME32_5;
-
-The algorithm then proceeds directly to step 4.
-
-### Step 2. Process stripes
-
-A stripe is a contiguous segment of 16 bytes.
-It is evenly divided into 4 _lanes_, of 4 bytes each.
-The first lane is used to update accumulator 1, the second lane is used to update accumulator 2, and so on.
-
-Each lane read its associated 32-bit value using __little-endian__ convention.
-
-For each {lane, accumulator}, the update process is called a _round_, and applies the following formula:
-
- accN = accN + (laneN * PRIME32_2);
- accN = accN <<< 13;
- accN = accN * PRIME32_1;
-
-This shuffles the bits so that any bit from input _lane_ impacts several bits in output _accumulator_. All operations are performed modulo 2^32.
-
-Input is consumed one full stripe at a time. Step 2 is looped as many times as necessary to consume the whole input, except for the last remaining bytes which cannot form a stripe (< 16 bytes).
-When that happens, move to step 3.
-
-### Step 3. Accumulator convergence
-
-All 4 lane accumulators from the previous steps are merged to produce a single remaining accumulator of the same width (32-bit). The associated formula is as follows:
-
- acc = (acc1 <<< 1) + (acc2 <<< 7) + (acc3 <<< 12) + (acc4 <<< 18);
-
-### Step 4. Add input length
-
-The input total length is presumed known at this stage. This step is just about adding the length to accumulator, so that it participates to final mixing.
-
- acc = acc + (u32)inputLength;
-
-Note that, if input length is so large that it requires more than 32-bits, only the lower 32-bits are added to the accumulator.
-
-### Step 5. Consume remaining input
-
-There may be up to 15 bytes remaining to consume from the input.
-The final stage will digest them according to following pseudo-code:
-
- while (remainingLength >= 4) {
- lane = read_32bit_little_endian(input_ptr);
- acc = acc + lane * PRIME32_3;
- acc = (acc <<< 17) * PRIME32_4;
- input_ptr += 4; remainingLength -= 4;
- }
-
- while (remainingLength >= 1) {
- lane = read_byte(input_ptr);
- acc = acc + lane * PRIME32_5;
- acc = (acc <<< 11) * PRIME32_1;
- input_ptr += 1; remainingLength -= 1;
- }
-
-This process ensures that all input bytes are present in the final mix.
-
-### Step 6. Final mix (avalanche)
-
-The final mix ensures that all input bits have a chance to impact any bit in the output digest, resulting in an unbiased distribution. This is also called avalanche effect.
-
- acc = acc xor (acc >> 15);
- acc = acc * PRIME32_2;
- acc = acc xor (acc >> 13);
- acc = acc * PRIME32_3;
- acc = acc xor (acc >> 16);
-
-### Step 7. Output
-
-The `XXH32()` function produces an unsigned 32-bit value as output.
-
-For systems which require to store and/or display the result in binary or hexadecimal format, the canonical format is defined to reproduce the same value as the natural decimal format, hence follows __big-endian__ convention (most significant byte first).
-
-
-XXH64 Algorithm Description
--------------------------------------
-
-### Overview
-
-`XXH64`'s algorithm structure is very similar to `XXH32` one. The major difference is that `XXH64` uses 64-bit arithmetic, speeding up memory transfer for 64-bit compliant systems, but also relying on cpu capability to efficiently perform 64-bit operations.
-
-The algorithm collects and transforms input in _stripes_ of 32 bytes. The transforms are stored inside 4 "accumulators", each one storing an unsigned 64-bit value. Each accumulator can be processed independently in parallel, speeding up processing for cpu with multiple execution units.
-
-The algorithm uses 64-bit addition, multiplication, rotate, shift and xor operations. Many operations require some 64-bit prime number constants, all defined below:
-
- static const u64 PRIME64_1 = 0x9E3779B185EBCA87ULL; // 0b1001111000110111011110011011000110000101111010111100101010000111
- static const u64 PRIME64_2 = 0xC2B2AE3D27D4EB4FULL; // 0b1100001010110010101011100011110100100111110101001110101101001111
- static const u64 PRIME64_3 = 0x165667B19E3779F9ULL; // 0b0001011001010110011001111011000110011110001101110111100111111001
- static const u64 PRIME64_4 = 0x85EBCA77C2B2AE63ULL; // 0b1000010111101011110010100111011111000010101100101010111001100011
- static const u64 PRIME64_5 = 0x27D4EB2F165667C5ULL; // 0b0010011111010100111010110010111100010110010101100110011111000101
-
-These constants are prime numbers, and feature a good mix of bits 1 and 0, neither too regular, nor too dissymmetric. These properties help dispersion capabilities.
-
-### Step 1. Initialise internal accumulators
-
-Each accumulator gets an initial value based on optional `seed` input. Since the `seed` is optional, it can be `0`.
-
- u64 acc1 = seed + PRIME64_1 + PRIME64_2;
- u64 acc2 = seed + PRIME64_2;
- u64 acc3 = seed + 0;
- u64 acc4 = seed - PRIME64_1;
-
-#### Special case: input is less than 32 bytes
-
-When the input is too small (< 32 bytes), the algorithm will not process any stripes. Consequently, it will not make use of parallel accumulators.
-
-In this case, a simplified initialization is performed, using a single accumulator:
-
- u64 acc = seed + PRIME64_5;
-
-The algorithm then proceeds directly to step 4.
-
-### Step 2. Process stripes
-
-A stripe is a contiguous segment of 32 bytes.
-It is evenly divided into 4 _lanes_, of 8 bytes each.
-The first lane is used to update accumulator 1, the second lane is used to update accumulator 2, and so on.
-
-Each lane read its associated 64-bit value using __little-endian__ convention.
-
-For each {lane, accumulator}, the update process is called a _round_, and applies the following formula:
-
- round(accN,laneN):
- accN = accN + (laneN * PRIME64_2);
- accN = accN <<< 31;
- return accN * PRIME64_1;
-
-This shuffles the bits so that any bit from input _lane_ impacts several bits in output _accumulator_. All operations are performed modulo 2^64.
-
-Input is consumed one full stripe at a time. Step 2 is looped as many times as necessary to consume the whole input, except for the last remaining bytes which cannot form a stripe (< 32 bytes).
-When that happens, move to step 3.
-
-### Step 3. Accumulator convergence
-
-All 4 lane accumulators from previous steps are merged to produce a single remaining accumulator of same width (64-bit). The associated formula is as follows.
-
-Note that accumulator convergence is more complex than 32-bit variant, and requires to define another function called _mergeAccumulator()_:
-
- mergeAccumulator(acc,accN):
- acc = acc xor round(0, accN);
- acc = acc * PRIME64_1;
- return acc + PRIME64_4;
-
-which is then used in the convergence formula:
-
- acc = (acc1 <<< 1) + (acc2 <<< 7) + (acc3 <<< 12) + (acc4 <<< 18);
- acc = mergeAccumulator(acc, acc1);
- acc = mergeAccumulator(acc, acc2);
- acc = mergeAccumulator(acc, acc3);
- acc = mergeAccumulator(acc, acc4);
-
-### Step 4. Add input length
-
-The input total length is presumed known at this stage. This step is just about adding the length to accumulator, so that it participates to final mixing.
-
- acc = acc + inputLength;
-
-### Step 5. Consume remaining input
-
-There may be up to 31 bytes remaining to consume from the input.
-The final stage will digest them according to following pseudo-code:
-
- while (remainingLength >= 8) {
- lane = read_64bit_little_endian(input_ptr);
- acc = acc xor round(0, lane);
- acc = (acc <<< 27) * PRIME64_1;
- acc = acc + PRIME64_4;
- input_ptr += 8; remainingLength -= 8;
- }
-
- if (remainingLength >= 4) {
- lane = read_32bit_little_endian(input_ptr);
- acc = acc xor (lane * PRIME64_1);
- acc = (acc <<< 23) * PRIME64_2;
- acc = acc + PRIME64_3;
- input_ptr += 4; remainingLength -= 4;
- }
-
- while (remainingLength >= 1) {
- lane = read_byte(input_ptr);
- acc = acc xor (lane * PRIME64_5);
- acc = (acc <<< 11) * PRIME64_1;
- input_ptr += 1; remainingLength -= 1;
- }
-
-This process ensures that all input bytes are present in the final mix.
-
-### Step 6. Final mix (avalanche)
-
-The final mix ensures that all input bits have a chance to impact any bit in the output digest, resulting in an unbiased distribution. This is also called avalanche effect.
-
- acc = acc xor (acc >> 33);
- acc = acc * PRIME64_2;
- acc = acc xor (acc >> 29);
- acc = acc * PRIME64_3;
- acc = acc xor (acc >> 32);
-
-### Step 7. Output
-
-The `XXH64()` function produces an unsigned 64-bit value as output.
-
-For systems which require to store and/or display the result in binary or hexadecimal format, the canonical format is defined to reproduce the same value as the natural decimal format, hence follows __big-endian__ convention (most significant byte first).
-
-Performance considerations
-----------------------------------
-
-The xxHash algorithms are simple and compact to implement. They provide a system independent "fingerprint" or digest of a message of arbitrary length.
-
-The algorithm allows input to be streamed and processed in multiple steps. In such case, an internal buffer is needed to ensure data is presented to the algorithm in full stripes.
-
-On 64-bit systems, the 64-bit variant `XXH64` is generally faster to compute, so it is a recommended variant, even when only 32-bit are needed.
-
-On 32-bit systems though, positions are reversed: `XXH64` performance is reduced, due to its usage of 64-bit arithmetic. `XXH32` becomes a faster variant.
-
-
-Reference Implementation
-----------------------------------------
-
-A reference library written in C is available at https://www.xxhash.com.
-The web page also links to multiple other implementations written in many different languages.
-It links to the [github project page](https://github.com/Cyan4973/xxHash) where an [issue board](https://github.com/Cyan4973/xxHash/issues) can be used for further public discussions on the topic.
-
-
-Version changes
---------------------
-v0.7.3: Minor fixes
-v0.1.1: added a note on rationale for selection of constants
-v0.1.0: initial release
diff --git a/third_party/xxhash/libxxhash.pc.in b/third_party/xxhash/libxxhash.pc.in
deleted file mode 100644
index 28c1644856..0000000000
--- a/third_party/xxhash/libxxhash.pc.in
+++ /dev/null
@@ -1,15 +0,0 @@
-# xxHash - Extremely fast hash algorithm
-# Copyright (C) 2012-2020, Yann Collet, Facebook
-# BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php)
-
-prefix=@PREFIX@
-exec_prefix=@EXECPREFIX@
-includedir=${prefix}/@INCLUDEDIR@
-libdir=${exec_prefix}/@LIBDIR@
-
-Name: xxhash
-Description: extremely fast hash algorithm
-URL: http://www.xxhash.com/
-Version: @VERSION@
-Libs: -L${libdir} -lxxhash
-Cflags: -I${includedir}
diff --git a/third_party/xxhash/tests/Makefile b/third_party/xxhash/tests/Makefile
deleted file mode 100644
index 092711adb8..0000000000
--- a/third_party/xxhash/tests/Makefile
+++ /dev/null
@@ -1,83 +0,0 @@
-CFLAGS += -Wall -Wextra -Wundef -g
-
-NM = nm
-GREP = grep
-
-# Define *.exe as extension for Windows systems
-ifneq (,$(filter Windows%,$(OS)))
-EXT =.exe
-else
-EXT =
-endif
-
-ifneq (,$(filter %UTF-8,$(LANG)))
-ENABLE_UNICODE ?= 1
-else
-ENABLE_UNICODE ?= 0
-endif
-
-.PHONY: default
-default: all
-
-.PHONY: all
-all: test
-
-.PHONY: test
-test: test_multiInclude test_unicode
-
-.PHONY: test_multiInclude
-test_multiInclude:
- @$(MAKE) clean
- # compile without xxhash.o, ensure symbols exist within target
- # Note: built using only default rules
- $(MAKE) multiInclude
- @$(MAKE) clean
- # compile with xxhash.o, to detect duplicated symbols
- $(MAKE) multiInclude_withxxhash
- @$(MAKE) clean
- # Note: XXH_INLINE_ALL with XXH_NAMESPACE is currently disabled
- # compile with XXH_NAMESPACE
- # CPPFLAGS=-DXXH_NAMESPACE=TESTN_ $(MAKE) multiInclude_withxxhash
- # no symbol prefixed TESTN_ should exist
- # ! $(NM) multiInclude_withxxhash | $(GREP) TESTN_
- #$(MAKE) clean
- # compile with XXH_NAMESPACE and without xxhash.o
- # CPPFLAGS=-DXXH_NAMESPACE=TESTN_ $(MAKE) multiInclude
- # no symbol prefixed TESTN_ should exist
- # ! $(NM) multiInclude | $(GREP) TESTN_
- #@$(MAKE) clean
-
-.PHONY: test_ppc_redefine
-test_ppc_redefine: ppc_define.c
- @$(MAKE) clean
- $(CC) $(CPPFLAGS) $(CFLAGS) -c $^
-
-xxhsum$(EXT): ../xxhash.c ../xxhash.h ../xxhsum.c
- $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -DXXH_INLINE_ALL ../xxhsum.c -o $@
-
-# Make sure that Unicode filenames work.
-# https://github.com/Cyan4973/xxHash/issues/293
-.PHONY: test_unicode
-ifeq (0,$(ENABLE_UNICODE))
-test_unicode:
- @echo "Skipping Unicode test, your terminal doesn't appear to support UTF-8."
- @echo "Try with ENABLE_UNICODE=1"
-else
-test_unicode: xxhsum$(EXT) generate_unicode_test.c
- # Generate a Unicode filename test dynamically
- # to keep UTF-8 out of the source tree.
- $(CC) $(CFLAGS) $(LDFLAGS) generate_unicode_test.c -o generate_unicode_test$(EXT)
- ./generate_unicode_test$(EXT)
- $(SHELL) ./unicode_test.sh
-endif
-
-xxhash.o: ../xxhash.c ../xxhash.h
- $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -c -o $@ $<
-
-multiInclude_withxxhash: multiInclude.o xxhash.o
- $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ $^
-
-clean:
- @$(RM) *.o
- @$(RM) multiInclude multiInclude_withxxhash
- @$(RM) *.unicode generate_unicode_test$(EXT) unicode_test.* xxhsum$(EXT)
diff --git a/third_party/xxhash/tests/bench/.clang_complete b/third_party/xxhash/tests/bench/.clang_complete
deleted file mode 100644
index 87dff6b82c..0000000000
--- a/third_party/xxhash/tests/bench/.clang_complete
+++ /dev/null
@@ -1 +0,0 @@
--I../..
diff --git a/third_party/xxhash/tests/bench/.gitignore b/third_party/xxhash/tests/bench/.gitignore
deleted file mode 100644
index ede2d5880f..0000000000
--- a/third_party/xxhash/tests/bench/.gitignore
+++ /dev/null
@@ -1,11 +0,0 @@
-# build artifacts
-
-*.o
-benchHash
-benchHash32
-benchHash_avx2
-benchHash_hw
-
-# test files
-
-test*
diff --git a/third_party/xxhash/tests/bench/LICENSE b/third_party/xxhash/tests/bench/LICENSE
deleted file mode 100644
index d159169d10..0000000000
--- a/third_party/xxhash/tests/bench/LICENSE
+++ /dev/null
@@ -1,339 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Lesser General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) year name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- <signature of Ty Coon>, 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.
diff --git a/third_party/xxhash/tests/bench/Makefile b/third_party/xxhash/tests/bench/Makefile
deleted file mode 100644
index cdccfffd65..0000000000
--- a/third_party/xxhash/tests/bench/Makefile
+++ /dev/null
@@ -1,67 +0,0 @@
-# ################################################################
-# xxHash benchHash Makefile
-# Copyright (C) 2019-2020 Yann Collet
-#
-# GPL v2 License
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# You can contact the author at:
-# - xxHash homepage: https://www.xxhash.com
-# - xxHash source repository: https://github.com/Cyan4973/xxHash
-# ################################################################
-# benchHash: A generic benchmark for hash algorithms
-# measuring throughput, latency and bandwidth
-# ################################################################
-
-
-CPPFLAGS += -I../.. # directory of xxHash source files
-CFLAGS ?= -O3
-CFLAGS += -std=c99 -Wall -Wextra -Wstrict-aliasing=1
-CFLAGS += $(MOREFLAGS) # custom way to add flags
-CXXFLAGS ?= -O3
-LDFLAGS += $(MOREFLAGS)
-
-
-OBJ_LIST = main.o bhDisplay.o benchHash.o benchfn.o timefn.o
-
-
-default: benchHash
-
-all: benchHash
-
-benchHash32: CFLAGS += -m32
-benchHash32: CXXFLAGS += -m32
-
-benchHash_avx2: CFLAGS += -mavx2
-benchHash_avx2: CXXFLAGS += -mavx2
-
-benchHash_hw: CPPFLAGS += -DHARDWARE_SUPPORT
-benchHash_hw: CFLAGS += -mavx2 -maes
-benchHash_hw: CXXFLAGS += -mavx2 -mpclmul -std=c++14
-
-benchHash benchHash32 benchHash_avx2 benchHash_nosimd benchHash_hw: $(OBJ_LIST)
- $(CXX) $(CPPFLAGS) $(CXXFLAGS) $^ $(LDFLAGS) -o $@
-
-
-main.o: bhDisplay.h hashes.h
-
-bhDisplay.o: bhDisplay.h benchHash.h
-
-benchHash.o: benchHash.h
-
-
-clean:
- $(RM) *.o benchHash benchHash32 benchHash_avx2 benchHash_hw
diff --git a/third_party/xxhash/tests/bench/benchHash.c b/third_party/xxhash/tests/bench/benchHash.c
deleted file mode 100644
index 05739c7b5c..0000000000
--- a/third_party/xxhash/tests/bench/benchHash.c
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
-* Hash benchmark module
-* Part of the xxHash project
-* Copyright (C) 2019-2020 Yann Collet
-*
-* GPL v2 License
-*
-* This program is free software; you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation; either version 2 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License along
-* with this program; if not, write to the Free Software Foundation, Inc.,
-* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*
-* You can contact the author at:
-* - xxHash homepage: https://www.xxhash.com
-* - xxHash source repository: https://github.com/Cyan4973/xxHash
-*/
-
-/* benchmark hash functions */
-
-#include <stdlib.h> // malloc
-#include <assert.h>
-
-#include "benchHash.h"
-
-
-static void initBuffer(void* buffer, size_t size)
-{
- const unsigned long long k1 = 11400714785074694791ULL; /* 0b1001111000110111011110011011000110000101111010111100101010000111 */
- const unsigned long long k2 = 14029467366897019727ULL; /* 0b1100001010110010101011100011110100100111110101001110101101001111 */
- unsigned long long acc = k2;
- unsigned char* const p = (unsigned char*)buffer;
- for (size_t s = 0; s < size; s++) {
- acc *= k1;
- p[s] = (unsigned char)(acc >> 56);
- }
-}
-
-
-#define MARGIN_FOR_LATENCY 1024
-#define START_MASK (MARGIN_FOR_LATENCY-1)
-
-typedef size_t (*sizeFunction_f)(size_t targetSize);
-
-/*
- * bench_hash_internal():
- * Benchmarks hashfn repeateadly over single input of size `size`
- * return: nb of hashes per second
- */
-static double
-bench_hash_internal(BMK_benchFn_t hashfn, void* payload,
- size_t nbBlocks, sizeFunction_f selectSize, size_t size,
- unsigned total_time_ms, unsigned iter_time_ms)
-{
- BMK_timedFnState_shell shell;
- BMK_timedFnState_t* const txf = BMK_initStatic_timedFnState(&shell, sizeof(shell), total_time_ms, iter_time_ms);
- assert(txf != NULL);
-
- size_t const srcSize = (size_t)size;
- size_t const srcBufferSize = srcSize + MARGIN_FOR_LATENCY;
- void* const srcBuffer = malloc(srcBufferSize);
- assert(srcBuffer != NULL);
- initBuffer(srcBuffer, srcBufferSize);
- #define FAKE_DSTSIZE 32
- size_t const dstSize = FAKE_DSTSIZE;
- char dstBuffer_static[FAKE_DSTSIZE] = {0};
-
- #define NB_BLOCKS_MAX 1024
- const void* srcBuffers[NB_BLOCKS_MAX];
- size_t srcSizes[NB_BLOCKS_MAX];
- void* dstBuffers[NB_BLOCKS_MAX];
- size_t dstCapacities[NB_BLOCKS_MAX];
- assert(nbBlocks < NB_BLOCKS_MAX);
-
- assert(size > 0);
- for (size_t n=0; n < nbBlocks; n++) {
- srcBuffers[n] = srcBuffer;
- srcSizes[n] = selectSize(size);
- dstBuffers[n] = dstBuffer_static;
- dstCapacities[n] = dstSize;
- }
-
-
- BMK_benchParams_t params = {
- .benchFn = hashfn,
- .benchPayload = payload,
- .initFn = NULL,
- .initPayload = NULL,
- .errorFn = NULL,
- .blockCount = nbBlocks,
- .srcBuffers = srcBuffers,
- .srcSizes = srcSizes,
- .dstBuffers = dstBuffers,
- .dstCapacities = dstCapacities,
- .blockResults = NULL
- };
- BMK_runOutcome_t result;
-
- while (!BMK_isCompleted_TimedFn(txf)) {
- result = BMK_benchTimedFn(txf, params);
- assert(BMK_isSuccessful_runOutcome(result));
- }
-
- BMK_runTime_t const runTime = BMK_extract_runTime(result);
-
- free(srcBuffer);
- assert(runTime.nanoSecPerRun != 0);
- return (1000000000U / runTime.nanoSecPerRun) * nbBlocks;
-
-}
-
-
-static size_t rand_1_N(size_t N) { return ((size_t)rand() % N) + 1; }
-
-static size_t identity(size_t s) { return s; }
-
-static size_t
-benchLatency(const void* src, size_t srcSize,
- void* dst, size_t dstCapacity,
- void* customPayload)
-{
- (void)dst; (void)dstCapacity;
- BMK_benchFn_t benchfn = (BMK_benchFn_t)customPayload;
- static size_t hash = 0;
-
- const void* const start = (const char*)src + (hash & START_MASK);
-
- return hash = benchfn(start, srcSize, dst, dstCapacity, NULL);
-}
-
-
-
-#ifndef SIZE_TO_HASH_PER_ROUND
-# define SIZE_TO_HASH_PER_ROUND 200000
-#endif
-
-#ifndef NB_HASH_ROUNDS_MAX
-# define NB_HASH_ROUNDS_MAX 1000
-#endif
-
-double bench_hash(BMK_benchFn_t hashfn,
- BMK_benchMode benchMode,
- size_t size, BMK_sizeMode sizeMode,
- unsigned total_time_ms, unsigned iter_time_ms)
-{
- sizeFunction_f const sizef = (sizeMode == BMK_fixedSize) ? identity : rand_1_N;
- BMK_benchFn_t const benchfn = (benchMode == BMK_throughput) ? hashfn : benchLatency;
- BMK_benchFn_t const payload = (benchMode == BMK_throughput) ? NULL : hashfn;
-
- size_t nbBlocks = (SIZE_TO_HASH_PER_ROUND / size) + 1;
- if (nbBlocks > NB_HASH_ROUNDS_MAX) nbBlocks = NB_HASH_ROUNDS_MAX;
-
- return bench_hash_internal(benchfn, payload,
- nbBlocks, sizef, size,
- total_time_ms, iter_time_ms);
-}
diff --git a/third_party/xxhash/tests/bench/benchHash.h b/third_party/xxhash/tests/bench/benchHash.h
deleted file mode 100644
index 6c9ba91047..0000000000
--- a/third_party/xxhash/tests/bench/benchHash.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
-* Hash benchmark module
-* Part of the xxHash project
-* Copyright (C) 2019-2020 Yann Collet
-*
-* GPL v2 License
-*
-* This program is free software; you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation; either version 2 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License along
-* with this program; if not, write to the Free Software Foundation, Inc.,
-* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*
-* You can contact the author at:
-* - xxHash homepage: https://www.xxhash.com
-* - xxHash source repository: https://github.com/Cyan4973/xxHash
-*/
-
-
-#ifndef BENCH_HASH_H_983426678
-#define BENCH_HASH_H_983426678
-
-#if defined (__cplusplus)
-extern "C" {
-#endif
-
-
-/* === Dependencies === */
-
-#include "benchfn.h" /* BMK_benchFn_t */
-
-
-/* === Declarations === */
-
-typedef enum { BMK_throughput, BMK_latency } BMK_benchMode;
-
-typedef enum { BMK_fixedSize, /* hash always `size` bytes */
- BMK_randomSize, /* hash a random nb of bytes, between 1 and `size` (inclusive) */
-} BMK_sizeMode;
-
-/*
- * bench_hash():
- * Returns speed expressed as nb hashes per second.
- * total_time_ms: time spent benchmarking the hash function with given parameters
- * iter_time_ms: time spent for one round. If multiple rounds are run,
- * bench_hash() will report the speed of best round.
- */
-double bench_hash(BMK_benchFn_t hashfn,
- BMK_benchMode benchMode,
- size_t size, BMK_sizeMode sizeMode,
- unsigned total_time_ms, unsigned iter_time_ms);
-
-
-
-#if defined (__cplusplus)
-}
-#endif
-
-#endif /* BENCH_HASH_H_983426678 */
diff --git a/third_party/xxhash/tests/bench/benchfn.c b/third_party/xxhash/tests/bench/benchfn.c
deleted file mode 100644
index ec7e9a25d0..0000000000
--- a/third_party/xxhash/tests/bench/benchfn.c
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- * Copyright (C) 2016-2020 Yann Collet, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under both the BSD-style license (found in the
- * LICENSE file in the root directory of this source tree) and the GPLv2 (found
- * in the COPYING file in the root directory of this source tree).
- * You may select, at your option, one of the above-listed licenses.
- */
-
-
-
-/* *************************************
-* Includes
-***************************************/
-#include <stdlib.h> /* malloc, free */
-#include <string.h> /* memset */
-#undef NDEBUG /* assert must not be disabled */
-#include <assert.h> /* assert */
-
-#include "timefn.h" /* UTIL_time_t, UTIL_getTime */
-#include "benchfn.h"
-
-
-/* *************************************
-* Constants
-***************************************/
-#define TIMELOOP_MICROSEC SEC_TO_MICRO /* 1 second */
-#define TIMELOOP_NANOSEC (1*1000000000ULL) /* 1 second */
-
-#define KB *(1 <<10)
-#define MB *(1 <<20)
-#define GB *(1U<<30)
-
-
-/* *************************************
-* Debug errors
-***************************************/
-#if defined(DEBUG) && (DEBUG >= 1)
-# include <stdio.h> /* fprintf */
-# define DISPLAY(...) fprintf(stderr, __VA_ARGS__)
-# define DEBUGOUTPUT(...) { if (DEBUG) DISPLAY(__VA_ARGS__); }
-#else
-# define DEBUGOUTPUT(...)
-#endif
-
-
-/* error without displaying */
-#define RETURN_QUIET_ERROR(retValue, ...) { \
- DEBUGOUTPUT("%s: %i: \n", __FILE__, __LINE__); \
- DEBUGOUTPUT("Error : "); \
- DEBUGOUTPUT(__VA_ARGS__); \
- DEBUGOUTPUT(" \n"); \
- return retValue; \
-}
-
-
-/* *************************************
-* Benchmarking an arbitrary function
-***************************************/
-
-int BMK_isSuccessful_runOutcome(BMK_runOutcome_t outcome)
-{
- return outcome.error_tag_never_ever_use_directly == 0;
-}
-
-/* warning : this function will stop program execution if outcome is invalid !
- * check outcome validity first, using BMK_isValid_runResult() */
-BMK_runTime_t BMK_extract_runTime(BMK_runOutcome_t outcome)
-{
- assert(outcome.error_tag_never_ever_use_directly == 0);
- return outcome.internal_never_ever_use_directly;
-}
-
-size_t BMK_extract_errorResult(BMK_runOutcome_t outcome)
-{
- assert(outcome.error_tag_never_ever_use_directly != 0);
- return outcome.error_result_never_ever_use_directly;
-}
-
-static BMK_runOutcome_t BMK_runOutcome_error(size_t errorResult)
-{
- BMK_runOutcome_t b;
- memset(&b, 0, sizeof(b));
- b.error_tag_never_ever_use_directly = 1;
- b.error_result_never_ever_use_directly = errorResult;
- return b;
-}
-
-static BMK_runOutcome_t BMK_setValid_runTime(BMK_runTime_t runTime)
-{
- BMK_runOutcome_t outcome;
- outcome.error_tag_never_ever_use_directly = 0;
- outcome.internal_never_ever_use_directly = runTime;
- return outcome;
-}
-
-
-/* initFn will be measured once, benchFn will be measured `nbLoops` times */
-/* initFn is optional, provide NULL if none */
-/* benchFn must return a size_t value that errorFn can interpret */
-/* takes # of blocks and list of size & stuff for each. */
-/* can report result of benchFn for each block into blockResult. */
-/* blockResult is optional, provide NULL if this information is not required */
-/* note : time per loop can be reported as zero if run time < timer resolution */
-BMK_runOutcome_t BMK_benchFunction(BMK_benchParams_t p,
- unsigned nbLoops)
-{
- /* init */
- { size_t i;
- for (i = 0; i < p.blockCount; i++) {
- memset(p.dstBuffers[i], 0xE5, p.dstCapacities[i]); /* warm up and erase result buffer */
- } }
-
- /* benchmark */
- { UTIL_time_t const clockStart = UTIL_getTime();
- size_t dstSize = 0;
- unsigned loopNb, blockNb;
- nbLoops += !nbLoops; /* minimum nbLoops is 1 */
- if (p.initFn != NULL) p.initFn(p.initPayload);
- for (loopNb = 0; loopNb < nbLoops; loopNb++) {
- for (blockNb = 0; blockNb < p.blockCount; blockNb++) {
- size_t const res = p.benchFn(p.srcBuffers[blockNb], p.srcSizes[blockNb],
- p.dstBuffers[blockNb], p.dstCapacities[blockNb],
- p.benchPayload);
- if (loopNb == 0) {
- if (p.blockResults != NULL) p.blockResults[blockNb] = res;
- if ((p.errorFn != NULL) && (p.errorFn(res))) {
- RETURN_QUIET_ERROR(BMK_runOutcome_error(res),
- "Function benchmark failed on block %u (of size %u) with error %i",
- blockNb, (unsigned)p.srcSizes[blockNb], (int)res);
- }
- dstSize += res;
- } }
- } /* for (loopNb = 0; loopNb < nbLoops; loopNb++) */
-
- { PTime const totalTime = UTIL_clockSpanNano(clockStart);
- BMK_runTime_t rt;
- rt.nanoSecPerRun = (double)totalTime / nbLoops;
- rt.sumOfReturn = dstSize;
- return BMK_setValid_runTime(rt);
- } }
-}
-
-
-/* ==== Benchmarking any function, providing intermediate results ==== */
-
-struct BMK_timedFnState_s {
- PTime timeSpent_ns;
- PTime timeBudget_ns;
- PTime runBudget_ns;
- BMK_runTime_t fastestRun;
- unsigned nbLoops;
- UTIL_time_t coolTime;
-}; /* typedef'd to BMK_timedFnState_t within bench.h */
-
-BMK_timedFnState_t* BMK_createTimedFnState(unsigned total_ms, unsigned run_ms)
-{
- BMK_timedFnState_t* const r = (BMK_timedFnState_t*)malloc(sizeof(*r));
- if (r == NULL) return NULL; /* malloc() error */
- BMK_resetTimedFnState(r, total_ms, run_ms);
- return r;
-}
-
-void BMK_freeTimedFnState(BMK_timedFnState_t* state) { free(state); }
-
-BMK_timedFnState_t*
-BMK_initStatic_timedFnState(void* buffer, size_t size, unsigned total_ms, unsigned run_ms)
-{
- typedef char check_size[ 2 * (sizeof(BMK_timedFnState_shell) >= sizeof(struct BMK_timedFnState_s)) - 1]; /* static assert : a compilation failure indicates that BMK_timedFnState_shell is not large enough */
- typedef struct { check_size c; BMK_timedFnState_t tfs; } tfs_align; /* force tfs to be aligned at its next best position */
- size_t const tfs_alignment = offsetof(tfs_align, tfs); /* provides the minimal alignment restriction for BMK_timedFnState_t */
- BMK_timedFnState_t* const r = (BMK_timedFnState_t*)buffer;
- if (buffer == NULL) return NULL;
- if (size < sizeof(struct BMK_timedFnState_s)) return NULL;
- if ((size_t)buffer % tfs_alignment) return NULL; /* buffer must be properly aligned */
- BMK_resetTimedFnState(r, total_ms, run_ms);
- return r;
-}
-
-void BMK_resetTimedFnState(BMK_timedFnState_t* timedFnState, unsigned total_ms, unsigned run_ms)
-{
- if (!total_ms) total_ms = 1 ;
- if (!run_ms) run_ms = 1;
- if (run_ms > total_ms) run_ms = total_ms;
- timedFnState->timeSpent_ns = 0;
- timedFnState->timeBudget_ns = (PTime)total_ms * TIMELOOP_NANOSEC / 1000;
- timedFnState->runBudget_ns = (PTime)run_ms * TIMELOOP_NANOSEC / 1000;
- timedFnState->fastestRun.nanoSecPerRun = (double)TIMELOOP_NANOSEC * 2000000000; /* hopefully large enough : must be larger than any potential measurement */
- timedFnState->fastestRun.sumOfReturn = (size_t)(-1LL);
- timedFnState->nbLoops = 1;
- timedFnState->coolTime = UTIL_getTime();
-}
-
-/* Tells if nb of seconds set in timedFnState for all runs is spent.
- * note : this function will return 1 if BMK_benchFunctionTimed() has actually errored. */
-int BMK_isCompleted_TimedFn(const BMK_timedFnState_t* timedFnState)
-{
- return (timedFnState->timeSpent_ns >= timedFnState->timeBudget_ns);
-}
-
-
-#undef MIN
-#define MIN(a,b) ( (a) < (b) ? (a) : (b) )
-
-#define MINUSABLETIME (TIMELOOP_NANOSEC / 2) /* 0.5 seconds */
-
-BMK_runOutcome_t BMK_benchTimedFn(BMK_timedFnState_t* cont,
- BMK_benchParams_t p)
-{
- PTime const runBudget_ns = cont->runBudget_ns;
- PTime const runTimeMin_ns = runBudget_ns / 2;
- BMK_runTime_t bestRunTime = cont->fastestRun;
-
- for (;;) {
- BMK_runOutcome_t const runResult = BMK_benchFunction(p, cont->nbLoops);
-
- if (!BMK_isSuccessful_runOutcome(runResult)) { /* error : move out */
- return runResult;
- }
-
- { BMK_runTime_t const newRunTime = BMK_extract_runTime(runResult);
- double const loopDuration_ns = newRunTime.nanoSecPerRun * cont->nbLoops;
-
- cont->timeSpent_ns += (unsigned long long)loopDuration_ns;
-
- /* estimate nbLoops for next run to last approximately 1 second */
- if (loopDuration_ns > (runBudget_ns / 50)) {
- double const fastestRun_ns = MIN(bestRunTime.nanoSecPerRun, newRunTime.nanoSecPerRun);
- cont->nbLoops = (unsigned)(runBudget_ns / fastestRun_ns) + 1;
- } else {
- /* previous run was too short : blindly increase workload by x multiplier */
- const unsigned multiplier = 10;
- assert(cont->nbLoops < ((unsigned)-1) / multiplier); /* avoid overflow */
- cont->nbLoops *= multiplier;
- }
-
- if (loopDuration_ns < runTimeMin_ns) {
- /* When benchmark run time is too small : don't report results.
- * increased risks of rounding errors */
- continue;
- }
-
- if (newRunTime.nanoSecPerRun < bestRunTime.nanoSecPerRun) {
- bestRunTime = newRunTime;
- }
- }
- break;
- } /* while (!completed) */
-
- return BMK_setValid_runTime(bestRunTime);
-}
diff --git a/third_party/xxhash/tests/bench/benchfn.h b/third_party/xxhash/tests/bench/benchfn.h
deleted file mode 100644
index 42d1033830..0000000000
--- a/third_party/xxhash/tests/bench/benchfn.h
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Copyright (C) 2016-2020 Yann Collet, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under both the BSD-style license (found in the
- * LICENSE file in the root directory of this source tree) and the GPLv2 (found
- * in the COPYING file in the root directory of this source tree).
- * You may select, at your option, one of the above-listed licenses.
- */
-
-
-/* benchfn :
- * benchmark any function on a set of input
- * providing result in nanoSecPerRun
- * or detecting and returning an error
- */
-
-#if defined (__cplusplus)
-extern "C" {
-#endif
-
-#ifndef BENCH_FN_H_23876
-#define BENCH_FN_H_23876
-
-/* === Dependencies === */
-#include <stddef.h> /* size_t */
-
-
-/* ==== Benchmark any function, iterated on a set of blocks ==== */
-
-/* BMK_runTime_t: valid result return type */
-
-typedef struct {
- double nanoSecPerRun; /* time per iteration (over all blocks) */
- size_t sumOfReturn; /* sum of return values */
-} BMK_runTime_t;
-
-
-/* BMK_runOutcome_t:
- * type expressing the outcome of a benchmark run by BMK_benchFunction(),
- * which can be either valid or invalid.
- * benchmark outcome can be invalid if errorFn is provided.
- * BMK_runOutcome_t must be considered "opaque" : never access its members directly.
- * Instead, use its assigned methods :
- * BMK_isSuccessful_runOutcome, BMK_extract_runTime, BMK_extract_errorResult.
- * The structure is only described here to allow its allocation on stack. */
-
-typedef struct {
- BMK_runTime_t internal_never_ever_use_directly;
- size_t error_result_never_ever_use_directly;
- int error_tag_never_ever_use_directly;
-} BMK_runOutcome_t;
-
-
-/* prototypes for benchmarked functions */
-typedef size_t (*BMK_benchFn_t)(const void* src, size_t srcSize, void* dst, size_t dstCapacity, void* customPayload);
-typedef size_t (*BMK_initFn_t)(void* initPayload);
-typedef unsigned (*BMK_errorFn_t)(size_t);
-
-
-/* BMK_benchFunction() parameters are provided via the following structure.
- * A structure is preferable for readability,
- * as the number of parameters required is fairly large.
- * No initializer is provided, because it doesn't make sense to provide some "default" :
- * all parameters must be specified by the caller.
- * optional parameters are labelled explicitly, and accept value NULL when not used */
-typedef struct {
- BMK_benchFn_t benchFn; /* the function to benchmark, over the set of blocks */
- void* benchPayload; /* pass custom parameters to benchFn :
- * (*benchFn)(srcBuffers[i], srcSizes[i], dstBuffers[i], dstCapacities[i], benchPayload) */
- BMK_initFn_t initFn; /* (*initFn)(initPayload) is run once per run, at the beginning. */
- void* initPayload; /* Both arguments can be NULL, in which case nothing is run. */
- BMK_errorFn_t errorFn; /* errorFn will check each return value of benchFn over each block, to determine if it failed or not.
- * errorFn can be NULL, in which case no check is performed.
- * errorFn must return 0 when benchFn was successful, and >= 1 if it detects an error.
- * Execution is stopped as soon as an error is detected.
- * the triggering return value can be retrieved using BMK_extract_errorResult(). */
- size_t blockCount; /* number of blocks to operate benchFn on.
- * It's also the size of all array parameters :
- * srcBuffers, srcSizes, dstBuffers, dstCapacities, blockResults */
- const void *const * srcBuffers; /* read-only array of buffers to be operated on by benchFn */
- const size_t* srcSizes; /* read-only array containing sizes of srcBuffers */
- void *const * dstBuffers; /* array of buffers to be written into by benchFn. This array is not optional, it must be provided even if unused by benchfn. */
- const size_t* dstCapacities; /* read-only array containing capacities of dstBuffers. This array must be present. */
- size_t* blockResults; /* Optional: store the return value of benchFn for each block. Use NULL if this result is not requested. */
-} BMK_benchParams_t;
-
-
-/* BMK_benchFunction() :
- * This function benchmarks benchFn and initFn, providing a result.
- *
- * params : see description of BMK_benchParams_t above.
- * nbLoops: defines number of times benchFn is run over the full set of blocks.
- * Minimum value is 1. A 0 is interpreted as a 1.
- *
- * @return: can express either an error or a successful result.
- * Use BMK_isSuccessful_runOutcome() to check if benchmark was successful.
- * If yes, extract the result with BMK_extract_runTime(),
- * it will contain :
- * .sumOfReturn : the sum of all return values of benchFn through all of blocks
- * .nanoSecPerRun : time per run of benchFn + (time for initFn / nbLoops)
- * .sumOfReturn is generally intended for functions which return a # of bytes written into dstBuffer,
- * in which case, this value will be the total amount of bytes written into dstBuffer.
- *
- * blockResults : when provided (!= NULL), and when benchmark is successful,
- * params.blockResults contains all return values of `benchFn` over all blocks.
- * when provided (!= NULL), and when benchmark failed,
- * params.blockResults contains return values of `benchFn` over all blocks preceding and including the failed block.
- */
-BMK_runOutcome_t BMK_benchFunction(BMK_benchParams_t params, unsigned nbLoops);
-
-
-
-/* check first if the benchmark was successful or not */
-int BMK_isSuccessful_runOutcome(BMK_runOutcome_t outcome);
-
-/* If the benchmark was successful, extract the result.
- * note : this function will abort() program execution if benchmark failed !
- * always check if benchmark was successful first !
- */
-BMK_runTime_t BMK_extract_runTime(BMK_runOutcome_t outcome);
-
-/* when benchmark failed, it means one invocation of `benchFn` failed.
- * The failure was detected by `errorFn`, operating on return values of `benchFn`.
- * Returns the faulty return value.
- * note : this function will abort() program execution if benchmark did not failed.
- * always check if benchmark failed first !
- */
-size_t BMK_extract_errorResult(BMK_runOutcome_t outcome);
-
-
-
-/* ==== Benchmark any function, returning intermediate results ==== */
-
-/* state information tracking benchmark session */
-typedef struct BMK_timedFnState_s BMK_timedFnState_t;
-
-/* BMK_benchTimedFn() :
- * Similar to BMK_benchFunction(), most arguments being identical.
- * Automatically determines `nbLoops` so that each result is regularly produced at interval of about run_ms.
- * Note : minimum `nbLoops` is 1, therefore a run may last more than run_ms, and possibly even more than total_ms.
- * Usage - initialize timedFnState, select benchmark duration (total_ms) and each measurement duration (run_ms)
- * call BMK_benchTimedFn() repetitively, each measurement is supposed to last about run_ms
- * Check if total time budget is spent or exceeded, using BMK_isCompleted_TimedFn()
- */
-BMK_runOutcome_t BMK_benchTimedFn(BMK_timedFnState_t* timedFnState,
- BMK_benchParams_t params);
-
-/* Tells if duration of all benchmark runs has exceeded total_ms
- */
-int BMK_isCompleted_TimedFn(const BMK_timedFnState_t* timedFnState);
-
-/* BMK_createTimedFnState() and BMK_resetTimedFnState() :
- * Create/Set BMK_timedFnState_t for next benchmark session,
- * which shall last a minimum of total_ms milliseconds,
- * producing intermediate results, paced at interval of (approximately) run_ms.
- */
-BMK_timedFnState_t* BMK_createTimedFnState(unsigned total_ms, unsigned run_ms);
-void BMK_resetTimedFnState(BMK_timedFnState_t* timedFnState, unsigned total_ms, unsigned run_ms);
-void BMK_freeTimedFnState(BMK_timedFnState_t* state);
-
-
-/* BMK_timedFnState_shell and BMK_initStatic_timedFnState() :
- * Makes it possible to statically allocate a BMK_timedFnState_t on stack.
- * BMK_timedFnState_shell is only there to allocate space,
- * never ever access its members.
- * BMK_timedFnState_t() actually accepts any buffer.
- * It will check if provided buffer is large enough and is correctly aligned,
- * and will return NULL if conditions are not respected.
- */
-#define BMK_TIMEDFNSTATE_SIZE 64
-typedef union {
- char never_access_space[BMK_TIMEDFNSTATE_SIZE];
- long long alignment_enforcer; /* must be aligned on 8-bytes boundaries */
-} BMK_timedFnState_shell;
-BMK_timedFnState_t* BMK_initStatic_timedFnState(void* buffer, size_t size, unsigned total_ms, unsigned run_ms);
-
-
-#endif /* BENCH_FN_H_23876 */
-
-#if defined (__cplusplus)
-}
-#endif
diff --git a/third_party/xxhash/tests/bench/bhDisplay.c b/third_party/xxhash/tests/bench/bhDisplay.c
deleted file mode 100644
index 601ca1f3f1..0000000000
--- a/third_party/xxhash/tests/bench/bhDisplay.c
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
-* CSV Display module for the hash benchmark program
-* Part of the xxHash project
-* Copyright (C) 2019-2020 Yann Collet
-*
-* GPL v2 License
-*
-* This program is free software; you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation; either version 2 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License along
-* with this program; if not, write to the Free Software Foundation, Inc.,
-* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*
-* You can contact the author at :
-* - xxHash homepage : https://www.xxhash.com
-* - xxHash source repository : https://github.com/Cyan4973/xxHash
-*/
-
-
-/* === Dependencies === */
-
-#include <stdlib.h> /* rand */
-#include <stdio.h> /* printf */
-#include <assert.h>
-
-#include "benchHash.h"
-#include "bhDisplay.h"
-
-
-/* === benchmark large input === */
-
-#define MB_UNIT 1000000
-#define BENCH_LARGE_ITER_MS 490
-#define BENCH_LARGE_TOTAL_MS 1010
-static void bench_oneHash_largeInput(Bench_Entry hashDesc, int minlog, int maxlog)
-{
- printf("%-7s", hashDesc.name);
- for (int sizelog=minlog; sizelog<=maxlog; sizelog++) {
- size_t const inputSize = (size_t)1 << sizelog;
- double const nbhps = bench_hash(hashDesc.hash, BMK_throughput,
- inputSize, BMK_fixedSize,
- BENCH_LARGE_TOTAL_MS, BENCH_LARGE_ITER_MS);
- printf(",%6.0f", nbhps * inputSize / MB_UNIT); fflush(NULL);
- }
- printf("\n");
-}
-
-void bench_largeInput(Bench_Entry const* hashDescTable, int nbHashes, int minlog, int maxlog)
-{
- assert(maxlog < 31);
- assert(minlog >= 0);
- printf("benchmarking large inputs : from %u bytes (log%i) to %u MB (log%i) \n",
- 1U << minlog, minlog,
- (1U << maxlog) >> 20, maxlog);
- for (int i=0; i<nbHashes; i++)
- bench_oneHash_largeInput(hashDescTable[i], minlog, maxlog);
-}
-
-
-
-/* === Benchmark small inputs === */
-
-#define BENCH_SMALL_ITER_MS 170
-#define BENCH_SMALL_TOTAL_MS 490
-static void bench_throughput_oneHash_smallInputs(Bench_Entry hashDesc, size_t sizeMin, size_t sizeMax)
-{
- printf("%-7s", hashDesc.name);
- for (size_t s=sizeMin; s<sizeMax+1; s++) {
- double const nbhps = bench_hash(hashDesc.hash, BMK_throughput,
- s, BMK_fixedSize,
- BENCH_SMALL_TOTAL_MS, BENCH_SMALL_ITER_MS);
- printf(",%10.0f", nbhps); fflush(NULL);
- }
- printf("\n");
-}
-
-void bench_throughput_smallInputs(Bench_Entry const* hashDescTable, int nbHashes, size_t sizeMin, size_t sizeMax)
-{
- printf("Throughput small inputs of fixed size (from %zu to %zu bytes): \n",
- sizeMin, sizeMax);
- for (int i=0; i<nbHashes; i++)
- bench_throughput_oneHash_smallInputs(hashDescTable[i], sizeMin, sizeMax);
-}
-
-
-
-/* === Latency measurements (small keys) === */
-
-static void bench_latency_oneHash_smallInputs(Bench_Entry hashDesc, size_t size_min, size_t size_max)
-{
- printf("%-7s", hashDesc.name);
- for (size_t s=size_min; s<size_max+1; s++) {
- double const nbhps = bench_hash(hashDesc.hash, BMK_latency,
- s, BMK_fixedSize,
- BENCH_SMALL_TOTAL_MS, BENCH_SMALL_ITER_MS);
- printf(",%10.0f", nbhps); fflush(NULL);
- }
- printf("\n");
-}
-
-void bench_latency_smallInputs(Bench_Entry const* hashDescTable, int nbHashes, size_t size_min, size_t size_max)
-{
- printf("Latency for small inputs of fixed size : \n");
- for (int i=0; i<nbHashes; i++)
- bench_latency_oneHash_smallInputs(hashDescTable[i], size_min, size_max);
-}
-
-
-/* === Random input Length === */
-
-static void bench_randomInputLength_withOneHash(Bench_Entry hashDesc, size_t size_min, size_t size_max)
-{
- printf("%-7s", hashDesc.name);
- for (size_t s=size_min; s<size_max+1; s++) {
- srand((unsigned)s); /* ensure random sequence of length will be the same for a given s */
- double const nbhps = bench_hash(hashDesc.hash, BMK_throughput,
- s, BMK_randomSize,
- BENCH_SMALL_TOTAL_MS, BENCH_SMALL_ITER_MS);
- printf(",%10.0f", nbhps); fflush(NULL);
- }
- printf("\n");
-}
-
-void bench_throughput_randomInputLength(Bench_Entry const* hashDescTable, int nbHashes, size_t size_min, size_t size_max)
-{
- printf("benchmarking random size inputs [1-N] : \n");
- for (int i=0; i<nbHashes; i++)
- bench_randomInputLength_withOneHash(hashDescTable[i], size_min, size_max);
-}
-
-
-/* === Latency with Random input Length === */
-
-static void bench_latency_oneHash_randomInputLength(Bench_Entry hashDesc, size_t size_min, size_t size_max)
-{
- printf("%-7s", hashDesc.name);
- for (size_t s=size_min; s<size_max+1; s++) {
- srand((unsigned)s); /* ensure random sequence of length will be the same for a given s */
- double const nbhps = bench_hash(hashDesc.hash, BMK_latency,
- s, BMK_randomSize,
- BENCH_SMALL_TOTAL_MS, BENCH_SMALL_ITER_MS);
- printf(",%10.0f", nbhps); fflush(NULL);
- }
- printf("\n");
-}
-
-void bench_latency_randomInputLength(Bench_Entry const* hashDescTable, int nbHashes, size_t size_min, size_t size_max)
-{
- printf("Latency for small inputs of random size [1-N] : \n");
- for (int i=0; i<nbHashes; i++)
- bench_latency_oneHash_randomInputLength(hashDescTable[i], size_min, size_max);
-}
diff --git a/third_party/xxhash/tests/bench/bhDisplay.h b/third_party/xxhash/tests/bench/bhDisplay.h
deleted file mode 100644
index 42c4bb290b..0000000000
--- a/third_party/xxhash/tests/bench/bhDisplay.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
-* CSV Display module for the hash benchmark program
-* Part of the xxHash project
-* Copyright (C) 2019-2020 Yann Collet
-*
-* GPL v2 License
-*
-* This program is free software; you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation; either version 2 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License along
-* with this program; if not, write to the Free Software Foundation, Inc.,
-* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*
-* You can contact the author at:
-* - xxHash homepage: https://www.xxhash.com
-* - xxHash source repository: https://github.com/Cyan4973/xxHash
-*/
-
-#ifndef BH_DISPLAY_H_192088098
-#define BH_DISPLAY_H_192088098
-
-#if defined (__cplusplus)
-extern "C" {
-#endif
-
-
-/* === Dependencies === */
-
-#include "benchfn.h" /* BMK_benchFn_t */
-
-
-/* === Declarations === */
-
-typedef struct {
- const char* name;
- BMK_benchFn_t hash;
-} Bench_Entry;
-
-void bench_largeInput(Bench_Entry const* hashDescTable, int nbHashes, int sizeLogMin, int sizeLogMax);
-
-void bench_throughput_smallInputs(Bench_Entry const* hashDescTable, int nbHashes, size_t sizeMin, size_t sizeMax);
-void bench_throughput_randomInputLength(Bench_Entry const* hashDescTable, int nbHashes, size_t sizeMin, size_t sizeMax);
-
-void bench_latency_smallInputs(Bench_Entry const* hashDescTable, int nbHashes, size_t sizeMin, size_t sizeMax);
-void bench_latency_randomInputLength(Bench_Entry const* hashDescTable, int nbHashes, size_t sizeMin, size_t sizeMax);
-
-
-
-#if defined (__cplusplus)
-}
-#endif
-
-#endif /* BH_DISPLAY_H_192088098 */
diff --git a/third_party/xxhash/tests/bench/hashes.h b/third_party/xxhash/tests/bench/hashes.h
deleted file mode 100644
index 2042dc5894..0000000000
--- a/third_party/xxhash/tests/bench/hashes.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
-* List hash algorithms to benchmark
-* Part of xxHash project
-* Copyright (C) 2019-2020 Yann Collet
-*
-* GPL v2 License
-*
-* This program is free software; you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation; either version 2 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License along
-* with this program; if not, write to the Free Software Foundation, Inc.,
-* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*
-* You can contact the author at:
-* - xxHash homepage: https://www.xxhash.com
-* - xxHash source repository: https://github.com/Cyan4973/xxHash
-*/
-
-
-/* === Dependencies === */
-
-#include <stddef.h> /* size_t */
-
-
-/* ==================================================
- * Non-portable hash algorithms
- * =============================================== */
-
-
-#ifdef HARDWARE_SUPPORT
-
-/*
- * List any hash algorithms that depend on specific hardware support,
- * including for example:
- * - Hardware crc32c
- * - Hardware AES support
- * - Carryless Multipliers (clmul)
- * - AVX2
- */
-
-#endif
-
-
-
-/* ==================================================
- * List of hashes
- * ==================================================
- * Each hash must be wrapped in a thin redirector conformant with the BMK_benchfn_t.
- * BMK_benchfn_t is generic, not specifically designed for hashes.
- * For hashes, the following parameters are expected to be useless:
- * dst, dstCapacity, customPayload.
- *
- * The result of each hash is assumed to be provided as function return value.
- * This condition is important for latency measurements.
- */
-
- /* === xxHash === */
-#define XXH_INLINE_ALL
-#include "xxhash.h"
-
-size_t XXH32_wrapper(const void* src, size_t srcSize, void* dst, size_t dstCapacity, void* customPayload)
-{
- (void)dst; (void)dstCapacity; (void)customPayload;
- return (size_t) XXH32(src, srcSize, 0);
-}
-
-
-size_t XXH64_wrapper(const void* src, size_t srcSize, void* dst, size_t dstCapacity, void* customPayload)
-{
- (void)dst; (void)dstCapacity; (void)customPayload;
- return (size_t) XXH64(src, srcSize, 0);
-}
-
-
-size_t xxh3_wrapper(const void* src, size_t srcSize, void* dst, size_t dstCapacity, void* customPayload)
-{
- (void)dst; (void)dstCapacity; (void)customPayload;
- return (size_t) XXH3_64bits(src, srcSize);
-}
-
-
-size_t XXH128_wrapper(const void* src, size_t srcSize, void* dst, size_t dstCapacity, void* customPayload)
-{
- (void)dst; (void)dstCapacity; (void)customPayload;
- return (size_t) XXH3_128bits(src, srcSize).low64;
-}
-
-
-
-/* ==================================================
- * Table of hashes
- * =============================================== */
-
-#include "bhDisplay.h" /* Bench_Entry */
-
-#ifndef HARDWARE_SUPPORT
-# define NB_HASHES 4
-#else
-# define NB_HASHES 4
-#endif
-
-Bench_Entry const hashCandidates[NB_HASHES] = {
- { "xxh3" , xxh3_wrapper },
- { "XXH32" , XXH32_wrapper },
- { "XXH64" , XXH64_wrapper },
- { "XXH128", XXH128_wrapper },
-#ifdef HARDWARE_SUPPORT
- /* list here codecs which require specific hardware support, such SSE4.1, PCLMUL, AVX2, etc. */
-#endif
-};
diff --git a/third_party/xxhash/tests/bench/main.c b/third_party/xxhash/tests/bench/main.c
deleted file mode 100644
index 1cf6e80f69..0000000000
--- a/third_party/xxhash/tests/bench/main.c
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Main program to benchmark hash functions
- * Part of the xxHash project
- * Copyright (C) 2019-2020 Yann Collet
- * GPL v2 License
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * You can contact the author at:
- * - xxHash homepage: https://www.xxhash.com
- * - xxHash source repository: https://github.com/Cyan4973/xxHash
- */
-
-
-/* === dependencies === */
-
-#include <stdio.h> /* printf */
-#include <limits.h> /* INT_MAX */
-#include "bhDisplay.h" /* bench_x */
-
-
-/* === defines list of hashes `hashCandidates` and NB_HASHES *** */
-
-#include "hashes.h"
-
-
-/* === parse command line === */
-
-#undef NDEBUG
-#include <assert.h>
-
-
-/*!
- * readIntFromChar():
- * Allows and interprets K, KB, KiB, M, MB and MiB suffix.
- * Will also modify `*stringPtr`, advancing it to position where it stopped reading.
- */
-static int readIntFromChar(const char** stringPtr)
-{
- static int const max = (INT_MAX / 10) - 1;
- int result = 0;
- while ((**stringPtr >='0') && (**stringPtr <='9')) {
- assert(result < max);
- result *= 10;
- result += (unsigned)(**stringPtr - '0');
- (*stringPtr)++ ;
- }
- if ((**stringPtr=='K') || (**stringPtr=='M')) {
- int const maxK = INT_MAX >> 10;
- assert(result < maxK);
- result <<= 10;
- if (**stringPtr=='M') {
- assert(result < maxK);
- result <<= 10;
- }
- (*stringPtr)++; /* skip `K` or `M` */
- if (**stringPtr=='i') (*stringPtr)++;
- if (**stringPtr=='B') (*stringPtr)++;
- }
- return result;
-}
-
-
-/**
- * isCommand():
- * Checks if string is the same as longCommand.
- * If yes, @return 1, otherwise @return 0
- */
-static int isCommand(const char* string, const char* longCommand)
-{
- assert(string);
- assert(longCommand);
- size_t const comSize = strlen(longCommand);
- return !strncmp(string, longCommand, comSize);
-}
-
-/*
- * longCommandWArg():
- * Checks if *stringPtr is the same as longCommand.
- * If yes, @return 1 and advances *stringPtr to the position which immediately
- * follows longCommand.
- * @return 0 and doesn't modify *stringPtr otherwise.
- */
-static int longCommandWArg(const char** stringPtr, const char* longCommand)
-{
- assert(stringPtr);
- assert(longCommand);
- size_t const comSize = strlen(longCommand);
- int const result = isCommand(*stringPtr, longCommand);
- if (result) *stringPtr += comSize;
- return result;
-}
-
-
-/* === default values - can be redefined at compilation time === */
-
-#ifndef SMALL_SIZE_MIN_DEFAULT
-# define SMALL_SIZE_MIN_DEFAULT 1
-#endif
-#ifndef SMALL_SIZE_MAX_DEFAULT
-# define SMALL_SIZE_MAX_DEFAULT 127
-#endif
-#ifndef LARGE_SIZELOG_MIN_DEFAULT
-# define LARGE_SIZELOG_MIN_DEFAULT 9
-#endif
-#ifndef LARGE_SIZELOG_MAX_DEFAULT
-# define LARGE_SIZELOG_MAX_DEFAULT 27
-#endif
-
-
-static int display_hash_names(void)
-{
- int i;
- printf("available hashes : \n");
- for (i=0; i<NB_HASHES; i++) {
- printf("%s, ", hashCandidates[i].name);
- }
- printf("\b\b \n");
- return 0;
-}
-
-/*
- * @return: hashID (necessarily between 0 and NB_HASHES) if present
- * -1 on error (hname not present)
- */
-static int hashID(const char* hname)
-{
- int id;
- assert(hname);
- for (id=0; id < NB_HASHES; id++) {
- assert(hashCandidates[id].name);
- if (strlen(hname) != strlen(hashCandidates[id].name)) continue;
- if (isCommand(hname, hashCandidates[id].name)) return id;
- }
- return -1;
-}
-
-static int help(const char* exename)
-{
- printf("Usage: %s [options]... [hash]\n", exename);
- printf("Runs various benchmarks at various lengths for the listed hash functions\n");
- printf("and outputs them in a CSV format.\n\n");
- printf("Options: \n");
- printf(" --list Name available hash algorithms and exit \n");
- printf(" --mins=LEN Starting length for small size bench (default: %i) \n", SMALL_SIZE_MIN_DEFAULT);
- printf(" --maxs=LEN End length for small size bench (default: %i) \n", SMALL_SIZE_MAX_DEFAULT);
- printf(" --minl=LEN Starting log2(length) for large size bench (default: %i) \n", LARGE_SIZELOG_MIN_DEFAULT);
- printf(" --maxl=LEN End log2(length) for large size bench (default: %i) \n", LARGE_SIZELOG_MAX_DEFAULT);
- printf(" [hash] Optional, bench all available hashes if not provided \n");
- return 0;
-}
-
-static int badusage(const char* exename)
-{
- printf("Bad command ... \n");
- help(exename);
- return 1;
-}
-
-int main(int argc, const char* argv[])
-{
- const char* const exename = argv[0];
- int hashNb = 0;
- int nb_h_test = NB_HASHES;
- int largeTest_log_min = LARGE_SIZELOG_MIN_DEFAULT;
- int largeTest_log_max = LARGE_SIZELOG_MAX_DEFAULT;
- size_t smallTest_size_min = SMALL_SIZE_MIN_DEFAULT;
- size_t smallTest_size_max = SMALL_SIZE_MAX_DEFAULT;
-
- int arg_nb;
- for (arg_nb = 1; arg_nb < argc; arg_nb++) {
- const char** arg = argv + arg_nb;
- if (isCommand(*arg, "-h")) { assert(argc >= 1); return help(exename); }
- if (isCommand(*arg, "--list")) { return display_hash_names(); }
- if (longCommandWArg(arg, "--n=")) { nb_h_test = readIntFromChar(arg); continue; } /* hidden command */
- if (longCommandWArg(arg, "--minl=")) { largeTest_log_min = readIntFromChar(arg); continue; }
- if (longCommandWArg(arg, "--maxl=")) { largeTest_log_max = readIntFromChar(arg); continue; }
- if (longCommandWArg(arg, "--mins=")) { smallTest_size_min = (size_t)readIntFromChar(arg); continue; }
- if (longCommandWArg(arg, "--maxs=")) { smallTest_size_max = (size_t)readIntFromChar(arg); continue; }
- /* not a command: must be a hash name */
- hashNb = hashID(*arg);
- if (hashNb >= 0) {
- nb_h_test = 1;
- } else {
- /* not a hash name: error */
- return badusage(exename);
- }
- }
-
- /* border case (requires (mis)using hidden command `--n=#`) */
- if (hashNb + nb_h_test > NB_HASHES) {
- printf("wrong hash selection \n");
- return 1;
- }
-
- printf(" === benchmarking %i hash functions === \n", nb_h_test);
- if (largeTest_log_max >= largeTest_log_min) {
- bench_largeInput(hashCandidates+hashNb, nb_h_test, largeTest_log_min, largeTest_log_max);
- }
- if (smallTest_size_max >= smallTest_size_min) {
- bench_throughput_smallInputs(hashCandidates+hashNb, nb_h_test, smallTest_size_min, smallTest_size_max);
- bench_throughput_randomInputLength(hashCandidates+hashNb, nb_h_test, smallTest_size_min, smallTest_size_max);
- bench_latency_smallInputs(hashCandidates+hashNb, nb_h_test, smallTest_size_min, smallTest_size_max);
- bench_latency_randomInputLength(hashCandidates+hashNb, nb_h_test, smallTest_size_min, smallTest_size_max);
- }
-
- return 0;
-}
diff --git a/third_party/xxhash/tests/bench/timefn.c b/third_party/xxhash/tests/bench/timefn.c
deleted file mode 100644
index 856812898c..0000000000
--- a/third_party/xxhash/tests/bench/timefn.c
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Copyright (C) 2019-2020 Yann Collet, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under both the BSD-style license (found in the
- * LICENSE file in the root directory of this source tree) and the GPLv2 (found
- * in the COPYING file in the root directory of this source tree).
- * You may select, at your option, one of the above-listed licenses.
- */
-
-
-/* === Dependencies === */
-
-#include "timefn.h"
-
-
-/*-****************************************
-* Time functions
-******************************************/
-
-#if defined(_WIN32) /* Windows */
-
-#include <stdlib.h> /* abort */
-#include <stdio.h> /* perror */
-
-UTIL_time_t UTIL_getTime(void) { UTIL_time_t x; QueryPerformanceCounter(&x); return x; }
-
-PTime UTIL_getSpanTimeMicro(UTIL_time_t clockStart, UTIL_time_t clockEnd)
-{
- static LARGE_INTEGER ticksPerSecond;
- static int init = 0;
- if (!init) {
- if (!QueryPerformanceFrequency(&ticksPerSecond)) {
- perror("timefn::QueryPerformanceFrequency");
- abort();
- }
- init = 1;
- }
- return 1000000ULL*(clockEnd.QuadPart - clockStart.QuadPart)/ticksPerSecond.QuadPart;
-}
-
-PTime UTIL_getSpanTimeNano(UTIL_time_t clockStart, UTIL_time_t clockEnd)
-{
- static LARGE_INTEGER ticksPerSecond;
- static int init = 0;
- if (!init) {
- if (!QueryPerformanceFrequency(&ticksPerSecond)) {
- perror("timefn::QueryPerformanceFrequency");
- abort();
- }
- init = 1;
- }
- return 1000000000ULL*(clockEnd.QuadPart - clockStart.QuadPart)/ticksPerSecond.QuadPart;
-}
-
-
-
-#elif defined(__APPLE__) && defined(__MACH__)
-
-UTIL_time_t UTIL_getTime(void) { return mach_absolute_time(); }
-
-PTime UTIL_getSpanTimeMicro(UTIL_time_t clockStart, UTIL_time_t clockEnd)
-{
- static mach_timebase_info_data_t rate;
- static int init = 0;
- if (!init) {
- mach_timebase_info(&rate);
- init = 1;
- }
- return (((clockEnd - clockStart) * (PTime)rate.numer) / ((PTime)rate.denom))/1000ULL;
-}
-
-PTime UTIL_getSpanTimeNano(UTIL_time_t clockStart, UTIL_time_t clockEnd)
-{
- static mach_timebase_info_data_t rate;
- static int init = 0;
- if (!init) {
- mach_timebase_info(&rate);
- init = 1;
- }
- return ((clockEnd - clockStart) * (PTime)rate.numer) / ((PTime)rate.denom);
-}
-
-
-
-#elif (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* C11 */) \
- && defined(TIME_UTC) /* C11 requires timespec_get, but FreeBSD 11 lacks it, while still claiming C11 compliance */
-
-#include <stdlib.h> /* abort */
-#include <stdio.h> /* perror */
-
-UTIL_time_t UTIL_getTime(void)
-{
- /* time must be initialized, othersize it may fail msan test.
- * No good reason, likely a limitation of timespec_get() for some target */
- UTIL_time_t time = UTIL_TIME_INITIALIZER;
- if (timespec_get(&time, TIME_UTC) != TIME_UTC) {
- perror("timefn::timespec_get");
- abort();
- }
- return time;
-}
-
-static UTIL_time_t UTIL_getSpanTime(UTIL_time_t begin, UTIL_time_t end)
-{
- UTIL_time_t diff;
- if (end.tv_nsec < begin.tv_nsec) {
- diff.tv_sec = (end.tv_sec - 1) - begin.tv_sec;
- diff.tv_nsec = (end.tv_nsec + 1000000000ULL) - begin.tv_nsec;
- } else {
- diff.tv_sec = end.tv_sec - begin.tv_sec;
- diff.tv_nsec = end.tv_nsec - begin.tv_nsec;
- }
- return diff;
-}
-
-PTime UTIL_getSpanTimeMicro(UTIL_time_t begin, UTIL_time_t end)
-{
- UTIL_time_t const diff = UTIL_getSpanTime(begin, end);
- PTime micro = 0;
- micro += 1000000ULL * diff.tv_sec;
- micro += diff.tv_nsec / 1000ULL;
- return micro;
-}
-
-PTime UTIL_getSpanTimeNano(UTIL_time_t begin, UTIL_time_t end)
-{
- UTIL_time_t const diff = UTIL_getSpanTime(begin, end);
- PTime nano = 0;
- nano += 1000000000ULL * diff.tv_sec;
- nano += diff.tv_nsec;
- return nano;
-}
-
-
-
-#else /* relies on standard C90 (note : clock_t measurements can be wrong when using multi-threading) */
-
-UTIL_time_t UTIL_getTime(void) { return clock(); }
-PTime UTIL_getSpanTimeMicro(UTIL_time_t clockStart, UTIL_time_t clockEnd) { return 1000000ULL * (clockEnd - clockStart) / CLOCKS_PER_SEC; }
-PTime UTIL_getSpanTimeNano(UTIL_time_t clockStart, UTIL_time_t clockEnd) { return 1000000000ULL * (clockEnd - clockStart) / CLOCKS_PER_SEC; }
-
-#endif
-
-
-
-/* returns time span in microseconds */
-PTime UTIL_clockSpanMicro(UTIL_time_t clockStart )
-{
- UTIL_time_t const clockEnd = UTIL_getTime();
- return UTIL_getSpanTimeMicro(clockStart, clockEnd);
-}
-
-/* returns time span in microseconds */
-PTime UTIL_clockSpanNano(UTIL_time_t clockStart )
-{
- UTIL_time_t const clockEnd = UTIL_getTime();
- return UTIL_getSpanTimeNano(clockStart, clockEnd);
-}
-
-void UTIL_waitForNextTick(void)
-{
- UTIL_time_t const clockStart = UTIL_getTime();
- UTIL_time_t clockEnd;
- do {
- clockEnd = UTIL_getTime();
- } while (UTIL_getSpanTimeNano(clockStart, clockEnd) == 0);
-}
diff --git a/third_party/xxhash/tests/bench/timefn.h b/third_party/xxhash/tests/bench/timefn.h
deleted file mode 100644
index 41007f30ca..0000000000
--- a/third_party/xxhash/tests/bench/timefn.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (c) 2016-2020 Yann Collet, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under both the BSD-style license (found in the
- * LICENSE file in the root directory of this source tree) and the GPLv2 (found
- * in the COPYING file in the root directory of this source tree).
- * You may select, at your option, one of the above-listed licenses.
- */
-
-#ifndef TIME_FN_H_MODULE_287987
-#define TIME_FN_H_MODULE_287987
-
-#if defined (__cplusplus)
-extern "C" {
-#endif
-
-
-/*-****************************************
-* Dependencies
-******************************************/
-#include <sys/types.h> /* utime */
-#if defined(_MSC_VER)
-# include <sys/utime.h> /* utime */
-#else
-# include <utime.h> /* utime */
-#endif
-#include <time.h> /* clock_t, clock, CLOCKS_PER_SEC */
-
-
-
-/*-****************************************
-* Local Types
-******************************************/
-
-#if !defined (__VMS) && (defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) )
-# include <stdint.h>
- typedef uint64_t PTime; /* Precise Time */
-#else
- typedef unsigned long long PTime; /* does not support compilers without long long support */
-#endif
-
-
-
-/*-****************************************
-* Time functions
-******************************************/
-#if defined(_WIN32) /* Windows */
-
- #include <Windows.h> /* LARGE_INTEGER */
- typedef LARGE_INTEGER UTIL_time_t;
- #define UTIL_TIME_INITIALIZER { { 0, 0 } }
-
-#elif defined(__APPLE__) && defined(__MACH__)
-
- #include <mach/mach_time.h>
- typedef PTime UTIL_time_t;
- #define UTIL_TIME_INITIALIZER 0
-
-#elif (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* C11 */) \
- && defined(TIME_UTC) /* C11 requires timespec_get, but FreeBSD 11 lacks it, while still claiming C11 compliance */
-
- typedef struct timespec UTIL_time_t;
- #define UTIL_TIME_INITIALIZER { 0, 0 }
-
-#else /* relies on standard C90 (note : clock_t measurements can be wrong when using multi-threading) */
-
- typedef clock_t UTIL_time_t;
- #define UTIL_TIME_INITIALIZER 0
-
-#endif
-
-
-UTIL_time_t UTIL_getTime(void);
-PTime UTIL_getSpanTimeMicro(UTIL_time_t clockStart, UTIL_time_t clockEnd);
-PTime UTIL_getSpanTimeNano(UTIL_time_t clockStart, UTIL_time_t clockEnd);
-
-#define SEC_TO_MICRO ((PTime)1000000)
-PTime UTIL_clockSpanMicro(UTIL_time_t clockStart);
-PTime UTIL_clockSpanNano(UTIL_time_t clockStart);
-
-void UTIL_waitForNextTick(void);
-
-
-#if defined (__cplusplus)
-}
-#endif
-
-#endif /* TIME_FN_H_MODULE_287987 */
diff --git a/third_party/xxhash/tests/collisions/.gitignore b/third_party/xxhash/tests/collisions/.gitignore
deleted file mode 100644
index f85592639b..0000000000
--- a/third_party/xxhash/tests/collisions/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-#build artefacts
-collisionsTest
diff --git a/third_party/xxhash/tests/collisions/LICENSE b/third_party/xxhash/tests/collisions/LICENSE
deleted file mode 100644
index d159169d10..0000000000
--- a/third_party/xxhash/tests/collisions/LICENSE
+++ /dev/null
@@ -1,339 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Lesser General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) year name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- <signature of Ty Coon>, 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.
diff --git a/third_party/xxhash/tests/collisions/Makefile b/third_party/xxhash/tests/collisions/Makefile
deleted file mode 100644
index bad9835b0f..0000000000
--- a/third_party/xxhash/tests/collisions/Makefile
+++ /dev/null
@@ -1,74 +0,0 @@
-# Brute force collision tester for 64-bit hashes
-# Part of xxHash project
-# Copyright (C) 2019-2020 Yann Collet
-#
-# GPL v2 License
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# You can contact the author at:
-# - xxHash homepage: https://www.xxhash.com
-# - xxHash source repository: https://github.com/Cyan4973/xxHash
-#
-
-SRC_DIRS = ./ ../../ allcodecs/
-VPATH = $(SRC_DIRS)
-CPPFLAGS += $(addprefix -I ,$(SRC_DIRS))
-CFLAGS ?= -std=c99 \
- -Wall -Wextra -Wconversion
-CXXFLAGS ?= -Wall -Wextra -Wconversion -std=c++11
-LDFLAGS += -pthread
-TESTHASHES = 110000000
-
-HASH_SRC := $(sort $(wildcard allcodecs/*.c allcodecs/*.cc))
-HASH_OBJ := $(patsubst %.c,%.o,$(HASH_SRC))
-
-
-.PHONY: default
-default: release
-
-.PHONY: all
-all: release
-
-collisionsTest: main.o pool.o threading.o sort.o $(HASH_OBJ)
- $(CXX) $(CPPFLAGS) $(CXXFLAGS) $^ $(LDFLAGS) -o $@
-
-main.o: hashes.h xxhash.h
-
-release: CXXFLAGS += -O3
-release: CFLAGS += -O3
-release: collisionsTest
-
-debug: CXXFLAGS += -g3 -O0 -DDEBUG
-debug: CFLAGS += -g3 -O0 -DDEBUG
-debug: collisionsTest
-
-.PHONY: check
-check: test
-
-.PHONY: test
-test: debug
- @echo ""
- @echo "## $(TESTHASHES) hashes with original and 0 threads"
- @time ./collisionsTest --nbh=$(TESTHASHES)
- @echo ""
- @echo "## $(TESTHASHES) hashes with original and 4 threads"
- @time ./collisionsTest --nbh=$(TESTHASHES) --threadlog=2
- @echo ""
-
-.PHONY: clean
-clean:
- $(RM) *.o allcodecs/*.o
- $(RM) collisionsTest
diff --git a/third_party/xxhash/tests/collisions/README.md b/third_party/xxhash/tests/collisions/README.md
deleted file mode 100644
index 683b115186..0000000000
--- a/third_party/xxhash/tests/collisions/README.md
+++ /dev/null
@@ -1,122 +0,0 @@
-
-__collisionsTest__ is a brute force hash analyzer
-which will measure a 64-bit hash algorithm's collision rate
-by generating billions of hashes,
-and comparing the result to an "ideal" target.
-
-The test requires a very large amount of memory.
-By default, it will generate 24 billion of 64-bit hashes,
-requiring __192 GB of RAM__ for their storage.
-The number of hashes can be modified using command `--nbh=`.
-Be aware that testing the collision ratio of 64-bit hashes
-requires a very large amount of hashes (several billion) for meaningful measurements.
-
-To reduce RAM usage, an optional filter can be requested, with `--filter`.
-It reduces the nb of candidates to analyze, hence associated RAM budget.
-Note that the filter itself requires a lot of RAM
-(32 GB by default, can be modified using `--filterlog=`,
-a too small filter will not be efficient, aim at ~2 bytes per hash),
-and reading and writing into filter cost a significant CPU budget,
-so this method is slower.
-It also doesn't allow advanced analysis of partial bitfields,
-since most hashes will be discarded and not stored.
-
-When using the filter, the RAM budget consists of the filter and a list of candidates,
-which will be a fraction of the original hash list.
-Using default settings (24 billion hashes, 32 GB filter),
-the number of potential candidates should be reduced to less than 2 billion,
-requiring ~14 GB for their storage.
-Such a result also depends on hash algorithm's efficiency.
-The number of effective candidates is likely to be lower, at ~ 1 billion,
-but storage must allocate an upper bound.
-
-For the default test, the expected "optimal" collision rate for a 64-bit hash function is ~18 collisions.
-
-#### How to build
-```
-make
-```
-
-Note: the code is a mix of C99 and C++14,
-it's not compatible with a C90-only compiler.
-
-#### Build modifier
-
-- `SLAB5`: use alternative pattern generator, friendlier for weak hash algorithms
-- `POOL_MT`: if `=0`, disable multi-threading code (enabled by default)
-
-#### How to integrate any hash in the tester
-
-The build script will compile files found in `./allcodecs`.
-Put the source code here.
-This also works if the hash is a single `*.h` file.
-
-The glue happens in `hashes.h`.
-In this file, there are 2 sections:
-- Adds the required `#include "header.h"`, and creates a wrapper
-to respect the format expected by the function pointer.
-- Adds the wrapper, along with the name and an indication of the output width,
-to the table, at the end of `hashes.h`
-
-Build with `make`. Locate your new hash with `./collisionsTest -h`,
-it should be listed.
-
-
-#### Usage
-
-```
-usage: ./collisionsTest [hashName] [opt]
-
-list of hashNames: (...)
-
-Optional parameters:
- --nbh=NB Select nb of hashes to generate (25769803776 by default)
- --filter Enable the filter. Slower, but reduces memory usage for same nb of hashes.
- --threadlog=NB Use 2^NB threads
- --len=NB Select length of input (255 bytes by default)
-```
-
-#### Some advises on how to setup a collisions test
-
-Most tests are primarily driven by the amount of RAM available.
-Here's a method to decide the size of the test.
-
-Presuming that RAM budget is not plentiful, for this example 32 GB,
-the `--filter` mode is actually compulsory to measure anything meaningful.
-Let's plan 50% of memory for the filter, that's 16 GB.
-This will be good enough to filter about 10% less hashes than this size.
-Let's round down to 14 G.
-
-By requesting 14G, the expectation is that the program will automatically
-size the filter to 16 GB, and expect to store ~1G candidates,
-leaving enough room to breeze for the system.
-
-The command line becomes:
-```
-./collisionsTest --nbh=14G --filter NameOfHash
-```
-
-#### Examples:
-
-Here are a few results produced with this tester:
-
-| Algorithm | Input Len | Nb Hashes | Expected | Nb Collisions | Notes |
-| --- | --- | --- | --- | --- | --- |
-| __XXH3__ | 255 | 100 Gi | 312.5 | 326 | |
-| __XXH64__ | 255 | 100 Gi | 312.5 | 294 | |
-| __XXH128__ low64 | 512 | 100 Gi | 312.5 | 321 | |
-| __XXH128__ high64| 512 | 100 Gi | 312.5 | 325 | |
-| __XXH128__ | 255 | 100 Gi | 0.0 | 0 | a 128-bit hash is expected to generate 0 collisions |
-
-Test on small inputs:
-
-| Algorithm | Input Len | Nb Hashes | Expected | Nb Collisions | Notes |
-| --- | --- | --- | --- | --- | --- |
-| __XXH64__ | 8 | 100 Gi | 312.5 | __0__ | `XXH64` is bijective for `len==8` |
-| __XXH3__ | 8 | 100 Gi | 312.5 | __0__ | `XXH3` is also bijective for `len==8` |
-| __XXH3__ | 16 | 100 Gi | 312.5 | 332 | |
-| __XXH3__ | 32 | 14 Gi | 6.1 | 3 | |
-| __XXH128__ | 16 | 25 Gi | 0.0 | 0 | test range 9-16 |
-| __XXH128__ | 32 | 25 Gi | 0.0 | 0 | test range 17-128 |
-| __XXH128__ | 100 | 13 Gi | 0.0 | 0 | test range 17-128 |
-| __XXH128__ | 200 | 13 Gi | 0.0 | 0 | test range 129-240 |
diff --git a/third_party/xxhash/tests/collisions/allcodecs/README.md b/third_party/xxhash/tests/collisions/allcodecs/README.md
deleted file mode 100644
index d41fc2dbbf..0000000000
--- a/third_party/xxhash/tests/collisions/allcodecs/README.md
+++ /dev/null
@@ -1 +0,0 @@
-Put in this directory all hash algorithms to test
diff --git a/third_party/xxhash/tests/collisions/allcodecs/dummy.c b/third_party/xxhash/tests/collisions/allcodecs/dummy.c
deleted file mode 100644
index 547d5c7366..0000000000
--- a/third_party/xxhash/tests/collisions/allcodecs/dummy.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * dummy.c, a fake hash algorithm, just to test integration capabilities.
- * Part of the xxHash project
- * Copyright (C) 2020 Yann Collet
- *
- * GPL v2 License
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * You can contact the author at:
- * - xxHash homepage: https://www.xxhash.com
- * - xxHash source repository: https://github.com/Cyan4973/xxHash
- */
-
-
-#include <dummy.h>
-
-unsigned badsum32(const void* input, size_t len, unsigned seed)
-{
- unsigned sum = seed;
- const unsigned char* in8 = input;
- size_t c;
- for (c=0; c<len; c++)
- sum += in8[c];
- return sum;
-}
diff --git a/third_party/xxhash/tests/collisions/allcodecs/dummy.h b/third_party/xxhash/tests/collisions/allcodecs/dummy.h
deleted file mode 100644
index 85856eff2e..0000000000
--- a/third_party/xxhash/tests/collisions/allcodecs/dummy.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * dummy.c,
- * A fake hash algorithm, just to test integration capabilities.
- * Part of the xxHash project
- * Copyright (C) 2020 Yann Collet
- *
- * GPL v2 License
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * You can contact the author at:
- * - xxHash homepage: https://www.xxhash.com
- * - xxHash source repository: https://github.com/Cyan4973/xxHash
- */
-
-#ifndef DUMMY_H_987987
-#define DUMMY_H_987987
-
-#if defined (__cplusplus)
-extern "C" {
-#endif
-
-
-#include <stddef.h> /* size_t */
-
-unsigned badsum32(const void* input, size_t len, unsigned seed);
-
-
-#if defined (__cplusplus)
-}
-#endif
-
-#endif /* DUMMY_H_987987 */
diff --git a/third_party/xxhash/tests/collisions/hashes.h b/third_party/xxhash/tests/collisions/hashes.h
deleted file mode 100644
index 0b7223d9f1..0000000000
--- a/third_party/xxhash/tests/collisions/hashes.h
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * List of hashes for the brute force collision tester
- * Part of xxHash project
- * Copyright (C) 2019-2020 Yann Collet
- *
- * GPL v2 License
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * You can contact the author at:
- * - xxHash homepage: https://www.xxhash.com
- * - xxHash source repository: https://github.com/Cyan4973/xxHash
- */
-
-#ifndef HASHES_H_1235465
-#define HASHES_H_1235465
-
-#include <stddef.h> /* size_t */
-#include <stdint.h> /* uint64_t */
-#define XXH_INLINE_ALL /* XXH128_hash_t */
-#include "xxhash.h"
-
-
-/* return type */
-
-typedef union {
- uint64_t h64;
- XXH128_hash_t h128;
-} UniHash;
-
-UniHash uniHash32(uint64_t v32)
-{ UniHash unih;
- unih.h64 = v32;
- return unih;
-}
-
-UniHash uniHash64(uint64_t v64)
-{ UniHash unih;
- unih.h64 = v64;
- return unih;
-}
-
-UniHash uniHash128(XXH128_hash_t v128)
-{ UniHash unih;
- unih.h128 = v128;
- return unih;
-}
-
-
-/* === xxHash === */
-
-UniHash XXH3_wrapper (const void* data, size_t size)
-{
- return uniHash64( XXH3_64bits(data, size) );
-}
-
-UniHash XXH128_wrapper (const void* data, size_t size)
-{
- return uniHash128( XXH3_128bits(data, size) );
-}
-
-UniHash XXH128l_wrapper (const void* data, size_t size)
-{
- return uniHash64( XXH3_128bits(data, size).low64 );
-}
-
-UniHash XXH128h_wrapper (const void* data, size_t size)
-{
- return uniHash64( XXH3_128bits(data, size).high64 );
-}
-
-UniHash XXH64_wrapper (const void* data, size_t size)
-{
- return uniHash64 ( XXH64(data, size, 0) );
-}
-
-UniHash XXH32_wrapper (const void* data, size_t size)
-{
- return uniHash32( XXH32(data, size, 0) );
-}
-
-/* === Dummy integration example === */
-
-#include "dummy.h"
-
-UniHash badsum32_wrapper (const void* data, size_t size)
-{
- return uniHash32( badsum32(data, size, 0) );
-}
-
-
-
-/* === Table === */
-
-typedef UniHash (*hashfn) (const void* data, size_t size);
-
-typedef struct {
- const char* name;
- hashfn fn;
- int bits;
-} hashDescription;
-
-#define HASH_FN_TOTAL 7
-
-hashDescription hashfnTable[HASH_FN_TOTAL] = {
- { "xxh3" , XXH3_wrapper, 64 },
- { "xxh64" , XXH64_wrapper, 64 },
- { "xxh128", XXH128_wrapper, 128 },
- { "xxh128l", XXH128l_wrapper, 64 },
- { "xxh128h", XXH128h_wrapper, 64 },
- { "xxh32" , XXH32_wrapper, 32 },
- { "badsum32",badsum32_wrapper, 32 },
-};
-
-#endif /* HASHES_H_1235465 */
diff --git a/third_party/xxhash/tests/collisions/main.c b/third_party/xxhash/tests/collisions/main.c
deleted file mode 100644
index a857341b5d..0000000000
--- a/third_party/xxhash/tests/collisions/main.c
+++ /dev/null
@@ -1,1120 +0,0 @@
-/*
- * Brute force collision tester for 64-bit hashes
- * Part of the xxHash project
- * Copyright (C) 2019-2020 Yann Collet
- *
- * GPL v2 License
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * You can contact the author at:
- * - xxHash homepage: https://www.xxhash.com
- * - xxHash source repository: https://github.com/Cyan4973/xxHash
- */
-
-/*
- * The collision tester will generate 24 billion hashes (by default),
- * and count how many collisions were produced by the 64-bit hash algorithm.
- * The optimal amount of collisions for 64-bit is ~18 collisions.
- * A good hash should be close to this figure.
- *
- * This program requires a lot of memory:
- * - Either store hash values directly => 192 GB
- * - Or use a filter:
- * - 32 GB (by default) for the filter itself
- * - + ~14 GB for the list of hashes (depending on the filter's outcome)
- * Due to these memory constraints, it requires a 64-bit system.
- */
-
-
- /* === Dependencies === */
-
-#include <stdint.h> /* uint64_t */
-#include <stdlib.h> /* malloc, free, qsort, exit */
-#include <string.h> /* memset */
-#include <stdio.h> /* printf, fflush */
-
-#undef NDEBUG /* ensure assert is _not_ disabled */
-#include <assert.h>
-
-#include "hashes.h" /* UniHash, hashfn, hashfnTable */
-
-#include "sort.hh" /* sort64 */
-
-
-
-typedef enum { ht32, ht64, ht128 } Htype_e;
-
-/* === Debug === */
-
-#define EXIT(...) { printf(__VA_ARGS__); printf("\n"); exit(1); }
-
-static void hexRaw(const void* buffer, size_t size)
-{
- const unsigned char* p = (const unsigned char*)buffer;
- for (size_t i=0; i<size; i++) {
- printf("%02X", p[i]);
- }
-}
-
-void printHash(const void* table, size_t n, Htype_e htype)
-{
- if ((htype == ht64) || (htype == ht32)){
- uint64_t const h64 = ((const uint64_t*)table)[n];
- hexRaw(&h64, sizeof(h64));
- } else {
- assert(htype == ht128);
- XXH128_hash_t const h128 = ((const XXH128_hash_t*)table)[n];
- hexRaw(&h128, sizeof(h128));
- }
-}
-
-/* === Generate Random unique Samples to hash === */
-
-/*
- * These functions will generate and update a sample to hash.
- * initSample() will fill a buffer with random bytes,
- * updateSample() will modify one slab in the input buffer.
- * updateSample() guarantees it will produce unique samples,
- * but it needs to know the total number of samples.
- */
-
-
-static const uint64_t prime64_1 = 11400714785074694791ULL; /* 0b1001111000110111011110011011000110000101111010111100101010000111 */
-static const uint64_t prime64_2 = 14029467366897019727ULL; /* 0b1100001010110010101011100011110100100111110101001110101101001111 */
-static const uint64_t prime64_3 = 1609587929392839161ULL; /* 0b0001011001010110011001111011000110011110001101110111100111111001 */
-
-static uint64_t avalanche64(uint64_t h64)
-{
- h64 ^= h64 >> 33;
- h64 *= prime64_2;
- h64 ^= h64 >> 29;
- h64 *= prime64_3;
- h64 ^= h64 >> 32;
- return h64;
-}
-
-static unsigned char randomByte(size_t n)
-{
- uint64_t n64 = avalanche64(n+1);
- n64 *= prime64_1;
- return (unsigned char)(n64 >> 56);
-}
-
-typedef enum { sf_slab5, sf_sparse } sf_genMode;
-
-
-#ifdef SLAB5
-
-/*
- * Slab5 sample generation.
- * This algorithm generates unique inputs flipping on average 16 bits per candidate.
- * It is generally much more friendly for most hash algorithms, especially
- * weaker ones, as it shuffles more the input.
- * The algorithm also avoids overfitting the per4 or per8 ingestion patterns.
- */
-
-#define SLAB_SIZE 5
-
-typedef struct {
- void* buffer;
- size_t size;
- sf_genMode mode;
- size_t prngSeed;
- uint64_t hnb;
-} sampleFactory;
-
-static void init_sampleFactory(sampleFactory* sf, uint64_t htotal)
-{
- uint64_t const minNbSlabs = ((htotal-1) >> 32) + 1;
- uint64_t const minSize = minNbSlabs * SLAB_SIZE;
- if (sf->size < minSize)
- EXIT("sample size must be >= %i bytes for this amount of hashes",
- (int)minSize);
-
- unsigned char* const p = (unsigned char*)sf->buffer;
- for (size_t n=0; n < sf->size; n++)
- p[n] = randomByte(n);
- sf->hnb = 0;
-}
-
-static sampleFactory*
-create_sampleFactory(size_t size, uint64_t htotal, uint64_t seed)
-{
- sampleFactory* const sf = malloc(sizeof(sampleFactory));
- if (!sf) EXIT("not enough memory");
- void* const buffer = malloc(size);
- if (!buffer) EXIT("not enough memory");
- sf->buffer = buffer;
- sf->size = size;
- sf->mode = sf_slab5;
- sf->prngSeed = seed;
- init_sampleFactory(sf, htotal);
- return sf;
-}
-
-static void free_sampleFactory(sampleFactory* sf)
-{
- if (!sf) return;
- free(sf->buffer);
- free(sf);
-}
-
-static inline void update_sampleFactory(sampleFactory* sf)
-{
- size_t const nbSlabs = sf->size / SLAB_SIZE;
- size_t const SlabNb = sf->hnb % nbSlabs;
- sf->hnb++;
-
- char* const ptr = (char*)sf->buffer;
- size_t const start = (SlabNb * SLAB_SIZE) + 1;
- uint32_t val32;
- memcpy(&val32, ptr+start, sizeof(val32));
- static const uint32_t prime32_5 = 374761393U;
- val32 += prime32_5;
- memcpy(ptr+start, &val32, sizeof(val32));
-}
-
-#else
-
-/*
- * Sparse sample generation.
- * This is the default pattern generator.
- * It only flips one bit at a time (mostly).
- * Low hamming distance scenario is more difficult for weak hash algorithms.
- * Note that CRC is immune to this scenario, since they are specifically
- * designed to detect low hamming distances.
- * Prefer the Slab5 pattern generator for collisions on CRC algorithms.
- */
-
-#define SPARSE_LEVEL_MAX 15
-
-/* Nb of combinations of m bits in a register of n bits */
-static double Cnm(int n, int m)
-{
- assert(n > 0);
- assert(m > 0);
- assert(m <= m);
- double acc = 1;
- for (int i=0; i<m; i++) {
- acc *= n - i;
- acc /= 1 + i;
- }
- return acc;
-}
-
-static int enoughCombos(size_t size, uint64_t htotal)
-{
- if (size < 2) return 0; /* ensure no multiplication by negative */
- uint64_t acc = 0;
- uint64_t const srcBits = size * 8; assert(srcBits < INT_MAX);
- int nbBitsSet = 0;
- while (acc < htotal) {
- nbBitsSet++;
- if (nbBitsSet >= SPARSE_LEVEL_MAX) return 0;
- acc += (uint64_t)Cnm((int)srcBits, nbBitsSet);
- }
- return 1;
-}
-
-typedef struct {
- void* buffer;
- size_t size;
- sf_genMode mode;
- /* sparse */
- size_t bitIdx[SPARSE_LEVEL_MAX];
- int level;
- size_t maxBitIdx;
- /* slab5 */
- size_t nbSlabs;
- size_t current;
- size_t prngSeed;
-} sampleFactory;
-
-static void init_sampleFactory(sampleFactory* sf, uint64_t htotal)
-{
- if (!enoughCombos(sf->size, htotal)) {
- EXIT("sample size must be larger for this amount of hashes");
- }
-
- memset(sf->bitIdx, 0, sizeof(sf->bitIdx));
- sf->level = 0;
-
- unsigned char* const p = (unsigned char*)sf->buffer;
- for (size_t n=0; n<sf->size; n++)
- p[n] = randomByte(sf->prngSeed + n);
-}
-
-static sampleFactory*
-create_sampleFactory(size_t size, uint64_t htotal, uint64_t seed)
-{
- sampleFactory* const sf = malloc(sizeof(sampleFactory));
- if (!sf) EXIT("not enough memory");
- void* const buffer = malloc(size);
- if (!buffer) EXIT("not enough memory");
- sf->buffer = buffer;
- sf->size = size;
- sf->mode = sf_sparse;
- sf->maxBitIdx = size * 8;
- sf->prngSeed = seed;
- init_sampleFactory(sf, htotal);
- return sf;
-}
-
-static void free_sampleFactory(sampleFactory* sf)
-{
- if (!sf) return;
- free(sf->buffer);
- free(sf);
-}
-
-static void flipbit(void* buffer, uint64_t bitID)
-{
- size_t const pos = bitID >> 3;
- unsigned char const mask = (unsigned char)(1 << (bitID & 7));
- unsigned char* const p = (unsigned char*)buffer;
- p[pos] ^= mask;
-}
-
-static int updateBit(void* buffer, size_t* bitIdx, int level, size_t max)
-{
- if (level==0) return 0; /* can't progress further */
-
- flipbit(buffer, bitIdx[level]); /* erase previous bits */
-
- if (bitIdx[level] < max-1) { /* simple case: go to next bit */
- bitIdx[level]++;
- flipbit(buffer, bitIdx[level]); /* set new bit */
- return 1;
- }
-
- /* reached last bit: need to update a bit from lower level */
- if (!updateBit(buffer, bitIdx, level-1, max-1)) return 0;
- bitIdx[level] = bitIdx[level-1] + 1;
- flipbit(buffer, bitIdx[level]); /* set new bit */
- return 1;
-}
-
-static inline void update_sampleFactory(sampleFactory* sf)
-{
- if (!updateBit(sf->buffer, sf->bitIdx, sf->level, sf->maxBitIdx)) {
- /* no more room => move to next level */
- sf->level++;
- assert(sf->level < SPARSE_LEVEL_MAX);
-
- /* set new bits */
- for (int i=1; i <= sf->level; i++) {
- sf->bitIdx[i] = (size_t)(i-1);
- flipbit(sf->buffer, sf->bitIdx[i]);
- }
- }
-}
-
-#endif /* pattern generator selection */
-
-
-/* === Candidate Filter === */
-
-typedef unsigned char Filter;
-
-Filter* create_Filter(int bflog)
-{
- assert(bflog < 64 && bflog > 1);
- size_t bfsize = (size_t)1 << bflog;
- Filter* bf = malloc(bfsize);
- assert(((void)"Filter creation failed", bf));
- memset(bf, 0, bfsize);
- return bf;
-}
-
-void free_Filter(Filter* bf)
-{
- free(bf);
-}
-
-#ifdef FILTER_1_PROBE
-
-/*
- * Attach hash to a slot
- * return: Nb of potential collision candidates detected
- * 0: position not yet occupied
- * 2: position previously occupied by a single candidate
- * 1: position already occupied by multiple candidates
- */
-inline int Filter_insert(Filter* bf, int bflog, uint64_t hash)
-{
- int const slotNb = hash & 3;
- int const shift = slotNb * 2 ;
-
- size_t const bfmask = ((size_t)1 << bflog) - 1;
- size_t const pos = (hash >> 2) & bfmask;
-
- int const existingCandidates = ((((unsigned char*)bf)[pos]) >> shift) & 3;
-
- static const int addCandidates[4] = { 0, 2, 1, 1 };
- static const int nextValue[4] = { 1, 2, 3, 3 };
-
- ((unsigned char*)bf)[pos] |= (unsigned char)(nextValue[existingCandidates] << shift);
- return addCandidates[existingCandidates];
-}
-
-/*
- * Check if provided 64-bit hash is a collision candidate
- * Requires the slot to be occupied by at least 2 candidates.
- * return >0 if hash is a collision candidate
- * 0 otherwise (slot unoccupied, or only one candidate)
- * note: unoccupied slots should not happen in this algorithm,
- * since all hashes are supposed to have been inserted at least once.
- */
-inline int Filter_check(const Filter* bf, int bflog, uint64_t hash)
-{
- int const slotNb = hash & 3;
- int const shift = slotNb * 2;
-
- size_t const bfmask = ((size_t)1 << bflog) - 1;
- size_t const pos = (hash >> 2) & bfmask;
-
- return (((const unsigned char*)bf)[pos]) >> (shift+1) & 1;
-}
-
-#else
-
-/*
- * 2-probes strategy,
- * more efficient at filtering candidates,
- * requires filter size to be > nb of hashes
- */
-
-#define MIN(a,b) ((a) < (b) ? (a) : (b))
-#define MAX(a,b) ((a) > (b) ? (a) : (b))
-
-/*
- * Attach hash to 2 slots
- * return: Nb of potential candidates detected
- * 0: position not yet occupied
- * 2: position previously occupied by a single candidate (at most)
- * 1: position already occupied by multiple candidates
- */
-static inline int Filter_insert(Filter* bf, int bflog, uint64_t hash)
- {
- hash = avalanche64(hash);
- unsigned const slot1 = hash & 255;
- hash >>= 8;
- unsigned const slot2 = hash & 255;
- hash >>= 8;
-
- size_t const fclmask = ((size_t)1 << (bflog-6)) - 1;
- size_t const cacheLineNb = hash & fclmask;
-
- size_t const pos1 = (cacheLineNb << 6) + (slot1 >> 2);
- unsigned const shift1 = (slot1 & 3) * 2;
- unsigned const ex1 = (bf[pos1] >> shift1) & 3;
-
- size_t const pos2 = (cacheLineNb << 6) + (slot2 >> 2);
- unsigned const shift2 = (slot2 & 3) * 2;
- unsigned const ex2 = (bf[pos2] >> shift2) & 3;
-
- unsigned const existing = MIN(ex1, ex2);
-
- static const int addCandidates[4] = { 0, 2, 1, 1 };
- static const unsigned nextValue[4] = { 1, 2, 3, 3 };
-
- bf[pos1] &= (Filter)(~(3 << shift1)); /* erase previous value */
- bf[pos1] |= (Filter)(MAX(ex1, nextValue[existing]) << shift1);
- bf[pos2] |= (Filter)(MAX(ex2, nextValue[existing]) << shift2);
-
- return addCandidates[existing];
- }
-
-
-/*
- * Check if provided 64-bit hash is a collision candidate
- * Requires the slot to be occupied by at least 2 candidates.
- * return >0 if hash is a collision candidate
- * 0 otherwise (slot unoccupied, or only one candidate)
- * note: unoccupied slots should not happen in this algorithm,
- * since all hashes are supposed to have been inserted at least once.
- */
-static inline int Filter_check(const Filter* bf, int bflog, uint64_t hash)
- {
- hash = avalanche64(hash);
- unsigned const slot1 = hash & 255;
- hash >>= 8;
- unsigned const slot2 = hash & 255;
- hash >>= 8;
-
- size_t const fclmask = ((size_t)1 << (bflog-6)) - 1;
- size_t const cacheLineNb = hash & fclmask;
-
- size_t const pos1 = (cacheLineNb << 6) + (slot1 >> 2);
- unsigned const shift1 = (slot1 & 3) * 2;
- unsigned const ex1 = (bf[pos1] >> shift1) & 3;
-
- size_t const pos2 = (cacheLineNb << 6) + (slot2 >> 2);
- unsigned const shift2 = (slot2 & 3) * 2;
- unsigned const ex2 = (bf[pos2] >> shift2) & 3;
-
- return (ex1 >= 2) && (ex2 >= 2);
- }
-
-#endif // FILTER_1_PROBE
-
-
-/* === Display === */
-
-#include <time.h> /* clock_t, clock, time_t, time, difftime */
-
-void update_indicator(uint64_t v, uint64_t total)
-{
- static clock_t start = 0;
- if (start==0) start = clock();
- clock_t const updateRate = CLOCKS_PER_SEC / 2;
-
- clock_t const clockSpan = (clock_t)(clock() - start);
- if (clockSpan > updateRate) {
- start = clock();
- assert(v <= total);
- assert(total > 0);
- double share = ((double)v / (double)total) * 100;
- printf("%6.2f%% (%llu) \r", share, (unsigned long long)v);
- fflush(NULL);
- }
-}
-
-/* note: not thread safe */
-const char* displayDelay(double delay_s)
-{
- static char delayString[50];
- memset(delayString, 0, sizeof(delayString));
-
- int const mn = ((int)delay_s / 60) % 60;
- int const h = (int)delay_s / 3600;
- int const sec = (int)delay_s % 60;
-
- char* p = delayString;
- if (h) sprintf(p, "%i h ", h);
- if (mn || h) {
- p = delayString + strlen(delayString);
- sprintf(p, "%i mn ", mn);
- }
- p = delayString + strlen(delayString);
- sprintf(p, "%is ", sec);
-
- return delayString;
-}
-
-
-/* === Math === */
-
-static double power(uint64_t base, int p)
-{
- double value = 1;
- assert(p>=0);
- for (int i=0; i<p; i++) {
- value *= (double)base;
- }
- return value;
-}
-
-static double estimateNbCollisions(uint64_t nbH, int nbBits)
-{
- return ((double)nbH * (double)(nbH-1)) / power(2, nbBits+1);
-}
-
-static int highestBitSet(uint64_t v)
-{
- assert(v!=0);
- int bitId = 0;
- while (v >>= 1) bitId++;
- return bitId;
-}
-
-
-/* === Filter and search collisions === */
-
-#undef NDEBUG /* ensure assert is not disabled */
-#include <assert.h>
-
-/* will recommend 24 billion samples for 64-bit hashes,
- * expecting 18 collisions for a good 64-bit hash */
-#define NB_BITS_MAX 64 /* can't store nor analyze hash wider than 64-bits for the time being */
-uint64_t select_nbh(int nbBits)
-{
- assert(nbBits > 0);
- if (nbBits > NB_BITS_MAX) nbBits = NB_BITS_MAX;
- double targetColls = (double)((128 + 17) - (nbBits * 2));
- uint64_t nbH = 24;
- while (estimateNbCollisions(nbH, nbBits) < targetColls) nbH *= 2;
- return nbH;
-}
-
-
-typedef struct {
- uint64_t nbCollisions;
-} searchCollisions_results;
-
-typedef struct {
- uint64_t nbH;
- uint64_t mask;
- uint64_t maskSelector;
- size_t sampleSize;
- uint64_t prngSeed;
- int filterLog; /* <0 = disable filter; 0 = auto-size; */
- int hashID;
- int display;
- int nbThreads;
- searchCollisions_results* resultPtr;
-} searchCollisions_parameters;
-
-#define DISPLAY(...) { if (display) printf(__VA_ARGS__); }
-
-static int isEqual(void* hTablePtr, size_t index1, size_t index2, Htype_e htype)
-{
- if ((htype == ht64) || (htype == ht32)) {
- uint64_t const h1 = ((const uint64_t*)hTablePtr)[index1];
- uint64_t const h2 = ((const uint64_t*)hTablePtr)[index2];
- return (h1 == h2);
- } else {
- assert(htype == ht128);
- XXH128_hash_t const h1 = ((const XXH128_hash_t*)hTablePtr)[index1];
- XXH128_hash_t const h2 = ((const XXH128_hash_t*)hTablePtr)[index2];
- return XXH128_isEqual(h1, h2);
- }
-}
-
-static int isHighEqual(void* hTablePtr, size_t index1, size_t index2, Htype_e htype, int rShift)
-{
- uint64_t h1, h2;
- if ((htype == ht64) || (htype == ht32)) {
- h1 = ((const uint64_t*)hTablePtr)[index1];
- h2 = ((const uint64_t*)hTablePtr)[index2];
- } else {
- assert(htype == ht128);
- h1 = ((const XXH128_hash_t*)hTablePtr)[index1].high64;
- h2 = ((const XXH128_hash_t*)hTablePtr)[index2].high64;
- assert(rShift >= 64);
- rShift -= 64;
- }
- assert(0 <= rShift && rShift < 64);
- return (h1 >> rShift) == (h2 >> rShift);
-}
-
-/* assumption: (htype*)hTablePtr[index] is valid */
-static void addHashCandidate(void* hTablePtr, UniHash h, Htype_e htype, size_t index)
-{
- if ((htype == ht64) || (htype == ht32)) {
- ((uint64_t*)hTablePtr)[index] = h.h64;
- } else {
- assert(htype == ht128);
- ((XXH128_hash_t*)hTablePtr)[index] = h.h128;
- }
-}
-
-static int getNbBits_fromHtype(Htype_e htype) {
- switch(htype) {
- case ht32: return 32;
- case ht64: return 64;
- case ht128:return 128;
- default: EXIT("hash size not supported");
- }
-}
-
-static Htype_e getHtype_fromHbits(int nbBits) {
- switch(nbBits) {
- case 32 : return ht32;
- case 64 : return ht64;
- case 128: return ht128;
- default: EXIT("hash size not supported");
- }
-}
-
-static size_t search_collisions(
- searchCollisions_parameters param)
-{
- uint64_t totalH = param.nbH;
- const uint64_t hMask = param.mask;
- const uint64_t hSelector = param.maskSelector;
- int bflog = param.filterLog;
- const int filter = (param.filterLog >= 0);
- const size_t sampleSize = param.sampleSize;
- const int hashID = param.hashID;
- const Htype_e htype = getHtype_fromHbits(hashfnTable[hashID].bits);
- const int display = param.display;
- /* init */
- sampleFactory* const sf = create_sampleFactory(sampleSize, totalH, param.prngSeed);
- if (!sf) EXIT("not enough memory");
-
- //const char* const hname = hashfnTable[hashID].name;
- hashfn const hfunction = hashfnTable[hashID].fn;
- int const hwidth = hashfnTable[hashID].bits;
- if (totalH == 0) totalH = select_nbh(hwidth);
- if (bflog == 0) bflog = highestBitSet(totalH) + 1; /* auto-size filter */
- uint64_t const bfsize = (1ULL << bflog);
-
-
- /* === filter hashes (optional) === */
-
- Filter* bf = NULL;
- uint64_t nbPresents = totalH;
-
- if (filter) {
- time_t const filterTBegin = time(NULL);
- DISPLAY(" Creating filter (%i GB) \n", (int)(bfsize >> 30));
- bf = create_Filter(bflog);
- if (!bf) EXIT("not enough memory for filter");
-
-
- DISPLAY(" Generate %llu hashes from samples of %u bytes \n",
- (unsigned long long)totalH, (unsigned)sampleSize);
- nbPresents = 0;
-
- for (uint64_t n=0; n < totalH; n++) {
- if (display && ((n&0xFFFFF) == 1) )
- update_indicator(n, totalH);
- update_sampleFactory(sf);
-
- UniHash const h = hfunction(sf->buffer, sampleSize);
- if ((h.h64 & hMask) != hSelector) continue;
-
- nbPresents += (uint64_t)Filter_insert(bf, bflog, h.h64);
- }
-
- if (nbPresents==0) {
- DISPLAY(" Analysis completed: No collision detected \n");
- if (param.resultPtr) param.resultPtr->nbCollisions = 0;
- free_Filter(bf);
- free_sampleFactory(sf);
- return 0;
- }
-
- { double const filterDelay = difftime(time(NULL), filterTBegin);
- DISPLAY(" Generation and filter completed in %s, detected up to %llu candidates \n",
- displayDelay(filterDelay), (unsigned long long) nbPresents);
- } }
-
-
- /* === store hash candidates: duplicates will be present here === */
-
- time_t const storeTBegin = time(NULL);
- size_t const hashByteSize = (htype == ht128) ? 16 : 8;
- size_t const tableSize = (nbPresents+1) * hashByteSize;
- assert(tableSize > nbPresents); /* check tableSize calculation overflow */
- DISPLAY(" Storing hash candidates (%i MB) \n", (int)(tableSize >> 20));
-
- /* Generate and store hashes */
- void* const hashCandidates = malloc(tableSize);
- if (!hashCandidates) EXIT("not enough memory to store candidates");
- init_sampleFactory(sf, totalH);
- size_t nbCandidates = 0;
- for (uint64_t n=0; n < totalH; n++) {
- if (display && ((n&0xFFFFF) == 1) ) update_indicator(n, totalH);
- update_sampleFactory(sf);
-
- UniHash const h = hfunction(sf->buffer, sampleSize);
- if ((h.h64 & hMask) != hSelector) continue;
-
- if (filter) {
- if (Filter_check(bf, bflog, h.h64)) {
- assert(nbCandidates < nbPresents);
- addHashCandidate(hashCandidates, h, htype, nbCandidates++);
- }
- } else {
- assert(nbCandidates < nbPresents);
- addHashCandidate(hashCandidates, h, htype, nbCandidates++);
- }
- }
- if (nbCandidates < nbPresents) {
- /* Try to mitigate gnuc_quicksort behavior, by reducing allocated memory,
- * since gnuc_quicksort uses a lot of additional memory for mergesort */
- void* const checkPtr = realloc(hashCandidates, nbCandidates * hashByteSize);
- assert(checkPtr != NULL);
- assert(checkPtr == hashCandidates); /* simplification: since we are reducing the size,
- * we hope to keep the same ptr position.
- * Otherwise, hashCandidates must be mutable. */
- DISPLAY(" List of hashes reduced to %u MB from %u MB (saved %u MB) \n",
- (unsigned)((nbCandidates * hashByteSize) >> 20),
- (unsigned)(tableSize >> 20),
- (unsigned)((tableSize - (nbCandidates * hashByteSize)) >> 20) );
- }
- double const storeTDelay = difftime(time(NULL), storeTBegin);
- DISPLAY(" Stored %llu hash candidates in %s \n",
- (unsigned long long) nbCandidates, displayDelay(storeTDelay));
- free_Filter(bf);
- free_sampleFactory(sf);
-
-
- /* === step 3: look for duplicates === */
- time_t const sortTBegin = time(NULL);
- DISPLAY(" Sorting candidates... ");
- fflush(NULL);
- if ((htype == ht64) || (htype == ht32)) {
- /*
- * Use C++'s std::sort, as it's faster than C stdlib's qsort, and
- * doesn't suffer from gnuc_libsort's memory expansion
- */
- sort64(hashCandidates, nbCandidates);
- } else {
- assert(htype == ht128);
- sort128(hashCandidates, nbCandidates); /* sort with custom comparator */
- }
- double const sortTDelay = difftime(time(NULL), sortTBegin);
- DISPLAY(" Completed in %s \n", displayDelay(sortTDelay));
-
- /* scan and count duplicates */
- time_t const countBegin = time(NULL);
- DISPLAY(" Looking for duplicates: ");
- fflush(NULL);
- size_t collisions = 0;
- for (size_t n=1; n<nbCandidates; n++) {
- if (isEqual(hashCandidates, n, n-1, htype)) {
-#if defined(COL_DISPLAY_DUPLICATES)
- printf("collision: ");
- printHash(hashCandidates, n, htype);
- printf(" / ");
- printHash(hashCandidates, n-1, htype);
- printf(" \n");
-#endif
- collisions++;
- } }
-
- if (!filter /* all candidates */ && display /*single thead*/ ) {
- /* check partial bitfields (high bits) */
- DISPLAY(" \n");
- int const hashBits = getNbBits_fromHtype(htype);
- double worstRatio = 0.;
- int worstNbHBits = 0;
- for (int nbHBits = 1; nbHBits < hashBits; nbHBits++) {
- uint64_t const nbSlots = (uint64_t)1 << nbHBits;
- double const expectedCollisions = estimateNbCollisions(nbCandidates, nbHBits);
- if ( (nbSlots > nbCandidates * 100) /* within range for meaningfull collision analysis results */
- && (expectedCollisions > 18.0) ) {
- int const rShift = hashBits - nbHBits;
- size_t HBits_collisions = 0;
- for (size_t n=1; n<nbCandidates; n++) {
- if (isHighEqual(hashCandidates, n, n-1, htype, rShift)) {
- HBits_collisions++;
- } }
- double const collisionRatio = (double)HBits_collisions / expectedCollisions;
- if (collisionRatio > 2.0) DISPLAY("WARNING !!! ===> ");
- DISPLAY(" high %i bits: %zu collision (%.1f expected): x%.2f \n",
- nbHBits, HBits_collisions, expectedCollisions, collisionRatio);
- if (collisionRatio > worstRatio) {
- worstNbHBits = nbHBits;
- worstRatio = collisionRatio;
- } } }
- DISPLAY("Worst collision ratio at %i high bits: x%.2f \n",
- worstNbHBits, worstRatio);
- }
- double const countDelay = difftime(time(NULL), countBegin);
- DISPLAY(" Completed in %s \n", displayDelay(countDelay));
-
- /* clean and exit */
- free (hashCandidates);
-
-#if 0 /* debug */
- for (size_t n=0; n<nbCandidates; n++)
- printf("0x%016llx \n", (unsigned long long)hashCandidates[n]);
-#endif
-
- if (param.resultPtr) param.resultPtr->nbCollisions = collisions;
- return collisions;
-}
-
-
-
-#if defined(__MACH__) || defined(__linux__)
-#include <sys/resource.h>
-static size_t getProcessMemUsage(int children)
-{
- struct rusage stats;
- if (getrusage(children ? RUSAGE_CHILDREN : RUSAGE_SELF, &stats) == 0)
- return (size_t)stats.ru_maxrss;
- return 0;
-}
-#else
-static size_t getProcessMemUsage(int ignore) { return 0; }
-#endif
-
-void time_collisions(searchCollisions_parameters param)
-{
- uint64_t totalH = param.nbH;
- int hashID = param.hashID;
- int display = param.display;
-
- /* init */
- assert(0 <= hashID && hashID < HASH_FN_TOTAL);
- //const char* const hname = hashfnTable[hashID].name;
- int const hwidth = hashfnTable[hashID].bits;
- if (totalH == 0) totalH = select_nbh(hwidth);
- double const targetColls = estimateNbCollisions(totalH, hwidth);
-
- /* Start the timer to measure start/end of hashing + collision detection. */
- time_t const programTBegin = time(NULL);
-
- /* Generate hashes, and count collisions */
- size_t const collisions = search_collisions(param);
-
- /* display results */
- double const programTDelay = difftime(time(NULL), programTBegin);
- size_t const programBytesSelf = getProcessMemUsage(0);
- size_t const programBytesChildren = getProcessMemUsage(1);
- DISPLAY("\n\n");
- DISPLAY("===> Found %llu collisions (x%.2f, %.1f expected) in %s\n",
- (unsigned long long)collisions,
- (double)collisions / targetColls,
- targetColls,
- displayDelay(programTDelay));
- if (programBytesSelf)
- DISPLAY("===> MaxRSS(self) %zuMB, MaxRSS(children) %zuMB\n",
- programBytesSelf>>20,
- programBytesChildren>>20);
- DISPLAY("------------------------------------------ \n");
-}
-
-// wrapper for pthread interface
-void MT_searchCollisions(void* payload)
-{
- search_collisions(*(searchCollisions_parameters*)payload);
-}
-
-/* === Command Line === */
-
-/*!
- * readU64FromChar():
- * Allows and interprets K, KB, KiB, M, MB and MiB suffix.
- * Will also modify `*stringPtr`, advancing it to the position where it stopped reading.
- */
-static uint64_t readU64FromChar(const char** stringPtr)
-{
- static uint64_t const max = (((uint64_t)(-1)) / 10) - 1;
- uint64_t result = 0;
- while ((**stringPtr >='0') && (**stringPtr <='9')) {
- assert(result < max);
- result *= 10;
- result += (unsigned)(**stringPtr - '0');
- (*stringPtr)++ ;
- }
- if ((**stringPtr=='K') || (**stringPtr=='M') || (**stringPtr=='G')) {
- uint64_t const maxK = ((uint64_t)(-1)) >> 10;
- assert(result < maxK);
- result <<= 10;
- if ((**stringPtr=='M') || (**stringPtr=='G')) {
- assert(result < maxK);
- result <<= 10;
- if (**stringPtr=='G') {
- assert(result < maxK);
- result <<= 10;
- }
- }
- (*stringPtr)++; /* skip `K` or `M` */
- if (**stringPtr=='i') (*stringPtr)++;
- if (**stringPtr=='B') (*stringPtr)++;
- }
- return result;
-}
-
-
-/**
- * longCommandWArg():
- * Checks if *stringPtr is the same as longCommand.
- * If yes, @return 1 and advances *stringPtr to the position which immediately follows longCommand.
- * @return 0 and doesn't modify *stringPtr otherwise.
- */
-static int longCommandWArg(const char** stringPtr, const char* longCommand)
-{
- assert(longCommand); assert(stringPtr); assert(*stringPtr);
- size_t const comSize = strlen(longCommand);
- int const result = !strncmp(*stringPtr, longCommand, comSize);
- if (result) *stringPtr += comSize;
- return result;
-}
-
-
-#include "pool.h"
-
-/*
- * As some hashes use different algorithms depending on input size,
- * it can be necessary to test multiple input sizes
- * to paint an accurate picture of collision performance
- */
-#define SAMPLE_SIZE_DEFAULT 256
-#define HASHFN_ID_DEFAULT 0
-
-void help(const char* exeName)
-{
- printf("usage: %s [hashName] [opt] \n\n", exeName);
- printf("list of hashNames:");
- printf("%s ", hashfnTable[0].name);
- for (int i=1; i < HASH_FN_TOTAL; i++) {
- printf(", %s ", hashfnTable[i].name);
- }
- printf(" \n");
- printf("Default hashName is %s\n", hashfnTable[HASHFN_ID_DEFAULT].name);
-
- printf(" \n");
- printf("Optional parameters: \n");
- printf(" --nbh=NB Select nb of hashes to generate (%llu by default) \n", (unsigned long long)select_nbh(64));
- printf(" --filter Activates the filter. Slower, but reduces memory usage for the same nb of hashes.\n");
- printf(" --threadlog=NB Use 2^NB threads.\n");
- printf(" --len=MB Set length of the input (%i bytes by default) \n", SAMPLE_SIZE_DEFAULT);
-}
-
-int bad_argument(const char* exeName)
-{
- printf("incorrect command: \n");
- help(exeName);
- return 1;
-}
-
-
-int main(int argc, const char** argv)
-{
- if (sizeof(size_t) < 8) return 1; // cannot work on systems without ability to allocate objects >= 4 GB
-
- assert(argc > 0);
- const char* const exeName = argv[0];
- uint64_t totalH = 0; /* auto, based on nbBits */
- int bflog = 0; /* auto */
- int filter = 0; /* disabled */
- size_t sampleSize = SAMPLE_SIZE_DEFAULT;
- int hashID = HASHFN_ID_DEFAULT;
- int threadlog = 0;
- uint64_t prngSeed = 0;
-
- int arg_nb;
- for (arg_nb = 1; arg_nb < argc; arg_nb++) {
- const char** arg = argv + arg_nb;
-
- if (!strcmp(*arg, "-h")) { help(exeName); return 0; }
- if (longCommandWArg(arg, "-T")) { threadlog = (int)readU64FromChar(arg); continue; }
-
- if (!strcmp(*arg, "--filter")) { filter=1; continue; }
- if (!strcmp(*arg, "--no-filter")) { filter=0; continue; }
-
- if (longCommandWArg(arg, "--seed")) { prngSeed = readU64FromChar(arg); continue; }
- if (longCommandWArg(arg, "--nbh=")) { totalH = readU64FromChar(arg); continue; }
- if (longCommandWArg(arg, "--filter=")) { filter=1; bflog = (int)readU64FromChar(arg); assert(bflog < 64); continue; }
- if (longCommandWArg(arg, "--filterlog=")) { filter=1; bflog = (int)readU64FromChar(arg); assert(bflog < 64); continue; }
- if (longCommandWArg(arg, "--size=")) { sampleSize = (size_t)readU64FromChar(arg); continue; }
- if (longCommandWArg(arg, "--len=")) { sampleSize = (size_t)readU64FromChar(arg); continue; }
- if (longCommandWArg(arg, "--threadlog=")) { threadlog = (int)readU64FromChar(arg); continue; }
-
- /* argument understood as hash name (must be correct) */
- int hnb;
- for (hnb=0; hnb < HASH_FN_TOTAL; hnb++) {
- if (!strcmp(*arg, hashfnTable[hnb].name)) { hashID = hnb; break; }
- }
- if (hnb == HASH_FN_TOTAL) return bad_argument(exeName);
- }
-
- /* init */
- const char* const hname = hashfnTable[hashID].name;
- int const hwidth = hashfnTable[hashID].bits;
- if (totalH == 0) totalH = select_nbh(hwidth);
- double const targetColls = estimateNbCollisions(totalH, hwidth);
- if (bflog == 0) bflog = highestBitSet(totalH) + 1; /* auto-size filter */
- if (!filter) bflog = -1; // disable filter
-
- if (sizeof(size_t) < 8)
- EXIT("This program has not been validated on architectures other than "
- "64bit \n");
-
- printf(" *** Collision tester for 64+ bit hashes *** \n\n");
- printf("Testing %s algorithm (%i-bit) \n", hname, hwidth);
- printf("This program will allocate a lot of memory,\n");
- printf("generate %llu %i-bit hashes from samples of %u bytes, \n",
- (unsigned long long)totalH, hwidth, (unsigned)sampleSize);
- printf("and attempt to produce %.0f collisions. \n\n", targetColls);
-
- int const nbThreads = 1 << threadlog;
- if (nbThreads <= 0) EXIT("Invalid --threadlog value.");
-
- if (nbThreads == 1) {
-
- searchCollisions_parameters params;
- params.nbH = totalH;
- params.mask = 0;
- params.maskSelector = 0;
- params.sampleSize = sampleSize;
- params.filterLog = bflog;
- params.hashID = hashID;
- params.display = 1;
- params.resultPtr = NULL;
- params.prngSeed = prngSeed;
- params.nbThreads = 1;
- time_collisions(params);
-
- } else { /* nbThreads > 1 */
-
- /* use multithreading */
- if (threadlog >= 30) EXIT("too many threads requested");
- if ((uint64_t)nbThreads > (totalH >> 16))
- EXIT("too many threads requested");
- if (bflog > 0 && threadlog > (bflog-10))
- EXIT("too many threads requested");
- printf("using %i threads ... \n", nbThreads);
-
- /* allocation */
- time_t const programTBegin = time(NULL);
- POOL_ctx* const pt = POOL_create((size_t)nbThreads, 1);
- if (!pt) EXIT("not enough memory for threads");
- searchCollisions_results* const MTresults = calloc (sizeof(searchCollisions_results), (size_t)nbThreads);
- if (!MTresults) EXIT("not enough memory");
- searchCollisions_parameters* const MTparams = calloc (sizeof(searchCollisions_parameters), (size_t)nbThreads);
- if (!MTparams) EXIT("not enough memory");
-
- /* distribute jobs */
- for (int tnb=0; tnb<nbThreads; tnb++) {
- MTparams[tnb].nbH = totalH;
- MTparams[tnb].mask = (uint64_t)nbThreads - 1;
- MTparams[tnb].sampleSize = sampleSize;
- MTparams[tnb].filterLog = bflog ? bflog - threadlog : 0;
- MTparams[tnb].hashID = hashID;
- MTparams[tnb].display = 0;
- MTparams[tnb].resultPtr = MTresults+tnb;
- MTparams[tnb].prngSeed = prngSeed;
- MTparams[tnb].maskSelector = (uint64_t)tnb;
- POOL_add(pt, MT_searchCollisions, MTparams + tnb);
- }
- POOL_free(pt); /* actually joins and free */
-
- /* Gather results */
- uint64_t nbCollisions=0;
- for (int tnb=0; tnb<nbThreads; tnb++) {
- nbCollisions += MTresults[tnb].nbCollisions;
- }
-
- double const programTDelay = difftime(time(NULL), programTBegin);
- size_t const programBytesSelf = getProcessMemUsage(0);
- size_t const programBytesChildren = getProcessMemUsage(1);
- printf("\n\n");
- printf("===> Found %llu collisions (x%.2f, %.1f expected) in %s\n",
- (unsigned long long)nbCollisions,
- (double)nbCollisions / targetColls,
- targetColls,
- displayDelay(programTDelay));
- if (programBytesSelf)
- printf("===> MaxRSS(self) %zuMB, MaxRSS(children) %zuMB\n",
- programBytesSelf>>20,
- programBytesChildren>>20);
- printf("------------------------------------------ \n");
-
- /* Clean up */
- free(MTparams);
- free(MTresults);
- }
-
- return 0;
-}
diff --git a/third_party/xxhash/tests/collisions/pool.c b/third_party/xxhash/tests/collisions/pool.c
deleted file mode 100644
index c0eaefd476..0000000000
--- a/third_party/xxhash/tests/collisions/pool.c
+++ /dev/null
@@ -1,344 +0,0 @@
-/*
- * Copyright (C) 2016-2020 Yann Collet, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under both the BSD-style license (found in the
- * LICENSE file in the root directory of this source tree) and the GPLv2 (found
- * in the COPYING file in the root directory of this source tree).
- * You may select, at your option, one of the above-listed licenses.
- */
-
-
-/* ====== Dependencies ======= */
-#include <stddef.h> /* size_t */
-#include <stdlib.h> /* malloc, calloc, free */
-#include <string.h> /* memcpy */
-#include <assert.h>
-
-#include "pool.h"
-
-
-/* ====== Compiler specifics ====== */
-#if defined(_MSC_VER)
-# pragma warning(disable : 4204) /* disable: C4204: non-constant aggregate initializer */
-#endif
-
-
-/* === Build Macro === */
-
-#ifndef POOL_MT // can be defined on command line
-# define POOL_MT 1
-#endif
-
-
-/* === Implementation === */
-
-#if POOL_MT
-
-#include "threading.h" /* pthread adaptation */
-
-/* A job is a function and an opaque argument */
-typedef struct POOL_job_s {
- POOL_function function;
- void *opaque;
-} POOL_job;
-
-struct POOL_ctx_s {
- /* Keep track of the threads */
- ZSTD_pthread_t* threads;
- size_t threadCapacity;
- size_t threadLimit;
-
- /* The queue is a circular buffer */
- POOL_job *queue;
- size_t queueHead;
- size_t queueTail;
- size_t queueSize;
-
- /* The number of threads working on jobs */
- size_t numThreadsBusy;
- /* Indicates if the queue is empty */
- int queueEmpty;
-
- /* The mutex protects the queue */
- ZSTD_pthread_mutex_t queueMutex;
- /* Condition variable for pushers to wait on when the queue is full */
- ZSTD_pthread_cond_t queuePushCond;
- /* Condition variables for poppers to wait on when the queue is empty */
- ZSTD_pthread_cond_t queuePopCond;
- /* Indicates if the queue is shutting down */
- int shutdown;
-};
-
-/* POOL_thread() :
- * Work thread for the thread pool.
- * Waits for jobs and executes them.
- * @returns : NULL on failure else non-null.
- */
-static void* POOL_thread(void* opaque)
-{
- POOL_ctx* const ctx = (POOL_ctx*)opaque;
- if (!ctx) { return NULL; }
- for (;;) {
- /* Lock the mutex and wait for a non-empty queue or until shutdown */
- ZSTD_pthread_mutex_lock(&ctx->queueMutex);
-
- while ( ctx->queueEmpty
- || (ctx->numThreadsBusy >= ctx->threadLimit) ) {
- if (ctx->shutdown) {
- /* even if !queueEmpty, (possible if numThreadsBusy >= threadLimit),
- * a few threads will be shutdown while !queueEmpty,
- * but enough threads will remain active to finish the queue */
- ZSTD_pthread_mutex_unlock(&ctx->queueMutex);
- return opaque;
- }
- ZSTD_pthread_cond_wait(&ctx->queuePopCond, &ctx->queueMutex);
- }
- /* Pop a job off the queue */
- { POOL_job const job = ctx->queue[ctx->queueHead];
- ctx->queueHead = (ctx->queueHead + 1) % ctx->queueSize;
- ctx->numThreadsBusy++;
- ctx->queueEmpty = ctx->queueHead == ctx->queueTail;
- /* Unlock the mutex, signal a pusher, and run the job */
- ZSTD_pthread_cond_signal(&ctx->queuePushCond);
- ZSTD_pthread_mutex_unlock(&ctx->queueMutex);
-
- job.function(job.opaque);
-
- /* If the intended queue size was 0, signal after finishing job */
- ZSTD_pthread_mutex_lock(&ctx->queueMutex);
- ctx->numThreadsBusy--;
- if (ctx->queueSize == 1) {
- ZSTD_pthread_cond_signal(&ctx->queuePushCond);
- }
- ZSTD_pthread_mutex_unlock(&ctx->queueMutex);
- }
- } /* for (;;) */
- assert(0); /* Unreachable */
-}
-
-POOL_ctx* POOL_create(size_t numThreads, size_t queueSize)
-{
- POOL_ctx* ctx;
- /* Check parameters */
- if (!numThreads) { return NULL; }
- /* Allocate the context and zero initialize */
- ctx = (POOL_ctx*)calloc(1, sizeof(POOL_ctx));
- if (!ctx) { return NULL; }
- /* Initialize the job queue.
- * It needs one extra space since one space is wasted to differentiate
- * empty and full queues.
- */
- ctx->queueSize = queueSize + 1;
- ctx->queue = (POOL_job*)malloc(ctx->queueSize * sizeof(POOL_job));
- ctx->queueHead = 0;
- ctx->queueTail = 0;
- ctx->numThreadsBusy = 0;
- ctx->queueEmpty = 1;
- (void)ZSTD_pthread_mutex_init(&ctx->queueMutex, NULL);
- (void)ZSTD_pthread_cond_init(&ctx->queuePushCond, NULL);
- (void)ZSTD_pthread_cond_init(&ctx->queuePopCond, NULL);
- ctx->shutdown = 0;
- /* Allocate space for the thread handles */
- ctx->threads = (ZSTD_pthread_t*)malloc(numThreads * sizeof(ZSTD_pthread_t));
- ctx->threadCapacity = 0;
- /* Check for errors */
- if (!ctx->threads || !ctx->queue) { POOL_free(ctx); return NULL; }
- /* Initialize the threads */
- { size_t i;
- for (i = 0; i < numThreads; ++i) {
- if (ZSTD_pthread_create(&ctx->threads[i], NULL, &POOL_thread, ctx)) {
- ctx->threadCapacity = i;
- POOL_free(ctx);
- return NULL;
- } }
- ctx->threadCapacity = numThreads;
- ctx->threadLimit = numThreads;
- }
- return ctx;
-}
-
-/*! POOL_join() :
- Shutdown the queue, wake any sleeping threads, and join all of the threads.
-*/
-static void POOL_join(POOL_ctx* ctx) {
- /* Shut down the queue */
- ZSTD_pthread_mutex_lock(&ctx->queueMutex);
- ctx->shutdown = 1;
- ZSTD_pthread_mutex_unlock(&ctx->queueMutex);
-
- /* Wake up sleeping threads */
- ZSTD_pthread_cond_broadcast(&ctx->queuePushCond);
- ZSTD_pthread_cond_broadcast(&ctx->queuePopCond);
-
- /* Join all of the threads */
- { size_t i;
- for (i = 0; i < ctx->threadCapacity; ++i) {
- ZSTD_pthread_join(ctx->threads[i], NULL); /* note : could fail */
- } }
-}
-
-void POOL_free(POOL_ctx *ctx) {
- if (!ctx) { return; }
- POOL_join(ctx);
- ZSTD_pthread_mutex_destroy(&ctx->queueMutex);
- ZSTD_pthread_cond_destroy(&ctx->queuePushCond);
- ZSTD_pthread_cond_destroy(&ctx->queuePopCond);
- free(ctx->queue);
- free(ctx->threads);
- free(ctx);
-}
-
-
-
-size_t POOL_sizeof(POOL_ctx *ctx) {
- if (ctx==NULL) return 0; /* supports sizeof NULL */
- return sizeof(*ctx)
- + ctx->queueSize * sizeof(POOL_job)
- + ctx->threadCapacity * sizeof(ZSTD_pthread_t);
-}
-
-
-/* @return : 0 on success, 1 on error */
-static int POOL_resize_internal(POOL_ctx* ctx, size_t numThreads)
-{
- if (numThreads <= ctx->threadCapacity) {
- if (!numThreads) return 1;
- ctx->threadLimit = numThreads;
- return 0;
- }
- /* numThreads > threadCapacity */
- { ZSTD_pthread_t* const threadPool = (ZSTD_pthread_t*)malloc(numThreads * sizeof(ZSTD_pthread_t));
- if (!threadPool) return 1;
- /* replace existing thread pool */
- memcpy(threadPool, ctx->threads, ctx->threadCapacity * sizeof(*threadPool));
- free(ctx->threads);
- ctx->threads = threadPool;
- /* Initialize additional threads */
- { size_t threadId;
- for (threadId = ctx->threadCapacity; threadId < numThreads; ++threadId) {
- if (ZSTD_pthread_create(&threadPool[threadId], NULL, &POOL_thread, ctx)) {
- ctx->threadCapacity = threadId;
- return 1;
- } }
- } }
- /* successfully expanded */
- ctx->threadCapacity = numThreads;
- ctx->threadLimit = numThreads;
- return 0;
-}
-
-/* @return : 0 on success, 1 on error */
-int POOL_resize(POOL_ctx* ctx, size_t numThreads)
-{
- int result;
- if (ctx==NULL) return 1;
- ZSTD_pthread_mutex_lock(&ctx->queueMutex);
- result = POOL_resize_internal(ctx, numThreads);
- ZSTD_pthread_cond_broadcast(&ctx->queuePopCond);
- ZSTD_pthread_mutex_unlock(&ctx->queueMutex);
- return result;
-}
-
-/**
- * Returns 1 if the queue is full and 0 otherwise.
- *
- * When queueSize is 1 (pool was created with an intended queueSize of 0),
- * then a queue is empty if there is a thread free _and_ no job is waiting.
- */
-static int isQueueFull(POOL_ctx const* ctx) {
- if (ctx->queueSize > 1) {
- return ctx->queueHead == ((ctx->queueTail + 1) % ctx->queueSize);
- } else {
- return (ctx->numThreadsBusy == ctx->threadLimit) ||
- !ctx->queueEmpty;
- }
-}
-
-
-static void POOL_add_internal(POOL_ctx* ctx, POOL_function function, void *opaque)
-{
- POOL_job const job = {function, opaque};
- assert(ctx != NULL);
- if (ctx->shutdown) return;
-
- ctx->queueEmpty = 0;
- ctx->queue[ctx->queueTail] = job;
- ctx->queueTail = (ctx->queueTail + 1) % ctx->queueSize;
- ZSTD_pthread_cond_signal(&ctx->queuePopCond);
-}
-
-void POOL_add(POOL_ctx* ctx, POOL_function function, void* opaque)
-{
- assert(ctx != NULL);
- ZSTD_pthread_mutex_lock(&ctx->queueMutex);
- /* Wait until there is space in the queue for the new job */
- while (isQueueFull(ctx) && (!ctx->shutdown)) {
- ZSTD_pthread_cond_wait(&ctx->queuePushCond, &ctx->queueMutex);
- }
- POOL_add_internal(ctx, function, opaque);
- ZSTD_pthread_mutex_unlock(&ctx->queueMutex);
-}
-
-
-int POOL_tryAdd(POOL_ctx* ctx, POOL_function function, void* opaque)
-{
- assert(ctx != NULL);
- ZSTD_pthread_mutex_lock(&ctx->queueMutex);
- if (isQueueFull(ctx)) {
- ZSTD_pthread_mutex_unlock(&ctx->queueMutex);
- return 0;
- }
- POOL_add_internal(ctx, function, opaque);
- ZSTD_pthread_mutex_unlock(&ctx->queueMutex);
- return 1;
-}
-
-
-#else /* POOL_MT not defined */
-
-/* ========================== */
-/* No multi-threading support */
-/* ========================== */
-
-
-/* We don't need any data, but if it is empty, malloc() might return NULL. */
-struct POOL_ctx_s {
- int dummy;
-};
-static POOL_ctx g_ctx;
-
-POOL_ctx* POOL_create(size_t numThreads, size_t queueSize) {
- (void)numThreads;
- (void)queueSize;
- return &g_ctx;
-}
-
-void POOL_free(POOL_ctx* ctx) {
- assert(!ctx || ctx == &g_ctx);
- (void)ctx;
-}
-
-int POOL_resize(POOL_ctx* ctx, size_t numThreads) {
- (void)ctx; (void)numThreads;
- return 0;
-}
-
-void POOL_add(POOL_ctx* ctx, POOL_function function, void* opaque) {
- (void)ctx;
- function(opaque);
-}
-
-int POOL_tryAdd(POOL_ctx* ctx, POOL_function function, void* opaque) {
- (void)ctx;
- function(opaque);
- return 1;
-}
-
-size_t POOL_sizeof(POOL_ctx* ctx) {
- if (ctx==NULL) return 0; /* supports sizeof NULL */
- assert(ctx == &g_ctx);
- return sizeof(*ctx);
-}
-
-#endif /* ZSTD_MULTITHREAD */
diff --git a/third_party/xxhash/tests/collisions/pool.h b/third_party/xxhash/tests/collisions/pool.h
deleted file mode 100644
index 7c5e867d2f..0000000000
--- a/third_party/xxhash/tests/collisions/pool.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (c) 2016-2020 Yann Collet, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under both the BSD-style license (found in the
- * LICENSE file in the root directory of this source tree) and the GPLv2 (found
- * in the COPYING file in the root directory of this source tree).
- * You may select, at your option, one of the above-listed licenses.
- */
-
-#ifndef POOL_H
-#define POOL_H
-
-#if defined (__cplusplus)
-extern "C" {
-#endif
-
-
-#include <stddef.h> /* size_t */
-
-typedef struct POOL_ctx_s POOL_ctx;
-
-/*! POOL_create() :
- * Create a thread pool with at most `numThreads` threads.
- * `numThreads` must be at least 1.
- * The maximum number of queued jobs before blocking is `queueSize`.
- * @return : POOL_ctx pointer on success, else NULL.
-*/
-POOL_ctx* POOL_create(size_t numThreads, size_t queueSize);
-
-/*! POOL_free() :
- * Free a thread pool returned by POOL_create().
- */
-void POOL_free(POOL_ctx* ctx);
-
-/*! POOL_resize() :
- * Expands or shrinks pool's number of threads.
- * This is more efficient than releasing + creating a new context,
- * since it tries to preserve and re-use existing threads.
- * `numThreads` must be at least 1.
- * @return : 0 when resize was successful,
- * !0 (typically 1) if there is an error.
- * note : only numThreads can be resized, queueSize remains unchanged.
- */
-int POOL_resize(POOL_ctx* ctx, size_t numThreads);
-
-/*! POOL_sizeof() :
- * @return threadpool memory usage
- * note : compatible with NULL (returns 0 in this case)
- */
-size_t POOL_sizeof(POOL_ctx* ctx);
-
-/*! POOL_function :
- * The function type that can be added to a thread pool.
- */
-typedef void (*POOL_function)(void*);
-
-/*! POOL_add() :
- * Add the job `function(opaque)` to the thread pool. `ctx` must be valid.
- * Possibly blocks until there is room in the queue.
- * Note : The function may be executed asynchronously,
- * therefore, `opaque` must live until function has been completed.
- */
-void POOL_add(POOL_ctx* ctx, POOL_function function, void* opaque);
-
-
-/*! POOL_tryAdd() :
- * Add the job `function(opaque)` to thread pool _if_ a worker is available.
- * Returns immediately even if not (does not block).
- * @return : 1 if successful, 0 if not.
- */
-int POOL_tryAdd(POOL_ctx* ctx, POOL_function function, void* opaque);
-
-
-
-#if defined (__cplusplus)
-}
-#endif
-
-#endif
diff --git a/third_party/xxhash/tests/collisions/sort.cc b/third_party/xxhash/tests/collisions/sort.cc
deleted file mode 100644
index 237a114fc9..0000000000
--- a/third_party/xxhash/tests/collisions/sort.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * sort.cc - C++ sort functions
- * Copyright (C) 2019-2020 Yann Collet
- * GPL v2 License
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * You can contact the author at:
- * - xxHash homepage: https://www.xxhash.com
- * - xxHash source repository: https://github.com/Cyan4973/xxHash
- */
-
-/*
- * C++ sort functions tend to run faster than C ones due to templates allowing
- * inline optimizations.
- * Also, glibc's qsort() seems to inflate memory usage, resulting in OOM
- * crashes on the test server.
- */
-
-#include <algorithm> // std::sort
-#define XXH_INLINE_ALL // XXH128_cmp
-#include <xxhash.h>
-
-#include "sort.hh"
-
-void sort64(uint64_t* table, size_t size)
-{
- std::sort(table, table + size);
-}
-
-#include <stdlib.h> // qsort
-
-void sort128(XXH128_hash_t* table, size_t size)
-{
-#if 0
- // C++ sort using a custom function object
- struct {
- bool operator()(XXH128_hash_t a, XXH128_hash_t b) const
- {
- return XXH128_cmp(&a, &b);
- }
- } customLess;
- std::sort(table, table + size, customLess);
-#else
- qsort(table, size, sizeof(*table), XXH128_cmp);
-#endif
-}
diff --git a/third_party/xxhash/tests/collisions/sort.hh b/third_party/xxhash/tests/collisions/sort.hh
deleted file mode 100644
index 278ce05c65..0000000000
--- a/third_party/xxhash/tests/collisions/sort.hh
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * sort.hh - headers for C++ sort functions
- * Copyright (C) 2019-2020 Yann Collet
- * GPL v2 License
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * You can contact the author at :
- * - xxHash homepage : https://www.xxhash.com
- * - xxHash source repository : https://github.com/Cyan4973/xxHash
- */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <stddef.h> // size
-#include <stdint.h> // uint64_t
-#define XXH_STATIC_LINKING_ONLY // XXH128_hash_t
-#include "xxhash.h"
-
-void sort64(uint64_t* table, size_t size);
-
-void sort128(XXH128_hash_t* table, size_t size);
-
-#ifdef __cplusplus
-} // extern C
-#endif
diff --git a/third_party/xxhash/tests/collisions/threading.c b/third_party/xxhash/tests/collisions/threading.c
deleted file mode 100644
index 5164667192..0000000000
--- a/third_party/xxhash/tests/collisions/threading.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
- * Copyright (c) 2016 Tino Reichardt
- * All rights reserved.
- *
- * This source code is licensed under both the BSD-style license (found in the
- * LICENSE file in the root directory of this source tree) and the GPLv2 (found
- * in the COPYING file in the root directory of this source tree).
- *
- * You can contact the author at:
- * - zstdmt source repository: https://github.com/mcmilk/zstdmt
- */
-
-/**
- * This file will hold wrapper for systems, which do not support pthreads
- */
-
-
- /* === Build Macro === */
-
- #ifndef POOL_MT // can be defined on command line
- # define POOL_MT 1
- #endif
-
-
-/* create fake symbol to avoid empty translation unit warning */
-int g_ZSTD_threading_useles_symbol;
-
-#if POOL_MT && defined(_WIN32)
-
-/**
- * Windows minimalist Pthread Wrapper
- */
-
-
-/* === Dependencies === */
-#include <process.h>
-#include <errno.h>
-#include "threading.h"
-
-
-/* === Implementation === */
-
-static unsigned __stdcall worker(void *arg)
-{
- ZSTD_pthread_t* const thread = (ZSTD_pthread_t*) arg;
- thread->arg = thread->start_routine(thread->arg);
- return 0;
-}
-
-int ZSTD_pthread_create(ZSTD_pthread_t* thread, const void* unused,
- void* (*start_routine) (void*), void* arg)
-{
- (void)unused;
- thread->arg = arg;
- thread->start_routine = start_routine;
- thread->handle = (HANDLE) _beginthreadex(NULL, 0, worker, thread, 0, NULL);
-
- if (!thread->handle)
- return errno;
- else
- return 0;
-}
-
-int ZSTD_pthread_join(ZSTD_pthread_t thread, void **value_ptr)
-{
- DWORD result;
-
- if (!thread.handle) return 0;
-
- result = WaitForSingleObject(thread.handle, INFINITE);
- switch (result) {
- case WAIT_OBJECT_0:
- if (value_ptr) *value_ptr = thread.arg;
- return 0;
- case WAIT_ABANDONED:
- return EINVAL;
- default:
- return (int)GetLastError();
- }
-}
-
-#endif /* POOL_MT */
diff --git a/third_party/xxhash/tests/collisions/threading.h b/third_party/xxhash/tests/collisions/threading.h
deleted file mode 100644
index 700bf44269..0000000000
--- a/third_party/xxhash/tests/collisions/threading.h
+++ /dev/null
@@ -1,124 +0,0 @@
-/**
- * Copyright (c) 2016 Tino Reichardt
- * All rights reserved.
- *
- * This source code is licensed under both the BSD-style license (found in the
- * LICENSE file in the root directory of this source tree) and the GPLv2 (found
- * in the COPYING file in the root directory of this source tree).
- *
- * You can contact the author at:
- * - zstdmt source repository: https://github.com/mcmilk/zstdmt
- */
-
-#ifndef THREADING_H_938743
-#define THREADING_H_938743
-
-#if defined (__cplusplus)
-extern "C" {
-#endif
-
-/* === Build Macro === */
-
-#ifndef POOL_MT // can be defined on command line
-# define POOL_MT 1
-#endif
-
-
-/* === Implementation === */
-
-#if POOL_MT && defined(_WIN32)
-
-/**
- * Define windows version before include
- */
-#undef WINVER
-#define WINVER 0x0600
-
-#undef _WIN32_WINNT
-#define _WIN32_WINNT 0x0600
-
-#ifndef WIN32_LEAN_AND_MEAN
-# define WIN32_LEAN_AND_MEAN
-#endif
-
-#include <windows.h>
-#include <stdio.h>
-
-/* mutex */
-#define ZSTD_pthread_mutex_t CRITICAL_SECTION
-#define ZSTD_pthread_mutex_init(a, b) ((void)(b), InitializeCriticalSection((a)), 0)
-#define ZSTD_pthread_mutex_destroy(a) DeleteCriticalSection((a))
-#define ZSTD_pthread_mutex_lock(a) EnterCriticalSection((a))
-#define ZSTD_pthread_mutex_unlock(a) LeaveCriticalSection((a))
-
-/* condition variable */
-#define ZSTD_pthread_cond_t CONDITION_VARIABLE
-#define ZSTD_pthread_cond_init(a, b) ((void)(b), InitializeConditionVariable((a)), 0)
-#define ZSTD_pthread_cond_destroy(a) ((void)(a))
-#define ZSTD_pthread_cond_wait(a, b) SleepConditionVariableCS((a), (b), INFINITE)
-#define ZSTD_pthread_cond_signal(a) WakeConditionVariable((a))
-#define ZSTD_pthread_cond_broadcast(a) WakeAllConditionVariable((a))
-
-/* ZSTD_pthread_create() and ZSTD_pthread_join() */
-typedef struct {
- HANDLE handle;
- void* (*start_routine)(void*);
- void* arg;
-} ZSTD_pthread_t;
-
-int ZSTD_pthread_create(ZSTD_pthread_t* thread, const void* unused,
- void* (*start_routine) (void*), void* arg);
-
-int ZSTD_pthread_join(ZSTD_pthread_t thread, void** value_ptr);
-
-/**
- * add here more wrappers as required
- */
-
-
-#elif POOL_MT /* posix assumed ; need a better detection method */
-/* === POSIX Systems === */
-# include <pthread.h>
-
-#define ZSTD_pthread_mutex_t pthread_mutex_t
-#define ZSTD_pthread_mutex_init(a, b) pthread_mutex_init((a), (b))
-#define ZSTD_pthread_mutex_destroy(a) pthread_mutex_destroy((a))
-#define ZSTD_pthread_mutex_lock(a) pthread_mutex_lock((a))
-#define ZSTD_pthread_mutex_unlock(a) pthread_mutex_unlock((a))
-
-#define ZSTD_pthread_cond_t pthread_cond_t
-#define ZSTD_pthread_cond_init(a, b) pthread_cond_init((a), (b))
-#define ZSTD_pthread_cond_destroy(a) pthread_cond_destroy((a))
-#define ZSTD_pthread_cond_wait(a, b) pthread_cond_wait((a), (b))
-#define ZSTD_pthread_cond_signal(a) pthread_cond_signal((a))
-#define ZSTD_pthread_cond_broadcast(a) pthread_cond_broadcast((a))
-
-#define ZSTD_pthread_t pthread_t
-#define ZSTD_pthread_create(a, b, c, d) pthread_create((a), (b), (c), (d))
-#define ZSTD_pthread_join(a, b) pthread_join((a),(b))
-
-#else /* POOL_MT == 0 */
-/* No multithreading support */
-
-typedef int ZSTD_pthread_mutex_t;
-#define ZSTD_pthread_mutex_init(a, b) ((void)(a), (void)(b), 0)
-#define ZSTD_pthread_mutex_destroy(a) ((void)(a))
-#define ZSTD_pthread_mutex_lock(a) ((void)(a))
-#define ZSTD_pthread_mutex_unlock(a) ((void)(a))
-
-typedef int ZSTD_pthread_cond_t;
-#define ZSTD_pthread_cond_init(a, b) ((void)(a), (void)(b), 0)
-#define ZSTD_pthread_cond_destroy(a) ((void)(a))
-#define ZSTD_pthread_cond_wait(a, b) ((void)(a), (void)(b))
-#define ZSTD_pthread_cond_signal(a) ((void)(a))
-#define ZSTD_pthread_cond_broadcast(a) ((void)(a))
-
-/* do not use ZSTD_pthread_t */
-
-#endif /* POOL_MT */
-
-#if defined (__cplusplus)
-}
-#endif
-
-#endif /* THREADING_H_938743 */
diff --git a/third_party/xxhash/tests/generate_unicode_test.c b/third_party/xxhash/tests/generate_unicode_test.c
deleted file mode 100644
index eed6ac01a5..0000000000
--- a/third_party/xxhash/tests/generate_unicode_test.c
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Generates a Unicode test for xxhsum without using Unicode in the source files.
- *
- * Copyright (C) 2020 Devin Hussey (easyaspi314)
- *
- * BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php)
- *
- * 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.
- *
- * 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.
- */
-
-/*
- * Certain terminals don't properly handle UTF-8 (i.e. rxvt and command prompt
- * in the default codepage), and that can cause issues when editing text.
- *
- * We use this C file to generate a file with a Unicode filename, a file with
- * a checksum of said file, and both a Windows batch script and a Unix shell
- * script to test the file.
- */
-
-#define _CRT_SECURE_NO_WARNINGS /* Silence warnings on MSVC */
-#include <stdio.h>
-
-/* Use a Japanese filename, something that can't be cheated with ANSI.
- * yuniko-do.unicode (literally unicode.unicode) */
-
-/* Use raw hex values to ensure that the output is well-formed UTF-8. It is also more C90 compliant. */
-static const char FILENAME[] = {
- (char)0xe3, (char)0x83, (char)0xa6, /* U+30e6: Katakana letter yu */
- (char)0xe3, (char)0x83, (char)0x8b, /* U+30cb: Katakana letter ni */
- (char)0xe3, (char)0x82, (char)0xb3, /* U+30b3: Katakana letter ko */
- (char)0xe3, (char)0x83, (char)0xbc, /* U+30fc: Katakana-Hiragana prolonged sound mark (dash) */
- (char)0xe3, (char)0x83, (char)0x89, /* U+30c9: Katakana letter do */
- '.','u','n','i','c','o','d','e','\0' /* ".unicode" (so we can glob in make clean and .gitignore) */
-};
-
-#ifdef _WIN32
-/* The same text as above, but encoded in Windows UTF-16. */
-static const wchar_t WFILENAME[] = { 0x30e6, 0x30cb, 0x30b3, 0x30fc, 0x30c9, L'.', L'u', L'n', L'i', L'c', L'o', L'd', L'e', L'\0' };
-#endif
-
-int main(void)
-{
- FILE *f, *script, *checksum;
-
- /* Create our Unicode file. Use _wfopen on Windows as fopen doesn't support Unicode filenames. */
-#ifdef _WIN32
- if (!(f = _wfopen(WFILENAME, L"wb"))) return 1;
-#else
- if (!(f = fopen(FILENAME, "wb"))) return 1;
-#endif
- fprintf(f, "test\n");
- fclose(f);
-
- /* XXH64 checksum file with the precalculated checksum for said file. */
- if (!(checksum = fopen("unicode_test.xxh64", "wb")))
- return 1;
- fprintf(checksum, "2d7f1808da1fa63c %s\n", FILENAME);
- fclose(checksum);
-
-
- /* Create two scripts for both Windows and Unix. */
-
- /* Generate a Windows batch script. Always insert CRLF manually. */
- if (!(script = fopen("unicode_test.bat", "wb")))
- return 1;
-
- /* Disable echoing the commands. We do that ourselves the naive way. */
- fprintf(script, "@echo off\r\n");
-
- /* Change to codepage 65001 to enable UTF-8 support. */
- fprintf(script, "chcp 65001 >NUL 2>&1\r\n");
-
- /* First test a Unicode filename */
- fprintf(script, "echo Testing filename provided on command line...\r\n");
- fprintf(script, "echo xxhsum.exe \"%s\"\r\n", FILENAME);
- fprintf(script, "xxhsum.exe \"%s\"\r\n", FILENAME);
-
- /* Bail on error */
- fprintf(script, "if %%ERRORLEVEL%% neq 0 (\r\n");
- fprintf(script, " exit /B %%ERRORLEVEL%%\r\n");
- fprintf(script, ")\r\n");
-
- /* Then test a checksum file. */
- fprintf(script, "echo Testing a checksum file...\r\n");
- fprintf(script, "echo xxhsum.exe -c unicode_test.xxh64\r\n");
- fprintf(script, "xxhsum.exe -c unicode_test.xxh64\r\n");
-
- fprintf(script, "exit /B %%ERRORLEVEL%%\r\n");
-
- fclose(script);
-
- /* Generate a Unix shell script */
- if (!(script = fopen("unicode_test.sh", "wb")))
- return 1;
-
- fprintf(script, "#!/bin/sh\n");
- /*
- * Some versions of MSYS, MinGW and Cygwin do not support UTF-8, and the ones that
- * don't may error with something like this:
- *
- * Error: Could not open '<mojibake>.unicode': No such file or directory.
- *
- * which is an internal error that happens when it tries to convert MinGW/Cygwin
- * paths to Windows paths.
- *
- * In that case, we bail to cmd.exe and the batch script, which supports UTF-8
- * on Windows 7 and later.
- */
- fprintf(script, "case $(uname) in\n");
- /* MinGW/MSYS converts /c to C:\ unless you have a double slash,
- * Cygwin does not. */
- fprintf(script, " *CYGWIN*)\n");
- fprintf(script, " exec cmd.exe /c unicode_test.bat\n");
- fprintf(script, " ;;\n");
- fprintf(script, " *MINGW*|*MSYS*)\n");
- fprintf(script, " exec cmd.exe //c unicode_test.bat\n");
- fprintf(script, " ;;\n");
- fprintf(script, "esac\n");
-
- /* First test a Unicode filename */
- fprintf(script, "echo Testing filename provided on command line...\n");
- fprintf(script, "echo './xxhsum \"%s\" || exit $?'\n", FILENAME);
- fprintf(script, "./xxhsum \"%s\" || exit $?\n", FILENAME);
-
- /* Then test a checksum file. */
- fprintf(script, "echo Testing a checksum file...\n");
- fprintf(script, "echo './xxhsum -c unicode_test.xxh64 || exit $?'\n");
- fprintf(script, "./xxhsum -c unicode_test.xxh64 || exit $?\n");
-
- fclose(script);
-
- return 0;
-}
diff --git a/third_party/xxhash/tests/multiInclude.c b/third_party/xxhash/tests/multiInclude.c
deleted file mode 100644
index 7d2bc8a9fd..0000000000
--- a/third_party/xxhash/tests/multiInclude.c
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Multi-include test program
- * Validates that xxhash.h can be included multiple times and in any order
- *
- * Copyright (C) 2020 Yann Collet
- *
- * GPL v2 License
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * You can contact the author at:
- * - xxHash homepage: https://www.xxhash.com
- * - xxHash source repository: https://github.com/Cyan4973/xxHash
- */
-
-#include <stdio.h> /* printf */
-
-/* Normal include, gives access to public symbols */
-#include "../xxhash.h"
-
-/*
- * Advanced include, gives access to experimental symbols
- * This test ensure that xxhash.h can be included multiple times and in any
- * order. This order is more difficult: Without care, the declaration of
- * experimental symbols could be skipped.
- */
-#define XXH_STATIC_LINKING_ONLY
-#include "../xxhash.h"
-
-/*
- * Inlining: Re-define all identifiers, keep them private to the unit.
- * Note: Without specific efforts, the identifier names would collide.
- *
- * To be linked with and without xxhash.o to test the symbol's presence and
- * naming collisions.
- */
-#define XXH_INLINE_ALL
-#include "../xxhash.h"
-
-
-int main(void)
-{
- XXH3_state_t state; /* part of experimental API */
-
- XXH3_64bits_reset(&state);
- const char input[] = "Hello World !";
-
- XXH3_64bits_update(&state, input, sizeof(input));
-
- XXH64_hash_t const h = XXH3_64bits_digest(&state);
- printf("hash '%s': %08x%08x \n", input, (unsigned)(h >> 32), (unsigned)h);
-
- return 0;
-}
diff --git a/third_party/xxhash/tests/ppc_define.c b/third_party/xxhash/tests/ppc_define.c
deleted file mode 100644
index d94c2c7240..0000000000
--- a/third_party/xxhash/tests/ppc_define.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Multi-include test program
- * ensure that pixel, bool and vector are not redefined
- *
- * Copyright (C) 2020 Yann Collet
- *
- * GPL v2 License
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * You can contact the author at:
- * - xxHash homepage: https://www.xxhash.com
- * - xxHash source repository: https://github.com/Cyan4973/xxHash
- */
-
-/* gcc's altivec.h, included for the VSX code path,
- * may, in some circumstances, redefine
- * bool, vector and pixel keywords.
- *
- * This unit checks if it happens.
- * It's a compile test.
- * The test is mostly meaningful for PPC target using altivec.h
- * hence XXH_VECTOR == XXH_VSX
- */
-
-#define BOOL_VALUE 32123456
-#define bool BOOL_VALUE
-
-#define VECTOR_VALUE 374464784
-#define vector VECTOR_VALUE
-
-#define PIXEL_VALUE 5846841
-#define pixel PIXEL_VALUE
-
-#define XXH_INLINE_ALL
-#include "../xxhash.h"
-
-#if (bool != BOOL_VALUE)
-# error "bool macro was redefined !"
-#endif
-
-#if (vector != VECTOR_VALUE)
-# error "vector macro was redefined !"
-#endif
-
-#if (pixel != PIXEL_VALUE)
-# error "pixel macro was redefined !"
-#endif
-
-int g_nonEmptyUnit = 0;
diff --git a/third_party/xxhash/xxh3.h b/third_party/xxhash/xxh3.h
deleted file mode 100644
index 7e83e6418a..0000000000
--- a/third_party/xxhash/xxh3.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * xxHash - Extremely Fast Hash algorithm
- * Development source file for `xxh3`
- * Copyright (C) 2019-2020 Yann Collet
- *
- * BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php)
- *
- * 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.
- *
- * 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.
- *
- * You can contact the author at:
- * - xxHash homepage: https://www.xxhash.com
- * - xxHash source repository: https://github.com/Cyan4973/xxHash
- */
-
-/*
- * Note: This file used to host the source code of XXH3_* variants.
- * during the development period.
- * The source code is now properly integrated within xxhash.h.
- *
- * xxh3.h is no longer useful,
- * but it is still provided for compatibility with source code
- * which used to include it directly.
- *
- * Programs are now highly discourage to include xxh3.h.
- * Include `xxhash.h` instead, which is the officially supported interface.
- *
- * In the future, xxh3.h will start to generate warnings, then errors,
- * then it will be removed from source package and from include directory.
- */
-
-/* Simulate the same impact as including the old xxh3.h source file */
-
-#define XXH_INLINE_ALL
-#include "xxhash.h"
diff --git a/third_party/xxhash/xxh_x86dispatch.c b/third_party/xxhash/xxh_x86dispatch.c
deleted file mode 100644
index ab338329d1..0000000000
--- a/third_party/xxhash/xxh_x86dispatch.c
+++ /dev/null
@@ -1,770 +0,0 @@
-/*
- * xxHash - Extremely Fast Hash algorithm
- * Copyright (C) 2020 Yann Collet
- *
- * BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php)
- *
- * 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.
- *
- * 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.
- *
- * You can contact the author at:
- * - xxHash homepage: https://www.xxhash.com
- * - xxHash source repository: https://github.com/Cyan4973/xxHash
- */
-
-
-/*!
- * @file xxh_x86dispatch.c
- *
- * Automatic dispatcher code for the @ref xxh3_family on x86-based targets.
- *
- * Optional add-on.
- *
- * **Compile this file with the default flags for your target.** Do not compile
- * with flags like `-mavx*`, `-march=native`, or `/arch:AVX*`, there will be
- * an error. See @ref XXH_X86DISPATCH_ALLOW_AVX for details.
- *
- * @defgroup dispatch x86 Dispatcher
- * @{
- */
-
-#if defined (__cplusplus)
-extern "C" {
-#endif
-
-#if !(defined(__x86_64__) || defined(__i386__) || defined(_M_IX86) || defined(_M_X64))
-# error "Dispatching is currently only supported on x86 and x86_64."
-#endif
-
-/*!
- * @def XXH_X86DISPATCH_ALLOW_AVX
- * @brief Disables the AVX sanity check.
- *
- * Don't compile xxh_x86dispatch.c with options like `-mavx*`, `-march=native`,
- * or `/arch:AVX*`. It is intended to be compiled for the minimum target, and
- * it selectively enables SSE2, AVX2, and AVX512 when it is needed.
- *
- * Using this option _globally_ allows this feature, and therefore makes it
- * undefined behavior to execute on any CPU without said feature.
- *
- * Even if the source code isn't directly using AVX intrinsics in a function,
- * the compiler can still generate AVX code from autovectorization and by
- * "upgrading" SSE2 intrinsics to use the VEX prefixes (a.k.a. AVX128).
- *
- * Use the same flags that you use to compile the rest of the program; this
- * file will safely generate SSE2, AVX2, and AVX512 without these flags.
- *
- * Define XXH_X86DISPATCH_ALLOW_AVX to ignore this check, and feel free to open
- * an issue if there is a target in the future where AVX is a default feature.
- */
-#ifdef XXH_DOXYGEN
-# define XXH_X86DISPATCH_ALLOW_AVX
-#endif
-
-#if defined(__AVX__) && !defined(XXH_X86DISPATCH_ALLOW_AVX)
-# error "Do not compile xxh_x86dispatch.c with AVX enabled! See the comment above."
-#endif
-
-#ifdef __has_include
-# define XXH_HAS_INCLUDE(header) __has_include(header)
-#else
-# define XXH_HAS_INCLUDE(header) 0
-#endif
-
-/*!
- * @def XXH_DISPATCH_SCALAR
- * @brief Enables/dispatching the scalar code path.
- *
- * If this is defined to 0, SSE2 support is assumed. This reduces code size
- * when the scalar path is not needed.
- *
- * This is automatically defined to 0 when...
- * - SSE2 support is enabled in the compiler
- * - Targeting x86_64
- * - Targeting Android x86
- * - Targeting macOS
- */
-#ifndef XXH_DISPATCH_SCALAR
-# if defined(__SSE2__) || (defined(_M_IX86_FP) && _M_IX86_FP >= 2) /* SSE2 on by default */ \
- || defined(__x86_64__) || defined(_M_X64) /* x86_64 */ \
- || defined(__ANDROID__) || defined(__APPLEv__) /* Android or macOS */
-# define XXH_DISPATCH_SCALAR 0 /* disable */
-# else
-# define XXH_DISPATCH_SCALAR 1
-# endif
-#endif
-/*!
- * @def XXH_DISPATCH_AVX2
- * @brief Enables/disables dispatching for AVX2.
- *
- * This is automatically detected if it is not defined.
- * - GCC 4.7 and later are known to support AVX2, but >4.9 is required for
- * to get the AVX2 intrinsics and typedefs without -mavx -mavx2.
- * - Visual Studio 2013 Update 2 and later are known to support AVX2.
- * - The GCC/Clang internal header `<avx2intrin.h>` is detected. While this is
- * not allowed to be included directly, it still appears in the builtin
- * include path and is detectable with `__has_include`.
- *
- * @see XXH_AVX2
- */
-#ifndef XXH_DISPATCH_AVX2
-# if (defined(__GNUC__) && (__GNUC__ > 4)) /* GCC 5.0+ */ \
- || (defined(_MSC_VER) && _MSC_VER >= 1900) /* VS 2015+ */ \
- || (defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 180030501) /* VS 2013 Update 2 */ \
- || XXH_HAS_INCLUDE(<avx2intrin.h>) /* GCC/Clang internal header */
-# define XXH_DISPATCH_AVX2 1 /* enable dispatch towards AVX2 */
-# else
-# define XXH_DISPATCH_AVX2 0
-# endif
-#endif /* XXH_DISPATCH_AVX2 */
-
-/*!
- * @def XXH_DISPATCH_AVX512
- * @brief Enables/disables dispatching for AVX512.
- *
- * Automatically detected if one of the following conditions is met:
- * - GCC 4.9 and later are known to support AVX512.
- * - Visual Studio 2017 and later are known to support AVX2.
- * - The GCC/Clang internal header `<avx512fintrin.h>` is detected. While this
- * is not allowed to be included directly, it still appears in the builtin
- * include path and is detectable with `__has_include`.
- *
- * @see XXH_AVX512
- */
-#ifndef XXH_DISPATCH_AVX512
-# if (defined(__GNUC__) \
- && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9))) /* GCC 4.9+ */ \
- || (defined(_MSC_VER) && _MSC_VER >= 1910) /* VS 2017+ */ \
- || XXH_HAS_INCLUDE(<avx512fintrin.h>) /* GCC/Clang internal header */
-# define XXH_DISPATCH_AVX512 1 /* enable dispatch towards AVX512 */
-# else
-# define XXH_DISPATCH_AVX512 0
-# endif
-#endif /* XXH_DISPATCH_AVX512 */
-
-/*!
- * @def XXH_TARGET_SSE2
- * @brief Allows a function to be compiled with SSE2 intrinsics.
- *
- * Uses `__attribute__((__target__("sse2")))` on GCC to allow SSE2 to be used
- * even with `-mno-sse2`.
- *
- * @def XXH_TARGET_AVX2
- * @brief Like @ref XXH_TARGET_SSE2, but for AVX2.
- *
- * @def XXH_TARGET_AVX512
- * @brief Like @ref XXH_TARGET_SSE2, but for AVX512.
- */
-#if defined(__GNUC__)
-# include <emmintrin.h> /* SSE2 */
-# if XXH_DISPATCH_AVX2 || XXH_DISPATCH_AVX512
-# include <immintrin.h> /* AVX2, AVX512F */
-# endif
-# define XXH_TARGET_SSE2 __attribute__((__target__("sse2")))
-# define XXH_TARGET_AVX2 __attribute__((__target__("avx2")))
-# define XXH_TARGET_AVX512 __attribute__((__target__("avx512f")))
-#elif defined(_MSC_VER)
-# include <intrin.h>
-# define XXH_TARGET_SSE2
-# define XXH_TARGET_AVX2
-# define XXH_TARGET_AVX512
-#else
-# error "Dispatching is currently not supported for your compiler."
-#endif
-
-#ifdef XXH_DISPATCH_DEBUG
-/* debug logging */
-# include <stdio.h>
-# define XXH_debugPrint(str) { fprintf(stderr, "DEBUG: xxHash dispatch: %s \n", str); fflush(NULL); }
-#else
-# define XXH_debugPrint(str) ((void)0)
-# undef NDEBUG /* avoid redefinition */
-# define NDEBUG
-#endif
-#include <assert.h>
-
-#define XXH_INLINE_ALL
-#define XXH_X86DISPATCH
-#include "xxhash.h"
-
-/*
- * Support both AT&T and Intel dialects
- *
- * GCC doesn't convert AT&T syntax to Intel syntax, and will error out if
- * compiled with -masm=intel. Instead, it supports dialect switching with
- * curly braces: { AT&T syntax | Intel syntax }
- *
- * Clang's integrated assembler automatically converts AT&T syntax to Intel if
- * needed, making the dialect switching useless (it isn't even supported).
- *
- * Note: Comments are written in the inline assembly itself.
- */
-#ifdef __clang__
-# define XXH_I_ATT(intel, att) att "\n\t"
-#else
-# define XXH_I_ATT(intel, att) "{" att "|" intel "}\n\t"
-#endif
-
-/*!
- * @internal
- * @brief Runs CPUID.
- *
- * @param eax, ecx The parameters to pass to CPUID, %eax and %ecx respectively.
- * @param abcd The array to store the result in, `{ eax, ebx, ecx, edx }`
- */
-static void XXH_cpuid(xxh_u32 eax, xxh_u32 ecx, xxh_u32* abcd)
-{
-#if defined(_MSC_VER)
- __cpuidex(abcd, eax, ecx);
-#else
- xxh_u32 ebx, edx;
-# if defined(__i386__) && defined(__PIC__)
- __asm__(
- "# Call CPUID\n\t"
- "#\n\t"
- "# On 32-bit x86 with PIC enabled, we are not allowed to overwrite\n\t"
- "# EBX, so we use EDI instead.\n\t"
- XXH_I_ATT("mov edi, ebx", "movl %%ebx, %%edi")
- XXH_I_ATT("cpuid", "cpuid" )
- XXH_I_ATT("xchg edi, ebx", "xchgl %%ebx, %%edi")
- : "=D" (ebx),
-# else
- __asm__(
- "# Call CPUID\n\t"
- XXH_I_ATT("cpuid", "cpuid")
- : "=b" (ebx),
-# endif
- "+a" (eax), "+c" (ecx), "=d" (edx));
- abcd[0] = eax;
- abcd[1] = ebx;
- abcd[2] = ecx;
- abcd[3] = edx;
-#endif
-}
-
-/*
- * Modified version of Intel's guide
- * https://software.intel.com/en-us/articles/how-to-detect-new-instruction-support-in-the-4th-generation-intel-core-processor-family
- */
-
-#if XXH_DISPATCH_AVX2 || XXH_DISPATCH_AVX512
-/*!
- * @internal
- * @brief Runs `XGETBV`.
- *
- * While the CPU may support AVX2, the operating system might not properly save
- * the full YMM/ZMM registers.
- *
- * xgetbv is used for detecting this: Any compliant operating system will define
- * a set of flags in the xcr0 register indicating how it saves the AVX registers.
- *
- * You can manually disable this flag on Windows by running, as admin:
- *
- * bcdedit.exe /set xsavedisable 1
- *
- * and rebooting. Run the same command with 0 to re-enable it.
- */
-static xxh_u64 XXH_xgetbv(void)
-{
-#if defined(_MSC_VER)
- return _xgetbv(0); /* min VS2010 SP1 compiler is required */
-#else
- xxh_u32 xcr0_lo, xcr0_hi;
- __asm__(
- "# Call XGETBV\n\t"
- "#\n\t"
- "# Older assemblers (e.g. macOS's ancient GAS version) don't support\n\t"
- "# the XGETBV opcode, so we encode it by hand instead.\n\t"
- "# See <https://github.com/asmjit/asmjit/issues/78> for details.\n\t"
- ".byte 0x0f, 0x01, 0xd0\n\t"
- : "=a" (xcr0_lo), "=d" (xcr0_hi) : "c" (0));
- return xcr0_lo | ((xxh_u64)xcr0_hi << 32);
-#endif
-}
-#endif
-
-#define XXH_SSE2_CPUID_MASK (1 << 26)
-#define XXH_OSXSAVE_CPUID_MASK ((1 << 26) | (1 << 27))
-#define XXH_AVX2_CPUID_MASK (1 << 5)
-#define XXH_AVX2_XGETBV_MASK ((1 << 2) | (1 << 1))
-#define XXH_AVX512F_CPUID_MASK (1 << 16)
-#define XXH_AVX512F_XGETBV_MASK ((7 << 5) | (1 << 2) | (1 << 1))
-
-/*!
- * @internal
- * @brief Returns the best XXH3 implementation.
- *
- * Runs various CPUID/XGETBV tests to try and determine the best implementation.
- *
- * @ret The best @ref XXH_VECTOR implementation.
- * @see XXH_VECTOR_TYPES
- */
-static int XXH_featureTest(void)
-{
- xxh_u32 abcd[4];
- xxh_u32 max_leaves;
- int best = XXH_SCALAR;
-#if XXH_DISPATCH_AVX2 || XXH_DISPATCH_AVX512
- xxh_u64 xgetbv_val;
-#endif
-#if defined(__GNUC__) && defined(__i386__)
- xxh_u32 cpuid_supported;
- __asm__(
- "# For the sake of ruthless backwards compatibility, check if CPUID\n\t"
- "# is supported in the EFLAGS on i386.\n\t"
- "# This is not necessary on x86_64 - CPUID is mandatory.\n\t"
- "# The ID flag (bit 21) in the EFLAGS register indicates support\n\t"
- "# for the CPUID instruction. If a software procedure can set and\n\t"
- "# clear this flag, the processor executing the procedure supports\n\t"
- "# the CPUID instruction.\n\t"
- "# <https://c9x.me/x86/html/file_module_x86_id_45.html>\n\t"
- "#\n\t"
- "# Routine is from <https://wiki.osdev.org/CPUID>.\n\t"
-
- "# Save EFLAGS\n\t"
- XXH_I_ATT("pushfd", "pushfl" )
- "# Store EFLAGS\n\t"
- XXH_I_ATT("pushfd", "pushfl" )
- "# Invert the ID bit in stored EFLAGS\n\t"
- XXH_I_ATT("xor dword ptr[esp], 0x200000", "xorl $0x200000, (%%esp)")
- "# Load stored EFLAGS (with ID bit inverted)\n\t"
- XXH_I_ATT("popfd", "popfl" )
- "# Store EFLAGS again (ID bit may or not be inverted)\n\t"
- XXH_I_ATT("pushfd", "pushfl" )
- "# eax = modified EFLAGS (ID bit may or may not be inverted)\n\t"
- XXH_I_ATT("pop eax", "popl %%eax" )
- "# eax = whichever bits were changed\n\t"
- XXH_I_ATT("xor eax, dword ptr[esp]", "xorl (%%esp), %%eax" )
- "# Restore original EFLAGS\n\t"
- XXH_I_ATT("popfd", "popfl" )
- "# eax = zero if ID bit can't be changed, else non-zero\n\t"
- XXH_I_ATT("and eax, 0x200000", "andl $0x200000, %%eax" )
- : "=a" (cpuid_supported) :: "cc");
-
- if (XXH_unlikely(!cpuid_supported)) {
- XXH_debugPrint("CPUID support is not detected!");
- return best;
- }
-
-#endif
- /* Check how many CPUID pages we have */
- XXH_cpuid(0, 0, abcd);
- max_leaves = abcd[0];
-
- /* Shouldn't happen on hardware, but happens on some QEMU configs. */
- if (XXH_unlikely(max_leaves == 0)) {
- XXH_debugPrint("Max CPUID leaves == 0!");
- return best;
- }
-
- /* Check for SSE2, OSXSAVE and xgetbv */
- XXH_cpuid(1, 0, abcd);
-
- /*
- * Test for SSE2. The check is redundant on x86_64, but it doesn't hurt.
- */
- if (XXH_unlikely((abcd[3] & XXH_SSE2_CPUID_MASK) != XXH_SSE2_CPUID_MASK))
- return best;
-
- XXH_debugPrint("SSE2 support detected.");
-
- best = XXH_SSE2;
-#if XXH_DISPATCH_AVX2 || XXH_DISPATCH_AVX512
- /* Make sure we have enough leaves */
- if (XXH_unlikely(max_leaves < 7))
- return best;
-
- /* Test for OSXSAVE and XGETBV */
- if ((abcd[2] & XXH_OSXSAVE_CPUID_MASK) != XXH_OSXSAVE_CPUID_MASK)
- return best;
-
- /* CPUID check for AVX features */
- XXH_cpuid(7, 0, abcd);
-
- xgetbv_val = XXH_xgetbv();
-#if XXH_DISPATCH_AVX2
- /* Validate that AVX2 is supported by the CPU */
- if ((abcd[1] & XXH_AVX2_CPUID_MASK) != XXH_AVX2_CPUID_MASK)
- return best;
-
- /* Validate that the OS supports YMM registers */
- if ((xgetbv_val & XXH_AVX2_XGETBV_MASK) != XXH_AVX2_XGETBV_MASK) {
- XXH_debugPrint("AVX2 supported by the CPU, but not the OS.");
- return best;
- }
-
- /* AVX2 supported */
- XXH_debugPrint("AVX2 support detected.");
- best = XXH_AVX2;
-#endif
-#if XXH_DISPATCH_AVX512
- /* Check if AVX512F is supported by the CPU */
- if ((abcd[1] & XXH_AVX512F_CPUID_MASK) != XXH_AVX512F_CPUID_MASK) {
- XXH_debugPrint("AVX512F not supported by CPU");
- return best;
- }
-
- /* Validate that the OS supports ZMM registers */
- if ((xgetbv_val & XXH_AVX512F_XGETBV_MASK) != XXH_AVX512F_XGETBV_MASK) {
- XXH_debugPrint("AVX512F supported by the CPU, but not the OS.");
- return best;
- }
-
- /* AVX512F supported */
- XXH_debugPrint("AVX512F support detected.");
- best = XXH_AVX512;
-#endif
-#endif
- return best;
-}
-
-
-/* === Vector implementations === */
-
-/*!
- * @internal
- * @brief Defines the various dispatch functions.
- *
- * TODO: Consolidate?
- *
- * @param suffix The suffix for the functions, e.g. sse2 or scalar
- * @param target XXH_TARGET_* or empty.
- */
-#define XXH_DEFINE_DISPATCH_FUNCS(suffix, target) \
- \
-/* === XXH3, default variants === */ \
- \
-XXH_NO_INLINE target XXH64_hash_t \
-XXHL64_default_##suffix(const void* XXH_RESTRICT input, size_t len) \
-{ \
- return XXH3_hashLong_64b_internal( \
- input, len, XXH3_kSecret, sizeof(XXH3_kSecret), \
- XXH3_accumulate_512_##suffix, XXH3_scrambleAcc_##suffix \
- ); \
-} \
- \
-/* === XXH3, Seeded variants === */ \
- \
-XXH_NO_INLINE target XXH64_hash_t \
-XXHL64_seed_##suffix(const void* XXH_RESTRICT input, size_t len, \
- XXH64_hash_t seed) \
-{ \
- return XXH3_hashLong_64b_withSeed_internal( \
- input, len, seed, XXH3_accumulate_512_##suffix, \
- XXH3_scrambleAcc_##suffix, XXH3_initCustomSecret_##suffix \
- ); \
-} \
- \
-/* === XXH3, Secret variants === */ \
- \
-XXH_NO_INLINE target XXH64_hash_t \
-XXHL64_secret_##suffix(const void* XXH_RESTRICT input, size_t len, \
- const void* secret, size_t secretLen) \
-{ \
- return XXH3_hashLong_64b_internal( \
- input, len, secret, secretLen, \
- XXH3_accumulate_512_##suffix, XXH3_scrambleAcc_##suffix \
- ); \
-} \
- \
-/* === XXH3 update variants === */ \
- \
-XXH_NO_INLINE target XXH_errorcode \
-XXH3_update_##suffix(XXH3_state_t* state, const void* input, size_t len) \
-{ \
- return XXH3_update(state, (const xxh_u8*)input, len, \
- XXH3_accumulate_512_##suffix, XXH3_scrambleAcc_##suffix); \
-} \
- \
-/* === XXH128 default variants === */ \
- \
-XXH_NO_INLINE target XXH128_hash_t \
-XXHL128_default_##suffix(const void* XXH_RESTRICT input, size_t len) \
-{ \
- return XXH3_hashLong_128b_internal( \
- input, len, XXH3_kSecret, sizeof(XXH3_kSecret), \
- XXH3_accumulate_512_##suffix, XXH3_scrambleAcc_##suffix \
- ); \
-} \
- \
-/* === XXH128 Secret variants === */ \
- \
-XXH_NO_INLINE target XXH128_hash_t \
-XXHL128_secret_##suffix(const void* XXH_RESTRICT input, size_t len, \
- const void* XXH_RESTRICT secret, size_t secretLen) \
-{ \
- return XXH3_hashLong_128b_internal( \
- input, len, (const xxh_u8*)secret, secretLen, \
- XXH3_accumulate_512_##suffix, XXH3_scrambleAcc_##suffix); \
-} \
- \
-/* === XXH128 Seeded variants === */ \
- \
-XXH_NO_INLINE target XXH128_hash_t \
-XXHL128_seed_##suffix(const void* XXH_RESTRICT input, size_t len, \
- XXH64_hash_t seed) \
-{ \
- return XXH3_hashLong_128b_withSeed_internal(input, len, seed, \
- XXH3_accumulate_512_##suffix, XXH3_scrambleAcc_##suffix, \
- XXH3_initCustomSecret_##suffix); \
-}
-
-/* End XXH_DEFINE_DISPATCH_FUNCS */
-
-#if XXH_DISPATCH_SCALAR
-XXH_DEFINE_DISPATCH_FUNCS(scalar, /* nothing */)
-#endif
-XXH_DEFINE_DISPATCH_FUNCS(sse2, XXH_TARGET_SSE2)
-#if XXH_DISPATCH_AVX2
-XXH_DEFINE_DISPATCH_FUNCS(avx2, XXH_TARGET_AVX2)
-#endif
-#if XXH_DISPATCH_AVX512
-XXH_DEFINE_DISPATCH_FUNCS(avx512, XXH_TARGET_AVX512)
-#endif
-#undef XXH_DEFINE_DISPATCH_FUNCS
-
-/* ==== Dispatchers ==== */
-
-typedef XXH64_hash_t (*XXH3_dispatchx86_hashLong64_default)(const void* XXH_RESTRICT, size_t);
-
-typedef XXH64_hash_t (*XXH3_dispatchx86_hashLong64_withSeed)(const void* XXH_RESTRICT, size_t, XXH64_hash_t);
-
-typedef XXH64_hash_t (*XXH3_dispatchx86_hashLong64_withSecret)(const void* XXH_RESTRICT, size_t, const void* XXH_RESTRICT, size_t);
-
-typedef XXH_errorcode (*XXH3_dispatchx86_update)(XXH3_state_t*, const void*, size_t);
-
-typedef struct {
- XXH3_dispatchx86_hashLong64_default hashLong64_default;
- XXH3_dispatchx86_hashLong64_withSeed hashLong64_seed;
- XXH3_dispatchx86_hashLong64_withSecret hashLong64_secret;
- XXH3_dispatchx86_update update;
-} XXH_dispatchFunctions_s;
-
-#define XXH_NB_DISPATCHES 4
-
-/*!
- * @internal
- * @brief Table of dispatchers for @ref XXH3_64bits().
- *
- * @pre The indices must match @ref XXH_VECTOR_TYPE.
- */
-static const XXH_dispatchFunctions_s XXH_kDispatch[XXH_NB_DISPATCHES] = {
-#if XXH_DISPATCH_SCALAR
- /* Scalar */ { XXHL64_default_scalar, XXHL64_seed_scalar, XXHL64_secret_scalar, XXH3_update_scalar },
-#else
- /* Scalar */ { NULL, NULL, NULL, NULL },
-#endif
- /* SSE2 */ { XXHL64_default_sse2, XXHL64_seed_sse2, XXHL64_secret_sse2, XXH3_update_sse2 },
-#if XXH_DISPATCH_AVX2
- /* AVX2 */ { XXHL64_default_avx2, XXHL64_seed_avx2, XXHL64_secret_avx2, XXH3_update_avx2 },
-#else
- /* AVX2 */ { NULL, NULL, NULL, NULL },
-#endif
-#if XXH_DISPATCH_AVX512
- /* AVX512 */ { XXHL64_default_avx512, XXHL64_seed_avx512, XXHL64_secret_avx512, XXH3_update_avx512 }
-#else
- /* AVX512 */ { NULL, NULL, NULL, NULL }
-#endif
-};
-/*!
- * @internal
- * @brief The selected dispatch table for @ref XXH3_64bits().
- */
-static XXH_dispatchFunctions_s XXH_g_dispatch = { NULL, NULL, NULL, NULL };
-
-
-typedef XXH128_hash_t (*XXH3_dispatchx86_hashLong128_default)(const void* XXH_RESTRICT, size_t);
-
-typedef XXH128_hash_t (*XXH3_dispatchx86_hashLong128_withSeed)(const void* XXH_RESTRICT, size_t, XXH64_hash_t);
-
-typedef XXH128_hash_t (*XXH3_dispatchx86_hashLong128_withSecret)(const void* XXH_RESTRICT, size_t, const void* XXH_RESTRICT, size_t);
-
-typedef struct {
- XXH3_dispatchx86_hashLong128_default hashLong128_default;
- XXH3_dispatchx86_hashLong128_withSeed hashLong128_seed;
- XXH3_dispatchx86_hashLong128_withSecret hashLong128_secret;
- XXH3_dispatchx86_update update;
-} XXH_dispatch128Functions_s;
-
-
-/*!
- * @internal
- * @brief Table of dispatchers for @ref XXH3_128bits().
- *
- * @pre The indices must match @ref XXH_VECTOR_TYPE.
- */
-static const XXH_dispatch128Functions_s XXH_kDispatch128[XXH_NB_DISPATCHES] = {
-#if XXH_DISPATCH_SCALAR
- /* Scalar */ { XXHL128_default_scalar, XXHL128_seed_scalar, XXHL128_secret_scalar, XXH3_update_scalar },
-#else
- /* Scalar */ { NULL, NULL, NULL, NULL },
-#endif
- /* SSE2 */ { XXHL128_default_sse2, XXHL128_seed_sse2, XXHL128_secret_sse2, XXH3_update_sse2 },
-#if XXH_DISPATCH_AVX2
- /* AVX2 */ { XXHL128_default_avx2, XXHL128_seed_avx2, XXHL128_secret_avx2, XXH3_update_avx2 },
-#else
- /* AVX2 */ { NULL, NULL, NULL, NULL },
-#endif
-#if XXH_DISPATCH_AVX512
- /* AVX512 */ { XXHL128_default_avx512, XXHL128_seed_avx512, XXHL128_secret_avx512, XXH3_update_avx512 }
-#else
- /* AVX512 */ { NULL, NULL, NULL, NULL }
-#endif
-};
-
-/*!
- * @internal
- * @brief The selected dispatch table for @ref XXH3_64bits().
- */
-static XXH_dispatch128Functions_s XXH_g_dispatch128 = { NULL, NULL, NULL, NULL };
-
-/*!
- * @internal
- * @brief Runs a CPUID check and sets the correct dispatch tables.
- */
-static void XXH_setDispatch(void)
-{
- int vecID = XXH_featureTest();
- XXH_STATIC_ASSERT(XXH_AVX512 == XXH_NB_DISPATCHES-1);
- assert(XXH_SCALAR <= vecID && vecID <= XXH_AVX512);
-#if !XXH_DISPATCH_SCALAR
- assert(vecID != XXH_SCALAR);
-#endif
-#if !XXH_DISPATCH_AVX512
- assert(vecID != XXH_AVX512);
-#endif
-#if !XXH_DISPATCH_AVX2
- assert(vecID != XXH_AVX2);
-#endif
- XXH_g_dispatch = XXH_kDispatch[vecID];
- XXH_g_dispatch128 = XXH_kDispatch128[vecID];
-}
-
-
-/* ==== XXH3 public functions ==== */
-
-static XXH64_hash_t
-XXH3_hashLong_64b_defaultSecret_selection(const void* input, size_t len,
- XXH64_hash_t seed64, const xxh_u8* secret, size_t secretLen)
-{
- (void)seed64; (void)secret; (void)secretLen;
- if (XXH_g_dispatch.hashLong64_default == NULL) XXH_setDispatch();
- return XXH_g_dispatch.hashLong64_default(input, len);
-}
-
-XXH64_hash_t XXH3_64bits_dispatch(const void* input, size_t len)
-{
- return XXH3_64bits_internal(input, len, 0, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_defaultSecret_selection);
-}
-
-static XXH64_hash_t
-XXH3_hashLong_64b_withSeed_selection(const void* input, size_t len,
- XXH64_hash_t seed64, const xxh_u8* secret, size_t secretLen)
-{
- (void)secret; (void)secretLen;
- if (XXH_g_dispatch.hashLong64_seed == NULL) XXH_setDispatch();
- return XXH_g_dispatch.hashLong64_seed(input, len, seed64);
-}
-
-XXH64_hash_t XXH3_64bits_withSeed_dispatch(const void* input, size_t len, XXH64_hash_t seed)
-{
- return XXH3_64bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_withSeed_selection);
-}
-
-static XXH64_hash_t
-XXH3_hashLong_64b_withSecret_selection(const void* input, size_t len,
- XXH64_hash_t seed64, const xxh_u8* secret, size_t secretLen)
-{
- (void)seed64;
- if (XXH_g_dispatch.hashLong64_secret == NULL) XXH_setDispatch();
- return XXH_g_dispatch.hashLong64_secret(input, len, secret, secretLen);
-}
-
-XXH64_hash_t XXH3_64bits_withSecret_dispatch(const void* input, size_t len, const void* secret, size_t secretLen)
-{
- return XXH3_64bits_internal(input, len, 0, secret, secretLen, XXH3_hashLong_64b_withSecret_selection);
-}
-
-XXH_errorcode
-XXH3_64bits_update_dispatch(XXH3_state_t* state, const void* input, size_t len)
-{
- if (XXH_g_dispatch.update == NULL) XXH_setDispatch();
- return XXH_g_dispatch.update(state, (const xxh_u8*)input, len);
-}
-
-
-/* ==== XXH128 public functions ==== */
-
-static XXH128_hash_t
-XXH3_hashLong_128b_defaultSecret_selection(const void* input, size_t len,
- XXH64_hash_t seed64, const void* secret, size_t secretLen)
-{
- (void)seed64; (void)secret; (void)secretLen;
- if (XXH_g_dispatch128.hashLong128_default == NULL) XXH_setDispatch();
- return XXH_g_dispatch128.hashLong128_default(input, len);
-}
-
-XXH128_hash_t XXH3_128bits_dispatch(const void* input, size_t len)
-{
- return XXH3_128bits_internal(input, len, 0, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_128b_defaultSecret_selection);
-}
-
-static XXH128_hash_t
-XXH3_hashLong_128b_withSeed_selection(const void* input, size_t len,
- XXH64_hash_t seed64, const void* secret, size_t secretLen)
-{
- (void)secret; (void)secretLen;
- if (XXH_g_dispatch128.hashLong128_seed == NULL) XXH_setDispatch();
- return XXH_g_dispatch128.hashLong128_seed(input, len, seed64);
-}
-
-XXH128_hash_t XXH3_128bits_withSeed_dispatch(const void* input, size_t len, XXH64_hash_t seed)
-{
- return XXH3_128bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_128b_withSeed_selection);
-}
-
-static XXH128_hash_t
-XXH3_hashLong_128b_withSecret_selection(const void* input, size_t len,
- XXH64_hash_t seed64, const void* secret, size_t secretLen)
-{
- (void)seed64;
- if (XXH_g_dispatch128.hashLong128_secret == NULL) XXH_setDispatch();
- return XXH_g_dispatch128.hashLong128_secret(input, len, secret, secretLen);
-}
-
-XXH128_hash_t XXH3_128bits_withSecret_dispatch(const void* input, size_t len, const void* secret, size_t secretLen)
-{
- return XXH3_128bits_internal(input, len, 0, secret, secretLen, XXH3_hashLong_128b_withSecret_selection);
-}
-
-XXH_errorcode
-XXH3_128bits_update_dispatch(XXH3_state_t* state, const void* input, size_t len)
-{
- if (XXH_g_dispatch128.update == NULL) XXH_setDispatch();
- return XXH_g_dispatch128.update(state, (const xxh_u8*)input, len);
-}
-
-#if defined (__cplusplus)
-}
-#endif
-/*! @} */
diff --git a/third_party/xxhash/xxh_x86dispatch.h b/third_party/xxhash/xxh_x86dispatch.h
deleted file mode 100644
index 6bc17bcbbe..0000000000
--- a/third_party/xxhash/xxh_x86dispatch.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * xxHash - XXH3 Dispatcher for x86-based targets
- * Copyright (C) 2020 Yann Collet
- *
- * BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php)
- *
- * 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.
- *
- * 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.
- *
- * You can contact the author at:
- * - xxHash homepage: https://www.xxhash.com
- * - xxHash source repository: https://github.com/Cyan4973/xxHash
- */
-
-#ifndef XXH_X86DISPATCH_H_13563687684
-#define XXH_X86DISPATCH_H_13563687684
-
-#include "xxhash.h" /* XXH64_hash_t, XXH3_state_t */
-
-#if defined (__cplusplus)
-extern "C" {
-#endif
-
-XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_dispatch(const void* input, size_t len);
-XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSeed_dispatch(const void* input, size_t len, XXH64_hash_t seed);
-XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSecret_dispatch(const void* input, size_t len, const void* secret, size_t secretLen);
-XXH_PUBLIC_API XXH_errorcode XXH3_64bits_update_dispatch(XXH3_state_t* state, const void* input, size_t len);
-
-XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_dispatch(const void* input, size_t len);
-XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSeed_dispatch(const void* input, size_t len, XXH64_hash_t seed);
-XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSecret_dispatch(const void* input, size_t len, const void* secret, size_t secretLen);
-XXH_PUBLIC_API XXH_errorcode XXH3_128bits_update_dispatch(XXH3_state_t* state, const void* input, size_t len);
-
-#if defined (__cplusplus)
-}
-#endif
-
-
-/* automatic replacement of XXH3 functions.
- * can be disabled by setting XXH_DISPATCH_DISABLE_REPLACE */
-#ifndef XXH_DISPATCH_DISABLE_REPLACE
-
-# undef XXH3_64bits
-# define XXH3_64bits XXH3_64bits_dispatch
-# undef XXH3_64bits_withSeed
-# define XXH3_64bits_withSeed XXH3_64bits_withSeed_dispatch
-# undef XXH3_64bits_withSecret
-# define XXH3_64bits_withSecret XXH3_64bits_withSecret_dispatch
-# undef XXH3_64bits_update
-# define XXH3_64bits_update XXH3_64bits_update_dispatch
-
-# undef XXH128
-# define XXH128 XXH3_128bits_withSeed_dispatch
-# define XXH3_128bits XXH3_128bits_dispatch
-# undef XXH3_128bits
-# define XXH3_128bits XXH3_128bits_dispatch
-# undef XXH3_128bits_withSeed
-# define XXH3_128bits_withSeed XXH3_128bits_withSeed_dispatch
-# undef XXH3_128bits_withSecret
-# define XXH3_128bits_withSecret XXH3_128bits_withSecret_dispatch
-# undef XXH3_128bits_update
-# define XXH3_128bits_update XXH3_128bits_update_dispatch
-
-#endif /* XXH_DISPATCH_DISABLE_REPLACE */
-
-#endif /* XXH_X86DISPATCH_H_13563687684 */
diff --git a/third_party/xxhash/xxhash.c b/third_party/xxhash/xxhash.c
deleted file mode 100644
index 0fae88c5d6..0000000000
--- a/third_party/xxhash/xxhash.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * xxHash - Extremely Fast Hash algorithm
- * Copyright (C) 2012-2020 Yann Collet
- *
- * BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php)
- *
- * 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.
- *
- * 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.
- *
- * You can contact the author at:
- * - xxHash homepage: https://www.xxhash.com
- * - xxHash source repository: https://github.com/Cyan4973/xxHash
- */
-
-
-/*
- * xxhash.c instantiates functions defined in xxhash.h
- */
-
-#define XXH_STATIC_LINKING_ONLY /* access advanced declarations */
-#define XXH_IMPLEMENTATION /* access definitions */
-
-#include "xxhash.h"
diff --git a/third_party/xxhash/xxhash.h b/third_party/xxhash/xxhash.h
index 29c44e45d9..ba031cfe6f 100644
--- a/third_party/xxhash/xxhash.h
+++ b/third_party/xxhash/xxhash.h
@@ -266,7 +266,7 @@ extern "C" {
***************************************/
#define XXH_VERSION_MAJOR 0
#define XXH_VERSION_MINOR 8
-#define XXH_VERSION_RELEASE 0
+#define XXH_VERSION_RELEASE 1
#define XXH_VERSION_NUMBER (XXH_VERSION_MAJOR *100*100 + XXH_VERSION_MINOR *100 + XXH_VERSION_RELEASE)
/*!
@@ -275,7 +275,7 @@ extern "C" {
* This is only useful when xxHash is compiled as a shared library, as it is
* independent of the version defined in the header.
*
- * @return `XXH_VERSION_NUMBER` as of when the function was compiled.
+ * @return `XXH_VERSION_NUMBER` as of when the libray was compiled.
*/
XXH_PUBLIC_API unsigned XXH_versionNumber (void);
@@ -1394,6 +1394,27 @@ static void* XXH_memcpy(void* dest, const void* src, size_t size)
/* note: use after variable declarations */
#define XXH_STATIC_ASSERT(c) do { enum { XXH_sa = 1/(int)(!!(c)) }; } while (0)
+/*!
+ * @internal
+ * @def XXH_COMPILER_GUARD(var)
+ * @brief Used to prevent unwanted optimizations for @p var.
+ *
+ * It uses an empty GCC inline assembly statement with a register constraint
+ * which forces @p var into a general purpose register (eg eax, ebx, ecx
+ * on x86) and marks it as modified.
+ *
+ * This is used in a few places to avoid unwanted autovectorization (e.g.
+ * XXH32_round()). All vectorization we want is explicit via intrinsics,
+ * and _usually_ isn't wanted elsewhere.
+ *
+ * We also use it to prevent unwanted constant folding for AArch64 in
+ * XXH3_initCustomSecret_scalar().
+ */
+#ifdef __GNUC__
+# define XXH_COMPILER_GUARD(var) __asm__ __volatile__("" : "+r" (var))
+#else
+# define XXH_COMPILER_GUARD(var) ((void)0)
+#endif
/* *************************************
* Basic Types
@@ -1703,11 +1724,12 @@ XXH_PUBLIC_API unsigned XXH_versionNumber (void) { return XXH_VERSION_NUMBER; }
* @ingroup impl
* @{
*/
-static const xxh_u32 XXH_PRIME32_1 = 0x9E3779B1U; /*!< 0b10011110001101110111100110110001 */
-static const xxh_u32 XXH_PRIME32_2 = 0x85EBCA77U; /*!< 0b10000101111010111100101001110111 */
-static const xxh_u32 XXH_PRIME32_3 = 0xC2B2AE3DU; /*!< 0b11000010101100101010111000111101 */
-static const xxh_u32 XXH_PRIME32_4 = 0x27D4EB2FU; /*!< 0b00100111110101001110101100101111 */
-static const xxh_u32 XXH_PRIME32_5 = 0x165667B1U; /*!< 0b00010110010101100110011110110001 */
+ /* #define instead of static const, to be used as initializers */
+#define XXH_PRIME32_1 0x9E3779B1U /*!< 0b10011110001101110111100110110001 */
+#define XXH_PRIME32_2 0x85EBCA77U /*!< 0b10000101111010111100101001110111 */
+#define XXH_PRIME32_3 0xC2B2AE3DU /*!< 0b11000010101100101010111000111101 */
+#define XXH_PRIME32_4 0x27D4EB2FU /*!< 0b00100111110101001110101100101111 */
+#define XXH_PRIME32_5 0x165667B1U /*!< 0b00010110010101100110011110110001 */
#ifdef XXH_OLD_NAMES
# define PRIME32_1 XXH_PRIME32_1
@@ -1733,13 +1755,12 @@ static xxh_u32 XXH32_round(xxh_u32 acc, xxh_u32 input)
acc += input * XXH_PRIME32_2;
acc = XXH_rotl32(acc, 13);
acc *= XXH_PRIME32_1;
-#if defined(__GNUC__) && defined(__SSE4_1__) && !defined(XXH_ENABLE_AUTOVECTORIZE)
+#if (defined(__SSE4_1__) || defined(__aarch64__)) && !defined(XXH_ENABLE_AUTOVECTORIZE)
/*
* UGLY HACK:
- * This inline assembly hack forces acc into a normal register. This is the
- * only thing that prevents GCC and Clang from autovectorizing the XXH32
- * loop (pragmas and attributes don't work for some reason) without globally
- * disabling SSE4.1.
+ * A compiler fence is the only thing that prevents GCC and Clang from
+ * autovectorizing the XXH32 loop (pragmas and attributes don't work for some
+ * reason) without globally disabling SSE4.1.
*
* The reason we want to avoid vectorization is because despite working on
* 4 integers at a time, there are multiple factors slowing XXH32 down on
@@ -1764,22 +1785,11 @@ static xxh_u32 XXH32_round(xxh_u32 acc, xxh_u32 input)
* can load data, while v3 can multiply. SSE forces them to operate
* together.
*
- * How this hack works:
- * __asm__("" // Declare an assembly block but don't declare any instructions
- * : // However, as an Input/Output Operand,
- * "+r" // constrain a read/write operand (+) as a general purpose register (r).
- * (acc) // and set acc as the operand
- * );
- *
- * Because of the 'r', the compiler has promised that seed will be in a
- * general purpose register and the '+' says that it will be 'read/write',
- * so it has to assume it has changed. It is like volatile without all the
- * loads and stores.
- *
- * Since the argument has to be in a normal register (not an SSE register),
- * each time XXH32_round is called, it is impossible to vectorize.
+ * This is also enabled on AArch64, as Clang autovectorizes it incorrectly
+ * and it is pointless writing a NEON implementation that is basically the
+ * same speed as scalar for XXH32.
*/
- __asm__("" : "+r" (acc));
+ XXH_COMPILER_GUARD(acc);
#endif
return acc;
}
@@ -1910,7 +1920,7 @@ XXH32_finalize(xxh_u32 h32, const xxh_u8* ptr, size_t len, XXH_alignment align)
XXH_FORCE_INLINE xxh_u32
XXH32_endian_align(const xxh_u8* input, size_t len, xxh_u32 seed, XXH_alignment align)
{
- const xxh_u8* bEnd = input + len;
+ const xxh_u8* bEnd = input ? input + len : NULL;
xxh_u32 h32;
#if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1)
@@ -2134,35 +2144,6 @@ typedef XXH64_hash_t xxh_u64;
# define U64 xxh_u64
#endif
-/*!
- * XXH_REROLL_XXH64:
- * Whether to reroll the XXH64_finalize() loop.
- *
- * Just like XXH32, we can unroll the XXH64_finalize() loop. This can be a
- * performance gain on 64-bit hosts, as only one jump is required.
- *
- * However, on 32-bit hosts, because arithmetic needs to be done with two 32-bit
- * registers, and 64-bit arithmetic needs to be simulated, it isn't beneficial
- * to unroll. The code becomes ridiculously large (the largest function in the
- * binary on i386!), and rerolling it saves anywhere from 3kB to 20kB. It is
- * also slightly faster because it fits into cache better and is more likely
- * to be inlined by the compiler.
- *
- * If XXH_REROLL is defined, this is ignored and the loop is always rerolled.
- */
-#ifndef XXH_REROLL_XXH64
-# if (defined(__ILP32__) || defined(_ILP32)) /* ILP32 is often defined on 32-bit GCC family */ \
- || !(defined(__x86_64__) || defined(_M_X64) || defined(_M_AMD64) /* x86-64 */ \
- || defined(_M_ARM64) || defined(__aarch64__) || defined(__arm64__) /* aarch64 */ \
- || defined(__PPC64__) || defined(__PPC64LE__) || defined(__ppc64__) || defined(__powerpc64__) /* ppc64 */ \
- || defined(__mips64__) || defined(__mips64)) /* mips64 */ \
- || (!defined(SIZE_MAX) || SIZE_MAX < ULLONG_MAX) /* check limits */
-# define XXH_REROLL_XXH64 1
-# else
-# define XXH_REROLL_XXH64 0
-# endif
-#endif /* !defined(XXH_REROLL_XXH64) */
-
#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3))
/*
* Manual byteshift. Best for old compilers which don't inline memcpy.
@@ -2285,11 +2266,12 @@ XXH_readLE64_align(const void* ptr, XXH_alignment align)
* @ingroup impl
* @{
*/
-static const xxh_u64 XXH_PRIME64_1 = 0x9E3779B185EBCA87ULL; /*!< 0b1001111000110111011110011011000110000101111010111100101010000111 */
-static const xxh_u64 XXH_PRIME64_2 = 0xC2B2AE3D27D4EB4FULL; /*!< 0b1100001010110010101011100011110100100111110101001110101101001111 */
-static const xxh_u64 XXH_PRIME64_3 = 0x165667B19E3779F9ULL; /*!< 0b0001011001010110011001111011000110011110001101110111100111111001 */
-static const xxh_u64 XXH_PRIME64_4 = 0x85EBCA77C2B2AE63ULL; /*!< 0b1000010111101011110010100111011111000010101100101010111001100011 */
-static const xxh_u64 XXH_PRIME64_5 = 0x27D4EB2F165667C5ULL; /*!< 0b0010011111010100111010110010111100010110010101100110011111000101 */
+/* #define rather that static const, to be used as initializers */
+#define XXH_PRIME64_1 0x9E3779B185EBCA87ULL /*!< 0b1001111000110111011110011011000110000101111010111100101010000111 */
+#define XXH_PRIME64_2 0xC2B2AE3D27D4EB4FULL /*!< 0b1100001010110010101011100011110100100111110101001110101101001111 */
+#define XXH_PRIME64_3 0x165667B19E3779F9ULL /*!< 0b0001011001010110011001111011000110011110001101110111100111111001 */
+#define XXH_PRIME64_4 0x85EBCA77C2B2AE63ULL /*!< 0b1000010111101011110010100111011111000010101100101010111001100011 */
+#define XXH_PRIME64_5 0x27D4EB2F165667C5ULL /*!< 0b0010011111010100111010110010111100010110010101100110011111000101 */
#ifdef XXH_OLD_NAMES
# define PRIME64_1 XXH_PRIME64_1
@@ -2331,126 +2313,26 @@ static xxh_u64 XXH64_avalanche(xxh_u64 h64)
static xxh_u64
XXH64_finalize(xxh_u64 h64, const xxh_u8* ptr, size_t len, XXH_alignment align)
{
-#define XXH_PROCESS1_64 do { \
- h64 ^= (*ptr++) * XXH_PRIME64_5; \
- h64 = XXH_rotl64(h64, 11) * XXH_PRIME64_1; \
-} while (0)
-
-#define XXH_PROCESS4_64 do { \
- h64 ^= (xxh_u64)(XXH_get32bits(ptr)) * XXH_PRIME64_1; \
- ptr += 4; \
- h64 = XXH_rotl64(h64, 23) * XXH_PRIME64_2 + XXH_PRIME64_3; \
-} while (0)
-
-#define XXH_PROCESS8_64 do { \
- xxh_u64 const k1 = XXH64_round(0, XXH_get64bits(ptr)); \
- ptr += 8; \
- h64 ^= k1; \
- h64 = XXH_rotl64(h64,27) * XXH_PRIME64_1 + XXH_PRIME64_4; \
-} while (0)
-
- /* Rerolled version for 32-bit targets is faster and much smaller. */
- if (XXH_REROLL || XXH_REROLL_XXH64) {
- len &= 31;
- while (len >= 8) {
- XXH_PROCESS8_64;
- len -= 8;
- }
- if (len >= 4) {
- XXH_PROCESS4_64;
- len -= 4;
- }
- while (len > 0) {
- XXH_PROCESS1_64;
- --len;
- }
- return XXH64_avalanche(h64);
- } else {
- switch(len & 31) {
- case 24: XXH_PROCESS8_64;
- /* fallthrough */
- case 16: XXH_PROCESS8_64;
- /* fallthrough */
- case 8: XXH_PROCESS8_64;
- return XXH64_avalanche(h64);
-
- case 28: XXH_PROCESS8_64;
- /* fallthrough */
- case 20: XXH_PROCESS8_64;
- /* fallthrough */
- case 12: XXH_PROCESS8_64;
- /* fallthrough */
- case 4: XXH_PROCESS4_64;
- return XXH64_avalanche(h64);
-
- case 25: XXH_PROCESS8_64;
- /* fallthrough */
- case 17: XXH_PROCESS8_64;
- /* fallthrough */
- case 9: XXH_PROCESS8_64;
- XXH_PROCESS1_64;
- return XXH64_avalanche(h64);
-
- case 29: XXH_PROCESS8_64;
- /* fallthrough */
- case 21: XXH_PROCESS8_64;
- /* fallthrough */
- case 13: XXH_PROCESS8_64;
- /* fallthrough */
- case 5: XXH_PROCESS4_64;
- XXH_PROCESS1_64;
- return XXH64_avalanche(h64);
-
- case 26: XXH_PROCESS8_64;
- /* fallthrough */
- case 18: XXH_PROCESS8_64;
- /* fallthrough */
- case 10: XXH_PROCESS8_64;
- XXH_PROCESS1_64;
- XXH_PROCESS1_64;
- return XXH64_avalanche(h64);
-
- case 30: XXH_PROCESS8_64;
- /* fallthrough */
- case 22: XXH_PROCESS8_64;
- /* fallthrough */
- case 14: XXH_PROCESS8_64;
- /* fallthrough */
- case 6: XXH_PROCESS4_64;
- XXH_PROCESS1_64;
- XXH_PROCESS1_64;
- return XXH64_avalanche(h64);
-
- case 27: XXH_PROCESS8_64;
- /* fallthrough */
- case 19: XXH_PROCESS8_64;
- /* fallthrough */
- case 11: XXH_PROCESS8_64;
- XXH_PROCESS1_64;
- XXH_PROCESS1_64;
- XXH_PROCESS1_64;
- return XXH64_avalanche(h64);
-
- case 31: XXH_PROCESS8_64;
- /* fallthrough */
- case 23: XXH_PROCESS8_64;
- /* fallthrough */
- case 15: XXH_PROCESS8_64;
- /* fallthrough */
- case 7: XXH_PROCESS4_64;
- /* fallthrough */
- case 3: XXH_PROCESS1_64;
- /* fallthrough */
- case 2: XXH_PROCESS1_64;
- /* fallthrough */
- case 1: XXH_PROCESS1_64;
- /* fallthrough */
- case 0: return XXH64_avalanche(h64);
- }
+ len &= 31;
+ while (len >= 8) {
+ xxh_u64 const k1 = XXH64_round(0, XXH_get64bits(ptr));
+ ptr += 8;
+ h64 ^= k1;
+ h64 = XXH_rotl64(h64,27) * XXH_PRIME64_1 + XXH_PRIME64_4;
+ len -= 8;
+ }
+ if (len >= 4) {
+ h64 ^= (xxh_u64)(XXH_get32bits(ptr)) * XXH_PRIME64_1;
+ ptr += 4;
+ h64 = XXH_rotl64(h64, 23) * XXH_PRIME64_2 + XXH_PRIME64_3;
+ len -= 4;
+ }
+ while (len > 0) {
+ h64 ^= (*ptr++) * XXH_PRIME64_5;
+ h64 = XXH_rotl64(h64, 11) * XXH_PRIME64_1;
+ --len;
}
- /* impossible to reach */
- XXH_ASSERT(0);
- return 0; /* unreachable, but some compilers complain without it */
+ return XXH64_avalanche(h64);
}
#ifdef XXH_OLD_NAMES
@@ -2466,7 +2348,7 @@ XXH64_finalize(xxh_u64 h64, const xxh_u8* ptr, size_t len, XXH_alignment align)
XXH_FORCE_INLINE xxh_u64
XXH64_endian_align(const xxh_u8* input, size_t len, xxh_u64 seed, XXH_alignment align)
{
- const xxh_u8* bEnd = input + len;
+ const xxh_u8* bEnd = input ? input + len : NULL;
xxh_u64 h64;
#if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1)
@@ -2664,7 +2546,7 @@ XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src
return XXH_readBE64(src);
}
-
+#ifndef XXH_NO_XXH3
/* *********************************************************************
* XXH3
@@ -2679,7 +2561,9 @@ XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src
/* === Compiler specifics === */
-#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* >= C99 */
+#if ((defined(sun) || defined(__sun)) && __cplusplus) /* Solaris includes __STDC_VERSION__ with C++. Tested with GCC 5.5 */
+# define XXH_RESTRICT /* disable */
+#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* >= C99 */
# define XXH_RESTRICT restrict
#else
/* Note: it might be useful to define __restrict or __restrict__ for some C++ compilers */
@@ -3441,7 +3325,7 @@ XXH3_len_4to8_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_h
{
XXH_ASSERT(input != NULL);
XXH_ASSERT(secret != NULL);
- XXH_ASSERT(4 <= len && len < 8);
+ XXH_ASSERT(4 <= len && len <= 8);
seed ^= (xxh_u64)XXH_swap32((xxh_u32)seed) << 32;
{ xxh_u32 const input1 = XXH_readLE32(input);
xxh_u32 const input2 = XXH_readLE32(input + len - 4);
@@ -3457,7 +3341,7 @@ XXH3_len_9to16_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_
{
XXH_ASSERT(input != NULL);
XXH_ASSERT(secret != NULL);
- XXH_ASSERT(8 <= len && len <= 16);
+ XXH_ASSERT(9 <= len && len <= 16);
{ xxh_u64 const bitflip1 = (XXH_readLE64(secret+24) ^ XXH_readLE64(secret+32)) + seed;
xxh_u64 const bitflip2 = (XXH_readLE64(secret+40) ^ XXH_readLE64(secret+48)) - seed;
xxh_u64 const input_lo = XXH_readLE64(input) ^ bitflip1;
@@ -3527,7 +3411,7 @@ XXH_FORCE_INLINE xxh_u64 XXH3_mix16B(const xxh_u8* XXH_RESTRICT input,
* GCC generates much better scalar code than Clang for the rest of XXH3,
* which is why finding a more optimal codepath is an interest.
*/
- __asm__ ("" : "+r" (seed64));
+ XXH_COMPILER_GUARD(seed64);
#endif
{ xxh_u64 const input_lo = XXH_readLE64(input);
xxh_u64 const input_hi = XXH_readLE64(input+8);
@@ -3871,12 +3755,8 @@ XXH_FORCE_INLINE XXH_TARGET_AVX2 void XXH3_initCustomSecret_avx2(void* XXH_RESTR
* On GCC & Clang, marking 'dest' as modified will cause the compiler:
* - do not extract the secret from sse registers in the internal loop
* - use less common registers, and avoid pushing these reg into stack
- * The asm hack causes Clang to assume that XXH3_kSecretPtr aliases with
- * customSecret, and on aarch64, this prevented LDP from merging two
- * loads together for free. Putting the loads together before the stores
- * properly generates LDP.
*/
- __asm__("" : "+r" (dest));
+ XXH_COMPILER_GUARD(dest);
# endif
/* GCC -O2 need unroll loop manually */
@@ -3985,7 +3865,7 @@ XXH_FORCE_INLINE XXH_TARGET_SSE2 void XXH3_initCustomSecret_sse2(void* XXH_RESTR
* - do not extract the secret from sse registers in the internal loop
* - use less common registers, and avoid pushing these reg into stack
*/
- __asm__("" : "+r" (dest));
+ XXH_COMPILER_GUARD(dest);
# endif
for (i=0; i < nbRounds; ++i) {
@@ -4231,7 +4111,7 @@ XXH3_initCustomSecret_scalar(void* XXH_RESTRICT customSecret, xxh_u64 seed64)
* without hack: 2654.4 MB/s
* with hack: 3202.9 MB/s
*/
- __asm__("" : "+r" (kSecretPtr));
+ XXH_COMPILER_GUARD(kSecretPtr);
#endif
/*
* Note: in debug mode, this overrides the asm optimization
@@ -4396,7 +4276,7 @@ XXH3_mergeAccs(const xxh_u64* XXH_RESTRICT acc, const xxh_u8* XXH_RESTRICT secre
* without hack: 2063.7 MB/s
* with hack: 2560.7 MB/s
*/
- __asm__("" : "+r" (result64));
+ XXH_COMPILER_GUARD(result64);
#endif
}
@@ -5432,6 +5312,8 @@ XXH128_hashFromCanonical(const XXH128_canonical_t* src)
#endif /* XXH_NO_LONG_LONG */
+#endif /* XXH_NO_XXH3 */
+
/*!
* @}
*/
diff --git a/third_party/xxhash/xxhsum.1 b/third_party/xxhash/xxhsum.1
deleted file mode 100644
index dd17108f10..0000000000
--- a/third_party/xxhash/xxhsum.1
+++ /dev/null
@@ -1,165 +0,0 @@
-.
-.TH "XXHSUM" "1" "July 2020" "xxhsum 0.7.4" "User Commands"
-.
-.SH "NAME"
-\fBxxhsum\fR \- print or check xxHash non\-cryptographic checksums
-.
-.SH "SYNOPSIS"
-\fBxxhsum [<OPTION>] \.\.\. [<FILE>] \.\.\.\fR \fBxxhsum \-b [<OPTION>] \.\.\.\fR
-.
-.P
-\fBxxh32sum\fR is equivalent to \fBxxhsum \-H0\fR \fBxxh64sum\fR is equivalent to \fBxxhsum \-H1\fR \fBxxh128sum\fR is equivalent to \fBxxhsum \-H2\fR
-.
-.SH "DESCRIPTION"
-Print or check xxHash (32, 64 or 128 bits) checksums\. When no \fIFILE\fR, read standard input, except if it\'s the console\. When \fIFILE\fR is \fB\-\fR, read standard input even if it\'s the console\.
-.
-.P
-\fBxxhsum\fR supports a command line syntax similar but not identical to md5sum(1)\. Differences are: \fBxxhsum\fR doesn\'t have text/binary mode switch (\fB\-b\fR, \fB\-t\fR); \fBxxhsum\fR always treats files as binary file; \fBxxhsum\fR has a hash bit width switch (\fB\-H\fR);
-.
-.P
-As xxHash is a fast non\-cryptographic checksum algorithm, \fBxxhsum\fR should not be used for security related purposes\.
-.
-.P
-\fBxxhsum \-b\fR invokes benchmark mode\. See \fIOPTIONS\fR and \fIEXAMPLES\fR for details\.
-.
-.SH "OPTIONS"
-.
-.TP
-\fB\-V\fR, \fB\-\-version\fR
-Displays xxhsum version and exits
-.
-.TP
-\fB\-H\fR\fIHASHTYPE\fR
-Hash selection\. \fIHASHTYPE\fR means \fB0\fR=32bits, \fB1\fR=64bits, \fB2\fR=128bits\. Alternatively, \fIHASHTYPE\fR \fB32\fR=32bits, \fB64\fR=64bits, \fB128\fR=128bits\. Default value is \fB1\fR (64bits)
-.
-.TP
-\fB\-\-tag\fR
-Output in the BSD style\.
-.
-.TP
-\fB\-\-little\-endian\fR
-Set output hexadecimal checksum value as little endian convention\. By default, value is displayed as big endian\.
-.
-.TP
-\fB\-h\fR, \fB\-\-help\fR
-Displays help and exits
-.
-.P
-\fBThe following four options are useful only when verifying checksums (\fB\-c\fR)\fR
-.
-.TP
-\fB\-c\fR, \fB\-\-check\fR \fIFILE\fR
-Read xxHash sums from \fIFILE\fR and check them
-.
-.TP
-\fB\-q\fR, \fB\-\-quiet\fR
-Don\'t print OK for each successfully verified file
-.
-.TP
-\fB\-\-strict\fR
-Return an error code if any line in the file is invalid, not just if some checksums are wrong\. This policy is disabled by default, though UI will prompt an informational message if any line in the file is detected invalid\.
-.
-.TP
-\fB\-\-status\fR
-Don\'t output anything\. Status code shows success\.
-.
-.TP
-\fB\-w\fR, \fB\-\-warn\fR
-Emit a warning message about each improperly formatted checksum line\.
-.
-.P
-\fBThe following options are useful only benchmark purpose\fR
-.
-.TP
-\fB\-b\fR
-Benchmark mode\. See \fIEXAMPLES\fR for details\.
-.
-.TP
-\fB\-b#\fR
-Specify ID of variant to be tested\. Multiple variants can be selected, separated by a \',\' comma\.
-.
-.TP
-\fB\-B\fR\fIBLOCKSIZE\fR
-Only useful for benchmark mode (\fB\-b\fR)\. See \fIEXAMPLES\fR for details\. \fIBLOCKSIZE\fR specifies benchmark mode\'s test data block size in bytes\. Default value is 102400
-.
-.TP
-\fB\-i\fR\fIITERATIONS\fR
-Only useful for benchmark mode (\fB\-b\fR)\. See \fIEXAMPLES\fR for details\. \fIITERATIONS\fR specifies number of iterations in benchmark\. Single iteration lasts approximately 1000 milliseconds\. Default value is 3
-.
-.SH "EXIT STATUS"
-\fBxxhsum\fR exit \fB0\fR on success, \fB1\fR if at least one file couldn\'t be read or doesn\'t have the same checksum as the \fB\-c\fR option\.
-.
-.SH "EXAMPLES"
-Output xxHash (64bit) checksum values of specific files to standard output
-.
-.IP "" 4
-.
-.nf
-
-$ xxhsum \-H1 foo bar baz
-.
-.fi
-.
-.IP "" 0
-.
-.P
-Output xxHash (32bit and 64bit) checksum values of specific files to standard output, and redirect it to \fBxyz\.xxh32\fR and \fBqux\.xxh64\fR
-.
-.IP "" 4
-.
-.nf
-
-$ xxhsum \-H0 foo bar baz > xyz\.xxh32
-$ xxhsum \-H1 foo bar baz > qux\.xxh64
-.
-.fi
-.
-.IP "" 0
-.
-.P
-Read xxHash sums from specific files and check them
-.
-.IP "" 4
-.
-.nf
-
-$ xxhsum \-c xyz\.xxh32 qux\.xxh64
-.
-.fi
-.
-.IP "" 0
-.
-.P
-Benchmark xxHash algorithm\. By default, \fBxxhsum\fR benchmarks xxHash main variants on a synthetic sample of 100 KB, and print results into standard output\. The first column is the algorithm, the second column is the source data size in bytes, the third column is the number of hashes generated per second (throughput), and finally the last column translates speed in megabytes per second\.
-.
-.IP "" 4
-.
-.nf
-
-$ xxhsum \-b
-.
-.fi
-.
-.IP "" 0
-.
-.P
-In the following example, the sample to hash is set to 16384 bytes, the variants to be benched are selected by their IDs, and each benchmark test is repeated 10 times, for increased accuracy\.
-.
-.IP "" 4
-.
-.nf
-
-$ xxhsum \-b1,2,3 \-i10 \-B16384
-.
-.fi
-.
-.IP "" 0
-.
-.SH "BUGS"
-Report bugs at: https://github\.com/Cyan4973/xxHash/issues/
-.
-.SH "AUTHOR"
-Yann Collet
-.
-.SH "SEE ALSO"
-md5sum(1)
diff --git a/third_party/xxhash/xxhsum.1.md b/third_party/xxhash/xxhsum.1.md
deleted file mode 100644
index 85cd8facca..0000000000
--- a/third_party/xxhash/xxhsum.1.md
+++ /dev/null
@@ -1,148 +0,0 @@
-xxhsum(1) -- print or check xxHash non-cryptographic checksums
-==============================================================
-
-SYNOPSIS
---------
-
-`xxhsum [<OPTION>] ... [<FILE>] ...`
-`xxhsum -b [<OPTION>] ...`
-
-`xxh32sum` is equivalent to `xxhsum -H0`
-`xxh64sum` is equivalent to `xxhsum -H1`
-`xxh128sum` is equivalent to `xxhsum -H2`
-
-
-DESCRIPTION
------------
-
-Print or check xxHash (32, 64 or 128 bits) checksums.
-When no <FILE>, read standard input, except if it's the console.
-When <FILE> is `-`, read standard input even if it's the console.
-
-`xxhsum` supports a command line syntax similar but not identical to md5sum(1).
-Differences are:
-`xxhsum` doesn't have text/binary mode switch (`-b`, `-t`);
-`xxhsum` always treats files as binary file;
-`xxhsum` has a hash bit width switch (`-H`);
-
-As xxHash is a fast non-cryptographic checksum algorithm,
-`xxhsum` should not be used for security related purposes.
-
-`xxhsum -b` invokes benchmark mode. See [OPTIONS](#OPTIONS) and [EXAMPLES](#EXAMPLES) for details.
-
-OPTIONS
--------
-
-* `-V`, `--version`:
- Displays xxhsum version and exits
-
-* `-H`<HASHTYPE>:
- Hash selection. <HASHTYPE> means `0`=32bits, `1`=64bits, `2`=128bits.
- Alternatively, <HASHTYPE> `32`=32bits, `64`=64bits, `128`=128bits.
- Default value is `1` (64bits)
-
-* `--tag`:
- Output in the BSD style.
-
-* `--little-endian`:
- Set output hexadecimal checksum value as little endian convention.
- By default, value is displayed as big endian.
-
-* `-h`, `--help`:
- Displays help and exits
-
-**The following four options are useful only when verifying checksums (`-c`)**
-
-* `-c`, `--check` <FILE>:
- Read xxHash sums from <FILE> and check them
-
-* `-q`, `--quiet`:
- Don't print OK for each successfully verified file
-
-* `--strict`:
- Return an error code if any line in the file is invalid,
- not just if some checksums are wrong.
- This policy is disabled by default,
- though UI will prompt an informational message
- if any line in the file is detected invalid.
-
-* `--status`:
- Don't output anything. Status code shows success.
-
-* `-w`, `--warn`:
- Emit a warning message about each improperly formatted checksum line.
-
-**The following options are useful only benchmark purpose**
-
-* `-b`:
- Benchmark mode. See [EXAMPLES](#EXAMPLES) for details.
-
-* `-b#`:
- Specify ID of variant to be tested.
- Multiple variants can be selected, separated by a ',' comma.
-
-* `-B`<BLOCKSIZE>:
- Only useful for benchmark mode (`-b`). See [EXAMPLES](#EXAMPLES) for details.
- <BLOCKSIZE> specifies benchmark mode's test data block size in bytes.
- Default value is 102400
-
-* `-i`<ITERATIONS>:
- Only useful for benchmark mode (`-b`). See [EXAMPLES](#EXAMPLES) for details.
- <ITERATIONS> specifies number of iterations in benchmark. Single iteration
- lasts approximately 1000 milliseconds. Default value is 3
-
-EXIT STATUS
------------
-
-`xxhsum` exit `0` on success, `1` if at least one file couldn't be read or
-doesn't have the same checksum as the `-c` option.
-
-EXAMPLES
---------
-
-Output xxHash (64bit) checksum values of specific files to standard output
-
- $ xxhsum -H1 foo bar baz
-
-Output xxHash (32bit and 64bit) checksum values of specific files to standard
-output, and redirect it to `xyz.xxh32` and `qux.xxh64`
-
- $ xxhsum -H0 foo bar baz > xyz.xxh32
- $ xxhsum -H1 foo bar baz > qux.xxh64
-
-Read xxHash sums from specific files and check them
-
- $ xxhsum -c xyz.xxh32 qux.xxh64
-
-Benchmark xxHash algorithm.
-By default, `xxhsum` benchmarks xxHash main variants
-on a synthetic sample of 100 KB,
-and print results into standard output.
-The first column is the algorithm,
-the second column is the source data size in bytes,
-the third column is the number of hashes generated per second (throughput),
-and finally the last column translates speed in megabytes per second.
-
- $ xxhsum -b
-
-In the following example,
-the sample to hash is set to 16384 bytes,
-the variants to be benched are selected by their IDs,
-and each benchmark test is repeated 10 times, for increased accuracy.
-
- $ xxhsum -b1,2,3 -i10 -B16384
-
-BUGS
-----
-
-Report bugs at: https://github.com/Cyan4973/xxHash/issues/
-
-AUTHOR
-------
-
-Yann Collet
-
-SEE ALSO
---------
-
-md5sum(1)
diff --git a/third_party/xxhash/xxhsum.c b/third_party/xxhash/xxhsum.c
deleted file mode 100644
index 82324091a4..0000000000
--- a/third_party/xxhash/xxhsum.c
+++ /dev/null
@@ -1,1503 +0,0 @@
-/*
- * xxhsum - Command line interface for xxhash algorithms
- * Copyright (C) 2013-2020 Yann Collet
- *
- * GPL v2 License
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * You can contact the author at:
- * - xxHash homepage: https://www.xxhash.com
- * - xxHash source repository: https://github.com/Cyan4973/xxHash
- */
-
-/*
- * xxhsum:
- * Provides hash value of a file content, or a list of files, or stdin
- * Display convention is Big Endian, for both 32 and 64 bits algorithms
- */
-
-/* Transitional headers */
-#include "cli/xsum_config.h"
-#include "cli/xsum_arch.h"
-#include "cli/xsum_os_specific.h"
-#include "cli/xsum_output.h"
-#include "cli/xsum_sanity_check.h"
-#ifdef XXH_INLINE_ALL
-# include "cli/xsum_os_specific.c"
-# include "cli/xsum_output.c"
-# include "cli/xsum_sanity_check.c"
-#endif
-
-/* ************************************
- * Includes
- **************************************/
-#include <limits.h>
-#include <stdlib.h> /* malloc, calloc, free, exit */
-#include <string.h> /* strcmp, memcpy */
-#include <stdio.h> /* fprintf, fopen, ftello64, fread, stdin, stdout, _fileno (when present) */
-#include <sys/types.h> /* stat, stat64, _stat64 */
-#include <sys/stat.h> /* stat, stat64, _stat64 */
-#include <time.h> /* clock_t, clock, CLOCKS_PER_SEC */
-#include <assert.h> /* assert */
-#include <errno.h> /* errno */
-
-#define XXH_STATIC_LINKING_ONLY /* *_state_t */
-#include "xxhash.h"
-
-#ifdef XXHSUM_DISPATCH
-# include "xxh_x86dispatch.h"
-#endif
-
-static unsigned XSUM_isLittleEndian(void)
-{
- const union { XSUM_U32 u; XSUM_U8 c[4]; } one = { 1 }; /* don't use static: performance detrimental */
- return one.c[0];
-}
-
-static const int g_nbBits = (int)(sizeof(void*)*8);
-static const char g_lename[] = "little endian";
-static const char g_bename[] = "big endian";
-#define ENDIAN_NAME (XSUM_isLittleEndian() ? g_lename : g_bename)
-static const char author[] = "Yann Collet";
-#define WELCOME_MESSAGE(exename) "%s %s by %s \n", exename, XSUM_PROGRAM_VERSION, author
-#define FULL_WELCOME_MESSAGE(exename) "%s %s by %s \n" \
- "compiled as %i-bit %s %s with " XSUM_CC_VERSION_FMT " \n", \
- exename, XSUM_PROGRAM_VERSION, author, \
- g_nbBits, XSUM_ARCH, ENDIAN_NAME, XSUM_CC_VERSION
-
-#define KB *( 1<<10)
-#define MB *( 1<<20)
-#define GB *(1U<<30)
-
-static size_t XSUM_DEFAULT_SAMPLE_SIZE = 100 KB;
-#define NBLOOPS 3 /* Default number of benchmark iterations */
-#define TIMELOOP_S 1
-#define TIMELOOP (TIMELOOP_S * CLOCKS_PER_SEC) /* target timing per iteration */
-#define TIMELOOP_MIN (TIMELOOP / 2) /* minimum timing to validate a result */
-#define XXHSUM32_DEFAULT_SEED 0 /* Default seed for algo_xxh32 */
-#define XXHSUM64_DEFAULT_SEED 0 /* Default seed for algo_xxh64 */
-
-#define MAX_MEM (2 GB - 64 MB)
-
-static const char stdinName[] = "-";
-typedef enum { algo_xxh32=0, algo_xxh64=1, algo_xxh128=2 } AlgoSelected;
-static AlgoSelected g_defaultAlgo = algo_xxh64; /* required within main() & XSUM_usage() */
-
-/* <16 hex char> <SPC> <SPC> <filename> <'\0'>
- * '4096' is typical Linux PATH_MAX configuration. */
-#define DEFAULT_LINE_LENGTH (sizeof(XXH64_hash_t) * 2 + 2 + 4096 + 1)
-
-/* Maximum acceptable line length. */
-#define MAX_LINE_LENGTH (32 KB)
-
-
-/* ************************************
- * Display macros
- **************************************/
-
-
-/* ************************************
- * Local variables
- **************************************/
-static XSUM_U32 g_nbIterations = NBLOOPS;
-
-
-/* ************************************
- * Benchmark Functions
- **************************************/
-static clock_t XSUM_clockSpan( clock_t start )
-{
- return clock() - start; /* works even if overflow; Typical max span ~ 30 mn */
-}
-
-static size_t XSUM_findMaxMem(XSUM_U64 requiredMem)
-{
- size_t const step = 64 MB;
- void* testmem = NULL;
-
- requiredMem = (((requiredMem >> 26) + 1) << 26);
- requiredMem += 2*step;
- if (requiredMem > MAX_MEM) requiredMem = MAX_MEM;
-
- while (!testmem) {
- if (requiredMem > step) requiredMem -= step;
- else requiredMem >>= 1;
- testmem = malloc ((size_t)requiredMem);
- }
- free (testmem);
-
- /* keep some space available */
- if (requiredMem > step) requiredMem -= step;
- else requiredMem >>= 1;
-
- return (size_t)requiredMem;
-}
-
-/*
- * Allocates a string containing s1 and s2 concatenated. Acts like strdup.
- * The result must be freed.
- */
-static char* XSUM_strcatDup(const char* s1, const char* s2)
-{
- assert(s1 != NULL);
- assert(s2 != NULL);
- { size_t len1 = strlen(s1);
- size_t len2 = strlen(s2);
- char* buf = (char*)malloc(len1 + len2 + 1);
- if (buf != NULL) {
- /* strcpy(buf, s1) */
- memcpy(buf, s1, len1);
- /* strcat(buf, s2) */
- memcpy(buf + len1, s2, len2 + 1);
- }
- return buf;
- }
-}
-
-
-/*
- * A secret buffer used for benchmarking XXH3's withSecret variants.
- *
- * In order for the bench to be realistic, the secret buffer would need to be
- * pre-generated.
- *
- * Adding a pointer to the parameter list would be messy.
- */
-static XSUM_U8 g_benchSecretBuf[XXH3_SECRET_SIZE_MIN];
-
-/*
- * Wrappers for the benchmark.
- *
- * If you would like to add other hashes to the bench, create a wrapper and add
- * it to the g_hashesToBench table. It will automatically be added.
- */
-typedef XSUM_U32 (*hashFunction)(const void* buffer, size_t bufferSize, XSUM_U32 seed);
-
-static XSUM_U32 localXXH32(const void* buffer, size_t bufferSize, XSUM_U32 seed)
-{
- return XXH32(buffer, bufferSize, seed);
-}
-static XSUM_U32 localXXH64(const void* buffer, size_t bufferSize, XSUM_U32 seed)
-{
- return (XSUM_U32)XXH64(buffer, bufferSize, seed);
-}
-static XSUM_U32 localXXH3_64b(const void* buffer, size_t bufferSize, XSUM_U32 seed)
-{
- (void)seed;
- return (XSUM_U32)XXH3_64bits(buffer, bufferSize);
-}
-static XSUM_U32 localXXH3_64b_seeded(const void* buffer, size_t bufferSize, XSUM_U32 seed)
-{
- return (XSUM_U32)XXH3_64bits_withSeed(buffer, bufferSize, seed);
-}
-static XSUM_U32 localXXH3_64b_secret(const void* buffer, size_t bufferSize, XSUM_U32 seed)
-{
- (void)seed;
- return (XSUM_U32)XXH3_64bits_withSecret(buffer, bufferSize, g_benchSecretBuf, sizeof(g_benchSecretBuf));
-}
-static XSUM_U32 localXXH3_128b(const void* buffer, size_t bufferSize, XSUM_U32 seed)
-{
- (void)seed;
- return (XSUM_U32)(XXH3_128bits(buffer, bufferSize).low64);
-}
-static XSUM_U32 localXXH3_128b_seeded(const void* buffer, size_t bufferSize, XSUM_U32 seed)
-{
- return (XSUM_U32)(XXH3_128bits_withSeed(buffer, bufferSize, seed).low64);
-}
-static XSUM_U32 localXXH3_128b_secret(const void* buffer, size_t bufferSize, XSUM_U32 seed)
-{
- (void)seed;
- return (XSUM_U32)(XXH3_128bits_withSecret(buffer, bufferSize, g_benchSecretBuf, sizeof(g_benchSecretBuf)).low64);
-}
-static XSUM_U32 localXXH3_stream(const void* buffer, size_t bufferSize, XSUM_U32 seed)
-{
- XXH3_state_t state;
- (void)seed;
- XXH3_64bits_reset(&state);
- XXH3_64bits_update(&state, buffer, bufferSize);
- return (XSUM_U32)XXH3_64bits_digest(&state);
-}
-static XSUM_U32 localXXH3_stream_seeded(const void* buffer, size_t bufferSize, XSUM_U32 seed)
-{
- XXH3_state_t state;
- XXH3_INITSTATE(&state);
- XXH3_64bits_reset_withSeed(&state, (XXH64_hash_t)seed);
- XXH3_64bits_update(&state, buffer, bufferSize);
- return (XSUM_U32)XXH3_64bits_digest(&state);
-}
-static XSUM_U32 localXXH128_stream(const void* buffer, size_t bufferSize, XSUM_U32 seed)
-{
- XXH3_state_t state;
- (void)seed;
- XXH3_128bits_reset(&state);
- XXH3_128bits_update(&state, buffer, bufferSize);
- return (XSUM_U32)(XXH3_128bits_digest(&state).low64);
-}
-static XSUM_U32 localXXH128_stream_seeded(const void* buffer, size_t bufferSize, XSUM_U32 seed)
-{
- XXH3_state_t state;
- XXH3_INITSTATE(&state);
- XXH3_128bits_reset_withSeed(&state, (XXH64_hash_t)seed);
- XXH3_128bits_update(&state, buffer, bufferSize);
- return (XSUM_U32)(XXH3_128bits_digest(&state).low64);
-}
-
-
-typedef struct {
- const char* name;
- hashFunction func;
-} hashInfo;
-
-#define NB_HASHFUNC 12
-static const hashInfo g_hashesToBench[NB_HASHFUNC] = {
- { "XXH32", &localXXH32 },
- { "XXH64", &localXXH64 },
- { "XXH3_64b", &localXXH3_64b },
- { "XXH3_64b w/seed", &localXXH3_64b_seeded },
- { "XXH3_64b w/secret", &localXXH3_64b_secret },
- { "XXH128", &localXXH3_128b },
- { "XXH128 w/seed", &localXXH3_128b_seeded },
- { "XXH128 w/secret", &localXXH3_128b_secret },
- { "XXH3_stream", &localXXH3_stream },
- { "XXH3_stream w/seed",&localXXH3_stream_seeded },
- { "XXH128_stream", &localXXH128_stream },
- { "XXH128_stream w/seed",&localXXH128_stream_seeded },
-};
-
-#define NB_TESTFUNC (1 + 2 * NB_HASHFUNC)
-static char g_testIDs[NB_TESTFUNC] = { 0 };
-static const char k_testIDs_default[NB_TESTFUNC] = { 0,
- 1 /*XXH32*/, 0,
- 1 /*XXH64*/, 0,
- 1 /*XXH3*/, 0, 0, 0, 0, 0,
- 1 /*XXH128*/ };
-
-#define HASHNAME_MAX 29
-static void XSUM_benchHash(hashFunction h, const char* hName, int testID,
- const void* buffer, size_t bufferSize)
-{
- XSUM_U32 nbh_perIteration = (XSUM_U32)((300 MB) / (bufferSize+1)) + 1; /* first iteration conservatively aims for 300 MB/s */
- unsigned iterationNb, nbIterations = g_nbIterations + !g_nbIterations /* min 1 */;
- double fastestH = 100000000.;
- assert(HASHNAME_MAX > 2);
- XSUM_logVerbose(2, "\r%80s\r", ""); /* Clean display line */
-
- for (iterationNb = 1; iterationNb <= nbIterations; iterationNb++) {
- XSUM_U32 r=0;
- clock_t cStart;
-
- XSUM_logVerbose(2, "%2u-%-*.*s : %10u ->\r",
- iterationNb,
- HASHNAME_MAX, HASHNAME_MAX, hName,
- (unsigned)bufferSize);
- cStart = clock();
- while (clock() == cStart); /* starts clock() at its exact beginning */
- cStart = clock();
-
- { XSUM_U32 u;
- for (u=0; u<nbh_perIteration; u++)
- r += h(buffer, bufferSize, u);
- }
- if (r==0) XSUM_logVerbose(3,".\r"); /* do something with r to defeat compiler "optimizing" hash away */
-
- { clock_t const nbTicks = XSUM_clockSpan(cStart);
- double const ticksPerHash = ((double)nbTicks / TIMELOOP) / nbh_perIteration;
- /*
- * clock() is the only decent portable timer, but it isn't very
- * precise.
- *
- * Sometimes, this lack of precision is enough that the benchmark
- * finishes before there are enough ticks to get a meaningful result.
- *
- * For example, on a Core 2 Duo (without any sort of Turbo Boost),
- * the imprecise timer caused peculiar results like so:
- *
- * XXH3_64b 4800.0 MB/s // conveniently even
- * XXH3_64b unaligned 4800.0 MB/s
- * XXH3_64b seeded 9600.0 MB/s // magical 2x speedup?!
- * XXH3_64b seeded unaligned 4800.0 MB/s
- *
- * If we sense a suspiciously low number of ticks, we increase the
- * iterations until we can get something meaningful.
- */
- if (nbTicks < TIMELOOP_MIN) {
- /* Not enough time spent in benchmarking, risk of rounding bias */
- if (nbTicks == 0) { /* faster than resolution timer */
- nbh_perIteration *= 100;
- } else {
- /*
- * update nbh_perIteration so that the next round lasts
- * approximately 1 second.
- */
- double nbh_perSecond = (1 / ticksPerHash) + 1;
- if (nbh_perSecond > (double)(4000U<<20)) nbh_perSecond = (double)(4000U<<20); /* avoid overflow */
- nbh_perIteration = (XSUM_U32)nbh_perSecond;
- }
- /* g_nbIterations==0 => quick evaluation, no claim of accuracy */
- if (g_nbIterations>0) {
- iterationNb--; /* new round for a more accurate speed evaluation */
- continue;
- }
- }
- if (ticksPerHash < fastestH) fastestH = ticksPerHash;
- if (fastestH>0.) { /* avoid div by zero */
- XSUM_logVerbose(2, "%2u-%-*.*s : %10u -> %8.0f it/s (%7.1f MB/s) \r",
- iterationNb,
- HASHNAME_MAX, HASHNAME_MAX, hName,
- (unsigned)bufferSize,
- (double)1 / fastestH,
- ((double)bufferSize / (1 MB)) / fastestH);
- } }
- { double nbh_perSecond = (1 / fastestH) + 1;
- if (nbh_perSecond > (double)(4000U<<20)) nbh_perSecond = (double)(4000U<<20); /* avoid overflow */
- nbh_perIteration = (XSUM_U32)nbh_perSecond;
- }
- }
- XSUM_logVerbose(1, "%2i#%-*.*s : %10u -> %8.0f it/s (%7.1f MB/s) \n",
- testID,
- HASHNAME_MAX, HASHNAME_MAX, hName,
- (unsigned)bufferSize,
- (double)1 / fastestH,
- ((double)bufferSize / (1 MB)) / fastestH);
- if (XSUM_logLevel<1)
- XSUM_logVerbose(0, "%u, ", (unsigned)((double)1 / fastestH));
-}
-
-
-/*!
- * XSUM_benchMem():
- * buffer: Must be 16-byte aligned.
- * The real allocated size of buffer is supposed to be >= (bufferSize+3).
- * returns: 0 on success, 1 if error (invalid mode selected)
- */
-static void XSUM_benchMem(const void* buffer, size_t bufferSize)
-{
- assert((((size_t)buffer) & 15) == 0); /* ensure alignment */
- XSUM_fillTestBuffer(g_benchSecretBuf, sizeof(g_benchSecretBuf));
- { int i;
- for (i = 1; i < NB_TESTFUNC; i++) {
- int const hashFuncID = (i-1) / 2;
- assert(g_hashesToBench[hashFuncID].name != NULL);
- if (g_testIDs[i] == 0) continue;
- /* aligned */
- if ((i % 2) == 1) {
- XSUM_benchHash(g_hashesToBench[hashFuncID].func, g_hashesToBench[hashFuncID].name, i, buffer, bufferSize);
- }
- /* unaligned */
- if ((i % 2) == 0) {
- /* Append "unaligned". */
- char* const hashNameBuf = XSUM_strcatDup(g_hashesToBench[hashFuncID].name, " unaligned");
- assert(hashNameBuf != NULL);
- XSUM_benchHash(g_hashesToBench[hashFuncID].func, hashNameBuf, i, ((const char*)buffer)+3, bufferSize);
- free(hashNameBuf);
- }
- } }
-}
-
-static size_t XSUM_selectBenchedSize(const char* fileName)
-{
- XSUM_U64 const inFileSize = XSUM_getFileSize(fileName);
- size_t benchedSize = (size_t) XSUM_findMaxMem(inFileSize);
- if ((XSUM_U64)benchedSize > inFileSize) benchedSize = (size_t)inFileSize;
- if (benchedSize < inFileSize) {
- XSUM_log("Not enough memory for '%s' full size; testing %i MB only...\n", fileName, (int)(benchedSize>>20));
- }
- return benchedSize;
-}
-
-
-static int XSUM_benchFiles(char*const* fileNamesTable, int nbFiles)
-{
- int fileIdx;
- for (fileIdx=0; fileIdx<nbFiles; fileIdx++) {
- const char* const inFileName = fileNamesTable[fileIdx];
- assert(inFileName != NULL);
-
- { FILE* const inFile = XSUM_fopen( inFileName, "rb" );
- size_t const benchedSize = XSUM_selectBenchedSize(inFileName);
- char* const buffer = (char*)calloc(benchedSize+16+3, 1);
- void* const alignedBuffer = (buffer+15) - (((size_t)(buffer+15)) & 0xF); /* align on next 16 bytes */
-
- /* Checks */
- if (inFile==NULL){
- XSUM_log("Error: Could not open '%s': %s.\n", inFileName, strerror(errno));
- free(buffer);
- exit(11);
- }
- if(!buffer) {
- XSUM_log("\nError: Out of memory.\n");
- fclose(inFile);
- exit(12);
- }
-
- /* Fill input buffer */
- { size_t const readSize = fread(alignedBuffer, 1, benchedSize, inFile);
- fclose(inFile);
- if(readSize != benchedSize) {
- XSUM_log("\nError: Could not read '%s': %s.\n", inFileName, strerror(errno));
- free(buffer);
- exit(13);
- } }
-
- /* bench */
- XSUM_benchMem(alignedBuffer, benchedSize);
-
- free(buffer);
- } }
- return 0;
-}
-
-
-static int XSUM_benchInternal(size_t keySize)
-{
- void* const buffer = calloc(keySize+16+3, 1);
- if (buffer == NULL) {
- XSUM_log("\nError: Out of memory.\n");
- exit(12);
- }
-
- { const void* const alignedBuffer = ((char*)buffer+15) - (((size_t)((char*)buffer+15)) & 0xF); /* align on next 16 bytes */
-
- /* bench */
- XSUM_logVerbose(1, "Sample of ");
- if (keySize > 10 KB) {
- XSUM_logVerbose(1, "%u KB", (unsigned)(keySize >> 10));
- } else {
- XSUM_logVerbose(1, "%u bytes", (unsigned)keySize);
- }
- XSUM_logVerbose(1, "... \n");
-
- XSUM_benchMem(alignedBuffer, keySize);
- free(buffer);
- }
- return 0;
-}
-
-/* ********************************************************
-* File Hashing
-**********************************************************/
-
-/* for support of --little-endian display mode */
-static void XSUM_display_LittleEndian(const void* ptr, size_t length)
-{
- const XSUM_U8* const p = (const XSUM_U8*)ptr;
- size_t idx;
- for (idx=length-1; idx<length; idx--) /* intentional underflow to negative to detect end */
- XSUM_output("%02x", p[idx]);
-}
-
-static void XSUM_display_BigEndian(const void* ptr, size_t length)
-{
- const XSUM_U8* const p = (const XSUM_U8*)ptr;
- size_t idx;
- for (idx=0; idx<length; idx++)
- XSUM_output("%02x", p[idx]);
-}
-
-typedef union {
- XXH32_hash_t xxh32;
- XXH64_hash_t xxh64;
- XXH128_hash_t xxh128;
-} Multihash;
-
-/*
- * XSUM_hashStream:
- * Reads data from `inFile`, generating an incremental hash of type hashType,
- * using `buffer` of size `blockSize` for temporary storage.
- */
-static Multihash
-XSUM_hashStream(FILE* inFile,
- AlgoSelected hashType,
- void* buffer, size_t blockSize)
-{
- XXH32_state_t state32;
- XXH64_state_t state64;
- XXH3_state_t state128;
-
- /* Init */
- (void)XXH32_reset(&state32, XXHSUM32_DEFAULT_SEED);
- (void)XXH64_reset(&state64, XXHSUM64_DEFAULT_SEED);
- (void)XXH3_128bits_reset(&state128);
-
- /* Load file & update hash */
- { size_t readSize;
- while ((readSize = fread(buffer, 1, blockSize, inFile)) > 0) {
- switch(hashType)
- {
- case algo_xxh32:
- (void)XXH32_update(&state32, buffer, readSize);
- break;
- case algo_xxh64:
- (void)XXH64_update(&state64, buffer, readSize);
- break;
- case algo_xxh128:
- (void)XXH3_128bits_update(&state128, buffer, readSize);
- break;
- default:
- assert(0);
- }
- }
- if (ferror(inFile)) {
- XSUM_log("Error: a failure occurred reading the input file.\n");
- exit(1);
- } }
-
- { Multihash finalHash = {0};
- switch(hashType)
- {
- case algo_xxh32:
- finalHash.xxh32 = XXH32_digest(&state32);
- break;
- case algo_xxh64:
- finalHash.xxh64 = XXH64_digest(&state64);
- break;
- case algo_xxh128:
- finalHash.xxh128 = XXH3_128bits_digest(&state128);
- break;
- default:
- assert(0);
- }
- return finalHash;
- }
-}
-
- /* algo_xxh32, algo_xxh64, algo_xxh128 */
-static const char* XSUM_algoName[] = { "XXH32", "XXH64", "XXH128" };
-static const char* XSUM_algoLE_name[] = { "XXH32_LE", "XXH64_LE", "XXH128_LE" };
-static const size_t XSUM_algoLength[] = { 4, 8, 16 };
-
-#define XSUM_TABLE_ELT_SIZE(table) (sizeof(table) / sizeof(*table))
-
-typedef void (*XSUM_displayHash_f)(const void*, size_t); /* display function signature */
-
-static void XSUM_printLine_BSD_internal(const char* filename,
- const void* canonicalHash, const AlgoSelected hashType,
- const char* algoString[],
- XSUM_displayHash_f f_displayHash)
-{
- assert(0 <= hashType && hashType <= XSUM_TABLE_ELT_SIZE(XSUM_algoName));
- { const char* const typeString = algoString[hashType];
- const size_t hashLength = XSUM_algoLength[hashType];
- XSUM_output("%s (%s) = ", typeString, filename);
- f_displayHash(canonicalHash, hashLength);
- XSUM_output("\n");
-} }
-
-static void XSUM_printLine_BSD_LE(const char* filename, const void* canonicalHash, const AlgoSelected hashType)
-{
- XSUM_printLine_BSD_internal(filename, canonicalHash, hashType, XSUM_algoLE_name, XSUM_display_LittleEndian);
-}
-
-static void XSUM_printLine_BSD(const char* filename, const void* canonicalHash, const AlgoSelected hashType)
-{
- XSUM_printLine_BSD_internal(filename, canonicalHash, hashType, XSUM_algoName, XSUM_display_BigEndian);
-}
-
-static void XSUM_printLine_GNU_internal(const char* filename,
- const void* canonicalHash, const AlgoSelected hashType,
- XSUM_displayHash_f f_displayHash)
-{
- assert(0 <= hashType && hashType <= XSUM_TABLE_ELT_SIZE(XSUM_algoName));
- { const size_t hashLength = XSUM_algoLength[hashType];
- f_displayHash(canonicalHash, hashLength);
- XSUM_output(" %s\n", filename);
-} }
-
-static void XSUM_printLine_GNU(const char* filename,
- const void* canonicalHash, const AlgoSelected hashType)
-{
- XSUM_printLine_GNU_internal(filename, canonicalHash, hashType, XSUM_display_BigEndian);
-}
-
-static void XSUM_printLine_GNU_LE(const char* filename,
- const void* canonicalHash, const AlgoSelected hashType)
-{
- XSUM_printLine_GNU_internal(filename, canonicalHash, hashType, XSUM_display_LittleEndian);
-}
-
-typedef enum { big_endian, little_endian} Display_endianess;
-
-typedef enum { display_gnu, display_bsd } Display_convention;
-
-typedef void (*XSUM_displayLine_f)(const char*, const void*, AlgoSelected); /* line display signature */
-
-static XSUM_displayLine_f XSUM_kDisplayLine_fTable[2][2] = {
- { XSUM_printLine_GNU, XSUM_printLine_GNU_LE },
- { XSUM_printLine_BSD, XSUM_printLine_BSD_LE }
-};
-
-static int XSUM_hashFile(const char* fileName,
- const AlgoSelected hashType,
- const Display_endianess displayEndianess,
- const Display_convention convention)
-{
- size_t const blockSize = 64 KB;
- XSUM_displayLine_f const f_displayLine = XSUM_kDisplayLine_fTable[convention][displayEndianess];
- FILE* inFile;
- Multihash hashValue;
- assert(displayEndianess==big_endian || displayEndianess==little_endian);
- assert(convention==display_gnu || convention==display_bsd);
-
- /* Check file existence */
- if (fileName == stdinName) {
- inFile = stdin;
- fileName = "stdin";
- XSUM_setBinaryMode(stdin);
- } else {
- if (XSUM_isDirectory(fileName)) {
- XSUM_log("xxhsum: %s: Is a directory \n", fileName);
- return 1;
- }
- inFile = XSUM_fopen( fileName, "rb" );
- if (inFile==NULL) {
- XSUM_log("Error: Could not open '%s': %s. \n", fileName, strerror(errno));
- return 1;
- } }
-
- /* Memory allocation & streaming */
- { void* const buffer = malloc(blockSize);
- if (buffer == NULL) {
- XSUM_log("\nError: Out of memory.\n");
- fclose(inFile);
- return 1;
- }
-
- /* Stream file & update hash */
- hashValue = XSUM_hashStream(inFile, hashType, buffer, blockSize);
-
- fclose(inFile);
- free(buffer);
- }
-
- /* display Hash value in selected format */
- switch(hashType)
- {
- case algo_xxh32:
- { XXH32_canonical_t hcbe32;
- (void)XXH32_canonicalFromHash(&hcbe32, hashValue.xxh32);
- f_displayLine(fileName, &hcbe32, hashType);
- break;
- }
- case algo_xxh64:
- { XXH64_canonical_t hcbe64;
- (void)XXH64_canonicalFromHash(&hcbe64, hashValue.xxh64);
- f_displayLine(fileName, &hcbe64, hashType);
- break;
- }
- case algo_xxh128:
- { XXH128_canonical_t hcbe128;
- (void)XXH128_canonicalFromHash(&hcbe128, hashValue.xxh128);
- f_displayLine(fileName, &hcbe128, hashType);
- break;
- }
- default:
- assert(0); /* not possible */
- }
-
- return 0;
-}
-
-
-/*
- * XSUM_hashFiles:
- * If fnTotal==0, read from stdin instead.
- */
-static int XSUM_hashFiles(char*const * fnList, int fnTotal,
- AlgoSelected hashType,
- Display_endianess displayEndianess,
- Display_convention convention)
-{
- int fnNb;
- int result = 0;
-
- if (fnTotal==0)
- return XSUM_hashFile(stdinName, hashType, displayEndianess, convention);
-
- for (fnNb=0; fnNb<fnTotal; fnNb++)
- result |= XSUM_hashFile(fnList[fnNb], hashType, displayEndianess, convention);
- XSUM_logVerbose(2, "\r%70s\r", "");
- return result;
-}
-
-
-typedef enum {
- GetLine_ok,
- GetLine_eof,
- GetLine_exceedMaxLineLength,
- GetLine_outOfMemory
-} GetLineResult;
-
-typedef enum {
- CanonicalFromString_ok,
- CanonicalFromString_invalidFormat
-} CanonicalFromStringResult;
-
-typedef enum {
- ParseLine_ok,
- ParseLine_invalidFormat
-} ParseLineResult;
-
-typedef enum {
- LineStatus_hashOk,
- LineStatus_hashFailed,
- LineStatus_failedToOpen
-} LineStatus;
-
-typedef union {
- XXH32_canonical_t xxh32;
- XXH64_canonical_t xxh64;
- XXH128_canonical_t xxh128;
-} Canonical;
-
-typedef struct {
- Canonical canonical;
- const char* filename;
- int xxhBits; /* canonical type: 32:xxh32, 64:xxh64, 128:xxh128 */
-} ParsedLine;
-
-typedef struct {
- unsigned long nProperlyFormattedLines;
- unsigned long nImproperlyFormattedLines;
- unsigned long nMismatchedChecksums;
- unsigned long nOpenOrReadFailures;
- unsigned long nMixedFormatLines;
- int quit;
-} ParseFileReport;
-
-typedef struct {
- const char* inFileName;
- FILE* inFile;
- int lineMax;
- char* lineBuf;
- size_t blockSize;
- char* blockBuf;
- XSUM_U32 strictMode;
- XSUM_U32 statusOnly;
- XSUM_U32 warn;
- XSUM_U32 quiet;
- ParseFileReport report;
-} ParseFileArg;
-
-
-/*
- * Reads a line from stream `inFile`.
- * Returns GetLine_ok, if it reads line successfully.
- * Returns GetLine_eof, if stream reaches EOF.
- * Returns GetLine_exceedMaxLineLength, if line length is longer than MAX_LINE_LENGTH.
- * Returns GetLine_outOfMemory, if line buffer memory allocation failed.
- */
-static GetLineResult XSUM_getLine(char** lineBuf, int* lineMax, FILE* inFile)
-{
- GetLineResult result = GetLine_ok;
- size_t len = 0;
-
- if ((*lineBuf == NULL) || (*lineMax<1)) {
- free(*lineBuf); /* in case it's != NULL */
- *lineMax = 0;
- *lineBuf = (char*)malloc(DEFAULT_LINE_LENGTH);
- if(*lineBuf == NULL) return GetLine_outOfMemory;
- *lineMax = DEFAULT_LINE_LENGTH;
- }
-
- for (;;) {
- const int c = fgetc(inFile);
- if (c == EOF) {
- /*
- * If we meet EOF before first character, returns GetLine_eof,
- * otherwise GetLine_ok.
- */
- if (len == 0) result = GetLine_eof;
- break;
- }
-
- /* Make enough space for len+1 (for final NUL) bytes. */
- if (len+1 >= (size_t)*lineMax) {
- char* newLineBuf = NULL;
- size_t newBufSize = (size_t)*lineMax;
-
- newBufSize += (newBufSize/2) + 1; /* x 1.5 */
- if (newBufSize > MAX_LINE_LENGTH) newBufSize = MAX_LINE_LENGTH;
- if (len+1 >= newBufSize) return GetLine_exceedMaxLineLength;
-
- newLineBuf = (char*) realloc(*lineBuf, newBufSize);
- if (newLineBuf == NULL) return GetLine_outOfMemory;
-
- *lineBuf = newLineBuf;
- *lineMax = (int)newBufSize;
- }
-
- if (c == '\n') break;
- (*lineBuf)[len++] = (char) c;
- }
-
- (*lineBuf)[len] = '\0';
- return result;
-}
-
-
-/*
- * Converts one hexadecimal character to integer.
- * Returns -1 if the given character is not hexadecimal.
- */
-static int charToHex(char c)
-{
- int result = -1;
- if (c >= '0' && c <= '9') {
- result = (int) (c - '0');
- } else if (c >= 'A' && c <= 'F') {
- result = (int) (c - 'A') + 0x0a;
- } else if (c >= 'a' && c <= 'f') {
- result = (int) (c - 'a') + 0x0a;
- }
- return result;
-}
-
-
-/*
- * Converts canonical ASCII hexadecimal string `hashStr`
- * to the big endian binary representation in unsigned char array `dst`.
- *
- * Returns CanonicalFromString_invalidFormat if hashStr is not well formatted.
- * Returns CanonicalFromString_ok if hashStr is parsed successfully.
- */
-static CanonicalFromStringResult XSUM_canonicalFromString(unsigned char* dst,
- size_t dstSize,
- const char* hashStr,
- int reverseBytes)
-{
- size_t i;
- for (i = 0; i < dstSize; ++i) {
- int h0, h1;
- size_t j = reverseBytes ? dstSize - i - 1 : i;
-
- h0 = charToHex(hashStr[j*2 + 0]);
- if (h0 < 0) return CanonicalFromString_invalidFormat;
-
- h1 = charToHex(hashStr[j*2 + 1]);
- if (h1 < 0) return CanonicalFromString_invalidFormat;
-
- dst[i] = (unsigned char) ((h0 << 4) | h1);
- }
- return CanonicalFromString_ok;
-}
-
-
-/*
- * Parse single line of xxHash checksum file.
- * Returns ParseLine_invalidFormat if the line is not well formatted.
- * Returns ParseLine_ok if the line is parsed successfully.
- * And members of XSUM_parseLine will be filled by parsed values.
- *
- * - line must be terminated with '\0' without a trailing newline.
- * - Since parsedLine.filename will point within given argument `line`,
- * users must keep `line`s content when they are using parsedLine.
- * - The line may be modified to carve up the information it contains.
- *
- * xxHash checksum lines should have the following format:
- *
- * <8, 16, or 32 hexadecimal char> <space> <space> <filename...> <'\0'>
- *
- * or:
- *
- * <algorithm> <' ('> <filename> <') = '> <hexstring> <'\0'>
- */
-static ParseLineResult XSUM_parseLine(ParsedLine* parsedLine, char* line, int rev)
-{
- char* const firstSpace = strchr(line, ' ');
- const char* hash_ptr;
- size_t hash_len;
-
- parsedLine->filename = NULL;
- parsedLine->xxhBits = 0;
-
- if (firstSpace == NULL || !firstSpace[1]) return ParseLine_invalidFormat;
-
- if (firstSpace[1] == '(') {
- char* lastSpace = strrchr(line, ' ');
- if (lastSpace - firstSpace < 5) return ParseLine_invalidFormat;
- if (lastSpace[-1] != '=' || lastSpace[-2] != ' ' || lastSpace[-3] != ')') return ParseLine_invalidFormat;
- lastSpace[-3] = '\0'; /* Terminate the filename */
- *firstSpace = '\0';
- rev = strstr(line, "_LE") != NULL; /* was output little-endian */
- hash_ptr = lastSpace + 1;
- hash_len = strlen(hash_ptr);
- /* NOTE: This currently ignores the hash description at the start of the string.
- * In the future we should parse it and verify that it matches the hash length.
- * It could also be used to allow both XXH64 & XXH3_64bits to be differentiated. */
- } else {
- hash_ptr = line;
- hash_len = (size_t)(firstSpace - line);
- }
-
- switch (hash_len)
- {
- case 8:
- { XXH32_canonical_t* xxh32c = &parsedLine->canonical.xxh32;
- if (XSUM_canonicalFromString(xxh32c->digest, sizeof(xxh32c->digest), hash_ptr, rev)
- != CanonicalFromString_ok) {
- return ParseLine_invalidFormat;
- }
- parsedLine->xxhBits = 32;
- break;
- }
-
- case 16:
- { XXH64_canonical_t* xxh64c = &parsedLine->canonical.xxh64;
- if (XSUM_canonicalFromString(xxh64c->digest, sizeof(xxh64c->digest), hash_ptr, rev)
- != CanonicalFromString_ok) {
- return ParseLine_invalidFormat;
- }
- parsedLine->xxhBits = 64;
- break;
- }
-
- case 32:
- { XXH128_canonical_t* xxh128c = &parsedLine->canonical.xxh128;
- if (XSUM_canonicalFromString(xxh128c->digest, sizeof(xxh128c->digest), hash_ptr, rev)
- != CanonicalFromString_ok) {
- return ParseLine_invalidFormat;
- }
- parsedLine->xxhBits = 128;
- break;
- }
-
- default:
- return ParseLine_invalidFormat;
- break;
- }
-
- /* note : skipping second separation character, which can be anything,
- * allowing insertion of custom markers such as '*' */
- parsedLine->filename = firstSpace + 2;
- return ParseLine_ok;
-}
-
-
-/*!
- * Parse xxHash checksum file.
- */
-static void XSUM_parseFile1(ParseFileArg* XSUM_parseFileArg, int rev)
-{
- const char* const inFileName = XSUM_parseFileArg->inFileName;
- ParseFileReport* const report = &XSUM_parseFileArg->report;
-
- unsigned long lineNumber = 0;
- memset(report, 0, sizeof(*report));
-
- while (!report->quit) {
- LineStatus lineStatus = LineStatus_hashFailed;
- ParsedLine parsedLine;
- memset(&parsedLine, 0, sizeof(parsedLine));
-
- lineNumber++;
- if (lineNumber == 0) {
- /* This is unlikely happen, but md5sum.c has this error check. */
- XSUM_log("%s: Error: Too many checksum lines\n", inFileName);
- report->quit = 1;
- break;
- }
-
- { GetLineResult const XSUM_getLineResult = XSUM_getLine(&XSUM_parseFileArg->lineBuf,
- &XSUM_parseFileArg->lineMax,
- XSUM_parseFileArg->inFile);
- if (XSUM_getLineResult != GetLine_ok) {
- if (XSUM_getLineResult == GetLine_eof) break;
-
- switch (XSUM_getLineResult)
- {
- case GetLine_ok:
- case GetLine_eof:
- /* These cases never happen. See above XSUM_getLineResult related "if"s.
- They exist just for make gcc's -Wswitch-enum happy. */
- assert(0);
- break;
-
- default:
- XSUM_log("%s:%lu: Error: Unknown error.\n", inFileName, lineNumber);
- break;
-
- case GetLine_exceedMaxLineLength:
- XSUM_log("%s:%lu: Error: Line too long.\n", inFileName, lineNumber);
- break;
-
- case GetLine_outOfMemory:
- XSUM_log("%s:%lu: Error: Out of memory.\n", inFileName, lineNumber);
- break;
- }
- report->quit = 1;
- break;
- } }
-
- if (XSUM_parseLine(&parsedLine, XSUM_parseFileArg->lineBuf, rev) != ParseLine_ok) {
- report->nImproperlyFormattedLines++;
- if (XSUM_parseFileArg->warn) {
- XSUM_log("%s:%lu: Error: Improperly formatted checksum line.\n",
- inFileName, lineNumber);
- }
- continue;
- }
-
- report->nProperlyFormattedLines++;
-
- do {
- FILE* const fp = XSUM_fopen(parsedLine.filename, "rb");
- if (fp == NULL) {
- lineStatus = LineStatus_failedToOpen;
- break;
- }
- lineStatus = LineStatus_hashFailed;
- switch (parsedLine.xxhBits)
- {
- case 32:
- { Multihash const xxh = XSUM_hashStream(fp, algo_xxh32, XSUM_parseFileArg->blockBuf, XSUM_parseFileArg->blockSize);
- if (xxh.xxh32 == XXH32_hashFromCanonical(&parsedLine.canonical.xxh32)) {
- lineStatus = LineStatus_hashOk;
- } }
- break;
-
- case 64:
- { Multihash const xxh = XSUM_hashStream(fp, algo_xxh64, XSUM_parseFileArg->blockBuf, XSUM_parseFileArg->blockSize);
- if (xxh.xxh64 == XXH64_hashFromCanonical(&parsedLine.canonical.xxh64)) {
- lineStatus = LineStatus_hashOk;
- } }
- break;
-
- case 128:
- { Multihash const xxh = XSUM_hashStream(fp, algo_xxh128, XSUM_parseFileArg->blockBuf, XSUM_parseFileArg->blockSize);
- if (XXH128_isEqual(xxh.xxh128, XXH128_hashFromCanonical(&parsedLine.canonical.xxh128))) {
- lineStatus = LineStatus_hashOk;
- } }
- break;
-
- default:
- break;
- }
- fclose(fp);
- } while (0);
-
- switch (lineStatus)
- {
- default:
- XSUM_log("%s: Error: Unknown error.\n", inFileName);
- report->quit = 1;
- break;
-
- case LineStatus_failedToOpen:
- report->nOpenOrReadFailures++;
- if (!XSUM_parseFileArg->statusOnly) {
- XSUM_output("%s:%lu: Could not open or read '%s': %s.\n",
- inFileName, lineNumber, parsedLine.filename, strerror(errno));
- }
- break;
-
- case LineStatus_hashOk:
- case LineStatus_hashFailed:
- { int b = 1;
- if (lineStatus == LineStatus_hashOk) {
- /* If --quiet is specified, don't display "OK" */
- if (XSUM_parseFileArg->quiet) b = 0;
- } else {
- report->nMismatchedChecksums++;
- }
-
- if (b && !XSUM_parseFileArg->statusOnly) {
- XSUM_output("%s: %s\n", parsedLine.filename
- , lineStatus == LineStatus_hashOk ? "OK" : "FAILED");
- } }
- break;
- }
- } /* while (!report->quit) */
-}
-
-
-/* Parse xxHash checksum file.
- * Returns 1, if all procedures were succeeded.
- * Returns 0, if any procedures was failed.
- *
- * If strictMode != 0, return error code if any line is invalid.
- * If statusOnly != 0, don't generate any output.
- * If warn != 0, print a warning message to stderr.
- * If quiet != 0, suppress "OK" line.
- *
- * "All procedures are succeeded" means:
- * - Checksum file contains at least one line and less than SIZE_T_MAX lines.
- * - All files are properly opened and read.
- * - All hash values match with its content.
- * - (strict mode) All lines in checksum file are consistent and well formatted.
- */
-static int XSUM_checkFile(const char* inFileName,
- const Display_endianess displayEndianess,
- XSUM_U32 strictMode,
- XSUM_U32 statusOnly,
- XSUM_U32 warn,
- XSUM_U32 quiet)
-{
- int result = 0;
- FILE* inFile = NULL;
- ParseFileArg XSUM_parseFileArgBody;
- ParseFileArg* const XSUM_parseFileArg = &XSUM_parseFileArgBody;
- ParseFileReport* const report = &XSUM_parseFileArg->report;
-
- /* note: stdinName is special constant pointer. It is not a string. */
- if (inFileName == stdinName) {
- /*
- * Note: Since we expect text input for xxhash -c mode,
- * we don't set binary mode for stdin.
- */
- inFileName = "stdin";
- inFile = stdin;
- } else {
- inFile = XSUM_fopen( inFileName, "rt" );
- }
-
- if (inFile == NULL) {
- XSUM_log("Error: Could not open '%s': %s\n", inFileName, strerror(errno));
- return 0;
- }
-
- XSUM_parseFileArg->inFileName = inFileName;
- XSUM_parseFileArg->inFile = inFile;
- XSUM_parseFileArg->lineMax = DEFAULT_LINE_LENGTH;
- XSUM_parseFileArg->lineBuf = (char*) malloc((size_t)XSUM_parseFileArg->lineMax);
- XSUM_parseFileArg->blockSize = 64 * 1024;
- XSUM_parseFileArg->blockBuf = (char*) malloc(XSUM_parseFileArg->blockSize);
- XSUM_parseFileArg->strictMode = strictMode;
- XSUM_parseFileArg->statusOnly = statusOnly;
- XSUM_parseFileArg->warn = warn;
- XSUM_parseFileArg->quiet = quiet;
-
- if ( (XSUM_parseFileArg->lineBuf == NULL)
- || (XSUM_parseFileArg->blockBuf == NULL) ) {
- XSUM_log("Error: : memory allocation failed \n");
- exit(1);
- }
- XSUM_parseFile1(XSUM_parseFileArg, displayEndianess != big_endian);
-
- free(XSUM_parseFileArg->blockBuf);
- free(XSUM_parseFileArg->lineBuf);
-
- if (inFile != stdin) fclose(inFile);
-
- /* Show error/warning messages. All messages are copied from md5sum.c
- */
- if (report->nProperlyFormattedLines == 0) {
- XSUM_log("%s: no properly formatted xxHash checksum lines found\n", inFileName);
- } else if (!statusOnly) {
- if (report->nImproperlyFormattedLines) {
- XSUM_output("%lu %s improperly formatted\n"
- , report->nImproperlyFormattedLines
- , report->nImproperlyFormattedLines == 1 ? "line is" : "lines are");
- }
- if (report->nOpenOrReadFailures) {
- XSUM_output("%lu listed %s could not be read\n"
- , report->nOpenOrReadFailures
- , report->nOpenOrReadFailures == 1 ? "file" : "files");
- }
- if (report->nMismatchedChecksums) {
- XSUM_output("%lu computed %s did NOT match\n"
- , report->nMismatchedChecksums
- , report->nMismatchedChecksums == 1 ? "checksum" : "checksums");
- } }
-
- /* Result (exit) code logic is copied from
- * gnu coreutils/src/md5sum.c digest_check() */
- result = report->nProperlyFormattedLines != 0
- && report->nMismatchedChecksums == 0
- && report->nOpenOrReadFailures == 0
- && (!strictMode || report->nImproperlyFormattedLines == 0)
- && report->quit == 0;
- return result;
-}
-
-
-static int XSUM_checkFiles(char*const* fnList, int fnTotal,
- const Display_endianess displayEndianess,
- XSUM_U32 strictMode,
- XSUM_U32 statusOnly,
- XSUM_U32 warn,
- XSUM_U32 quiet)
-{
- int ok = 1;
-
- /* Special case for stdinName "-",
- * note: stdinName is not a string. It's special pointer. */
- if (fnTotal==0) {
- ok &= XSUM_checkFile(stdinName, displayEndianess, strictMode, statusOnly, warn, quiet);
- } else {
- int fnNb;
- for (fnNb=0; fnNb<fnTotal; fnNb++)
- ok &= XSUM_checkFile(fnList[fnNb], displayEndianess, strictMode, statusOnly, warn, quiet);
- }
- return ok ? 0 : 1;
-}
-
-
-/* ********************************************************
-* Main
-**********************************************************/
-
-static int XSUM_usage(const char* exename)
-{
- XSUM_log( WELCOME_MESSAGE(exename) );
- XSUM_log( "Print or verify checksums using fast non-cryptographic algorithm xxHash \n\n" );
- XSUM_log( "Usage: %s [options] [files] \n\n", exename);
- XSUM_log( "When no filename provided or when '-' is provided, uses stdin as input. \n");
- XSUM_log( "Options: \n");
- XSUM_log( " -H# algorithm selection: 0,1,2 or 32,64,128 (default: %i) \n", (int)g_defaultAlgo);
- XSUM_log( " -c, --check read xxHash checksum from [files] and check them \n");
- XSUM_log( " -h, --help display a long help page about advanced options \n");
- return 0;
-}
-
-
-static int XSUM_usage_advanced(const char* exename)
-{
- XSUM_usage(exename);
- XSUM_log( "Advanced :\n");
- XSUM_log( " -V, --version Display version information \n");
- XSUM_log( " --tag Produce BSD-style checksum lines \n");
- XSUM_log( " --little-endian Checksum values use little endian convention (default: big endian) \n");
- XSUM_log( " -b Run benchmark \n");
- XSUM_log( " -b# Bench only algorithm variant # \n");
- XSUM_log( " -i# Number of times to run the benchmark (default: %u) \n", (unsigned)g_nbIterations);
- XSUM_log( " -q, --quiet Don't display version header in benchmark mode \n");
- XSUM_log( "\n");
- XSUM_log( "The following four options are useful only when verifying checksums (-c): \n");
- XSUM_log( " -q, --quiet Don't print OK for each successfully verified file \n");
- XSUM_log( " --status Don't output anything, status code shows success \n");
- XSUM_log( " --strict Exit non-zero for improperly formatted checksum lines \n");
- XSUM_log( " --warn Warn about improperly formatted checksum lines \n");
- return 0;
-}
-
-static int XSUM_badusage(const char* exename)
-{
- XSUM_log("Wrong parameters\n\n");
- XSUM_usage(exename);
- return 1;
-}
-
-static void errorOut(const char* msg)
-{
- XSUM_log("%s \n", msg);
- exit(1);
-}
-
-static const char* XSUM_lastNameFromPath(const char* path)
-{
- const char* name = path;
- if (strrchr(name, '/')) name = strrchr(name, '/') + 1;
- if (strrchr(name, '\\')) name = strrchr(name, '\\') + 1; /* windows */
- return name;
-}
-
-/*!
- * XSUM_readU32FromCharChecked():
- * @return 0 if success, and store the result in *value.
- * Allows and interprets K, KB, KiB, M, MB and MiB suffix.
- * Will also modify `*stringPtr`, advancing it to position where it stopped reading.
- * @return 1 if an overflow error occurs
- */
-static int XSUM_readU32FromCharChecked(const char** stringPtr, XSUM_U32* value)
-{
- static const XSUM_U32 max = (((XSUM_U32)(-1)) / 10) - 1;
- XSUM_U32 result = 0;
- while ((**stringPtr >='0') && (**stringPtr <='9')) {
- if (result > max) return 1; /* overflow error */
- result *= 10;
- result += (XSUM_U32)(**stringPtr - '0');
- (*stringPtr)++ ;
- }
- if ((**stringPtr=='K') || (**stringPtr=='M')) {
- XSUM_U32 const maxK = ((XSUM_U32)(-1)) >> 10;
- if (result > maxK) return 1; /* overflow error */
- result <<= 10;
- if (**stringPtr=='M') {
- if (result > maxK) return 1; /* overflow error */
- result <<= 10;
- }
- (*stringPtr)++; /* skip `K` or `M` */
- if (**stringPtr=='i') (*stringPtr)++;
- if (**stringPtr=='B') (*stringPtr)++;
- }
- *value = result;
- return 0;
-}
-
-/*!
- * XSUM_readU32FromChar():
- * @return: unsigned integer value read from input in `char` format.
- * allows and interprets K, KB, KiB, M, MB and MiB suffix.
- * Will also modify `*stringPtr`, advancing it to position where it stopped reading.
- * Note: function will exit() program if digit sequence overflows
- */
-static XSUM_U32 XSUM_readU32FromChar(const char** stringPtr) {
- XSUM_U32 result;
- if (XSUM_readU32FromCharChecked(stringPtr, &result)) {
- static const char errorMsg[] = "Error: numeric value too large";
- errorOut(errorMsg);
- }
- return result;
-}
-
-XSUM_API int XSUM_main(int argc, char* argv[])
-{
- int i, filenamesStart = 0;
- const char* const exename = XSUM_lastNameFromPath(argv[0]);
- XSUM_U32 benchmarkMode = 0;
- XSUM_U32 fileCheckMode = 0;
- XSUM_U32 strictMode = 0;
- XSUM_U32 statusOnly = 0;
- XSUM_U32 warn = 0;
- int explicitStdin = 0;
- XSUM_U32 selectBenchIDs= 0; /* 0 == use default k_testIDs_default, kBenchAll == bench all */
- static const XSUM_U32 kBenchAll = 99;
- size_t keySize = XSUM_DEFAULT_SAMPLE_SIZE;
- AlgoSelected algo = g_defaultAlgo;
- Display_endianess displayEndianess = big_endian;
- Display_convention convention = display_gnu;
-
- /* special case: xxhNNsum default to NN bits checksum */
- if (strstr(exename, "xxh32sum") != NULL) algo = g_defaultAlgo = algo_xxh32;
- if (strstr(exename, "xxh64sum") != NULL) algo = g_defaultAlgo = algo_xxh64;
- if (strstr(exename, "xxh128sum") != NULL) algo = g_defaultAlgo = algo_xxh128;
-
- for (i=1; i<argc; i++) {
- const char* argument = argv[i];
- assert(argument != NULL);
-
- if (!strcmp(argument, "--check")) { fileCheckMode = 1; continue; }
- if (!strcmp(argument, "--benchmark-all")) { benchmarkMode = 1; selectBenchIDs = kBenchAll; continue; }
- if (!strcmp(argument, "--bench-all")) { benchmarkMode = 1; selectBenchIDs = kBenchAll; continue; }
- if (!strcmp(argument, "--quiet")) { XSUM_logLevel--; continue; }
- if (!strcmp(argument, "--little-endian")) { displayEndianess = little_endian; continue; }
- if (!strcmp(argument, "--strict")) { strictMode = 1; continue; }
- if (!strcmp(argument, "--status")) { statusOnly = 1; continue; }
- if (!strcmp(argument, "--warn")) { warn = 1; continue; }
- if (!strcmp(argument, "--help")) { return XSUM_usage_advanced(exename); }
- if (!strcmp(argument, "--version")) { XSUM_log(FULL_WELCOME_MESSAGE(exename)); XSUM_sanityCheck(); return 0; }
- if (!strcmp(argument, "--tag")) { convention = display_bsd; continue; }
-
- if (!strcmp(argument, "--")) {
- if (filenamesStart==0 && i!=argc-1) filenamesStart=i+1; /* only supports a continuous list of filenames */
- break; /* treat rest of arguments as strictly file names */
- }
- if (*argument != '-') {
- if (filenamesStart==0) filenamesStart=i; /* only supports a continuous list of filenames */
- break; /* treat rest of arguments as strictly file names */
- }
-
- /* command selection */
- argument++; /* note: *argument=='-' */
- if (*argument == 0) explicitStdin = 1;
-
- while (*argument != 0) {
- switch(*argument)
- {
- /* Display version */
- case 'V':
- XSUM_log(FULL_WELCOME_MESSAGE(exename)); return 0;
-
- /* Display help on XSUM_usage */
- case 'h':
- return XSUM_usage_advanced(exename);
-
- /* select hash algorithm */
- case 'H': argument++;
- switch(XSUM_readU32FromChar(&argument)) {
- case 0 :
- case 32: algo = algo_xxh32; break;
- case 1 :
- case 64: algo = algo_xxh64; break;
- case 2 :
- case 128: algo = algo_xxh128; break;
- default:
- return XSUM_badusage(exename);
- }
- break;
-
- /* File check mode */
- case 'c':
- fileCheckMode=1;
- argument++;
- break;
-
- /* Warning mode (file check mode only, alias of "--warning") */
- case 'w':
- warn=1;
- argument++;
- break;
-
- /* Trigger benchmark mode */
- case 'b':
- argument++;
- benchmarkMode = 1;
- do {
- if (*argument == ',') argument++;
- selectBenchIDs = XSUM_readU32FromChar(&argument); /* select one specific test */
- if (selectBenchIDs < NB_TESTFUNC) {
- g_testIDs[selectBenchIDs] = 1;
- } else
- selectBenchIDs = kBenchAll;
- } while (*argument == ',');
- break;
-
- /* Modify Nb Iterations (benchmark only) */
- case 'i':
- argument++;
- g_nbIterations = XSUM_readU32FromChar(&argument);
- break;
-
- /* Modify Block size (benchmark only) */
- case 'B':
- argument++;
- keySize = XSUM_readU32FromChar(&argument);
- break;
-
- /* Modify verbosity of benchmark output (hidden option) */
- case 'q':
- argument++;
- XSUM_logLevel--;
- break;
-
- default:
- return XSUM_badusage(exename);
- }
- }
- } /* for(i=1; i<argc; i++) */
-
- /* Check benchmark mode */
- if (benchmarkMode) {
- XSUM_logVerbose(2, FULL_WELCOME_MESSAGE(exename) );
- XSUM_sanityCheck();
- if (selectBenchIDs == 0) memcpy(g_testIDs, k_testIDs_default, sizeof(g_testIDs));
- if (selectBenchIDs == kBenchAll) memset(g_testIDs, 1, sizeof(g_testIDs));
- if (filenamesStart==0) return XSUM_benchInternal(keySize);
- return XSUM_benchFiles(argv+filenamesStart, argc-filenamesStart);
- }
-
- /* Check if input is defined as console; trigger an error in this case */
- if ( (filenamesStart==0) && XSUM_isConsole(stdin) && !explicitStdin)
- return XSUM_badusage(exename);
-
- if (filenamesStart==0) filenamesStart = argc;
- if (fileCheckMode) {
- return XSUM_checkFiles(argv+filenamesStart, argc-filenamesStart,
- displayEndianess, strictMode, statusOnly, warn, (XSUM_logLevel < 2) /*quiet*/);
- } else {
- return XSUM_hashFiles(argv+filenamesStart, argc-filenamesStart, algo, displayEndianess, convention);
- }
-}
diff --git a/tools/bazel.rc b/tools/bazel.rc
index baf3c3df5b..480fdcbeb5 100644
--- a/tools/bazel.rc
+++ b/tools/bazel.rc
@@ -103,4 +103,4 @@ build:mutrace --copt=-DNDEBUG
build:mutrace --linkopt=-rdynamic
# Compile database generation config
-build:compdb --build_tag_filters=-nocompdb
+build:compdb --build_tag_filters=-nocompdb --features=-layering_check
diff --git a/tools/buildgen/_mako_renderer.py b/tools/buildgen/_mako_renderer.py
index 77c3c49fd2..568e6728f1 100755
--- a/tools/buildgen/_mako_renderer.py
+++ b/tools/buildgen/_mako_renderer.py
@@ -26,11 +26,11 @@ import shutil
import sys
from typing import List
-import yaml
from mako import exceptions
from mako.lookup import TemplateLookup
from mako.runtime import Context
from mako.template import Template
+import yaml
PROJECT_ROOT = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..",
"..")
diff --git a/tools/buildgen/_utils.py b/tools/buildgen/_utils.py
index 875d37164d..b9f39f5d81 100644
--- a/tools/buildgen/_utils.py
+++ b/tools/buildgen/_utils.py
@@ -14,11 +14,11 @@
# limitations under the License.
"""Utility functions for build file generation scripts."""
+import importlib.util
import os
import sys
import types
-import importlib.util
-from typing import Any, Union, Mapping, List
+from typing import Any, List, Mapping, Union
def import_python_module(path: str) -> types.ModuleType:
diff --git a/tools/buildgen/build_cleaner.py b/tools/buildgen/build_cleaner.py
index 19bcee63a5..bb1fa6e28e 100755
--- a/tools/buildgen/build_cleaner.py
+++ b/tools/buildgen/build_cleaner.py
@@ -18,6 +18,7 @@
import collections
import os
import sys
+
import yaml
TEST = (os.environ.get('TEST', 'false') == 'true')
diff --git a/tools/buildgen/extract_metadata_from_bazel_xml.py b/tools/buildgen/extract_metadata_from_bazel_xml.py
index 55b8dd1250..3b8807ca38 100755
--- a/tools/buildgen/extract_metadata_from_bazel_xml.py
+++ b/tools/buildgen/extract_metadata_from_bazel_xml.py
@@ -30,15 +30,16 @@
# format entirely or simplify it to a point where it becomes self-explanatory
# and doesn't need any detailed documentation.
-import subprocess
-import yaml
-import xml.etree.ElementTree as ET
-import os
import collections
-import sys
+import os
import re
-from typing import List, Any, Dict, Optional, Iterable
+import subprocess
+import sys
+from typing import Any, Dict, Iterable, List, Optional
+import xml.etree.ElementTree as ET
+
import build_cleaner
+import yaml
BuildMetadata = Dict[str, Any]
BuildDict = Dict[str, BuildMetadata]
diff --git a/tools/buildgen/generate_projects.py b/tools/buildgen/generate_projects.py
index 2e64484f08..8e5c6e6b2f 100755
--- a/tools/buildgen/generate_projects.py
+++ b/tools/buildgen/generate_projects.py
@@ -14,16 +14,16 @@
import argparse
import glob
-import yaml
-import pickle
+import multiprocessing
import os
+import pickle
import shutil
import sys
import tempfile
-import multiprocessing
-from typing import Union, Dict, List
+from typing import Dict, List, Union
import _utils
+import yaml
PROJECT_ROOT = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..",
"..")
diff --git a/tools/buildgen/plugins/list_api.py b/tools/buildgen/plugins/list_api.py
index 87a592d846..c6d78eb1a8 100755
--- a/tools/buildgen/plugins/list_api.py
+++ b/tools/buildgen/plugins/list_api.py
@@ -19,6 +19,7 @@ import fnmatch
import os
import re
import sys
+
import yaml
_RE_API = r'(?:GPRAPI|GRPCAPI|CENSUSAPI)([^;]*);'
diff --git a/tools/codegen/core/gen_header_frame.py b/tools/codegen/core/gen_header_frame.py
index 635b0b5a90..eb9b075755 100755
--- a/tools/codegen/core/gen_header_frame.py
+++ b/tools/codegen/core/gen_header_frame.py
@@ -19,9 +19,9 @@
Write a set of strings containing a hpack encoded http2 frame that
represents said headers."""
+import argparse
import json
import sys
-import argparse
def append_never_indexed(payload_line, n, count, key, value):
diff --git a/tools/codegen/core/gen_hpack_tables.cc b/tools/codegen/core/gen_hpack_tables.cc
index 0e7a7b80d8..d01a90eb78 100644
--- a/tools/codegen/core/gen_hpack_tables.cc
+++ b/tools/codegen/core/gen_hpack_tables.cc
@@ -27,92 +27,6 @@
#include "src/core/ext/transport/chttp2/transport/huffsyms.h"
/*
- * first byte LUT generation
- */
-
-typedef struct {
- const char *call;
- /* bit prefix for the field type */
- unsigned char prefix;
- /* length of the bit prefix for the field type */
- unsigned char prefix_length;
- /* index value: 0 = all zeros, 2 = all ones, 1 otherwise */
- unsigned char index;
-} spec;
-
-static const spec fields[] = {
- {"INDEXED_FIELD", 0X80, 1, 1}, {"INDEXED_FIELD_X", 0X80, 1, 2},
- {"LITHDR_INCIDX", 0X40, 2, 1}, {"LITHDR_INCIDX_X", 0X40, 2, 2},
- {"LITHDR_INCIDX_V", 0X40, 2, 0}, {"LITHDR_NOTIDX", 0X00, 4, 1},
- {"LITHDR_NOTIDX_X", 0X00, 4, 2}, {"LITHDR_NOTIDX_V", 0X00, 4, 0},
- {"LITHDR_NVRIDX", 0X10, 4, 1}, {"LITHDR_NVRIDX_X", 0X10, 4, 2},
- {"LITHDR_NVRIDX_V", 0X10, 4, 0}, {"MAX_TBL_SIZE", 0X20, 3, 1},
- {"MAX_TBL_SIZE_X", 0X20, 3, 2},
-};
-
-static const int num_fields = sizeof(fields) / sizeof(*fields);
-
-static unsigned char prefix_mask(unsigned char prefix_len) {
- unsigned char i;
- unsigned char out = 0;
- for (i = 0; i < prefix_len; i++) {
- /* NB: the following integer arithmetic operation needs to be in its
- * expanded form due to the "integral promotion" performed (see section
- * 3.2.1.1 of the C89 draft standard). A cast to the smaller container type
- * is then required to avoid the compiler warning */
- out = (unsigned char)(out | (unsigned char)(1 << (7 - i)));
- }
- return out;
-}
-
-static unsigned char suffix_mask(unsigned char prefix_len) {
- return (unsigned char)~prefix_mask(prefix_len);
-}
-
-static void generate_first_byte_lut(void) {
- int i, j, n;
- const spec *chrspec;
- unsigned char suffix;
-
- n = printf("static CALLTYPE first_byte[256] = {");
- /* for each potential first byte of a header */
- for (i = 0; i < 256; i++) {
- /* find the field type that matches it */
- chrspec = NULL;
- for (j = 0; j < num_fields; j++) {
- if ((prefix_mask(fields[j].prefix_length) & i) == fields[j].prefix) {
- /* NB: the following integer arithmetic operation needs to be in its
- * expanded form due to the "integral promotion" performed (see section
- * 3.2.1.1 of the C89 draft standard). A cast to the smaller container
- * type is then required to avoid the compiler warning */
- suffix = (unsigned char)(suffix_mask(fields[j].prefix_length) &
- (unsigned char)i);
- if (suffix == suffix_mask(fields[j].prefix_length)) {
- if (fields[j].index != 2) continue;
- } else if (suffix == 0) {
- if (fields[j].index != 0) continue;
- } else {
- if (fields[j].index != 1) continue;
- }
- GPR_ASSERT(chrspec == NULL);
- chrspec = &fields[j];
- }
- }
- if (chrspec) {
- n += printf("%s, ", chrspec->call);
- } else {
- n += printf("ILLEGAL, ");
- }
- /* make some small effort towards readable output */
- if (n > 70) {
- printf("\n ");
- n = 2;
- }
- }
- printf("};\n");
-}
-
-/*
* Huffman decoder table generation
*/
@@ -325,29 +239,9 @@ static void generate_base64_huff_encoder_table(void) {
printf("};\n");
}
-static void generate_base64_inverse_table(void) {
- static const char alphabet[] =
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
- unsigned char inverse[256];
- unsigned i;
-
- memset(inverse, 255, sizeof(inverse));
- for (i = 0; i < strlen(alphabet); i++) {
- inverse[(unsigned char)alphabet[i]] = (unsigned char)i;
- }
-
- printf("static const gpr_uint8 inverse_base64[256] = {");
- for (i = 0; i < 256; i++) {
- printf("%d,", inverse[i]);
- }
- printf("};\n");
-}
-
int main(void) {
generate_huff_tables();
- generate_first_byte_lut();
generate_base64_huff_encoder_table();
- generate_base64_inverse_table();
return 0;
}
diff --git a/tools/codegen/core/gen_settings_ids.py b/tools/codegen/core/gen_settings_ids.py
index fb035add81..36b328c5f1 100755
--- a/tools/codegen/core/gen_settings_ids.py
+++ b/tools/codegen/core/gen_settings_ids.py
@@ -15,9 +15,10 @@
# limitations under the License.
import collections
-import perfection
import sys
+import perfection
+
_MAX_HEADER_LIST_SIZE = 16 * 1024 * 1024
Setting = collections.namedtuple('Setting', 'id default min max on_error')
diff --git a/tools/codegen/core/gen_static_metadata.py b/tools/codegen/core/gen_static_metadata.py
index 08cc139033..389f89cf92 100755
--- a/tools/codegen/core/gen_static_metadata.py
+++ b/tools/codegen/core/gen_static_metadata.py
@@ -14,13 +14,14 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+import collections
import hashlib
import itertools
-import collections
import os
-import sys
-import subprocess
import re
+import subprocess
+import sys
+
import perfection
# Configuration: a list of either strings or 2-tuples of strings.
diff --git a/tools/codegen/core/gen_stats_data.py b/tools/codegen/core/gen_stats_data.py
index f1bea06725..2a4a3132ba 100755
--- a/tools/codegen/core/gen_stats_data.py
+++ b/tools/codegen/core/gen_stats_data.py
@@ -16,10 +16,11 @@
import collections
import ctypes
+import json
import math
import sys
+
import yaml
-import json
with open('src/core/lib/debug/stats_data.yaml') as f:
attrs = yaml.load(f.read())
diff --git a/tools/codegen/core/gen_upb_api.sh b/tools/codegen/core/gen_upb_api.sh
index 177d0eca6b..e7d1bb0561 100755
--- a/tools/codegen/core/gen_upb_api.sh
+++ b/tools/codegen/core/gen_upb_api.sh
@@ -42,6 +42,7 @@ UPB_PLUGIN=$PWD/bazel-bin/external/upb/upbc/protoc-gen-upb
$bazel build @upb//upbc:protoc-gen-upbdefs
UPBDEFS_PLUGIN=$PWD/bazel-bin/external/upb/upbc/protoc-gen-upbdefs
+# Please keep the proto list sorted alphabetically.
proto_files=( \
"envoy/admin/v3/config_dump.proto" \
"envoy/annotations/deprecation.proto" \
@@ -63,26 +64,29 @@ proto_files=( \
"envoy/config/core/v3/http_uri.proto" \
"envoy/config/core/v3/protocol.proto" \
"envoy/config/core/v3/proxy_protocol.proto" \
+ "envoy/config/core/v3/resolver.proto" \
"envoy/config/core/v3/socket_option.proto" \
"envoy/config/core/v3/substitution_format_string.proto" \
- "envoy/config/endpoint/v3/endpoint.proto" \
+ "envoy/config/core/v3/udp_socket_config.proto" \
"envoy/config/endpoint/v3/endpoint_components.proto" \
+ "envoy/config/endpoint/v3/endpoint.proto" \
"envoy/config/endpoint/v3/load_report.proto" \
"envoy/config/listener/v3/api_listener.proto" \
- "envoy/config/listener/v3/listener.proto" \
"envoy/config/listener/v3/listener_components.proto" \
+ "envoy/config/listener/v3/listener.proto" \
+ "envoy/config/listener/v3/quic_config.proto" \
"envoy/config/listener/v3/udp_listener_config.proto" \
"envoy/config/metrics/v3/stats.proto" \
"envoy/config/overload/v3/overload.proto" \
"envoy/config/rbac/v3/rbac.proto" \
- "envoy/config/route/v3/route.proto" \
"envoy/config/route/v3/route_components.proto" \
+ "envoy/config/route/v3/route.proto" \
"envoy/config/route/v3/scoped_route.proto" \
"envoy/config/trace/v3/http_tracer.proto" \
"envoy/extensions/clusters/aggregate/v3/cluster.proto" \
- "envoy/extensions/filters/http/router/v3/router.proto" \
"envoy/extensions/filters/common/fault/v3/fault.proto" \
"envoy/extensions/filters/http/fault/v3/fault.proto" \
+ "envoy/extensions/filters/http/router/v3/router.proto" \
"envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.proto" \
"envoy/extensions/transport_sockets/tls/v3/cert.proto" \
"envoy/extensions/transport_sockets/tls/v3/common.proto" \
@@ -97,6 +101,7 @@ proto_files=( \
"envoy/service/route/v3/rds.proto" \
"envoy/service/route/v3/srds.proto" \
"envoy/service/status/v3/csds.proto" \
+ "envoy/type/http/v3/path_transformation.proto" \
"envoy/type/matcher/v3/metadata.proto" \
"envoy/type/matcher/v3/node.proto" \
"envoy/type/matcher/v3/number.proto" \
@@ -129,20 +134,20 @@ proto_files=( \
"src/proto/grpc/health/v1/health.proto" \
"src/proto/grpc/lb/v1/load_balancer.proto" \
"third_party/istio/security/proto/providers/google/meshca.proto" \
- "udpa/data/orca/v1/orca_load_report.proto" \
"udpa/annotations/migrate.proto" \
"udpa/annotations/security.proto" \
"udpa/annotations/sensitive.proto" \
"udpa/annotations/status.proto" \
"udpa/annotations/versioning.proto" \
+ "udpa/data/orca/v1/orca_load_report.proto" \
"udpa/type/v1/typed_struct.proto" \
+ "validate/validate.proto" \
"xds/core/v3/authority.proto" \
"xds/core/v3/collection_entry.proto" \
"xds/core/v3/context_params.proto" \
"xds/core/v3/resource_locator.proto" \
"xds/core/v3/resource_name.proto" \
- "xds/core/v3/resource.proto" \
- "validate/validate.proto")
+ "xds/core/v3/resource.proto")
INCLUDE_OPTIONS="-I=$PWD/third_party/udpa \
-I=$PWD/third_party/envoy-api \
@@ -166,5 +171,5 @@ do
$INCLUDE_OPTIONS \
$i \
--upb_out=$UPBDEFS_OUTPUT_DIR \
- --plugin=protoc-gen-upb=$UPBDEFS_PLUGIN
+ --plugin=protoc-gen-upb=$UPBDEFS_PLUGIN
done
diff --git a/tools/debug/core/chttp2_ref_leak.py b/tools/debug/core/chttp2_ref_leak.py
index a6a5448775..177c1162e9 100755
--- a/tools/debug/core/chttp2_ref_leak.py
+++ b/tools/debug/core/chttp2_ref_leak.py
@@ -17,8 +17,8 @@
# to stdout
import collections
-import sys
import re
+import sys
def new_obj():
diff --git a/tools/debug/core/error_ref_leak.py b/tools/debug/core/error_ref_leak.py
index 125ec90aae..2c0bacf445 100644
--- a/tools/debug/core/error_ref_leak.py
+++ b/tools/debug/core/error_ref_leak.py
@@ -19,8 +19,8 @@
# usage: python error_ref_leak < logfile.txt
-import sys
import re
+import sys
data = sys.stdin.readlines()
diff --git a/tools/distrib/check_copyright.py b/tools/distrib/check_copyright.py
index 9254956c8a..03eb6a17ee 100755
--- a/tools/distrib/check_copyright.py
+++ b/tools/distrib/check_copyright.py
@@ -18,8 +18,8 @@ import argparse
import datetime
import os
import re
-import sys
import subprocess
+import sys
# find our home
ROOT = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), '../..'))
@@ -33,7 +33,8 @@ argp.add_argument('-o',
choices=['list', 'details'])
argp.add_argument('-s', '--skips', default=0, action='store_const', const=1)
argp.add_argument('-a', '--ancient', default=0, action='store_const', const=1)
-argp.add_argument('--precommit', default=False, action='store_true')
+argp.add_argument('--precommit', action='store_true')
+argp.add_argument('--fix', action='store_true')
args = argp.parse_args()
# open the license text
@@ -44,7 +45,7 @@ with open('NOTICE.txt') as f:
# key is the file extension, value is a format string
# that given a line of license text, returns what should
# be in the file
-LICENSE_PREFIX = {
+LICENSE_PREFIX_RE = {
'.bat': r'@rem\s*',
'.c': r'\s*(?://|\*)\s*',
'.cc': r'\s*(?://|\*)\s*',
@@ -69,6 +70,37 @@ LICENSE_PREFIX = {
'BUILD': r'#\s*',
}
+# The key is the file extension, while the value is a tuple of fields
+# (header, prefix, footer).
+# For example, for javascript multi-line comments, the header will be '/*', the
+# prefix will be '*' and the footer will be '*/'.
+# If header and footer are irrelevant for a specific file extension, they are
+# set to None.
+LICENSE_PREFIX_TEXT = {
+ '.bat': (None, '@rem', None),
+ '.c': (None, '//', None),
+ '.cc': (None, '//', None),
+ '.h': (None, '//', None),
+ '.m': ('/**', ' *', ' */'),
+ '.mm': ('/**', ' *', ' */'),
+ '.php': ('/**', ' *', ' */'),
+ '.js': ('/**', ' *', ' */'),
+ '.py': (None, '#', None),
+ '.pyx': (None, '#', None),
+ '.pxd': (None, '#', None),
+ '.pxi': (None, '#', None),
+ '.rb': (None, '#', None),
+ '.sh': (None, '#', None),
+ '.proto': (None, '//', None),
+ '.cs': (None, '//', None),
+ '.mak': (None, '#', None),
+ '.bazel': (None, '#', None),
+ '.bzl': (None, '#', None),
+ 'Makefile': (None, '#', None),
+ 'Dockerfile': (None, '#', None),
+ 'BUILD': (None, '#', None),
+}
+
_EXEMPT = frozenset((
# Generated protocol compiler output.
'examples/python/helloworld/helloworld_pb2.py',
@@ -105,10 +137,38 @@ _EXEMPT = frozenset((
RE_YEAR = r'Copyright (?P<first_year>[0-9]+\-)?(?P<last_year>[0-9]+) ([Tt]he )?gRPC [Aa]uthors(\.|)'
RE_LICENSE = dict(
- (k, r'\n'.join(LICENSE_PREFIX[k] +
+ (k, r'\n'.join(LICENSE_PREFIX_RE[k] +
(RE_YEAR if re.search(RE_YEAR, line) else re.escape(line))
for line in LICENSE_NOTICE))
- for k, v in LICENSE_PREFIX.items())
+ for k, v in LICENSE_PREFIX_RE.items())
+
+YEAR = datetime.datetime.now().year
+
+LICENSE_YEAR = f'Copyright {YEAR} gRPC authors.'
+
+
+def join_license_text(header, prefix, footer, notice):
+ text = (header + '\n') if header else ""
+
+ def add_prefix(prefix, line):
+ # Don't put whitespace between prefix and empty line to avoid having
+ # trailing whitespaces.
+ return prefix + ('' if len(line) == 0 else ' ') + line
+
+ text += '\n'.join(
+ add_prefix(prefix, (LICENSE_YEAR if re.search(RE_YEAR, line) else line))
+ for line in LICENSE_NOTICE)
+ text += '\n'
+ if footer:
+ text += footer + '\n'
+ return text
+
+
+LICENSE_TEXT = dict(
+ (k,
+ join_license_text(LICENSE_PREFIX_TEXT[k][0], LICENSE_PREFIX_TEXT[k][1],
+ LICENSE_PREFIX_TEXT[k][2], LICENSE_NOTICE))
+ for k, v in LICENSE_PREFIX_TEXT.items())
if args.precommit:
FILE_LIST_COMMAND = 'git status -z | grep -Poz \'(?<=^[MARC][MARCD ] )[^\s]+\''
@@ -160,8 +220,10 @@ for filename in filename_list:
base = os.path.basename(filename)
if ext in RE_LICENSE:
re_license = RE_LICENSE[ext]
+ license_text = LICENSE_TEXT[ext]
elif base in RE_LICENSE:
re_license = RE_LICENSE[base]
+ license_text = LICENSE_TEXT[base]
else:
log(args.skips, 'skip', filename)
continue
@@ -173,7 +235,17 @@ for filename in filename_list:
if m:
pass
elif 'DO NOT EDIT' not in text:
- log(1, 'copyright missing', filename)
+ if args.fix:
+ text = license_text + '\n' + text
+ open(filename, 'w').write(text)
+ log(1, 'copyright missing (fixed)', filename)
+ else:
+ log(1, 'copyright missing', filename)
ok = False
+if not ok and not args.fix:
+ print(
+ 'You may use following command to automatically fix copyright headers:')
+ print(' tools/distrib/check_copyright.py --fix')
+
sys.exit(0 if ok else 1)
diff --git a/tools/distrib/check_include_guards.py b/tools/distrib/check_include_guards.py
index d34251c256..9776c476c5 100755
--- a/tools/distrib/check_include_guards.py
+++ b/tools/distrib/check_include_guards.py
@@ -18,8 +18,8 @@ import argparse
import os
import os.path
import re
-import sys
import subprocess
+import sys
def build_valid_guard(fpath):
diff --git a/tools/distrib/gen_compilation_database.py b/tools/distrib/gen_compilation_database.py
index d8d2761b8e..88f9538e53 100755
--- a/tools/distrib/gen_compilation_database.py
+++ b/tools/distrib/gen_compilation_database.py
@@ -22,10 +22,10 @@ import glob
import json
import logging
import os
+from pathlib import Path
import re
import shlex
import subprocess
-from pathlib import Path
RE_INCLUDE_SYSTEM = re.compile("\s*-I\s+/usr/[^ ]+")
diff --git a/tools/distrib/isort_code.sh b/tools/distrib/isort_code.sh
new file mode 100755
index 0000000000..897200b5a9
--- /dev/null
+++ b/tools/distrib/isort_code.sh
@@ -0,0 +1,57 @@
+#!/bin/bash
+# Copyright 2021 The gRPC Authors
+#
+# 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.
+
+set -ex
+
+ACTION=${1:---overwrite-in-place}
+[[ $ACTION == '--overwrite-in-place' ]] || [[ $ACTION == '--diff' ]]
+
+if [[ $ACTION == '--diff' ]]; then
+ ACTION="--diff --check"
+fi
+
+# Change to root
+cd "$(dirname "${0}")/../.."
+
+DIRS=(
+ 'examples/python'
+ 'src/python'
+ 'test'
+ 'tools'
+ 'setup.py'
+)
+
+VIRTUALENV=isort_virtual_environment
+
+python3 -m virtualenv $VIRTUALENV
+PYTHON=${VIRTUALENV}/bin/python
+"$PYTHON" -m pip install isort==5.9.2
+
+$PYTHON -m isort $ACTION \
+ --force-sort-within-sections \
+ --force-single-line-imports --single-line-exclusions=typing \
+ --src "examples/python/data_transmission" \
+ --src "examples/python/async_streaming" \
+ --src "tools/run_tests/xds_k8s_test_driver" \
+ --src "src/python/grpcio_tests" \
+ --src "tools/run_tests" \
+ --project "examples" \
+ --project "src" \
+ --thirdparty "grpc" \
+ --skip-glob "third_party/*" \
+ --skip-glob "*/env/*" \
+ --skip-glob "*pb2*.py" \
+ --dont-follow-links \
+ "${DIRS[@]}"
diff --git a/tools/distrib/python/.gitignore b/tools/distrib/python/.gitignore
index 266a230198..5cd990ac46 100644
--- a/tools/distrib/python/.gitignore
+++ b/tools/distrib/python/.gitignore
@@ -7,3 +7,5 @@ validate/
google/
opencensus/
xds/
+build/
+opentelemetry/
diff --git a/tools/distrib/python/docgen.py b/tools/distrib/python/docgen.py
index d5bd4a1a7b..dc4372ae8f 100755
--- a/tools/distrib/python/docgen.py
+++ b/tools/distrib/python/docgen.py
@@ -22,6 +22,7 @@ import shutil
import subprocess
import sys
import tempfile
+
import grpc_version
parser = argparse.ArgumentParser()
diff --git a/tools/distrib/python/grpc_prefixed/templates/setup.py.template b/tools/distrib/python/grpc_prefixed/templates/setup.py.template
index 2d62270d04..27ae518b99 100644
--- a/tools/distrib/python/grpc_prefixed/templates/setup.py.template
+++ b/tools/distrib/python/grpc_prefixed/templates/setup.py.template
@@ -20,7 +20,6 @@ import setuptools
CLASSIFIERS = [
'Development Status :: 7 - Inactive',
'Programming Language :: Python',
- 'Programming Language :: Python :: 2',
'Programming Language :: Python :: 3',
'License :: OSI Approved :: Apache Software License',
]
diff --git a/tools/distrib/python/grpc_version.py b/tools/distrib/python/grpc_version.py
index 2e543623c6..51b1fd971a 100644
--- a/tools/distrib/python/grpc_version.py
+++ b/tools/distrib/python/grpc_version.py
@@ -14,5 +14,5 @@
# AUTO-GENERATED FROM `$REPO_ROOT/templates/tools/distrib/python/grpcio_tools/grpc_version.py.template`!!!
-VERSION = '1.39.1'
+VERSION = '1.40.0'
PROTOBUF_VERSION = '3.15.8'
diff --git a/tools/distrib/python/grpcio_tools/grpc_tools/_protoc_compiler.pyx b/tools/distrib/python/grpcio_tools/grpc_tools/_protoc_compiler.pyx
index e0c11baa70..ff68565d06 100644
--- a/tools/distrib/python/grpcio_tools/grpc_tools/_protoc_compiler.pyx
+++ b/tools/distrib/python/grpcio_tools/grpc_tools/_protoc_compiler.pyx
@@ -12,15 +12,15 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+from cython.operator cimport dereference
from libc cimport stdlib
-from libcpp.vector cimport vector
-from libcpp.utility cimport pair
from libcpp.string cimport string
-
-from cython.operator cimport dereference
+from libcpp.utility cimport pair
+from libcpp.vector cimport vector
import warnings
+
cdef extern from "grpc_tools/main.h" namespace "grpc_tools":
cppclass cProtocError "::grpc_tools::ProtocError":
string filename
diff --git a/tools/distrib/python/grpcio_tools/grpc_tools/command.py b/tools/distrib/python/grpcio_tools/grpc_tools/command.py
index b1669db3fd..4aa22443ae 100644
--- a/tools/distrib/python/grpcio_tools/grpc_tools/command.py
+++ b/tools/distrib/python/grpcio_tools/grpc_tools/command.py
@@ -13,12 +13,11 @@
# limitations under the License.
import os
-import pkg_resources
import sys
-import setuptools
-
from grpc_tools import protoc
+import pkg_resources
+import setuptools
def build_package_protos(package_root, strict_mode=False):
diff --git a/tools/distrib/python/grpcio_tools/grpc_tools/protoc.py b/tools/distrib/python/grpcio_tools/grpc_tools/protoc.py
index 098245116b..74ea853fa5 100644
--- a/tools/distrib/python/grpcio_tools/grpc_tools/protoc.py
+++ b/tools/distrib/python/grpcio_tools/grpc_tools/protoc.py
@@ -14,12 +14,11 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-import pkg_resources
-import sys
-
import os
+import sys
from grpc_tools import _protoc_compiler
+import pkg_resources
_PROTO_MODULE_SUFFIX = "_pb2"
_SERVICE_MODULE_SUFFIX = "_pb2_grpc"
diff --git a/tools/distrib/python/grpcio_tools/grpc_tools/test/protoc_test.py b/tools/distrib/python/grpcio_tools/grpc_tools/test/protoc_test.py
index e514784056..1b72568f15 100644
--- a/tools/distrib/python/grpcio_tools/grpc_tools/test/protoc_test.py
+++ b/tools/distrib/python/grpcio_tools/grpc_tools/test/protoc_test.py
@@ -103,7 +103,7 @@ def _test_proto_module_imported_once():
def _test_static_dynamic_combo():
with _augmented_syspath(
("tools/distrib/python/grpcio_tools/grpc_tools/test/",)):
- from grpc_tools import protoc
+ from grpc_tools import protoc # isort:skip
import complicated_pb2
protos = protoc._protos("simple.proto")
static_message = complicated_pb2.ComplicatedMessage()
diff --git a/tools/distrib/python/grpcio_tools/grpc_version.py b/tools/distrib/python/grpcio_tools/grpc_version.py
index 159c9059c9..e2fe06a102 100644
--- a/tools/distrib/python/grpcio_tools/grpc_version.py
+++ b/tools/distrib/python/grpcio_tools/grpc_version.py
@@ -14,5 +14,5 @@
# AUTO-GENERATED FROM `$REPO_ROOT/templates/tools/distrib/python/grpcio_tools/grpc_version.py.template`!!!
-VERSION = '1.39.1'
+VERSION = '1.40.0'
PROTOBUF_VERSION = '3.15.8'
diff --git a/tools/distrib/python/grpcio_tools/setup.py b/tools/distrib/python/grpcio_tools/setup.py
index c64f77778f..07a3092a10 100644
--- a/tools/distrib/python/grpcio_tools/setup.py
+++ b/tools/distrib/python/grpcio_tools/setup.py
@@ -18,20 +18,19 @@ from distutils import util
import errno
import os
import os.path
-import pkg_resources
import platform
import re
import shlex
import shutil
+import subprocess
+from subprocess import PIPE
import sys
import sysconfig
+import pkg_resources
import setuptools
from setuptools.command import build_ext
-import subprocess
-from subprocess import PIPE
-
# TODO(atash) add flag to disable Cython use
_PACKAGE_PATH = os.path.realpath(os.path.dirname(__file__))
@@ -42,6 +41,7 @@ sys.path.insert(0, os.path.abspath('.'))
import _parallel_compile_patch
import protoc_lib_deps
+
import grpc_version
_EXT_INIT_SYMBOL = None
@@ -55,12 +55,7 @@ _parallel_compile_patch.monkeypatch_compile_maybe()
CLASSIFIERS = [
'Development Status :: 5 - Production/Stable',
'Programming Language :: Python',
- 'Programming Language :: Python :: 2',
- 'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
- 'Programming Language :: Python :: 3.4',
- 'Programming Language :: Python :: 3.5',
- 'Programming Language :: Python :: 3.6',
'License :: OSI Approved :: Apache Software License',
]
diff --git a/tools/distrib/python/xds_protos/build.py b/tools/distrib/python/xds_protos/build.py
index 8b793f2bc8..6434272bc7 100644
--- a/tools/distrib/python/xds_protos/build.py
+++ b/tools/distrib/python/xds_protos/build.py
@@ -15,8 +15,9 @@
"""Builds the content of xds-protos package"""
import os
-import pkg_resources
+
from grpc_tools import protoc
+import pkg_resources
# We might not want to compile all the protos
EXCLUDE_PROTO_PACKAGES_LIST = [
@@ -35,6 +36,8 @@ GOOGLEAPIS_ROOT = os.path.join(GRPC_ROOT, 'third_party', 'googleapis')
VALIDATE_ROOT = os.path.join(GRPC_ROOT, 'third_party', 'protoc-gen-validate')
OPENCENSUS_PROTO_ROOT = os.path.join(GRPC_ROOT, 'third_party',
'opencensus-proto', 'src')
+OPENTELEMETRY_PROTO_ROOT = os.path.join(GRPC_ROOT, 'third_party',
+ 'opentelemetry')
WELL_KNOWN_PROTOS_INCLUDE = pkg_resources.resource_filename(
'grpc_tools', '_proto')
OUTPUT_PATH = WORK_DIR
@@ -67,6 +70,7 @@ COMPILE_PROTO_ONLY = [
'--proto_path={}'.format(VALIDATE_ROOT),
'--proto_path={}'.format(WELL_KNOWN_PROTOS_INCLUDE),
'--proto_path={}'.format(OPENCENSUS_PROTO_ROOT),
+ '--proto_path={}'.format(OPENTELEMETRY_PROTO_ROOT),
'--python_out={}'.format(OUTPUT_PATH),
]
COMPILE_BOTH = COMPILE_PROTO_ONLY + ['--grpc_python_out={}'.format(OUTPUT_PATH)]
@@ -120,11 +124,13 @@ def main():
compile_protos(GOOGLEAPIS_ROOT, os.path.join('google', 'type'))
compile_protos(VALIDATE_ROOT, 'validate')
compile_protos(OPENCENSUS_PROTO_ROOT)
+ compile_protos(OPENTELEMETRY_PROTO_ROOT)
# Generate __init__.py files for all modules
create_init_file(WORK_DIR)
for proto_root_module in [
- 'envoy', 'google', 'opencensus', 'udpa', 'validate', 'xds'
+ 'envoy', 'google', 'opencensus', 'udpa', 'validate', 'xds',
+ 'opentelemetry'
]:
for root, _, _ in os.walk(os.path.join(WORK_DIR, proto_root_module)):
package_path = os.path.relpath(root, WORK_DIR)
diff --git a/tools/distrib/python/xds_protos/build_validate_upload.sh b/tools/distrib/python/xds_protos/build_validate_upload.sh
index 4218940e7d..00135fcaf0 100755
--- a/tools/distrib/python/xds_protos/build_validate_upload.sh
+++ b/tools/distrib/python/xds_protos/build_validate_upload.sh
@@ -23,21 +23,13 @@ rm -rf ${WORK_DIR}/dist
# Generate the package content then build the source wheel
python3 build.py
-python3 setup.py sdist
-python2 setup.py bdist_wheel
python3 setup.py bdist_wheel
# Run the tests to ensure all protos are importable, also avoid confusing normal
# imports with relative imports
pushd $(mktemp -d '/tmp/test_xds_protos.XXXXXX')
-python2 -m virtualenv env
-env/bin/python -m pip install ${WORK_DIR}/dist/xds-protos-*.tar.gz
-cp ${WORK_DIR}/generated_file_import_test.py generated_file_import_test.py
-env/bin/python generated_file_import_test.py
-popd
-pushd $(mktemp -d '/tmp/test_xds_protos.XXXXXX')
python3 -m virtualenv env
-env/bin/python -m pip install ${WORK_DIR}/dist/xds-protos-*.tar.gz
+env/bin/python -m pip install ${WORK_DIR}/dist/*.whl
cp ${WORK_DIR}/generated_file_import_test.py generated_file_import_test.py
env/bin/python generated_file_import_test.py
popd
diff --git a/tools/distrib/python/xds_protos/setup.py b/tools/distrib/python/xds_protos/setup.py
index 2ed04c421a..3acb218aa1 100644
--- a/tools/distrib/python/xds_protos/setup.py
+++ b/tools/distrib/python/xds_protos/setup.py
@@ -15,6 +15,7 @@
"""A PyPI package for xDS protos generated Python code."""
import os
+
import setuptools
WORK_DIR = os.path.dirname(os.path.abspath(__file__))
@@ -27,7 +28,6 @@ PACKAGES = setuptools.find_packages(where=".", exclude=EXCLUDE_PYTHON_FILES)
CLASSIFIERS = [
'Development Status :: 3 - Alpha',
'Programming Language :: Python',
- 'Programming Language :: Python :: 2',
'Programming Language :: Python :: 3',
'License :: OSI Approved :: Apache Software License',
]
@@ -38,7 +38,7 @@ INSTALL_REQUIRES = [
SETUP_REQUIRES = INSTALL_REQUIRES + ['grpcio-tools']
setuptools.setup(
name='xds-protos',
- version='0.0.8',
+ version='0.0.11',
packages=PACKAGES,
description='Generated Python code from envoyproxy/data-plane-api',
long_description_content_type='text/x-rst',
diff --git a/tools/distrib/run_clang_tidy.py b/tools/distrib/run_clang_tidy.py
index e9565369fb..4b0a04f722 100755
--- a/tools/distrib/run_clang_tidy.py
+++ b/tools/distrib/run_clang_tidy.py
@@ -13,11 +13,11 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-import sys
-import os
-import subprocess
import argparse
import multiprocessing
+import os
+import subprocess
+import sys
sys.path.append(
os.path.join(os.path.dirname(sys.argv[0]), '..', 'run_tests',
diff --git a/tools/distrib/sanitize.sh b/tools/distrib/sanitize.sh
index a06f148d9a..361cc9befa 100755
--- a/tools/distrib/sanitize.sh
+++ b/tools/distrib/sanitize.sh
@@ -19,6 +19,7 @@ cd $(dirname $0)/../..
tools/buildgen/generate_projects.sh
tools/distrib/clang_format_code.sh
-tools/distrib/check_copyright.py
+tools/distrib/check_copyright.py --fix
tools/distrib/check_trailing_newlines.sh --fix
+tools/run_tests/sanity/check_port_platform.py --fix
diff --git a/tools/dockerfile/distribtest/python_arch_x64/Dockerfile b/tools/dockerfile/distribtest/python_arch_x64/Dockerfile
index 9e43d00b41..ed4ff753da 100644
--- a/tools/dockerfile/distribtest/python_arch_x64/Dockerfile
+++ b/tools/dockerfile/distribtest/python_arch_x64/Dockerfile
@@ -12,10 +12,10 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-FROM base/archlinux
+FROM archlinux:base
RUN pacman --noconfirm -Syy
RUN pacman --noconfirm -S openssl
-RUN pacman --noconfirm -S python2
-RUN pacman --noconfirm -S python2-pip
-RUN pip2 install virtualenv
+RUN pacman --noconfirm -S python
+RUN pacman --noconfirm -S python-pip
+RUN pip3 install virtualenv
diff --git a/tools/dockerfile/distribtest/python_centos6_x64/Dockerfile b/tools/dockerfile/distribtest/python_centos6_x64/Dockerfile
deleted file mode 100644
index e71f655796..0000000000
--- a/tools/dockerfile/distribtest/python_centos6_x64/Dockerfile
+++ /dev/null
@@ -1,33 +0,0 @@
-# Copyright 2015 gRPC authors.
-#
-# 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.
-
-FROM centos:6
-
-RUN yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
-
-# Vanilla CentOS6 only has python 2.6 and we don't support that.
-RUN yum -y install yum -y install https://centos6.iuscommunity.org/ius-release.rpm
-RUN yum install -y python27
-
-# Override python2.6
-RUN ln -s /usr/bin/python2.7 /usr/local/bin/python
-RUN ln -s /usr/bin/python2.7 /usr/local/bin/python2
-
-# Install pip
-RUN curl https://bootstrap.pypa.io/get-pip.py | python -
-
-# "which" command required by python's run_distrib_test.sh
-RUN yum install -y which
-
-RUN pip install virtualenv
diff --git a/tools/dockerfile/distribtest/python_centos7_x64/Dockerfile b/tools/dockerfile/distribtest/python_centos7_x64/Dockerfile
index 4375a3f69c..7650b62290 100644
--- a/tools/dockerfile/distribtest/python_centos7_x64/Dockerfile
+++ b/tools/dockerfile/distribtest/python_centos7_x64/Dockerfile
@@ -17,4 +17,5 @@ FROM centos:7
RUN yum install -y python
RUN yum install -y epel-release
RUN yum install -y python-pip
-RUN pip install virtualenv
+RUN yum install -y python3
+RUN python3 -m pip install virtualenv
diff --git a/tools/dockerfile/distribtest/python_dev_alpine3.7_x64/Dockerfile b/tools/dockerfile/distribtest/python_dev_alpine3.7_x64/Dockerfile
index b51cad937b..0272a2758f 100644
--- a/tools/dockerfile/distribtest/python_dev_alpine3.7_x64/Dockerfile
+++ b/tools/dockerfile/distribtest/python_dev_alpine3.7_x64/Dockerfile
@@ -14,11 +14,11 @@
FROM alpine:3.11
-RUN apk add --update build-base linux-headers python python2-dev py2-pip
+RUN apk add --update build-base linux-headers python3 python3-dev py3-pip
-RUN pip install --upgrade pip==19.3.1
+RUN pip3 install --upgrade pip==19.3.1
-RUN pip install virtualenv
+RUN pip3 install virtualenv
# bash is required for our test script invocation
# ideally, we want to fix the invocation mechanism
diff --git a/tools/dockerfile/distribtest/python_dev_arch_x64/Dockerfile b/tools/dockerfile/distribtest/python_dev_arch_x64/Dockerfile
index 7f09fd6423..a24e832493 100644
--- a/tools/dockerfile/distribtest/python_dev_arch_x64/Dockerfile
+++ b/tools/dockerfile/distribtest/python_dev_arch_x64/Dockerfile
@@ -12,11 +12,11 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-FROM base/archlinux
+FROM archlinux:base
RUN pacman --noconfirm -Syy
RUN pacman --noconfirm -S openssl
-RUN pacman --noconfirm -S python2
-RUN pacman --noconfirm -S python2-pip
-RUN pip2 install virtualenv
+RUN pacman --noconfirm -S python
+RUN pacman --noconfirm -S python-pip
+RUN pip3 install virtualenv
RUN pacman --noconfirm -S base-devel
diff --git a/tools/dockerfile/distribtest/python_dev_centos7_x64/Dockerfile b/tools/dockerfile/distribtest/python_dev_centos7_x64/Dockerfile
index df5ca6489d..b1299af710 100644
--- a/tools/dockerfile/distribtest/python_dev_centos7_x64/Dockerfile
+++ b/tools/dockerfile/distribtest/python_dev_centos7_x64/Dockerfile
@@ -14,12 +14,12 @@
FROM centos:7
-RUN yum install -y python
-RUN yum install -y python-devel
+RUN yum install -y python3
+RUN yum install -y python3-devel
RUN yum install -y epel-release
-RUN yum install -y python-pip
-RUN pip install --upgrade pip==19.3.1
-RUN pip install -U virtualenv
+RUN yum install -y python3-pip
+RUN pip3 install --upgrade pip==19.3.1
+RUN pip3 install -U virtualenv
# The default gcc of CentOS 7 is gcc 4.8 which is older than gcc 4.9,
# the minimum supported gcc version for gRPC Core so let's upgrade to
diff --git a/tools/dockerfile/distribtest/python_dev_fedora23_x64/Dockerfile b/tools/dockerfile/distribtest/python_dev_fedora23_x64/Dockerfile
index 0dbf5e4c21..cfa3d934cb 100644
--- a/tools/dockerfile/distribtest/python_dev_fedora23_x64/Dockerfile
+++ b/tools/dockerfile/distribtest/python_dev_fedora23_x64/Dockerfile
@@ -14,10 +14,10 @@
FROM fedora:23
-RUN yum clean all && yum update -y && yum install -y python python-pip
-RUN pip install virtualenv
+RUN yum clean all && yum update -y && yum install -y python3 python3-pip
+RUN pip3 install virtualenv==16.7.9
RUN yum groupinstall -y "Development Tools"
RUN yum install -y redhat-rpm-config
RUN yum install -y gcc-c++
-RUN yum install -y python2-devel
+RUN yum install -y python3-devel
diff --git a/tools/dockerfile/distribtest/python_dev_jessie_x64/Dockerfile b/tools/dockerfile/distribtest/python_dev_jessie_x64/Dockerfile
index c2228989cd..e4ee142d90 100644
--- a/tools/dockerfile/distribtest/python_dev_jessie_x64/Dockerfile
+++ b/tools/dockerfile/distribtest/python_dev_jessie_x64/Dockerfile
@@ -14,8 +14,8 @@
FROM debian:jessie
-RUN apt-get update && apt-get install -y python python-pip
-RUN pip install virtualenv
+RUN apt-get update && apt-get install -y python3 python3-pip
+RUN pip3 install virtualenv==16.7.9
RUN apt-get install -y build-essential
-RUN apt-get install -y python-dev
+RUN apt-get install -y python3-dev
diff --git a/tools/dockerfile/distribtest/python_dev_jessie_x86/Dockerfile b/tools/dockerfile/distribtest/python_dev_jessie_x86/Dockerfile
index b1d1a31061..b59e4b4204 100644
--- a/tools/dockerfile/distribtest/python_dev_jessie_x86/Dockerfile
+++ b/tools/dockerfile/distribtest/python_dev_jessie_x86/Dockerfile
@@ -14,12 +14,12 @@
FROM i386/debian:jessie
-RUN apt-get update && apt-get install -y python python-pip
+RUN apt-get update && apt-get install -y python3 python3-pip
-RUN pip install virtualenv
+RUN pip3 install virtualenv==16.7.9
RUN apt-get install -y build-essential
-RUN apt-get install -y python-dev
+RUN apt-get install -y python3-dev
# docker is running on a 64-bit machine, so we need to
# override "uname -m" to report i686 instead of x86_64, otherwise
diff --git a/tools/dockerfile/distribtest/python_dev_ubuntu1604_x64/Dockerfile b/tools/dockerfile/distribtest/python_dev_ubuntu1604_x64/Dockerfile
index 1ff1e0a1d6..1f5775fb99 100644
--- a/tools/dockerfile/distribtest/python_dev_ubuntu1604_x64/Dockerfile
+++ b/tools/dockerfile/distribtest/python_dev_ubuntu1604_x64/Dockerfile
@@ -14,9 +14,9 @@
FROM ubuntu:16.04
-RUN apt-get update -y && apt-get install -y python python-pip
+RUN apt-get update -y && apt-get install -y python3 python3-pip
RUN apt-get install -y build-essential
-RUN apt-get install -y python-dev
+RUN apt-get install -y python3-dev
-RUN pip install virtualenv
+RUN pip3 install virtualenv==16.7.9
diff --git a/tools/dockerfile/distribtest/python_dev_ubuntu1804_x64/Dockerfile b/tools/dockerfile/distribtest/python_dev_ubuntu1804_x64/Dockerfile
index a7c48dd23f..7bcb5830d1 100644
--- a/tools/dockerfile/distribtest/python_dev_ubuntu1804_x64/Dockerfile
+++ b/tools/dockerfile/distribtest/python_dev_ubuntu1804_x64/Dockerfile
@@ -14,9 +14,9 @@
FROM ubuntu:18.04
-RUN apt-get update -y && apt-get install -y python python-pip
+RUN apt-get update -y && apt-get install -y python3 python3-pip
RUN apt-get install -y build-essential
-RUN apt-get install -y python-dev
+RUN apt-get install -y python3-dev
-RUN pip install virtualenv
+RUN pip3 install virtualenv
diff --git a/tools/dockerfile/distribtest/python_fedora23_x64/Dockerfile b/tools/dockerfile/distribtest/python_fedora34_x64/Dockerfile
index 60f788df8b..158ba77878 100644
--- a/tools/dockerfile/distribtest/python_fedora23_x64/Dockerfile
+++ b/tools/dockerfile/distribtest/python_fedora34_x64/Dockerfile
@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-FROM fedora:23
+FROM fedora:34
-RUN yum clean all && yum update -y && yum install -y python python-pip
-RUN pip install virtualenv
+RUN yum clean all && yum update -y && yum install -y python3 python3-pip
+RUN pip3 install virtualenv
diff --git a/tools/dockerfile/distribtest/python_opensuse_x64/Dockerfile b/tools/dockerfile/distribtest/python_opensuse_x64/Dockerfile
index 4a74fe5121..d8179ef68b 100644
--- a/tools/dockerfile/distribtest/python_opensuse_x64/Dockerfile
+++ b/tools/dockerfile/distribtest/python_opensuse_x64/Dockerfile
@@ -12,10 +12,10 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-FROM opensuse:42.1
+FROM opensuse/leap:latest
-RUN zypper --non-interactive install python
-RUN zypper --non-interactive install python-pip
+RUN zypper --non-interactive install python3
+RUN zypper --non-interactive install python3-pip
# "which" command required by python's run_distrib_test.sh
RUN zypper --non-interactive install which
@@ -24,4 +24,4 @@ RUN zypper --non-interactive install which
# https://pypi.python.org/simple/
RUN zypper --non-interactive install ca-certificates-mozilla
-RUN pip install virtualenv
+RUN pip3 install virtualenv
diff --git a/tools/dockerfile/distribtest/python_jessie_x64/Dockerfile b/tools/dockerfile/distribtest/python_stretch_x64/Dockerfile
index 2c8ce8eca2..2b47ad97e2 100644
--- a/tools/dockerfile/distribtest/python_jessie_x64/Dockerfile
+++ b/tools/dockerfile/distribtest/python_stretch_x64/Dockerfile
@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-FROM debian:jessie
+FROM debian:stretch
-RUN apt-get update && apt-get install -y python python-pip
-RUN pip install virtualenv
+RUN apt-get update && apt-get install -y python3 python3-pip
+RUN pip3 install virtualenv==16.7.9
diff --git a/tools/dockerfile/distribtest/python_jessie_x86/Dockerfile b/tools/dockerfile/distribtest/python_stretch_x86/Dockerfile
index d5b63421c5..cbeb53badd 100644
--- a/tools/dockerfile/distribtest/python_jessie_x86/Dockerfile
+++ b/tools/dockerfile/distribtest/python_stretch_x86/Dockerfile
@@ -12,11 +12,11 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-FROM i386/debian:jessie
+FROM i386/debian:stretch
-RUN apt-get update && apt-get install -y python python-pip
+RUN apt-get update && apt-get install -y python3 python3-pip
-RUN pip install virtualenv
+RUN pip3 install virtualenv==16.7.9
# docker is running on a 64-bit machine, so we need to
# override "uname -m" to report i686 instead of x86_64, otherwise
diff --git a/tools/dockerfile/distribtest/python_ubuntu1604_x64/Dockerfile b/tools/dockerfile/distribtest/python_ubuntu1604_x64/Dockerfile
index d00c7b4584..c8692e11c8 100644
--- a/tools/dockerfile/distribtest/python_ubuntu1604_x64/Dockerfile
+++ b/tools/dockerfile/distribtest/python_ubuntu1604_x64/Dockerfile
@@ -14,10 +14,10 @@
FROM ubuntu:16.04
-RUN apt-get update -y && apt-get install -y python python-pip
+RUN apt-get update -y && apt-get install -y python3 python3-pip
# Necessary to fix virtualenv compatibility problems with python2.7
-RUN pip install --upgrade pip==19.3.1
+RUN pip3 install --upgrade pip==19.3.1
# Ubuntu's python-pip package installs pip to /usr/bin, whereas the upgraded
# pip lives at /usr/local/bin/pip. We'll use the absolute path for now, since
diff --git a/tools/dockerfile/distribtest/python_ubuntu1804_x64/Dockerfile b/tools/dockerfile/distribtest/python_ubuntu1804_x64/Dockerfile
index ac71663a34..9b1ab18742 100644
--- a/tools/dockerfile/distribtest/python_ubuntu1804_x64/Dockerfile
+++ b/tools/dockerfile/distribtest/python_ubuntu1804_x64/Dockerfile
@@ -14,6 +14,6 @@
FROM ubuntu:18.04
-RUN apt-get update -y && apt-get install -y python python-pip
+RUN apt-get update -y && apt-get install -y python3 python3-pip
-RUN pip install virtualenv
+RUN pip3 install virtualenv
diff --git a/tools/dockerfile/grpc_dist_proto/Dockerfile b/tools/dockerfile/grpc_dist_proto/Dockerfile
index 71d76fca06..009cb8e5c8 100644
--- a/tools/dockerfile/grpc_dist_proto/Dockerfile
+++ b/tools/dockerfile/grpc_dist_proto/Dockerfile
@@ -23,7 +23,7 @@ RUN apt-get update && apt-get -y install libgtest-dev
# Get the protobuf source from GitHub.
RUN mkdir -p /var/local/git
-RUN git clone https://github.com/google/protobuf.git /var/local/git/protobuf
+RUN git clone https://github.com/protocolbuffers/protobuf.git /var/local/git/protobuf
# Build the protobuf library statically and install to /tmp/protoc_static.
WORKDIR /var/local/git/protobuf
diff --git a/tools/dockerfile/test/bazel/Dockerfile b/tools/dockerfile/test/bazel/Dockerfile
index b333d8540f..d9533e138c 100644
--- a/tools/dockerfile/test/bazel/Dockerfile
+++ b/tools/dockerfile/test/bazel/Dockerfile
@@ -15,10 +15,8 @@
# Pinned version of the base image is used to avoid regressions caused
# by rebuilding of this docker image. To see available versions, you can run
# "gcloud container images list-tags gcr.io/oss-fuzz-base/base-builder"
-# TODO(jtattermusch): with the latest version we'd get clang12+
-# which makes our build fail due to new warnings being treated
-# as errors.
-FROM gcr.io/oss-fuzz-base/base-builder@sha256:de220fd2433cd53bd06b215770dcd14a5e74632e0215acea7401fee8cafb18da
+# Image(c7f1523ebd92) is built on Jul 29, 2021
+FROM gcr.io/oss-fuzz-base/base-builder@sha256:c7f1523ebd9234b9ff57e5240f8c06569143373be019c92f1e6df18a1e048f37
# -------------------------- WARNING --------------------------------------
# If you are making changes to this file, consider changing
@@ -43,19 +41,11 @@ RUN apt-get update && apt-get -y install \
# Python dependencies
# Install dependencies
-
RUN apt-get update && apt-get install -y \
python-all-dev \
python3-all-dev \
python-setuptools
-# Install Python packages from PyPI
-RUN curl https://bootstrap.pypa.io/pip/2.7/get-pip.py | python2.7
-RUN pip install --upgrade pip==19.3.1
-RUN pip install virtualenv==16.7.9
-RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.15.0 twisted==17.5.0
-
-
#=================
# Compile CPython 3.6.9 from source
diff --git a/tools/dockerfile/test/binder_transport_apk/Dockerfile b/tools/dockerfile/test/binder_transport_apk/Dockerfile
new file mode 100644
index 0000000000..c3282f119c
--- /dev/null
+++ b/tools/dockerfile/test/binder_transport_apk/Dockerfile
@@ -0,0 +1,73 @@
+# Copyright 2021 gRPC authors.
+#
+# 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.
+
+# Pinned version of the base image is used to avoid regressions caused
+# by rebuilding of this docker image. To see available versions, you can run
+# "gcloud container images list-tags gcr.io/oss-fuzz-base/base-builder"
+# Image(c7f1523ebd92) is built on Jul 29, 2021
+FROM gcr.io/oss-fuzz-base/base-builder@sha256:c7f1523ebd9234b9ff57e5240f8c06569143373be019c92f1e6df18a1e048f37
+
+# This Dockerfile creates the environment for compiling and e2e testing of Android binder transport implementation
+
+# Install basic packages and Bazel dependencies.
+RUN apt-get update && apt-get install -y software-properties-common python-software-properties
+RUN add-apt-repository ppa:webupd8team/java
+RUN apt-get update && apt-get -y install \
+ autoconf \
+ build-essential \
+ curl \
+ wget \
+ libtool \
+ make \
+ openjdk-8-jdk \
+ vim
+
+#========================
+# Android SDK/NDK installation
+ENV SDK_ROOT=/opt/android-sdk
+RUN mkdir -p ${SDK_ROOT}
+RUN wget -O cmd.zip dl.google.com/android/repository/commandlinetools-linux-7302050_latest.zip && \
+ unzip cmd.zip && \
+ yes | ./cmdline-tools/bin/sdkmanager --sdk_root=${SDK_ROOT} 'tools' && \
+ yes | ./cmdline-tools/bin/sdkmanager --sdk_root=${SDK_ROOT} 'platform-tools' && \
+ yes | ./cmdline-tools/bin/sdkmanager --sdk_root=${SDK_ROOT} 'build-tools;30.0.3' && \
+ yes | ./cmdline-tools/bin/sdkmanager --sdk_root=${SDK_ROOT} 'platforms;android-29' && \
+ yes | ./cmdline-tools/bin/sdkmanager --sdk_root=${SDK_ROOT} 'ndk-bundle' && \
+ yes | ./cmdline-tools/bin/sdkmanager --sdk_root=${SDK_ROOT} 'ndk;21.4.7075529'
+
+RUN rm cmd.zip
+
+# Set environment variables for Bazel rules
+ENV ANDROID_HOME=/opt/android-sdk
+ENV ANDROID_NDK_HOME=/opt/android-sdk/ndk/21.4.7075529
+
+#========================
+# Bazel installation
+
+# Must be in sync with tools/bazel
+ENV BAZEL_VERSION 3.7.1
+
+# The correct bazel version is already preinstalled, no need to use //tools/bazel wrapper.
+ENV DISABLE_BAZEL_WRAPPER 1
+
+RUN apt-get update && apt-get install -y wget && apt-get clean
+RUN wget "https://github.com/bazelbuild/bazel/releases/download/$BAZEL_VERSION/bazel-$BAZEL_VERSION-installer-linux-x86_64.sh" && \
+ bash ./bazel-$BAZEL_VERSION-installer-linux-x86_64.sh && \
+ rm bazel-$BAZEL_VERSION-installer-linux-x86_64.sh
+
+
+RUN mkdir -p /var/local/jenkins
+
+# Define the default command.
+CMD ["bash"]
diff --git a/tools/doxygen/Doxyfile.c++ b/tools/doxygen/Doxyfile.c++
index e8cad449ad..cc7da15396 100644
--- a/tools/doxygen/Doxyfile.c++
+++ b/tools/doxygen/Doxyfile.c++
@@ -40,7 +40,7 @@ PROJECT_NAME = "GRPC C++"
# could be handy for archiving the generated documentation or if some version
# control system is used.
-PROJECT_NUMBER = 1.39.1
+PROJECT_NUMBER = 1.40.0
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a
diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal
index 9dc267f33d..e688b7d448 100644
--- a/tools/doxygen/Doxyfile.c++.internal
+++ b/tools/doxygen/Doxyfile.c++.internal
@@ -40,7 +40,7 @@ PROJECT_NAME = "GRPC C++"
# could be handy for archiving the generated documentation or if some version
# control system is used.
-PROJECT_NUMBER = 1.39.1
+PROJECT_NUMBER = 1.40.0
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a
@@ -1202,6 +1202,8 @@ src/core/ext/transport/chttp2/transport/bin_decoder.h \
src/core/ext/transport/chttp2/transport/bin_encoder.cc \
src/core/ext/transport/chttp2/transport/bin_encoder.h \
src/core/ext/transport/chttp2/transport/chttp2_plugin.cc \
+src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc \
+src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h \
src/core/ext/transport/chttp2/transport/chttp2_transport.cc \
src/core/ext/transport/chttp2/transport/chttp2_transport.h \
src/core/ext/transport/chttp2/transport/context_list.cc \
@@ -1284,10 +1286,14 @@ src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h \
src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h \
+src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c \
+src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h \
src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h \
src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h \
+src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c \
+src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h \
src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c \
src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h \
src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c \
@@ -1300,6 +1306,8 @@ src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c \
src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h \
src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c \
src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h \
+src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c \
+src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h \
src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c \
src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h \
src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c \
@@ -1352,6 +1360,8 @@ src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c \
src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h \
src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c \
src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h \
+src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c \
+src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h \
src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c \
src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h \
src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c \
@@ -1480,10 +1490,14 @@ src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c \
@@ -1496,6 +1510,8 @@ src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c \
@@ -1546,6 +1562,8 @@ src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c \
@@ -1649,6 +1667,7 @@ src/core/lib/avl/avl.cc \
src/core/lib/avl/avl.h \
src/core/lib/backoff/backoff.cc \
src/core/lib/backoff/backoff.h \
+src/core/lib/channel/call_tracer.h \
src/core/lib/channel/channel_args.cc \
src/core/lib/channel/channel_args.h \
src/core/lib/channel/channel_stack.cc \
@@ -1694,12 +1713,10 @@ src/core/lib/debug/trace.h \
src/core/lib/event_engine/endpoint_config.cc \
src/core/lib/event_engine/endpoint_config_internal.h \
src/core/lib/event_engine/event_engine.cc \
-src/core/lib/event_engine/slice_allocator.cc \
src/core/lib/event_engine/sockaddr.cc \
src/core/lib/event_engine/sockaddr.h \
src/core/lib/gpr/alloc.cc \
src/core/lib/gpr/alloc.h \
-src/core/lib/gpr/arena.h \
src/core/lib/gpr/atm.cc \
src/core/lib/gpr/cpu_iphone.cc \
src/core/lib/gpr/cpu_linux.cc \
diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal
index 257541c653..72bb37c370 100644
--- a/tools/doxygen/Doxyfile.core.internal
+++ b/tools/doxygen/Doxyfile.core.internal
@@ -1011,6 +1011,7 @@ src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h \
src/core/ext/filters/workarounds/workaround_utils.cc \
src/core/ext/filters/workarounds/workaround_utils.h \
src/core/ext/transport/README.md \
+src/core/ext/transport/binder/README.md \
src/core/ext/transport/chttp2/README.md \
src/core/ext/transport/chttp2/alpn/alpn.cc \
src/core/ext/transport/chttp2/alpn/alpn.h \
@@ -1036,6 +1037,8 @@ src/core/ext/transport/chttp2/transport/bin_decoder.h \
src/core/ext/transport/chttp2/transport/bin_encoder.cc \
src/core/ext/transport/chttp2/transport/bin_encoder.h \
src/core/ext/transport/chttp2/transport/chttp2_plugin.cc \
+src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc \
+src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h \
src/core/ext/transport/chttp2/transport/chttp2_transport.cc \
src/core/ext/transport/chttp2/transport/chttp2_transport.h \
src/core/ext/transport/chttp2/transport/context_list.cc \
@@ -1118,10 +1121,14 @@ src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h \
src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h \
+src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c \
+src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h \
src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h \
src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c \
src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h \
+src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c \
+src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h \
src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c \
src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h \
src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c \
@@ -1134,6 +1141,8 @@ src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c \
src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h \
src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c \
src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h \
+src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c \
+src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h \
src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c \
src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h \
src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c \
@@ -1186,6 +1195,8 @@ src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c \
src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h \
src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c \
src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h \
+src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c \
+src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h \
src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c \
src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h \
src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c \
@@ -1314,10 +1325,14 @@ src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c \
@@ -1330,6 +1345,8 @@ src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c \
@@ -1380,6 +1397,8 @@ src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c \
@@ -1485,6 +1504,7 @@ src/core/lib/avl/avl.h \
src/core/lib/backoff/backoff.cc \
src/core/lib/backoff/backoff.h \
src/core/lib/channel/README.md \
+src/core/lib/channel/call_tracer.h \
src/core/lib/channel/channel_args.cc \
src/core/lib/channel/channel_args.h \
src/core/lib/channel/channel_stack.cc \
@@ -1530,13 +1550,11 @@ src/core/lib/debug/trace.h \
src/core/lib/event_engine/endpoint_config.cc \
src/core/lib/event_engine/endpoint_config_internal.h \
src/core/lib/event_engine/event_engine.cc \
-src/core/lib/event_engine/slice_allocator.cc \
src/core/lib/event_engine/sockaddr.cc \
src/core/lib/event_engine/sockaddr.h \
src/core/lib/gpr/README.md \
src/core/lib/gpr/alloc.cc \
src/core/lib/gpr/alloc.h \
-src/core/lib/gpr/arena.h \
src/core/lib/gpr/atm.cc \
src/core/lib/gpr/cpu_iphone.cc \
src/core/lib/gpr/cpu_linux.cc \
diff --git a/tools/doxygen/Doxyfile.objc b/tools/doxygen/Doxyfile.objc
index e4c8975189..8fa2ab7abc 100644
--- a/tools/doxygen/Doxyfile.objc
+++ b/tools/doxygen/Doxyfile.objc
@@ -40,7 +40,7 @@ PROJECT_NAME = "GRPC Objective-C"
# could be handy for archiving the generated documentation or if some version
# control system is used.
-PROJECT_NUMBER = 1.39.1
+PROJECT_NUMBER = 1.40.0
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a
diff --git a/tools/doxygen/Doxyfile.objc.internal b/tools/doxygen/Doxyfile.objc.internal
index f102f444ec..c3974ff424 100644
--- a/tools/doxygen/Doxyfile.objc.internal
+++ b/tools/doxygen/Doxyfile.objc.internal
@@ -40,7 +40,7 @@ PROJECT_NAME = "GRPC Objective-C"
# could be handy for archiving the generated documentation or if some version
# control system is used.
-PROJECT_NUMBER = 1.39.1
+PROJECT_NUMBER = 1.40.0
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a
diff --git a/tools/doxygen/Doxyfile.php b/tools/doxygen/Doxyfile.php
index 0c207ae3b8..aeee868117 100644
--- a/tools/doxygen/Doxyfile.php
+++ b/tools/doxygen/Doxyfile.php
@@ -40,7 +40,7 @@ PROJECT_NAME = "GRPC PHP"
# could be handy for archiving the generated documentation or if some version
# control system is used.
-PROJECT_NUMBER = 1.39.1
+PROJECT_NUMBER = 1.40.0
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a
diff --git a/tools/gcp/github_stats_tracking/fetch_data.py b/tools/gcp/github_stats_tracking/fetch_data.py
index 9cae50f4ef..ef0b07cd28 100644
--- a/tools/gcp/github_stats_tracking/fetch_data.py
+++ b/tools/gcp/github_stats_tracking/fetch_data.py
@@ -12,9 +12,12 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-from github import Github, Label
-from datetime import datetime, timedelta
+from datetime import datetime
+from datetime import timedelta
from time import time
+
+from github import Github
+from github import Label
from google.cloud import bigquery
ACCESS_TOKEN = ""
diff --git a/tools/gcp/github_stats_tracking/main.py b/tools/gcp/github_stats_tracking/main.py
index d71ea8f998..eb86f482fc 100644
--- a/tools/gcp/github_stats_tracking/main.py
+++ b/tools/gcp/github_stats_tracking/main.py
@@ -12,8 +12,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-import webapp2
from fetch_data import fetch
+import webapp2
class DailyCron(webapp2.RequestHandler):
diff --git a/tools/gcp/utils/big_query_utils.py b/tools/gcp/utils/big_query_utils.py
index 6b61756546..c5a2125c47 100755
--- a/tools/gcp/utils/big_query_utils.py
+++ b/tools/gcp/utils/big_query_utils.py
@@ -18,10 +18,10 @@ from __future__ import print_function
import argparse
import json
import uuid
-import httplib2
from apiclient import discovery
from apiclient.errors import HttpError
+import httplib2
from oauth2client.client import GoogleCredentials
# 30 days in milliseconds
diff --git a/tools/github/pr_latency.py b/tools/github/pr_latency.py
index efd57f93a2..afc6b9f88c 100644
--- a/tools/github/pr_latency.py
+++ b/tools/github/pr_latency.py
@@ -31,12 +31,13 @@ from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
+from datetime import datetime
+from datetime import timedelta
import json
import logging
import pprint
-import urllib2
-from datetime import datetime, timedelta
+import urllib2
logging.basicConfig(format='%(asctime)s %(message)s')
diff --git a/tools/internal_ci/linux/grpc_bazel_build_in_docker.sh b/tools/internal_ci/linux/grpc_bazel_build_in_docker.sh
index 623086aefd..21c4bb2472 100755
--- a/tools/internal_ci/linux/grpc_bazel_build_in_docker.sh
+++ b/tools/internal_ci/linux/grpc_bazel_build_in_docker.sh
@@ -27,12 +27,16 @@ cd /var/local/git/grpc
# Build all basic targets using the strict warning option which leverages the
# clang compiler to check if sources can pass a set of warning options.
+# For now //examples/android/binder/ are excluded because it needs Android
+# SDK/NDK to be installed to build
bazel build --define=use_strict_warning=true \
+ -- \
:all \
//src/core/... \
//src/compiler/... \
//test/... \
- //examples/...
+ //examples/... \
+ -//examples/android/binder/...
# TODO(jtattersmusch): Adding a build here for --define=grpc_no_xds is not ideal
# and we should find a better place for this. Refer
diff --git a/tools/internal_ci/linux/grpc_binder_transport_apk.cfg b/tools/internal_ci/linux/grpc_binder_transport_apk.cfg
new file mode 100644
index 0000000000..1c2b38c61b
--- /dev/null
+++ b/tools/internal_ci/linux/grpc_binder_transport_apk.cfg
@@ -0,0 +1,23 @@
+# Copyright 2021 gRPC authors.
+#
+# 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.
+
+# Config file for the internal CI (in protobuf text format)
+
+# Location of the continuous shell script in repository.
+build_file: "grpc/tools/internal_ci/linux/grpc_binder_transport_apk.sh"
+timeout_mins: 60
+env_vars {
+ key: "BAZEL_SCRIPT"
+ value: "tools/internal_ci/linux/grpc_binder_transport_apk_build_in_docker.sh"
+}
diff --git a/tools/internal_ci/linux/grpc_binder_transport_apk.sh b/tools/internal_ci/linux/grpc_binder_transport_apk.sh
new file mode 100755
index 0000000000..d85474a5fa
--- /dev/null
+++ b/tools/internal_ci/linux/grpc_binder_transport_apk.sh
@@ -0,0 +1,25 @@
+#!/usr/bin/env bash
+# Copyright 2021 gRPC authors.
+#
+# 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.
+
+set -ex
+
+# change to grpc repo root
+cd $(dirname $0)/../../..
+
+source tools/internal_ci/helper_scripts/prepare_build_linux_rc
+
+export DOCKERFILE_DIR=tools/dockerfile/test/binder_transport_apk
+export DOCKER_RUN_SCRIPT=$BAZEL_SCRIPT
+exec tools/run_tests/dockerize/build_and_run_docker.sh
diff --git a/tools/internal_ci/linux/grpc_binder_transport_apk_build_in_docker.sh b/tools/internal_ci/linux/grpc_binder_transport_apk_build_in_docker.sh
new file mode 100644
index 0000000000..45e05f4267
--- /dev/null
+++ b/tools/internal_ci/linux/grpc_binder_transport_apk_build_in_docker.sh
@@ -0,0 +1,33 @@
+# Copyright 2021 gRPC authors.
+#
+# 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.
+
+#!/usr/bin/env bash
+#
+# NOTE: No empty lines should appear in this file before igncr is set!
+set -ex -o igncr || set -ex
+
+mkdir -p /var/local/git
+git clone /var/local/jenkins/grpc /var/local/git/grpc
+(cd /var/local/jenkins/grpc/ && git submodule foreach 'cd /var/local/git/grpc \
+&& git submodule update --init --reference /var/local/jenkins/grpc/${name} \
+${name}')
+cd /var/local/git/grpc
+
+echo $ANDROID_HOME
+echo $ANDROID_NDK_HOME
+
+# Build all basic targets using the strict warning option which leverages the
+# clang compiler to check if sources can pass a set of warning options.
+bazel build --define=use_strict_warning=true \
+ //examples/android/binder/java/io/grpc/binder/cpp/example:app
diff --git a/tools/internal_ci/linux/grpc_e2e_performance_gke.sh b/tools/internal_ci/linux/grpc_e2e_performance_gke.sh
index 2fef5831e2..3a4723aecc 100755
--- a/tools/internal_ci/linux/grpc_e2e_performance_gke.sh
+++ b/tools/internal_ci/linux/grpc_e2e_performance_gke.sh
@@ -57,11 +57,16 @@ DRIVER_POOL=drivers-ci
WORKER_POOL_8CORE=workers-8core-ci
WORKER_POOL_32CORE=workers-32core-ci
+# Update go version.
+TEST_INFRA_GOVERSION=go1.16.6
+go get "golang.org/dl/${TEST_INFRA_GOVERSION}"
+"${TEST_INFRA_GOVERSION}" download
+
# Clone test-infra repository to one upper level directory than grpc.
pushd ..
git clone --recursive https://github.com/grpc/test-infra.git
cd test-infra
-make all-tools
+make GOCMD="${TEST_INFRA_GOVERSION}" all-tools
popd
# Build test configurations.
@@ -82,7 +87,7 @@ buildConfigs() {
-o "./loadtest_with_prebuilt_workers_${pool}.yaml"
}
-buildConfigs "${WORKER_POOL_8CORE}" "${BIGQUERY_TABLE_8CORE}" -l c++ -l csharp -l go -l java -l python -l ruby
+buildConfigs "${WORKER_POOL_8CORE}" "${BIGQUERY_TABLE_8CORE}" -l c++ -l csharp -l go -l java -l php7 -l php7_protobuf_c -l python -l ruby
buildConfigs "${WORKER_POOL_32CORE}" "${BIGQUERY_TABLE_32CORE}" -l c++ -l csharp -l go -l java
# Delete prebuilt images on exit.
@@ -100,6 +105,7 @@ time ../test-infra/bin/prepare_prebuilt_workers \
-l "csharp:${GRPC_CORE_GITREF}" \
-l "go:${GRPC_GO_GITREF}" \
-l "java:${GRPC_JAVA_GITREF}" \
+ -l "php7:${GRPC_CORE_GITREF}" \
-l "python:${GRPC_CORE_GITREF}" \
-l "ruby:${GRPC_CORE_GITREF}" \
-p "${PREBUILT_IMAGE_PREFIX}" \
diff --git a/tools/internal_ci/linux/grpc_e2e_performance_v2.sh b/tools/internal_ci/linux/grpc_e2e_performance_v2.sh
index 227d1c5aca..6223327775 100755
--- a/tools/internal_ci/linux/grpc_e2e_performance_v2.sh
+++ b/tools/internal_ci/linux/grpc_e2e_performance_v2.sh
@@ -26,7 +26,7 @@ gcloud auth configure-docker
# Connect to benchmarks-prod cluster.
gcloud config set project grpc-testing
-gcloud container clusters get-credentials benchmarks-prod \
+gcloud container clusters get-credentials benchmarks-prod2 \
--zone us-central1-b --project grpc-testing
# List tests that have running pods and are in errored state.
@@ -58,11 +58,16 @@ DRIVER_POOL=drivers-ci
WORKER_POOL_8CORE=workers-8core-ci
WORKER_POOL_32CORE=workers-32core-ci
+# Update go version.
+TEST_INFRA_GOVERSION=go1.16.6
+go get "golang.org/dl/${TEST_INFRA_GOVERSION}"
+"${TEST_INFRA_GOVERSION}" download
+
# Clone test-infra repository to one upper level directory than grpc.
pushd ..
git clone --recursive https://github.com/grpc/test-infra.git
cd test-infra
-make all-tools
+make GOCMD="${TEST_INFRA_GOVERSION}" all-tools
popd
# Build test configurations.
@@ -83,7 +88,7 @@ buildConfigs() {
-o "./loadtest_with_prebuilt_workers_${pool}.yaml"
}
-buildConfigs "${WORKER_POOL_8CORE}" "${BIGQUERY_TABLE_8CORE}" -l c++ -l csharp -l go -l java -l python -l ruby
+buildConfigs "${WORKER_POOL_8CORE}" "${BIGQUERY_TABLE_8CORE}" -l c++ -l csharp -l go -l java -l php7 -l php7_protobuf_c -l python -l ruby
buildConfigs "${WORKER_POOL_32CORE}" "${BIGQUERY_TABLE_32CORE}" -l c++ -l csharp -l go -l java
# Delete prebuilt images on exit.
@@ -101,6 +106,7 @@ time ../test-infra/bin/prepare_prebuilt_workers \
-l "csharp:${GRPC_CORE_GITREF}" \
-l "go:${GRPC_GO_GITREF}" \
-l "java:${GRPC_JAVA_GITREF}" \
+ -l "php7:${GRPC_CORE_GITREF}" \
-l "python:${GRPC_CORE_GITREF}" \
-l "ruby:${GRPC_CORE_GITREF}" \
-p "${PREBUILT_IMAGE_PREFIX}" \
diff --git a/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh b/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh
index f3c6e713f2..1795f046b5 100755
--- a/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh
+++ b/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh
@@ -22,8 +22,9 @@ git clone /var/local/jenkins/grpc /var/local/git/grpc
${name}')
cd /var/local/git/grpc
+python3 -m pip install virtualenv
VIRTUAL_ENV=$(mktemp -d)
-virtualenv "$VIRTUAL_ENV" -p python3
+python3 -m virtualenv "$VIRTUAL_ENV" -p python3
PYTHON="$VIRTUAL_ENV"/bin/python
"$PYTHON" -m pip install --upgrade pip==19.3.1
"$PYTHON" -m pip install --upgrade grpcio-tools google-api-python-client google-auth-httplib2 oauth2client xds-protos
diff --git a/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh b/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh
index 527f21f6d9..48680b19e1 100755
--- a/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh
+++ b/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh
@@ -22,8 +22,9 @@ git clone /var/local/jenkins/grpc /var/local/git/grpc
${name}')
cd /var/local/git/grpc
+python3 -m pip install virtualenv
VIRTUAL_ENV=$(mktemp -d)
-virtualenv "$VIRTUAL_ENV" -p python3
+python3 -m virtualenv "$VIRTUAL_ENV" -p python3
PYTHON="$VIRTUAL_ENV"/bin/python
"$PYTHON" -m pip install --upgrade pip==19.3.1
"$PYTHON" -m pip install --upgrade grpcio grpcio-tools google-api-python-client google-auth-httplib2 oauth2client xds-protos
diff --git a/tools/internal_ci/linux/grpc_xds_k8s.sh b/tools/internal_ci/linux/grpc_xds_k8s.sh
index a8cbf5d680..ba9e2cddbe 100755
--- a/tools/internal_ci/linux/grpc_xds_k8s.sh
+++ b/tools/internal_ci/linux/grpc_xds_k8s.sh
@@ -45,6 +45,11 @@ build_test_app_docker_images() {
gcloud -q auth configure-docker
docker push "${CLIENT_IMAGE_NAME}:${GIT_COMMIT}"
docker push "${SERVER_IMAGE_NAME}:${GIT_COMMIT}"
+ if [[ -n $KOKORO_JOB_NAME ]]; then
+ branch_name=$(echo "$KOKORO_JOB_NAME" | sed -E 's|^grpc/core/([^/]+)/.*|\1|')
+ tag_and_push_docker_image "${CLIENT_IMAGE_NAME}" "${GIT_COMMIT}" "${branch_name}"
+ tag_and_push_docker_image "${SERVER_IMAGE_NAME}" "${GIT_COMMIT}" "${branch_name}"
+ fi
}
#######################################
diff --git a/tools/internal_ci/linux/grpc_xds_k8s_install_test_driver.sh b/tools/internal_ci/linux/grpc_xds_k8s_install_test_driver.sh
index 740581cc5c..fd0a6d3060 100644
--- a/tools/internal_ci/linux/grpc_xds_k8s_install_test_driver.sh
+++ b/tools/internal_ci/linux/grpc_xds_k8s_install_test_driver.sh
@@ -361,3 +361,20 @@ local_setup_test_driver() {
mkdir -p "${TEST_XML_OUTPUT_DIR}"
}
+#######################################
+# Tag and push the given Docker image
+# Arguments:
+# The Docker image name
+# The Docker image original tag name
+# The Docker image new tag name
+# Outputs:
+# Writes the output to stdout, stderr, files
+#######################################
+tag_and_push_docker_image() {
+ local image_name="$1"
+ local from_tag="$2"
+ local to_tag="$3"
+
+ docker tag "${image_name}:${from_tag}" "${image_name}:${to_tag}"
+ docker push "${image_name}:${to_tag}"
+}
diff --git a/tools/internal_ci/linux/grpc_xds_k8s_python.sh b/tools/internal_ci/linux/grpc_xds_k8s_python.sh
index b6bbfc2bea..605102751b 100755
--- a/tools/internal_ci/linux/grpc_xds_k8s_python.sh
+++ b/tools/internal_ci/linux/grpc_xds_k8s_python.sh
@@ -59,6 +59,12 @@ build_test_app_docker_images() {
docker push "${CLIENT_IMAGE_NAME}:${GIT_COMMIT}"
docker push "${SERVER_IMAGE_NAME}:${GIT_COMMIT}"
+
+ if [[ -n $KOKORO_JOB_NAME ]]; then
+ branch_name=$(echo "$KOKORO_JOB_NAME" | sed -E 's|^grpc/core/([^/]+)/.*|\1|')
+ tag_and_push_docker_image "${CLIENT_IMAGE_NAME}" "${GIT_COMMIT}" "${branch_name}"
+ tag_and_push_docker_image "${SERVER_IMAGE_NAME}" "${GIT_COMMIT}" "${branch_name}"
+ fi
}
#######################################
diff --git a/tools/internal_ci/linux/grpc_xds_url_map.sh b/tools/internal_ci/linux/grpc_xds_url_map.sh
index ef726c63b3..ea173c4d5d 100755
--- a/tools/internal_ci/linux/grpc_xds_url_map.sh
+++ b/tools/internal_ci/linux/grpc_xds_url_map.sh
@@ -18,8 +18,8 @@ set -ex -o igncr || set -ex
# Constants
readonly GITHUB_REPOSITORY_NAME="grpc"
# GKE Cluster
-readonly GKE_CLUSTER_NAME="interop-test-psm-sec-v2-us-central1-a"
-readonly GKE_CLUSTER_ZONE="us-central1-a"
+readonly GKE_CLUSTER_NAME="interop-test-psm-basic"
+readonly GKE_CLUSTER_ZONE="us-central1-c"
## xDS test client Docker images
readonly CLIENT_IMAGE_NAME="gcr.io/grpc-testing/xds-interop/cpp-client"
readonly FORCE_IMAGE_BUILD="${FORCE_IMAGE_BUILD:-0}"
@@ -87,18 +87,12 @@ run_test() {
# https://github.com/grpc/grpc/tree/master/tools/run_tests/xds_k8s_test_driver#basic-usage
local test_name="${1:?Usage: run_test test_name}"
set -x
- # NOTE(lidiz) we pin the server image to java-server because: 1. only Java
- # server understands the rpc-behavior metadata; 2. all UrlMap tests today are
- # testing client-side logic.
python -m "tests.${test_name}" \
--flagfile="${TEST_DRIVER_FLAGFILE}" \
--kube_context="${KUBE_CONTEXT}" \
- --namespace="interop-psm-url-map" \
- --server_xds_port=8848 \
- --server_image="gcr.io/grpc-testing/xds-interop/java-server:d22f93e1ade22a1e026b57210f6fc21f7a3ca0cf" \
--client_image="${CLIENT_IMAGE_NAME}:${GIT_COMMIT}" \
--xml_output_file="${TEST_XML_OUTPUT_DIR}/${test_name}/sponge_log.xml" \
- --strategy="reuse"
+ --flagfile="config/url-map.cfg"
set +x
}
diff --git a/tools/internal_ci/linux/grpc_xds_url_map_python.cfg b/tools/internal_ci/linux/grpc_xds_url_map_python.cfg
new file mode 100644
index 0000000000..0fb04aa457
--- /dev/null
+++ b/tools/internal_ci/linux/grpc_xds_url_map_python.cfg
@@ -0,0 +1,26 @@
+# Copyright 2021 gRPC authors.
+#
+# 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.
+
+# Config file for the internal CI (in protobuf text format)
+
+# Location of the continuous shell script in repository.
+build_file: "grpc/tools/internal_ci/linux/grpc_xds_url_map_python.sh"
+timeout_mins: 120
+action {
+ define_artifacts {
+ regex: "artifacts/**/*sponge_log.xml"
+ regex: "artifacts/**/*sponge_log.log"
+ strip_prefix: "artifacts"
+ }
+}
diff --git a/tools/internal_ci/linux/grpc_xds_url_map_python.sh b/tools/internal_ci/linux/grpc_xds_url_map_python.sh
new file mode 100755
index 0000000000..234ddd535c
--- /dev/null
+++ b/tools/internal_ci/linux/grpc_xds_url_map_python.sh
@@ -0,0 +1,146 @@
+#!/usr/bin/env bash
+# Copyright 2021 gRPC authors.
+#
+# 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.
+
+set -eo pipefail
+
+# Constants
+readonly GITHUB_REPOSITORY_NAME="grpc"
+# GKE Cluster
+readonly GKE_CLUSTER_NAME="interop-test-psm-basic"
+readonly GKE_CLUSTER_ZONE="us-central1-c"
+## xDS test client Docker images
+readonly CLIENT_IMAGE_NAME="gcr.io/grpc-testing/xds-interop/python-client"
+readonly FORCE_IMAGE_BUILD="${FORCE_IMAGE_BUILD:-0}"
+readonly BUILD_APP_PATH="interop-testing/build/install/grpc-interop-testing"
+readonly LANGUAGE_NAME="Python"
+
+#######################################
+# Builds test app Docker images and pushes them to GCR
+# Globals:
+# BUILD_APP_PATH
+# CLIENT_IMAGE_NAME: Test client Docker image name
+# GIT_COMMIT: SHA-1 of git commit being built
+# Arguments:
+# None
+# Outputs:
+# Writes the output of `gcloud builds submit` to stdout, stderr
+#######################################
+build_test_app_docker_images() {
+ echo "Building ${LANGUAGE_NAME} xDS interop test app Docker images"
+
+ pushd "${SRC_DIR}"
+ docker build \
+ -f src/python/grpcio_tests/tests_py3_only/interop/Dockerfile.client \
+ -t "${CLIENT_IMAGE_NAME}:${GIT_COMMIT}" \
+ .
+
+ popd
+
+ gcloud -q auth configure-docker
+
+ docker push "${CLIENT_IMAGE_NAME}:${GIT_COMMIT}"
+}
+
+#######################################
+# Builds test app and its docker images unless they already exist
+# Globals:
+# CLIENT_IMAGE_NAME: Test client Docker image name
+# GIT_COMMIT: SHA-1 of git commit being built
+# FORCE_IMAGE_BUILD
+# Arguments:
+# None
+# Outputs:
+# Writes the output to stdout, stderr
+#######################################
+build_docker_images_if_needed() {
+ # Check if images already exist
+ client_tags="$(gcloud_gcr_list_image_tags "${CLIENT_IMAGE_NAME}" "${GIT_COMMIT}")"
+ printf "Client image: %s:%s\n" "${CLIENT_IMAGE_NAME}" "${GIT_COMMIT}"
+ echo "${client_tags:-Client image not found}"
+
+ # Build if any of the images are missing, or FORCE_IMAGE_BUILD=1
+ if [[ "${FORCE_IMAGE_BUILD}" == "1" || -z "${client_tags}" ]]; then
+ build_test_app_docker_images
+ else
+ echo "Skipping ${LANGUAGE_NAME} test app build"
+ fi
+}
+
+#######################################
+# Executes the test case
+# Globals:
+# TEST_DRIVER_FLAGFILE: Relative path to test driver flagfile
+# KUBE_CONTEXT: The name of kubectl context with GKE cluster access
+# TEST_XML_OUTPUT_DIR: Output directory for the test xUnit XML report
+# CLIENT_IMAGE_NAME: Test client Docker image name
+# GIT_COMMIT: SHA-1 of git commit being built
+# Arguments:
+# Test case name
+# Outputs:
+# Writes the output of test execution to stdout, stderr
+# Test xUnit report to ${TEST_XML_OUTPUT_DIR}/${test_name}/sponge_log.xml
+#######################################
+run_test() {
+ # Test driver usage:
+ # https://github.com/grpc/grpc/tree/master/tools/run_tests/xds_k8s_test_driver#basic-usage
+ local test_name="${1:?Usage: run_test test_name}"
+ set -x
+ python -m "tests.${test_name}" \
+ --flagfile="${TEST_DRIVER_FLAGFILE}" \
+ --kube_context="${KUBE_CONTEXT}" \
+ --client_image="${CLIENT_IMAGE_NAME}:${GIT_COMMIT}" \
+ --xml_output_file="${TEST_XML_OUTPUT_DIR}/${test_name}/sponge_log.xml" \
+ --flagfile="config/url-map.cfg"
+ set +x
+}
+
+#######################################
+# Main function: provision software necessary to execute tests, and run them
+# Globals:
+# KOKORO_ARTIFACTS_DIR
+# GITHUB_REPOSITORY_NAME
+# SRC_DIR: Populated with absolute path to the source repo
+# TEST_DRIVER_REPO_DIR: Populated with the path to the repo containing
+# the test driver
+# TEST_DRIVER_FULL_DIR: Populated with the path to the test driver source code
+# TEST_DRIVER_FLAGFILE: Populated with relative path to test driver flagfile
+# TEST_XML_OUTPUT_DIR: Populated with the path to test xUnit XML report
+# GIT_ORIGIN_URL: Populated with the origin URL of git repo used for the build
+# GIT_COMMIT: Populated with the SHA-1 of git commit being built
+# GIT_COMMIT_SHORT: Populated with the short SHA-1 of git commit being built
+# KUBE_CONTEXT: Populated with name of kubectl context with GKE cluster access
+# Arguments:
+# None
+# Outputs:
+# Writes the output of test execution to stdout, stderr
+#######################################
+main() {
+ local script_dir
+ script_dir="$(dirname "$0")"
+ # shellcheck source=tools/internal_ci/linux/grpc_xds_k8s_install_test_driver.sh
+ source "${script_dir}/grpc_xds_k8s_install_test_driver.sh"
+ set -x
+ if [[ -n "${KOKORO_ARTIFACTS_DIR}" ]]; then
+ kokoro_setup_test_driver "${GITHUB_REPOSITORY_NAME}"
+ else
+ local_setup_test_driver "${script_dir}"
+ fi
+ build_docker_images_if_needed
+ # Run tests
+ cd "${TEST_DRIVER_FULL_DIR}"
+ run_test url_map
+}
+
+main "$@"
diff --git a/tools/internal_ci/windows/bazel_rbe.bat b/tools/internal_ci/windows/bazel_rbe.bat
index 65397a7768..b26b09e73c 100644
--- a/tools/internal_ci/windows/bazel_rbe.bat
+++ b/tools/internal_ci/windows/bazel_rbe.bat
@@ -24,7 +24,7 @@ powershell -Command "[guid]::NewGuid().ToString()" >%KOKORO_ARTIFACTS_DIR%/bazel
set /p BAZEL_INVOCATION_ID=<%KOKORO_ARTIFACTS_DIR%/bazel_invocation_ids
@rem TODO(jtattermusch): windows RBE should be able to use the same credentials as Linux RBE.
-bazel --bazelrc=tools/remote_build/windows.bazelrc test --invocation_id="%BAZEL_INVOCATION_ID%" %BAZEL_FLAGS% --workspace_status_command=tools/remote_build/workspace_status_kokoro.bat //test/...
+bazel --bazelrc=tools/remote_build/windows.bazelrc --output_user_root=T:\_bazel_output test --invocation_id="%BAZEL_INVOCATION_ID%" %BAZEL_FLAGS% --workspace_status_command=tools/remote_build/workspace_status_kokoro.bat //test/...
set BAZEL_EXITCODE=%errorlevel%
if not "%UPLOAD_TEST_RESULTS%"=="" (
diff --git a/tools/interop_matrix/client_matrix.py b/tools/interop_matrix/client_matrix.py
index 0644999f24..6a8ed32a83 100644
--- a/tools/interop_matrix/client_matrix.py
+++ b/tools/interop_matrix/client_matrix.py
@@ -188,7 +188,8 @@ LANG_RELEASE_MATRIX = {
('v1.36.0', ReleaseInfo(runtimes=['go1.11'])),
('v1.37.0', ReleaseInfo(runtimes=['go1.11'])),
# NOTE: starting from release v1.38.0, use runtimes=['go1.16']
- ('v1.38.0', ReleaseInfo(runtimes=['go1.16'])),
+ ('v1.38.1', ReleaseInfo(runtimes=['go1.16'])),
+ ('v1.39.0', ReleaseInfo(runtimes=['go1.16'])),
]),
'java':
OrderedDict([
@@ -261,6 +262,7 @@ LANG_RELEASE_MATRIX = {
('v1.36.1', ReleaseInfo()),
('v1.37.1', ReleaseInfo()),
('v1.38.1', ReleaseInfo()),
+ ('v1.39.0', ReleaseInfo()),
]),
'python':
OrderedDict([
diff --git a/tools/line_count/collect-history.py b/tools/line_count/collect-history.py
index c8e33c9ed2..6e21aaf45d 100755
--- a/tools/line_count/collect-history.py
+++ b/tools/line_count/collect-history.py
@@ -13,8 +13,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-import subprocess
import datetime
+import subprocess
# this script is only of historical interest: it's the script that was used to
# bootstrap the dataset
diff --git a/tools/line_count/summarize-history.py b/tools/line_count/summarize-history.py
index 4a085999a5..b173b5ed2f 100755
--- a/tools/line_count/summarize-history.py
+++ b/tools/line_count/summarize-history.py
@@ -13,8 +13,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-import subprocess
import datetime
+import subprocess
# this script is only of historical interest: it's the script that was used to
# bootstrap the dataset
diff --git a/tools/line_count/yaml2csv.py b/tools/line_count/yaml2csv.py
index bf2baf3351..98d42a3bff 100755
--- a/tools/line_count/yaml2csv.py
+++ b/tools/line_count/yaml2csv.py
@@ -13,10 +13,11 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-import yaml
import argparse
-import datetime
import csv
+import datetime
+
+import yaml
argp = argparse.ArgumentParser(description='Convert cloc yaml to bigquery csv')
argp.add_argument('-i', '--input', type=str)
diff --git a/tools/profiling/ios_bin/binary_size.py b/tools/profiling/ios_bin/binary_size.py
index ffb5186736..76be0c5126 100755
--- a/tools/profiling/ios_bin/binary_size.py
+++ b/tools/profiling/ios_bin/binary_size.py
@@ -21,6 +21,7 @@ import os
import shutil
import subprocess
import sys
+
from parse_link_map import parse_link_map
sys.path.append(
diff --git a/tools/profiling/ios_bin/parse_link_map.py b/tools/profiling/ios_bin/parse_link_map.py
index 95ca153a39..cfb89a9315 100755
--- a/tools/profiling/ios_bin/parse_link_map.py
+++ b/tools/profiling/ios_bin/parse_link_map.py
@@ -18,8 +18,8 @@
# symbols.
# The script takes one parameter, which is the path to the link map file.
-import sys
import re
+import sys
def parse_link_map(filename):
diff --git a/tools/profiling/microbenchmarks/bm2bq.py b/tools/profiling/microbenchmarks/bm2bq.py
index fe2e49ab64..49dc39009f 100755
--- a/tools/profiling/microbenchmarks/bm2bq.py
+++ b/tools/profiling/microbenchmarks/bm2bq.py
@@ -17,12 +17,12 @@
# Convert google-benchmark json output to something that can be uploaded to
# BigQuery
-import sys
-import json
import csv
-import bm_json
import json
import subprocess
+import sys
+
+import bm_json
columns = []
diff --git a/tools/profiling/qps/qps_diff.py b/tools/profiling/qps/qps_diff.py
index d36b96c3a1..7d92261e84 100755
--- a/tools/profiling/qps/qps_diff.py
+++ b/tools/profiling/qps/qps_diff.py
@@ -19,10 +19,11 @@ import argparse
import json
import multiprocessing
import os
-import qps_scenarios
import shutil
import subprocess
import sys
+
+import qps_scenarios
import tabulate
sys.path.append(
diff --git a/tools/release/release_notes.py b/tools/release/release_notes.py
index afa67a320f..8dc9e0dfe8 100644
--- a/tools/release/release_notes.py
+++ b/tools/release/release_notes.py
@@ -26,8 +26,8 @@ X will be v1.17.2. In both cases Y will be origin/v1.17.x.
"""
-from collections import defaultdict
import base64
+from collections import defaultdict
import json
content_header = """Draft Release Notes For {version}
@@ -98,10 +98,14 @@ def get_pr_data(pr_num):
"""Get the PR data from github. Return 'error' on exception"""
try:
- from urllib2 import Request, urlopen, HTTPError
+ from urllib2 import HTTPError
+ from urllib2 import Request
+ from urllib2 import urlopen
except ImportError:
import urllib
- from urllib.request import Request, urlopen, HTTPError
+ from urllib.request import HTTPError
+ from urllib.request import Request
+ from urllib.request import urlopen
url = API_URL + pr_num
req = Request(url)
req.add_header('Authorization', 'token %s' % TOKEN)
diff --git a/tools/release/verify_python_release.py b/tools/release/verify_python_release.py
index 42eea0f19d..d84d848a88 100644
--- a/tools/release/verify_python_release.py
+++ b/tools/release/verify_python_release.py
@@ -30,9 +30,10 @@ import argparse
import collections
import hashlib
import os
-import requests
import sys
+import requests
+
_DEFAULT_PACKAGES = [
"grpcio",
"grpcio-tools",
diff --git a/tools/run_tests/artifacts/artifact_targets.py b/tools/run_tests/artifacts/artifact_targets.py
index ec9d33e782..0fa32cf313 100644
--- a/tools/run_tests/artifacts/artifact_targets.py
+++ b/tools/run_tests/artifacts/artifact_targets.py
@@ -358,15 +358,11 @@ def targets():
PythonArtifact('manylinux2014', 'x86', 'cp37-cp37m'),
PythonArtifact('manylinux2014', 'x86', 'cp38-cp38'),
PythonArtifact('manylinux2014', 'x86', 'cp39-cp39'),
- PythonArtifact('manylinux2010', 'x64', 'cp27-cp27m'),
- PythonArtifact('manylinux2010', 'x64', 'cp27-cp27mu'),
PythonArtifact('manylinux2010', 'x64', 'cp35-cp35m'),
PythonArtifact('manylinux2010', 'x64', 'cp36-cp36m'),
PythonArtifact('manylinux2010', 'x64', 'cp37-cp37m'),
PythonArtifact('manylinux2010', 'x64', 'cp38-cp38'),
PythonArtifact('manylinux2010', 'x64', 'cp39-cp39'),
- PythonArtifact('manylinux2010', 'x86', 'cp27-cp27m'),
- PythonArtifact('manylinux2010', 'x86', 'cp27-cp27mu'),
PythonArtifact('manylinux2010', 'x86', 'cp35-cp35m'),
PythonArtifact('manylinux2010', 'x86', 'cp36-cp36m'),
PythonArtifact('manylinux2010', 'x86', 'cp37-cp37m'),
@@ -380,19 +376,16 @@ def targets():
PythonArtifact('linux_extra', 'armv7', 'cp37-cp37m'),
PythonArtifact('linux_extra', 'armv7', 'cp38-cp38'),
PythonArtifact('linux_extra', 'armv7', 'cp39-cp39'),
- PythonArtifact('macos', 'x64', 'python2.7'),
PythonArtifact('macos', 'x64', 'python3.5'),
PythonArtifact('macos', 'x64', 'python3.6'),
PythonArtifact('macos', 'x64', 'python3.7'),
PythonArtifact('macos', 'x64', 'python3.8'),
PythonArtifact('macos', 'x64', 'python3.9'),
- PythonArtifact('windows', 'x86', 'Python27_32bit'),
PythonArtifact('windows', 'x86', 'Python35_32bit'),
PythonArtifact('windows', 'x86', 'Python36_32bit'),
PythonArtifact('windows', 'x86', 'Python37_32bit'),
PythonArtifact('windows', 'x86', 'Python38_32bit'),
PythonArtifact('windows', 'x86', 'Python39_32bit'),
- PythonArtifact('windows', 'x64', 'Python27'),
PythonArtifact('windows', 'x64', 'Python35'),
PythonArtifact('windows', 'x64', 'Python36'),
PythonArtifact('windows', 'x64', 'Python37'),
diff --git a/tools/run_tests/artifacts/distribtest_targets.py b/tools/run_tests/artifacts/distribtest_targets.py
index a2c8d6b1cd..2379833155 100644
--- a/tools/run_tests/artifacts/distribtest_targets.py
+++ b/tools/run_tests/artifacts/distribtest_targets.py
@@ -344,11 +344,10 @@ def targets():
CSharpDistribTest('windows', 'x86'),
CSharpDistribTest('windows', 'x64'),
# Python
- PythonDistribTest('linux', 'x64', 'jessie'),
- PythonDistribTest('linux', 'x86', 'jessie'),
- PythonDistribTest('linux', 'x64', 'centos6'),
+ PythonDistribTest('linux', 'x64', 'stretch'),
+ PythonDistribTest('linux', 'x86', 'stretch'),
PythonDistribTest('linux', 'x64', 'centos7'),
- PythonDistribTest('linux', 'x64', 'fedora23'),
+ PythonDistribTest('linux', 'x64', 'fedora34'),
PythonDistribTest('linux', 'x64', 'opensuse'),
PythonDistribTest('linux', 'x64', 'arch'),
PythonDistribTest('linux', 'x64', 'ubuntu1604'),
diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json
index 1def94824d..dcb778ee12 100644
--- a/tools/run_tests/generated/tests.json
+++ b/tools/run_tests/generated/tests.json
@@ -3431,6 +3431,54 @@
},
{
"args": [],
+ "benchmark": false,
+ "ci_platforms": [
+ "linux",
+ "mac",
+ "posix",
+ "windows"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "exclude_iomgrs": [],
+ "flaky": false,
+ "gtest": true,
+ "language": "c++",
+ "name": "binder_smoke_test",
+ "platforms": [
+ "linux",
+ "mac",
+ "posix",
+ "windows"
+ ],
+ "uses_polling": false
+ },
+ {
+ "args": [],
+ "benchmark": false,
+ "ci_platforms": [
+ "linux",
+ "mac",
+ "posix",
+ "windows"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "exclude_iomgrs": [],
+ "flaky": false,
+ "gtest": true,
+ "language": "c++",
+ "name": "bitset_test",
+ "platforms": [
+ "linux",
+ "mac",
+ "posix",
+ "windows"
+ ],
+ "uses_polling": false
+ },
+ {
+ "args": [],
"benchmark": true,
"ci_platforms": [
"linux",
@@ -5216,6 +5264,30 @@
"flaky": false,
"gtest": true,
"language": "c++",
+ "name": "match_test",
+ "platforms": [
+ "linux",
+ "mac",
+ "posix",
+ "windows"
+ ],
+ "uses_polling": false
+ },
+ {
+ "args": [],
+ "benchmark": false,
+ "ci_platforms": [
+ "linux",
+ "mac",
+ "posix",
+ "windows"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "exclude_iomgrs": [],
+ "flaky": false,
+ "gtest": true,
+ "language": "c++",
"name": "matchers_test",
"platforms": [
"linux",
@@ -5408,6 +5480,30 @@
"flaky": false,
"gtest": true,
"language": "c++",
+ "name": "overload_test",
+ "platforms": [
+ "linux",
+ "mac",
+ "posix",
+ "windows"
+ ],
+ "uses_polling": false
+ },
+ {
+ "args": [],
+ "benchmark": false,
+ "ci_platforms": [
+ "linux",
+ "mac",
+ "posix",
+ "windows"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "exclude_iomgrs": [],
+ "flaky": false,
+ "gtest": true,
+ "language": "c++",
"name": "pid_controller_test",
"platforms": [
"linux",
@@ -6234,6 +6330,30 @@
"flaky": false,
"gtest": true,
"language": "c++",
+ "name": "table_test",
+ "platforms": [
+ "linux",
+ "mac",
+ "posix",
+ "windows"
+ ],
+ "uses_polling": false
+ },
+ {
+ "args": [],
+ "benchmark": false,
+ "ci_platforms": [
+ "linux",
+ "mac",
+ "posix",
+ "windows"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "exclude_iomgrs": [],
+ "flaky": false,
+ "gtest": true,
+ "language": "c++",
"name": "test_cpp_client_credentials_test",
"platforms": [
"linux",
diff --git a/tools/run_tests/lb_interop_tests/gen_build_yaml.py b/tools/run_tests/lb_interop_tests/gen_build_yaml.py
index 1a36e1e393..7dc313e28d 100755
--- a/tools/run_tests/lb_interop_tests/gen_build_yaml.py
+++ b/tools/run_tests/lb_interop_tests/gen_build_yaml.py
@@ -16,6 +16,7 @@
import json
import os
+
import yaml
all_scenarios = []
diff --git a/tools/run_tests/performance/README.md b/tools/run_tests/performance/README.md
index 8f2b0ffed4..569e7a860d 100644
--- a/tools/run_tests/performance/README.md
+++ b/tools/run_tests/performance/README.md
@@ -159,7 +159,11 @@ $ go tool pprof --text --alloc_space http://localhost:<pprof_port>/debug/heap
The scripts in this section generate LoadTest configurations for the GKE-based
gRPC OSS benchmarks framework. This framework is stored in a separate
-repository, [grpc/test-infra](https://github.com/grpc/test-infra).
+repository, [grpc/test-infra].
+
+These scripts, together with tools defined in [grpc/test-infra], are used in the
+continuous integration setup defined in [grpc_e2e_performance_gke.sh] and
+[grpc_e2e_performance_v2.sh].
### Generating scenarios
@@ -350,9 +354,8 @@ configurations will be created. The script produces a set of basic
configurations, as well as a set of template configurations intended to be used
with prebuilt images.
-The [examples](https://github.com/grpc/test-infra/tree/master/config/samples)
-in the repository [grpc/test-infra](https://github.com/grpc/test-infra) are
-generated by this script.
+The [examples](https://github.com/grpc/test-infra/tree/master/config/samples) in
+the repository [grpc/test-infra] are generated by this script.
### Generating configuration templates
@@ -364,8 +367,8 @@ configurations or templates.
The example template in
[loadtest_template_basic_template_all_languages.yaml](./templates/loadtest_template_basic_all_languages.yaml)
-was generated from the example configurations in
-[grpc/test-infra](https://github.com/grpc/test-infra) by the following command:
+was generated from the example configurations in [grpc/test-infra] by the
+following command:
```
$ ./tools/run_tests/performance/loadtest_template.py \
@@ -431,15 +434,20 @@ different ways.
Collections of tests generated by `loadtest_config.py` are intended to be run
with a test runner. The code for the test runner is stored in a separate
-repository, [grpc/test-infra](https://github.com/grpc/test-infra).
+repository, [grpc/test-infra].
The test runner applies the tests to the cluster, and monitors the tests for
completion while they are running. The test runner can also be set up to run
collections of tests in parallel on separate node pools, and to limit the number
of tests running in parallel on each pool.
-The test runner is used in the continuous integration setup defined in
+For more information, see the
+[tools README](https://github.com/grpc/test-infra/blob/master/tools/README.md)
+in [grpc/test-infra].
+
+For usage examples, see the continuous integration setup defined in
[grpc_e2e_performance_gke.sh] and [grpc_e2e_performance_v2.sh].
+[grpc/test-infra]: https://github.com/grpc/test-infra
[grpc_e2e_performance_gke.sh]: ../../internal_ci/linux/grpc_e2e_performance_gke.sh
[grpc_e2e_performance_v2.sh]: ../../internal_ci/linux/grpc_e2e_performance_v2.sh
diff --git a/tools/run_tests/performance/bq_upload_result.py b/tools/run_tests/performance/bq_upload_result.py
index be1e0c3fd5..7139cc3635 100755
--- a/tools/run_tests/performance/bq_upload_result.py
+++ b/tools/run_tests/performance/bq_upload_result.py
@@ -24,6 +24,7 @@ import os
import sys
import time
import uuid
+
import massage_qps_stats
gcp_utils_dir = os.path.abspath(
diff --git a/tools/run_tests/performance/loadtest_concat_yaml.py b/tools/run_tests/performance/loadtest_concat_yaml.py
index bf64fdc634..a6ab10dc40 100755
--- a/tools/run_tests/performance/loadtest_concat_yaml.py
+++ b/tools/run_tests/performance/loadtest_concat_yaml.py
@@ -22,7 +22,6 @@
import argparse
import sys
-
from typing import Iterable
diff --git a/tools/run_tests/performance/loadtest_config.py b/tools/run_tests/performance/loadtest_config.py
index 0d21ec0c54..14a68efe93 100755
--- a/tools/run_tests/performance/loadtest_config.py
+++ b/tools/run_tests/performance/loadtest_config.py
@@ -26,18 +26,16 @@ import collections
import copy
import datetime
import itertools
+import json
import os
import string
import sys
-import uuid
-
from typing import Any, Dict, Iterable, Mapping, Optional, Type
-
-import json
-import yaml
+import uuid
import scenario_config
import scenario_config_exporter
+import yaml
CONFIGURATION_FILE_HEADER_COMMENT = """
# Load test configurations generated from a template by loadtest_config.py.
diff --git a/tools/run_tests/performance/loadtest_examples.sh b/tools/run_tests/performance/loadtest_examples.sh
index 55efcadda4..c7714b3efd 100755
--- a/tools/run_tests/performance/loadtest_examples.sh
+++ b/tools/run_tests/performance/loadtest_examples.sh
@@ -42,6 +42,10 @@ example_file() {
echo "python_asyncio${suffix}"
return
fi
+ if [[ "${scenario#php7_protobuf_c_}" != "${scenario}" ]]; then
+ echo "php7_protobuf_c${suffix}"
+ return
+ fi
echo "${scenario%%_*}${suffix}"
}
@@ -55,6 +59,10 @@ example_language() {
echo "python_asyncio"
return
fi
+ if [[ "${filename#php7_protobuf_c_}" != "${filename}" ]]; then
+ echo "php7_protobuf_c"
+ return
+ fi
echo "${filename%%_*}"
}
@@ -65,6 +73,7 @@ scenarios=(
"java_generic_async_streaming_ping_pong_secure"
"node_to_node_generic_async_streaming_ping_pong_secure"
"php7_protobuf_php_extension_to_cpp_protobuf_sync_unary_ping_pong"
+ "php7_protobuf_c_extension_to_cpp_protobuf_sync_unary_ping_pong"
"python_generic_sync_streaming_ping_pong"
"python_asyncio_generic_async_streaming_ping_pong"
"ruby_protobuf_sync_streaming_ping_pong"
diff --git a/tools/run_tests/performance/loadtest_template.py b/tools/run_tests/performance/loadtest_template.py
index 58145526d3..e47c0fca87 100755
--- a/tools/run_tests/performance/loadtest_template.py
+++ b/tools/run_tests/performance/loadtest_template.py
@@ -27,12 +27,10 @@
import argparse
import sys
-
from typing import Any, Dict, Iterable, List, Mapping, Type
-import yaml
-
import loadtest_config
+import yaml
TEMPLATE_FILE_HEADER_COMMENT = """
# Template generated from load test configurations by loadtest_template.py.
diff --git a/tools/run_tests/performance/scenario_config_exporter.py b/tools/run_tests/performance/scenario_config_exporter.py
index 482249e2fd..a5becefc06 100755
--- a/tools/run_tests/performance/scenario_config_exporter.py
+++ b/tools/run_tests/performance/scenario_config_exporter.py
@@ -42,7 +42,6 @@ import collections
import json
import re
import sys
-
from typing import Any, Callable, Dict, Iterable, NamedTuple
import scenario_config
diff --git a/tools/run_tests/performance/templates/loadtest_template_basic_all_languages.yaml b/tools/run_tests/performance/templates/loadtest_template_basic_all_languages.yaml
index 01084acdb4..7fd3418b36 100644
--- a/tools/run_tests/performance/templates/loadtest_template_basic_all_languages.yaml
+++ b/tools/run_tests/performance/templates/loadtest_template_basic_all_languages.yaml
@@ -121,9 +121,30 @@ spec:
language: php7
pool: ${client_pool}
run:
+ args:
+ - -c
+ - |
+ timeout --kill-after="${KILL_AFTER}" "${POD_TIMEOUT}" \
+ /run_scripts/run_worker.sh
+ command:
+ - bash
+ - build:
+ command:
+ - bash
+ - /build_scripts/build_qps_worker.sh
+ clone:
+ gitRef: master
+ repo: https://github.com/grpc/grpc.git
+ language: php7_protobuf_c
+ pool: ${client_pool}
+ run:
+ args:
+ - -c
+ - |
+ timeout --kill-after="${KILL_AFTER}" "${POD_TIMEOUT}" \
+ /run_scripts/run_protobuf_c_worker.sh
command:
- bash
- - /run_scripts/run_worker.sh
- build:
args:
- build
@@ -181,6 +202,9 @@ spec:
src/ruby/qps/worker.rb --driver_port="${DRIVER_PORT}"
command:
- bash
+ driver:
+ language: cxx
+ run: {}
results:
bigQueryTable: ${big_query_table}
servers:
diff --git a/tools/run_tests/performance/templates/loadtest_template_prebuilt_all_languages.yaml b/tools/run_tests/performance/templates/loadtest_template_prebuilt_all_languages.yaml
index b97490eeb0..1d0b71cba6 100644
--- a/tools/run_tests/performance/templates/loadtest_template_prebuilt_all_languages.yaml
+++ b/tools/run_tests/performance/templates/loadtest_template_prebuilt_all_languages.yaml
@@ -77,10 +77,25 @@ spec:
- language: php7
pool: ${client_pool}
run:
+ args:
+ - -c
+ - |
+ timeout --kill-after="${KILL_AFTER}" "${POD_TIMEOUT}" \
+ /run_scripts/run_worker.sh
+ command:
+ - bash
+ image: ${prebuilt_image_prefix}/php7:${prebuilt_image_tag}
+ - language: php7_protobuf_c
+ pool: ${client_pool}
+ run:
+ args:
+ - -c
+ - |
+ timeout --kill-after="${KILL_AFTER}" "${POD_TIMEOUT}" \
+ /run_scripts/run_protobuf_c_worker.sh
command:
- bash
- - /run_scripts/run_worker.sh
- image: ${prebuilt_image_prefix}/php:${prebuilt_image_tag}
+ image: ${prebuilt_image_prefix}/php7:${prebuilt_image_tag}
- language: python
pool: ${client_pool}
run:
diff --git a/tools/run_tests/python_utils/check_on_pr.py b/tools/run_tests/python_utils/check_on_pr.py
index 7dd0b258e8..12db1c4d45 100644
--- a/tools/run_tests/python_utils/check_on_pr.py
+++ b/tools/run_tests/python_utils/check_on_pr.py
@@ -13,15 +13,16 @@
# limitations under the License.
from __future__ import print_function
+
+import datetime
+import json
import os
import sys
-import json
import time
-import datetime
import traceback
-import requests
import jwt
+import requests
_GITHUB_API_PREFIX = 'https://api.github.com'
_GITHUB_REPO = 'grpc/grpc'
diff --git a/tools/run_tests/python_utils/dockerjob.py b/tools/run_tests/python_utils/dockerjob.py
index 206a6cd353..dcfc5bc43a 100755
--- a/tools/run_tests/python_utils/dockerjob.py
+++ b/tools/run_tests/python_utils/dockerjob.py
@@ -15,12 +15,12 @@
from __future__ import print_function
+import json
+import os
+import subprocess
import tempfile
import time
import uuid
-import os
-import subprocess
-import json
import jobset
diff --git a/tools/run_tests/python_utils/download_and_unzip.py b/tools/run_tests/python_utils/download_and_unzip.py
index e4b574fa3f..440572691f 100644
--- a/tools/run_tests/python_utils/download_and_unzip.py
+++ b/tools/run_tests/python_utils/download_and_unzip.py
@@ -17,9 +17,10 @@ from __future__ import print_function
import os
import sys
+import tempfile
import zipfile
+
import requests
-import tempfile
def main():
diff --git a/tools/run_tests/python_utils/filter_pull_request_tests.py b/tools/run_tests/python_utils/filter_pull_request_tests.py
index c8574ad673..2035aff97c 100644
--- a/tools/run_tests/python_utils/filter_pull_request_tests.py
+++ b/tools/run_tests/python_utils/filter_pull_request_tests.py
@@ -17,9 +17,10 @@
from __future__ import print_function
import re
-import six
import subprocess
+import six
+
class TestSuite:
"""
diff --git a/tools/run_tests/python_utils/jobset.py b/tools/run_tests/python_utils/jobset.py
index 552d16cc37..60ce0e0664 100755
--- a/tools/run_tests/python_utils/jobset.py
+++ b/tools/run_tests/python_utils/jobset.py
@@ -13,6 +13,7 @@
# limitations under the License.
"""Run a group of subprocesses and then finish."""
+import errno
import logging
import multiprocessing
import os
@@ -23,7 +24,6 @@ import subprocess
import sys
import tempfile
import time
-import errno
# cpu cost measurement
measure_cpu_costs = False
diff --git a/tools/run_tests/python_utils/port_server.py b/tools/run_tests/python_utils/port_server.py
index c934f832ab..db1d755ea9 100755
--- a/tools/run_tests/python_utils/port_server.py
+++ b/tools/run_tests/python_utils/port_server.py
@@ -17,16 +17,18 @@
from __future__ import print_function
import argparse
-from six.moves.BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
-from six.moves.socketserver import ThreadingMixIn
import hashlib
import os
+import platform
+import random
import socket
import sys
-import time
-import random
import threading
-import platform
+import time
+
+from six.moves.BaseHTTPServer import BaseHTTPRequestHandler
+from six.moves.BaseHTTPServer import HTTPServer
+from six.moves.socketserver import ThreadingMixIn
# increment this number whenever making a change to ensure that
# the changes are picked up by running CI servers
diff --git a/tools/run_tests/python_utils/report_utils.py b/tools/run_tests/python_utils/report_utils.py
index 666edbf63d..4b131d932b 100644
--- a/tools/run_tests/python_utils/report_utils.py
+++ b/tools/run_tests/python_utils/report_utils.py
@@ -14,15 +14,16 @@
"""Generate XML and HTML test reports."""
try:
+ from mako import exceptions
from mako.runtime import Context
from mako.template import Template
- from mako import exceptions
except (ImportError):
pass # Mako not installed but it is ok.
import datetime
import os
import string
import xml.etree.cElementTree as ET
+
import six
diff --git a/tools/run_tests/python_utils/start_port_server.py b/tools/run_tests/python_utils/start_port_server.py
index 5915f440ba..b5c615674c 100644
--- a/tools/run_tests/python_utils/start_port_server.py
+++ b/tools/run_tests/python_utils/start_port_server.py
@@ -15,9 +15,6 @@
from __future__ import print_function
-from . import jobset
-
-import six.moves.urllib.request as request
import logging
import os
import socket
@@ -26,6 +23,10 @@ import sys
import tempfile
import time
+import six.moves.urllib.request as request
+
+from . import jobset
+
# must be synchronized with test/core/util/port_server_client.h
_PORT_SERVER_PORT = 32766
diff --git a/tools/run_tests/python_utils/upload_rbe_results.py b/tools/run_tests/python_utils/upload_rbe_results.py
index 93fec98c48..6eede084d6 100755
--- a/tools/run_tests/python_utils/upload_rbe_results.py
+++ b/tools/run_tests/python_utils/upload_rbe_results.py
@@ -15,12 +15,13 @@
"""Uploads RBE results to BigQuery"""
import argparse
-import os
import json
+import os
import sys
-import urllib2
import uuid
+import urllib2
+
gcp_utils_dir = os.path.abspath(
os.path.join(os.path.dirname(__file__), '../../gcp/utils'))
sys.path.append(gcp_utils_dir)
diff --git a/tools/run_tests/python_utils/upload_test_results.py b/tools/run_tests/python_utils/upload_test_results.py
index 0e4a26ddec..e3a63a35b6 100644
--- a/tools/run_tests/python_utils/upload_test_results.py
+++ b/tools/run_tests/python_utils/upload_test_results.py
@@ -17,11 +17,12 @@
from __future__ import print_function
import os
-import six
import sys
import time
import uuid
+import six
+
gcp_utils_dir = os.path.abspath(
os.path.join(os.path.dirname(__file__), '../../gcp/utils'))
sys.path.append(gcp_utils_dir)
diff --git a/tools/run_tests/python_utils/watch_dirs.py b/tools/run_tests/python_utils/watch_dirs.py
index 7befcca553..b9e2cfa0c8 100755
--- a/tools/run_tests/python_utils/watch_dirs.py
+++ b/tools/run_tests/python_utils/watch_dirs.py
@@ -15,6 +15,7 @@
import os
import time
+
from six import string_types
diff --git a/tools/run_tests/run_grpclb_interop_tests.py b/tools/run_tests/run_grpclb_interop_tests.py
index dc2a70be87..3368d3d655 100755
--- a/tools/run_tests/run_grpclb_interop_tests.py
+++ b/tools/run_tests/run_grpclb_interop_tests.py
@@ -27,9 +27,10 @@ import subprocess
import sys
import tempfile
import time
+import traceback
import uuid
+
import six
-import traceback
import python_utils.dockerjob as dockerjob
import python_utils.jobset as jobset
diff --git a/tools/run_tests/run_interop_tests.py b/tools/run_tests/run_interop_tests.py
index 4f525d552c..1401229d4b 100755
--- a/tools/run_tests/run_interop_tests.py
+++ b/tools/run_tests/run_interop_tests.py
@@ -27,13 +27,15 @@ import subprocess
import sys
import tempfile
import time
+import traceback
import uuid
+
import six
-import traceback
import python_utils.dockerjob as dockerjob
import python_utils.jobset as jobset
import python_utils.report_utils as report_utils
+
# It's ok to not import because this is only necessary to upload results to BQ.
try:
from python_utils.upload_test_results import upload_interop_results_to_bq
@@ -487,6 +489,7 @@ class PHP7Language:
def __init__(self):
self.client_cwd = None
+ self.server_cwd = None
self.safename = str(self)
def client_cmd(self, args):
@@ -495,6 +498,9 @@ class PHP7Language:
def cloud_to_prod_env(self):
return {}
+ def server_cmd(self, args):
+ return ['src/php/bin/interop_server.sh'] + args
+
def global_env(self):
return {}
@@ -505,7 +511,7 @@ class PHP7Language:
_SKIP_COMPUTE_ENGINE_CHANNEL_CREDS
def unimplemented_test_cases_server(self):
- return []
+ return _SKIP_COMPRESSION
def __str__(self):
return 'php7'
@@ -714,7 +720,7 @@ _LANGUAGES = {
# languages supported as cloud_to_cloud servers
_SERVERS = [
'c++', 'node', 'csharp', 'csharpcoreclr', 'aspnetcore', 'java', 'go',
- 'ruby', 'python', 'dart', 'pythonasyncio'
+ 'ruby', 'python', 'dart', 'pythonasyncio', 'php7'
]
_TEST_CASES = [
diff --git a/tools/run_tests/run_performance_tests.py b/tools/run_tests/run_performance_tests.py
index 0845a7123e..0a9d9663f0 100755
--- a/tools/run_tests/run_performance_tests.py
+++ b/tools/run_tests/run_performance_tests.py
@@ -30,6 +30,7 @@ import tempfile
import time
import traceback
import uuid
+
import six
import performance.scenario_config as scenario_config
diff --git a/tools/run_tests/run_tests.py b/tools/run_tests/run_tests.py
index 7940e5ad23..a176aedab8 100755
--- a/tools/run_tests/run_tests.py
+++ b/tools/run_tests/run_tests.py
@@ -34,16 +34,18 @@ import socket
import subprocess
import sys
import tempfile
-import traceback
import time
-from six.moves import urllib
+import traceback
import uuid
+
import six
+from six.moves import urllib
import python_utils.jobset as jobset
import python_utils.report_utils as report_utils
-import python_utils.watch_dirs as watch_dirs
import python_utils.start_port_server as start_port_server
+import python_utils.watch_dirs as watch_dirs
+
try:
from python_utils.upload_test_results import upload_results_to_bq
except (ImportError):
@@ -775,6 +777,11 @@ class PythonLanguage(object):
minor='8',
bits=bits,
config_vars=config_vars)
+ python39_config = _python_config_generator(name='py39',
+ major='3',
+ minor='9',
+ bits=bits,
+ config_vars=config_vars)
pypy27_config = _pypy_config_generator(name='pypy',
major='2',
config_vars=config_vars)
@@ -804,13 +811,9 @@ class PythonLanguage(object):
# NOTE(rbellevi): Testing takes significantly longer on
# MacOS, so we restrict the number of interpreter versions
# tested.
- return (
- python27_config,
- python38_config,
- )
+ return (python38_config,)
else:
return (
- python27_config,
python35_config,
python37_config,
python38_config,
@@ -825,6 +828,8 @@ class PythonLanguage(object):
return (python37_config,)
elif args.compiler == 'python3.8':
return (python38_config,)
+ elif args.compiler == 'python3.9':
+ return (python39_config,)
elif args.compiler == 'pypy':
return (pypy27_config,)
elif args.compiler == 'pypy3':
diff --git a/tools/run_tests/run_tests_matrix.py b/tools/run_tests/run_tests_matrix.py
index ff051c7456..bde2aae1ee 100755
--- a/tools/run_tests/run_tests_matrix.py
+++ b/tools/run_tests/run_tests_matrix.py
@@ -21,9 +21,9 @@ import multiprocessing
import os
import sys
+from python_utils.filter_pull_request_tests import filter_tests
import python_utils.jobset as jobset
import python_utils.report_utils as report_utils
-from python_utils.filter_pull_request_tests import filter_tests
_ROOT = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), '../..'))
os.chdir(_ROOT)
diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py
index e864a7aa61..cb884fc594 100755
--- a/tools/run_tests/run_xds_tests.py
+++ b/tools/run_tests/run_xds_tests.py
@@ -16,8 +16,6 @@
import argparse
import datetime
-import googleapiclient.discovery
-import grpc
import json
import logging
import os
@@ -30,12 +28,13 @@ import tempfile
import time
import uuid
-from oauth2client.client import GoogleCredentials
from google.protobuf import json_format
+import googleapiclient.discovery
+import grpc
+from oauth2client.client import GoogleCredentials
import python_utils.jobset as jobset
import python_utils.report_utils as report_utils
-
from src.proto.grpc.health.v1 import health_pb2
from src.proto.grpc.health.v1 import health_pb2_grpc
from src.proto.grpc.testing import empty_pb2
@@ -45,12 +44,13 @@ from src.proto.grpc.testing import test_pb2_grpc
# Envoy protos provided by PyPI package xds-protos
# Needs to import the generated Python file to load descriptors
try:
- from envoy.service.status.v3 import csds_pb2
- from envoy.service.status.v3 import csds_pb2_grpc
- from envoy.extensions.filters.network.http_connection_manager.v3 import http_connection_manager_pb2
from envoy.extensions.filters.common.fault.v3 import fault_pb2
from envoy.extensions.filters.http.fault.v3 import fault_pb2
from envoy.extensions.filters.http.router.v3 import router_pb2
+ from envoy.extensions.filters.network.http_connection_manager.v3 import \
+ http_connection_manager_pb2
+ from envoy.service.status.v3 import csds_pb2
+ from envoy.service.status.v3 import csds_pb2_grpc
except ImportError:
# These protos are required by CSDS test. We should not fail the entire
# script for one test case.
@@ -1169,6 +1169,7 @@ def test_api_listener(gcp, backend_service, instance_group,
alternate_backend_service):
logger.info("Running api_listener")
passed = True
+ new_config_suffix = ''
try:
wait_for_healthy_backends(gcp, backend_service, instance_group)
backend_instances = get_instance_names(gcp, instance_group)
@@ -3104,6 +3105,8 @@ else:
if not args.only_stable_gcp_apis:
alpha_compute = googleapiclient.discovery.build('compute', 'alpha')
+test_results = {}
+failed_tests = []
try:
gcp = GcpState(compute, alpha_compute, args.project_id, args.project_num)
gcp_suffix = args.gcp_suffix
@@ -3141,6 +3144,8 @@ try:
instance_group_name = _BASE_INSTANCE_GROUP_NAME + gcp_suffix
same_zone_instance_group_name = _BASE_INSTANCE_GROUP_NAME + '-same-zone' + gcp_suffix
secondary_zone_instance_group_name = _BASE_INSTANCE_GROUP_NAME + '-secondary-zone' + gcp_suffix
+ potential_service_ports = list(args.service_port_range)
+ random.shuffle(potential_service_ports)
if args.use_existing_gcp_resources:
logger.info('Reusing existing GCP resources')
get_health_check(gcp, health_check_name)
@@ -3171,8 +3176,6 @@ try:
gcp, alternate_backend_service_name)
create_url_map(gcp, url_map_name, backend_service, service_host_name)
create_target_proxy(gcp, target_proxy_name)
- potential_service_ports = list(args.service_port_range)
- random.shuffle(potential_service_ports)
create_global_forwarding_rule(gcp, forwarding_rule_name,
potential_service_ports)
if not gcp.service_port:
@@ -3229,8 +3232,6 @@ try:
client_env['GRPC_XDS_EXPERIMENTAL_CIRCUIT_BREAKING'] = 'true'
client_env['GRPC_XDS_EXPERIMENTAL_ENABLE_TIMEOUT'] = 'true'
client_env['GRPC_XDS_EXPERIMENTAL_FAULT_INJECTION'] = 'true'
- test_results = {}
- failed_tests = []
for test_case in args.test_case:
if test_case in _V3_TEST_CASES and not args.xds_v3_support:
logger.info('skipping test %s due to missing v3 support',
diff --git a/tools/run_tests/sanity/check_port_platform.py b/tools/run_tests/sanity/check_port_platform.py
index a3e8e03b75..ba95911192 100755
--- a/tools/run_tests/sanity/check_port_platform.py
+++ b/tools/run_tests/sanity/check_port_platform.py
@@ -63,8 +63,21 @@ all_bad_files = []
all_bad_files += check_port_platform_inclusion(os.path.join('src', 'core'))
all_bad_files += check_port_platform_inclusion(os.path.join('include', 'grpc'))
-if len(all_bad_files) > 0:
- for f in all_bad_files:
- print((('port_platform.h is not the first included header or there '
- 'is not a blank line following its inclusion in %s') % f))
- sys.exit(1)
+if sys.argv[1:] == ['--fix']:
+ for path in all_bad_files:
+ text = ''
+ found = False
+ with open(path) as f:
+ for l in f.readlines():
+ if not found and '#include' in l:
+ text += '#include <grpc/impl/codegen/port_platform.h>\n\n'
+ found = True
+ text += l
+ with open(path, 'w') as f:
+ f.write(text)
+else:
+ if len(all_bad_files) > 0:
+ for f in all_bad_files:
+ print((('port_platform.h is not the first included header or there '
+ 'is not a blank line following its inclusion in %s') % f))
+ sys.exit(1)
diff --git a/tools/run_tests/sanity/check_qps_scenario_changes.py b/tools/run_tests/sanity/check_qps_scenario_changes.py
index fffa813c0c..7fc055d9b1 100755
--- a/tools/run_tests/sanity/check_qps_scenario_changes.py
+++ b/tools/run_tests/sanity/check_qps_scenario_changes.py
@@ -15,8 +15,8 @@
# limitations under the License.
import os
-import sys
import subprocess
+import sys
os.chdir(os.path.join(os.path.dirname(sys.argv[0]), '../../../test/cpp/qps'))
subprocess.call(['./json_run_localhost_scenario_gen.py'])
diff --git a/tools/run_tests/sanity/check_submodules.sh b/tools/run_tests/sanity/check_submodules.sh
index a0ba3a6db0..a9d73409ff 100755
--- a/tools/run_tests/sanity/check_submodules.sh
+++ b/tools/run_tests/sanity/check_submodules.sh
@@ -31,15 +31,16 @@ third_party/benchmark 73d4d5e8d6d449fc8663765a42aa8aeeee844489
third_party/bloaty 73594cde8c9a52a102c4341c244c833aa61b9c06
third_party/boringssl-with-bazel bcc01b6c66b1c6fa2816b108e50a544b757fbd7b
third_party/cares/cares e982924acee7f7313b4baa4ee5ec000c5e373c30
-third_party/envoy-api 18b54850c9b7ba29a4ab67cbd7ed7eab7b0bbdb2
-third_party/googleapis 82944da21578a53b74e547774cf62ed31a05b841
+third_party/envoy-api df3b1ab2773147f292c4f175f790c35448328161
+third_party/googleapis 2f9af297c84c55c8b871ba4495e01ade42476c92
third_party/googletest c9ccac7cb7345901884aabf5d1a786cfa6e2f397
third_party/libuv 15ae750151ac9341e5945eb38f8982d59fb99201
third_party/opencensus-proto 4aa53e15cbf1a47bc9087e6cfdca214c1eea4e89
+third_party/opentelemetry 60fa8754d890b5c55949a8c68dcfd7ab5c2395df
third_party/protobuf 436bd7880e458532901c58f4d9d1ea23fa7edd52
-third_party/protoc-gen-validate 872b28c457822ed9c2a5405da3c33f386ac0e86f
+third_party/protoc-gen-validate 59da36e59fef2267fc2b1849a05159e3ecdf24f3
third_party/re2 aecba11114cf1fac5497aeb844b6966106de3eb6
-third_party/udpa cc1b757b3eddccaaaf0743cbb107742bb7e3ee4f
+third_party/udpa 6414d713912e988471d192940b62bf552b11793a
third_party/zlib cacf7f1d4e3d44d871b605da3b647f07d718623f
EOF
diff --git a/tools/run_tests/sanity/check_test_filtering.py b/tools/run_tests/sanity/check_test_filtering.py
index f287864f1a..01c830a35b 100755
--- a/tools/run_tests/sanity/check_test_filtering.py
+++ b/tools/run_tests/sanity/check_test_filtering.py
@@ -15,14 +15,15 @@
# limitations under the License.
import os
+import re
import sys
import unittest
-import re
# hack import paths to pick up extra code
sys.path.insert(0, os.path.abspath('tools/run_tests/'))
-from run_tests_matrix import _create_test_jobs, _create_portability_test_jobs
import python_utils.filter_pull_request_tests as filter_pull_request_tests
+from run_tests_matrix import _create_portability_test_jobs
+from run_tests_matrix import _create_test_jobs
_LIST_OF_LANGUAGE_LABELS = [
'c', 'c++', 'csharp', 'grpc-node', 'objc', 'php', 'php7', 'python', 'ruby'
diff --git a/tools/run_tests/sanity/check_tracer_sanity.py b/tools/run_tests/sanity/check_tracer_sanity.py
index 8d5635bb1b..0e1285c858 100755
--- a/tools/run_tests/sanity/check_tracer_sanity.py
+++ b/tools/run_tests/sanity/check_tracer_sanity.py
@@ -15,8 +15,8 @@
# limitations under the License.
import os
-import sys
import re
+import sys
os.chdir(os.path.join(os.path.dirname(sys.argv[0]), '../../..'))
diff --git a/tools/run_tests/sanity/check_version.py b/tools/run_tests/sanity/check_version.py
index 5e963c480a..f7d6d277bd 100755
--- a/tools/run_tests/sanity/check_version.py
+++ b/tools/run_tests/sanity/check_version.py
@@ -14,11 +14,12 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-import sys
-import yaml
import os
import re
import subprocess
+import sys
+
+import yaml
errors = 0
diff --git a/tools/run_tests/sanity/sanity_tests.yaml b/tools/run_tests/sanity/sanity_tests.yaml
index f6954c425a..f7cd252347 100644
--- a/tools/run_tests/sanity/sanity_tests.yaml
+++ b/tools/run_tests/sanity/sanity_tests.yaml
@@ -32,5 +32,7 @@
- script: tools/distrib/python/check_grpcio_tools.py
- script: tools/distrib/yapf_code.sh --diff
cpu_cost: 1000
+- script: tools/distrib/isort_code.sh --diff
+ cpu_cost: 1000
- script: tools/distrib/check_protobuf_pod_version.sh
- script: tools/distrib/check_boringssl_prefix_symbol.sh
diff --git a/tools/run_tests/xds_k8s_test_driver/README.md b/tools/run_tests/xds_k8s_test_driver/README.md
index 1bf932afcd..28ddab7099 100644
--- a/tools/run_tests/xds_k8s_test_driver/README.md
+++ b/tools/run_tests/xds_k8s_test_driver/README.md
@@ -8,9 +8,9 @@ changes to this codebase at the moment.
### Stabilization roadmap
- [ ] Replace retrying with tenacity
-- [ ] Generate namespace for each test to prevent resource name conflicts and
+- [x] Generate namespace for each test to prevent resource name conflicts and
allow running tests in parallel
-- [ ] Security: run server and client in separate namespaces
+- [x] Security: run server and client in separate namespaces
- [ ] Make framework.infrastructure.gcp resources [first-class
citizen](https://en.wikipedia.org/wiki/First-class_citizen), support
simpler CRUD
@@ -198,23 +198,6 @@ python -m tests.security_test \
--client_image="gcr.io/grpc-testing/xds-interop/java-client:d22f93e1ade22a1e026b57210f6fc21f7a3ca0cf"
```
-### Test namespace
-It's possible to run multiple xDS interop test workloads in the same project.
-But we need to ensure the name of the global resources won't conflict. This can
-be solved by supplying `--namespace` and `--server_xds_port`. The xDS port needs
-to be unique across the entire project (default port range is [8080, 8280],
-avoid if possible). Here is an example:
-
-```shell
-python3 -m tests.baseline_test \
- --flagfile="config/grpc-testing.cfg" \
- --kube_context="${KUBE_CONTEXT}" \
- --server_image="gcr.io/grpc-testing/xds-interop/java-server:d22f93e1ade22a1e026b57210f6fc21f7a3ca0cf" \
- --client_image="gcr.io/grpc-testing/xds-interop/java-client:d22f93e1ade22a1e026b57210f6fc21f7a3ca0cf" \
- --namespace="box-$(date +"%F-%R")" \
- --server_xds_port="$(($RANDOM%1000 + 34567))"
-```
-
## Local development
This test driver allows running tests locally against remote GKE clusters, right
from your dev environment. You need:
@@ -290,7 +273,7 @@ This tool performs the following:
EXAMPLES:
./run.sh bin/run_td_setup.py --help
./run.sh bin/run_td_setup.py --helpfull
-XDS_K8S_CONFIG=./path-to-flagfile.cfg ./run.sh bin/run_td_setup.py --namespace=override-namespace
+XDS_K8S_CONFIG=./path-to-flagfile.cfg ./run.sh bin/run_td_setup.py --resource_suffix=override-suffix
./run.sh tests/baseline_test.py
./run.sh tests/security_test.py --verbosity=1 --logger_levels=__main__:DEBUG,framework:DEBUG
./run.sh tests/security_test.py SecurityTest.test_mtls --nocheck_local_certs
diff --git a/tools/run_tests/xds_k8s_test_driver/bin/cleanup.sh b/tools/run_tests/xds_k8s_test_driver/bin/cleanup.sh
index 4ee29eb34a..3b4bf270ae 100755
--- a/tools/run_tests/xds_k8s_test_driver/bin/cleanup.sh
+++ b/tools/run_tests/xds_k8s_test_driver/bin/cleanup.sh
@@ -32,7 +32,7 @@ ENVIRONMENT:
EXAMPLES:
$0
$0 --secure
-XDS_K8S_CONFIG=./path-to-flagfile.cfg $0 --namespace=override-namespace
+XDS_K8S_CONFIG=./path-to-flagfile.cfg $0 --resource_suffix=override-suffix
EOF
exit 1
}
@@ -50,10 +50,10 @@ cd "${XDS_K8S_DRIVER_DIR}"
if [[ "$1" == "--nosecure" ]]; then
shift
./run.sh bin/run_td_setup.py --cmd=cleanup "$@" && \
- ./run.sh bin/run_test_client.py --cmd=cleanup "$@" && \
+ ./run.sh bin/run_test_client.py --cmd=cleanup --cleanup_namespace "$@" && \
./run.sh bin/run_test_server.py --cmd=cleanup --cleanup_namespace "$@"
else
./run.sh bin/run_td_setup.py --cmd=cleanup --security=mtls "$@" && \
- ./run.sh bin/run_test_client.py --cmd=cleanup --secure "$@" && \
+ ./run.sh bin/run_test_client.py --cmd=cleanup --cleanup_namespace --secure "$@" && \
./run.sh bin/run_test_server.py --cmd=cleanup --cleanup_namespace --secure "$@"
fi
diff --git a/tools/run_tests/xds_k8s_test_driver/bin/run_channelz.py b/tools/run_tests/xds_k8s_test_driver/bin/run_channelz.py
index a3ccb3af25..5c2c0ac0ce 100755
--- a/tools/run_tests/xds_k8s_test_driver/bin/run_channelz.py
+++ b/tools/run_tests/xds_k8s_test_driver/bin/run_channelz.py
@@ -58,6 +58,8 @@ _SECURITY = flags.DEFINE_enum('security',
help='Show info for a security setup')
flags.adopt_module_key_flags(xds_flags)
flags.adopt_module_key_flags(xds_k8s_flags)
+# Running outside of a test suite, so require explicit resource_suffix.
+flags.mark_flag_as_required("resource_suffix")
# Type aliases
_Channel = grpc_channelz.Channel
@@ -174,9 +176,13 @@ def main(argv):
k8s_api_manager = k8s.KubernetesApiManager(xds_k8s_flags.KUBE_CONTEXT.value)
+ # Resource names.
+ resource_prefix: str = xds_flags.RESOURCE_PREFIX.value
+ resource_suffix: str = xds_flags.RESOURCE_SUFFIX.value
+
# Server
server_name = xds_flags.SERVER_NAME.value
- server_namespace = xds_flags.NAMESPACE.value
+ server_namespace = resource_prefix
server_k8s_ns = k8s.KubernetesNamespace(k8s_api_manager, server_namespace)
server_pod_ip = get_deployment_pod_ips(server_k8s_ns, server_name)[0]
test_server: _XdsTestServer = _XdsTestServer(
@@ -188,7 +194,7 @@ def main(argv):
# Client
client_name = xds_flags.CLIENT_NAME.value
- client_namespace = xds_flags.NAMESPACE.value
+ client_namespace = resource_prefix
client_k8s_ns = k8s.KubernetesNamespace(k8s_api_manager, client_namespace)
client_pod_ip = get_deployment_pod_ips(client_k8s_ns, client_name)[0]
test_client: _XdsTestClient = _XdsTestClient(
diff --git a/tools/run_tests/xds_k8s_test_driver/bin/run_td_setup.py b/tools/run_tests/xds_k8s_test_driver/bin/run_td_setup.py
index d866986650..efcb5916be 100755
--- a/tools/run_tests/xds_k8s_test_driver/bin/run_td_setup.py
+++ b/tools/run_tests/xds_k8s_test_driver/bin/run_td_setup.py
@@ -31,13 +31,13 @@ Typical usage examples:
python -m bin.run_td_setup --helpfull
"""
import logging
-import uuid
from absl import app
from absl import flags
from framework import xds_flags
from framework import xds_k8s_flags
+from framework.helpers import rand
from framework.infrastructure import gcp
from framework.infrastructure import k8s
from framework.infrastructure import traffic_director
@@ -49,7 +49,7 @@ _CMD = flags.DEFINE_enum('cmd',
default='create',
enum_values=[
'cycle', 'create', 'cleanup', 'backends-add',
- 'backends-cleanup'
+ 'backends-cleanup', 'unused-xds-port'
],
help='Command')
_SECURITY = flags.DEFINE_enum('security',
@@ -61,9 +61,10 @@ _SECURITY = flags.DEFINE_enum('security',
help='Configure TD with security')
flags.adopt_module_key_flags(xds_flags)
flags.adopt_module_key_flags(xds_k8s_flags)
+# Running outside of a test suite, so require explicit resource_suffix.
+flags.mark_flag_as_required("resource_suffix")
-_DEFAULT_SECURE_MODE_MAINTENANCE_PORT = \
- server_app.KubernetesServerRunner.DEFAULT_SECURE_MODE_MAINTENANCE_PORT
+KubernetesServerRunner = server_app.KubernetesServerRunner
def main(argv):
@@ -75,7 +76,10 @@ def main(argv):
project: str = xds_flags.PROJECT.value
network: str = xds_flags.NETWORK.value
- namespace = xds_flags.NAMESPACE.value
+
+ # Resource names.
+ resource_prefix: str = xds_flags.RESOURCE_PREFIX.value
+ resource_suffix: str = xds_flags.RESOURCE_SUFFIX.value
# Test server
server_name = xds_flags.SERVER_NAME.value
@@ -83,22 +87,27 @@ def main(argv):
server_maintenance_port = xds_flags.SERVER_MAINTENANCE_PORT.value
server_xds_host = xds_flags.SERVER_XDS_HOST.value
server_xds_port = xds_flags.SERVER_XDS_PORT.value
+ server_namespace = KubernetesServerRunner.make_namespace_name(
+ resource_prefix, resource_suffix)
gcp_api_manager = gcp.api.GcpApiManager()
if security_mode is None:
- td = traffic_director.TrafficDirectorManager(gcp_api_manager,
- project=project,
- resource_prefix=namespace,
- network=network)
+ td = traffic_director.TrafficDirectorManager(
+ gcp_api_manager,
+ project=project,
+ network=network,
+ resource_prefix=resource_prefix,
+ resource_suffix=resource_suffix)
else:
td = traffic_director.TrafficDirectorSecureManager(
gcp_api_manager,
project=project,
- resource_prefix=namespace,
- network=network)
+ network=network,
+ resource_prefix=resource_prefix,
+ resource_suffix=resource_suffix)
if server_maintenance_port is None:
- server_maintenance_port = _DEFAULT_SECURE_MODE_MAINTENANCE_PORT
+ server_maintenance_port = KubernetesServerRunner.DEFAULT_SECURE_MODE_MAINTENANCE_PORT
try:
if command in ('create', 'cycle'):
@@ -114,12 +123,12 @@ def main(argv):
td.setup_for_grpc(server_xds_host,
server_xds_port,
health_check_port=server_maintenance_port)
- td.setup_server_security(server_namespace=namespace,
+ td.setup_server_security(server_namespace=server_namespace,
server_name=server_name,
server_port=server_port,
tls=True,
mtls=True)
- td.setup_client_security(server_namespace=namespace,
+ td.setup_client_security(server_namespace=server_namespace,
server_name=server_name,
tls=True,
mtls=True)
@@ -129,12 +138,12 @@ def main(argv):
td.setup_for_grpc(server_xds_host,
server_xds_port,
health_check_port=server_maintenance_port)
- td.setup_server_security(server_namespace=namespace,
+ td.setup_server_security(server_namespace=server_namespace,
server_name=server_name,
server_port=server_port,
tls=True,
mtls=False)
- td.setup_client_security(server_namespace=namespace,
+ td.setup_client_security(server_namespace=server_namespace,
server_name=server_name,
tls=True,
mtls=False)
@@ -144,12 +153,12 @@ def main(argv):
td.setup_for_grpc(server_xds_host,
server_xds_port,
health_check_port=server_maintenance_port)
- td.setup_server_security(server_namespace=namespace,
+ td.setup_server_security(server_namespace=server_namespace,
server_name=server_name,
server_port=server_port,
tls=False,
mtls=False)
- td.setup_client_security(server_namespace=namespace,
+ td.setup_client_security(server_namespace=server_namespace,
server_name=server_name,
tls=False,
mtls=False)
@@ -161,12 +170,12 @@ def main(argv):
td.setup_for_grpc(server_xds_host,
server_xds_port,
health_check_port=server_maintenance_port)
- td.setup_server_security(server_namespace=namespace,
+ td.setup_server_security(server_namespace=server_namespace,
server_name=server_name,
server_port=server_port,
tls=True,
mtls=True)
- td.setup_client_security(server_namespace=namespace,
+ td.setup_client_security(server_namespace=server_namespace,
server_name=server_name,
tls=True,
mtls=False)
@@ -180,16 +189,16 @@ def main(argv):
health_check_port=server_maintenance_port)
# Regular TLS setup, but with client policy configured using
# intentionality incorrect server_namespace.
- td.setup_server_security(server_namespace=namespace,
+ td.setup_server_security(server_namespace=server_namespace,
server_name=server_name,
server_port=server_port,
tls=True,
mtls=False)
- incorrect_namespace = f'incorrect-namespace-{uuid.uuid4().hex}'
- td.setup_client_security(server_namespace=incorrect_namespace,
- server_name=server_name,
- tls=True,
- mtls=False)
+ td.setup_client_security(
+ server_namespace=f'incorrect-namespace-{rand.rand_string()}',
+ server_name=server_name,
+ tls=True,
+ mtls=False)
logger.info('Works!')
except Exception: # noqa pylint: disable=broad-except
@@ -203,7 +212,8 @@ def main(argv):
logger.info('Adding backends')
k8s_api_manager = k8s.KubernetesApiManager(
xds_k8s_flags.KUBE_CONTEXT.value)
- k8s_namespace = k8s.KubernetesNamespace(k8s_api_manager, namespace)
+ k8s_namespace = k8s.KubernetesNamespace(k8s_api_manager,
+ server_namespace)
neg_name, neg_zones = k8s_namespace.get_service_neg(
server_name, server_port)
@@ -211,10 +221,16 @@ def main(argv):
td.load_backend_service()
td.backend_service_add_neg_backends(neg_name, neg_zones)
td.wait_for_backends_healthy_status()
- # TODO(sergiitk): wait until client reports rpc health
elif command == 'backends-cleanup':
td.load_backend_service()
td.backend_service_remove_all_backends()
+ elif command == 'unused-xds-port':
+ try:
+ unused_xds_port = td.find_unused_forwarding_rule_port()
+ logger.info('Found unused forwarding rule port: %s',
+ unused_xds_port)
+ except Exception: # noqa pylint: disable=broad-except
+ logger.exception("Couldn't find unused forwarding rule port")
if __name__ == '__main__':
diff --git a/tools/run_tests/xds_k8s_test_driver/bin/run_test_client.py b/tools/run_tests/xds_k8s_test_driver/bin/run_test_client.py
index f351127025..1e600935d5 100755
--- a/tools/run_tests/xds_k8s_test_driver/bin/run_test_client.py
+++ b/tools/run_tests/xds_k8s_test_driver/bin/run_test_client.py
@@ -44,20 +44,22 @@ _CLEANUP_NAMESPACE = flags.DEFINE_bool(
help="Delete namespace during resource cleanup")
flags.adopt_module_key_flags(xds_flags)
flags.adopt_module_key_flags(xds_k8s_flags)
+# Running outside of a test suite, so require explicit resource_suffix.
+flags.mark_flag_as_required("resource_suffix")
+
+# Type aliases
+KubernetesClientRunner = client_app.KubernetesClientRunner
def main(argv):
if len(argv) > 1:
raise app.UsageError('Too many command-line arguments.')
- # Flag shortcuts.
project: str = xds_flags.PROJECT.value
# GCP Service Account email
gcp_service_account: str = xds_k8s_flags.GCP_SERVICE_ACCOUNT.value
- # Base namespace
- namespace = xds_flags.NAMESPACE.value
- client_namespace = namespace
+ # KubernetesClientRunner arguments.
runner_kwargs = dict(
deployment_name=xds_flags.CLIENT_NAME.value,
image_name=xds_k8s_flags.CLIENT_IMAGE.value,
@@ -75,7 +77,9 @@ def main(argv):
deployment_template='client-secure.deployment.yaml')
k8s_api_manager = k8s.KubernetesApiManager(xds_k8s_flags.KUBE_CONTEXT.value)
- client_runner = client_app.KubernetesClientRunner(
+ client_namespace = KubernetesClientRunner.make_namespace_name(
+ xds_flags.RESOURCE_PREFIX.value, xds_flags.RESOURCE_SUFFIX.value)
+ client_runner = KubernetesClientRunner(
k8s.KubernetesNamespace(k8s_api_manager, client_namespace),
**runner_kwargs)
diff --git a/tools/run_tests/xds_k8s_test_driver/bin/run_test_server.py b/tools/run_tests/xds_k8s_test_driver/bin/run_test_server.py
index 8085b2d87c..af44d4673b 100755
--- a/tools/run_tests/xds_k8s_test_driver/bin/run_test_server.py
+++ b/tools/run_tests/xds_k8s_test_driver/bin/run_test_server.py
@@ -40,20 +40,25 @@ _CLEANUP_NAMESPACE = flags.DEFINE_bool(
help="Delete namespace during resource cleanup")
flags.adopt_module_key_flags(xds_flags)
flags.adopt_module_key_flags(xds_k8s_flags)
+# Running outside of a test suite, so require explicit resource_suffix.
+flags.mark_flag_as_required("resource_suffix")
+
+KubernetesServerRunner = server_app.KubernetesServerRunner
def main(argv):
if len(argv) > 1:
raise app.UsageError('Too many command-line arguments.')
- # Flag shortcuts.
project: str = xds_flags.PROJECT.value
# GCP Service Account email
gcp_service_account: str = xds_k8s_flags.GCP_SERVICE_ACCOUNT.value
- # Base namespace
- namespace = xds_flags.NAMESPACE.value
- server_namespace = namespace
+ # Resource names.
+ resource_prefix: str = xds_flags.RESOURCE_PREFIX.value
+ resource_suffix: str = xds_flags.RESOURCE_SUFFIX.value
+
+ # KubernetesServerRunner arguments.
runner_kwargs = dict(
deployment_name=xds_flags.SERVER_NAME.value,
image_name=xds_k8s_flags.SERVER_IMAGE.value,
@@ -70,7 +75,9 @@ def main(argv):
deployment_template='server-secure.deployment.yaml')
k8s_api_manager = k8s.KubernetesApiManager(xds_k8s_flags.KUBE_CONTEXT.value)
- server_runner = server_app.KubernetesServerRunner(
+ server_namespace = KubernetesServerRunner.make_namespace_name(
+ resource_prefix, resource_suffix)
+ server_runner = KubernetesServerRunner(
k8s.KubernetesNamespace(k8s_api_manager, server_namespace),
**runner_kwargs)
diff --git a/tools/run_tests/xds_k8s_test_driver/config/common.cfg b/tools/run_tests/xds_k8s_test_driver/config/common.cfg
index e4c8090162..827e292e4b 100644
--- a/tools/run_tests/xds_k8s_test_driver/config/common.cfg
+++ b/tools/run_tests/xds_k8s_test_driver/config/common.cfg
@@ -1,4 +1,7 @@
---namespace=interop-psm-security
+--resource_prefix=xds-k8s-security
--td_bootstrap_image=gcr.io/grpc-testing/td-grpc-bootstrap:2558ec79df06984ed0d37e9e69f34688ffe301bb
--logger_levels=__main__:DEBUG,framework:INFO
--verbosity=0
+# Google projects: remove if console.cloud.google.com redirects to Logs Explorer
+# ref: https://github.com/grpc/grpc/pull/26844#discussion_r680224772
+--gcp_ui_url=pantheon.corp.google.com
diff --git a/tools/run_tests/xds_k8s_test_driver/config/grpc-testing.cfg b/tools/run_tests/xds_k8s_test_driver/config/grpc-testing.cfg
index ddd70a4e34..2e89c7ebca 100644
--- a/tools/run_tests/xds_k8s_test_driver/config/grpc-testing.cfg
+++ b/tools/run_tests/xds_k8s_test_driver/config/grpc-testing.cfg
@@ -3,3 +3,7 @@
--network=default-vpc
--gcp_service_account=xds-k8s-interop-tests@grpc-testing.iam.gserviceaccount.com
--private_api_key_secret_name=projects/830293263384/secrets/xds-interop-tests-private-api-access-key
+# Randomize xds port.
+--server_xds_port=0
+# ResultStore UI doesn't support 256 colors.
+--color_style=ansi16
diff --git a/tools/run_tests/xds_k8s_test_driver/config/local-dev.cfg.example b/tools/run_tests/xds_k8s_test_driver/config/local-dev.cfg.example
index 9a7f908695..2afb091af4 100644
--- a/tools/run_tests/xds_k8s_test_driver/config/local-dev.cfg.example
+++ b/tools/run_tests/xds_k8s_test_driver/config/local-dev.cfg.example
@@ -11,6 +11,13 @@
# Uncomment to ensure the allow health check firewall exists before test case runs
# --ensure_firewall
+# Use a resource prefix to describe usage and ownership
+--resource_prefix=xds-k8s-test
+
+# Use predictable resource suffix to simplify debugging
+# If left blank, the framework will randomly generate one
+--resource_suffix=dev
+
# The name of kube context to use. See `gcloud container clusters get-credentials` and `kubectl config`
--kube_context=context_name
diff --git a/tools/run_tests/xds_k8s_test_driver/config/url-map.cfg b/tools/run_tests/xds_k8s_test_driver/config/url-map.cfg
new file mode 100644
index 0000000000..688b1c3822
--- /dev/null
+++ b/tools/run_tests/xds_k8s_test_driver/config/url-map.cfg
@@ -0,0 +1,8 @@
+--resource_prefix=interop-psm-url-map
+--strategy=reuse
+--server_xds_port=8848
+# NOTE(lidiz) we pin the server image to java-server because:
+# 1. Only Java server understands the rpc-behavior metadata.
+# 2. All UrlMap tests today are testing client-side logic.
+# grpc-java master: 438f8d9e7880b2f6ae2b376a35a9f5f32b4dbeaa TODO: use v1.40.0
+--server_image=gcr.io/grpc-testing/xds-interop/java-server:438f8d9e7880b2f6ae2b376a35a9f5f32b4dbeaa
diff --git a/tools/run_tests/xds_k8s_test_driver/framework/helpers/datetime.py b/tools/run_tests/xds_k8s_test_driver/framework/helpers/datetime.py
new file mode 100644
index 0000000000..a4b2784916
--- /dev/null
+++ b/tools/run_tests/xds_k8s_test_driver/framework/helpers/datetime.py
@@ -0,0 +1,52 @@
+# Copyright 2021 gRPC authors.
+#
+# 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.
+"""This contains common helpers for working with dates and time."""
+import datetime
+import re
+from typing import Pattern
+
+RE_ZERO_OFFSET: Pattern[str] = re.compile(r'[+\-]00:?00$')
+
+
+def utc_now() -> datetime.datetime:
+ """Construct a datetime from current time in UTC timezone."""
+ return datetime.datetime.now(datetime.timezone.utc)
+
+
+def shorten_utc_zone(utc_datetime_str: str) -> str:
+ """Replace ±00:00 timezone designator with Z (zero offset AKA Zulu time)."""
+ return RE_ZERO_OFFSET.sub('Z', utc_datetime_str)
+
+
+def iso8601_utc_time(timedelta: datetime.timedelta = None) -> str:
+ """Return datetime relative to current in ISO-8601 format, UTC tz."""
+ time: datetime.datetime = utc_now()
+ if timedelta:
+ time += timedelta
+ return shorten_utc_zone(time.isoformat())
+
+
+def datetime_suffix(*, seconds: bool = False) -> str:
+ """Return current UTC date, and time in a format useful for resource naming.
+
+ Examples:
+ - 20210626-1859 (seconds=False)
+ - 20210626-185942 (seconds=True)
+ Use in resources names incompatible with ISO 8601, e.g. some GCP resources
+ that only allow lowercase alphanumeric chars and dashes.
+
+ Hours and minutes are joined together for better readability, so time is
+ visually distinct from dash-separated date.
+ """
+ return utc_now().strftime('%Y%m%d-%H%M' + ('%S' if seconds else ''))
diff --git a/tools/run_tests/xds_k8s_test_driver/framework/helpers/highlighter.py b/tools/run_tests/xds_k8s_test_driver/framework/helpers/highlighter.py
new file mode 100644
index 0000000000..0c9f011261
--- /dev/null
+++ b/tools/run_tests/xds_k8s_test_driver/framework/helpers/highlighter.py
@@ -0,0 +1,99 @@
+# Copyright 2021 gRPC authors.
+#
+# 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.
+"""The module contains helpers to enable color output in terminals.
+
+Use this to log resources dumped as a structured document (f.e. YAML),
+and enable colorful syntax highlighting.
+
+TODO(sergiitk): This can be used to output protobuf responses formatted as JSON.
+"""
+import logging
+from typing import Optional
+
+from absl import flags
+import pygments
+import pygments.formatter
+import pygments.formatters.other
+import pygments.formatters.terminal
+import pygments.formatters.terminal256
+import pygments.lexer
+import pygments.lexers.data
+import pygments.styles
+
+# The style for terminals supporting 8/16 colors.
+STYLE_ANSI_16 = 'ansi16'
+# Join with pygments styles for terminals supporting 88/256 colors.
+ALL_COLOR_STYLES = [STYLE_ANSI_16] + list(pygments.styles.get_all_styles())
+
+# Flags.
+COLOR = flags.DEFINE_bool("color", default=True, help='Colorize the output')
+COLOR_STYLE = flags.DEFINE_enum(
+ "color_style",
+ default='material',
+ enum_values=ALL_COLOR_STYLES,
+ help=('Color styles for terminals supporting 256 colors. '
+ f'Use {STYLE_ANSI_16} style for terminals supporting 8/16 colors'))
+
+logger = logging.getLogger(__name__)
+
+# Type aliases.
+Lexer = pygments.lexer.Lexer
+YamlLexer = pygments.lexers.data.YamlLexer
+Formatter = pygments.formatter.Formatter
+NullFormatter = pygments.formatters.other.NullFormatter
+TerminalFormatter = pygments.formatters.terminal.TerminalFormatter
+Terminal256Formatter = pygments.formatters.terminal256.Terminal256Formatter
+
+
+class Highlighter:
+ formatter: Formatter
+ lexer: Lexer
+ color: bool
+ color_style: Optional[str] = None
+
+ def __init__(self,
+ *,
+ lexer: Lexer,
+ color: Optional[bool] = None,
+ color_style: Optional[str] = None):
+ self.lexer = lexer
+ self.color = color if color is not None else COLOR.value
+
+ if self.color:
+ color_style = color_style if color_style else COLOR_STYLE.value
+ if color_style not in ALL_COLOR_STYLES:
+ raise ValueError(f'Unrecognized color style {color_style}, '
+ f'valid styles: {ALL_COLOR_STYLES}')
+ if color_style == STYLE_ANSI_16:
+ # 8/16 colors support only.
+ self.formatter = TerminalFormatter()
+ else:
+ # 88/256 colors.
+ self.formatter = Terminal256Formatter(style=color_style)
+ else:
+ self.formatter = NullFormatter()
+
+ def highlight(self, code: str) -> str:
+ return pygments.highlight(code, self.lexer, self.formatter)
+
+
+class HighlighterYaml(Highlighter):
+
+ def __init__(self,
+ *,
+ color: Optional[bool] = None,
+ color_style: Optional[str] = None):
+ super().__init__(lexer=YamlLexer(encoding='utf-8'),
+ color=color,
+ color_style=color_style)
diff --git a/tools/run_tests/xds_k8s_test_driver/framework/helpers/rand.py b/tools/run_tests/xds_k8s_test_driver/framework/helpers/rand.py
new file mode 100644
index 0000000000..dedf214360
--- /dev/null
+++ b/tools/run_tests/xds_k8s_test_driver/framework/helpers/rand.py
@@ -0,0 +1,49 @@
+# Copyright 2021 gRPC authors.
+#
+# 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.
+"""This contains common helpers for generating randomized data."""
+import random
+import string
+
+import framework.helpers.datetime
+
+# Alphanumeric characters, similar to regex [:alnum:] class, [a-zA-Z0-9]
+ALPHANUM = string.ascii_letters + string.digits
+# Lowercase alphanumeric characters: [a-z0-9]
+# Use ALPHANUM_LOWERCASE alphabet when case-sensitivity is a concern.
+ALPHANUM_LOWERCASE = string.ascii_lowercase + string.digits
+
+
+def rand_string(length: int = 8, *, lowercase: bool = False) -> str:
+ """Return random alphanumeric string of given length.
+
+ Space for default arguments: alphabet^length
+ lowercase and uppercase = (26*2 + 10)^8 = 2.18e14 = 218 trillion.
+ lowercase only = (26 + 10)^8 = 2.8e12 = 2.8 trillion.
+ """
+ alphabet = ALPHANUM_LOWERCASE if lowercase else ALPHANUM
+ return ''.join(random.choices(population=alphabet, k=length))
+
+
+def random_resource_suffix() -> str:
+ """Return a ready-to-use resource suffix with datetime and nonce."""
+ # Date and time suffix for debugging. Seconds skipped, not as relevant
+ # Format example: 20210626-1859
+ datetime_suffix: str = framework.helpers.datetime.datetime_suffix()
+ # Use lowercase chars because some resource names won't allow uppercase.
+ # For len 5, total (26 + 10)^5 = 60,466,176 combinations.
+ # Approx. number of test runs needed to start at the same minute to
+ # produce a collision: math.sqrt(math.pi/2 * (26+10)**5) ≈ 9745.
+ # https://en.wikipedia.org/wiki/Birthday_attack#Mathematics
+ unique_hash: str = rand_string(5, lowercase=True)
+ return f'{datetime_suffix}-{unique_hash}'
diff --git a/tools/run_tests/xds_k8s_test_driver/framework/infrastructure/gcp/api.py b/tools/run_tests/xds_k8s_test_driver/framework/infrastructure/gcp/api.py
index 2a0bae8deb..c5184a84d5 100644
--- a/tools/run_tests/xds_k8s_test_driver/framework/infrastructure/gcp/api.py
+++ b/tools/run_tests/xds_k8s_test_driver/framework/infrastructure/gcp/api.py
@@ -28,6 +28,8 @@ import googleapiclient.http
import tenacity
import yaml
+import framework.helpers.highlighter
+
logger = logging.getLogger(__name__)
PRIVATE_API_KEY_SECRET_NAME = flags.DEFINE_string(
"private_api_key_secret_name",
@@ -44,10 +46,14 @@ COMPUTE_V1_DISCOVERY_FILE = flags.DEFINE_string(
"compute_v1_discovery_file",
default=None,
help="Load compute v1 from discovery file")
+GCP_UI_URL = flags.DEFINE_string("gcp_ui_url",
+ default="console.cloud.google.com",
+ help="Override GCP UI URL.")
# Type aliases
_HttpError = googleapiclient.errors.HttpError
_HttpLib2Error = googleapiclient.http.httplib2.HttpLib2Error
+_HighlighterYaml = framework.helpers.highlighter.HighlighterYaml
Operation = operations_pb2.Operation
HttpRequest = googleapiclient.http.HttpRequest
@@ -59,13 +65,15 @@ class GcpApiManager:
v1_discovery_uri=None,
v2_discovery_uri=None,
compute_v1_discovery_file=None,
- private_api_key_secret_name=None):
+ private_api_key_secret_name=None,
+ gcp_ui_url=None):
self.v1_discovery_uri = v1_discovery_uri or V1_DISCOVERY_URI.value
self.v2_discovery_uri = v2_discovery_uri or V2_DISCOVERY_URI.value
self.compute_v1_discovery_file = (compute_v1_discovery_file or
COMPUTE_V1_DISCOVERY_FILE.value)
self.private_api_key_secret_name = (private_api_key_secret_name or
PRIVATE_API_KEY_SECRET_NAME.value)
+ self.gcp_ui_url = gcp_ui_url or GCP_UI_URL.value
# TODO(sergiitk): add options to pass google Credentials
self._exit_stack = contextlib.ExitStack()
@@ -80,10 +88,10 @@ class GcpApiManager:
Return API key credential that identifies a GCP project allow-listed for
accessing private API discovery documents.
- https://pantheon.corp.google.com/apis/credentials
+ https://console.cloud.google.com/apis/credentials
This method lazy-loads the content of the key from the Secret Manager.
- https://pantheon.corp.google.com/security/secret-manager
+ https://console.cloud.google.com/security/secret-manager
"""
if not self.private_api_key_secret_name:
raise ValueError('private_api_key_secret_name must be set to '
@@ -268,6 +276,7 @@ class GcpProjectApiResource:
def __init__(self, api: discovery.Resource, project: str):
self.api: discovery.Resource = api
self.project: str = project
+ self._highlighter = _HighlighterYaml()
# TODO(sergiitk): in upcoming GCP refactoring, differentiate between
# _execute for LRO (Long Running Operations), and immediate operations.
@@ -294,6 +303,11 @@ class GcpProjectApiResource:
except _HttpLib2Error as error:
raise TransportError(error)
+ def resource_pretty_format(self, body: dict) -> str:
+ """Return a string with pretty-printed resource body."""
+ yaml_out: str = yaml.dump(body, explicit_start=True, explicit_end=True)
+ return self._highlighter.highlight(yaml_out)
+
@staticmethod
def wait_for_operation(operation_request,
test_success_fn,
@@ -308,11 +322,6 @@ class GcpProjectApiResource:
reraise=True)
return retryer(operation_request.execute)
- @staticmethod
- def resource_pretty_format(body: dict) -> str:
- """Return a string with pretty-printed resource body."""
- return yaml.dump(body, explicit_start=True, explicit_end=True)
-
class GcpStandardCloudApiResource(GcpProjectApiResource, metaclass=abc.ABCMeta):
GLOBAL_LOCATION = 'global'
diff --git a/tools/run_tests/xds_k8s_test_driver/framework/infrastructure/gcp/compute.py b/tools/run_tests/xds_k8s_test_driver/framework/infrastructure/gcp/compute.py
index ac6eef6807..8d128ef3f9 100644
--- a/tools/run_tests/xds_k8s_test_driver/framework/infrastructure/gcp/compute.py
+++ b/tools/run_tests/xds_k8s_test_driver/framework/infrastructure/gcp/compute.py
@@ -112,18 +112,25 @@ class ComputeV1(gcp.api.GcpProjectApiResource):
self,
name: str,
health_check: GcpResource,
+ affinity_header: str = None,
protocol: Optional[BackendServiceProtocol] = None) -> GcpResource:
if not isinstance(protocol, self.BackendServiceProtocol):
raise TypeError(f'Unexpected Backend Service protocol: {protocol}')
- return self._insert_resource(
- self.api.backendServices(),
- {
- 'name': name,
- 'loadBalancingScheme':
- 'INTERNAL_SELF_MANAGED', # Traffic Director
- 'healthChecks': [health_check.url],
- 'protocol': protocol.name,
- })
+ body = {
+ 'name': name,
+ 'loadBalancingScheme': 'INTERNAL_SELF_MANAGED', # Traffic Director
+ 'healthChecks': [health_check.url],
+ 'protocol': protocol.name,
+ }
+ # If affinity header is specified, config the backend service to support
+ # affinity, and set affinity header to the one given.
+ if affinity_header:
+ body['sessionAffinity'] = 'HEADER_FIELD'
+ body['localityLbPolicy'] = 'RING_HASH'
+ body['consistentHash'] = {
+ 'httpHeaderName': affinity_header,
+ }
+ return self._insert_resource(self.api.backendServices(), body)
def get_backend_service_traffic_director(self, name: str) -> GcpResource:
return self._get_resource(self.api.backendServices(),
@@ -135,11 +142,17 @@ class ComputeV1(gcp.api.GcpProjectApiResource):
body=body,
**kwargs)
- def backend_service_add_backends(self, backend_service, backends):
+ def backend_service_patch_backends(
+ self,
+ backend_service,
+ backends,
+ max_rate_per_endpoint: Optional[int] = None):
+ if max_rate_per_endpoint is None:
+ max_rate_per_endpoint = 5
backend_list = [{
'group': backend.url,
'balancingMode': 'RATE',
- 'maxRatePerEndpoint': 5
+ 'maxRatePerEndpoint': max_rate_per_endpoint
} for backend in backends]
self._patch_resource(collection=self.api.backendServices(),
@@ -184,6 +197,12 @@ class ComputeV1(gcp.api.GcpProjectApiResource):
def create_url_map_with_content(self, url_map_body: Any) -> GcpResource:
return self._insert_resource(self.api.urlMaps(), url_map_body)
+ def patch_url_map(self, url_map: GcpResource, body, **kwargs):
+ self._patch_resource(collection=self.api.urlMaps(),
+ urlMap=url_map.name,
+ body=body,
+ **kwargs)
+
def delete_url_map(self, name):
self._delete_resource(self.api.urlMaps(), 'urlMap', name)
@@ -235,6 +254,17 @@ class ComputeV1(gcp.api.GcpProjectApiResource):
'target': target_proxy.url,
})
+ def exists_forwarding_rule(self, src_port) -> bool:
+ # TODO(sergiitk): Better approach for confirming the port is available.
+ # It's possible a rule allocates actual port range, e.g 8000-9000,
+ # and this wouldn't catch it. For now, we assume there's no
+ # port ranges used in the project.
+ filter_str = (f'(portRange eq "{src_port}-{src_port}") '
+ f'(IPAddress eq "0.0.0.0")'
+ f'(loadBalancingScheme eq "INTERNAL_SELF_MANAGED")')
+ return self._exists_resource(self.api.globalForwardingRules(),
+ filter=filter_str)
+
def delete_forwarding_rule(self, name):
self._delete_resource(self.api.globalForwardingRules(),
'forwardingRule', name)
@@ -329,6 +359,16 @@ class ComputeV1(gcp.api.GcpProjectApiResource):
self.resource_pretty_format(resp))
return self.GcpResource(resp['name'], resp['selfLink'])
+ def _exists_resource(self, collection: discovery.Resource,
+ filter: str) -> bool:
+ resp = collection.list(
+ project=self.project, filter=filter,
+ maxResults=1).execute(num_retries=self._GCP_API_RETRIES)
+ if 'kind' not in resp:
+ # TODO(sergiitk): better error
+ raise ValueError('List response "kind" is missing')
+ return 'items' in resp and resp['items']
+
def _insert_resource(self, collection: discovery.Resource,
body: Dict[str, Any]) -> GcpResource:
logger.info('Creating compute resource:\n%s',
diff --git a/tools/run_tests/xds_k8s_test_driver/framework/infrastructure/gcp/network_services.py b/tools/run_tests/xds_k8s_test_driver/framework/infrastructure/gcp/network_services.py
index cede02008e..0174336506 100644
--- a/tools/run_tests/xds_k8s_test_driver/framework/infrastructure/gcp/network_services.py
+++ b/tools/run_tests/xds_k8s_test_driver/framework/infrastructure/gcp/network_services.py
@@ -11,9 +11,10 @@
# 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.
+
import dataclasses
import logging
-from typing import Optional
+from typing import Any, Dict, List, Optional, Tuple
from google.rpc import code_pb2
import tenacity
@@ -22,9 +23,135 @@ from framework.infrastructure import gcp
logger = logging.getLogger(__name__)
+_ComputeV1 = gcp.compute.ComputeV1
+GcpResource = _ComputeV1.GcpResource
+
+
+@dataclasses.dataclass(frozen=True)
+class Router:
+
+ name: str
+ url: str
+ type: str
+ network: Optional[str]
+ routes: Optional[List[str]]
+
+ @classmethod
+ def from_response(cls, name: str, d: Dict[str, Any]) -> 'Router':
+ return cls(
+ name=name,
+ url=d["name"],
+ type=d["type"],
+ network=d.get("network"),
+ routes=list(d["routes"]) if "routes" in d else None,
+ )
+
+
+@dataclasses.dataclass(frozen=True)
+class GrpcRoute:
+
+ @dataclasses.dataclass(frozen=True)
+ class MethodMatch:
+ type: Optional[str]
+ grpc_service: Optional[str]
+ grpc_method: Optional[str]
+ case_sensitive: Optional[bool]
+
+ @classmethod
+ def from_response(cls, d: Dict[str, Any]) -> 'MethodMatch':
+ return cls(
+ type=d.get("type"),
+ grpc_service=d.get("grpcService"),
+ grpc_method=d.get("grpcMethod"),
+ case_sensitive=d.get("caseSensitive"),
+ )
+
+ @dataclasses.dataclass(frozen=True)
+ class HeaderMatch:
+ type: Optional[str]
+ key: str
+ value: str
+
+ @classmethod
+ def from_response(cls, d: Dict[str, Any]) -> 'HeaderMatch':
+ return cls(
+ type=d.get("type"),
+ key=d["key"],
+ value=d["value"],
+ )
+
+ @dataclasses.dataclass(frozen=True)
+ class RouteMatch:
+ method: Optional['MethodMatch']
+ headers: Tuple['HeaderMatch']
+
+ @classmethod
+ def from_response(cls, d: Dict[str, Any]) -> 'RouteMatch':
+ return cls(
+ method=MethodMatch.from_response(d["method"])
+ if "method" in d else None,
+ headers=tuple(
+ HeaderMatch.from_response(h) for h in d["headers"])
+ if "headers" in d else (),
+ )
+
+ @dataclasses.dataclass(frozen=True)
+ class Destination:
+ service_name: str
+ weight: Optional[int]
+
+ @classmethod
+ def from_response(cls, d: Dict[str, Any]) -> 'Destination':
+ return cls(
+ service_name=d["serviceName"],
+ weight=d.get("weight"),
+ )
+
+ @dataclasses.dataclass(frozen=True)
+ class RouteAction:
+ destination: Optional['Destination']
+ drop: Optional[int]
+
+ @classmethod
+ def from_response(cls, d: Dict[str, Any]) -> 'RouteAction':
+ return cls(
+ destination=Destination.from_response(d["destination"])
+ if "destination" in d else None,
+ drop=d.get("drop"),
+ )
+
+ @dataclasses.dataclass(frozen=True)
+ class RouteRule:
+ match: Optional['RouteMatch']
+ action: 'RouteAction'
+
+ @classmethod
+ def from_response(cls, d: Dict[str, Any]) -> 'RouteRule':
+ return cls(
+ match=RouteMatch.from_response(d["match"])
+ if "match" in d else "",
+ action=RouteAction.from_response(d["action"]),
+ )
+
+ name: str
+ url: str
+ hostnames: Tuple[str]
+ rules: Tuple['RouteRule']
+
+ @classmethod
+ def from_response(cls, name: str, d: Dict[str, Any]) -> 'RouteRule':
+ return cls(
+ name=name,
+ url=d["name"],
+ hostnames=tuple(d["hostnames"]),
+ rules=tuple(d["rules"]),
+ )
+
class NetworkServicesV1Alpha1(gcp.api.GcpStandardCloudApiResource):
ENDPOINT_CONFIG_SELECTORS = 'endpointConfigSelectors'
+ GRPC_ROUTES = 'grpcRoutes'
+ ROUTERS = 'routers'
@dataclasses.dataclass(frozen=True)
class EndpointConfigSelector:
@@ -90,6 +217,40 @@ class NetworkServicesV1Alpha1(gcp.api.GcpStandardCloudApiResource):
reraise=True)
retryer(super()._execute, *args, **kwargs)
+ def create_router(self, name: str, body: dict) -> GcpResource:
+ return self._create_resource(
+ self._api_locations.routers(),
+ body,
+ routerId=name,
+ )
+
+ def get_router(self, name: str) -> Router:
+ result = self._get_resource(collection=self._api_locations.routers(),
+ full_name=self.resource_full_name(
+ name, self.ROUTERS))
+ return Router.from_response(name, result)
+
+ def delete_router(self, name: str) -> bool:
+ return self._delete_resource(collection=self._api_locations.routers(),
+ full_name=self.resource_full_name(
+ name, self.ROUTERS))
+
+ def create_grpc_route(self, name: str, body: dict) -> GcpResource:
+ return self._create_resource(self._api_locations.grpcRoutes(),
+ body,
+ grpcRouteId=name)
+
+ def get_grpc_route(self, name: str) -> GrpcRoute:
+ result = self._get_resource(collection=self._api_locations.grpcRoutes(),
+ full_name=self.resource_full_name(
+ name, self.GRPC_ROUTES))
+ return GrpcRoute.from_response(name, result)
+
+ def delete_grpc_route(self, name: str) -> bool:
+ return self._delete_resource(
+ collection=self._api_locations.grpcRoutes(),
+ full_name=self.resource_full_name(name, self.GRPC_ROUTES))
+
@staticmethod
def _operation_internal_error(exception):
return (isinstance(exception, gcp.api.OperationError) and
diff --git a/tools/run_tests/xds_k8s_test_driver/framework/infrastructure/traffic_director.py b/tools/run_tests/xds_k8s_test_driver/framework/infrastructure/traffic_director.py
index 871f3c067a..ebbc06edf0 100644
--- a/tools/run_tests/xds_k8s_test_driver/framework/infrastructure/traffic_director.py
+++ b/tools/run_tests/xds_k8s_test_driver/framework/infrastructure/traffic_director.py
@@ -11,8 +11,10 @@
# 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.
+import functools
import logging
-from typing import Any, List, Optional, Set
+import random
+from typing import Any, Dict, Iterable, List, Optional, Set
from framework import xds_flags
from framework.infrastructure import gcp
@@ -38,11 +40,18 @@ ClientTlsPolicy = _NetworkSecurityV1Alpha1.ClientTlsPolicy
_NetworkServicesV1Alpha1 = gcp.network_services.NetworkServicesV1Alpha1
EndpointConfigSelector = _NetworkServicesV1Alpha1.EndpointConfigSelector
+# Testing metadata consts
+TEST_AFFINITY_METADATA_KEY = 'xds_md'
+
class TrafficDirectorManager:
compute: _ComputeV1
+ resource_prefix: str
+ resource_suffix: str
+
BACKEND_SERVICE_NAME = "backend-service"
- ALTERNATIVE_BACKEND_SERVICE_NAME = "alternative-backend-service"
+ ALTERNATIVE_BACKEND_SERVICE_NAME = "backend-service-alt"
+ AFFINITY_BACKEND_SERVICE_NAME = "backend-service-affinity"
HEALTH_CHECK_NAME = "health-check"
URL_MAP_NAME = "url-map"
URL_MAP_PATH_MATCHER_NAME = "path-matcher"
@@ -56,6 +65,7 @@ class TrafficDirectorManager:
project: str,
*,
resource_prefix: str,
+ resource_suffix: str,
network: str = 'default',
):
# API
@@ -65,6 +75,7 @@ class TrafficDirectorManager:
self.project: str = project
self.network: str = network
self.resource_prefix: str = resource_prefix
+ self.resource_suffix: str = resource_suffix
# Managed resources
self.health_check: Optional[GcpResource] = None
@@ -83,6 +94,11 @@ class TrafficDirectorManager:
self.alternative_backend_service_protocol: Optional[
BackendServiceProtocol] = None
self.alternative_backends: Set[ZonalGcpResource] = set()
+ self.affinity_backend_service: Optional[GcpResource] = None
+ # TODO(sergiitk): remove this flag once backend service resource loaded
+ self.affinity_backend_service_protocol: Optional[
+ BackendServiceProtocol] = None
+ self.affinity_backends: Set[ZonalGcpResource] = set()
@property
def network_url(self):
@@ -115,17 +131,22 @@ class TrafficDirectorManager:
def cleanup(self, *, force=False):
# Cleanup in the reverse order of creation
self.delete_forwarding_rule(force=force)
- if self.target_proxy_is_http:
- self.delete_target_http_proxy(force=force)
- else:
- self.delete_target_grpc_proxy(force=force)
+ self.delete_target_http_proxy(force=force)
+ self.delete_target_grpc_proxy(force=force)
self.delete_url_map(force=force)
self.delete_backend_service(force=force)
self.delete_alternative_backend_service(force=force)
+ self.delete_affinity_backend_service(force=force)
self.delete_health_check(force=force)
- def _ns_name(self, name):
- return f'{self.resource_prefix}-{name}'
+ @functools.lru_cache(None)
+ def make_resource_name(self, name: str) -> str:
+ """Make dash-separated resource name with resource prefix and suffix."""
+ parts = [self.resource_prefix, name]
+ # Avoid trailing dash when the suffix is empty.
+ if self.resource_suffix:
+ parts.append(self.resource_suffix)
+ return '-'.join(parts)
def create_health_check(
self,
@@ -138,14 +159,14 @@ class TrafficDirectorManager:
if protocol is None:
protocol = _HealthCheckGRPC
- name = self._ns_name(self.HEALTH_CHECK_NAME)
+ name = self.make_resource_name(self.HEALTH_CHECK_NAME)
logger.info('Creating %s Health Check "%s"', protocol.name, name)
resource = self.compute.create_health_check(name, protocol, port=port)
self.health_check = resource
def delete_health_check(self, force=False):
if force:
- name = self._ns_name(self.HEALTH_CHECK_NAME)
+ name = self.make_resource_name(self.HEALTH_CHECK_NAME)
elif self.health_check:
name = self.health_check.name
else:
@@ -159,7 +180,7 @@ class TrafficDirectorManager:
if protocol is None:
protocol = _BackendGRPC
- name = self._ns_name(self.BACKEND_SERVICE_NAME)
+ name = self.make_resource_name(self.BACKEND_SERVICE_NAME)
logger.info('Creating %s Backend Service "%s"', protocol.name, name)
resource = self.compute.create_backend_service_traffic_director(
name, health_check=self.health_check, protocol=protocol)
@@ -167,13 +188,13 @@ class TrafficDirectorManager:
self.backend_service_protocol = protocol
def load_backend_service(self):
- name = self._ns_name(self.BACKEND_SERVICE_NAME)
+ name = self.make_resource_name(self.BACKEND_SERVICE_NAME)
resource = self.compute.get_backend_service_traffic_director(name)
self.backend_service = resource
def delete_backend_service(self, force=False):
if force:
- name = self._ns_name(self.BACKEND_SERVICE_NAME)
+ name = self.make_resource_name(self.BACKEND_SERVICE_NAME)
elif self.backend_service:
name = self.backend_service.name
else:
@@ -182,20 +203,35 @@ class TrafficDirectorManager:
self.compute.delete_backend_service(name)
self.backend_service = None
- def backend_service_add_neg_backends(self, name, zones):
+ def backend_service_add_neg_backends(self,
+ name,
+ zones,
+ max_rate_per_endpoint: Optional[
+ int] = None):
logger.info('Waiting for Network Endpoint Groups to load endpoints.')
for zone in zones:
backend = self.compute.wait_for_network_endpoint_group(name, zone)
logger.info('Loaded NEG "%s" in zone %s', backend.name,
backend.zone)
self.backends.add(backend)
- self.backend_service_add_backends()
+ self.backend_service_patch_backends(max_rate_per_endpoint)
+
+ def backend_service_remove_neg_backends(self, name, zones):
+ logger.info('Waiting for Network Endpoint Groups to load endpoints.')
+ for zone in zones:
+ backend = self.compute.wait_for_network_endpoint_group(name, zone)
+ logger.info('Loaded NEG "%s" in zone %s', backend.name,
+ backend.zone)
+ self.backends.remove(backend)
+ self.backend_service_patch_backends()
- def backend_service_add_backends(self):
+ def backend_service_patch_backends(
+ self, max_rate_per_endpoint: Optional[int] = None):
logging.info('Adding backends to Backend Service %s: %r',
self.backend_service.name, self.backends)
- self.compute.backend_service_add_backends(self.backend_service,
- self.backends)
+ self.compute.backend_service_patch_backends(self.backend_service,
+ self.backends,
+ max_rate_per_endpoint)
def backend_service_remove_all_backends(self):
logging.info('Removing backends from Backend Service %s',
@@ -213,7 +249,7 @@ class TrafficDirectorManager:
self, protocol: Optional[BackendServiceProtocol] = _BackendGRPC):
if protocol is None:
protocol = _BackendGRPC
- name = self._ns_name(self.ALTERNATIVE_BACKEND_SERVICE_NAME)
+ name = self.make_resource_name(self.ALTERNATIVE_BACKEND_SERVICE_NAME)
logger.info('Creating %s Alternative Backend Service "%s"',
protocol.name, name)
resource = self.compute.create_backend_service_traffic_director(
@@ -222,13 +258,14 @@ class TrafficDirectorManager:
self.alternative_backend_service_protocol = protocol
def load_alternative_backend_service(self):
- name = self._ns_name(self.ALTERNATIVE_BACKEND_SERVICE_NAME)
+ name = self.make_resource_name(self.ALTERNATIVE_BACKEND_SERVICE_NAME)
resource = self.compute.get_backend_service_traffic_director(name)
self.alternative_backend_service = resource
def delete_alternative_backend_service(self, force=False):
if force:
- name = self._ns_name(self.ALTERNATIVE_BACKEND_SERVICE_NAME)
+ name = self.make_resource_name(
+ self.ALTERNATIVE_BACKEND_SERVICE_NAME)
elif self.alternative_backend_service:
name = self.alternative_backend_service.name
else:
@@ -244,13 +281,13 @@ class TrafficDirectorManager:
logger.info('Loaded NEG "%s" in zone %s', backend.name,
backend.zone)
self.alternative_backends.add(backend)
- self.alternative_backend_service_add_backends()
+ self.alternative_backend_service_patch_backends()
- def alternative_backend_service_add_backends(self):
+ def alternative_backend_service_patch_backends(self):
logging.info('Adding backends to Backend Service %s: %r',
self.alternative_backend_service.name,
self.alternative_backends)
- self.compute.backend_service_add_backends(
+ self.compute.backend_service_patch_backends(
self.alternative_backend_service, self.alternative_backends)
def alternative_backend_service_remove_all_backends(self):
@@ -266,22 +303,118 @@ class TrafficDirectorManager:
self.compute.wait_for_backends_healthy_status(
self.alternative_backend_service, self.alternative_backends)
+ def create_affinity_backend_service(
+ self, protocol: Optional[BackendServiceProtocol] = _BackendGRPC):
+ if protocol is None:
+ protocol = _BackendGRPC
+ name = self.make_resource_name(self.AFFINITY_BACKEND_SERVICE_NAME)
+ logger.info('Creating %s Affinity Backend Service "%s"', protocol.name,
+ name)
+ resource = self.compute.create_backend_service_traffic_director(
+ name,
+ health_check=self.health_check,
+ protocol=protocol,
+ affinity_header=TEST_AFFINITY_METADATA_KEY)
+ self.affinity_backend_service = resource
+ self.affinity_backend_service_protocol = protocol
+
+ def load_affinity_backend_service(self):
+ name = self.make_resource_name(self.AFFINITY_BACKEND_SERVICE_NAME)
+ resource = self.compute.get_backend_service_traffic_director(name)
+ self.affinity_backend_service = resource
+
+ def delete_affinity_backend_service(self, force=False):
+ if force:
+ name = self.make_resource_name(self.AFFINITY_BACKEND_SERVICE_NAME)
+ elif self.affinity_backend_service:
+ name = self.affinity_backend_service.name
+ else:
+ return
+ logger.info('Deleting Affinity Backend Service "%s"', name)
+ self.compute.delete_backend_service(name)
+ self.affinity_backend_service = None
+
+ def affinity_backend_service_add_neg_backends(self, name, zones):
+ logger.info('Waiting for Network Endpoint Groups to load endpoints.')
+ for zone in zones:
+ backend = self.compute.wait_for_network_endpoint_group(name, zone)
+ logger.info('Loaded NEG "%s" in zone %s', backend.name,
+ backend.zone)
+ self.affinity_backends.add(backend)
+ self.affinity_backend_service_patch_backends()
+
+ def affinity_backend_service_patch_backends(self):
+ logging.info('Adding backends to Backend Service %s: %r',
+ self.affinity_backend_service.name, self.affinity_backends)
+ self.compute.backend_service_patch_backends(
+ self.affinity_backend_service, self.affinity_backends)
+
+ def affinity_backend_service_remove_all_backends(self):
+ logging.info('Removing backends from Backend Service %s',
+ self.affinity_backend_service.name)
+ self.compute.backend_service_remove_all_backends(
+ self.affinity_backend_service)
+
+ def wait_for_affinity_backends_healthy_status(self):
+ logger.debug(
+ "Waiting for Backend Service %s to report all backends healthy %r",
+ self.affinity_backend_service, self.affinity_backends)
+ self.compute.wait_for_backends_healthy_status(
+ self.affinity_backend_service, self.affinity_backends)
+
+ def _generate_url_map_body(
+ self,
+ name: str,
+ matcher_name: str,
+ src_hosts,
+ dst_default_backend_service: GcpResource,
+ dst_host_rule_match_backend_service: Optional[GcpResource] = None,
+ ) -> Dict[str, Any]:
+ if dst_host_rule_match_backend_service is None:
+ dst_host_rule_match_backend_service = dst_default_backend_service
+ return {
+ 'name':
+ name,
+ 'defaultService':
+ dst_default_backend_service.url,
+ 'hostRules': [{
+ 'hosts': src_hosts,
+ 'pathMatcher': matcher_name,
+ }],
+ 'pathMatchers': [{
+ 'name': matcher_name,
+ 'defaultService': dst_host_rule_match_backend_service.url,
+ }],
+ }
+
def create_url_map(
self,
src_host: str,
src_port: int,
) -> GcpResource:
src_address = f'{src_host}:{src_port}'
- name = self._ns_name(self.URL_MAP_NAME)
- matcher_name = self._ns_name(self.URL_MAP_PATH_MATCHER_NAME)
+ name = self.make_resource_name(self.URL_MAP_NAME)
+ matcher_name = self.make_resource_name(self.URL_MAP_PATH_MATCHER_NAME)
logger.info('Creating URL map "%s": %s -> %s', name, src_address,
self.backend_service.name)
- resource = self.compute.create_url_map(name, matcher_name,
- [src_address],
- self.backend_service)
+ resource = self.compute.create_url_map_with_content(
+ self._generate_url_map_body(name, matcher_name, [src_address],
+ self.backend_service))
self.url_map = resource
return resource
+ def patch_url_map(self, src_host: str, src_port: int,
+ backend_service: GcpResource):
+ src_address = f'{src_host}:{src_port}'
+ name = self.make_resource_name(self.URL_MAP_NAME)
+ matcher_name = self.make_resource_name(self.URL_MAP_PATH_MATCHER_NAME)
+ logger.info('Patching URL map "%s": %s -> %s', name, src_address,
+ backend_service.name)
+ self.compute.patch_url_map(
+ self.url_map,
+ self._generate_url_map_body(name, matcher_name, [src_address],
+ backend_service))
+
def create_url_map_with_content(self, url_map_body: Any) -> GcpResource:
logger.info('Creating URL map: %s', url_map_body)
resource = self.compute.create_url_map_with_content(url_map_body)
@@ -290,7 +423,7 @@ class TrafficDirectorManager:
def delete_url_map(self, force=False):
if force:
- name = self._ns_name(self.URL_MAP_NAME)
+ name = self.make_resource_name(self.URL_MAP_NAME)
elif self.url_map:
name = self.url_map.name
else:
@@ -300,7 +433,7 @@ class TrafficDirectorManager:
self.url_map = None
def create_target_proxy(self):
- name = self._ns_name(self.TARGET_PROXY_NAME)
+ name = self.make_resource_name(self.TARGET_PROXY_NAME)
if self.backend_service_protocol is BackendServiceProtocol.GRPC:
target_proxy_type = 'GRPC'
create_proxy_fn = self.compute.create_target_grpc_proxy
@@ -318,7 +451,7 @@ class TrafficDirectorManager:
def delete_target_grpc_proxy(self, force=False):
if force:
- name = self._ns_name(self.TARGET_PROXY_NAME)
+ name = self.make_resource_name(self.TARGET_PROXY_NAME)
elif self.target_proxy:
name = self.target_proxy.name
else:
@@ -330,8 +463,8 @@ class TrafficDirectorManager:
def delete_target_http_proxy(self, force=False):
if force:
- name = self._ns_name(self.TARGET_PROXY_NAME)
- elif self.target_proxy:
+ name = self.make_resource_name(self.TARGET_PROXY_NAME)
+ elif self.target_proxy and self.target_proxy_is_http:
name = self.target_proxy.name
else:
return
@@ -340,8 +473,21 @@ class TrafficDirectorManager:
self.target_proxy = None
self.target_proxy_is_http = False
+ def find_unused_forwarding_rule_port(
+ self,
+ *,
+ lo: int = 1024, # To avoid confusion, skip well-known ports.
+ hi: int = 65535,
+ attempts: int = 25) -> int:
+ for attempts in range(attempts):
+ src_port = random.randint(lo, hi)
+ if not (self.compute.exists_forwarding_rule(src_port)):
+ return src_port
+ # TODO(sergiitk): custom exception
+ raise RuntimeError("Couldn't find unused forwarding rule port")
+
def create_forwarding_rule(self, src_port: int):
- name = self._ns_name(self.FORWARDING_RULE_NAME)
+ name = self.make_resource_name(self.FORWARDING_RULE_NAME)
src_port = int(src_port)
logging.info(
'Creating forwarding rule "%s" in network "%s": 0.0.0.0:%s -> %s',
@@ -354,7 +500,7 @@ class TrafficDirectorManager:
def delete_forwarding_rule(self, force=False):
if force:
- name = self._ns_name(self.FORWARDING_RULE_NAME)
+ name = self.make_resource_name(self.FORWARDING_RULE_NAME)
elif self.forwarding_rule:
name = self.forwarding_rule.name
else:
@@ -364,7 +510,7 @@ class TrafficDirectorManager:
self.forwarding_rule = None
def create_firewall_rule(self, allowed_ports: List[str]):
- name = self._ns_name(self.FIREWALL_RULE_NAME)
+ name = self.make_resource_name(self.FIREWALL_RULE_NAME)
logging.info(
'Creating firewall rule "%s" in network "%s" with allowed ports %s',
name, self.network, allowed_ports)
@@ -376,7 +522,7 @@ class TrafficDirectorManager:
def delete_firewall_rule(self, force=False):
"""The firewall rule won't be automatically removed."""
if force:
- name = self._ns_name(self.FIREWALL_RULE_NAME)
+ name = self.make_resource_name(self.FIREWALL_RULE_NAME)
elif self.firewall_rule:
name = self.firewall_rule.name
else:
@@ -386,11 +532,106 @@ class TrafficDirectorManager:
self.firewall_rule = None
+class TrafficDirectorAppNetManager(TrafficDirectorManager):
+
+ GRPC_ROUTE_NAME = "grpc-route"
+ ROUTER_NAME = "router"
+
+ def __init__(self,
+ gcp_api_manager: gcp.api.GcpApiManager,
+ project: str,
+ *,
+ resource_prefix: str,
+ resource_suffix: Optional[str] = None,
+ network: str = 'default'):
+ super().__init__(gcp_api_manager,
+ project,
+ resource_prefix=resource_prefix,
+ resource_suffix=resource_suffix,
+ network=network)
+
+ # API
+ self.netsvc = _NetworkServicesV1Alpha1(gcp_api_manager, project)
+
+ # Managed resources
+ self.grpc_route: Optional[_NetworkServicesV1Alpha1.GrpcRoute] = None
+ self.router: Optional[_NetworkServicesV1Alpha1.Router] = None
+
+ def create_router(self) -> GcpResource:
+ name = self.make_resource_name(self.ROUTER_NAME)
+ logger.info("Creating Router %s", name)
+ body = {
+ "type": "PROXYLESS_GRPC",
+ "routes": [self.grpc_route.url],
+ "network": "default",
+ }
+ resource = self.netsvc.create_router(name, body)
+ self.router = self.netsvc.get_router(name)
+ logger.debug("Loaded Router: %s", self.router)
+ return resource
+
+ def delete_router(self, force=False):
+ if force:
+ name = self.make_resource_name(self.ROUTER_NAME)
+ elif self.router:
+ name = self.router.name
+ else:
+ return
+ logger.info('Deleting Router %s', name)
+ self.netsvc.delete_router(name)
+ self.router = None
+
+ def create_grpc_route(self, src_host: str, src_port: int) -> GcpResource:
+ host = f'{src_host}:{src_port}'
+ body = {
+ "hostnames":
+ host,
+ "rules": [{
+ "action": {
+ "destination": {
+ "serviceName": self.backend_service.name
+ }
+ }
+ }],
+ }
+ name = self.make_resource_name(self.GRPC_ROUTE_NAME)
+ logger.info("Creating GrpcRoute %s", name)
+ resource = self.netsvc.create_grpc_route(name, body)
+ self.grpc_route = self.netsvc.get_grpc_route(name)
+ logger.debug("Loaded GrpcRoute: %s", self.grpc_route)
+ return resource
+
+ def create_grpc_route_with_content(self, body: Any) -> GcpResource:
+ name = self.make_resource_name(self.GRPC_ROUTE_NAME)
+ logger.info("Creating GrpcRoute %s", name)
+ resource = self.netsvc.create_grpc_route(name, body)
+ self.grpc_route = self.netsvc.get_grpc_route(name)
+ logger.debug("Loaded GrpcRoute: %s", self.grpc_route)
+ return resource
+
+ def delete_grpc_route(self, force=False):
+ if force:
+ name = self.make_resource_name(self.GRPC_ROUTE_NAME)
+ elif self.grpc_route:
+ name = self.grpc_route.name
+ else:
+ return
+ logger.info('Deleting GrpcRoute %s', name)
+ self.netsvc.delete_grpc_route(name)
+ self.grpc_route = None
+
+ def cleanup(self, *, force=False):
+ self.delete_router(force=force)
+ self.delete_grpc_route(force=force)
+ super().cleanup(force=force)
+
+
class TrafficDirectorSecureManager(TrafficDirectorManager):
netsec: Optional[_NetworkSecurityV1Alpha1]
SERVER_TLS_POLICY_NAME = "server-tls-policy"
CLIENT_TLS_POLICY_NAME = "client-tls-policy"
- ENDPOINT_CONFIG_SELECTOR_NAME = "endpoint-config-selector"
+ # TODO(sergiitk): Rename to ENDPOINT_POLICY_NAME when upgraded to v1beta
+ ENDPOINT_CONFIG_SELECTOR_NAME = "endpoint-policy"
CERTIFICATE_PROVIDER_INSTANCE = "google_cloud_private_spiffe"
def __init__(
@@ -399,11 +640,13 @@ class TrafficDirectorSecureManager(TrafficDirectorManager):
project: str,
*,
resource_prefix: str,
+ resource_suffix: Optional[str] = None,
network: str = 'default',
):
super().__init__(gcp_api_manager,
project,
resource_prefix=resource_prefix,
+ resource_suffix=resource_suffix,
network=network)
# API
@@ -445,7 +688,7 @@ class TrafficDirectorSecureManager(TrafficDirectorManager):
self.delete_client_tls_policy(force=force)
def create_server_tls_policy(self, *, tls, mtls):
- name = self._ns_name(self.SERVER_TLS_POLICY_NAME)
+ name = self.make_resource_name(self.SERVER_TLS_POLICY_NAME)
logger.info('Creating Server TLS Policy %s', name)
if not tls and not mtls:
logger.warning(
@@ -468,7 +711,7 @@ class TrafficDirectorSecureManager(TrafficDirectorManager):
def delete_server_tls_policy(self, force=False):
if force:
- name = self._ns_name(self.SERVER_TLS_POLICY_NAME)
+ name = self.make_resource_name(self.SERVER_TLS_POLICY_NAME)
elif self.server_tls_policy:
name = self.server_tls_policy.name
else:
@@ -479,7 +722,7 @@ class TrafficDirectorSecureManager(TrafficDirectorManager):
def create_endpoint_config_selector(self, server_namespace, server_name,
server_port):
- name = self._ns_name(self.ENDPOINT_CONFIG_SELECTOR_NAME)
+ name = self.make_resource_name(self.ENDPOINT_CONFIG_SELECTOR_NAME)
logger.info('Creating Endpoint Config Selector %s', name)
endpoint_matcher_labels = [{
"labelName": "app",
@@ -511,7 +754,7 @@ class TrafficDirectorSecureManager(TrafficDirectorManager):
def delete_endpoint_config_selector(self, force=False):
if force:
- name = self._ns_name(self.ENDPOINT_CONFIG_SELECTOR_NAME)
+ name = self.make_resource_name(self.ENDPOINT_CONFIG_SELECTOR_NAME)
elif self.ecs:
name = self.ecs.name
else:
@@ -521,7 +764,7 @@ class TrafficDirectorSecureManager(TrafficDirectorManager):
self.ecs = None
def create_client_tls_policy(self, *, tls, mtls):
- name = self._ns_name(self.CLIENT_TLS_POLICY_NAME)
+ name = self.make_resource_name(self.CLIENT_TLS_POLICY_NAME)
logger.info('Creating Client TLS Policy %s', name)
if not tls and not mtls:
logger.warning(
@@ -542,7 +785,7 @@ class TrafficDirectorSecureManager(TrafficDirectorManager):
def delete_client_tls_policy(self, force=False):
if force:
- name = self._ns_name(self.CLIENT_TLS_POLICY_NAME)
+ name = self.make_resource_name(self.CLIENT_TLS_POLICY_NAME)
elif self.client_tls_policy:
name = self.client_tls_policy.name
else:
diff --git a/tools/run_tests/xds_k8s_test_driver/framework/rpc/grpc_testing.py b/tools/run_tests/xds_k8s_test_driver/framework/rpc/grpc_testing.py
index ac32d51aa7..7d010b33a3 100644
--- a/tools/run_tests/xds_k8s_test_driver/framework/rpc/grpc_testing.py
+++ b/tools/run_tests/xds_k8s_test_driver/framework/rpc/grpc_testing.py
@@ -19,8 +19,11 @@ import logging
from typing import Iterable, Optional, Tuple
import grpc
+from grpc_health.v1 import health_pb2
+from grpc_health.v1 import health_pb2_grpc
import framework.rpc
+from src.proto.grpc.testing import empty_pb2
from src.proto.grpc.testing import messages_pb2
from src.proto.grpc.testing import test_pb2_grpc
@@ -107,3 +110,33 @@ class XdsUpdateClientConfigureServiceClient(framework.rpc.grpc.GrpcClientHelper
req=request,
deadline_sec=timeout_sec,
log_level=logging.INFO)
+
+
+class XdsUpdateHealthServiceClient(framework.rpc.grpc.GrpcClientHelper):
+ stub: test_pb2_grpc.XdsUpdateHealthServiceStub
+
+ def __init__(self, channel: grpc.Channel):
+ super().__init__(channel, test_pb2_grpc.XdsUpdateHealthServiceStub)
+
+ def set_serving(self):
+ self.call_unary_with_deadline(rpc='SetServing',
+ req=empty_pb2.Empty(),
+ log_level=logging.INFO)
+
+ def set_not_serving(self):
+ self.call_unary_with_deadline(rpc='SetNotServing',
+ req=empty_pb2.Empty(),
+ log_level=logging.INFO)
+
+
+class HealthClient(framework.rpc.grpc.GrpcClientHelper):
+ stub: health_pb2_grpc.HealthStub
+
+ def __init__(self, channel: grpc.Channel):
+ super().__init__(channel, health_pb2_grpc.HealthStub)
+
+ def check_health(self):
+ return self.call_unary_with_deadline(
+ rpc='Check',
+ req=health_pb2.HealthCheckRequest(),
+ log_level=logging.INFO)
diff --git a/tools/run_tests/xds_k8s_test_driver/framework/test_app/base_runner.py b/tools/run_tests/xds_k8s_test_driver/framework/test_app/base_runner.py
index 504dc184d1..5c9e32c88f 100644
--- a/tools/run_tests/xds_k8s_test_driver/framework/test_app/base_runner.py
+++ b/tools/run_tests/xds_k8s_test_driver/framework/test_app/base_runner.py
@@ -12,18 +12,39 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import contextlib
+import datetime
import logging
import pathlib
-from typing import Optional
+from typing import Dict, Optional
+import urllib.parse
import mako.template
import yaml
+import framework.helpers.datetime
+import framework.helpers.highlighter
from framework.infrastructure import gcp
from framework.infrastructure import k8s
logger = logging.getLogger(__name__)
+# Type aliases
+_HighlighterYaml = framework.helpers.highlighter.HighlighterYaml
+_helper_datetime = framework.helpers.datetime
+timedelta = datetime.timedelta
+
+
+def _logs_explorer_query(query: Dict[str, str]) -> str:
+ return '\n'.join(f'{k}="{v}"' for k, v in query.items())
+
+
+def _logs_explorer_request(req: Dict[str, str]) -> str:
+ return ';'.join(f'{k}={_logs_explorer_quote(v)}' for k, v in req.items())
+
+
+def _logs_explorer_quote(value: str):
+ return urllib.parse.quote_plus(value, safe=':')
+
class RunnerError(Exception):
"""Error running app"""
@@ -38,6 +59,8 @@ class KubernetesBaseRunner:
k8s_namespace,
namespace_template=None,
reuse_namespace=False):
+ self._highlighter = _HighlighterYaml()
+
# Kubernetes namespaced resources manager
self.k8s_namespace: k8s.KubernetesNamespace = k8s_namespace
self.reuse_namespace = reuse_namespace
@@ -88,7 +111,7 @@ class KubernetesBaseRunner:
yaml_doc = self._render_template(template_file, **kwargs)
logger.info("Rendered template %s/%s:\n%s", self.TEMPLATE_DIR_NAME,
- template_name, yaml_doc)
+ template_name, self._highlighter.highlight(yaml_doc))
manifests = self._manifests_from_str(yaml_doc)
manifest = next(manifests)
@@ -286,3 +309,41 @@ class KubernetesBaseRunner:
name, service_port)
logger.info("Service %s: detected NEG=%s in zones=%s", name, neg_name,
neg_zones)
+
+ @staticmethod
+ def _logs_explorer_link(*,
+ deployment_name: str,
+ namespace_name: str,
+ gcp_project: str,
+ gcp_ui_url: str,
+ end_delta: timedelta = None) -> None:
+ """Output the link to test server/client logs in GCP Logs Explorer."""
+ if end_delta is None:
+ end_delta = timedelta(hours=1)
+
+ time_now = _helper_datetime.iso8601_utc_time()
+ time_end = _helper_datetime.iso8601_utc_time(end_delta)
+ query = _logs_explorer_query({
+ 'resource.type': 'k8s_container',
+ 'resource.labels.project_id': gcp_project,
+ 'resource.labels.container_name': deployment_name,
+ 'resource.labels.namespace_name': namespace_name,
+ })
+ req = _logs_explorer_request({
+ 'query': query,
+ 'timeRange': f'{time_now}/{time_end}',
+ })
+
+ link = f'https://{gcp_ui_url}/logs/query;{req}?project={gcp_project}'
+ logger.info("GCP Logs Explorer link to %s:\n%s", deployment_name, link)
+
+ @staticmethod
+ def _make_namespace_name(resource_prefix: str, resource_suffix: str,
+ name: str) -> str:
+ """A helper to make consistent test app kubernetes namespace name
+ for given resource prefix and suffix."""
+ parts = [resource_prefix, name]
+ # Avoid trailing dash when the suffix is empty.
+ if resource_suffix:
+ parts.append(resource_suffix)
+ return '-'.join(parts)
diff --git a/tools/run_tests/xds_k8s_test_driver/framework/test_app/client_app.py b/tools/run_tests/xds_k8s_test_driver/framework/test_app/client_app.py
index b0b5602643..9a30dca7bd 100644
--- a/tools/run_tests/xds_k8s_test_driver/framework/test_app/client_app.py
+++ b/tools/run_tests/xds_k8s_test_driver/framework/test_app/client_app.py
@@ -20,7 +20,7 @@ modules.
import datetime
import functools
import logging
-from typing import Iterable, Optional, Tuple
+from typing import Iterable, List, Optional
from framework.helpers import retryers
from framework.infrastructure import gcp
@@ -213,6 +213,17 @@ class XdsTestClient(framework.rpc.grpc.GrpcApp):
f'Not found a {_ChannelzChannelState.Name(state)} '
f'subchannel for channel_id {channel.ref.channel_id}')
+ def find_subchannels_with_state(self, state: _ChannelzChannelState,
+ **kwargs) -> List[_ChannelzSubchannel]:
+ subchannels = []
+ for channel in self.channelz.find_channels_for_target(
+ self.server_target, **kwargs):
+ for subchannel in self.channelz.list_channel_subchannels(
+ channel, **kwargs):
+ if subchannel.data.state.state is state:
+ subchannels.append(subchannel)
+ return subchannels
+
class KubernetesClientRunner(base_runner.KubernetesBaseRunner):
@@ -250,6 +261,9 @@ class KubernetesClientRunner(base_runner.KubernetesBaseRunner):
# Kubernetes service account
self.service_account_name = service_account_name or deployment_name
self.service_account_template = service_account_template
+ # GCP.
+ self.gcp_project = gcp_project
+ self.gcp_ui_url = gcp_api_manager.gcp_ui_url
# GCP service account to map to Kubernetes service account
self.gcp_service_account = gcp_service_account
# GCP IAM API used to grant allow workload service accounts permission
@@ -261,15 +275,26 @@ class KubernetesClientRunner(base_runner.KubernetesBaseRunner):
self.service_account: Optional[k8s.V1ServiceAccount] = None
self.port_forwarder = None
+ # TODO(sergiitk): make rpc UnaryCall enum or get it from proto
def run(self,
*,
server_target,
rpc='UnaryCall',
qps=25,
+ metadata='',
secure_mode=False,
print_response=False) -> XdsTestClient:
+ logger.info(
+ 'Deploying xDS test client "%s" to k8s namespace %s: '
+ 'server_target=%s rpc=%s qps=%s metadata=%r secure_mode=%s '
+ 'print_response=%s', self.deployment_name, self.k8s_namespace.name,
+ server_target, rpc, qps, metadata, secure_mode, print_response)
+ self._logs_explorer_link(deployment_name=self.deployment_name,
+ namespace_name=self.k8s_namespace.name,
+ gcp_project=self.gcp_project,
+ gcp_ui_url=self.gcp_ui_url)
+
super().run()
- # TODO(sergiitk): make rpc UnaryCall enum or get it from proto
# Allow Kubernetes service account to use the GCP service account
# identity.
@@ -299,6 +324,7 @@ class KubernetesClientRunner(base_runner.KubernetesBaseRunner):
server_target=server_target,
rpc=rpc,
qps=qps,
+ metadata=metadata,
secure_mode=secure_mode,
print_response=print_response)
@@ -338,3 +364,17 @@ class KubernetesClientRunner(base_runner.KubernetesBaseRunner):
self._delete_service_account(self.service_account_name)
self.service_account = None
super().cleanup(force=force_namespace and force)
+
+ @classmethod
+ def make_namespace_name(cls,
+ resource_prefix: str,
+ resource_suffix: str,
+ name: str = 'client') -> str:
+ """A helper to make consistent XdsTestClient kubernetes namespace name
+ for given resource prefix and suffix.
+
+ Note: the idea is to intentionally produce different namespace name for
+ the test server, and the test client, as that closely mimics real-world
+ deployments.
+ """
+ return cls._make_namespace_name(resource_prefix, resource_suffix, name)
diff --git a/tools/run_tests/xds_k8s_test_driver/framework/test_app/server_app.py b/tools/run_tests/xds_k8s_test_driver/framework/test_app/server_app.py
index aba2bb15ad..7fec8f1b69 100644
--- a/tools/run_tests/xds_k8s_test_driver/framework/test_app/server_app.py
+++ b/tools/run_tests/xds_k8s_test_driver/framework/test_app/server_app.py
@@ -19,18 +19,22 @@ modules.
"""
import functools
import logging
-from typing import Iterator, Optional
+import threading
+from typing import Iterator, List, Optional
from framework.infrastructure import gcp
from framework.infrastructure import k8s
import framework.rpc
from framework.rpc import grpc_channelz
+from framework.rpc import grpc_testing
from framework.test_app import base_runner
logger = logging.getLogger(__name__)
# Type aliases
_ChannelzServiceClient = grpc_channelz.ChannelzServiceClient
+_XdsUpdateHealthServiceClient = grpc_testing.XdsUpdateHealthServiceClient
+_HealthClient = grpc_testing.HealthClient
class XdsTestServer(framework.rpc.grpc.GrpcApp):
@@ -48,7 +52,8 @@ class XdsTestServer(framework.rpc.grpc.GrpcApp):
server_id: Optional[str] = None,
xds_host: Optional[str] = None,
xds_port: Optional[int] = None,
- rpc_host: Optional[str] = None):
+ rpc_host: Optional[str] = None,
+ pod_name: Optional[str] = None):
super().__init__(rpc_host=(rpc_host or ip))
self.ip = ip
self.rpc_port = rpc_port
@@ -56,12 +61,34 @@ class XdsTestServer(framework.rpc.grpc.GrpcApp):
self.secure_mode = secure_mode
self.server_id = server_id
self.xds_host, self.xds_port = xds_host, xds_port
+ self.pod_name = pod_name
@property
@functools.lru_cache(None)
def channelz(self) -> _ChannelzServiceClient:
return _ChannelzServiceClient(self._make_channel(self.maintenance_port))
+ @property
+ @functools.lru_cache(None)
+ def update_health_service_client(self) -> _XdsUpdateHealthServiceClient:
+ return _XdsUpdateHealthServiceClient(
+ self._make_channel(self.maintenance_port))
+
+ @property
+ @functools.lru_cache(None)
+ def health_client(self) -> _HealthClient:
+ return _HealthClient(self._make_channel(self.maintenance_port))
+
+ def set_serving(self):
+ logger.info('Setting health status to serving')
+ self.update_health_service_client.set_serving()
+ logger.info('Server reports %s', self.health_client.check_health())
+
+ def set_not_serving(self):
+ logger.info('Setting health status to not serving')
+ self.update_health_service_client.set_not_serving()
+ logger.info('Server reports %s', self.health_client.check_health())
+
def set_xds_address(self, xds_host, xds_port: Optional[int] = None):
self.xds_host, self.xds_port = xds_host, xds_port
@@ -131,6 +158,9 @@ class KubernetesServerRunner(base_runner.KubernetesBaseRunner):
DEFAULT_MAINTENANCE_PORT = 8080
DEFAULT_SECURE_MODE_MAINTENANCE_PORT = 8081
+ _lock = threading.Lock()
+ _server_port_forwarding_offset = 0
+
def __init__(self,
k8s_namespace,
*,
@@ -174,6 +204,9 @@ class KubernetesServerRunner(base_runner.KubernetesBaseRunner):
# Kubernetes service account
self.service_account_name = service_account_name or deployment_name
self.service_account_template = service_account_template
+ # GCP.
+ self.gcp_project = gcp_project
+ self.gcp_ui_url = gcp_api_manager.gcp_ui_url
# GCP service account to map to Kubernetes service account
self.gcp_service_account = gcp_service_account
# GCP IAM API used to grant allow workload service accounts permission
@@ -184,7 +217,7 @@ class KubernetesServerRunner(base_runner.KubernetesBaseRunner):
self.deployment: Optional[k8s.V1Deployment] = None
self.service_account: Optional[k8s.V1ServiceAccount] = None
self.service: Optional[k8s.V1Service] = None
- self.port_forwarder = None
+ self.port_forwarders = []
def run(self,
*,
@@ -192,11 +225,7 @@ class KubernetesServerRunner(base_runner.KubernetesBaseRunner):
maintenance_port=None,
secure_mode=False,
server_id=None,
- replica_count=1) -> XdsTestServer:
- # TODO(sergiitk): multiple replicas
- if replica_count != 1:
- raise NotImplementedError("Multiple replicas not yet supported")
-
+ replica_count=1) -> List[XdsTestServer]:
# Implementation detail: in secure mode, maintenance ("backchannel")
# port must be different from the test port so communication with
# maintenance services can be reached independently from the security
@@ -215,6 +244,16 @@ class KubernetesServerRunner(base_runner.KubernetesBaseRunner):
isinstance(maintenance_port, int)):
raise TypeError('Port numbers must be integer')
+ logger.info(
+ 'Deploying xDS test server "%s" to k8s namespace %s: test_port=%s '
+ 'maintenance_port=%s secure_mode=%s server_id=%s replica_count=%s',
+ self.deployment_name, self.k8s_namespace.name, test_port,
+ maintenance_port, secure_mode, server_id, replica_count)
+ self._logs_explorer_link(deployment_name=self.deployment_name,
+ namespace_name=self.k8s_namespace.name,
+ gcp_project=self.gcp_project,
+ gcp_ui_url=self.gcp_ui_url)
+
# Create namespace.
super().run()
@@ -267,32 +306,45 @@ class KubernetesServerRunner(base_runner.KubernetesBaseRunner):
# Wait for pods running
pods = self.k8s_namespace.list_deployment_pods(self.deployment)
+
+ servers = []
for pod in pods:
- self._wait_pod_started(pod.metadata.name)
-
- # TODO(sergiitk): This is why multiple replicas not yet supported
- pod = pods[0]
- pod_ip = pod.status.pod_ip
- rpc_host = None
- # Experimental, for local debugging.
- if self.debug_use_port_forwarding:
- logger.info('LOCAL DEV MODE: Enabling port forwarding to %s:%s',
- pod_ip, maintenance_port)
- self.port_forwarder = self.k8s_namespace.port_forward_pod(
- pod, remote_port=maintenance_port)
- rpc_host = self.k8s_namespace.PORT_FORWARD_LOCAL_ADDRESS
-
- return XdsTestServer(ip=pod_ip,
- rpc_port=test_port,
- maintenance_port=maintenance_port,
- secure_mode=secure_mode,
- server_id=server_id,
- rpc_host=rpc_host)
+ pod_name = pod.metadata.name
+ self._wait_pod_started(pod_name)
+
+ pod_ip = pod.status.pod_ip
+ rpc_host = None
+ # Experimental, for local debugging.
+ local_port = maintenance_port
+ if self.debug_use_port_forwarding:
+ with KubernetesServerRunner._lock:
+ local_port = maintenance_port + KubernetesServerRunner._server_port_forwarding_offset
+ KubernetesServerRunner._server_port_forwarding_offset += 1
+ logger.info(
+ 'LOCAL DEV MODE: Enabling port forwarding to %s:%s using local port %s',
+ pod_ip, maintenance_port, local_port)
+ self.port_forwarders.append(
+ self.k8s_namespace.port_forward_pod(
+ pod,
+ remote_port=maintenance_port,
+ local_port=local_port))
+ rpc_host = self.k8s_namespace.PORT_FORWARD_LOCAL_ADDRESS
+
+ servers.append(
+ XdsTestServer(ip=pod_ip,
+ rpc_port=test_port,
+ maintenance_port=local_port,
+ secure_mode=secure_mode,
+ server_id=server_id,
+ rpc_host=rpc_host,
+ pod_name=pod_name))
+ return servers
def cleanup(self, *, force=False, force_namespace=False):
- if self.port_forwarder:
- self.k8s_namespace.port_forward_stop(self.port_forwarder)
- self.port_forwarder = None
+ if self.port_forwarders:
+ for port_forwarder in self.port_forwarders:
+ self.k8s_namespace.port_forward_stop(port_forwarder)
+ self.port_forwarders = []
if self.deployment or force:
self._delete_deployment(self.deployment_name)
self.deployment = None
@@ -307,3 +359,18 @@ class KubernetesServerRunner(base_runner.KubernetesBaseRunner):
self._delete_service_account(self.service_account_name)
self.service_account = None
super().cleanup(force=(force_namespace and force))
+
+ @classmethod
+ def make_namespace_name(cls,
+ resource_prefix: str,
+ resource_suffix: str,
+ name: str = 'server') -> str:
+ """A helper to make consistent XdsTestServer kubernetes namespace name
+ for given resource prefix and suffix.
+
+ Note: the idea is to intentionally produce different namespace name for
+ the test server, and the test client, as that closely mimics real-world
+ deployments.
+ :rtype: object
+ """
+ return cls._make_namespace_name(resource_prefix, resource_suffix, name)
diff --git a/tools/run_tests/xds_k8s_test_driver/framework/xds_flags.py b/tools/run_tests/xds_k8s_test_driver/framework/xds_flags.py
index 6b1ecdca9c..59068a813c 100644
--- a/tools/run_tests/xds_k8s_test_driver/framework/xds_flags.py
+++ b/tools/run_tests/xds_k8s_test_driver/framework/xds_flags.py
@@ -12,16 +12,27 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from absl import flags
-import googleapiclient.discovery
+
+from framework.helpers import highlighter
# GCP
PROJECT = flags.DEFINE_string("project",
default=None,
- help="GCP Project ID. Required")
-NAMESPACE = flags.DEFINE_string(
- "namespace",
+ help="(required) GCP Project ID.")
+RESOURCE_PREFIX = flags.DEFINE_string(
+ "resource_prefix",
+ default=None,
+ help=("(required) The prefix used to name GCP resources.\n"
+ "Together with `resource_suffix` used to create unique "
+ "resource names."))
+RESOURCE_SUFFIX = flags.DEFINE_string(
+ "resource_suffix",
default=None,
- help="Isolate GCP resources using given namespace / name prefix. Required")
+ help=("The suffix used to name GCP resources.\n"
+ "Together with `resource_prefix` used to create unique "
+ "resource names.\n"
+ "(default: test suite will generate a random suffix, based on suite "
+ "resource management preferences)"))
NETWORK = flags.DEFINE_string("network",
default="default",
help="GCP Network ID")
@@ -29,7 +40,7 @@ NETWORK = flags.DEFINE_string("network",
XDS_SERVER_URI = flags.DEFINE_string(
"xds_server_uri",
default=None,
- help="Override Traffic Director server uri, for testing")
+ help="Override Traffic Director server URI.")
ENSURE_FIREWALL = flags.DEFINE_bool(
"ensure_firewall",
default=False,
@@ -44,37 +55,63 @@ FIREWALL_ALLOWED_PORTS = flags.DEFINE_list(
help="Update the allowed ports of the firewall rule.")
# Test server
-SERVER_NAME = flags.DEFINE_string("server_name",
- default="psm-grpc-server",
- help="Server deployment and service name")
-SERVER_PORT = flags.DEFINE_integer("server_port",
- default=8080,
- lower_bound=0,
- upper_bound=65535,
- help="Server test port")
+SERVER_NAME = flags.DEFINE_string(
+ "server_name",
+ default="psm-grpc-server",
+ help="The name to use for test server deployments.")
+SERVER_PORT = flags.DEFINE_integer(
+ "server_port",
+ default=8080,
+ lower_bound=1,
+ upper_bound=65535,
+ help="Server test port.\nMust be within --firewall_allowed_ports.")
SERVER_MAINTENANCE_PORT = flags.DEFINE_integer(
"server_maintenance_port",
+ default=None,
+ lower_bound=1,
+ upper_bound=65535,
+ help=("Server port running maintenance services: Channelz, CSDS, Health, "
+ "XdsUpdateHealth, and ProtoReflection (optional).\n"
+ "Must be within --firewall_allowed_ports.\n"
+ "(default: the port is chosen automatically based on "
+ "the security configuration)"))
+SERVER_XDS_HOST = flags.DEFINE_string(
+ "server_xds_host",
+ default="xds-test-server",
+ help=("The xDS hostname of the test server.\n"
+ "Together with `server_xds_port` makes test server target URI, "
+ "xds:///hostname:port"))
+# Note: port 0 known to represent a request for dynamically-allocated port
+# https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers#Well-known_ports
+SERVER_XDS_PORT = flags.DEFINE_integer(
+ "server_xds_port",
+ default=8080,
lower_bound=0,
upper_bound=65535,
- default=None,
- help="Server port running maintenance services: health check, channelz, etc"
-)
-SERVER_XDS_HOST = flags.DEFINE_string("server_xds_host",
- default='xds-test-server',
- help="Test server xDS hostname")
-SERVER_XDS_PORT = flags.DEFINE_integer("server_xds_port",
- default=8000,
- help="Test server xDS port")
+ help=("The xDS port of the test server.\n"
+ "Together with `server_xds_host` makes test server target URI, "
+ "xds:///hostname:port\n"
+ "Must be unique within a GCP project.\n"
+ "Set to 0 to select any unused port."))
# Test client
-CLIENT_NAME = flags.DEFINE_string("client_name",
- default="psm-grpc-client",
- help="Client deployment and service name")
-CLIENT_PORT = flags.DEFINE_integer("client_port",
- default=8079,
- help="Client test port")
+CLIENT_NAME = flags.DEFINE_string(
+ "client_name",
+ default="psm-grpc-client",
+ help="The name to use for test client deployments")
+CLIENT_PORT = flags.DEFINE_integer(
+ "client_port",
+ default=8079,
+ lower_bound=1,
+ upper_bound=65535,
+ help=(
+ "The port test client uses to run gRPC services: Channelz, CSDS, "
+ "XdsStats, XdsUpdateClientConfigure, and ProtoReflection (optional).\n"
+ "Doesn't have to be within --firewall_allowed_ports."))
+
+flags.adopt_module_key_flags(highlighter)
flags.mark_flags_as_required([
"project",
- "namespace",
+ "resource_prefix",
])
diff --git a/tools/run_tests/xds_k8s_test_driver/framework/xds_k8s_flags.py b/tools/run_tests/xds_k8s_test_driver/framework/xds_k8s_flags.py
index d7f3f0b4f9..801c83a4a8 100644
--- a/tools/run_tests/xds_k8s_test_driver/framework/xds_k8s_flags.py
+++ b/tools/run_tests/xds_k8s_test_driver/framework/xds_k8s_flags.py
@@ -17,6 +17,10 @@ from absl import flags
KUBE_CONTEXT = flags.DEFINE_string("kube_context",
default=None,
help="Kubectl context to use")
+SECONDARY_KUBE_CONTEXT = flags.DEFINE_string(
+ "secondary_kube_context",
+ default=None,
+ help="Secondary kubectl context to use for cluster in another region")
GCP_SERVICE_ACCOUNT = flags.DEFINE_string(
"gcp_service_account",
default=None,
diff --git a/tools/run_tests/xds_k8s_test_driver/framework/xds_k8s_testcase.py b/tools/run_tests/xds_k8s_test_driver/framework/xds_k8s_testcase.py
index 909ecd87c8..336c82bf4f 100644
--- a/tools/run_tests/xds_k8s_test_driver/framework/xds_k8s_testcase.py
+++ b/tools/run_tests/xds_k8s_test_driver/framework/xds_k8s_testcase.py
@@ -11,12 +11,13 @@
# 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.
+import abc
import datetime
import enum
import hashlib
import logging
import time
-from typing import Optional, Tuple
+from typing import List, Optional, Tuple
from absl import flags
from absl.testing import absltest
@@ -25,6 +26,7 @@ from google.protobuf import json_format
from framework import xds_flags
from framework import xds_k8s_flags
from framework.helpers import retryers
+import framework.helpers.rand
from framework.infrastructure import gcp
from framework.infrastructure import k8s
from framework.infrastructure import traffic_director
@@ -48,21 +50,38 @@ flags.adopt_module_key_flags(xds_flags)
flags.adopt_module_key_flags(xds_k8s_flags)
# Type aliases
+TrafficDirectorManager = traffic_director.TrafficDirectorManager
+TrafficDirectorAppNetManager = traffic_director.TrafficDirectorAppNetManager
+TrafficDirectorSecureManager = traffic_director.TrafficDirectorSecureManager
XdsTestServer = server_app.XdsTestServer
XdsTestClient = client_app.XdsTestClient
+KubernetesServerRunner = server_app.KubernetesServerRunner
+KubernetesClientRunner = client_app.KubernetesClientRunner
LoadBalancerStatsResponse = grpc_testing.LoadBalancerStatsResponse
_ChannelState = grpc_channelz.ChannelState
_timedelta = datetime.timedelta
-_DEFAULT_SECURE_MODE_MAINTENANCE_PORT = \
- server_app.KubernetesServerRunner.DEFAULT_SECURE_MODE_MAINTENANCE_PORT
+_TD_CONFIG_MAX_WAIT_SEC = 600
-class XdsKubernetesTestCase(absltest.TestCase):
- k8s_api_manager: k8s.KubernetesApiManager
+
+class XdsKubernetesTestCase(absltest.TestCase, metaclass=abc.ABCMeta):
+ _resource_suffix_randomize: bool = True
+ client_namespace: str
+ client_runner: KubernetesClientRunner
gcp_api_manager: gcp.api.GcpApiManager
+ k8s_api_manager: k8s.KubernetesApiManager
+ resource_prefix: str
+ resource_suffix: str = ''
+ server_namespace: str
+ server_runner: KubernetesServerRunner
+ server_xds_port: int
+ td: TrafficDirectorManager
@classmethod
def setUpClass(cls):
+ """Hook method for setting up class fixture before running tests in
+ the class.
+ """
# GCP
cls.project: str = xds_flags.PROJECT.value
cls.network: str = xds_flags.NETWORK.value
@@ -72,9 +91,11 @@ class XdsKubernetesTestCase(absltest.TestCase):
cls.ensure_firewall = xds_flags.ENSURE_FIREWALL.value
cls.firewall_allowed_ports = xds_flags.FIREWALL_ALLOWED_PORTS.value
- # Base namespace
- # TODO(sergiitk): generate for each test
- cls.namespace: str = xds_flags.NAMESPACE.value
+ # Resource names.
+ cls.resource_prefix = xds_flags.RESOURCE_PREFIX.value
+ if xds_flags.RESOURCE_SUFFIX.value is not None:
+ cls._resource_suffix_randomize = False
+ cls.resource_suffix = xds_flags.RESOURCE_SUFFIX.value
# Test server
cls.server_image = xds_k8s_flags.SERVER_IMAGE.value
@@ -98,22 +119,64 @@ class XdsKubernetesTestCase(absltest.TestCase):
# Resource managers
cls.k8s_api_manager = k8s.KubernetesApiManager(
xds_k8s_flags.KUBE_CONTEXT.value)
+ cls.secondary_k8s_api_manager = k8s.KubernetesApiManager(
+ xds_k8s_flags.SECONDARY_KUBE_CONTEXT.value)
cls.gcp_api_manager = gcp.api.GcpApiManager()
def setUp(self):
- # TODO(sergiitk): generate namespace with run id for each test
- self.server_namespace = self.namespace
- self.client_namespace = self.namespace
+ """Hook method for setting up the test fixture before exercising it."""
+ super().setUp()
+
+ if self._resource_suffix_randomize:
+ self.resource_suffix = framework.helpers.rand.random_resource_suffix(
+ )
+ logger.info('Test run resource prefix: %s, suffix: %s',
+ self.resource_prefix, self.resource_suffix)
+
+ # TD Manager
+ self.td = self.initTrafficDirectorManager()
+
+ # Test Server runner
+ self.server_namespace = KubernetesServerRunner.make_namespace_name(
+ self.resource_prefix, self.resource_suffix)
+ self.server_runner = self.initKubernetesServerRunner()
+
+ # Test Client runner
+ self.client_namespace = KubernetesClientRunner.make_namespace_name(
+ self.resource_prefix, self.resource_suffix)
+ self.client_runner = self.initKubernetesClientRunner()
+
+ # Ensures the firewall exist
+ if self.ensure_firewall:
+ self.td.create_firewall_rule(
+ allowed_ports=self.firewall_allowed_ports)
+
+ # Randomize xds port, when it's set to 0
+ if self.server_xds_port == 0:
+ # TODO(sergiitk): this is prone to race conditions:
+ # The port might not me taken now, but there's not guarantee
+ # it won't be taken until the tests get to creating
+ # forwarding rule. This check is better than nothing,
+ # but we should find a better approach.
+ self.server_xds_port = self.td.find_unused_forwarding_rule_port()
+ logger.info('Found unused xds port: %s', self.server_xds_port)
+
+ @abc.abstractmethod
+ def initTrafficDirectorManager(self) -> TrafficDirectorManager:
+ raise NotImplementedError
- # Init this in child class
- # TODO(sergiitk): consider making a method to be less error-prone
- self.server_runner = None
- self.client_runner = None
- self.td = None
+ @abc.abstractmethod
+ def initKubernetesServerRunner(self) -> KubernetesServerRunner:
+ raise NotImplementedError
+
+ @abc.abstractmethod
+ def initKubernetesClientRunner(self) -> KubernetesClientRunner:
+ raise NotImplementedError
@classmethod
def tearDownClass(cls):
cls.k8s_api_manager.close()
+ cls.secondary_k8s_api_manager.close()
cls.gcp_api_manager.close()
def tearDown(self):
@@ -137,20 +200,37 @@ class XdsKubernetesTestCase(absltest.TestCase):
self.server_xds_port,
health_check_port=self.server_maintenance_port)
- def setupServerBackends(self, *, wait_for_healthy_status=True):
+ def setupServerBackends(self,
+ *,
+ wait_for_healthy_status=True,
+ server_runner=None,
+ max_rate_per_endpoint: Optional[int] = None):
+ if server_runner is None:
+ server_runner = self.server_runner
# Load Backends
- neg_name, neg_zones = self.server_runner.k8s_namespace.get_service_neg(
- self.server_runner.service_name, self.server_port)
+ neg_name, neg_zones = server_runner.k8s_namespace.get_service_neg(
+ server_runner.service_name, self.server_port)
# Add backends to the Backend Service
- self.td.backend_service_add_neg_backends(neg_name, neg_zones)
+ self.td.backend_service_add_neg_backends(
+ neg_name, neg_zones, max_rate_per_endpoint=max_rate_per_endpoint)
if wait_for_healthy_status:
self.td.wait_for_backends_healthy_status()
+ def removeServerBackends(self, *, server_runner=None):
+ if server_runner is None:
+ server_runner = self.server_runner
+ # Load Backends
+ neg_name, neg_zones = server_runner.k8s_namespace.get_service_neg(
+ server_runner.service_name, self.server_port)
+
+ # Remove backends from the Backend Service
+ self.td.backend_service_remove_neg_backends(neg_name, neg_zones)
+
def assertSuccessfulRpcs(self,
test_client: XdsTestClient,
num_rpcs: int = 100):
- lb_stats = self.sendRpcs(test_client, num_rpcs)
+ lb_stats = self.getClientRpcStats(test_client, num_rpcs)
self.assertAllBackendsReceivedRpcs(lb_stats)
failed = int(lb_stats.num_failures)
self.assertLessEqual(
@@ -158,6 +238,40 @@ class XdsKubernetesTestCase(absltest.TestCase):
0,
msg=f'Expected all RPCs to succeed: {failed} of {num_rpcs} failed')
+ def assertRpcsEventuallyGoToGivenServers(self,
+ test_client: XdsTestClient,
+ servers: List[XdsTestServer],
+ num_rpcs: int = 100):
+ retryer = retryers.constant_retryer(
+ wait_fixed=datetime.timedelta(seconds=1),
+ timeout=datetime.timedelta(seconds=_TD_CONFIG_MAX_WAIT_SEC),
+ log_level=logging.INFO)
+ try:
+ retryer(self._assertRpcsEventuallyGoToGivenServers, test_client,
+ servers, num_rpcs)
+ except retryers.RetryError:
+ logger.exception(
+ 'Rpcs did not go to expected servers before timeout %s',
+ _TD_CONFIG_MAX_WAIT_SEC)
+
+ def _assertRpcsEventuallyGoToGivenServers(self, test_client: XdsTestClient,
+ servers: List[XdsTestServer],
+ num_rpcs: int):
+ server_names = [server.pod_name for server in servers]
+ logger.info(f'Verifying RPCs go to {server_names}')
+ lb_stats = self.getClientRpcStats(test_client, num_rpcs)
+ failed = int(lb_stats.num_failures)
+ self.assertLessEqual(
+ failed,
+ 0,
+ msg=f'Expected all RPCs to succeed: {failed} of {num_rpcs} failed')
+ for server_name in server_names:
+ self.assertIn(server_name, lb_stats.rpcs_by_peer,
+ f'{server_name} did not receive RPCs')
+ for peer in lb_stats.rpcs_by_peer.keys():
+ self.assertIn(peer, server_names,
+ f'Unexpected server {peer} received RPCs')
+
def assertXdsConfigExists(self, test_client: XdsTestClient):
config = test_client.csds.fetch_client_status(log_level=logging.INFO)
self.assertIsNotNone(config)
@@ -177,7 +291,7 @@ class XdsKubernetesTestCase(absltest.TestCase):
def assertFailedRpcs(self,
test_client: XdsTestClient,
num_rpcs: Optional[int] = 100):
- lb_stats = self.sendRpcs(test_client, num_rpcs)
+ lb_stats = self.getClientRpcStats(test_client, num_rpcs)
failed = int(lb_stats.num_failures)
self.assertEqual(
failed,
@@ -185,8 +299,8 @@ class XdsKubernetesTestCase(absltest.TestCase):
msg=f'Expected all RPCs to fail: {failed} of {num_rpcs} failed')
@staticmethod
- def sendRpcs(test_client: XdsTestClient,
- num_rpcs: int) -> LoadBalancerStatsResponse:
+ def getClientRpcStats(test_client: XdsTestClient,
+ num_rpcs: int) -> LoadBalancerStatsResponse:
lb_stats = test_client.get_load_balancer_stats(num_rpcs=num_rpcs)
logger.info(
'Received LoadBalancerStatsResponse from test client %s:\n%s',
@@ -206,28 +320,22 @@ class RegularXdsKubernetesTestCase(XdsKubernetesTestCase):
@classmethod
def setUpClass(cls):
+ """Hook method for setting up class fixture before running tests in
+ the class.
+ """
super().setUpClass()
if cls.server_maintenance_port is None:
- cls.server_maintenance_port = \
- server_app.KubernetesServerRunner.DEFAULT_MAINTENANCE_PORT
-
- def setUp(self):
- super().setUp()
-
- # Traffic Director Configuration
- self.td = traffic_director.TrafficDirectorManager(
- self.gcp_api_manager,
- project=self.project,
- resource_prefix=self.namespace,
- network=self.network)
+ cls.server_maintenance_port = KubernetesServerRunner.DEFAULT_MAINTENANCE_PORT
- # Ensures the firewall exist
- if self.ensure_firewall:
- self.td.create_firewall_rule(
- allowed_ports=self.firewall_allowed_ports)
+ def initTrafficDirectorManager(self) -> TrafficDirectorManager:
+ return TrafficDirectorManager(self.gcp_api_manager,
+ project=self.project,
+ resource_prefix=self.resource_prefix,
+ resource_suffix=self.resource_suffix,
+ network=self.network)
- # Test Server Runner
- self.server_runner = server_app.KubernetesServerRunner(
+ def initKubernetesServerRunner(self) -> KubernetesServerRunner:
+ return KubernetesServerRunner(
k8s.KubernetesNamespace(self.k8s_api_manager,
self.server_namespace),
deployment_name=self.server_name,
@@ -237,10 +345,11 @@ class RegularXdsKubernetesTestCase(XdsKubernetesTestCase):
gcp_api_manager=self.gcp_api_manager,
gcp_service_account=self.gcp_service_account,
xds_server_uri=self.xds_server_uri,
- network=self.network)
+ network=self.network,
+ debug_use_port_forwarding=self.debug_use_port_forwarding)
- # Test Client Runner
- self.client_runner = client_app.KubernetesClientRunner(
+ def initKubernetesClientRunner(self) -> KubernetesClientRunner:
+ return KubernetesClientRunner(
k8s.KubernetesNamespace(self.k8s_api_manager,
self.client_namespace),
deployment_name=self.client_name,
@@ -255,14 +364,21 @@ class RegularXdsKubernetesTestCase(XdsKubernetesTestCase):
stats_port=self.client_port,
reuse_namespace=self.server_namespace == self.client_namespace)
- def startTestServer(self, replica_count=1, **kwargs) -> XdsTestServer:
- test_server = self.server_runner.run(
+ def startTestServers(self,
+ replica_count=1,
+ server_runner=None,
+ **kwargs) -> List[XdsTestServer]:
+ if server_runner is None:
+ server_runner = self.server_runner
+ test_servers = server_runner.run(
replica_count=replica_count,
test_port=self.server_port,
maintenance_port=self.server_maintenance_port,
**kwargs)
- test_server.set_xds_address(self.server_xds_host, self.server_xds_port)
- return test_server
+ for test_server in test_servers:
+ test_server.set_xds_address(self.server_xds_host,
+ self.server_xds_port)
+ return test_servers
def startTestClient(self, test_server: XdsTestServer,
**kwargs) -> XdsTestClient:
@@ -272,7 +388,20 @@ class RegularXdsKubernetesTestCase(XdsKubernetesTestCase):
return test_client
+class AppNetXdsKubernetesTestCase(RegularXdsKubernetesTestCase):
+ td: TrafficDirectorAppNetManager
+
+ def initTrafficDirectorManager(self) -> TrafficDirectorAppNetManager:
+ return TrafficDirectorAppNetManager(
+ self.gcp_api_manager,
+ project=self.project,
+ resource_prefix=self.resource_prefix,
+ resource_suffix=self.resource_suffix,
+ network=self.network)
+
+
class SecurityXdsKubernetesTestCase(XdsKubernetesTestCase):
+ td: TrafficDirectorSecureManager
class SecurityMode(enum.Enum):
MTLS = enum.auto()
@@ -281,6 +410,9 @@ class SecurityXdsKubernetesTestCase(XdsKubernetesTestCase):
@classmethod
def setUpClass(cls):
+ """Hook method for setting up class fixture before running tests in
+ the class.
+ """
super().setUpClass()
if cls.server_maintenance_port is None:
# In secure mode, the maintenance port is different from
@@ -288,25 +420,18 @@ class SecurityXdsKubernetesTestCase(XdsKubernetesTestCase):
# Health Checks and Channelz tests available.
# When not provided, use explicit numeric port value, so
# Backend Health Checks are created on a fixed port.
- cls.server_maintenance_port = _DEFAULT_SECURE_MODE_MAINTENANCE_PORT
+ cls.server_maintenance_port = KubernetesServerRunner.DEFAULT_SECURE_MODE_MAINTENANCE_PORT
- def setUp(self):
- super().setUp()
-
- # Traffic Director Configuration
- self.td = traffic_director.TrafficDirectorSecureManager(
+ def initTrafficDirectorManager(self) -> TrafficDirectorSecureManager:
+ return TrafficDirectorSecureManager(
self.gcp_api_manager,
project=self.project,
- resource_prefix=self.namespace,
+ resource_prefix=self.resource_prefix,
+ resource_suffix=self.resource_suffix,
network=self.network)
- # Ensures the firewall exist
- if self.ensure_firewall:
- self.td.create_firewall_rule(
- allowed_ports=self.firewall_allowed_ports)
-
- # Test Server Runner
- self.server_runner = server_app.KubernetesServerRunner(
+ def initKubernetesServerRunner(self) -> KubernetesServerRunner:
+ return KubernetesServerRunner(
k8s.KubernetesNamespace(self.k8s_api_manager,
self.server_namespace),
deployment_name=self.server_name,
@@ -320,8 +445,8 @@ class SecurityXdsKubernetesTestCase(XdsKubernetesTestCase):
deployment_template='server-secure.deployment.yaml',
debug_use_port_forwarding=self.debug_use_port_forwarding)
- # Test Client Runner
- self.client_runner = client_app.KubernetesClientRunner(
+ def initKubernetesClientRunner(self) -> KubernetesClientRunner:
+ return KubernetesClientRunner(
k8s.KubernetesNamespace(self.k8s_api_manager,
self.client_namespace),
deployment_name=self.client_name,
@@ -343,7 +468,7 @@ class SecurityXdsKubernetesTestCase(XdsKubernetesTestCase):
test_port=self.server_port,
maintenance_port=self.server_maintenance_port,
secure_mode=True,
- **kwargs)
+ **kwargs)[0]
test_server.set_xds_address(self.server_xds_host, self.server_xds_port)
return test_server
diff --git a/tools/run_tests/xds_k8s_test_driver/framework/xds_url_map_test_resources.py b/tools/run_tests/xds_k8s_test_driver/framework/xds_url_map_test_resources.py
index 693cd2a1c4..5a3843e331 100644
--- a/tools/run_tests/xds_k8s_test_driver/framework/xds_url_map_test_resources.py
+++ b/tools/run_tests/xds_k8s_test_driver/framework/xds_url_map_test_resources.py
@@ -13,8 +13,9 @@
# limitations under the License.
"""A test framework built for urlMap related xDS test cases."""
-import inspect
import functools
+import inspect
+import time
from typing import Any, Iterable, List, Mapping, Tuple
from absl import flags
@@ -22,6 +23,7 @@ from absl import logging
from framework import xds_flags
from framework import xds_k8s_flags
+import framework.helpers.rand
from framework.infrastructure import gcp
from framework.infrastructure import k8s
from framework.infrastructure import traffic_director
@@ -41,6 +43,7 @@ UrlMapType = Any
HostRule = Any
PathMatcher = Any
+_BackendHTTP2 = gcp.compute.ComputeV1.BackendServiceProtocol.HTTP2
_COMPUTE_V1_URL_PREFIX = 'https://www.googleapis.com/compute/v1'
@@ -132,30 +135,54 @@ class GcpResourceManager(metaclass=_MetaSingletonAndAbslFlags):
(except the client K8s deployment).
"""
- def __init__(self, absl_flags: Mapping[str, Any]):
- for key in absl_flags:
- setattr(self, key, absl_flags[key])
+ # This class dynamically set, so disable "no-member" check.
+ # pylint: disable=no-member
+
+ def __init__(self, absl_flags: Mapping[str, Any] = None):
+ if absl_flags is not None:
+ for key in absl_flags:
+ setattr(self, key, absl_flags[key])
+ # Pick a client_namespace_suffix if not set
+ if self.resource_suffix is None:
+ self.resource_suffix = ""
+ self.client_namespace_suffix = framework.helpers.rand.random_resource_suffix(
+ )
+ else:
+ self.client_namespace_suffix = self.resource_suffix
+ logging.info(
+ 'GcpResourceManager: resource prefix=%s, suffix=%s, client_namespace_suffix=%s',
+ self.resource_prefix, self.resource_suffix,
+ self.client_namespace_suffix)
# API managers
self.k8s_api_manager = k8s.KubernetesApiManager(self.kube_context)
self.gcp_api_manager = gcp.api.GcpApiManager()
self.td = traffic_director.TrafficDirectorManager(
self.gcp_api_manager,
self.project,
- resource_prefix=self.namespace,
+ resource_prefix=self.resource_prefix,
+ resource_suffix=(self.resource_suffix or ""),
network=self.network,
)
# Kubernetes namespace
self.k8s_namespace = k8s.KubernetesNamespace(self.k8s_api_manager,
- self.namespace)
+ self.resource_prefix)
+ if self.client_namespace_suffix != self.resource_suffix:
+ self.k8s_client_namespace = k8s.KubernetesNamespace(
+ self.k8s_api_manager,
+ client_app.KubernetesClientRunner.make_namespace_name(
+ self.resource_prefix, self.client_namespace_suffix))
+ else:
+ self.k8s_client_namespace = self.k8s_namespace
# Kubernetes Test Client
self.test_client_runner = client_app.KubernetesClientRunner(
- self.k8s_namespace,
+ self.k8s_client_namespace,
deployment_name=self.client_name,
image_name=self.client_image,
gcp_project=self.project,
gcp_api_manager=self.gcp_api_manager,
gcp_service_account=self.gcp_service_account,
td_bootstrap_image=self.td_bootstrap_image,
+ xds_server_uri=self.xds_server_uri,
network=self.network,
debug_use_port_forwarding=self.debug_use_port_forwarding,
stats_port=self.client_port,
@@ -169,6 +196,7 @@ class GcpResourceManager(metaclass=_MetaSingletonAndAbslFlags):
gcp_api_manager=self.gcp_api_manager,
gcp_service_account=self.gcp_service_account,
td_bootstrap_image=self.td_bootstrap_image,
+ xds_server_uri=self.xds_server_uri,
network=self.network)
self.test_server_alternative_runner = server_app.KubernetesServerRunner(
self.k8s_namespace,
@@ -178,6 +206,18 @@ class GcpResourceManager(metaclass=_MetaSingletonAndAbslFlags):
gcp_api_manager=self.gcp_api_manager,
gcp_service_account=self.gcp_service_account,
td_bootstrap_image=self.td_bootstrap_image,
+ xds_server_uri=self.xds_server_uri,
+ network=self.network,
+ reuse_namespace=True)
+ self.test_server_affinity_runner = server_app.KubernetesServerRunner(
+ self.k8s_namespace,
+ deployment_name=self.server_name + '-affinity',
+ image_name=self.server_image,
+ gcp_project=self.project,
+ gcp_api_manager=self.gcp_api_manager,
+ gcp_service_account=self.gcp_service_account,
+ td_bootstrap_image=self.td_bootstrap_image,
+ xds_server_uri=self.xds_server_uri,
network=self.network,
reuse_namespace=True)
logging.info('Strategy of GCP resources management: %s', self.strategy)
@@ -187,20 +227,13 @@ class GcpResourceManager(metaclass=_MetaSingletonAndAbslFlags):
logging.info('GcpResourceManager: pre clean-up')
self.td.cleanup(force=True)
self.test_client_runner.delete_namespace()
+ self.test_server_runner.delete_namespace()
def setup(self, test_case_classes: 'Iterable[XdsUrlMapTestCase]') -> None:
if self.strategy not in ['create', 'keep']:
logging.info('GcpResourceManager: skipping setup for strategy [%s]',
self.strategy)
return
- # Construct UrlMap from test classes
- # This is the step that mostly likely to go wrong. Lifting it to be the
- # first task ensures fail fast.
- aggregator = _UrlMapChangeAggregator(
- url_map_name="%s-%s" % (self.namespace, self.td.URL_MAP_NAME))
- for test_case_class in test_case_classes:
- aggregator.apply_change(test_case_class)
- final_url_map = aggregator.get_map()
# Clean up debris from previous runs
self._pre_cleanup()
# Start creating GCP resources
@@ -212,8 +245,22 @@ class GcpResourceManager(metaclass=_MetaSingletonAndAbslFlags):
# Health Checks
self.td.create_health_check()
# Backend Services
- self.td.create_backend_service()
- self.td.create_alternative_backend_service()
+ #
+ # The backend services are created with HTTP2 instead of GRPC (the
+ # default) to disable validate-for-proxyless, because the affinity
+ # settings are not accepted by RCTH yet.
+ #
+ # TODO: delete _BackendHTTP2 from the parameters, to use the default
+ # GRPC.
+ self.td.create_backend_service(_BackendHTTP2)
+ self.td.create_alternative_backend_service(_BackendHTTP2)
+ self.td.create_affinity_backend_service(_BackendHTTP2)
+ # Construct UrlMap from test classes
+ aggregator = _UrlMapChangeAggregator(
+ url_map_name=self.td.make_resource_name(self.td.URL_MAP_NAME))
+ for test_case_class in test_case_classes:
+ aggregator.apply_change(test_case_class)
+ final_url_map = aggregator.get_map()
# UrlMap
self.td.create_url_map_with_content(final_url_map)
# Target Proxy
@@ -228,20 +275,37 @@ class GcpResourceManager(metaclass=_MetaSingletonAndAbslFlags):
self.test_server_alternative_runner.run(
test_port=self.server_port,
maintenance_port=self.server_maintenance_port)
+ # Kubernetes Test Server Affinity. 3 endpoints to test that only the
+ # picked sub-channel is connected.
+ self.test_server_affinity_runner.run(
+ test_port=self.server_port,
+ maintenance_port=self.server_maintenance_port,
+ replica_count=3)
# Add backend to default backend service
neg_name, neg_zones = self.k8s_namespace.get_service_neg(
self.test_server_runner.service_name, self.server_port)
self.td.backend_service_add_neg_backends(neg_name, neg_zones)
# Add backend to alternative backend service
- neg_name, neg_zones = self.k8s_namespace.get_service_neg(
+ neg_name_alt, neg_zones_alt = self.k8s_namespace.get_service_neg(
self.test_server_alternative_runner.service_name, self.server_port)
self.td.alternative_backend_service_add_neg_backends(
- neg_name, neg_zones)
+ neg_name_alt, neg_zones_alt)
+ # Add backend to affinity backend service
+ neg_name_affinity, neg_zones_affinity = self.k8s_namespace.get_service_neg(
+ self.test_server_affinity_runner.service_name, self.server_port)
+ self.td.affinity_backend_service_add_neg_backends(
+ neg_name_affinity, neg_zones_affinity)
# Wait for healthy backends
self.td.wait_for_backends_healthy_status()
self.td.wait_for_alternative_backends_healthy_status()
+ self.td.wait_for_affinity_backends_healthy_status()
def cleanup(self) -> None:
+ if hasattr(self, 'test_client_runner'):
+ self.test_client_runner.cleanup(
+ force=True,
+ # Clean-up ephemeral client namespace
+ force_namespace=self.k8s_client_namespace != self.k8s_namespace)
if self.strategy not in ['create']:
logging.info(
'GcpResourceManager: skipping tear down for strategy [%s]',
@@ -250,13 +314,14 @@ class GcpResourceManager(metaclass=_MetaSingletonAndAbslFlags):
logging.info('GcpResourceManager: start tear down')
if hasattr(self, 'td'):
self.td.cleanup(force=True)
- if hasattr(self, 'test_client_runner'):
- self.test_client_runner.cleanup(force=True)
if hasattr(self, 'test_server_runner'):
self.test_server_runner.cleanup(force=True)
if hasattr(self, 'test_server_alternative_runner'):
self.test_server_alternative_runner.cleanup(force=True,
force_namespace=True)
+ if hasattr(self, 'test_server_affinity_runner'):
+ self.test_server_affinity_runner.cleanup(force=True,
+ force_namespace=True)
@functools.lru_cache(None)
def default_backend_service(self) -> str:
@@ -269,3 +334,9 @@ class GcpResourceManager(metaclass=_MetaSingletonAndAbslFlags):
"""Returns alternative backend service URL."""
self.td.load_alternative_backend_service()
return self.td.alternative_backend_service.url
+
+ @functools.lru_cache(None)
+ def affinity_backend_service(self) -> str:
+ """Returns affinity backend service URL."""
+ self.td.load_affinity_backend_service()
+ return self.td.affinity_backend_service.url
diff --git a/tools/run_tests/xds_k8s_test_driver/framework/xds_url_map_testcase.py b/tools/run_tests/xds_k8s_test_driver/framework/xds_url_map_testcase.py
index dac0fd6eff..a3212e4217 100644
--- a/tools/run_tests/xds_k8s_test_driver/framework/xds_url_map_testcase.py
+++ b/tools/run_tests/xds_k8s_test_driver/framework/xds_url_map_testcase.py
@@ -18,10 +18,10 @@ from dataclasses import dataclass
import datetime
import json
import os
-import unittest
import sys
import time
from typing import Any, Iterable, Mapping, Optional, Tuple, Union
+import unittest
from absl import flags
from absl import logging
@@ -134,6 +134,7 @@ class RpcDistributionStats:
def __init__(self, json_lb_stats: JsonType):
self.num_failures = json_lb_stats.get('numFailures', 0)
+ self.num_peers = 0
self.num_oks = 0
self.default_service_rpc_count = 0
self.alternative_service_rpc_count = 0
@@ -141,7 +142,10 @@ class RpcDistributionStats:
self.empty_call_default_service_rpc_count = 0
self.unary_call_alternative_service_rpc_count = 0
self.empty_call_alternative_service_rpc_count = 0
+ self.raw = json_lb_stats
+ if 'rpcsByPeer' in json_lb_stats:
+ self.num_peers = len(json_lb_stats['rpcsByPeer'])
if 'rpcsByMethod' in json_lb_stats:
for rpc_type in json_lb_stats['rpcsByMethod']:
for peer in json_lb_stats['rpcsByMethod'][rpc_type][
@@ -218,6 +222,28 @@ class XdsUrlMapTestCase(absltest.TestCase, metaclass=_MetaXdsUrlMapTestCase):
"""
@staticmethod
+ def client_init_config(rpc: str, metadata: str) -> Tuple[str, str]:
+ """Updates the initial RPC configs for this test case.
+
+ Each test case will start a test client. The client takes RPC configs
+ and starts to send RPCs immediately. The config returned by this
+ function will be used to replace the default configs.
+
+ The default configs are passed in as arguments, so this method can
+ modify part of them.
+
+ Args:
+ rpc: The default rpc config, specifying RPCs to send, format
+ 'UnaryCall,EmptyCall'
+ metadata: The metadata config, specifying metadata to send with each
+ RPC, format 'EmptyCall:key1:value1,UnaryCall:key2:value2'.
+
+ Returns:
+ A tuple contains the updated rpc and metadata config.
+ """
+ return rpc, metadata
+
+ @staticmethod
@abc.abstractmethod
def url_map_change(
host_rule: HostRule,
@@ -278,10 +304,13 @@ class XdsUrlMapTestCase(absltest.TestCase, metaclass=_MetaXdsUrlMapTestCase):
cls.started_test_cases.add(cls.__name__)
# TODO(lidiz) concurrency is possible, pending multiple-instance change
GcpResourceManager().test_client_runner.cleanup(force=True)
- # Sending both RPCs when starting.
+ # Start the client, and allow the test to override the initial RPC config.
+ rpc, metadata = cls.client_init_config(rpc="UnaryCall,EmptyCall",
+ metadata="")
cls.test_client = GcpResourceManager().test_client_runner.run(
server_target=f'xds:///{cls.hostname()}',
- rpc='UnaryCall,EmptyCall',
+ rpc=rpc,
+ metadata=metadata,
qps=QPS.value,
print_response=True)
diff --git a/tools/run_tests/xds_k8s_test_driver/kubernetes-manifests/client.deployment.yaml b/tools/run_tests/xds_k8s_test_driver/kubernetes-manifests/client.deployment.yaml
index 9449e51362..109086c451 100644
--- a/tools/run_tests/xds_k8s_test_driver/kubernetes-manifests/client.deployment.yaml
+++ b/tools/run_tests/xds_k8s_test_driver/kubernetes-manifests/client.deployment.yaml
@@ -28,12 +28,17 @@ spec:
- "--stats_port=${stats_port}"
- "--qps=${qps}"
- "--rpc=${rpc}"
+ - "--metadata=${metadata}"
- "--print_response=${print_response}"
ports:
- containerPort: ${stats_port}
env:
- name: GRPC_XDS_BOOTSTRAP
value: "/tmp/grpc-xds/td-grpc-bootstrap.json"
+ - name: GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH
+ value: "true"
+ - name: GRPC_XDS_EXPERIMENTAL_ENABLE_RETRY
+ value: "true"
volumeMounts:
- mountPath: /tmp/grpc-xds/
name: grpc-td-conf
diff --git a/tools/run_tests/xds_k8s_test_driver/requirements.txt b/tools/run_tests/xds_k8s_test_driver/requirements.txt
index 8f573ca22a..64a24a19a0 100644
--- a/tools/run_tests/xds_k8s_test_driver/requirements.txt
+++ b/tools/run_tests/xds_k8s_test_driver/requirements.txt
@@ -5,6 +5,7 @@ dataclasses~=0.8; python_version < '3.7'
google-api-python-client~=1.12
google-cloud-secret-manager~=2.1
grpcio~=1.34
+grpcio-health-checking~=1.34
grpcio-tools~=1.34
grpcio-channelz~=1.34
kubernetes~=12.0
@@ -12,5 +13,6 @@ kubernetes~=12.0
# Context: https://github.com/grpc/grpc/pull/24983#discussion_r543017022
retrying~=1.3
tenacity~=6.2
+Pygments~=2.9
protobuf~=3.14
xds-protos~=0.0.8
diff --git a/tools/run_tests/xds_k8s_test_driver/run.sh b/tools/run_tests/xds_k8s_test_driver/run.sh
index f549a481d5..a4dde33778 100755
--- a/tools/run_tests/xds_k8s_test_driver/run.sh
+++ b/tools/run_tests/xds_k8s_test_driver/run.sh
@@ -42,7 +42,7 @@ This tool performs the following:
EXAMPLES:
$0 bin/run_td_setup.py --help # list script-specific options
$0 bin/run_td_setup.py --helpfull # list all available options
-XDS_K8S_CONFIG=./path-to-flagfile.cfg $0 bin/run_td_setup.py --namespace=override-namespace
+XDS_K8S_CONFIG=./path-to-flagfile.cfg ./run.sh bin/run_td_setup.py --resource_suffix=override-suffix
$0 tests/baseline_test.py
$0 tests/security_test.py --verbosity=1 --logger_levels=__main__:DEBUG,framework:DEBUG
$0 tests/security_test.py SecurityTest.test_mtls --nocheck_local_certs
diff --git a/tools/run_tests/xds_k8s_test_driver/tests/app_net_test.py b/tools/run_tests/xds_k8s_test_driver/tests/app_net_test.py
new file mode 100644
index 0000000000..68a05c809f
--- /dev/null
+++ b/tools/run_tests/xds_k8s_test_driver/tests/app_net_test.py
@@ -0,0 +1,61 @@
+# Copyright 2021 gRPC authors.
+#
+# 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.
+import logging
+
+from absl import flags
+from absl.testing import absltest
+
+from framework import xds_k8s_testcase
+
+logger = logging.getLogger(__name__)
+flags.adopt_module_key_flags(xds_k8s_testcase)
+
+_XdsTestServer = xds_k8s_testcase.XdsTestServer
+_XdsTestClient = xds_k8s_testcase.XdsTestClient
+
+
+class AppNetTest(xds_k8s_testcase.AppNetXdsKubernetesTestCase):
+
+ def test_ping_pong(self):
+ with self.subTest('0_create_health_check'):
+ self.td.create_health_check()
+
+ with self.subTest('1_create_backend_service'):
+ self.td.create_backend_service()
+
+ with self.subTest('2_create_grpc_route'):
+ self.td.create_grpc_route(self.server_xds_host,
+ self.server_xds_port)
+
+ with self.subTest('3_create_router'):
+ self.td.create_router()
+
+ with self.subTest('4_start_test_server'):
+ test_server: _XdsTestServer = self.startTestServer()
+
+ with self.subTest('5_setup_server_backends'):
+ self.setupServerBackends()
+
+ with self.subTest('6_start_test_client'):
+ test_client: _XdsTestClient = self.startTestClient(test_server)
+
+ with self.subTest('7_assert_xds_config_exists'):
+ self.assertXdsConfigExists(test_client)
+
+ with self.subTest('8_assert_successful_rpcs'):
+ self.assertSuccessfulRpcs(test_client)
+
+
+if __name__ == '__main__':
+ absltest.main(failfast=True)
diff --git a/tools/run_tests/xds_k8s_test_driver/tests/baseline_test.py b/tools/run_tests/xds_k8s_test_driver/tests/baseline_test.py
index 3a723121f7..8ea018a2c7 100644
--- a/tools/run_tests/xds_k8s_test_driver/tests/baseline_test.py
+++ b/tools/run_tests/xds_k8s_test_driver/tests/baseline_test.py
@@ -45,13 +45,13 @@ class BaselineTest(xds_k8s_testcase.RegularXdsKubernetesTestCase):
self.td.create_forwarding_rule(self.server_xds_port)
with self.subTest('5_start_test_server'):
- test_server: _XdsTestServer = self.startTestServer()
+ test_servers: _XdsTestServer = self.startTestServers()
with self.subTest('6_add_server_backends_to_backend_service'):
self.setupServerBackends()
with self.subTest('7_start_test_client'):
- test_client: _XdsTestClient = self.startTestClient(test_server)
+ test_client: _XdsTestClient = self.startTestClient(test_servers[0])
with self.subTest('8_test_client_xds_config_exists'):
self.assertXdsConfigExists(test_client)
diff --git a/tools/run_tests/xds_k8s_test_driver/tests/change_backend_service_test.py b/tools/run_tests/xds_k8s_test_driver/tests/change_backend_service_test.py
new file mode 100644
index 0000000000..419a134e99
--- /dev/null
+++ b/tools/run_tests/xds_k8s_test_driver/tests/change_backend_service_test.py
@@ -0,0 +1,106 @@
+# Copyright 2021 gRPC authors.
+#
+# 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.
+import logging
+from typing import List, Optional
+
+from absl import flags
+from absl.testing import absltest
+
+from framework import xds_k8s_testcase
+from framework.infrastructure import k8s
+from framework.test_app import server_app
+
+logger = logging.getLogger(__name__)
+flags.adopt_module_key_flags(xds_k8s_testcase)
+
+# Type aliases
+_XdsTestServer = xds_k8s_testcase.XdsTestServer
+_XdsTestClient = xds_k8s_testcase.XdsTestClient
+
+
+class ChangeBackendServiceTest(xds_k8s_testcase.RegularXdsKubernetesTestCase):
+
+ def setUp(self):
+ super().setUp()
+ self.alternate_k8s_namespace = k8s.KubernetesNamespace(
+ self.k8s_api_manager, self.server_namespace)
+ self.alternate_server_runner = server_app.KubernetesServerRunner(
+ self.alternate_k8s_namespace,
+ deployment_name=self.server_name + '-alt',
+ image_name=self.server_image,
+ gcp_service_account=self.gcp_service_account,
+ td_bootstrap_image=self.td_bootstrap_image,
+ gcp_project=self.project,
+ gcp_api_manager=self.gcp_api_manager,
+ xds_server_uri=self.xds_server_uri,
+ network=self.network,
+ debug_use_port_forwarding=self.debug_use_port_forwarding,
+ reuse_namespace=True)
+
+ def tearDown(self):
+ if hasattr(self, 'alternate_server_runner'):
+ self.alternate_server_runner.cleanup()
+ super().tearDown()
+
+ def test_change_backend_service(self) -> None:
+ with self.subTest('00_create_health_check'):
+ self.td.create_health_check()
+
+ with self.subTest('01_create_backend_services'):
+ self.td.create_backend_service()
+ self.td.create_alternative_backend_service()
+
+ with self.subTest('02_create_url_map'):
+ self.td.create_url_map(self.server_xds_host, self.server_xds_port)
+
+ with self.subTest('03_create_target_proxy'):
+ self.td.create_target_proxy()
+
+ with self.subTest('04_create_forwarding_rule'):
+ self.td.create_forwarding_rule(self.server_xds_port)
+
+ with self.subTest('05_start_test_servers'):
+ self.default_test_servers: List[
+ _XdsTestServer] = self.startTestServers()
+ self.same_zone_test_servers: List[
+ _XdsTestServer] = self.startTestServers(
+ server_runner=self.alternate_server_runner)
+
+ with self.subTest('06_add_server_backends_to_backend_services'):
+ self.setupServerBackends()
+ # Add backend to alternative backend service
+ neg_name_alt, neg_zones_alt = self.alternate_k8s_namespace.get_service_neg(
+ self.alternate_server_runner.service_name, self.server_port)
+ self.td.alternative_backend_service_add_neg_backends(
+ neg_name_alt, neg_zones_alt)
+
+ with self.subTest('07_start_test_client'):
+ self.test_client: _XdsTestClient = self.startTestClient(
+ self.default_test_servers[0])
+
+ with self.subTest('08_test_client_xds_config_exists'):
+ self.assertXdsConfigExists(self.test_client)
+
+ with self.subTest('09_test_server_received_rpcs_from_test_client'):
+ self.assertSuccessfulRpcs(self.test_client)
+
+ with self.subTest('10_change_backend_service'):
+ self.td.patch_url_map(self.server_xds_host, self.server_xds_port,
+ self.td.alternative_backend_service)
+ self.assertRpcsEventuallyGoToGivenServers(
+ self.test_client, self.same_zone_test_servers)
+
+
+if __name__ == '__main__':
+ absltest.main(failfast=True)
diff --git a/tools/run_tests/xds_k8s_test_driver/tests/failover_test.py b/tools/run_tests/xds_k8s_test_driver/tests/failover_test.py
new file mode 100644
index 0000000000..5c42948858
--- /dev/null
+++ b/tools/run_tests/xds_k8s_test_driver/tests/failover_test.py
@@ -0,0 +1,127 @@
+# Copyright 2021 gRPC authors.
+#
+# 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.
+import logging
+from typing import List
+
+from absl import flags
+from absl.testing import absltest
+
+from framework import xds_k8s_testcase
+from framework.infrastructure import k8s
+from framework.test_app import server_app
+
+logger = logging.getLogger(__name__)
+flags.adopt_module_key_flags(xds_k8s_testcase)
+
+# Type aliases
+_XdsTestServer = xds_k8s_testcase.XdsTestServer
+_XdsTestClient = xds_k8s_testcase.XdsTestClient
+
+
+class FailoverTest(xds_k8s_testcase.RegularXdsKubernetesTestCase):
+ REPLICA_COUNT = 3
+ MAX_RATE_PER_ENDPOINT = 100
+
+ def setUp(self):
+ super().setUp()
+ self.secondary_server_runner = server_app.KubernetesServerRunner(
+ k8s.KubernetesNamespace(self.secondary_k8s_api_manager,
+ self.server_namespace),
+ deployment_name=self.server_name + '-alt',
+ image_name=self.server_image,
+ gcp_service_account=self.gcp_service_account,
+ td_bootstrap_image=self.td_bootstrap_image,
+ gcp_project=self.project,
+ gcp_api_manager=self.gcp_api_manager,
+ xds_server_uri=self.xds_server_uri,
+ network=self.network,
+ debug_use_port_forwarding=self.debug_use_port_forwarding,
+ reuse_namespace=True)
+
+ def tearDown(self):
+ if hasattr(self, 'secondary_server_runner'):
+ self.secondary_server_runner.cleanup()
+ super().tearDown()
+
+ def test_failover(self) -> None:
+ with self.subTest('00_create_health_check'):
+ self.td.create_health_check()
+
+ with self.subTest('01_create_backend_services'):
+ self.td.create_backend_service()
+
+ with self.subTest('02_create_url_map'):
+ self.td.create_url_map(self.server_xds_host, self.server_xds_port)
+
+ with self.subTest('03_create_target_proxy'):
+ self.td.create_target_proxy()
+
+ with self.subTest('04_create_forwarding_rule'):
+ self.td.create_forwarding_rule(self.server_xds_port)
+
+ with self.subTest('05_start_test_servers'):
+ self.default_test_servers: List[
+ _XdsTestServer] = self.startTestServers(
+ replica_count=self.REPLICA_COUNT)
+
+ self.alternate_test_servers: List[
+ _XdsTestServer] = self.startTestServers(
+ server_runner=self.secondary_server_runner)
+
+ with self.subTest('06_add_server_backends_to_backend_services'):
+ self.setupServerBackends(
+ max_rate_per_endpoint=self.MAX_RATE_PER_ENDPOINT)
+ self.setupServerBackends(
+ server_runner=self.secondary_server_runner,
+ max_rate_per_endpoint=self.MAX_RATE_PER_ENDPOINT)
+
+ with self.subTest('07_start_test_client'):
+ self.test_client: _XdsTestClient = self.startTestClient(
+ self.default_test_servers[0])
+
+ with self.subTest('08_test_client_xds_config_exists'):
+ self.assertXdsConfigExists(self.test_client)
+
+ with self.subTest('09_primary_locality_receives_requests'):
+ self.assertRpcsEventuallyGoToGivenServers(self.test_client,
+ self.default_test_servers)
+
+ with self.subTest(
+ '10_secondary_locality_receives_no_requests_on_partial_primary_failure'
+ ):
+ self.default_test_servers[0].set_not_serving()
+ self.assertRpcsEventuallyGoToGivenServers(
+ self.test_client, self.default_test_servers[1:])
+
+ with self.subTest('11_gentle_failover'):
+ self.default_test_servers[1].set_not_serving()
+ self.assertRpcsEventuallyGoToGivenServers(
+ self.test_client,
+ self.default_test_servers[2:] + self.alternate_test_servers)
+
+ with self.subTest(
+ '12_secondary_locality_receives_requests_on_primary_failure'):
+ self.default_test_servers[2].set_not_serving()
+ self.assertRpcsEventuallyGoToGivenServers(
+ self.test_client, self.alternate_test_servers)
+
+ with self.subTest('13_traffic_resumes_to_healthy_backends'):
+ for i in range(self.REPLICA_COUNT):
+ self.default_test_servers[i].set_serving()
+ self.assertRpcsEventuallyGoToGivenServers(self.test_client,
+ self.default_test_servers)
+
+
+if __name__ == '__main__':
+ absltest.main(failfast=True)
diff --git a/tools/run_tests/xds_k8s_test_driver/tests/remove_neg_test.py b/tools/run_tests/xds_k8s_test_driver/tests/remove_neg_test.py
new file mode 100644
index 0000000000..b7201026cf
--- /dev/null
+++ b/tools/run_tests/xds_k8s_test_driver/tests/remove_neg_test.py
@@ -0,0 +1,103 @@
+# Copyright 2021 gRPC authors.
+#
+# 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.
+import logging
+from typing import List, Optional
+
+from absl import flags
+from absl.testing import absltest
+
+from framework import xds_k8s_testcase
+from framework.infrastructure import k8s
+from framework.test_app import server_app
+
+logger = logging.getLogger(__name__)
+flags.adopt_module_key_flags(xds_k8s_testcase)
+
+# Type aliases
+_XdsTestServer = xds_k8s_testcase.XdsTestServer
+_XdsTestClient = xds_k8s_testcase.XdsTestClient
+
+
+class RemoveNegTest(xds_k8s_testcase.RegularXdsKubernetesTestCase):
+
+ def setUp(self):
+ super().setUp()
+ self.alternate_server_runner = server_app.KubernetesServerRunner(
+ k8s.KubernetesNamespace(self.k8s_api_manager,
+ self.server_namespace),
+ deployment_name=self.server_name + '-alt',
+ image_name=self.server_image,
+ gcp_service_account=self.gcp_service_account,
+ td_bootstrap_image=self.td_bootstrap_image,
+ gcp_project=self.project,
+ gcp_api_manager=self.gcp_api_manager,
+ xds_server_uri=self.xds_server_uri,
+ network=self.network,
+ debug_use_port_forwarding=self.debug_use_port_forwarding,
+ reuse_namespace=True)
+
+ def tearDown(self):
+ if hasattr(self, 'alternate_server_runner'):
+ self.alternate_server_runner.cleanup()
+ super().tearDown()
+
+ def test_remove_neg(self) -> None:
+ with self.subTest('00_create_health_check'):
+ self.td.create_health_check()
+
+ with self.subTest('01_create_backend_services'):
+ self.td.create_backend_service()
+
+ with self.subTest('02_create_url_map'):
+ self.td.create_url_map(self.server_xds_host, self.server_xds_port)
+
+ with self.subTest('03_create_target_proxy'):
+ self.td.create_target_proxy()
+
+ with self.subTest('04_create_forwarding_rule'):
+ self.td.create_forwarding_rule(self.server_xds_port)
+
+ with self.subTest('05_start_test_servers'):
+ self.default_test_servers: List[
+ _XdsTestServer] = self.startTestServers()
+ self.same_zone_test_servers: List[
+ _XdsTestServer] = self.startTestServers(
+ server_runner=self.alternate_server_runner)
+
+ with self.subTest('06_add_server_backends_to_backend_services'):
+ self.setupServerBackends()
+ self.setupServerBackends(server_runner=self.alternate_server_runner)
+
+ with self.subTest('07_start_test_client'):
+ self.test_client: _XdsTestClient = self.startTestClient(
+ self.default_test_servers[0])
+
+ with self.subTest('08_test_client_xds_config_exists'):
+ self.assertXdsConfigExists(self.test_client)
+
+ with self.subTest('09_test_server_received_rpcs_from_test_client'):
+ self.assertSuccessfulRpcs(self.test_client)
+
+ with self.subTest('10_remove_neg'):
+ self.assertRpcsEventuallyGoToGivenServers(
+ self.test_client,
+ self.default_test_servers + self.same_zone_test_servers)
+ self.removeServerBackends(
+ server_runner=self.alternate_server_runner)
+ self.assertRpcsEventuallyGoToGivenServers(self.test_client,
+ self.default_test_servers)
+
+
+if __name__ == '__main__':
+ absltest.main(failfast=True)
diff --git a/tools/run_tests/xds_k8s_test_driver/tests/round_robin_test.py b/tools/run_tests/xds_k8s_test_driver/tests/round_robin_test.py
new file mode 100644
index 0000000000..0daa095d06
--- /dev/null
+++ b/tools/run_tests/xds_k8s_test_driver/tests/round_robin_test.py
@@ -0,0 +1,88 @@
+# Copyright 2021 gRPC authors.
+#
+# 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.
+import logging
+from typing import List, Optional
+
+from absl import flags
+from absl.testing import absltest
+
+from framework import xds_k8s_testcase
+from framework.infrastructure import k8s
+from framework.test_app import server_app
+
+logger = logging.getLogger(__name__)
+flags.adopt_module_key_flags(xds_k8s_testcase)
+
+# Type aliases
+_XdsTestServer = xds_k8s_testcase.XdsTestServer
+_XdsTestClient = xds_k8s_testcase.XdsTestClient
+
+
+class RoundRobinTest(xds_k8s_testcase.RegularXdsKubernetesTestCase):
+
+ def test_round_robin(self) -> None:
+ REPLICA_COUNT = 2
+
+ with self.subTest('00_create_health_check'):
+ self.td.create_health_check()
+
+ with self.subTest('01_create_backend_services'):
+ self.td.create_backend_service()
+
+ with self.subTest('02_create_url_map'):
+ self.td.create_url_map(self.server_xds_host, self.server_xds_port)
+
+ with self.subTest('03_create_target_proxy'):
+ self.td.create_target_proxy()
+
+ with self.subTest('04_create_forwarding_rule'):
+ self.td.create_forwarding_rule(self.server_xds_port)
+
+ with self.subTest('05_start_test_servers'):
+ self.test_servers: List[_XdsTestServer] = self.startTestServers(
+ replica_count=REPLICA_COUNT)
+
+ with self.subTest('06_add_server_backends_to_backend_services'):
+ self.setupServerBackends()
+
+ with self.subTest('07_start_test_client'):
+ self.test_client: _XdsTestClient = self.startTestClient(
+ self.test_servers[0])
+
+ with self.subTest('08_test_client_xds_config_exists'):
+ self.assertXdsConfigExists(self.test_client)
+
+ with self.subTest('09_test_server_received_rpcs_from_test_client'):
+ self.assertSuccessfulRpcs(self.test_client)
+
+ with self.subTest('10_round_robin'):
+ num_rpcs = 100
+ expected_rpcs_per_replica = num_rpcs / REPLICA_COUNT
+
+ rpcs_by_peer = self.getClientRpcStats(self.test_client,
+ num_rpcs).rpcs_by_peer
+ total_requests_received = sum(rpcs_by_peer[x] for x in rpcs_by_peer)
+ self.assertEqual(total_requests_received, num_rpcs,
+ 'Wrong number of RPCS')
+ for server in self.test_servers:
+ pod_name = server.pod_name
+ self.assertIn(pod_name, rpcs_by_peer,
+ f'pod {pod_name} did not receive RPCs')
+ self.assertLessEqual(
+ abs(rpcs_by_peer[pod_name] - expected_rpcs_per_replica), 1,
+ f'Wrong number of RPCs for {pod_name}')
+
+
+if __name__ == '__main__':
+ absltest.main(failfast=True)
diff --git a/tools/run_tests/xds_k8s_test_driver/tests/security_test.py b/tools/run_tests/xds_k8s_test_driver/tests/security_test.py
index 2c19d337bd..a4c71498e7 100644
--- a/tools/run_tests/xds_k8s_test_driver/tests/security_test.py
+++ b/tools/run_tests/xds_k8s_test_driver/tests/security_test.py
@@ -12,12 +12,12 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import logging
-import uuid
from absl import flags
from absl.testing import absltest
from framework import xds_k8s_testcase
+from framework.helpers import rand
logger = logging.getLogger(__name__)
flags.adopt_module_key_flags(xds_k8s_testcase)
@@ -161,7 +161,7 @@ class SecurityTest(xds_k8s_testcase.SecurityXdsKubernetesTestCase):
server_port=self.server_port,
tls=True,
mtls=False)
- incorrect_namespace = f'incorrect-namespace-{uuid.uuid4().hex}'
+ incorrect_namespace = f'incorrect-namespace-{rand.rand_string()}'
self.td.setup_client_security(server_namespace=incorrect_namespace,
server_name=self.server_name,
tls=True,
diff --git a/tools/run_tests/xds_k8s_test_driver/tests/url_map/affinity_test.py b/tools/run_tests/xds_k8s_test_driver/tests/url_map/affinity_test.py
new file mode 100644
index 0000000000..d8caf0c608
--- /dev/null
+++ b/tools/run_tests/xds_k8s_test_driver/tests/url_map/affinity_test.py
@@ -0,0 +1,217 @@
+# Copyright 2021 The gRPC Authors
+#
+# 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.
+import logging
+import time
+from typing import Tuple
+
+from absl import flags
+from absl.testing import absltest
+
+from framework import xds_k8s_flags
+from framework import xds_url_map_testcase
+from framework.infrastructure import traffic_director
+from framework.rpc import grpc_channelz
+from framework.test_app import client_app
+
+# Type aliases
+HostRule = xds_url_map_testcase.HostRule
+PathMatcher = xds_url_map_testcase.PathMatcher
+GcpResourceManager = xds_url_map_testcase.GcpResourceManager
+DumpedXdsConfig = xds_url_map_testcase.DumpedXdsConfig
+RpcTypeUnaryCall = xds_url_map_testcase.RpcTypeUnaryCall
+RpcTypeEmptyCall = xds_url_map_testcase.RpcTypeEmptyCall
+XdsTestClient = client_app.XdsTestClient
+
+logger = logging.getLogger(__name__)
+flags.adopt_module_key_flags(xds_url_map_testcase)
+
+_NUM_RPCS = 150
+_TEST_METADATA_KEY = traffic_director.TEST_AFFINITY_METADATA_KEY
+_TEST_METADATA_VALUE_UNARY = 'unary_yranu'
+_TEST_METADATA_VALUE_EMPTY = 'empty_ytpme'
+_TEST_METADATA_NUMERIC_KEY = 'xds_md_numeric'
+_TEST_METADATA_NUMERIC_VALUE = '159'
+
+_TEST_METADATA = (
+ (RpcTypeUnaryCall, _TEST_METADATA_KEY, _TEST_METADATA_VALUE_UNARY),
+ (RpcTypeEmptyCall, _TEST_METADATA_KEY, _TEST_METADATA_VALUE_EMPTY),
+ (RpcTypeUnaryCall, _TEST_METADATA_NUMERIC_KEY,
+ _TEST_METADATA_NUMERIC_VALUE),
+)
+
+_ChannelzChannelState = grpc_channelz.ChannelState
+
+
+@absltest.skipUnless('cpp-client' in xds_k8s_flags.CLIENT_IMAGE.value or \
+ 'java-client' in xds_k8s_flags.CLIENT_IMAGE.value,
+ 'Affinity is currently only implemented in C++ and Java.')
+class TestHeaderBasedAffinity(xds_url_map_testcase.XdsUrlMapTestCase):
+
+ @staticmethod
+ def client_init_config(rpc: str, metadata: str):
+ # Config the init RPCs to send with the same set of metadata. Without
+ # this, the init RPCs will not have headers, and will pick random
+ # backends (behavior of RING_HASH). This is necessary to only one
+ # sub-channel is picked and used from the beginning, thus the channel
+ # will only create this one sub-channel.
+ return 'EmptyCall', 'EmptyCall:%s:%s' % (_TEST_METADATA_KEY,
+ _TEST_METADATA_VALUE_EMPTY)
+
+ @staticmethod
+ def url_map_change(
+ host_rule: HostRule,
+ path_matcher: PathMatcher) -> Tuple[HostRule, PathMatcher]:
+ # Update default service to the affinity service.
+ path_matcher["defaultService"] = GcpResourceManager(
+ ).affinity_backend_service()
+ return host_rule, path_matcher
+
+ def xds_config_validate(self, xds_config: DumpedXdsConfig):
+ # 3 endpoints in the affinity backend service.
+ self.assertNumEndpoints(xds_config, 3)
+ self.assertEqual(
+ xds_config.rds['virtualHosts'][0]['routes'][0]['route']
+ ['hashPolicy'][0]['header']['headerName'], _TEST_METADATA_KEY)
+ self.assertEqual(xds_config.cds[0]['lbPolicy'], 'RING_HASH')
+
+ def rpc_distribution_validate(self, test_client: XdsTestClient):
+ rpc_distribution = self.configure_and_send(test_client,
+ rpc_types=[RpcTypeEmptyCall],
+ metadata=_TEST_METADATA,
+ num_rpcs=_NUM_RPCS)
+ # Only one backend should receive traffic, even though there are 3
+ # backends.
+ self.assertEqual(1, rpc_distribution.num_peers)
+ self.assertLen(
+ test_client.find_subchannels_with_state(
+ _ChannelzChannelState.READY),
+ 1,
+ )
+ self.assertLen(
+ test_client.find_subchannels_with_state(_ChannelzChannelState.IDLE),
+ 2,
+ )
+ # Send 150 RPCs without headers. RPCs without headers will pick random
+ # backends. After this, we expect to see all backends to be connected.
+ rpc_distribution = self.configure_and_send(
+ test_client,
+ rpc_types=[RpcTypeEmptyCall, RpcTypeUnaryCall],
+ num_rpcs=_NUM_RPCS)
+ self.assertEqual(3, rpc_distribution.num_peers)
+ self.assertLen(
+ test_client.find_subchannels_with_state(
+ _ChannelzChannelState.READY),
+ 3,
+ )
+
+
+@absltest.skipUnless('cpp-client' in xds_k8s_flags.CLIENT_IMAGE.value or \
+ 'java-client' in xds_k8s_flags.CLIENT_IMAGE.value,
+ 'Affinity is currently only implemented in C++ and Java.')
+class TestHeaderBasedAffinityMultipleHeaders(
+ xds_url_map_testcase.XdsUrlMapTestCase):
+
+ @staticmethod
+ def client_init_config(rpc: str, metadata: str):
+ # Config the init RPCs to send with the same set of metadata. Without
+ # this, the init RPCs will not have headers, and will pick random
+ # backends (behavior of RING_HASH). This is necessary to only one
+ # sub-channel is picked and used from the beginning, thus the channel
+ # will only create this one sub-channel.
+ return 'EmptyCall', 'EmptyCall:%s:%s' % (_TEST_METADATA_KEY,
+ _TEST_METADATA_VALUE_EMPTY)
+
+ @staticmethod
+ def url_map_change(
+ host_rule: HostRule,
+ path_matcher: PathMatcher) -> Tuple[HostRule, PathMatcher]:
+ # Update default service to the affinity service.
+ path_matcher["defaultService"] = GcpResourceManager(
+ ).affinity_backend_service()
+ return host_rule, path_matcher
+
+ def xds_config_validate(self, xds_config: DumpedXdsConfig):
+ # 3 endpoints in the affinity backend service.
+ self.assertNumEndpoints(xds_config, 3)
+ self.assertEqual(
+ xds_config.rds['virtualHosts'][0]['routes'][0]['route']
+ ['hashPolicy'][0]['header']['headerName'], _TEST_METADATA_KEY)
+ self.assertEqual(xds_config.cds[0]['lbPolicy'], 'RING_HASH')
+
+ def rpc_distribution_validate(self, test_client: XdsTestClient):
+ rpc_distribution = self.configure_and_send(test_client,
+ rpc_types=[RpcTypeEmptyCall],
+ metadata=_TEST_METADATA,
+ num_rpcs=_NUM_RPCS)
+ # Only one backend should receive traffic, even though there are 3
+ # backends.
+ self.assertEqual(1, rpc_distribution.num_peers)
+ self.assertLen(
+ test_client.find_subchannels_with_state(
+ _ChannelzChannelState.READY),
+ 1,
+ )
+ self.assertLen(
+ test_client.find_subchannels_with_state(_ChannelzChannelState.IDLE),
+ 2,
+ )
+ empty_call_peer = list(rpc_distribution.raw['rpcsByMethod']['EmptyCall']
+ ['rpcsByPeer'].keys())[0]
+ # Send RPCs with a different metadata value, try different values to
+ # verify that the client will pick a different backend.
+ #
+ # EmptyCalls will be sent with the same metadata as before, and
+ # UnaryCalls will be sent with headers from ["0".."29"]. We check the
+ # endpoint picked for UnaryCall, and stop as soon as one different from
+ # the EmptyCall peer is picked.
+ #
+ # Note that there's a small chance all the headers would still pick the
+ # same backend used by EmptyCall. But there will be over a thousand
+ # nodes on the ring (default min size is 1024), and the probability of
+ # picking the same backend should be fairly small.
+ different_peer_picked = False
+ for i in range(30):
+ new_metadata = (
+ (RpcTypeEmptyCall, _TEST_METADATA_KEY,
+ _TEST_METADATA_VALUE_EMPTY),
+ (RpcTypeUnaryCall, _TEST_METADATA_KEY, str(i)),
+ )
+ rpc_distribution = self.configure_and_send(
+ test_client,
+ rpc_types=[RpcTypeEmptyCall, RpcTypeUnaryCall],
+ metadata=new_metadata,
+ num_rpcs=_NUM_RPCS)
+ unary_call_peer = list(rpc_distribution.raw['rpcsByMethod']
+ ['UnaryCall']['rpcsByPeer'].keys())[0]
+ if unary_call_peer != empty_call_peer:
+ different_peer_picked = True
+ break
+ self.assertTrue(
+ different_peer_picked,
+ "the same endpoint was picked for all the headers, expect a different endpoint to be picked"
+ )
+ self.assertLen(
+ test_client.find_subchannels_with_state(
+ _ChannelzChannelState.READY),
+ 2,
+ )
+ self.assertLen(
+ test_client.find_subchannels_with_state(_ChannelzChannelState.IDLE),
+ 1,
+ )
+
+
+# TODO: add more test cases
+# 1. based on the basic test, turn down the backend in use, then verify that all
+# RPCs are sent to another backend
diff --git a/tools/run_tests/xds_k8s_test_driver/tests/url_map/fault_injection_test.py b/tools/run_tests/xds_k8s_test_driver/tests/url_map/fault_injection_test.py
index 325fd74f49..f866020f48 100644
--- a/tools/run_tests/xds_k8s_test_driver/tests/url_map/fault_injection_test.py
+++ b/tools/run_tests/xds_k8s_test_driver/tests/url_map/fault_injection_test.py
@@ -161,6 +161,14 @@ class TestNonMatchingFaultInjection(xds_url_map_testcase.XdsUrlMapTestCase):
"""EMPTY_CALL is not fault injected, so it should succeed."""
@staticmethod
+ def client_init_config(rpc: str, metadata: str):
+ # Python interop client will stuck if the traffic is slow (in this case,
+ # 20s injected). The purpose of this test is examining the un-injected
+ # traffic is not impacted, so it's fine to just send un-injected
+ # traffic.
+ return 'EmptyCall', metadata
+
+ @staticmethod
def url_map_change(
host_rule: HostRule,
path_matcher: PathMatcher) -> Tuple[HostRule, PathMatcher]:
@@ -195,9 +203,6 @@ class TestNonMatchingFaultInjection(xds_url_map_testcase.XdsUrlMapTestCase):
'typedPerFilterConfig', {}))
def rpc_distribution_validate(self, test_client: XdsTestClient):
- rpc_distribution = self.configure_and_send(test_client,
- rpc_types=[RpcTypeEmptyCall],
- num_rpcs=_NUM_RPCS)
self.assertRpcStatusCode(test_client,
expected=(ExpectedResult(
rpc_type=RpcTypeEmptyCall,
diff --git a/tools/run_tests/xds_k8s_test_driver/tests/url_map/retry_test.py b/tools/run_tests/xds_k8s_test_driver/tests/url_map/retry_test.py
new file mode 100644
index 0000000000..8f61b10e1f
--- /dev/null
+++ b/tools/run_tests/xds_k8s_test_driver/tests/url_map/retry_test.py
@@ -0,0 +1,143 @@
+# Copyright 2021 The gRPC Authors
+#
+# 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.
+import logging
+import time
+from typing import Tuple
+
+from absl import flags
+from absl.testing import absltest
+import grpc
+
+from framework import xds_k8s_flags
+from framework import xds_url_map_testcase
+from framework.test_app import client_app
+
+# Type aliases
+HostRule = xds_url_map_testcase.HostRule
+PathMatcher = xds_url_map_testcase.PathMatcher
+GcpResourceManager = xds_url_map_testcase.GcpResourceManager
+DumpedXdsConfig = xds_url_map_testcase.DumpedXdsConfig
+RpcTypeUnaryCall = xds_url_map_testcase.RpcTypeUnaryCall
+XdsTestClient = client_app.XdsTestClient
+ExpectedResult = xds_url_map_testcase.ExpectedResult
+
+logger = logging.getLogger(__name__)
+flags.adopt_module_key_flags(xds_url_map_testcase)
+
+# The first batch of RPCs don't count towards the result of test case. They are
+# meant to prove the communication between driver and client is fine.
+_NUM_RPCS = 10
+_LENGTH_OF_RPC_SENDING_SEC = 16
+# We are using sleep to synchronize test driver and the client... Even though
+# the client is sending at QPS rate, we can't assert that exactly QPS *
+# SLEEP_DURATION number of RPC is finished. The final completed RPC might be
+# slightly more or less.
+_NON_RANDOM_ERROR_TOLERANCE = 0.01
+_RPC_BEHAVIOR_HEADER_NAME = 'rpc-behavior'
+
+
+def _build_retry_route_rule(retryConditions, num_retries):
+ return {
+ 'priority': 0,
+ 'matchRules': [{
+ 'fullPathMatch': '/grpc.testing.TestService/UnaryCall'
+ }],
+ 'service': GcpResourceManager().default_backend_service(),
+ 'routeAction': {
+ 'retryPolicy': {
+ 'retryConditions': retryConditions,
+ 'numRetries': num_retries,
+ }
+ },
+ }
+
+
+@absltest.skipUnless('cpp-client' in xds_k8s_flags.CLIENT_IMAGE.value or \
+ 'java-client' in xds_k8s_flags.CLIENT_IMAGE.value,
+ 'Xds-retry is currently only implemented in C++ and Java.')
+class TestRetryUpTo3AttemptsAndFail(xds_url_map_testcase.XdsUrlMapTestCase):
+
+ @staticmethod
+ def url_map_change(
+ host_rule: HostRule,
+ path_matcher: PathMatcher) -> Tuple[HostRule, PathMatcher]:
+ path_matcher["routeRules"] = [
+ _build_retry_route_rule(retryConditions=["unavailable"],
+ num_retries=3)
+ ]
+ return host_rule, path_matcher
+
+ def xds_config_validate(self, xds_config: DumpedXdsConfig):
+ self.assertNumEndpoints(xds_config, 1)
+ retry_config = xds_config.rds['virtualHosts'][0]['routes'][0]['route'][
+ 'retryPolicy']
+ self.assertEqual(3, retry_config['numRetries'])
+ self.assertEqual('unavailable', retry_config['retryOn'])
+
+ def rpc_distribution_validate(self, test_client: XdsTestClient):
+ rpc_distribution = self.configure_and_send(
+ test_client,
+ rpc_types=[RpcTypeUnaryCall],
+ metadata=[(RpcTypeUnaryCall, _RPC_BEHAVIOR_HEADER_NAME,
+ 'error-code-14,succeed-on-retry-attempt-4')],
+ num_rpcs=_NUM_RPCS)
+ self.assertRpcStatusCode(test_client,
+ expected=(ExpectedResult(
+ rpc_type=RpcTypeUnaryCall,
+ status_code=grpc.StatusCode.UNAVAILABLE,
+ ratio=1),),
+ length=_LENGTH_OF_RPC_SENDING_SEC,
+ tolerance=_NON_RANDOM_ERROR_TOLERANCE)
+
+
+@absltest.skipUnless('cpp-client' in xds_k8s_flags.CLIENT_IMAGE.value or \
+ 'java-client' in xds_k8s_flags.CLIENT_IMAGE.value,
+ 'Xds-retry is currently only implemented in C++ Java.')
+class TestRetryUpTo4AttemptsAndSucceed(xds_url_map_testcase.XdsUrlMapTestCase):
+
+ @staticmethod
+ def url_map_change(
+ host_rule: HostRule,
+ path_matcher: PathMatcher) -> Tuple[HostRule, PathMatcher]:
+ path_matcher["routeRules"] = [
+ _build_retry_route_rule(retryConditions=["unavailable"],
+ num_retries=4)
+ ]
+ return host_rule, path_matcher
+
+ def xds_config_validate(self, xds_config: DumpedXdsConfig):
+ self.assertNumEndpoints(xds_config, 1)
+ retry_config = xds_config.rds['virtualHosts'][0]['routes'][0]['route'][
+ 'retryPolicy']
+ self.assertEqual(4, retry_config['numRetries'])
+ self.assertEqual('unavailable', retry_config['retryOn'])
+
+ def rpc_distribution_validate(self, test_client: XdsTestClient):
+ rpc_distribution = self.configure_and_send(
+ test_client,
+ rpc_types=[RpcTypeUnaryCall],
+ metadata=[(RpcTypeUnaryCall, _RPC_BEHAVIOR_HEADER_NAME,
+ 'error-code-14,succeed-on-retry-attempt-4')],
+ num_rpcs=_NUM_RPCS)
+ self.assertRpcStatusCode(test_client,
+ expected=(ExpectedResult(
+ rpc_type=RpcTypeUnaryCall,
+ status_code=grpc.StatusCode.OK,
+ ratio=1),),
+ length=_LENGTH_OF_RPC_SENDING_SEC,
+ tolerance=_NON_RANDOM_ERROR_TOLERANCE)
+
+
+if __name__ == '__main__':
+ absltest.main()