From 082c006c04343a78d87b6c6ab3608c25d6213c3f Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Sat, 21 Nov 2020 14:43:54 +0100 Subject: [PATCH] merge(3p/absl): subtree merge of Abseil up to e19260f ... notably, this includes Abseil's own StatusOr type, which conflicted with our implementation (that was taken from TensorFlow). Change-Id: Ie7d6764b64055caaeb8dc7b6b9d066291e6b538f --- .../.github/ISSUE_TEMPLATE/00-bug_report.md | 41 + .../.github/ISSUE_TEMPLATE/90-question.md | 7 + .../.github/ISSUE_TEMPLATE/config.yml | 1 + third_party/abseil_cpp/CMake/AbseilDll.cmake | 8 +- .../abseil_cpp/CMake/AbseilHelpers.cmake | 53 +- .../abseil_cpp/CMake/AbseilInstallDirs.cmake | 4 +- .../CMake/Googletest/CMakeLists.txt.in | 30 +- .../CMake/install_test_project/test.sh | 18 + third_party/abseil_cpp/CMakeLists.txt | 39 +- third_party/abseil_cpp/WORKSPACE | 8 +- third_party/abseil_cpp/absl/BUILD.bazel | 23 +- .../abseil_cpp/absl/abseil.podspec.gen.py | 4 +- .../abseil_cpp/absl/algorithm/BUILD.bazel | 2 +- .../abseil_cpp/absl/algorithm/container.h | 80 +- .../absl/algorithm/container_test.cc | 133 +- third_party/abseil_cpp/absl/base/BUILD.bazel | 8 +- .../abseil_cpp/absl/base/CMakeLists.txt | 3 +- third_party/abseil_cpp/absl/base/attributes.h | 134 +- third_party/abseil_cpp/absl/base/call_once.h | 2 +- third_party/abseil_cpp/absl/base/casts.h | 15 +- third_party/abseil_cpp/absl/base/config.h | 72 +- .../absl/base/dynamic_annotations.cc | 72 - .../absl/base/dynamic_annotations.h | 122 +- .../abseil_cpp/absl/base/internal/bits.h | 9 +- .../absl/base/internal/dynamic_annotations.h | 21 +- .../base/internal/exponential_biased_test.cc | 2 +- .../abseil_cpp/absl/base/internal/invoke.h | 8 +- .../absl/base/internal/low_level_alloc.cc | 2 +- .../absl/base/internal/low_level_scheduling.h | 35 +- .../absl/base/internal/raw_logging.cc | 4 +- .../absl/base/internal/raw_logging.h | 14 +- .../abseil_cpp/absl/base/internal/spinlock.h | 7 + .../abseil_cpp/absl/base/internal/strerror.cc | 37 +- .../absl/base/internal/strerror_benchmark.cc | 9 - .../abseil_cpp/absl/base/internal/sysinfo.cc | 14 + .../abseil_cpp/absl/base/internal/sysinfo.h | 8 + .../absl/base/internal/thread_identity.cc | 7 +- .../absl/base/internal/thread_identity.h | 83 +- .../base/internal/thread_identity_test.cc | 2 +- .../absl/base/internal/throw_delegate.cc | 118 +- .../absl/base/internal/tsan_mutex_interface.h | 4 +- .../absl/base/internal/unaligned_access.h | 76 - .../absl/base/internal/unscaledcycleclock.cc | 4 +- .../absl/base/internal/unscaledcycleclock.h | 6 +- .../abseil_cpp/absl/base/invoke_test.cc | 128 +- .../abseil_cpp/absl/base/log_severity.h | 6 +- third_party/abseil_cpp/absl/base/macros.h | 90 +- .../abseil_cpp/absl/base/optimization.h | 4 +- .../abseil_cpp/absl/base/optimization_test.cc | 15 +- .../abseil_cpp/absl/base/policy_checks.h | 2 +- .../absl/base/spinlock_test_common.cc | 6 + .../abseil_cpp/absl/base/thread_annotations.h | 133 +- .../absl/compiler_config_setting.bzl | 38 - .../abseil_cpp/absl/container/BUILD.bazel | 7 +- .../abseil_cpp/absl/container/CMakeLists.txt | 5 + .../abseil_cpp/absl/container/btree_map.h | 12 +- .../abseil_cpp/absl/container/btree_set.h | 2 +- .../abseil_cpp/absl/container/btree_test.cc | 461 +++- .../abseil_cpp/absl/container/fixed_array.h | 33 +- .../fixed_array_exception_safety_test.cc | 3 +- .../absl/container/fixed_array_test.cc | 5 +- .../abseil_cpp/absl/container/flat_hash_map.h | 8 +- .../absl/container/flat_hash_map_test.cc | 15 + .../abseil_cpp/absl/container/flat_hash_set.h | 5 +- .../absl/container/inlined_vector.h | 2 +- .../absl/container/inlined_vector_test.cc | 36 +- .../absl/container/internal/btree.h | 649 +++-- .../absl/container/internal/btree_container.h | 293 +-- .../absl/container/internal/common.h | 7 +- .../container/internal/compressed_tuple.h | 2 +- .../container/internal/container_memory.h | 61 +- .../internal/hash_function_defaults_test.cc | 4 +- .../internal/hash_generator_testing.cc | 6 +- .../container/internal/hash_policy_traits.h | 31 +- .../container/internal/hashtablez_sampler.cc | 1 + .../container/internal/hashtablez_sampler.h | 39 +- .../internal/hashtablez_sampler_test.cc | 16 +- .../absl/container/internal/inlined_vector.h | 125 +- .../absl/container/internal/layout.h | 12 +- .../absl/container/internal/layout_test.cc | 604 ++--- .../absl/container/internal/raw_hash_set.cc | 15 +- .../absl/container/internal/raw_hash_set.h | 226 +- .../internal/raw_hash_set_allocator_test.cc | 75 + .../container/internal/raw_hash_set_test.cc | 38 +- .../abseil_cpp/absl/container/node_hash_map.h | 8 +- .../absl/container/node_hash_map_test.cc | 15 + .../abseil_cpp/absl/container/node_hash_set.h | 3 +- .../absl/copts/GENERATED_AbseilCopts.cmake | 115 +- .../abseil_cpp/absl/copts/GENERATED_copts.bzl | 115 +- .../abseil_cpp/absl/copts/configure_copts.bzl | 6 +- third_party/abseil_cpp/absl/copts/copts.py | 124 +- .../abseil_cpp/absl/debugging/BUILD.bazel | 11 +- .../abseil_cpp/absl/debugging/CMakeLists.txt | 2 + .../absl/debugging/failure_signal_handler.cc | 4 +- .../debugging/internal/address_is_readable.cc | 9 +- .../absl/debugging/internal/demangle.cc | 76 +- .../absl/debugging/internal/demangle_test.cc | 8 +- .../debugging/internal/stack_consumption.cc | 3 +- .../debugging/internal/stack_consumption.h | 5 +- .../internal/stacktrace_aarch64-inl.inc | 7 +- .../debugging/internal/stacktrace_config.h | 56 +- .../absl/debugging/internal/symbolize.h | 22 +- .../absl/debugging/internal/vdso_support.cc | 21 - .../abseil_cpp/absl/debugging/symbolize.cc | 11 +- .../absl/debugging/symbolize_darwin.inc | 4 +- .../absl/debugging/symbolize_elf.inc | 104 +- .../absl/debugging/symbolize_test.cc | 5 +- third_party/abseil_cpp/absl/flags/BUILD.bazel | 12 +- .../abseil_cpp/absl/flags/CMakeLists.txt | 8 +- .../abseil_cpp/absl/flags/commandlineflag.cc | 4 - .../abseil_cpp/absl/flags/commandlineflag.h | 4 + third_party/abseil_cpp/absl/flags/flag.h | 33 +- .../abseil_cpp/absl/flags/flag_benchmark.cc | 33 + .../abseil_cpp/absl/flags/flag_test.cc | 11 + .../abseil_cpp/absl/flags/flag_test_defs.cc | 4 +- .../absl/flags/internal/commandlineflag.cc | 26 + .../abseil_cpp/absl/flags/internal/flag.h | 41 +- .../abseil_cpp/absl/flags/internal/registry.h | 22 +- .../abseil_cpp/absl/flags/internal/usage.cc | 289 ++- .../abseil_cpp/absl/flags/internal/usage.h | 43 +- .../absl/flags/internal/usage_test.cc | 116 +- third_party/abseil_cpp/absl/flags/parse.cc | 17 +- .../abseil_cpp/absl/flags/parse_test.cc | 33 +- .../abseil_cpp/absl/flags/reflection.cc | 155 +- .../abseil_cpp/absl/flags/reflection.h | 9 +- .../abseil_cpp/absl/flags/reflection_test.cc | 207 ++ .../abseil_cpp/absl/functional/BUILD.bazel | 2 +- .../abseil_cpp/absl/functional/function_ref.h | 2 +- .../absl/functional/internal/front_binder.h | 16 +- .../absl/functional/internal/function_ref.h | 4 +- third_party/abseil_cpp/absl/hash/BUILD.bazel | 2 +- third_party/abseil_cpp/absl/hash/hash.h | 3 - third_party/abseil_cpp/absl/hash/hash_test.cc | 8 +- .../abseil_cpp/absl/hash/internal/city.cc | 27 +- .../abseil_cpp/absl/hash/internal/city.h | 20 +- .../abseil_cpp/absl/hash/internal/hash.h | 7 + .../abseil_cpp/absl/memory/BUILD.bazel | 2 +- third_party/abseil_cpp/absl/memory/memory.h | 4 + .../abseil_cpp/absl/memory/memory_test.cc | 38 +- third_party/abseil_cpp/absl/meta/BUILD.bazel | 2 +- .../abseil_cpp/absl/meta/type_traits.h | 28 +- .../abseil_cpp/absl/numeric/BUILD.bazel | 2 +- .../abseil_cpp/absl/random/BUILD.bazel | 1 + .../abseil_cpp/absl/random/CMakeLists.txt | 15 + .../abseil_cpp/absl/random/distributions.h | 10 +- .../absl/random/distributions_test.cc | 142 +- .../absl/random/internal/BUILD.bazel | 24 +- .../absl/random/internal/fast_uniform_bits.h | 226 +- .../random/internal/fast_uniform_bits_test.cc | 322 ++- .../gaussian_distribution_gentables.cc | 16 +- .../random/internal/generate_real_test.cc | 4 +- .../absl/random/internal/randen_detect.cc | 4 +- .../absl/random/internal/randen_hwaes.cc | 1 + .../absl/random/internal/uniform_helper.h | 38 +- .../random/internal/uniform_helper_test.cc | 279 +++ .../absl/random/uniform_int_distribution.h | 2 +- .../abseil_cpp/absl/status/BUILD.bazel | 39 +- .../abseil_cpp/absl/status/CMakeLists.txt | 41 +- .../absl/status/internal/status_internal.h | 58 + .../absl/status/internal/statusor_internal.h | 396 +++ third_party/abseil_cpp/absl/status/status.cc | 11 +- third_party/abseil_cpp/absl/status/status.h | 609 ++++- .../abseil_cpp/absl/status/statusor.cc | 81 +- third_party/abseil_cpp/absl/status/statusor.h | 858 +++++-- .../abseil_cpp/absl/status/statusor_test.cc | 2132 ++++++++++++----- .../abseil_cpp/absl/strings/BUILD.bazel | 18 +- .../abseil_cpp/absl/strings/CMakeLists.txt | 16 + third_party/abseil_cpp/absl/strings/cord.cc | 168 +- third_party/abseil_cpp/absl/strings/cord.h | 206 +- .../abseil_cpp/absl/strings/cord_test.cc | 96 + .../abseil_cpp/absl/strings/escaping.cc | 8 +- .../strings/internal/charconv_bigint_test.cc | 55 + .../absl/strings/internal/charconv_parse.cc | 12 +- .../absl/strings/internal/cord_internal.h | 186 +- .../absl/strings/internal/str_format/arg.cc | 14 + .../absl/strings/internal/str_format/arg.h | 48 +- .../strings/internal/str_format/arg_test.cc | 16 + .../absl/strings/internal/str_format/bind.cc | 16 +- .../absl/strings/internal/str_format/bind.h | 23 +- .../strings/internal/str_format/bind_test.cc | 14 + .../strings/internal/str_format/checker.h | 14 + .../internal/str_format/checker_test.cc | 14 + .../internal/str_format/convert_test.cc | 483 +++- .../strings/internal/str_format/extension.cc | 23 + .../strings/internal/str_format/extension.h | 6 +- .../internal/str_format/extension_test.cc | 15 + .../internal/str_format/float_conversion.cc | 303 ++- .../internal/str_format/float_conversion.h | 14 + .../strings/internal/str_format/parser.cc | 14 + .../absl/strings/internal/str_format/parser.h | 14 + .../internal/str_format/parser_test.cc | 14 + .../strings/internal/str_split_internal.h | 55 +- .../absl/strings/internal/string_constant.h | 70 + .../strings/internal/string_constant_test.cc | 60 + .../abseil_cpp/absl/strings/numbers.cc | 120 +- third_party/abseil_cpp/absl/strings/numbers.h | 7 + .../abseil_cpp/absl/strings/numbers_test.cc | 82 +- .../abseil_cpp/absl/strings/str_cat.cc | 8 +- .../absl/strings/str_cat_benchmark.cc | 47 + .../abseil_cpp/absl/strings/str_format.h | 270 +++ .../absl/strings/str_format_test.cc | 173 +- .../abseil_cpp/absl/strings/str_split.h | 42 +- .../abseil_cpp/absl/strings/str_split_test.cc | 4 +- .../abseil_cpp/absl/strings/string_view.h | 6 + .../absl/strings/string_view_test.cc | 6 +- .../absl/synchronization/BUILD.bazel | 13 +- .../absl/synchronization/CMakeLists.txt | 4 +- .../absl/synchronization/internal/futex.h | 154 ++ .../synchronization/internal/graphcycles.cc | 1 + .../synchronization/internal/kernel_timeout.h | 57 +- .../synchronization/internal/mutex_nonprod.cc | 324 --- .../internal/mutex_nonprod.inc | 249 -- .../synchronization/internal/per_thread_sem.h | 2 +- .../internal/per_thread_sem_test.cc | 1 + .../absl/synchronization/internal/waiter.cc | 66 +- .../absl/synchronization/internal/waiter.h | 10 +- .../abseil_cpp/absl/synchronization/mutex.cc | 112 +- .../abseil_cpp/absl/synchronization/mutex.h | 124 +- .../absl/synchronization/mutex_benchmark.cc | 3 +- .../absl/synchronization/mutex_test.cc | 47 +- third_party/abseil_cpp/absl/time/BUILD.bazel | 3 +- .../abseil_cpp/absl/time/CMakeLists.txt | 1 + third_party/abseil_cpp/absl/time/clock.cc | 4 +- third_party/abseil_cpp/absl/time/duration.cc | 25 +- .../absl/time/internal/cctz/BUILD.bazel | 7 +- .../cctz/include/cctz/civil_time_detail.h | 18 +- .../internal/cctz/src/time_zone_format.cc | 22 +- .../cctz/src/time_zone_format_test.cc | 5 + .../time/internal/cctz/src/time_zone_info.cc | 259 +- .../time/internal/cctz/src/time_zone_info.h | 9 +- .../time/internal/cctz/src/time_zone_libc.cc | 23 +- .../cctz/src/time_zone_lookup_test.cc | 14 +- .../absl/time/internal/cctz/testdata/version | 2 +- .../cctz/testdata/zoneinfo/Africa/Abidjan | Bin 148 -> 130 bytes .../cctz/testdata/zoneinfo/Africa/Accra | Bin 816 -> 556 bytes .../cctz/testdata/zoneinfo/Africa/Addis_Ababa | Bin 251 -> 182 bytes .../cctz/testdata/zoneinfo/Africa/Algiers | Bin 735 -> 470 bytes .../cctz/testdata/zoneinfo/Africa/Asmara | Bin 251 -> 182 bytes .../cctz/testdata/zoneinfo/Africa/Asmera | Bin 251 -> 182 bytes .../cctz/testdata/zoneinfo/Africa/Bamako | Bin 148 -> 130 bytes .../cctz/testdata/zoneinfo/Africa/Bangui | Bin 149 -> 131 bytes .../cctz/testdata/zoneinfo/Africa/Banjul | Bin 148 -> 130 bytes .../cctz/testdata/zoneinfo/Africa/Bissau | Bin 194 -> 149 bytes .../cctz/testdata/zoneinfo/Africa/Blantyre | Bin 149 -> 131 bytes .../cctz/testdata/zoneinfo/Africa/Brazzaville | Bin 149 -> 131 bytes .../cctz/testdata/zoneinfo/Africa/Bujumbura | Bin 149 -> 131 bytes .../cctz/testdata/zoneinfo/Africa/Cairo | Bin 1955 -> 1276 bytes .../cctz/testdata/zoneinfo/Africa/Casablanca | Bin 2429 -> 1919 bytes .../cctz/testdata/zoneinfo/Africa/Ceuta | Bin 2036 -> 562 bytes .../cctz/testdata/zoneinfo/Africa/Conakry | Bin 148 -> 130 bytes .../cctz/testdata/zoneinfo/Africa/Dakar | Bin 148 -> 130 bytes .../testdata/zoneinfo/Africa/Dar_es_Salaam | Bin 251 -> 182 bytes .../cctz/testdata/zoneinfo/Africa/Djibouti | Bin 251 -> 182 bytes .../cctz/testdata/zoneinfo/Africa/Douala | Bin 149 -> 131 bytes .../cctz/testdata/zoneinfo/Africa/El_Aaiun | Bin 2295 -> 1830 bytes .../cctz/testdata/zoneinfo/Africa/Freetown | Bin 148 -> 130 bytes .../cctz/testdata/zoneinfo/Africa/Gaborone | Bin 149 -> 131 bytes .../cctz/testdata/zoneinfo/Africa/Harare | Bin 149 -> 131 bytes .../testdata/zoneinfo/Africa/Johannesburg | Bin 246 -> 190 bytes .../cctz/testdata/zoneinfo/Africa/Juba | Bin 653 -> 449 bytes .../cctz/testdata/zoneinfo/Africa/Kampala | Bin 251 -> 182 bytes .../cctz/testdata/zoneinfo/Africa/Khartoum | Bin 679 -> 458 bytes .../cctz/testdata/zoneinfo/Africa/Kigali | Bin 149 -> 131 bytes .../cctz/testdata/zoneinfo/Africa/Kinshasa | Bin 149 -> 131 bytes .../cctz/testdata/zoneinfo/Africa/Lagos | Bin 149 -> 131 bytes .../cctz/testdata/zoneinfo/Africa/Libreville | Bin 149 -> 131 bytes .../cctz/testdata/zoneinfo/Africa/Lome | Bin 148 -> 130 bytes .../cctz/testdata/zoneinfo/Africa/Luanda | Bin 149 -> 131 bytes .../cctz/testdata/zoneinfo/Africa/Lubumbashi | Bin 149 -> 131 bytes .../cctz/testdata/zoneinfo/Africa/Lusaka | Bin 149 -> 131 bytes .../cctz/testdata/zoneinfo/Africa/Malabo | Bin 149 -> 131 bytes .../cctz/testdata/zoneinfo/Africa/Maputo | Bin 149 -> 131 bytes .../cctz/testdata/zoneinfo/Africa/Maseru | Bin 246 -> 190 bytes .../cctz/testdata/zoneinfo/Africa/Mbabane | Bin 246 -> 190 bytes .../cctz/testdata/zoneinfo/Africa/Mogadishu | Bin 251 -> 182 bytes .../cctz/testdata/zoneinfo/Africa/Monrovia | Bin 208 -> 164 bytes .../cctz/testdata/zoneinfo/Africa/Nairobi | Bin 251 -> 182 bytes .../cctz/testdata/zoneinfo/Africa/Ndjamena | Bin 199 -> 160 bytes .../cctz/testdata/zoneinfo/Africa/Niamey | Bin 149 -> 131 bytes .../cctz/testdata/zoneinfo/Africa/Nouakchott | Bin 148 -> 130 bytes .../cctz/testdata/zoneinfo/Africa/Ouagadougou | Bin 148 -> 130 bytes .../cctz/testdata/zoneinfo/Africa/Porto-Novo | Bin 149 -> 131 bytes .../cctz/testdata/zoneinfo/Africa/Sao_Tome | Bin 254 -> 173 bytes .../cctz/testdata/zoneinfo/Africa/Timbuktu | Bin 148 -> 130 bytes .../cctz/testdata/zoneinfo/Africa/Tripoli | Bin 625 -> 431 bytes .../cctz/testdata/zoneinfo/Africa/Tunis | Bin 689 -> 449 bytes .../cctz/testdata/zoneinfo/Africa/Windhoek | Bin 955 -> 638 bytes .../cctz/testdata/zoneinfo/America/Adak | Bin 2356 -> 969 bytes .../cctz/testdata/zoneinfo/America/Anchorage | Bin 2371 -> 977 bytes .../cctz/testdata/zoneinfo/America/Anguilla | Bin 148 -> 130 bytes .../cctz/testdata/zoneinfo/America/Antigua | Bin 148 -> 130 bytes .../cctz/testdata/zoneinfo/America/Araguaina | Bin 884 -> 592 bytes .../zoneinfo/America/Argentina/Buenos_Aires | Bin 1076 -> 708 bytes .../zoneinfo/America/Argentina/Catamarca | Bin 1076 -> 708 bytes .../zoneinfo/America/Argentina/ComodRivadavia | Bin 1076 -> 708 bytes .../zoneinfo/America/Argentina/Cordoba | Bin 1076 -> 708 bytes .../testdata/zoneinfo/America/Argentina/Jujuy | Bin 1048 -> 690 bytes .../zoneinfo/America/Argentina/La_Rioja | Bin 1090 -> 717 bytes .../zoneinfo/America/Argentina/Mendoza | Bin 1076 -> 708 bytes .../zoneinfo/America/Argentina/Rio_Gallegos | Bin 1076 -> 708 bytes .../testdata/zoneinfo/America/Argentina/Salta | Bin 1048 -> 690 bytes .../zoneinfo/America/Argentina/San_Juan | Bin 1090 -> 717 bytes .../zoneinfo/America/Argentina/San_Luis | Bin 1102 -> 717 bytes .../zoneinfo/America/Argentina/Tucuman | Bin 1104 -> 726 bytes .../zoneinfo/America/Argentina/Ushuaia | Bin 1076 -> 708 bytes .../cctz/testdata/zoneinfo/America/Aruba | Bin 186 -> 151 bytes .../cctz/testdata/zoneinfo/America/Asuncion | Bin 2044 -> 884 bytes .../cctz/testdata/zoneinfo/America/Atikokan | Bin 336 -> 224 bytes .../cctz/testdata/zoneinfo/America/Atka | Bin 2356 -> 969 bytes .../cctz/testdata/zoneinfo/America/Bahia | Bin 1024 -> 682 bytes .../testdata/zoneinfo/America/Bahia_Banderas | Bin 1546 -> 530 bytes .../cctz/testdata/zoneinfo/America/Barbados | Bin 314 -> 231 bytes .../cctz/testdata/zoneinfo/America/Belem | Bin 576 -> 394 bytes .../cctz/testdata/zoneinfo/America/Belize | Bin 948 -> 638 bytes .../testdata/zoneinfo/America/Blanc-Sablon | Bin 298 -> 205 bytes .../cctz/testdata/zoneinfo/America/Boa_Vista | Bin 632 -> 430 bytes .../cctz/testdata/zoneinfo/America/Bogota | Bin 246 -> 179 bytes .../cctz/testdata/zoneinfo/America/Boise | Bin 2394 -> 999 bytes .../testdata/zoneinfo/America/Buenos_Aires | Bin 1076 -> 708 bytes .../testdata/zoneinfo/America/Cambridge_Bay | Bin 2084 -> 768 bytes .../testdata/zoneinfo/America/Campo_Grande | Bin 1444 -> 952 bytes .../cctz/testdata/zoneinfo/America/Cancun | Bin 782 -> 529 bytes .../cctz/testdata/zoneinfo/America/Caracas | Bin 264 -> 190 bytes .../cctz/testdata/zoneinfo/America/Catamarca | Bin 1076 -> 708 bytes .../cctz/testdata/zoneinfo/America/Cayenne | Bin 198 -> 151 bytes .../cctz/testdata/zoneinfo/America/Cayman | Bin 182 -> 149 bytes .../cctz/testdata/zoneinfo/America/Chicago | Bin 3576 -> 1754 bytes .../cctz/testdata/zoneinfo/America/Chihuahua | Bin 1484 -> 340 bytes .../testdata/zoneinfo/America/Coral_Harbour | Bin 336 -> 224 bytes .../cctz/testdata/zoneinfo/America/Cordoba | Bin 1076 -> 708 bytes .../cctz/testdata/zoneinfo/America/Costa_Rica | Bin 316 -> 232 bytes .../cctz/testdata/zoneinfo/America/Creston | Bin 208 -> 158 bytes .../cctz/testdata/zoneinfo/America/Cuiaba | Bin 1416 -> 934 bytes .../cctz/testdata/zoneinfo/America/Curacao | Bin 186 -> 151 bytes .../testdata/zoneinfo/America/Danmarkshavn | Bin 698 -> 447 bytes .../cctz/testdata/zoneinfo/America/Dawson | Bin 1600 -> 1029 bytes .../testdata/zoneinfo/America/Dawson_Creek | Bin 1050 -> 683 bytes .../cctz/testdata/zoneinfo/America/Denver | Bin 2444 -> 1042 bytes .../cctz/testdata/zoneinfo/America/Detroit | Bin 2230 -> 899 bytes .../cctz/testdata/zoneinfo/America/Dominica | Bin 148 -> 130 bytes .../cctz/testdata/zoneinfo/America/Edmonton | Bin 2332 -> 970 bytes .../cctz/testdata/zoneinfo/America/Eirunepe | Bin 656 -> 436 bytes .../testdata/zoneinfo/America/El_Salvador | Bin 224 -> 176 bytes .../cctz/testdata/zoneinfo/America/Ensenada | Bin 2342 -> 1025 bytes .../testdata/zoneinfo/America/Fort_Nelson | Bin 2240 -> 1448 bytes .../cctz/testdata/zoneinfo/America/Fort_Wayne | Bin 1666 -> 531 bytes .../cctz/testdata/zoneinfo/America/Fortaleza | Bin 716 -> 484 bytes .../cctz/testdata/zoneinfo/America/Glace_Bay | Bin 2192 -> 880 bytes .../cctz/testdata/zoneinfo/America/Godthab | Bin 1878 -> 465 bytes .../cctz/testdata/zoneinfo/America/Goose_Bay | Bin 3210 -> 1580 bytes .../cctz/testdata/zoneinfo/America/Grand_Turk | Bin 1848 -> 862 bytes .../cctz/testdata/zoneinfo/America/Grenada | Bin 148 -> 130 bytes .../cctz/testdata/zoneinfo/America/Guadeloupe | Bin 148 -> 130 bytes .../cctz/testdata/zoneinfo/America/Guatemala | Bin 280 -> 212 bytes .../cctz/testdata/zoneinfo/America/Guayaquil | Bin 246 -> 179 bytes .../cctz/testdata/zoneinfo/America/Guyana | Bin 236 -> 172 bytes .../cctz/testdata/zoneinfo/America/Halifax | Bin 3424 -> 1672 bytes .../cctz/testdata/zoneinfo/America/Havana | Bin 2416 -> 1117 bytes .../cctz/testdata/zoneinfo/America/Hermosillo | Bin 416 -> 286 bytes .../zoneinfo/America/Indiana/Indianapolis | Bin 1666 -> 531 bytes .../testdata/zoneinfo/America/Indiana/Knox | Bin 2428 -> 1016 bytes .../testdata/zoneinfo/America/Indiana/Marengo | Bin 1722 -> 567 bytes .../zoneinfo/America/Indiana/Petersburg | Bin 1904 -> 683 bytes .../zoneinfo/America/Indiana/Tell_City | Bin 1684 -> 522 bytes .../testdata/zoneinfo/America/Indiana/Vevay | Bin 1414 -> 369 bytes .../zoneinfo/America/Indiana/Vincennes | Bin 1694 -> 558 bytes .../testdata/zoneinfo/America/Indiana/Winamac | Bin 1778 -> 612 bytes .../testdata/zoneinfo/America/Indianapolis | Bin 1666 -> 531 bytes .../cctz/testdata/zoneinfo/America/Inuvik | Bin 1894 -> 701 bytes .../cctz/testdata/zoneinfo/America/Iqaluit | Bin 2032 -> 740 bytes .../cctz/testdata/zoneinfo/America/Jamaica | Bin 482 -> 339 bytes .../cctz/testdata/zoneinfo/America/Jujuy | Bin 1048 -> 690 bytes .../cctz/testdata/zoneinfo/America/Juneau | Bin 2353 -> 966 bytes .../zoneinfo/America/Kentucky/Louisville | Bin 2772 -> 1242 bytes .../zoneinfo/America/Kentucky/Monticello | Bin 2352 -> 972 bytes .../cctz/testdata/zoneinfo/America/Knox_IN | Bin 2428 -> 1016 bytes .../cctz/testdata/zoneinfo/America/Kralendijk | Bin 186 -> 151 bytes .../cctz/testdata/zoneinfo/America/La_Paz | Bin 232 -> 170 bytes .../cctz/testdata/zoneinfo/America/Lima | Bin 406 -> 283 bytes .../testdata/zoneinfo/America/Los_Angeles | Bin 2836 -> 1294 bytes .../cctz/testdata/zoneinfo/America/Louisville | Bin 2772 -> 1242 bytes .../testdata/zoneinfo/America/Lower_Princes | Bin 186 -> 151 bytes .../cctz/testdata/zoneinfo/America/Maceio | Bin 744 -> 502 bytes .../cctz/testdata/zoneinfo/America/Managua | Bin 430 -> 295 bytes .../cctz/testdata/zoneinfo/America/Manaus | Bin 604 -> 412 bytes .../cctz/testdata/zoneinfo/America/Marigot | Bin 148 -> 130 bytes .../cctz/testdata/zoneinfo/America/Martinique | Bin 232 -> 178 bytes .../cctz/testdata/zoneinfo/America/Matamoros | Bin 1390 -> 437 bytes .../cctz/testdata/zoneinfo/America/Mazatlan | Bin 1526 -> 367 bytes .../cctz/testdata/zoneinfo/America/Mendoza | Bin 1076 -> 708 bytes .../cctz/testdata/zoneinfo/America/Menominee | Bin 2274 -> 917 bytes .../cctz/testdata/zoneinfo/America/Merida | Bin 1422 -> 303 bytes .../cctz/testdata/zoneinfo/America/Metlakatla | Bin 1423 -> 595 bytes .../testdata/zoneinfo/America/Mexico_City | Bin 1584 -> 412 bytes .../cctz/testdata/zoneinfo/America/Miquelon | Bin 1666 -> 550 bytes .../cctz/testdata/zoneinfo/America/Moncton | Bin 3154 -> 1493 bytes .../cctz/testdata/zoneinfo/America/Monterrey | Bin 1390 -> 293 bytes .../cctz/testdata/zoneinfo/America/Montevideo | Bin 1510 -> 969 bytes .../cctz/testdata/zoneinfo/America/Montreal | Bin 3494 -> 1717 bytes .../cctz/testdata/zoneinfo/America/Montserrat | Bin 148 -> 130 bytes .../cctz/testdata/zoneinfo/America/Nassau | Bin 2258 -> 941 bytes .../cctz/testdata/zoneinfo/America/New_York | Bin 3536 -> 1744 bytes .../cctz/testdata/zoneinfo/America/Nipigon | Bin 2122 -> 835 bytes .../cctz/testdata/zoneinfo/America/Nome | Bin 2367 -> 975 bytes .../cctz/testdata/zoneinfo/America/Noronha | Bin 716 -> 484 bytes .../zoneinfo/America/North_Dakota/Beulah | Bin 2380 -> 1043 bytes .../zoneinfo/America/North_Dakota/Center | Bin 2380 -> 990 bytes .../zoneinfo/America/North_Dakota/New_Salem | Bin 2380 -> 990 bytes .../cctz/testdata/zoneinfo/America/Nuuk | Bin 1878 -> 465 bytes .../cctz/testdata/zoneinfo/America/Ojinaga | Bin 1484 -> 484 bytes .../cctz/testdata/zoneinfo/America/Panama | Bin 182 -> 149 bytes .../testdata/zoneinfo/America/Pangnirtung | Bin 2094 -> 769 bytes .../cctz/testdata/zoneinfo/America/Paramaribo | Bin 262 -> 187 bytes .../cctz/testdata/zoneinfo/America/Phoenix | Bin 328 -> 240 bytes .../testdata/zoneinfo/America/Port-au-Prince | Bin 1434 -> 565 bytes .../testdata/zoneinfo/America/Port_of_Spain | Bin 148 -> 130 bytes .../cctz/testdata/zoneinfo/America/Porto_Acre | Bin 628 -> 418 bytes .../testdata/zoneinfo/America/Porto_Velho | Bin 576 -> 394 bytes .../testdata/zoneinfo/America/Puerto_Rico | Bin 246 -> 177 bytes .../testdata/zoneinfo/America/Punta_Arenas | Bin 1902 -> 1209 bytes .../testdata/zoneinfo/America/Rainy_River | Bin 2122 -> 835 bytes .../testdata/zoneinfo/America/Rankin_Inlet | Bin 1892 -> 692 bytes .../cctz/testdata/zoneinfo/America/Recife | Bin 716 -> 484 bytes .../cctz/testdata/zoneinfo/America/Regina | Bin 980 -> 638 bytes .../cctz/testdata/zoneinfo/America/Resolute | Bin 1892 -> 692 bytes .../cctz/testdata/zoneinfo/America/Rio_Branco | Bin 628 -> 418 bytes .../cctz/testdata/zoneinfo/America/Rosario | Bin 1076 -> 708 bytes .../testdata/zoneinfo/America/Santa_Isabel | Bin 2342 -> 1025 bytes .../cctz/testdata/zoneinfo/America/Santarem | Bin 602 -> 409 bytes .../cctz/testdata/zoneinfo/America/Santiago | Bin 2529 -> 1282 bytes .../testdata/zoneinfo/America/Santo_Domingo | Bin 458 -> 317 bytes .../cctz/testdata/zoneinfo/America/Sao_Paulo | Bin 1444 -> 952 bytes .../testdata/zoneinfo/America/Scoresbysund | Bin 1916 -> 479 bytes .../cctz/testdata/zoneinfo/America/Shiprock | Bin 2444 -> 1042 bytes .../cctz/testdata/zoneinfo/America/Sitka | Bin 2329 -> 956 bytes .../testdata/zoneinfo/America/St_Barthelemy | Bin 148 -> 130 bytes .../cctz/testdata/zoneinfo/America/St_Johns | Bin 3655 -> 1878 bytes .../cctz/testdata/zoneinfo/America/St_Kitts | Bin 148 -> 130 bytes .../cctz/testdata/zoneinfo/America/St_Lucia | Bin 148 -> 130 bytes .../cctz/testdata/zoneinfo/America/St_Thomas | Bin 148 -> 130 bytes .../cctz/testdata/zoneinfo/America/St_Vincent | Bin 148 -> 130 bytes .../testdata/zoneinfo/America/Swift_Current | Bin 560 -> 368 bytes .../testdata/zoneinfo/America/Tegucigalpa | Bin 252 -> 194 bytes .../cctz/testdata/zoneinfo/America/Thule | Bin 1502 -> 455 bytes .../testdata/zoneinfo/America/Thunder_Bay | Bin 2202 -> 881 bytes .../cctz/testdata/zoneinfo/America/Tijuana | Bin 2342 -> 1025 bytes .../cctz/testdata/zoneinfo/America/Toronto | Bin 3494 -> 1717 bytes .../cctz/testdata/zoneinfo/America/Tortola | Bin 148 -> 130 bytes .../cctz/testdata/zoneinfo/America/Vancouver | Bin 2892 -> 1330 bytes .../cctz/testdata/zoneinfo/America/Virgin | Bin 148 -> 130 bytes .../cctz/testdata/zoneinfo/America/Whitehorse | Bin 1600 -> 1029 bytes .../cctz/testdata/zoneinfo/America/Winnipeg | Bin 2868 -> 1294 bytes .../cctz/testdata/zoneinfo/America/Yakutat | Bin 2305 -> 946 bytes .../testdata/zoneinfo/America/Yellowknife | Bin 1966 -> 729 bytes .../cctz/testdata/zoneinfo/Antarctica/Casey | Bin 297 -> 243 bytes .../cctz/testdata/zoneinfo/Antarctica/Davis | Bin 297 -> 197 bytes .../zoneinfo/Antarctica/DumontDUrville | Bin 194 -> 152 bytes .../testdata/zoneinfo/Antarctica/Macquarie | Bin 1520 -> 976 bytes .../cctz/testdata/zoneinfo/Antarctica/Mawson | Bin 199 -> 152 bytes .../cctz/testdata/zoneinfo/Antarctica/McMurdo | Bin 2437 -> 1043 bytes .../cctz/testdata/zoneinfo/Antarctica/Palmer | Bin 1418 -> 887 bytes .../cctz/testdata/zoneinfo/Antarctica/Rothera | Bin 164 -> 132 bytes .../testdata/zoneinfo/Antarctica/South_Pole | Bin 2437 -> 1043 bytes .../cctz/testdata/zoneinfo/Antarctica/Syowa | Bin 165 -> 133 bytes .../cctz/testdata/zoneinfo/Antarctica/Troll | Bin 1162 -> 177 bytes .../cctz/testdata/zoneinfo/Antarctica/Vostok | Bin 165 -> 133 bytes .../testdata/zoneinfo/Arctic/Longyearbyen | Bin 2228 -> 676 bytes .../internal/cctz/testdata/zoneinfo/Asia/Aden | Bin 165 -> 133 bytes .../cctz/testdata/zoneinfo/Asia/Almaty | Bin 997 -> 609 bytes .../cctz/testdata/zoneinfo/Asia/Amman | Bin 1853 -> 787 bytes .../cctz/testdata/zoneinfo/Asia/Anadyr | Bin 1188 -> 743 bytes .../cctz/testdata/zoneinfo/Asia/Aqtau | Bin 983 -> 606 bytes .../cctz/testdata/zoneinfo/Asia/Aqtobe | Bin 1011 -> 615 bytes .../cctz/testdata/zoneinfo/Asia/Ashgabat | Bin 619 -> 375 bytes .../cctz/testdata/zoneinfo/Asia/Ashkhabad | Bin 619 -> 375 bytes .../cctz/testdata/zoneinfo/Asia/Atyrau | Bin 991 -> 616 bytes .../cctz/testdata/zoneinfo/Asia/Baghdad | Bin 983 -> 630 bytes .../cctz/testdata/zoneinfo/Asia/Bahrain | Bin 199 -> 152 bytes .../internal/cctz/testdata/zoneinfo/Asia/Baku | Bin 1227 -> 744 bytes .../cctz/testdata/zoneinfo/Asia/Bangkok | Bin 199 -> 152 bytes .../cctz/testdata/zoneinfo/Asia/Barnaul | Bin 1221 -> 753 bytes .../cctz/testdata/zoneinfo/Asia/Beirut | Bin 2154 -> 732 bytes .../cctz/testdata/zoneinfo/Asia/Bishkek | Bin 983 -> 618 bytes .../cctz/testdata/zoneinfo/Asia/Brunei | Bin 203 -> 154 bytes .../cctz/testdata/zoneinfo/Asia/Calcutta | Bin 285 -> 220 bytes .../cctz/testdata/zoneinfo/Asia/Chita | Bin 1221 -> 750 bytes .../cctz/testdata/zoneinfo/Asia/Choibalsan | Bin 949 -> 619 bytes .../cctz/testdata/zoneinfo/Asia/Chongqing | Bin 561 -> 393 bytes .../cctz/testdata/zoneinfo/Asia/Chungking | Bin 561 -> 393 bytes .../cctz/testdata/zoneinfo/Asia/Colombo | Bin 372 -> 247 bytes .../cctz/testdata/zoneinfo/Asia/Dacca | Bin 337 -> 231 bytes .../cctz/testdata/zoneinfo/Asia/Damascus | Bin 2294 -> 1047 bytes .../cctz/testdata/zoneinfo/Asia/Dhaka | Bin 337 -> 231 bytes .../internal/cctz/testdata/zoneinfo/Asia/Dili | Bin 227 -> 170 bytes .../cctz/testdata/zoneinfo/Asia/Dubai | Bin 165 -> 133 bytes .../cctz/testdata/zoneinfo/Asia/Dushanbe | Bin 591 -> 366 bytes .../cctz/testdata/zoneinfo/Asia/Famagusta | Bin 2028 -> 940 bytes .../internal/cctz/testdata/zoneinfo/Asia/Gaza | Bin 2316 -> 1195 bytes .../cctz/testdata/zoneinfo/Asia/Harbin | Bin 561 -> 393 bytes .../cctz/testdata/zoneinfo/Asia/Hebron | Bin 2344 -> 1213 bytes .../cctz/testdata/zoneinfo/Asia/Ho_Chi_Minh | Bin 351 -> 236 bytes .../cctz/testdata/zoneinfo/Asia/Hong_Kong | Bin 1203 -> 775 bytes .../internal/cctz/testdata/zoneinfo/Asia/Hovd | Bin 891 -> 594 bytes .../cctz/testdata/zoneinfo/Asia/Irkutsk | Bin 1243 -> 760 bytes .../cctz/testdata/zoneinfo/Asia/Istanbul | Bin 1947 -> 1200 bytes .../cctz/testdata/zoneinfo/Asia/Jakarta | Bin 355 -> 248 bytes .../cctz/testdata/zoneinfo/Asia/Jayapura | Bin 221 -> 171 bytes .../cctz/testdata/zoneinfo/Asia/Jerusalem | Bin 2288 -> 1056 bytes .../cctz/testdata/zoneinfo/Asia/Kabul | Bin 208 -> 159 bytes .../cctz/testdata/zoneinfo/Asia/Kamchatka | Bin 1166 -> 727 bytes .../cctz/testdata/zoneinfo/Asia/Karachi | Bin 379 -> 266 bytes .../cctz/testdata/zoneinfo/Asia/Kashgar | Bin 165 -> 133 bytes .../cctz/testdata/zoneinfo/Asia/Kathmandu | Bin 212 -> 161 bytes .../cctz/testdata/zoneinfo/Asia/Katmandu | Bin 212 -> 161 bytes .../cctz/testdata/zoneinfo/Asia/Khandyga | Bin 1271 -> 775 bytes .../cctz/testdata/zoneinfo/Asia/Kolkata | Bin 285 -> 220 bytes .../cctz/testdata/zoneinfo/Asia/Krasnoyarsk | Bin 1207 -> 741 bytes .../cctz/testdata/zoneinfo/Asia/Kuala_Lumpur | Bin 383 -> 256 bytes .../cctz/testdata/zoneinfo/Asia/Kuching | Bin 483 -> 320 bytes .../cctz/testdata/zoneinfo/Asia/Kuwait | Bin 165 -> 133 bytes .../cctz/testdata/zoneinfo/Asia/Macao | Bin 1227 -> 791 bytes .../cctz/testdata/zoneinfo/Asia/Macau | Bin 1227 -> 791 bytes .../cctz/testdata/zoneinfo/Asia/Magadan | Bin 1222 -> 751 bytes .../cctz/testdata/zoneinfo/Asia/Makassar | Bin 254 -> 190 bytes .../cctz/testdata/zoneinfo/Asia/Manila | Bin 328 -> 238 bytes .../cctz/testdata/zoneinfo/Asia/Muscat | Bin 165 -> 133 bytes .../cctz/testdata/zoneinfo/Asia/Nicosia | Bin 2002 -> 597 bytes .../cctz/testdata/zoneinfo/Asia/Novokuznetsk | Bin 1165 -> 726 bytes .../cctz/testdata/zoneinfo/Asia/Novosibirsk | Bin 1221 -> 753 bytes .../internal/cctz/testdata/zoneinfo/Asia/Omsk | Bin 1207 -> 741 bytes .../internal/cctz/testdata/zoneinfo/Asia/Oral | Bin 1005 -> 625 bytes .../cctz/testdata/zoneinfo/Asia/Phnom_Penh | Bin 199 -> 152 bytes .../cctz/testdata/zoneinfo/Asia/Pontianak | Bin 353 -> 247 bytes .../cctz/testdata/zoneinfo/Asia/Pyongyang | Bin 237 -> 183 bytes .../cctz/testdata/zoneinfo/Asia/Qatar | Bin 199 -> 152 bytes .../cctz/testdata/zoneinfo/Asia/Qostanay | Bin 1011 -> 615 bytes .../cctz/testdata/zoneinfo/Asia/Qyzylorda | Bin 1025 -> 624 bytes .../cctz/testdata/zoneinfo/Asia/Rangoon | Bin 268 -> 187 bytes .../cctz/testdata/zoneinfo/Asia/Riyadh | Bin 165 -> 133 bytes .../cctz/testdata/zoneinfo/Asia/Saigon | Bin 351 -> 236 bytes .../cctz/testdata/zoneinfo/Asia/Sakhalin | Bin 1202 -> 755 bytes .../cctz/testdata/zoneinfo/Asia/Samarkand | Bin 577 -> 366 bytes .../cctz/testdata/zoneinfo/Asia/Seoul | Bin 617 -> 415 bytes .../cctz/testdata/zoneinfo/Asia/Shanghai | Bin 561 -> 393 bytes .../cctz/testdata/zoneinfo/Asia/Singapore | Bin 383 -> 256 bytes .../cctz/testdata/zoneinfo/Asia/Srednekolymsk | Bin 1208 -> 742 bytes .../cctz/testdata/zoneinfo/Asia/Taipei | Bin 761 -> 511 bytes .../cctz/testdata/zoneinfo/Asia/Tashkent | Bin 591 -> 366 bytes .../cctz/testdata/zoneinfo/Asia/Tbilisi | Bin 1035 -> 629 bytes .../cctz/testdata/zoneinfo/Asia/Tehran | Bin 2582 -> 2004 bytes .../cctz/testdata/zoneinfo/Asia/Tel_Aviv | Bin 2288 -> 1056 bytes .../cctz/testdata/zoneinfo/Asia/Thimbu | Bin 203 -> 154 bytes .../cctz/testdata/zoneinfo/Asia/Thimphu | Bin 203 -> 154 bytes .../cctz/testdata/zoneinfo/Asia/Tokyo | Bin 309 -> 213 bytes .../cctz/testdata/zoneinfo/Asia/Tomsk | Bin 1221 -> 753 bytes .../cctz/testdata/zoneinfo/Asia/Ujung_Pandang | Bin 254 -> 190 bytes .../cctz/testdata/zoneinfo/Asia/Ulaanbaatar | Bin 891 -> 594 bytes .../cctz/testdata/zoneinfo/Asia/Ulan_Bator | Bin 891 -> 594 bytes .../cctz/testdata/zoneinfo/Asia/Urumqi | Bin 165 -> 133 bytes .../cctz/testdata/zoneinfo/Asia/Ust-Nera | Bin 1252 -> 771 bytes .../cctz/testdata/zoneinfo/Asia/Vientiane | Bin 199 -> 152 bytes .../cctz/testdata/zoneinfo/Asia/Vladivostok | Bin 1208 -> 742 bytes .../cctz/testdata/zoneinfo/Asia/Yakutsk | Bin 1207 -> 741 bytes .../cctz/testdata/zoneinfo/Asia/Yangon | Bin 268 -> 187 bytes .../cctz/testdata/zoneinfo/Asia/Yekaterinburg | Bin 1243 -> 760 bytes .../cctz/testdata/zoneinfo/Asia/Yerevan | Bin 1151 -> 708 bytes .../cctz/testdata/zoneinfo/Atlantic/Azores | Bin 3484 -> 1435 bytes .../cctz/testdata/zoneinfo/Atlantic/Bermuda | Bin 1978 -> 761 bytes .../cctz/testdata/zoneinfo/Atlantic/Canary | Bin 1897 -> 478 bytes .../testdata/zoneinfo/Atlantic/Cape_Verde | Bin 270 -> 175 bytes .../cctz/testdata/zoneinfo/Atlantic/Faeroe | Bin 1815 -> 441 bytes .../cctz/testdata/zoneinfo/Atlantic/Faroe | Bin 1815 -> 441 bytes .../cctz/testdata/zoneinfo/Atlantic/Jan_Mayen | Bin 2228 -> 676 bytes .../cctz/testdata/zoneinfo/Atlantic/Madeira | Bin 3475 -> 1435 bytes .../cctz/testdata/zoneinfo/Atlantic/Reykjavik | Bin 1162 -> 753 bytes .../testdata/zoneinfo/Atlantic/South_Georgia | Bin 164 -> 132 bytes .../cctz/testdata/zoneinfo/Atlantic/St_Helena | Bin 148 -> 130 bytes .../cctz/testdata/zoneinfo/Atlantic/Stanley | Bin 1214 -> 789 bytes .../cctz/testdata/zoneinfo/Australia/ACT | Bin 2204 -> 904 bytes .../cctz/testdata/zoneinfo/Australia/Adelaide | Bin 2222 -> 921 bytes .../cctz/testdata/zoneinfo/Australia/Brisbane | Bin 433 -> 289 bytes .../testdata/zoneinfo/Australia/Broken_Hill | Bin 2243 -> 941 bytes .../cctz/testdata/zoneinfo/Australia/Canberra | Bin 2204 -> 904 bytes .../cctz/testdata/zoneinfo/Australia/Currie | Bin 2204 -> 895 bytes .../cctz/testdata/zoneinfo/Australia/Darwin | Bin 304 -> 234 bytes .../cctz/testdata/zoneinfo/Australia/Eucla | Bin 484 -> 314 bytes .../cctz/testdata/zoneinfo/Australia/Hobart | Bin 2316 -> 967 bytes .../cctz/testdata/zoneinfo/Australia/LHI | Bin 1860 -> 692 bytes .../cctz/testdata/zoneinfo/Australia/Lindeman | Bin 489 -> 325 bytes .../testdata/zoneinfo/Australia/Lord_Howe | Bin 1860 -> 692 bytes .../testdata/zoneinfo/Australia/Melbourne | Bin 2204 -> 904 bytes .../cctz/testdata/zoneinfo/Australia/NSW | Bin 2204 -> 904 bytes .../cctz/testdata/zoneinfo/Australia/North | Bin 304 -> 234 bytes .../cctz/testdata/zoneinfo/Australia/Perth | Bin 460 -> 306 bytes .../testdata/zoneinfo/Australia/Queensland | Bin 433 -> 289 bytes .../cctz/testdata/zoneinfo/Australia/South | Bin 2222 -> 921 bytes .../cctz/testdata/zoneinfo/Australia/Sydney | Bin 2204 -> 904 bytes .../cctz/testdata/zoneinfo/Australia/Tasmania | Bin 2316 -> 967 bytes .../cctz/testdata/zoneinfo/Australia/Victoria | Bin 2204 -> 904 bytes .../cctz/testdata/zoneinfo/Australia/West | Bin 460 -> 306 bytes .../testdata/zoneinfo/Australia/Yancowinna | Bin 2243 -> 941 bytes .../cctz/testdata/zoneinfo/Brazil/Acre | Bin 628 -> 418 bytes .../cctz/testdata/zoneinfo/Brazil/DeNoronha | Bin 716 -> 484 bytes .../cctz/testdata/zoneinfo/Brazil/East | Bin 1444 -> 952 bytes .../cctz/testdata/zoneinfo/Brazil/West | Bin 604 -> 412 bytes .../time/internal/cctz/testdata/zoneinfo/CET | Bin 2094 -> 621 bytes .../internal/cctz/testdata/zoneinfo/CST6CDT | Bin 2310 -> 951 bytes .../cctz/testdata/zoneinfo/Canada/Atlantic | Bin 3424 -> 1672 bytes .../cctz/testdata/zoneinfo/Canada/Central | Bin 2868 -> 1294 bytes .../cctz/testdata/zoneinfo/Canada/Eastern | Bin 3494 -> 1717 bytes .../cctz/testdata/zoneinfo/Canada/Mountain | Bin 2332 -> 970 bytes .../testdata/zoneinfo/Canada/Newfoundland | Bin 3655 -> 1878 bytes .../cctz/testdata/zoneinfo/Canada/Pacific | Bin 2892 -> 1330 bytes .../testdata/zoneinfo/Canada/Saskatchewan | Bin 980 -> 638 bytes .../cctz/testdata/zoneinfo/Canada/Yukon | Bin 1600 -> 1029 bytes .../cctz/testdata/zoneinfo/Chile/Continental | Bin 2529 -> 1282 bytes .../cctz/testdata/zoneinfo/Chile/EasterIsland | Bin 2233 -> 1102 bytes .../time/internal/cctz/testdata/zoneinfo/Cuba | Bin 2416 -> 1117 bytes .../time/internal/cctz/testdata/zoneinfo/EET | Bin 1908 -> 497 bytes .../time/internal/cctz/testdata/zoneinfo/EST | Bin 114 -> 111 bytes .../internal/cctz/testdata/zoneinfo/EST5EDT | Bin 2310 -> 951 bytes .../internal/cctz/testdata/zoneinfo/Egypt | Bin 1955 -> 1276 bytes .../time/internal/cctz/testdata/zoneinfo/Eire | Bin 3492 -> 1496 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT | Bin 114 -> 111 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+0 | Bin 114 -> 111 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+1 | Bin 116 -> 113 bytes .../cctz/testdata/zoneinfo/Etc/GMT+10 | Bin 117 -> 114 bytes .../cctz/testdata/zoneinfo/Etc/GMT+11 | Bin 117 -> 114 bytes .../cctz/testdata/zoneinfo/Etc/GMT+12 | Bin 117 -> 114 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+2 | Bin 116 -> 113 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+3 | Bin 116 -> 113 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+4 | Bin 116 -> 113 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+5 | Bin 116 -> 113 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+6 | Bin 116 -> 113 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+7 | Bin 116 -> 113 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+8 | Bin 116 -> 113 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+9 | Bin 116 -> 113 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-0 | Bin 114 -> 111 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-1 | Bin 117 -> 114 bytes .../cctz/testdata/zoneinfo/Etc/GMT-10 | Bin 118 -> 115 bytes .../cctz/testdata/zoneinfo/Etc/GMT-11 | Bin 118 -> 115 bytes .../cctz/testdata/zoneinfo/Etc/GMT-12 | Bin 118 -> 115 bytes .../cctz/testdata/zoneinfo/Etc/GMT-13 | Bin 118 -> 115 bytes .../cctz/testdata/zoneinfo/Etc/GMT-14 | Bin 118 -> 115 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-2 | Bin 117 -> 114 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-3 | Bin 117 -> 114 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-4 | Bin 117 -> 114 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-5 | Bin 117 -> 114 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-6 | Bin 117 -> 114 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-7 | Bin 117 -> 114 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-8 | Bin 117 -> 114 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-9 | Bin 117 -> 114 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT0 | Bin 114 -> 111 bytes .../cctz/testdata/zoneinfo/Etc/Greenwich | Bin 114 -> 111 bytes .../internal/cctz/testdata/zoneinfo/Etc/UCT | Bin 114 -> 111 bytes .../internal/cctz/testdata/zoneinfo/Etc/UTC | Bin 114 -> 111 bytes .../cctz/testdata/zoneinfo/Etc/Universal | Bin 114 -> 111 bytes .../internal/cctz/testdata/zoneinfo/Etc/Zulu | Bin 114 -> 111 bytes .../cctz/testdata/zoneinfo/Europe/Amsterdam | Bin 2910 -> 1071 bytes .../cctz/testdata/zoneinfo/Europe/Andorra | Bin 1742 -> 389 bytes .../cctz/testdata/zoneinfo/Europe/Astrakhan | Bin 1165 -> 726 bytes .../cctz/testdata/zoneinfo/Europe/Athens | Bin 2262 -> 682 bytes .../cctz/testdata/zoneinfo/Europe/Belfast | Bin 3648 -> 1599 bytes .../cctz/testdata/zoneinfo/Europe/Belgrade | Bin 1920 -> 478 bytes .../cctz/testdata/zoneinfo/Europe/Berlin | Bin 2298 -> 705 bytes .../cctz/testdata/zoneinfo/Europe/Bratislava | Bin 2301 -> 723 bytes .../cctz/testdata/zoneinfo/Europe/Brussels | Bin 2933 -> 1103 bytes .../cctz/testdata/zoneinfo/Europe/Bucharest | Bin 2184 -> 661 bytes .../cctz/testdata/zoneinfo/Europe/Budapest | Bin 2368 -> 766 bytes .../cctz/testdata/zoneinfo/Europe/Busingen | Bin 1909 -> 497 bytes .../cctz/testdata/zoneinfo/Europe/Chisinau | Bin 2390 -> 755 bytes .../cctz/testdata/zoneinfo/Europe/Copenhagen | Bin 2137 -> 623 bytes .../cctz/testdata/zoneinfo/Europe/Dublin | Bin 3492 -> 1496 bytes .../cctz/testdata/zoneinfo/Europe/Gibraltar | Bin 3052 -> 1220 bytes .../cctz/testdata/zoneinfo/Europe/Guernsey | Bin 3648 -> 1599 bytes .../cctz/testdata/zoneinfo/Europe/Helsinki | Bin 1900 -> 481 bytes .../cctz/testdata/zoneinfo/Europe/Isle_of_Man | Bin 3648 -> 1599 bytes .../cctz/testdata/zoneinfo/Europe/Istanbul | Bin 1947 -> 1200 bytes .../cctz/testdata/zoneinfo/Europe/Jersey | Bin 3648 -> 1599 bytes .../cctz/testdata/zoneinfo/Europe/Kaliningrad | Bin 1493 -> 904 bytes .../cctz/testdata/zoneinfo/Europe/Kiev | Bin 2088 -> 549 bytes .../cctz/testdata/zoneinfo/Europe/Kirov | Bin 1153 -> 717 bytes .../cctz/testdata/zoneinfo/Europe/Lisbon | Bin 3469 -> 1436 bytes .../cctz/testdata/zoneinfo/Europe/Ljubljana | Bin 1920 -> 478 bytes .../cctz/testdata/zoneinfo/Europe/London | Bin 3648 -> 1599 bytes .../cctz/testdata/zoneinfo/Europe/Luxembourg | Bin 2946 -> 1087 bytes .../cctz/testdata/zoneinfo/Europe/Madrid | Bin 2614 -> 897 bytes .../cctz/testdata/zoneinfo/Europe/Malta | Bin 2620 -> 928 bytes .../cctz/testdata/zoneinfo/Europe/Mariehamn | Bin 1900 -> 481 bytes .../cctz/testdata/zoneinfo/Europe/Minsk | Bin 1321 -> 808 bytes .../cctz/testdata/zoneinfo/Europe/Monaco | Bin 2944 -> 1114 bytes .../cctz/testdata/zoneinfo/Europe/Moscow | Bin 1535 -> 908 bytes .../cctz/testdata/zoneinfo/Europe/Nicosia | Bin 2002 -> 597 bytes .../cctz/testdata/zoneinfo/Europe/Oslo | Bin 2228 -> 676 bytes .../cctz/testdata/zoneinfo/Europe/Paris | Bin 2962 -> 1105 bytes .../cctz/testdata/zoneinfo/Europe/Podgorica | Bin 1920 -> 478 bytes .../cctz/testdata/zoneinfo/Europe/Prague | Bin 2301 -> 723 bytes .../cctz/testdata/zoneinfo/Europe/Riga | Bin 2198 -> 694 bytes .../cctz/testdata/zoneinfo/Europe/Rome | Bin 2641 -> 947 bytes .../cctz/testdata/zoneinfo/Europe/Samara | Bin 1215 -> 732 bytes .../cctz/testdata/zoneinfo/Europe/San_Marino | Bin 2641 -> 947 bytes .../cctz/testdata/zoneinfo/Europe/Sarajevo | Bin 1920 -> 478 bytes .../cctz/testdata/zoneinfo/Europe/Saratov | Bin 1183 -> 726 bytes .../cctz/testdata/zoneinfo/Europe/Simferopol | Bin 1453 -> 865 bytes .../cctz/testdata/zoneinfo/Europe/Skopje | Bin 1920 -> 478 bytes .../cctz/testdata/zoneinfo/Europe/Sofia | Bin 2077 -> 592 bytes .../cctz/testdata/zoneinfo/Europe/Stockholm | Bin 1909 -> 497 bytes .../cctz/testdata/zoneinfo/Europe/Tallinn | Bin 2148 -> 675 bytes .../cctz/testdata/zoneinfo/Europe/Tirane | Bin 2084 -> 604 bytes .../cctz/testdata/zoneinfo/Europe/Tiraspol | Bin 2390 -> 755 bytes .../cctz/testdata/zoneinfo/Europe/Ulyanovsk | Bin 1267 -> 760 bytes .../cctz/testdata/zoneinfo/Europe/Uzhgorod | Bin 2050 -> 530 bytes .../cctz/testdata/zoneinfo/Europe/Vaduz | Bin 1909 -> 497 bytes .../cctz/testdata/zoneinfo/Europe/Vatican | Bin 2641 -> 947 bytes .../cctz/testdata/zoneinfo/Europe/Vienna | Bin 2200 -> 658 bytes .../cctz/testdata/zoneinfo/Europe/Vilnius | Bin 2162 -> 676 bytes .../cctz/testdata/zoneinfo/Europe/Volgograd | Bin 1165 -> 726 bytes .../cctz/testdata/zoneinfo/Europe/Warsaw | Bin 2654 -> 923 bytes .../cctz/testdata/zoneinfo/Europe/Zagreb | Bin 1920 -> 478 bytes .../cctz/testdata/zoneinfo/Europe/Zaporozhye | Bin 2106 -> 560 bytes .../cctz/testdata/zoneinfo/Europe/Zurich | Bin 1909 -> 497 bytes .../internal/cctz/testdata/zoneinfo/Factory | Bin 116 -> 113 bytes .../time/internal/cctz/testdata/zoneinfo/GB | Bin 3648 -> 1599 bytes .../internal/cctz/testdata/zoneinfo/GB-Eire | Bin 3648 -> 1599 bytes .../time/internal/cctz/testdata/zoneinfo/GMT | Bin 114 -> 111 bytes .../internal/cctz/testdata/zoneinfo/GMT+0 | Bin 114 -> 111 bytes .../internal/cctz/testdata/zoneinfo/GMT-0 | Bin 114 -> 111 bytes .../time/internal/cctz/testdata/zoneinfo/GMT0 | Bin 114 -> 111 bytes .../internal/cctz/testdata/zoneinfo/Greenwich | Bin 114 -> 111 bytes .../time/internal/cctz/testdata/zoneinfo/HST | Bin 115 -> 112 bytes .../internal/cctz/testdata/zoneinfo/Hongkong | Bin 1203 -> 775 bytes .../internal/cctz/testdata/zoneinfo/Iceland | Bin 1162 -> 753 bytes .../testdata/zoneinfo/Indian/Antananarivo | Bin 251 -> 182 bytes .../cctz/testdata/zoneinfo/Indian/Chagos | Bin 199 -> 152 bytes .../cctz/testdata/zoneinfo/Indian/Christmas | Bin 165 -> 133 bytes .../cctz/testdata/zoneinfo/Indian/Cocos | Bin 174 -> 140 bytes .../cctz/testdata/zoneinfo/Indian/Comoro | Bin 251 -> 182 bytes .../cctz/testdata/zoneinfo/Indian/Kerguelen | Bin 165 -> 133 bytes .../cctz/testdata/zoneinfo/Indian/Mahe | Bin 165 -> 133 bytes .../cctz/testdata/zoneinfo/Indian/Maldives | Bin 199 -> 152 bytes .../cctz/testdata/zoneinfo/Indian/Mauritius | Bin 241 -> 179 bytes .../cctz/testdata/zoneinfo/Indian/Mayotte | Bin 251 -> 182 bytes .../cctz/testdata/zoneinfo/Indian/Reunion | Bin 165 -> 133 bytes .../time/internal/cctz/testdata/zoneinfo/Iran | Bin 2582 -> 2004 bytes .../internal/cctz/testdata/zoneinfo/Israel | Bin 2288 -> 1056 bytes .../internal/cctz/testdata/zoneinfo/Jamaica | Bin 482 -> 339 bytes .../internal/cctz/testdata/zoneinfo/Japan | Bin 309 -> 213 bytes .../internal/cctz/testdata/zoneinfo/Kwajalein | Bin 316 -> 219 bytes .../internal/cctz/testdata/zoneinfo/Libya | Bin 625 -> 431 bytes .../time/internal/cctz/testdata/zoneinfo/MET | Bin 2094 -> 621 bytes .../time/internal/cctz/testdata/zoneinfo/MST | Bin 114 -> 111 bytes .../internal/cctz/testdata/zoneinfo/MST7MDT | Bin 2310 -> 951 bytes .../cctz/testdata/zoneinfo/Mexico/BajaNorte | Bin 2342 -> 1025 bytes .../cctz/testdata/zoneinfo/Mexico/BajaSur | Bin 1526 -> 367 bytes .../cctz/testdata/zoneinfo/Mexico/General | Bin 1584 -> 412 bytes .../time/internal/cctz/testdata/zoneinfo/NZ | Bin 2437 -> 1043 bytes .../internal/cctz/testdata/zoneinfo/NZ-CHAT | Bin 2068 -> 808 bytes .../internal/cctz/testdata/zoneinfo/Navajo | Bin 2444 -> 1042 bytes .../time/internal/cctz/testdata/zoneinfo/PRC | Bin 561 -> 393 bytes .../internal/cctz/testdata/zoneinfo/PST8PDT | Bin 2310 -> 951 bytes .../cctz/testdata/zoneinfo/Pacific/Apia | Bin 1097 -> 268 bytes .../cctz/testdata/zoneinfo/Pacific/Auckland | Bin 2437 -> 1043 bytes .../testdata/zoneinfo/Pacific/Bougainville | Bin 268 -> 201 bytes .../cctz/testdata/zoneinfo/Pacific/Chatham | Bin 2068 -> 808 bytes .../cctz/testdata/zoneinfo/Pacific/Chuuk | Bin 269 -> 195 bytes .../cctz/testdata/zoneinfo/Pacific/Easter | Bin 2233 -> 1102 bytes .../cctz/testdata/zoneinfo/Pacific/Efate | Bin 466 -> 324 bytes .../cctz/testdata/zoneinfo/Pacific/Enderbury | Bin 234 -> 172 bytes .../cctz/testdata/zoneinfo/Pacific/Fakaofo | Bin 200 -> 153 bytes .../cctz/testdata/zoneinfo/Pacific/Fiji | Bin 1077 -> 419 bytes .../cctz/testdata/zoneinfo/Pacific/Funafuti | Bin 166 -> 134 bytes .../cctz/testdata/zoneinfo/Pacific/Galapagos | Bin 238 -> 175 bytes .../cctz/testdata/zoneinfo/Pacific/Gambier | Bin 164 -> 132 bytes .../testdata/zoneinfo/Pacific/Guadalcanal | Bin 166 -> 134 bytes .../cctz/testdata/zoneinfo/Pacific/Guam | Bin 494 -> 350 bytes .../cctz/testdata/zoneinfo/Pacific/Honolulu | Bin 329 -> 221 bytes .../cctz/testdata/zoneinfo/Pacific/Johnston | Bin 329 -> 221 bytes .../cctz/testdata/zoneinfo/Pacific/Kiritimati | Bin 238 -> 174 bytes .../cctz/testdata/zoneinfo/Pacific/Kosrae | Bin 351 -> 242 bytes .../cctz/testdata/zoneinfo/Pacific/Kwajalein | Bin 316 -> 219 bytes .../cctz/testdata/zoneinfo/Pacific/Majuro | Bin 310 -> 218 bytes .../cctz/testdata/zoneinfo/Pacific/Marquesas | Bin 173 -> 139 bytes .../cctz/testdata/zoneinfo/Pacific/Midway | Bin 175 -> 146 bytes .../cctz/testdata/zoneinfo/Pacific/Nauru | Bin 252 -> 183 bytes .../cctz/testdata/zoneinfo/Pacific/Niue | Bin 241 -> 175 bytes .../cctz/testdata/zoneinfo/Pacific/Norfolk | Bin 880 -> 247 bytes .../cctz/testdata/zoneinfo/Pacific/Noumea | Bin 304 -> 198 bytes .../cctz/testdata/zoneinfo/Pacific/Pago_Pago | Bin 175 -> 146 bytes .../cctz/testdata/zoneinfo/Pacific/Palau | Bin 180 -> 148 bytes .../cctz/testdata/zoneinfo/Pacific/Pitcairn | Bin 202 -> 153 bytes .../cctz/testdata/zoneinfo/Pacific/Pohnpei | Bin 303 -> 214 bytes .../cctz/testdata/zoneinfo/Pacific/Ponape | Bin 303 -> 214 bytes .../testdata/zoneinfo/Pacific/Port_Moresby | Bin 186 -> 154 bytes .../cctz/testdata/zoneinfo/Pacific/Rarotonga | Bin 577 -> 391 bytes .../cctz/testdata/zoneinfo/Pacific/Saipan | Bin 494 -> 350 bytes .../cctz/testdata/zoneinfo/Pacific/Samoa | Bin 175 -> 146 bytes .../cctz/testdata/zoneinfo/Pacific/Tahiti | Bin 165 -> 133 bytes .../cctz/testdata/zoneinfo/Pacific/Tarawa | Bin 166 -> 134 bytes .../cctz/testdata/zoneinfo/Pacific/Tongatapu | Bin 372 -> 237 bytes .../cctz/testdata/zoneinfo/Pacific/Truk | Bin 269 -> 195 bytes .../cctz/testdata/zoneinfo/Pacific/Wake | Bin 166 -> 134 bytes .../cctz/testdata/zoneinfo/Pacific/Wallis | Bin 166 -> 134 bytes .../cctz/testdata/zoneinfo/Pacific/Yap | Bin 269 -> 195 bytes .../internal/cctz/testdata/zoneinfo/Poland | Bin 2654 -> 923 bytes .../internal/cctz/testdata/zoneinfo/Portugal | Bin 3469 -> 1436 bytes .../time/internal/cctz/testdata/zoneinfo/ROC | Bin 761 -> 511 bytes .../time/internal/cctz/testdata/zoneinfo/ROK | Bin 617 -> 415 bytes .../internal/cctz/testdata/zoneinfo/Singapore | Bin 383 -> 256 bytes .../internal/cctz/testdata/zoneinfo/Turkey | Bin 1947 -> 1200 bytes .../time/internal/cctz/testdata/zoneinfo/UCT | Bin 114 -> 111 bytes .../internal/cctz/testdata/zoneinfo/US/Alaska | Bin 2371 -> 977 bytes .../cctz/testdata/zoneinfo/US/Aleutian | Bin 2356 -> 969 bytes .../cctz/testdata/zoneinfo/US/Arizona | Bin 328 -> 240 bytes .../cctz/testdata/zoneinfo/US/Central | Bin 3576 -> 1754 bytes .../cctz/testdata/zoneinfo/US/East-Indiana | Bin 1666 -> 531 bytes .../cctz/testdata/zoneinfo/US/Eastern | Bin 3536 -> 1744 bytes .../internal/cctz/testdata/zoneinfo/US/Hawaii | Bin 329 -> 221 bytes .../cctz/testdata/zoneinfo/US/Indiana-Starke | Bin 2428 -> 1016 bytes .../cctz/testdata/zoneinfo/US/Michigan | Bin 2230 -> 899 bytes .../cctz/testdata/zoneinfo/US/Mountain | Bin 2444 -> 1042 bytes .../cctz/testdata/zoneinfo/US/Pacific | Bin 2836 -> 1294 bytes .../internal/cctz/testdata/zoneinfo/US/Samoa | Bin 175 -> 146 bytes .../time/internal/cctz/testdata/zoneinfo/UTC | Bin 114 -> 111 bytes .../internal/cctz/testdata/zoneinfo/Universal | Bin 114 -> 111 bytes .../time/internal/cctz/testdata/zoneinfo/W-SU | Bin 1535 -> 908 bytes .../time/internal/cctz/testdata/zoneinfo/WET | Bin 1905 -> 494 bytes .../time/internal/cctz/testdata/zoneinfo/Zulu | Bin 114 -> 111 bytes .../absl/time/internal/test_util.cc | 1 + third_party/abseil_cpp/absl/time/time.cc | 7 +- third_party/abseil_cpp/absl/time/time.h | 12 +- third_party/abseil_cpp/absl/time/time_test.cc | 56 +- third_party/abseil_cpp/absl/types/BUILD.bazel | 3 +- .../abseil_cpp/absl/types/CMakeLists.txt | 2 +- third_party/abseil_cpp/absl/types/any.h | 6 +- third_party/abseil_cpp/absl/types/compare.h | 6 +- .../abseil_cpp/absl/types/internal/variant.h | 10 +- third_party/abseil_cpp/absl/types/span.h | 22 +- third_party/abseil_cpp/absl/types/variant.h | 13 +- .../abseil_cpp/absl/types/variant_test.cc | 6 +- .../abseil_cpp/absl/utility/BUILD.bazel | 2 +- third_party/abseil_cpp/absl/utility/utility.h | 4 +- third_party/abseil_cpp/ci/cmake_common.sh | 25 + .../abseil_cpp/ci/cmake_install_test.sh | 4 +- .../linux_clang-latest_libcxx_asan_bazel.sh | 9 +- .../ci/linux_clang-latest_libcxx_bazel.sh | 7 +- .../linux_clang-latest_libcxx_tsan_bazel.sh | 9 +- .../ci/linux_clang-latest_libstdcxx_bazel.sh | 10 +- .../abseil_cpp/ci/linux_docker_containers.sh | 8 +- ....sh => linux_gcc-floor_libstdcxx_bazel.sh} | 6 +- .../ci/linux_gcc-latest_libstdcxx_bazel.sh | 10 +- .../ci/linux_gcc-latest_libstdcxx_cmake.sh | 57 +- .../abseil_cpp/ci/linux_gcc_alpine_cmake.sh | 54 +- .../abseil_cpp/ci/macos_xcode_cmake.sh | 42 +- third_party/abseil_cpp/conanfile.py | 0 854 files changed, 11260 insertions(+), 5296 deletions(-) create mode 100644 third_party/abseil_cpp/.github/ISSUE_TEMPLATE/00-bug_report.md create mode 100644 third_party/abseil_cpp/.github/ISSUE_TEMPLATE/90-question.md create mode 100644 third_party/abseil_cpp/.github/ISSUE_TEMPLATE/config.yml delete mode 100644 third_party/abseil_cpp/absl/base/dynamic_annotations.cc delete mode 100644 third_party/abseil_cpp/absl/compiler_config_setting.bzl create mode 100644 third_party/abseil_cpp/absl/flags/internal/commandlineflag.cc create mode 100644 third_party/abseil_cpp/absl/random/internal/uniform_helper_test.cc create mode 100644 third_party/abseil_cpp/absl/status/internal/status_internal.h create mode 100644 third_party/abseil_cpp/absl/status/internal/statusor_internal.h create mode 100644 third_party/abseil_cpp/absl/strings/internal/string_constant.h create mode 100644 third_party/abseil_cpp/absl/strings/internal/string_constant_test.cc create mode 100644 third_party/abseil_cpp/absl/synchronization/internal/futex.h delete mode 100644 third_party/abseil_cpp/absl/synchronization/internal/mutex_nonprod.cc delete mode 100644 third_party/abseil_cpp/absl/synchronization/internal/mutex_nonprod.inc create mode 100644 third_party/abseil_cpp/ci/cmake_common.sh rename third_party/abseil_cpp/ci/{linux_gcc-4.9_libstdcxx_bazel.sh => linux_gcc-floor_libstdcxx_bazel.sh} (96%) mode change 100644 => 100755 third_party/abseil_cpp/conanfile.py diff --git a/third_party/abseil_cpp/.github/ISSUE_TEMPLATE/00-bug_report.md b/third_party/abseil_cpp/.github/ISSUE_TEMPLATE/00-bug_report.md new file mode 100644 index 000000000..1edf3de0b --- /dev/null +++ b/third_party/abseil_cpp/.github/ISSUE_TEMPLATE/00-bug_report.md @@ -0,0 +1,41 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: 'bug' +assignees: '' +--- + +**Describe the bug** + +Include a clear and concise description of what the problem is, including what +you expected to happen, and what actually happened. + +**Steps to reproduce the bug** + +It's important that we are able to reproduce the problem that you are +experiencing. Please provide all code and relevant steps to reproduce the +problem, including your `BUILD`/`CMakeLists.txt` file and build commands. Links +to a GitHub branch or [godbolt.org](https://godbolt.org/) that demonstrate the +problem are also helpful. + +**What version of Abseil are you using?** + +**What operating system and version are you using** + +If you are using a Linux distribution please include the name and version of the +distribution as well. + +**What compiler and version are you using?** + +Please include the output of `gcc -v` or `clang -v`, or the equivalent for your +compiler. + +**What build system are you using?** + +Please include the output of `bazel --version` or `cmake --version`, or the +equivalent for your build system. + +**Additional context** + +Add any other context about the problem here. diff --git a/third_party/abseil_cpp/.github/ISSUE_TEMPLATE/90-question.md b/third_party/abseil_cpp/.github/ISSUE_TEMPLATE/90-question.md new file mode 100644 index 000000000..84cf34918 --- /dev/null +++ b/third_party/abseil_cpp/.github/ISSUE_TEMPLATE/90-question.md @@ -0,0 +1,7 @@ +--- +name: Question +about: Have a question? Ask us anything! :-) +title: '' +labels: 'question' +assignees: '' +--- diff --git a/third_party/abseil_cpp/.github/ISSUE_TEMPLATE/config.yml b/third_party/abseil_cpp/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 000000000..9794ae1db --- /dev/null +++ b/third_party/abseil_cpp/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1 @@ +blank_issues_enables: true diff --git a/third_party/abseil_cpp/CMake/AbseilDll.cmake b/third_party/abseil_cpp/CMake/AbseilDll.cmake index e25174a3b..e0ff2492e 100644 --- a/third_party/abseil_cpp/CMake/AbseilDll.cmake +++ b/third_party/abseil_cpp/CMake/AbseilDll.cmake @@ -8,7 +8,6 @@ set(ABSL_INTERNAL_DLL_FILES "base/casts.h" "base/config.h" "base/const_init.h" - "base/dynamic_annotations.cc" "base/dynamic_annotations.h" "base/internal/atomic_hook.h" "base/internal/bits.h" @@ -139,7 +138,6 @@ set(ABSL_INTERNAL_DLL_FILES "random/internal/distribution_caller.h" "random/internal/fastmath.h" "random/internal/fast_uniform_bits.h" - "random/internal/gaussian_distribution_gentables.cc" "random/internal/generate_real.h" "random/internal/iostream_state_saver.h" "random/internal/mock_helpers.h" @@ -176,8 +174,12 @@ set(ABSL_INTERNAL_DLL_FILES "random/uniform_int_distribution.h" "random/uniform_real_distribution.h" "random/zipf_distribution.h" + "status/internal/status_internal.h" + "status/internal/statusor_internal.h" "status/status.h" "status/status.cc" + "status/statusor.h" + "status/statusor.cc" "status/status_payload_printer.h" "status/status_payload_printer.cc" "strings/ascii.cc" @@ -194,6 +196,7 @@ set(ABSL_INTERNAL_DLL_FILES "strings/internal/charconv_parse.cc" "strings/internal/charconv_parse.h" "strings/internal/stl_type_traits.h" + "strings/internal/string_constant.h" "strings/match.cc" "strings/match.h" "strings/numbers.cc" @@ -248,6 +251,7 @@ set(ABSL_INTERNAL_DLL_FILES "synchronization/notification.h" "synchronization/internal/create_thread_identity.cc" "synchronization/internal/create_thread_identity.h" + "synchronization/internal/futex.h" "synchronization/internal/graphcycles.cc" "synchronization/internal/graphcycles.h" "synchronization/internal/kernel_timeout.h" diff --git a/third_party/abseil_cpp/CMake/AbseilHelpers.cmake b/third_party/abseil_cpp/CMake/AbseilHelpers.cmake index 86ff9eba2..e88507de5 100644 --- a/third_party/abseil_cpp/CMake/AbseilHelpers.cmake +++ b/third_party/abseil_cpp/CMake/AbseilHelpers.cmake @@ -23,7 +23,9 @@ include(AbseilInstallDirs) # project that sets # set_property(GLOBAL PROPERTY USE_FOLDERS ON) # For example, Visual Studio supports folders. -set(ABSL_IDE_FOLDER Abseil) +if(NOT DEFINED ABSL_IDE_FOLDER) + set(ABSL_IDE_FOLDER Abseil) +endif() # absl_cc_library() # @@ -120,7 +122,11 @@ function(absl_cc_library) # 4. "static" -- This target does not depend on the DLL and should be built # statically. if (${ABSL_BUILD_DLL}) - absl_internal_dll_contains(TARGET ${_NAME} OUTPUT _in_dll) + if(ABSL_ENABLE_INSTALL) + absl_internal_dll_contains(TARGET ${_NAME} OUTPUT _in_dll) + else() + absl_internal_dll_contains(TARGET ${ABSL_CC_LIB_NAME} OUTPUT _in_dll) + endif() if (${_in_dll}) # This target should be replaced by the DLL set(_build_type "dll") @@ -135,6 +141,47 @@ function(absl_cc_library) set(_build_type "static") endif() + # Generate a pkg-config file for every library: + if(${_build_type} STREQUAL "static" OR ${_build_type} STREQUAL "shared") + if(NOT ABSL_CC_LIB_TESTONLY) + if(absl_VERSION) + set(PC_VERSION "${absl_VERSION}") + else() + set(PC_VERSION "head") + endif() + foreach(dep ${ABSL_CC_LIB_DEPS}) + if(${dep} MATCHES "^absl::(.*)") + set(PC_DEPS "${PC_DEPS} absl_${CMAKE_MATCH_1} = ${PC_VERSION}") + endif() + endforeach() + foreach(cflag ${ABSL_CC_LIB_COPTS}) + if(${cflag} MATCHES "^(-Wno|/wd)") + # These flags are needed to suppress warnings that might fire in our headers. + set(PC_CFLAGS "${PC_CFLAGS} ${cflag}") + elseif(${cflag} MATCHES "^(-W|/w[1234eo])") + # Don't impose our warnings on others. + else() + set(PC_CFLAGS "${PC_CFLAGS} ${cflag}") + endif() + endforeach() + FILE(GENERATE OUTPUT "${CMAKE_BINARY_DIR}/lib/pkgconfig/absl_${_NAME}.pc" CONTENT "\ +prefix=${CMAKE_INSTALL_PREFIX}\n\ +exec_prefix=\${prefix}\n\ +libdir=\${prefix}/lib\n\ +includedir=\${prefix}/include\n\ +\n\ +Name: absl_${_NAME}\n\ +Description: Abseil ${_NAME} library\n\ +URL: https://abseil.io/\n\ +Version: ${PC_VERSION}\n\ +Requires.private:${PC_DEPS}\n\ +Libs: -L\${libdir} $ $<$>:-labsl_${_NAME}>\n\ +Cflags: -I\${includedir}${PC_CFLAGS}\n") + INSTALL(FILES "${CMAKE_BINARY_DIR}/lib/pkgconfig/absl_${_NAME}.pc" + DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig") + endif() + endif() + if(NOT ABSL_CC_LIB_IS_INTERFACE) if(${_build_type} STREQUAL "dll_dep") # This target depends on the DLL. When adding dependencies to this target, @@ -213,6 +260,8 @@ function(absl_cc_library) if(ABSL_ENABLE_INSTALL) set_target_properties(${_NAME} PROPERTIES OUTPUT_NAME "absl_${_NAME}" + # TODO(b/173696973): Figure out how to set SOVERSION for LTS releases. + SOVERSION 0 ) endif() else() diff --git a/third_party/abseil_cpp/CMake/AbseilInstallDirs.cmake b/third_party/abseil_cpp/CMake/AbseilInstallDirs.cmake index b67272f83..6fc914b60 100644 --- a/third_party/abseil_cpp/CMake/AbseilInstallDirs.cmake +++ b/third_party/abseil_cpp/CMake/AbseilInstallDirs.cmake @@ -10,11 +10,11 @@ if(absl_VERSION) set(ABSL_SUBDIR "${PROJECT_NAME}_${PROJECT_VERSION}") set(ABSL_INSTALL_BINDIR "${CMAKE_INSTALL_BINDIR}/${ABSL_SUBDIR}") set(ABSL_INSTALL_CONFIGDIR "${CMAKE_INSTALL_LIBDIR}/cmake/${ABSL_SUBDIR}") - set(ABSL_INSTALL_INCLUDEDIR "${CMAKE_INSTALL_INCLUDEDIR}/{ABSL_SUBDIR}") + set(ABSL_INSTALL_INCLUDEDIR "${CMAKE_INSTALL_INCLUDEDIR}/${ABSL_SUBDIR}") set(ABSL_INSTALL_LIBDIR "${CMAKE_INSTALL_LIBDIR}/${ABSL_SUBDIR}") else() set(ABSL_INSTALL_BINDIR "${CMAKE_INSTALL_BINDIR}") set(ABSL_INSTALL_CONFIGDIR "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") set(ABSL_INSTALL_INCLUDEDIR "${CMAKE_INSTALL_INCLUDEDIR}") set(ABSL_INSTALL_LIBDIR "${CMAKE_INSTALL_LIBDIR}") -endif() \ No newline at end of file +endif() diff --git a/third_party/abseil_cpp/CMake/Googletest/CMakeLists.txt.in b/third_party/abseil_cpp/CMake/Googletest/CMakeLists.txt.in index 994dac0bf..5769e3a97 100644 --- a/third_party/abseil_cpp/CMake/Googletest/CMakeLists.txt.in +++ b/third_party/abseil_cpp/CMake/Googletest/CMakeLists.txt.in @@ -3,24 +3,12 @@ cmake_minimum_required(VERSION 2.8.2) project(googletest-external NONE) include(ExternalProject) -if(${ABSL_USE_GOOGLETEST_HEAD}) - ExternalProject_Add(googletest - GIT_REPOSITORY https://github.com/google/googletest.git - GIT_TAG master - SOURCE_DIR "${absl_gtest_src_dir}" - BINARY_DIR "${absl_gtest_build_dir}" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" - ) -else() - ExternalProject_Add(googletest - SOURCE_DIR "${absl_gtest_src_dir}" - BINARY_DIR "${absl_gtest_build_dir}" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" - ) -endif() \ No newline at end of file +ExternalProject_Add(googletest + URL "${absl_gtest_download_url}" # May be empty + SOURCE_DIR "${absl_gtest_src_dir}" + BINARY_DIR "${absl_gtest_build_dir}" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "" +) diff --git a/third_party/abseil_cpp/CMake/install_test_project/test.sh b/third_party/abseil_cpp/CMake/install_test_project/test.sh index 99989b031..ddc7726b6 100755 --- a/third_party/abseil_cpp/CMake/install_test_project/test.sh +++ b/third_party/abseil_cpp/CMake/install_test_project/test.sh @@ -118,6 +118,24 @@ if ! grep absl::strings "${libdir}/cmake/${absl_subdir}/abslTargets.cmake"; then exit 1 fi +pushd "${HOME}" +cat > hello-abseil.cc << EOF +#include + +#include "absl/strings/str_format.h" + +int main(int argc, char **argv) { + absl::PrintF("Hello Abseil!\n"); + return EXIT_SUCCESS; +} +EOF +export PKG_CONFIG_PATH="${install_dir}/${libdir}/pkgconfig" +pc_args=($(pkg-config --cflags --libs --static absl_str_format)) +g++ -static -o hello-abseil hello-abseil.cc "${pc_args[@]}" +hello="$(./hello-abseil)" +[[ "${hello}" == "Hello Abseil!" ]] +popd + uninstall_absl popd diff --git a/third_party/abseil_cpp/CMakeLists.txt b/third_party/abseil_cpp/CMakeLists.txt index d6f24a572..2120cb009 100644 --- a/third_party/abseil_cpp/CMakeLists.txt +++ b/third_party/abseil_cpp/CMakeLists.txt @@ -22,13 +22,24 @@ cmake_minimum_required(VERSION 3.5) # Compiler id for Apple Clang is now AppleClang. -cmake_policy(SET CMP0025 NEW) +if (POLICY CMP0025) + cmake_policy(SET CMP0025 NEW) +endif (POLICY CMP0025) # if command can use IN_LIST -cmake_policy(SET CMP0057 NEW) +if (POLICY CMP0057) + cmake_policy(SET CMP0057 NEW) +endif (POLICY CMP0057) # Project version variables are the empty string if version is unspecified -cmake_policy(SET CMP0048 NEW) +if (POLICY CMP0048) + cmake_policy(SET CMP0048 NEW) +endif (POLICY CMP0048) + +# option() honor variables +if (POLICY CMP0077) + cmake_policy(SET CMP0077 NEW) +endif (POLICY CMP0077) project(absl CXX) @@ -41,9 +52,9 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) # when absl is included as subproject (i.e. using add_subdirectory(abseil-cpp)) # in the source tree of a project that uses it, install rules are disabled. if(NOT "^${CMAKE_SOURCE_DIR}$" STREQUAL "^${PROJECT_SOURCE_DIR}$") - set(ABSL_ENABLE_INSTALL FALSE) + option(ABSL_ENABLE_INSTALL "Enable install rule" OFF) else() - set(ABSL_ENABLE_INSTALL TRUE) + option(ABSL_ENABLE_INSTALL "Enable install rule" ON) endif() list(APPEND CMAKE_MODULE_PATH @@ -87,12 +98,13 @@ find_package(Threads REQUIRED) option(ABSL_USE_EXTERNAL_GOOGLETEST "If ON, Abseil will assume that the targets for GoogleTest are already provided by the including project. This makes sense when Abseil is used with add_subproject." OFF) - option(ABSL_USE_GOOGLETEST_HEAD - "If ON, abseil will download HEAD from googletest at config time." OFF) + "If ON, abseil will download HEAD from GoogleTest at config time." OFF) + +set(ABSL_GOOGLETEST_DOWNLOAD_URL "" CACHE STRING "If set, download GoogleTest from this URL") set(ABSL_LOCAL_GOOGLETEST_DIR "/usr/src/googletest" CACHE PATH - "If ABSL_USE_GOOGLETEST_HEAD is OFF, specifies the directory of a local googletest checkout." + "If ABSL_USE_GOOGLETEST_HEAD is OFF and ABSL_GOOGLETEST_URL is not set, specifies the directory of a local GoogleTest checkout." ) option(ABSL_RUN_TESTS "If ON, Abseil tests will be run." OFF) @@ -101,12 +113,19 @@ if(${ABSL_RUN_TESTS}) # enable CTest. This will set BUILD_TESTING to ON unless otherwise specified # on the command line include(CTest) - enable_testing() ## check targets if (NOT ABSL_USE_EXTERNAL_GOOGLETEST) set(absl_gtest_build_dir ${CMAKE_BINARY_DIR}/googletest-build) - if(${ABSL_USE_GOOGLETEST_HEAD}) + if(ABSL_USE_GOOGLETEST_HEAD AND ABSL_GOOGLETEST_DOWNLOAD_URL) + message(FATAL_ERROR "Do not set both ABSL_USE_GOOGLETEST_HEAD and ABSL_GOOGLETEST_DOWNLOAD_URL") + endif() + if(ABSL_USE_GOOGLETEST_HEAD) + set(absl_gtest_download_url "https://github.com/google/googletest/archive/master.zip") + elseif(ABSL_GOOGLETEST_DOWNLOAD_URL) + set(absl_gtest_download_url ${ABSL_GOOGLETEST_DOWNLOAD_URL}) + endif() + if(absl_gtest_download_url) set(absl_gtest_src_dir ${CMAKE_BINARY_DIR}/googletest-src) else() set(absl_gtest_src_dir ${ABSL_LOCAL_GOOGLETEST_DIR}) diff --git a/third_party/abseil_cpp/WORKSPACE b/third_party/abseil_cpp/WORKSPACE index 1a1da6c5e..ed90d2ba9 100644 --- a/third_party/abseil_cpp/WORKSPACE +++ b/third_party/abseil_cpp/WORKSPACE @@ -20,9 +20,10 @@ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") # GoogleTest/GoogleMock framework. Used by most unit-tests. http_archive( name = "com_google_googletest", - urls = ["https://github.com/google/googletest/archive/011959aafddcd30611003de96cfd8d7a7685c700.zip"], # 2020-05-14T00:36:05Z - strip_prefix = "googletest-011959aafddcd30611003de96cfd8d7a7685c700", - sha256 = "6a5d7d63cd6e0ad2a7130471105a3b83799a7a2b14ef7ec8d742b54f01a4833c", + # Keep this URL in sync with ABSL_GOOGLETEST_COMMIT in ci/cmake_common.sh. + urls = ["https://github.com/google/googletest/archive/8567b09290fe402cf01923e2131c5635b8ed851b.zip"], # 2020-06-12T22:24:28Z + strip_prefix = "googletest-8567b09290fe402cf01923e2131c5635b8ed851b", + sha256 = "9a8a166eb6a56c7b3d7b19dc2c946fe4778fd6f21c7a12368ad3b836d8f1be48", ) # Google benchmark. @@ -39,7 +40,6 @@ http_archive( sha256 = "9a446e9dd9c1bb180c86977a8dc1e9e659550ae732ae58bd2e8fd51e15b2c91d", strip_prefix = "rules_cc-262ebec3c2296296526740db4aefce68c80de7fa", urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/rules_cc/archive/262ebec3c2296296526740db4aefce68c80de7fa.zip", "https://github.com/bazelbuild/rules_cc/archive/262ebec3c2296296526740db4aefce68c80de7fa.zip", ], ) diff --git a/third_party/abseil_cpp/absl/BUILD.bazel b/third_party/abseil_cpp/absl/BUILD.bazel index f7fc2a7f1..6da20c49d 100644 --- a/third_party/abseil_cpp/absl/BUILD.bazel +++ b/third_party/abseil_cpp/absl/BUILD.bazel @@ -12,19 +12,16 @@ # 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( - ":compiler_config_setting.bzl", - "create_llvm_config", -) package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) -create_llvm_config( - name = "llvm_compiler", +config_setting( + name = "clang_compiler", + flag_values = { + "@bazel_tools//tools/cpp:compiler": "clang", + }, visibility = [":__subpackages__"], ) @@ -58,3 +55,11 @@ config_setting( }, visibility = [":__subpackages__"], ) + +config_setting( + name = "wasm", + values = { + "cpu": "wasm32", + }, + visibility = [":__subpackages__"], +) diff --git a/third_party/abseil_cpp/absl/abseil.podspec.gen.py b/third_party/abseil_cpp/absl/abseil.podspec.gen.py index 6aefb794d..63752980d 100755 --- a/third_party/abseil_cpp/absl/abseil.podspec.gen.py +++ b/third_party/abseil_cpp/absl/abseil.podspec.gen.py @@ -40,8 +40,8 @@ Pod::Spec.new do |s| 'USE_HEADERMAP' => 'NO', 'ALWAYS_SEARCH_USER_PATHS' => 'NO', } - s.ios.deployment_target = '7.0' - s.osx.deployment_target = '10.9' + s.ios.deployment_target = '9.0' + s.osx.deployment_target = '10.10' s.tvos.deployment_target = '9.0' s.watchos.deployment_target = '2.0' """ diff --git a/third_party/abseil_cpp/absl/algorithm/BUILD.bazel b/third_party/abseil_cpp/absl/algorithm/BUILD.bazel index 229cd713a..a3002b7dc 100644 --- a/third_party/abseil_cpp/absl/algorithm/BUILD.bazel +++ b/third_party/abseil_cpp/absl/algorithm/BUILD.bazel @@ -24,7 +24,7 @@ load( package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) cc_library( name = "algorithm", diff --git a/third_party/abseil_cpp/absl/algorithm/container.h b/third_party/abseil_cpp/absl/algorithm/container.h index 2457d78bc..6398438f0 100644 --- a/third_party/abseil_cpp/absl/algorithm/container.h +++ b/third_party/abseil_cpp/absl/algorithm/container.h @@ -90,10 +90,10 @@ using ContainerPointerType = // lookup of std::begin and std::end, i.e. // using std::begin; // using std::end; -// std::foo(begin(c), end(c); +// std::foo(begin(c), end(c)); // becomes // std::foo(container_algorithm_internal::begin(c), -// container_algorithm_internal::end(c)); +// container_algorithm_internal::end(c)); // These are meant for internal use only. template @@ -188,7 +188,7 @@ bool c_any_of(const C& c, Pred&& pred) { // c_none_of() // // Container-based version of the `std::none_of()` function to -// test if no elements in a container fulfil a condition. +// test if no elements in a container fulfill a condition. template bool c_none_of(const C& c, Pred&& pred) { return std::none_of(container_algorithm_internal::c_begin(c), @@ -340,24 +340,45 @@ container_algorithm_internal::ContainerDifferenceType c_count_if( // c_mismatch() // // Container-based version of the `std::mismatch()` function to -// return the first element where two ordered containers differ. +// return the first element where two ordered containers differ. Applies `==` to +// the first N elements of `c1` and `c2`, where N = min(size(c1), size(c2)). template container_algorithm_internal::ContainerIterPairType c_mismatch(C1& c1, C2& c2) { - return std::mismatch(container_algorithm_internal::c_begin(c1), - container_algorithm_internal::c_end(c1), - container_algorithm_internal::c_begin(c2)); + auto first1 = container_algorithm_internal::c_begin(c1); + auto last1 = container_algorithm_internal::c_end(c1); + auto first2 = container_algorithm_internal::c_begin(c2); + auto last2 = container_algorithm_internal::c_end(c2); + + for (; first1 != last1 && first2 != last2; ++first1, (void)++first2) { + // Negates equality because Cpp17EqualityComparable doesn't require clients + // to overload both `operator==` and `operator!=`. + if (!(*first1 == *first2)) { + break; + } + } + + return std::make_pair(first1, first2); } // Overload of c_mismatch() for using a predicate evaluation other than `==` as -// the function's test condition. +// the function's test condition. Applies `pred`to the first N elements of `c1` +// and `c2`, where N = min(size(c1), size(c2)). template container_algorithm_internal::ContainerIterPairType -c_mismatch(C1& c1, C2& c2, BinaryPredicate&& pred) { - return std::mismatch(container_algorithm_internal::c_begin(c1), - container_algorithm_internal::c_end(c1), - container_algorithm_internal::c_begin(c2), - std::forward(pred)); +c_mismatch(C1& c1, C2& c2, BinaryPredicate pred) { + auto first1 = container_algorithm_internal::c_begin(c1); + auto last1 = container_algorithm_internal::c_end(c1); + auto first2 = container_algorithm_internal::c_begin(c2); + auto last2 = container_algorithm_internal::c_end(c2); + + for (; first1 != last1 && first2 != last2; ++first1, (void)++first2) { + if (!pred(*first1, *first2)) { + break; + } + } + + return std::make_pair(first1, first2); } // c_equal() @@ -539,12 +560,20 @@ BidirectionalIterator c_move_backward(C&& src, BidirectionalIterator dest) { // c_swap_ranges() // // Container-based version of the `std::swap_ranges()` function to -// swap a container's elements with another container's elements. +// swap a container's elements with another container's elements. Swaps the +// first N elements of `c1` and `c2`, where N = min(size(c1), size(c2)). template container_algorithm_internal::ContainerIter c_swap_ranges(C1& c1, C2& c2) { - return std::swap_ranges(container_algorithm_internal::c_begin(c1), - container_algorithm_internal::c_end(c1), - container_algorithm_internal::c_begin(c2)); + auto first1 = container_algorithm_internal::c_begin(c1); + auto last1 = container_algorithm_internal::c_end(c1); + auto first2 = container_algorithm_internal::c_begin(c2); + auto last2 = container_algorithm_internal::c_end(c2); + + using std::swap; + for (; first1 != last1 && first2 != last2; ++first1, (void)++first2) { + swap(*first1, *first2); + } + return first2; } // c_transform() @@ -562,16 +591,23 @@ OutputIterator c_transform(const InputSequence& input, OutputIterator output, } // Overload of c_transform() for performing a transformation using a binary -// predicate. +// predicate. Applies `binary_op` to the first N elements of `c1` and `c2`, +// where N = min(size(c1), size(c2)). template OutputIterator c_transform(const InputSequence1& input1, const InputSequence2& input2, OutputIterator output, BinaryOp&& binary_op) { - return std::transform(container_algorithm_internal::c_begin(input1), - container_algorithm_internal::c_end(input1), - container_algorithm_internal::c_begin(input2), output, - std::forward(binary_op)); + auto first1 = container_algorithm_internal::c_begin(input1); + auto last1 = container_algorithm_internal::c_end(input1); + auto first2 = container_algorithm_internal::c_begin(input2); + auto last2 = container_algorithm_internal::c_end(input2); + for (; first1 != last1 && first2 != last2; + ++first1, (void)++first2, ++output) { + *output = binary_op(*first1, *first2); + } + + return output; } // c_replace() diff --git a/third_party/abseil_cpp/absl/algorithm/container_test.cc b/third_party/abseil_cpp/absl/algorithm/container_test.cc index 0a4abe946..605afc804 100644 --- a/third_party/abseil_cpp/absl/algorithm/container_test.cc +++ b/third_party/abseil_cpp/absl/algorithm/container_test.cc @@ -57,9 +57,7 @@ class NonMutatingTest : public testing::Test { }; struct AccumulateCalls { - void operator()(int value) { - calls.push_back(value); - } + void operator()(int value) { calls.push_back(value); } std::vector calls; }; @@ -68,7 +66,6 @@ bool BinPredicate(int v1, int v2) { return v1 < v2; } bool Equals(int v1, int v2) { return v1 == v2; } bool IsOdd(int x) { return x % 2 != 0; } - TEST_F(NonMutatingTest, Distance) { EXPECT_EQ(container_.size(), absl::c_distance(container_)); EXPECT_EQ(sequence_.size(), absl::c_distance(sequence_)); @@ -151,13 +148,90 @@ TEST_F(NonMutatingTest, CountIf) { } TEST_F(NonMutatingTest, Mismatch) { - absl::c_mismatch(container_, sequence_); - absl::c_mismatch(sequence_, container_); + // Testing necessary as absl::c_mismatch executes logic. + { + auto result = absl::c_mismatch(vector_, sequence_); + EXPECT_EQ(result.first, vector_.end()); + EXPECT_EQ(result.second, sequence_.end()); + } + { + auto result = absl::c_mismatch(sequence_, vector_); + EXPECT_EQ(result.first, sequence_.end()); + EXPECT_EQ(result.second, vector_.end()); + } + + sequence_.back() = 5; + { + auto result = absl::c_mismatch(vector_, sequence_); + EXPECT_EQ(result.first, std::prev(vector_.end())); + EXPECT_EQ(result.second, std::prev(sequence_.end())); + } + { + auto result = absl::c_mismatch(sequence_, vector_); + EXPECT_EQ(result.first, std::prev(sequence_.end())); + EXPECT_EQ(result.second, std::prev(vector_.end())); + } + + sequence_.pop_back(); + { + auto result = absl::c_mismatch(vector_, sequence_); + EXPECT_EQ(result.first, std::prev(vector_.end())); + EXPECT_EQ(result.second, sequence_.end()); + } + { + auto result = absl::c_mismatch(sequence_, vector_); + EXPECT_EQ(result.first, sequence_.end()); + EXPECT_EQ(result.second, std::prev(vector_.end())); + } + { + struct NoNotEquals { + constexpr bool operator==(NoNotEquals) const { return true; } + constexpr bool operator!=(NoNotEquals) const = delete; + }; + std::vector first; + std::list second; + + // Check this still compiles. + absl::c_mismatch(first, second); + } } TEST_F(NonMutatingTest, MismatchWithPredicate) { - absl::c_mismatch(container_, sequence_, BinPredicate); - absl::c_mismatch(sequence_, container_, BinPredicate); + // Testing necessary as absl::c_mismatch executes logic. + { + auto result = absl::c_mismatch(vector_, sequence_, BinPredicate); + EXPECT_EQ(result.first, vector_.begin()); + EXPECT_EQ(result.second, sequence_.begin()); + } + { + auto result = absl::c_mismatch(sequence_, vector_, BinPredicate); + EXPECT_EQ(result.first, sequence_.begin()); + EXPECT_EQ(result.second, vector_.begin()); + } + + sequence_.front() = 0; + { + auto result = absl::c_mismatch(vector_, sequence_, BinPredicate); + EXPECT_EQ(result.first, vector_.begin()); + EXPECT_EQ(result.second, sequence_.begin()); + } + { + auto result = absl::c_mismatch(sequence_, vector_, BinPredicate); + EXPECT_EQ(result.first, std::next(sequence_.begin())); + EXPECT_EQ(result.second, std::next(vector_.begin())); + } + + sequence_.clear(); + { + auto result = absl::c_mismatch(vector_, sequence_, BinPredicate); + EXPECT_EQ(result.first, vector_.begin()); + EXPECT_EQ(result.second, sequence_.end()); + } + { + auto result = absl::c_mismatch(sequence_, vector_, BinPredicate); + EXPECT_EQ(result.first, sequence_.end()); + EXPECT_EQ(result.second, vector_.begin()); + } } TEST_F(NonMutatingTest, Equal) { @@ -519,11 +593,9 @@ TEST_F(SortingTest, IsSortedUntil) { TEST_F(SortingTest, NthElement) { std::vector unsorted = {2, 4, 1, 3}; absl::c_nth_element(unsorted, unsorted.begin() + 2); - EXPECT_THAT(unsorted, - ElementsAre(Lt(3), Lt(3), 3, Gt(3))); + EXPECT_THAT(unsorted, ElementsAre(Lt(3), Lt(3), 3, Gt(3))); absl::c_nth_element(unsorted, unsorted.begin() + 2, std::greater()); - EXPECT_THAT(unsorted, - ElementsAre(Gt(2), Gt(2), 2, Lt(2))); + EXPECT_THAT(unsorted, ElementsAre(Gt(2), Gt(2), 2, Lt(2))); } TEST(MutatingTest, IsPartitioned) { @@ -676,6 +748,15 @@ TEST(MutatingTest, SwapRanges) { absl::c_swap_ranges(odds, evens); EXPECT_THAT(odds, ElementsAre(1, 3, 5)); EXPECT_THAT(evens, ElementsAre(2, 4, 6)); + + odds.pop_back(); + absl::c_swap_ranges(odds, evens); + EXPECT_THAT(odds, ElementsAre(2, 4)); + EXPECT_THAT(evens, ElementsAre(1, 3, 6)); + + absl::c_swap_ranges(evens, odds); + EXPECT_THAT(odds, ElementsAre(1, 3)); + EXPECT_THAT(evens, ElementsAre(2, 4, 6)); } TEST_F(NonMutatingTest, Transform) { @@ -690,6 +771,20 @@ TEST_F(NonMutatingTest, Transform) { EXPECT_EQ(std::vector({1, 5, 4}), z); *end = 7; EXPECT_EQ(std::vector({1, 5, 4, 7}), z); + + z.clear(); + y.pop_back(); + end = absl::c_transform(x, y, std::back_inserter(z), std::plus()); + EXPECT_EQ(std::vector({1, 5}), z); + *end = 7; + EXPECT_EQ(std::vector({1, 5, 7}), z); + + z.clear(); + std::swap(x, y); + end = absl::c_transform(x, y, std::back_inserter(z), std::plus()); + EXPECT_EQ(std::vector({1, 5}), z); + *end = 7; + EXPECT_EQ(std::vector({1, 5, 7}), z); } TEST(MutatingTest, Replace) { @@ -755,10 +850,9 @@ MATCHER_P2(IsElement, key, value, "") { TEST(MutatingTest, StableSort) { std::vector test_vector = {{1, 1}, {2, 1}, {2, 0}, {1, 0}, {2, 2}}; absl::c_stable_sort(test_vector); - EXPECT_THAT( - test_vector, - ElementsAre(IsElement(1, 1), IsElement(1, 0), IsElement(2, 1), - IsElement(2, 0), IsElement(2, 2))); + EXPECT_THAT(test_vector, + ElementsAre(IsElement(1, 1), IsElement(1, 0), IsElement(2, 1), + IsElement(2, 0), IsElement(2, 2))); } TEST(MutatingTest, StableSortWithPredicate) { @@ -766,10 +860,9 @@ TEST(MutatingTest, StableSortWithPredicate) { absl::c_stable_sort(test_vector, [](const Element& e1, const Element& e2) { return e2 < e1; }); - EXPECT_THAT( - test_vector, - ElementsAre(IsElement(2, 1), IsElement(2, 0), IsElement(2, 2), - IsElement(1, 1), IsElement(1, 0))); + EXPECT_THAT(test_vector, + ElementsAre(IsElement(2, 1), IsElement(2, 0), IsElement(2, 2), + IsElement(1, 1), IsElement(1, 0))); } TEST(MutatingTest, ReplaceCopyIf) { diff --git a/third_party/abseil_cpp/absl/base/BUILD.bazel b/third_party/abseil_cpp/absl/base/BUILD.bazel index 745a598f1..9d96abeb3 100644 --- a/third_party/abseil_cpp/absl/base/BUILD.bazel +++ b/third_party/abseil_cpp/absl/base/BUILD.bazel @@ -24,7 +24,7 @@ load( package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) cc_library( name = "atomic_hook", @@ -116,7 +116,6 @@ cc_library( cc_library( name = "dynamic_annotations", srcs = [ - "dynamic_annotations.cc", "internal/dynamic_annotations.h", ], hdrs = [ @@ -126,6 +125,7 @@ cc_library( linkopts = ABSL_DEFAULT_LINKOPTS, deps = [ ":config", + ":core_headers", ], ) @@ -161,6 +161,7 @@ cc_library( copts = ABSL_DEFAULT_COPTS, linkopts = select({ "//absl:windows": [], + "//absl:wasm": [], "//conditions:default": ["-pthread"], }) + ABSL_DEFAULT_LINKOPTS, visibility = [ @@ -222,6 +223,7 @@ cc_library( "//absl:windows": [ "-DEFAULTLIB:advapi32.lib", ], + "//absl:wasm": [], "//conditions:default": ["-pthread"], }) + ABSL_DEFAULT_LINKOPTS, deps = [ @@ -413,6 +415,7 @@ cc_library( deps = [ ":base", ":base_internal", + ":config", ":core_headers", "//absl/synchronization", "@com_google_googletest//:gtest", @@ -429,6 +432,7 @@ cc_test( deps = [ ":base", ":base_internal", + ":config", ":core_headers", "//absl/synchronization", "@com_google_googletest//:gtest_main", diff --git a/third_party/abseil_cpp/absl/base/CMakeLists.txt b/third_party/abseil_cpp/absl/base/CMakeLists.txt index 62486f9d0..9ff5aa243 100644 --- a/third_party/abseil_cpp/absl/base/CMakeLists.txt +++ b/third_party/abseil_cpp/absl/base/CMakeLists.txt @@ -105,7 +105,6 @@ absl_cc_library( HDRS "dynamic_annotations.h" SRCS - "dynamic_annotations.cc" "internal/dynamic_annotations.h" COPTS ${ABSL_DEFAULT_COPTS} @@ -385,6 +384,7 @@ absl_cc_library( ${ABSL_TEST_COPTS} DEPS absl::base + absl::config absl::base_internal absl::core_headers absl::synchronization @@ -403,6 +403,7 @@ absl_cc_test( DEPS absl::base absl::base_internal + absl::config absl::core_headers absl::synchronization gtest_main diff --git a/third_party/abseil_cpp/absl/base/attributes.h b/third_party/abseil_cpp/absl/base/attributes.h index c4fd81b00..f1d3cfe4d 100644 --- a/third_party/abseil_cpp/absl/base/attributes.h +++ b/third_party/abseil_cpp/absl/base/attributes.h @@ -32,34 +32,12 @@ // of them are not supported in older version of Clang. Thus, we check // `__has_attribute()` first. If the check fails, we check if we are on GCC and // assume the attribute exists on GCC (which is verified on GCC 4.7). -// -// ----------------------------------------------------------------------------- -// Sanitizer Attributes -// ----------------------------------------------------------------------------- -// -// Sanitizer-related attributes are not "defined" in this file (and indeed -// are not defined as such in any file). To utilize the following -// sanitizer-related attributes within your builds, define the following macros -// within your build using a `-D` flag, along with the given value for -// `-fsanitize`: -// -// * `ADDRESS_SANITIZER` + `-fsanitize=address` (Clang, GCC 4.8) -// * `MEMORY_SANITIZER` + `-fsanitize=memory` (Clang-only) -// * `THREAD_SANITIZER` + `-fsanitize=thread` (Clang, GCC 4.8+) -// * `UNDEFINED_BEHAVIOR_SANITIZER` + `-fsanitize=undefined` (Clang, GCC 4.9+) -// * `CONTROL_FLOW_INTEGRITY` + `-fsanitize=cfi` (Clang-only) -// -// Example: -// -// // Enable branches in the Abseil code that are tagged for ASan: -// $ bazel build --copt=-DADDRESS_SANITIZER --copt=-fsanitize=address -// --linkopt=-fsanitize=address *target* -// -// Since these macro names are only supported by GCC and Clang, we only check -// for `__GNUC__` (GCC or Clang) and the above macros. + #ifndef ABSL_BASE_ATTRIBUTES_H_ #define ABSL_BASE_ATTRIBUTES_H_ +#include "absl/base/config.h" + // ABSL_HAVE_ATTRIBUTE // // A function-like feature checking macro that is a wrapper around @@ -234,7 +212,7 @@ // out of bounds or does other scary things with memory. // NOTE: GCC supports AddressSanitizer(asan) since 4.8. // https://gcc.gnu.org/gcc-4.8/changes.html -#if defined(__GNUC__) +#if ABSL_HAVE_ATTRIBUTE(no_sanitize_address) #define ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address)) #else #define ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS @@ -242,13 +220,13 @@ // ABSL_ATTRIBUTE_NO_SANITIZE_MEMORY // -// Tells the MemorySanitizer to relax the handling of a given function. All -// "Use of uninitialized value" warnings from such functions will be suppressed, -// and all values loaded from memory will be considered fully initialized. -// This attribute is similar to the ADDRESS_SANITIZER attribute above, but deals -// with initialized-ness rather than addressability issues. +// Tells the MemorySanitizer to relax the handling of a given function. All "Use +// of uninitialized value" warnings from such functions will be suppressed, and +// all values loaded from memory will be considered fully initialized. This +// attribute is similar to the ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS attribute +// above, but deals with initialized-ness rather than addressability issues. // NOTE: MemorySanitizer(msan) is supported by Clang but not GCC. -#if defined(__clang__) +#if ABSL_HAVE_ATTRIBUTE(no_sanitize_memory) #define ABSL_ATTRIBUTE_NO_SANITIZE_MEMORY __attribute__((no_sanitize_memory)) #else #define ABSL_ATTRIBUTE_NO_SANITIZE_MEMORY @@ -259,7 +237,7 @@ // Tells the ThreadSanitizer to not instrument a given function. // NOTE: GCC supports ThreadSanitizer(tsan) since 4.8. // https://gcc.gnu.org/gcc-4.8/changes.html -#if defined(__GNUC__) +#if ABSL_HAVE_ATTRIBUTE(no_sanitize_thread) #define ABSL_ATTRIBUTE_NO_SANITIZE_THREAD __attribute__((no_sanitize_thread)) #else #define ABSL_ATTRIBUTE_NO_SANITIZE_THREAD @@ -271,8 +249,10 @@ // where certain behavior (eg. division by zero) is being used intentionally. // NOTE: GCC supports UndefinedBehaviorSanitizer(ubsan) since 4.9. // https://gcc.gnu.org/gcc-4.9/changes.html -#if defined(__GNUC__) && \ - (defined(UNDEFINED_BEHAVIOR_SANITIZER) || defined(ADDRESS_SANITIZER)) +#if ABSL_HAVE_ATTRIBUTE(no_sanitize_undefined) +#define ABSL_ATTRIBUTE_NO_SANITIZE_UNDEFINED \ + __attribute__((no_sanitize_undefined)) +#elif ABSL_HAVE_ATTRIBUTE(no_sanitize) #define ABSL_ATTRIBUTE_NO_SANITIZE_UNDEFINED \ __attribute__((no_sanitize("undefined"))) #else @@ -283,7 +263,7 @@ // // Tells the ControlFlowIntegrity sanitizer to not instrument a given function. // See https://clang.llvm.org/docs/ControlFlowIntegrity.html for details. -#if defined(__GNUC__) && defined(CONTROL_FLOW_INTEGRITY) +#if ABSL_HAVE_ATTRIBUTE(no_sanitize) #define ABSL_ATTRIBUTE_NO_SANITIZE_CFI __attribute__((no_sanitize("cfi"))) #else #define ABSL_ATTRIBUTE_NO_SANITIZE_CFI @@ -293,7 +273,7 @@ // // Tells the SafeStack to not instrument a given function. // See https://clang.llvm.org/docs/SafeStack.html for details. -#if defined(__GNUC__) && defined(SAFESTACK_SANITIZER) +#if ABSL_HAVE_ATTRIBUTE(no_sanitize) #define ABSL_ATTRIBUTE_NO_SANITIZE_SAFESTACK \ __attribute__((no_sanitize("safe-stack"))) #else @@ -594,6 +574,86 @@ #define ABSL_ATTRIBUTE_FUNC_ALIGN(bytes) #endif +// ABSL_FALLTHROUGH_INTENDED +// +// Annotates implicit fall-through between switch labels, allowing a case to +// indicate intentional fallthrough and turn off warnings about any lack of a +// `break` statement. The ABSL_FALLTHROUGH_INTENDED macro should be followed by +// a semicolon and can be used in most places where `break` can, provided that +// no statements exist between it and the next switch label. +// +// Example: +// +// switch (x) { +// case 40: +// case 41: +// if (truth_is_out_there) { +// ++x; +// ABSL_FALLTHROUGH_INTENDED; // Use instead of/along with annotations +// // in comments +// } else { +// return x; +// } +// case 42: +// ... +// +// Notes: when compiled with clang in C++11 mode, the ABSL_FALLTHROUGH_INTENDED +// macro is expanded to the [[clang::fallthrough]] attribute, which is analysed +// when performing switch labels fall-through diagnostic +// (`-Wimplicit-fallthrough`). See clang documentation on language extensions +// for details: +// https://clang.llvm.org/docs/AttributeReference.html#fallthrough-clang-fallthrough +// +// When used with unsupported compilers, the ABSL_FALLTHROUGH_INTENDED macro +// has no effect on diagnostics. In any case this macro has no effect on runtime +// behavior and performance of code. + +#ifdef ABSL_FALLTHROUGH_INTENDED +#error "ABSL_FALLTHROUGH_INTENDED should not be defined." +#endif + +// TODO(zhangxy): Use c++17 standard [[fallthrough]] macro, when supported. +#if defined(__clang__) && defined(__has_warning) +#if __has_feature(cxx_attributes) && __has_warning("-Wimplicit-fallthrough") +#define ABSL_FALLTHROUGH_INTENDED [[clang::fallthrough]] +#endif +#elif defined(__GNUC__) && __GNUC__ >= 7 +#define ABSL_FALLTHROUGH_INTENDED [[gnu::fallthrough]] +#endif + +#ifndef ABSL_FALLTHROUGH_INTENDED +#define ABSL_FALLTHROUGH_INTENDED \ + do { \ + } while (0) +#endif + +// ABSL_DEPRECATED() +// +// Marks a deprecated class, struct, enum, function, method and variable +// declarations. The macro argument is used as a custom diagnostic message (e.g. +// suggestion of a better alternative). +// +// Examples: +// +// class ABSL_DEPRECATED("Use Bar instead") Foo {...}; +// +// ABSL_DEPRECATED("Use Baz() instead") void Bar() {...} +// +// template +// ABSL_DEPRECATED("Use DoThat() instead") +// void DoThis(); +// +// Every usage of a deprecated entity will trigger a warning when compiled with +// clang's `-Wdeprecated-declarations` option. This option is turned off by +// default, but the warnings will be reported by clang-tidy. +#if defined(__clang__) && __cplusplus >= 201103L +#define ABSL_DEPRECATED(message) __attribute__((deprecated(message))) +#endif + +#ifndef ABSL_DEPRECATED +#define ABSL_DEPRECATED(message) +#endif + // ABSL_CONST_INIT // // A variable declaration annotated with the `ABSL_CONST_INIT` attribute will diff --git a/third_party/abseil_cpp/absl/base/call_once.h b/third_party/abseil_cpp/absl/base/call_once.h index bc5ec9370..5b468af85 100644 --- a/third_party/abseil_cpp/absl/base/call_once.h +++ b/third_party/abseil_cpp/absl/base/call_once.h @@ -175,7 +175,7 @@ void CallOnceImpl(std::atomic* control, std::memory_order_relaxed) || base_internal::SpinLockWait(control, ABSL_ARRAYSIZE(trans), trans, scheduling_mode) == kOnceInit) { - base_internal::Invoke(std::forward(fn), + base_internal::invoke(std::forward(fn), std::forward(args)...); // The call to SpinLockWake below is an optimization, because the waiter // in SpinLockWait is waiting with a short timeout. The atomic load/store diff --git a/third_party/abseil_cpp/absl/base/casts.h b/third_party/abseil_cpp/absl/base/casts.h index 322cc1d24..83c691265 100644 --- a/third_party/abseil_cpp/absl/base/casts.h +++ b/third_party/abseil_cpp/absl/base/casts.h @@ -159,16 +159,19 @@ inline Dest bit_cast(const Source& source) { return dest; } -// NOTE: This overload is only picked if the requirements of bit_cast are not -// met. It is therefore UB, but is provided temporarily as previous versions of -// this function template were unchecked. Do not use this in new code. +// NOTE: This overload is only picked if the requirements of bit_cast are +// not met. It is therefore UB, but is provided temporarily as previous +// versions of this function template were unchecked. Do not use this in +// new code. template < typename Dest, typename Source, typename std::enable_if< - !internal_casts::is_bitcastable::value, int>::type = 0> + !internal_casts::is_bitcastable::value, + int>::type = 0> ABSL_DEPRECATED( - "absl::bit_cast type requirements were violated. Update the types being " - "used such that they are the same size and are both TriviallyCopyable.") + "absl::bit_cast type requirements were violated. Update the types " + "being used such that they are the same size and are both " + "TriviallyCopyable.") inline Dest bit_cast(const Source& source) { static_assert(sizeof(Dest) == sizeof(Source), "Source and destination types should have equal sizes."); diff --git a/third_party/abseil_cpp/absl/base/config.h b/third_party/abseil_cpp/absl/base/config.h index f54466dee..3f7f32b9e 100644 --- a/third_party/abseil_cpp/absl/base/config.h +++ b/third_party/abseil_cpp/absl/base/config.h @@ -154,6 +154,12 @@ static_assert(ABSL_INTERNAL_INLINE_NAMESPACE_STR[0] != 'h' || #define ABSL_INTERNAL_HAS_KEYWORD(x) 0 #endif +#ifdef __has_feature +#define ABSL_HAVE_FEATURE(f) __has_feature(f) +#else +#define ABSL_HAVE_FEATURE(f) 0 +#endif + // ABSL_HAVE_TLS is defined to 1 when __thread should be supported. // We assume __thread is supported on Linux when compiled with Clang or compiled // against libstdc++ with _GLIBCXX_HAVE_TLS defined. @@ -226,11 +232,9 @@ static_assert(ABSL_INTERNAL_INLINE_NAMESPACE_STR[0] != 'h' || // * Xcode 9.3 started disallowing `thread_local` for 32-bit iOS simulator // targeting iOS 9.x. // * Xcode 10 moves the deployment target check for iOS < 9.0 to link time -// making __has_feature unreliable there. +// making ABSL_HAVE_FEATURE unreliable there. // -// Otherwise, `__has_feature` is only supported by Clang so it has be inside -// `defined(__APPLE__)` check. -#if __has_feature(cxx_thread_local) && \ +#if ABSL_HAVE_FEATURE(cxx_thread_local) && \ !(TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_9_0) #define ABSL_HAVE_THREAD_LOCAL 1 #endif @@ -312,15 +316,15 @@ static_assert(ABSL_INTERNAL_INLINE_NAMESPACE_STR[0] != 'h' || #if __clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 6) // Clang >= 3.6 -#if __has_feature(cxx_exceptions) +#if ABSL_HAVE_FEATURE(cxx_exceptions) #define ABSL_HAVE_EXCEPTIONS 1 -#endif // __has_feature(cxx_exceptions) +#endif // ABSL_HAVE_FEATURE(cxx_exceptions) #else // Clang < 3.6 // http://releases.llvm.org/3.6.0/tools/clang/docs/ReleaseNotes.html#the-exceptions-macro -#if defined(__EXCEPTIONS) && __has_feature(cxx_exceptions) +#if defined(__EXCEPTIONS) && ABSL_HAVE_FEATURE(cxx_exceptions) #define ABSL_HAVE_EXCEPTIONS 1 -#endif // defined(__EXCEPTIONS) && __has_feature(cxx_exceptions) +#endif // defined(__EXCEPTIONS) && ABSL_HAVE_FEATURE(cxx_exceptions) #endif // __clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 6) // Handle remaining special cases and default to exceptions being supported. @@ -360,7 +364,7 @@ static_assert(ABSL_INTERNAL_INLINE_NAMESPACE_STR[0] != 'h' || #elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || \ defined(__ros__) || defined(__native_client__) || defined(__asmjs__) || \ defined(__wasm__) || defined(__Fuchsia__) || defined(__sun) || \ - defined(__ASYLO__) + defined(__ASYLO__) || defined(__myriad2__) #define ABSL_HAVE_MMAP 1 #endif @@ -470,9 +474,9 @@ static_assert(ABSL_INTERNAL_INLINE_NAMESPACE_STR[0] != 'h' || (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && \ __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 120000) || \ (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && \ - __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 120000) || \ + __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 50000) || \ (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && \ - __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 50000)) + __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 120000)) #define ABSL_INTERNAL_APPLE_CXX17_TYPES_UNAVAILABLE 1 #else #define ABSL_INTERNAL_APPLE_CXX17_TYPES_UNAVAILABLE 0 @@ -661,4 +665,50 @@ static_assert(ABSL_INTERNAL_INLINE_NAMESPACE_STR[0] != 'h' || #define ABSL_DLL #endif // defined(_MSC_VER) +// ABSL_HAVE_MEMORY_SANITIZER +// +// MemorySanitizer (MSan) is a detector of uninitialized reads. It consists of +// a compiler instrumentation module and a run-time library. +#ifdef ABSL_HAVE_MEMORY_SANITIZER +#error "ABSL_HAVE_MEMORY_SANITIZER cannot be directly set." +#elif defined(MEMORY_SANITIZER) +// The MEMORY_SANITIZER macro is deprecated but we will continue to honor it +// for now. +#define ABSL_HAVE_MEMORY_SANITIZER 1 +#elif defined(__SANITIZE_MEMORY__) +#define ABSL_HAVE_MEMORY_SANITIZER 1 +#elif !defined(__native_client__) && ABSL_HAVE_FEATURE(memory_sanitizer) +#define ABSL_HAVE_MEMORY_SANITIZER 1 +#endif + +// ABSL_HAVE_THREAD_SANITIZER +// +// ThreadSanitizer (TSan) is a fast data race detector. +#ifdef ABSL_HAVE_THREAD_SANITIZER +#error "ABSL_HAVE_THREAD_SANITIZER cannot be directly set." +#elif defined(THREAD_SANITIZER) +// The THREAD_SANITIZER macro is deprecated but we will continue to honor it +// for now. +#define ABSL_HAVE_THREAD_SANITIZER 1 +#elif defined(__SANITIZE_THREAD__) +#define ABSL_HAVE_THREAD_SANITIZER 1 +#elif ABSL_HAVE_FEATURE(thread_sanitizer) +#define ABSL_HAVE_THREAD_SANITIZER 1 +#endif + +// ABSL_HAVE_ADDRESS_SANITIZER +// +// AddressSanitizer (ASan) is a fast memory error detector. +#ifdef ABSL_HAVE_ADDRESS_SANITIZER +#error "ABSL_HAVE_ADDRESS_SANITIZER cannot be directly set." +#elif defined(ADDRESS_SANITIZER) +// The ADDRESS_SANITIZER macro is deprecated but we will continue to honor it +// for now. +#define ABSL_HAVE_ADDRESS_SANITIZER 1 +#elif defined(__SANITIZE_ADDRESS__) +#define ABSL_HAVE_ADDRESS_SANITIZER 1 +#elif ABSL_HAVE_FEATURE(address_sanitizer) +#define ABSL_HAVE_ADDRESS_SANITIZER 1 +#endif + #endif // ABSL_BASE_CONFIG_H_ diff --git a/third_party/abseil_cpp/absl/base/dynamic_annotations.cc b/third_party/abseil_cpp/absl/base/dynamic_annotations.cc deleted file mode 100644 index f26e673ec..000000000 --- a/third_party/abseil_cpp/absl/base/dynamic_annotations.cc +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2017 The Abseil 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 -// -// https://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 -#include - -#include "absl/base/dynamic_annotations.h" - -// Compiler-based ThreadSanitizer defines -// DYNAMIC_ANNOTATIONS_EXTERNAL_IMPL = 1 -// and provides its own definitions of the functions. - -#ifndef DYNAMIC_ANNOTATIONS_EXTERNAL_IMPL -# define DYNAMIC_ANNOTATIONS_EXTERNAL_IMPL 0 -#endif - -#if DYNAMIC_ANNOTATIONS_EXTERNAL_IMPL == 0 && !defined(__native_client__) - -extern "C" { - -static int GetRunningOnValgrind(void) { -#ifdef RUNNING_ON_VALGRIND - if (RUNNING_ON_VALGRIND) return 1; -#endif - char *running_on_valgrind_str = getenv("RUNNING_ON_VALGRIND"); - if (running_on_valgrind_str) { - return strcmp(running_on_valgrind_str, "0") != 0; - } - return 0; -} - -// See the comments in dynamic_annotations.h -int RunningOnValgrind(void) { - static volatile int running_on_valgrind = -1; - int local_running_on_valgrind = running_on_valgrind; - // C doesn't have thread-safe initialization of statics, and we - // don't want to depend on pthread_once here, so hack it. - ANNOTATE_BENIGN_RACE(&running_on_valgrind, "safe hack"); - if (local_running_on_valgrind == -1) - running_on_valgrind = local_running_on_valgrind = GetRunningOnValgrind(); - return local_running_on_valgrind; -} - -// See the comments in dynamic_annotations.h -double ValgrindSlowdown(void) { - // Same initialization hack as in RunningOnValgrind(). - static volatile double slowdown = 0.0; - double local_slowdown = slowdown; - ANNOTATE_BENIGN_RACE(&slowdown, "safe hack"); - if (RunningOnValgrind() == 0) { - return 1.0; - } - if (local_slowdown == 0.0) { - char *env = getenv("VALGRIND_SLOWDOWN"); - slowdown = local_slowdown = env ? atof(env) : 50.0; - } - return local_slowdown; -} - -} // extern "C" -#endif // DYNAMIC_ANNOTATIONS_EXTERNAL_IMPL == 0 diff --git a/third_party/abseil_cpp/absl/base/dynamic_annotations.h b/third_party/abseil_cpp/absl/base/dynamic_annotations.h index 1444dc48e..545f8cbc9 100644 --- a/third_party/abseil_cpp/absl/base/dynamic_annotations.h +++ b/third_party/abseil_cpp/absl/base/dynamic_annotations.h @@ -47,25 +47,19 @@ #include +#include "absl/base/attributes.h" #include "absl/base/config.h" +#ifdef __cplusplus +#include "absl/base/macros.h" +#endif // TODO(rogeeff): Remove after the backward compatibility period. #include "absl/base/internal/dynamic_annotations.h" // IWYU pragma: export // ------------------------------------------------------------------------- -// Decide which features are enabled +// Decide which features are enabled. -#ifndef DYNAMIC_ANNOTATIONS_ENABLED -#define DYNAMIC_ANNOTATIONS_ENABLED 0 -#endif - -#if defined(__clang__) && !defined(SWIG) -#define ABSL_INTERNAL_IGNORE_READS_ATTRIBUTE_ENABLED 1 -#else -#define ABSL_INTERNAL_IGNORE_READS_ATTRIBUTE_ENABLED 0 -#endif - -#if DYNAMIC_ANNOTATIONS_ENABLED != 0 +#ifdef ABSL_HAVE_THREAD_SANITIZER #define ABSL_INTERNAL_RACE_ANNOTATIONS_ENABLED 1 #define ABSL_INTERNAL_READS_ANNOTATIONS_ENABLED 1 @@ -85,25 +79,20 @@ // will issue a warning, if these attributes are compiled. Only include them // when compiling using Clang. -// ANNOTALYSIS_ENABLED == 1 when IGNORE_READ_ATTRIBUTE_ENABLED == 1 -#define ABSL_INTERNAL_ANNOTALYSIS_ENABLED \ - ABSL_INTERNAL_IGNORE_READS_ATTRIBUTE_ENABLED +#if defined(__clang__) +#define ABSL_INTERNAL_ANNOTALYSIS_ENABLED 1 +#if !defined(SWIG) +#define ABSL_INTERNAL_IGNORE_READS_ATTRIBUTE_ENABLED 1 +#endif +#else +#define ABSL_INTERNAL_ANNOTALYSIS_ENABLED 0 +#endif + // Read/write annotations are enabled in Annotalysis mode; disabled otherwise. #define ABSL_INTERNAL_READS_WRITES_ANNOTATIONS_ENABLED \ ABSL_INTERNAL_ANNOTALYSIS_ENABLED -#endif -// Memory annotations are also made available to LLVM's Memory Sanitizer -#if defined(MEMORY_SANITIZER) && defined(__has_feature) && \ - !defined(__native_client__) -#if __has_feature(memory_sanitizer) -#define ABSL_INTERNAL_MEMORY_ANNOTATIONS_ENABLED 1 -#endif -#endif - -#ifndef ABSL_INTERNAL_MEMORY_ANNOTATIONS_ENABLED -#define ABSL_INTERNAL_MEMORY_ANNOTATIONS_ENABLED 0 -#endif +#endif // ABSL_HAVE_THREAD_SANITIZER #ifdef __cplusplus #define ABSL_INTERNAL_BEGIN_EXTERN_C extern "C" { @@ -165,7 +154,7 @@ ABSL_INTERNAL_GLOBAL_SCOPED(AnnotateRWLockCreate)(__FILE__, __LINE__, lock) // Report that a linker initialized lock has been created at address `lock`. -#ifdef THREAD_SANITIZER +#ifdef ABSL_HAVE_THREAD_SANITIZER #define ABSL_ANNOTATE_RWLOCK_CREATE_STATIC(lock) \ ABSL_INTERNAL_GLOBAL_SCOPED(AnnotateRWLockCreateStatic) \ (__FILE__, __LINE__, lock) @@ -243,7 +232,7 @@ ABSL_INTERNAL_END_EXTERN_C // ------------------------------------------------------------------------- // Define memory annotations. -#if ABSL_INTERNAL_MEMORY_ANNOTATIONS_ENABLED == 1 +#ifdef ABSL_HAVE_MEMORY_SANITIZER #include @@ -253,9 +242,10 @@ ABSL_INTERNAL_END_EXTERN_C #define ABSL_ANNOTATE_MEMORY_IS_UNINITIALIZED(address, size) \ __msan_allocated_memory(address, size) -#else // ABSL_INTERNAL_MEMORY_ANNOTATIONS_ENABLED == 0 +#else // !defined(ABSL_HAVE_MEMORY_SANITIZER) -#if DYNAMIC_ANNOTATIONS_ENABLED == 1 +// TODO(rogeeff): remove this branch +#ifdef ABSL_HAVE_THREAD_SANITIZER #define ABSL_ANNOTATE_MEMORY_IS_INITIALIZED(address, size) \ do { \ (void)(address); \ @@ -273,24 +263,24 @@ ABSL_INTERNAL_END_EXTERN_C #endif -#endif // ABSL_INTERNAL_MEMORY_ANNOTATIONS_ENABLED +#endif // ABSL_HAVE_MEMORY_SANITIZER // ------------------------------------------------------------------------- // Define IGNORE_READS_BEGIN/_END attributes. -#if ABSL_INTERNAL_IGNORE_READS_ATTRIBUTE_ENABLED == 1 +#if defined(ABSL_INTERNAL_IGNORE_READS_ATTRIBUTE_ENABLED) #define ABSL_INTERNAL_IGNORE_READS_BEGIN_ATTRIBUTE \ __attribute((exclusive_lock_function("*"))) #define ABSL_INTERNAL_IGNORE_READS_END_ATTRIBUTE \ __attribute((unlock_function("*"))) -#else // ABSL_INTERNAL_IGNORE_READS_ATTRIBUTE_ENABLED == 0 +#else // !defined(ABSL_INTERNAL_IGNORE_READS_ATTRIBUTE_ENABLED) #define ABSL_INTERNAL_IGNORE_READS_BEGIN_ATTRIBUTE // empty #define ABSL_INTERNAL_IGNORE_READS_END_ATTRIBUTE // empty -#endif // ABSL_INTERNAL_IGNORE_READS_ATTRIBUTE_ENABLED +#endif // defined(ABSL_INTERNAL_IGNORE_READS_ATTRIBUTE_ENABLED) // ------------------------------------------------------------------------- // Define IGNORE_READS_BEGIN/_END annotations. @@ -429,46 +419,35 @@ ABSL_NAMESPACE_END #endif +#ifdef __cplusplus +#ifdef ABSL_HAVE_THREAD_SANITIZER ABSL_INTERNAL_BEGIN_EXTERN_C - -// ------------------------------------------------------------------------- -// Return non-zero value if running under valgrind. -// -// If "valgrind.h" is included into dynamic_annotations.cc, -// the regular valgrind mechanism will be used. -// See http://valgrind.org/docs/manual/manual-core-adv.html about -// RUNNING_ON_VALGRIND and other valgrind "client requests". -// The file "valgrind.h" may be obtained by doing -// svn co svn://svn.valgrind.org/valgrind/trunk/include -// -// If for some reason you can't use "valgrind.h" or want to fake valgrind, -// there are two ways to make this function return non-zero: -// - Use environment variable: export RUNNING_ON_VALGRIND=1 -// - Make your tool intercept the function RunningOnValgrind() and -// change its return value. -// -int RunningOnValgrind(void); - -// ValgrindSlowdown returns: -// * 1.0, if (RunningOnValgrind() == 0) -// * 50.0, if (RunningOnValgrind() != 0 && getenv("VALGRIND_SLOWDOWN") == -// NULL) -// * atof(getenv("VALGRIND_SLOWDOWN")) otherwise -// This function can be used to scale timeout values: -// EXAMPLE: -// for (;;) { -// DoExpensiveBackgroundTask(); -// SleepForSeconds(5 * ValgrindSlowdown()); -// } -// -double ValgrindSlowdown(void); - +int RunningOnValgrind(); +double ValgrindSlowdown(); ABSL_INTERNAL_END_EXTERN_C +#else +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace base_internal { +ABSL_DEPRECATED( + "Don't use this interface. It is misleading and is being deleted.") +ABSL_ATTRIBUTE_ALWAYS_INLINE inline int RunningOnValgrind() { return 0; } +ABSL_DEPRECATED( + "Don't use this interface. It is misleading and is being deleted.") +ABSL_ATTRIBUTE_ALWAYS_INLINE inline double ValgrindSlowdown() { return 1.0; } +} // namespace base_internal +ABSL_NAMESPACE_END +} // namespace absl + +using absl::base_internal::RunningOnValgrind; +using absl::base_internal::ValgrindSlowdown; +#endif +#endif // ------------------------------------------------------------------------- // Address sanitizer annotations -#ifdef ADDRESS_SANITIZER +#ifdef ABSL_HAVE_ADDRESS_SANITIZER // Describe the current state of a contiguous container such as e.g. // std::vector or std::string. For more details see // sanitizer/common_interface_defs.h, which is provided by the compiler. @@ -483,16 +462,15 @@ ABSL_INTERNAL_END_EXTERN_C #else -#define ABSL_ANNOTATE_CONTIGUOUS_CONTAINER(beg, end, old_mid, new_mid) +#define ABSL_ANNOTATE_CONTIGUOUS_CONTAINER(beg, end, old_mid, new_mid) // empty #define ABSL_ADDRESS_SANITIZER_REDZONE(name) static_assert(true, "") -#endif // ADDRESS_SANITIZER +#endif // ABSL_HAVE_ADDRESS_SANITIZER // ------------------------------------------------------------------------- // Undefine the macros intended only for this file. #undef ABSL_INTERNAL_RACE_ANNOTATIONS_ENABLED -#undef ABSL_INTERNAL_MEMORY_ANNOTATIONS_ENABLED #undef ABSL_INTERNAL_READS_ANNOTATIONS_ENABLED #undef ABSL_INTERNAL_WRITES_ANNOTATIONS_ENABLED #undef ABSL_INTERNAL_ANNOTALYSIS_ENABLED diff --git a/third_party/abseil_cpp/absl/base/internal/bits.h b/third_party/abseil_cpp/absl/base/internal/bits.h index 14c51d8b3..81648e2c3 100644 --- a/third_party/abseil_cpp/absl/base/internal/bits.h +++ b/third_party/abseil_cpp/absl/base/internal/bits.h @@ -83,10 +83,11 @@ ABSL_BASE_INTERNAL_FORCEINLINE int CountLeadingZeros64(uint64_t n) { #elif defined(_MSC_VER) && !defined(__clang__) // MSVC does not have __buitin_clzll. Compose two calls to _BitScanReverse unsigned long result = 0; // NOLINT(runtime/int) - if ((n >> 32) && _BitScanReverse(&result, n >> 32)) { + if ((n >> 32) && + _BitScanReverse(&result, static_cast(n >> 32))) { return 31 - result; } - if (_BitScanReverse(&result, n)) { + if (_BitScanReverse(&result, static_cast(n))) { return 63 - result; } return 64; @@ -170,10 +171,10 @@ ABSL_BASE_INTERNAL_FORCEINLINE int CountTrailingZerosNonZero64(uint64_t n) { #elif defined(_MSC_VER) && !defined(__clang__) unsigned long result = 0; // NOLINT(runtime/int) if (static_cast(n) == 0) { - _BitScanForward(&result, n >> 32); + _BitScanForward(&result, static_cast(n >> 32)); return result + 32; } - _BitScanForward(&result, n); + _BitScanForward(&result, static_cast(n)); return result; #elif defined(__GNUC__) || defined(__clang__) static_assert(sizeof(unsigned long long) == sizeof(n), // NOLINT(runtime/int) diff --git a/third_party/abseil_cpp/absl/base/internal/dynamic_annotations.h b/third_party/abseil_cpp/absl/base/internal/dynamic_annotations.h index 7d80f41c5..b23c5ec1c 100644 --- a/third_party/abseil_cpp/absl/base/internal/dynamic_annotations.h +++ b/third_party/abseil_cpp/absl/base/internal/dynamic_annotations.h @@ -58,8 +58,6 @@ #if defined(__clang__) && !defined(SWIG) #define ABSL_INTERNAL_IGNORE_READS_ATTRIBUTE_ENABLED 1 -#else -#define ABSL_INTERNAL_IGNORE_READS_ATTRIBUTE_ENABLED 0 #endif #if DYNAMIC_ANNOTATIONS_ENABLED != 0 @@ -84,19 +82,16 @@ // ANNOTALYSIS_ENABLED == 1 when IGNORE_READ_ATTRIBUTE_ENABLED == 1 #define ABSL_INTERNAL_ANNOTALYSIS_ENABLED \ - ABSL_INTERNAL_IGNORE_READS_ATTRIBUTE_ENABLED + defined(ABSL_INTERNAL_IGNORE_READS_ATTRIBUTE_ENABLED) // Read/write annotations are enabled in Annotalysis mode; disabled otherwise. #define ABSL_INTERNAL_READS_WRITES_ANNOTATIONS_ENABLED \ ABSL_INTERNAL_ANNOTALYSIS_ENABLED #endif // Memory annotations are also made available to LLVM's Memory Sanitizer -#if defined(MEMORY_SANITIZER) && defined(__has_feature) && \ - !defined(__native_client__) -#if __has_feature(memory_sanitizer) +#if defined(ABSL_HAVE_MEMORY_SANITIZER) && !defined(__native_client__) #define ABSL_INTERNAL_MEMORY_ANNOTATIONS_ENABLED 1 #endif -#endif #ifndef ABSL_INTERNAL_MEMORY_ANNOTATIONS_ENABLED #define ABSL_INTERNAL_MEMORY_ANNOTATIONS_ENABLED 0 @@ -162,7 +157,7 @@ ABSL_INTERNAL_GLOBAL_SCOPED(AnnotateRWLockCreate)(__FILE__, __LINE__, lock) // Report that a linker initialized lock has been created at address `lock`. -#ifdef THREAD_SANITIZER +#ifdef ABSL_HAVE_THREAD_SANITIZER #define ANNOTATE_RWLOCK_CREATE_STATIC(lock) \ ABSL_INTERNAL_GLOBAL_SCOPED(AnnotateRWLockCreateStatic) \ (__FILE__, __LINE__, lock) @@ -250,19 +245,19 @@ // ------------------------------------------------------------------------- // Define IGNORE_READS_BEGIN/_END attributes. -#if ABSL_INTERNAL_IGNORE_READS_ATTRIBUTE_ENABLED == 1 +#if defined(ABSL_INTERNAL_IGNORE_READS_ATTRIBUTE_ENABLED) #define ABSL_INTERNAL_IGNORE_READS_BEGIN_ATTRIBUTE \ __attribute((exclusive_lock_function("*"))) #define ABSL_INTERNAL_IGNORE_READS_END_ATTRIBUTE \ __attribute((unlock_function("*"))) -#else // ABSL_INTERNAL_IGNORE_READS_ATTRIBUTE_ENABLED == 0 +#else // !defined(ABSL_INTERNAL_IGNORE_READS_ATTRIBUTE_ENABLED) #define ABSL_INTERNAL_IGNORE_READS_BEGIN_ATTRIBUTE // empty #define ABSL_INTERNAL_IGNORE_READS_END_ATTRIBUTE // empty -#endif // ABSL_INTERNAL_IGNORE_READS_ATTRIBUTE_ENABLED +#endif // defined(ABSL_INTERNAL_IGNORE_READS_ATTRIBUTE_ENABLED) // ------------------------------------------------------------------------- // Define IGNORE_READS_BEGIN/_END annotations. @@ -367,7 +362,7 @@ // ------------------------------------------------------------------------- // Address sanitizer annotations -#ifdef ADDRESS_SANITIZER +#ifdef ABSL_HAVE_ADDRESS_SANITIZER // Describe the current state of a contiguous container such as e.g. // std::vector or std::string. For more details see // sanitizer/common_interface_defs.h, which is provided by the compiler. @@ -385,7 +380,7 @@ #define ANNOTATE_CONTIGUOUS_CONTAINER(beg, end, old_mid, new_mid) #define ADDRESS_SANITIZER_REDZONE(name) static_assert(true, "") -#endif // ADDRESS_SANITIZER +#endif // ABSL_HAVE_ADDRESS_SANITIZER // ------------------------------------------------------------------------- // Undefine the macros intended only for this file. diff --git a/third_party/abseil_cpp/absl/base/internal/exponential_biased_test.cc b/third_party/abseil_cpp/absl/base/internal/exponential_biased_test.cc index 90a482d2a..075583ca6 100644 --- a/third_party/abseil_cpp/absl/base/internal/exponential_biased_test.cc +++ b/third_party/abseil_cpp/absl/base/internal/exponential_biased_test.cc @@ -185,7 +185,7 @@ TEST(ExponentialBiasedTest, InitializationModes) { ABSL_CONST_INIT static ExponentialBiased eb_static; EXPECT_THAT(eb_static.GetSkipCount(2), Ge(0)); -#if ABSL_HAVE_THREAD_LOCAL +#ifdef ABSL_HAVE_THREAD_LOCAL thread_local ExponentialBiased eb_thread; EXPECT_THAT(eb_thread.GetSkipCount(2), Ge(0)); #endif diff --git a/third_party/abseil_cpp/absl/base/internal/invoke.h b/third_party/abseil_cpp/absl/base/internal/invoke.h index c4eceebd7..5c71f3282 100644 --- a/third_party/abseil_cpp/absl/base/internal/invoke.h +++ b/third_party/abseil_cpp/absl/base/internal/invoke.h @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. // -// absl::base_internal::Invoke(f, args...) is an implementation of +// absl::base_internal::invoke(f, args...) is an implementation of // INVOKE(f, args...) from section [func.require] of the C++ standard. // // [func.require] @@ -29,7 +29,7 @@ // is not one of the types described in the previous item; // 5. f(t1, t2, ..., tN) in all other cases. // -// The implementation is SFINAE-friendly: substitution failure within Invoke() +// The implementation is SFINAE-friendly: substitution failure within invoke() // isn't an error. #ifndef ABSL_BASE_INTERNAL_INVOKE_H_ @@ -170,13 +170,13 @@ struct Invoker { // The result type of Invoke. template -using InvokeT = decltype(Invoker::type::Invoke( +using invoke_result_t = decltype(Invoker::type::Invoke( std::declval(), std::declval()...)); // Invoke(f, args...) is an implementation of INVOKE(f, args...) from section // [func.require] of the C++ standard. template -InvokeT Invoke(F&& f, Args&&... args) { +invoke_result_t invoke(F&& f, Args&&... args) { return Invoker::type::Invoke(std::forward(f), std::forward(args)...); } diff --git a/third_party/abseil_cpp/absl/base/internal/low_level_alloc.cc b/third_party/abseil_cpp/absl/base/internal/low_level_alloc.cc index 1bf94438d..229ab9162 100644 --- a/third_party/abseil_cpp/absl/base/internal/low_level_alloc.cc +++ b/third_party/abseil_cpp/absl/base/internal/low_level_alloc.cc @@ -598,7 +598,7 @@ static void *DoAllocWithArena(size_t request, LowLevelAlloc::Arena *arena) { section.Leave(); result = &s->levels; } - ANNOTATE_MEMORY_IS_UNINITIALIZED(result, request); + ABSL_ANNOTATE_MEMORY_IS_UNINITIALIZED(result, request); return result; } diff --git a/third_party/abseil_cpp/absl/base/internal/low_level_scheduling.h b/third_party/abseil_cpp/absl/base/internal/low_level_scheduling.h index 961cc981b..9baccc065 100644 --- a/third_party/abseil_cpp/absl/base/internal/low_level_scheduling.h +++ b/third_party/abseil_cpp/absl/base/internal/low_level_scheduling.h @@ -18,6 +18,7 @@ #ifndef ABSL_BASE_INTERNAL_LOW_LEVEL_SCHEDULING_H_ #define ABSL_BASE_INTERNAL_LOW_LEVEL_SCHEDULING_H_ +#include "absl/base/internal/raw_logging.h" #include "absl/base/internal/scheduling_mode.h" #include "absl/base/macros.h" @@ -29,6 +30,13 @@ extern "C" void __google_enable_rescheduling(bool disable_result); namespace absl { ABSL_NAMESPACE_BEGIN +class CondVar; +class Mutex; + +namespace synchronization_internal { +int MutexDelay(int32_t c, int mode); +} // namespace synchronization_internal + namespace base_internal { class SchedulingHelper; // To allow use of SchedulingGuard. @@ -53,6 +61,8 @@ class SchedulingGuard { public: // Returns true iff the calling thread may be cooperatively rescheduled. static bool ReschedulingIsAllowed(); + SchedulingGuard(const SchedulingGuard&) = delete; + SchedulingGuard& operator=(const SchedulingGuard&) = delete; private: // Disable cooperative rescheduling of the calling thread. It may still @@ -76,12 +86,23 @@ class SchedulingGuard { bool disabled; }; - // Access to SchedulingGuard is explicitly white-listed. + // A scoped helper to enable rescheduling temporarily. + // REQUIRES: destructor must run in same thread as constructor. + class ScopedEnable { + public: + ScopedEnable(); + ~ScopedEnable(); + + private: + int scheduling_disabled_depth_; + }; + + // Access to SchedulingGuard is explicitly permitted. + friend class absl::CondVar; + friend class absl::Mutex; friend class SchedulingHelper; friend class SpinLock; - - SchedulingGuard(const SchedulingGuard&) = delete; - SchedulingGuard& operator=(const SchedulingGuard&) = delete; + friend int absl::synchronization_internal::MutexDelay(int32_t c, int mode); }; //------------------------------------------------------------------------------ @@ -100,6 +121,12 @@ inline void SchedulingGuard::EnableRescheduling(bool /* disable_result */) { return; } +inline SchedulingGuard::ScopedEnable::ScopedEnable() + : scheduling_disabled_depth_(0) {} +inline SchedulingGuard::ScopedEnable::~ScopedEnable() { + ABSL_RAW_CHECK(scheduling_disabled_depth_ == 0, "disable unused warning"); +} + } // namespace base_internal ABSL_NAMESPACE_END } // namespace absl diff --git a/third_party/abseil_cpp/absl/base/internal/raw_logging.cc b/third_party/abseil_cpp/absl/base/internal/raw_logging.cc index 40cea5506..ae8754c6a 100644 --- a/third_party/abseil_cpp/absl/base/internal/raw_logging.cc +++ b/third_party/abseil_cpp/absl/base/internal/raw_logging.cc @@ -69,7 +69,7 @@ // TODO(gfalcon): We want raw-logging to work on as many platforms as possible. // Explicitly #error out when not ABSL_LOW_LEVEL_WRITE_SUPPORTED, except for a -// whitelisted set of platforms for which we expect not to be able to raw log. +// selected set of platforms for which we expect not to be able to raw log. ABSL_INTERNAL_ATOMIC_HOOK_ATTRIBUTES static absl::base_internal::AtomicHook< absl::raw_logging_internal::LogPrefixHook> @@ -227,7 +227,7 @@ bool RawLoggingFullySupported() { #endif // !ABSL_LOW_LEVEL_WRITE_SUPPORTED } -ABSL_DLL ABSL_INTERNAL_ATOMIC_HOOK_ATTRIBUTES +ABSL_INTERNAL_ATOMIC_HOOK_ATTRIBUTES ABSL_DLL absl::base_internal::AtomicHook internal_log_function(DefaultInternalLog); diff --git a/third_party/abseil_cpp/absl/base/internal/raw_logging.h b/third_party/abseil_cpp/absl/base/internal/raw_logging.h index 418d6c856..20f4291b1 100644 --- a/third_party/abseil_cpp/absl/base/internal/raw_logging.h +++ b/third_party/abseil_cpp/absl/base/internal/raw_logging.h @@ -72,10 +72,14 @@ // // The API is a subset of the above: each macro only takes two arguments. Use // StrCat if you need to build a richer message. -#define ABSL_INTERNAL_LOG(severity, message) \ - do { \ - ::absl::raw_logging_internal::internal_log_function( \ - ABSL_RAW_LOGGING_INTERNAL_##severity, __FILE__, __LINE__, message); \ +#define ABSL_INTERNAL_LOG(severity, message) \ + do { \ + constexpr const char* absl_raw_logging_internal_filename = __FILE__; \ + ::absl::raw_logging_internal::internal_log_function( \ + ABSL_RAW_LOGGING_INTERNAL_##severity, \ + absl_raw_logging_internal_filename, __LINE__, message); \ + if (ABSL_RAW_LOGGING_INTERNAL_##severity == ::absl::LogSeverity::kFatal) \ + ABSL_INTERNAL_UNREACHABLE; \ } while (0) #define ABSL_INTERNAL_CHECK(condition, message) \ @@ -170,7 +174,7 @@ using InternalLogFunction = void (*)(absl::LogSeverity severity, const char* file, int line, const std::string& message); -ABSL_DLL ABSL_INTERNAL_ATOMIC_HOOK_ATTRIBUTES extern base_internal::AtomicHook< +ABSL_INTERNAL_ATOMIC_HOOK_ATTRIBUTES ABSL_DLL extern base_internal::AtomicHook< InternalLogFunction> internal_log_function; diff --git a/third_party/abseil_cpp/absl/base/internal/spinlock.h b/third_party/abseil_cpp/absl/base/internal/spinlock.h index 2222398b1..e6ac9e640 100644 --- a/third_party/abseil_cpp/absl/base/internal/spinlock.h +++ b/third_party/abseil_cpp/absl/base/internal/spinlock.h @@ -64,7 +64,14 @@ class ABSL_LOCKABLE SpinLock { constexpr SpinLock(absl::ConstInitType, base_internal::SchedulingMode mode) : lockword_(IsCooperative(mode) ? kSpinLockCooperative : 0) {} + // For global SpinLock instances prefer trivial destructor when possible. + // Default but non-trivial destructor in some build configurations causes an + // extra static initializer. +#ifdef ABSL_INTERNAL_HAVE_TSAN_INTERFACE ~SpinLock() { ABSL_TSAN_MUTEX_DESTROY(this, __tsan_mutex_not_static); } +#else + ~SpinLock() = default; +#endif // Acquire this SpinLock. inline void Lock() ABSL_EXCLUSIVE_LOCK_FUNCTION() { diff --git a/third_party/abseil_cpp/absl/base/internal/strerror.cc b/third_party/abseil_cpp/absl/base/internal/strerror.cc index af181513c..d66ba1201 100644 --- a/third_party/abseil_cpp/absl/base/internal/strerror.cc +++ b/third_party/abseil_cpp/absl/base/internal/strerror.cc @@ -14,6 +14,7 @@ #include "absl/base/internal/strerror.h" +#include #include #include #include @@ -21,13 +22,13 @@ #include #include -#include "absl/base/attributes.h" #include "absl/base/internal/errno_saver.h" namespace absl { ABSL_NAMESPACE_BEGIN namespace base_internal { namespace { + const char* StrErrorAdaptor(int errnum, char* buf, size_t buflen) { #if defined(_WIN32) int rc = strerror_s(buf, buflen, errnum); @@ -35,15 +36,6 @@ const char* StrErrorAdaptor(int errnum, char* buf, size_t buflen) { if (rc == 0 && strncmp(buf, "Unknown error", buflen) == 0) *buf = '\0'; return buf; #else -#if defined(__GLIBC__) || defined(__APPLE__) - // Use the BSD sys_errlist API provided by GNU glibc and others to - // avoid any need to copy the message into the local buffer first. - if (0 <= errnum && errnum < sys_nerr) { - if (const char* p = sys_errlist[errnum]) { - return p; - } - } -#endif // The type of `ret` is platform-specific; both of these branches must compile // either way but only one will execute on any given platform: auto ret = strerror_r(errnum, buf, buflen); @@ -57,9 +49,8 @@ const char* StrErrorAdaptor(int errnum, char* buf, size_t buflen) { } #endif } -} // namespace -std::string StrError(int errnum) { +std::string StrErrorInternal(int errnum) { absl::base_internal::ErrnoSaver errno_saver; char buf[100]; const char* str = StrErrorAdaptor(errnum, buf, sizeof buf); @@ -70,6 +61,28 @@ std::string StrError(int errnum) { return str; } +// kSysNerr is the number of errors from a recent glibc. `StrError()` falls back +// to `StrErrorAdaptor()` if the value is larger than this. +constexpr int kSysNerr = 135; + +std::array* NewStrErrorTable() { + auto* table = new std::array; + for (int i = 0; i < static_cast(table->size()); ++i) { + (*table)[i] = StrErrorInternal(i); + } + return table; +} + +} // namespace + +std::string StrError(int errnum) { + static const auto* table = NewStrErrorTable(); + if (errnum >= 0 && errnum < static_cast(table->size())) { + return (*table)[errnum]; + } + return StrErrorInternal(errnum); +} + } // namespace base_internal ABSL_NAMESPACE_END } // namespace absl diff --git a/third_party/abseil_cpp/absl/base/internal/strerror_benchmark.cc b/third_party/abseil_cpp/absl/base/internal/strerror_benchmark.cc index d8ca86b95..c9ab14a89 100644 --- a/third_party/abseil_cpp/absl/base/internal/strerror_benchmark.cc +++ b/third_party/abseil_cpp/absl/base/internal/strerror_benchmark.cc @@ -20,15 +20,6 @@ #include "benchmark/benchmark.h" namespace { -#if defined(__GLIBC__) || defined(__APPLE__) -void BM_SysErrList(benchmark::State& state) { - for (auto _ : state) { - benchmark::DoNotOptimize(std::string(sys_errlist[ERANGE])); - } -} -BENCHMARK(BM_SysErrList); -#endif - void BM_AbslStrError(benchmark::State& state) { for (auto _ : state) { benchmark::DoNotOptimize(absl::base_internal::StrError(ERANGE)); diff --git a/third_party/abseil_cpp/absl/base/internal/sysinfo.cc b/third_party/abseil_cpp/absl/base/internal/sysinfo.cc index 6c69683fa..4a3b20503 100644 --- a/third_party/abseil_cpp/absl/base/internal/sysinfo.cc +++ b/third_party/abseil_cpp/absl/base/internal/sysinfo.cc @@ -39,6 +39,7 @@ #endif #include + #include #include #include @@ -50,6 +51,7 @@ #include #include "absl/base/call_once.h" +#include "absl/base/config.h" #include "absl/base/internal/raw_logging.h" #include "absl/base/internal/spinlock.h" #include "absl/base/internal/unscaledcycleclock.h" @@ -420,6 +422,18 @@ pid_t GetTID() { #endif +// GetCachedTID() caches the thread ID in thread-local storage (which is a +// userspace construct) to avoid unnecessary system calls. Without this caching, +// it can take roughly 98ns, while it takes roughly 1ns with this caching. +pid_t GetCachedTID() { +#ifdef ABSL_HAVE_THREAD_LOCAL + static thread_local pid_t thread_id = GetTID(); + return thread_id; +#else + return GetTID(); +#endif // ABSL_HAVE_THREAD_LOCAL +} + } // namespace base_internal ABSL_NAMESPACE_END } // namespace absl diff --git a/third_party/abseil_cpp/absl/base/internal/sysinfo.h b/third_party/abseil_cpp/absl/base/internal/sysinfo.h index 7246d5dd9..119cf1f0e 100644 --- a/third_party/abseil_cpp/absl/base/internal/sysinfo.h +++ b/third_party/abseil_cpp/absl/base/internal/sysinfo.h @@ -30,6 +30,7 @@ #include +#include "absl/base/config.h" #include "absl/base/port.h" namespace absl { @@ -59,6 +60,13 @@ using pid_t = uint32_t; #endif pid_t GetTID(); +// Like GetTID(), but caches the result in thread-local storage in order +// to avoid unnecessary system calls. Note that there are some cases where +// one must call through to GetTID directly, which is why this exists as a +// separate function. For example, GetCachedTID() is not safe to call in +// an asynchronous signal-handling context nor right after a call to fork(). +pid_t GetCachedTID(); + } // namespace base_internal ABSL_NAMESPACE_END } // namespace absl diff --git a/third_party/abseil_cpp/absl/base/internal/thread_identity.cc b/third_party/abseil_cpp/absl/base/internal/thread_identity.cc index d63a04ae9..6ea010ed0 100644 --- a/third_party/abseil_cpp/absl/base/internal/thread_identity.cc +++ b/third_party/abseil_cpp/absl/base/internal/thread_identity.cc @@ -23,6 +23,7 @@ #include #include +#include "absl/base/attributes.h" #include "absl/base/call_once.h" #include "absl/base/internal/raw_logging.h" #include "absl/base/internal/spinlock.h" @@ -53,9 +54,11 @@ void AllocateThreadIdentityKey(ThreadIdentityReclaimerFunction reclaimer) { // exist within a process (via dlopen() or similar), references to // thread_identity_ptr from each instance of the code will refer to // *different* instances of this ptr. -#ifdef __GNUC__ +// Apple platforms have the visibility attribute, but issue a compile warning +// that protected visibility is unsupported. +#if ABSL_HAVE_ATTRIBUTE(visibility) && !defined(__APPLE__) __attribute__((visibility("protected"))) -#endif // __GNUC__ +#endif // ABSL_HAVE_ATTRIBUTE(visibility) && !defined(__APPLE__) #if ABSL_PER_THREAD_TLS // Prefer __thread to thread_local as benchmarks indicate it is a bit faster. ABSL_PER_THREAD_TLS_KEYWORD ThreadIdentity* thread_identity_ptr = nullptr; diff --git a/third_party/abseil_cpp/absl/base/internal/thread_identity.h b/third_party/abseil_cpp/absl/base/internal/thread_identity.h index ceb109b41..d2a65fd81 100644 --- a/third_party/abseil_cpp/absl/base/internal/thread_identity.h +++ b/third_party/abseil_cpp/absl/base/internal/thread_identity.h @@ -32,6 +32,7 @@ #include "absl/base/config.h" #include "absl/base/internal/per_thread_tls.h" +#include "absl/base/optimization.h" namespace absl { ABSL_NAMESPACE_BEGIN @@ -69,30 +70,28 @@ struct PerThreadSynch { // is using this PerThreadSynch as a terminator. Its // skip field must not be filled in because the loop // might then skip over the terminator. - - // The wait parameters of the current wait. waitp is null if the - // thread is not waiting. Transitions from null to non-null must - // occur before the enqueue commit point (state = kQueued in - // Enqueue() and CondVarEnqueue()). Transitions from non-null to - // null must occur after the wait is finished (state = kAvailable in - // Mutex::Block() and CondVar::WaitCommon()). This field may be - // changed only by the thread that describes this PerThreadSynch. A - // special case is Fer(), which calls Enqueue() on another thread, - // but with an identical SynchWaitParams pointer, thus leaving the - // pointer unchanged. - SynchWaitParams *waitp; - - bool suppress_fatal_errors; // If true, try to proceed even in the face of - // broken invariants. This is used within fatal - // signal handlers to improve the chances of - // debug logging information being output - // successfully. - - intptr_t readers; // Number of readers in mutex. - int priority; // Priority of thread (updated every so often). - - // When priority will next be read (cycles). - int64_t next_priority_read_cycles; + bool wake; // This thread is to be woken from a Mutex. + // If "x" is on a waiter list for a mutex, "x->cond_waiter" is true iff the + // waiter is waiting on the mutex as part of a CV Wait or Mutex Await. + // + // The value of "x->cond_waiter" is meaningless if "x" is not on a + // Mutex waiter list. + bool cond_waiter; + bool maybe_unlocking; // Valid at head of Mutex waiter queue; + // true if UnlockSlow could be searching + // for a waiter to wake. Used for an optimization + // in Enqueue(). true is always a valid value. + // Can be reset to false when the unlocker or any + // writer releases the lock, or a reader fully + // releases the lock. It may not be set to false + // by a reader that decrements the count to + // non-zero. protected by mutex spinlock + bool suppress_fatal_errors; // If true, try to proceed even in the face + // of broken invariants. This is used within + // fatal signal handlers to improve the + // chances of debug logging information being + // output successfully. + int priority; // Priority of thread (updated every so often). // State values: // kAvailable: This PerThreadSynch is available. @@ -111,30 +110,30 @@ struct PerThreadSynch { }; std::atomic state; - bool maybe_unlocking; // Valid at head of Mutex waiter queue; - // true if UnlockSlow could be searching - // for a waiter to wake. Used for an optimization - // in Enqueue(). true is always a valid value. - // Can be reset to false when the unlocker or any - // writer releases the lock, or a reader fully releases - // the lock. It may not be set to false by a reader - // that decrements the count to non-zero. - // protected by mutex spinlock + // The wait parameters of the current wait. waitp is null if the + // thread is not waiting. Transitions from null to non-null must + // occur before the enqueue commit point (state = kQueued in + // Enqueue() and CondVarEnqueue()). Transitions from non-null to + // null must occur after the wait is finished (state = kAvailable in + // Mutex::Block() and CondVar::WaitCommon()). This field may be + // changed only by the thread that describes this PerThreadSynch. A + // special case is Fer(), which calls Enqueue() on another thread, + // but with an identical SynchWaitParams pointer, thus leaving the + // pointer unchanged. + SynchWaitParams* waitp; - bool wake; // This thread is to be woken from a Mutex. + intptr_t readers; // Number of readers in mutex. - // If "x" is on a waiter list for a mutex, "x->cond_waiter" is true iff the - // waiter is waiting on the mutex as part of a CV Wait or Mutex Await. - // - // The value of "x->cond_waiter" is meaningless if "x" is not on a - // Mutex waiter list. - bool cond_waiter; + // When priority will next be read (cycles). + int64_t next_priority_read_cycles; // Locks held; used during deadlock detection. // Allocated in Synch_GetAllLocks() and freed in ReclaimThreadIdentity(). SynchLocksHeld *all_locks; }; +// The instances of this class are allocated in NewThreadIdentity() with an +// alignment of PerThreadSynch::kAlignment. struct ThreadIdentity { // Must be the first member. The Mutex implementation requires that // the PerThreadSynch object associated with each thread is @@ -212,7 +211,9 @@ void ClearCurrentThreadIdentity(); #define ABSL_THREAD_IDENTITY_MODE ABSL_FORCE_THREAD_IDENTITY_MODE #elif defined(_WIN32) && !defined(__MINGW32__) #define ABSL_THREAD_IDENTITY_MODE ABSL_THREAD_IDENTITY_MODE_USE_CPP11 -#elif ABSL_PER_THREAD_TLS && defined(__GOOGLE_GRTE_VERSION__) && \ +#elif defined(__APPLE__) && defined(ABSL_HAVE_THREAD_LOCAL) +#define ABSL_THREAD_IDENTITY_MODE ABSL_THREAD_IDENTITY_MODE_USE_CPP11 +#elif ABSL_PER_THREAD_TLS && defined(__GOOGLE_GRTE_VERSION__) && \ (__GOOGLE_GRTE_VERSION__ >= 20140228L) // Support for async-safe TLS was specifically added in GRTEv4. It's not // present in the upstream eglibc. diff --git a/third_party/abseil_cpp/absl/base/internal/thread_identity_test.cc b/third_party/abseil_cpp/absl/base/internal/thread_identity_test.cc index 624d5b96b..46a6f7434 100644 --- a/third_party/abseil_cpp/absl/base/internal/thread_identity_test.cc +++ b/third_party/abseil_cpp/absl/base/internal/thread_identity_test.cc @@ -75,7 +75,7 @@ TEST(ThreadIdentityTest, BasicIdentityWorksThreaded) { // - If a thread implementation chooses to recycle threads, that // correct re-initialization occurs. static const int kNumLoops = 3; - static const int kNumThreads = 400; + static const int kNumThreads = 32; for (int iter = 0; iter < kNumLoops; iter++) { std::vector threads; for (int i = 0; i < kNumThreads; ++i) { diff --git a/third_party/abseil_cpp/absl/base/internal/throw_delegate.cc b/third_party/abseil_cpp/absl/base/internal/throw_delegate.cc index c055f75d9..c260ff1ee 100644 --- a/third_party/abseil_cpp/absl/base/internal/throw_delegate.cc +++ b/third_party/abseil_cpp/absl/base/internal/throw_delegate.cc @@ -18,6 +18,7 @@ #include #include #include + #include "absl/base/config.h" #include "absl/base/internal/raw_logging.h" @@ -25,83 +26,186 @@ namespace absl { ABSL_NAMESPACE_BEGIN namespace base_internal { +// NOTE: The various STL exception throwing functions are placed within the +// #ifdef blocks so the symbols aren't exposed on platforms that don't support +// them, such as the Android NDK. For example, ANGLE fails to link when building +// within AOSP without them, since the STL functions don't exist. namespace { +#ifdef ABSL_HAVE_EXCEPTIONS template [[noreturn]] void Throw(const T& error) { -#ifdef ABSL_HAVE_EXCEPTIONS throw error; -#else - ABSL_RAW_LOG(FATAL, "%s", error.what()); - std::abort(); -#endif } +#endif } // namespace void ThrowStdLogicError(const std::string& what_arg) { +#ifdef ABSL_HAVE_EXCEPTIONS Throw(std::logic_error(what_arg)); +#else + ABSL_RAW_LOG(FATAL, "%s", what_arg.c_str()); + std::abort(); +#endif } void ThrowStdLogicError(const char* what_arg) { +#ifdef ABSL_HAVE_EXCEPTIONS Throw(std::logic_error(what_arg)); +#else + ABSL_RAW_LOG(FATAL, "%s", what_arg); + std::abort(); +#endif } void ThrowStdInvalidArgument(const std::string& what_arg) { +#ifdef ABSL_HAVE_EXCEPTIONS Throw(std::invalid_argument(what_arg)); +#else + ABSL_RAW_LOG(FATAL, "%s", what_arg.c_str()); + std::abort(); +#endif } void ThrowStdInvalidArgument(const char* what_arg) { +#ifdef ABSL_HAVE_EXCEPTIONS Throw(std::invalid_argument(what_arg)); +#else + ABSL_RAW_LOG(FATAL, "%s", what_arg); + std::abort(); +#endif } void ThrowStdDomainError(const std::string& what_arg) { +#ifdef ABSL_HAVE_EXCEPTIONS Throw(std::domain_error(what_arg)); +#else + ABSL_RAW_LOG(FATAL, "%s", what_arg.c_str()); + std::abort(); +#endif } void ThrowStdDomainError(const char* what_arg) { +#ifdef ABSL_HAVE_EXCEPTIONS Throw(std::domain_error(what_arg)); +#else + ABSL_RAW_LOG(FATAL, "%s", what_arg); + std::abort(); +#endif } void ThrowStdLengthError(const std::string& what_arg) { +#ifdef ABSL_HAVE_EXCEPTIONS Throw(std::length_error(what_arg)); +#else + ABSL_RAW_LOG(FATAL, "%s", what_arg.c_str()); + std::abort(); +#endif } void ThrowStdLengthError(const char* what_arg) { +#ifdef ABSL_HAVE_EXCEPTIONS Throw(std::length_error(what_arg)); +#else + ABSL_RAW_LOG(FATAL, "%s", what_arg); + std::abort(); +#endif } void ThrowStdOutOfRange(const std::string& what_arg) { +#ifdef ABSL_HAVE_EXCEPTIONS Throw(std::out_of_range(what_arg)); +#else + ABSL_RAW_LOG(FATAL, "%s", what_arg.c_str()); + std::abort(); +#endif } void ThrowStdOutOfRange(const char* what_arg) { +#ifdef ABSL_HAVE_EXCEPTIONS Throw(std::out_of_range(what_arg)); +#else + ABSL_RAW_LOG(FATAL, "%s", what_arg); + std::abort(); +#endif } void ThrowStdRuntimeError(const std::string& what_arg) { +#ifdef ABSL_HAVE_EXCEPTIONS Throw(std::runtime_error(what_arg)); +#else + ABSL_RAW_LOG(FATAL, "%s", what_arg.c_str()); + std::abort(); +#endif } void ThrowStdRuntimeError(const char* what_arg) { +#ifdef ABSL_HAVE_EXCEPTIONS Throw(std::runtime_error(what_arg)); +#else + ABSL_RAW_LOG(FATAL, "%s", what_arg); + std::abort(); +#endif } void ThrowStdRangeError(const std::string& what_arg) { +#ifdef ABSL_HAVE_EXCEPTIONS Throw(std::range_error(what_arg)); +#else + ABSL_RAW_LOG(FATAL, "%s", what_arg.c_str()); + std::abort(); +#endif } void ThrowStdRangeError(const char* what_arg) { +#ifdef ABSL_HAVE_EXCEPTIONS Throw(std::range_error(what_arg)); +#else + ABSL_RAW_LOG(FATAL, "%s", what_arg); + std::abort(); +#endif } void ThrowStdOverflowError(const std::string& what_arg) { +#ifdef ABSL_HAVE_EXCEPTIONS Throw(std::overflow_error(what_arg)); +#else + ABSL_RAW_LOG(FATAL, "%s", what_arg.c_str()); + std::abort(); +#endif } void ThrowStdOverflowError(const char* what_arg) { +#ifdef ABSL_HAVE_EXCEPTIONS Throw(std::overflow_error(what_arg)); +#else + ABSL_RAW_LOG(FATAL, "%s", what_arg); + std::abort(); +#endif } void ThrowStdUnderflowError(const std::string& what_arg) { +#ifdef ABSL_HAVE_EXCEPTIONS Throw(std::underflow_error(what_arg)); +#else + ABSL_RAW_LOG(FATAL, "%s", what_arg.c_str()); + std::abort(); +#endif } void ThrowStdUnderflowError(const char* what_arg) { +#ifdef ABSL_HAVE_EXCEPTIONS Throw(std::underflow_error(what_arg)); +#else + ABSL_RAW_LOG(FATAL, "%s", what_arg); + std::abort(); +#endif } -void ThrowStdBadFunctionCall() { Throw(std::bad_function_call()); } +void ThrowStdBadFunctionCall() { +#ifdef ABSL_HAVE_EXCEPTIONS + Throw(std::bad_function_call()); +#else + std::abort(); +#endif +} -void ThrowStdBadAlloc() { Throw(std::bad_alloc()); } +void ThrowStdBadAlloc() { +#ifdef ABSL_HAVE_EXCEPTIONS + Throw(std::bad_alloc()); +#else + std::abort(); +#endif +} } // namespace base_internal ABSL_NAMESPACE_END diff --git a/third_party/abseil_cpp/absl/base/internal/tsan_mutex_interface.h b/third_party/abseil_cpp/absl/base/internal/tsan_mutex_interface.h index 2a510603b..39207d8a5 100644 --- a/third_party/abseil_cpp/absl/base/internal/tsan_mutex_interface.h +++ b/third_party/abseil_cpp/absl/base/internal/tsan_mutex_interface.h @@ -19,6 +19,8 @@ #ifndef ABSL_BASE_INTERNAL_TSAN_MUTEX_INTERFACE_H_ #define ABSL_BASE_INTERNAL_TSAN_MUTEX_INTERFACE_H_ +#include "absl/base/config.h" + // ABSL_INTERNAL_HAVE_TSAN_INTERFACE // Macro intended only for internal use. // @@ -28,7 +30,7 @@ #error "ABSL_INTERNAL_HAVE_TSAN_INTERFACE cannot be directly set." #endif -#if defined(THREAD_SANITIZER) && defined(__has_include) +#if defined(ABSL_HAVE_THREAD_SANITIZER) && defined(__has_include) #if __has_include() #define ABSL_INTERNAL_HAVE_TSAN_INTERFACE 1 #endif diff --git a/third_party/abseil_cpp/absl/base/internal/unaligned_access.h b/third_party/abseil_cpp/absl/base/internal/unaligned_access.h index 6be56c865..093dd9b49 100644 --- a/third_party/abseil_cpp/absl/base/internal/unaligned_access.h +++ b/third_party/abseil_cpp/absl/base/internal/unaligned_access.h @@ -31,80 +31,6 @@ // The unaligned API is C++ only. The declarations use C++ features // (namespaces, inline) which are absent or incompatible in C. #if defined(__cplusplus) - -#if defined(ADDRESS_SANITIZER) || defined(THREAD_SANITIZER) ||\ - defined(MEMORY_SANITIZER) -// Consider we have an unaligned load/store of 4 bytes from address 0x...05. -// AddressSanitizer will treat it as a 3-byte access to the range 05:07 and -// will miss a bug if 08 is the first unaddressable byte. -// ThreadSanitizer will also treat this as a 3-byte access to 05:07 and will -// miss a race between this access and some other accesses to 08. -// MemorySanitizer will correctly propagate the shadow on unaligned stores -// and correctly report bugs on unaligned loads, but it may not properly -// update and report the origin of the uninitialized memory. -// For all three tools, replacing an unaligned access with a tool-specific -// callback solves the problem. - -// Make sure uint16_t/uint32_t/uint64_t are defined. -#include - -extern "C" { -uint16_t __sanitizer_unaligned_load16(const void *p); -uint32_t __sanitizer_unaligned_load32(const void *p); -uint64_t __sanitizer_unaligned_load64(const void *p); -void __sanitizer_unaligned_store16(void *p, uint16_t v); -void __sanitizer_unaligned_store32(void *p, uint32_t v); -void __sanitizer_unaligned_store64(void *p, uint64_t v); -} // extern "C" - -namespace absl { -ABSL_NAMESPACE_BEGIN -namespace base_internal { - -inline uint16_t UnalignedLoad16(const void *p) { - return __sanitizer_unaligned_load16(p); -} - -inline uint32_t UnalignedLoad32(const void *p) { - return __sanitizer_unaligned_load32(p); -} - -inline uint64_t UnalignedLoad64(const void *p) { - return __sanitizer_unaligned_load64(p); -} - -inline void UnalignedStore16(void *p, uint16_t v) { - __sanitizer_unaligned_store16(p, v); -} - -inline void UnalignedStore32(void *p, uint32_t v) { - __sanitizer_unaligned_store32(p, v); -} - -inline void UnalignedStore64(void *p, uint64_t v) { - __sanitizer_unaligned_store64(p, v); -} - -} // namespace base_internal -ABSL_NAMESPACE_END -} // namespace absl - -#define ABSL_INTERNAL_UNALIGNED_LOAD16(_p) \ - (absl::base_internal::UnalignedLoad16(_p)) -#define ABSL_INTERNAL_UNALIGNED_LOAD32(_p) \ - (absl::base_internal::UnalignedLoad32(_p)) -#define ABSL_INTERNAL_UNALIGNED_LOAD64(_p) \ - (absl::base_internal::UnalignedLoad64(_p)) - -#define ABSL_INTERNAL_UNALIGNED_STORE16(_p, _val) \ - (absl::base_internal::UnalignedStore16(_p, _val)) -#define ABSL_INTERNAL_UNALIGNED_STORE32(_p, _val) \ - (absl::base_internal::UnalignedStore32(_p, _val)) -#define ABSL_INTERNAL_UNALIGNED_STORE64(_p, _val) \ - (absl::base_internal::UnalignedStore64(_p, _val)) - -#else - namespace absl { ABSL_NAMESPACE_BEGIN namespace base_internal { @@ -151,8 +77,6 @@ ABSL_NAMESPACE_END #define ABSL_INTERNAL_UNALIGNED_STORE64(_p, _val) \ (absl::base_internal::UnalignedStore64(_p, _val)) -#endif - #endif // defined(__cplusplus), end of unaligned API #endif // ABSL_BASE_INTERNAL_UNALIGNED_ACCESS_H_ diff --git a/third_party/abseil_cpp/absl/base/internal/unscaledcycleclock.cc b/third_party/abseil_cpp/absl/base/internal/unscaledcycleclock.cc index f1e7bbef8..1545288cf 100644 --- a/third_party/abseil_cpp/absl/base/internal/unscaledcycleclock.cc +++ b/third_party/abseil_cpp/absl/base/internal/unscaledcycleclock.cc @@ -123,9 +123,7 @@ double UnscaledCycleClock::Frequency() { #pragma intrinsic(__rdtsc) -int64_t UnscaledCycleClock::Now() { - return __rdtsc(); -} +int64_t UnscaledCycleClock::Now() { return __rdtsc(); } double UnscaledCycleClock::Frequency() { return base_internal::NominalCPUFrequency(); diff --git a/third_party/abseil_cpp/absl/base/internal/unscaledcycleclock.h b/third_party/abseil_cpp/absl/base/internal/unscaledcycleclock.h index cdce9bf8a..82f2c87a9 100644 --- a/third_party/abseil_cpp/absl/base/internal/unscaledcycleclock.h +++ b/third_party/abseil_cpp/absl/base/internal/unscaledcycleclock.h @@ -15,8 +15,8 @@ // UnscaledCycleClock // An UnscaledCycleClock yields the value and frequency of a cycle counter // that increments at a rate that is approximately constant. -// This class is for internal / whitelisted use only, you should consider -// using CycleClock instead. +// This class is for internal use only, you should consider using CycleClock +// instead. // // Notes: // The cycle counter frequency is not necessarily the core clock frequency. @@ -109,7 +109,7 @@ class UnscaledCycleClock { // value. static double Frequency(); - // Whitelisted friends. + // Allowed users friend class base_internal::CycleClock; friend class time_internal::UnscaledCycleClockWrapperForGetCurrentTime; friend class base_internal::UnscaledCycleClockWrapperForInitializeFrequency; diff --git a/third_party/abseil_cpp/absl/base/invoke_test.cc b/third_party/abseil_cpp/absl/base/invoke_test.cc index 6aa613c91..bcdef36c3 100644 --- a/third_party/abseil_cpp/absl/base/invoke_test.cc +++ b/third_party/abseil_cpp/absl/base/invoke_test.cc @@ -86,71 +86,73 @@ struct FlipFlop { int member; }; -// CallMaybeWithArg(f) resolves either to Invoke(f) or Invoke(f, 42), depending +// CallMaybeWithArg(f) resolves either to invoke(f) or invoke(f, 42), depending // on which one is valid. template -decltype(Invoke(std::declval())) CallMaybeWithArg(const F& f) { - return Invoke(f); +decltype(base_internal::invoke(std::declval())) CallMaybeWithArg( + const F& f) { + return base_internal::invoke(f); } template -decltype(Invoke(std::declval(), 42)) CallMaybeWithArg(const F& f) { - return Invoke(f, 42); +decltype(base_internal::invoke(std::declval(), 42)) CallMaybeWithArg( + const F& f) { + return base_internal::invoke(f, 42); } TEST(InvokeTest, Function) { - EXPECT_EQ(1, Invoke(Function, 3, 2)); - EXPECT_EQ(1, Invoke(&Function, 3, 2)); + EXPECT_EQ(1, base_internal::invoke(Function, 3, 2)); + EXPECT_EQ(1, base_internal::invoke(&Function, 3, 2)); } TEST(InvokeTest, NonCopyableArgument) { - EXPECT_EQ(42, Invoke(Sink, make_unique(42))); + EXPECT_EQ(42, base_internal::invoke(Sink, make_unique(42))); } TEST(InvokeTest, NonCopyableResult) { - EXPECT_THAT(Invoke(Factory, 42), ::testing::Pointee(42)); + EXPECT_THAT(base_internal::invoke(Factory, 42), ::testing::Pointee(42)); } -TEST(InvokeTest, VoidResult) { - Invoke(NoOp); -} +TEST(InvokeTest, VoidResult) { base_internal::invoke(NoOp); } TEST(InvokeTest, ConstFunctor) { - EXPECT_EQ(1, Invoke(ConstFunctor(), 3, 2)); + EXPECT_EQ(1, base_internal::invoke(ConstFunctor(), 3, 2)); } TEST(InvokeTest, MutableFunctor) { MutableFunctor f; - EXPECT_EQ(1, Invoke(f, 3, 2)); - EXPECT_EQ(1, Invoke(MutableFunctor(), 3, 2)); + EXPECT_EQ(1, base_internal::invoke(f, 3, 2)); + EXPECT_EQ(1, base_internal::invoke(MutableFunctor(), 3, 2)); } TEST(InvokeTest, EphemeralFunctor) { EphemeralFunctor f; - EXPECT_EQ(1, Invoke(std::move(f), 3, 2)); - EXPECT_EQ(1, Invoke(EphemeralFunctor(), 3, 2)); + EXPECT_EQ(1, base_internal::invoke(std::move(f), 3, 2)); + EXPECT_EQ(1, base_internal::invoke(EphemeralFunctor(), 3, 2)); } TEST(InvokeTest, OverloadedFunctor) { OverloadedFunctor f; const OverloadedFunctor& cf = f; - EXPECT_EQ("&", Invoke(f)); - EXPECT_EQ("& 42", Invoke(f, " 42")); + EXPECT_EQ("&", base_internal::invoke(f)); + EXPECT_EQ("& 42", base_internal::invoke(f, " 42")); - EXPECT_EQ("const&", Invoke(cf)); - EXPECT_EQ("const& 42", Invoke(cf, " 42")); + EXPECT_EQ("const&", base_internal::invoke(cf)); + EXPECT_EQ("const& 42", base_internal::invoke(cf, " 42")); - EXPECT_EQ("&&", Invoke(std::move(f))); - EXPECT_EQ("&& 42", Invoke(std::move(f), " 42")); + EXPECT_EQ("&&", base_internal::invoke(std::move(f))); + + OverloadedFunctor f2; + EXPECT_EQ("&& 42", base_internal::invoke(std::move(f2), " 42")); } TEST(InvokeTest, ReferenceWrapper) { ConstFunctor cf; MutableFunctor mf; - EXPECT_EQ(1, Invoke(std::cref(cf), 3, 2)); - EXPECT_EQ(1, Invoke(std::ref(cf), 3, 2)); - EXPECT_EQ(1, Invoke(std::ref(mf), 3, 2)); + EXPECT_EQ(1, base_internal::invoke(std::cref(cf), 3, 2)); + EXPECT_EQ(1, base_internal::invoke(std::ref(cf), 3, 2)); + EXPECT_EQ(1, base_internal::invoke(std::ref(mf), 3, 2)); } TEST(InvokeTest, MemberFunction) { @@ -158,58 +160,62 @@ TEST(InvokeTest, MemberFunction) { std::unique_ptr cp(new Class); std::unique_ptr vp(new Class); - EXPECT_EQ(1, Invoke(&Class::Method, p, 3, 2)); - EXPECT_EQ(1, Invoke(&Class::Method, p.get(), 3, 2)); - EXPECT_EQ(1, Invoke(&Class::Method, *p, 3, 2)); - EXPECT_EQ(1, Invoke(&Class::RefMethod, p, 3, 2)); - EXPECT_EQ(1, Invoke(&Class::RefMethod, p.get(), 3, 2)); - EXPECT_EQ(1, Invoke(&Class::RefMethod, *p, 3, 2)); - EXPECT_EQ(1, Invoke(&Class::RefRefMethod, std::move(*p), 3, 2)); // NOLINT - EXPECT_EQ(1, Invoke(&Class::NoExceptMethod, p, 3, 2)); - EXPECT_EQ(1, Invoke(&Class::NoExceptMethod, p.get(), 3, 2)); - EXPECT_EQ(1, Invoke(&Class::NoExceptMethod, *p, 3, 2)); + EXPECT_EQ(1, base_internal::invoke(&Class::Method, p, 3, 2)); + EXPECT_EQ(1, base_internal::invoke(&Class::Method, p.get(), 3, 2)); + EXPECT_EQ(1, base_internal::invoke(&Class::Method, *p, 3, 2)); + EXPECT_EQ(1, base_internal::invoke(&Class::RefMethod, p, 3, 2)); + EXPECT_EQ(1, base_internal::invoke(&Class::RefMethod, p.get(), 3, 2)); + EXPECT_EQ(1, base_internal::invoke(&Class::RefMethod, *p, 3, 2)); + EXPECT_EQ(1, base_internal::invoke(&Class::RefRefMethod, std::move(*p), 3, + 2)); // NOLINT + EXPECT_EQ(1, base_internal::invoke(&Class::NoExceptMethod, p, 3, 2)); + EXPECT_EQ(1, base_internal::invoke(&Class::NoExceptMethod, p.get(), 3, 2)); + EXPECT_EQ(1, base_internal::invoke(&Class::NoExceptMethod, *p, 3, 2)); - EXPECT_EQ(1, Invoke(&Class::ConstMethod, p, 3, 2)); - EXPECT_EQ(1, Invoke(&Class::ConstMethod, p.get(), 3, 2)); - EXPECT_EQ(1, Invoke(&Class::ConstMethod, *p, 3, 2)); + EXPECT_EQ(1, base_internal::invoke(&Class::ConstMethod, p, 3, 2)); + EXPECT_EQ(1, base_internal::invoke(&Class::ConstMethod, p.get(), 3, 2)); + EXPECT_EQ(1, base_internal::invoke(&Class::ConstMethod, *p, 3, 2)); - EXPECT_EQ(1, Invoke(&Class::ConstMethod, cp, 3, 2)); - EXPECT_EQ(1, Invoke(&Class::ConstMethod, cp.get(), 3, 2)); - EXPECT_EQ(1, Invoke(&Class::ConstMethod, *cp, 3, 2)); + EXPECT_EQ(1, base_internal::invoke(&Class::ConstMethod, cp, 3, 2)); + EXPECT_EQ(1, base_internal::invoke(&Class::ConstMethod, cp.get(), 3, 2)); + EXPECT_EQ(1, base_internal::invoke(&Class::ConstMethod, *cp, 3, 2)); - EXPECT_EQ(1, Invoke(&Class::VolatileMethod, p, 3, 2)); - EXPECT_EQ(1, Invoke(&Class::VolatileMethod, p.get(), 3, 2)); - EXPECT_EQ(1, Invoke(&Class::VolatileMethod, *p, 3, 2)); - EXPECT_EQ(1, Invoke(&Class::VolatileMethod, vp, 3, 2)); - EXPECT_EQ(1, Invoke(&Class::VolatileMethod, vp.get(), 3, 2)); - EXPECT_EQ(1, Invoke(&Class::VolatileMethod, *vp, 3, 2)); + EXPECT_EQ(1, base_internal::invoke(&Class::VolatileMethod, p, 3, 2)); + EXPECT_EQ(1, base_internal::invoke(&Class::VolatileMethod, p.get(), 3, 2)); + EXPECT_EQ(1, base_internal::invoke(&Class::VolatileMethod, *p, 3, 2)); + EXPECT_EQ(1, base_internal::invoke(&Class::VolatileMethod, vp, 3, 2)); + EXPECT_EQ(1, base_internal::invoke(&Class::VolatileMethod, vp.get(), 3, 2)); + EXPECT_EQ(1, base_internal::invoke(&Class::VolatileMethod, *vp, 3, 2)); - EXPECT_EQ(1, Invoke(&Class::Method, make_unique(), 3, 2)); - EXPECT_EQ(1, Invoke(&Class::ConstMethod, make_unique(), 3, 2)); - EXPECT_EQ(1, Invoke(&Class::ConstMethod, make_unique(), 3, 2)); + EXPECT_EQ(1, + base_internal::invoke(&Class::Method, make_unique(), 3, 2)); + EXPECT_EQ(1, base_internal::invoke(&Class::ConstMethod, make_unique(), + 3, 2)); + EXPECT_EQ(1, base_internal::invoke(&Class::ConstMethod, + make_unique(), 3, 2)); } TEST(InvokeTest, DataMember) { std::unique_ptr p(new Class{42}); std::unique_ptr cp(new Class{42}); - EXPECT_EQ(42, Invoke(&Class::member, p)); - EXPECT_EQ(42, Invoke(&Class::member, *p)); - EXPECT_EQ(42, Invoke(&Class::member, p.get())); + EXPECT_EQ(42, base_internal::invoke(&Class::member, p)); + EXPECT_EQ(42, base_internal::invoke(&Class::member, *p)); + EXPECT_EQ(42, base_internal::invoke(&Class::member, p.get())); - Invoke(&Class::member, p) = 42; - Invoke(&Class::member, p.get()) = 42; + base_internal::invoke(&Class::member, p) = 42; + base_internal::invoke(&Class::member, p.get()) = 42; - EXPECT_EQ(42, Invoke(&Class::member, cp)); - EXPECT_EQ(42, Invoke(&Class::member, *cp)); - EXPECT_EQ(42, Invoke(&Class::member, cp.get())); + EXPECT_EQ(42, base_internal::invoke(&Class::member, cp)); + EXPECT_EQ(42, base_internal::invoke(&Class::member, *cp)); + EXPECT_EQ(42, base_internal::invoke(&Class::member, cp.get())); } TEST(InvokeTest, FlipFlop) { FlipFlop obj = {42}; // This call could resolve to (obj.*&FlipFlop::ConstMethod)() or // ((*obj).*&FlipFlop::ConstMethod)(). We verify that it's the former. - EXPECT_EQ(42, Invoke(&FlipFlop::ConstMethod, obj)); - EXPECT_EQ(42, Invoke(&FlipFlop::member, obj)); + EXPECT_EQ(42, base_internal::invoke(&FlipFlop::ConstMethod, obj)); + EXPECT_EQ(42, base_internal::invoke(&FlipFlop::member, obj)); } TEST(InvokeTest, SfinaeFriendly) { diff --git a/third_party/abseil_cpp/absl/base/log_severity.h b/third_party/abseil_cpp/absl/base/log_severity.h index 65a3b1667..045f17f81 100644 --- a/third_party/abseil_cpp/absl/base/log_severity.h +++ b/third_party/abseil_cpp/absl/base/log_severity.h @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef ABSL_BASE_INTERNAL_LOG_SEVERITY_H_ -#define ABSL_BASE_INTERNAL_LOG_SEVERITY_H_ +#ifndef ABSL_BASE_LOG_SEVERITY_H_ +#define ABSL_BASE_LOG_SEVERITY_H_ #include #include @@ -118,4 +118,4 @@ std::ostream& operator<<(std::ostream& os, absl::LogSeverity s); ABSL_NAMESPACE_END } // namespace absl -#endif // ABSL_BASE_INTERNAL_LOG_SEVERITY_H_ +#endif // ABSL_BASE_LOG_SEVERITY_H_ diff --git a/third_party/abseil_cpp/absl/base/macros.h b/third_party/abseil_cpp/absl/base/macros.h index ea1da65ba..3e085a916 100644 --- a/third_party/abseil_cpp/absl/base/macros.h +++ b/third_party/abseil_cpp/absl/base/macros.h @@ -55,85 +55,6 @@ auto ArraySizeHelper(const T (&array)[N]) -> char (&)[N]; ABSL_NAMESPACE_END } // namespace absl -// ABSL_FALLTHROUGH_INTENDED -// -// Annotates implicit fall-through between switch labels, allowing a case to -// indicate intentional fallthrough and turn off warnings about any lack of a -// `break` statement. The ABSL_FALLTHROUGH_INTENDED macro should be followed by -// a semicolon and can be used in most places where `break` can, provided that -// no statements exist between it and the next switch label. -// -// Example: -// -// switch (x) { -// case 40: -// case 41: -// if (truth_is_out_there) { -// ++x; -// ABSL_FALLTHROUGH_INTENDED; // Use instead of/along with annotations -// // in comments -// } else { -// return x; -// } -// case 42: -// ... -// -// Notes: when compiled with clang in C++11 mode, the ABSL_FALLTHROUGH_INTENDED -// macro is expanded to the [[clang::fallthrough]] attribute, which is analysed -// when performing switch labels fall-through diagnostic -// (`-Wimplicit-fallthrough`). See clang documentation on language extensions -// for details: -// https://clang.llvm.org/docs/AttributeReference.html#fallthrough-clang-fallthrough -// -// When used with unsupported compilers, the ABSL_FALLTHROUGH_INTENDED macro -// has no effect on diagnostics. In any case this macro has no effect on runtime -// behavior and performance of code. -#ifdef ABSL_FALLTHROUGH_INTENDED -#error "ABSL_FALLTHROUGH_INTENDED should not be defined." -#endif - -// TODO(zhangxy): Use c++17 standard [[fallthrough]] macro, when supported. -#if defined(__clang__) && defined(__has_warning) -#if __has_feature(cxx_attributes) && __has_warning("-Wimplicit-fallthrough") -#define ABSL_FALLTHROUGH_INTENDED [[clang::fallthrough]] -#endif -#elif defined(__GNUC__) && __GNUC__ >= 7 -#define ABSL_FALLTHROUGH_INTENDED [[gnu::fallthrough]] -#endif - -#ifndef ABSL_FALLTHROUGH_INTENDED -#define ABSL_FALLTHROUGH_INTENDED \ - do { \ - } while (0) -#endif - -// ABSL_DEPRECATED() -// -// Marks a deprecated class, struct, enum, function, method and variable -// declarations. The macro argument is used as a custom diagnostic message (e.g. -// suggestion of a better alternative). -// -// Examples: -// -// class ABSL_DEPRECATED("Use Bar instead") Foo {...}; -// -// ABSL_DEPRECATED("Use Baz() instead") void Bar() {...} -// -// template -// ABSL_DEPRECATED("Use DoThat() instead") -// void DoThis(); -// -// Every usage of a deprecated entity will trigger a warning when compiled with -// clang's `-Wdeprecated-declarations` option. This option is turned off by -// default, but the warnings will be reported by clang-tidy. -#if defined(__clang__) && __cplusplus >= 201103L -#define ABSL_DEPRECATED(message) __attribute__((deprecated(message))) -#endif - -#ifndef ABSL_DEPRECATED -#define ABSL_DEPRECATED(message) -#endif - // ABSL_BAD_CALL_IF() // // Used on a function overload to trap bad calls: any call that matches the @@ -223,4 +144,15 @@ ABSL_NAMESPACE_END #define ABSL_INTERNAL_RETHROW do {} while (false) #endif // ABSL_HAVE_EXCEPTIONS +// `ABSL_INTERNAL_UNREACHABLE` is an unreachable statement. A program which +// reaches one has undefined behavior, and the compiler may optimize +// accordingly. +#if defined(__GNUC__) || ABSL_HAVE_BUILTIN(__builtin_unreachable) +#define ABSL_INTERNAL_UNREACHABLE __builtin_unreachable() +#elif defined(_MSC_VER) +#define ABSL_INTERNAL_UNREACHABLE __assume(0) +#else +#define ABSL_INTERNAL_UNREACHABLE +#endif + #endif // ABSL_BASE_MACROS_H_ diff --git a/third_party/abseil_cpp/absl/base/optimization.h b/third_party/abseil_cpp/absl/base/optimization.h index 92bf9cd38..393fc3a42 100644 --- a/third_party/abseil_cpp/absl/base/optimization.h +++ b/third_party/abseil_cpp/absl/base/optimization.h @@ -171,7 +171,7 @@ // to yield performance improvements. #if ABSL_HAVE_BUILTIN(__builtin_expect) || \ (defined(__GNUC__) && !defined(__clang__)) -#define ABSL_PREDICT_FALSE(x) (__builtin_expect(x, 0)) +#define ABSL_PREDICT_FALSE(x) (__builtin_expect(false || (x), false)) #define ABSL_PREDICT_TRUE(x) (__builtin_expect(false || (x), true)) #else #define ABSL_PREDICT_FALSE(x) (x) @@ -179,7 +179,7 @@ #endif // ABSL_INTERNAL_ASSUME(cond) -// Informs the compiler than a condition is always true and that it can assume +// Informs the compiler that a condition is always true and that it can assume // it to be true for optimization purposes. The call has undefined behavior if // the condition is false. // In !NDEBUG mode, the condition is checked with an assert(). diff --git a/third_party/abseil_cpp/absl/base/optimization_test.cc b/third_party/abseil_cpp/absl/base/optimization_test.cc index 894b68f8f..e83369f32 100644 --- a/third_party/abseil_cpp/absl/base/optimization_test.cc +++ b/third_party/abseil_cpp/absl/base/optimization_test.cc @@ -74,9 +74,8 @@ TEST(PredictTest, Pointer) { const int *null_intptr = nullptr; EXPECT_TRUE(ABSL_PREDICT_TRUE(good_intptr)); EXPECT_FALSE(ABSL_PREDICT_TRUE(null_intptr)); - // The following doesn't compile: - // EXPECT_TRUE(ABSL_PREDICT_FALSE(good_intptr)); - // EXPECT_FALSE(ABSL_PREDICT_FALSE(null_intptr)); + EXPECT_TRUE(ABSL_PREDICT_FALSE(good_intptr)); + EXPECT_FALSE(ABSL_PREDICT_FALSE(null_intptr)); } TEST(PredictTest, Optional) { @@ -85,9 +84,8 @@ TEST(PredictTest, Optional) { absl::optional no_value; EXPECT_TRUE(ABSL_PREDICT_TRUE(has_value)); EXPECT_FALSE(ABSL_PREDICT_TRUE(no_value)); - // The following doesn't compile: - // EXPECT_TRUE(ABSL_PREDICT_FALSE(has_value)); - // EXPECT_FALSE(ABSL_PREDICT_FALSE(no_value)); + EXPECT_TRUE(ABSL_PREDICT_FALSE(has_value)); + EXPECT_FALSE(ABSL_PREDICT_FALSE(no_value)); } class ImplictlyConvertibleToBool { @@ -124,9 +122,8 @@ TEST(PredictTest, ExplicitBoolConversion) { const ExplictlyConvertibleToBool is_false(false); if (!ABSL_PREDICT_TRUE(is_true)) ADD_FAILURE(); if (ABSL_PREDICT_TRUE(is_false)) ADD_FAILURE(); - // The following doesn't compile: - // if (!ABSL_PREDICT_FALSE(is_true)) ADD_FAILURE(); - // if (ABSL_PREDICT_FALSE(is_false)) ADD_FAILURE(); + if (!ABSL_PREDICT_FALSE(is_true)) ADD_FAILURE(); + if (ABSL_PREDICT_FALSE(is_false)) ADD_FAILURE(); } } // namespace diff --git a/third_party/abseil_cpp/absl/base/policy_checks.h b/third_party/abseil_cpp/absl/base/policy_checks.h index 4dfa49e54..06b324391 100644 --- a/third_party/abseil_cpp/absl/base/policy_checks.h +++ b/third_party/abseil_cpp/absl/base/policy_checks.h @@ -41,7 +41,7 @@ #endif // ----------------------------------------------------------------------------- -// Compiler Check +// Toolchain Check // ----------------------------------------------------------------------------- // We support MSVC++ 14.0 update 2 and later. diff --git a/third_party/abseil_cpp/absl/base/spinlock_test_common.cc b/third_party/abseil_cpp/absl/base/spinlock_test_common.cc index b68c51a1d..dee266e4f 100644 --- a/third_party/abseil_cpp/absl/base/spinlock_test_common.cc +++ b/third_party/abseil_cpp/absl/base/spinlock_test_common.cc @@ -20,10 +20,12 @@ #include #include #include // NOLINT(build/c++11) +#include #include #include "gtest/gtest.h" #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/base/internal/low_level_scheduling.h" #include "absl/base/internal/scheduling_mode.h" #include "absl/base/internal/spinlock.h" @@ -103,6 +105,10 @@ static void ThreadedTest(SpinLock* spinlock) { } } +#ifndef ABSL_HAVE_THREAD_SANITIZER +static_assert(std::is_trivially_destructible(), ""); +#endif + TEST(SpinLock, StackNonCooperativeDisablesScheduling) { SpinLock spinlock(base_internal::SCHEDULE_KERNEL_ONLY); spinlock.Lock(); diff --git a/third_party/abseil_cpp/absl/base/thread_annotations.h b/third_party/abseil_cpp/absl/base/thread_annotations.h index 5f51c0c2d..e23fff1d2 100644 --- a/third_party/abseil_cpp/absl/base/thread_annotations.h +++ b/third_party/abseil_cpp/absl/base/thread_annotations.h @@ -34,16 +34,11 @@ #ifndef ABSL_BASE_THREAD_ANNOTATIONS_H_ #define ABSL_BASE_THREAD_ANNOTATIONS_H_ +#include "absl/base/attributes.h" #include "absl/base/config.h" // TODO(mbonadei): Remove after the backward compatibility period. #include "absl/base/internal/thread_annotations.h" // IWYU pragma: export -#if defined(__clang__) -#define ABSL_INTERNAL_THREAD_ANNOTATION_ATTRIBUTE(x) __attribute__((x)) -#else -#define ABSL_INTERNAL_THREAD_ANNOTATION_ATTRIBUTE(x) // no-op -#endif - // ABSL_GUARDED_BY() // // Documents if a shared field or global variable needs to be protected by a @@ -61,8 +56,11 @@ // int p1_ ABSL_GUARDED_BY(mu_); // ... // }; -#define ABSL_GUARDED_BY(x) \ - ABSL_INTERNAL_THREAD_ANNOTATION_ATTRIBUTE(guarded_by(x)) +#if ABSL_HAVE_ATTRIBUTE(guarded_by) +#define ABSL_GUARDED_BY(x) __attribute__((guarded_by(x))) +#else +#define ABSL_GUARDED_BY(x) +#endif // ABSL_PT_GUARDED_BY() // @@ -84,8 +82,11 @@ // // `q_`, guarded by `mu1_`, points to a shared memory location that is // // guarded by `mu2_`: // int *q_ ABSL_GUARDED_BY(mu1_) ABSL_PT_GUARDED_BY(mu2_); -#define ABSL_PT_GUARDED_BY(x) \ - ABSL_INTERNAL_THREAD_ANNOTATION_ATTRIBUTE(pt_guarded_by(x)) +#if ABSL_HAVE_ATTRIBUTE(pt_guarded_by) +#define ABSL_PT_GUARDED_BY(x) __attribute__((pt_guarded_by(x))) +#else +#define ABSL_PT_GUARDED_BY(x) +#endif // ABSL_ACQUIRED_AFTER() / ABSL_ACQUIRED_BEFORE() // @@ -102,11 +103,17 @@ // // Mutex m1_; // Mutex m2_ ABSL_ACQUIRED_AFTER(m1_); -#define ABSL_ACQUIRED_AFTER(...) \ - ABSL_INTERNAL_THREAD_ANNOTATION_ATTRIBUTE(acquired_after(__VA_ARGS__)) +#if ABSL_HAVE_ATTRIBUTE(acquired_after) +#define ABSL_ACQUIRED_AFTER(...) __attribute__((acquired_after(__VA_ARGS__))) +#else +#define ABSL_ACQUIRED_AFTER(...) +#endif -#define ABSL_ACQUIRED_BEFORE(...) \ - ABSL_INTERNAL_THREAD_ANNOTATION_ATTRIBUTE(acquired_before(__VA_ARGS__)) +#if ABSL_HAVE_ATTRIBUTE(acquired_before) +#define ABSL_ACQUIRED_BEFORE(...) __attribute__((acquired_before(__VA_ARGS__))) +#else +#define ABSL_ACQUIRED_BEFORE(...) +#endif // ABSL_EXCLUSIVE_LOCKS_REQUIRED() / ABSL_SHARED_LOCKS_REQUIRED() // @@ -131,33 +138,50 @@ // // void foo() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu1, mu2) { ... } // void bar() const ABSL_SHARED_LOCKS_REQUIRED(mu1, mu2) { ... } -#define ABSL_EXCLUSIVE_LOCKS_REQUIRED(...) \ - ABSL_INTERNAL_THREAD_ANNOTATION_ATTRIBUTE( \ - exclusive_locks_required(__VA_ARGS__)) +#if ABSL_HAVE_ATTRIBUTE(exclusive_locks_required) +#define ABSL_EXCLUSIVE_LOCKS_REQUIRED(...) \ + __attribute__((exclusive_locks_required(__VA_ARGS__))) +#else +#define ABSL_EXCLUSIVE_LOCKS_REQUIRED(...) +#endif +#if ABSL_HAVE_ATTRIBUTE(shared_locks_required) #define ABSL_SHARED_LOCKS_REQUIRED(...) \ - ABSL_INTERNAL_THREAD_ANNOTATION_ATTRIBUTE(shared_locks_required(__VA_ARGS__)) + __attribute__((shared_locks_required(__VA_ARGS__))) +#else +#define ABSL_SHARED_LOCKS_REQUIRED(...) +#endif // ABSL_LOCKS_EXCLUDED() // // Documents the locks acquired in the body of the function. These locks // cannot be held when calling this function (as Abseil's `Mutex` locks are // non-reentrant). -#define ABSL_LOCKS_EXCLUDED(...) \ - ABSL_INTERNAL_THREAD_ANNOTATION_ATTRIBUTE(locks_excluded(__VA_ARGS__)) +#if ABSL_HAVE_ATTRIBUTE(locks_excluded) +#define ABSL_LOCKS_EXCLUDED(...) __attribute__((locks_excluded(__VA_ARGS__))) +#else +#define ABSL_LOCKS_EXCLUDED(...) +#endif // ABSL_LOCK_RETURNED() // // Documents a function that returns a mutex without acquiring it. For example, // a public getter method that returns a pointer to a private mutex should // be annotated with ABSL_LOCK_RETURNED. -#define ABSL_LOCK_RETURNED(x) \ - ABSL_INTERNAL_THREAD_ANNOTATION_ATTRIBUTE(lock_returned(x)) +#if ABSL_HAVE_ATTRIBUTE(lock_returned) +#define ABSL_LOCK_RETURNED(x) __attribute__((lock_returned(x))) +#else +#define ABSL_LOCK_RETURNED(x) +#endif // ABSL_LOCKABLE // // Documents if a class/type is a lockable type (such as the `Mutex` class). -#define ABSL_LOCKABLE ABSL_INTERNAL_THREAD_ANNOTATION_ATTRIBUTE(lockable) +#if ABSL_HAVE_ATTRIBUTE(lockable) +#define ABSL_LOCKABLE __attribute__((lockable)) +#else +#define ABSL_LOCKABLE +#endif // ABSL_SCOPED_LOCKABLE // @@ -166,30 +190,43 @@ // acquired, and the destructor should use `UNLOCK_FUNCTION()` with no // arguments; the analysis will assume that the destructor unlocks whatever the // constructor locked. -#define ABSL_SCOPED_LOCKABLE \ - ABSL_INTERNAL_THREAD_ANNOTATION_ATTRIBUTE(scoped_lockable) +#if ABSL_HAVE_ATTRIBUTE(scoped_lockable) +#define ABSL_SCOPED_LOCKABLE __attribute__((scoped_lockable)) +#else +#define ABSL_SCOPED_LOCKABLE +#endif // ABSL_EXCLUSIVE_LOCK_FUNCTION() // // Documents functions that acquire a lock in the body of a function, and do // not release it. -#define ABSL_EXCLUSIVE_LOCK_FUNCTION(...) \ - ABSL_INTERNAL_THREAD_ANNOTATION_ATTRIBUTE( \ - exclusive_lock_function(__VA_ARGS__)) +#if ABSL_HAVE_ATTRIBUTE(exclusive_lock_function) +#define ABSL_EXCLUSIVE_LOCK_FUNCTION(...) \ + __attribute__((exclusive_lock_function(__VA_ARGS__))) +#else +#define ABSL_EXCLUSIVE_LOCK_FUNCTION(...) +#endif // ABSL_SHARED_LOCK_FUNCTION() // // Documents functions that acquire a shared (reader) lock in the body of a // function, and do not release it. +#if ABSL_HAVE_ATTRIBUTE(shared_lock_function) #define ABSL_SHARED_LOCK_FUNCTION(...) \ - ABSL_INTERNAL_THREAD_ANNOTATION_ATTRIBUTE(shared_lock_function(__VA_ARGS__)) + __attribute__((shared_lock_function(__VA_ARGS__))) +#else +#define ABSL_SHARED_LOCK_FUNCTION(...) +#endif // ABSL_UNLOCK_FUNCTION() // // Documents functions that expect a lock to be held on entry to the function, // and release it in the body of the function. -#define ABSL_UNLOCK_FUNCTION(...) \ - ABSL_INTERNAL_THREAD_ANNOTATION_ATTRIBUTE(unlock_function(__VA_ARGS__)) +#if ABSL_HAVE_ATTRIBUTE(unlock_function) +#define ABSL_UNLOCK_FUNCTION(...) __attribute__((unlock_function(__VA_ARGS__))) +#else +#define ABSL_UNLOCK_FUNCTION(...) +#endif // ABSL_EXCLUSIVE_TRYLOCK_FUNCTION() / ABSL_SHARED_TRYLOCK_FUNCTION() // @@ -199,31 +236,49 @@ // success, or `false` for functions that return `false` on success. The second // argument specifies the mutex that is locked on success. If unspecified, this // mutex is assumed to be `this`. +#if ABSL_HAVE_ATTRIBUTE(exclusive_trylock_function) #define ABSL_EXCLUSIVE_TRYLOCK_FUNCTION(...) \ - ABSL_INTERNAL_THREAD_ANNOTATION_ATTRIBUTE( \ - exclusive_trylock_function(__VA_ARGS__)) + __attribute__((exclusive_trylock_function(__VA_ARGS__))) +#else +#define ABSL_EXCLUSIVE_TRYLOCK_FUNCTION(...) +#endif -#define ABSL_SHARED_TRYLOCK_FUNCTION(...) \ - ABSL_INTERNAL_THREAD_ANNOTATION_ATTRIBUTE( \ - shared_trylock_function(__VA_ARGS__)) +#if ABSL_HAVE_ATTRIBUTE(shared_trylock_function) +#define ABSL_SHARED_TRYLOCK_FUNCTION(...) \ + __attribute__((shared_trylock_function(__VA_ARGS__))) +#else +#define ABSL_SHARED_TRYLOCK_FUNCTION(...) +#endif // ABSL_ASSERT_EXCLUSIVE_LOCK() / ABSL_ASSERT_SHARED_LOCK() // // Documents functions that dynamically check to see if a lock is held, and fail // if it is not held. +#if ABSL_HAVE_ATTRIBUTE(assert_exclusive_lock) #define ABSL_ASSERT_EXCLUSIVE_LOCK(...) \ - ABSL_INTERNAL_THREAD_ANNOTATION_ATTRIBUTE(assert_exclusive_lock(__VA_ARGS__)) + __attribute__((assert_exclusive_lock(__VA_ARGS__))) +#else +#define ABSL_ASSERT_EXCLUSIVE_LOCK(...) +#endif +#if ABSL_HAVE_ATTRIBUTE(assert_shared_lock) #define ABSL_ASSERT_SHARED_LOCK(...) \ - ABSL_INTERNAL_THREAD_ANNOTATION_ATTRIBUTE(assert_shared_lock(__VA_ARGS__)) + __attribute__((assert_shared_lock(__VA_ARGS__))) +#else +#define ABSL_ASSERT_SHARED_LOCK(...) +#endif // ABSL_NO_THREAD_SAFETY_ANALYSIS // // Turns off thread safety checking within the body of a particular function. // This annotation is used to mark functions that are known to be correct, but // the locking behavior is more complicated than the analyzer can handle. +#if ABSL_HAVE_ATTRIBUTE(no_thread_safety_analysis) #define ABSL_NO_THREAD_SAFETY_ANALYSIS \ - ABSL_INTERNAL_THREAD_ANNOTATION_ATTRIBUTE(no_thread_safety_analysis) + __attribute__((no_thread_safety_analysis)) +#else +#define ABSL_NO_THREAD_SAFETY_ANALYSIS +#endif //------------------------------------------------------------------------------ // Tool-Supplied Annotations diff --git a/third_party/abseil_cpp/absl/compiler_config_setting.bzl b/third_party/abseil_cpp/absl/compiler_config_setting.bzl deleted file mode 100644 index 66962294d..000000000 --- a/third_party/abseil_cpp/absl/compiler_config_setting.bzl +++ /dev/null @@ -1,38 +0,0 @@ -# -# Copyright 2018 The Abseil 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 -# -# https://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. - -"""Creates config_setting that allows selecting based on 'compiler' value.""" - -def create_llvm_config(name, visibility): - # The "do_not_use_tools_cpp_compiler_present" attribute exists to - # distinguish between older versions of Bazel that do not support - # "@bazel_tools//tools/cpp:compiler" flag_value, and newer ones that do. - # In the future, the only way to select on the compiler will be through - # flag_values{"@bazel_tools//tools/cpp:compiler"} and the else branch can - # be removed. - if hasattr(cc_common, "do_not_use_tools_cpp_compiler_present"): - native.config_setting( - name = name, - flag_values = { - "@bazel_tools//tools/cpp:compiler": "llvm", - }, - visibility = visibility, - ) - else: - native.config_setting( - name = name, - values = {"compiler": "llvm"}, - visibility = visibility, - ) diff --git a/third_party/abseil_cpp/absl/container/BUILD.bazel b/third_party/abseil_cpp/absl/container/BUILD.bazel index 069212354..8e72ad035 100644 --- a/third_party/abseil_cpp/absl/container/BUILD.bazel +++ b/third_party/abseil_cpp/absl/container/BUILD.bazel @@ -24,7 +24,7 @@ load( package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) cc_library( name = "compressed_tuple", @@ -60,6 +60,7 @@ cc_library( deps = [ ":compressed_tuple", "//absl/algorithm", + "//absl/base:config", "//absl/base:core_headers", "//absl/base:dynamic_annotations", "//absl/base:throw_delegate", @@ -368,6 +369,7 @@ cc_library( copts = ABSL_DEFAULT_COPTS, linkopts = ABSL_DEFAULT_LINKOPTS, deps = [ + "//absl/base:config", "//absl/memory", "//absl/meta:type_traits", "//absl/utility", @@ -620,6 +622,7 @@ cc_test( ":hashtable_debug", ":raw_hash_set", "//absl/base", + "//absl/base:config", "//absl/base:core_headers", "//absl/base:raw_logging_internal", "//absl/strings", @@ -647,6 +650,7 @@ cc_library( copts = ABSL_DEFAULT_COPTS, linkopts = ABSL_DEFAULT_LINKOPTS, deps = [ + "//absl/base:config", "//absl/base:core_headers", "//absl/meta:type_traits", "//absl/strings", @@ -665,6 +669,7 @@ cc_test( visibility = ["//visibility:private"], deps = [ ":layout", + "//absl/base:config", "//absl/base:core_headers", "//absl/base:raw_logging_internal", "//absl/types:span", diff --git a/third_party/abseil_cpp/absl/container/CMakeLists.txt b/third_party/abseil_cpp/absl/container/CMakeLists.txt index 13d969576..eb202c459 100644 --- a/third_party/abseil_cpp/absl/container/CMakeLists.txt +++ b/third_party/abseil_cpp/absl/container/CMakeLists.txt @@ -131,6 +131,7 @@ absl_cc_library( DEPS absl::compressed_tuple absl::algorithm + absl::config absl::core_headers absl::dynamic_annotations absl::throw_delegate @@ -423,6 +424,7 @@ absl_cc_library( COPTS ${ABSL_DEFAULT_COPTS} DEPS + absl::config absl::memory absl::type_traits absl::utility @@ -696,6 +698,7 @@ absl_cc_test( absl::hashtable_debug absl::raw_hash_set absl::base + absl::config absl::core_headers absl::raw_logging_internal absl::strings @@ -724,6 +727,7 @@ absl_cc_library( COPTS ${ABSL_DEFAULT_COPTS} DEPS + absl::config absl::core_headers absl::meta absl::strings @@ -741,6 +745,7 @@ absl_cc_test( ${ABSL_TEST_COPTS} DEPS absl::layout + absl::config absl::core_headers absl::raw_logging_internal absl::span diff --git a/third_party/abseil_cpp/absl/container/btree_map.h b/third_party/abseil_cpp/absl/container/btree_map.h index bb450eadd..abc09b0ac 100644 --- a/third_party/abseil_cpp/absl/container/btree_map.h +++ b/third_party/abseil_cpp/absl/container/btree_map.h @@ -185,7 +185,7 @@ class btree_map // template size_type erase(const K& key): // // Erases the element with the matching key, if it exists, returning the - // number of elements erased. + // number of elements erased (0 or 1). using Base::erase; // btree_map::insert() @@ -325,6 +325,11 @@ class btree_map // does not contain an element with a matching key, this function returns an // empty node handle. // + // NOTE: when compiled in an earlier version of C++ than C++17, + // `node_type::key()` returns a const reference to the key instead of a + // mutable reference. We cannot safely return a mutable reference without + // std::launder (which is not available before C++17). + // // NOTE: In this context, `node_type` refers to the C++17 concept of a // move-only type that owns and provides access to the elements in associative // containers (https://en.cppreference.com/w/cpp/container/node_handle). @@ -652,6 +657,11 @@ class btree_multimap // does not contain an element with a matching key, this function returns an // empty node handle. // + // NOTE: when compiled in an earlier version of C++ than C++17, + // `node_type::key()` returns a const reference to the key instead of a + // mutable reference. We cannot safely return a mutable reference without + // std::launder (which is not available before C++17). + // // NOTE: In this context, `node_type` refers to the C++17 concept of a // move-only type that owns and provides access to the elements in associative // containers (https://en.cppreference.com/w/cpp/container/node_handle). diff --git a/third_party/abseil_cpp/absl/container/btree_set.h b/third_party/abseil_cpp/absl/container/btree_set.h index d3e78866a..21ef0a032 100644 --- a/third_party/abseil_cpp/absl/container/btree_set.h +++ b/third_party/abseil_cpp/absl/container/btree_set.h @@ -183,7 +183,7 @@ class btree_set // template size_type erase(const K& key): // // Erases the element with the matching key, if it exists, returning the - // number of elements erased. + // number of elements erased (0 or 1). using Base::erase; // btree_set::insert() diff --git a/third_party/abseil_cpp/absl/container/btree_test.cc b/third_party/abseil_cpp/absl/container/btree_test.cc index bbdb5f42a..9b1b6436c 100644 --- a/third_party/abseil_cpp/absl/container/btree_test.cc +++ b/third_party/abseil_cpp/absl/container/btree_test.cc @@ -15,6 +15,7 @@ #include "absl/container/btree_test.h" #include +#include #include #include #include @@ -52,7 +53,9 @@ using ::absl::test_internal::MovableOnlyInstance; using ::testing::ElementsAre; using ::testing::ElementsAreArray; using ::testing::IsEmpty; +using ::testing::IsNull; using ::testing::Pair; +using ::testing::SizeIs; template void CheckPairEquals(const T &x, const U &y) { @@ -1180,6 +1183,103 @@ TEST(Btree, RangeCtorSanity) { EXPECT_EQ(1, tmap.size()); } +} // namespace + +class BtreeNodePeer { + public: + // Yields the size of a leaf node with a specific number of values. + template + constexpr static size_t GetTargetNodeSize(size_t target_values_per_node) { + return btree_node< + set_params, std::allocator, + /*TargetNodeSize=*/256, // This parameter isn't used here. + /*Multi=*/false>>::SizeWithNValues(target_values_per_node); + } + + // Yields the number of values in a (non-root) leaf node for this btree. + template + constexpr static size_t GetNumValuesPerNode() { + return btree_node::kNodeValues; + } + + template + constexpr static size_t GetMaxFieldType() { + return std::numeric_limits< + typename btree_node::field_type>::max(); + } + + template + constexpr static bool UsesLinearNodeSearch() { + return btree_node::use_linear_search::value; + } +}; + +namespace { + +class BtreeMapTest : public ::testing::Test { + public: + struct Key {}; + struct Cmp { + template + bool operator()(T, T) const { + return false; + } + }; + + struct KeyLin { + using absl_btree_prefer_linear_node_search = std::true_type; + }; + struct CmpLin : Cmp { + using absl_btree_prefer_linear_node_search = std::true_type; + }; + + struct KeyBin { + using absl_btree_prefer_linear_node_search = std::false_type; + }; + struct CmpBin : Cmp { + using absl_btree_prefer_linear_node_search = std::false_type; + }; + + template + static bool IsLinear() { + return BtreeNodePeer::UsesLinearNodeSearch>(); + } +}; + +TEST_F(BtreeMapTest, TestLinearSearchPreferredForKeyLinearViaAlias) { + // Test requesting linear search by directly exporting an alias. + EXPECT_FALSE((IsLinear())); + EXPECT_TRUE((IsLinear())); + EXPECT_TRUE((IsLinear())); + EXPECT_TRUE((IsLinear())); +} + +TEST_F(BtreeMapTest, LinearChoiceTree) { + // Cmp has precedence, and is forcing binary + EXPECT_FALSE((IsLinear())); + EXPECT_FALSE((IsLinear())); + EXPECT_FALSE((IsLinear())); + EXPECT_FALSE((IsLinear())); + EXPECT_FALSE((IsLinear())); + // Cmp has precedence, and is forcing linear + EXPECT_TRUE((IsLinear())); + EXPECT_TRUE((IsLinear())); + EXPECT_TRUE((IsLinear())); + EXPECT_TRUE((IsLinear())); + EXPECT_TRUE((IsLinear())); + // Cmp has no preference, Key determines linear vs binary. + EXPECT_FALSE((IsLinear())); + EXPECT_TRUE((IsLinear())); + EXPECT_FALSE((IsLinear())); + // arithmetic key w/ std::less or std::greater: linear + EXPECT_TRUE((IsLinear>())); + EXPECT_TRUE((IsLinear>())); + // arithmetic key w/ custom compare: binary + EXPECT_FALSE((IsLinear())); + // non-arithmetic key: binary + EXPECT_FALSE((IsLinear>())); +} + TEST(Btree, BtreeMapCanHoldMoveOnlyTypes) { absl::btree_map> m; @@ -1325,28 +1425,6 @@ TEST(Btree, RValueInsert) { EXPECT_EQ(tracker.swaps(), 0); } -} // namespace - -class BtreeNodePeer { - public: - // Yields the size of a leaf node with a specific number of values. - template - constexpr static size_t GetTargetNodeSize(size_t target_values_per_node) { - return btree_node< - set_params, std::allocator, - /*TargetNodeSize=*/256, // This parameter isn't used here. - /*Multi=*/false>>::SizeWithNValues(target_values_per_node); - } - - // Yields the number of values in a (non-root) leaf node for this set. - template - constexpr static size_t GetNumValuesPerNode() { - return btree_node::kNodeValues; - } -}; - -namespace { - // A btree set with a specific number of values per node. template > class SizedBtreeSet @@ -2101,6 +2179,31 @@ TEST(Btree, MergeIntoMultiMapsWithDifferentComparators) { Pair(4, 1), Pair(4, 4), Pair(5, 5))); } +TEST(Btree, MergeIntoSetMovableOnly) { + absl::btree_set src; + src.insert(MovableOnlyInstance(1)); + absl::btree_multiset dst1; + dst1.insert(MovableOnlyInstance(2)); + absl::btree_set dst2; + + // Test merge into multiset. + dst1.merge(src); + + EXPECT_TRUE(src.empty()); + // ElementsAre/ElementsAreArray don't work with move-only types. + ASSERT_THAT(dst1, SizeIs(2)); + EXPECT_EQ(*dst1.begin(), MovableOnlyInstance(1)); + EXPECT_EQ(*std::next(dst1.begin()), MovableOnlyInstance(2)); + + // Test merge into set. + dst2.merge(dst1); + + EXPECT_TRUE(dst1.empty()); + ASSERT_THAT(dst2, SizeIs(2)); + EXPECT_EQ(*dst2.begin(), MovableOnlyInstance(1)); + EXPECT_EQ(*std::next(dst2.begin()), MovableOnlyInstance(2)); +} + struct KeyCompareToWeakOrdering { template absl::weak_ordering operator()(const T &a, const T &b) const { @@ -2404,6 +2507,320 @@ TEST(Btree, BitfieldArgument) { m[n]; } +TEST(Btree, SetRangeConstructorAndInsertSupportExplicitConversionComparable) { + const absl::string_view names[] = {"n1", "n2"}; + + absl::btree_set name_set1{std::begin(names), std::end(names)}; + EXPECT_THAT(name_set1, ElementsAreArray(names)); + + absl::btree_set name_set2; + name_set2.insert(std::begin(names), std::end(names)); + EXPECT_THAT(name_set2, ElementsAreArray(names)); +} + +// A type that is explicitly convertible from int and counts constructor calls. +struct ConstructorCounted { + explicit ConstructorCounted(int i) : i(i) { ++constructor_calls; } + bool operator==(int other) const { return i == other; } + + int i; + static int constructor_calls; +}; +int ConstructorCounted::constructor_calls = 0; + +struct ConstructorCountedCompare { + bool operator()(int a, const ConstructorCounted &b) const { return a < b.i; } + bool operator()(const ConstructorCounted &a, int b) const { return a.i < b; } + bool operator()(const ConstructorCounted &a, + const ConstructorCounted &b) const { + return a.i < b.i; + } + using is_transparent = void; +}; + +TEST(Btree, + SetRangeConstructorAndInsertExplicitConvComparableLimitConstruction) { + const int i[] = {0, 1, 1}; + ConstructorCounted::constructor_calls = 0; + + absl::btree_set set{ + std::begin(i), std::end(i)}; + EXPECT_THAT(set, ElementsAre(0, 1)); + EXPECT_EQ(ConstructorCounted::constructor_calls, 2); + + set.insert(std::begin(i), std::end(i)); + EXPECT_THAT(set, ElementsAre(0, 1)); + EXPECT_EQ(ConstructorCounted::constructor_calls, 2); +} + +TEST(Btree, + SetRangeConstructorAndInsertSupportExplicitConversionNonComparable) { + const int i[] = {0, 1}; + + absl::btree_set> s1{std::begin(i), std::end(i)}; + EXPECT_THAT(s1, ElementsAre(IsEmpty(), ElementsAre(IsNull()))); + + absl::btree_set> s2; + s2.insert(std::begin(i), std::end(i)); + EXPECT_THAT(s2, ElementsAre(IsEmpty(), ElementsAre(IsNull()))); +} + +// libstdc++ included with GCC 4.9 has a bug in the std::pair constructors that +// prevents explicit conversions between pair types. +// We only run this test for the libstdc++ from GCC 7 or newer because we can't +// reliably check the libstdc++ version prior to that release. +#if !defined(__GLIBCXX__) || \ + (defined(_GLIBCXX_RELEASE) && _GLIBCXX_RELEASE >= 7) +TEST(Btree, MapRangeConstructorAndInsertSupportExplicitConversionComparable) { + const std::pair names[] = {{"n1", 1}, {"n2", 2}}; + + absl::btree_map name_map1{std::begin(names), + std::end(names)}; + EXPECT_THAT(name_map1, ElementsAre(Pair("n1", 1), Pair("n2", 2))); + + absl::btree_map name_map2; + name_map2.insert(std::begin(names), std::end(names)); + EXPECT_THAT(name_map2, ElementsAre(Pair("n1", 1), Pair("n2", 2))); +} + +TEST(Btree, + MapRangeConstructorAndInsertExplicitConvComparableLimitConstruction) { + const std::pair i[] = {{0, 1}, {1, 2}, {1, 3}}; + ConstructorCounted::constructor_calls = 0; + + absl::btree_map map{ + std::begin(i), std::end(i)}; + EXPECT_THAT(map, ElementsAre(Pair(0, 1), Pair(1, 2))); + EXPECT_EQ(ConstructorCounted::constructor_calls, 2); + + map.insert(std::begin(i), std::end(i)); + EXPECT_THAT(map, ElementsAre(Pair(0, 1), Pair(1, 2))); + EXPECT_EQ(ConstructorCounted::constructor_calls, 2); +} + +TEST(Btree, + MapRangeConstructorAndInsertSupportExplicitConversionNonComparable) { + const std::pair i[] = {{0, 1}, {1, 2}}; + + absl::btree_map, int> m1{std::begin(i), std::end(i)}; + EXPECT_THAT(m1, + ElementsAre(Pair(IsEmpty(), 1), Pair(ElementsAre(IsNull()), 2))); + + absl::btree_map, int> m2; + m2.insert(std::begin(i), std::end(i)); + EXPECT_THAT(m2, + ElementsAre(Pair(IsEmpty(), 1), Pair(ElementsAre(IsNull()), 2))); +} + +TEST(Btree, HeterogeneousTryEmplace) { + absl::btree_map m; + std::string s = "key"; + absl::string_view sv = s; + m.try_emplace(sv, 1); + EXPECT_EQ(m[s], 1); + + m.try_emplace(m.end(), sv, 2); + EXPECT_EQ(m[s], 1); +} + +TEST(Btree, HeterogeneousOperatorMapped) { + absl::btree_map m; + std::string s = "key"; + absl::string_view sv = s; + m[sv] = 1; + EXPECT_EQ(m[s], 1); + + m[sv] = 2; + EXPECT_EQ(m[s], 2); +} + +TEST(Btree, HeterogeneousInsertOrAssign) { + absl::btree_map m; + std::string s = "key"; + absl::string_view sv = s; + m.insert_or_assign(sv, 1); + EXPECT_EQ(m[s], 1); + + m.insert_or_assign(m.end(), sv, 2); + EXPECT_EQ(m[s], 2); +} +#endif + +// This test requires std::launder for mutable key access in node handles. +#if defined(__cpp_lib_launder) && __cpp_lib_launder >= 201606 +TEST(Btree, NodeHandleMutableKeyAccess) { + { + absl::btree_map map; + + map["key1"] = "mapped"; + + auto nh = map.extract(map.begin()); + nh.key().resize(3); + map.insert(std::move(nh)); + + EXPECT_THAT(map, ElementsAre(Pair("key", "mapped"))); + } + // Also for multimap. + { + absl::btree_multimap map; + + map.emplace("key1", "mapped"); + + auto nh = map.extract(map.begin()); + nh.key().resize(3); + map.insert(std::move(nh)); + + EXPECT_THAT(map, ElementsAre(Pair("key", "mapped"))); + } +} +#endif + +struct MultiKey { + int i1; + int i2; +}; + +bool operator==(const MultiKey a, const MultiKey b) { + return a.i1 == b.i1 && a.i2 == b.i2; +} + +// A heterogeneous comparator that has different equivalence classes for +// different lookup types. +struct MultiKeyComp { + using is_transparent = void; + bool operator()(const MultiKey a, const MultiKey b) const { + if (a.i1 != b.i1) return a.i1 < b.i1; + return a.i2 < b.i2; + } + bool operator()(const int a, const MultiKey b) const { return a < b.i1; } + bool operator()(const MultiKey a, const int b) const { return a.i1 < b; } +}; + +TEST(Btree, MultiKeyEqualRange) { + absl::btree_set set; + + for (int i = 0; i < 100; ++i) { + for (int j = 0; j < 100; ++j) { + set.insert({i, j}); + } + } + + for (int i = 0; i < 100; ++i) { + auto equal_range = set.equal_range(i); + EXPECT_EQ(equal_range.first->i1, i); + EXPECT_EQ(equal_range.first->i2, 0); + EXPECT_EQ(std::distance(equal_range.first, equal_range.second), 100) << i; + } +} + +TEST(Btree, MultiKeyErase) { + absl::btree_set set = { + {1, 1}, {2, 1}, {2, 2}, {3, 1}}; + EXPECT_EQ(set.erase(2), 2); + EXPECT_THAT(set, ElementsAre(MultiKey{1, 1}, MultiKey{3, 1})); +} + +TEST(Btree, MultiKeyCount) { + const absl::btree_set set = { + {1, 1}, {2, 1}, {2, 2}, {3, 1}}; + EXPECT_EQ(set.count(2), 2); +} + +TEST(Btree, AllocConstructor) { + using Alloc = CountingAllocator; + using Set = absl::btree_set, Alloc>; + int64_t bytes_used = 0; + Alloc alloc(&bytes_used); + Set set(alloc); + + set.insert({1, 2, 3}); + + EXPECT_THAT(set, ElementsAre(1, 2, 3)); + EXPECT_GT(bytes_used, set.size() * sizeof(int)); +} + +TEST(Btree, AllocInitializerListConstructor) { + using Alloc = CountingAllocator; + using Set = absl::btree_set, Alloc>; + int64_t bytes_used = 0; + Alloc alloc(&bytes_used); + Set set({1, 2, 3}, alloc); + + EXPECT_THAT(set, ElementsAre(1, 2, 3)); + EXPECT_GT(bytes_used, set.size() * sizeof(int)); +} + +TEST(Btree, AllocRangeConstructor) { + using Alloc = CountingAllocator; + using Set = absl::btree_set, Alloc>; + int64_t bytes_used = 0; + Alloc alloc(&bytes_used); + std::vector v = {1, 2, 3}; + Set set(v.begin(), v.end(), alloc); + + EXPECT_THAT(set, ElementsAre(1, 2, 3)); + EXPECT_GT(bytes_used, set.size() * sizeof(int)); +} + +TEST(Btree, AllocCopyConstructor) { + using Alloc = CountingAllocator; + using Set = absl::btree_set, Alloc>; + int64_t bytes_used1 = 0; + Alloc alloc1(&bytes_used1); + Set set1(alloc1); + + set1.insert({1, 2, 3}); + + int64_t bytes_used2 = 0; + Alloc alloc2(&bytes_used2); + Set set2(set1, alloc2); + + EXPECT_THAT(set1, ElementsAre(1, 2, 3)); + EXPECT_THAT(set2, ElementsAre(1, 2, 3)); + EXPECT_GT(bytes_used1, set1.size() * sizeof(int)); + EXPECT_EQ(bytes_used1, bytes_used2); +} + +TEST(Btree, AllocMoveConstructor_SameAlloc) { + using Alloc = CountingAllocator; + using Set = absl::btree_set, Alloc>; + int64_t bytes_used = 0; + Alloc alloc(&bytes_used); + Set set1(alloc); + + set1.insert({1, 2, 3}); + + const int64_t original_bytes_used = bytes_used; + EXPECT_GT(original_bytes_used, set1.size() * sizeof(int)); + + Set set2(std::move(set1), alloc); + + EXPECT_THAT(set2, ElementsAre(1, 2, 3)); + EXPECT_EQ(bytes_used, original_bytes_used); +} + +TEST(Btree, AllocMoveConstructor_DifferentAlloc) { + using Alloc = CountingAllocator; + using Set = absl::btree_set, Alloc>; + int64_t bytes_used1 = 0; + Alloc alloc1(&bytes_used1); + Set set1(alloc1); + + set1.insert({1, 2, 3}); + + const int64_t original_bytes_used = bytes_used1; + EXPECT_GT(original_bytes_used, set1.size() * sizeof(int)); + + int64_t bytes_used2 = 0; + Alloc alloc2(&bytes_used2); + Set set2(std::move(set1), alloc2); + + EXPECT_THAT(set2, ElementsAre(1, 2, 3)); + // We didn't free these bytes allocated by `set1` yet. + EXPECT_EQ(bytes_used1, original_bytes_used); + EXPECT_EQ(bytes_used2, original_bytes_used); +} + } // namespace } // namespace container_internal ABSL_NAMESPACE_END diff --git a/third_party/abseil_cpp/absl/container/fixed_array.h b/third_party/abseil_cpp/absl/container/fixed_array.h index adf0dc808..fcb3e545b 100644 --- a/third_party/abseil_cpp/absl/container/fixed_array.h +++ b/third_party/abseil_cpp/absl/container/fixed_array.h @@ -41,6 +41,7 @@ #include #include "absl/algorithm/algorithm.h" +#include "absl/base/config.h" #include "absl/base/dynamic_annotations.h" #include "absl/base/internal/throw_delegate.h" #include "absl/base/macros.h" @@ -231,8 +232,8 @@ class FixedArray { // FixedArray::at // - // Bounds-checked access. Returns a reference to the ith element of the - // fiexed array, or throws std::out_of_range + // Bounds-checked access. Returns a reference to the ith element of the fixed + // array, or throws std::out_of_range reference at(size_type i) { if (ABSL_PREDICT_FALSE(i >= size())) { base_internal::ThrowStdOutOfRange("FixedArray::at failed bounds check"); @@ -422,15 +423,15 @@ class FixedArray { void AnnotateConstruct(size_type n); void AnnotateDestruct(size_type n); -#ifdef ADDRESS_SANITIZER +#ifdef ABSL_HAVE_ADDRESS_SANITIZER void* RedzoneBegin() { return &redzone_begin_; } void* RedzoneEnd() { return &redzone_end_ + 1; } -#endif // ADDRESS_SANITIZER +#endif // ABSL_HAVE_ADDRESS_SANITIZER private: - ADDRESS_SANITIZER_REDZONE(redzone_begin_); + ABSL_ADDRESS_SANITIZER_REDZONE(redzone_begin_); alignas(StorageElement) char buff_[sizeof(StorageElement[inline_elements])]; - ADDRESS_SANITIZER_REDZONE(redzone_end_); + ABSL_ADDRESS_SANITIZER_REDZONE(redzone_end_); }; class EmptyInlinedStorage { @@ -503,22 +504,26 @@ constexpr typename FixedArray::size_type template void FixedArray::NonEmptyInlinedStorage::AnnotateConstruct( typename FixedArray::size_type n) { -#ifdef ADDRESS_SANITIZER +#ifdef ABSL_HAVE_ADDRESS_SANITIZER if (!n) return; - ANNOTATE_CONTIGUOUS_CONTAINER(data(), RedzoneEnd(), RedzoneEnd(), data() + n); - ANNOTATE_CONTIGUOUS_CONTAINER(RedzoneBegin(), data(), data(), RedzoneBegin()); -#endif // ADDRESS_SANITIZER + ABSL_ANNOTATE_CONTIGUOUS_CONTAINER(data(), RedzoneEnd(), RedzoneEnd(), + data() + n); + ABSL_ANNOTATE_CONTIGUOUS_CONTAINER(RedzoneBegin(), data(), data(), + RedzoneBegin()); +#endif // ABSL_HAVE_ADDRESS_SANITIZER static_cast(n); // Mark used when not in asan mode } template void FixedArray::NonEmptyInlinedStorage::AnnotateDestruct( typename FixedArray::size_type n) { -#ifdef ADDRESS_SANITIZER +#ifdef ABSL_HAVE_ADDRESS_SANITIZER if (!n) return; - ANNOTATE_CONTIGUOUS_CONTAINER(data(), RedzoneEnd(), data() + n, RedzoneEnd()); - ANNOTATE_CONTIGUOUS_CONTAINER(RedzoneBegin(), data(), RedzoneBegin(), data()); -#endif // ADDRESS_SANITIZER + ABSL_ANNOTATE_CONTIGUOUS_CONTAINER(data(), RedzoneEnd(), data() + n, + RedzoneEnd()); + ABSL_ANNOTATE_CONTIGUOUS_CONTAINER(RedzoneBegin(), data(), RedzoneBegin(), + data()); +#endif // ABSL_HAVE_ADDRESS_SANITIZER static_cast(n); // Mark used when not in asan mode } ABSL_NAMESPACE_END diff --git a/third_party/abseil_cpp/absl/container/fixed_array_exception_safety_test.cc b/third_party/abseil_cpp/absl/container/fixed_array_exception_safety_test.cc index a5bb009d9..e5f59299b 100644 --- a/third_party/abseil_cpp/absl/container/fixed_array_exception_safety_test.cc +++ b/third_party/abseil_cpp/absl/container/fixed_array_exception_safety_test.cc @@ -150,8 +150,7 @@ TEST(FixedArrayExceptionSafety, InitListConstructorWithAlloc) { template testing::AssertionResult ReadMemory(FixedArrT* fixed_arr) { - // Marked volatile to prevent optimization. Used for running asan tests. - volatile int sum = 0; + int sum = 0; for (const auto& thrower : *fixed_arr) { sum += thrower.Get(); } diff --git a/third_party/abseil_cpp/absl/container/fixed_array_test.cc b/third_party/abseil_cpp/absl/container/fixed_array_test.cc index 064a88a23..49598e7a0 100644 --- a/third_party/abseil_cpp/absl/container/fixed_array_test.cc +++ b/third_party/abseil_cpp/absl/container/fixed_array_test.cc @@ -27,6 +27,7 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" +#include "absl/base/config.h" #include "absl/base/internal/exception_testing.h" #include "absl/base/options.h" #include "absl/container/internal/counting_allocator.h" @@ -767,7 +768,7 @@ TEST(AllocatorSupportTest, SizeValAllocConstructor) { } } -#ifdef ADDRESS_SANITIZER +#ifdef ABSL_HAVE_ADDRESS_SANITIZER TEST(FixedArrayTest, AddressSanitizerAnnotations1) { absl::FixedArray a(10); int* raw = a.data(); @@ -814,7 +815,7 @@ TEST(FixedArrayTest, AddressSanitizerAnnotations4) { // so reading raw[21] should still trigger the correct warning. EXPECT_DEATH_IF_SUPPORTED(raw[21] = ThreeInts(), "container-overflow"); } -#endif // ADDRESS_SANITIZER +#endif // ABSL_HAVE_ADDRESS_SANITIZER TEST(FixedArrayTest, AbslHashValueWorks) { using V = absl::FixedArray; diff --git a/third_party/abseil_cpp/absl/container/flat_hash_map.h b/third_party/abseil_cpp/absl/container/flat_hash_map.h index fcb70d861..74def0df0 100644 --- a/third_party/abseil_cpp/absl/container/flat_hash_map.h +++ b/third_party/abseil_cpp/absl/container/flat_hash_map.h @@ -234,7 +234,8 @@ class flat_hash_map : public absl::container_internal::raw_hash_map< // // size_type erase(const key_type& key): // - // Erases the element with the matching key, if it exists. + // Erases the element with the matching key, if it exists, returning the + // number of elements erased (0 or 1). using Base::erase; // flat_hash_map::insert() @@ -383,6 +384,11 @@ class flat_hash_map : public absl::container_internal::raw_hash_map< // key value and returns a node handle owning that extracted data. If the // `flat_hash_map` does not contain an element with a matching key, this // function returns an empty node handle. + // + // NOTE: when compiled in an earlier version of C++ than C++17, + // `node_type::key()` returns a const reference to the key instead of a + // mutable reference. We cannot safely return a mutable reference without + // std::launder (which is not available before C++17). using Base::extract; // flat_hash_map::merge() diff --git a/third_party/abseil_cpp/absl/container/flat_hash_map_test.cc b/third_party/abseil_cpp/absl/container/flat_hash_map_test.cc index 2823c32bb..89ec60c91 100644 --- a/third_party/abseil_cpp/absl/container/flat_hash_map_test.cc +++ b/third_party/abseil_cpp/absl/container/flat_hash_map_test.cc @@ -267,6 +267,21 @@ TEST(FlatHashMap, EraseIf) { } } +// This test requires std::launder for mutable key access in node handles. +#if defined(__cpp_lib_launder) && __cpp_lib_launder >= 201606 +TEST(FlatHashMap, NodeHandleMutableKeyAccess) { + flat_hash_map map; + + map["key1"] = "mapped"; + + auto nh = map.extract(map.begin()); + nh.key().resize(3); + map.insert(std::move(nh)); + + EXPECT_THAT(map, testing::ElementsAre(Pair("key", "mapped"))); +} +#endif + } // namespace } // namespace container_internal ABSL_NAMESPACE_END diff --git a/third_party/abseil_cpp/absl/container/flat_hash_set.h b/third_party/abseil_cpp/absl/container/flat_hash_set.h index 94be6e3d1..6b89da657 100644 --- a/third_party/abseil_cpp/absl/container/flat_hash_set.h +++ b/third_party/abseil_cpp/absl/container/flat_hash_set.h @@ -227,7 +227,8 @@ class flat_hash_set // // size_type erase(const key_type& key): // - // Erases the element with the matching key, if it exists. + // Erases the element with the matching key, if it exists, returning the + // number of elements erased (0 or 1). using Base::erase; // flat_hash_set::insert() @@ -323,7 +324,7 @@ class flat_hash_set // flat_hash_set::merge() // - // Extracts elements from a given `source` flat hash map into this + // Extracts elements from a given `source` flat hash set into this // `flat_hash_set`. If the destination `flat_hash_set` already contains an // element with an equivalent key, that element is not extracted. using Base::merge; diff --git a/third_party/abseil_cpp/absl/container/inlined_vector.h b/third_party/abseil_cpp/absl/container/inlined_vector.h index f18dd4c78..90bb96e83 100644 --- a/third_party/abseil_cpp/absl/container/inlined_vector.h +++ b/third_party/abseil_cpp/absl/container/inlined_vector.h @@ -64,7 +64,7 @@ ABSL_NAMESPACE_BEGIN // `std::vector` for use cases where the vector's size is sufficiently small // that it can be inlined. If the inlined vector does grow beyond its estimated // capacity, it will trigger an initial allocation on the heap, and will behave -// as a `std:vector`. The API of the `absl::InlinedVector` within this file is +// as a `std::vector`. The API of the `absl::InlinedVector` within this file is // designed to cover the same API footprint as covered by `std::vector`. template > class InlinedVector { diff --git a/third_party/abseil_cpp/absl/container/inlined_vector_test.cc b/third_party/abseil_cpp/absl/container/inlined_vector_test.cc index 415c60d9f..98aff3349 100644 --- a/third_party/abseil_cpp/absl/container/inlined_vector_test.cc +++ b/third_party/abseil_cpp/absl/container/inlined_vector_test.cc @@ -736,22 +736,26 @@ TEST(OverheadTest, Storage) { // In particular, ensure that std::allocator doesn't cost anything to store. // The union should be absorbing some of the allocation bookkeeping overhead // in the larger vectors, leaving only the size_ field as overhead. - EXPECT_EQ(2 * sizeof(int*), - sizeof(absl::InlinedVector) - 1 * sizeof(int*)); - EXPECT_EQ(1 * sizeof(int*), - sizeof(absl::InlinedVector) - 2 * sizeof(int*)); - EXPECT_EQ(1 * sizeof(int*), - sizeof(absl::InlinedVector) - 3 * sizeof(int*)); - EXPECT_EQ(1 * sizeof(int*), - sizeof(absl::InlinedVector) - 4 * sizeof(int*)); - EXPECT_EQ(1 * sizeof(int*), - sizeof(absl::InlinedVector) - 5 * sizeof(int*)); - EXPECT_EQ(1 * sizeof(int*), - sizeof(absl::InlinedVector) - 6 * sizeof(int*)); - EXPECT_EQ(1 * sizeof(int*), - sizeof(absl::InlinedVector) - 7 * sizeof(int*)); - EXPECT_EQ(1 * sizeof(int*), - sizeof(absl::InlinedVector) - 8 * sizeof(int*)); + + struct T { void* val; }; + size_t expected_overhead = sizeof(T); + + EXPECT_EQ((2 * expected_overhead), + sizeof(absl::InlinedVector) - sizeof(T[1])); + EXPECT_EQ(expected_overhead, + sizeof(absl::InlinedVector) - sizeof(T[2])); + EXPECT_EQ(expected_overhead, + sizeof(absl::InlinedVector) - sizeof(T[3])); + EXPECT_EQ(expected_overhead, + sizeof(absl::InlinedVector) - sizeof(T[4])); + EXPECT_EQ(expected_overhead, + sizeof(absl::InlinedVector) - sizeof(T[5])); + EXPECT_EQ(expected_overhead, + sizeof(absl::InlinedVector) - sizeof(T[6])); + EXPECT_EQ(expected_overhead, + sizeof(absl::InlinedVector) - sizeof(T[7])); + EXPECT_EQ(expected_overhead, + sizeof(absl::InlinedVector) - sizeof(T[8])); } TEST(IntVec, Clear) { diff --git a/third_party/abseil_cpp/absl/container/internal/btree.h b/third_party/abseil_cpp/absl/container/internal/btree.h index f52fe235a..f2fc31df8 100644 --- a/third_party/abseil_cpp/absl/container/internal/btree.h +++ b/third_party/abseil_cpp/absl/container/internal/btree.h @@ -137,15 +137,14 @@ struct StringBtreeDefaultGreater { }; // A helper class to convert a boolean comparison into a three-way "compare-to" -// comparison that returns a negative value to indicate less-than, zero to -// indicate equality and a positive value to indicate greater-than. This helper +// comparison that returns an `absl::weak_ordering`. This helper // class is specialized for less, greater, // less, greater, less, and // greater. // // key_compare_to_adapter is provided so that btree users // automatically get the more efficient compare-to code when using common -// google string types with common comparison functors. +// Abseil string types with common comparison functors. // These string-like specializations also turn on heterogeneous lookup by // default. template @@ -183,12 +182,47 @@ struct key_compare_to_adapter> { using type = StringBtreeDefaultGreater; }; +// Detects an 'absl_btree_prefer_linear_node_search' member. This is +// a protocol used as an opt-in or opt-out of linear search. +// +// For example, this would be useful for key types that wrap an integer +// and define their own cheap operator<(). For example: +// +// class K { +// public: +// using absl_btree_prefer_linear_node_search = std::true_type; +// ... +// private: +// friend bool operator<(K a, K b) { return a.k_ < b.k_; } +// int k_; +// }; +// +// btree_map m; // Uses linear search +// +// If T has the preference tag, then it has a preference. +// Btree will use the tag's truth value. +template +struct has_linear_node_search_preference : std::false_type {}; +template +struct prefers_linear_node_search : std::false_type {}; +template +struct has_linear_node_search_preference< + T, absl::void_t> + : std::true_type {}; +template +struct prefers_linear_node_search< + T, absl::void_t> + : T::absl_btree_prefer_linear_node_search {}; + template struct common_params { // If Compare is a common comparator for a string-like type, then we adapt it // to use heterogeneous lookup and to be a key-compare-to comparator. using key_compare = typename key_compare_to_adapter::type; + // True when key_compare has been adapted to StringBtreeDefault{Less,Greater}. + using is_key_compare_adapted = + absl::negation>; // A type which indicates if we have a key-compare-to functor or a plain old // key-compare functor. using is_key_compare_to = btree_is_key_compare_to; @@ -255,10 +289,6 @@ struct common_params { static void move(Alloc *alloc, slot_type *src, slot_type *dest) { slot_policy::move(alloc, src, dest); } - static void move(Alloc *alloc, slot_type *first, slot_type *last, - slot_type *result) { - slot_policy::move(alloc, first, last, result); - } }; // A parameters structure for holding the type parameters for a btree_map. @@ -290,9 +320,17 @@ struct map_params : common_params + static auto key(const V &value) -> decltype(value.first) { + return value.first; + } static const Key &key(const slot_type *s) { return slot_policy::key(s); } + static const Key &key(slot_type *s) { return slot_policy::key(s); } + // For use in node handle. + static auto mutable_key(slot_type *s) + -> decltype(slot_policy::mutable_key(s)) { + return slot_policy::mutable_key(s); + } static mapped_type &value(value_type *value) { return value->second; } }; @@ -333,13 +371,6 @@ struct set_slot_policy { static void move(Alloc * /*alloc*/, slot_type *src, slot_type *dest) { *dest = std::move(*src); } - - template - static void move(Alloc *alloc, slot_type *first, slot_type *last, - slot_type *result) { - for (slot_type *src = first, *dest = result; src != last; ++src, ++dest) - move(alloc, src, dest); - } }; // A parameters structure for holding the type parameters for a btree_set. @@ -353,8 +384,10 @@ struct set_params : common_params + static const V &key(const V &value) { return value; } static const Key &key(const slot_type *slot) { return *slot; } + static const Key &key(slot_type *slot) { return *slot; } }; // An adapter class that converts a lower-bound compare into an upper-bound @@ -390,6 +423,10 @@ struct SearchResult { // useful information. template struct SearchResult { + SearchResult() {} + explicit SearchResult(V value) : value(value) {} + SearchResult(V value, MatchKind /*match*/) : value(value) {} + V value; static constexpr bool HasMatch() { return false; } @@ -420,15 +457,22 @@ class btree_node { using difference_type = typename Params::difference_type; // Btree decides whether to use linear node search as follows: + // - If the comparator expresses a preference, use that. + // - If the key expresses a preference, use that. // - If the key is arithmetic and the comparator is std::less or // std::greater, choose linear. // - Otherwise, choose binary. // TODO(ezb): Might make sense to add condition(s) based on node-size. using use_linear_search = std::integral_constant< bool, - std::is_arithmetic::value && - (std::is_same, key_compare>::value || - std::is_same, key_compare>::value)>; + has_linear_node_search_preference::value + ? prefers_linear_node_search::value + : has_linear_node_search_preference::value + ? prefers_linear_node_search::value + : std::is_arithmetic::value && + (std::is_same, key_compare>::value || + std::is_same, + key_compare>::value)>; // This class is organized by gtl::Layout as if it had the following // structure: @@ -671,7 +715,7 @@ class btree_node { } ++s; } - return {s}; + return SearchResult{s}; } // Returns the position of the first value whose key is not less than k using @@ -706,7 +750,7 @@ class btree_node { e = mid; } } - return {s}; + return SearchResult{s}; } // Returns the position of the first value whose key is not less than k using @@ -754,14 +798,10 @@ class btree_node { template void emplace_value(size_type i, allocator_type *alloc, Args &&... args); - // Removes the value at position i, shifting all existing values and children - // at positions > i to the left by 1. - void remove_value(int i, allocator_type *alloc); - - // Removes the values at positions [i, i + to_erase), shifting all values - // after that range to the left by to_erase. Does not change children at all. - void remove_values_ignore_children(int i, int to_erase, - allocator_type *alloc); + // Removes the values at positions [i, i + to_erase), shifting all existing + // values and children after that range to the left by to_erase. Clears all + // children between [i, i + to_erase). + void remove_values(field_type i, field_type to_erase, allocator_type *alloc); // Rebalances a node with its right sibling. void rebalance_right_to_left(int to_move, btree_node *right, @@ -773,7 +813,7 @@ class btree_node { void split(int insert_position, btree_node *dest, allocator_type *alloc); // Merges a node with its right sibling, moving all of the values and the - // delimiting key in the parent node onto itself. + // delimiting key in the parent node onto itself, and deleting the src node. void merge(btree_node *src, allocator_type *alloc); // Node allocation/deletion routines. @@ -794,35 +834,43 @@ class btree_node { absl::container_internal::SanitizerPoisonMemoryRegion( &mutable_child(start()), (kNodeValues + 1) * sizeof(btree_node *)); } - void destroy(allocator_type *alloc) { - for (int i = start(); i < finish(); ++i) { - value_destroy(i, alloc); - } + + static void deallocate(const size_type size, btree_node *node, + allocator_type *alloc) { + absl::container_internal::Deallocate(alloc, node, size); } - public: - // Exposed only for tests. - static bool testonly_uses_linear_node_search() { - return use_linear_search::value; - } + // Deletes a node and all of its children. + static void clear_and_delete(btree_node *node, allocator_type *alloc); private: template - void value_init(const size_type i, allocator_type *alloc, Args &&... args) { + void value_init(const field_type i, allocator_type *alloc, Args &&... args) { absl::container_internal::SanitizerUnpoisonObject(slot(i)); params_type::construct(alloc, slot(i), std::forward(args)...); } - void value_destroy(const size_type i, allocator_type *alloc) { + void value_destroy(const field_type i, allocator_type *alloc) { params_type::destroy(alloc, slot(i)); absl::container_internal::SanitizerPoisonObject(slot(i)); } + void value_destroy_n(const field_type i, const field_type n, + allocator_type *alloc) { + for (slot_type *s = slot(i), *end = slot(i + n); s != end; ++s) { + params_type::destroy(alloc, s); + absl::container_internal::SanitizerPoisonObject(s); + } + } + + static void transfer(slot_type *dest, slot_type *src, allocator_type *alloc) { + absl::container_internal::SanitizerUnpoisonObject(dest); + params_type::transfer(alloc, dest, src); + absl::container_internal::SanitizerPoisonObject(src); + } // Transfers value from slot `src_i` in `src_node` to slot `dest_i` in `this`. void transfer(const size_type dest_i, const size_type src_i, btree_node *src_node, allocator_type *alloc) { - absl::container_internal::SanitizerUnpoisonObject(slot(dest_i)); - params_type::transfer(alloc, slot(dest_i), src_node->slot(src_i)); - absl::container_internal::SanitizerPoisonObject(src_node->slot(src_i)); + transfer(slot(dest_i), src_node->slot(src_i), alloc); } // Transfers `n` values starting at value `src_i` in `src_node` into the @@ -830,19 +878,11 @@ class btree_node { void transfer_n(const size_type n, const size_type dest_i, const size_type src_i, btree_node *src_node, allocator_type *alloc) { - absl::container_internal::SanitizerUnpoisonMemoryRegion( - slot(dest_i), n * sizeof(slot_type)); for (slot_type *src = src_node->slot(src_i), *end = src + n, *dest = slot(dest_i); src != end; ++src, ++dest) { - params_type::transfer(alloc, dest, src); + transfer(dest, src, alloc); } - // We take care to avoid poisoning transferred-to nodes in case of overlap. - const size_type overlap = - this == src_node ? (std::max)(src_i, dest_i + n) - src_i : 0; - assert(n >= overlap); - absl::container_internal::SanitizerPoisonMemoryRegion( - src_node->slot(src_i + overlap), (n - overlap) * sizeof(slot_type)); } // Same as above, except that we start at the end and work our way to the @@ -850,19 +890,11 @@ class btree_node { void transfer_n_backward(const size_type n, const size_type dest_i, const size_type src_i, btree_node *src_node, allocator_type *alloc) { - absl::container_internal::SanitizerUnpoisonMemoryRegion( - slot(dest_i), n * sizeof(slot_type)); for (slot_type *src = src_node->slot(src_i + n - 1), *end = src - n, *dest = slot(dest_i + n - 1); src != end; --src, --dest) { - params_type::transfer(alloc, dest, src); + transfer(dest, src, alloc); } - // We take care to avoid poisoning transferred-to nodes in case of overlap. - assert(this != src_node || dest_i >= src_i); - const size_type num_to_poison = - this == src_node ? (std::min)(n, dest_i - src_i) : n; - absl::container_internal::SanitizerPoisonMemoryRegion( - src_node->slot(src_i), num_to_poison * sizeof(slot_type)); } template @@ -1020,6 +1052,10 @@ template class btree { using node_type = btree_node; using is_key_compare_to = typename Params::is_key_compare_to; + using init_type = typename Params::init_type; + using field_type = typename node_type::field_type; + using is_multi_container = typename Params::is_multi_container; + using is_key_compare_adapted = typename Params::is_key_compare_adapted; // We use a static empty node for the root/leftmost/rightmost of empty btrees // in order to avoid branching in begin()/end(). @@ -1054,7 +1090,7 @@ class btree { #endif } - enum { + enum : uint32_t { kNodeValues = node_type::kNodeValues, kMinNodeValues = kNodeValues / 2, }; @@ -1106,21 +1142,35 @@ class btree { // before this method is called. This method is used in copy construction, // copy assignment, and move assignment. template - void copy_or_move_values_in_order(Btree *other); + void copy_or_move_values_in_order(Btree &other); // Validates that various assumptions/requirements are true at compile time. constexpr static bool static_assert_validation(); public: - btree(const key_compare &comp, const allocator_type &alloc); + btree(const key_compare &comp, const allocator_type &alloc) + : root_(comp, alloc, EmptyNode()), rightmost_(EmptyNode()), size_(0) {} - btree(const btree &other); + btree(const btree &other) : btree(other, other.allocator()) {} + btree(const btree &other, const allocator_type &alloc) + : btree(other.key_comp(), alloc) { + copy_or_move_values_in_order(other); + } btree(btree &&other) noexcept : root_(std::move(other.root_)), rightmost_(absl::exchange(other.rightmost_, EmptyNode())), size_(absl::exchange(other.size_, 0)) { other.mutable_root() = EmptyNode(); } + btree(btree &&other, const allocator_type &alloc) + : btree(other.key_comp(), alloc) { + if (alloc == other.allocator()) { + swap(other); + } else { + // Move values from `other` one at a time when allocators are different. + copy_or_move_values_in_order(other); + } + } ~btree() { // Put static_asserts in destructor to avoid triggering them before the type @@ -1151,11 +1201,11 @@ class btree { // Finds the first element whose key is not less than key. template iterator lower_bound(const K &key) { - return internal_end(internal_lower_bound(key)); + return internal_end(internal_lower_bound(key).value); } template const_iterator lower_bound(const K &key) const { - return internal_end(internal_lower_bound(key)); + return internal_end(internal_lower_bound(key).value); } // Finds the first element whose key is greater than key. @@ -1169,23 +1219,21 @@ class btree { } // Finds the range of values which compare equal to key. The first member of - // the returned pair is equal to lower_bound(key). The second member pair of - // the pair is equal to upper_bound(key). + // the returned pair is equal to lower_bound(key). The second member of the + // pair is equal to upper_bound(key). template - std::pair equal_range(const K &key) { - return {lower_bound(key), upper_bound(key)}; - } + std::pair equal_range(const K &key); template std::pair equal_range(const K &key) const { - return {lower_bound(key), upper_bound(key)}; + return const_cast(this)->equal_range(key); } // Inserts a value into the btree only if it does not already exist. The // boolean return value indicates whether insertion succeeded or failed. // Requirement: if `key` already exists in the btree, does not consume `args`. // Requirement: `key` is never referenced after consuming `args`. - template - std::pair insert_unique(const key_type &key, Args &&... args); + template + std::pair insert_unique(const K &key, Args &&... args); // Inserts with hint. Checks to see if the value should be placed immediately // before `position` in the tree. If so, then the insertion will take @@ -1193,14 +1241,23 @@ class btree { // logarithmic time as if a call to insert_unique() were made. // Requirement: if `key` already exists in the btree, does not consume `args`. // Requirement: `key` is never referenced after consuming `args`. - template + template std::pair insert_hint_unique(iterator position, - const key_type &key, + const K &key, Args &&... args); // Insert a range of values into the btree. + // Note: the first overload avoids constructing a value_type if the key + // already exists in the btree. + template ()( + params_type::key(*std::declval()), + std::declval()))> + void insert_iterator_unique(InputIterator b, InputIterator e, int); + // We need the second overload for cases in which we need to construct a + // value_type in order to compare it with the keys already in the btree. template - void insert_iterator_unique(InputIterator b, InputIterator e); + void insert_iterator_unique(InputIterator b, InputIterator e, char); // Inserts a value into the btree. template @@ -1233,16 +1290,6 @@ class btree { // to the element after the last erased element. std::pair erase_range(iterator begin, iterator end); - // Erases the specified key from the btree. Returns 1 if an element was - // erased and 0 otherwise. - template - size_type erase_unique(const K &key); - - // Erases all of the entries matching the specified key from the - // btree. Returns the number of elements erased. - template - size_type erase_multi(const K &key); - // Finds the iterator corresponding to a key or returns end() if the key is // not present. template @@ -1254,23 +1301,6 @@ class btree { return internal_end(internal_find(key)); } - // Returns a count of the number of times the key appears in the btree. - template - size_type count_unique(const K &key) const { - const iterator begin = internal_find(key); - if (begin.node == nullptr) { - // The key doesn't exist in the tree. - return 0; - } - return 1; - } - // Returns a count of the number of times the key appears in the btree. - template - size_type count_multi(const K &key) const { - const auto range = equal_range(key); - return std::distance(range.first, range.second); - } - // Clear the btree, deleting all of the values it contains. void clear(); @@ -1408,25 +1438,8 @@ class btree { } // Deletion helper routines. - void erase_same_node(iterator begin, iterator end); - iterator erase_from_leaf_node(iterator begin, size_type to_erase); iterator rebalance_after_delete(iterator iter); - // Deallocates a node of a certain size in bytes using the allocator. - void deallocate(const size_type size, node_type *node) { - absl::container_internal::Deallocate( - mutable_allocator(), node, size); - } - - void delete_internal_node(node_type *node) { - node->destroy(mutable_allocator()); - deallocate(node_type::InternalSize(), node); - } - void delete_leaf_node(node_type *node) { - node->destroy(mutable_allocator()); - deallocate(node_type::LeafSize(node->max_count()), node); - } - // Rebalances or splits the node iter points to. void rebalance_or_split(iterator *iter); @@ -1464,28 +1477,19 @@ class btree { static IterType internal_last(IterType iter); // Returns an iterator pointing to the leaf position at which key would - // reside in the tree. We provide 2 versions of internal_locate. The first - // version uses a less-than comparator and is incapable of distinguishing when - // there is an exact match. The second version is for the key-compare-to - // specialization and distinguishes exact matches. The key-compare-to - // specialization allows the caller to avoid a subsequent comparison to - // determine if an exact match was made, which is important for keys with - // expensive comparison, such as strings. + // reside in the tree, unless there is an exact match - in which case, the + // result may not be on a leaf. When there's a three-way comparator, we can + // return whether there was an exact match. This allows the caller to avoid a + // subsequent comparison to determine if an exact match was made, which is + // important for keys with expensive comparison, such as strings. template SearchResult internal_locate( const K &key) const; - template - SearchResult internal_locate_impl( - const K &key, std::false_type /* IsCompareTo */) const; - - template - SearchResult internal_locate_impl( - const K &key, std::true_type /* IsCompareTo */) const; - // Internal routine which implements lower_bound(). template - iterator internal_lower_bound(const K &key) const; + SearchResult internal_lower_bound( + const K &key) const; // Internal routine which implements upper_bound(). template @@ -1495,9 +1499,6 @@ class btree { template iterator internal_find(const K &key) const; - // Deletes a node and all of its children. - void internal_clear(node_type *node); - // Verifies the tree structure of node. int internal_verify(const node_type *node, const key_type *lo, const key_type *hi) const; @@ -1517,13 +1518,6 @@ class btree { return res; } - public: - // Exposed only for tests. - static bool testonly_uses_linear_node_search() { - return node_type::testonly_uses_linear_node_search(); - } - - private: // We use compressed tuple in order to save space because key_compare and // allocator_type are usually empty. absl::container_internal::CompressedTuple::emplace_value(const size_type i, } template -inline void btree_node

::remove_value(const int i, allocator_type *alloc) { - if (!leaf() && finish() > i + 1) { - assert(child(i + 1)->count() == 0); - for (size_type j = i + 1; j < finish(); ++j) { - set_child(j, child(j + 1)); +inline void btree_node

::remove_values(const field_type i, + const field_type to_erase, + allocator_type *alloc) { + // Transfer values after the removed range into their new places. + value_destroy_n(i, to_erase, alloc); + const field_type orig_finish = finish(); + const field_type src_i = i + to_erase; + transfer_n(orig_finish - src_i, i, src_i, this, alloc); + + if (!leaf()) { + // Delete all children between begin and end. + for (int j = 0; j < to_erase; ++j) { + clear_and_delete(child(i + j + 1), alloc); + } + // Rotate children after end into new positions. + for (int j = i + to_erase + 1; j <= orig_finish; ++j) { + set_child(j - to_erase, child(j)); + clear_child(j); } - clear_child(finish()); } - - remove_values_ignore_children(i, /*to_erase=*/1, alloc); -} - -template -inline void btree_node

::remove_values_ignore_children( - const int i, const int to_erase, allocator_type *alloc) { - params_type::move(alloc, slot(i + to_erase), finish_slot(), slot(i)); - for (int j = finish() - to_erase; j < finish(); ++j) { - value_destroy(j, alloc); - } - set_finish(finish() - to_erase); + set_finish(orig_finish - to_erase); } template @@ -1736,8 +1731,59 @@ void btree_node

::merge(btree_node *src, allocator_type *alloc) { set_finish(start() + 1 + count() + src->count()); src->set_finish(src->start()); - // Remove the value on the parent node. - parent()->remove_value(position(), alloc); + // Remove the value on the parent node and delete the src node. + parent()->remove_values(position(), /*to_erase=*/1, alloc); +} + +template +void btree_node

::clear_and_delete(btree_node *node, allocator_type *alloc) { + if (node->leaf()) { + node->value_destroy_n(node->start(), node->count(), alloc); + deallocate(LeafSize(node->max_count()), node, alloc); + return; + } + if (node->count() == 0) { + deallocate(InternalSize(), node, alloc); + return; + } + + // The parent of the root of the subtree we are deleting. + btree_node *delete_root_parent = node->parent(); + + // Navigate to the leftmost leaf under node, and then delete upwards. + while (!node->leaf()) node = node->start_child(); + // Use `int` because `pos` needs to be able to hold `kNodeValues+1`, which + // isn't guaranteed to be a valid `field_type`. + int pos = node->position(); + btree_node *parent = node->parent(); + for (;;) { + // In each iteration of the next loop, we delete one leaf node and go right. + assert(pos <= parent->finish()); + do { + node = parent->child(pos); + if (!node->leaf()) { + // Navigate to the leftmost leaf under node. + while (!node->leaf()) node = node->start_child(); + pos = node->position(); + parent = node->parent(); + } + node->value_destroy_n(node->start(), node->count(), alloc); + deallocate(LeafSize(node->max_count()), node, alloc); + ++pos; + } while (pos <= parent->finish()); + + // Once we've deleted all children of parent, delete parent and go up/right. + assert(pos > parent->finish()); + do { + node = parent; + pos = node->position(); + parent = node->parent(); + node->value_destroy_n(node->start(), node->count(), alloc); + deallocate(InternalSize(), node, alloc); + if (parent == delete_root_parent) return; + ++pos; + } while (pos > parent->finish()); + } } //// @@ -1794,7 +1840,7 @@ void btree_iterator::decrement_slow() { // btree methods template template -void btree

::copy_or_move_values_in_order(Btree *other) { +void btree

::copy_or_move_values_in_order(Btree &other) { static_assert(std::is_same::value || std::is_same::value, "Btree type must be same or const."); @@ -1802,11 +1848,11 @@ void btree

::copy_or_move_values_in_order(Btree *other) { // We can avoid key comparisons because we know the order of the // values is the same order we'll store them in. - auto iter = other->begin(); - if (iter == other->end()) return; + auto iter = other.begin(); + if (iter == other.end()) return; insert_multi(maybe_move_from_iterator(iter)); ++iter; - for (; iter != other->end(); ++iter) { + for (; iter != other.end(); ++iter) { // If the btree is not empty, we can just insert the new value at the end // of the tree. internal_emplace(end(), maybe_move_from_iterator(iter)); @@ -1845,25 +1891,52 @@ constexpr bool btree

::static_assert_validation() { } template -btree

::btree(const key_compare &comp, const allocator_type &alloc) - : root_(comp, alloc, EmptyNode()), rightmost_(EmptyNode()), size_(0) {} +template +auto btree

::equal_range(const K &key) -> std::pair { + const SearchResult res = + internal_lower_bound(key); + const iterator lower = internal_end(res.value); + if (res.HasMatch() ? !res.IsEq() + : lower == end() || compare_keys(key, lower.key())) { + return {lower, lower}; + } -template -btree

::btree(const btree &other) - : btree(other.key_comp(), other.allocator()) { - copy_or_move_values_in_order(&other); + const iterator next = std::next(lower); + // When the comparator is heterogeneous, we can't assume that comparison with + // non-`key_type` will be equivalent to `key_type` comparisons so there + // could be multiple equivalent keys even in a unique-container. But for + // heterogeneous comparisons from the default string adapted comparators, we + // don't need to worry about this. + if (!is_multi_container::value && + (std::is_same::value || is_key_compare_adapted::value)) { + // The next iterator after lower must point to a key greater than `key`. + // Note: if this assert fails, then it may indicate that the comparator does + // not meet the equivalence requirements for Compare + // (see https://en.cppreference.com/w/cpp/named_req/Compare). + assert(next == end() || compare_keys(key, next.key())); + return {lower, next}; + } + // Try once more to avoid the call to upper_bound() if there's only one + // equivalent key. This should prevent all calls to upper_bound() in cases of + // unique-containers with heterogeneous comparators in which all comparison + // operators have the same equivalence classes. + if (next == end() || compare_keys(key, next.key())) return {lower, next}; + + // In this case, we need to call upper_bound() to avoid worst case O(N) + // behavior if we were to iterate over equal keys. + return {lower, upper_bound(key)}; } template -template -auto btree

::insert_unique(const key_type &key, Args &&... args) +template +auto btree

::insert_unique(const K &key, Args &&... args) -> std::pair { if (empty()) { mutable_root() = rightmost_ = new_leaf_root_node(1); } - auto res = internal_locate(key); - iterator &iter = res.value; + SearchResult res = internal_locate(key); + iterator iter = res.value; if (res.HasMatch()) { if (res.IsEq()) { @@ -1881,8 +1954,8 @@ auto btree

::insert_unique(const key_type &key, Args &&... args) } template -template -inline auto btree

::insert_hint_unique(iterator position, const key_type &key, +template +inline auto btree

::insert_hint_unique(iterator position, const K &key, Args &&... args) -> std::pair { if (!empty()) { @@ -1906,13 +1979,22 @@ inline auto btree

::insert_hint_unique(iterator position, const key_type &key, } template -template -void btree

::insert_iterator_unique(InputIterator b, InputIterator e) { +template +void btree

::insert_iterator_unique(InputIterator b, InputIterator e, int) { for (; b != e; ++b) { insert_hint_unique(end(), params_type::key(*b), *b); } } +template +template +void btree

::insert_iterator_unique(InputIterator b, InputIterator e, char) { + for (; b != e; ++b) { + init_type value(*b); + insert_hint_unique(end(), params_type::key(value), std::move(value)); + } +} + template template auto btree

::insert_multi(const key_type &key, ValueType &&v) -> iterator { @@ -1968,7 +2050,7 @@ auto btree

::operator=(const btree &other) -> btree & { *mutable_allocator() = other.allocator(); } - copy_or_move_values_in_order(&other); + copy_or_move_values_in_order(other); } return *this; } @@ -1998,7 +2080,7 @@ auto btree

::operator=(btree &&other) noexcept -> btree & { // comparator while moving the values so we can't swap the key // comparators. *mutable_key_comp() = other.key_comp(); - copy_or_move_values_in_order(&other); + copy_or_move_values_in_order(other); } } } @@ -2010,7 +2092,7 @@ auto btree

::erase(iterator iter) -> iterator { bool internal_delete = false; if (!iter.node->leaf()) { // Deletion of a value on an internal node. First, move the largest value - // from our left child here, then delete that position (in remove_value() + // from our left child here, then delete that position (in remove_values() // below). We can get to the largest value from our left child by // decrementing iter. iterator internal_iter(iter); @@ -2022,7 +2104,7 @@ auto btree

::erase(iterator iter) -> iterator { } // Delete the key from the leaf. - iter.node->remove_value(iter.position, mutable_allocator()); + iter.node->remove_values(iter.position, /*to_erase=*/1, mutable_allocator()); --size_; // We want to return the next value after the one we just erased. If we @@ -2097,7 +2179,9 @@ auto btree

::erase_range(iterator begin, iterator end) } if (begin.node == end.node) { - erase_same_node(begin, end); + assert(end.position > begin.position); + begin.node->remove_values(begin.position, end.position - begin.position, + mutable_allocator()); size_ -= count; return {count, rebalance_after_delete(begin)}; } @@ -2107,8 +2191,11 @@ auto btree

::erase_range(iterator begin, iterator end) if (begin.node->leaf()) { const size_type remaining_to_erase = size_ - target_size; const size_type remaining_in_node = begin.node->finish() - begin.position; - begin = erase_from_leaf_node( - begin, (std::min)(remaining_to_erase, remaining_in_node)); + const size_type to_erase = + (std::min)(remaining_to_erase, remaining_in_node); + begin.node->remove_values(begin.position, to_erase, mutable_allocator()); + size_ -= to_erase; + begin = rebalance_after_delete(begin); } else { begin = erase(begin); } @@ -2116,80 +2203,10 @@ auto btree

::erase_range(iterator begin, iterator end) return {count, begin}; } -template -void btree

::erase_same_node(iterator begin, iterator end) { - assert(begin.node == end.node); - assert(end.position > begin.position); - - node_type *node = begin.node; - size_type to_erase = end.position - begin.position; - if (!node->leaf()) { - // Delete all children between begin and end. - for (size_type i = 0; i < to_erase; ++i) { - internal_clear(node->child(begin.position + i + 1)); - } - // Rotate children after end into new positions. - for (size_type i = begin.position + to_erase + 1; i <= node->finish(); - ++i) { - node->set_child(i - to_erase, node->child(i)); - node->clear_child(i); - } - } - node->remove_values_ignore_children(begin.position, to_erase, - mutable_allocator()); - - // Do not need to update rightmost_, because - // * either end == this->end(), and therefore node == rightmost_, and still - // exists - // * or end != this->end(), and therefore rightmost_ hasn't been erased, since - // it wasn't covered in [begin, end) -} - -template -auto btree

::erase_from_leaf_node(iterator begin, size_type to_erase) - -> iterator { - node_type *node = begin.node; - assert(node->leaf()); - assert(node->finish() > begin.position); - assert(begin.position + to_erase <= node->finish()); - - node->remove_values_ignore_children(begin.position, to_erase, - mutable_allocator()); - - size_ -= to_erase; - - return rebalance_after_delete(begin); -} - -template -template -auto btree

::erase_unique(const K &key) -> size_type { - const iterator iter = internal_find(key); - if (iter.node == nullptr) { - // The key doesn't exist in the tree, return nothing done. - return 0; - } - erase(iter); - return 1; -} - -template -template -auto btree

::erase_multi(const K &key) -> size_type { - const iterator begin = internal_lower_bound(key); - if (begin.node == nullptr) { - // The key doesn't exist in the tree, return nothing done. - return 0; - } - // Delete all of the keys between begin and upper_bound(key). - const iterator end = internal_end(internal_upper_bound(key)); - return erase_range(begin, end).first; -} - template void btree

::clear() { if (!empty()) { - internal_clear(root()); + node_type::clear_and_delete(root(), mutable_allocator()); } mutable_root() = EmptyNode(); rightmost_ = EmptyNode(); @@ -2244,11 +2261,11 @@ void btree

::rebalance_or_split(iterator *iter) { // inserting at the end of the right node then we bias rebalancing to // fill up the left node. int to_move = (kNodeValues - left->count()) / - (1 + (insert_position < kNodeValues)); + (1 + (insert_position < static_cast(kNodeValues))); to_move = (std::max)(1, to_move); if (insert_position - to_move >= node->start() || - left->count() + to_move < kNodeValues) { + left->count() + to_move < static_cast(kNodeValues)) { left->rebalance_right_to_left(to_move, node, mutable_allocator()); assert(node->max_count() - node->count() == to_move); @@ -2272,12 +2289,12 @@ void btree

::rebalance_or_split(iterator *iter) { // We bias rebalancing based on the position being inserted. If we're // inserting at the beginning of the left node then we bias rebalancing // to fill up the right node. - int to_move = (kNodeValues - right->count()) / + int to_move = (static_cast(kNodeValues) - right->count()) / (1 + (insert_position > node->start())); to_move = (std::max)(1, to_move); if (insert_position <= node->finish() - to_move || - right->count() + to_move < kNodeValues) { + right->count() + to_move < static_cast(kNodeValues)) { node->rebalance_left_to_right(to_move, right, mutable_allocator()); if (insert_position > node->finish()) { @@ -2330,12 +2347,7 @@ void btree

::rebalance_or_split(iterator *iter) { template void btree

::merge_nodes(node_type *left, node_type *right) { left->merge(right, mutable_allocator()); - if (right->leaf()) { - if (rightmost_ == right) rightmost_ = left; - delete_leaf_node(right); - } else { - delete_internal_node(right); - } + if (rightmost_ == right) rightmost_ = left; } template @@ -2345,7 +2357,7 @@ bool btree

::try_merge_or_rebalance(iterator *iter) { // Try merging with our left sibling. node_type *left = parent->child(iter->node->position() - 1); assert(left->max_count() == kNodeValues); - if (1 + left->count() + iter->node->count() <= kNodeValues) { + if (1U + left->count() + iter->node->count() <= kNodeValues) { iter->position += 1 + left->count(); merge_nodes(left, iter->node); iter->node = left; @@ -2356,7 +2368,7 @@ bool btree

::try_merge_or_rebalance(iterator *iter) { // Try merging with our right sibling. node_type *right = parent->child(iter->node->position() + 1); assert(right->max_count() == kNodeValues); - if (1 + iter->node->count() + right->count() <= kNodeValues) { + if (1U + iter->node->count() + right->count() <= kNodeValues) { merge_nodes(iter->node, right); return true; } @@ -2392,20 +2404,20 @@ bool btree

::try_merge_or_rebalance(iterator *iter) { template void btree

::try_shrink() { - if (root()->count() > 0) { + node_type *orig_root = root(); + if (orig_root->count() > 0) { return; } // Deleted the last item on the root node, shrink the height of the tree. - if (root()->leaf()) { + if (orig_root->leaf()) { assert(size() == 0); - delete_leaf_node(root()); mutable_root() = rightmost_ = EmptyNode(); } else { - node_type *child = root()->start_child(); + node_type *child = orig_root->start_child(); child->make_root(); - delete_internal_node(root()); mutable_root() = child; } + node_type::clear_and_delete(orig_root, mutable_allocator()); } template @@ -2433,7 +2445,7 @@ inline auto btree

::internal_emplace(iterator iter, Args &&... args) --iter; ++iter.position; } - const int max_count = iter.node->max_count(); + const field_type max_count = iter.node->max_count(); allocator_type *alloc = mutable_allocator(); if (iter.node->count() == max_count) { // Make room in the leaf for the new item. @@ -2450,7 +2462,7 @@ inline auto btree

::internal_emplace(iterator iter, Args &&... args) old_root->start(), old_root, alloc); new_root->set_finish(old_root->finish()); old_root->set_finish(old_root->start()); - delete_leaf_node(old_root); + node_type::clear_and_delete(old_root, alloc); mutable_root() = rightmost_ = new_root; } else { rebalance_or_split(&iter); @@ -2465,61 +2477,48 @@ template template inline auto btree

::internal_locate(const K &key) const -> SearchResult { - return internal_locate_impl(key, is_key_compare_to()); -} - -template -template -inline auto btree

::internal_locate_impl( - const K &key, std::false_type /* IsCompareTo */) const - -> SearchResult { iterator iter(const_cast(root())); for (;;) { - iter.position = iter.node->lower_bound(key, key_comp()).value; - // NOTE: we don't need to walk all the way down the tree if the keys are - // equal, but determining equality would require doing an extra comparison - // on each node on the way down, and we will need to go all the way to the - // leaf node in the expected case. - if (iter.node->leaf()) { - break; - } - iter.node = iter.node->child(iter.position); - } - return {iter}; -} - -template -template -inline auto btree

::internal_locate_impl( - const K &key, std::true_type /* IsCompareTo */) const - -> SearchResult { - iterator iter(const_cast(root())); - for (;;) { - SearchResult res = iter.node->lower_bound(key, key_comp()); + SearchResult res = + iter.node->lower_bound(key, key_comp()); iter.position = res.value; - if (res.match == MatchKind::kEq) { + if (res.IsEq()) { return {iter, MatchKind::kEq}; } + // Note: in the non-key-compare-to case, we don't need to walk all the way + // down the tree if the keys are equal, but determining equality would + // require doing an extra comparison on each node on the way down, and we + // will need to go all the way to the leaf node in the expected case. if (iter.node->leaf()) { break; } iter.node = iter.node->child(iter.position); } + // Note: in the non-key-compare-to case, the key may actually be equivalent + // here (and the MatchKind::kNe is ignored). return {iter, MatchKind::kNe}; } template template -auto btree

::internal_lower_bound(const K &key) const -> iterator { +auto btree

::internal_lower_bound(const K &key) const + -> SearchResult { iterator iter(const_cast(root())); + SearchResult res; + bool seen_eq = false; for (;;) { - iter.position = iter.node->lower_bound(key, key_comp()).value; + res = iter.node->lower_bound(key, key_comp()); + iter.position = res.value; + // TODO(ezb): we should be able to terminate early on IsEq() if there can't + // be multiple equivalent keys in container for this lookup type. if (iter.node->leaf()) { break; } + seen_eq = seen_eq || res.IsEq(); iter.node = iter.node->child(iter.position); } - return internal_last(iter); + if (res.IsEq()) return {iter, MatchKind::kEq}; + return {internal_last(iter), seen_eq ? MatchKind::kEq : MatchKind::kNe}; } template @@ -2539,7 +2538,7 @@ auto btree

::internal_upper_bound(const K &key) const -> iterator { template template auto btree

::internal_find(const K &key) const -> iterator { - auto res = internal_locate(key); + SearchResult res = internal_locate(key); if (res.HasMatch()) { if (res.IsEq()) { return res.value; @@ -2553,18 +2552,6 @@ auto btree

::internal_find(const K &key) const -> iterator { return {nullptr, 0}; } -template -void btree

::internal_clear(node_type *node) { - if (!node->leaf()) { - for (int i = node->start(); i <= node->finish(); ++i) { - internal_clear(node->child(i)); - } - delete_internal_node(node); - } else { - delete_leaf_node(node); - } -} - template int btree

::internal_verify(const node_type *node, const key_type *lo, const key_type *hi) const { diff --git a/third_party/abseil_cpp/absl/container/internal/btree_container.h b/third_party/abseil_cpp/absl/container/internal/btree_container.h index 734c90ef3..887eda412 100644 --- a/third_party/abseil_cpp/absl/container/internal/btree_container.h +++ b/third_party/abseil_cpp/absl/container/internal/btree_container.h @@ -23,6 +23,7 @@ #include "absl/base/internal/throw_delegate.h" #include "absl/container/internal/btree.h" // IWYU pragma: export #include "absl/container/internal/common.h" +#include "absl/memory/memory.h" #include "absl/meta/type_traits.h" namespace absl { @@ -68,8 +69,21 @@ class btree_container { explicit btree_container(const key_compare &comp, const allocator_type &alloc = allocator_type()) : tree_(comp, alloc) {} - btree_container(const btree_container &other) = default; - btree_container(btree_container &&other) noexcept = default; + explicit btree_container(const allocator_type &alloc) + : tree_(key_compare(), alloc) {} + + btree_container(const btree_container &other) + : btree_container(other, absl::allocator_traits:: + select_on_container_copy_construction( + other.get_allocator())) {} + btree_container(const btree_container &other, const allocator_type &alloc) + : tree_(other.tree_, alloc) {} + + btree_container(btree_container &&other) noexcept( + std::is_nothrow_move_constructible::value) = default; + btree_container(btree_container &&other, const allocator_type &alloc) + : tree_(std::move(other.tree_), alloc) {} + btree_container &operator=(const btree_container &other) = default; btree_container &operator=(btree_container &&other) noexcept( std::is_nothrow_move_assignable::value) = default; @@ -90,6 +104,11 @@ class btree_container { // Lookup routines. template + size_type count(const key_arg &key) const { + auto equal_range = this->equal_range(key); + return std::distance(equal_range.first, equal_range.second); + } + template iterator find(const key_arg &key) { return tree_.find(key); } @@ -138,6 +157,11 @@ class btree_container { iterator erase(const_iterator first, const_iterator last) { return tree_.erase_range(iterator(first), iterator(last)).second; } + template + size_type erase(const key_arg &key) { + auto equal_range = this->equal_range(key); + return tree_.erase_range(equal_range.first, equal_range.second).first; + } // Extract routines. node_type extract(iterator position) { @@ -151,7 +175,6 @@ class btree_container { return extract(iterator(position)); } - public: // Utility routines. void clear() { tree_.clear(); } void swap(btree_container &other) { tree_.swap(other.tree_); } @@ -235,7 +258,7 @@ class btree_set_container : public btree_container { using super_type::super_type; btree_set_container() {} - // Range constructor. + // Range constructors. template btree_set_container(InputIterator b, InputIterator e, const key_compare &comp = key_compare(), @@ -243,18 +266,19 @@ class btree_set_container : public btree_container { : super_type(comp, alloc) { insert(b, e); } + template + btree_set_container(InputIterator b, InputIterator e, + const allocator_type &alloc) + : btree_set_container(b, e, key_compare(), alloc) {} - // Initializer list constructor. + // Initializer list constructors. btree_set_container(std::initializer_list init, const key_compare &comp = key_compare(), const allocator_type &alloc = allocator_type()) : btree_set_container(init.begin(), init.end(), comp, alloc) {} - - // Lookup routines. - template - size_type count(const key_arg &key) const { - return this->tree_.count_unique(key); - } + btree_set_container(std::initializer_list init, + const allocator_type &alloc) + : btree_set_container(init.begin(), init.end(), alloc) {} // Insertion routines. std::pair insert(const value_type &v) { @@ -268,31 +292,29 @@ class btree_set_container : public btree_container { init_type v(std::forward(args)...); return this->tree_.insert_unique(params_type::key(v), std::move(v)); } - iterator insert(const_iterator position, const value_type &v) { + iterator insert(const_iterator hint, const value_type &v) { return this->tree_ - .insert_hint_unique(iterator(position), params_type::key(v), v) + .insert_hint_unique(iterator(hint), params_type::key(v), v) .first; } - iterator insert(const_iterator position, value_type &&v) { + iterator insert(const_iterator hint, value_type &&v) { return this->tree_ - .insert_hint_unique(iterator(position), params_type::key(v), - std::move(v)) + .insert_hint_unique(iterator(hint), params_type::key(v), std::move(v)) .first; } template - iterator emplace_hint(const_iterator position, Args &&... args) { + iterator emplace_hint(const_iterator hint, Args &&... args) { init_type v(std::forward(args)...); return this->tree_ - .insert_hint_unique(iterator(position), params_type::key(v), - std::move(v)) + .insert_hint_unique(iterator(hint), params_type::key(v), std::move(v)) .first; } template void insert(InputIterator b, InputIterator e) { - this->tree_.insert_iterator_unique(b, e); + this->tree_.insert_iterator_unique(b, e, 0); } void insert(std::initializer_list init) { - this->tree_.insert_iterator_unique(init.begin(), init.end()); + this->tree_.insert_iterator_unique(init.begin(), init.end(), 0); } insert_return_type insert(node_type &&node) { if (!node) return {this->end(), false, node_type()}; @@ -315,14 +337,10 @@ class btree_set_container : public btree_container { return res.first; } - // Deletion routines. - template - size_type erase(const key_arg &key) { - return this->tree_.erase_unique(key); - } - using super_type::erase; - // Node extraction routines. + // TODO(ezb): when the comparator is heterogeneous and has different + // equivalence classes for different lookup types, we should extract the first + // equivalent value if there are multiple. template node_type extract(const key_arg &key) { auto it = this->find(key); @@ -344,7 +362,7 @@ class btree_set_container : public btree_container { int> = 0> void merge(btree_container &src) { // NOLINT for (auto src_it = src.begin(); src_it != src.end();) { - if (insert(std::move(*src_it)).second) { + if (insert(std::move(params_type::element(src_it.slot()))).second) { src_it = src.erase(src_it); } else { ++src_it; @@ -371,6 +389,7 @@ template class btree_map_container : public btree_set_container { using super_type = btree_set_container; using params_type = typename Tree::params_type; + friend class BtreeNodePeer; private: template @@ -392,111 +411,72 @@ class btree_map_container : public btree_set_container { // Insertion routines. // Note: the nullptr template arguments and extra `const M&` overloads allow // for supporting bitfield arguments. - // Note: when we call `std::forward(obj)` twice, it's safe because - // insert_unique/insert_hint_unique are guaranteed to not consume `obj` when - // `ret.second` is false. - template - std::pair insert_or_assign(const key_type &k, const M &obj) { - const std::pair ret = this->tree_.insert_unique(k, k, obj); - if (!ret.second) ret.first->second = obj; - return ret; + template + std::pair insert_or_assign(const key_arg &k, + const M &obj) { + return insert_or_assign_impl(k, obj); } - template - std::pair insert_or_assign(key_type &&k, const M &obj) { - const std::pair ret = - this->tree_.insert_unique(k, std::move(k), obj); - if (!ret.second) ret.first->second = obj; - return ret; + template + std::pair insert_or_assign(key_arg &&k, const M &obj) { + return insert_or_assign_impl(std::forward(k), obj); } - template - std::pair insert_or_assign(const key_type &k, M &&obj) { - const std::pair ret = - this->tree_.insert_unique(k, k, std::forward(obj)); - if (!ret.second) ret.first->second = std::forward(obj); - return ret; + template + std::pair insert_or_assign(const key_arg &k, M &&obj) { + return insert_or_assign_impl(k, std::forward(obj)); } - template - std::pair insert_or_assign(key_type &&k, M &&obj) { - const std::pair ret = - this->tree_.insert_unique(k, std::move(k), std::forward(obj)); - if (!ret.second) ret.first->second = std::forward(obj); - return ret; + template + std::pair insert_or_assign(key_arg &&k, M &&obj) { + return insert_or_assign_impl(std::forward(k), std::forward(obj)); } - template - iterator insert_or_assign(const_iterator position, const key_type &k, + template + iterator insert_or_assign(const_iterator hint, const key_arg &k, const M &obj) { - const std::pair ret = - this->tree_.insert_hint_unique(iterator(position), k, k, obj); - if (!ret.second) ret.first->second = obj; - return ret.first; + return insert_or_assign_hint_impl(hint, k, obj); } - template - iterator insert_or_assign(const_iterator position, key_type &&k, - const M &obj) { - const std::pair ret = this->tree_.insert_hint_unique( - iterator(position), k, std::move(k), obj); - if (!ret.second) ret.first->second = obj; - return ret.first; + template + iterator insert_or_assign(const_iterator hint, key_arg &&k, const M &obj) { + return insert_or_assign_hint_impl(hint, std::forward(k), obj); } - template - iterator insert_or_assign(const_iterator position, const key_type &k, - M &&obj) { - const std::pair ret = this->tree_.insert_hint_unique( - iterator(position), k, k, std::forward(obj)); - if (!ret.second) ret.first->second = std::forward(obj); - return ret.first; + template + iterator insert_or_assign(const_iterator hint, const key_arg &k, M &&obj) { + return insert_or_assign_hint_impl(hint, k, std::forward(obj)); } - template - iterator insert_or_assign(const_iterator position, key_type &&k, M &&obj) { - const std::pair ret = this->tree_.insert_hint_unique( - iterator(position), k, std::move(k), std::forward(obj)); - if (!ret.second) ret.first->second = std::forward(obj); - return ret.first; + template + iterator insert_or_assign(const_iterator hint, key_arg &&k, M &&obj) { + return insert_or_assign_hint_impl(hint, std::forward(k), + std::forward(obj)); } - template - std::pair try_emplace(const key_type &k, Args &&... args) { - return this->tree_.insert_unique( - k, std::piecewise_construct, std::forward_as_tuple(k), - std::forward_as_tuple(std::forward(args)...)); + + template ::value, int> = 0> + std::pair try_emplace(const key_arg &k, Args &&... args) { + return try_emplace_impl(k, std::forward(args)...); } - template - std::pair try_emplace(key_type &&k, Args &&... args) { - // Note: `key_ref` exists to avoid a ClangTidy warning about moving from `k` - // and then using `k` unsequenced. This is safe because the move is into a - // forwarding reference and insert_unique guarantees that `key` is never - // referenced after consuming `args`. - const key_type &key_ref = k; - return this->tree_.insert_unique( - key_ref, std::piecewise_construct, std::forward_as_tuple(std::move(k)), - std::forward_as_tuple(std::forward(args)...)); + template ::value, int> = 0> + std::pair try_emplace(key_arg &&k, Args &&... args) { + return try_emplace_impl(std::forward(k), std::forward(args)...); } - template - iterator try_emplace(const_iterator hint, const key_type &k, + template + iterator try_emplace(const_iterator hint, const key_arg &k, Args &&... args) { - return this->tree_ - .insert_hint_unique(iterator(hint), k, std::piecewise_construct, - std::forward_as_tuple(k), - std::forward_as_tuple(std::forward(args)...)) - .first; + return try_emplace_hint_impl(hint, k, std::forward(args)...); } - template - iterator try_emplace(const_iterator hint, key_type &&k, Args &&... args) { - // Note: `key_ref` exists to avoid a ClangTidy warning about moving from `k` - // and then using `k` unsequenced. This is safe because the move is into a - // forwarding reference and insert_hint_unique guarantees that `key` is - // never referenced after consuming `args`. - const key_type &key_ref = k; - return this->tree_ - .insert_hint_unique(iterator(hint), key_ref, std::piecewise_construct, - std::forward_as_tuple(std::move(k)), - std::forward_as_tuple(std::forward(args)...)) - .first; + template + iterator try_emplace(const_iterator hint, key_arg &&k, Args &&... args) { + return try_emplace_hint_impl(hint, std::forward(k), + std::forward(args)...); } - mapped_type &operator[](const key_type &k) { + + template + mapped_type &operator[](const key_arg &k) { return try_emplace(k).first->second; } - mapped_type &operator[](key_type &&k) { - return try_emplace(std::move(k)).first->second; + template + mapped_type &operator[](key_arg &&k) { + return try_emplace(std::forward(k)).first->second; } template @@ -513,6 +493,40 @@ class btree_map_container : public btree_set_container { base_internal::ThrowStdOutOfRange("absl::btree_map::at"); return it->second; } + + private: + // Note: when we call `std::forward(obj)` twice, it's safe because + // insert_unique/insert_hint_unique are guaranteed to not consume `obj` when + // `ret.second` is false. + template + std::pair insert_or_assign_impl(K &&k, M &&obj) { + const std::pair ret = + this->tree_.insert_unique(k, std::forward(k), std::forward(obj)); + if (!ret.second) ret.first->second = std::forward(obj); + return ret; + } + template + iterator insert_or_assign_hint_impl(const_iterator hint, K &&k, M &&obj) { + const std::pair ret = this->tree_.insert_hint_unique( + iterator(hint), k, std::forward(k), std::forward(obj)); + if (!ret.second) ret.first->second = std::forward(obj); + return ret.first; + } + + template + std::pair try_emplace_impl(K &&k, Args &&... args) { + return this->tree_.insert_unique( + k, std::piecewise_construct, std::forward_as_tuple(std::forward(k)), + std::forward_as_tuple(std::forward(args)...)); + } + template + iterator try_emplace_hint_impl(const_iterator hint, K &&k, Args &&... args) { + return this->tree_ + .insert_hint_unique(iterator(hint), k, std::piecewise_construct, + std::forward_as_tuple(std::forward(k)), + std::forward_as_tuple(std::forward(args)...)) + .first; + } }; // A common base class for btree_multiset and btree_multimap. @@ -540,7 +554,7 @@ class btree_multiset_container : public btree_container { using super_type::super_type; btree_multiset_container() {} - // Range constructor. + // Range constructors. template btree_multiset_container(InputIterator b, InputIterator e, const key_compare &comp = key_compare(), @@ -548,29 +562,30 @@ class btree_multiset_container : public btree_container { : super_type(comp, alloc) { insert(b, e); } + template + btree_multiset_container(InputIterator b, InputIterator e, + const allocator_type &alloc) + : btree_multiset_container(b, e, key_compare(), alloc) {} - // Initializer list constructor. + // Initializer list constructors. btree_multiset_container(std::initializer_list init, const key_compare &comp = key_compare(), const allocator_type &alloc = allocator_type()) : btree_multiset_container(init.begin(), init.end(), comp, alloc) {} - - // Lookup routines. - template - size_type count(const key_arg &key) const { - return this->tree_.count_multi(key); - } + btree_multiset_container(std::initializer_list init, + const allocator_type &alloc) + : btree_multiset_container(init.begin(), init.end(), alloc) {} // Insertion routines. iterator insert(const value_type &v) { return this->tree_.insert_multi(v); } iterator insert(value_type &&v) { return this->tree_.insert_multi(std::move(v)); } - iterator insert(const_iterator position, const value_type &v) { - return this->tree_.insert_hint_multi(iterator(position), v); + iterator insert(const_iterator hint, const value_type &v) { + return this->tree_.insert_hint_multi(iterator(hint), v); } - iterator insert(const_iterator position, value_type &&v) { - return this->tree_.insert_hint_multi(iterator(position), std::move(v)); + iterator insert(const_iterator hint, value_type &&v) { + return this->tree_.insert_hint_multi(iterator(hint), std::move(v)); } template void insert(InputIterator b, InputIterator e) { @@ -584,9 +599,9 @@ class btree_multiset_container : public btree_container { return this->tree_.insert_multi(init_type(std::forward(args)...)); } template - iterator emplace_hint(const_iterator position, Args &&... args) { + iterator emplace_hint(const_iterator hint, Args &&... args) { return this->tree_.insert_hint_multi( - iterator(position), init_type(std::forward(args)...)); + iterator(hint), init_type(std::forward(args)...)); } iterator insert(node_type &&node) { if (!node) return this->end(); @@ -605,14 +620,9 @@ class btree_multiset_container : public btree_container { return res; } - // Deletion routines. - template - size_type erase(const key_arg &key) { - return this->tree_.erase_multi(key); - } - using super_type::erase; - // Node extraction routines. + // TODO(ezb): we are supposed to extract the first equivalent key if there are + // multiple, but this isn't guaranteed to extract the first one. template node_type extract(const key_arg &key) { auto it = this->find(key); @@ -632,8 +642,9 @@ class btree_multiset_container : public btree_container { typename T::params_type::is_map_container>>::value, int> = 0> void merge(btree_container &src) { // NOLINT - insert(std::make_move_iterator(src.begin()), - std::make_move_iterator(src.end())); + for (auto src_it = src.begin(), end = src.end(); src_it != end; ++src_it) { + insert(std::move(params_type::element(src_it.slot()))); + } src.clear(); } diff --git a/third_party/abseil_cpp/absl/container/internal/common.h b/third_party/abseil_cpp/absl/container/internal/common.h index 8990f2947..030e9d4ab 100644 --- a/third_party/abseil_cpp/absl/container/internal/common.h +++ b/third_party/abseil_cpp/absl/container/internal/common.h @@ -146,8 +146,11 @@ class node_handle decltype(PolicyTraits::key(std::declval())) { - return PolicyTraits::key(this->slot()); + // When C++17 is available, we can use std::launder to provide mutable + // access to the key. Otherwise, we provide const access. + auto key() const + -> decltype(PolicyTraits::mutable_key(std::declval())) { + return PolicyTraits::mutable_key(this->slot()); } mapped_type& mapped() const { diff --git a/third_party/abseil_cpp/absl/container/internal/compressed_tuple.h b/third_party/abseil_cpp/absl/container/internal/compressed_tuple.h index 02bfd03f6..5ebe16494 100644 --- a/third_party/abseil_cpp/absl/container/internal/compressed_tuple.h +++ b/third_party/abseil_cpp/absl/container/internal/compressed_tuple.h @@ -257,7 +257,7 @@ class ABSL_INTERNAL_COMPRESSED_TUPLE_DECLSPEC CompressedTuple template ElemT& get() & { - return internal_compressed_tuple::Storage, I>::get(); + return StorageT::get(); } template diff --git a/third_party/abseil_cpp/absl/container/internal/container_memory.h b/third_party/abseil_cpp/absl/container/internal/container_memory.h index 536ea398e..e67529ecb 100644 --- a/third_party/abseil_cpp/absl/container/internal/container_memory.h +++ b/third_party/abseil_cpp/absl/container/internal/container_memory.h @@ -15,25 +15,27 @@ #ifndef ABSL_CONTAINER_INTERNAL_CONTAINER_MEMORY_H_ #define ABSL_CONTAINER_INTERNAL_CONTAINER_MEMORY_H_ -#ifdef ADDRESS_SANITIZER -#include -#endif - -#ifdef MEMORY_SANITIZER -#include -#endif - #include #include #include +#include #include #include #include +#include "absl/base/config.h" #include "absl/memory/memory.h" #include "absl/meta/type_traits.h" #include "absl/utility/utility.h" +#ifdef ABSL_HAVE_ADDRESS_SANITIZER +#include +#endif + +#ifdef ABSL_HAVE_MEMORY_SANITIZER +#include +#endif + namespace absl { ABSL_NAMESPACE_BEGIN namespace container_internal { @@ -55,8 +57,11 @@ void* Allocate(Alloc* alloc, size_t n) { using M = AlignedType; using A = typename absl::allocator_traits::template rebind_alloc; using AT = typename absl::allocator_traits::template rebind_traits; - A mem_alloc(*alloc); - void* p = AT::allocate(mem_alloc, (n + sizeof(M) - 1) / sizeof(M)); + // On macOS, "mem_alloc" is a #define with one argument defined in + // rpc/types.h, so we can't name the variable "mem_alloc" and initialize it + // with the "foo(bar)" syntax. + A my_mem_alloc(*alloc); + void* p = AT::allocate(my_mem_alloc, (n + sizeof(M) - 1) / sizeof(M)); assert(reinterpret_cast(p) % Alignment == 0 && "allocator does not respect alignment"); return p; @@ -71,8 +76,11 @@ void Deallocate(Alloc* alloc, void* p, size_t n) { using M = AlignedType; using A = typename absl::allocator_traits::template rebind_alloc; using AT = typename absl::allocator_traits::template rebind_traits; - A mem_alloc(*alloc); - AT::deallocate(mem_alloc, static_cast(p), + // On macOS, "mem_alloc" is a #define with one argument defined in + // rpc/types.h, so we can't name the variable "mem_alloc" and initialize it + // with the "foo(bar)" syntax. + A my_mem_alloc(*alloc); + AT::deallocate(my_mem_alloc, static_cast(p), (n + sizeof(M) - 1) / sizeof(M)); } @@ -209,10 +217,10 @@ DecomposeValue(F&& f, Arg&& arg) { // Helper functions for asan and msan. inline void SanitizerPoisonMemoryRegion(const void* m, size_t s) { -#ifdef ADDRESS_SANITIZER +#ifdef ABSL_HAVE_ADDRESS_SANITIZER ASAN_POISON_MEMORY_REGION(m, s); #endif -#ifdef MEMORY_SANITIZER +#ifdef ABSL_HAVE_MEMORY_SANITIZER __msan_poison(m, s); #endif (void)m; @@ -220,10 +228,10 @@ inline void SanitizerPoisonMemoryRegion(const void* m, size_t s) { } inline void SanitizerUnpoisonMemoryRegion(const void* m, size_t s) { -#ifdef ADDRESS_SANITIZER +#ifdef ABSL_HAVE_ADDRESS_SANITIZER ASAN_UNPOISON_MEMORY_REGION(m, s); #endif -#ifdef MEMORY_SANITIZER +#ifdef ABSL_HAVE_MEMORY_SANITIZER __msan_unpoison(m, s); #endif (void)m; @@ -351,6 +359,20 @@ struct map_slot_policy { return slot->value; } + // When C++17 is available, we can use std::launder to provide mutable + // access to the key for use in node handle. +#if defined(__cpp_lib_launder) && __cpp_lib_launder >= 201606 + static K& mutable_key(slot_type* slot) { + // Still check for kMutableKeys so that we can avoid calling std::launder + // unless necessary because it can interfere with optimizations. + return kMutableKeys::value ? slot->key + : *std::launder(const_cast( + std::addressof(slot->value.first))); + } +#else // !(defined(__cpp_lib_launder) && __cpp_lib_launder >= 201606) + static const K& mutable_key(slot_type* slot) { return key(slot); } +#endif + static const K& key(const slot_type* slot) { return kMutableKeys::value ? slot->key : slot->value.first; } @@ -429,13 +451,6 @@ struct map_slot_policy { std::move(src->value)); } } - - template - static void move(Allocator* alloc, slot_type* first, slot_type* last, - slot_type* result) { - for (slot_type *src = first, *dest = result; src != last; ++src, ++dest) - move(alloc, src, dest); - } }; } // namespace container_internal diff --git a/third_party/abseil_cpp/absl/container/internal/hash_function_defaults_test.cc b/third_party/abseil_cpp/absl/container/internal/hash_function_defaults_test.cc index 2d05a0b72..59576b8ed 100644 --- a/third_party/abseil_cpp/absl/container/internal/hash_function_defaults_test.cc +++ b/third_party/abseil_cpp/absl/container/internal/hash_function_defaults_test.cc @@ -337,11 +337,11 @@ ABSL_NAMESPACE_END } // namespace absl enum Hash : size_t { - kStd = 0x2, // std::hash + kStd = 0x1, // std::hash #ifdef _MSC_VER kExtension = kStd, // In MSVC, std::hash == ::hash #else // _MSC_VER - kExtension = 0x4, // ::hash (GCC extension) + kExtension = 0x2, // ::hash (GCC extension) #endif // _MSC_VER }; diff --git a/third_party/abseil_cpp/absl/container/internal/hash_generator_testing.cc b/third_party/abseil_cpp/absl/container/internal/hash_generator_testing.cc index 75c4db6c3..59cc5aac7 100644 --- a/third_party/abseil_cpp/absl/container/internal/hash_generator_testing.cc +++ b/third_party/abseil_cpp/absl/container/internal/hash_generator_testing.cc @@ -41,8 +41,10 @@ class RandomDeviceSeedSeq { } // namespace std::mt19937_64* GetSharedRng() { - RandomDeviceSeedSeq seed_seq; - static auto* rng = new std::mt19937_64(seed_seq); + static auto* rng = [] { + RandomDeviceSeedSeq seed_seq; + return new std::mt19937_64(seed_seq); + }(); return rng; } diff --git a/third_party/abseil_cpp/absl/container/internal/hash_policy_traits.h b/third_party/abseil_cpp/absl/container/internal/hash_policy_traits.h index 3e1209c6e..46c97b18a 100644 --- a/third_party/abseil_cpp/absl/container/internal/hash_policy_traits.h +++ b/third_party/abseil_cpp/absl/container/internal/hash_policy_traits.h @@ -17,6 +17,7 @@ #include #include +#include #include #include @@ -29,15 +30,34 @@ namespace container_internal { // Defines how slots are initialized/destroyed/moved. template struct hash_policy_traits { + // The type of the keys stored in the hashtable. + using key_type = typename Policy::key_type; + private: struct ReturnKey { - // We return `Key` here. + // When C++17 is available, we can use std::launder to provide mutable + // access to the key for use in node handle. +#if defined(__cpp_lib_launder) && __cpp_lib_launder >= 201606 + template ::value, int> = 0> + static key_type& Impl(Key&& k, int) { + return *std::launder( + const_cast(std::addressof(std::forward(k)))); + } +#endif + + template + static Key Impl(Key&& k, char) { + return std::forward(k); + } + // When Key=T&, we forward the lvalue reference. // When Key=T, we return by value to avoid a dangling reference. // eg, for string_hash_map. template - Key operator()(Key&& k, const Args&...) const { - return std::forward(k); + auto operator()(Key&& k, const Args&...) const + -> decltype(Impl(std::forward(k), 0)) { + return Impl(std::forward(k), 0); } }; @@ -52,9 +72,6 @@ struct hash_policy_traits { // The actual object stored in the hash table. using slot_type = typename Policy::slot_type; - // The type of the keys stored in the hashtable. - using key_type = typename Policy::key_type; - // The argument type for insertions into the hashtable. This is different // from value_type for increased performance. See initializer_list constructor // and insert() member functions for more details. @@ -156,7 +173,7 @@ struct hash_policy_traits { // Returns the "key" portion of the slot. // Used for node handle manipulation. template - static auto key(slot_type* slot) + static auto mutable_key(slot_type* slot) -> decltype(P::apply(ReturnKey(), element(slot))) { return P::apply(ReturnKey(), element(slot)); } diff --git a/third_party/abseil_cpp/absl/container/internal/hashtablez_sampler.cc b/third_party/abseil_cpp/absl/container/internal/hashtablez_sampler.cc index 886524f18..e4484fbb1 100644 --- a/third_party/abseil_cpp/absl/container/internal/hashtablez_sampler.cc +++ b/third_party/abseil_cpp/absl/container/internal/hashtablez_sampler.cc @@ -67,6 +67,7 @@ void HashtablezInfo::PrepareForSampling() { capacity.store(0, std::memory_order_relaxed); size.store(0, std::memory_order_relaxed); num_erases.store(0, std::memory_order_relaxed); + num_rehashes.store(0, std::memory_order_relaxed); max_probe_length.store(0, std::memory_order_relaxed); total_probe_length.store(0, std::memory_order_relaxed); hashes_bitwise_or.store(0, std::memory_order_relaxed); diff --git a/third_party/abseil_cpp/absl/container/internal/hashtablez_sampler.h b/third_party/abseil_cpp/absl/container/internal/hashtablez_sampler.h index 308119cf1..394348da5 100644 --- a/third_party/abseil_cpp/absl/container/internal/hashtablez_sampler.h +++ b/third_party/abseil_cpp/absl/container/internal/hashtablez_sampler.h @@ -73,6 +73,7 @@ struct HashtablezInfo { std::atomic capacity; std::atomic size; std::atomic num_erases; + std::atomic num_rehashes; std::atomic max_probe_length; std::atomic total_probe_length; std::atomic hashes_bitwise_or; @@ -105,6 +106,11 @@ inline void RecordRehashSlow(HashtablezInfo* info, size_t total_probe_length) { #endif info->total_probe_length.store(total_probe_length, std::memory_order_relaxed); info->num_erases.store(0, std::memory_order_relaxed); + // There is only one concurrent writer, so `load` then `store` is sufficient + // instead of using `fetch_add`. + info->num_rehashes.store( + 1 + info->num_rehashes.load(std::memory_order_relaxed), + std::memory_order_relaxed); } inline void RecordStorageChangedSlow(HashtablezInfo* info, size_t size, @@ -113,7 +119,8 @@ inline void RecordStorageChangedSlow(HashtablezInfo* info, size_t size, info->capacity.store(capacity, std::memory_order_relaxed); if (size == 0) { // This is a clear, reset the total/num_erases too. - RecordRehashSlow(info, 0); + info->total_probe_length.store(0, std::memory_order_relaxed); + info->num_erases.store(0, std::memory_order_relaxed); } } @@ -122,12 +129,21 @@ void RecordInsertSlow(HashtablezInfo* info, size_t hash, inline void RecordEraseSlow(HashtablezInfo* info) { info->size.fetch_sub(1, std::memory_order_relaxed); - info->num_erases.fetch_add(1, std::memory_order_relaxed); + // There is only one concurrent writer, so `load` then `store` is sufficient + // instead of using `fetch_add`. + info->num_erases.store( + 1 + info->num_erases.load(std::memory_order_relaxed), + std::memory_order_relaxed); } HashtablezInfo* SampleSlow(int64_t* next_sample); void UnsampleSlow(HashtablezInfo* info); +#if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE) +#error ABSL_INTERNAL_HASHTABLEZ_SAMPLE cannot be directly set +#endif // defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE) + +#if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE) class HashtablezInfoHandle { public: explicit HashtablezInfoHandle() : info_(nullptr) {} @@ -179,14 +195,27 @@ class HashtablezInfoHandle { friend class HashtablezInfoHandlePeer; HashtablezInfo* info_; }; +#else +// Ensure that when Hashtablez is turned off at compile time, HashtablezInfo can +// be removed by the linker, in order to reduce the binary size. +class HashtablezInfoHandle { + public: + explicit HashtablezInfoHandle() = default; + explicit HashtablezInfoHandle(std::nullptr_t) {} -#if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE) -#error ABSL_INTERNAL_HASHTABLEZ_SAMPLE cannot be directly set + inline void RecordStorageChanged(size_t /*size*/, size_t /*capacity*/) {} + inline void RecordRehash(size_t /*total_probe_length*/) {} + inline void RecordInsert(size_t /*hash*/, size_t /*distance_from_desired*/) {} + inline void RecordErase() {} + + friend inline void swap(HashtablezInfoHandle& /*lhs*/, + HashtablezInfoHandle& /*rhs*/) {} +}; #endif // defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE) #if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE) extern ABSL_PER_THREAD_TLS_KEYWORD int64_t global_next_sample; -#endif // ABSL_PER_THREAD_TLS +#endif // defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE) // Returns an RAII sampling handle that manages registration and unregistation // with the global sampler. diff --git a/third_party/abseil_cpp/absl/container/internal/hashtablez_sampler_test.cc b/third_party/abseil_cpp/absl/container/internal/hashtablez_sampler_test.cc index b4c4ff92e..8d10a1e94 100644 --- a/third_party/abseil_cpp/absl/container/internal/hashtablez_sampler_test.cc +++ b/third_party/abseil_cpp/absl/container/internal/hashtablez_sampler_test.cc @@ -38,6 +38,7 @@ constexpr int kProbeLength = 8; namespace absl { ABSL_NAMESPACE_BEGIN namespace container_internal { +#if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE) class HashtablezInfoHandlePeer { public: static bool IsSampled(const HashtablezInfoHandle& h) { @@ -46,6 +47,13 @@ class HashtablezInfoHandlePeer { static HashtablezInfo* GetInfo(HashtablezInfoHandle* h) { return h->info_; } }; +#else +class HashtablezInfoHandlePeer { + public: + static bool IsSampled(const HashtablezInfoHandle&) { return false; } + static HashtablezInfo* GetInfo(HashtablezInfoHandle*) { return nullptr; } +}; +#endif // defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE) namespace { using ::absl::synchronization_internal::ThreadPool; @@ -76,6 +84,7 @@ TEST(HashtablezInfoTest, PrepareForSampling) { EXPECT_EQ(info.capacity.load(), 0); EXPECT_EQ(info.size.load(), 0); EXPECT_EQ(info.num_erases.load(), 0); + EXPECT_EQ(info.num_rehashes.load(), 0); EXPECT_EQ(info.max_probe_length.load(), 0); EXPECT_EQ(info.total_probe_length.load(), 0); EXPECT_EQ(info.hashes_bitwise_or.load(), 0); @@ -95,6 +104,7 @@ TEST(HashtablezInfoTest, PrepareForSampling) { EXPECT_EQ(info.capacity.load(), 0); EXPECT_EQ(info.size.load(), 0); EXPECT_EQ(info.num_erases.load(), 0); + EXPECT_EQ(info.num_rehashes.load(), 0); EXPECT_EQ(info.max_probe_length.load(), 0); EXPECT_EQ(info.total_probe_length.load(), 0); EXPECT_EQ(info.hashes_bitwise_or.load(), 0); @@ -167,9 +177,10 @@ TEST(HashtablezInfoTest, RecordRehash) { EXPECT_EQ(info.size.load(), 2); EXPECT_EQ(info.total_probe_length.load(), 3); EXPECT_EQ(info.num_erases.load(), 0); + EXPECT_EQ(info.num_rehashes.load(), 1); } -#if defined(ABSL_HASHTABLEZ_SAMPLE) +#if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE) TEST(HashtablezSamplerTest, SmallSampleParameter) { SetHashtablezEnabled(true); SetHashtablezSampleParameter(100); @@ -213,7 +224,6 @@ TEST(HashtablezSamplerTest, Sample) { } EXPECT_NEAR(sample_rate, 0.01, 0.005); } -#endif TEST(HashtablezSamplerTest, Handle) { auto& sampler = HashtablezSampler::Global(); @@ -243,6 +253,8 @@ TEST(HashtablezSamplerTest, Handle) { }); EXPECT_FALSE(found); } +#endif + TEST(HashtablezSamplerTest, Registration) { HashtablezSampler sampler; diff --git a/third_party/abseil_cpp/absl/container/internal/inlined_vector.h b/third_party/abseil_cpp/absl/container/internal/inlined_vector.h index 4d80b727b..c98c25c44 100644 --- a/third_party/abseil_cpp/absl/container/internal/inlined_vector.h +++ b/third_party/abseil_cpp/absl/container/internal/inlined_vector.h @@ -462,6 +462,9 @@ class Storage { Inlined inlined; }; + template + ABSL_ATTRIBUTE_NOINLINE reference EmplaceBackSlow(Args&&... args); + Metadata metadata_; Data data_; }; @@ -542,48 +545,42 @@ template template auto Storage::Resize(ValueAdapter values, size_type new_size) -> void { StorageView storage_view = MakeStorageView(); - - IteratorValueAdapter move_values( - MoveIterator(storage_view.data)); - - AllocationTransaction allocation_tx(GetAllocPtr()); - ConstructionTransaction construction_tx(GetAllocPtr()); - - absl::Span construct_loop; - absl::Span move_construct_loop; - absl::Span destroy_loop; - - if (new_size > storage_view.capacity) { + auto* const base = storage_view.data; + const size_type size = storage_view.size; + auto* alloc = GetAllocPtr(); + if (new_size <= size) { + // Destroy extra old elements. + inlined_vector_internal::DestroyElements(alloc, base + new_size, + size - new_size); + } else if (new_size <= storage_view.capacity) { + // Construct new elements in place. + inlined_vector_internal::ConstructElements(alloc, base + size, &values, + new_size - size); + } else { + // Steps: + // a. Allocate new backing store. + // b. Construct new elements in new backing store. + // c. Move existing elements from old backing store to now. + // d. Destroy all elements in old backing store. + // Use transactional wrappers for the first two steps so we can roll + // back if necessary due to exceptions. + AllocationTransaction allocation_tx(alloc); size_type new_capacity = ComputeCapacity(storage_view.capacity, new_size); pointer new_data = allocation_tx.Allocate(new_capacity); - construct_loop = {new_data + storage_view.size, - new_size - storage_view.size}; - move_construct_loop = {new_data, storage_view.size}; - destroy_loop = {storage_view.data, storage_view.size}; - } else if (new_size > storage_view.size) { - construct_loop = {storage_view.data + storage_view.size, - new_size - storage_view.size}; - } else { - destroy_loop = {storage_view.data + new_size, storage_view.size - new_size}; - } - construction_tx.Construct(construct_loop.data(), &values, - construct_loop.size()); + ConstructionTransaction construction_tx(alloc); + construction_tx.Construct(new_data + size, &values, new_size - size); - inlined_vector_internal::ConstructElements( - GetAllocPtr(), move_construct_loop.data(), &move_values, - move_construct_loop.size()); + IteratorValueAdapter move_values((MoveIterator(base))); + inlined_vector_internal::ConstructElements(alloc, new_data, &move_values, + size); - inlined_vector_internal::DestroyElements(GetAllocPtr(), destroy_loop.data(), - destroy_loop.size()); - - construction_tx.Commit(); - if (allocation_tx.DidAllocate()) { + inlined_vector_internal::DestroyElements(alloc, base, size); + construction_tx.Commit(); DeallocateIfAllocated(); AcquireAllocatedData(&allocation_tx); SetIsAllocated(); } - SetSize(new_size); } @@ -684,44 +681,50 @@ template template auto Storage::EmplaceBack(Args&&... args) -> reference { StorageView storage_view = MakeStorageView(); + const auto n = storage_view.size; + if (ABSL_PREDICT_TRUE(n != storage_view.capacity)) { + // Fast path; new element fits. + pointer last_ptr = storage_view.data + n; + AllocatorTraits::construct(*GetAllocPtr(), last_ptr, + std::forward(args)...); + AddSize(1); + return *last_ptr; + } + // TODO(b/173712035): Annotate with musttail attribute to prevent regression. + return EmplaceBackSlow(std::forward(args)...); +} +template +template +auto Storage::EmplaceBackSlow(Args&&... args) -> reference { + StorageView storage_view = MakeStorageView(); AllocationTransaction allocation_tx(GetAllocPtr()); - IteratorValueAdapter move_values( MoveIterator(storage_view.data)); - - pointer construct_data; - if (storage_view.size == storage_view.capacity) { - size_type new_capacity = NextCapacity(storage_view.capacity); - construct_data = allocation_tx.Allocate(new_capacity); - } else { - construct_data = storage_view.data; - } - + size_type new_capacity = NextCapacity(storage_view.capacity); + pointer construct_data = allocation_tx.Allocate(new_capacity); pointer last_ptr = construct_data + storage_view.size; + // Construct new element. AllocatorTraits::construct(*GetAllocPtr(), last_ptr, std::forward(args)...); - - if (allocation_tx.DidAllocate()) { - ABSL_INTERNAL_TRY { - inlined_vector_internal::ConstructElements( - GetAllocPtr(), allocation_tx.GetData(), &move_values, - storage_view.size); - } - ABSL_INTERNAL_CATCH_ANY { - AllocatorTraits::destroy(*GetAllocPtr(), last_ptr); - ABSL_INTERNAL_RETHROW; - } - - inlined_vector_internal::DestroyElements(GetAllocPtr(), storage_view.data, - storage_view.size); - - DeallocateIfAllocated(); - AcquireAllocatedData(&allocation_tx); - SetIsAllocated(); + // Move elements from old backing store to new backing store. + ABSL_INTERNAL_TRY { + inlined_vector_internal::ConstructElements( + GetAllocPtr(), allocation_tx.GetData(), &move_values, + storage_view.size); } + ABSL_INTERNAL_CATCH_ANY { + AllocatorTraits::destroy(*GetAllocPtr(), last_ptr); + ABSL_INTERNAL_RETHROW; + } + // Destroy elements in old backing store. + inlined_vector_internal::DestroyElements(GetAllocPtr(), storage_view.data, + storage_view.size); + DeallocateIfAllocated(); + AcquireAllocatedData(&allocation_tx); + SetIsAllocated(); AddSize(1); return *last_ptr; } diff --git a/third_party/abseil_cpp/absl/container/internal/layout.h b/third_party/abseil_cpp/absl/container/internal/layout.h index 69cc85dd6..233678331 100644 --- a/third_party/abseil_cpp/absl/container/internal/layout.h +++ b/third_party/abseil_cpp/absl/container/internal/layout.h @@ -163,6 +163,7 @@ #include #include #include + #include #include #include @@ -170,15 +171,16 @@ #include #include -#ifdef ADDRESS_SANITIZER -#include -#endif - +#include "absl/base/config.h" #include "absl/meta/type_traits.h" #include "absl/strings/str_cat.h" #include "absl/types/span.h" #include "absl/utility/utility.h" +#ifdef ABSL_HAVE_ADDRESS_SANITIZER +#include +#endif + #if defined(__GXX_RTTI) #define ABSL_INTERNAL_HAS_CXA_DEMANGLE #endif @@ -614,7 +616,7 @@ class LayoutImpl, absl::index_sequence, void PoisonPadding(const Char* p) const { static_assert(N < NumOffsets, "Index out of bounds"); (void)p; -#ifdef ADDRESS_SANITIZER +#ifdef ABSL_HAVE_ADDRESS_SANITIZER PoisonPadding(p); // The `if` is an optimization. It doesn't affect the observable behaviour. if (ElementAlignment::value % ElementAlignment::value) { diff --git a/third_party/abseil_cpp/absl/container/internal/layout_test.cc b/third_party/abseil_cpp/absl/container/internal/layout_test.cc index 8f3628a1f..1d7158ffc 100644 --- a/third_party/abseil_cpp/absl/container/internal/layout_test.cc +++ b/third_party/abseil_cpp/absl/container/internal/layout_test.cc @@ -17,6 +17,7 @@ // We need ::max_align_t because some libstdc++ versions don't provide // std::max_align_t #include + #include #include #include @@ -24,6 +25,7 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" +#include "absl/base/config.h" #include "absl/base/internal/raw_logging.h" #include "absl/types/span.h" @@ -126,8 +128,10 @@ TEST(Layout, ElementTypes) { { using L = Layout; SameType, L::ElementTypes>(); - SameType, decltype(L::Partial())::ElementTypes>(); - SameType, decltype(L::Partial(0))::ElementTypes>(); + SameType, + decltype(L::Partial())::ElementTypes>(); + SameType, + decltype(L::Partial(0))::ElementTypes>(); } { using L = Layout; @@ -366,18 +370,21 @@ TEST(Layout, PointerByIndex) { { using L = Layout; EXPECT_EQ(0, Distance(p, Type(L::Partial().Pointer<0>(p)))); - EXPECT_EQ(0, Distance(p, Type(L::Partial(3).Pointer<0>(p)))); + EXPECT_EQ(0, + Distance(p, Type(L::Partial(3).Pointer<0>(p)))); EXPECT_EQ(0, Distance(p, Type(L(3).Pointer<0>(p)))); } { using L = Layout; EXPECT_EQ(0, Distance(p, Type(L::Partial().Pointer<0>(p)))); - EXPECT_EQ(0, Distance(p, Type(L::Partial(3).Pointer<0>(p)))); - EXPECT_EQ(12, Distance(p, Type(L::Partial(3).Pointer<1>(p)))); EXPECT_EQ(0, - Distance(p, Type(L::Partial(3, 5).Pointer<0>(p)))); + Distance(p, Type(L::Partial(3).Pointer<0>(p)))); EXPECT_EQ(12, - Distance(p, Type(L::Partial(3, 5).Pointer<1>(p)))); + Distance(p, Type(L::Partial(3).Pointer<1>(p)))); + EXPECT_EQ( + 0, Distance(p, Type(L::Partial(3, 5).Pointer<0>(p)))); + EXPECT_EQ( + 12, Distance(p, Type(L::Partial(3, 5).Pointer<1>(p)))); EXPECT_EQ(0, Distance(p, Type(L(3, 5).Pointer<0>(p)))); EXPECT_EQ(12, Distance(p, Type(L(3, 5).Pointer<1>(p)))); } @@ -385,39 +392,44 @@ TEST(Layout, PointerByIndex) { using L = Layout; EXPECT_EQ(0, Distance(p, Type(L::Partial().Pointer<0>(p)))); EXPECT_EQ(0, Distance(p, Type(L::Partial(0).Pointer<0>(p)))); - EXPECT_EQ(0, Distance(p, Type(L::Partial(0).Pointer<1>(p)))); + EXPECT_EQ(0, + Distance(p, Type(L::Partial(0).Pointer<1>(p)))); EXPECT_EQ(0, Distance(p, Type(L::Partial(1).Pointer<0>(p)))); - EXPECT_EQ(4, Distance(p, Type(L::Partial(1).Pointer<1>(p)))); + EXPECT_EQ(4, + Distance(p, Type(L::Partial(1).Pointer<1>(p)))); EXPECT_EQ(0, Distance(p, Type(L::Partial(5).Pointer<0>(p)))); - EXPECT_EQ(8, Distance(p, Type(L::Partial(5).Pointer<1>(p)))); + EXPECT_EQ(8, + Distance(p, Type(L::Partial(5).Pointer<1>(p)))); EXPECT_EQ(0, Distance(p, Type(L::Partial(0, 0).Pointer<0>(p)))); - EXPECT_EQ(0, - Distance(p, Type(L::Partial(0, 0).Pointer<1>(p)))); + EXPECT_EQ( + 0, Distance(p, Type(L::Partial(0, 0).Pointer<1>(p)))); EXPECT_EQ(0, Distance(p, Type(L::Partial(0, 0).Pointer<2>(p)))); EXPECT_EQ(0, Distance(p, Type(L::Partial(1, 0).Pointer<0>(p)))); - EXPECT_EQ(4, - Distance(p, Type(L::Partial(1, 0).Pointer<1>(p)))); + EXPECT_EQ( + 4, Distance(p, Type(L::Partial(1, 0).Pointer<1>(p)))); EXPECT_EQ(8, Distance(p, Type(L::Partial(1, 0).Pointer<2>(p)))); EXPECT_EQ(0, Distance(p, Type(L::Partial(5, 3).Pointer<0>(p)))); - EXPECT_EQ(8, - Distance(p, Type(L::Partial(5, 3).Pointer<1>(p)))); + EXPECT_EQ( + 8, Distance(p, Type(L::Partial(5, 3).Pointer<1>(p)))); EXPECT_EQ(24, Distance(p, Type(L::Partial(5, 3).Pointer<2>(p)))); EXPECT_EQ( 0, Distance(p, Type(L::Partial(0, 0, 0).Pointer<0>(p)))); EXPECT_EQ( - 0, Distance(p, Type(L::Partial(0, 0, 0).Pointer<1>(p)))); + 0, + Distance(p, Type(L::Partial(0, 0, 0).Pointer<1>(p)))); EXPECT_EQ( 0, Distance(p, Type(L::Partial(0, 0, 0).Pointer<2>(p)))); EXPECT_EQ( 0, Distance(p, Type(L::Partial(1, 0, 0).Pointer<0>(p)))); EXPECT_EQ( - 4, Distance(p, Type(L::Partial(1, 0, 0).Pointer<1>(p)))); + 4, + Distance(p, Type(L::Partial(1, 0, 0).Pointer<1>(p)))); EXPECT_EQ( 8, Distance(p, Type(L::Partial(1, 0, 0).Pointer<2>(p)))); EXPECT_EQ( @@ -426,7 +438,8 @@ TEST(Layout, PointerByIndex) { 24, Distance(p, Type(L::Partial(5, 3, 1).Pointer<2>(p)))); EXPECT_EQ( - 8, Distance(p, Type(L::Partial(5, 3, 1).Pointer<1>(p)))); + 8, + Distance(p, Type(L::Partial(5, 3, 1).Pointer<1>(p)))); EXPECT_EQ(0, Distance(p, Type(L(5, 3, 1).Pointer<0>(p)))); EXPECT_EQ(24, Distance(p, Type(L(5, 3, 1).Pointer<2>(p)))); EXPECT_EQ(8, Distance(p, Type(L(5, 3, 1).Pointer<1>(p)))); @@ -437,75 +450,78 @@ TEST(Layout, PointerByType) { alignas(max_align_t) const unsigned char p[100] = {}; { using L = Layout; - EXPECT_EQ(0, - Distance(p, Type(L::Partial().Pointer(p)))); - EXPECT_EQ(0, - Distance(p, Type(L::Partial(3).Pointer(p)))); + EXPECT_EQ( + 0, Distance(p, Type(L::Partial().Pointer(p)))); + EXPECT_EQ( + 0, + Distance(p, Type(L::Partial(3).Pointer(p)))); EXPECT_EQ(0, Distance(p, Type(L(3).Pointer(p)))); } { using L = Layout; - EXPECT_EQ(0, Distance(p, Type(L::Partial().Pointer(p)))); - EXPECT_EQ(0, - Distance(p, Type(L::Partial(0).Pointer(p)))); - EXPECT_EQ(0, - Distance(p, Type(L::Partial(0).Pointer(p)))); - EXPECT_EQ(0, - Distance(p, Type(L::Partial(1).Pointer(p)))); - EXPECT_EQ(4, - Distance(p, Type(L::Partial(1).Pointer(p)))); - EXPECT_EQ(0, - Distance(p, Type(L::Partial(5).Pointer(p)))); - EXPECT_EQ(8, - Distance(p, Type(L::Partial(5).Pointer(p)))); EXPECT_EQ( - 0, Distance(p, Type(L::Partial(0, 0).Pointer(p)))); + 0, Distance(p, Type(L::Partial().Pointer(p)))); EXPECT_EQ( - 0, Distance(p, Type(L::Partial(0, 0).Pointer(p)))); + 0, Distance(p, Type(L::Partial(0).Pointer(p)))); + EXPECT_EQ( + 0, + Distance(p, Type(L::Partial(0).Pointer(p)))); + EXPECT_EQ( + 0, Distance(p, Type(L::Partial(1).Pointer(p)))); + EXPECT_EQ( + 4, + Distance(p, Type(L::Partial(1).Pointer(p)))); + EXPECT_EQ( + 0, Distance(p, Type(L::Partial(5).Pointer(p)))); + EXPECT_EQ( + 8, + Distance(p, Type(L::Partial(5).Pointer(p)))); + EXPECT_EQ( + 0, + Distance(p, Type(L::Partial(0, 0).Pointer(p)))); + EXPECT_EQ(0, Distance(p, Type( + L::Partial(0, 0).Pointer(p)))); EXPECT_EQ( 0, Distance(p, Type(L::Partial(0, 0).Pointer(p)))); EXPECT_EQ( - 0, Distance(p, Type(L::Partial(1, 0).Pointer(p)))); - EXPECT_EQ( - 4, Distance(p, Type(L::Partial(1, 0).Pointer(p)))); + 0, + Distance(p, Type(L::Partial(1, 0).Pointer(p)))); + EXPECT_EQ(4, Distance(p, Type( + L::Partial(1, 0).Pointer(p)))); EXPECT_EQ( 8, Distance(p, Type(L::Partial(1, 0).Pointer(p)))); EXPECT_EQ( - 0, Distance(p, Type(L::Partial(5, 3).Pointer(p)))); - EXPECT_EQ( - 8, Distance(p, Type(L::Partial(5, 3).Pointer(p)))); + 0, + Distance(p, Type(L::Partial(5, 3).Pointer(p)))); + EXPECT_EQ(8, Distance(p, Type( + L::Partial(5, 3).Pointer(p)))); EXPECT_EQ( 24, Distance(p, Type(L::Partial(5, 3).Pointer(p)))); - EXPECT_EQ( - 0, - Distance(p, Type(L::Partial(0, 0, 0).Pointer(p)))); - EXPECT_EQ( - 0, - Distance(p, Type(L::Partial(0, 0, 0).Pointer(p)))); + EXPECT_EQ(0, Distance(p, Type( + L::Partial(0, 0, 0).Pointer(p)))); + EXPECT_EQ(0, Distance(p, Type( + L::Partial(0, 0, 0).Pointer(p)))); EXPECT_EQ(0, Distance(p, Type( L::Partial(0, 0, 0).Pointer(p)))); - EXPECT_EQ( - 0, - Distance(p, Type(L::Partial(1, 0, 0).Pointer(p)))); - EXPECT_EQ( - 4, - Distance(p, Type(L::Partial(1, 0, 0).Pointer(p)))); + EXPECT_EQ(0, Distance(p, Type( + L::Partial(1, 0, 0).Pointer(p)))); + EXPECT_EQ(4, Distance(p, Type( + L::Partial(1, 0, 0).Pointer(p)))); EXPECT_EQ(8, Distance(p, Type( L::Partial(1, 0, 0).Pointer(p)))); - EXPECT_EQ( - 0, - Distance(p, Type(L::Partial(5, 3, 1).Pointer(p)))); + EXPECT_EQ(0, Distance(p, Type( + L::Partial(5, 3, 1).Pointer(p)))); EXPECT_EQ(24, Distance(p, Type( L::Partial(5, 3, 1).Pointer(p)))); - EXPECT_EQ( - 8, - Distance(p, Type(L::Partial(5, 3, 1).Pointer(p)))); + EXPECT_EQ(8, Distance(p, Type( + L::Partial(5, 3, 1).Pointer(p)))); EXPECT_EQ(24, Distance(p, Type(L(5, 3, 1).Pointer(p)))); - EXPECT_EQ(8, Distance(p, Type(L(5, 3, 1).Pointer(p)))); + EXPECT_EQ( + 8, Distance(p, Type(L(5, 3, 1).Pointer(p)))); } } @@ -546,15 +562,18 @@ TEST(Layout, MutablePointerByIndex) { EXPECT_EQ(8, Distance(p, Type(L::Partial(5, 3).Pointer<1>(p)))); EXPECT_EQ(24, Distance(p, Type(L::Partial(5, 3).Pointer<2>(p)))); EXPECT_EQ(0, Distance(p, Type(L::Partial(0, 0, 0).Pointer<0>(p)))); - EXPECT_EQ(0, Distance(p, Type(L::Partial(0, 0, 0).Pointer<1>(p)))); + EXPECT_EQ(0, + Distance(p, Type(L::Partial(0, 0, 0).Pointer<1>(p)))); EXPECT_EQ(0, Distance(p, Type(L::Partial(0, 0, 0).Pointer<2>(p)))); EXPECT_EQ(0, Distance(p, Type(L::Partial(1, 0, 0).Pointer<0>(p)))); - EXPECT_EQ(4, Distance(p, Type(L::Partial(1, 0, 0).Pointer<1>(p)))); + EXPECT_EQ(4, + Distance(p, Type(L::Partial(1, 0, 0).Pointer<1>(p)))); EXPECT_EQ(8, Distance(p, Type(L::Partial(1, 0, 0).Pointer<2>(p)))); EXPECT_EQ(0, Distance(p, Type(L::Partial(5, 3, 1).Pointer<0>(p)))); EXPECT_EQ(24, Distance(p, Type(L::Partial(5, 3, 1).Pointer<2>(p)))); - EXPECT_EQ(8, Distance(p, Type(L::Partial(5, 3, 1).Pointer<1>(p)))); + EXPECT_EQ(8, + Distance(p, Type(L::Partial(5, 3, 1).Pointer<1>(p)))); EXPECT_EQ(0, Distance(p, Type(L(5, 3, 1).Pointer<0>(p)))); EXPECT_EQ(24, Distance(p, Type(L(5, 3, 1).Pointer<2>(p)))); EXPECT_EQ(8, Distance(p, Type(L(5, 3, 1).Pointer<1>(p)))); @@ -566,48 +585,61 @@ TEST(Layout, MutablePointerByType) { { using L = Layout; EXPECT_EQ(0, Distance(p, Type(L::Partial().Pointer(p)))); - EXPECT_EQ(0, Distance(p, Type(L::Partial(3).Pointer(p)))); + EXPECT_EQ(0, + Distance(p, Type(L::Partial(3).Pointer(p)))); EXPECT_EQ(0, Distance(p, Type(L(3).Pointer(p)))); } { using L = Layout; EXPECT_EQ(0, Distance(p, Type(L::Partial().Pointer(p)))); EXPECT_EQ(0, Distance(p, Type(L::Partial(0).Pointer(p)))); - EXPECT_EQ(0, Distance(p, Type(L::Partial(0).Pointer(p)))); + EXPECT_EQ(0, + Distance(p, Type(L::Partial(0).Pointer(p)))); EXPECT_EQ(0, Distance(p, Type(L::Partial(1).Pointer(p)))); - EXPECT_EQ(4, Distance(p, Type(L::Partial(1).Pointer(p)))); + EXPECT_EQ(4, + Distance(p, Type(L::Partial(1).Pointer(p)))); EXPECT_EQ(0, Distance(p, Type(L::Partial(5).Pointer(p)))); - EXPECT_EQ(8, Distance(p, Type(L::Partial(5).Pointer(p)))); - EXPECT_EQ(0, Distance(p, Type(L::Partial(0, 0).Pointer(p)))); - EXPECT_EQ(0, Distance(p, Type(L::Partial(0, 0).Pointer(p)))); + EXPECT_EQ(8, + Distance(p, Type(L::Partial(5).Pointer(p)))); + EXPECT_EQ(0, + Distance(p, Type(L::Partial(0, 0).Pointer(p)))); + EXPECT_EQ( + 0, Distance(p, Type(L::Partial(0, 0).Pointer(p)))); EXPECT_EQ(0, Distance(p, Type(L::Partial(0, 0).Pointer(p)))); - EXPECT_EQ(0, Distance(p, Type(L::Partial(1, 0).Pointer(p)))); - EXPECT_EQ(4, Distance(p, Type(L::Partial(1, 0).Pointer(p)))); + EXPECT_EQ(0, + Distance(p, Type(L::Partial(1, 0).Pointer(p)))); + EXPECT_EQ( + 4, Distance(p, Type(L::Partial(1, 0).Pointer(p)))); EXPECT_EQ(8, Distance(p, Type(L::Partial(1, 0).Pointer(p)))); - EXPECT_EQ(0, Distance(p, Type(L::Partial(5, 3).Pointer(p)))); - EXPECT_EQ(8, Distance(p, Type(L::Partial(5, 3).Pointer(p)))); + EXPECT_EQ(0, + Distance(p, Type(L::Partial(5, 3).Pointer(p)))); + EXPECT_EQ( + 8, Distance(p, Type(L::Partial(5, 3).Pointer(p)))); EXPECT_EQ(24, Distance(p, Type(L::Partial(5, 3).Pointer(p)))); - EXPECT_EQ(0, - Distance(p, Type(L::Partial(0, 0, 0).Pointer(p)))); - EXPECT_EQ(0, - Distance(p, Type(L::Partial(0, 0, 0).Pointer(p)))); + EXPECT_EQ( + 0, Distance(p, Type(L::Partial(0, 0, 0).Pointer(p)))); + EXPECT_EQ( + 0, + Distance(p, Type(L::Partial(0, 0, 0).Pointer(p)))); EXPECT_EQ( 0, Distance(p, Type(L::Partial(0, 0, 0).Pointer(p)))); - EXPECT_EQ(0, - Distance(p, Type(L::Partial(1, 0, 0).Pointer(p)))); - EXPECT_EQ(4, - Distance(p, Type(L::Partial(1, 0, 0).Pointer(p)))); + EXPECT_EQ( + 0, Distance(p, Type(L::Partial(1, 0, 0).Pointer(p)))); + EXPECT_EQ( + 4, + Distance(p, Type(L::Partial(1, 0, 0).Pointer(p)))); EXPECT_EQ( 8, Distance(p, Type(L::Partial(1, 0, 0).Pointer(p)))); - EXPECT_EQ(0, - Distance(p, Type(L::Partial(5, 3, 1).Pointer(p)))); + EXPECT_EQ( + 0, Distance(p, Type(L::Partial(5, 3, 1).Pointer(p)))); EXPECT_EQ( 24, Distance(p, Type(L::Partial(5, 3, 1).Pointer(p)))); - EXPECT_EQ(8, - Distance(p, Type(L::Partial(5, 3, 1).Pointer(p)))); + EXPECT_EQ( + 8, + Distance(p, Type(L::Partial(5, 3, 1).Pointer(p)))); EXPECT_EQ(0, Distance(p, Type(L(5, 3, 1).Pointer(p)))); EXPECT_EQ(24, Distance(p, Type(L(5, 3, 1).Pointer(p)))); EXPECT_EQ(8, Distance(p, Type(L(5, 3, 1).Pointer(p)))); @@ -788,67 +820,72 @@ TEST(Layout, SliceByIndexData) { { using L = Layout; EXPECT_EQ( - 0, - Distance(p, Type>(L::Partial(0).Slice<0>(p)).data())); + 0, Distance( + p, Type>(L::Partial(0).Slice<0>(p)).data())); EXPECT_EQ( - 0, - Distance(p, Type>(L::Partial(3).Slice<0>(p)).data())); - EXPECT_EQ(0, Distance(p, Type>(L(3).Slice<0>(p)).data())); + 0, Distance( + p, Type>(L::Partial(3).Slice<0>(p)).data())); + EXPECT_EQ(0, + Distance(p, Type>(L(3).Slice<0>(p)).data())); } { using L = Layout; EXPECT_EQ( - 0, - Distance(p, Type>(L::Partial(3).Slice<0>(p)).data())); + 0, Distance( + p, Type>(L::Partial(3).Slice<0>(p)).data())); EXPECT_EQ( 0, - Distance(p, - Type>(L::Partial(3, 5).Slice<0>(p)).data())); + Distance( + p, Type>(L::Partial(3, 5).Slice<0>(p)).data())); EXPECT_EQ( 12, - Distance(p, - Type>(L::Partial(3, 5).Slice<1>(p)).data())); - EXPECT_EQ(0, - Distance(p, Type>(L(3, 5).Slice<0>(p)).data())); - EXPECT_EQ(12, - Distance(p, Type>(L(3, 5).Slice<1>(p)).data())); + Distance( + p, Type>(L::Partial(3, 5).Slice<1>(p)).data())); + EXPECT_EQ( + 0, Distance(p, Type>(L(3, 5).Slice<0>(p)).data())); + EXPECT_EQ( + 12, Distance(p, Type>(L(3, 5).Slice<1>(p)).data())); } { using L = Layout; EXPECT_EQ( - 0, - Distance(p, Type>(L::Partial(0).Slice<0>(p)).data())); - EXPECT_EQ( - 0, - Distance(p, Type>(L::Partial(1).Slice<0>(p)).data())); - EXPECT_EQ( - 0, - Distance(p, Type>(L::Partial(5).Slice<0>(p)).data())); + 0, Distance( + p, Type>(L::Partial(0).Slice<0>(p)).data())); EXPECT_EQ( 0, Distance( - p, Type>(L::Partial(0, 0).Slice<0>(p)).data())); - EXPECT_EQ( - 0, - Distance(p, - Type>(L::Partial(0, 0).Slice<1>(p)).data())); + p, Type>(L::Partial(1).Slice<0>(p)).data())); EXPECT_EQ( 0, Distance( - p, Type>(L::Partial(1, 0).Slice<0>(p)).data())); - EXPECT_EQ( - 4, - Distance(p, - Type>(L::Partial(1, 0).Slice<1>(p)).data())); - EXPECT_EQ( - 0, Distance( - p, Type>(L::Partial(5, 3).Slice<0>(p)).data())); - EXPECT_EQ( - 8, - Distance(p, - Type>(L::Partial(5, 3).Slice<1>(p)).data())); + p, Type>(L::Partial(5).Slice<0>(p)).data())); EXPECT_EQ( 0, Distance( - p, Type>(L::Partial(0, 0, 0).Slice<0>(p)).data())); + p, Type>(L::Partial(0, 0).Slice<0>(p)).data())); + EXPECT_EQ( + 0, + Distance( + p, Type>(L::Partial(0, 0).Slice<1>(p)).data())); + EXPECT_EQ( + 0, + Distance( + p, Type>(L::Partial(1, 0).Slice<0>(p)).data())); + EXPECT_EQ( + 4, + Distance( + p, Type>(L::Partial(1, 0).Slice<1>(p)).data())); + EXPECT_EQ( + 0, + Distance( + p, Type>(L::Partial(5, 3).Slice<0>(p)).data())); + EXPECT_EQ( + 8, + Distance( + p, Type>(L::Partial(5, 3).Slice<1>(p)).data())); + EXPECT_EQ( + 0, + Distance( + p, + Type>(L::Partial(0, 0, 0).Slice<0>(p)).data())); EXPECT_EQ( 0, Distance( @@ -862,7 +899,8 @@ TEST(Layout, SliceByIndexData) { EXPECT_EQ( 0, Distance( - p, Type>(L::Partial(1, 0, 0).Slice<0>(p)).data())); + p, + Type>(L::Partial(1, 0, 0).Slice<0>(p)).data())); EXPECT_EQ( 4, Distance( @@ -876,7 +914,8 @@ TEST(Layout, SliceByIndexData) { EXPECT_EQ( 0, Distance( - p, Type>(L::Partial(5, 3, 1).Slice<0>(p)).data())); + p, + Type>(L::Partial(5, 3, 1).Slice<0>(p)).data())); EXPECT_EQ( 24, Distance( @@ -888,12 +927,14 @@ TEST(Layout, SliceByIndexData) { p, Type>(L::Partial(5, 3, 1).Slice<1>(p)).data())); EXPECT_EQ( - 0, Distance(p, Type>(L(5, 3, 1).Slice<0>(p)).data())); + 0, + Distance(p, Type>(L(5, 3, 1).Slice<0>(p)).data())); EXPECT_EQ( 24, Distance(p, Type>(L(5, 3, 1).Slice<2>(p)).data())); EXPECT_EQ( - 8, Distance(p, Type>(L(5, 3, 1).Slice<1>(p)).data())); + 8, + Distance(p, Type>(L(5, 3, 1).Slice<1>(p)).data())); } } @@ -904,98 +945,94 @@ TEST(Layout, SliceByTypeData) { EXPECT_EQ( 0, Distance( - p, Type>(L::Partial(0).Slice(p)).data())); + p, + Type>(L::Partial(0).Slice(p)).data())); EXPECT_EQ( 0, Distance( - p, Type>(L::Partial(3).Slice(p)).data())); + p, + Type>(L::Partial(3).Slice(p)).data())); EXPECT_EQ( - 0, Distance(p, Type>(L(3).Slice(p)).data())); + 0, + Distance(p, Type>(L(3).Slice(p)).data())); } { using L = Layout; - EXPECT_EQ( - 0, Distance( - p, Type>(L::Partial(0).Slice(p)).data())); - EXPECT_EQ( - 0, Distance( - p, Type>(L::Partial(1).Slice(p)).data())); - EXPECT_EQ( - 0, Distance( - p, Type>(L::Partial(5).Slice(p)).data())); EXPECT_EQ( 0, Distance( - p, Type>(L::Partial(0, 0).Slice(p)).data())); + p, + Type>(L::Partial(0).Slice(p)).data())); EXPECT_EQ( 0, Distance( p, - Type>(L::Partial(0, 0).Slice(p)).data())); - EXPECT_EQ( - 0, - Distance( - p, Type>(L::Partial(1, 0).Slice(p)).data())); - EXPECT_EQ( - 4, - Distance( - p, - Type>(L::Partial(1, 0).Slice(p)).data())); - EXPECT_EQ( - 0, - Distance( - p, Type>(L::Partial(5, 3).Slice(p)).data())); - EXPECT_EQ( - 8, - Distance( - p, - Type>(L::Partial(5, 3).Slice(p)).data())); + Type>(L::Partial(1).Slice(p)).data())); EXPECT_EQ( 0, Distance( p, - Type>(L::Partial(0, 0, 0).Slice(p)).data())); + Type>(L::Partial(5).Slice(p)).data())); EXPECT_EQ( 0, - Distance(p, Type>(L::Partial(0, 0, 0).Slice(p)) + Distance(p, Type>(L::Partial(0, 0).Slice(p)) .data())); + EXPECT_EQ(0, Distance(p, Type>( + L::Partial(0, 0).Slice(p)) + .data())); + EXPECT_EQ( + 0, + Distance(p, Type>(L::Partial(1, 0).Slice(p)) + .data())); + EXPECT_EQ(4, Distance(p, Type>( + L::Partial(1, 0).Slice(p)) + .data())); + EXPECT_EQ( + 0, + Distance(p, Type>(L::Partial(5, 3).Slice(p)) + .data())); + EXPECT_EQ(8, Distance(p, Type>( + L::Partial(5, 3).Slice(p)) + .data())); + EXPECT_EQ(0, Distance(p, Type>( + L::Partial(0, 0, 0).Slice(p)) + .data())); + EXPECT_EQ(0, Distance(p, Type>( + L::Partial(0, 0, 0).Slice(p)) + .data())); EXPECT_EQ(0, Distance(p, Type>( L::Partial(0, 0, 0).Slice(p)) .data())); - EXPECT_EQ( - 0, - Distance( - p, - Type>(L::Partial(1, 0, 0).Slice(p)).data())); - EXPECT_EQ( - 4, - Distance(p, Type>(L::Partial(1, 0, 0).Slice(p)) - .data())); + EXPECT_EQ(0, Distance(p, Type>( + L::Partial(1, 0, 0).Slice(p)) + .data())); + EXPECT_EQ(4, Distance(p, Type>( + L::Partial(1, 0, 0).Slice(p)) + .data())); EXPECT_EQ(8, Distance(p, Type>( L::Partial(1, 0, 0).Slice(p)) .data())); - EXPECT_EQ( - 0, - Distance( - p, - Type>(L::Partial(5, 3, 1).Slice(p)).data())); + EXPECT_EQ(0, Distance(p, Type>( + L::Partial(5, 3, 1).Slice(p)) + .data())); EXPECT_EQ(24, Distance(p, Type>( L::Partial(5, 3, 1).Slice(p)) .data())); - EXPECT_EQ( - 8, - Distance(p, Type>(L::Partial(5, 3, 1).Slice(p)) - .data())); + EXPECT_EQ(8, Distance(p, Type>( + L::Partial(5, 3, 1).Slice(p)) + .data())); EXPECT_EQ( 0, - Distance(p, Type>(L(5, 3, 1).Slice(p)).data())); + Distance(p, + Type>(L(5, 3, 1).Slice(p)).data())); EXPECT_EQ( 24, Distance(p, Type>(L(5, 3, 1).Slice(p)).data())); EXPECT_EQ( - 8, Distance( - p, Type>(L(5, 3, 1).Slice(p)).data())); + 8, + Distance( + p, Type>(L(5, 3, 1).Slice(p)).data())); } } @@ -1003,18 +1040,19 @@ TEST(Layout, MutableSliceByIndexData) { alignas(max_align_t) unsigned char p[100]; { using L = Layout; - EXPECT_EQ(0, - Distance(p, Type>(L::Partial(0).Slice<0>(p)).data())); - EXPECT_EQ(0, - Distance(p, Type>(L::Partial(3).Slice<0>(p)).data())); + EXPECT_EQ( + 0, Distance(p, Type>(L::Partial(0).Slice<0>(p)).data())); + EXPECT_EQ( + 0, Distance(p, Type>(L::Partial(3).Slice<0>(p)).data())); EXPECT_EQ(0, Distance(p, Type>(L(3).Slice<0>(p)).data())); } { using L = Layout; - EXPECT_EQ(0, - Distance(p, Type>(L::Partial(3).Slice<0>(p)).data())); EXPECT_EQ( - 0, Distance(p, Type>(L::Partial(3, 5).Slice<0>(p)).data())); + 0, Distance(p, Type>(L::Partial(3).Slice<0>(p)).data())); + EXPECT_EQ( + 0, + Distance(p, Type>(L::Partial(3, 5).Slice<0>(p)).data())); EXPECT_EQ( 12, Distance(p, Type>(L::Partial(3, 5).Slice<1>(p)).data())); @@ -1023,55 +1061,63 @@ TEST(Layout, MutableSliceByIndexData) { } { using L = Layout; - EXPECT_EQ(0, - Distance(p, Type>(L::Partial(0).Slice<0>(p)).data())); - EXPECT_EQ(0, - Distance(p, Type>(L::Partial(1).Slice<0>(p)).data())); - EXPECT_EQ(0, - Distance(p, Type>(L::Partial(5).Slice<0>(p)).data())); EXPECT_EQ( - 0, Distance(p, Type>(L::Partial(0, 0).Slice<0>(p)).data())); + 0, Distance(p, Type>(L::Partial(0).Slice<0>(p)).data())); EXPECT_EQ( - 0, Distance(p, Type>(L::Partial(0, 0).Slice<1>(p)).data())); + 0, Distance(p, Type>(L::Partial(1).Slice<0>(p)).data())); EXPECT_EQ( - 0, Distance(p, Type>(L::Partial(1, 0).Slice<0>(p)).data())); - EXPECT_EQ( - 4, Distance(p, Type>(L::Partial(1, 0).Slice<1>(p)).data())); - EXPECT_EQ( - 0, Distance(p, Type>(L::Partial(5, 3).Slice<0>(p)).data())); - EXPECT_EQ( - 8, Distance(p, Type>(L::Partial(5, 3).Slice<1>(p)).data())); + 0, Distance(p, Type>(L::Partial(5).Slice<0>(p)).data())); EXPECT_EQ( 0, - Distance(p, Type>(L::Partial(0, 0, 0).Slice<0>(p)).data())); + Distance(p, Type>(L::Partial(0, 0).Slice<0>(p)).data())); EXPECT_EQ( 0, - Distance(p, Type>(L::Partial(0, 0, 0).Slice<1>(p)).data())); + Distance(p, Type>(L::Partial(0, 0).Slice<1>(p)).data())); + EXPECT_EQ( + 0, + Distance(p, Type>(L::Partial(1, 0).Slice<0>(p)).data())); + EXPECT_EQ( + 4, + Distance(p, Type>(L::Partial(1, 0).Slice<1>(p)).data())); + EXPECT_EQ( + 0, + Distance(p, Type>(L::Partial(5, 3).Slice<0>(p)).data())); + EXPECT_EQ( + 8, + Distance(p, Type>(L::Partial(5, 3).Slice<1>(p)).data())); + EXPECT_EQ( + 0, Distance( + p, Type>(L::Partial(0, 0, 0).Slice<0>(p)).data())); + EXPECT_EQ( + 0, Distance( + p, Type>(L::Partial(0, 0, 0).Slice<1>(p)).data())); EXPECT_EQ( 0, Distance( p, Type>(L::Partial(0, 0, 0).Slice<2>(p)).data())); EXPECT_EQ( - 0, - Distance(p, Type>(L::Partial(1, 0, 0).Slice<0>(p)).data())); + 0, Distance( + p, Type>(L::Partial(1, 0, 0).Slice<0>(p)).data())); EXPECT_EQ( - 4, - Distance(p, Type>(L::Partial(1, 0, 0).Slice<1>(p)).data())); + 4, Distance( + p, Type>(L::Partial(1, 0, 0).Slice<1>(p)).data())); EXPECT_EQ( 8, Distance( p, Type>(L::Partial(1, 0, 0).Slice<2>(p)).data())); EXPECT_EQ( - 0, - Distance(p, Type>(L::Partial(5, 3, 1).Slice<0>(p)).data())); + 0, Distance( + p, Type>(L::Partial(5, 3, 1).Slice<0>(p)).data())); EXPECT_EQ( 24, Distance( p, Type>(L::Partial(5, 3, 1).Slice<2>(p)).data())); EXPECT_EQ( - 8, - Distance(p, Type>(L::Partial(5, 3, 1).Slice<1>(p)).data())); - EXPECT_EQ(0, Distance(p, Type>(L(5, 3, 1).Slice<0>(p)).data())); + 8, Distance( + p, Type>(L::Partial(5, 3, 1).Slice<1>(p)).data())); + EXPECT_EQ(0, + Distance(p, Type>(L(5, 3, 1).Slice<0>(p)).data())); EXPECT_EQ(24, Distance(p, Type>(L(5, 3, 1).Slice<2>(p)).data())); - EXPECT_EQ(8, Distance(p, Type>(L(5, 3, 1).Slice<1>(p)).data())); + EXPECT_EQ(8, + Distance(p, Type>(L(5, 3, 1).Slice<1>(p)).data())); } } @@ -1080,66 +1126,84 @@ TEST(Layout, MutableSliceByTypeData) { { using L = Layout; EXPECT_EQ( - 0, - Distance(p, Type>(L::Partial(0).Slice(p)).data())); + 0, Distance( + p, Type>(L::Partial(0).Slice(p)).data())); EXPECT_EQ( - 0, - Distance(p, Type>(L::Partial(3).Slice(p)).data())); - EXPECT_EQ(0, Distance(p, Type>(L(3).Slice(p)).data())); + 0, Distance( + p, Type>(L::Partial(3).Slice(p)).data())); + EXPECT_EQ(0, + Distance(p, Type>(L(3).Slice(p)).data())); } { using L = Layout; EXPECT_EQ( - 0, Distance(p, Type>(L::Partial(0).Slice(p)).data())); - EXPECT_EQ( - 0, Distance(p, Type>(L::Partial(1).Slice(p)).data())); - EXPECT_EQ( - 0, Distance(p, Type>(L::Partial(5).Slice(p)).data())); + 0, + Distance(p, Type>(L::Partial(0).Slice(p)).data())); EXPECT_EQ( 0, - Distance(p, Type>(L::Partial(0, 0).Slice(p)).data())); - EXPECT_EQ( - 0, Distance( - p, Type>(L::Partial(0, 0).Slice(p)).data())); + Distance(p, Type>(L::Partial(1).Slice(p)).data())); EXPECT_EQ( 0, - Distance(p, Type>(L::Partial(1, 0).Slice(p)).data())); - EXPECT_EQ( - 4, Distance( - p, Type>(L::Partial(1, 0).Slice(p)).data())); + Distance(p, Type>(L::Partial(5).Slice(p)).data())); EXPECT_EQ( 0, - Distance(p, Type>(L::Partial(5, 3).Slice(p)).data())); - EXPECT_EQ( - 8, Distance( - p, Type>(L::Partial(5, 3).Slice(p)).data())); - EXPECT_EQ( - 0, Distance( - p, Type>(L::Partial(0, 0, 0).Slice(p)).data())); + Distance(p, + Type>(L::Partial(0, 0).Slice(p)).data())); EXPECT_EQ( 0, Distance( - p, Type>(L::Partial(0, 0, 0).Slice(p)).data())); + p, Type>(L::Partial(0, 0).Slice(p)).data())); + EXPECT_EQ( + 0, + Distance(p, + Type>(L::Partial(1, 0).Slice(p)).data())); + EXPECT_EQ( + 4, + Distance( + p, Type>(L::Partial(1, 0).Slice(p)).data())); + EXPECT_EQ( + 0, + Distance(p, + Type>(L::Partial(5, 3).Slice(p)).data())); + EXPECT_EQ( + 8, + Distance( + p, Type>(L::Partial(5, 3).Slice(p)).data())); + EXPECT_EQ( + 0, + Distance( + p, + Type>(L::Partial(0, 0, 0).Slice(p)).data())); + EXPECT_EQ( + 0, + Distance( + p, + Type>(L::Partial(0, 0, 0).Slice(p)).data())); EXPECT_EQ( 0, Distance( p, Type>(L::Partial(0, 0, 0).Slice(p)).data())); EXPECT_EQ( - 0, Distance( - p, Type>(L::Partial(1, 0, 0).Slice(p)).data())); + 0, + Distance( + p, + Type>(L::Partial(1, 0, 0).Slice(p)).data())); EXPECT_EQ( 4, Distance( - p, Type>(L::Partial(1, 0, 0).Slice(p)).data())); + p, + Type>(L::Partial(1, 0, 0).Slice(p)).data())); EXPECT_EQ( 8, Distance( p, Type>(L::Partial(1, 0, 0).Slice(p)).data())); EXPECT_EQ( - 0, Distance( - p, Type>(L::Partial(5, 3, 1).Slice(p)).data())); + 0, + Distance( + p, + Type>(L::Partial(5, 3, 1).Slice(p)).data())); EXPECT_EQ( 24, Distance( @@ -1148,14 +1212,16 @@ TEST(Layout, MutableSliceByTypeData) { EXPECT_EQ( 8, Distance( - p, Type>(L::Partial(5, 3, 1).Slice(p)).data())); - EXPECT_EQ(0, - Distance(p, Type>(L(5, 3, 1).Slice(p)).data())); + p, + Type>(L::Partial(5, 3, 1).Slice(p)).data())); + EXPECT_EQ( + 0, Distance(p, Type>(L(5, 3, 1).Slice(p)).data())); EXPECT_EQ( 24, Distance(p, Type>(L(5, 3, 1).Slice(p)).data())); EXPECT_EQ( - 8, Distance(p, Type>(L(5, 3, 1).Slice(p)).data())); + 8, + Distance(p, Type>(L(5, 3, 1).Slice(p)).data())); } } @@ -1254,17 +1320,17 @@ TEST(Layout, MutableSlices) { } { const auto x = L::Partial(1, 2, 3); - EXPECT_THAT( - (Type, Span, Span>>(x.Slices(p))), - Tuple(IsSameSlice(x.Slice<0>(p)), IsSameSlice(x.Slice<1>(p)), - IsSameSlice(x.Slice<2>(p)))); + EXPECT_THAT((Type, Span, Span>>( + x.Slices(p))), + Tuple(IsSameSlice(x.Slice<0>(p)), IsSameSlice(x.Slice<1>(p)), + IsSameSlice(x.Slice<2>(p)))); } { const L x(1, 2, 3); - EXPECT_THAT( - (Type, Span, Span>>(x.Slices(p))), - Tuple(IsSameSlice(x.Slice<0>(p)), IsSameSlice(x.Slice<1>(p)), - IsSameSlice(x.Slice<2>(p)))); + EXPECT_THAT((Type, Span, Span>>( + x.Slices(p))), + Tuple(IsSameSlice(x.Slice<0>(p)), IsSameSlice(x.Slice<1>(p)), + IsSameSlice(x.Slice<2>(p)))); } } @@ -1314,7 +1380,7 @@ struct Region { }; void ExpectRegionPoisoned(const unsigned char* p, size_t n, bool poisoned) { -#ifdef ADDRESS_SANITIZER +#ifdef ABSL_HAVE_ADDRESS_SANITIZER for (size_t i = 0; i != n; ++i) { EXPECT_EQ(poisoned, __asan_address_is_poisoned(p + i)); } @@ -1396,7 +1462,8 @@ TEST(Layout, DebugString) { x.DebugString()); } { - constexpr auto x = Layout::Partial(1, 2, 3); + constexpr auto x = + Layout::Partial(1, 2, 3); EXPECT_EQ( "@0(1)[1]; @4(4)[2]; @12(1)[3]; " "@16" + @@ -1404,7 +1471,8 @@ TEST(Layout, DebugString) { x.DebugString()); } { - constexpr auto x = Layout::Partial(1, 2, 3, 4); + constexpr auto x = + Layout::Partial(1, 2, 3, 4); EXPECT_EQ( "@0(1)[1]; @4(4)[2]; @12(1)[3]; " "@16" + diff --git a/third_party/abseil_cpp/absl/container/internal/raw_hash_set.cc b/third_party/abseil_cpp/absl/container/internal/raw_hash_set.cc index 919ac0740..bfef071f2 100644 --- a/third_party/abseil_cpp/absl/container/internal/raw_hash_set.cc +++ b/third_party/abseil_cpp/absl/container/internal/raw_hash_set.cc @@ -27,7 +27,7 @@ constexpr size_t Group::kWidth; // Returns "random" seed. inline size_t RandomSeed() { -#if ABSL_HAVE_THREAD_LOCAL +#ifdef ABSL_HAVE_THREAD_LOCAL static thread_local size_t counter = 0; size_t value = ++counter; #else // ABSL_HAVE_THREAD_LOCAL @@ -43,6 +43,19 @@ bool ShouldInsertBackwards(size_t hash, ctrl_t* ctrl) { return (H1(hash, ctrl) ^ RandomSeed()) % 13 > 6; } +void ConvertDeletedToEmptyAndFullToDeleted( + ctrl_t* ctrl, size_t capacity) { + assert(ctrl[capacity] == kSentinel); + assert(IsValidCapacity(capacity)); + for (ctrl_t* pos = ctrl; pos != ctrl + capacity + 1; pos += Group::kWidth) { + Group{pos}.ConvertSpecialToEmptyAndFullToDeleted(pos); + } + // Copy the cloned ctrl bytes. + std::memcpy(ctrl + capacity + 1, ctrl, Group::kWidth); + ctrl[capacity] = kSentinel; +} + + } // namespace container_internal ABSL_NAMESPACE_END } // namespace absl diff --git a/third_party/abseil_cpp/absl/container/internal/raw_hash_set.h b/third_party/abseil_cpp/absl/container/internal/raw_hash_set.h index df0f2b2b5..02158c4e0 100644 --- a/third_party/abseil_cpp/absl/container/internal/raw_hash_set.h +++ b/third_party/abseil_cpp/absl/container/internal/raw_hash_set.h @@ -122,6 +122,16 @@ namespace absl { ABSL_NAMESPACE_BEGIN namespace container_internal { +template +void SwapAlloc(AllocType& lhs, AllocType& rhs, + std::true_type /* propagate_on_container_swap */) { + using std::swap; + swap(lhs, rhs); +} +template +void SwapAlloc(AllocType& /*lhs*/, AllocType& /*rhs*/, + std::false_type /* propagate_on_container_swap */) {} + template class probe_seq { public: @@ -169,10 +179,14 @@ struct IsDecomposable< // TODO(alkis): Switch to std::is_nothrow_swappable when gcc/clang supports it. template -constexpr bool IsNoThrowSwappable() { +constexpr bool IsNoThrowSwappable(std::true_type = {} /* is_swappable */) { using std::swap; return noexcept(swap(std::declval(), std::declval())); } +template +constexpr bool IsNoThrowSwappable(std::false_type /* is_swappable */) { + return false; +} template int TrailingZeros(T x) { @@ -458,17 +472,7 @@ inline bool IsValidCapacity(size_t n) { return ((n + 1) & n) == 0 && n > 0; } // DELETED -> EMPTY // EMPTY -> EMPTY // FULL -> DELETED -inline void ConvertDeletedToEmptyAndFullToDeleted( - ctrl_t* ctrl, size_t capacity) { - assert(ctrl[capacity] == kSentinel); - assert(IsValidCapacity(capacity)); - for (ctrl_t* pos = ctrl; pos != ctrl + capacity + 1; pos += Group::kWidth) { - Group{pos}.ConvertSpecialToEmptyAndFullToDeleted(pos); - } - // Copy the cloned ctrl bytes. - std::memcpy(ctrl + capacity + 1, ctrl, Group::kWidth); - ctrl[capacity] = kSentinel; -} +void ConvertDeletedToEmptyAndFullToDeleted(ctrl_t* ctrl, size_t capacity); // Rounds up the capacity to the next power of 2 minus 1, with a minimum of 1. inline size_t NormalizeCapacity(size_t n) { @@ -497,6 +501,76 @@ inline size_t GrowthToLowerboundCapacity(size_t growth) { return growth + static_cast((static_cast(growth) - 1) / 7); } +inline void AssertIsFull(ctrl_t* ctrl) { + ABSL_HARDENING_ASSERT((ctrl != nullptr && IsFull(*ctrl)) && + "Invalid operation on iterator. The element might have " + "been erased, or the table might have rehashed."); +} + +inline void AssertIsValid(ctrl_t* ctrl) { + ABSL_HARDENING_ASSERT((ctrl == nullptr || IsFull(*ctrl)) && + "Invalid operation on iterator. The element might have " + "been erased, or the table might have rehashed."); +} + +struct FindInfo { + size_t offset; + size_t probe_length; +}; + +// The representation of the object has two modes: +// - small: For capacities < kWidth-1 +// - large: For the rest. +// +// Differences: +// - In small mode we are able to use the whole capacity. The extra control +// bytes give us at least one "empty" control byte to stop the iteration. +// This is important to make 1 a valid capacity. +// +// - In small mode only the first `capacity()` control bytes after the +// sentinel are valid. The rest contain dummy kEmpty values that do not +// represent a real slot. This is important to take into account on +// find_first_non_full(), where we never try ShouldInsertBackwards() for +// small tables. +inline bool is_small(size_t capacity) { return capacity < Group::kWidth - 1; } + +inline probe_seq probe(ctrl_t* ctrl, size_t hash, + size_t capacity) { + return probe_seq(H1(hash, ctrl), capacity); +} + +// Probes the raw_hash_set with the probe sequence for hash and returns the +// pointer to the first empty or deleted slot. +// NOTE: this function must work with tables having both kEmpty and kDelete +// in one group. Such tables appears during drop_deletes_without_resize. +// +// This function is very useful when insertions happen and: +// - the input is already a set +// - there are enough slots +// - the element with the hash is not in the table +inline FindInfo find_first_non_full(ctrl_t* ctrl, size_t hash, + size_t capacity) { + auto seq = probe(ctrl, hash, capacity); + while (true) { + Group g{ctrl + seq.offset()}; + auto mask = g.MatchEmptyOrDeleted(); + if (mask) { +#if !defined(NDEBUG) + // We want to add entropy even when ASLR is not enabled. + // In debug build we will randomly insert in either the front or back of + // the group. + // TODO(kfm,sbenza): revisit after we do unconditional mixing + if (!is_small(capacity) && ShouldInsertBackwards(hash, ctrl)) { + return {seq.offset(mask.HighestBitSet()), seq.index()}; + } +#endif + return {seq.offset(mask.LowestBitSet()), seq.index()}; + } + seq.next(); + assert(seq.index() < capacity && "full table!"); + } +} + // Policy: a policy defines how to perform different operations on // the slots of the hashtable (see hash_policy_traits.h for the full interface // of policy). @@ -511,7 +585,8 @@ inline size_t GrowthToLowerboundCapacity(size_t growth) { // if they are equal, false if they are not. If two keys compare equal, then // their hash values as defined by Hash MUST be equal. // -// Allocator: an Allocator [https://devdocs.io/cpp/concept/allocator] with which +// Allocator: an Allocator +// [https://en.cppreference.com/w/cpp/named_req/Allocator] with which // the storage of the hashtable will be allocated and the elements will be // constructed and destroyed. template @@ -617,7 +692,7 @@ class raw_hash_set { // PRECONDITION: not an end() iterator. reference operator*() const { - assert_is_full(); + AssertIsFull(ctrl_); return PolicyTraits::element(slot_); } @@ -626,7 +701,7 @@ class raw_hash_set { // PRECONDITION: not an end() iterator. iterator& operator++() { - assert_is_full(); + AssertIsFull(ctrl_); ++ctrl_; ++slot_; skip_empty_or_deleted(); @@ -640,8 +715,8 @@ class raw_hash_set { } friend bool operator==(const iterator& a, const iterator& b) { - a.assert_is_valid(); - b.assert_is_valid(); + AssertIsValid(a.ctrl_); + AssertIsValid(b.ctrl_); return a.ctrl_ == b.ctrl_; } friend bool operator!=(const iterator& a, const iterator& b) { @@ -655,13 +730,6 @@ class raw_hash_set { ABSL_INTERNAL_ASSUME(ctrl != nullptr); } - void assert_is_full() const { - ABSL_HARDENING_ASSERT(ctrl_ != nullptr && IsFull(*ctrl_)); - } - void assert_is_valid() const { - ABSL_HARDENING_ASSERT(ctrl_ == nullptr || IsFull(*ctrl_)); - } - void skip_empty_or_deleted() { while (IsEmptyOrDeleted(*ctrl_)) { uint32_t shift = Group{ctrl_}.CountLeadingEmptyOrDeleted(); @@ -730,7 +798,6 @@ class raw_hash_set { : ctrl_(EmptyGroup()), settings_(0, hash, eq, alloc) { if (bucket_count) { capacity_ = NormalizeCapacity(bucket_count); - reset_growth_left(); initialize_slots(); } } @@ -836,7 +903,7 @@ class raw_hash_set { // than a full `insert`. for (const auto& v : that) { const size_t hash = PolicyTraits::apply(HashElement{hash_ref()}, v); - auto target = find_first_non_full(hash); + auto target = find_first_non_full(ctrl_, hash, capacity_); set_ctrl(target.offset, H2(hash)); emplace_at(target.offset, v); infoz_.RecordInsert(hash, target.probe_length); @@ -1045,7 +1112,9 @@ class raw_hash_set { } iterator insert(const_iterator, node_type&& node) { - return insert(std::move(node)).first; + auto res = insert(std::move(node)); + node = std::move(res.node); + return res.position; } // This overload kicks in if we can deduce the key from args. This enables us @@ -1174,7 +1243,7 @@ class raw_hash_set { // This overload is necessary because otherwise erase(const K&) would be // a better match if non-const iterator is passed as an argument. void erase(iterator it) { - it.assert_is_full(); + AssertIsFull(it.ctrl_); PolicyTraits::destroy(&alloc_ref(), it.slot_); erase_meta_only(it); } @@ -1208,7 +1277,7 @@ class raw_hash_set { } node_type extract(const_iterator position) { - position.inner_.assert_is_full(); + AssertIsFull(position.inner_.ctrl_); auto node = CommonAccess::Transfer(alloc_ref(), position.inner_.slot_); erase_meta_only(position); @@ -1225,8 +1294,8 @@ class raw_hash_set { void swap(raw_hash_set& that) noexcept( IsNoThrowSwappable() && IsNoThrowSwappable() && - (!AllocTraits::propagate_on_container_swap::value || - IsNoThrowSwappable())) { + IsNoThrowSwappable( + typename AllocTraits::propagate_on_container_swap{})) { using std::swap; swap(ctrl_, that.ctrl_); swap(slots_, that.slots_); @@ -1236,12 +1305,8 @@ class raw_hash_set { swap(hash_ref(), that.hash_ref()); swap(eq_ref(), that.eq_ref()); swap(infoz_, that.infoz_); - if (AllocTraits::propagate_on_container_swap::value) { - swap(alloc_ref(), that.alloc_ref()); - } else { - // If the allocators do not compare equal it is officially undefined - // behavior. We choose to do nothing. - } + SwapAlloc(alloc_ref(), that.alloc_ref(), + typename AllocTraits::propagate_on_container_swap{}); } void rehash(size_t n) { @@ -1260,7 +1325,12 @@ class raw_hash_set { } } - void reserve(size_t n) { rehash(GrowthToLowerboundCapacity(n)); } + void reserve(size_t n) { + size_t m = GrowthToLowerboundCapacity(n); + if (m > capacity_) { + resize(NormalizeCapacity(m)); + } + } // Extension API: support for heterogeneous keys. // @@ -1285,7 +1355,7 @@ class raw_hash_set { void prefetch(const key_arg& key) const { (void)key; #if defined(__GNUC__) - auto seq = probe(hash_ref()(key)); + auto seq = probe(ctrl_, hash_ref()(key), capacity_); __builtin_prefetch(static_cast(ctrl_ + seq.offset())); __builtin_prefetch(static_cast(slots_ + seq.offset())); #endif // __GNUC__ @@ -1300,7 +1370,7 @@ class raw_hash_set { // called heterogeneous key support. template iterator find(const key_arg& key, size_t hash) { - auto seq = probe(hash); + auto seq = probe(ctrl_, hash, capacity_); while (true) { Group g{ctrl_ + seq.offset()}; for (int i : g.Match(H2(hash))) { @@ -1311,6 +1381,7 @@ class raw_hash_set { } if (ABSL_PREDICT_TRUE(g.MatchEmpty())) return end(); seq.next(); + assert(seq.index() < capacity_ && "full table!"); } } template @@ -1521,7 +1592,7 @@ class raw_hash_set { if (IsFull(old_ctrl[i])) { size_t hash = PolicyTraits::apply(HashElement{hash_ref()}, PolicyTraits::element(old_slots + i)); - auto target = find_first_non_full(hash); + auto target = find_first_non_full(ctrl_, hash, capacity_); size_t new_i = target.offset; total_probe_length += target.probe_length; set_ctrl(new_i, H2(hash)); @@ -1540,7 +1611,7 @@ class raw_hash_set { void drop_deletes_without_resize() ABSL_ATTRIBUTE_NOINLINE { assert(IsValidCapacity(capacity_)); - assert(!is_small()); + assert(!is_small(capacity_)); // Algorithm: // - mark all DELETED slots as EMPTY // - mark all FULL slots as DELETED @@ -1565,7 +1636,7 @@ class raw_hash_set { if (!IsDeleted(ctrl_[i])) continue; size_t hash = PolicyTraits::apply(HashElement{hash_ref()}, PolicyTraits::element(slots_ + i)); - auto target = find_first_non_full(hash); + auto target = find_first_non_full(ctrl_, hash, capacity_); size_t new_i = target.offset; total_probe_length += target.probe_length; @@ -1573,7 +1644,8 @@ class raw_hash_set { // If they do, we don't need to move the object as it falls already in the // best probe we can. const auto probe_index = [&](size_t pos) { - return ((pos - probe(hash).offset()) & capacity_) / Group::kWidth; + return ((pos - probe(ctrl_, hash, capacity_).offset()) & capacity_) / + Group::kWidth; }; // Element doesn't move. @@ -1617,7 +1689,7 @@ class raw_hash_set { bool has_element(const value_type& elem) const { size_t hash = PolicyTraits::apply(HashElement{hash_ref()}, elem); - auto seq = probe(hash); + auto seq = probe(ctrl_, hash, capacity_); while (true) { Group g{ctrl_ + seq.offset()}; for (int i : g.Match(H2(hash))) { @@ -1632,41 +1704,6 @@ class raw_hash_set { return false; } - // Probes the raw_hash_set with the probe sequence for hash and returns the - // pointer to the first empty or deleted slot. - // NOTE: this function must work with tables having both kEmpty and kDelete - // in one group. Such tables appears during drop_deletes_without_resize. - // - // This function is very useful when insertions happen and: - // - the input is already a set - // - there are enough slots - // - the element with the hash is not in the table - struct FindInfo { - size_t offset; - size_t probe_length; - }; - FindInfo find_first_non_full(size_t hash) { - auto seq = probe(hash); - while (true) { - Group g{ctrl_ + seq.offset()}; - auto mask = g.MatchEmptyOrDeleted(); - if (mask) { -#if !defined(NDEBUG) - // We want to add entropy even when ASLR is not enabled. - // In debug build we will randomly insert in either the front or back of - // the group. - // TODO(kfm,sbenza): revisit after we do unconditional mixing - if (!is_small() && ShouldInsertBackwards(hash, ctrl_)) { - return {seq.offset(mask.HighestBitSet()), seq.index()}; - } -#endif - return {seq.offset(mask.LowestBitSet()), seq.index()}; - } - assert(seq.index() < capacity_ && "full table!"); - seq.next(); - } - } - // TODO(alkis): Optimize this assuming *this and that don't overlap. raw_hash_set& move_assign(raw_hash_set&& that, std::true_type) { raw_hash_set tmp(std::move(that)); @@ -1683,7 +1720,7 @@ class raw_hash_set { template std::pair find_or_prepare_insert(const K& key) { auto hash = hash_ref()(key); - auto seq = probe(hash); + auto seq = probe(ctrl_, hash, capacity_); while (true) { Group g{ctrl_ + seq.offset()}; for (int i : g.Match(H2(hash))) { @@ -1694,16 +1731,17 @@ class raw_hash_set { } if (ABSL_PREDICT_TRUE(g.MatchEmpty())) break; seq.next(); + assert(seq.index() < capacity_ && "full table!"); } return {prepare_insert(hash), true}; } size_t prepare_insert(size_t hash) ABSL_ATTRIBUTE_NOINLINE { - auto target = find_first_non_full(hash); + auto target = find_first_non_full(ctrl_, hash, capacity_); if (ABSL_PREDICT_FALSE(growth_left() == 0 && !IsDeleted(ctrl_[target.offset]))) { rehash_and_grow_if_necessary(); - target = find_first_non_full(hash); + target = find_first_non_full(ctrl_, hash, capacity_); } ++size_; growth_left() -= IsEmpty(ctrl_[target.offset]); @@ -1736,10 +1774,6 @@ class raw_hash_set { private: friend struct RawHashSetTestOnlyAccess; - probe_seq probe(size_t hash) const { - return probe_seq(H1(hash, ctrl_), capacity_); - } - // Reset all ctrl bytes back to kEmpty, except the sentinel. void reset_ctrl() { std::memset(ctrl_, kEmpty, capacity_ + Group::kWidth); @@ -1769,22 +1803,6 @@ class raw_hash_set { size_t& growth_left() { return settings_.template get<0>(); } - // The representation of the object has two modes: - // - small: For capacities < kWidth-1 - // - large: For the rest. - // - // Differences: - // - In small mode we are able to use the whole capacity. The extra control - // bytes give us at least one "empty" control byte to stop the iteration. - // This is important to make 1 a valid capacity. - // - // - In small mode only the first `capacity()` control bytes after the - // sentinel are valid. The rest contain dummy kEmpty values that do not - // represent a real slot. This is important to take into account on - // find_first_non_full(), where we never try ShouldInsertBackwards() for - // small tables. - bool is_small() const { return capacity_ < Group::kWidth - 1; } - hasher& hash_ref() { return settings_.template get<1>(); } const hasher& hash_ref() const { return settings_.template get<1>(); } key_equal& eq_ref() { return settings_.template get<2>(); } @@ -1828,7 +1846,7 @@ struct HashtableDebugAccess> { const typename Set::key_type& key) { size_t num_probes = 0; size_t hash = set.hash_ref()(key); - auto seq = set.probe(hash); + auto seq = probe(set.ctrl_, hash, set.capacity_); while (true) { container_internal::Group g{set.ctrl_ + seq.offset()}; for (int i : g.Match(container_internal::H2(hash))) { diff --git a/third_party/abseil_cpp/absl/container/internal/raw_hash_set_allocator_test.cc b/third_party/abseil_cpp/absl/container/internal/raw_hash_set_allocator_test.cc index 7ac4b9f7d..e73f53fd6 100644 --- a/third_party/abseil_cpp/absl/container/internal/raw_hash_set_allocator_test.cc +++ b/third_party/abseil_cpp/absl/container/internal/raw_hash_set_allocator_test.cc @@ -424,6 +424,81 @@ TEST_F(PropagateOnAll, Swap) { EXPECT_EQ(0, it->num_copies()); } +// This allocator is similar to std::pmr::polymorphic_allocator. +// Note the disabled assignment. +template +class PAlloc { + template + friend class PAlloc; + + public: + // types + using value_type = T; + + // traits + using propagate_on_container_swap = std::false_type; + + PAlloc() noexcept = default; + explicit PAlloc(size_t id) noexcept : id_(id) {} + PAlloc(const PAlloc&) noexcept = default; + PAlloc& operator=(const PAlloc&) noexcept = delete; + + template + PAlloc(const PAlloc& that) noexcept : id_(that.id_) {} // NOLINT + + template + struct rebind { + using other = PAlloc; + }; + + constexpr PAlloc select_on_container_copy_construction() const { return {}; } + + // public member functions + T* allocate(size_t) { return new T; } + void deallocate(T* p, size_t) { delete p; } + + friend bool operator==(const PAlloc& a, const PAlloc& b) { + return a.id_ == b.id_; + } + friend bool operator!=(const PAlloc& a, const PAlloc& b) { return !(a == b); } + + private: + size_t id_ = std::numeric_limits::max(); +}; + +// This doesn't compile with GCC 5.4 and 5.5 due to a bug in noexcept handing. +#if !defined(__GNUC__) || __GNUC__ != 5 || (__GNUC_MINOR__ != 4 && \ + __GNUC_MINOR__ != 5) +TEST(NoPropagateOn, Swap) { + using PA = PAlloc; + using Table = raw_hash_set, PA>; + + Table t1(PA{1}), t2(PA{2}); + swap(t1, t2); + EXPECT_EQ(t1.get_allocator(), PA(1)); + EXPECT_EQ(t2.get_allocator(), PA(2)); +} +#endif + +TEST(NoPropagateOn, CopyConstruct) { + using PA = PAlloc; + using Table = raw_hash_set, PA>; + + Table t1(PA{1}), t2(t1); + EXPECT_EQ(t1.get_allocator(), PA(1)); + EXPECT_EQ(t2.get_allocator(), PA()); +} + +TEST(NoPropagateOn, Assignment) { + using PA = PAlloc; + using Table = raw_hash_set, PA>; + + Table t1(PA{1}), t2(PA{2}); + t1 = t2; + EXPECT_EQ(t1.get_allocator(), PA(1)); + EXPECT_EQ(t2.get_allocator(), PA(2)); +} + } // namespace } // namespace container_internal ABSL_NAMESPACE_END diff --git a/third_party/abseil_cpp/absl/container/internal/raw_hash_set_test.cc b/third_party/abseil_cpp/absl/container/internal/raw_hash_set_test.cc index 2fc85591c..33d2773de 100644 --- a/third_party/abseil_cpp/absl/container/internal/raw_hash_set_test.cc +++ b/third_party/abseil_cpp/absl/container/internal/raw_hash_set_test.cc @@ -26,6 +26,7 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/base/internal/cycleclock.h" #include "absl/base/internal/raw_logging.h" #include "absl/container/internal/container_memory.h" @@ -846,7 +847,8 @@ TEST(Table, EraseMaintainsValidIterator) { std::vector CollectBadMergeKeys(size_t N) { static constexpr int kGroupSize = Group::kWidth - 1; - auto topk_range = [](size_t b, size_t e, IntTable* t) -> std::vector { + auto topk_range = [](size_t b, size_t e, + IntTable* t) -> std::vector { for (size_t i = b; i != e; ++i) { t->emplace(i); } @@ -1000,8 +1002,8 @@ using ProbeStatsPerSize = std::map; // 1. Create new table and reserve it to keys.size() * 2 // 2. Insert all keys xored with seed // 3. Collect ProbeStats from final table. -ProbeStats CollectProbeStatsOnKeysXoredWithSeed(const std::vector& keys, - size_t num_iters) { +ProbeStats CollectProbeStatsOnKeysXoredWithSeed( + const std::vector& keys, size_t num_iters) { const size_t reserve_size = keys.size() * 2; ProbeStats stats; @@ -1709,6 +1711,26 @@ TEST(Nodes, ExtractInsert) { EXPECT_FALSE(node); } +TEST(Nodes, HintInsert) { + IntTable t = {1, 2, 3}; + auto node = t.extract(1); + EXPECT_THAT(t, UnorderedElementsAre(2, 3)); + auto it = t.insert(t.begin(), std::move(node)); + EXPECT_THAT(t, UnorderedElementsAre(1, 2, 3)); + EXPECT_EQ(*it, 1); + EXPECT_FALSE(node); + + node = t.extract(2); + EXPECT_THAT(t, UnorderedElementsAre(1, 3)); + // reinsert 2 to make the next insert fail. + t.insert(2); + EXPECT_THAT(t, UnorderedElementsAre(1, 2, 3)); + it = t.insert(t.begin(), std::move(node)); + EXPECT_EQ(*it, 2); + // The node was not emptied by the insert call. + EXPECT_TRUE(node); +} + IntTable MakeSimpleTable(size_t size) { IntTable t; while (t.size() < size) t.insert(t.size()); @@ -1791,11 +1813,11 @@ TEST(TableDeathTest, EraseOfEndAsserts) { IntTable t; // Extra simple "regexp" as regexp support is highly varied across platforms. - constexpr char kDeathMsg[] = "IsFull"; + constexpr char kDeathMsg[] = "Invalid operation on iterator"; EXPECT_DEATH_IF_SUPPORTED(t.erase(t.end()), kDeathMsg); } -#if defined(ABSL_HASHTABLEZ_SAMPLE) +#if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE) TEST(RawHashSamplerTest, Sample) { // Enable the feature even if the prod default is off. SetHashtablezEnabled(true); @@ -1816,7 +1838,7 @@ TEST(RawHashSamplerTest, Sample) { EXPECT_NEAR((end_size - start_size) / static_cast(tables.size()), 0.01, 0.005); } -#endif // ABSL_HASHTABLEZ_SAMPLER +#endif // ABSL_INTERNAL_HASHTABLEZ_SAMPLE TEST(RawHashSamplerTest, DoNotSampleCustomAllocators) { // Enable the feature even if the prod default is off. @@ -1839,7 +1861,7 @@ TEST(RawHashSamplerTest, DoNotSampleCustomAllocators) { 0.00, 0.001); } -#ifdef ADDRESS_SANITIZER +#ifdef ABSL_HAVE_ADDRESS_SANITIZER TEST(Sanitizer, PoisoningUnused) { IntTable t; t.reserve(5); @@ -1863,7 +1885,7 @@ TEST(Sanitizer, PoisoningOnErase) { t.erase(0); EXPECT_TRUE(__asan_address_is_poisoned(&v)); } -#endif // ADDRESS_SANITIZER +#endif // ABSL_HAVE_ADDRESS_SANITIZER } // namespace } // namespace container_internal diff --git a/third_party/abseil_cpp/absl/container/node_hash_map.h b/third_party/abseil_cpp/absl/container/node_hash_map.h index 174b971e9..7a39f6284 100644 --- a/third_party/abseil_cpp/absl/container/node_hash_map.h +++ b/third_party/abseil_cpp/absl/container/node_hash_map.h @@ -225,7 +225,8 @@ class node_hash_map // // size_type erase(const key_type& key): // - // Erases the element with the matching key, if it exists. + // Erases the element with the matching key, if it exists, returning the + // number of elements erased (0 or 1). using Base::erase; // node_hash_map::insert() @@ -374,6 +375,11 @@ class node_hash_map // key value and returns a node handle owning that extracted data. If the // `node_hash_map` does not contain an element with a matching key, this // function returns an empty node handle. + // + // NOTE: when compiled in an earlier version of C++ than C++17, + // `node_type::key()` returns a const reference to the key instead of a + // mutable reference. We cannot safely return a mutable reference without + // std::launder (which is not available before C++17). using Base::extract; // node_hash_map::merge() diff --git a/third_party/abseil_cpp/absl/container/node_hash_map_test.cc b/third_party/abseil_cpp/absl/container/node_hash_map_test.cc index 5d74b814b..8f59a1e4a 100644 --- a/third_party/abseil_cpp/absl/container/node_hash_map_test.cc +++ b/third_party/abseil_cpp/absl/container/node_hash_map_test.cc @@ -254,6 +254,21 @@ TEST(NodeHashMap, EraseIf) { } } +// This test requires std::launder for mutable key access in node handles. +#if defined(__cpp_lib_launder) && __cpp_lib_launder >= 201606 +TEST(NodeHashMap, NodeHandleMutableKeyAccess) { + node_hash_map map; + + map["key1"] = "mapped"; + + auto nh = map.extract(map.begin()); + nh.key().resize(3); + map.insert(std::move(nh)); + + EXPECT_THAT(map, testing::ElementsAre(Pair("key", "mapped"))); +} +#endif + } // namespace } // namespace container_internal ABSL_NAMESPACE_END diff --git a/third_party/abseil_cpp/absl/container/node_hash_set.h b/third_party/abseil_cpp/absl/container/node_hash_set.h index 56bab5c2c..56ce3b66c 100644 --- a/third_party/abseil_cpp/absl/container/node_hash_set.h +++ b/third_party/abseil_cpp/absl/container/node_hash_set.h @@ -217,7 +217,8 @@ class node_hash_set // // size_type erase(const key_type& key): // - // Erases the element with the matching key, if it exists. + // Erases the element with the matching key, if it exists, returning the + // number of elements erased (0 or 1). using Base::erase; // node_hash_set::insert() diff --git a/third_party/abseil_cpp/absl/copts/GENERATED_AbseilCopts.cmake b/third_party/abseil_cpp/absl/copts/GENERATED_AbseilCopts.cmake index 7ef6339be..51742c9b6 100644 --- a/third_party/abseil_cpp/absl/copts/GENERATED_AbseilCopts.cmake +++ b/third_party/abseil_cpp/absl/copts/GENERATED_AbseilCopts.cmake @@ -5,47 +5,6 @@ list(APPEND ABSL_CLANG_CL_FLAGS "/W3" - "-Wno-c++98-compat-pedantic" - "-Wno-conversion" - "-Wno-covered-switch-default" - "-Wno-deprecated" - "-Wno-disabled-macro-expansion" - "-Wno-double-promotion" - "-Wno-comma" - "-Wno-extra-semi" - "-Wno-extra-semi-stmt" - "-Wno-packed" - "-Wno-padded" - "-Wno-sign-compare" - "-Wno-float-conversion" - "-Wno-float-equal" - "-Wno-format-nonliteral" - "-Wno-gcc-compat" - "-Wno-global-constructors" - "-Wno-exit-time-destructors" - "-Wno-non-modular-include-in-module" - "-Wno-old-style-cast" - "-Wno-range-loop-analysis" - "-Wno-reserved-id-macro" - "-Wno-shorten-64-to-32" - "-Wno-switch-enum" - "-Wno-thread-safety-negative" - "-Wno-unknown-warning-option" - "-Wno-unreachable-code" - "-Wno-unused-macros" - "-Wno-weak-vtables" - "-Wno-zero-as-null-pointer-constant" - "-Wbitfield-enum-conversion" - "-Wbool-conversion" - "-Wconstant-conversion" - "-Wenum-conversion" - "-Wint-conversion" - "-Wliteral-conversion" - "-Wnon-literal-null-conversion" - "-Wnull-conversion" - "-Wobjc-literal-conversion" - "-Wno-sign-conversion" - "-Wstring-conversion" "/DNOMINMAX" "/DWIN32_LEAN_AND_MEAN" "/D_CRT_SECURE_NO_WARNINGS" @@ -78,16 +37,17 @@ list(APPEND ABSL_GCC_FLAGS "-Wextra" "-Wcast-qual" "-Wconversion-null" + "-Wformat-security" "-Wmissing-declarations" "-Woverlength-strings" "-Wpointer-arith" + "-Wundef" "-Wunused-local-typedefs" "-Wunused-result" "-Wvarargs" "-Wvla" "-Wwrite-strings" - "-Wno-missing-field-initializers" - "-Wno-sign-compare" + "-DNOMINMAX" ) list(APPEND ABSL_GCC_TEST_FLAGS @@ -103,48 +63,37 @@ list(APPEND ABSL_GCC_TEST_FLAGS list(APPEND ABSL_LLVM_FLAGS "-Wall" "-Wextra" - "-Weverything" - "-Wno-c++98-compat-pedantic" - "-Wno-conversion" - "-Wno-covered-switch-default" - "-Wno-deprecated" - "-Wno-disabled-macro-expansion" - "-Wno-double-promotion" - "-Wno-comma" - "-Wno-extra-semi" - "-Wno-extra-semi-stmt" - "-Wno-packed" - "-Wno-padded" - "-Wno-sign-compare" - "-Wno-float-conversion" - "-Wno-float-equal" - "-Wno-format-nonliteral" - "-Wno-gcc-compat" - "-Wno-global-constructors" - "-Wno-exit-time-destructors" - "-Wno-non-modular-include-in-module" - "-Wno-old-style-cast" - "-Wno-range-loop-analysis" - "-Wno-reserved-id-macro" - "-Wno-shorten-64-to-32" - "-Wno-switch-enum" - "-Wno-thread-safety-negative" - "-Wno-unknown-warning-option" - "-Wno-unreachable-code" - "-Wno-unused-macros" - "-Wno-weak-vtables" - "-Wno-zero-as-null-pointer-constant" - "-Wbitfield-enum-conversion" - "-Wbool-conversion" - "-Wconstant-conversion" - "-Wenum-conversion" - "-Wint-conversion" + "-Wcast-qual" + "-Wconversion" + "-Wfloat-overflow-conversion" + "-Wfloat-zero-conversion" + "-Wfor-loop-analysis" + "-Wformat-security" + "-Wgnu-redeclared-enum" + "-Winfinite-recursion" "-Wliteral-conversion" - "-Wnon-literal-null-conversion" - "-Wnull-conversion" - "-Wobjc-literal-conversion" - "-Wno-sign-conversion" + "-Wmissing-declarations" + "-Woverlength-strings" + "-Wpointer-arith" + "-Wself-assign" + "-Wshadow" "-Wstring-conversion" + "-Wtautological-overlap-compare" + "-Wundef" + "-Wuninitialized" + "-Wunreachable-code" + "-Wunused-comparison" + "-Wunused-local-typedefs" + "-Wunused-result" + "-Wvla" + "-Wwrite-strings" + "-Wno-float-conversion" + "-Wno-implicit-float-conversion" + "-Wno-implicit-int-float-conversion" + "-Wno-implicit-int-conversion" + "-Wno-shorten-64-to-32" + "-Wno-sign-conversion" + "-DNOMINMAX" ) list(APPEND ABSL_LLVM_TEST_FLAGS diff --git a/third_party/abseil_cpp/absl/copts/GENERATED_copts.bzl b/third_party/abseil_cpp/absl/copts/GENERATED_copts.bzl index 3cc487845..6707488f2 100644 --- a/third_party/abseil_cpp/absl/copts/GENERATED_copts.bzl +++ b/third_party/abseil_cpp/absl/copts/GENERATED_copts.bzl @@ -6,47 +6,6 @@ ABSL_CLANG_CL_FLAGS = [ "/W3", - "-Wno-c++98-compat-pedantic", - "-Wno-conversion", - "-Wno-covered-switch-default", - "-Wno-deprecated", - "-Wno-disabled-macro-expansion", - "-Wno-double-promotion", - "-Wno-comma", - "-Wno-extra-semi", - "-Wno-extra-semi-stmt", - "-Wno-packed", - "-Wno-padded", - "-Wno-sign-compare", - "-Wno-float-conversion", - "-Wno-float-equal", - "-Wno-format-nonliteral", - "-Wno-gcc-compat", - "-Wno-global-constructors", - "-Wno-exit-time-destructors", - "-Wno-non-modular-include-in-module", - "-Wno-old-style-cast", - "-Wno-range-loop-analysis", - "-Wno-reserved-id-macro", - "-Wno-shorten-64-to-32", - "-Wno-switch-enum", - "-Wno-thread-safety-negative", - "-Wno-unknown-warning-option", - "-Wno-unreachable-code", - "-Wno-unused-macros", - "-Wno-weak-vtables", - "-Wno-zero-as-null-pointer-constant", - "-Wbitfield-enum-conversion", - "-Wbool-conversion", - "-Wconstant-conversion", - "-Wenum-conversion", - "-Wint-conversion", - "-Wliteral-conversion", - "-Wnon-literal-null-conversion", - "-Wnull-conversion", - "-Wobjc-literal-conversion", - "-Wno-sign-conversion", - "-Wstring-conversion", "/DNOMINMAX", "/DWIN32_LEAN_AND_MEAN", "/D_CRT_SECURE_NO_WARNINGS", @@ -79,16 +38,17 @@ ABSL_GCC_FLAGS = [ "-Wextra", "-Wcast-qual", "-Wconversion-null", + "-Wformat-security", "-Wmissing-declarations", "-Woverlength-strings", "-Wpointer-arith", + "-Wundef", "-Wunused-local-typedefs", "-Wunused-result", "-Wvarargs", "-Wvla", "-Wwrite-strings", - "-Wno-missing-field-initializers", - "-Wno-sign-compare", + "-DNOMINMAX", ] ABSL_GCC_TEST_FLAGS = [ @@ -104,48 +64,37 @@ ABSL_GCC_TEST_FLAGS = [ ABSL_LLVM_FLAGS = [ "-Wall", "-Wextra", - "-Weverything", - "-Wno-c++98-compat-pedantic", - "-Wno-conversion", - "-Wno-covered-switch-default", - "-Wno-deprecated", - "-Wno-disabled-macro-expansion", - "-Wno-double-promotion", - "-Wno-comma", - "-Wno-extra-semi", - "-Wno-extra-semi-stmt", - "-Wno-packed", - "-Wno-padded", - "-Wno-sign-compare", - "-Wno-float-conversion", - "-Wno-float-equal", - "-Wno-format-nonliteral", - "-Wno-gcc-compat", - "-Wno-global-constructors", - "-Wno-exit-time-destructors", - "-Wno-non-modular-include-in-module", - "-Wno-old-style-cast", - "-Wno-range-loop-analysis", - "-Wno-reserved-id-macro", - "-Wno-shorten-64-to-32", - "-Wno-switch-enum", - "-Wno-thread-safety-negative", - "-Wno-unknown-warning-option", - "-Wno-unreachable-code", - "-Wno-unused-macros", - "-Wno-weak-vtables", - "-Wno-zero-as-null-pointer-constant", - "-Wbitfield-enum-conversion", - "-Wbool-conversion", - "-Wconstant-conversion", - "-Wenum-conversion", - "-Wint-conversion", + "-Wcast-qual", + "-Wconversion", + "-Wfloat-overflow-conversion", + "-Wfloat-zero-conversion", + "-Wfor-loop-analysis", + "-Wformat-security", + "-Wgnu-redeclared-enum", + "-Winfinite-recursion", "-Wliteral-conversion", - "-Wnon-literal-null-conversion", - "-Wnull-conversion", - "-Wobjc-literal-conversion", - "-Wno-sign-conversion", + "-Wmissing-declarations", + "-Woverlength-strings", + "-Wpointer-arith", + "-Wself-assign", + "-Wshadow", "-Wstring-conversion", + "-Wtautological-overlap-compare", + "-Wundef", + "-Wuninitialized", + "-Wunreachable-code", + "-Wunused-comparison", + "-Wunused-local-typedefs", + "-Wunused-result", + "-Wvla", + "-Wwrite-strings", + "-Wno-float-conversion", + "-Wno-implicit-float-conversion", + "-Wno-implicit-int-float-conversion", + "-Wno-implicit-int-conversion", + "-Wno-shorten-64-to-32", + "-Wno-sign-conversion", + "-DNOMINMAX", ] ABSL_LLVM_TEST_FLAGS = [ diff --git a/third_party/abseil_cpp/absl/copts/configure_copts.bzl b/third_party/abseil_cpp/absl/copts/configure_copts.bzl index ff9a5ea9f..4d3425444 100644 --- a/third_party/abseil_cpp/absl/copts/configure_copts.bzl +++ b/third_party/abseil_cpp/absl/copts/configure_copts.bzl @@ -23,15 +23,13 @@ load( ABSL_DEFAULT_COPTS = select({ "//absl:windows": ABSL_MSVC_FLAGS, - "//absl:llvm_compiler": ABSL_LLVM_FLAGS, + "//absl:clang_compiler": ABSL_LLVM_FLAGS, "//conditions:default": ABSL_GCC_FLAGS, }) -# in absence of modules (--compiler=gcc or -c opt), cc_tests leak their copts -# to their (included header) dependencies and fail to build outside absl ABSL_TEST_COPTS = ABSL_DEFAULT_COPTS + select({ "//absl:windows": ABSL_MSVC_TEST_FLAGS, - "//absl:llvm_compiler": ABSL_LLVM_TEST_FLAGS, + "//absl:clang_compiler": ABSL_LLVM_TEST_FLAGS, "//conditions:default": ABSL_GCC_TEST_FLAGS, }) diff --git a/third_party/abseil_cpp/absl/copts/copts.py b/third_party/abseil_cpp/absl/copts/copts.py index 704ef2345..cf52981c5 100644 --- a/third_party/abseil_cpp/absl/copts/copts.py +++ b/third_party/abseil_cpp/absl/copts/copts.py @@ -16,77 +16,6 @@ MSVC_BIG_WARNING_FLAGS = [ "/W3", ] -LLVM_BIG_WARNING_FLAGS = [ - "-Wall", - "-Wextra", - "-Weverything", -] - -# Docs on single flags is preceded by a comment. -# Docs on groups of flags is preceded by ###. -LLVM_DISABLE_WARNINGS_FLAGS = [ - # Abseil does not support C++98 - "-Wno-c++98-compat-pedantic", - # Turns off all implicit conversion warnings. Most are re-enabled below. - "-Wno-conversion", - "-Wno-covered-switch-default", - "-Wno-deprecated", - "-Wno-disabled-macro-expansion", - "-Wno-double-promotion", - ### - # Turned off as they include valid C++ code. - "-Wno-comma", - "-Wno-extra-semi", - "-Wno-extra-semi-stmt", - "-Wno-packed", - "-Wno-padded", - ### - # Google style does not use unsigned integers, though STL containers - # have unsigned types. - "-Wno-sign-compare", - ### - "-Wno-float-conversion", - "-Wno-float-equal", - "-Wno-format-nonliteral", - # Too aggressive: warns on Clang extensions enclosed in Clang-only - # compilation paths. - "-Wno-gcc-compat", - ### - # Some internal globals are necessary. Don't do this at home. - "-Wno-global-constructors", - "-Wno-exit-time-destructors", - ### - "-Wno-non-modular-include-in-module", - "-Wno-old-style-cast", - # Warns on preferred usage of non-POD types such as string_view - "-Wno-range-loop-analysis", - "-Wno-reserved-id-macro", - "-Wno-shorten-64-to-32", - "-Wno-switch-enum", - "-Wno-thread-safety-negative", - "-Wno-unknown-warning-option", - "-Wno-unreachable-code", - # Causes warnings on include guards - "-Wno-unused-macros", - "-Wno-weak-vtables", - # Causes warnings on usage of types/compare.h comparison operators. - "-Wno-zero-as-null-pointer-constant", - ### - # Implicit conversion warnings turned off by -Wno-conversion - # which are re-enabled below. - "-Wbitfield-enum-conversion", - "-Wbool-conversion", - "-Wconstant-conversion", - "-Wenum-conversion", - "-Wint-conversion", - "-Wliteral-conversion", - "-Wnon-literal-null-conversion", - "-Wnull-conversion", - "-Wobjc-literal-conversion", - "-Wno-sign-conversion", - "-Wstring-conversion", -] - LLVM_TEST_DISABLE_WARNINGS_FLAGS = [ "-Wno-c99-extensions", "-Wno-deprecated-declarations", @@ -125,21 +54,18 @@ COPT_VARS = { "-Wextra", "-Wcast-qual", "-Wconversion-null", + "-Wformat-security", "-Wmissing-declarations", "-Woverlength-strings", "-Wpointer-arith", + "-Wundef", "-Wunused-local-typedefs", "-Wunused-result", "-Wvarargs", "-Wvla", # variable-length array "-Wwrite-strings", - # gcc-4.x has spurious missing field initializer warnings. - # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=36750 - # Remove when gcc-4.x is no longer supported. - "-Wno-missing-field-initializers", - # Google style does not use unsigned integers, though STL containers - # have unsigned types. - "-Wno-sign-compare", + # Don't define min and max macros (Build on Windows using gcc) + "-DNOMINMAX", ], "ABSL_GCC_TEST_FLAGS": [ "-Wno-conversion-null", @@ -150,12 +76,48 @@ COPT_VARS = { "-Wno-unused-parameter", "-Wno-unused-private-field", ], - "ABSL_LLVM_FLAGS": - LLVM_BIG_WARNING_FLAGS + LLVM_DISABLE_WARNINGS_FLAGS, + "ABSL_LLVM_FLAGS": [ + "-Wall", + "-Wextra", + "-Wcast-qual", + "-Wconversion", + "-Wfloat-overflow-conversion", + "-Wfloat-zero-conversion", + "-Wfor-loop-analysis", + "-Wformat-security", + "-Wgnu-redeclared-enum", + "-Winfinite-recursion", + "-Wliteral-conversion", + "-Wmissing-declarations", + "-Woverlength-strings", + "-Wpointer-arith", + "-Wself-assign", + "-Wshadow", + "-Wstring-conversion", + "-Wtautological-overlap-compare", + "-Wundef", + "-Wuninitialized", + "-Wunreachable-code", + "-Wunused-comparison", + "-Wunused-local-typedefs", + "-Wunused-result", + "-Wvla", + "-Wwrite-strings", + # Warnings that are enabled by group warning flags like -Wall that we + # explicitly disable. + "-Wno-float-conversion", + "-Wno-implicit-float-conversion", + "-Wno-implicit-int-float-conversion", + "-Wno-implicit-int-conversion", + "-Wno-shorten-64-to-32", + "-Wno-sign-conversion", + # Don't define min and max macros (Build on Windows using clang) + "-DNOMINMAX", + ], "ABSL_LLVM_TEST_FLAGS": LLVM_TEST_DISABLE_WARNINGS_FLAGS, "ABSL_CLANG_CL_FLAGS": - (MSVC_BIG_WARNING_FLAGS + LLVM_DISABLE_WARNINGS_FLAGS + MSVC_DEFINES), + (MSVC_BIG_WARNING_FLAGS + MSVC_DEFINES), "ABSL_CLANG_CL_TEST_FLAGS": LLVM_TEST_DISABLE_WARNINGS_FLAGS, "ABSL_MSVC_FLAGS": diff --git a/third_party/abseil_cpp/absl/debugging/BUILD.bazel b/third_party/abseil_cpp/absl/debugging/BUILD.bazel index d33624677..cd6e45439 100644 --- a/third_party/abseil_cpp/absl/debugging/BUILD.bazel +++ b/third_party/abseil_cpp/absl/debugging/BUILD.bazel @@ -26,7 +26,7 @@ package( default_visibility = ["//visibility:public"], ) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) cc_library( name = "stacktrace", @@ -97,6 +97,7 @@ cc_test( ":stack_consumption", ":symbolize", "//absl/base", + "//absl/base:config", "//absl/base:core_headers", "//absl/base:raw_logging_internal", "//absl/memory", @@ -148,6 +149,7 @@ cc_test( copts = ABSL_TEST_COPTS, linkopts = select({ "//absl:windows": [], + "//absl:wasm": [], "//conditions:default": ["-pthread"], }) + ABSL_DEFAULT_LINKOPTS, deps = [ @@ -203,6 +205,7 @@ cc_test( deps = [ ":demangle_internal", ":stack_consumption", + "//absl/base:config", "//absl/base:core_headers", "//absl/base:raw_logging_internal", "//absl/memory", @@ -236,7 +239,7 @@ cc_library( # These targets exists for use in tests only, explicitly configuring the # LEAK_SANITIZER macro. It must be linked with -fsanitize=leak for lsan. ABSL_LSAN_LINKOPTS = select({ - "//absl:llvm_compiler": ["-fsanitize=leak"], + "//absl:clang_compiler": ["-fsanitize=leak"], "//conditions:default": [], }) @@ -246,7 +249,7 @@ cc_library( srcs = ["leak_check.cc"], hdrs = ["leak_check.h"], copts = select({ - "//absl:llvm_compiler": ["-DLEAK_SANITIZER"], + "//absl:clang_compiler": ["-DLEAK_SANITIZER"], "//conditions:default": [], }), linkopts = ABSL_DEFAULT_LINKOPTS, @@ -273,7 +276,7 @@ cc_test( name = "leak_check_test", srcs = ["leak_check_test.cc"], copts = select({ - "//absl:llvm_compiler": ["-DABSL_EXPECT_LEAK_SANITIZER"], + "//absl:clang_compiler": ["-DABSL_EXPECT_LEAK_SANITIZER"], "//conditions:default": [], }), linkopts = ABSL_LSAN_LINKOPTS + ABSL_DEFAULT_LINKOPTS, diff --git a/third_party/abseil_cpp/absl/debugging/CMakeLists.txt b/third_party/abseil_cpp/absl/debugging/CMakeLists.txt index c597df86b..074b44cf1 100644 --- a/third_party/abseil_cpp/absl/debugging/CMakeLists.txt +++ b/third_party/abseil_cpp/absl/debugging/CMakeLists.txt @@ -82,6 +82,7 @@ absl_cc_test( absl::stack_consumption absl::symbolize absl::base + absl::config absl::core_headers absl::memory absl::raw_logging_internal @@ -189,6 +190,7 @@ absl_cc_test( DEPS absl::demangle_internal absl::stack_consumption + absl::config absl::core_headers absl::memory absl::raw_logging_internal diff --git a/third_party/abseil_cpp/absl/debugging/failure_signal_handler.cc b/third_party/abseil_cpp/absl/debugging/failure_signal_handler.cc index 1f69bfa84..5d13bdbbb 100644 --- a/third_party/abseil_cpp/absl/debugging/failure_signal_handler.cc +++ b/third_party/abseil_cpp/absl/debugging/failure_signal_handler.cc @@ -136,8 +136,8 @@ static bool SetupAlternateStackOnce() { const size_t page_mask = sysconf(_SC_PAGESIZE) - 1; #endif size_t stack_size = (std::max(SIGSTKSZ, 65536) + page_mask) & ~page_mask; -#if defined(ADDRESS_SANITIZER) || defined(MEMORY_SANITIZER) || \ - defined(THREAD_SANITIZER) +#if defined(ABSL_HAVE_ADDRESS_SANITIZER) || \ + defined(ABSL_HAVE_MEMORY_SANITIZER) || defined(ABSL_HAVE_THREAD_SANITIZER) // Account for sanitizer instrumentation requiring additional stack space. stack_size *= 5; #endif diff --git a/third_party/abseil_cpp/absl/debugging/internal/address_is_readable.cc b/third_party/abseil_cpp/absl/debugging/internal/address_is_readable.cc index 653760636..329c285f3 100644 --- a/third_party/abseil_cpp/absl/debugging/internal/address_is_readable.cc +++ b/third_party/abseil_cpp/absl/debugging/internal/address_is_readable.cc @@ -68,6 +68,7 @@ static void Unpack(uint64_t x, int *pid, int *read_fd, int *write_fd) { // unimplemented. // This is a namespace-scoped variable for correct zero-initialization. static std::atomic pid_and_fds; // initially 0, an invalid pid. + bool AddressIsReadable(const void *addr) { absl::base_internal::ErrnoSaver errno_saver; // We test whether a byte is readable by using write(). Normally, this would @@ -86,7 +87,7 @@ bool AddressIsReadable(const void *addr) { int pid; int read_fd; int write_fd; - uint64_t local_pid_and_fds = pid_and_fds.load(std::memory_order_relaxed); + uint64_t local_pid_and_fds = pid_and_fds.load(std::memory_order_acquire); Unpack(local_pid_and_fds, &pid, &read_fd, &write_fd); while (current_pid != pid) { int p[2]; @@ -98,13 +99,13 @@ bool AddressIsReadable(const void *addr) { fcntl(p[1], F_SETFD, FD_CLOEXEC); uint64_t new_pid_and_fds = Pack(current_pid, p[0], p[1]); if (pid_and_fds.compare_exchange_strong( - local_pid_and_fds, new_pid_and_fds, std::memory_order_relaxed, + local_pid_and_fds, new_pid_and_fds, std::memory_order_release, std::memory_order_relaxed)) { local_pid_and_fds = new_pid_and_fds; // fds exposed to other threads } else { // fds not exposed to other threads; we can close them. close(p[0]); close(p[1]); - local_pid_and_fds = pid_and_fds.load(std::memory_order_relaxed); + local_pid_and_fds = pid_and_fds.load(std::memory_order_acquire); } Unpack(local_pid_and_fds, &pid, &read_fd, &write_fd); } @@ -124,7 +125,7 @@ bool AddressIsReadable(const void *addr) { // If pid_and_fds contains the problematic file descriptors we just used, // this call will forget them, and the loop will try again. pid_and_fds.compare_exchange_strong(local_pid_and_fds, 0, - std::memory_order_relaxed, + std::memory_order_release, std::memory_order_relaxed); } } while (errno == EBADF); diff --git a/third_party/abseil_cpp/absl/debugging/internal/demangle.cc b/third_party/abseil_cpp/absl/debugging/internal/demangle.cc index fc262e50a..46cdb67b1 100644 --- a/third_party/abseil_cpp/absl/debugging/internal/demangle.cc +++ b/third_party/abseil_cpp/absl/debugging/internal/demangle.cc @@ -126,6 +126,7 @@ static const AbbrevPair kBuiltinTypeList[] = { {"Dn", "std::nullptr_t", 0}, // i.e., decltype(nullptr) {"Df", "decimal32", 0}, // IEEE 754r decimal floating point (32 bits) {"Di", "char32_t", 0}, + {"Du", "char8_t", 0}, {"Ds", "char16_t", 0}, {"Dh", "float16", 0}, // IEEE 754r half-precision float (16 bits) {nullptr, nullptr, 0}, @@ -409,6 +410,7 @@ static bool IsFunctionCloneSuffix(const char *str) { static bool EndsWith(State *state, const char chr) { return state->parse_state.out_cur_idx > 0 && + state->parse_state.out_cur_idx < state->out_end_idx && chr == state->out[state->parse_state.out_cur_idx - 1]; } @@ -421,8 +423,10 @@ static void MaybeAppendWithLength(State *state, const char *const str, if (str[0] == '<' && EndsWith(state, '<')) { Append(state, " ", 1); } - // Remember the last identifier name for ctors/dtors. - if (IsAlpha(str[0]) || str[0] == '_') { + // Remember the last identifier name for ctors/dtors, + // but only if we haven't yet overflown the buffer. + if (state->parse_state.out_cur_idx < state->out_end_idx && + (IsAlpha(str[0]) || str[0] == '_')) { state->parse_state.prev_name_idx = state->parse_state.out_cur_idx; state->parse_state.prev_name_length = length; } @@ -962,6 +966,7 @@ static bool ParseOperatorName(State *state, int *arity) { // ::= TT // ::= TI // ::= TS +// ::= TH # thread-local // ::= Tc <(base) encoding> // ::= GV <(object) name> // ::= T <(base) encoding> @@ -980,7 +985,7 @@ static bool ParseSpecialName(State *state) { ComplexityGuard guard(state); if (guard.IsTooComplex()) return false; ParseState copy = state->parse_state; - if (ParseOneCharToken(state, 'T') && ParseCharClass(state, "VTIS") && + if (ParseOneCharToken(state, 'T') && ParseCharClass(state, "VTISH") && ParseType(state)) { return true; } @@ -1077,20 +1082,28 @@ static bool ParseVOffset(State *state) { return false; } -// ::= C1 | C2 | C3 +// ::= C1 | C2 | C3 | CI1 | CI2 +// // ::= D0 | D1 | D2 // # GCC extensions: "unified" constructor/destructor. See -// # https://github.com/gcc-mirror/gcc/blob/7ad17b583c3643bd4557f29b8391ca7ef08391f5/gcc/cp/mangle.c#L1847 +// # +// https://github.com/gcc-mirror/gcc/blob/7ad17b583c3643bd4557f29b8391ca7ef08391f5/gcc/cp/mangle.c#L1847 // ::= C4 | D4 static bool ParseCtorDtorName(State *state) { ComplexityGuard guard(state); if (guard.IsTooComplex()) return false; ParseState copy = state->parse_state; - if (ParseOneCharToken(state, 'C') && ParseCharClass(state, "1234")) { - const char *const prev_name = state->out + state->parse_state.prev_name_idx; - MaybeAppendWithLength(state, prev_name, - state->parse_state.prev_name_length); - return true; + if (ParseOneCharToken(state, 'C')) { + if (ParseCharClass(state, "1234")) { + const char *const prev_name = + state->out + state->parse_state.prev_name_idx; + MaybeAppendWithLength(state, prev_name, + state->parse_state.prev_name_length); + return true; + } else if (ParseOneCharToken(state, 'I') && ParseCharClass(state, "12") && + ParseClassEnumType(state)) { + return true; + } } state->parse_state = copy; @@ -1139,6 +1152,7 @@ static bool ParseDecltype(State *state) { // ::= // ::= // ::= Dp # pack expansion of (C++0x) +// ::= Dv _ # GNU vector extension // static bool ParseType(State *state) { ComplexityGuard guard(state); @@ -1205,6 +1219,12 @@ static bool ParseType(State *state) { return true; } + if (ParseTwoCharToken(state, "Dv") && ParseNumber(state, nullptr) && + ParseOneCharToken(state, '_')) { + return true; + } + state->parse_state = copy; + return false; } @@ -1253,13 +1273,42 @@ static bool ParseBuiltinType(State *state) { return false; } -// ::= F [Y] E +// ::= Do # non-throwing +// exception-specification (e.g., +// noexcept, throw()) +// ::= DO E # computed (instantiation-dependent) +// noexcept +// ::= Dw + E # dynamic exception specification +// with instantiation-dependent types +static bool ParseExceptionSpec(State *state) { + ComplexityGuard guard(state); + if (guard.IsTooComplex()) return false; + + if (ParseTwoCharToken(state, "Do")) return true; + + ParseState copy = state->parse_state; + if (ParseTwoCharToken(state, "DO") && ParseExpression(state) && + ParseOneCharToken(state, 'E')) { + return true; + } + state->parse_state = copy; + if (ParseTwoCharToken(state, "Dw") && OneOrMore(ParseType, state) && + ParseOneCharToken(state, 'E')) { + return true; + } + state->parse_state = copy; + + return false; +} + +// ::= [exception-spec] F [Y] [O] E static bool ParseFunctionType(State *state) { ComplexityGuard guard(state); if (guard.IsTooComplex()) return false; ParseState copy = state->parse_state; - if (ParseOneCharToken(state, 'F') && + if (Optional(ParseExceptionSpec(state)) && ParseOneCharToken(state, 'F') && Optional(ParseOneCharToken(state, 'Y')) && ParseBareFunctionType(state) && + Optional(ParseOneCharToken(state, 'O')) && ParseOneCharToken(state, 'E')) { return true; } @@ -1887,7 +1936,8 @@ static bool Overflowed(const State *state) { bool Demangle(const char *mangled, char *out, int out_size) { State state; InitState(&state, mangled, out, out_size); - return ParseTopLevelMangledName(&state) && !Overflowed(&state); + return ParseTopLevelMangledName(&state) && !Overflowed(&state) && + state.parse_state.out_cur_idx > 0; } } // namespace debugging_internal diff --git a/third_party/abseil_cpp/absl/debugging/internal/demangle_test.cc b/third_party/abseil_cpp/absl/debugging/internal/demangle_test.cc index c6f1ce184..0bed7359d 100644 --- a/third_party/abseil_cpp/absl/debugging/internal/demangle_test.cc +++ b/third_party/abseil_cpp/absl/debugging/internal/demangle_test.cc @@ -18,6 +18,7 @@ #include #include "gtest/gtest.h" +#include "absl/base/config.h" #include "absl/base/internal/raw_logging.h" #include "absl/debugging/internal/stack_consumption.h" #include "absl/memory/memory.h" @@ -82,9 +83,10 @@ TEST(Demangle, Clones) { // Tests that verify that Demangle footprint is within some limit. // They are not to be run under sanitizers as the sanitizers increase // stack consumption by about 4x. -#if defined(ABSL_INTERNAL_HAVE_DEBUGGING_STACK_CONSUMPTION) && \ - !defined(ADDRESS_SANITIZER) && !defined(MEMORY_SANITIZER) && \ - !defined(THREAD_SANITIZER) +#if defined(ABSL_INTERNAL_HAVE_DEBUGGING_STACK_CONSUMPTION) && \ + !defined(ABSL_HAVE_ADDRESS_SANITIZER) && \ + !defined(ABSL_HAVE_MEMORY_SANITIZER) && \ + !defined(ABSL_HAVE_THREAD_SANITIZER) static const char *g_mangled; static char g_demangle_buffer[4096]; diff --git a/third_party/abseil_cpp/absl/debugging/internal/stack_consumption.cc b/third_party/abseil_cpp/absl/debugging/internal/stack_consumption.cc index 875ca6d91..e3dd51c35 100644 --- a/third_party/abseil_cpp/absl/debugging/internal/stack_consumption.cc +++ b/third_party/abseil_cpp/absl/debugging/internal/stack_consumption.cc @@ -42,7 +42,8 @@ namespace { // one of them is null, the results of pq, p<=q, and p>=q are // unspecified. Therefore, instead we hardcode the direction of the // stack on platforms we know about. -#if defined(__i386__) || defined(__x86_64__) || defined(__ppc__) +#if defined(__i386__) || defined(__x86_64__) || defined(__ppc__) || \ + defined(__aarch64__) constexpr bool kStackGrowsDown = true; #else #error Need to define kStackGrowsDown diff --git a/third_party/abseil_cpp/absl/debugging/internal/stack_consumption.h b/third_party/abseil_cpp/absl/debugging/internal/stack_consumption.h index 5e60ec422..2b5e71516 100644 --- a/third_party/abseil_cpp/absl/debugging/internal/stack_consumption.h +++ b/third_party/abseil_cpp/absl/debugging/internal/stack_consumption.h @@ -24,8 +24,9 @@ // Use this feature test macro to detect its availability. #ifdef ABSL_INTERNAL_HAVE_DEBUGGING_STACK_CONSUMPTION #error ABSL_INTERNAL_HAVE_DEBUGGING_STACK_CONSUMPTION cannot be set directly -#elif !defined(__APPLE__) && !defined(_WIN32) && \ - (defined(__i386__) || defined(__x86_64__) || defined(__ppc__)) +#elif !defined(__APPLE__) && !defined(_WIN32) && \ + (defined(__i386__) || defined(__x86_64__) || defined(__ppc__) || \ + defined(__aarch64__)) #define ABSL_INTERNAL_HAVE_DEBUGGING_STACK_CONSUMPTION 1 namespace absl { diff --git a/third_party/abseil_cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc b/third_party/abseil_cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc index 14a76f1eb..f4859d7c2 100644 --- a/third_party/abseil_cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +++ b/third_party/abseil_cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc @@ -37,8 +37,11 @@ static const unsigned char* GetKernelRtSigreturnAddress() { absl::debugging_internal::VDSOSupport vdso; if (vdso.IsPresent()) { absl::debugging_internal::VDSOSupport::SymbolInfo symbol_info; - if (!vdso.LookupSymbol("__kernel_rt_sigreturn", "LINUX_2.6.39", STT_FUNC, - &symbol_info) || + auto lookup = [&](int type) { + return vdso.LookupSymbol("__kernel_rt_sigreturn", "LINUX_2.6.39", type, + &symbol_info); + }; + if ((!lookup(STT_FUNC) && !lookup(STT_NOTYPE)) || symbol_info.address == nullptr) { // Unexpected: VDSO is present, yet the expected symbol is missing // or null. diff --git a/third_party/abseil_cpp/absl/debugging/internal/stacktrace_config.h b/third_party/abseil_cpp/absl/debugging/internal/stacktrace_config.h index d5cc17401..90af85281 100644 --- a/third_party/abseil_cpp/absl/debugging/internal/stacktrace_config.h +++ b/third_party/abseil_cpp/absl/debugging/internal/stacktrace_config.h @@ -44,48 +44,46 @@ !(TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_9_0) #define ABSL_STACKTRACE_INL_HEADER \ "absl/debugging/internal/stacktrace_generic-inl.inc" -#else -#define ABSL_STACKTRACE_INL_HEADER \ - "absl/debugging/internal/stacktrace_unimplemented-inl.inc" #endif #elif defined(__linux__) && !defined(__ANDROID__) -#if !defined(NO_FRAME_POINTER) -# if defined(__i386__) || defined(__x86_64__) +#if defined(NO_FRAME_POINTER) && \ + (defined(__i386__) || defined(__x86_64__) || defined(__aarch64__)) +// Note: The libunwind-based implementation is not available to open-source +// users. #define ABSL_STACKTRACE_INL_HEADER \ - "absl/debugging/internal/stacktrace_x86-inl.inc" -# elif defined(__ppc__) || defined(__PPC__) -#define ABSL_STACKTRACE_INL_HEADER \ - "absl/debugging/internal/stacktrace_powerpc-inl.inc" -# elif defined(__aarch64__) -#define ABSL_STACKTRACE_INL_HEADER \ - "absl/debugging/internal/stacktrace_aarch64-inl.inc" -#elif defined(__arm__) && defined(__GLIBC__) + "absl/debugging/internal/stacktrace_libunwind-inl.inc" +#define STACKTRACE_USES_LIBUNWIND 1 +#elif defined(NO_FRAME_POINTER) && defined(__has_include) +#if __has_include() // Note: When using glibc this may require -funwind-tables to function properly. #define ABSL_STACKTRACE_INL_HEADER \ "absl/debugging/internal/stacktrace_generic-inl.inc" -# else +#endif +#elif defined(__i386__) || defined(__x86_64__) #define ABSL_STACKTRACE_INL_HEADER \ - "absl/debugging/internal/stacktrace_unimplemented-inl.inc" -# endif -#else // defined(NO_FRAME_POINTER) -# if defined(__i386__) || defined(__x86_64__) || defined(__aarch64__) + "absl/debugging/internal/stacktrace_x86-inl.inc" +#elif defined(__ppc__) || defined(__PPC__) #define ABSL_STACKTRACE_INL_HEADER \ - "absl/debugging/internal/stacktrace_generic-inl.inc" -# elif defined(__ppc__) || defined(__PPC__) + "absl/debugging/internal/stacktrace_powerpc-inl.inc" +#elif defined(__aarch64__) #define ABSL_STACKTRACE_INL_HEADER \ - "absl/debugging/internal/stacktrace_generic-inl.inc" -# else + "absl/debugging/internal/stacktrace_aarch64-inl.inc" +#elif defined(__has_include) +#if __has_include() +// Note: When using glibc this may require -funwind-tables to function properly. #define ABSL_STACKTRACE_INL_HEADER \ - "absl/debugging/internal/stacktrace_unimplemented-inl.inc" -# endif -#endif // NO_FRAME_POINTER - -#else -#define ABSL_STACKTRACE_INL_HEADER \ - "absl/debugging/internal/stacktrace_unimplemented-inl.inc" + "absl/debugging/internal/stacktrace_generic-inl.inc" +#endif +#endif #endif +// Fallback to the empty implementation. +#if !defined(ABSL_STACKTRACE_INL_HEADER) +#define ABSL_STACKTRACE_INL_HEADER \ + "absl/debugging/internal/stacktrace_unimplemented-inl.inc" +#endif + #endif // ABSL_DEBUGGING_INTERNAL_STACKTRACE_CONFIG_H_ diff --git a/third_party/abseil_cpp/absl/debugging/internal/symbolize.h b/third_party/abseil_cpp/absl/debugging/internal/symbolize.h index 663d774d4..4f26130fb 100644 --- a/third_party/abseil_cpp/absl/debugging/internal/symbolize.h +++ b/third_party/abseil_cpp/absl/debugging/internal/symbolize.h @@ -18,6 +18,8 @@ #ifndef ABSL_DEBUGGING_INTERNAL_SYMBOLIZE_H_ #define ABSL_DEBUGGING_INTERNAL_SYMBOLIZE_H_ +#ifdef __cplusplus + #include #include @@ -116,20 +118,30 @@ bool RemoveAllSymbolDecorators(void); // filename != nullptr // // Returns true if the file was successfully registered. -bool RegisterFileMappingHint( - const void* start, const void* end, uint64_t offset, const char* filename); +bool RegisterFileMappingHint(const void* start, const void* end, + uint64_t offset, const char* filename); // Looks up the file mapping registered by RegisterFileMappingHint for an // address range. If there is one, the file name is stored in *filename and // *start and *end are modified to reflect the registered mapping. Returns // whether any hint was found. -bool GetFileMappingHint(const void** start, - const void** end, - uint64_t * offset, +bool GetFileMappingHint(const void** start, const void** end, uint64_t* offset, const char** filename); } // namespace debugging_internal ABSL_NAMESPACE_END } // namespace absl +#endif // __cplusplus + +#include + +#ifdef __cplusplus +extern "C" +#endif // __cplusplus + + bool + AbslInternalGetFileMappingHint(const void** start, const void** end, + uint64_t* offset, const char** filename); + #endif // ABSL_DEBUGGING_INTERNAL_SYMBOLIZE_H_ diff --git a/third_party/abseil_cpp/absl/debugging/internal/vdso_support.cc b/third_party/abseil_cpp/absl/debugging/internal/vdso_support.cc index 1e8a78ac9..6be16d907 100644 --- a/third_party/abseil_cpp/absl/debugging/internal/vdso_support.cc +++ b/third_party/abseil_cpp/absl/debugging/internal/vdso_support.cc @@ -76,15 +76,6 @@ const void *VDSOSupport::Init() { } #endif // __GLIBC_PREREQ(2, 16) if (vdso_base_.load(std::memory_order_relaxed) == kInvalidBase) { - // Valgrind zaps AT_SYSINFO_EHDR and friends from the auxv[] - // on stack, and so glibc works as if VDSO was not present. - // But going directly to kernel via /proc/self/auxv below bypasses - // Valgrind zapping. So we check for Valgrind separately. - if (RunningOnValgrind()) { - vdso_base_.store(nullptr, std::memory_order_relaxed); - getcpu_fn_.store(&GetCPUViaSyscall, std::memory_order_relaxed); - return nullptr; - } int fd = open("/proc/self/auxv", O_RDONLY); if (fd == -1) { // Kernel too old to have a VDSO. @@ -175,18 +166,6 @@ int GetCPU() { return ret_code == 0 ? cpu : ret_code; } -// We need to make sure VDSOSupport::Init() is called before -// InitGoogle() does any setuid or chroot calls. If VDSOSupport -// is used in any global constructor, this will happen, since -// VDSOSupport's constructor calls Init. But if not, we need to -// ensure it here, with a global constructor of our own. This -// is an allowed exception to the normal rule against non-trivial -// global constructors. -static class VDSOInitHelper { - public: - VDSOInitHelper() { VDSOSupport::Init(); } -} vdso_init_helper; - } // namespace debugging_internal ABSL_NAMESPACE_END } // namespace absl diff --git a/third_party/abseil_cpp/absl/debugging/symbolize.cc b/third_party/abseil_cpp/absl/debugging/symbolize.cc index eec7a6e86..5e4a25d69 100644 --- a/third_party/abseil_cpp/absl/debugging/symbolize.cc +++ b/third_party/abseil_cpp/absl/debugging/symbolize.cc @@ -14,9 +14,18 @@ #include "absl/debugging/symbolize.h" +#ifdef _WIN32 +#include +#if !(WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)) || \ + WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) +// UWP doesn't have access to win32 APIs. +#define ABSL_INTERNAL_HAVE_SYMBOLIZE_WIN32 +#endif +#endif + #if defined(ABSL_INTERNAL_HAVE_ELF_SYMBOLIZE) #include "absl/debugging/symbolize_elf.inc" -#elif defined(_WIN32) +#elif defined(ABSL_INTERNAL_HAVE_SYMBOLIZE_WIN32) // The Windows Symbolizer only works if PDB files containing the debug info // are available to the program at runtime. #include "absl/debugging/symbolize_win32.inc" diff --git a/third_party/abseil_cpp/absl/debugging/symbolize_darwin.inc b/third_party/abseil_cpp/absl/debugging/symbolize_darwin.inc index cdadd40e9..443ce9efc 100644 --- a/third_party/abseil_cpp/absl/debugging/symbolize_darwin.inc +++ b/third_party/abseil_cpp/absl/debugging/symbolize_darwin.inc @@ -77,8 +77,8 @@ bool Symbolize(const void* pc, char* out, int out_size) { char tmp_buf[1024]; if (debugging_internal::Demangle(symbol.c_str(), tmp_buf, sizeof(tmp_buf))) { - int len = strlen(tmp_buf); - if (len + 1 <= out_size) { // +1 for '\0' + size_t len = strlen(tmp_buf); + if (len + 1 <= static_cast(out_size)) { // +1 for '\0' assert(len < sizeof(tmp_buf)); memmove(out, tmp_buf, len + 1); } diff --git a/third_party/abseil_cpp/absl/debugging/symbolize_elf.inc b/third_party/abseil_cpp/absl/debugging/symbolize_elf.inc index c05424e05..f4d5727bd 100644 --- a/third_party/abseil_cpp/absl/debugging/symbolize_elf.inc +++ b/third_party/abseil_cpp/absl/debugging/symbolize_elf.inc @@ -57,6 +57,7 @@ #include #include +#include #include #include #include @@ -83,6 +84,12 @@ ABSL_NAMESPACE_BEGIN static char *argv0_value = nullptr; void InitializeSymbolizer(const char *argv0) { +#ifdef ABSL_HAVE_VDSO_SUPPORT + // We need to make sure VDSOSupport::Init() is called before any setuid or + // chroot calls, so InitializeSymbolizer() should be called very early in the + // life of a program. + absl::debugging_internal::VDSOSupport::Init(); +#endif if (argv0_value != nullptr) { free(argv0_value); argv0_value = nullptr; @@ -178,6 +185,7 @@ struct ObjFile { fd(-1), elf_type(-1) { SafeMemZero(&elf_header, sizeof(elf_header)); + SafeMemZero(&phdr[0], sizeof(phdr)); } char *filename; @@ -190,6 +198,10 @@ struct ObjFile { int fd; int elf_type; ElfW(Ehdr) elf_header; + + // PT_LOAD program header describing executable code. + // Normally we expect just one, but SWIFT binaries have two. + std::array phdr; }; // Build 4-way associative cache for symbols. Within each cache line, symbols @@ -1266,6 +1278,36 @@ static bool MaybeInitializeObjFile(ObjFile *obj) { ABSL_RAW_LOG(WARNING, "%s: failed to read elf header", obj->filename); return false; } + const int phnum = obj->elf_header.e_phnum; + const int phentsize = obj->elf_header.e_phentsize; + size_t phoff = obj->elf_header.e_phoff; + size_t num_executable_load_segments = 0; + for (int j = 0; j < phnum; j++) { + ElfW(Phdr) phdr; + if (!ReadFromOffsetExact(obj->fd, &phdr, sizeof(phdr), phoff)) { + ABSL_RAW_LOG(WARNING, "%s: failed to read program header %d", + obj->filename, j); + return false; + } + phoff += phentsize; + constexpr int rx = PF_X | PF_R; + if (phdr.p_type != PT_LOAD || (phdr.p_flags & rx) != rx) { + // Not a LOAD segment, or not executable code. + continue; + } + if (num_executable_load_segments < obj->phdr.size()) { + memcpy(&obj->phdr[num_executable_load_segments++], &phdr, sizeof(phdr)); + } else { + ABSL_RAW_LOG(WARNING, "%s: too many executable LOAD segments", + obj->filename); + break; + } + } + if (num_executable_load_segments == 0) { + // This object has no "r-x" LOAD segments. That's unexpected. + ABSL_RAW_LOG(WARNING, "%s: no executable LOAD segments", obj->filename); + return false; + } } return true; } @@ -1289,23 +1331,52 @@ const char *Symbolizer::GetSymbol(const void *const pc) { int fd = -1; if (obj != nullptr) { if (MaybeInitializeObjFile(obj)) { - if (obj->elf_type == ET_DYN && - reinterpret_cast(obj->start_addr) >= obj->offset) { + const size_t start_addr = reinterpret_cast(obj->start_addr); + if (obj->elf_type == ET_DYN && start_addr >= obj->offset) { // This object was relocated. // // For obj->offset > 0, adjust the relocation since a mapping at offset // X in the file will have a start address of [true relocation]+X. - relocation = reinterpret_cast(obj->start_addr) - obj->offset; + relocation = start_addr - obj->offset; + + // Note: some binaries have multiple "rx" LOAD segments. We must + // find the right one. + ElfW(Phdr) *phdr = nullptr; + for (size_t j = 0; j < obj->phdr.size(); j++) { + ElfW(Phdr) &p = obj->phdr[j]; + if (p.p_type != PT_LOAD) { + // We only expect PT_LOADs. This must be PT_NULL that we didn't + // write over (i.e. we exhausted all interesting PT_LOADs). + ABSL_RAW_CHECK(p.p_type == PT_NULL, "unexpected p_type"); + break; + } + if (pc < reinterpret_cast(start_addr + p.p_memsz)) { + phdr = &p; + break; + } + } + if (phdr == nullptr) { + // That's unexpected. Hope for the best. + ABSL_RAW_LOG( + WARNING, + "%s: unable to find LOAD segment for pc: %p, start_addr: %zx", + obj->filename, pc, start_addr); + } else { + // Adjust relocation in case phdr.p_vaddr != 0. + // This happens for binaries linked with `lld --rosegment`, and for + // binaries linked with BFD `ld -z separate-code`. + relocation -= phdr->p_vaddr - phdr->p_offset; + } } fd = obj->fd; - } - if (GetSymbolFromObjectFile(*obj, pc, relocation, symbol_buf_, - sizeof(symbol_buf_), tmp_buf_, - sizeof(tmp_buf_)) == SYMBOL_FOUND) { - // Only try to demangle the symbol name if it fit into symbol_buf_. - DemangleInplace(symbol_buf_, sizeof(symbol_buf_), tmp_buf_, - sizeof(tmp_buf_)); + if (GetSymbolFromObjectFile(*obj, pc, relocation, symbol_buf_, + sizeof(symbol_buf_), tmp_buf_, + sizeof(tmp_buf_)) == SYMBOL_FOUND) { + // Only try to demangle the symbol name if it fit into symbol_buf_. + DemangleInplace(symbol_buf_, sizeof(symbol_buf_), tmp_buf_, + sizeof(tmp_buf_)); + } } } else { #if ABSL_HAVE_VDSO_SUPPORT @@ -1376,7 +1447,7 @@ int InstallSymbolDecorator(SymbolDecorator decorator, void *arg) { if (!g_decorators_mu.TryLock()) { // Someone else is using decorators. Get out. - return false; + return -2; } int ret = ticket; if (g_num_decorators >= kMaxDecorators) { @@ -1455,7 +1526,7 @@ bool GetFileMappingHint(const void **start, const void **end, uint64_t *offset, bool Symbolize(const void *pc, char *out, int out_size) { // Symbolization is very slow under tsan. - ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN(); + ABSL_ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN(); SAFE_ASSERT(out_size >= 0); debugging_internal::Symbolizer *s = debugging_internal::AllocateSymbolizer(); const char *name = s->GetSymbol(pc); @@ -1474,9 +1545,16 @@ bool Symbolize(const void *pc, char *out, int out_size) { } } debugging_internal::FreeSymbolizer(s); - ANNOTATE_IGNORE_READS_AND_WRITES_END(); + ABSL_ANNOTATE_IGNORE_READS_AND_WRITES_END(); return ok; } ABSL_NAMESPACE_END } // namespace absl + +extern "C" bool AbslInternalGetFileMappingHint(const void **start, + const void **end, uint64_t *offset, + const char **filename) { + return absl::debugging_internal::GetFileMappingHint(start, end, offset, + filename); +} diff --git a/third_party/abseil_cpp/absl/debugging/symbolize_test.cc b/third_party/abseil_cpp/absl/debugging/symbolize_test.cc index 43f655493..a2dd4956c 100644 --- a/third_party/abseil_cpp/absl/debugging/symbolize_test.cc +++ b/third_party/abseil_cpp/absl/debugging/symbolize_test.cc @@ -27,6 +27,7 @@ #include "gtest/gtest.h" #include "absl/base/attributes.h" #include "absl/base/casts.h" +#include "absl/base/config.h" #include "absl/base/internal/per_thread_tls.h" #include "absl/base/internal/raw_logging.h" #include "absl/base/optimization.h" @@ -220,8 +221,8 @@ static const char *SymbolizeStackConsumption(void *pc, int *stack_consumed) { static int GetStackConsumptionUpperLimit() { // Symbolize stack consumption should be within 2kB. int stack_consumption_upper_limit = 2048; -#if defined(ADDRESS_SANITIZER) || defined(MEMORY_SANITIZER) || \ - defined(THREAD_SANITIZER) +#if defined(ABSL_HAVE_ADDRESS_SANITIZER) || \ + defined(ABSL_HAVE_MEMORY_SANITIZER) || defined(ABSL_HAVE_THREAD_SANITIZER) // Account for sanitizer instrumentation requiring additional stack space. stack_consumption_upper_limit *= 5; #endif diff --git a/third_party/abseil_cpp/absl/flags/BUILD.bazel b/third_party/abseil_cpp/absl/flags/BUILD.bazel index 006911fd8..78d6da74d 100644 --- a/third_party/abseil_cpp/absl/flags/BUILD.bazel +++ b/third_party/abseil_cpp/absl/flags/BUILD.bazel @@ -24,7 +24,7 @@ load( package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) cc_library( name = "path_util", @@ -106,12 +106,14 @@ cc_library( cc_library( name = "commandlineflag_internal", + srcs = [ + "internal/commandlineflag.cc", + ], hdrs = [ "internal/commandlineflag.h", ], copts = ABSL_DEFAULT_COPTS, linkopts = ABSL_DEFAULT_LINKOPTS, - visibility = ["//visibility:private"], deps = [ "//absl/base:config", "//absl/base:fast_type_id", @@ -176,6 +178,7 @@ cc_library( ":private_handle_accessor", "//absl/base:config", "//absl/base:core_headers", + "//absl/container:flat_hash_map", "//absl/strings", "//absl/synchronization", ], @@ -378,6 +381,8 @@ cc_binary( deps = [ ":flag", ":marshalling", + ":parse", + ":reflection", "//absl/strings", "//absl/time", "//absl/types:optional", @@ -411,6 +416,7 @@ cc_test( ":flag", ":parse", ":reflection", + ":usage_internal", "//absl/base:raw_logging_internal", "//absl/base:scoped_set_env", "//absl/strings", @@ -461,7 +467,9 @@ cc_test( ":flag", ":marshalling", ":reflection", + ":usage_internal", "//absl/memory", + "//absl/strings", "@com_google_googletest//:gtest_main", ], ) diff --git a/third_party/abseil_cpp/absl/flags/CMakeLists.txt b/third_party/abseil_cpp/absl/flags/CMakeLists.txt index ef75db8e9..e5083d7b9 100644 --- a/third_party/abseil_cpp/absl/flags/CMakeLists.txt +++ b/third_party/abseil_cpp/absl/flags/CMakeLists.txt @@ -95,6 +95,8 @@ absl_cc_library( absl_cc_library( NAME flags_commandlineflag_internal + SRCS + "internal/commandlineflag.cc" HDRS "internal/commandlineflag.h" COPTS @@ -163,6 +165,7 @@ absl_cc_library( absl::flags_config absl::strings absl::synchronization + absl::flat_hash_map ) # Internal-only target, do not depend on directly. @@ -180,6 +183,7 @@ absl_cc_library( DEPS absl::base absl::config + absl::flags_commandlineflag absl::flags_commandlineflag_internal absl::flags_config absl::flags_marshalling @@ -362,6 +366,7 @@ absl_cc_test( absl::flags absl::flags_parse absl::flags_reflection + absl::flags_usage_internal absl::raw_logging_internal absl::scoped_set_env absl::span @@ -405,9 +410,10 @@ absl_cc_test( absl::flags_commandlineflag_internal absl::flags absl::flags_reflection + absl::flags_usage absl::memory absl::strings - gtest_main + gmock_main ) absl_cc_test( diff --git a/third_party/abseil_cpp/absl/flags/commandlineflag.cc b/third_party/abseil_cpp/absl/flags/commandlineflag.cc index 217b2d870..9f3b4a5a2 100644 --- a/third_party/abseil_cpp/absl/flags/commandlineflag.cc +++ b/third_party/abseil_cpp/absl/flags/commandlineflag.cc @@ -30,9 +30,5 @@ bool CommandLineFlag::ParseFrom(absl::string_view value, std::string* error) { flags_internal::kProgrammaticChange, *error); } -namespace flags_internal { -FlagStateInterface::~FlagStateInterface() {} -} // namespace flags_internal ABSL_NAMESPACE_END } // namespace absl - diff --git a/third_party/abseil_cpp/absl/flags/commandlineflag.h b/third_party/abseil_cpp/absl/flags/commandlineflag.h index 7e21d05d8..f2fa08977 100644 --- a/third_party/abseil_cpp/absl/flags/commandlineflag.h +++ b/third_party/abseil_cpp/absl/flags/commandlineflag.h @@ -108,6 +108,10 @@ class CommandLineFlag { U u; Read(&u.value); + // allow retired flags to be "read", so we can report invalid access. + if (IsRetired()) { + return absl::nullopt; + } return std::move(u.value); } diff --git a/third_party/abseil_cpp/absl/flags/flag.h b/third_party/abseil_cpp/absl/flags/flag.h index 90dc2894d..a9cb2b799 100644 --- a/third_party/abseil_cpp/absl/flags/flag.h +++ b/third_party/abseil_cpp/absl/flags/flag.h @@ -144,11 +144,17 @@ class Flag { inline bool IsOfType() const { return GetImpl().template IsOfType(); } - T Get() const { return GetImpl().Get(); } - void Set(const T& v) { GetImpl().Set(v); } + T Get() const { + return flags_internal::FlagImplPeer::InvokeGet(GetImpl()); + } + void Set(const T& v) { + flags_internal::FlagImplPeer::InvokeSet(GetImpl(), v); + } void InvokeCallback() { GetImpl().InvokeCallback(); } - const CommandLineFlag& Reflect() const { return GetImpl().Reflect(); } + const CommandLineFlag& Reflect() const { + return flags_internal::FlagImplPeer::InvokeReflect(GetImpl()); + } // The data members are logically private, but they need to be public for // this to be an aggregate type. @@ -180,7 +186,7 @@ class Flag { // std::string first_name = absl::GetFlag(FLAGS_firstname); template ABSL_MUST_USE_RESULT T GetFlag(const absl::Flag& flag) { - return flag.Get(); + return flags_internal::FlagImplPeer::InvokeGet(flag); } // SetFlag() @@ -192,7 +198,7 @@ ABSL_MUST_USE_RESULT T GetFlag(const absl::Flag& flag) { // but especially within performance-critical code. template void SetFlag(absl::Flag* flag, const T& v) { - flag->Set(v); + flags_internal::FlagImplPeer::InvokeSet(*flag, v); } // Overload of `SetFlag()` to allow callers to pass in a value that is @@ -201,7 +207,7 @@ void SetFlag(absl::Flag* flag, const T& v) { template void SetFlag(absl::Flag* flag, const V& v) { T value(v); - flag->Set(value); + flags_internal::FlagImplPeer::InvokeSet(*flag, value); } // GetFlagReflectionHandle() @@ -216,7 +222,7 @@ void SetFlag(absl::Flag* flag, const V& v) { template const CommandLineFlag& GetFlagReflectionHandle(const absl::Flag& f) { - return f.Reflect(); + return flags_internal::FlagImplPeer::InvokeReflect(f); } ABSL_NAMESPACE_END @@ -379,11 +385,12 @@ ABSL_NAMESPACE_END // // `default_value` is only used as a double check on the type. `explanation` is // unused. -// TODO(rogeeff): Return an anonymous struct instead of bool, and place it into -// the unnamed namespace. -#define ABSL_RETIRED_FLAG(type, flagname, default_value, explanation) \ - ABSL_ATTRIBUTE_UNUSED static const bool ignored_##flagname = \ - ([] { return type(default_value); }, \ - absl::flags_internal::RetiredFlag(#flagname)) +// TODO(rogeeff): replace RETIRED_FLAGS with FLAGS once forward declarations of +// retired flags are cleaned up. +#define ABSL_RETIRED_FLAG(type, name, default_value, explanation) \ + static absl::flags_internal::RetiredFlag RETIRED_FLAGS_##name; \ + ABSL_ATTRIBUTE_UNUSED static const auto RETIRED_FLAGS_REG_##name = \ + (RETIRED_FLAGS_##name.Retire(#name), \ + ::absl::flags_internal::FlagRegistrarEmpty{}) #endif // ABSL_FLAGS_FLAG_H_ diff --git a/third_party/abseil_cpp/absl/flags/flag_benchmark.cc b/third_party/abseil_cpp/absl/flags/flag_benchmark.cc index 7b52c9bc9..9982b604b 100644 --- a/third_party/abseil_cpp/absl/flags/flag_benchmark.cc +++ b/third_party/abseil_cpp/absl/flags/flag_benchmark.cc @@ -20,6 +20,8 @@ #include "absl/flags/flag.h" #include "absl/flags/marshalling.h" +#include "absl/flags/parse.h" +#include "absl/flags/reflection.h" #include "absl/strings/string_view.h" #include "absl/time/time.h" #include "absl/types/optional.h" @@ -103,6 +105,23 @@ std::string AbslUnparseFlag(const UDT&) { return ""; } BENCHMARKED_TYPES(FLAG_DEF) +// Register thousands of flags to bloat up the size of the registry. +// This mimics real life production binaries. +#define DEFINE_FLAG_0(name) ABSL_FLAG(int, name, 0, ""); +#define DEFINE_FLAG_1(name) DEFINE_FLAG_0(name##0) DEFINE_FLAG_0(name##1) +#define DEFINE_FLAG_2(name) DEFINE_FLAG_1(name##0) DEFINE_FLAG_1(name##1) +#define DEFINE_FLAG_3(name) DEFINE_FLAG_2(name##0) DEFINE_FLAG_2(name##1) +#define DEFINE_FLAG_4(name) DEFINE_FLAG_3(name##0) DEFINE_FLAG_3(name##1) +#define DEFINE_FLAG_5(name) DEFINE_FLAG_4(name##0) DEFINE_FLAG_4(name##1) +#define DEFINE_FLAG_6(name) DEFINE_FLAG_5(name##0) DEFINE_FLAG_5(name##1) +#define DEFINE_FLAG_7(name) DEFINE_FLAG_6(name##0) DEFINE_FLAG_6(name##1) +#define DEFINE_FLAG_8(name) DEFINE_FLAG_7(name##0) DEFINE_FLAG_7(name##1) +#define DEFINE_FLAG_9(name) DEFINE_FLAG_8(name##0) DEFINE_FLAG_8(name##1) +#define DEFINE_FLAG_10(name) DEFINE_FLAG_9(name##0) DEFINE_FLAG_9(name##1) +#define DEFINE_FLAG_11(name) DEFINE_FLAG_10(name##0) DEFINE_FLAG_10(name##1) +#define DEFINE_FLAG_12(name) DEFINE_FLAG_11(name##0) DEFINE_FLAG_11(name##1) +DEFINE_FLAG_12(bloat_flag_); + namespace { #define BM_GetFlag(T) \ @@ -115,6 +134,20 @@ namespace { BENCHMARKED_TYPES(BM_GetFlag) +void BM_ThreadedFindCommandLineFlag(benchmark::State& state) { + char dummy[] = "dummy"; + char* argv[] = {dummy}; + // We need to ensure that flags have been parsed. That is where the registry + // is finalized. + absl::ParseCommandLine(1, argv); + + for (auto s : state) { + benchmark::DoNotOptimize( + absl::FindCommandLineFlag("bloat_flag_010101010101")); + } +} +BENCHMARK(BM_ThreadedFindCommandLineFlag)->ThreadRange(1, 16); + } // namespace #define InvokeGetFlag(T) \ diff --git a/third_party/abseil_cpp/absl/flags/flag_test.cc b/third_party/abseil_cpp/absl/flags/flag_test.cc index 2eb2ba71d..654c81222 100644 --- a/third_party/abseil_cpp/absl/flags/flag_test.cc +++ b/third_party/abseil_cpp/absl/flags/flag_test.cc @@ -812,6 +812,17 @@ ABSL_RETIRED_FLAG(bool, old_bool_flag, true, "old descr"); ABSL_RETIRED_FLAG(int, old_int_flag, (int)std::sqrt(10), "old descr"); ABSL_RETIRED_FLAG(std::string, old_str_flag, "", absl::StrCat("old ", "descr")); +bool initializaion_order_fiasco_test = [] { + // Iterate over all the flags during static initialization. + // This should not trigger ASan's initialization-order-fiasco. + auto* handle1 = absl::FindCommandLineFlag("flag_on_separate_file"); + auto* handle2 = absl::FindCommandLineFlag("retired_flag_on_separate_file"); + if (handle1 != nullptr && handle2 != nullptr) { + return handle1->Name() == handle2->Name(); + } + return true; +}(); + namespace { TEST_F(FlagTest, TestRetiredFlagRegistration) { diff --git a/third_party/abseil_cpp/absl/flags/flag_test_defs.cc b/third_party/abseil_cpp/absl/flags/flag_test_defs.cc index 49f91dee3..4e1693cdb 100644 --- a/third_party/abseil_cpp/absl/flags/flag_test_defs.cc +++ b/third_party/abseil_cpp/absl/flags/flag_test_defs.cc @@ -20,5 +20,5 @@ ABSL_FLAG(int, mistyped_int_flag, 0, ""); ABSL_FLAG(std::string, mistyped_string_flag, "", ""); -ABSL_RETIRED_FLAG(bool, old_bool_flag, true, - "repetition of retired flag definition"); +ABSL_FLAG(bool, flag_on_separate_file, false, ""); +ABSL_RETIRED_FLAG(bool, retired_flag_on_separate_file, false, ""); diff --git a/third_party/abseil_cpp/absl/flags/internal/commandlineflag.cc b/third_party/abseil_cpp/absl/flags/internal/commandlineflag.cc new file mode 100644 index 000000000..4482955c4 --- /dev/null +++ b/third_party/abseil_cpp/absl/flags/internal/commandlineflag.cc @@ -0,0 +1,26 @@ +// +// Copyright 2020 The Abseil 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 +// +// https://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 "absl/flags/internal/commandlineflag.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace flags_internal { + +FlagStateInterface::~FlagStateInterface() {} + +} // namespace flags_internal +ABSL_NAMESPACE_END +} // namespace absl diff --git a/third_party/abseil_cpp/absl/flags/internal/flag.h b/third_party/abseil_cpp/absl/flags/internal/flag.h index 2cc44e00f..370d8a02e 100644 --- a/third_party/abseil_cpp/absl/flags/internal/flag.h +++ b/third_party/abseil_cpp/absl/flags/internal/flag.h @@ -482,7 +482,8 @@ class FlagImpl final : public CommandLineFlag { friend class FlagState; // Ensures that `data_guard_` is initialized and returns it. - absl::Mutex* DataGuard() const ABSL_LOCK_RETURNED((absl::Mutex*)&data_guard_); + absl::Mutex* DataGuard() const + ABSL_LOCK_RETURNED(reinterpret_cast(data_guard_)); // Returns heap allocated value of type T initialized with default value. std::unique_ptr MakeInitValue() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(*DataGuard()); @@ -631,20 +632,9 @@ class Flag { std::string CurrentValue() const { return impl_.CurrentValue(); } private: - template + template friend class FlagRegistrar; - -#if !defined(_MSC_VER) || defined(__clang__) - template - friend U absl::GetFlag(const flags_internal::Flag& flag); - template - friend void absl::SetFlag(flags_internal::Flag* flag, const U& v); - template - friend void absl::SetFlag(flags_internal::Flag* flag, const V& v); -#else - template - friend class absl::Flag; -#endif + friend class FlagImplPeer; T Get() const { // See implementation notes in CommandLineFlag::Get(). @@ -667,10 +657,6 @@ class Flag { impl_.Write(&v); } - template - friend const CommandLineFlag& absl::GetFlagReflectionHandle( - const absl::Flag& f); - // Access to the reflection. const CommandLineFlag& Reflect() const { return impl_; } @@ -682,6 +668,25 @@ class Flag { FlagValue value_; }; +/////////////////////////////////////////////////////////////////////////////// +// Trampoline for friend access + +class FlagImplPeer { + public: + template + static T InvokeGet(const FlagType& flag) { + return flag.Get(); + } + template + static void InvokeSet(FlagType& flag, const T& v) { + flag.Set(v); + } + template + static const CommandLineFlag& InvokeReflect(const FlagType& f) { + return f.Reflect(); + } +}; + /////////////////////////////////////////////////////////////////////////////// // Implementation of Flag value specific operations routine. template diff --git a/third_party/abseil_cpp/absl/flags/internal/registry.h b/third_party/abseil_cpp/absl/flags/internal/registry.h index 6f5006a01..a8d9eb9cb 100644 --- a/third_party/abseil_cpp/absl/flags/internal/registry.h +++ b/third_party/abseil_cpp/absl/flags/internal/registry.h @@ -30,9 +30,6 @@ namespace absl { ABSL_NAMESPACE_BEGIN namespace flags_internal { -// Executes specified visitor for each non-retired flag in the registry. -// Requires the caller hold the registry lock. -void ForEachFlagUnlocked(std::function visitor); // Executes specified visitor for each non-retired flag in the registry. While // callback are executed, the registry is locked and can't be changed. void ForEachFlag(std::function visitor); @@ -41,6 +38,8 @@ void ForEachFlag(std::function visitor); bool RegisterCommandLineFlag(CommandLineFlag&); +void FinalizeRegistry(); + //----------------------------------------------------------------------------- // Retired registrations: // @@ -74,13 +73,22 @@ bool RegisterCommandLineFlag(CommandLineFlag&); // // Retire flag with name "name" and type indicated by ops. -bool Retire(const char* name, FlagFastTypeId type_id); +void Retire(const char* name, FlagFastTypeId type_id, char* buf); + +constexpr size_t kRetiredFlagObjSize = 3 * sizeof(void*); +constexpr size_t kRetiredFlagObjAlignment = alignof(void*); // Registered a retired flag with name 'flag_name' and type 'T'. template -inline bool RetiredFlag(const char* flag_name) { - return flags_internal::Retire(flag_name, base_internal::FastTypeId()); -} +class RetiredFlag { + public: + void Retire(const char* flag_name) { + flags_internal::Retire(flag_name, base_internal::FastTypeId(), buf_); + } + + private: + alignas(kRetiredFlagObjAlignment) char buf_[kRetiredFlagObjSize]; +}; } // namespace flags_internal ABSL_NAMESPACE_END diff --git a/third_party/abseil_cpp/absl/flags/internal/usage.cc b/third_party/abseil_cpp/absl/flags/internal/usage.cc index 35b6427b6..f29d7c9b4 100644 --- a/third_party/abseil_cpp/absl/flags/internal/usage.cc +++ b/third_party/abseil_cpp/absl/flags/internal/usage.cc @@ -37,26 +37,26 @@ #include "absl/strings/str_split.h" #include "absl/strings/string_view.h" -ABSL_FLAG(bool, help, false, - "show help on important flags for this binary [tip: all flags can " - "have two dashes]"); -ABSL_FLAG(bool, helpfull, false, "show help on all flags"); -ABSL_FLAG(bool, helpshort, false, - "show help on only the main module for this program"); -ABSL_FLAG(bool, helppackage, false, - "show help on all modules in the main package"); -ABSL_FLAG(bool, version, false, "show version and build info and exit"); -ABSL_FLAG(bool, only_check_args, false, "exit after checking all flags"); -ABSL_FLAG(std::string, helpon, "", - "show help on the modules named by this flag value"); -ABSL_FLAG(std::string, helpmatch, "", - "show help on modules whose name contains the specified substr"); +// Dummy global variables to prevent anyone else defining these. +bool FLAGS_help = false; +bool FLAGS_helpfull = false; +bool FLAGS_helpshort = false; +bool FLAGS_helppackage = false; +bool FLAGS_version = false; +bool FLAGS_only_check_args = false; +bool FLAGS_helpon = false; +bool FLAGS_helpmatch = false; namespace absl { ABSL_NAMESPACE_BEGIN namespace flags_internal { namespace { +using PerFlagFilter = std::function; + +// Maximum length size in a human readable format. +constexpr size_t kHrfMaxLineLength = 80; + // This class is used to emit an XML element with `tag` and `text`. // It adds opening and closing tags and escapes special characters in the text. // For example: @@ -109,9 +109,12 @@ class FlagHelpPrettyPrinter { public: // Pretty printer holds on to the std::ostream& reference to direct an output // to that stream. - FlagHelpPrettyPrinter(int max_line_len, std::ostream& out) + FlagHelpPrettyPrinter(size_t max_line_len, size_t min_line_len, + size_t wrapped_line_indent, std::ostream& out) : out_(out), max_line_len_(max_line_len), + min_line_len_(min_line_len), + wrapped_line_indent_(wrapped_line_indent), line_len_(0), first_line_(true) {} @@ -145,7 +148,8 @@ class FlagHelpPrettyPrinter { } // Write the token, ending the string first if necessary/possible. - if (!new_line && (line_len_ + token.size() >= max_line_len_)) { + if (!new_line && + (line_len_ + static_cast(token.size()) >= max_line_len_)) { EndLine(); new_line = true; } @@ -164,13 +168,12 @@ class FlagHelpPrettyPrinter { void StartLine() { if (first_line_) { - out_ << " "; - line_len_ = 4; + line_len_ = min_line_len_; first_line_ = false; } else { - out_ << " "; - line_len_ = 6; + line_len_ = min_line_len_ + wrapped_line_indent_; } + out_ << std::string(line_len_, ' '); } void EndLine() { out_ << '\n'; @@ -179,13 +182,15 @@ class FlagHelpPrettyPrinter { private: std::ostream& out_; - const int max_line_len_; - int line_len_; + const size_t max_line_len_; + const size_t min_line_len_; + const size_t wrapped_line_indent_; + size_t line_len_; bool first_line_; }; void FlagHelpHumanReadable(const CommandLineFlag& flag, std::ostream& out) { - FlagHelpPrettyPrinter printer(80, out); // Max line length is 80. + FlagHelpPrettyPrinter printer(kHrfMaxLineLength, 4, 2, out); // Flag name. printer.Write(absl::StrCat("--", flag.Name())); @@ -221,7 +226,7 @@ void FlagHelpHumanReadable(const CommandLineFlag& flag, std::ostream& out) { // If a flag's help message has been stripped (e.g. by adding '#define // STRIP_FLAG_HELP 1' then this flag will not be displayed by '--help' // and its variants. -void FlagsHelpImpl(std::ostream& out, flags_internal::FlagKindFilter filter_cb, +void FlagsHelpImpl(std::ostream& out, PerFlagFilter filter_cb, HelpFormat format, absl::string_view program_usage_message) { if (format == HelpFormat::kHumanReadable) { out << flags_internal::ShortProgramInvocationName() << ": " @@ -250,8 +255,6 @@ void FlagsHelpImpl(std::ostream& out, flags_internal::FlagKindFilter filter_cb, matching_flags; flags_internal::ForEachFlag([&](absl::CommandLineFlag& flag) { - std::string flag_filename = flag.Filename(); - // Ignore retired flags. if (flag.IsRetired()) return; @@ -259,7 +262,9 @@ void FlagsHelpImpl(std::ostream& out, flags_internal::FlagKindFilter filter_cb, if (flag.Help() == flags_internal::kStrippedFlagHelp) return; // Make sure flag satisfies the filter - if (!filter_cb || !filter_cb(flag_filename)) return; + if (!filter_cb(flag)) return; + + std::string flag_filename = flag.Filename(); matching_flags[std::string(flags_internal::Package(flag_filename))] [flag_filename] @@ -289,15 +294,34 @@ void FlagsHelpImpl(std::ostream& out, flags_internal::FlagKindFilter filter_cb, } if (format == HelpFormat::kHumanReadable) { + FlagHelpPrettyPrinter printer(kHrfMaxLineLength, 0, 0, out); + if (filter_cb && matching_flags.empty()) { - out << " No modules matched: use -helpfull\n"; + printer.Write("No flags matched.\n", true); } + printer.EndLine(); + printer.Write( + "Try --helpfull to get a list of all flags or --help=substring " + "shows help for flags which include specified substring in either " + "in the name, or description or path.\n", + true); } else { // The end of the document. out << "\n"; } } +void FlagsHelpImpl(std::ostream& out, + flags_internal::FlagKindFilter filename_filter_cb, + HelpFormat format, absl::string_view program_usage_message) { + FlagsHelpImpl( + out, + [&](const absl::CommandLineFlag& flag) { + return filename_filter_cb && filename_filter_cb(flag.Filename()); + }, + format, program_usage_message); +} + } // namespace // -------------------------------------------------------------------- @@ -309,7 +333,7 @@ void FlagHelp(std::ostream& out, const CommandLineFlag& flag, } // -------------------------------------------------------------------- -// Produces the help messages for all flags matching the filter. +// Produces the help messages for all flags matching the filename filter. // If filter is empty produces help messages for all flags. void FlagsHelp(std::ostream& out, absl::string_view filter, HelpFormat format, absl::string_view program_usage_message) { @@ -324,68 +348,177 @@ void FlagsHelp(std::ostream& out, absl::string_view filter, HelpFormat format, // If so, handles them appropriately. int HandleUsageFlags(std::ostream& out, absl::string_view program_usage_message) { - if (absl::GetFlag(FLAGS_helpshort)) { - flags_internal::FlagsHelpImpl( - out, flags_internal::GetUsageConfig().contains_helpshort_flags, - HelpFormat::kHumanReadable, program_usage_message); - return 1; - } + switch (GetFlagsHelpMode()) { + case HelpMode::kNone: + break; + case HelpMode::kImportant: + flags_internal::FlagsHelpImpl( + out, flags_internal::GetUsageConfig().contains_help_flags, + GetFlagsHelpFormat(), program_usage_message); + return 1; - if (absl::GetFlag(FLAGS_helpfull)) { - // show all options - flags_internal::FlagsHelp(out, "", HelpFormat::kHumanReadable, - program_usage_message); - return 1; - } + case HelpMode::kShort: + flags_internal::FlagsHelpImpl( + out, flags_internal::GetUsageConfig().contains_helpshort_flags, + GetFlagsHelpFormat(), program_usage_message); + return 1; - if (!absl::GetFlag(FLAGS_helpon).empty()) { - flags_internal::FlagsHelp( - out, absl::StrCat("/", absl::GetFlag(FLAGS_helpon), "."), - HelpFormat::kHumanReadable, program_usage_message); - return 1; - } + case HelpMode::kFull: + flags_internal::FlagsHelp(out, "", GetFlagsHelpFormat(), + program_usage_message); + return 1; - if (!absl::GetFlag(FLAGS_helpmatch).empty()) { - flags_internal::FlagsHelp(out, absl::GetFlag(FLAGS_helpmatch), - HelpFormat::kHumanReadable, - program_usage_message); - return 1; - } + case HelpMode::kPackage: + flags_internal::FlagsHelpImpl( + out, flags_internal::GetUsageConfig().contains_helppackage_flags, + GetFlagsHelpFormat(), program_usage_message); - if (absl::GetFlag(FLAGS_help)) { - flags_internal::FlagsHelpImpl( - out, flags_internal::GetUsageConfig().contains_help_flags, - HelpFormat::kHumanReadable, program_usage_message); + return 1; - out << "\nTry --helpfull to get a list of all flags.\n"; + case HelpMode::kMatch: { + std::string substr = GetFlagsHelpMatchSubstr(); + if (substr.empty()) { + // show all options + flags_internal::FlagsHelp(out, substr, GetFlagsHelpFormat(), + program_usage_message); + } else { + auto filter_cb = [&substr](const absl::CommandLineFlag& flag) { + if (absl::StrContains(flag.Name(), substr)) return true; + if (absl::StrContains(flag.Filename(), substr)) return true; + if (absl::StrContains(flag.Help(), substr)) return true; - return 1; - } + return false; + }; + flags_internal::FlagsHelpImpl( + out, filter_cb, HelpFormat::kHumanReadable, program_usage_message); + } - if (absl::GetFlag(FLAGS_helppackage)) { - flags_internal::FlagsHelpImpl( - out, flags_internal::GetUsageConfig().contains_helppackage_flags, - HelpFormat::kHumanReadable, program_usage_message); + return 1; + } + case HelpMode::kVersion: + if (flags_internal::GetUsageConfig().version_string) + out << flags_internal::GetUsageConfig().version_string(); + // Unlike help, we may be asking for version in a script, so return 0 + return 0; - out << "\nTry --helpfull to get a list of all flags.\n"; - - return 1; - } - - if (absl::GetFlag(FLAGS_version)) { - if (flags_internal::GetUsageConfig().version_string) - out << flags_internal::GetUsageConfig().version_string(); - // Unlike help, we may be asking for version in a script, so return 0 - return 0; - } - - if (absl::GetFlag(FLAGS_only_check_args)) { - return 0; + case HelpMode::kOnlyCheckArgs: + return 0; } return -1; } +// -------------------------------------------------------------------- +// Globals representing usage reporting flags + +namespace { + +ABSL_CONST_INIT absl::Mutex help_attributes_guard(absl::kConstInit); +ABSL_CONST_INIT std::string* match_substr + ABSL_GUARDED_BY(help_attributes_guard) = nullptr; +ABSL_CONST_INIT HelpMode help_mode ABSL_GUARDED_BY(help_attributes_guard) = + HelpMode::kNone; +ABSL_CONST_INIT HelpFormat help_format ABSL_GUARDED_BY(help_attributes_guard) = + HelpFormat::kHumanReadable; + +} // namespace + +std::string GetFlagsHelpMatchSubstr() { + absl::MutexLock l(&help_attributes_guard); + if (match_substr == nullptr) return ""; + return *match_substr; +} + +void SetFlagsHelpMatchSubstr(absl::string_view substr) { + absl::MutexLock l(&help_attributes_guard); + if (match_substr == nullptr) match_substr = new std::string; + match_substr->assign(substr.data(), substr.size()); +} + +HelpMode GetFlagsHelpMode() { + absl::MutexLock l(&help_attributes_guard); + // Refer to dummy variales to prevent linker dropping them + if (FLAGS_help || FLAGS_helpfull || FLAGS_helpshort || FLAGS_helppackage || + FLAGS_version || FLAGS_only_check_args || FLAGS_helpon || + FLAGS_helpmatch) { + help_mode = HelpMode::kNone; + } + return help_mode; +} + +void SetFlagsHelpMode(HelpMode mode) { + absl::MutexLock l(&help_attributes_guard); + help_mode = mode; +} + +HelpFormat GetFlagsHelpFormat() { + absl::MutexLock l(&help_attributes_guard); + return help_format; +} + +void SetFlagsHelpFormat(HelpFormat format) { + absl::MutexLock l(&help_attributes_guard); + help_format = format; +} + +// Deduces usage flags from the input argument in a form --name=value or +// --name. argument is already split into name and value before we call this +// function. +bool DeduceUsageFlags(absl::string_view name, absl::string_view value) { + if (absl::ConsumePrefix(&name, "help")) { + if (name == "") { + if (value.empty()) { + SetFlagsHelpMode(HelpMode::kImportant); + } else { + SetFlagsHelpMode(HelpMode::kMatch); + SetFlagsHelpMatchSubstr(value); + } + return true; + } + + if (name == "match") { + SetFlagsHelpMode(HelpMode::kMatch); + SetFlagsHelpMatchSubstr(value); + return true; + } + + if (name == "on") { + SetFlagsHelpMode(HelpMode::kMatch); + SetFlagsHelpMatchSubstr(absl::StrCat("/", value, ".")); + return true; + } + + if (name == "full") { + SetFlagsHelpMode(HelpMode::kFull); + return true; + } + + if (name == "short") { + SetFlagsHelpMode(HelpMode::kShort); + return true; + } + + if (name == "package") { + SetFlagsHelpMode(HelpMode::kPackage); + return true; + } + + return false; + } + + if (name == "version") { + SetFlagsHelpMode(HelpMode::kVersion); + return true; + } + + if (name == "only_check_args") { + SetFlagsHelpMode(HelpMode::kOnlyCheckArgs); + return true; + } + + return false; +} + } // namespace flags_internal ABSL_NAMESPACE_END } // namespace absl diff --git a/third_party/abseil_cpp/absl/flags/internal/usage.h b/third_party/abseil_cpp/absl/flags/internal/usage.h index 0c62dc4b2..c0bcac576 100644 --- a/third_party/abseil_cpp/absl/flags/internal/usage.h +++ b/third_party/abseil_cpp/absl/flags/internal/usage.h @@ -36,7 +36,8 @@ enum class HelpFormat { kHumanReadable, }; -// Outputs the help message describing specific flag. +// Streams the help message describing `flag` to `out`. +// The default value for `flag` is included in the output. void FlagHelp(std::ostream& out, const CommandLineFlag& flag, HelpFormat format = HelpFormat::kHumanReadable); @@ -65,17 +66,39 @@ void FlagsHelp(std::ostream& out, absl::string_view filter, int HandleUsageFlags(std::ostream& out, absl::string_view program_usage_message); +// -------------------------------------------------------------------- +// Globals representing usage reporting flags + +enum class HelpMode { + kNone, + kImportant, + kShort, + kFull, + kPackage, + kMatch, + kVersion, + kOnlyCheckArgs +}; + +// Returns substring to filter help output (--help=substr argument) +std::string GetFlagsHelpMatchSubstr(); +// Returns the requested help mode. +HelpMode GetFlagsHelpMode(); +// Returns the requested help format. +HelpFormat GetFlagsHelpFormat(); + +// These are corresponding setters to the attributes above. +void SetFlagsHelpMatchSubstr(absl::string_view); +void SetFlagsHelpMode(HelpMode); +void SetFlagsHelpFormat(HelpFormat); + +// Deduces usage flags from the input argument in a form --name=value or +// --name. argument is already split into name and value before we call this +// function. +bool DeduceUsageFlags(absl::string_view name, absl::string_view value); + } // namespace flags_internal ABSL_NAMESPACE_END } // namespace absl -ABSL_DECLARE_FLAG(bool, help); -ABSL_DECLARE_FLAG(bool, helpfull); -ABSL_DECLARE_FLAG(bool, helpshort); -ABSL_DECLARE_FLAG(bool, helppackage); -ABSL_DECLARE_FLAG(bool, version); -ABSL_DECLARE_FLAG(bool, only_check_args); -ABSL_DECLARE_FLAG(std::string, helpon); -ABSL_DECLARE_FLAG(std::string, helpmatch); - #endif // ABSL_FLAGS_INTERNAL_USAGE_H_ diff --git a/third_party/abseil_cpp/absl/flags/internal/usage_test.cc b/third_party/abseil_cpp/absl/flags/internal/usage_test.cc index 6e583fbe4..b5c2487da 100644 --- a/third_party/abseil_cpp/absl/flags/internal/usage_test.cc +++ b/third_party/abseil_cpp/absl/flags/internal/usage_test.cc @@ -87,6 +87,11 @@ class UsageReportingTest : public testing::Test { default_config.normalize_filename = &NormalizeFileName; absl::SetFlagsUsageConfig(default_config); } + ~UsageReportingTest() override { + flags::SetFlagsHelpMode(flags::HelpMode::kNone); + flags::SetFlagsHelpMatchSubstr(""); + flags::SetFlagsHelpFormat(flags::HelpFormat::kHumanReadable); + } private: absl::FlagSaver flag_saver_; @@ -191,6 +196,10 @@ TEST_F(UsageReportingTest, TestFlagsHelpHRF) { Some more help. Even more long long long long long long long long long long long long help message.); default: ""; + +Try --helpfull to get a list of all flags or --help=substring shows help for +flags which include specified substring in either in the name, or description or +path. )"; std::stringstream test_buf_01; @@ -214,7 +223,11 @@ TEST_F(UsageReportingTest, TestFlagsHelpHRF) { EXPECT_EQ(test_buf_04.str(), R"(usage_test: Custom usage message - No modules matched: use -helpfull +No flags matched. + +Try --helpfull to get a list of all flags or --help=substring shows help for +flags which include specified substring in either in the name, or description or +path. )"); std::stringstream test_buf_05; @@ -226,12 +239,8 @@ TEST_F(UsageReportingTest, TestFlagsHelpHRF) { absl::StartsWith(test_out_str, "usage_test: Custom usage message")); EXPECT_TRUE(absl::StrContains( test_out_str, "Flags from absl/flags/internal/usage_test.cc:")); - EXPECT_TRUE(absl::StrContains(test_out_str, - "Flags from absl/flags/internal/usage.cc:")); EXPECT_TRUE( absl::StrContains(test_out_str, "-usage_reporting_test_flag_01 ")); - EXPECT_TRUE(absl::StrContains(test_out_str, "-help (show help")) - << test_out_str; } // -------------------------------------------------------------------- @@ -244,7 +253,7 @@ TEST_F(UsageReportingTest, TestNoUsageFlags) { // -------------------------------------------------------------------- TEST_F(UsageReportingTest, TestUsageFlag_helpshort) { - absl::SetFlag(&FLAGS_helpshort, true); + flags::SetFlagsHelpMode(flags::HelpMode::kShort); std::stringstream test_buf; EXPECT_EQ(flags::HandleUsageFlags(test_buf, kTestUsageMessage), 1); @@ -267,13 +276,17 @@ TEST_F(UsageReportingTest, TestUsageFlag_helpshort) { Some more help. Even more long long long long long long long long long long long long help message.); default: ""; + +Try --helpfull to get a list of all flags or --help=substring shows help for +flags which include specified substring in either in the name, or description or +path. )"); } // -------------------------------------------------------------------- -TEST_F(UsageReportingTest, TestUsageFlag_help) { - absl::SetFlag(&FLAGS_help, true); +TEST_F(UsageReportingTest, TestUsageFlag_help_simple) { + flags::SetFlagsHelpMode(flags::HelpMode::kImportant); std::stringstream test_buf; EXPECT_EQ(flags::HandleUsageFlags(test_buf, kTestUsageMessage), 1); @@ -297,14 +310,74 @@ TEST_F(UsageReportingTest, TestUsageFlag_help) { Even more long long long long long long long long long long long long help message.); default: ""; -Try --helpfull to get a list of all flags. +Try --helpfull to get a list of all flags or --help=substring shows help for +flags which include specified substring in either in the name, or description or +path. +)"); +} + +// -------------------------------------------------------------------- + +TEST_F(UsageReportingTest, TestUsageFlag_help_one_flag) { + flags::SetFlagsHelpMode(flags::HelpMode::kMatch); + flags::SetFlagsHelpMatchSubstr("usage_reporting_test_flag_06"); + + std::stringstream test_buf; + EXPECT_EQ(flags::HandleUsageFlags(test_buf, kTestUsageMessage), 1); + EXPECT_EQ(test_buf.str(), + R"(usage_test: Custom usage message + + Flags from absl/flags/internal/usage_test.cc: + --usage_reporting_test_flag_06 (usage_reporting_test_flag_06 help message. + + Some more help. + Even more long long long long long long long long long long long long help + message.); default: ""; + +Try --helpfull to get a list of all flags or --help=substring shows help for +flags which include specified substring in either in the name, or description or +path. +)"); +} + +// -------------------------------------------------------------------- + +TEST_F(UsageReportingTest, TestUsageFlag_help_multiple_flag) { + flags::SetFlagsHelpMode(flags::HelpMode::kMatch); + flags::SetFlagsHelpMatchSubstr("test_flag"); + + std::stringstream test_buf; + EXPECT_EQ(flags::HandleUsageFlags(test_buf, kTestUsageMessage), 1); + EXPECT_EQ(test_buf.str(), + R"(usage_test: Custom usage message + + Flags from absl/flags/internal/usage_test.cc: + --usage_reporting_test_flag_01 (usage_reporting_test_flag_01 help message); + default: 101; + --usage_reporting_test_flag_02 (usage_reporting_test_flag_02 help message); + default: false; + --usage_reporting_test_flag_03 (usage_reporting_test_flag_03 help message); + default: 1.03; + --usage_reporting_test_flag_04 (usage_reporting_test_flag_04 help message); + default: 1000000000000004; + --usage_reporting_test_flag_05 (usage_reporting_test_flag_05 help message); + default: UDT{}; + --usage_reporting_test_flag_06 (usage_reporting_test_flag_06 help message. + + Some more help. + Even more long long long long long long long long long long long long help + message.); default: ""; + +Try --helpfull to get a list of all flags or --help=substring shows help for +flags which include specified substring in either in the name, or description or +path. )"); } // -------------------------------------------------------------------- TEST_F(UsageReportingTest, TestUsageFlag_helppackage) { - absl::SetFlag(&FLAGS_helppackage, true); + flags::SetFlagsHelpMode(flags::HelpMode::kPackage); std::stringstream test_buf; EXPECT_EQ(flags::HandleUsageFlags(test_buf, kTestUsageMessage), 1); @@ -328,14 +401,16 @@ TEST_F(UsageReportingTest, TestUsageFlag_helppackage) { Even more long long long long long long long long long long long long help message.); default: ""; -Try --helpfull to get a list of all flags. +Try --helpfull to get a list of all flags or --help=substring shows help for +flags which include specified substring in either in the name, or description or +path. )"); } // -------------------------------------------------------------------- TEST_F(UsageReportingTest, TestUsageFlag_version) { - absl::SetFlag(&FLAGS_version, true); + flags::SetFlagsHelpMode(flags::HelpMode::kVersion); std::stringstream test_buf; EXPECT_EQ(flags::HandleUsageFlags(test_buf, kTestUsageMessage), 0); @@ -349,7 +424,7 @@ TEST_F(UsageReportingTest, TestUsageFlag_version) { // -------------------------------------------------------------------- TEST_F(UsageReportingTest, TestUsageFlag_only_check_args) { - absl::SetFlag(&FLAGS_only_check_args, true); + flags::SetFlagsHelpMode(flags::HelpMode::kOnlyCheckArgs); std::stringstream test_buf; EXPECT_EQ(flags::HandleUsageFlags(test_buf, kTestUsageMessage), 0); @@ -359,17 +434,22 @@ TEST_F(UsageReportingTest, TestUsageFlag_only_check_args) { // -------------------------------------------------------------------- TEST_F(UsageReportingTest, TestUsageFlag_helpon) { - absl::SetFlag(&FLAGS_helpon, "bla-bla"); + flags::SetFlagsHelpMode(flags::HelpMode::kMatch); + flags::SetFlagsHelpMatchSubstr("/bla-bla."); std::stringstream test_buf_01; EXPECT_EQ(flags::HandleUsageFlags(test_buf_01, kTestUsageMessage), 1); EXPECT_EQ(test_buf_01.str(), R"(usage_test: Custom usage message - No modules matched: use -helpfull +No flags matched. + +Try --helpfull to get a list of all flags or --help=substring shows help for +flags which include specified substring in either in the name, or description or +path. )"); - absl::SetFlag(&FLAGS_helpon, "usage_test"); + flags::SetFlagsHelpMatchSubstr("/usage_test."); std::stringstream test_buf_02; EXPECT_EQ(flags::HandleUsageFlags(test_buf_02, kTestUsageMessage), 1); @@ -392,6 +472,10 @@ TEST_F(UsageReportingTest, TestUsageFlag_helpon) { Some more help. Even more long long long long long long long long long long long long help message.); default: ""; + +Try --helpfull to get a list of all flags or --help=substring shows help for +flags which include specified substring in either in the name, or description or +path. )"); } diff --git a/third_party/abseil_cpp/absl/flags/parse.cc b/third_party/abseil_cpp/absl/flags/parse.cc index e2c88ff86..dd1a6796c 100644 --- a/third_party/abseil_cpp/absl/flags/parse.cc +++ b/third_party/abseil_cpp/absl/flags/parse.cc @@ -611,6 +611,11 @@ std::vector ParseCommandLineImpl(int argc, char* argv[], OnUndefinedFlag on_undef_flag) { ABSL_INTERNAL_CHECK(argc > 0, "Missing argv[0]"); + // Once parsing has started we will not have more flag registrations. + // If we did, they would be missing during parsing, which is a problem on + // itself. + flags_internal::FinalizeRegistry(); + // This routine does not return anything since we abort on failure. CheckDefaultValuesParsingRoundtrip(); @@ -708,6 +713,11 @@ std::vector ParseCommandLineImpl(int argc, char* argv[], std::tie(flag, is_negative) = LocateFlag(flag_name); if (flag == nullptr) { + // Usage flags are not modeled as Abseil flags. Locate them separately. + if (flags_internal::DeduceUsageFlags(flag_name, value)) { + continue; + } + if (on_undef_flag != OnUndefinedFlag::kIgnoreUndefined) { undefined_flag_names.emplace_back(arg_from_argv, std::string(flag_name)); @@ -729,12 +739,13 @@ std::vector ParseCommandLineImpl(int argc, char* argv[], } // 100. Set the located flag to a new new value, unless it is retired. - // Setting retired flag fails, but we ignoring it here. - if (flag->IsRetired()) continue; - + // Setting retired flag fails, but we ignoring it here while also reporting + // access to retired flag. std::string error; if (!flags_internal::PrivateHandleAccessor::ParseFrom( *flag, value, SET_FLAGS_VALUE, kCommandLine, error)) { + if (flag->IsRetired()) continue; + flags_internal::ReportUsageError(error, true); success = false; } else { diff --git a/third_party/abseil_cpp/absl/flags/parse_test.cc b/third_party/abseil_cpp/absl/flags/parse_test.cc index d35a6e471..41bc0bc6b 100644 --- a/third_party/abseil_cpp/absl/flags/parse_test.cc +++ b/third_party/abseil_cpp/absl/flags/parse_test.cc @@ -28,6 +28,7 @@ #include "absl/flags/declare.h" #include "absl/flags/flag.h" #include "absl/flags/internal/parse.h" +#include "absl/flags/internal/usage.h" #include "absl/flags/reflection.h" #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" @@ -207,6 +208,9 @@ namespace flags = absl::flags_internal; using testing::ElementsAreArray; class ParseTest : public testing::Test { + public: + ~ParseTest() override { flags::SetFlagsHelpMode(flags::HelpMode::kNone); } + private: absl::FlagSaver flag_saver_; }; @@ -851,7 +855,7 @@ TEST_F(ParseTest, TestIgnoreUndefinedFlags) { // -------------------------------------------------------------------- -TEST_F(ParseDeathTest, TestHelpFlagHandling) { +TEST_F(ParseDeathTest, TestSimpleHelpFlagHandling) { const char* in_args1[] = { "testbin", "--help", @@ -870,11 +874,38 @@ TEST_F(ParseDeathTest, TestHelpFlagHandling) { flags::UsageFlagsAction::kIgnoreUsage, flags::OnUndefinedFlag::kAbortIfUndefined); + EXPECT_EQ(flags::GetFlagsHelpMode(), flags::HelpMode::kImportant); EXPECT_EQ(absl::GetFlag(FLAGS_int_flag), 3); } // -------------------------------------------------------------------- +TEST_F(ParseDeathTest, TestSubstringHelpFlagHandling) { + const char* in_args1[] = { + "testbin", + "--help=abcd", + }; + + auto out_args1 = flags::ParseCommandLineImpl( + 2, const_cast(in_args1), flags::ArgvListAction::kRemoveParsedArgs, + flags::UsageFlagsAction::kIgnoreUsage, + flags::OnUndefinedFlag::kAbortIfUndefined); + + EXPECT_EQ(flags::GetFlagsHelpMode(), flags::HelpMode::kMatch); + EXPECT_EQ(flags::GetFlagsHelpMatchSubstr(), "abcd"); + + const char* in_args2[] = {"testbin", "--help", "some_positional_arg"}; + + auto out_args2 = flags::ParseCommandLineImpl( + 3, const_cast(in_args2), flags::ArgvListAction::kRemoveParsedArgs, + flags::UsageFlagsAction::kIgnoreUsage, + flags::OnUndefinedFlag::kAbortIfUndefined); + + EXPECT_EQ(flags::GetFlagsHelpMode(), flags::HelpMode::kImportant); +} + +// -------------------------------------------------------------------- + TEST_F(ParseTest, WasPresentOnCommandLine) { const char* in_args1[] = { "testbin", "arg1", "--bool_flag", diff --git a/third_party/abseil_cpp/absl/flags/reflection.cc b/third_party/abseil_cpp/absl/flags/reflection.cc index 5fc945f23..c976d4679 100644 --- a/third_party/abseil_cpp/absl/flags/reflection.cc +++ b/third_party/abseil_cpp/absl/flags/reflection.cc @@ -17,6 +17,7 @@ #include +#include #include #include @@ -56,25 +57,23 @@ class FlagRegistry { // Returns the flag object for the specified name, or nullptr if not found. // Will emit a warning if a 'retired' flag is specified. - CommandLineFlag* FindFlagLocked(absl::string_view name); - - // Returns the retired flag object for the specified name, or nullptr if not - // found or not retired. Does not emit a warning. - CommandLineFlag* FindRetiredFlagLocked(absl::string_view name); + CommandLineFlag* FindFlag(absl::string_view name); static FlagRegistry& GlobalRegistry(); // returns a singleton registry private: friend class flags_internal::FlagSaverImpl; // reads all the flags in order // to copy them - friend void ForEachFlagUnlocked( - std::function visitor); + friend void ForEachFlag(std::function visitor); + friend void FinalizeRegistry(); - // The map from name to flag, for FindFlagLocked(). + // The map from name to flag, for FindFlag(). using FlagMap = std::map; using FlagIterator = FlagMap::iterator; using FlagConstIterator = FlagMap::const_iterator; FlagMap flags_; + std::vector flat_flags_; + std::atomic finalized_flags_{false}; absl::Mutex lock_; @@ -83,29 +82,6 @@ class FlagRegistry { FlagRegistry& operator=(const FlagRegistry&); }; -CommandLineFlag* FlagRegistry::FindFlagLocked(absl::string_view name) { - FlagConstIterator i = flags_.find(name); - if (i == flags_.end()) { - return nullptr; - } - - if (i->second->IsRetired()) { - flags_internal::ReportUsageError( - absl::StrCat("Accessing retired flag '", name, "'"), false); - } - - return i->second; -} - -CommandLineFlag* FlagRegistry::FindRetiredFlagLocked(absl::string_view name) { - FlagConstIterator i = flags_.find(name); - if (i == flags_.end() || !i->second->IsRetired()) { - return nullptr; - } - - return i->second; -} - namespace { class FlagRegistryLock { @@ -117,12 +93,26 @@ class FlagRegistryLock { FlagRegistry& fr_; }; -void DestroyRetiredFlag(CommandLineFlag& flag); - } // namespace +CommandLineFlag* FlagRegistry::FindFlag(absl::string_view name) { + if (finalized_flags_.load(std::memory_order_acquire)) { + // We could save some gcus here if we make `Name()` be non-virtual. + // We could move the `const char*` name to the base class. + auto it = std::partition_point( + flat_flags_.begin(), flat_flags_.end(), + [=](CommandLineFlag* f) { return f->Name() < name; }); + if (it != flat_flags_.end() && (*it)->Name() == name) return *it; + } + + FlagRegistryLock frl(*this); + auto it = flags_.find(name); + return it != flags_.end() ? it->second : nullptr; +} + void FlagRegistry::RegisterFlag(CommandLineFlag& flag) { FlagRegistryLock registry_lock(*this); + std::pair ins = flags_.insert(FlagMap::value_type(flag.Name(), &flag)); if (ins.second == false) { // means the name was already in the map @@ -143,8 +133,6 @@ void FlagRegistry::RegisterFlag(CommandLineFlag& flag) { old_flag.Filename(), "' and '", flag.Filename(), "'."), true); } else if (old_flag.IsRetired()) { - // Retired flag can just be deleted. - DestroyRetiredFlag(flag); return; } else if (old_flag.Filename() != flag.Filename()) { flags_internal::ReportUsageError( @@ -155,7 +143,7 @@ void FlagRegistry::RegisterFlag(CommandLineFlag& flag) { } else { flags_internal::ReportUsageError( absl::StrCat( - "Something wrong with flag '", flag.Name(), "' in file '", + "Something is wrong with flag '", flag.Name(), "' in file '", flag.Filename(), "'. One possibility: file '", flag.Filename(), "' is being linked both statically and dynamically into this " "executable. e.g. some files listed as srcs to a test and also " @@ -174,18 +162,15 @@ FlagRegistry& FlagRegistry::GlobalRegistry() { // -------------------------------------------------------------------- -void ForEachFlagUnlocked(std::function visitor) { - FlagRegistry& registry = FlagRegistry::GlobalRegistry(); - for (FlagRegistry::FlagConstIterator i = registry.flags_.begin(); - i != registry.flags_.end(); ++i) { - visitor(*i->second); - } -} - void ForEachFlag(std::function visitor) { FlagRegistry& registry = FlagRegistry::GlobalRegistry(); + + if (registry.finalized_flags_.load(std::memory_order_acquire)) { + for (const auto& i : registry.flat_flags_) visitor(*i); + } + FlagRegistryLock frl(registry); - ForEachFlagUnlocked(visitor); + for (const auto& i : registry.flags_) visitor(*i.second); } // -------------------------------------------------------------------- @@ -195,6 +180,21 @@ bool RegisterCommandLineFlag(CommandLineFlag& flag) { return true; } +void FinalizeRegistry() { + auto& registry = FlagRegistry::GlobalRegistry(); + FlagRegistryLock frl(registry); + if (registry.finalized_flags_.load(std::memory_order_relaxed)) { + // Was already finalized. Ignore the second time. + return; + } + registry.flat_flags_.reserve(registry.flags_.size()); + for (const auto& f : registry.flags_) { + registry.flat_flags_.push_back(f.second); + } + registry.flags_.clear(); + registry.finalized_flags_.store(true, std::memory_order_release); +} + // -------------------------------------------------------------------- namespace { @@ -206,16 +206,34 @@ class RetiredFlagObj final : public CommandLineFlag { private: absl::string_view Name() const override { return name_; } - std::string Filename() const override { return "RETIRED"; } + std::string Filename() const override { + OnAccess(); + return "RETIRED"; + } FlagFastTypeId TypeId() const override { return type_id_; } - std::string Help() const override { return ""; } + std::string Help() const override { + OnAccess(); + return ""; + } bool IsRetired() const override { return true; } - bool IsSpecifiedOnCommandLine() const override { return false; } - std::string DefaultValue() const override { return ""; } - std::string CurrentValue() const override { return ""; } + bool IsSpecifiedOnCommandLine() const override { + OnAccess(); + return false; + } + std::string DefaultValue() const override { + OnAccess(); + return ""; + } + std::string CurrentValue() const override { + OnAccess(); + return ""; + } // Any input is valid - bool ValidateInputValue(absl::string_view) const override { return true; } + bool ValidateInputValue(absl::string_view) const override { + OnAccess(); + return true; + } std::unique_ptr SaveState() override { return nullptr; @@ -223,29 +241,32 @@ class RetiredFlagObj final : public CommandLineFlag { bool ParseFrom(absl::string_view, flags_internal::FlagSettingMode, flags_internal::ValueSource, std::string&) override { + OnAccess(); return false; } - void CheckDefaultValueParsingRoundtrip() const override {} + void CheckDefaultValueParsingRoundtrip() const override { OnAccess(); } - void Read(void*) const override {} + void Read(void*) const override { OnAccess(); } + + void OnAccess() const { + flags_internal::ReportUsageError( + absl::StrCat("Accessing retired flag '", name_, "'"), false); + } // Data members const char* const name_; const FlagFastTypeId type_id_; }; -void DestroyRetiredFlag(CommandLineFlag& flag) { - assert(flag.IsRetired()); - delete static_cast(&flag); -} - } // namespace -bool Retire(const char* name, FlagFastTypeId type_id) { - auto* flag = new flags_internal::RetiredFlagObj(name, type_id); +void Retire(const char* name, FlagFastTypeId type_id, char* buf) { + static_assert(sizeof(RetiredFlagObj) == kRetiredFlagObjSize, ""); + static_assert(alignof(RetiredFlagObj) == kRetiredFlagObjAlignment, ""); + auto* flag = ::new (static_cast(buf)) + flags_internal::RetiredFlagObj(name, type_id); FlagRegistry::GlobalRegistry().RegisterFlag(*flag); - return true; } // -------------------------------------------------------------------- @@ -299,9 +320,17 @@ CommandLineFlag* FindCommandLineFlag(absl::string_view name) { if (name.empty()) return nullptr; flags_internal::FlagRegistry& registry = flags_internal::FlagRegistry::GlobalRegistry(); - flags_internal::FlagRegistryLock frl(registry); + return registry.FindFlag(name); +} - return registry.FindFlagLocked(name); +// -------------------------------------------------------------------- + +absl::flat_hash_map GetAllFlags() { + absl::flat_hash_map res; + flags_internal::ForEachFlag([&](CommandLineFlag& flag) { + if (!flag.IsRetired()) res.insert({flag.Name(), &flag}); + }); + return res; } ABSL_NAMESPACE_END diff --git a/third_party/abseil_cpp/absl/flags/reflection.h b/third_party/abseil_cpp/absl/flags/reflection.h index 045f9784e..e6baf5de4 100644 --- a/third_party/abseil_cpp/absl/flags/reflection.h +++ b/third_party/abseil_cpp/absl/flags/reflection.h @@ -26,6 +26,7 @@ #include #include "absl/base/config.h" +#include "absl/container/flat_hash_map.h" #include "absl/flags/commandlineflag.h" #include "absl/flags/internal/commandlineflag.h" @@ -40,7 +41,11 @@ class FlagSaverImpl; // Returns the reflection handle of an Abseil flag of the specified name, or // `nullptr` if not found. This function will emit a warning if the name of a // 'retired' flag is specified. -CommandLineFlag* FindCommandLineFlag(absl::string_view name); +absl::CommandLineFlag* FindCommandLineFlag(absl::string_view name); + +// Returns current state of the Flags registry in a form of mapping from flag +// name to a flag reflection handle. +absl::flat_hash_map GetAllFlags(); //------------------------------------------------------------------------------ // FlagSaver @@ -59,7 +64,7 @@ CommandLineFlag* FindCommandLineFlag(absl::string_view name); // void MyFunc() { // absl::FlagSaver fs; // ... -// absl::SetFlag(FLAGS_myFlag, otherValue); +// absl::SetFlag(&FLAGS_myFlag, otherValue); // ... // } // scope of FlagSaver left, flags return to previous state // diff --git a/third_party/abseil_cpp/absl/flags/reflection_test.cc b/third_party/abseil_cpp/absl/flags/reflection_test.cc index 9781e597d..4c8090095 100644 --- a/third_party/abseil_cpp/absl/flags/reflection_test.cc +++ b/third_party/abseil_cpp/absl/flags/reflection_test.cc @@ -18,11 +18,15 @@ #include #include +#include "gmock/gmock.h" #include "gtest/gtest.h" +#include "absl/flags/declare.h" #include "absl/flags/flag.h" #include "absl/flags/internal/commandlineflag.h" #include "absl/flags/marshalling.h" #include "absl/memory/memory.h" +#include "absl/strings/str_cat.h" +#include "absl/strings/str_split.h" ABSL_FLAG(int, int_flag, 1, "int_flag help"); ABSL_FLAG(std::string, string_flag, "dflt", "string_flag help"); @@ -57,4 +61,207 @@ TEST_F(ReflectionTest, TestFindCommandLineFlag) { EXPECT_NE(handle, nullptr); } +// -------------------------------------------------------------------- + +TEST_F(ReflectionTest, TestGetAllFlags) { + auto all_flags = absl::GetAllFlags(); + EXPECT_NE(all_flags.find("int_flag"), all_flags.end()); + EXPECT_EQ(all_flags.find("bool_retired_flag"), all_flags.end()); + EXPECT_EQ(all_flags.find("some_undefined_flag"), all_flags.end()); + + std::vector flag_names_first_attempt; + auto all_flags_1 = absl::GetAllFlags(); + for (auto f : all_flags_1) { + flag_names_first_attempt.push_back(f.first); + } + + std::vector flag_names_second_attempt; + auto all_flags_2 = absl::GetAllFlags(); + for (auto f : all_flags_2) { + flag_names_second_attempt.push_back(f.first); + } + + EXPECT_THAT(flag_names_first_attempt, + ::testing::UnorderedElementsAreArray(flag_names_second_attempt)); +} + +// -------------------------------------------------------------------- + +struct CustomUDT { + CustomUDT() : a(1), b(1) {} + CustomUDT(int a_, int b_) : a(a_), b(b_) {} + + friend bool operator==(const CustomUDT& f1, const CustomUDT& f2) { + return f1.a == f2.a && f1.b == f2.b; + } + + int a; + int b; +}; +bool AbslParseFlag(absl::string_view in, CustomUDT* f, std::string*) { + std::vector parts = + absl::StrSplit(in, ':', absl::SkipWhitespace()); + + if (parts.size() != 2) return false; + + if (!absl::SimpleAtoi(parts[0], &f->a)) return false; + + if (!absl::SimpleAtoi(parts[1], &f->b)) return false; + + return true; +} +std::string AbslUnparseFlag(const CustomUDT& f) { + return absl::StrCat(f.a, ":", f.b); +} + +} // namespace + +// -------------------------------------------------------------------- + +ABSL_FLAG(bool, test_flag_01, true, ""); +ABSL_FLAG(int, test_flag_02, 1234, ""); +ABSL_FLAG(int16_t, test_flag_03, -34, ""); +ABSL_FLAG(uint16_t, test_flag_04, 189, ""); +ABSL_FLAG(int32_t, test_flag_05, 10765, ""); +ABSL_FLAG(uint32_t, test_flag_06, 40000, ""); +ABSL_FLAG(int64_t, test_flag_07, -1234567, ""); +ABSL_FLAG(uint64_t, test_flag_08, 9876543, ""); +ABSL_FLAG(double, test_flag_09, -9.876e-50, ""); +ABSL_FLAG(float, test_flag_10, 1.234e12f, ""); +ABSL_FLAG(std::string, test_flag_11, "", ""); +ABSL_FLAG(absl::Duration, test_flag_12, absl::Minutes(10), ""); +static int counter = 0; +ABSL_FLAG(int, test_flag_13, 200, "").OnUpdate([]() { counter++; }); +ABSL_FLAG(CustomUDT, test_flag_14, {}, ""); + +namespace { + +TEST_F(ReflectionTest, TestFlagSaverInScope) { + { + absl::FlagSaver s; + counter = 0; + absl::SetFlag(&FLAGS_test_flag_01, false); + absl::SetFlag(&FLAGS_test_flag_02, -1021); + absl::SetFlag(&FLAGS_test_flag_03, 6009); + absl::SetFlag(&FLAGS_test_flag_04, 44); + absl::SetFlag(&FLAGS_test_flag_05, +800); + absl::SetFlag(&FLAGS_test_flag_06, -40978756); + absl::SetFlag(&FLAGS_test_flag_07, 23405); + absl::SetFlag(&FLAGS_test_flag_08, 975310); + absl::SetFlag(&FLAGS_test_flag_09, 1.00001); + absl::SetFlag(&FLAGS_test_flag_10, -3.54f); + absl::SetFlag(&FLAGS_test_flag_11, "asdf"); + absl::SetFlag(&FLAGS_test_flag_12, absl::Hours(20)); + absl::SetFlag(&FLAGS_test_flag_13, 4); + absl::SetFlag(&FLAGS_test_flag_14, CustomUDT{-1, -2}); + } + + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_01), true); + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_02), 1234); + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_03), -34); + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_04), 189); + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_05), 10765); + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_06), 40000); + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_07), -1234567); + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_08), 9876543); + EXPECT_NEAR(absl::GetFlag(FLAGS_test_flag_09), -9.876e-50, 1e-55); + EXPECT_NEAR(absl::GetFlag(FLAGS_test_flag_10), 1.234e12f, 1e5f); + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_11), ""); + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_12), absl::Minutes(10)); + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_13), 200); + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_14), CustomUDT{}); + EXPECT_EQ(counter, 2); +} + +// -------------------------------------------------------------------- + +TEST_F(ReflectionTest, TestFlagSaverVsUpdateViaReflection) { + { + absl::FlagSaver s; + counter = 0; + std::string error; + EXPECT_TRUE( + absl::FindCommandLineFlag("test_flag_01")->ParseFrom("false", &error)) + << error; + EXPECT_TRUE( + absl::FindCommandLineFlag("test_flag_02")->ParseFrom("-4536", &error)) + << error; + EXPECT_TRUE( + absl::FindCommandLineFlag("test_flag_03")->ParseFrom("111", &error)) + << error; + EXPECT_TRUE( + absl::FindCommandLineFlag("test_flag_04")->ParseFrom("909", &error)) + << error; + EXPECT_TRUE( + absl::FindCommandLineFlag("test_flag_05")->ParseFrom("-2004", &error)) + << error; + EXPECT_TRUE( + absl::FindCommandLineFlag("test_flag_06")->ParseFrom("1000023", &error)) + << error; + EXPECT_TRUE( + absl::FindCommandLineFlag("test_flag_07")->ParseFrom("69305", &error)) + << error; + EXPECT_TRUE(absl::FindCommandLineFlag("test_flag_08") + ->ParseFrom("1000000001", &error)) + << error; + EXPECT_TRUE( + absl::FindCommandLineFlag("test_flag_09")->ParseFrom("2.09021", &error)) + << error; + EXPECT_TRUE( + absl::FindCommandLineFlag("test_flag_10")->ParseFrom("-33.1", &error)) + << error; + EXPECT_TRUE( + absl::FindCommandLineFlag("test_flag_11")->ParseFrom("ADD_FOO", &error)) + << error; + EXPECT_TRUE(absl::FindCommandLineFlag("test_flag_12") + ->ParseFrom("3h11m16s", &error)) + << error; + EXPECT_TRUE( + absl::FindCommandLineFlag("test_flag_13")->ParseFrom("0", &error)) + << error; + EXPECT_TRUE( + absl::FindCommandLineFlag("test_flag_14")->ParseFrom("10:1", &error)) + << error; + } + + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_01), true); + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_02), 1234); + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_03), -34); + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_04), 189); + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_05), 10765); + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_06), 40000); + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_07), -1234567); + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_08), 9876543); + EXPECT_NEAR(absl::GetFlag(FLAGS_test_flag_09), -9.876e-50, 1e-55); + EXPECT_NEAR(absl::GetFlag(FLAGS_test_flag_10), 1.234e12f, 1e5f); + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_11), ""); + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_12), absl::Minutes(10)); + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_13), 200); + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_14), CustomUDT{}); + EXPECT_EQ(counter, 2); +} + +// -------------------------------------------------------------------- + +TEST_F(ReflectionTest, TestMultipleFlagSaversInEnclosedScopes) { + { + absl::FlagSaver s; + absl::SetFlag(&FLAGS_test_flag_08, 10); + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_08), 10); + { + absl::FlagSaver s; + absl::SetFlag(&FLAGS_test_flag_08, 20); + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_08), 20); + { + absl::FlagSaver s; + absl::SetFlag(&FLAGS_test_flag_08, -200); + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_08), -200); + } + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_08), 20); + } + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_08), 10); + } + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_08), 9876543); +} + } // namespace diff --git a/third_party/abseil_cpp/absl/functional/BUILD.bazel b/third_party/abseil_cpp/absl/functional/BUILD.bazel index 432546ce0..ebd9b99b7 100644 --- a/third_party/abseil_cpp/absl/functional/BUILD.bazel +++ b/third_party/abseil_cpp/absl/functional/BUILD.bazel @@ -24,7 +24,7 @@ load( package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) cc_library( name = "bind_front", diff --git a/third_party/abseil_cpp/absl/functional/function_ref.h b/third_party/abseil_cpp/absl/functional/function_ref.h index 370acc55b..6e03ac2e0 100644 --- a/third_party/abseil_cpp/absl/functional/function_ref.h +++ b/third_party/abseil_cpp/absl/functional/function_ref.h @@ -90,7 +90,7 @@ class FunctionRef { // Used to disable constructors for objects that are not compatible with the // signature of this FunctionRef. template > + typename FR = absl::base_internal::invoke_result_t> using EnableIfCompatible = typename std::enable_if::value || std::is_convertible::value>::type; diff --git a/third_party/abseil_cpp/absl/functional/internal/front_binder.h b/third_party/abseil_cpp/absl/functional/internal/front_binder.h index a4d95da44..45f52de73 100644 --- a/third_party/abseil_cpp/absl/functional/internal/front_binder.h +++ b/third_party/abseil_cpp/absl/functional/internal/front_binder.h @@ -33,7 +33,7 @@ namespace functional_internal { // Invoke the method, expanding the tuple of bound arguments. template R Apply(Tuple&& bound, absl::index_sequence, Args&&... free) { - return base_internal::Invoke( + return base_internal::invoke( absl::forward(bound).template get()..., absl::forward(free)...); } @@ -50,22 +50,22 @@ class FrontBinder { constexpr explicit FrontBinder(absl::in_place_t, Ts&&... ts) : bound_args_(absl::forward(ts)...) {} - template > + template > R operator()(FreeArgs&&... free_args) & { return functional_internal::Apply(bound_args_, Idx(), absl::forward(free_args)...); } template > + class R = base_internal::invoke_result_t< + const F&, const BoundArgs&..., FreeArgs&&...>> R operator()(FreeArgs&&... free_args) const& { return functional_internal::Apply(bound_args_, Idx(), absl::forward(free_args)...); } - template > R operator()(FreeArgs&&... free_args) && { // This overload is called when *this is an rvalue. If some of the bound @@ -75,8 +75,8 @@ class FrontBinder { } template > + class R = base_internal::invoke_result_t< + const F&&, const BoundArgs&&..., FreeArgs&&...>> R operator()(FreeArgs&&... free_args) const&& { // This overload is called when *this is an rvalue. If some of the bound // arguments are stored by value or rvalue reference, we move them. diff --git a/third_party/abseil_cpp/absl/functional/internal/function_ref.h b/third_party/abseil_cpp/absl/functional/internal/function_ref.h index d1575054e..b5bb8b430 100644 --- a/third_party/abseil_cpp/absl/functional/internal/function_ref.h +++ b/third_party/abseil_cpp/absl/functional/internal/function_ref.h @@ -71,14 +71,14 @@ template R InvokeObject(VoidPtr ptr, typename ForwardT::type... args) { auto o = static_cast(ptr.obj); return static_cast( - absl::base_internal::Invoke(*o, std::forward(args)...)); + absl::base_internal::invoke(*o, std::forward(args)...)); } template R InvokeFunction(VoidPtr ptr, typename ForwardT::type... args) { auto f = reinterpret_cast(ptr.fun); return static_cast( - absl::base_internal::Invoke(f, std::forward(args)...)); + absl::base_internal::invoke(f, std::forward(args)...)); } template diff --git a/third_party/abseil_cpp/absl/hash/BUILD.bazel b/third_party/abseil_cpp/absl/hash/BUILD.bazel index 6c77f1a13..5b1e2d01f 100644 --- a/third_party/abseil_cpp/absl/hash/BUILD.bazel +++ b/third_party/abseil_cpp/absl/hash/BUILD.bazel @@ -24,7 +24,7 @@ load( package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) cc_library( name = "hash", diff --git a/third_party/abseil_cpp/absl/hash/hash.h b/third_party/abseil_cpp/absl/hash/hash.h index d7386f6ce..5de132cac 100644 --- a/third_party/abseil_cpp/absl/hash/hash.h +++ b/third_party/abseil_cpp/absl/hash/hash.h @@ -88,7 +88,6 @@ ABSL_NAMESPACE_BEGIN // * T is an arithmetic or pointer type // * T defines an overload for `AbslHashValue(H, const T&)` for an arbitrary // hash state `H`. -// - T defines a specialization of `HASH_NAMESPACE::hash` // - T defines a specialization of `std::hash` // // `absl::Hash` intrinsically supports the following types: @@ -128,8 +127,6 @@ ABSL_NAMESPACE_BEGIN // * Natively supported types out of the box (see above) // * Types for which an `AbslHashValue()` overload is provided (such as // user-defined types). See "Adding Type Support to `absl::Hash`" below. -// * Types which define a `HASH_NAMESPACE::hash` specialization (aka -// `__gnu_cxx::hash` for gcc/Clang or `stdext::hash` for MSVC) // * Types which define a `std::hash` specialization // // The fallback to legacy hash functions exists mainly for backwards diff --git a/third_party/abseil_cpp/absl/hash/hash_test.cc b/third_party/abseil_cpp/absl/hash/hash_test.cc index 39ba24a85..1d2e6cf0d 100644 --- a/third_party/abseil_cpp/absl/hash/hash_test.cc +++ b/third_party/abseil_cpp/absl/hash/hash_test.cc @@ -82,8 +82,8 @@ TYPED_TEST_P(HashValueIntTest, FastPath) { } REGISTER_TYPED_TEST_CASE_P(HashValueIntTest, BasicUsage, FastPath); -using IntTypes = testing::Types; +using IntTypes = testing::Types; INSTANTIATE_TYPED_TEST_CASE_P(My, HashValueIntTest, IntTypes); enum LegacyEnum { kValue1, kValue2, kValue3 }; @@ -819,8 +819,8 @@ TYPED_TEST_P(HashIntTest, BasicUsage) { } REGISTER_TYPED_TEST_CASE_P(HashIntTest, BasicUsage); -using IntTypes = testing::Types; +using IntTypes = testing::Types; INSTANTIATE_TYPED_TEST_CASE_P(My, HashIntTest, IntTypes); struct StructWithPadding { diff --git a/third_party/abseil_cpp/absl/hash/internal/city.cc b/third_party/abseil_cpp/absl/hash/internal/city.cc index e122c184b..5460134e5 100644 --- a/third_party/abseil_cpp/absl/hash/internal/city.cc +++ b/third_party/abseil_cpp/absl/hash/internal/city.cc @@ -200,10 +200,6 @@ static uint64_t Rotate(uint64_t val, int shift) { static uint64_t ShiftMix(uint64_t val) { return val ^ (val >> 47); } -static uint64_t HashLen16(uint64_t u, uint64_t v) { - return Hash128to64(uint128(u, v)); -} - static uint64_t HashLen16(uint64_t u, uint64_t v, uint64_t mul) { // Murmur-inspired hashing. uint64_t a = (u ^ v) * mul; @@ -214,6 +210,11 @@ static uint64_t HashLen16(uint64_t u, uint64_t v, uint64_t mul) { return b; } +static uint64_t HashLen16(uint64_t u, uint64_t v) { + const uint64_t kMul = 0x9ddfea08eb382d69ULL; + return HashLen16(u, v, kMul); +} + static uint64_t HashLen0to16(const char *s, size_t len) { if (len >= 8) { uint64_t mul = k2 + len * 2; @@ -253,9 +254,8 @@ static uint64_t HashLen17to32(const char *s, size_t len) { // Return a 16-byte hash for 48 bytes. Quick and dirty. // Callers do best to use "random-looking" values for a and b. -static std::pair WeakHashLen32WithSeeds(uint64_t w, uint64_t x, - uint64_t y, uint64_t z, - uint64_t a, uint64_t b) { +static std::pair WeakHashLen32WithSeeds( + uint64_t w, uint64_t x, uint64_t y, uint64_t z, uint64_t a, uint64_t b) { a += w; b = Rotate(b + a + z, 21); uint64_t c = a; @@ -266,8 +266,9 @@ static std::pair WeakHashLen32WithSeeds(uint64_t w, uint64_t } // Return a 16-byte hash for s[0] ... s[31], a, and b. Quick and dirty. -static std::pair WeakHashLen32WithSeeds(const char *s, uint64_t a, - uint64_t b) { +static std::pair WeakHashLen32WithSeeds(const char *s, + uint64_t a, + uint64_t b) { return WeakHashLen32WithSeeds(Fetch64(s), Fetch64(s + 8), Fetch64(s + 16), Fetch64(s + 24), a, b); } @@ -310,8 +311,10 @@ uint64_t CityHash64(const char *s, size_t len) { uint64_t x = Fetch64(s + len - 40); uint64_t y = Fetch64(s + len - 16) + Fetch64(s + len - 56); uint64_t z = HashLen16(Fetch64(s + len - 48) + len, Fetch64(s + len - 24)); - std::pair v = WeakHashLen32WithSeeds(s + len - 64, len, z); - std::pair w = WeakHashLen32WithSeeds(s + len - 32, y + k1, x); + std::pair v = + WeakHashLen32WithSeeds(s + len - 64, len, z); + std::pair w = + WeakHashLen32WithSeeds(s + len - 32, y + k1, x); x = x * k1 + Fetch64(s); // Decrease len to the nearest multiple of 64, and operate on 64-byte chunks. @@ -337,7 +340,7 @@ uint64_t CityHash64WithSeed(const char *s, size_t len, uint64_t seed) { } uint64_t CityHash64WithSeeds(const char *s, size_t len, uint64_t seed0, - uint64_t seed1) { + uint64_t seed1) { return HashLen16(CityHash64(s, len) - seed0, seed1); } diff --git a/third_party/abseil_cpp/absl/hash/internal/city.h b/third_party/abseil_cpp/absl/hash/internal/city.h index 161c7748e..393da0b95 100644 --- a/third_party/abseil_cpp/absl/hash/internal/city.h +++ b/third_party/abseil_cpp/absl/hash/internal/city.h @@ -56,11 +56,6 @@ namespace absl { ABSL_NAMESPACE_BEGIN namespace hash_internal { -typedef std::pair uint128; - -inline uint64_t Uint128Low64(const uint128 &x) { return x.first; } -inline uint64_t Uint128High64(const uint128 &x) { return x.second; } - // Hash function for a byte array. uint64_t CityHash64(const char *s, size_t len); @@ -71,24 +66,11 @@ uint64_t CityHash64WithSeed(const char *s, size_t len, uint64_t seed); // Hash function for a byte array. For convenience, two seeds are also // hashed into the result. uint64_t CityHash64WithSeeds(const char *s, size_t len, uint64_t seed0, - uint64_t seed1); + uint64_t seed1); // Hash function for a byte array. Most useful in 32-bit binaries. uint32_t CityHash32(const char *s, size_t len); -// Hash 128 input bits down to 64 bits of output. -// This is intended to be a reasonably good hash function. -inline uint64_t Hash128to64(const uint128 &x) { - // Murmur-inspired hashing. - const uint64_t kMul = 0x9ddfea08eb382d69ULL; - uint64_t a = (Uint128Low64(x) ^ Uint128High64(x)) * kMul; - a ^= (a >> 47); - uint64_t b = (Uint128High64(x) ^ a) * kMul; - b ^= (b >> 47); - b *= kMul; - return b; -} - } // namespace hash_internal ABSL_NAMESPACE_END } // namespace absl diff --git a/third_party/abseil_cpp/absl/hash/internal/hash.h b/third_party/abseil_cpp/absl/hash/internal/hash.h index 9e608f7c3..b0132da20 100644 --- a/third_party/abseil_cpp/absl/hash/internal/hash.h +++ b/third_party/abseil_cpp/absl/hash/internal/hash.h @@ -855,7 +855,14 @@ class ABSL_DLL CityHashState // On other platforms this is still going to be non-deterministic but most // probably per-build and not per-process. ABSL_ATTRIBUTE_ALWAYS_INLINE static uint64_t Seed() { +#if (!defined(__clang__) || __clang_major__ > 11) && \ + !defined(__apple_build_version__) + return static_cast(reinterpret_cast(&kSeed)); +#else + // Workaround the absence of + // https://github.com/llvm/llvm-project/commit/bc15bf66dcca76cc06fe71fca35b74dc4d521021. return static_cast(reinterpret_cast(kSeed)); +#endif } static const void* const kSeed; diff --git a/third_party/abseil_cpp/absl/memory/BUILD.bazel b/third_party/abseil_cpp/absl/memory/BUILD.bazel index 2ba9d7cb9..d2824a05a 100644 --- a/third_party/abseil_cpp/absl/memory/BUILD.bazel +++ b/third_party/abseil_cpp/absl/memory/BUILD.bazel @@ -24,7 +24,7 @@ load( package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) cc_library( name = "memory", diff --git a/third_party/abseil_cpp/absl/memory/memory.h b/third_party/abseil_cpp/absl/memory/memory.h index 513f7103a..2b5ff623d 100644 --- a/third_party/abseil_cpp/absl/memory/memory.h +++ b/third_party/abseil_cpp/absl/memory/memory.h @@ -420,6 +420,9 @@ struct pointer_traits { // // A C++11 compatible implementation of C++17's std::allocator_traits. // +#if __cplusplus >= 201703L +using std::allocator_traits; +#else // __cplusplus >= 201703L template struct allocator_traits { using allocator_type = Alloc; @@ -609,6 +612,7 @@ struct allocator_traits { return a; } }; +#endif // __cplusplus >= 201703L namespace memory_internal { diff --git a/third_party/abseil_cpp/absl/memory/memory_test.cc b/third_party/abseil_cpp/absl/memory/memory_test.cc index c47820e54..1990c7ba4 100644 --- a/third_party/abseil_cpp/absl/memory/memory_test.cc +++ b/third_party/abseil_cpp/absl/memory/memory_test.cc @@ -17,6 +17,7 @@ #include "absl/memory/memory.h" #include + #include #include #include @@ -36,10 +37,10 @@ using ::testing::Return; // been called, via the instance_count variable. class DestructorVerifier { public: - DestructorVerifier() { ++instance_count_; } + DestructorVerifier() { ++instance_count_; } DestructorVerifier(const DestructorVerifier&) = delete; DestructorVerifier& operator=(const DestructorVerifier&) = delete; - ~DestructorVerifier() { --instance_count_; } + ~DestructorVerifier() { --instance_count_; } // The number of instances of this class currently active. static int instance_count() { return instance_count_; } @@ -156,9 +157,7 @@ struct ArrayWatch { allocs().push_back(n); return ::operator new[](n); } - void operator delete[](void* p) { - return ::operator delete[](p); - } + void operator delete[](void* p) { return ::operator delete[](p); } static std::vector& allocs() { static auto& v = *new std::vector; return v; @@ -171,8 +170,7 @@ TEST(Make_UniqueTest, Array) { ArrayWatch::allocs().clear(); auto p = absl::make_unique(5); - static_assert(std::is_same>::value, + static_assert(std::is_same>::value, "unexpected return type"); EXPECT_THAT(ArrayWatch::allocs(), ElementsAre(5 * sizeof(ArrayWatch))); } @@ -181,7 +179,7 @@ TEST(Make_UniqueTest, NotAmbiguousWithStdMakeUnique) { // Ensure that absl::make_unique is not ambiguous with std::make_unique. // In C++14 mode, the below call to make_unique has both types as candidates. struct TakesStdType { - explicit TakesStdType(const std::vector &vec) {} + explicit TakesStdType(const std::vector& vec) {} }; using absl::make_unique; (void)make_unique(std::vector()); @@ -541,8 +539,8 @@ struct MinimalMockAllocator { MinimalMockAllocator(const MinimalMockAllocator& other) : value(other.value) {} using value_type = TestValue; - MOCK_METHOD1(allocate, value_type*(size_t)); - MOCK_METHOD2(deallocate, void(value_type*, size_t)); + MOCK_METHOD(value_type*, allocate, (size_t)); + MOCK_METHOD(void, deallocate, (value_type*, size_t)); int value; }; @@ -557,7 +555,7 @@ TEST(AllocatorTraits, FunctionsMinimal) { EXPECT_CALL(mock, deallocate(&x, 7)); EXPECT_EQ(&x, Traits::allocate(mock, 7)); - Traits::allocate(mock, 7, static_cast(&hint)); + static_cast(Traits::allocate(mock, 7, static_cast(&hint))); EXPECT_EQ(&x, Traits::allocate(mock, 7, static_cast(&hint))); Traits::deallocate(mock, &x, 7); @@ -579,13 +577,14 @@ struct FullMockAllocator { explicit FullMockAllocator(int value) : value(value) {} FullMockAllocator(const FullMockAllocator& other) : value(other.value) {} using value_type = TestValue; - MOCK_METHOD1(allocate, value_type*(size_t)); - MOCK_METHOD2(allocate, value_type*(size_t, const void*)); - MOCK_METHOD2(construct, void(value_type*, int*)); - MOCK_METHOD1(destroy, void(value_type*)); - MOCK_CONST_METHOD0(max_size, size_t()); - MOCK_CONST_METHOD0(select_on_container_copy_construction, - FullMockAllocator()); + MOCK_METHOD(value_type*, allocate, (size_t)); + MOCK_METHOD(value_type*, allocate, (size_t, const void*)); + MOCK_METHOD(void, construct, (value_type*, int*)); + MOCK_METHOD(void, destroy, (value_type*)); + MOCK_METHOD(size_t, max_size, (), + (const)); + MOCK_METHOD(FullMockAllocator, select_on_container_copy_construction, (), + (const)); int value; }; @@ -642,8 +641,7 @@ TEST(AllocatorNoThrowTest, CustomAllocator) { struct CanThrowAllocator { using is_nothrow = std::false_type; }; - struct UnspecifiedAllocator { - }; + struct UnspecifiedAllocator {}; EXPECT_TRUE(absl::allocator_is_nothrow::value); EXPECT_FALSE(absl::allocator_is_nothrow::value); EXPECT_FALSE(absl::allocator_is_nothrow::value); diff --git a/third_party/abseil_cpp/absl/meta/BUILD.bazel b/third_party/abseil_cpp/absl/meta/BUILD.bazel index c06d2d970..5585fcca7 100644 --- a/third_party/abseil_cpp/absl/meta/BUILD.bazel +++ b/third_party/abseil_cpp/absl/meta/BUILD.bazel @@ -24,7 +24,7 @@ load( package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) cc_library( name = "type_traits", diff --git a/third_party/abseil_cpp/absl/meta/type_traits.h b/third_party/abseil_cpp/absl/meta/type_traits.h index ba87d2f0e..d5cb5f3be 100644 --- a/third_party/abseil_cpp/absl/meta/type_traits.h +++ b/third_party/abseil_cpp/absl/meta/type_traits.h @@ -219,7 +219,7 @@ using void_t = typename type_traits_internal::VoidTImpl::type; // This metafunction is designed to be a drop-in replacement for the C++17 // `std::conjunction` metafunction. template -struct conjunction; +struct conjunction : std::true_type {}; template struct conjunction @@ -228,9 +228,6 @@ struct conjunction template struct conjunction : T {}; -template <> -struct conjunction<> : std::true_type {}; - // disjunction // // Performs a compile-time logical OR operation on the passed types (which @@ -241,7 +238,7 @@ struct conjunction<> : std::true_type {}; // This metafunction is designed to be a drop-in replacement for the C++17 // `std::disjunction` metafunction. template -struct disjunction; +struct disjunction : std::false_type {}; template struct disjunction : @@ -250,9 +247,6 @@ struct disjunction : template struct disjunction : T {}; -template <> -struct disjunction<> : std::false_type {}; - // negation // // Performs a compile-time logical NOT operation on the passed type (which @@ -616,8 +610,22 @@ using common_type_t = typename std::common_type::type; template using underlying_type_t = typename std::underlying_type::type; -template -using result_of_t = typename std::result_of::type; + +namespace type_traits_internal { + +#if __cplusplus >= 201703L +// std::result_of is deprecated (C++17) or removed (C++20) +template struct result_of; +template +struct result_of : std::invoke_result {}; +#else +template using result_of = std::result_of; +#endif + +} // namespace type_traits_internal + +template +using result_of_t = typename type_traits_internal::result_of::type; namespace type_traits_internal { // In MSVC we can't probe std::hash or stdext::hash because it triggers a diff --git a/third_party/abseil_cpp/absl/numeric/BUILD.bazel b/third_party/abseil_cpp/absl/numeric/BUILD.bazel index da3af4d0c..f808f5dab 100644 --- a/third_party/abseil_cpp/absl/numeric/BUILD.bazel +++ b/third_party/abseil_cpp/absl/numeric/BUILD.bazel @@ -22,7 +22,7 @@ load( package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) cc_library( name = "int128", diff --git a/third_party/abseil_cpp/absl/random/BUILD.bazel b/third_party/abseil_cpp/absl/random/BUILD.bazel index 694331c20..81e150e62 100644 --- a/third_party/abseil_cpp/absl/random/BUILD.bazel +++ b/third_party/abseil_cpp/absl/random/BUILD.bazel @@ -199,6 +199,7 @@ cc_test( cc_test( name = "distributions_test", size = "small", + timeout = "moderate", srcs = [ "distributions_test.cc", ], diff --git a/third_party/abseil_cpp/absl/random/CMakeLists.txt b/third_party/abseil_cpp/absl/random/CMakeLists.txt index ade9ea10f..7d7bec83d 100644 --- a/third_party/abseil_cpp/absl/random/CMakeLists.txt +++ b/third_party/abseil_cpp/absl/random/CMakeLists.txt @@ -1159,6 +1159,21 @@ absl_cc_library( absl::type_traits ) +# Internal-only target, do not depend on directly. +absl_cc_test( + NAME + random_internal_uniform_helper_test + SRCS + "internal/uniform_helper_test.cc" + COPTS + ${ABSL_TEST_COPTS} + LINKOPTS + ${ABSL_DEFAULT_LINKOPTS} + DEPS + absl::random_internal_uniform_helper + gtest_main +) + # Internal-only target, do not depend on directly. absl_cc_test( NAME diff --git a/third_party/abseil_cpp/absl/random/distributions.h b/third_party/abseil_cpp/absl/random/distributions.h index 6775c5d6f..31c79694e 100644 --- a/third_party/abseil_cpp/absl/random/distributions.h +++ b/third_party/abseil_cpp/absl/random/distributions.h @@ -128,7 +128,7 @@ Uniform(TagType tag, auto a = random_internal::uniform_lower_bound(tag, lo, hi); auto b = random_internal::uniform_upper_bound(tag, lo, hi); - if (a > b) return a; + if (!random_internal::is_uniform_range_valid(a, b)) return lo; return random_internal::DistributionCaller::template Call< distribution_t>(&urbg, tag, lo, hi); @@ -144,11 +144,11 @@ Uniform(URBG&& urbg, // NOLINT(runtime/references) R lo, R hi) { using gen_t = absl::decay_t; using distribution_t = random_internal::UniformDistributionWrapper; - constexpr auto tag = absl::IntervalClosedOpen; + auto a = random_internal::uniform_lower_bound(tag, lo, hi); auto b = random_internal::uniform_upper_bound(tag, lo, hi); - if (a > b) return a; + if (!random_internal::is_uniform_range_valid(a, b)) return lo; return random_internal::DistributionCaller::template Call< distribution_t>(&urbg, lo, hi); @@ -172,7 +172,7 @@ Uniform(TagType tag, auto a = random_internal::uniform_lower_bound(tag, lo, hi); auto b = random_internal::uniform_upper_bound(tag, lo, hi); - if (a > b) return a; + if (!random_internal::is_uniform_range_valid(a, b)) return lo; return random_internal::DistributionCaller::template Call< distribution_t>(&urbg, tag, static_cast(lo), @@ -196,7 +196,7 @@ Uniform(URBG&& urbg, // NOLINT(runtime/references) constexpr auto tag = absl::IntervalClosedOpen; auto a = random_internal::uniform_lower_bound(tag, lo, hi); auto b = random_internal::uniform_upper_bound(tag, lo, hi); - if (a > b) return a; + if (!random_internal::is_uniform_range_valid(a, b)) return lo; return random_internal::DistributionCaller::template Call< distribution_t>(&urbg, static_cast(lo), diff --git a/third_party/abseil_cpp/absl/random/distributions_test.cc b/third_party/abseil_cpp/absl/random/distributions_test.cc index 2d92723ad..5866a0725 100644 --- a/third_party/abseil_cpp/absl/random/distributions_test.cc +++ b/third_party/abseil_cpp/absl/random/distributions_test.cc @@ -29,94 +29,6 @@ constexpr int kSize = 400000; class RandomDistributionsTest : public testing::Test {}; -TEST_F(RandomDistributionsTest, UniformBoundFunctions) { - using absl::IntervalClosedClosed; - using absl::IntervalClosedOpen; - using absl::IntervalOpenClosed; - using absl::IntervalOpenOpen; - using absl::random_internal::uniform_lower_bound; - using absl::random_internal::uniform_upper_bound; - - // absl::uniform_int_distribution natively assumes IntervalClosedClosed - // absl::uniform_real_distribution natively assumes IntervalClosedOpen - - EXPECT_EQ(uniform_lower_bound(IntervalOpenClosed, 0, 100), 1); - EXPECT_EQ(uniform_lower_bound(IntervalOpenOpen, 0, 100), 1); - EXPECT_GT(uniform_lower_bound(IntervalOpenClosed, 0, 1.0), 0); - EXPECT_GT(uniform_lower_bound(IntervalOpenOpen, 0, 1.0), 0); - EXPECT_GT(uniform_lower_bound(IntervalOpenClosed, 0, 1.0), 0); - EXPECT_GT(uniform_lower_bound(IntervalOpenOpen, 0, 1.0), 0); - - EXPECT_EQ(uniform_lower_bound(IntervalClosedClosed, 0, 100), 0); - EXPECT_EQ(uniform_lower_bound(IntervalClosedOpen, 0, 100), 0); - EXPECT_EQ(uniform_lower_bound(IntervalClosedClosed, 0, 1.0), 0); - EXPECT_EQ(uniform_lower_bound(IntervalClosedOpen, 0, 1.0), 0); - EXPECT_EQ(uniform_lower_bound(IntervalClosedClosed, 0, 1.0), 0); - EXPECT_EQ(uniform_lower_bound(IntervalClosedOpen, 0, 1.0), 0); - - EXPECT_EQ(uniform_upper_bound(IntervalOpenOpen, 0, 100), 99); - EXPECT_EQ(uniform_upper_bound(IntervalClosedOpen, 0, 100), 99); - EXPECT_EQ(uniform_upper_bound(IntervalOpenOpen, 0, 1.0), 1.0); - EXPECT_EQ(uniform_upper_bound(IntervalClosedOpen, 0, 1.0), 1.0); - EXPECT_EQ(uniform_upper_bound(IntervalOpenOpen, 0, 1.0), 1.0); - EXPECT_EQ(uniform_upper_bound(IntervalClosedOpen, 0, 1.0), 1.0); - - EXPECT_EQ(uniform_upper_bound(IntervalOpenClosed, 0, 100), 100); - EXPECT_EQ(uniform_upper_bound(IntervalClosedClosed, 0, 100), 100); - EXPECT_GT(uniform_upper_bound(IntervalOpenClosed, 0, 1.0), 1.0); - EXPECT_GT(uniform_upper_bound(IntervalClosedClosed, 0, 1.0), 1.0); - EXPECT_GT(uniform_upper_bound(IntervalOpenClosed, 0, 1.0), 1.0); - EXPECT_GT(uniform_upper_bound(IntervalClosedClosed, 0, 1.0), 1.0); - - // Negative value tests - EXPECT_EQ(uniform_lower_bound(IntervalOpenClosed, -100, -1), -99); - EXPECT_EQ(uniform_lower_bound(IntervalOpenOpen, -100, -1), -99); - EXPECT_GT(uniform_lower_bound(IntervalOpenClosed, -2.0, -1.0), -2.0); - EXPECT_GT(uniform_lower_bound(IntervalOpenOpen, -2.0, -1.0), -2.0); - EXPECT_GT(uniform_lower_bound(IntervalOpenClosed, -2.0, -1.0), -2.0); - EXPECT_GT(uniform_lower_bound(IntervalOpenOpen, -2.0, -1.0), -2.0); - - EXPECT_EQ(uniform_lower_bound(IntervalClosedClosed, -100, -1), -100); - EXPECT_EQ(uniform_lower_bound(IntervalClosedOpen, -100, -1), -100); - EXPECT_EQ(uniform_lower_bound(IntervalClosedClosed, -2.0, -1.0), -2.0); - EXPECT_EQ(uniform_lower_bound(IntervalClosedOpen, -2.0, -1.0), -2.0); - EXPECT_EQ(uniform_lower_bound(IntervalClosedClosed, -2.0, -1.0), - -2.0); - EXPECT_EQ(uniform_lower_bound(IntervalClosedOpen, -2.0, -1.0), -2.0); - - EXPECT_EQ(uniform_upper_bound(IntervalOpenOpen, -100, -1), -2); - EXPECT_EQ(uniform_upper_bound(IntervalClosedOpen, -100, -1), -2); - EXPECT_EQ(uniform_upper_bound(IntervalOpenOpen, -2.0, -1.0), -1.0); - EXPECT_EQ(uniform_upper_bound(IntervalClosedOpen, -2.0, -1.0), -1.0); - EXPECT_EQ(uniform_upper_bound(IntervalOpenOpen, -2.0, -1.0), -1.0); - EXPECT_EQ(uniform_upper_bound(IntervalClosedOpen, -2.0, -1.0), -1.0); - - EXPECT_EQ(uniform_upper_bound(IntervalOpenClosed, -100, -1), -1); - EXPECT_EQ(uniform_upper_bound(IntervalClosedClosed, -100, -1), -1); - EXPECT_GT(uniform_upper_bound(IntervalOpenClosed, -2.0, -1.0), -1.0); - EXPECT_GT(uniform_upper_bound(IntervalClosedClosed, -2.0, -1.0), -1.0); - EXPECT_GT(uniform_upper_bound(IntervalOpenClosed, -2.0, -1.0), -1.0); - EXPECT_GT(uniform_upper_bound(IntervalClosedClosed, -2.0, -1.0), - -1.0); - - // Edge cases: the next value toward itself is itself. - const double d = 1.0; - const float f = 1.0; - EXPECT_EQ(uniform_lower_bound(IntervalOpenClosed, d, d), d); - EXPECT_EQ(uniform_lower_bound(IntervalOpenClosed, f, f), f); - - EXPECT_GT(uniform_lower_bound(IntervalOpenClosed, 1.0, 2.0), 1.0); - EXPECT_LT(uniform_lower_bound(IntervalOpenClosed, 1.0, +0.0), 1.0); - EXPECT_LT(uniform_lower_bound(IntervalOpenClosed, 1.0, -0.0), 1.0); - EXPECT_LT(uniform_lower_bound(IntervalOpenClosed, 1.0, -1.0), 1.0); - - EXPECT_EQ(uniform_upper_bound(IntervalClosedClosed, 0.0f, - std::numeric_limits::max()), - std::numeric_limits::max()); - EXPECT_EQ(uniform_upper_bound(IntervalClosedClosed, 0.0, - std::numeric_limits::max()), - std::numeric_limits::max()); -} struct Invalid {}; @@ -284,7 +196,9 @@ TEST_F(RandomDistributionsTest, UniformTypeInference) { // Properly promotes float. CheckArgsInferType(); +} +TEST_F(RandomDistributionsTest, UniformExamples) { // Examples. absl::InsecureBitGen gen; EXPECT_NE(1, absl::Uniform(gen, static_cast(0), 1.0f)); @@ -307,6 +221,58 @@ TEST_F(RandomDistributionsTest, UniformNoBounds) { absl::Uniform(gen); } +TEST_F(RandomDistributionsTest, UniformNonsenseRanges) { + // The ranges used in this test are undefined behavior. + // The results are arbitrary and subject to future changes. + absl::InsecureBitGen gen; + + // + EXPECT_EQ(0, absl::Uniform(gen, 0, 0)); + EXPECT_EQ(1, absl::Uniform(gen, 1, 0)); + EXPECT_EQ(0, absl::Uniform(absl::IntervalOpenOpen, gen, 0, 0)); + EXPECT_EQ(1, absl::Uniform(absl::IntervalOpenOpen, gen, 1, 0)); + + constexpr auto m = (std::numeric_limits::max)(); + + EXPECT_EQ(m, absl::Uniform(gen, m, m)); + EXPECT_EQ(m, absl::Uniform(gen, m, m - 1)); + EXPECT_EQ(m - 1, absl::Uniform(gen, m - 1, m)); + EXPECT_EQ(m, absl::Uniform(absl::IntervalOpenOpen, gen, m, m)); + EXPECT_EQ(m, absl::Uniform(absl::IntervalOpenOpen, gen, m, m - 1)); + EXPECT_EQ(m - 1, absl::Uniform(absl::IntervalOpenOpen, gen, m - 1, m)); + + // + EXPECT_EQ(0, absl::Uniform(gen, 0, 0)); + EXPECT_EQ(1, absl::Uniform(gen, 1, 0)); + EXPECT_EQ(0, absl::Uniform(absl::IntervalOpenOpen, gen, 0, 0)); + EXPECT_EQ(1, absl::Uniform(absl::IntervalOpenOpen, gen, 1, 0)); + + constexpr auto l = (std::numeric_limits::min)(); + constexpr auto r = (std::numeric_limits::max)(); + + EXPECT_EQ(l, absl::Uniform(gen, l, l)); + EXPECT_EQ(r, absl::Uniform(gen, r, r)); + EXPECT_EQ(r, absl::Uniform(gen, r, r - 1)); + EXPECT_EQ(r - 1, absl::Uniform(gen, r - 1, r)); + EXPECT_EQ(l, absl::Uniform(absl::IntervalOpenOpen, gen, l, l)); + EXPECT_EQ(r, absl::Uniform(absl::IntervalOpenOpen, gen, r, r)); + EXPECT_EQ(r, absl::Uniform(absl::IntervalOpenOpen, gen, r, r - 1)); + EXPECT_EQ(r - 1, absl::Uniform(absl::IntervalOpenOpen, gen, r - 1, r)); + + // + const double e = std::nextafter(1.0, 2.0); // 1 + epsilon + const double f = std::nextafter(1.0, 0.0); // 1 - epsilon + const double g = std::numeric_limits::denorm_min(); + + EXPECT_EQ(1.0, absl::Uniform(gen, 1.0, e)); + EXPECT_EQ(1.0, absl::Uniform(gen, 1.0, f)); + EXPECT_EQ(0.0, absl::Uniform(gen, 0.0, g)); + + EXPECT_EQ(e, absl::Uniform(absl::IntervalOpenOpen, gen, 1.0, e)); + EXPECT_EQ(f, absl::Uniform(absl::IntervalOpenOpen, gen, 1.0, f)); + EXPECT_EQ(g, absl::Uniform(absl::IntervalOpenOpen, gen, 0.0, g)); +} + // TODO(lar): Validate properties of non-default interval-semantics. TEST_F(RandomDistributionsTest, UniformReal) { std::vector values(kSize); diff --git a/third_party/abseil_cpp/absl/random/internal/BUILD.bazel b/third_party/abseil_cpp/absl/random/internal/BUILD.bazel index d81477ffb..8485e28b0 100644 --- a/third_party/abseil_cpp/absl/random/internal/BUILD.bazel +++ b/third_party/abseil_cpp/absl/random/internal/BUILD.bazel @@ -30,7 +30,7 @@ package(default_visibility = [ "//absl/random:__pkg__", ]) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) cc_library( name = "traits", @@ -59,7 +59,10 @@ cc_library( ], copts = ABSL_DEFAULT_COPTS, linkopts = ABSL_DEFAULT_LINKOPTS, - deps = ["//absl/base:config"], + deps = [ + "//absl/base:config", + "//absl/meta:type_traits", + ], ) cc_library( @@ -96,6 +99,7 @@ cc_library( copts = ABSL_DEFAULT_COPTS, linkopts = select({ "//absl:windows": [], + "//absl:wasm": [], "//conditions:default": ["-pthread"], }) + ABSL_DEFAULT_LINKOPTS, deps = [ @@ -319,10 +323,6 @@ cc_library( "//absl:windows": [], "//conditions:default": ["-Wno-pass-failed"], }), - # copts in RANDEN_HWAES_COPTS can make this target unusable as a module - # leading to a Clang diagnostic. Furthermore, it only has a private header - # anyway and thus there wouldn't be any gain from using it as a module. - features = ["-header_modules"], linkopts = ABSL_DEFAULT_LINKOPTS, deps = [ ":platform", @@ -716,3 +716,15 @@ cc_test( "@com_google_googletest//:gtest_main", ], ) + +cc_test( + name = "uniform_helper_test", + size = "small", + srcs = ["uniform_helper_test.cc"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":uniform_helper", + "@com_google_googletest//:gtest_main", + ], +) diff --git a/third_party/abseil_cpp/absl/random/internal/fast_uniform_bits.h b/third_party/abseil_cpp/absl/random/internal/fast_uniform_bits.h index f13c8729f..425aaf7d8 100644 --- a/third_party/abseil_cpp/absl/random/internal/fast_uniform_bits.h +++ b/third_party/abseil_cpp/absl/random/internal/fast_uniform_bits.h @@ -21,6 +21,7 @@ #include #include "absl/base/config.h" +#include "absl/meta/type_traits.h" namespace absl { ABSL_NAMESPACE_BEGIN @@ -38,28 +39,17 @@ constexpr bool IsPowerOfTwoOrZero(UIntType n) { template constexpr typename URBG::result_type RangeSize() { using result_type = typename URBG::result_type; + static_assert((URBG::max)() != (URBG::min)(), "URBG range cannot be 0."); return ((URBG::max)() == (std::numeric_limits::max)() && (URBG::min)() == std::numeric_limits::lowest()) ? result_type{0} - : (URBG::max)() - (URBG::min)() + result_type{1}; -} - -template -constexpr UIntType LargestPowerOfTwoLessThanOrEqualTo(UIntType n) { - return n < 2 ? n : 2 * LargestPowerOfTwoLessThanOrEqualTo(n / 2); -} - -// Given a URBG generating values in the closed interval [Lo, Hi], returns the -// largest power of two less than or equal to `Hi - Lo + 1`. -template -constexpr typename URBG::result_type PowerOfTwoSubRangeSize() { - return LargestPowerOfTwoLessThanOrEqualTo(RangeSize()); + : ((URBG::max)() - (URBG::min)() + result_type{1}); } // Computes the floor of the log. (i.e., std::floor(std::log2(N)); template constexpr UIntType IntegerLog2(UIntType n) { - return (n <= 1) ? 0 : 1 + IntegerLog2(n / 2); + return (n <= 1) ? 0 : 1 + IntegerLog2(n >> 1); } // Returns the number of bits of randomness returned through @@ -68,18 +58,23 @@ template constexpr size_t NumBits() { return RangeSize() == 0 ? std::numeric_limits::digits - : IntegerLog2(PowerOfTwoSubRangeSize()); + : IntegerLog2(RangeSize()); } // Given a shift value `n`, constructs a mask with exactly the low `n` bits set. // If `n == 0`, all bits are set. template -constexpr UIntType MaskFromShift(UIntType n) { +constexpr UIntType MaskFromShift(size_t n) { return ((n % std::numeric_limits::digits) == 0) ? ~UIntType{0} : (UIntType{1} << n) - UIntType{1}; } +// Tags used to dispatch FastUniformBits::generate to the simple or more complex +// entropy extraction algorithm. +struct SimplifiedLoopTag {}; +struct RejectionLoopTag {}; + // FastUniformBits implements a fast path to acquire uniform independent bits // from a type which conforms to the [rand.req.urbg] concept. // Parameterized by: @@ -107,50 +102,16 @@ class FastUniformBits { "Class-template FastUniformBits<> must be parameterized using " "an unsigned type."); - // PowerOfTwoVariate() generates a single random variate, always returning a - // value in the half-open interval `[0, PowerOfTwoSubRangeSize())`. If - // the URBG already generates values in a power-of-two range, the generator - // itself is used. Otherwise, we use rejection sampling on the largest - // possible power-of-two-sized subrange. - struct PowerOfTwoTag {}; - struct RejectionSamplingTag {}; - template - static typename URBG::result_type PowerOfTwoVariate( - URBG& g) { // NOLINT(runtime/references) - using tag = - typename std::conditional()), - PowerOfTwoTag, RejectionSamplingTag>::type; - return PowerOfTwoVariate(g, tag{}); - } - - template - static typename URBG::result_type PowerOfTwoVariate( - URBG& g, // NOLINT(runtime/references) - PowerOfTwoTag) { - return g() - (URBG::min)(); - } - - template - static typename URBG::result_type PowerOfTwoVariate( - URBG& g, // NOLINT(runtime/references) - RejectionSamplingTag) { - // Use rejection sampling to ensure uniformity across the range. - typename URBG::result_type u; - do { - u = g() - (URBG::min)(); - } while (u >= PowerOfTwoSubRangeSize()); - return u; - } - // Generate() generates a random value, dispatched on whether - // the underlying URBG must loop over multiple calls or not. + // the underlying URBG must use rejection sampling to generate a value, + // or whether a simplified loop will suffice. template result_type Generate(URBG& g, // NOLINT(runtime/references) - std::true_type /* avoid_looping */); + SimplifiedLoopTag); template result_type Generate(URBG& g, // NOLINT(runtime/references) - std::false_type /* avoid_looping */); + RejectionLoopTag); }; template @@ -162,31 +123,47 @@ FastUniformBits::operator()(URBG& g) { // NOLINT(runtime/references) // Y = (2 ^ kRange) - 1 static_assert((URBG::max)() > (URBG::min)(), "URBG::max and URBG::min may not be equal."); + + using tag = absl::conditional_t()), + SimplifiedLoopTag, RejectionLoopTag>; + return Generate(g, tag{}); +} + +template +template +typename FastUniformBits::result_type +FastUniformBits::Generate(URBG& g, // NOLINT(runtime/references) + SimplifiedLoopTag) { + // The simplified version of FastUniformBits works only on URBGs that have + // a range that is a power of 2. In this case we simply loop and shift without + // attempting to balance the bits across calls. + static_assert(IsPowerOfTwoOrZero(RangeSize()), + "incorrect Generate tag for URBG instance"); + + static constexpr size_t kResultBits = + std::numeric_limits::digits; + static constexpr size_t kUrbgBits = NumBits(); + static constexpr size_t kIters = + (kResultBits / kUrbgBits) + (kResultBits % kUrbgBits != 0); + static constexpr size_t kShift = (kIters == 1) ? 0 : kUrbgBits; + static constexpr auto kMin = (URBG::min)(); + + result_type r = static_cast(g() - kMin); + for (size_t n = 1; n < kIters; ++n) { + r = (r << kShift) + static_cast(g() - kMin); + } + return r; +} + +template +template +typename FastUniformBits::result_type +FastUniformBits::Generate(URBG& g, // NOLINT(runtime/references) + RejectionLoopTag) { + static_assert(!IsPowerOfTwoOrZero(RangeSize()), + "incorrect Generate tag for URBG instance"); using urbg_result_type = typename URBG::result_type; - constexpr urbg_result_type kRangeMask = - RangeSize() == 0 - ? (std::numeric_limits::max)() - : static_cast(PowerOfTwoSubRangeSize() - 1); - return Generate(g, std::integral_constant= (max)())>{}); -} -template -template -typename FastUniformBits::result_type -FastUniformBits::Generate(URBG& g, // NOLINT(runtime/references) - std::true_type /* avoid_looping */) { - // The width of the result_type is less than than the width of the random bits - // provided by URBG. Thus, generate a single value and then simply mask off - // the required bits. - - return PowerOfTwoVariate(g) & (max)(); -} - -template -template -typename FastUniformBits::result_type -FastUniformBits::Generate(URBG& g, // NOLINT(runtime/references) - std::false_type /* avoid_looping */) { // See [rand.adapt.ibits] for more details on the constants calculated below. // // It is preferable to use roughly the same number of bits from each generator @@ -199,21 +176,44 @@ FastUniformBits::Generate(URBG& g, // NOLINT(runtime/references) // `kSmallIters` and `kLargeIters` times respectively such // that // - // `kTotalWidth == kSmallIters * kSmallWidth - // + kLargeIters * kLargeWidth` + // `kResultBits == kSmallIters * kSmallBits + // + kLargeIters * kLargeBits` // - // where `kTotalWidth` is the total number of bits in `result_type`. + // where `kResultBits` is the total number of bits in `result_type`. // - constexpr size_t kTotalWidth = std::numeric_limits::digits; - constexpr size_t kUrbgWidth = NumBits(); - constexpr size_t kTotalIters = - kTotalWidth / kUrbgWidth + (kTotalWidth % kUrbgWidth != 0); - constexpr size_t kSmallWidth = kTotalWidth / kTotalIters; - constexpr size_t kLargeWidth = kSmallWidth + 1; + static constexpr size_t kResultBits = + std::numeric_limits::digits; // w + static constexpr urbg_result_type kUrbgRange = RangeSize(); // R + static constexpr size_t kUrbgBits = NumBits(); // m + + // compute the initial estimate of the bits used. + // [rand.adapt.ibits] 2 (c) + static constexpr size_t kA = // ceil(w/m) + (kResultBits / kUrbgBits) + ((kResultBits % kUrbgBits) != 0); // n' + + static constexpr size_t kABits = kResultBits / kA; // w0' + static constexpr urbg_result_type kARejection = + ((kUrbgRange >> kABits) << kABits); // y0' + + // refine the selection to reduce the rejection frequency. + static constexpr size_t kTotalIters = + ((kUrbgRange - kARejection) <= (kARejection / kA)) ? kA : (kA + 1); // n + + // [rand.adapt.ibits] 2 (b) + static constexpr size_t kSmallIters = + kTotalIters - (kResultBits % kTotalIters); // n0 + static constexpr size_t kSmallBits = kResultBits / kTotalIters; // w0 + static constexpr urbg_result_type kSmallRejection = + ((kUrbgRange >> kSmallBits) << kSmallBits); // y0 + + static constexpr size_t kLargeBits = kSmallBits + 1; // w0+1 + static constexpr urbg_result_type kLargeRejection = + ((kUrbgRange >> kLargeBits) << kLargeBits); // y1 + // - // Because `kLargeWidth == kSmallWidth + 1`, it follows that + // Because `kLargeBits == kSmallBits + 1`, it follows that // - // `kTotalWidth == kTotalIters * kSmallWidth + kLargeIters` + // `kResultBits == kSmallIters * kSmallBits + kLargeIters` // // and therefore // @@ -224,36 +224,40 @@ FastUniformBits::Generate(URBG& g, // NOLINT(runtime/references) // mentioned above, if the URBG width is a divisor of `kTotalWidth`, then // there would be no need for any large iterations (i.e., one loop would // suffice), and indeed, in this case, `kLargeIters` would be zero. - constexpr size_t kLargeIters = kTotalWidth % kSmallWidth; - constexpr size_t kSmallIters = - (kTotalWidth - (kLargeWidth * kLargeIters)) / kSmallWidth; + static_assert(kResultBits == kSmallIters * kSmallBits + + (kTotalIters - kSmallIters) * kLargeBits, + "Error in looping constant calculations."); - static_assert( - kTotalWidth == kSmallIters * kSmallWidth + kLargeIters * kLargeWidth, - "Error in looping constant calculations."); + // The small shift is essentially small bits, but due to the potential + // of generating a smaller result_type from a larger urbg type, the actual + // shift might be 0. + static constexpr size_t kSmallShift = kSmallBits % kResultBits; + static constexpr auto kSmallMask = + MaskFromShift(kSmallShift); + static constexpr size_t kLargeShift = kLargeBits % kResultBits; + static constexpr auto kLargeMask = + MaskFromShift(kLargeShift); + + static constexpr auto kMin = (URBG::min)(); result_type s = 0; - - constexpr size_t kSmallShift = kSmallWidth % kTotalWidth; - constexpr result_type kSmallMask = MaskFromShift(result_type{kSmallShift}); for (size_t n = 0; n < kSmallIters; ++n) { - s = (s << kSmallShift) + - (static_cast(PowerOfTwoVariate(g)) & kSmallMask); + urbg_result_type v; + do { + v = g() - kMin; + } while (v >= kSmallRejection); + + s = (s << kSmallShift) + static_cast(v & kSmallMask); } - constexpr size_t kLargeShift = kLargeWidth % kTotalWidth; - constexpr result_type kLargeMask = MaskFromShift(result_type{kLargeShift}); - for (size_t n = 0; n < kLargeIters; ++n) { - s = (s << kLargeShift) + - (static_cast(PowerOfTwoVariate(g)) & kLargeMask); + for (size_t n = kSmallIters; n < kTotalIters; ++n) { + urbg_result_type v; + do { + v = g() - kMin; + } while (v >= kLargeRejection); + + s = (s << kLargeShift) + static_cast(v & kLargeMask); } - - static_assert( - kLargeShift == kSmallShift + 1 || - (kLargeShift == 0 && - kSmallShift == std::numeric_limits::digits - 1), - "Error in looping constant calculations"); - return s; } diff --git a/third_party/abseil_cpp/absl/random/internal/fast_uniform_bits_test.cc b/third_party/abseil_cpp/absl/random/internal/fast_uniform_bits_test.cc index f5b837e58..cee702df8 100644 --- a/third_party/abseil_cpp/absl/random/internal/fast_uniform_bits_test.cc +++ b/third_party/abseil_cpp/absl/random/internal/fast_uniform_bits_test.cc @@ -34,8 +34,8 @@ TYPED_TEST(FastUniformBitsTypedTest, BasicTest) { using Limits = std::numeric_limits; using FastBits = FastUniformBits; - EXPECT_EQ(0, FastBits::min()); - EXPECT_EQ(Limits::max(), FastBits::max()); + EXPECT_EQ(0, (FastBits::min)()); + EXPECT_EQ((Limits::max)(), (FastBits::max)()); constexpr int kIters = 10000; std::random_device rd; @@ -43,8 +43,8 @@ TYPED_TEST(FastUniformBitsTypedTest, BasicTest) { FastBits fast; for (int i = 0; i < kIters; i++) { const auto v = fast(gen); - EXPECT_LE(v, FastBits::max()); - EXPECT_GE(v, FastBits::min()); + EXPECT_LE(v, (FastBits::max)()); + EXPECT_GE(v, (FastBits::min)()); } } @@ -52,21 +52,26 @@ template struct FakeUrbg { using result_type = UIntType; + FakeUrbg() = default; + explicit FakeUrbg(bool r) : reject(r) {} + static constexpr result_type(max)() { return Hi; } static constexpr result_type(min)() { return Lo; } - result_type operator()() { return Val; } -}; + result_type operator()() { + // when reject is set, return Hi half the time. + return ((++calls % 2) == 1 && reject) ? Hi : Val; + } -using UrngOddbits = FakeUrbg; -using Urng4bits = FakeUrbg; -using Urng31bits = FakeUrbg; -using Urng32bits = FakeUrbg; + bool reject = false; + size_t calls = 0; +}; TEST(FastUniformBitsTest, IsPowerOfTwoOrZero) { EXPECT_TRUE(IsPowerOfTwoOrZero(uint8_t{0})); EXPECT_TRUE(IsPowerOfTwoOrZero(uint8_t{1})); EXPECT_TRUE(IsPowerOfTwoOrZero(uint8_t{2})); EXPECT_FALSE(IsPowerOfTwoOrZero(uint8_t{3})); + EXPECT_TRUE(IsPowerOfTwoOrZero(uint8_t{4})); EXPECT_TRUE(IsPowerOfTwoOrZero(uint8_t{16})); EXPECT_FALSE(IsPowerOfTwoOrZero(uint8_t{17})); EXPECT_FALSE(IsPowerOfTwoOrZero((std::numeric_limits::max)())); @@ -75,6 +80,7 @@ TEST(FastUniformBitsTest, IsPowerOfTwoOrZero) { EXPECT_TRUE(IsPowerOfTwoOrZero(uint16_t{1})); EXPECT_TRUE(IsPowerOfTwoOrZero(uint16_t{2})); EXPECT_FALSE(IsPowerOfTwoOrZero(uint16_t{3})); + EXPECT_TRUE(IsPowerOfTwoOrZero(uint16_t{4})); EXPECT_TRUE(IsPowerOfTwoOrZero(uint16_t{16})); EXPECT_FALSE(IsPowerOfTwoOrZero(uint16_t{17})); EXPECT_FALSE(IsPowerOfTwoOrZero((std::numeric_limits::max)())); @@ -91,181 +97,237 @@ TEST(FastUniformBitsTest, IsPowerOfTwoOrZero) { EXPECT_TRUE(IsPowerOfTwoOrZero(uint64_t{1})); EXPECT_TRUE(IsPowerOfTwoOrZero(uint64_t{2})); EXPECT_FALSE(IsPowerOfTwoOrZero(uint64_t{3})); + EXPECT_TRUE(IsPowerOfTwoOrZero(uint64_t{4})); EXPECT_TRUE(IsPowerOfTwoOrZero(uint64_t{64})); EXPECT_FALSE(IsPowerOfTwoOrZero(uint64_t{17})); EXPECT_FALSE(IsPowerOfTwoOrZero((std::numeric_limits::max)())); } TEST(FastUniformBitsTest, IntegerLog2) { - EXPECT_EQ(IntegerLog2(uint16_t{0}), 0); - EXPECT_EQ(IntegerLog2(uint16_t{1}), 0); - EXPECT_EQ(IntegerLog2(uint16_t{2}), 1); - EXPECT_EQ(IntegerLog2(uint16_t{3}), 1); - EXPECT_EQ(IntegerLog2(uint16_t{4}), 2); - EXPECT_EQ(IntegerLog2(uint16_t{5}), 2); - EXPECT_EQ(IntegerLog2(std::numeric_limits::max()), 63); + EXPECT_EQ(0, IntegerLog2(uint16_t{0})); + EXPECT_EQ(0, IntegerLog2(uint16_t{1})); + EXPECT_EQ(1, IntegerLog2(uint16_t{2})); + EXPECT_EQ(1, IntegerLog2(uint16_t{3})); + EXPECT_EQ(2, IntegerLog2(uint16_t{4})); + EXPECT_EQ(2, IntegerLog2(uint16_t{5})); + EXPECT_EQ(2, IntegerLog2(uint16_t{7})); + EXPECT_EQ(3, IntegerLog2(uint16_t{8})); + EXPECT_EQ(63, IntegerLog2((std::numeric_limits::max)())); } TEST(FastUniformBitsTest, RangeSize) { - EXPECT_EQ((RangeSize>()), 4); - EXPECT_EQ((RangeSize>()), 1); - EXPECT_EQ((RangeSize>()), 4); - EXPECT_EQ((RangeSize>()), 5); - EXPECT_EQ((RangeSize>()), 9); + EXPECT_EQ(2, (RangeSize>())); + EXPECT_EQ(3, (RangeSize>())); + EXPECT_EQ(4, (RangeSize>())); + // EXPECT_EQ(0, (RangeSize>())); + EXPECT_EQ(4, (RangeSize>())); + EXPECT_EQ(5, (RangeSize>())); + EXPECT_EQ(9, (RangeSize>())); EXPECT_EQ( - (RangeSize::max()>>()), - 0); + 0, (RangeSize< + FakeUrbg::max)()>>())); - EXPECT_EQ((RangeSize>()), 4); - EXPECT_EQ((RangeSize>()), 1); - EXPECT_EQ((RangeSize>()), 4); - EXPECT_EQ((RangeSize>()), 5); - EXPECT_EQ((RangeSize>()), 18); - EXPECT_EQ((RangeSize< - FakeUrbg::max()>>()), - 0); + EXPECT_EQ(4, (RangeSize>())); + EXPECT_EQ(4, (RangeSize>())); + EXPECT_EQ(5, (RangeSize>())); + EXPECT_EQ(18, (RangeSize>())); + EXPECT_EQ( + 0, (RangeSize< + FakeUrbg::max)()>>())); - EXPECT_EQ((RangeSize>()), 4); - EXPECT_EQ((RangeSize>()), 1); - EXPECT_EQ((RangeSize>()), 4); - EXPECT_EQ((RangeSize>()), 5); - EXPECT_EQ((RangeSize>()), 18); - EXPECT_EQ((RangeSize>()), 0); - EXPECT_EQ((RangeSize>()), 0xffffffff); - EXPECT_EQ((RangeSize>()), 0xfffffffe); - EXPECT_EQ((RangeSize>()), 0xfffffffd); - EXPECT_EQ((RangeSize< - FakeUrbg::max()>>()), - 0); + EXPECT_EQ(4, (RangeSize>())); + EXPECT_EQ(4, (RangeSize>())); + EXPECT_EQ(5, (RangeSize>())); + EXPECT_EQ(18, (RangeSize>())); + EXPECT_EQ(0, (RangeSize>())); + EXPECT_EQ(0xffffffff, (RangeSize>())); + EXPECT_EQ(0xfffffffe, (RangeSize>())); + EXPECT_EQ(0xfffffffd, (RangeSize>())); + EXPECT_EQ( + 0, (RangeSize< + FakeUrbg::max)()>>())); - EXPECT_EQ((RangeSize>()), 4); - EXPECT_EQ((RangeSize>()), 1); - EXPECT_EQ((RangeSize>()), 4); - EXPECT_EQ((RangeSize>()), 5); - EXPECT_EQ((RangeSize>()), 18); - EXPECT_EQ((RangeSize>()), 0x100000000ull); - EXPECT_EQ((RangeSize>()), 0xffffffffull); - EXPECT_EQ((RangeSize>()), 0xfffffffeull); - EXPECT_EQ((RangeSize>()), 0xfffffffdull); - EXPECT_EQ((RangeSize>()), 0ull); - EXPECT_EQ((RangeSize>()), - 0xffffffffffffffffull); - EXPECT_EQ((RangeSize>()), - 0xfffffffffffffffeull); - EXPECT_EQ((RangeSize>()), - 0xfffffffffffffffdull); - EXPECT_EQ((RangeSize< - FakeUrbg::max()>>()), - 0); + EXPECT_EQ(4, (RangeSize>())); + EXPECT_EQ(4, (RangeSize>())); + EXPECT_EQ(5, (RangeSize>())); + EXPECT_EQ(18, (RangeSize>())); + EXPECT_EQ(0x100000000, (RangeSize>())); + EXPECT_EQ(0xffffffff, (RangeSize>())); + EXPECT_EQ(0xfffffffe, (RangeSize>())); + EXPECT_EQ(0xfffffffd, (RangeSize>())); + EXPECT_EQ(0, (RangeSize>())); + EXPECT_EQ(0xffffffffffffffff, + (RangeSize>())); + EXPECT_EQ(0xfffffffffffffffe, + (RangeSize>())); + EXPECT_EQ(0xfffffffffffffffd, + (RangeSize>())); + EXPECT_EQ( + 0, (RangeSize< + FakeUrbg::max)()>>())); } -TEST(FastUniformBitsTest, PowerOfTwoSubRangeSize) { - EXPECT_EQ((PowerOfTwoSubRangeSize>()), 4); - EXPECT_EQ((PowerOfTwoSubRangeSize>()), 1); - EXPECT_EQ((PowerOfTwoSubRangeSize>()), 4); - EXPECT_EQ((PowerOfTwoSubRangeSize>()), 4); - EXPECT_EQ((PowerOfTwoSubRangeSize>()), 8); - EXPECT_EQ((PowerOfTwoSubRangeSize< - FakeUrbg::max()>>()), - 0); +// The constants need to be choosen so that an infinite rejection loop doesn't +// happen... +using Urng1_5bit = FakeUrbg; // ~1.5 bits (range 3) +using Urng4bits = FakeUrbg; +using Urng22bits = FakeUrbg; +using Urng31bits = FakeUrbg; // ~31.9 bits +using Urng32bits = FakeUrbg; +using Urng33bits = + FakeUrbg; // ~32.9 bits +using Urng63bits = FakeUrbg; // ~63.9 bits +using Urng64bits = + FakeUrbg; - EXPECT_EQ((PowerOfTwoSubRangeSize>()), 4); - EXPECT_EQ((PowerOfTwoSubRangeSize>()), 1); - EXPECT_EQ((PowerOfTwoSubRangeSize>()), 4); - EXPECT_EQ((PowerOfTwoSubRangeSize>()), 4); - EXPECT_EQ((PowerOfTwoSubRangeSize>()), 16); - EXPECT_EQ((PowerOfTwoSubRangeSize< - FakeUrbg::max()>>()), - 0); - - EXPECT_EQ((PowerOfTwoSubRangeSize>()), 4); - EXPECT_EQ((PowerOfTwoSubRangeSize>()), 1); - EXPECT_EQ((PowerOfTwoSubRangeSize>()), 4); - EXPECT_EQ((PowerOfTwoSubRangeSize>()), 4); - EXPECT_EQ((PowerOfTwoSubRangeSize>()), 16); - EXPECT_EQ((PowerOfTwoSubRangeSize>()), 0); - EXPECT_EQ((PowerOfTwoSubRangeSize>()), - 0x80000000); - EXPECT_EQ((PowerOfTwoSubRangeSize>()), - 0x80000000); - EXPECT_EQ((PowerOfTwoSubRangeSize< - FakeUrbg::max()>>()), - 0); - - EXPECT_EQ((PowerOfTwoSubRangeSize>()), 4); - EXPECT_EQ((PowerOfTwoSubRangeSize>()), 1); - EXPECT_EQ((PowerOfTwoSubRangeSize>()), 4); - EXPECT_EQ((PowerOfTwoSubRangeSize>()), 4); - EXPECT_EQ((PowerOfTwoSubRangeSize>()), 16); - EXPECT_EQ((PowerOfTwoSubRangeSize>()), - 0x100000000ull); - EXPECT_EQ((PowerOfTwoSubRangeSize>()), - 0x80000000ull); - EXPECT_EQ((PowerOfTwoSubRangeSize>()), - 0x80000000ull); - EXPECT_EQ( - (PowerOfTwoSubRangeSize>()), - 0); - EXPECT_EQ( - (PowerOfTwoSubRangeSize>()), - 0x8000000000000000ull); - EXPECT_EQ( - (PowerOfTwoSubRangeSize>()), - 0x8000000000000000ull); - EXPECT_EQ((PowerOfTwoSubRangeSize< - FakeUrbg::max()>>()), - 0); -} - -TEST(FastUniformBitsTest, Urng4_VariousOutputs) { +TEST(FastUniformBitsTest, OutputsUpTo32Bits) { // Tests that how values are composed; the single-bit deltas should be spread // across each invocation. + Urng1_5bit urng1_5; Urng4bits urng4; + Urng22bits urng22; Urng31bits urng31; Urng32bits urng32; + Urng33bits urng33; + Urng63bits urng63; + Urng64bits urng64; // 8-bit types { FastUniformBits fast8; + EXPECT_EQ(0x0, fast8(urng1_5)); EXPECT_EQ(0x11, fast8(urng4)); + EXPECT_EQ(0x20, fast8(urng22)); EXPECT_EQ(0x2, fast8(urng31)); EXPECT_EQ(0x1, fast8(urng32)); + EXPECT_EQ(0x32, fast8(urng33)); + EXPECT_EQ(0x77, fast8(urng63)); + EXPECT_EQ(0xa9, fast8(urng64)); } // 16-bit types { FastUniformBits fast16; + EXPECT_EQ(0x0, fast16(urng1_5)); EXPECT_EQ(0x1111, fast16(urng4)); - EXPECT_EQ(0xf02, fast16(urng31)); - EXPECT_EQ(0xf01, fast16(urng32)); + EXPECT_EQ(0x1020, fast16(urng22)); + EXPECT_EQ(0x0f02, fast16(urng31)); + EXPECT_EQ(0x0f01, fast16(urng32)); + EXPECT_EQ(0x1032, fast16(urng33)); + EXPECT_EQ(0x5677, fast16(urng63)); + EXPECT_EQ(0xcba9, fast16(urng64)); } // 32-bit types { FastUniformBits fast32; + EXPECT_EQ(0x0, fast32(urng1_5)); EXPECT_EQ(0x11111111, fast32(urng4)); + EXPECT_EQ(0x08301020, fast32(urng22)); EXPECT_EQ(0x0f020f02, fast32(urng31)); EXPECT_EQ(0x74010f01, fast32(urng32)); + EXPECT_EQ(0x13301032, fast32(urng33)); + EXPECT_EQ(0x12345677, fast32(urng63)); + EXPECT_EQ(0x0fedcba9, fast32(urng64)); + } +} + +TEST(FastUniformBitsTest, Outputs64Bits) { + // Tests that how values are composed; the single-bit deltas should be spread + // across each invocation. + FastUniformBits fast64; + + { + FakeUrbg urng0; + FakeUrbg urng1; + Urng4bits urng4; + Urng22bits urng22; + Urng31bits urng31; + Urng32bits urng32; + Urng33bits urng33; + Urng63bits urng63; + Urng64bits urng64; + + // somewhat degenerate cases only create a single bit. + EXPECT_EQ(0x0, fast64(urng0)); + EXPECT_EQ(64, urng0.calls); + EXPECT_EQ(0xffffffffffffffff, fast64(urng1)); + EXPECT_EQ(64, urng1.calls); + + // less degenerate cases. + EXPECT_EQ(0x1111111111111111, fast64(urng4)); + EXPECT_EQ(16, urng4.calls); + EXPECT_EQ(0x01020c0408301020, fast64(urng22)); + EXPECT_EQ(3, urng22.calls); + EXPECT_EQ(0x387811c3c0870f02, fast64(urng31)); + EXPECT_EQ(3, urng31.calls); + EXPECT_EQ(0x74010f0174010f01, fast64(urng32)); + EXPECT_EQ(2, urng32.calls); + EXPECT_EQ(0x808194040cb01032, fast64(urng33)); + EXPECT_EQ(3, urng33.calls); + EXPECT_EQ(0x1234567712345677, fast64(urng63)); + EXPECT_EQ(2, urng63.calls); + EXPECT_EQ(0x123456780fedcba9, fast64(urng64)); + EXPECT_EQ(1, urng64.calls); } - // 64-bit types + // The 1.5 bit case is somewhat interesting in that the algorithm refinement + // causes one extra small sample. Comments here reference the names used in + // [rand.adapt.ibits] that correspond to this case. { - FastUniformBits fast64; - EXPECT_EQ(0x1111111111111111, fast64(urng4)); + Urng1_5bit urng1_5; + + // w = 64 + // R = 3 + // m = 1 + // n' = 64 + // w0' = 1 + // y0' = 2 + // n = (1 <= 0) > 64 : 65 = 65 + // n0 = 65 - (64%65) = 1 + // n1 = 64 + // w0 = 0 + // y0 = 3 + // w1 = 1 + // y1 = 2 + EXPECT_EQ(0x0, fast64(urng1_5)); + EXPECT_EQ(65, urng1_5.calls); + } + + // Validate rejections for non-power-of-2 cases. + { + Urng1_5bit urng1_5(true); + Urng31bits urng31(true); + Urng33bits urng33(true); + Urng63bits urng63(true); + + // For 1.5 bits, there would be 1+2*64, except the first + // value was accepted and shifted off the end. + EXPECT_EQ(0, fast64(urng1_5)); + EXPECT_EQ(128, urng1_5.calls); EXPECT_EQ(0x387811c3c0870f02, fast64(urng31)); - EXPECT_EQ(0x74010f0174010f01, fast64(urng32)); + EXPECT_EQ(6, urng31.calls); + EXPECT_EQ(0x808194040cb01032, fast64(urng33)); + EXPECT_EQ(6, urng33.calls); + EXPECT_EQ(0x1234567712345677, fast64(urng63)); + EXPECT_EQ(4, urng63.calls); } } TEST(FastUniformBitsTest, URBG32bitRegression) { // Validate with deterministic 32-bit std::minstd_rand // to ensure that operator() performs as expected. + + EXPECT_EQ(2147483646, RangeSize()); + EXPECT_EQ(30, IntegerLog2(RangeSize())); + std::minstd_rand gen(1); FastUniformBits fast64; - EXPECT_EQ(0x05e47095f847c122ull, fast64(gen)); - EXPECT_EQ(0x8f82c1ba30b64d22ull, fast64(gen)); - EXPECT_EQ(0x3b971a3558155039ull, fast64(gen)); + EXPECT_EQ(0x05e47095f8791f45, fast64(gen)); + EXPECT_EQ(0x028be17e3c07c122, fast64(gen)); + EXPECT_EQ(0x55d2847c1626e8c2, fast64(gen)); } } // namespace diff --git a/third_party/abseil_cpp/absl/random/internal/gaussian_distribution_gentables.cc b/third_party/abseil_cpp/absl/random/internal/gaussian_distribution_gentables.cc index a2bf03940..a95333d55 100644 --- a/third_party/abseil_cpp/absl/random/internal/gaussian_distribution_gentables.cc +++ b/third_party/abseil_cpp/absl/random/internal/gaussian_distribution_gentables.cc @@ -111,12 +111,9 @@ void TableGenerator::Print(std::ostream* os) { "\n" "#include \"absl/random/gaussian_distribution.h\"\n" "\n" - // "namespace " and "absl" are broken apart so as not to conflict with - // script that adds the LTS inline namespace. - "namespace " - "absl {\n" - "namespace " - "random_internal {\n" + "namespace absl {\n" + "ABSL_NAMESPACE_BEGIN\n" + "namespace random_internal {\n" "\n" "const gaussian_distribution_base::Tables\n" " gaussian_distribution_base::zg_ = {\n"; @@ -125,10 +122,9 @@ void TableGenerator::Print(std::ostream* os) { FormatArrayContents(os, tables_.f); *os << "};\n" "\n" - "} // namespace " - "random_internal\n" - "} // namespace " - "absl\n" + "} // namespace random_internal\n" + "ABSL_NAMESPACE_END\n" + "} // namespace absl\n" "\n" "// clang-format on\n" "// END GENERATED CODE"; diff --git a/third_party/abseil_cpp/absl/random/internal/generate_real_test.cc b/third_party/abseil_cpp/absl/random/internal/generate_real_test.cc index aa02f0c2c..4bdc45348 100644 --- a/third_party/abseil_cpp/absl/random/internal/generate_real_test.cc +++ b/third_party/abseil_cpp/absl/random/internal/generate_real_test.cc @@ -419,8 +419,8 @@ TEST(GenerateRealTest, ExhaustiveFloat) { }; // Rely on RandU64ToFloat generating values from greatest to least when - // supplied with uint64_t values from greatest (0xfff...) to least (0x0). Thus, - // this algorithm stores the previous value, and if the new value is at + // supplied with uint64_t values from greatest (0xfff...) to least (0x0). + // Thus, this algorithm stores the previous value, and if the new value is at // greater than or equal to the previous value, then there is a collision in // the generation algorithm. // diff --git a/third_party/abseil_cpp/absl/random/internal/randen_detect.cc b/third_party/abseil_cpp/absl/random/internal/randen_detect.cc index d63230c25..bbe7b9653 100644 --- a/third_party/abseil_cpp/absl/random/internal/randen_detect.cc +++ b/third_party/abseil_cpp/absl/random/internal/randen_detect.cc @@ -1,13 +1,13 @@ // Copyright 2017 The Abseil Authors. // -// Licensed under the Apache License, Version 2.0 (the"License"); +// 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 // // https://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, +// distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. diff --git a/third_party/abseil_cpp/absl/random/internal/randen_hwaes.cc b/third_party/abseil_cpp/absl/random/internal/randen_hwaes.cc index 9966486fd..b5a3f90ae 100644 --- a/third_party/abseil_cpp/absl/random/internal/randen_hwaes.cc +++ b/third_party/abseil_cpp/absl/random/internal/randen_hwaes.cc @@ -150,6 +150,7 @@ struct alignas(16) u64x2 { #include // #defines vector __vector; in C++, this is bad form. #undef vector +#undef bool // Rely on the PowerPC AltiVec vector operations for accelerated AES // instructions. GCC support of the PPC vector types is described in: diff --git a/third_party/abseil_cpp/absl/random/internal/uniform_helper.h b/third_party/abseil_cpp/absl/random/internal/uniform_helper.h index 5b2afecb8..1243bc1c6 100644 --- a/third_party/abseil_cpp/absl/random/internal/uniform_helper.h +++ b/third_party/abseil_cpp/absl/random/internal/uniform_helper.h @@ -105,7 +105,7 @@ typename absl::enable_if_t< std::is_same>>::value, IntType> uniform_lower_bound(Tag, IntType a, IntType) { - return a + 1; + return a < (std::numeric_limits::max)() ? (a + 1) : a; } template @@ -136,7 +136,7 @@ typename absl::enable_if_t< std::is_same>>::value, IntType> uniform_upper_bound(Tag, IntType, IntType b) { - return b - 1; + return b > (std::numeric_limits::min)() ? (b - 1) : b; } template @@ -172,6 +172,40 @@ uniform_upper_bound(Tag, FloatType, FloatType b) { return std::nextafter(b, (std::numeric_limits::max)()); } +// Returns whether the bounds are valid for the underlying distribution. +// Inputs must have already been resolved via uniform_*_bound calls. +// +// The c++ standard constraints in [rand.dist.uni.int] are listed as: +// requires: lo <= hi. +// +// In the uniform_int_distrubtion, {lo, hi} are closed, closed. Thus: +// [0, 0] is legal. +// [0, 0) is not legal, but [0, 1) is, which translates to [0, 0]. +// (0, 1) is not legal, but (0, 2) is, which translates to [1, 1]. +// (0, 0] is not legal, but (0, 1] is, which translates to [1, 1]. +// +// The c++ standard constraints in [rand.dist.uni.real] are listed as: +// requires: lo <= hi. +// requires: (hi - lo) <= numeric_limits::max() +// +// In the uniform_real_distribution, {lo, hi} are closed, open, Thus: +// [0, 0] is legal, which is [0, 0+epsilon). +// [0, 0) is legal. +// (0, 0) is not legal, but (0-epsilon, 0+epsilon) is. +// (0, 0] is not legal, but (0, 0+epsilon] is. +// +template +absl::enable_if_t::value, bool> +is_uniform_range_valid(FloatType a, FloatType b) { + return a <= b && std::isfinite(b - a); +} + +template +absl::enable_if_t::value, bool> +is_uniform_range_valid(IntType a, IntType b) { + return a <= b; +} + // UniformDistribution selects either absl::uniform_int_distribution // or absl::uniform_real_distribution depending on the NumType parameter. template diff --git a/third_party/abseil_cpp/absl/random/internal/uniform_helper_test.cc b/third_party/abseil_cpp/absl/random/internal/uniform_helper_test.cc new file mode 100644 index 000000000..173c49b0b --- /dev/null +++ b/third_party/abseil_cpp/absl/random/internal/uniform_helper_test.cc @@ -0,0 +1,279 @@ +// Copyright 2017 The Abseil 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 +// +// https://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 "absl/random/internal/uniform_helper.h" + +#include +#include +#include + +#include "gtest/gtest.h" + +namespace { + +using absl::IntervalClosedClosedTag; +using absl::IntervalClosedOpenTag; +using absl::IntervalOpenClosedTag; +using absl::IntervalOpenOpenTag; +using absl::random_internal::uniform_inferred_return_t; +using absl::random_internal::uniform_lower_bound; +using absl::random_internal::uniform_upper_bound; + +class UniformHelperTest : public testing::Test {}; + +TEST_F(UniformHelperTest, UniformBoundFunctionsGeneral) { + constexpr IntervalClosedClosedTag IntervalClosedClosed; + constexpr IntervalClosedOpenTag IntervalClosedOpen; + constexpr IntervalOpenClosedTag IntervalOpenClosed; + constexpr IntervalOpenOpenTag IntervalOpenOpen; + + // absl::uniform_int_distribution natively assumes IntervalClosedClosed + // absl::uniform_real_distribution natively assumes IntervalClosedOpen + + EXPECT_EQ(uniform_lower_bound(IntervalOpenClosed, 0, 100), 1); + EXPECT_EQ(uniform_lower_bound(IntervalOpenOpen, 0, 100), 1); + EXPECT_GT(uniform_lower_bound(IntervalOpenClosed, 0, 1.0), 0); + EXPECT_GT(uniform_lower_bound(IntervalOpenOpen, 0, 1.0), 0); + EXPECT_GT(uniform_lower_bound(IntervalOpenClosed, 0, 1.0), 0); + EXPECT_GT(uniform_lower_bound(IntervalOpenOpen, 0, 1.0), 0); + + EXPECT_EQ(uniform_lower_bound(IntervalClosedClosed, 0, 100), 0); + EXPECT_EQ(uniform_lower_bound(IntervalClosedOpen, 0, 100), 0); + EXPECT_EQ(uniform_lower_bound(IntervalClosedClosed, 0, 1.0), 0); + EXPECT_EQ(uniform_lower_bound(IntervalClosedOpen, 0, 1.0), 0); + EXPECT_EQ(uniform_lower_bound(IntervalClosedClosed, 0, 1.0), 0); + EXPECT_EQ(uniform_lower_bound(IntervalClosedOpen, 0, 1.0), 0); + + EXPECT_EQ(uniform_upper_bound(IntervalOpenOpen, 0, 100), 99); + EXPECT_EQ(uniform_upper_bound(IntervalClosedOpen, 0, 100), 99); + EXPECT_EQ(uniform_upper_bound(IntervalOpenOpen, 0, 1.0), 1.0); + EXPECT_EQ(uniform_upper_bound(IntervalClosedOpen, 0, 1.0), 1.0); + EXPECT_EQ(uniform_upper_bound(IntervalOpenOpen, 0, 1.0), 1.0); + EXPECT_EQ(uniform_upper_bound(IntervalClosedOpen, 0, 1.0), 1.0); + + EXPECT_EQ(uniform_upper_bound(IntervalOpenClosed, 0, 100), 100); + EXPECT_EQ(uniform_upper_bound(IntervalClosedClosed, 0, 100), 100); + EXPECT_GT(uniform_upper_bound(IntervalOpenClosed, 0, 1.0), 1.0); + EXPECT_GT(uniform_upper_bound(IntervalClosedClosed, 0, 1.0), 1.0); + EXPECT_GT(uniform_upper_bound(IntervalOpenClosed, 0, 1.0), 1.0); + EXPECT_GT(uniform_upper_bound(IntervalClosedClosed, 0, 1.0), 1.0); + + // Negative value tests + EXPECT_EQ(uniform_lower_bound(IntervalOpenClosed, -100, -1), -99); + EXPECT_EQ(uniform_lower_bound(IntervalOpenOpen, -100, -1), -99); + EXPECT_GT(uniform_lower_bound(IntervalOpenClosed, -2.0, -1.0), -2.0); + EXPECT_GT(uniform_lower_bound(IntervalOpenOpen, -2.0, -1.0), -2.0); + EXPECT_GT(uniform_lower_bound(IntervalOpenClosed, -2.0, -1.0), -2.0); + EXPECT_GT(uniform_lower_bound(IntervalOpenOpen, -2.0, -1.0), -2.0); + + EXPECT_EQ(uniform_lower_bound(IntervalClosedClosed, -100, -1), -100); + EXPECT_EQ(uniform_lower_bound(IntervalClosedOpen, -100, -1), -100); + EXPECT_EQ(uniform_lower_bound(IntervalClosedClosed, -2.0, -1.0), -2.0); + EXPECT_EQ(uniform_lower_bound(IntervalClosedOpen, -2.0, -1.0), -2.0); + EXPECT_EQ(uniform_lower_bound(IntervalClosedClosed, -2.0, -1.0), + -2.0); + EXPECT_EQ(uniform_lower_bound(IntervalClosedOpen, -2.0, -1.0), -2.0); + + EXPECT_EQ(uniform_upper_bound(IntervalOpenOpen, -100, -1), -2); + EXPECT_EQ(uniform_upper_bound(IntervalClosedOpen, -100, -1), -2); + EXPECT_EQ(uniform_upper_bound(IntervalOpenOpen, -2.0, -1.0), -1.0); + EXPECT_EQ(uniform_upper_bound(IntervalClosedOpen, -2.0, -1.0), -1.0); + EXPECT_EQ(uniform_upper_bound(IntervalOpenOpen, -2.0, -1.0), -1.0); + EXPECT_EQ(uniform_upper_bound(IntervalClosedOpen, -2.0, -1.0), -1.0); + + EXPECT_EQ(uniform_upper_bound(IntervalOpenClosed, -100, -1), -1); + EXPECT_EQ(uniform_upper_bound(IntervalClosedClosed, -100, -1), -1); + EXPECT_GT(uniform_upper_bound(IntervalOpenClosed, -2.0, -1.0), -1.0); + EXPECT_GT(uniform_upper_bound(IntervalClosedClosed, -2.0, -1.0), -1.0); + EXPECT_GT(uniform_upper_bound(IntervalOpenClosed, -2.0, -1.0), -1.0); + EXPECT_GT(uniform_upper_bound(IntervalClosedClosed, -2.0, -1.0), + -1.0); + + EXPECT_GT(uniform_lower_bound(IntervalOpenClosed, 1.0, 2.0), 1.0); + EXPECT_LT(uniform_lower_bound(IntervalOpenClosed, 1.0, +0.0), 1.0); + EXPECT_LT(uniform_lower_bound(IntervalOpenClosed, 1.0, -0.0), 1.0); + EXPECT_LT(uniform_lower_bound(IntervalOpenClosed, 1.0, -1.0), 1.0); +} + +TEST_F(UniformHelperTest, UniformBoundFunctionsIntBounds) { + // Verifies the saturating nature of uniform_lower_bound and + // uniform_upper_bound + constexpr IntervalOpenOpenTag IntervalOpenOpen; + + // uint max. + constexpr auto m = (std::numeric_limits::max)(); + + EXPECT_EQ(1, uniform_lower_bound(IntervalOpenOpen, 0u, 0u)); + EXPECT_EQ(m, uniform_lower_bound(IntervalOpenOpen, m, m)); + EXPECT_EQ(m, uniform_lower_bound(IntervalOpenOpen, m - 1, m - 1)); + EXPECT_EQ(0, uniform_upper_bound(IntervalOpenOpen, 0u, 0u)); + EXPECT_EQ(m - 1, uniform_upper_bound(IntervalOpenOpen, m, m)); + + // int min/max + constexpr auto l = (std::numeric_limits::min)(); + constexpr auto r = (std::numeric_limits::max)(); + EXPECT_EQ(1, uniform_lower_bound(IntervalOpenOpen, 0, 0)); + EXPECT_EQ(l + 1, uniform_lower_bound(IntervalOpenOpen, l, l)); + EXPECT_EQ(r, uniform_lower_bound(IntervalOpenOpen, r - 1, r - 1)); + EXPECT_EQ(r, uniform_lower_bound(IntervalOpenOpen, r, r)); + EXPECT_EQ(-1, uniform_upper_bound(IntervalOpenOpen, 0, 0)); + EXPECT_EQ(l, uniform_upper_bound(IntervalOpenOpen, l, l)); + EXPECT_EQ(r - 1, uniform_upper_bound(IntervalOpenOpen, r, r)); +} + +TEST_F(UniformHelperTest, UniformBoundFunctionsRealBounds) { + // absl::uniform_real_distribution natively assumes IntervalClosedOpen; + // use the inverse here so each bound has to change. + constexpr IntervalOpenClosedTag IntervalOpenClosed; + + // Edge cases: the next value toward itself is itself. + EXPECT_EQ(1.0, uniform_lower_bound(IntervalOpenClosed, 1.0, 1.0)); + EXPECT_EQ(1.0f, uniform_lower_bound(IntervalOpenClosed, 1.0f, 1.0f)); + + // rightmost and leftmost finite values. + constexpr auto r = (std::numeric_limits::max)(); + const auto re = std::nexttoward(r, 0.0); + constexpr auto l = -r; + const auto le = std::nexttoward(l, 0.0); + + EXPECT_EQ(l, uniform_lower_bound(IntervalOpenClosed, l, l)); // (l,l) + EXPECT_EQ(r, uniform_lower_bound(IntervalOpenClosed, r, r)); // (r,r) + EXPECT_EQ(le, uniform_lower_bound(IntervalOpenClosed, l, r)); // (l,r) + EXPECT_EQ(le, uniform_lower_bound(IntervalOpenClosed, l, 0.0)); // (l, 0) + EXPECT_EQ(le, uniform_lower_bound(IntervalOpenClosed, l, le)); // (l, le) + EXPECT_EQ(r, uniform_lower_bound(IntervalOpenClosed, re, r)); // (re, r) + + EXPECT_EQ(le, uniform_upper_bound(IntervalOpenClosed, l, l)); // (l,l) + EXPECT_EQ(r, uniform_upper_bound(IntervalOpenClosed, r, r)); // (r,r) + EXPECT_EQ(r, uniform_upper_bound(IntervalOpenClosed, l, r)); // (l,r) + EXPECT_EQ(r, uniform_upper_bound(IntervalOpenClosed, l, re)); // (l,re) + EXPECT_EQ(r, uniform_upper_bound(IntervalOpenClosed, 0.0, r)); // (0, r) + EXPECT_EQ(r, uniform_upper_bound(IntervalOpenClosed, re, r)); // (re, r) + EXPECT_EQ(r, uniform_upper_bound(IntervalOpenClosed, le, re)); // (le, re) + + const double e = std::nextafter(1.0, 2.0); // 1 + epsilon + const double f = std::nextafter(1.0, 0.0); // 1 - epsilon + + // (1.0, 1.0 + epsilon) + EXPECT_EQ(e, uniform_lower_bound(IntervalOpenClosed, 1.0, e)); + EXPECT_EQ(std::nextafter(e, 2.0), + uniform_upper_bound(IntervalOpenClosed, 1.0, e)); + + // (1.0-epsilon, 1.0) + EXPECT_EQ(1.0, uniform_lower_bound(IntervalOpenClosed, f, 1.0)); + EXPECT_EQ(e, uniform_upper_bound(IntervalOpenClosed, f, 1.0)); + + // denorm cases. + const double g = std::numeric_limits::denorm_min(); + const double h = std::nextafter(g, 1.0); + + // (0, denorm_min) + EXPECT_EQ(g, uniform_lower_bound(IntervalOpenClosed, 0.0, g)); + EXPECT_EQ(h, uniform_upper_bound(IntervalOpenClosed, 0.0, g)); + + // (denorm_min, 1.0) + EXPECT_EQ(h, uniform_lower_bound(IntervalOpenClosed, g, 1.0)); + EXPECT_EQ(e, uniform_upper_bound(IntervalOpenClosed, g, 1.0)); + + // Edge cases: invalid bounds. + EXPECT_EQ(f, uniform_lower_bound(IntervalOpenClosed, 1.0, -1.0)); +} + +struct Invalid {}; + +template +auto InferredUniformReturnT(int) -> uniform_inferred_return_t; + +template +Invalid InferredUniformReturnT(...); + +// Given types , CheckArgsInferType() verifies that +// +// uniform_inferred_return_t and +// uniform_inferred_return_t +// +// returns the type "Expect". +// +// This interface can also be used to assert that a given inferred return types +// are invalid. Writing: +// +// CheckArgsInferType() +// +// will assert that this overload does not exist. +template +void CheckArgsInferType() { + static_assert( + absl::conjunction< + std::is_same(0))>, + std::is_same(0))>>::value, + ""); +} + +TEST_F(UniformHelperTest, UniformTypeInference) { + // Infers common types. + CheckArgsInferType(); + CheckArgsInferType(); + CheckArgsInferType(); + CheckArgsInferType(); + CheckArgsInferType(); + CheckArgsInferType(); + CheckArgsInferType(); + CheckArgsInferType(); + + // Properly promotes uint16_t. + CheckArgsInferType(); + CheckArgsInferType(); + CheckArgsInferType(); + CheckArgsInferType(); + CheckArgsInferType(); + CheckArgsInferType(); + + // Properly promotes int16_t. + CheckArgsInferType(); + CheckArgsInferType(); + CheckArgsInferType(); + CheckArgsInferType(); + + // Invalid (u)int16_t-pairings do not compile. + // See "CheckArgsInferType" comments above, for how this is achieved. + CheckArgsInferType(); + CheckArgsInferType(); + CheckArgsInferType(); + + // Properly promotes uint32_t. + CheckArgsInferType(); + CheckArgsInferType(); + CheckArgsInferType(); + + // Properly promotes int32_t. + CheckArgsInferType(); + CheckArgsInferType(); + + // Invalid (u)int32_t-pairings do not compile. + CheckArgsInferType(); + CheckArgsInferType(); + CheckArgsInferType(); + CheckArgsInferType(); + + // Invalid (u)int64_t-pairings do not compile. + CheckArgsInferType(); + CheckArgsInferType(); + CheckArgsInferType(); + + // Properly promotes float. + CheckArgsInferType(); +} + +} // namespace diff --git a/third_party/abseil_cpp/absl/random/uniform_int_distribution.h b/third_party/abseil_cpp/absl/random/uniform_int_distribution.h index da66564a6..c1f54cceb 100644 --- a/third_party/abseil_cpp/absl/random/uniform_int_distribution.h +++ b/third_party/abseil_cpp/absl/random/uniform_int_distribution.h @@ -196,7 +196,7 @@ typename random_internal::make_unsigned_bits::type uniform_int_distribution::Generate( URBG& g, // NOLINT(runtime/references) typename random_internal::make_unsigned_bits::type R) { - random_internal::FastUniformBits fast_bits; + random_internal::FastUniformBits fast_bits; unsigned_type bits = fast_bits(g); const unsigned_type Lim = R + 1; if ((R & Lim) == 0) { diff --git a/third_party/abseil_cpp/absl/status/BUILD.bazel b/third_party/abseil_cpp/absl/status/BUILD.bazel index d164252da..189bd73d0 100644 --- a/third_party/abseil_cpp/absl/status/BUILD.bazel +++ b/third_party/abseil_cpp/absl/status/BUILD.bazel @@ -26,11 +26,12 @@ load( package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) cc_library( name = "status", srcs = [ + "internal/status_internal.h", "status.cc", "status_payload_printer.cc", ], @@ -64,3 +65,39 @@ cc_test( "@com_google_googletest//:gtest_main", ], ) + +cc_library( + name = "statusor", + srcs = [ + "internal/statusor_internal.h", + "statusor.cc", + ], + hdrs = [ + "statusor.h", + ], + copts = ABSL_DEFAULT_COPTS, + deps = [ + ":status", + "//absl/base:core_headers", + "//absl/base:raw_logging_internal", + "//absl/meta:type_traits", + "//absl/strings", + "//absl/types:variant", + "//absl/utility", + ], +) + +cc_test( + name = "statusor_test", + size = "small", + srcs = ["statusor_test.cc"], + deps = [ + ":status", + ":statusor", + "//absl/base", + "//absl/memory", + "//absl/types:any", + "//absl/utility", + "@com_google_googletest//:gtest_main", + ], +) diff --git a/third_party/abseil_cpp/absl/status/CMakeLists.txt b/third_party/abseil_cpp/absl/status/CMakeLists.txt index 3b8917e03..f0d798a37 100644 --- a/third_party/abseil_cpp/absl/status/CMakeLists.txt +++ b/third_party/abseil_cpp/absl/status/CMakeLists.txt @@ -19,6 +19,7 @@ absl_cc_library( HDRS "status.h" SRCS + "internal/status_internal.h" "status.cc" "status_payload_printer.h" "status_payload_printer.cc" @@ -39,24 +40,6 @@ absl_cc_library( PUBLIC ) -absl_cc_library( - NAME - statusor - HDRS - "statusor.h" - SRCS - "statusor.cc" - "statusor_internals.h" - COPTS - ${ABSL_DEFAULT_COPTS} - DEPS - absl::status - absl::atomic_hook - absl::raw_logging_internal - absl::strings - PUBLIC -) - absl_cc_test( NAME status_test @@ -70,6 +53,27 @@ absl_cc_test( gmock_main ) +absl_cc_library( + NAME + statusor + HDRS + "statusor.h" + SRCS + "statusor.cc" + "internal/statusor_internal.h" + COPTS + ${ABSL_DEFAULT_COPTS} + DEPS + absl::status + absl::core_headers + absl::raw_logging_internal + absl::type_traits + absl::strings + absl::utility + absl::variant + PUBLIC +) + absl_cc_test( NAME statusor_test @@ -80,6 +84,5 @@ absl_cc_test( DEPS absl::status absl::statusor - absl::strings gmock_main ) diff --git a/third_party/abseil_cpp/absl/status/internal/status_internal.h b/third_party/abseil_cpp/absl/status/internal/status_internal.h new file mode 100644 index 000000000..279f8f55b --- /dev/null +++ b/third_party/abseil_cpp/absl/status/internal/status_internal.h @@ -0,0 +1,58 @@ +// Copyright 2019 The Abseil 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 +// +// https://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 ABSL_STATUS_INTERNAL_STATUS_INTERNAL_H_ +#define ABSL_STATUS_INTERNAL_STATUS_INTERNAL_H_ + +#include + +#include "absl/container/inlined_vector.h" +#include "absl/strings/cord.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN + +enum class StatusCode : int; + +namespace status_internal { + +// Container for status payloads. +struct Payload { + std::string type_url; + absl::Cord payload; +}; + +using Payloads = absl::InlinedVector; + +// Reference-counted representation of Status data. +struct StatusRep { + StatusRep(absl::StatusCode code, std::string message, + std::unique_ptr payloads) + : ref(int32_t{1}), + code(code), + message(std::move(message)), + payloads(std::move(payloads)) {} + + std::atomic ref; + absl::StatusCode code; + std::string message; + std::unique_ptr payloads; +}; + +absl::StatusCode MapToLocalCode(int value); +} // namespace status_internal + +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_STATUS_INTERNAL_STATUS_INTERNAL_H_ diff --git a/third_party/abseil_cpp/absl/status/internal/statusor_internal.h b/third_party/abseil_cpp/absl/status/internal/statusor_internal.h new file mode 100644 index 000000000..eaac2c0b1 --- /dev/null +++ b/third_party/abseil_cpp/absl/status/internal/statusor_internal.h @@ -0,0 +1,396 @@ +// Copyright 2020 The Abseil 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 +// +// https://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 ABSL_STATUS_INTERNAL_STATUSOR_INTERNAL_H_ +#define ABSL_STATUS_INTERNAL_STATUSOR_INTERNAL_H_ + +#include +#include + +#include "absl/base/attributes.h" +#include "absl/meta/type_traits.h" +#include "absl/status/status.h" +#include "absl/utility/utility.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN + +template +class ABSL_MUST_USE_RESULT StatusOr; + +namespace internal_statusor { + +// Detects whether `U` has conversion operator to `StatusOr`, i.e. `operator +// StatusOr()`. +template +struct HasConversionOperatorToStatusOr : std::false_type {}; + +template +void test(char (*)[sizeof(std::declval().operator absl::StatusOr())]); + +template +struct HasConversionOperatorToStatusOr(0))> + : std::true_type {}; + +// Detects whether `T` is constructible or convertible from `StatusOr`. +template +using IsConstructibleOrConvertibleFromStatusOr = + absl::disjunction&>, + std::is_constructible&>, + std::is_constructible&&>, + std::is_constructible&&>, + std::is_convertible&, T>, + std::is_convertible&, T>, + std::is_convertible&&, T>, + std::is_convertible&&, T>>; + +// Detects whether `T` is constructible or convertible or assignable from +// `StatusOr`. +template +using IsConstructibleOrConvertibleOrAssignableFromStatusOr = + absl::disjunction, + std::is_assignable&>, + std::is_assignable&>, + std::is_assignable&&>, + std::is_assignable&&>>; + +// Detects whether direct initializing `StatusOr` from `U` is ambiguous, i.e. +// when `U` is `StatusOr` and `T` is constructible or convertible from `V`. +template +struct IsDirectInitializationAmbiguous + : public absl::conditional_t< + std::is_same>, + U>::value, + std::false_type, + IsDirectInitializationAmbiguous< + T, absl::remove_cv_t>>> {}; + +template +struct IsDirectInitializationAmbiguous> + : public IsConstructibleOrConvertibleFromStatusOr {}; + +// Checks against the constraints of the direction initialization, i.e. when +// `StatusOr::StatusOr(U&&)` should participate in overload resolution. +template +using IsDirectInitializationValid = absl::disjunction< + // Short circuits if T is basically U. + std::is_same>>, + absl::negation, + absl::remove_cv_t>>, + std::is_same>>, + std::is_same>>, + IsDirectInitializationAmbiguous>>>; + +// This trait detects whether `StatusOr::operator=(U&&)` is ambiguous, which +// is equivalent to whether all the following conditions are met: +// 1. `U` is `StatusOr`. +// 2. `T` is constructible and assignable from `V`. +// 3. `T` is constructible and assignable from `U` (i.e. `StatusOr`). +// For example, the following code is considered ambiguous: +// (`T` is `bool`, `U` is `StatusOr`, `V` is `bool`) +// StatusOr s1 = true; // s1.ok() && s1.ValueOrDie() == true +// StatusOr s2 = false; // s2.ok() && s2.ValueOrDie() == false +// s1 = s2; // ambiguous, `s1 = s2.ValueOrDie()` or `s1 = bool(s2)`? +template +struct IsForwardingAssignmentAmbiguous + : public absl::conditional_t< + std::is_same>, + U>::value, + std::false_type, + IsForwardingAssignmentAmbiguous< + T, absl::remove_cv_t>>> {}; + +template +struct IsForwardingAssignmentAmbiguous> + : public IsConstructibleOrConvertibleOrAssignableFromStatusOr {}; + +// Checks against the constraints of the forwarding assignment, i.e. whether +// `StatusOr::operator(U&&)` should participate in overload resolution. +template +using IsForwardingAssignmentValid = absl::disjunction< + // Short circuits if T is basically U. + std::is_same>>, + absl::negation, + absl::remove_cv_t>>, + std::is_same>>, + std::is_same>>, + IsForwardingAssignmentAmbiguous>>>; + +class Helper { + public: + // Move type-agnostic error handling to the .cc. + static void HandleInvalidStatusCtorArg(Status*); + ABSL_ATTRIBUTE_NORETURN static void Crash(const absl::Status& status); +}; + +// Construct an instance of T in `p` through placement new, passing Args... to +// the constructor. +// This abstraction is here mostly for the gcc performance fix. +template +ABSL_ATTRIBUTE_NONNULL(1) void PlacementNew(void* p, Args&&... args) { + new (p) T(std::forward(args)...); +} + +// Helper base class to hold the data and all operations. +// We move all this to a base class to allow mixing with the appropriate +// TraitsBase specialization. +template +class StatusOrData { + template + friend class StatusOrData; + + public: + StatusOrData() = delete; + + StatusOrData(const StatusOrData& other) { + if (other.ok()) { + MakeValue(other.data_); + MakeStatus(); + } else { + MakeStatus(other.status_); + } + } + + StatusOrData(StatusOrData&& other) noexcept { + if (other.ok()) { + MakeValue(std::move(other.data_)); + MakeStatus(); + } else { + MakeStatus(std::move(other.status_)); + } + } + + template + explicit StatusOrData(const StatusOrData& other) { + if (other.ok()) { + MakeValue(other.data_); + MakeStatus(); + } else { + MakeStatus(other.status_); + } + } + + template + explicit StatusOrData(StatusOrData&& other) { + if (other.ok()) { + MakeValue(std::move(other.data_)); + MakeStatus(); + } else { + MakeStatus(std::move(other.status_)); + } + } + + template + explicit StatusOrData(absl::in_place_t, Args&&... args) + : data_(std::forward(args)...) { + MakeStatus(); + } + + explicit StatusOrData(const T& value) : data_(value) { + MakeStatus(); + } + explicit StatusOrData(T&& value) : data_(std::move(value)) { + MakeStatus(); + } + + template ::value, + int> = 0> + explicit StatusOrData(U&& v) : status_(std::forward(v)) { + EnsureNotOk(); + } + + StatusOrData& operator=(const StatusOrData& other) { + if (this == &other) return *this; + if (other.ok()) + Assign(other.data_); + else + AssignStatus(other.status_); + return *this; + } + + StatusOrData& operator=(StatusOrData&& other) { + if (this == &other) return *this; + if (other.ok()) + Assign(std::move(other.data_)); + else + AssignStatus(std::move(other.status_)); + return *this; + } + + ~StatusOrData() { + if (ok()) { + status_.~Status(); + data_.~T(); + } else { + status_.~Status(); + } + } + + template + void Assign(U&& value) { + if (ok()) { + data_ = std::forward(value); + } else { + MakeValue(std::forward(value)); + status_ = OkStatus(); + } + } + + template + void AssignStatus(U&& v) { + Clear(); + status_ = static_cast(std::forward(v)); + EnsureNotOk(); + } + + bool ok() const { return status_.ok(); } + + protected: + // status_ will always be active after the constructor. + // We make it a union to be able to initialize exactly how we need without + // waste. + // Eg. in the copy constructor we use the default constructor of Status in + // the ok() path to avoid an extra Ref call. + union { + Status status_; + }; + + // data_ is active iff status_.ok()==true + struct Dummy {}; + union { + // When T is const, we need some non-const object we can cast to void* for + // the placement new. dummy_ is that object. + Dummy dummy_; + T data_; + }; + + void Clear() { + if (ok()) data_.~T(); + } + + void EnsureOk() const { + if (ABSL_PREDICT_FALSE(!ok())) Helper::Crash(status_); + } + + void EnsureNotOk() { + if (ABSL_PREDICT_FALSE(ok())) Helper::HandleInvalidStatusCtorArg(&status_); + } + + // Construct the value (ie. data_) through placement new with the passed + // argument. + template + void MakeValue(Arg&&... arg) { + internal_statusor::PlacementNew(&dummy_, std::forward(arg)...); + } + + // Construct the status (ie. status_) through placement new with the passed + // argument. + template + void MakeStatus(Args&&... args) { + internal_statusor::PlacementNew(&status_, + std::forward(args)...); + } +}; + +// Helper base classes to allow implicitly deleted constructors and assignment +// operators in `StatusOr`. For example, `CopyCtorBase` will explicitly delete +// the copy constructor when T is not copy constructible and `StatusOr` will +// inherit that behavior implicitly. +template ::value> +struct CopyCtorBase { + CopyCtorBase() = default; + CopyCtorBase(const CopyCtorBase&) = default; + CopyCtorBase(CopyCtorBase&&) = default; + CopyCtorBase& operator=(const CopyCtorBase&) = default; + CopyCtorBase& operator=(CopyCtorBase&&) = default; +}; + +template +struct CopyCtorBase { + CopyCtorBase() = default; + CopyCtorBase(const CopyCtorBase&) = delete; + CopyCtorBase(CopyCtorBase&&) = default; + CopyCtorBase& operator=(const CopyCtorBase&) = default; + CopyCtorBase& operator=(CopyCtorBase&&) = default; +}; + +template ::value> +struct MoveCtorBase { + MoveCtorBase() = default; + MoveCtorBase(const MoveCtorBase&) = default; + MoveCtorBase(MoveCtorBase&&) = default; + MoveCtorBase& operator=(const MoveCtorBase&) = default; + MoveCtorBase& operator=(MoveCtorBase&&) = default; +}; + +template +struct MoveCtorBase { + MoveCtorBase() = default; + MoveCtorBase(const MoveCtorBase&) = default; + MoveCtorBase(MoveCtorBase&&) = delete; + MoveCtorBase& operator=(const MoveCtorBase&) = default; + MoveCtorBase& operator=(MoveCtorBase&&) = default; +}; + +template ::value&& + std::is_copy_assignable::value> +struct CopyAssignBase { + CopyAssignBase() = default; + CopyAssignBase(const CopyAssignBase&) = default; + CopyAssignBase(CopyAssignBase&&) = default; + CopyAssignBase& operator=(const CopyAssignBase&) = default; + CopyAssignBase& operator=(CopyAssignBase&&) = default; +}; + +template +struct CopyAssignBase { + CopyAssignBase() = default; + CopyAssignBase(const CopyAssignBase&) = default; + CopyAssignBase(CopyAssignBase&&) = default; + CopyAssignBase& operator=(const CopyAssignBase&) = delete; + CopyAssignBase& operator=(CopyAssignBase&&) = default; +}; + +template ::value&& + std::is_move_assignable::value> +struct MoveAssignBase { + MoveAssignBase() = default; + MoveAssignBase(const MoveAssignBase&) = default; + MoveAssignBase(MoveAssignBase&&) = default; + MoveAssignBase& operator=(const MoveAssignBase&) = default; + MoveAssignBase& operator=(MoveAssignBase&&) = default; +}; + +template +struct MoveAssignBase { + MoveAssignBase() = default; + MoveAssignBase(const MoveAssignBase&) = default; + MoveAssignBase(MoveAssignBase&&) = default; + MoveAssignBase& operator=(const MoveAssignBase&) = default; + MoveAssignBase& operator=(MoveAssignBase&&) = delete; +}; + +ABSL_ATTRIBUTE_NORETURN void ThrowBadStatusOrAccess(absl::Status status); + +} // namespace internal_statusor +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_STATUS_INTERNAL_STATUSOR_INTERNAL_H_ diff --git a/third_party/abseil_cpp/absl/status/status.cc b/third_party/abseil_cpp/absl/status/status.cc index 0a655736e..c71de8468 100644 --- a/third_party/abseil_cpp/absl/status/status.cc +++ b/third_party/abseil_cpp/absl/status/status.cc @@ -78,7 +78,7 @@ static int FindPayloadIndexByUrl(const Payloads* payloads, absl::string_view type_url) { if (payloads == nullptr) return -1; - for (int i = 0; i < payloads->size(); ++i) { + for (size_t i = 0; i < payloads->size(); ++i) { if ((*payloads)[i].type_url == type_url) return i; } @@ -167,7 +167,7 @@ void Status::ForEachPayload( bool in_reverse = payloads->size() > 1 && reinterpret_cast(payloads) % 13 > 6; - for (int index = 0; index < payloads->size(); ++index) { + for (size_t index = 0; index < payloads->size(); ++index) { const auto& elem = (*payloads)[in_reverse ? payloads->size() - 1 - index : index]; @@ -209,11 +209,8 @@ void Status::UnrefNonInlined(uintptr_t rep) { uintptr_t Status::NewRep(absl::StatusCode code, absl::string_view msg, std::unique_ptr payloads) { - status_internal::StatusRep* rep = new status_internal::StatusRep; - rep->ref.store(1, std::memory_order_relaxed); - rep->code = code; - rep->message.assign(msg.data(), msg.size()); - rep->payloads = std::move(payloads); + status_internal::StatusRep* rep = new status_internal::StatusRep( + code, std::string(msg.data(), msg.size()), std::move(payloads)); return PointerToRep(rep); } diff --git a/third_party/abseil_cpp/absl/status/status.h b/third_party/abseil_cpp/absl/status/status.h index 967e60644..c4d6fce09 100644 --- a/third_party/abseil_cpp/absl/status/status.h +++ b/third_party/abseil_cpp/absl/status/status.h @@ -11,6 +11,43 @@ // 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: status.h +// ----------------------------------------------------------------------------- +// +// This header file defines the Abseil `status` library, consisting of: +// +// * An `absl::Status` class for holding error handling information +// * A set of canonical `absl::StatusCode` error codes, and associated +// utilities for generating and propagating status codes. +// * A set of helper functions for creating status codes and checking their +// values +// +// Within Google, `absl::Status` is the primary mechanism for gracefully +// handling errors across API boundaries (and in particular across RPC +// boundaries). Some of these errors may be recoverable, but others may not. +// Most functions that can produce a recoverable error should be designed to +// return an `absl::Status` (or `absl::StatusOr`). +// +// Example: +// +// absl::Status myFunction(absl::string_view fname, ...) { +// ... +// // encounter error +// if (error condition) { +// return absl::InvalidArgumentError("bad mode"); +// } +// // else, return OK +// return absl::OkStatus(); +// } +// +// An `absl::Status` is designed to either return "OK" or one of a number of +// different error codes, corresponding to typical error conditions. +// In almost all cases, when using `absl::Status` you should use the canonical +// error codes (of type `absl::StatusCode`) enumerated in this header file. +// These canonical codes are understood across the codebase and will be +// accepted across all API and RPC boundaries. #ifndef ABSL_STATUS_STATUS_H_ #define ABSL_STATUS_STATUS_H_ @@ -18,165 +55,477 @@ #include #include "absl/container/inlined_vector.h" +#include "absl/status/internal/status_internal.h" #include "absl/strings/cord.h" #include "absl/types/optional.h" namespace absl { ABSL_NAMESPACE_BEGIN +// absl::StatusCode +// +// An `absl::StatusCode` is an enumerated type indicating either no error ("OK") +// or an error condition. In most cases, an `absl::Status` indicates a +// recoverable error, and the purpose of signalling an error is to indicate what +// action to take in response to that error. These error codes map to the proto +// RPC error codes indicated in https://cloud.google.com/apis/design/errors. +// +// The errors listed below are the canonical errors associated with +// `absl::Status` and are used throughout the codebase. As a result, these +// error codes are somewhat generic. +// +// In general, try to return the most specific error that applies if more than +// one error may pertain. For example, prefer `kOutOfRange` over +// `kFailedPrecondition` if both codes apply. Similarly prefer `kNotFound` or +// `kAlreadyExists` over `kFailedPrecondition`. +// +// Because these errors may travel RPC boundaries, these codes are tied to the +// `google.rpc.Code` definitions within +// https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto +// The string value of these RPC codes is denoted within each enum below. +// +// If your error handling code requires more context, you can attach payloads +// to your status. See `absl::Status::SetPayload()` and +// `absl::Status::GetPayload()` below. enum class StatusCode : int { + // StatusCode::kOk + // + // kOK (gRPC code "OK") does not indicate an error; this value is returned on + // success. It is typical to check for this value before proceeding on any + // given call across an API or RPC boundary. To check this value, use the + // `absl::Status::ok()` member function rather than inspecting the raw code. kOk = 0, + + // StatusCode::kCancelled + // + // kCancelled (gRPC code "CANCELLED") indicates the operation was cancelled, + // typically by the caller. kCancelled = 1, + + // StatusCode::kUnknown + // + // kUnknown (gRPC code "UNKNOWN") indicates an unknown error occurred. In + // general, more specific errors should be raised, if possible. Errors raised + // by APIs that do not return enough error information may be converted to + // this error. kUnknown = 2, + + // StatusCode::kInvalidArgument + // + // kInvalidArgument (gRPC code "INVALID_ARGUMENT") indicates the caller + // specified an invalid argument, such a malformed filename. Note that such + // errors should be narrowly limited to indicate to the invalid nature of the + // arguments themselves. Errors with validly formed arguments that may cause + // errors with the state of the receiving system should be denoted with + // `kFailedPrecondition` instead. kInvalidArgument = 3, + + // StatusCode::kDeadlineExceeded + // + // kDeadlineExceeded (gRPC code "DEADLINE_EXCEEDED") indicates a deadline + // expired before the operation could complete. For operations that may change + // state within a system, this error may be returned even if the operation has + // completed successfully. For example, a successful response from a server + // could have been delayed long enough for the deadline to expire. kDeadlineExceeded = 4, + + // StatusCode::kNotFound + // + // kNotFound (gRPC code "NOT_FOUND") indicates some requested entity (such as + // a file or directory) was not found. + // + // `kNotFound` is useful if a request should be denied for an entire class of + // users, such as during a gradual feature rollout or undocumented allow list. + // If, instead, a request should be denied for specific sets of users, such as + // through user-based access control, use `kPermissionDenied` instead. kNotFound = 5, + + // StatusCode::kAlreadyExists + // + // kAlreadyExists (gRPC code "ALREADY_EXISTS") indicates the entity that a + // caller attempted to create (such as file or directory) is already present. kAlreadyExists = 6, + + // StatusCode::kPermissionDenied + // + // kPermissionDenied (gRPC code "PERMISSION_DENIED") indicates that the caller + // does not have permission to execute the specified operation. Note that this + // error is different than an error due to an *un*authenticated user. This + // error code does not imply the request is valid or the requested entity + // exists or satisfies any other pre-conditions. + // + // `kPermissionDenied` must not be used for rejections caused by exhausting + // some resource. Instead, use `kResourceExhausted` for those errors. + // `kPermissionDenied` must not be used if the caller cannot be identified. + // Instead, use `kUnauthenticated` for those errors. kPermissionDenied = 7, + + // StatusCode::kResourceExhausted + // + // kResourceExhausted (gRPC code "RESOURCE_EXHAUSTED") indicates some resource + // has been exhausted, perhaps a per-user quota, or perhaps the entire file + // system is out of space. kResourceExhausted = 8, + + // StatusCode::kFailedPrecondition + // + // kFailedPrecondition (gRPC code "FAILED_PRECONDITION") indicates that the + // operation was rejected because the system is not in a state required for + // the operation's execution. For example, a directory to be deleted may be + // non-empty, an "rmdir" operation is applied to a non-directory, etc. + // + // Some guidelines that may help a service implementer in deciding between + // `kFailedPrecondition`, `kAborted`, and `kUnavailable`: + // + // (a) Use `kUnavailable` if the client can retry just the failing call. + // (b) Use `kAborted` if the client should retry at a higher transaction + // level (such as when a client-specified test-and-set fails, indicating + // the client should restart a read-modify-write sequence). + // (c) Use `kFailedPrecondition` if the client should not retry until + // the system state has been explicitly fixed. For example, if an "rmdir" + // fails because the directory is non-empty, `kFailedPrecondition` + // should be returned since the client should not retry unless + // the files are deleted from the directory. kFailedPrecondition = 9, + + // StatusCode::kAborted + // + // kAborted (gRPC code "ABORTED") indicates the operation was aborted, + // typically due to a concurrency issue such as a sequencer check failure or a + // failed transaction. + // + // See the guidelines above for deciding between `kFailedPrecondition`, + // `kAborted`, and `kUnavailable`. kAborted = 10, + + // StatusCode::kOutOfRange + // + // kOutOfRange (gRPC code "OUT_OF_RANGE") indicates the operation was + // attempted past the valid range, such as seeking or reading past an + // end-of-file. + // + // Unlike `kInvalidArgument`, this error indicates a problem that may + // be fixed if the system state changes. For example, a 32-bit file + // system will generate `kInvalidArgument` if asked to read at an + // offset that is not in the range [0,2^32-1], but it will generate + // `kOutOfRange` if asked to read from an offset past the current + // file size. + // + // There is a fair bit of overlap between `kFailedPrecondition` and + // `kOutOfRange`. We recommend using `kOutOfRange` (the more specific + // error) when it applies so that callers who are iterating through + // a space can easily look for an `kOutOfRange` error to detect when + // they are done. kOutOfRange = 11, + + // StatusCode::kUnimplemented + // + // kUnimplemented (gRPC code "UNIMPLEMENTED") indicates the operation is not + // implemented or supported in this service. In this case, the operation + // should not be re-attempted. kUnimplemented = 12, + + // StatusCode::kInternal + // + // kInternal (gRPC code "INTERNAL") indicates an internal error has occurred + // and some invariants expected by the underlying system have not been + // satisfied. This error code is reserved for serious errors. kInternal = 13, + + // StatusCode::kUnavailable + // + // kUnavailable (gRPC code "UNAVAILABLE") indicates the service is currently + // unavailable and that this is most likely a transient condition. An error + // such as this can be corrected by retrying with a backoff scheme. Note that + // it is not always safe to retry non-idempotent operations. + // + // See the guidelines above for deciding between `kFailedPrecondition`, + // `kAborted`, and `kUnavailable`. kUnavailable = 14, + + // StatusCode::kDataLoss + // + // kDataLoss (gRPC code "DATA_LOSS") indicates that unrecoverable data loss or + // corruption has occurred. As this error is serious, proper alerting should + // be attached to errors such as this. kDataLoss = 15, + + // StatusCode::kUnauthenticated + // + // kUnauthenticated (gRPC code "UNAUTHENTICATED") indicates that the request + // does not have valid authentication credentials for the operation. Correct + // the authentication and try again. kUnauthenticated = 16, + + // StatusCode::DoNotUseReservedForFutureExpansionUseDefaultInSwitchInstead_ + // + // NOTE: this error code entry should not be used and you should not rely on + // its value, which may change. + // + // The purpose of this enumerated value is to force people who handle status + // codes with `switch()` statements to *not* simply enumerate all possible + // values, but instead provide a "default:" case. Providing such a default + // case ensures that code will compile when new codes are added. kDoNotUseReservedForFutureExpansionUseDefaultInSwitchInstead_ = 20 }; +// StatusCodeToString() +// // Returns the name for the status code, or "" if it is an unknown value. std::string StatusCodeToString(StatusCode code); +// operator<< +// // Streams StatusCodeToString(code) to `os`. std::ostream& operator<<(std::ostream& os, StatusCode code); -namespace status_internal { - -// Container for status payloads. -struct Payload { - std::string type_url; - absl::Cord payload; -}; - -using Payloads = absl::InlinedVector; - -// Reference-counted representation of Status data. -struct StatusRep { - std::atomic ref; - absl::StatusCode code; - std::string message; - std::unique_ptr payloads; -}; - -absl::StatusCode MapToLocalCode(int value); -} // namespace status_internal - +// absl::Status +// +// The `absl::Status` class is generally used to gracefully handle errors +// across API boundaries (and in particular across RPC boundaries). Some of +// these errors may be recoverable, but others may not. Most +// functions which can produce a recoverable error should be designed to return +// either an `absl::Status` (or the similar `absl::StatusOr`, which holds +// either an object of type `T` or an error). +// +// API developers should construct their functions to return `absl::OkStatus()` +// upon success, or an `absl::StatusCode` upon another type of error (e.g +// an `absl::StatusCode::kInvalidArgument` error). The API provides convenience +// functions to constuct each status code. +// +// Example: +// +// absl::Status myFunction(absl::string_view fname, ...) { +// ... +// // encounter error +// if (error condition) { +// // Construct an absl::StatusCode::kInvalidArgument error +// return absl::InvalidArgumentError("bad mode"); +// } +// // else, return OK +// return absl::OkStatus(); +// } +// +// Users handling status error codes should prefer checking for an OK status +// using the `ok()` member function. Handling multiple error codes may justify +// use of switch statement, but only check for error codes you know how to +// handle; do not try to exhaustively match against all canonical error codes. +// Errors that cannot be handled should be logged and/or propagated for higher +// levels to deal with. If you do use a switch statement, make sure that you +// also provide a `default:` switch case, so that code does not break as other +// canonical codes are added to the API. +// +// Example: +// +// absl::Status result = DoSomething(); +// if (!result.ok()) { +// LOG(ERROR) << result; +// } +// +// // Provide a default if switching on multiple error codes +// switch (result.code()) { +// // The user hasn't authenticated. Ask them to reauth +// case absl::StatusCode::kUnauthenticated: +// DoReAuth(); +// break; +// // The user does not have permission. Log an error. +// case absl::StatusCode::kPermissionDenied: +// LOG(ERROR) << result; +// break; +// // Propagate the error otherwise. +// default: +// return true; +// } +// +// An `absl::Status` can optionally include a payload with more information +// about the error. Typically, this payload serves one of several purposes: +// +// * It may provide more fine-grained semantic information about the error to +// facilitate actionable remedies. +// * It may provide human-readable contexual information that is more +// appropriate to display to an end user. +// +// Example: +// +// absl::Status result = DoSomething(); +// // Inform user to retry after 30 seconds +// // See more error details in googleapis/google/rpc/error_details.proto +// if (absl::IsResourceExhausted(result)) { +// google::rpc::RetryInfo info; +// info.retry_delay().seconds() = 30; +// // Payloads require a unique key (a URL to ensure no collisions with +// // other payloads), and an `absl::Cord` to hold the encoded data. +// absl::string_view url = "type.googleapis.com/google.rpc.RetryInfo"; +// result.SetPayload(url, info.SerializeAsCord()); +// return result; +// } +// class ABSL_MUST_USE_RESULT Status final { public: - // Creates an OK status with no message or payload. + // Constructors + + // This default constructor creates an OK status with no message or payload. + // Avoid this constructor and prefer explicit construction of an OK status + // with `absl::OkStatus()`. Status(); - // Create a status in the canonical error space with the specified code and - // error message. If `code == absl::StatusCode::kOk`, `msg` is ignored and an - // object identical to an OK status is constructed. + // Creates a status in the canonical error space with the specified + // `absl::StatusCode` and error message. If `code == absl::StatusCode::kOk`, + // `msg` is ignored and an object identical to an OK status is constructed. // - // `msg` must be in UTF-8. The implementation may complain (e.g., + // The `msg` string must be in UTF-8. The implementation may complain (e.g., // by printing a warning) if it is not. Status(absl::StatusCode code, absl::string_view msg); Status(const Status&); Status& operator=(const Status& x); - // Move operations. + // Move operators + // The moved-from state is valid but unspecified. Status(Status&&) noexcept; Status& operator=(Status&&); ~Status(); - // If `this->ok()`, stores `new_status` into *this. If `!this->ok()`, - // preserves the current data. May, in the future, augment the current status - // with additional information about `new_status`. + // Status::Update() // - // Convenient way of keeping track of the first error encountered. - // Instead of: - // if (overall_status.ok()) overall_status = new_status - // Use: + // Updates the existing status with `new_status` provided that `this->ok()`. + // If the existing status already contains a non-OK error, this update has no + // effect and preserves the current data. Note that this behavior may change + // in the future to augment a current non-ok status with additional + // information about `new_status`. + // + // `Update()` provides a convenient way of keeping track of the first error + // encountered. + // + // Example: + // // Instead of "if (overall_status.ok()) overall_status = new_status" // overall_status.Update(new_status); // - // Style guide exception for rvalue reference granted in CL 153567220. void Update(const Status& new_status); void Update(Status&& new_status); - // Returns true if the Status is OK. + // Status::ok() + // + // Returns `true` if `this->ok()`. Prefer checking for an OK status using this + // member function. ABSL_MUST_USE_RESULT bool ok() const; - // Returns the (canonical) error code. + // Status::code() + // + // Returns the canonical error code of type `absl::StatusCode` of this status. absl::StatusCode code() const; - // Returns the raw (canonical) error code which could be out of the range of - // the local `absl::StatusCode` enum. NOTE: This should only be called when - // converting to wire format. Use `code` for error handling. + // Status::raw_code() + // + // Returns a raw (canonical) error code corresponding to the enum value of + // `google.rpc.Code` definitions within + // https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto. + // These values could be out of the range of canonical `absl::StatusCode` + // enum values. + // + // NOTE: This function should only be called when converting to an associated + // wire format. Use `Status::code()` for error handling. int raw_code() const; - // Returns the error message. Note: prefer ToString() for debug logging. - // This message rarely describes the error code. It is not unusual for the - // error message to be the empty string. + // Status::message() + // + // Returns the error message associated with this error code, if available. + // Note that this message rarely describes the error code. It is not unusual + // for the error message to be the empty string. As a result, prefer + // `Status::ToString()` for debug logging. absl::string_view message() const; friend bool operator==(const Status&, const Status&); friend bool operator!=(const Status&, const Status&); - // Returns a combination of the error code name, the message and the payloads. - // You can expect the code name and the message to be substrings of the - // result, and the payloads to be printed by the registered printer extensions - // if they are recognized. - // WARNING: Do not depend on the exact format of the result of `ToString()` - // which is subject to change. + // Status::ToString() + // + // Returns a combination of the error code name, the message and any + // associated payload messages. This string is designed simply to be human + // readable and its exact format should not be load bearing. Do not depend on + // the exact format of the result of `ToString()` which is subject to change. + // + // The printed code name and the message are generally substrings of the + // result, and the payloads to be printed use the status payload printer + // mechanism (which is internal). std::string ToString() const; + // Status::IgnoreError() + // // Ignores any errors. This method does nothing except potentially suppress // complaints from any tools that are checking that errors are not dropped on // the floor. void IgnoreError() const; - // Swap the contents of `a` with `b` + // swap() + // + // Swap the contents of one status with another. friend void swap(Status& a, Status& b); - // Payload management APIs + //---------------------------------------------------------------------------- + // Payload Management APIs + //---------------------------------------------------------------------------- - // Type URL should be unique and follow the naming convention below: - // The idea of type URL comes from `google.protobuf.Any` - // (https://developers.google.com/protocol-buffers/docs/proto3#any). The - // type URL should be globally unique and follow the format of URL - // (https://en.wikipedia.org/wiki/URL). The default type URL for a given - // protobuf message type is "type.googleapis.com/packagename.messagename". For - // other custom wire formats, users should define the format of type URL in a - // similar practice so as to minimize the chance of conflict between type - // URLs. Users should make sure that the type URL can be mapped to a concrete + // A payload may be attached to a status to provide additional context to an + // error that may not be satisifed by an existing `absl::StatusCode`. + // Typically, this payload serves one of several purposes: + // + // * It may provide more fine-grained semantic information about the error + // to facilitate actionable remedies. + // * It may provide human-readable contexual information that is more + // appropriate to display to an end user. + // + // A payload consists of a [key,value] pair, where the key is a string + // referring to a unique "type URL" and the value is an object of type + // `absl::Cord` to hold the contextual data. + // + // The "type URL" should be unique and follow the format of a URL + // (https://en.wikipedia.org/wiki/URL) and, ideally, provide some + // documentation or schema on how to interpret its associated data. For + // example, the default type URL for a protobuf message type is + // "type.googleapis.com/packagename.messagename". Other custom wire formats + // should define the format of type URL in a similar practice so as to + // minimize the chance of conflict between type URLs. + // Users should ensure that the type URL can be mapped to a concrete // C++ type if they want to deserialize the payload and read it effectively. + // + // To attach a payload to a status object, call `Status::SetPayload()`, + // passing it the type URL and an `absl::Cord` of associated data. Similarly, + // to extract the payload from a status, call `Status::GetPayload()`. You + // may attach multiple payloads (with differing type URLs) to any given + // status object, provided that the status is currently exhibiting an error + // code (i.e. is not OK). - // Gets the payload based for `type_url` key, if it is present. + // Status::GetPayload() + // + // Gets the payload of a status given its unique `type_url` key, if present. absl::optional GetPayload(absl::string_view type_url) const; - // Sets the payload for `type_url` key for a non-ok status, overwriting any - // existing payload for `type_url`. + // Status::SetPayload() // - // NOTE: Does nothing if the Status is ok. + // Sets the payload for a non-ok status using a `type_url` key, overwriting + // any existing payload for that `type_url`. + // + // NOTE: This function does nothing if the Status is ok. void SetPayload(absl::string_view type_url, absl::Cord payload); - // Erases the payload corresponding to the `type_url` key. Returns true if + // Status::ErasePayload() + // + // Erases the payload corresponding to the `type_url` key. Returns `true` if // the payload was present. bool ErasePayload(absl::string_view type_url); - // Iterates over the stored payloads and calls `visitor(type_key, payload)` - // for each one. + // Status::ForEachPayload() // - // NOTE: The order of calls to `visitor` is not specified and may change at + // Iterates over the stored payloads and calls the + // `visitor(type_key, payload)` callable for each one. + // + // NOTE: The order of calls to `visitor()` is not specified and may change at // any time. // - // NOTE: Any mutation on the same 'Status' object during visitation is + // NOTE: Any mutation on the same 'absl::Status' object during visitation is // forbidden and could result in undefined behavior. void ForEachPayload( const std::function& visitor) @@ -245,14 +594,93 @@ class ABSL_MUST_USE_RESULT Status final { uintptr_t rep_; }; -// Returns an OK status, equivalent to a default constructed instance. +// OkStatus() +// +// Returns an OK status, equivalent to a default constructed instance. Prefer +// usage of `absl::OkStatus()` when constructing such an OK status. Status OkStatus(); +// operator<<() +// // Prints a human-readable representation of `x` to `os`. std::ostream& operator<<(std::ostream& os, const Status& x); -// ----------------------------------------------------------------- +// IsAborted() +// IsAlreadyExists() +// IsCancelled() +// IsDataLoss() +// IsDeadlineExceeded() +// IsFailedPrecondition() +// IsInternal() +// IsInvalidArgument() +// IsNotFound() +// IsOutOfRange() +// IsPermissionDenied() +// IsResourceExhausted() +// IsUnauthenticated() +// IsUnavailable() +// IsUnimplemented() +// IsUnknown() +// +// These convenience functions return `true` if a given status matches the +// `absl::StatusCode` error code of its associated function. +ABSL_MUST_USE_RESULT bool IsAborted(const Status& status); +ABSL_MUST_USE_RESULT bool IsAlreadyExists(const Status& status); +ABSL_MUST_USE_RESULT bool IsCancelled(const Status& status); +ABSL_MUST_USE_RESULT bool IsDataLoss(const Status& status); +ABSL_MUST_USE_RESULT bool IsDeadlineExceeded(const Status& status); +ABSL_MUST_USE_RESULT bool IsFailedPrecondition(const Status& status); +ABSL_MUST_USE_RESULT bool IsInternal(const Status& status); +ABSL_MUST_USE_RESULT bool IsInvalidArgument(const Status& status); +ABSL_MUST_USE_RESULT bool IsNotFound(const Status& status); +ABSL_MUST_USE_RESULT bool IsOutOfRange(const Status& status); +ABSL_MUST_USE_RESULT bool IsPermissionDenied(const Status& status); +ABSL_MUST_USE_RESULT bool IsResourceExhausted(const Status& status); +ABSL_MUST_USE_RESULT bool IsUnauthenticated(const Status& status); +ABSL_MUST_USE_RESULT bool IsUnavailable(const Status& status); +ABSL_MUST_USE_RESULT bool IsUnimplemented(const Status& status); +ABSL_MUST_USE_RESULT bool IsUnknown(const Status& status); + +// AbortedError() +// AlreadyExistsError() +// CancelledError() +// DataLossError() +// DeadlineExceededError() +// FailedPreconditionError() +// InternalError() +// InvalidArgumentError() +// NotFoundError() +// OutOfRangeError() +// PermissionDeniedError() +// ResourceExhaustedError() +// UnauthenticatedError() +// UnavailableError() +// UnimplementedError() +// UnknownError() +// +// These convenience functions create an `absl::Status` object with an error +// code as indicated by the associated function name, using the error message +// passed in `message`. +Status AbortedError(absl::string_view message); +Status AlreadyExistsError(absl::string_view message); +Status CancelledError(absl::string_view message); +Status DataLossError(absl::string_view message); +Status DeadlineExceededError(absl::string_view message); +Status FailedPreconditionError(absl::string_view message); +Status InternalError(absl::string_view message); +Status InvalidArgumentError(absl::string_view message); +Status NotFoundError(absl::string_view message); +Status OutOfRangeError(absl::string_view message); +Status PermissionDeniedError(absl::string_view message); +Status ResourceExhaustedError(absl::string_view message); +Status UnauthenticatedError(absl::string_view message); +Status UnavailableError(absl::string_view message); +Status UnimplementedError(absl::string_view message); +Status UnknownError(absl::string_view message); + +//------------------------------------------------------------------------------ // Implementation details follow +//------------------------------------------------------------------------------ inline Status::Status() : rep_(CodeToInlinedRep(absl::StatusCode::kOk)) {} @@ -378,50 +806,11 @@ inline void Status::Unref(uintptr_t rep) { inline Status OkStatus() { return Status(); } -// Each of the functions below creates a Status object with a particular error -// code and the given message. The error code of the returned status object -// matches the name of the function. -Status AbortedError(absl::string_view message); -Status AlreadyExistsError(absl::string_view message); -Status CancelledError(absl::string_view message); -Status DataLossError(absl::string_view message); -Status DeadlineExceededError(absl::string_view message); -Status FailedPreconditionError(absl::string_view message); -Status InternalError(absl::string_view message); -Status InvalidArgumentError(absl::string_view message); -Status NotFoundError(absl::string_view message); -Status OutOfRangeError(absl::string_view message); -Status PermissionDeniedError(absl::string_view message); -Status ResourceExhaustedError(absl::string_view message); -Status UnauthenticatedError(absl::string_view message); -Status UnavailableError(absl::string_view message); -Status UnimplementedError(absl::string_view message); -Status UnknownError(absl::string_view message); - // Creates a `Status` object with the `absl::StatusCode::kCancelled` error code // and an empty message. It is provided only for efficiency, given that // message-less kCancelled errors are common in the infrastructure. inline Status CancelledError() { return Status(absl::StatusCode::kCancelled); } -// Each of the functions below returns true if the given status matches the -// error code implied by the function's name. -ABSL_MUST_USE_RESULT bool IsAborted(const Status& status); -ABSL_MUST_USE_RESULT bool IsAlreadyExists(const Status& status); -ABSL_MUST_USE_RESULT bool IsCancelled(const Status& status); -ABSL_MUST_USE_RESULT bool IsDataLoss(const Status& status); -ABSL_MUST_USE_RESULT bool IsDeadlineExceeded(const Status& status); -ABSL_MUST_USE_RESULT bool IsFailedPrecondition(const Status& status); -ABSL_MUST_USE_RESULT bool IsInternal(const Status& status); -ABSL_MUST_USE_RESULT bool IsInvalidArgument(const Status& status); -ABSL_MUST_USE_RESULT bool IsNotFound(const Status& status); -ABSL_MUST_USE_RESULT bool IsOutOfRange(const Status& status); -ABSL_MUST_USE_RESULT bool IsPermissionDenied(const Status& status); -ABSL_MUST_USE_RESULT bool IsResourceExhausted(const Status& status); -ABSL_MUST_USE_RESULT bool IsUnauthenticated(const Status& status); -ABSL_MUST_USE_RESULT bool IsUnavailable(const Status& status); -ABSL_MUST_USE_RESULT bool IsUnimplemented(const Status& status); -ABSL_MUST_USE_RESULT bool IsUnknown(const Status& status); - ABSL_NAMESPACE_END } // namespace absl diff --git a/third_party/abseil_cpp/absl/status/statusor.cc b/third_party/abseil_cpp/absl/status/statusor.cc index 2d22adb27..b954b45e3 100644 --- a/third_party/abseil_cpp/absl/status/statusor.cc +++ b/third_party/abseil_cpp/absl/status/statusor.cc @@ -1,48 +1,71 @@ -/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. - -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. -==============================================================================*/ - +// Copyright 2020 The Abseil 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 +// +// https://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 "absl/status/statusor.h" +#include +#include + #include "absl/base/internal/raw_logging.h" +#include "absl/status/status.h" +#include "absl/strings/str_cat.h" namespace absl { ABSL_NAMESPACE_BEGIN +BadStatusOrAccess::BadStatusOrAccess(absl::Status status) + : status_(std::move(status)) {} + +BadStatusOrAccess::~BadStatusOrAccess() = default; +const char* BadStatusOrAccess::what() const noexcept { + return "Bad StatusOr access"; +} + +const absl::Status& BadStatusOrAccess::status() const { return status_; } + namespace internal_statusor { -#define ABSL_STATUSOR_INTERNAL_BAD_OK_MSG "An OK status is not a valid " \ - "constructor argument to StatusOr" - -void Helper::HandleInvalidStatusCtorArg(Status* status) { - ABSL_RAW_LOG(ERROR, ABSL_STATUSOR_INTERNAL_BAD_OK_MSG); - // Fall back to kInternal. - *status = InternalError(ABSL_STATUSOR_INTERNAL_BAD_OK_MSG); +void Helper::HandleInvalidStatusCtorArg(absl::Status* status) { + const char* kMessage = + "An OK status is not a valid constructor argument to StatusOr"; +#ifdef NDEBUG + ABSL_INTERNAL_LOG(ERROR, kMessage); +#else + ABSL_INTERNAL_LOG(FATAL, kMessage); +#endif + // In optimized builds, we will fall back to InternalError. + *status = absl::InternalError(kMessage); } -#undef ABSL_STATUSOR_INTERNAL_BAD_OK_MSG +void Helper::Crash(const absl::Status& status) { + ABSL_INTERNAL_LOG( + FATAL, + absl::StrCat("Attempting to fetch value instead of handling error ", + status.ToString())); +} -void Helper::Crash(const Status& status) { +void ThrowBadStatusOrAccess(absl::Status status) { #ifdef ABSL_HAVE_EXCEPTIONS - throw status; + throw absl::BadStatusOrAccess(std::move(status)); #else - std::string status_debug = status.ToString(); - ABSL_RAW_LOG(FATAL, "Attempting to fetch value instead of handling error: %s", status_debug.c_str()); - abort(); // TODO(calabrese) Remove once RAW_LOG FATAL is noreturn. + ABSL_INTERNAL_LOG( + FATAL, + absl::StrCat("Attempting to fetch value instead of handling error ", + status.ToString())); + std::abort(); #endif } -} // namespace internal_statusor +} // namespace internal_statusor ABSL_NAMESPACE_END } // namespace absl diff --git a/third_party/abseil_cpp/absl/status/statusor.h b/third_party/abseil_cpp/absl/status/statusor.h index 59a52cb78..469d486fd 100644 --- a/third_party/abseil_cpp/absl/status/statusor.h +++ b/third_party/abseil_cpp/absl/status/statusor.h @@ -1,333 +1,700 @@ -/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. - -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. -==============================================================================*/ - -// StatusOr is the union of a Status object and a T object. StatusOr models -// the concept of an object that is either a value, or an error Status -// explaining why such a value is not present. To this end, StatusOr does not -// allow its Status value to be StatusCode::kOk. +// Copyright 2020 The Abseil Authors. // -// The primary use-case for StatusOr is as the return value of a -// function which may fail. +// 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 // -// Example client usage for a StatusOr, where T is not a pointer: +// https://www.apache.org/licenses/LICENSE-2.0 // -// StatusOr result = DoBigCalculationThatCouldFail(); -// if (result.ok()) { -// float answer = result.ValueOrDie(); -// printf("Big calculation yielded: %f", answer); -// } else { -// LOG(ERROR) << result.status(); -// } +// 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. // -// Example client usage for a StatusOr: +// ----------------------------------------------------------------------------- +// File: statusor.h +// ----------------------------------------------------------------------------- // -// StatusOr result = FooFactory::MakeNewFoo(arg); -// if (result.ok()) { -// std::unique_ptr foo(result.ValueOrDie()); -// foo->DoSomethingCool(); -// } else { -// LOG(ERROR) << result.status(); -// } +// An `absl::StatusOr` represents a union of an `absl::Status` object +// and an object of type `T`. The `absl::StatusOr` will either contain an +// object of type `T` (indicating a successful operation), or an error (of type +// `absl::Status`) explaining why such a value is not present. // -// Example client usage for a StatusOr>: +// In general, check the success of an operation returning an +// `absl::StatusOr` like you would an `absl::Status` by using the `ok()` +// member function. // -// StatusOr> result = FooFactory::MakeNewFoo(arg); -// if (result.ok()) { -// std::unique_ptr foo = std::move(result.ValueOrDie()); -// foo->DoSomethingCool(); -// } else { -// LOG(ERROR) << result.status(); -// } +// Example: // -// Example factory implementation returning StatusOr: -// -// StatusOr FooFactory::MakeNewFoo(int arg) { -// if (arg <= 0) { -// return absl::InvalidArgumentError("Arg must be positive"); -// } else { -// return new Foo(arg); -// } -// } -// -// Note that the assignment operators require that destroying the currently -// stored value cannot invalidate the argument; in other words, the argument -// cannot be an alias for the current value, or anything owned by the current -// value. +// StatusOr result = Calculation(); +// if (result.ok()) { +// result->DoSomethingCool(); +// } else { +// LOG(ERROR) << result.status(); +// } #ifndef ABSL_STATUS_STATUSOR_H_ #define ABSL_STATUS_STATUSOR_H_ +#include +#include +#include +#include +#include +#include + +#include "absl/base/attributes.h" +#include "absl/meta/type_traits.h" +#include "absl/status/internal/statusor_internal.h" #include "absl/status/status.h" -#include "absl/status/statusor_internals.h" +#include "absl/types/variant.h" +#include "absl/utility/utility.h" namespace absl { ABSL_NAMESPACE_BEGIN +// BadStatusOrAccess +// +// This class defines the type of object to throw (if exceptions are enabled), +// when accessing the value of an `absl::StatusOr` object that does not +// contain a value. This behavior is analogous to that of +// `std::bad_optional_access` in the case of accessing an invalid +// `std::optional` value. +// +// Example: +// +// try { +// absl::StatusOr v = FetchInt(); +// DoWork(v.value()); // Accessing value() when not "OK" may throw +// } catch (absl::BadStatusOrAccess& ex) { +// LOG(ERROR) << ex.status(); +// } +class BadStatusOrAccess : public std::exception { + public: + explicit BadStatusOrAccess(absl::Status status); + ~BadStatusOrAccess() override; + + // BadStatusOrAccess::what() + // + // Returns the associated explanatory string of the `absl::StatusOr` + // object's error code. This function only returns the string literal "Bad + // StatusOr Access" for cases when evaluating general exceptions. + // + // The pointer of this string is guaranteed to be valid until any non-const + // function is invoked on the exception object. + const char* what() const noexcept override; + + // BadStatusOrAccess::status() + // + // Returns the associated `absl::Status` of the `absl::StatusOr` object's + // error. + const absl::Status& status() const; + + private: + absl::Status status_; +}; + +// Returned StatusOr objects may not be ignored. +template +class ABSL_MUST_USE_RESULT StatusOr; + +// absl::StatusOr +// +// The `absl::StatusOr` class template is a union of an `absl::Status` object +// and an object of type `T`. The `absl::StatusOr` models an object that is +// either a usable object, or an error (of type `absl::Status`) explaining why +// such an object is not present. An `absl::StatusOr` is typically the return +// value of a function which may fail. +// +// An `absl::StatusOr` can never hold an "OK" status (an +// `absl::StatusCode::kOk` value); instead, the presence of an object of type +// `T` indicates success. Instead of checking for a `kOk` value, use the +// `absl::StatusOr::ok()` member function. (It is for this reason, and code +// readability, that using the `ok()` function is preferred for `absl::Status` +// as well.) +// +// Example: +// +// StatusOr result = DoBigCalculationThatCouldFail(); +// if (result.ok()) { +// result->DoSomethingCool(); +// } else { +// LOG(ERROR) << result.status(); +// } +// +// Accessing the object held by an `absl::StatusOr` should be performed via +// `operator*` or `operator->`, after a call to `ok()` confirms that the +// `absl::StatusOr` holds an object of type `T`: +// +// Example: +// +// absl::StatusOr i = GetCount(); +// if (i.ok()) { +// updated_total += *i +// } +// +// NOTE: using `absl::StatusOr::value()` when no valid value is present will +// throw an exception if exceptions are enabled or terminate the process when +// execeptions are not enabled. +// +// Example: +// +// StatusOr result = DoBigCalculationThatCouldFail(); +// const Foo& foo = result.value(); // Crash/exception if no value present +// foo.DoSomethingCool(); +// +// A `absl::StatusOr` can be constructed from a null pointer like any other +// pointer value, and the result will be that `ok()` returns `true` and +// `value()` returns `nullptr`. Checking the value of pointer in an +// `absl::StatusOr` generally requires a bit more care, to ensure both that a +// value is present and that value is not null: +// +// StatusOr> result = FooFactory::MakeNewFoo(arg); +// if (!result.ok()) { +// LOG(ERROR) << result.status(); +// } else if (*result == nullptr) { +// LOG(ERROR) << "Unexpected null pointer"; +// } else { +// (*result)->DoSomethingCool(); +// } +// +// Example factory implementation returning StatusOr: +// +// StatusOr FooFactory::MakeFoo(int arg) { +// if (arg <= 0) { +// return absl::Status(absl::StatusCode::kInvalidArgument, +// "Arg must be positive"); +// } +// return Foo(arg); +// } template class StatusOr : private internal_statusor::StatusOrData, - private internal_statusor::TraitsBase< - std::is_copy_constructible::value, - std::is_move_constructible::value> { + private internal_statusor::CopyCtorBase, + private internal_statusor::MoveCtorBase, + private internal_statusor::CopyAssignBase, + private internal_statusor::MoveAssignBase { template friend class StatusOr; typedef internal_statusor::StatusOrData Base; public: - typedef T element_type; // DEPRECATED: use `value_type`. + // StatusOr::value_type + // + // This instance data provides a generic `value_type` member for use within + // generic programming. This usage is analogous to that of + // `optional::value_type` in the case of `std::optional`. typedef T value_type; - // Constructs a new StatusOr with Status::UNKNOWN status. This is marked - // 'explicit' to try to catch cases like 'return {};', where people think - // StatusOr> will be initialized with an empty vector, - // instead of a Status::UNKNOWN status. + // Constructors + + // Constructs a new `absl::StatusOr` with an `absl::StatusCode::kUnknown` + // status. This constructor is marked 'explicit' to prevent usages in return + // values such as 'return {};', under the misconception that + // `absl::StatusOr>` will be initialized with an empty + // vector, instead of an `absl::StatusCode::kUnknown` error code. explicit StatusOr(); - // StatusOr will be copy constructible/assignable if T is copy - // constructible. + // `StatusOr` is copy constructible if `T` is copy constructible. StatusOr(const StatusOr&) = default; + // `StatusOr` is copy assignable if `T` is copy constructible and copy + // assignable. StatusOr& operator=(const StatusOr&) = default; - // StatusOr will be move constructible/assignable if T is move - // constructible. + // `StatusOr` is move constructible if `T` is move constructible. StatusOr(StatusOr&&) = default; + // `StatusOr` is moveAssignable if `T` is move constructible and move + // assignable. StatusOr& operator=(StatusOr&&) = default; - // Conversion copy/move constructor, T must be convertible from U. - template ::value>::type* = nullptr> - StatusOr(const StatusOr& other); - template ::value>::type* = nullptr> - StatusOr(StatusOr&& other); + // Converting Constructors - // Conversion copy/move assignment operator, T must be convertible from U. - template ::value>::type* = nullptr> - StatusOr& operator=(const StatusOr& other); - template ::value>::type* = nullptr> - StatusOr& operator=(StatusOr&& other); + // Constructs a new `absl::StatusOr` from an `absl::StatusOr`, when `T` + // is constructible from `U`. To avoid ambiguity, these constructors are + // disabled if `T` is also constructible from `StatusOr.`. This constructor + // is explicit if and only if the corresponding construction of `T` from `U` + // is explicit. (This constructor inherits its explicitness from the + // underlying constructor.) + template < + typename U, + absl::enable_if_t< + absl::conjunction< + absl::negation>, + std::is_constructible, + std::is_convertible, + absl::negation< + internal_statusor::IsConstructibleOrConvertibleFromStatusOr< + T, U>>>::value, + int> = 0> + StatusOr(const StatusOr& other) // NOLINT + : Base(static_cast::Base&>(other)) {} + template < + typename U, + absl::enable_if_t< + absl::conjunction< + absl::negation>, + std::is_constructible, + absl::negation>, + absl::negation< + internal_statusor::IsConstructibleOrConvertibleFromStatusOr< + T, U>>>::value, + int> = 0> + explicit StatusOr(const StatusOr& other) + : Base(static_cast::Base&>(other)) {} - // Constructs a new StatusOr with the given value. After calling this - // constructor, calls to ValueOrDie() will succeed, and calls to status() will - // return OK. + template < + typename U, + absl::enable_if_t< + absl::conjunction< + absl::negation>, std::is_constructible, + std::is_convertible, + absl::negation< + internal_statusor::IsConstructibleOrConvertibleFromStatusOr< + T, U>>>::value, + int> = 0> + StatusOr(StatusOr&& other) // NOLINT + : Base(static_cast::Base&&>(other)) {} + template < + typename U, + absl::enable_if_t< + absl::conjunction< + absl::negation>, std::is_constructible, + absl::negation>, + absl::negation< + internal_statusor::IsConstructibleOrConvertibleFromStatusOr< + T, U>>>::value, + int> = 0> + explicit StatusOr(StatusOr&& other) + : Base(static_cast::Base&&>(other)) {} + + // Converting Assignment Operators + + // Creates an `absl::StatusOr` through assignment from an + // `absl::StatusOr` when: // - // NOTE: Not explicit - we want to use StatusOr as a return type - // so it is convenient and sensible to be able to do 'return T()' - // when the return type is StatusOr. + // * Both `absl::StatusOr` and `absl::StatusOr` are OK by assigning + // `U` to `T` directly. + // * `absl::StatusOr` is OK and `absl::StatusOr` contains an error + // code by destroying `absl::StatusOr`'s value and assigning from + // `absl::StatusOr' + // * `absl::StatusOr` contains an error code and `absl::StatusOr` is + // OK by directly initializing `T` from `U`. + // * Both `absl::StatusOr` and `absl::StatusOr` contain an error + // code by assigning the `Status` in `absl::StatusOr` to + // `absl::StatusOr` // - // REQUIRES: T is copy constructible. - StatusOr(const T& value); + // These overloads only apply if `absl::StatusOr` is constructible and + // assignable from `absl::StatusOr` and `StatusOr` cannot be directly + // assigned from `StatusOr`. + template < + typename U, + absl::enable_if_t< + absl::conjunction< + absl::negation>, + std::is_constructible, + std::is_assignable, + absl::negation< + internal_statusor:: + IsConstructibleOrConvertibleOrAssignableFromStatusOr< + T, U>>>::value, + int> = 0> + StatusOr& operator=(const StatusOr& other) { + this->Assign(other); + return *this; + } + template < + typename U, + absl::enable_if_t< + absl::conjunction< + absl::negation>, std::is_constructible, + std::is_assignable, + absl::negation< + internal_statusor:: + IsConstructibleOrConvertibleOrAssignableFromStatusOr< + T, U>>>::value, + int> = 0> + StatusOr& operator=(StatusOr&& other) { + this->Assign(std::move(other)); + return *this; + } - // Constructs a new StatusOr with the given non-ok status. After calling - // this constructor, calls to ValueOrDie() will CHECK-fail. + // Constructs a new `absl::StatusOr` with a non-ok status. After calling + // this constructor, `this->ok()` will be `false` and calls to `value()` will + // crash, or produce an exception if exceptions are enabled. // - // NOTE: Not explicit - we want to use StatusOr as a return - // value, so it is convenient and sensible to be able to do 'return - // Status()' when the return type is StatusOr. + // The constructor also takes any type `U` that is convertible to + // `absl::Status`. This constructor is explicit if an only if `U` is not of + // type `absl::Status` and the conversion from `U` to `Status` is explicit. // - // REQUIRES: !status.ok(). This requirement is enforced with either an - // exception (the passed absl::Status) or a FATAL log. - StatusOr(const Status& status); - StatusOr& operator=(const Status& status); + // REQUIRES: !Status(std::forward(v)).ok(). This requirement is DCHECKed. + // In optimized builds, passing absl::OkStatus() here will have the effect + // of passing absl::StatusCode::kInternal as a fallback. + template < + typename U = absl::Status, + absl::enable_if_t< + absl::conjunction< + std::is_convertible, + std::is_constructible, + absl::negation, absl::StatusOr>>, + absl::negation, T>>, + absl::negation, absl::in_place_t>>, + absl::negation>>::value, + int> = 0> + StatusOr(U&& v) : Base(std::forward(v)) {} - // TODO(b/62186997): Add operator=(T) overloads. + template < + typename U = absl::Status, + absl::enable_if_t< + absl::conjunction< + absl::negation>, + std::is_constructible, + absl::negation, absl::StatusOr>>, + absl::negation, T>>, + absl::negation, absl::in_place_t>>, + absl::negation>>::value, + int> = 0> + explicit StatusOr(U&& v) : Base(std::forward(v)) {} - // Similar to the `const T&` overload. + template < + typename U = absl::Status, + absl::enable_if_t< + absl::conjunction< + std::is_convertible, + std::is_constructible, + absl::negation, absl::StatusOr>>, + absl::negation, T>>, + absl::negation, absl::in_place_t>>, + absl::negation>>::value, + int> = 0> + StatusOr& operator=(U&& v) { + this->AssignStatus(std::forward(v)); + return *this; + } + + // Perfect-forwarding value assignment operator. + + // If `*this` contains a `T` value before the call, the contained value is + // assigned from `std::forward(v)`; Otherwise, it is directly-initialized + // from `std::forward(v)`. + // This function does not participate in overload unless: + // 1. `std::is_constructible_v` is true, + // 2. `std::is_assignable_v` is true. + // 3. `std::is_same_v, std::remove_cvref_t>` is false. + // 4. Assigning `U` to `T` is not ambiguous: + // If `U` is `StatusOr` and `T` is constructible and assignable from + // both `StatusOr` and `V`, the assignment is considered bug-prone and + // ambiguous thus will fail to compile. For example: + // StatusOr s1 = true; // s1.ok() && *s1 == true + // StatusOr s2 = false; // s2.ok() && *s2 == false + // s1 = s2; // ambiguous, `s1 = *s2` or `s1 = bool(s2)`? + template < + typename U = T, + typename = typename std::enable_if, std::is_assignable, + absl::disjunction< + std::is_same>, T>, + absl::conjunction< + absl::negation>, + absl::negation>>>, + internal_statusor::IsForwardingAssignmentValid>::value>::type> + StatusOr& operator=(U&& v) { + this->Assign(std::forward(v)); + return *this; + } + + // Constructs the inner value `T` in-place using the provided args, using the + // `T(args...)` constructor. + template + explicit StatusOr(absl::in_place_t, Args&&... args); + template + explicit StatusOr(absl::in_place_t, std::initializer_list ilist, + Args&&... args); + + // Constructs the inner value `T` in-place using the provided args, using the + // `T(U)` (direct-initialization) constructor. This constructor is only valid + // if `T` can be constructed from a `U`. Can accept move or copy constructors. // - // REQUIRES: T is move constructible. - StatusOr(T&& value); + // This constructor is explicit if `U` is not convertible to `T`. To avoid + // ambiguity, this constuctor is disabled if `U` is a `StatusOr`, where `J` + // is convertible to `T`. + template < + typename U = T, + absl::enable_if_t< + absl::conjunction< + internal_statusor::IsDirectInitializationValid, + std::is_constructible, std::is_convertible, + absl::disjunction< + std::is_same>, + T>, + absl::conjunction< + absl::negation>, + absl::negation< + internal_statusor::HasConversionOperatorToStatusOr< + T, U&&>>>>>::value, + int> = 0> + StatusOr(U&& u) // NOLINT + : StatusOr(absl::in_place, std::forward(u)) { + } - // RValue versions of the operations declared above. - StatusOr(Status&& status); - StatusOr& operator=(Status&& status); + template < + typename U = T, + absl::enable_if_t< + absl::conjunction< + internal_statusor::IsDirectInitializationValid, + absl::disjunction< + std::is_same>, + T>, + absl::conjunction< + absl::negation>, + absl::negation< + internal_statusor::HasConversionOperatorToStatusOr< + T, U&&>>>>, + std::is_constructible, + absl::negation>>::value, + int> = 0> + explicit StatusOr(U&& u) // NOLINT + : StatusOr(absl::in_place, std::forward(u)) { + } - // Returns this->status().ok() - bool ok() const { return this->status_.ok(); } + // StatusOr::ok() + // + // Returns whether or not this `absl::StatusOr` holds a `T` value. This + // member function is analagous to `absl::Status::ok()` and should be used + // similarly to check the status of return values. + // + // Example: + // + // StatusOr result = DoBigCalculationThatCouldFail(); + // if (result.ok()) { + // // Handle result + // else { + // // Handle error + // } + ABSL_MUST_USE_RESULT bool ok() const { return this->status_.ok(); } - // Returns a reference to our status. If this contains a T, then - // returns OkStatus(). + // StatusOr::status() + // + // Returns a reference to the current `absl::Status` contained within the + // `absl::StatusOr`. If `absl::StatusOr` contains a `T`, then this + // function returns `absl::OkStatus()`. const Status& status() const &; Status status() &&; - // Returns a reference to our current value, or CHECK-fails if !this->ok(). + // StatusOr::value() + // + // Returns a reference to the held value if `this->ok()`. Otherwise, throws + // `absl::BadStatusOrAccess` if exceptions are enabled, or is guaranteed to + // terminate the process if exceptions are disabled. + // + // If you have already checked the status using `this->ok()`, you probably + // want to use `operator*()` or `operator->()` to access the value instead of + // `value`. // // Note: for value types that are cheap to copy, prefer simple code: // - // T value = statusor.ValueOrDie(); + // T value = statusor.value(); // // Otherwise, if the value type is expensive to copy, but can be left // in the StatusOr, simply assign to a reference: // - // T& value = statusor.ValueOrDie(); // or `const T&` + // T& value = statusor.value(); // or `const T&` // // Otherwise, if the value type supports an efficient move, it can be // used as follows: // - // T value = std::move(statusor).ValueOrDie(); + // T value = std::move(statusor).value(); // - // The std::move on statusor instead of on the whole expression enables + // The `std::move` on statusor instead of on the whole expression enables // warnings about possible uses of the statusor object after the move. - // C++ style guide waiver for ref-qualified overloads granted in cl/143176389 - // See go/ref-qualifiers for more details on such overloads. - const T& ValueOrDie() const &; - T& ValueOrDie() &; - const T&& ValueOrDie() const &&; - T&& ValueOrDie() &&; + const T& value() const&; + T& value() &; + const T&& value() const&&; + T&& value() &&; + // StatusOr:: operator*() + // // Returns a reference to the current value. // - // REQUIRES: this->ok() == true, otherwise the behavior is undefined. + // REQUIRES: `this->ok() == true`, otherwise the behavior is undefined. // - // Use this->ok() or `operator bool()` to verify that there is a current - // value. Alternatively, see ValueOrDie() for a similar API that guarantees - // CHECK-failing if there is no current value. + // Use `this->ok()` to verify that there is a current value within the + // `absl::StatusOr`. Alternatively, see the `value()` member function for a + // similar API that guarantees crashing or throwing an exception if there is + // no current value. const T& operator*() const&; T& operator*() &; const T&& operator*() const&&; T&& operator*() &&; + // StatusOr::operator->() + // // Returns a pointer to the current value. // - // REQUIRES: this->ok() == true, otherwise the behavior is undefined. + // REQUIRES: `this->ok() == true`, otherwise the behavior is undefined. // - // Use this->ok() or `operator bool()` to verify that there is a current - // value. + // Use `this->ok()` to verify that there is a current value. const T* operator->() const; T* operator->(); - T ConsumeValueOrDie() { return std::move(ValueOrDie()); } + // StatusOr::value_or() + // + // Returns the current value if `this->ok() == true`. Otherwise constructs a + // value using the provided `default_value`. + // + // Unlike `value`, this function returns by value, copying the current value + // if necessary. If the value type supports an efficient move, it can be used + // as follows: + // + // T value = std::move(statusor).value_or(def); + // + // Unlike with `value`, calling `std::move()` on the result of `value_or` will + // still trigger a copy. + template + T value_or(U&& default_value) const&; + template + T value_or(U&& default_value) &&; + // StatusOr::IgnoreError() + // // Ignores any errors. This method does nothing except potentially suppress // complaints from any tools that are checking that errors are not dropped on // the floor. void IgnoreError() const; + + // StatusOr::emplace() + // + // Reconstructs the inner value T in-place using the provided args, using the + // T(args...) constructor. Returns reference to the reconstructed `T`. + template + T& emplace(Args&&... args) { + if (ok()) { + this->Clear(); + this->MakeValue(std::forward(args)...); + } else { + this->MakeValue(std::forward(args)...); + this->status_ = absl::OkStatus(); + } + return this->data_; + } + + template < + typename U, typename... Args, + absl::enable_if_t< + std::is_constructible&, Args&&...>::value, + int> = 0> + T& emplace(std::initializer_list ilist, Args&&... args) { + if (ok()) { + this->Clear(); + this->MakeValue(ilist, std::forward(args)...); + } else { + this->MakeValue(ilist, std::forward(args)...); + this->status_ = absl::OkStatus(); + } + return this->data_; + } + + private: + using internal_statusor::StatusOrData::Assign; + template + void Assign(const absl::StatusOr& other); + template + void Assign(absl::StatusOr&& other); }; -//////////////////////////////////////////////////////////////////////////////// +// operator==() +// +// This operator checks the equality of two `absl::StatusOr` objects. +template +bool operator==(const StatusOr& lhs, const StatusOr& rhs) { + if (lhs.ok() && rhs.ok()) return *lhs == *rhs; + return lhs.status() == rhs.status(); +} + +// operator!=() +// +// This operator checks the inequality of two `absl::StatusOr` objects. +template +bool operator!=(const StatusOr& lhs, const StatusOr& rhs) { + return !(lhs == rhs); +} + +//------------------------------------------------------------------------------ // Implementation details for StatusOr +//------------------------------------------------------------------------------ + +// TODO(sbenza): avoid the string here completely. +template +StatusOr::StatusOr() : Base(Status(absl::StatusCode::kUnknown, "")) {} template -StatusOr::StatusOr() : Base(Status(StatusCode::kUnknown, "")) {} - -template -StatusOr::StatusOr(const T& value) : Base(value) {} - -template -StatusOr::StatusOr(const Status& status) : Base(status) {} - -template -StatusOr& StatusOr::operator=(const Status& status) { - this->Assign(status); - return *this; -} - -template -StatusOr::StatusOr(T&& value) : Base(std::move(value)) {} - -template -StatusOr::StatusOr(Status&& status) : Base(std::move(status)) {} - -template -StatusOr& StatusOr::operator=(Status&& status) { - this->Assign(std::move(status)); - return *this; -} - -template -template ::value>::type*> -inline StatusOr::StatusOr(const StatusOr& other) - : Base(static_cast::Base&>(other)) {} - -template -template ::value>::type*> -inline StatusOr& StatusOr::operator=(const StatusOr& other) { - if (other.ok()) - this->Assign(other.ValueOrDie()); - else - this->Assign(other.status()); - return *this; -} - -template -template ::value>::type*> -inline StatusOr::StatusOr(StatusOr&& other) - : Base(static_cast::Base&&>(other)) {} - -template -template ::value>::type*> -inline StatusOr& StatusOr::operator=(StatusOr&& other) { +template +inline void StatusOr::Assign(const StatusOr& other) { if (other.ok()) { - this->Assign(std::move(other).ValueOrDie()); + this->Assign(*other); } else { - this->Assign(std::move(other).status()); + this->AssignStatus(other.status()); } - return *this; } template -const Status& StatusOr::status() const & { - return this->status_; +template +inline void StatusOr::Assign(StatusOr&& other) { + if (other.ok()) { + this->Assign(*std::move(other)); + } else { + this->AssignStatus(std::move(other).status()); + } } template +template +StatusOr::StatusOr(absl::in_place_t, Args&&... args) + : Base(absl::in_place, std::forward(args)...) {} + +template +template +StatusOr::StatusOr(absl::in_place_t, std::initializer_list ilist, + Args&&... args) + : Base(absl::in_place, ilist, std::forward(args)...) {} + +template +const Status& StatusOr::status() const & { return this->status_; } +template Status StatusOr::status() && { - // Note that we copy instead of moving the status here so that - // ~StatusOrData() can call ok() without invoking UB. - return ok() ? OkStatus() : this->status_; + return ok() ? OkStatus() : std::move(this->status_); } template -const T& StatusOr::ValueOrDie() const & { - this->EnsureOk(); +const T& StatusOr::value() const& { + if (!this->ok()) internal_statusor::ThrowBadStatusOrAccess(this->status_); return this->data_; } template -T& StatusOr::ValueOrDie() & { - this->EnsureOk(); +T& StatusOr::value() & { + if (!this->ok()) internal_statusor::ThrowBadStatusOrAccess(this->status_); return this->data_; } template -const T&& StatusOr::ValueOrDie() const && { - this->EnsureOk(); +const T&& StatusOr::value() const&& { + if (!this->ok()) { + internal_statusor::ThrowBadStatusOrAccess(std::move(this->status_)); + } return std::move(this->data_); } template -T&& StatusOr::ValueOrDie() && { - this->EnsureOk(); +T&& StatusOr::value() && { + if (!this->ok()) { + internal_statusor::ThrowBadStatusOrAccess(std::move(this->status_)); + } return std::move(this->data_); } -template -const T* StatusOr::operator->() const { - this->EnsureOk(); - return &this->data_; -} - -template -T* StatusOr::operator->() { - this->EnsureOk(); - return &this->data_; -} - template const T& StatusOr::operator*() const& { this->EnsureOk(); @@ -352,6 +719,36 @@ T&& StatusOr::operator*() && { return std::move(this->data_); } +template +const T* StatusOr::operator->() const { + this->EnsureOk(); + return &this->data_; +} + +template +T* StatusOr::operator->() { + this->EnsureOk(); + return &this->data_; +} + +template +template +T StatusOr::value_or(U&& default_value) const& { + if (ok()) { + return this->data_; + } + return std::forward(default_value); +} + +template +template +T StatusOr::value_or(U&& default_value) && { + if (ok()) { + return std::move(this->data_); + } + return std::forward(default_value); +} + template void StatusOr::IgnoreError() const { // no-op @@ -360,35 +757,4 @@ void StatusOr::IgnoreError() const { ABSL_NAMESPACE_END } // namespace absl -#define ASSERT_OK_AND_ASSIGN(lhs, rexpr) \ - ABSL_ASSERT_OK_AND_ASSIGN_IMPL( \ - ABSL_STATUS_MACROS_CONCAT_NAME(_status_or_value, __COUNTER__), lhs, \ - rexpr); - -#define ABSL_ASSERT_OK_AND_ASSIGN_IMPL(statusor, lhs, rexpr) \ - auto statusor = (rexpr); \ - ASSERT_TRUE(statusor.status().ok()) << statusor.status(); \ - lhs = std::move(statusor.ValueOrDie()) - -#define ABSL_STATUS_MACROS_CONCAT_NAME(x, y) ABSL_STATUS_MACROS_CONCAT_IMPL(x, y) -#define ABSL_STATUS_MACROS_CONCAT_IMPL(x, y) x##y - -#define ASSIGN_OR_RETURN(lhs, rexpr) \ - ABSL_ASSIGN_OR_RETURN_IMPL( \ - ABSL_STATUS_MACROS_CONCAT_NAME(_status_or_value, __COUNTER__), lhs, rexpr) - -#define ABSL_ASSIGN_OR_RETURN_IMPL(statusor, lhs, rexpr) \ - auto statusor = (rexpr); \ - if (ABSL_PREDICT_FALSE(!statusor.ok())) { \ - return statusor.status(); \ - } \ - lhs = std::move(statusor.ValueOrDie()) - -#define RETURN_IF_ERROR(status) \ - do { \ - if (ABSL_PREDICT_FALSE(!status.ok())) { \ - return status; \ - } \ - } while(0) - #endif // ABSL_STATUS_STATUSOR_H_ diff --git a/third_party/abseil_cpp/absl/status/statusor_test.cc b/third_party/abseil_cpp/absl/status/statusor_test.cc index fc849515c..c2e8fb7e3 100644 --- a/third_party/abseil_cpp/absl/status/statusor_test.cc +++ b/third_party/abseil_cpp/absl/status/statusor_test.cc @@ -1,753 +1,1811 @@ -/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. - -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. -==============================================================================*/ - -// Unit tests for StatusOr +// Copyright 2020 The Abseil 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 +// +// https://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 "absl/status/statusor.h" +#include +#include #include #include +#include -#include "absl/base/internal/exception_testing.h" +#include "gmock/gmock.h" #include "gtest/gtest.h" - -namespace absl { -ABSL_NAMESPACE_BEGIN +#include "absl/base/casts.h" +#include "absl/memory/memory.h" +#include "absl/status/status.h" +#include "absl/types/any.h" +#include "absl/utility/utility.h" namespace { +using ::testing::AllOf; +using ::testing::AnyWith; +using ::testing::ElementsAre; +using ::testing::Field; +using ::testing::Ne; +using ::testing::Not; +using ::testing::Pointee; +using ::testing::VariantWith; + +#ifdef GTEST_HAS_STATUS_MATCHERS +using ::testing::status::IsOk; +using ::testing::status::IsOkAndHolds; +#else // GTEST_HAS_STATUS_MATCHERS +inline const ::absl::Status& GetStatus(const ::absl::Status& status) { + return status; +} + +template +inline const ::absl::Status& GetStatus(const ::absl::StatusOr& status) { + return status.status(); +} + +// Monomorphic implementation of matcher IsOkAndHolds(m). StatusOrType is a +// reference to StatusOr. +template +class IsOkAndHoldsMatcherImpl + : public ::testing::MatcherInterface { + public: + typedef + typename std::remove_reference::type::value_type value_type; + + template + explicit IsOkAndHoldsMatcherImpl(InnerMatcher&& inner_matcher) + : inner_matcher_(::testing::SafeMatcherCast( + std::forward(inner_matcher))) {} + + void DescribeTo(std::ostream* os) const override { + *os << "is OK and has a value that "; + inner_matcher_.DescribeTo(os); + } + + void DescribeNegationTo(std::ostream* os) const override { + *os << "isn't OK or has a value that "; + inner_matcher_.DescribeNegationTo(os); + } + + bool MatchAndExplain( + StatusOrType actual_value, + ::testing::MatchResultListener* result_listener) const override { + if (!actual_value.ok()) { + *result_listener << "which has status " << actual_value.status(); + return false; + } + + ::testing::StringMatchResultListener inner_listener; + const bool matches = + inner_matcher_.MatchAndExplain(*actual_value, &inner_listener); + const std::string inner_explanation = inner_listener.str(); + if (!inner_explanation.empty()) { + *result_listener << "which contains value " + << ::testing::PrintToString(*actual_value) << ", " + << inner_explanation; + } + return matches; + } + + private: + const ::testing::Matcher inner_matcher_; +}; + +// Implements IsOkAndHolds(m) as a polymorphic matcher. +template +class IsOkAndHoldsMatcher { + public: + explicit IsOkAndHoldsMatcher(InnerMatcher inner_matcher) + : inner_matcher_(std::move(inner_matcher)) {} + + // Converts this polymorphic matcher to a monomorphic matcher of the + // given type. StatusOrType can be either StatusOr or a + // reference to StatusOr. + template + operator ::testing::Matcher() const { // NOLINT + return ::testing::Matcher( + new IsOkAndHoldsMatcherImpl(inner_matcher_)); + } + + private: + const InnerMatcher inner_matcher_; +}; + +// Monomorphic implementation of matcher IsOk() for a given type T. +// T can be Status, StatusOr<>, or a reference to either of them. +template +class MonoIsOkMatcherImpl : public ::testing::MatcherInterface { + public: + void DescribeTo(std::ostream* os) const override { *os << "is OK"; } + void DescribeNegationTo(std::ostream* os) const override { + *os << "is not OK"; + } + bool MatchAndExplain(T actual_value, + ::testing::MatchResultListener*) const override { + return GetStatus(actual_value).ok(); + } +}; + +// Implements IsOk() as a polymorphic matcher. +class IsOkMatcher { + public: + template + operator ::testing::Matcher() const { // NOLINT + return ::testing::Matcher(new MonoIsOkMatcherImpl()); + } +}; + +// Macros for testing the results of functions that return absl::Status or +// absl::StatusOr (for any type T). +#define EXPECT_OK(expression) EXPECT_THAT(expression, IsOk()) + +// Returns a gMock matcher that matches a StatusOr<> whose status is +// OK and whose value matches the inner matcher. +template +IsOkAndHoldsMatcher::type> IsOkAndHolds( + InnerMatcher&& inner_matcher) { + return IsOkAndHoldsMatcher::type>( + std::forward(inner_matcher)); +} + +// Returns a gMock matcher that matches a Status or StatusOr<> which is OK. +inline IsOkMatcher IsOk() { return IsOkMatcher(); } +#endif // GTEST_HAS_STATUS_MATCHERS + +struct CopyDetector { + CopyDetector() = default; + explicit CopyDetector(int xx) : x(xx) {} + CopyDetector(CopyDetector&& d) noexcept + : x(d.x), copied(false), moved(true) {} + CopyDetector(const CopyDetector& d) : x(d.x), copied(true), moved(false) {} + CopyDetector& operator=(const CopyDetector& c) { + x = c.x; + copied = true; + moved = false; + return *this; + } + CopyDetector& operator=(CopyDetector&& c) noexcept { + x = c.x; + copied = false; + moved = true; + return *this; + } + int x = 0; + bool copied = false; + bool moved = false; +}; + +testing::Matcher CopyDetectorHas(int a, bool b, bool c) { + return AllOf(Field(&CopyDetector::x, a), Field(&CopyDetector::moved, b), + Field(&CopyDetector::copied, c)); +} + class Base1 { public: virtual ~Base1() {} - int pad_; + int pad; }; class Base2 { public: virtual ~Base2() {} - int yetotherpad_; + int yetotherpad; }; class Derived : public Base1, public Base2 { public: - ~Derived() override {} - int evenmorepad_; + virtual ~Derived() {} + int evenmorepad; }; class CopyNoAssign { public: - explicit CopyNoAssign(int value) : foo_(value) {} - CopyNoAssign(const CopyNoAssign& other) : foo_(other.foo_) {} - int foo_; + explicit CopyNoAssign(int value) : foo(value) {} + CopyNoAssign(const CopyNoAssign& other) : foo(other.foo) {} + int foo; private: const CopyNoAssign& operator=(const CopyNoAssign&); }; -class NoDefaultConstructor { - public: - explicit NoDefaultConstructor(int foo); -}; - -static_assert(!std::is_default_constructible(), - "Should not be default-constructible."); - -StatusOr> ReturnUniquePtr() { +absl::StatusOr> ReturnUniquePtr() { // Uses implicit constructor from T&& - return std::unique_ptr(new int(0)); + return absl::make_unique(0); } TEST(StatusOr, ElementType) { - static_assert(std::is_same::element_type, int>(), ""); - static_assert(std::is_same::element_type, char>(), ""); -} - -TEST(StatusOr, NullPointerStatusOr) { - // As a very special case, null-plain-pointer StatusOr used to be an - // error. Test that it no longer is. - StatusOr null_status(nullptr); - EXPECT_TRUE(null_status.ok()); - EXPECT_EQ(null_status.ValueOrDie(), nullptr); -} - -TEST(StatusOr, TestNoDefaultConstructorInitialization) { - // Explicitly initialize it with an error code. - StatusOr statusor(CancelledError("")); - EXPECT_FALSE(statusor.ok()); - EXPECT_EQ(statusor.status().code(), absl::StatusCode::kCancelled); - - // Default construction of StatusOr initializes it with an UNKNOWN error code. - StatusOr statusor2; - EXPECT_FALSE(statusor2.ok()); - EXPECT_EQ(statusor2.status().code(), absl::StatusCode::kUnknown); + static_assert(std::is_same::value_type, int>(), ""); + static_assert(std::is_same::value_type, char>(), ""); } TEST(StatusOr, TestMoveOnlyInitialization) { - StatusOr> thing(ReturnUniquePtr()); + absl::StatusOr> thing(ReturnUniquePtr()); ASSERT_TRUE(thing.ok()); - EXPECT_EQ(0, *thing.ValueOrDie()); - int* previous = thing.ValueOrDie().get(); + EXPECT_EQ(0, **thing); + int* previous = thing->get(); thing = ReturnUniquePtr(); EXPECT_TRUE(thing.ok()); - EXPECT_EQ(0, *thing.ValueOrDie()); - EXPECT_NE(previous, thing.ValueOrDie().get()); -} - -TEST(StatusOr, TestMoveOnlyStatusCtr) { - StatusOr> thing(CancelledError("")); - ASSERT_FALSE(thing.ok()); + EXPECT_EQ(0, **thing); + EXPECT_NE(previous, thing->get()); } TEST(StatusOr, TestMoveOnlyValueExtraction) { - StatusOr> thing(ReturnUniquePtr()); + absl::StatusOr> thing(ReturnUniquePtr()); ASSERT_TRUE(thing.ok()); - std::unique_ptr ptr = thing.ConsumeValueOrDie(); + std::unique_ptr ptr = *std::move(thing); EXPECT_EQ(0, *ptr); thing = std::move(ptr); - ptr = std::move(thing.ValueOrDie()); + ptr = std::move(*thing); EXPECT_EQ(0, *ptr); } +TEST(StatusOr, TestMoveOnlyInitializationFromTemporaryByValueOrDie) { + std::unique_ptr ptr(*ReturnUniquePtr()); + EXPECT_EQ(0, *ptr); +} + +TEST(StatusOr, TestValueOrDieOverloadForConstTemporary) { + static_assert( + std::is_same&&>().value())>(), + "value() for const temporaries should return const T&&"); +} + TEST(StatusOr, TestMoveOnlyConversion) { - StatusOr> const_thing(ReturnUniquePtr()); + absl::StatusOr> const_thing(ReturnUniquePtr()); EXPECT_TRUE(const_thing.ok()); - EXPECT_EQ(0, *const_thing.ValueOrDie()); + EXPECT_EQ(0, **const_thing); // Test rvalue converting assignment - const int* const_previous = const_thing.ValueOrDie().get(); + const int* const_previous = const_thing->get(); const_thing = ReturnUniquePtr(); EXPECT_TRUE(const_thing.ok()); - EXPECT_EQ(0, *const_thing.ValueOrDie()); - EXPECT_NE(const_previous, const_thing.ValueOrDie().get()); + EXPECT_EQ(0, **const_thing); + EXPECT_NE(const_previous, const_thing->get()); } TEST(StatusOr, TestMoveOnlyVector) { - // Sanity check that StatusOr works in vector. - std::vector>> vec; + // Sanity check that absl::StatusOr works in vector. + std::vector>> vec; vec.push_back(ReturnUniquePtr()); vec.resize(2); auto another_vec = std::move(vec); - EXPECT_EQ(0, *another_vec[0].ValueOrDie()); - EXPECT_EQ(absl::StatusCode::kUnknown, another_vec[1].status().code()); -} - -TEST(StatusOr, TestMoveWithValuesAndErrors) { - StatusOr status_or(std::string(1000, '0')); - StatusOr value1(std::string(1000, '1')); - StatusOr value2(std::string(1000, '2')); - StatusOr error1(UnknownError("error1")); - StatusOr error2(UnknownError("error2")); - - ASSERT_TRUE(status_or.ok()); - EXPECT_EQ(std::string(1000, '0'), status_or.ValueOrDie()); - - // Overwrite the value in status_or with another value. - status_or = std::move(value1); - ASSERT_TRUE(status_or.ok()); - EXPECT_EQ(std::string(1000, '1'), status_or.ValueOrDie()); - - // Overwrite the value in status_or with an error. - status_or = std::move(error1); - ASSERT_FALSE(status_or.ok()); - EXPECT_EQ("error1", status_or.status().message()); - - // Overwrite the error in status_or with another error. - status_or = std::move(error2); - ASSERT_FALSE(status_or.ok()); - EXPECT_EQ("error2", status_or.status().message()); - - // Overwrite the error with a value. - status_or = std::move(value2); - ASSERT_TRUE(status_or.ok()); - EXPECT_EQ(std::string(1000, '2'), status_or.ValueOrDie()); -} - -TEST(StatusOr, TestCopyWithValuesAndErrors) { - StatusOr status_or(std::string(1000, '0')); - StatusOr value1(std::string(1000, '1')); - StatusOr value2(std::string(1000, '2')); - StatusOr error1(UnknownError("error1")); - StatusOr error2(UnknownError("error2")); - - ASSERT_TRUE(status_or.ok()); - EXPECT_EQ(std::string(1000, '0'), status_or.ValueOrDie()); - - // Overwrite the value in status_or with another value. - status_or = value1; - ASSERT_TRUE(status_or.ok()); - EXPECT_EQ(std::string(1000, '1'), status_or.ValueOrDie()); - - // Overwrite the value in status_or with an error. - status_or = error1; - ASSERT_FALSE(status_or.ok()); - EXPECT_EQ("error1", status_or.status().message()); - - // Overwrite the error in status_or with another error. - status_or = error2; - ASSERT_FALSE(status_or.ok()); - EXPECT_EQ("error2", status_or.status().message()); - - // Overwrite the error with a value. - status_or = value2; - ASSERT_TRUE(status_or.ok()); - EXPECT_EQ(std::string(1000, '2'), status_or.ValueOrDie()); - - // Verify original values unchanged. - EXPECT_EQ(std::string(1000, '1'), value1.ValueOrDie()); - EXPECT_EQ("error1", error1.status().message()); - EXPECT_EQ("error2", error2.status().message()); - EXPECT_EQ(std::string(1000, '2'), value2.ValueOrDie()); + EXPECT_EQ(0, **another_vec[0]); + EXPECT_EQ(absl::UnknownError(""), another_vec[1].status()); } TEST(StatusOr, TestDefaultCtor) { - StatusOr thing; + absl::StatusOr thing; EXPECT_FALSE(thing.ok()); EXPECT_EQ(thing.status().code(), absl::StatusCode::kUnknown); } -TEST(StatusOrDeathTest, TestDefaultCtorValue) { - StatusOr thing; - ABSL_BASE_INTERNAL_EXPECT_FAIL(thing.ValueOrDie(), absl::Status, ""); +TEST(StatusOr, StatusCtorForwards) { + absl::Status status(absl::StatusCode::kInternal, "Some error"); - const StatusOr thing2; - ABSL_BASE_INTERNAL_EXPECT_FAIL(thing.ValueOrDie(), absl::Status, ""); + EXPECT_EQ(absl::StatusOr(status).status().message(), "Some error"); + EXPECT_EQ(status.message(), "Some error"); + + EXPECT_EQ(absl::StatusOr(std::move(status)).status().message(), + "Some error"); + EXPECT_NE(status.message(), "Some error"); +} + +// Define `EXPECT_DEATH_OR_THROW` to test the behavior of `StatusOr::value`, +// which either throws `BadStatusOrAccess` or `LOG(FATAL)` based on whether +// exceptions are enabled. +#ifdef ABSL_HAVE_EXCEPTIONS +#define EXPECT_DEATH_OR_THROW(statement, status_) \ + EXPECT_THROW( \ + { \ + try { \ + statement; \ + } catch (const absl::BadStatusOrAccess& e) { \ + EXPECT_EQ(e.status(), status_); \ + throw; \ + } \ + }, \ + absl::BadStatusOrAccess); +#else // ABSL_HAVE_EXCEPTIONS +#define EXPECT_DEATH_OR_THROW(statement, status) \ + EXPECT_DEATH_IF_SUPPORTED(statement, status.ToString()); +#endif // ABSL_HAVE_EXCEPTIONS + +TEST(StatusOrDeathTest, TestDefaultCtorValue) { + absl::StatusOr thing; + EXPECT_DEATH_OR_THROW(thing.value(), absl::UnknownError("")); + const absl::StatusOr thing2; + EXPECT_DEATH_OR_THROW(thing2.value(), absl::UnknownError("")); +} + +TEST(StatusOrDeathTest, TestValueNotOk) { + absl::StatusOr thing(absl::CancelledError()); + EXPECT_DEATH_OR_THROW(thing.value(), absl::CancelledError()); +} + +TEST(StatusOrDeathTest, TestValueNotOkConst) { + const absl::StatusOr thing(absl::UnknownError("")); + EXPECT_DEATH_OR_THROW(thing.value(), absl::UnknownError("")); +} + +TEST(StatusOrDeathTest, TestPointerDefaultCtorValue) { + absl::StatusOr thing; + EXPECT_DEATH_OR_THROW(thing.value(), absl::UnknownError("")); +} + +TEST(StatusOrDeathTest, TestPointerValueNotOk) { + absl::StatusOr thing(absl::CancelledError()); + EXPECT_DEATH_OR_THROW(thing.value(), absl::CancelledError()); +} + +TEST(StatusOrDeathTest, TestPointerValueNotOkConst) { + const absl::StatusOr thing(absl::CancelledError()); + EXPECT_DEATH_OR_THROW(thing.value(), absl::CancelledError()); +} + +#if GTEST_HAS_DEATH_TEST +TEST(StatusOrDeathTest, TestStatusCtorStatusOk) { + EXPECT_DEBUG_DEATH( + { + // This will DCHECK + absl::StatusOr thing(absl::OkStatus()); + // In optimized mode, we are actually going to get error::INTERNAL for + // status here, rather than crashing, so check that. + EXPECT_FALSE(thing.ok()); + EXPECT_EQ(thing.status().code(), absl::StatusCode::kInternal); + }, + "An OK status is not a valid constructor argument"); +} + +TEST(StatusOrDeathTest, TestPointerStatusCtorStatusOk) { + EXPECT_DEBUG_DEATH( + { + absl::StatusOr thing(absl::OkStatus()); + // In optimized mode, we are actually going to get error::INTERNAL for + // status here, rather than crashing, so check that. + EXPECT_FALSE(thing.ok()); + EXPECT_EQ(thing.status().code(), absl::StatusCode::kInternal); + }, + "An OK status is not a valid constructor argument"); +} +#endif + +TEST(StatusOr, ValueAccessor) { + const int kIntValue = 110; + { + absl::StatusOr status_or(kIntValue); + EXPECT_EQ(kIntValue, status_or.value()); + EXPECT_EQ(kIntValue, std::move(status_or).value()); + } + { + absl::StatusOr status_or(kIntValue); + EXPECT_THAT(status_or, + IsOkAndHolds(CopyDetectorHas(kIntValue, false, false))); + CopyDetector copy_detector = status_or.value(); + EXPECT_THAT(copy_detector, CopyDetectorHas(kIntValue, false, true)); + copy_detector = std::move(status_or).value(); + EXPECT_THAT(copy_detector, CopyDetectorHas(kIntValue, true, false)); + } +} + +TEST(StatusOr, BadValueAccess) { + const absl::Status kError = absl::CancelledError("message"); + absl::StatusOr status_or(kError); + EXPECT_DEATH_OR_THROW(status_or.value(), kError); } TEST(StatusOr, TestStatusCtor) { - StatusOr thing(Status(absl::StatusCode::kCancelled, "")); + absl::StatusOr thing(absl::CancelledError()); EXPECT_FALSE(thing.ok()); EXPECT_EQ(thing.status().code(), absl::StatusCode::kCancelled); } + + TEST(StatusOr, TestValueCtor) { const int kI = 4; - const StatusOr thing(kI); + const absl::StatusOr thing(kI); EXPECT_TRUE(thing.ok()); - EXPECT_EQ(kI, thing.ValueOrDie()); + EXPECT_EQ(kI, *thing); +} + +struct Foo { + const int x; + explicit Foo(int y) : x(y) {} +}; + +TEST(StatusOr, InPlaceConstruction) { + EXPECT_THAT(absl::StatusOr(absl::in_place, 10), + IsOkAndHolds(Field(&Foo::x, 10))); +} + +struct InPlaceHelper { + InPlaceHelper(std::initializer_list xs, std::unique_ptr yy) + : x(xs), y(std::move(yy)) {} + const std::vector x; + std::unique_ptr y; +}; + +TEST(StatusOr, InPlaceInitListConstruction) { + absl::StatusOr status_or(absl::in_place, {10, 11, 12}, + absl::make_unique(13)); + EXPECT_THAT(status_or, IsOkAndHolds(AllOf( + Field(&InPlaceHelper::x, ElementsAre(10, 11, 12)), + Field(&InPlaceHelper::y, Pointee(13))))); +} + +TEST(StatusOr, Emplace) { + absl::StatusOr status_or_foo(10); + status_or_foo.emplace(20); + EXPECT_THAT(status_or_foo, IsOkAndHolds(Field(&Foo::x, 20))); + status_or_foo = absl::InvalidArgumentError("msg"); + EXPECT_FALSE(status_or_foo.ok()); + EXPECT_EQ(status_or_foo.status().code(), absl::StatusCode::kInvalidArgument); + EXPECT_EQ(status_or_foo.status().message(), "msg"); + status_or_foo.emplace(20); + EXPECT_THAT(status_or_foo, IsOkAndHolds(Field(&Foo::x, 20))); +} + +TEST(StatusOr, EmplaceInitializerList) { + absl::StatusOr status_or(absl::in_place, {10, 11, 12}, + absl::make_unique(13)); + status_or.emplace({1, 2, 3}, absl::make_unique(4)); + EXPECT_THAT(status_or, + IsOkAndHolds(AllOf(Field(&InPlaceHelper::x, ElementsAre(1, 2, 3)), + Field(&InPlaceHelper::y, Pointee(4))))); + status_or = absl::InvalidArgumentError("msg"); + EXPECT_FALSE(status_or.ok()); + EXPECT_EQ(status_or.status().code(), absl::StatusCode::kInvalidArgument); + EXPECT_EQ(status_or.status().message(), "msg"); + status_or.emplace({1, 2, 3}, absl::make_unique(4)); + EXPECT_THAT(status_or, + IsOkAndHolds(AllOf(Field(&InPlaceHelper::x, ElementsAre(1, 2, 3)), + Field(&InPlaceHelper::y, Pointee(4))))); } TEST(StatusOr, TestCopyCtorStatusOk) { const int kI = 4; - const StatusOr original(kI); - const StatusOr copy(original); - EXPECT_EQ(copy.status(), original.status()); - EXPECT_EQ(original.ValueOrDie(), copy.ValueOrDie()); + const absl::StatusOr original(kI); + const absl::StatusOr copy(original); + EXPECT_OK(copy.status()); + EXPECT_EQ(*original, *copy); } TEST(StatusOr, TestCopyCtorStatusNotOk) { - StatusOr original(Status(absl::StatusCode::kCancelled, "")); - StatusOr copy(original); - EXPECT_EQ(copy.status(), original.status()); + absl::StatusOr original(absl::CancelledError()); + absl::StatusOr copy(original); + EXPECT_EQ(copy.status().code(), absl::StatusCode::kCancelled); } TEST(StatusOr, TestCopyCtorNonAssignable) { const int kI = 4; CopyNoAssign value(kI); - StatusOr original(value); - StatusOr copy(original); - EXPECT_EQ(copy.status(), original.status()); - EXPECT_EQ(original.ValueOrDie().foo_, copy.ValueOrDie().foo_); + absl::StatusOr original(value); + absl::StatusOr copy(original); + EXPECT_OK(copy.status()); + EXPECT_EQ(original->foo, copy->foo); } TEST(StatusOr, TestCopyCtorStatusOKConverting) { const int kI = 4; - StatusOr original(kI); - StatusOr copy(original); - EXPECT_EQ(copy.status(), original.status()); - EXPECT_DOUBLE_EQ(original.ValueOrDie(), copy.ValueOrDie()); + absl::StatusOr original(kI); + absl::StatusOr copy(original); + EXPECT_OK(copy.status()); + EXPECT_DOUBLE_EQ(*original, *copy); } TEST(StatusOr, TestCopyCtorStatusNotOkConverting) { - StatusOr original(Status(absl::StatusCode::kCancelled, "")); - StatusOr copy(original); + absl::StatusOr original(absl::CancelledError()); + absl::StatusOr copy(original); EXPECT_EQ(copy.status(), original.status()); } TEST(StatusOr, TestAssignmentStatusOk) { - const int kI = 4; - StatusOr source(kI); - StatusOr target; - target = source; - EXPECT_EQ(target.status(), source.status()); - EXPECT_EQ(source.ValueOrDie(), target.ValueOrDie()); + // Copy assignmment + { + const auto p = std::make_shared(17); + absl::StatusOr> source(p); + + absl::StatusOr> target; + target = source; + + ASSERT_TRUE(target.ok()); + EXPECT_OK(target.status()); + EXPECT_EQ(p, *target); + + ASSERT_TRUE(source.ok()); + EXPECT_OK(source.status()); + EXPECT_EQ(p, *source); + } + + // Move asssignment + { + const auto p = std::make_shared(17); + absl::StatusOr> source(p); + + absl::StatusOr> target; + target = std::move(source); + + ASSERT_TRUE(target.ok()); + EXPECT_OK(target.status()); + EXPECT_EQ(p, *target); + + ASSERT_TRUE(source.ok()); + EXPECT_OK(source.status()); + EXPECT_EQ(nullptr, *source); + } } TEST(StatusOr, TestAssignmentStatusNotOk) { - StatusOr source(Status(absl::StatusCode::kCancelled, "")); - StatusOr target; - target = source; - EXPECT_EQ(target.status(), source.status()); + // Copy assignment + { + const absl::Status expected = absl::CancelledError(); + absl::StatusOr source(expected); + + absl::StatusOr target; + target = source; + + EXPECT_FALSE(target.ok()); + EXPECT_EQ(expected, target.status()); + + EXPECT_FALSE(source.ok()); + EXPECT_EQ(expected, source.status()); + } + + // Move assignment + { + const absl::Status expected = absl::CancelledError(); + absl::StatusOr source(expected); + + absl::StatusOr target; + target = std::move(source); + + EXPECT_FALSE(target.ok()); + EXPECT_EQ(expected, target.status()); + + EXPECT_FALSE(source.ok()); + EXPECT_EQ(source.status().code(), absl::StatusCode::kInternal); + } +} + +TEST(StatusOr, TestAssignmentStatusOKConverting) { + // Copy assignment + { + const int kI = 4; + absl::StatusOr source(kI); + + absl::StatusOr target; + target = source; + + ASSERT_TRUE(target.ok()); + EXPECT_OK(target.status()); + EXPECT_DOUBLE_EQ(kI, *target); + + ASSERT_TRUE(source.ok()); + EXPECT_OK(source.status()); + EXPECT_DOUBLE_EQ(kI, *source); + } + + // Move assignment + { + const auto p = new int(17); + absl::StatusOr> source(absl::WrapUnique(p)); + + absl::StatusOr> target; + target = std::move(source); + + ASSERT_TRUE(target.ok()); + EXPECT_OK(target.status()); + EXPECT_EQ(p, target->get()); + + ASSERT_TRUE(source.ok()); + EXPECT_OK(source.status()); + EXPECT_EQ(nullptr, source->get()); + } +} + +struct A { + int x; +}; + +struct ImplicitConstructibleFromA { + int x; + bool moved; + ImplicitConstructibleFromA(const A& a) // NOLINT + : x(a.x), moved(false) {} + ImplicitConstructibleFromA(A&& a) // NOLINT + : x(a.x), moved(true) {} +}; + +TEST(StatusOr, ImplicitConvertingConstructor) { + EXPECT_THAT( + absl::implicit_cast>( + absl::StatusOr(A{11})), + IsOkAndHolds(AllOf(Field(&ImplicitConstructibleFromA::x, 11), + Field(&ImplicitConstructibleFromA::moved, true)))); + absl::StatusOr a(A{12}); + EXPECT_THAT( + absl::implicit_cast>(a), + IsOkAndHolds(AllOf(Field(&ImplicitConstructibleFromA::x, 12), + Field(&ImplicitConstructibleFromA::moved, false)))); +} + +struct ExplicitConstructibleFromA { + int x; + bool moved; + explicit ExplicitConstructibleFromA(const A& a) : x(a.x), moved(false) {} + explicit ExplicitConstructibleFromA(A&& a) : x(a.x), moved(true) {} +}; + +TEST(StatusOr, ExplicitConvertingConstructor) { + EXPECT_FALSE( + (std::is_convertible&, + absl::StatusOr>::value)); + EXPECT_FALSE( + (std::is_convertible&&, + absl::StatusOr>::value)); + EXPECT_THAT( + absl::StatusOr(absl::StatusOr(A{11})), + IsOkAndHolds(AllOf(Field(&ExplicitConstructibleFromA::x, 11), + Field(&ExplicitConstructibleFromA::moved, true)))); + absl::StatusOr a(A{12}); + EXPECT_THAT( + absl::StatusOr(a), + IsOkAndHolds(AllOf(Field(&ExplicitConstructibleFromA::x, 12), + Field(&ExplicitConstructibleFromA::moved, false)))); +} + +struct ImplicitConstructibleFromBool { + ImplicitConstructibleFromBool(bool y) : x(y) {} // NOLINT + bool x = false; +}; + +struct ConvertibleToBool { + explicit ConvertibleToBool(bool y) : x(y) {} + operator bool() const { return x; } // NOLINT + bool x = false; +}; + +TEST(StatusOr, ImplicitBooleanConstructionWithImplicitCasts) { + EXPECT_THAT(absl::StatusOr(absl::StatusOr(true)), + IsOkAndHolds(true)); + EXPECT_THAT(absl::StatusOr(absl::StatusOr(false)), + IsOkAndHolds(false)); + EXPECT_THAT( + absl::implicit_cast>( + absl::StatusOr(false)), + IsOkAndHolds(Field(&ImplicitConstructibleFromBool::x, false))); + EXPECT_FALSE((std::is_convertible< + absl::StatusOr, + absl::StatusOr>::value)); +} + +TEST(StatusOr, BooleanConstructionWithImplicitCasts) { + EXPECT_THAT(absl::StatusOr(absl::StatusOr(true)), + IsOkAndHolds(true)); + EXPECT_THAT(absl::StatusOr(absl::StatusOr(false)), + IsOkAndHolds(false)); + EXPECT_THAT( + absl::StatusOr{ + absl::StatusOr(false)}, + IsOkAndHolds(Field(&ImplicitConstructibleFromBool::x, false))); + EXPECT_THAT( + absl::StatusOr{ + absl::StatusOr(absl::InvalidArgumentError(""))}, + Not(IsOk())); + + EXPECT_THAT( + absl::StatusOr{ + absl::StatusOr(ConvertibleToBool{false})}, + IsOkAndHolds(Field(&ImplicitConstructibleFromBool::x, false))); + EXPECT_THAT( + absl::StatusOr{ + absl::StatusOr(absl::InvalidArgumentError(""))}, + Not(IsOk())); +} + +TEST(StatusOr, ConstImplicitCast) { + EXPECT_THAT(absl::implicit_cast>( + absl::StatusOr(true)), + IsOkAndHolds(true)); + EXPECT_THAT(absl::implicit_cast>( + absl::StatusOr(false)), + IsOkAndHolds(false)); + EXPECT_THAT(absl::implicit_cast>( + absl::StatusOr(true)), + IsOkAndHolds(true)); + EXPECT_THAT(absl::implicit_cast>( + absl::StatusOr(false)), + IsOkAndHolds(false)); + EXPECT_THAT(absl::implicit_cast>( + absl::StatusOr("foo")), + IsOkAndHolds("foo")); + EXPECT_THAT(absl::implicit_cast>( + absl::StatusOr("foo")), + IsOkAndHolds("foo")); + EXPECT_THAT( + absl::implicit_cast>>( + absl::StatusOr>( + std::make_shared("foo"))), + IsOkAndHolds(Pointee(std::string("foo")))); +} + +TEST(StatusOr, ConstExplicitConstruction) { + EXPECT_THAT(absl::StatusOr(absl::StatusOr(true)), + IsOkAndHolds(true)); + EXPECT_THAT(absl::StatusOr(absl::StatusOr(false)), + IsOkAndHolds(false)); + EXPECT_THAT(absl::StatusOr(absl::StatusOr(true)), + IsOkAndHolds(true)); + EXPECT_THAT(absl::StatusOr(absl::StatusOr(false)), + IsOkAndHolds(false)); +} + +struct ExplicitConstructibleFromInt { + int x; + explicit ExplicitConstructibleFromInt(int y) : x(y) {} +}; + +TEST(StatusOr, ExplicitConstruction) { + EXPECT_THAT(absl::StatusOr(10), + IsOkAndHolds(Field(&ExplicitConstructibleFromInt::x, 10))); +} + +TEST(StatusOr, ImplicitConstruction) { + // Check implicit casting works. + auto status_or = + absl::implicit_cast>>(10); + EXPECT_THAT(status_or, IsOkAndHolds(VariantWith(10))); +} + +TEST(StatusOr, ImplicitConstructionFromInitliazerList) { + // Note: dropping the explicit std::initializer_list is not supported + // by absl::StatusOr or absl::optional. + auto status_or = + absl::implicit_cast>>({{10, 20, 30}}); + EXPECT_THAT(status_or, IsOkAndHolds(ElementsAre(10, 20, 30))); +} + +TEST(StatusOr, UniquePtrImplicitConstruction) { + auto status_or = absl::implicit_cast>>( + absl::make_unique()); + EXPECT_THAT(status_or, IsOkAndHolds(Ne(nullptr))); +} + +TEST(StatusOr, NestedStatusOrCopyAndMoveConstructorTests) { + absl::StatusOr> status_or = CopyDetector(10); + absl::StatusOr> status_error = + absl::InvalidArgumentError("foo"); + EXPECT_THAT(status_or, + IsOkAndHolds(IsOkAndHolds(CopyDetectorHas(10, true, false)))); + absl::StatusOr> a = status_or; + EXPECT_THAT(a, IsOkAndHolds(IsOkAndHolds(CopyDetectorHas(10, false, true)))); + absl::StatusOr> a_err = status_error; + EXPECT_THAT(a_err, Not(IsOk())); + + const absl::StatusOr>& cref = status_or; + absl::StatusOr> b = cref; // NOLINT + EXPECT_THAT(b, IsOkAndHolds(IsOkAndHolds(CopyDetectorHas(10, false, true)))); + const absl::StatusOr>& cref_err = status_error; + absl::StatusOr> b_err = cref_err; // NOLINT + EXPECT_THAT(b_err, Not(IsOk())); + + absl::StatusOr> c = std::move(status_or); + EXPECT_THAT(c, IsOkAndHolds(IsOkAndHolds(CopyDetectorHas(10, true, false)))); + absl::StatusOr> c_err = std::move(status_error); + EXPECT_THAT(c_err, Not(IsOk())); +} + +TEST(StatusOr, NestedStatusOrCopyAndMoveAssignment) { + absl::StatusOr> status_or = CopyDetector(10); + absl::StatusOr> status_error = + absl::InvalidArgumentError("foo"); + absl::StatusOr> a; + a = status_or; + EXPECT_THAT(a, IsOkAndHolds(IsOkAndHolds(CopyDetectorHas(10, false, true)))); + a = status_error; + EXPECT_THAT(a, Not(IsOk())); + + const absl::StatusOr>& cref = status_or; + a = cref; + EXPECT_THAT(a, IsOkAndHolds(IsOkAndHolds(CopyDetectorHas(10, false, true)))); + const absl::StatusOr>& cref_err = status_error; + a = cref_err; + EXPECT_THAT(a, Not(IsOk())); + a = std::move(status_or); + EXPECT_THAT(a, IsOkAndHolds(IsOkAndHolds(CopyDetectorHas(10, true, false)))); + a = std::move(status_error); + EXPECT_THAT(a, Not(IsOk())); +} + +struct Copyable { + Copyable() {} + Copyable(const Copyable&) {} + Copyable& operator=(const Copyable&) { return *this; } +}; + +struct MoveOnly { + MoveOnly() {} + MoveOnly(MoveOnly&&) {} + MoveOnly& operator=(MoveOnly&&) { return *this; } +}; + +struct NonMovable { + NonMovable() {} + NonMovable(const NonMovable&) = delete; + NonMovable(NonMovable&&) = delete; + NonMovable& operator=(const NonMovable&) = delete; + NonMovable& operator=(NonMovable&&) = delete; +}; + +TEST(StatusOr, CopyAndMoveAbility) { + EXPECT_TRUE(std::is_copy_constructible::value); + EXPECT_TRUE(std::is_copy_assignable::value); + EXPECT_TRUE(std::is_move_constructible::value); + EXPECT_TRUE(std::is_move_assignable::value); + EXPECT_FALSE(std::is_copy_constructible::value); + EXPECT_FALSE(std::is_copy_assignable::value); + EXPECT_TRUE(std::is_move_constructible::value); + EXPECT_TRUE(std::is_move_assignable::value); + EXPECT_FALSE(std::is_copy_constructible::value); + EXPECT_FALSE(std::is_copy_assignable::value); + EXPECT_FALSE(std::is_move_constructible::value); + EXPECT_FALSE(std::is_move_assignable::value); +} + +TEST(StatusOr, StatusOrAnyCopyAndMoveConstructorTests) { + absl::StatusOr status_or = CopyDetector(10); + absl::StatusOr status_error = absl::InvalidArgumentError("foo"); + EXPECT_THAT( + status_or, + IsOkAndHolds(AnyWith(CopyDetectorHas(10, true, false)))); + absl::StatusOr a = status_or; + EXPECT_THAT( + a, IsOkAndHolds(AnyWith(CopyDetectorHas(10, false, true)))); + absl::StatusOr a_err = status_error; + EXPECT_THAT(a_err, Not(IsOk())); + + const absl::StatusOr& cref = status_or; + // No lint for no-change copy. + absl::StatusOr b = cref; // NOLINT + EXPECT_THAT( + b, IsOkAndHolds(AnyWith(CopyDetectorHas(10, false, true)))); + const absl::StatusOr& cref_err = status_error; + // No lint for no-change copy. + absl::StatusOr b_err = cref_err; // NOLINT + EXPECT_THAT(b_err, Not(IsOk())); + + absl::StatusOr c = std::move(status_or); + EXPECT_THAT( + c, IsOkAndHolds(AnyWith(CopyDetectorHas(10, true, false)))); + absl::StatusOr c_err = std::move(status_error); + EXPECT_THAT(c_err, Not(IsOk())); +} + +TEST(StatusOr, StatusOrAnyCopyAndMoveAssignment) { + absl::StatusOr status_or = CopyDetector(10); + absl::StatusOr status_error = absl::InvalidArgumentError("foo"); + absl::StatusOr a; + a = status_or; + EXPECT_THAT( + a, IsOkAndHolds(AnyWith(CopyDetectorHas(10, false, true)))); + a = status_error; + EXPECT_THAT(a, Not(IsOk())); + + const absl::StatusOr& cref = status_or; + a = cref; + EXPECT_THAT( + a, IsOkAndHolds(AnyWith(CopyDetectorHas(10, false, true)))); + const absl::StatusOr& cref_err = status_error; + a = cref_err; + EXPECT_THAT(a, Not(IsOk())); + a = std::move(status_or); + EXPECT_THAT( + a, IsOkAndHolds(AnyWith(CopyDetectorHas(10, true, false)))); + a = std::move(status_error); + EXPECT_THAT(a, Not(IsOk())); +} + +TEST(StatusOr, StatusOrCopyAndMoveTestsConstructor) { + absl::StatusOr status_or(10); + ASSERT_THAT(status_or, IsOkAndHolds(CopyDetectorHas(10, false, false))); + absl::StatusOr a(status_or); + EXPECT_THAT(a, IsOkAndHolds(CopyDetectorHas(10, false, true))); + const absl::StatusOr& cref = status_or; + absl::StatusOr b(cref); // NOLINT + EXPECT_THAT(b, IsOkAndHolds(CopyDetectorHas(10, false, true))); + absl::StatusOr c(std::move(status_or)); + EXPECT_THAT(c, IsOkAndHolds(CopyDetectorHas(10, true, false))); +} + +TEST(StatusOr, StatusOrCopyAndMoveTestsAssignment) { + absl::StatusOr status_or(10); + ASSERT_THAT(status_or, IsOkAndHolds(CopyDetectorHas(10, false, false))); + absl::StatusOr a; + a = status_or; + EXPECT_THAT(a, IsOkAndHolds(CopyDetectorHas(10, false, true))); + const absl::StatusOr& cref = status_or; + absl::StatusOr b; + b = cref; + EXPECT_THAT(b, IsOkAndHolds(CopyDetectorHas(10, false, true))); + absl::StatusOr c; + c = std::move(status_or); + EXPECT_THAT(c, IsOkAndHolds(CopyDetectorHas(10, true, false))); +} + +TEST(StatusOr, AbslAnyAssignment) { + EXPECT_FALSE((std::is_assignable, + absl::StatusOr>::value)); + absl::StatusOr status_or; + status_or = absl::InvalidArgumentError("foo"); + EXPECT_THAT(status_or, Not(IsOk())); +} + +TEST(StatusOr, ImplicitAssignment) { + absl::StatusOr> status_or; + status_or = 10; + EXPECT_THAT(status_or, IsOkAndHolds(VariantWith(10))); +} + +TEST(StatusOr, SelfDirectInitAssignment) { + absl::StatusOr> status_or = {{10, 20, 30}}; + status_or = *status_or; + EXPECT_THAT(status_or, IsOkAndHolds(ElementsAre(10, 20, 30))); +} + +TEST(StatusOr, ImplicitCastFromInitializerList) { + absl::StatusOr> status_or = {{10, 20, 30}}; + EXPECT_THAT(status_or, IsOkAndHolds(ElementsAre(10, 20, 30))); +} + +TEST(StatusOr, UniquePtrImplicitAssignment) { + absl::StatusOr> status_or; + status_or = absl::make_unique(); + EXPECT_THAT(status_or, IsOkAndHolds(Ne(nullptr))); +} + +TEST(StatusOr, Pointer) { + struct A {}; + struct B : public A {}; + struct C : private A {}; + + EXPECT_TRUE((std::is_constructible, B*>::value)); + EXPECT_TRUE((std::is_convertible>::value)); + EXPECT_FALSE((std::is_constructible, C*>::value)); + EXPECT_FALSE((std::is_convertible>::value)); +} + +TEST(StatusOr, TestAssignmentStatusNotOkConverting) { + // Copy assignment + { + const absl::Status expected = absl::CancelledError(); + absl::StatusOr source(expected); + + absl::StatusOr target; + target = source; + + EXPECT_FALSE(target.ok()); + EXPECT_EQ(expected, target.status()); + + EXPECT_FALSE(source.ok()); + EXPECT_EQ(expected, source.status()); + } + + // Move assignment + { + const absl::Status expected = absl::CancelledError(); + absl::StatusOr source(expected); + + absl::StatusOr target; + target = std::move(source); + + EXPECT_FALSE(target.ok()); + EXPECT_EQ(expected, target.status()); + + EXPECT_FALSE(source.ok()); + EXPECT_EQ(source.status().code(), absl::StatusCode::kInternal); + } +} + +TEST(StatusOr, SelfAssignment) { + // Copy-assignment, status OK + { + // A string long enough that it's likely to defeat any inline representation + // optimization. + const std::string long_str(128, 'a'); + + absl::StatusOr so = long_str; + so = *&so; + + ASSERT_TRUE(so.ok()); + EXPECT_OK(so.status()); + EXPECT_EQ(long_str, *so); + } + + // Copy-assignment, error status + { + absl::StatusOr so = absl::NotFoundError("taco"); + so = *&so; + + EXPECT_FALSE(so.ok()); + EXPECT_EQ(so.status().code(), absl::StatusCode::kNotFound); + EXPECT_EQ(so.status().message(), "taco"); + } + + // Move-assignment with copyable type, status OK + { + absl::StatusOr so = 17; + + // Fool the compiler, which otherwise complains. + auto& same = so; + so = std::move(same); + + ASSERT_TRUE(so.ok()); + EXPECT_OK(so.status()); + EXPECT_EQ(17, *so); + } + + // Move-assignment with copyable type, error status + { + absl::StatusOr so = absl::NotFoundError("taco"); + + // Fool the compiler, which otherwise complains. + auto& same = so; + so = std::move(same); + + EXPECT_FALSE(so.ok()); + EXPECT_EQ(so.status().code(), absl::StatusCode::kNotFound); + EXPECT_EQ(so.status().message(), "taco"); + } + + // Move-assignment with non-copyable type, status OK + { + const auto raw = new int(17); + absl::StatusOr> so = absl::WrapUnique(raw); + + // Fool the compiler, which otherwise complains. + auto& same = so; + so = std::move(same); + + ASSERT_TRUE(so.ok()); + EXPECT_OK(so.status()); + EXPECT_EQ(raw, so->get()); + } + + // Move-assignment with non-copyable type, error status + { + absl::StatusOr> so = absl::NotFoundError("taco"); + + // Fool the compiler, which otherwise complains. + auto& same = so; + so = std::move(same); + + EXPECT_FALSE(so.ok()); + EXPECT_EQ(so.status().code(), absl::StatusCode::kNotFound); + EXPECT_EQ(so.status().message(), "taco"); + } +} + +// These types form the overload sets of the constructors and the assignment +// operators of `MockValue`. They distinguish construction from assignment, +// lvalue from rvalue. +struct FromConstructibleAssignableLvalue {}; +struct FromConstructibleAssignableRvalue {}; +struct FromImplicitConstructibleOnly {}; +struct FromAssignableOnly {}; + +// This class is for testing the forwarding value assignments of `StatusOr`. +// `from_rvalue` indicates whether the constructor or the assignment taking +// rvalue reference is called. `from_assignment` indicates whether any +// assignment is called. +struct MockValue { + // Constructs `MockValue` from `FromConstructibleAssignableLvalue`. + MockValue(const FromConstructibleAssignableLvalue&) // NOLINT + : from_rvalue(false), assigned(false) {} + // Constructs `MockValue` from `FromConstructibleAssignableRvalue`. + MockValue(FromConstructibleAssignableRvalue&&) // NOLINT + : from_rvalue(true), assigned(false) {} + // Constructs `MockValue` from `FromImplicitConstructibleOnly`. + // `MockValue` is not assignable from `FromImplicitConstructibleOnly`. + MockValue(const FromImplicitConstructibleOnly&) // NOLINT + : from_rvalue(false), assigned(false) {} + // Assigns `FromConstructibleAssignableLvalue`. + MockValue& operator=(const FromConstructibleAssignableLvalue&) { + from_rvalue = false; + assigned = true; + return *this; + } + // Assigns `FromConstructibleAssignableRvalue` (rvalue only). + MockValue& operator=(FromConstructibleAssignableRvalue&&) { + from_rvalue = true; + assigned = true; + return *this; + } + // Assigns `FromAssignableOnly`, but not constructible from + // `FromAssignableOnly`. + MockValue& operator=(const FromAssignableOnly&) { + from_rvalue = false; + assigned = true; + return *this; + } + bool from_rvalue; + bool assigned; +}; + +// operator=(U&&) +TEST(StatusOr, PerfectForwardingAssignment) { + // U == T + constexpr int kValue1 = 10, kValue2 = 20; + absl::StatusOr status_or; + CopyDetector lvalue(kValue1); + status_or = lvalue; + EXPECT_THAT(status_or, IsOkAndHolds(CopyDetectorHas(kValue1, false, true))); + status_or = CopyDetector(kValue2); + EXPECT_THAT(status_or, IsOkAndHolds(CopyDetectorHas(kValue2, true, false))); + + // U != T + EXPECT_TRUE( + (std::is_assignable&, + const FromConstructibleAssignableLvalue&>::value)); + EXPECT_TRUE((std::is_assignable&, + FromConstructibleAssignableLvalue&&>::value)); + EXPECT_FALSE( + (std::is_assignable&, + const FromConstructibleAssignableRvalue&>::value)); + EXPECT_TRUE((std::is_assignable&, + FromConstructibleAssignableRvalue&&>::value)); + EXPECT_TRUE( + (std::is_assignable&, + const FromImplicitConstructibleOnly&>::value)); + EXPECT_FALSE((std::is_assignable&, + const FromAssignableOnly&>::value)); + + absl::StatusOr from_lvalue(FromConstructibleAssignableLvalue{}); + EXPECT_FALSE(from_lvalue->from_rvalue); + EXPECT_FALSE(from_lvalue->assigned); + from_lvalue = FromConstructibleAssignableLvalue{}; + EXPECT_FALSE(from_lvalue->from_rvalue); + EXPECT_TRUE(from_lvalue->assigned); + + absl::StatusOr from_rvalue(FromConstructibleAssignableRvalue{}); + EXPECT_TRUE(from_rvalue->from_rvalue); + EXPECT_FALSE(from_rvalue->assigned); + from_rvalue = FromConstructibleAssignableRvalue{}; + EXPECT_TRUE(from_rvalue->from_rvalue); + EXPECT_TRUE(from_rvalue->assigned); + + absl::StatusOr from_implicit_constructible( + FromImplicitConstructibleOnly{}); + EXPECT_FALSE(from_implicit_constructible->from_rvalue); + EXPECT_FALSE(from_implicit_constructible->assigned); + // construct a temporary `StatusOr` object and invoke the `StatusOr` move + // assignment operator. + from_implicit_constructible = FromImplicitConstructibleOnly{}; + EXPECT_FALSE(from_implicit_constructible->from_rvalue); + EXPECT_FALSE(from_implicit_constructible->assigned); } TEST(StatusOr, TestStatus) { - StatusOr good(4); + absl::StatusOr good(4); EXPECT_TRUE(good.ok()); - StatusOr bad(Status(absl::StatusCode::kCancelled, "")); + absl::StatusOr bad(absl::CancelledError()); EXPECT_FALSE(bad.ok()); - EXPECT_EQ(bad.status(), Status(absl::StatusCode::kCancelled, "")); + EXPECT_EQ(bad.status().code(), absl::StatusCode::kCancelled); +} + +TEST(StatusOr, OperatorStarRefQualifiers) { + static_assert( + std::is_same&>())>(), + "Unexpected ref-qualifiers"); + static_assert( + std::is_same&>())>(), + "Unexpected ref-qualifiers"); + static_assert( + std::is_same&&>())>(), + "Unexpected ref-qualifiers"); + static_assert( + std::is_same&&>())>(), + "Unexpected ref-qualifiers"); +} + +TEST(StatusOr, OperatorStar) { + const absl::StatusOr const_lvalue("hello"); + EXPECT_EQ("hello", *const_lvalue); + + absl::StatusOr lvalue("hello"); + EXPECT_EQ("hello", *lvalue); + + // Note: Recall that std::move() is equivalent to a static_cast to an rvalue + // reference type. + const absl::StatusOr const_rvalue("hello"); + EXPECT_EQ("hello", *std::move(const_rvalue)); // NOLINT + + absl::StatusOr rvalue("hello"); + EXPECT_EQ("hello", *std::move(rvalue)); +} + +TEST(StatusOr, OperatorArrowQualifiers) { + static_assert( + std::is_same< + const int*, + decltype(std::declval&>().operator->())>(), + "Unexpected qualifiers"); + static_assert( + std::is_same< + int*, decltype(std::declval&>().operator->())>(), + "Unexpected qualifiers"); + static_assert( + std::is_same< + const int*, + decltype(std::declval&&>().operator->())>(), + "Unexpected qualifiers"); + static_assert( + std::is_same< + int*, decltype(std::declval&&>().operator->())>(), + "Unexpected qualifiers"); +} + +TEST(StatusOr, OperatorArrow) { + const absl::StatusOr const_lvalue("hello"); + EXPECT_EQ(std::string("hello"), const_lvalue->c_str()); + + absl::StatusOr lvalue("hello"); + EXPECT_EQ(std::string("hello"), lvalue->c_str()); +} + +TEST(StatusOr, RValueStatus) { + absl::StatusOr so(absl::NotFoundError("taco")); + const absl::Status s = std::move(so).status(); + + EXPECT_EQ(s.code(), absl::StatusCode::kNotFound); + EXPECT_EQ(s.message(), "taco"); + + // Check that !ok() still implies !status().ok(), even after moving out of the + // object. See the note on the rvalue ref-qualified status method. + EXPECT_FALSE(so.ok()); // NOLINT + EXPECT_FALSE(so.status().ok()); + EXPECT_EQ(so.status().code(), absl::StatusCode::kInternal); + EXPECT_EQ(so.status().message(), "Status accessed after move."); } TEST(StatusOr, TestValue) { const int kI = 4; - StatusOr thing(kI); - EXPECT_EQ(kI, thing.ValueOrDie()); + absl::StatusOr thing(kI); + EXPECT_EQ(kI, *thing); } TEST(StatusOr, TestValueConst) { const int kI = 4; - const StatusOr thing(kI); - EXPECT_EQ(kI, thing.ValueOrDie()); -} - -TEST(StatusOrDeathTest, TestValueNotOk) { - StatusOr thing(Status(absl::StatusCode::kCancelled, "cancelled")); - ABSL_BASE_INTERNAL_EXPECT_FAIL(thing.ValueOrDie(), absl::Status, "cancelled"); -} - -TEST(StatusOrDeathTest, TestValueNotOkConst) { - const StatusOr thing(Status(absl::StatusCode::kUnknown, "")); - ABSL_BASE_INTERNAL_EXPECT_FAIL(thing.ValueOrDie(), absl::Status, ""); + const absl::StatusOr thing(kI); + EXPECT_EQ(kI, *thing); } TEST(StatusOr, TestPointerDefaultCtor) { - StatusOr thing; + absl::StatusOr thing; EXPECT_FALSE(thing.ok()); EXPECT_EQ(thing.status().code(), absl::StatusCode::kUnknown); } -TEST(StatusOrDeathTest, TestPointerDefaultCtorValue) { - StatusOr thing; - ABSL_BASE_INTERNAL_EXPECT_FAIL(thing.ValueOrDie(), absl::Status, ""); -} + TEST(StatusOr, TestPointerStatusCtor) { - StatusOr thing(Status(absl::StatusCode::kCancelled, "")); + absl::StatusOr thing(absl::CancelledError()); EXPECT_FALSE(thing.ok()); - EXPECT_EQ(thing.status(), Status(absl::StatusCode::kCancelled, "")); + EXPECT_EQ(thing.status().code(), absl::StatusCode::kCancelled); } TEST(StatusOr, TestPointerValueCtor) { const int kI = 4; - StatusOr thing(&kI); - EXPECT_TRUE(thing.ok()); - EXPECT_EQ(&kI, thing.ValueOrDie()); + + // Construction from a non-null pointer + { + absl::StatusOr so(&kI); + EXPECT_TRUE(so.ok()); + EXPECT_OK(so.status()); + EXPECT_EQ(&kI, *so); + } + + // Construction from a null pointer constant + { + absl::StatusOr so(nullptr); + EXPECT_TRUE(so.ok()); + EXPECT_OK(so.status()); + EXPECT_EQ(nullptr, *so); + } + + // Construction from a non-literal null pointer + { + const int* const p = nullptr; + + absl::StatusOr so(p); + EXPECT_TRUE(so.ok()); + EXPECT_OK(so.status()); + EXPECT_EQ(nullptr, *so); + } } TEST(StatusOr, TestPointerCopyCtorStatusOk) { const int kI = 0; - StatusOr original(&kI); - StatusOr copy(original); - EXPECT_EQ(copy.status(), original.status()); - EXPECT_EQ(original.ValueOrDie(), copy.ValueOrDie()); + absl::StatusOr original(&kI); + absl::StatusOr copy(original); + EXPECT_OK(copy.status()); + EXPECT_EQ(*original, *copy); } TEST(StatusOr, TestPointerCopyCtorStatusNotOk) { - StatusOr original(Status(absl::StatusCode::kCancelled, "")); - StatusOr copy(original); - EXPECT_EQ(copy.status(), original.status()); + absl::StatusOr original(absl::CancelledError()); + absl::StatusOr copy(original); + EXPECT_EQ(copy.status().code(), absl::StatusCode::kCancelled); } TEST(StatusOr, TestPointerCopyCtorStatusOKConverting) { Derived derived; - StatusOr original(&derived); - StatusOr copy(original); - EXPECT_EQ(copy.status(), original.status()); - EXPECT_EQ(static_cast(original.ValueOrDie()), - copy.ValueOrDie()); + absl::StatusOr original(&derived); + absl::StatusOr copy(original); + EXPECT_OK(copy.status()); + EXPECT_EQ(static_cast(*original), *copy); } TEST(StatusOr, TestPointerCopyCtorStatusNotOkConverting) { - StatusOr original(Status(absl::StatusCode::kCancelled, "")); - StatusOr copy(original); - EXPECT_EQ(copy.status(), original.status()); + absl::StatusOr original(absl::CancelledError()); + absl::StatusOr copy(original); + EXPECT_EQ(copy.status().code(), absl::StatusCode::kCancelled); } TEST(StatusOr, TestPointerAssignmentStatusOk) { const int kI = 0; - StatusOr source(&kI); - StatusOr target; + absl::StatusOr source(&kI); + absl::StatusOr target; target = source; - EXPECT_EQ(target.status(), source.status()); - EXPECT_EQ(source.ValueOrDie(), target.ValueOrDie()); + EXPECT_OK(target.status()); + EXPECT_EQ(*source, *target); } TEST(StatusOr, TestPointerAssignmentStatusNotOk) { - StatusOr source(Status(absl::StatusCode::kCancelled, "")); - StatusOr target; + absl::StatusOr source(absl::CancelledError()); + absl::StatusOr target; + target = source; + EXPECT_EQ(target.status().code(), absl::StatusCode::kCancelled); +} + +TEST(StatusOr, TestPointerAssignmentStatusOKConverting) { + Derived derived; + absl::StatusOr source(&derived); + absl::StatusOr target; + target = source; + EXPECT_OK(target.status()); + EXPECT_EQ(static_cast(*source), *target); +} + +TEST(StatusOr, TestPointerAssignmentStatusNotOkConverting) { + absl::StatusOr source(absl::CancelledError()); + absl::StatusOr target; target = source; EXPECT_EQ(target.status(), source.status()); } TEST(StatusOr, TestPointerStatus) { const int kI = 0; - StatusOr good(&kI); + absl::StatusOr good(&kI); EXPECT_TRUE(good.ok()); - StatusOr bad(Status(absl::StatusCode::kCancelled, "")); - EXPECT_EQ(bad.status(), Status(absl::StatusCode::kCancelled, "")); + absl::StatusOr bad(absl::CancelledError()); + EXPECT_EQ(bad.status().code(), absl::StatusCode::kCancelled); } TEST(StatusOr, TestPointerValue) { const int kI = 0; - StatusOr thing(&kI); - EXPECT_EQ(&kI, thing.ValueOrDie()); + absl::StatusOr thing(&kI); + EXPECT_EQ(&kI, *thing); } TEST(StatusOr, TestPointerValueConst) { const int kI = 0; - const StatusOr thing(&kI); - EXPECT_EQ(&kI, thing.ValueOrDie()); + const absl::StatusOr thing(&kI); + EXPECT_EQ(&kI, *thing); } -TEST(StatusOr, TestArrowOperator) { - StatusOr> uptr = ReturnUniquePtr(); - EXPECT_EQ(*uptr->get(), 0); +TEST(StatusOr, StatusOrVectorOfUniquePointerCanReserveAndResize) { + using EvilType = std::vector>; + static_assert(std::is_copy_constructible::value, ""); + std::vector<::absl::StatusOr> v(5); + v.reserve(v.capacity() + 10); + v.resize(v.capacity() + 10); } -TEST(StatusOr, TestArrowOperatorNotOk) { - StatusOr error(Status(absl::StatusCode::kCancelled, "cancelled")); - ABSL_BASE_INTERNAL_EXPECT_FAIL(error->pad_++, absl::Status, "cancelled"); +TEST(StatusOr, ConstPayload) { + // A reduced version of a problematic type found in the wild. All of the + // operations below should compile. + absl::StatusOr a; + + // Copy-construction + absl::StatusOr b(a); + + // Copy-assignment + EXPECT_FALSE(std::is_copy_assignable>::value); + + // Move-construction + absl::StatusOr c(std::move(a)); + + // Move-assignment + EXPECT_FALSE(std::is_move_assignable>::value); } -TEST(StatusOr, TestStarOperator) { - StatusOr> uptr = ReturnUniquePtr(); - EXPECT_EQ(**uptr, 0); +TEST(StatusOr, MapToStatusOrUniquePtr) { + // A reduced version of a problematic type found in the wild. All of the + // operations below should compile. + using MapType = std::map>>; + + MapType a; + + // Move-construction + MapType b(std::move(a)); + + // Move-assignment + a = std::move(b); } -TEST(StatusOr, TestStarOperatorDeath) { - StatusOr error(Status(absl::StatusCode::kCancelled, "cancelled")); - ABSL_BASE_INTERNAL_EXPECT_FAIL(*error, absl::Status, "cancelled"); +TEST(StatusOr, ValueOrOk) { + const absl::StatusOr status_or = 0; + EXPECT_EQ(status_or.value_or(-1), 0); } -// NOTE(tucker): StatusOr does not support this kind -// of resize op. -// TEST(StatusOr, StatusOrVectorOfUniquePointerCanResize) { -// using EvilType = std::vector>; -// static_assert(std::is_copy_constructible::value, ""); -// std::vector> v(5); -// v.reserve(v.capacity() + 10); -// } - -TEST(StatusOrDeathTest, TestPointerValueNotOk) { - StatusOr thing(Status(absl::StatusCode::kCancelled, "cancelled")); - ABSL_BASE_INTERNAL_EXPECT_FAIL(thing.ValueOrDie(), absl::Status, "cancelled"); +TEST(StatusOr, ValueOrDefault) { + const absl::StatusOr status_or = absl::CancelledError(); + EXPECT_EQ(status_or.value_or(-1), -1); } -TEST(StatusOrDeathTest, TestPointerValueNotOkConst) { - const StatusOr thing(Status(absl::StatusCode::kCancelled, "cancelled")); - ABSL_BASE_INTERNAL_EXPECT_FAIL(thing.ValueOrDie(), absl::Status, "cancelled"); +TEST(StatusOr, MoveOnlyValueOrOk) { + EXPECT_THAT(absl::StatusOr>(absl::make_unique(0)) + .value_or(absl::make_unique(-1)), + Pointee(0)); } -static void AssertOkAndAssignBody(absl::StatusOr consume) { - ASSERT_OK_AND_ASSIGN(int value, consume); - EXPECT_EQ(value, 1); +TEST(StatusOr, MoveOnlyValueOrDefault) { + EXPECT_THAT(absl::StatusOr>(absl::CancelledError()) + .value_or(absl::make_unique(-1)), + Pointee(-1)); } -TEST(StatusOr, TestAssertOkAndAssign) { - const int kI = 1; - AssertOkAndAssignBody(kI); +static absl::StatusOr MakeStatus() { return 100; } + +TEST(StatusOr, TestIgnoreError) { MakeStatus().IgnoreError(); } + +TEST(StatusOr, EqualityOperator) { + constexpr int kNumCases = 4; + std::array, kNumCases> group1 = { + absl::StatusOr(1), absl::StatusOr(2), + absl::StatusOr(absl::InvalidArgumentError("msg")), + absl::StatusOr(absl::InternalError("msg"))}; + std::array, kNumCases> group2 = { + absl::StatusOr(1), absl::StatusOr(2), + absl::StatusOr(absl::InvalidArgumentError("msg")), + absl::StatusOr(absl::InternalError("msg"))}; + for (int i = 0; i < kNumCases; ++i) { + for (int j = 0; j < kNumCases; ++j) { + if (i == j) { + EXPECT_TRUE(group1[i] == group2[j]); + EXPECT_FALSE(group1[i] != group2[j]); + } else { + EXPECT_FALSE(group1[i] == group2[j]); + EXPECT_TRUE(group1[i] != group2[j]); + } + } + } } -TEST(StatusOrDeathTest, TestAssertOkAndAssignNotOk) { - // Can't actually test this, as calling ASSERT_TRUE fails the test. -} +struct MyType { + bool operator==(const MyType&) const { return true; } +}; -static absl::Status AssignOrReturnBody(absl::StatusOr maybe) { - ASSIGN_OR_RETURN(int *iptr, maybe); - EXPECT_EQ(*iptr, 1); - *iptr = 4; - return OkStatus(); -} +enum class ConvTraits { kNone = 0, kImplicit = 1, kExplicit = 2 }; -TEST(StatusOr, TestAssignOrReturn) { - int i = 1; - EXPECT_TRUE(AssignOrReturnBody(&i).ok()); - EXPECT_EQ(i, 4); -} +// This class has conversion operator to `StatusOr` based on value of +// `conv_traits`. +template +struct StatusOrConversionBase {}; -TEST(StatusOr, TestAssignOrReturnNotOk) { - const StatusOr thing(Status(absl::StatusCode::kCancelled, "cancelled")); - const Status result = AssignOrReturnBody(thing); - EXPECT_FALSE(result.ok()); - EXPECT_EQ(result, thing.status()); -} - -static absl::Status ReturnIfErrorBody(absl::Status status, int* iptr) { - RETURN_IF_ERROR(status); - EXPECT_EQ(*iptr, 1); - *iptr = 4; - return OkStatus(); -} - -TEST(StatusOr, TestReturnIfError) { - int i = 1; - EXPECT_TRUE(ReturnIfErrorBody(OkStatus(), &i).ok()); - EXPECT_EQ(i, 4); -} - -TEST(StatusOr, TestReturnIfErrorNotOk) { - int i = 1; - Status thing(absl::StatusCode::kCancelled, ""); - EXPECT_FALSE(ReturnIfErrorBody(thing, &i).ok()); - EXPECT_EQ(i, 1); -} - -/* -static StatusOr MakeStatus() { return 100; } - -// A factory to help us benchmark the various factory styles. All of -// the factory methods are marked as non-inlineable so as to more -// accurately simulate calling a factory for which you do not have -// visibility of implementation. Similarly, the value_ variable is -// marked volatile to prevent the compiler from getting too clever -// about detecting that the same value is used in all loop iterations. template -class BenchmarkFactory { - public: - // Construct a new factory. Allocate an object which will always - // be the result of the factory methods. - BenchmarkFactory() : value_(new T) {} - - // Destroy this factory, including the result value. - ~BenchmarkFactory() { delete value_; } - - // A trivial factory that just returns the value. There is no status - // object that could be returned to encapsulate an error - T* TrivialFactory() ABSL_ATTRIBUTE_NOINLINE { return value_; } - - // A more sophisticated factory, which returns a status to indicate - // the result of the operation. The factory result is populated into - // the user provided pointer result. - Status ArgumentFactory(T** result) ABSL_ATTRIBUTE_NOINLINE { - *result = value_; - return Status::OK(); +struct StatusOrConversionBase { + operator absl::StatusOr() const& { // NOLINT + return absl::InvalidArgumentError("conversion to absl::StatusOr"); } - - Status ArgumentFactoryFail(T** result) ABSL_ATTRIBUTE_NOINLINE { - *result = nullptr; - return CancelledError(""); + operator absl::StatusOr() && { // NOLINT + return absl::InvalidArgumentError("conversion to absl::StatusOr"); } - - Status ArgumentFactoryFailShortMsg(T** result) ABSL_ATTRIBUTE_NOINLINE { - *result = nullptr; - return InternalError(""); - } - - Status ArgumentFactoryFailLongMsg(T** result) ABSL_ATTRIBUTE_NOINLINE { - *result = nullptr; - return InternalError(, - "a big string of message junk that will never be read"); - } - - // A factory that returns a StatusOr. If the factory operation - // is OK, then the StatusOr will hold a T*. Otherwise, it will - // hold a status explaining the error. - StatusOr StatusOrFactory() ABSL_ATTRIBUTE_NOINLINE { - return static_cast(value_); - } - - StatusOr StatusOrFactoryFail() ABSL_ATTRIBUTE_NOINLINE { - return CancelledError(""); - } - - StatusOr StatusOrFactoryFailShortMsg() ABSL_ATTRIBUTE_NOINLINE { - return InternalError("i"); - } - - StatusOr StatusOrFactoryFailLongMsg() ABSL_ATTRIBUTE_NOINLINE { - return InternalError( - "a big string of message junk that will never be read"); - } - - private: - T* volatile value_; - ABSL_DISALLOW_COPY_AND_ASSIGN(BenchmarkFactory); }; -// A simple type we use with the factory. -class BenchmarkType { - public: - BenchmarkType() {} - virtual ~BenchmarkType() {} - virtual void DoWork() ABSL_ATTRIBUTE_NOINLINE {} - - private: - ABSL_DISALLOW_COPY_AND_ASSIGN(BenchmarkType); +template +struct StatusOrConversionBase { + explicit operator absl::StatusOr() const& { + return absl::InvalidArgumentError("conversion to absl::StatusOr"); + } + explicit operator absl::StatusOr() && { + return absl::InvalidArgumentError("conversion to absl::StatusOr"); + } }; -// Calibrate the amount of time spent just calling DoWork, since each of our -// tests will do this, we can subtract this out of benchmark results. -void BM_CalibrateWorkLoop(int iters) { - tensorflow::testing::StopTiming(); - BenchmarkFactory factory; - BenchmarkType* result = factory.TrivialFactory(); - tensorflow::testing::StartTiming(); - for (int i = 0; i != iters; ++i) { - if (result != nullptr) { - result->DoWork(); - } - } -} -BENCHMARK(BM_CalibrateWorkLoop); +// This class has conversion operator to `T` based on the value of +// `conv_traits`. +template +struct ConversionBase {}; -// Measure the time taken to call into the factory, return the value, -// determine that it is OK, and invoke a trivial function. -void BM_TrivialFactory(int iters) { - tensorflow::testing::StopTiming(); - BenchmarkFactory factory; - tensorflow::testing::StartTiming(); - for (int i = 0; i != iters; ++i) { - BenchmarkType* result = factory.TrivialFactory(); - if (result != nullptr) { - result->DoWork(); - } - } -} -BENCHMARK(BM_TrivialFactory); +template +struct ConversionBase { + operator T() const& { return t; } // NOLINT + operator T() && { return std::move(t); } // NOLINT + T t; +}; -// Measure the time taken to call into the factory, providing an -// out-param for the result, evaluating the status result and the -// result pointer, and invoking the trivial function. -void BM_ArgumentFactory(int iters) { - tensorflow::testing::StopTiming(); - BenchmarkFactory factory; - tensorflow::testing::StartTiming(); - for (int i = 0; i != iters; ++i) { - BenchmarkType* result = nullptr; - Status status = factory.ArgumentFactory(&result); - if (status.ok() && result != nullptr) { - result->DoWork(); - } - } -} -BENCHMARK(BM_ArgumentFactory); +template +struct ConversionBase { + explicit operator T() const& { return t; } + explicit operator T() && { return std::move(t); } + T t; +}; -// Measure the time to use the StatusOr factory, evaluate the result, -// and invoke the trivial function. -void BM_StatusOrFactory(int iters) { - tensorflow::testing::StopTiming(); - BenchmarkFactory factory; - tensorflow::testing::StartTiming(); - for (int i = 0; i != iters; ++i) { - StatusOr result = factory.StatusOrFactory(); - if (result.ok()) { - result.ValueOrDie()->DoWork(); - } - } -} -BENCHMARK(BM_StatusOrFactory); +// This class has conversion operator to `absl::Status` based on the value of +// `conv_traits`. +template +struct StatusConversionBase {}; -// Measure the time taken to call into the factory, providing an -// out-param for the result, evaluating the status result and the -// result pointer, and invoking the trivial function. -void BM_ArgumentFactoryFail(int iters) { - tensorflow::testing::StopTiming(); - BenchmarkFactory factory; - tensorflow::testing::StartTiming(); - for (int i = 0; i != iters; ++i) { - BenchmarkType* result = nullptr; - Status status = factory.ArgumentFactoryFail(&result); - if (status.ok() && result != nullptr) { - result->DoWork(); - } +template <> +struct StatusConversionBase { + operator absl::Status() const& { // NOLINT + return absl::InternalError("conversion to Status"); } -} -BENCHMARK(BM_ArgumentFactoryFail); + operator absl::Status() && { // NOLINT + return absl::InternalError("conversion to Status"); + } +}; -// Measure the time to use the StatusOr factory, evaluate the result, -// and invoke the trivial function. -void BM_StatusOrFactoryFail(int iters) { - tensorflow::testing::StopTiming(); - BenchmarkFactory factory; - tensorflow::testing::StartTiming(); - for (int i = 0; i != iters; ++i) { - StatusOr result = factory.StatusOrFactoryFail(); - if (result.ok()) { - result.ValueOrDie()->DoWork(); - } +template <> +struct StatusConversionBase { + explicit operator absl::Status() const& { // NOLINT + return absl::InternalError("conversion to Status"); } -} -BENCHMARK(BM_StatusOrFactoryFail); + explicit operator absl::Status() && { // NOLINT + return absl::InternalError("conversion to Status"); + } +}; -// Measure the time taken to call into the factory, providing an -// out-param for the result, evaluating the status result and the -// result pointer, and invoking the trivial function. -void BM_ArgumentFactoryFailShortMsg(int iters) { - tensorflow::testing::StopTiming(); - BenchmarkFactory factory; - tensorflow::testing::StartTiming(); - for (int i = 0; i != iters; ++i) { - BenchmarkType* result = nullptr; - Status status = factory.ArgumentFactoryFailShortMsg(&result); - if (status.ok() && result != nullptr) { - result->DoWork(); - } - } -} -BENCHMARK(BM_ArgumentFactoryFailShortMsg); +static constexpr int kConvToStatus = 1; +static constexpr int kConvToStatusOr = 2; +static constexpr int kConvToT = 4; +static constexpr int kConvExplicit = 8; -// Measure the time to use the StatusOr factory, evaluate the result, -// and invoke the trivial function. -void BM_StatusOrFactoryFailShortMsg(int iters) { - tensorflow::testing::StopTiming(); - BenchmarkFactory factory; - tensorflow::testing::StartTiming(); - for (int i = 0; i != iters; ++i) { - StatusOr result = factory.StatusOrFactoryFailShortMsg(); - if (result.ok()) { - result.ValueOrDie()->DoWork(); - } - } +constexpr ConvTraits GetConvTraits(int bit, int config) { + return (config & bit) == 0 + ? ConvTraits::kNone + : ((config & kConvExplicit) == 0 ? ConvTraits::kImplicit + : ConvTraits::kExplicit); } -BENCHMARK(BM_StatusOrFactoryFailShortMsg); -// Measure the time taken to call into the factory, providing an -// out-param for the result, evaluating the status result and the -// result pointer, and invoking the trivial function. -void BM_ArgumentFactoryFailLongMsg(int iters) { - tensorflow::testing::StopTiming(); - BenchmarkFactory factory; - tensorflow::testing::StartTiming(); - for (int i = 0; i != iters; ++i) { - BenchmarkType* result = nullptr; - Status status = factory.ArgumentFactoryFailLongMsg(&result); - if (status.ok() && result != nullptr) { - result->DoWork(); - } - } -} -BENCHMARK(BM_ArgumentFactoryFailLongMsg); +// This class conditionally has conversion operator to `absl::Status`, `T`, +// `StatusOr`, based on values of the template parameters. +template +struct CustomType + : StatusOrConversionBase, + ConversionBase, + StatusConversionBase {}; -// Measure the time to use the StatusOr factory, evaluate the result, -// and invoke the trivial function. -void BM_StatusOrFactoryFailLongMsg(int iters) { - tensorflow::testing::StopTiming(); - BenchmarkFactory factory; - tensorflow::testing::StartTiming(); - for (int i = 0; i != iters; ++i) { - StatusOr result = factory.StatusOrFactoryFailLongMsg(); - if (result.ok()) { - result.ValueOrDie()->DoWork(); - } +struct ConvertibleToAnyStatusOr { + template + operator absl::StatusOr() const { // NOLINT + return absl::InvalidArgumentError("Conversion to absl::StatusOr"); + } +}; + +// Test the rank of overload resolution for `StatusOr` constructor and +// assignment, from highest to lowest: +// 1. T/Status +// 2. U that has conversion operator to absl::StatusOr +// 3. U that is convertible to Status +// 4. U that is convertible to T +TEST(StatusOr, ConstructionFromT) { + // Construct absl::StatusOr from T when T is convertible to + // absl::StatusOr + { + ConvertibleToAnyStatusOr v; + absl::StatusOr statusor(v); + EXPECT_TRUE(statusor.ok()); + } + { + ConvertibleToAnyStatusOr v; + absl::StatusOr statusor = v; + EXPECT_TRUE(statusor.ok()); + } + // Construct absl::StatusOr from T when T is explicitly convertible to + // Status + { + CustomType v; + absl::StatusOr> statusor( + v); + EXPECT_TRUE(statusor.ok()); + } + { + CustomType v; + absl::StatusOr> statusor = + v; + EXPECT_TRUE(statusor.ok()); + } +} + +// Construct absl::StatusOr from U when U is explicitly convertible to T +TEST(StatusOr, ConstructionFromTypeConvertibleToT) { + { + CustomType v; + absl::StatusOr statusor(v); + EXPECT_TRUE(statusor.ok()); + } + { + CustomType v; + absl::StatusOr statusor = v; + EXPECT_TRUE(statusor.ok()); + } +} + +// Construct absl::StatusOr from U when U has explicit conversion operator to +// absl::StatusOr +TEST(StatusOr, ConstructionFromTypeWithConversionOperatorToStatusOrT) { + { + CustomType v; + absl::StatusOr statusor(v); + EXPECT_EQ(statusor, v.operator absl::StatusOr()); + } + { + CustomType v; + absl::StatusOr statusor(v); + EXPECT_EQ(statusor, v.operator absl::StatusOr()); + } + { + CustomType v; + absl::StatusOr statusor(v); + EXPECT_EQ(statusor, v.operator absl::StatusOr()); + } + { + CustomType + v; + absl::StatusOr statusor(v); + EXPECT_EQ(statusor, v.operator absl::StatusOr()); + } + { + CustomType v; + absl::StatusOr statusor = v; + EXPECT_EQ(statusor, v.operator absl::StatusOr()); + } + { + CustomType v; + absl::StatusOr statusor = v; + EXPECT_EQ(statusor, v.operator absl::StatusOr()); + } + { + CustomType v; + absl::StatusOr statusor = v; + EXPECT_EQ(statusor, v.operator absl::StatusOr()); + } + { + CustomType v; + absl::StatusOr statusor = v; + EXPECT_EQ(statusor, v.operator absl::StatusOr()); + } +} + +TEST(StatusOr, ConstructionFromTypeConvertibleToStatus) { + // Construction fails because conversion to `Status` is explicit. + { + CustomType v; + absl::StatusOr statusor(v); + EXPECT_FALSE(statusor.ok()); + EXPECT_EQ(statusor.status(), static_cast(v)); + } + { + CustomType v; + absl::StatusOr statusor(v); + EXPECT_FALSE(statusor.ok()); + EXPECT_EQ(statusor.status(), static_cast(v)); + } + { + CustomType v; + absl::StatusOr statusor = v; + EXPECT_FALSE(statusor.ok()); + EXPECT_EQ(statusor.status(), static_cast(v)); + } + { + CustomType v; + absl::StatusOr statusor = v; + EXPECT_FALSE(statusor.ok()); + EXPECT_EQ(statusor.status(), static_cast(v)); + } +} + +TEST(StatusOr, AssignmentFromT) { + // Assign to absl::StatusOr from T when T is convertible to + // absl::StatusOr + { + ConvertibleToAnyStatusOr v; + absl::StatusOr statusor; + statusor = v; + EXPECT_TRUE(statusor.ok()); + } + // Assign to absl::StatusOr from T when T is convertible to Status + { + CustomType v; + absl::StatusOr> statusor; + statusor = v; + EXPECT_TRUE(statusor.ok()); + } +} + +TEST(StatusOr, AssignmentFromTypeConvertibleToT) { + // Assign to absl::StatusOr from U when U is convertible to T + { + CustomType v; + absl::StatusOr statusor; + statusor = v; + EXPECT_TRUE(statusor.ok()); + } +} + +TEST(StatusOr, AssignmentFromTypeWithConversionOperatortoStatusOrT) { + // Assign to absl::StatusOr from U when U has conversion operator to + // absl::StatusOr + { + CustomType v; + absl::StatusOr statusor; + statusor = v; + EXPECT_EQ(statusor, v.operator absl::StatusOr()); + } + { + CustomType v; + absl::StatusOr statusor; + statusor = v; + EXPECT_EQ(statusor, v.operator absl::StatusOr()); + } + { + CustomType v; + absl::StatusOr statusor; + statusor = v; + EXPECT_EQ(statusor, v.operator absl::StatusOr()); + } + { + CustomType v; + absl::StatusOr statusor; + statusor = v; + EXPECT_EQ(statusor, v.operator absl::StatusOr()); + } +} + +TEST(StatusOr, AssignmentFromTypeConvertibleToStatus) { + // Assign to absl::StatusOr from U when U is convertible to Status + { + CustomType v; + absl::StatusOr statusor; + statusor = v; + EXPECT_FALSE(statusor.ok()); + EXPECT_EQ(statusor.status(), static_cast(v)); + } + { + CustomType v; + absl::StatusOr statusor; + statusor = v; + EXPECT_FALSE(statusor.ok()); + EXPECT_EQ(statusor.status(), static_cast(v)); } } -BENCHMARK(BM_StatusOrFactoryFailLongMsg); -*/ } // namespace - -ABSL_NAMESPACE_END -} // namespace absl diff --git a/third_party/abseil_cpp/absl/strings/BUILD.bazel b/third_party/abseil_cpp/absl/strings/BUILD.bazel index 8220896d3..30a8dd28b 100644 --- a/third_party/abseil_cpp/absl/strings/BUILD.bazel +++ b/third_party/abseil_cpp/absl/strings/BUILD.bazel @@ -54,6 +54,7 @@ cc_library( "ascii.h", "charconv.h", "escaping.h", + "internal/string_constant.h", "match.h", "numbers.h", "str_cat.h", @@ -222,6 +223,19 @@ cc_test( ], ) +cc_test( + name = "string_constant_test", + size = "small", + srcs = ["internal/string_constant_test.cc"], + copts = ABSL_TEST_COPTS, + visibility = ["//visibility:private"], + deps = [ + ":strings", + "//absl/meta:type_traits", + "@com_google_googletest//:gtest_main", + ], +) + cc_test( name = "string_view_benchmark", srcs = ["string_view_benchmark.cc"], @@ -258,6 +272,8 @@ cc_library( visibility = ["//visibility:private"], deps = [ ":strings", + "//absl/base:base_internal", + "//absl/container:compressed_tuple", "//absl/meta:type_traits", ], ) @@ -277,7 +293,6 @@ cc_library( ":str_format", ":strings", "//absl/base", - "//absl/base:base_internal", "//absl/base:core_headers", "//absl/base:endian", "//absl/base:raw_logging_internal", @@ -720,6 +735,7 @@ cc_test( visibility = ["//visibility:private"], deps = [ ":str_format_internal", + ":strings", "//absl/base:raw_logging_internal", "//absl/types:optional", "@com_google_googletest//:gtest_main", diff --git a/third_party/abseil_cpp/absl/strings/CMakeLists.txt b/third_party/abseil_cpp/absl/strings/CMakeLists.txt index c0ea0c8e1..2b994a71c 100644 --- a/third_party/abseil_cpp/absl/strings/CMakeLists.txt +++ b/third_party/abseil_cpp/absl/strings/CMakeLists.txt @@ -21,6 +21,7 @@ absl_cc_library( "ascii.h" "charconv.h" "escaping.h" + "internal/string_constant.h" "match.h" "numbers.h" "str_cat.h" @@ -158,6 +159,19 @@ absl_cc_test( gmock_main ) +absl_cc_test( + NAME + string_constant_test + SRCS + "internal/string_constant_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::strings + absl::type_traits + gmock_main +) + absl_cc_test( NAME string_view_test @@ -475,6 +489,7 @@ absl_cc_test( COPTS ${ABSL_TEST_COPTS} DEPS + absl::strings absl::str_format_internal absl::raw_logging_internal absl::int128 @@ -547,6 +562,7 @@ absl_cc_library( DEPS absl::base absl::base_internal + absl::compressed_tuple absl::core_headers absl::endian absl::fixed_array diff --git a/third_party/abseil_cpp/absl/strings/cord.cc b/third_party/abseil_cpp/absl/strings/cord.cc index 68f539879..9efd13575 100644 --- a/third_party/abseil_cpp/absl/strings/cord.cc +++ b/third_party/abseil_cpp/absl/strings/cord.cc @@ -50,58 +50,10 @@ using ::absl::cord_internal::CordRepConcat; using ::absl::cord_internal::CordRepExternal; using ::absl::cord_internal::CordRepSubstring; -// Various representations that we allow -enum CordRepKind { - CONCAT = 0, - EXTERNAL = 1, - SUBSTRING = 2, - - // We have different tags for different sized flat arrays, - // starting with FLAT - FLAT = 3, -}; - -namespace { - -// Type used with std::allocator for allocating and deallocating -// `CordRepExternal`. std::allocator is used because it opaquely handles the -// different new / delete overloads available on a given platform. -struct alignas(absl::cord_internal::ExternalRepAlignment()) ExternalAllocType { - unsigned char value[absl::cord_internal::ExternalRepAlignment()]; -}; - -// Returns the number of objects to pass in to std::allocator -// allocate() and deallocate() to create enough room for `CordRepExternal` with -// `releaser_size` bytes on the end. -constexpr size_t GetExternalAllocNumObjects(size_t releaser_size) { - // Be sure to round up since `releaser_size` could be smaller than - // `sizeof(ExternalAllocType)`. - return (sizeof(CordRepExternal) + releaser_size + sizeof(ExternalAllocType) - - 1) / - sizeof(ExternalAllocType); -} - -// Allocates enough memory for `CordRepExternal` and a releaser with size -// `releaser_size` bytes. -void* AllocateExternal(size_t releaser_size) { - return std::allocator().allocate( - GetExternalAllocNumObjects(releaser_size)); -} - -// Deallocates the memory for a `CordRepExternal` assuming it was allocated with -// a releaser of given size and alignment. -void DeallocateExternal(CordRepExternal* p, size_t releaser_size) { - std::allocator().deallocate( - reinterpret_cast(p), - GetExternalAllocNumObjects(releaser_size)); -} - -// Returns a pointer to the type erased releaser for the given CordRepExternal. -void* GetExternalReleaser(CordRepExternal* rep) { - return rep + 1; -} - -} // namespace +using ::absl::cord_internal::CONCAT; +using ::absl::cord_internal::EXTERNAL; +using ::absl::cord_internal::FLAT; +using ::absl::cord_internal::SUBSTRING; namespace cord_internal { @@ -289,6 +241,7 @@ static void UnrefInternal(CordRep* rep) { absl::InlinedVector pending; while (true) { + assert(!rep->refcount.IsImmortal()); if (rep->tag == CONCAT) { CordRepConcat* rep_concat = rep->concat(); CordRep* right = rep_concat->right; @@ -304,11 +257,8 @@ static void UnrefInternal(CordRep* rep) { } } else if (rep->tag == EXTERNAL) { CordRepExternal* rep_external = rep->external(); - absl::string_view data(rep_external->base, rep->length); - void* releaser = GetExternalReleaser(rep_external); - size_t releaser_size = rep_external->releaser_invoker(releaser, data); - rep_external->~CordRepExternal(); - DeallocateExternal(rep_external, releaser_size); + assert(rep_external->releaser_invoker != nullptr); + rep_external->releaser_invoker(rep_external); rep = nullptr; } else if (rep->tag == SUBSTRING) { CordRepSubstring* rep_substring = rep->substring(); @@ -458,18 +408,12 @@ static CordRep* NewTree(const char* data, namespace cord_internal { -ExternalRepReleaserPair NewExternalWithUninitializedReleaser( - absl::string_view data, ExternalReleaserInvoker invoker, - size_t releaser_size) { +void InitializeCordRepExternal(absl::string_view data, CordRepExternal* rep) { assert(!data.empty()); - - void* raw_rep = AllocateExternal(releaser_size); - auto* rep = new (raw_rep) CordRepExternal(); rep->length = data.size(); rep->tag = EXTERNAL; rep->base = data.data(); - rep->releaser_invoker = invoker; - return {VerifyTree(rep), GetExternalReleaser(rep)}; + VerifyTree(rep); } } // namespace cord_internal @@ -493,57 +437,55 @@ static CordRep* NewSubstring(CordRep* child, size_t offset, size_t length) { // -------------------------------------------------------------------- // Cord::InlineRep functions -// This will trigger LNK2005 in MSVC. -#ifndef COMPILER_MSVC -const unsigned char Cord::InlineRep::kMaxInline; -#endif // COMPILER_MSVC +constexpr unsigned char Cord::InlineRep::kMaxInline; inline void Cord::InlineRep::set_data(const char* data, size_t n, bool nullify_tail) { static_assert(kMaxInline == 15, "set_data is hard-coded for a length of 15"); - cord_internal::SmallMemmove(data_, data, n, nullify_tail); - data_[kMaxInline] = static_cast(n); + cord_internal::SmallMemmove(data_.as_chars, data, n, nullify_tail); + set_tagged_size(static_cast(n)); } inline char* Cord::InlineRep::set_data(size_t n) { assert(n <= kMaxInline); - memset(data_, 0, sizeof(data_)); - data_[kMaxInline] = static_cast(n); - return data_; + ResetToEmpty(); + set_tagged_size(static_cast(n)); + return data_.as_chars; } inline CordRep* Cord::InlineRep::force_tree(size_t extra_hint) { - size_t len = data_[kMaxInline]; - CordRep* result; + size_t len = tagged_size(); if (len > kMaxInline) { - memcpy(&result, data_, sizeof(result)); - } else { - result = NewFlat(len + extra_hint); - result->length = len; - memcpy(result->data, data_, len); - set_tree(result); + return data_.as_tree.rep; } + + CordRep* result = NewFlat(len + extra_hint); + result->length = len; + static_assert(kMinFlatLength >= sizeof(data_.as_chars), ""); + memcpy(result->data, data_.as_chars, sizeof(data_.as_chars)); + set_tree(result); return result; } inline void Cord::InlineRep::reduce_size(size_t n) { - size_t tag = data_[kMaxInline]; + size_t tag = tagged_size(); assert(tag <= kMaxInline); assert(tag >= n); tag -= n; - memset(data_ + tag, 0, n); - data_[kMaxInline] = static_cast(tag); + memset(data_.as_chars + tag, 0, n); + set_tagged_size(static_cast(tag)); } inline void Cord::InlineRep::remove_prefix(size_t n) { - cord_internal::SmallMemmove(data_, data_ + n, data_[kMaxInline] - n); + cord_internal::SmallMemmove(data_.as_chars, data_.as_chars + n, + tagged_size() - n); reduce_size(n); } void Cord::InlineRep::AppendTree(CordRep* tree) { if (tree == nullptr) return; - size_t len = data_[kMaxInline]; + size_t len = tagged_size(); if (len == 0) { set_tree(tree); } else { @@ -552,8 +494,8 @@ void Cord::InlineRep::AppendTree(CordRep* tree) { } void Cord::InlineRep::PrependTree(CordRep* tree) { - if (tree == nullptr) return; - size_t len = data_[kMaxInline]; + assert(tree != nullptr); + size_t len = tagged_size(); if (len == 0) { set_tree(tree); } else { @@ -609,11 +551,11 @@ void Cord::InlineRep::GetAppendRegion(char** region, size_t* size, } // Try to fit in the inline buffer if possible. - size_t inline_length = data_[kMaxInline]; + size_t inline_length = tagged_size(); if (inline_length < kMaxInline && max_length <= kMaxInline - inline_length) { - *region = data_ + inline_length; + *region = data_.as_chars + inline_length; *size = max_length; - data_[kMaxInline] = static_cast(inline_length + max_length); + set_tagged_size(static_cast(inline_length + max_length)); return; } @@ -637,11 +579,11 @@ void Cord::InlineRep::GetAppendRegion(char** region, size_t* size) { const size_t max_length = std::numeric_limits::max(); // Try to fit in the inline buffer if possible. - size_t inline_length = data_[kMaxInline]; + size_t inline_length = tagged_size(); if (inline_length < kMaxInline) { - *region = data_ + inline_length; + *region = data_.as_chars + inline_length; *size = kMaxInline - inline_length; - data_[kMaxInline] = kMaxInline; + set_tagged_size(kMaxInline); return; } @@ -676,7 +618,7 @@ static bool RepMemoryUsageLeaf(const CordRep* rep, size_t* total_mem_usage) { void Cord::InlineRep::AssignSlow(const Cord::InlineRep& src) { ClearSlow(); - memcpy(data_, src.data_, sizeof(data_)); + data_ = src.data_; if (is_tree()) { Ref(tree()); } @@ -686,7 +628,7 @@ void Cord::InlineRep::ClearSlow() { if (is_tree()) { Unref(tree()); } - memset(data_, 0, sizeof(data_)); + ResetToEmpty(); } // -------------------------------------------------------------------- @@ -724,12 +666,12 @@ Cord::Cord(T&& src) { std::string data; }; const absl::string_view original_data = src; - CordRepExternal* rep = - static_cast(absl::cord_internal::NewExternalRep( - original_data, StringReleaser{std::move(src)})); + auto* rep = static_cast< + ::absl::cord_internal::CordRepExternalImpl*>( + absl::cord_internal::NewExternalRep( + original_data, StringReleaser{std::forward(src)})); // Moving src may have invalidated its data pointer, so adjust it. - rep->base = - static_cast(GetExternalReleaser(rep))->data.data(); + rep->base = rep->template get<0>().data.data(); contents_.set_tree(rep); } } @@ -778,7 +720,7 @@ Cord& Cord::operator=(T&& src) { if (src.size() <= kMaxBytesToCopy) { *this = absl::string_view(src); } else { - *this = Cord(std::move(src)); + *this = Cord(std::forward(src)); } return *this; } @@ -790,11 +732,11 @@ template Cord& Cord::operator=(std::string&& src); void Cord::InlineRep::AppendArray(const char* src_data, size_t src_size) { if (src_size == 0) return; // memcpy(_, nullptr, 0) is undefined. // Try to fit in the inline buffer if possible. - size_t inline_length = data_[kMaxInline]; + size_t inline_length = tagged_size(); if (inline_length < kMaxInline && src_size <= kMaxInline - inline_length) { // Append new data to embedded array - data_[kMaxInline] = static_cast(inline_length + src_size); - memcpy(data_ + inline_length, src_data, src_size); + set_tagged_size(static_cast(inline_length + src_size)); + memcpy(data_.as_chars + inline_length, src_data, src_size); return; } @@ -817,7 +759,7 @@ void Cord::InlineRep::AppendArray(const char* src_data, size_t src_size) { const size_t size2 = inline_length + src_size / 10; root = NewFlat(std::max(size1, size2)); appended = std::min(src_size, TagToLength(root->tag) - inline_length); - memcpy(root->data, data_, inline_length); + memcpy(root->data, data_.as_chars, inline_length); memcpy(root->data + inline_length, src_data, appended); root->length = inline_length + appended; set_tree(root); @@ -901,7 +843,7 @@ void Cord::Append(T&& src) { if (src.size() <= kMaxBytesToCopy) { Append(absl::string_view(src)); } else { - Append(Cord(std::move(src))); + Append(Cord(std::forward(src))); } } @@ -941,7 +883,7 @@ inline void Cord::Prepend(T&& src) { if (src.size() <= kMaxBytesToCopy) { Prepend(absl::string_view(src)); } else { - Prepend(Cord(std::move(src))); + Prepend(Cord(std::forward(src))); } } @@ -1126,7 +1068,7 @@ Cord Cord::Subcord(size_t pos, size_t new_size) const { } else if (new_size <= InlineRep::kMaxInline) { Cord::ChunkIterator it = chunk_begin(); it.AdvanceBytes(pos); - char* dest = sub_cord.contents_.data_; + char* dest = sub_cord.contents_.data_.as_chars; size_t remaining_size = new_size; while (remaining_size > it->size()) { cord_internal::SmallMemmove(dest, it->data(), it->size()); @@ -1135,7 +1077,7 @@ Cord Cord::Subcord(size_t pos, size_t new_size) const { ++it; } cord_internal::SmallMemmove(dest, it->data(), remaining_size); - sub_cord.contents_.data_[InlineRep::kMaxInline] = new_size; + sub_cord.contents_.set_tagged_size(new_size); } else { sub_cord.contents_.set_tree(NewSubRange(tree, pos, new_size)); } @@ -1324,9 +1266,9 @@ bool ComputeCompareResult(int memcmp_res) { // Helper routine. Locates the first flat chunk of the Cord without // initializing the iterator. inline absl::string_view Cord::InlineRep::FindFlatStartPiece() const { - size_t n = data_[kMaxInline]; + size_t n = tagged_size(); if (n <= kMaxInline) { - return absl::string_view(data_, n); + return absl::string_view(data_.as_chars, n); } CordRep* node = tree(); diff --git a/third_party/abseil_cpp/absl/strings/cord.h b/third_party/abseil_cpp/absl/strings/cord.h index dc987454f..5d5c897e6 100644 --- a/third_party/abseil_cpp/absl/strings/cord.h +++ b/third_party/abseil_cpp/absl/strings/cord.h @@ -71,7 +71,6 @@ #include #include "absl/base/internal/endian.h" -#include "absl/base/internal/invoke.h" #include "absl/base/internal/per_thread_tls.h" #include "absl/base/macros.h" #include "absl/base/port.h" @@ -80,6 +79,7 @@ #include "absl/meta/type_traits.h" #include "absl/strings/internal/cord_internal.h" #include "absl/strings/internal/resize_uninitialized.h" +#include "absl/strings/internal/string_constant.h" #include "absl/strings/string_view.h" #include "absl/types/optional.h" @@ -126,9 +126,9 @@ class Cord { absl::enable_if_t::value, int>; public: - // Cord::Cord() Constructors + // Cord::Cord() Constructors. - // Creates an empty Cord + // Creates an empty Cord. constexpr Cord() noexcept; // Creates a Cord from an existing Cord. Cord is copyable and efficiently @@ -154,7 +154,7 @@ class Cord { // Cord::~Cord() // - // Destructs the Cord + // Destructs the Cord. ~Cord() { if (contents_.is_tree()) DestroyCordSlow(); } @@ -173,10 +173,6 @@ class Cord { // // * be move constructible // * support `void operator()(absl::string_view) const` or `void operator()` - // * not have alignment requirement greater than what is guaranteed by - // `::operator new`. This alignment is dictated by - // `alignof(std::max_align_t)` (pre-C++17 code) or - // `__STDCPP_DEFAULT_NEW_ALIGNMENT__` (C++17 code). // // Example: // @@ -592,7 +588,7 @@ class Cord { // Cord::operator[] // - // Get the "i"th character of the Cord and returns it, provided that + // Gets the "i"th character of the Cord and returns it, provided that // 0 <= i < Cord.size(). // // NOTE: This routine is reasonably efficient. It is roughly @@ -604,8 +600,8 @@ class Cord { // Cord::TryFlat() // - // If this cord's representation is a single flat array, return a - // string_view referencing that array. Otherwise return nullopt. + // If this cord's representation is a single flat array, returns a + // string_view referencing that array. Otherwise returns nullopt. absl::optional TryFlat() const; // Cord::Flatten() @@ -615,7 +611,7 @@ class Cord { // If the cord was already flat, the contents are not modified. absl::string_view Flatten(); - // Support absl::Cord as a sink object for absl::Format(). + // Supports absl::Cord as a sink object for absl::Format(). friend void AbslFormatFlush(absl::Cord* cord, absl::string_view part) { cord->Append(part); } @@ -629,12 +625,20 @@ class Cord { return c.HashFragmented(std::move(hash_state)); } + // Create a Cord with the contents of StringConstant::value. + // No allocations will be done and no data will be copied. + // This is an INTERNAL API and subject to change or removal. This API can only + // be used by spelling absl::strings_internal::MakeStringConstant, which is + // also an internal API. + template + explicit constexpr Cord(strings_internal::StringConstant); + private: friend class CordTestPeer; friend bool operator==(const Cord& lhs, const Cord& rhs); friend bool operator==(const Cord& lhs, absl::string_view rhs); - // Call the provided function once for each cord chunk, in order. Unlike + // Calls the provided function once for each cord chunk, in order. Unlike // Chunks(), this API will not allocate memory. void ForEachChunk(absl::FunctionRef) const; @@ -649,19 +653,19 @@ class Cord { // InlineRep holds either a tree pointer, or an array of kMaxInline bytes. class InlineRep { public: - static constexpr unsigned char kMaxInline = 15; + static constexpr unsigned char kMaxInline = cord_internal::kMaxInline; static_assert(kMaxInline >= sizeof(absl::cord_internal::CordRep*), ""); - // Tag byte & kMaxInline means we are storing a pointer. - static constexpr unsigned char kTreeFlag = 1 << 4; - // Tag byte & kProfiledFlag means we are profiling the Cord. - static constexpr unsigned char kProfiledFlag = 1 << 5; + static constexpr unsigned char kTreeFlag = cord_internal::kTreeFlag; + static constexpr unsigned char kProfiledFlag = cord_internal::kProfiledFlag; - constexpr InlineRep() : data_{} {} + constexpr InlineRep() : data_() {} InlineRep(const InlineRep& src); InlineRep(InlineRep&& src); InlineRep& operator=(const InlineRep& src); InlineRep& operator=(InlineRep&& src) noexcept; + explicit constexpr InlineRep(cord_internal::InlineData data); + void Swap(InlineRep* rhs); bool empty() const; size_t size() const; @@ -678,7 +682,7 @@ class Cord { void replace_tree(absl::cord_internal::CordRep* rep); // Returns non-null iff was holding a pointer absl::cord_internal::CordRep* clear(); - // Convert to pointer if necessary + // Converts to pointer if necessary. absl::cord_internal::CordRep* force_tree(size_t extra_hint); void reduce_size(size_t n); // REQUIRES: holding data void remove_prefix(size_t n); // REQUIRES: holding data @@ -689,16 +693,16 @@ class Cord { void GetAppendRegion(char** region, size_t* size, size_t max_length); void GetAppendRegion(char** region, size_t* size); bool IsSame(const InlineRep& other) const { - return memcmp(data_, other.data_, sizeof(data_)) == 0; + return memcmp(&data_, &other.data_, sizeof(data_)) == 0; } int BitwiseCompare(const InlineRep& other) const { uint64_t x, y; - // Use memcpy to avoid anti-aliasing issues. - memcpy(&x, data_, sizeof(x)); - memcpy(&y, other.data_, sizeof(y)); + // Use memcpy to avoid aliasing issues. + memcpy(&x, &data_, sizeof(x)); + memcpy(&y, &other.data_, sizeof(y)); if (x == y) { - memcpy(&x, data_ + 8, sizeof(x)); - memcpy(&y, other.data_ + 8, sizeof(y)); + memcpy(&x, reinterpret_cast(&data_) + 8, sizeof(x)); + memcpy(&y, reinterpret_cast(&other.data_) + 8, sizeof(y)); if (x == y) return 0; } return absl::big_endian::FromHost64(x) < absl::big_endian::FromHost64(y) @@ -711,16 +715,16 @@ class Cord { // to 15 bytes does not cause a memory allocation. absl::strings_internal::STLStringResizeUninitialized(dst, sizeof(data_) - 1); - memcpy(&(*dst)[0], data_, sizeof(data_) - 1); + memcpy(&(*dst)[0], &data_, sizeof(data_) - 1); // erase is faster than resize because the logic for memory allocation is // not needed. - dst->erase(data_[kMaxInline]); + dst->erase(tagged_size()); } // Copies the inline contents into `dst`. Assumes the cord is not empty. void CopyToArray(char* dst) const; - bool is_tree() const { return data_[kMaxInline] > kMaxInline; } + bool is_tree() const { return tagged_size() > kMaxInline; } private: friend class Cord; @@ -729,21 +733,29 @@ class Cord { // Unrefs the tree, stops profiling, and zeroes the contents void ClearSlow(); - // If the data has length <= kMaxInline, we store it in data_[0..len-1], - // and store the length in data_[kMaxInline]. Else we store it in a tree - // and store a pointer to that tree in data_[0..sizeof(CordRep*)-1]. - alignas(absl::cord_internal::CordRep*) char data_[kMaxInline + 1]; + void ResetToEmpty() { data_ = {}; } + + // This uses reinterpret_cast instead of the union to avoid accessing the + // inactive union element. The tagged size is not a common prefix. + void set_tagged_size(char new_tag) { + reinterpret_cast(&data_)[kMaxInline] = new_tag; + } + char tagged_size() const { + return reinterpret_cast(&data_)[kMaxInline]; + } + + cord_internal::InlineData data_; }; InlineRep contents_; - // Helper for MemoryUsage() + // Helper for MemoryUsage(). static size_t MemoryUsageAux(const absl::cord_internal::CordRep* rep); - // Helper for GetFlat() and TryFlat() + // Helper for GetFlat() and TryFlat(). static bool GetFlatAux(absl::cord_internal::CordRep* rep, absl::string_view* fragment); - // Helper for ForEachChunk() + // Helper for ForEachChunk(). static void ForEachChunkAux( absl::cord_internal::CordRep* rep, absl::FunctionRef callback); @@ -772,11 +784,11 @@ class Cord { absl::cord_internal::CordRep* TakeRep() const&; absl::cord_internal::CordRep* TakeRep() &&; - // Helper for Append() + // Helper for Append(). template void AppendImpl(C&& src); - // Helper for AbslHashValue() + // Helper for AbslHashValue(). template H HashFragmented(H hash_state) const { typename H::AbslInternalPiecewiseCombiner combiner; @@ -842,47 +854,15 @@ inline void SmallMemmove(char* dst, const char* src, size_t n, } } -struct ExternalRepReleaserPair { - CordRep* rep; - void* releaser_address; -}; - -// Allocates a new external `CordRep` and returns a pointer to it and a pointer -// to `releaser_size` bytes where the desired releaser can be constructed. +// Does non-template-specific `CordRepExternal` initialization. // Expects `data` to be non-empty. -ExternalRepReleaserPair NewExternalWithUninitializedReleaser( - absl::string_view data, ExternalReleaserInvoker invoker, - size_t releaser_size); - -struct Rank1 {}; -struct Rank0 : Rank1 {}; - -template > -void InvokeReleaser(Rank0, Releaser&& releaser, absl::string_view data) { - ::absl::base_internal::Invoke(std::forward(releaser), data); -} - -template > -void InvokeReleaser(Rank1, Releaser&& releaser, absl::string_view) { - ::absl::base_internal::Invoke(std::forward(releaser)); -} +void InitializeCordRepExternal(absl::string_view data, CordRepExternal* rep); // Creates a new `CordRep` that owns `data` and `releaser` and returns a pointer // to it, or `nullptr` if `data` was empty. template // NOLINTNEXTLINE - suppress clang-tidy raw pointer return. CordRep* NewExternalRep(absl::string_view data, Releaser&& releaser) { - static_assert( -#if defined(__STDCPP_DEFAULT_NEW_ALIGNMENT__) - alignof(Releaser) <= __STDCPP_DEFAULT_NEW_ALIGNMENT__, -#else - alignof(Releaser) <= alignof(max_align_t), -#endif - "Releasers with alignment requirement greater than what is returned by " - "default `::operator new()` are not supported."); - using ReleaserType = absl::decay_t; if (data.empty()) { // Never create empty external nodes. @@ -891,18 +871,10 @@ CordRep* NewExternalRep(absl::string_view data, Releaser&& releaser) { return nullptr; } - auto releaser_invoker = [](void* type_erased_releaser, absl::string_view d) { - auto* my_releaser = static_cast(type_erased_releaser); - InvokeReleaser(Rank0{}, std::move(*my_releaser), d); - my_releaser->~ReleaserType(); - return sizeof(Releaser); - }; - - ExternalRepReleaserPair external = NewExternalWithUninitializedReleaser( - data, releaser_invoker, sizeof(releaser)); - ::new (external.releaser_address) - ReleaserType(std::forward(releaser)); - return external.rep; + CordRepExternal* rep = new CordRepExternalImpl( + std::forward(releaser), 0); + InitializeCordRepExternal(data, rep); + return rep; } // Overload for function reference types that dispatches using a function @@ -923,13 +895,16 @@ Cord MakeCordFromExternal(absl::string_view data, Releaser&& releaser) { return cord; } +constexpr Cord::InlineRep::InlineRep(cord_internal::InlineData data) + : data_(data) {} + inline Cord::InlineRep::InlineRep(const Cord::InlineRep& src) { - cord_internal::SmallMemmove(data_, src.data_, sizeof(data_)); + data_ = src.data_; } inline Cord::InlineRep::InlineRep(Cord::InlineRep&& src) { - memcpy(data_, src.data_, sizeof(data_)); - memset(src.data_, 0, sizeof(data_)); + data_ = src.data_; + src.ResetToEmpty(); } inline Cord::InlineRep& Cord::InlineRep::operator=(const Cord::InlineRep& src) { @@ -937,7 +912,7 @@ inline Cord::InlineRep& Cord::InlineRep::operator=(const Cord::InlineRep& src) { return *this; } if (!is_tree() && !src.is_tree()) { - cord_internal::SmallMemmove(data_, src.data_, sizeof(data_)); + data_ = src.data_; return *this; } AssignSlow(src); @@ -949,8 +924,8 @@ inline Cord::InlineRep& Cord::InlineRep::operator=( if (is_tree()) { ClearSlow(); } - memcpy(data_, src.data_, sizeof(data_)); - memset(src.data_, 0, sizeof(data_)); + data_ = src.data_; + src.ResetToEmpty(); return *this; } @@ -959,43 +934,39 @@ inline void Cord::InlineRep::Swap(Cord::InlineRep* rhs) { return; } - Cord::InlineRep tmp; - cord_internal::SmallMemmove(tmp.data_, data_, sizeof(data_)); - cord_internal::SmallMemmove(data_, rhs->data_, sizeof(data_)); - cord_internal::SmallMemmove(rhs->data_, tmp.data_, sizeof(data_)); + std::swap(data_, rhs->data_); } inline const char* Cord::InlineRep::data() const { - return is_tree() ? nullptr : data_; + return is_tree() ? nullptr : data_.as_chars; } inline absl::cord_internal::CordRep* Cord::InlineRep::tree() const { if (is_tree()) { - absl::cord_internal::CordRep* rep; - memcpy(&rep, data_, sizeof(rep)); - return rep; + return data_.as_tree.rep; } else { return nullptr; } } -inline bool Cord::InlineRep::empty() const { return data_[kMaxInline] == 0; } +inline bool Cord::InlineRep::empty() const { return tagged_size() == 0; } inline size_t Cord::InlineRep::size() const { - const char tag = data_[kMaxInline]; + const char tag = tagged_size(); if (tag <= kMaxInline) return tag; return static_cast(tree()->length); } inline void Cord::InlineRep::set_tree(absl::cord_internal::CordRep* rep) { if (rep == nullptr) { - memset(data_, 0, sizeof(data_)); + ResetToEmpty(); } else { bool was_tree = is_tree(); - memcpy(data_, &rep, sizeof(rep)); - memset(data_ + sizeof(rep), 0, sizeof(data_) - sizeof(rep) - 1); + data_.as_tree = {rep, {}, tagged_size()}; if (!was_tree) { - data_[kMaxInline] = kTreeFlag; + // If we were not a tree already, set the tag. + // Otherwise, leave it alone because it might have the profile bit on. + set_tagged_size(kTreeFlag); } } } @@ -1006,29 +977,36 @@ inline void Cord::InlineRep::replace_tree(absl::cord_internal::CordRep* rep) { set_tree(rep); return; } - memcpy(data_, &rep, sizeof(rep)); - memset(data_ + sizeof(rep), 0, sizeof(data_) - sizeof(rep) - 1); + data_.as_tree = {rep, {}, tagged_size()}; } inline absl::cord_internal::CordRep* Cord::InlineRep::clear() { - const char tag = data_[kMaxInline]; - absl::cord_internal::CordRep* result = nullptr; - if (tag > kMaxInline) { - memcpy(&result, data_, sizeof(result)); - } - memset(data_, 0, sizeof(data_)); // Clear the cord + absl::cord_internal::CordRep* result = tree(); + ResetToEmpty(); return result; } inline void Cord::InlineRep::CopyToArray(char* dst) const { assert(!is_tree()); - size_t n = data_[kMaxInline]; + size_t n = tagged_size(); assert(n != 0); - cord_internal::SmallMemmove(dst, data_, n); + cord_internal::SmallMemmove(dst, data_.as_chars, n); } constexpr inline Cord::Cord() noexcept {} +template +constexpr Cord::Cord(strings_internal::StringConstant) + : contents_(strings_internal::StringConstant::value.size() <= + cord_internal::kMaxInline + ? cord_internal::InlineData( + strings_internal::StringConstant::value) + : cord_internal::InlineData(cord_internal::AsTree{ + &cord_internal::ConstInitExternalStorage< + strings_internal::StringConstant>::value, + {}, + cord_internal::kTreeFlag})) {} + inline Cord& Cord::operator=(const Cord& x) { contents_ = x.contents_; return *this; diff --git a/third_party/abseil_cpp/absl/strings/cord_test.cc b/third_party/abseil_cpp/absl/strings/cord_test.cc index 4443c8289..7942bfc03 100644 --- a/third_party/abseil_cpp/absl/strings/cord_test.cc +++ b/third_party/abseil_cpp/absl/strings/cord_test.cc @@ -1,3 +1,17 @@ +// Copyright 2020 The Abseil 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 +// +// https://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 "absl/strings/cord.h" #include @@ -167,6 +181,8 @@ class CordTestPeer { const Cord& c, absl::FunctionRef callback) { c.ForEachChunk(callback); } + + static bool IsTree(const Cord& c) { return c.contents_.is_tree(); } }; ABSL_NAMESPACE_END @@ -1613,3 +1629,83 @@ TEST(CordDeathTest, Hardening) { EXPECT_DEATH_IF_SUPPORTED(static_cast(cord.chunk_end()->empty()), ""); EXPECT_DEATH_IF_SUPPORTED(++cord.chunk_end(), ""); } + +class AfterExitCordTester { + public: + bool Set(absl::Cord* cord, absl::string_view expected) { + cord_ = cord; + expected_ = expected; + return true; + } + + ~AfterExitCordTester() { + EXPECT_EQ(*cord_, expected_); + } + private: + absl::Cord* cord_; + absl::string_view expected_; +}; + +template +void TestConstinitConstructor(Str) { + const auto expected = Str::value; + // Defined before `cord` to be destroyed after it. + static AfterExitCordTester exit_tester; // NOLINT + ABSL_CONST_INIT static absl::Cord cord(Str{}); // NOLINT + static bool init_exit_tester = exit_tester.Set(&cord, expected); + (void)init_exit_tester; + + EXPECT_EQ(cord, expected); + // Copy the object and test the copy, and the original. + { + absl::Cord copy = cord; + EXPECT_EQ(copy, expected); + } + // The original still works + EXPECT_EQ(cord, expected); + + // Try making adding more structure to the tree. + { + absl::Cord copy = cord; + std::string expected_copy(expected); + for (int i = 0; i < 10; ++i) { + copy.Append(cord); + absl::StrAppend(&expected_copy, expected); + EXPECT_EQ(copy, expected_copy); + } + } + + // Make sure we are using the right branch during constant evaluation. + EXPECT_EQ(absl::CordTestPeer::IsTree(cord), cord.size() >= 16); + + for (int i = 0; i < 10; ++i) { + // Make a few more Cords from the same global rep. + // This tests what happens when the refcount for it gets below 1. + EXPECT_EQ(expected, absl::Cord(Str{})); + } +} + +constexpr int SimpleStrlen(const char* p) { + return *p ? 1 + SimpleStrlen(p + 1) : 0; +} + +struct ShortView { + constexpr absl::string_view operator()() const { + return absl::string_view("SSO string", SimpleStrlen("SSO string")); + } +}; + +struct LongView { + constexpr absl::string_view operator()() const { + return absl::string_view("String that does not fit SSO.", + SimpleStrlen("String that does not fit SSO.")); + } +}; + + +TEST(Cord, ConstinitConstructor) { + TestConstinitConstructor( + absl::strings_internal::MakeStringConstant(ShortView{})); + TestConstinitConstructor( + absl::strings_internal::MakeStringConstant(LongView{})); +} diff --git a/third_party/abseil_cpp/absl/strings/escaping.cc b/third_party/abseil_cpp/absl/strings/escaping.cc index 9fceeef0b..18b20b83f 100644 --- a/third_party/abseil_cpp/absl/strings/escaping.cc +++ b/third_party/abseil_cpp/absl/strings/escaping.cc @@ -137,7 +137,7 @@ bool CUnescapeInternal(absl::string_view source, bool leave_nulls_escaped, // Copy the escape sequence for the null character const ptrdiff_t octal_size = p + 1 - octal_start; *d++ = '\\'; - memcpy(d, octal_start, octal_size); + memmove(d, octal_start, octal_size); d += octal_size; break; } @@ -170,7 +170,7 @@ bool CUnescapeInternal(absl::string_view source, bool leave_nulls_escaped, // Copy the escape sequence for the null character const ptrdiff_t hex_size = p + 1 - hex_start; *d++ = '\\'; - memcpy(d, hex_start, hex_size); + memmove(d, hex_start, hex_size); d += hex_size; break; } @@ -203,7 +203,7 @@ bool CUnescapeInternal(absl::string_view source, bool leave_nulls_escaped, if ((rune == 0) && leave_nulls_escaped) { // Copy the escape sequence for the null character *d++ = '\\'; - memcpy(d, hex_start, 5); // u0000 + memmove(d, hex_start, 5); // u0000 d += 5; break; } @@ -251,7 +251,7 @@ bool CUnescapeInternal(absl::string_view source, bool leave_nulls_escaped, if ((rune == 0) && leave_nulls_escaped) { // Copy the escape sequence for the null character *d++ = '\\'; - memcpy(d, hex_start, 9); // U00000000 + memmove(d, hex_start, 9); // U00000000 d += 9; break; } diff --git a/third_party/abseil_cpp/absl/strings/internal/charconv_bigint_test.cc b/third_party/abseil_cpp/absl/strings/internal/charconv_bigint_test.cc index 363bcb03d..a8b994582 100644 --- a/third_party/abseil_cpp/absl/strings/internal/charconv_bigint_test.cc +++ b/third_party/abseil_cpp/absl/strings/internal/charconv_bigint_test.cc @@ -69,6 +69,61 @@ TEST(BigUnsigned, ShiftLeft) { // And we should have fully rotated all bits off by now: EXPECT_EQ(a, BigUnsigned<84>(0u)); } + { + // Bit shifting large and small numbers by large and small offsets. + // Intended to exercise bounds-checking corner on ShiftLeft() (directly + // and under asan). + + // 2**(32*84)-1 + const BigUnsigned<84> all_bits_one( + "1474444211396924248063325089479706787923460402125687709454567433186613" + "6228083464060749874845919674257665016359189106695900028098437021384227" + "3285029708032466536084583113729486015826557532750465299832071590813090" + "2011853039837649252477307070509704043541368002938784757296893793903797" + "8180292336310543540677175225040919704702800559606097685920595947397024" + "8303316808753252115729411497720357971050627997031988036134171378490368" + "6008000778741115399296162550786288457245180872759047016734959330367829" + "5235612397427686310674725251378116268607113017720538636924549612987647" + "5767411074510311386444547332882472126067840027882117834454260409440463" + "9345147252664893456053258463203120637089916304618696601333953616715125" + "2115882482473279040772264257431663818610405673876655957323083702713344" + "4201105427930770976052393421467136557055"); + const BigUnsigned<84> zero(0u); + const BigUnsigned<84> one(1u); + // in bounds shifts + for (int i = 1; i < 84*32; ++i) { + // shifting all_bits_one to the left should result in a smaller number, + // since the high bits rotate off and the low bits are replaced with + // zeroes. + BigUnsigned<84> big_shifted = all_bits_one; + big_shifted.ShiftLeft(i); + EXPECT_GT(all_bits_one, big_shifted); + // Shifting 1 to the left should instead result in a larger number. + BigUnsigned<84> small_shifted = one; + small_shifted.ShiftLeft(i); + EXPECT_LT(one, small_shifted); + } + // Shifting by zero or a negative number has no effect + for (int no_op_shift : {0, -1, -84 * 32, std::numeric_limits::min()}) { + BigUnsigned<84> big_shifted = all_bits_one; + big_shifted.ShiftLeft(no_op_shift); + EXPECT_EQ(all_bits_one, big_shifted); + BigUnsigned<84> small_shifted = one; + big_shifted.ShiftLeft(no_op_shift); + EXPECT_EQ(one, small_shifted); + } + // Shifting by an amount greater than the number of bits should result in + // zero. + for (int out_of_bounds_shift : + {84 * 32, 84 * 32 + 1, std::numeric_limits::max()}) { + BigUnsigned<84> big_shifted = all_bits_one; + big_shifted.ShiftLeft(out_of_bounds_shift); + EXPECT_EQ(zero, big_shifted); + BigUnsigned<84> small_shifted = one; + small_shifted.ShiftLeft(out_of_bounds_shift); + EXPECT_EQ(zero, small_shifted); + } + } } TEST(BigUnsigned, MultiplyByUint32) { diff --git a/third_party/abseil_cpp/absl/strings/internal/charconv_parse.cc b/third_party/abseil_cpp/absl/strings/internal/charconv_parse.cc index fd6d9480f..8b11868c8 100644 --- a/third_party/abseil_cpp/absl/strings/internal/charconv_parse.cc +++ b/third_party/abseil_cpp/absl/strings/internal/charconv_parse.cc @@ -246,8 +246,8 @@ constexpr int DigitMagnitude<16>() { // ConsumeDigits does not protect against overflow on *out; max_digits must // be chosen with respect to type T to avoid the possibility of overflow. template -std::size_t ConsumeDigits(const char* begin, const char* end, int max_digits, - T* out, bool* dropped_nonzero_digit) { +int ConsumeDigits(const char* begin, const char* end, int max_digits, T* out, + bool* dropped_nonzero_digit) { if (base == 10) { assert(max_digits <= std::numeric_limits::digits10); } else if (base == 16) { @@ -282,7 +282,7 @@ std::size_t ConsumeDigits(const char* begin, const char* end, int max_digits, *dropped_nonzero_digit = true; } *out = accumulator; - return begin - original_begin; + return static_cast(begin - original_begin); } // Returns true if `v` is one of the chars allowed inside parentheses following @@ -372,7 +372,7 @@ strings_internal::ParsedFloat ParseFloat(const char* begin, const char* end, int exponent_adjustment = 0; bool mantissa_is_inexact = false; - std::size_t pre_decimal_digits = ConsumeDigits( + int pre_decimal_digits = ConsumeDigits( begin, end, MantissaDigitsMax(), &mantissa, &mantissa_is_inexact); begin += pre_decimal_digits; int digits_left; @@ -398,14 +398,14 @@ strings_internal::ParsedFloat ParseFloat(const char* begin, const char* end, while (begin < end && *begin == '0') { ++begin; } - std::size_t zeros_skipped = begin - begin_zeros; + int zeros_skipped = static_cast(begin - begin_zeros); if (zeros_skipped >= DigitLimit()) { // refuse to parse pathological inputs return result; } exponent_adjustment -= static_cast(zeros_skipped); } - std::size_t post_decimal_digits = ConsumeDigits( + int post_decimal_digits = ConsumeDigits( begin, end, digits_left, &mantissa, &mantissa_is_inexact); begin += post_decimal_digits; diff --git a/third_party/abseil_cpp/absl/strings/internal/cord_internal.h b/third_party/abseil_cpp/absl/strings/internal/cord_internal.h index 830ceaf47..aa91a691b 100644 --- a/third_party/abseil_cpp/absl/strings/internal/cord_internal.h +++ b/third_party/abseil_cpp/absl/strings/internal/cord_internal.h @@ -21,6 +21,8 @@ #include #include +#include "absl/base/internal/invoke.h" +#include "absl/container/internal/compressed_tuple.h" #include "absl/meta/type_traits.h" #include "absl/strings/string_view.h" @@ -31,14 +33,17 @@ namespace cord_internal { // Wraps std::atomic for reference counting. class Refcount { public: - Refcount() : count_{1} {} - ~Refcount() {} + constexpr Refcount() : count_{kRefIncrement} {} + struct Immortal {}; + explicit constexpr Refcount(Immortal) : count_(kImmortalTag) {} - // Increments the reference count by 1. Imposes no memory ordering. - inline void Increment() { count_.fetch_add(1, std::memory_order_relaxed); } + // Increments the reference count. Imposes no memory ordering. + inline void Increment() { + count_.fetch_add(kRefIncrement, std::memory_order_relaxed); + } // Asserts that the current refcount is greater than 0. If the refcount is - // greater than 1, decrements the reference count by 1. + // greater than 1, decrements the reference count. // // Returns false if there are no references outstanding; true otherwise. // Inserts barriers to ensure that state written before this method returns @@ -46,19 +51,24 @@ class Refcount { // false. inline bool Decrement() { int32_t refcount = count_.load(std::memory_order_acquire); - assert(refcount > 0); - return refcount != 1 && count_.fetch_sub(1, std::memory_order_acq_rel) != 1; + assert(refcount > 0 || refcount & kImmortalTag); + return refcount != kRefIncrement && + count_.fetch_sub(kRefIncrement, std::memory_order_acq_rel) != + kRefIncrement; } // Same as Decrement but expect that refcount is greater than 1. inline bool DecrementExpectHighRefcount() { - int32_t refcount = count_.fetch_sub(1, std::memory_order_acq_rel); - assert(refcount > 0); - return refcount != 1; + int32_t refcount = + count_.fetch_sub(kRefIncrement, std::memory_order_acq_rel); + assert(refcount > 0 || refcount & kImmortalTag); + return refcount != kRefIncrement; } // Returns the current reference count using acquire semantics. - inline int32_t Get() const { return count_.load(std::memory_order_acquire); } + inline int32_t Get() const { + return count_.load(std::memory_order_acquire) >> kImmortalShift; + } // Returns whether the atomic integer is 1. // If the reference count is used in the conventional way, a @@ -68,9 +78,27 @@ class Refcount { // performs the memory barrier needed for the owning thread // to act on the object, knowing that it has exclusive access to the // object. - inline bool IsOne() { return count_.load(std::memory_order_acquire) == 1; } + inline bool IsOne() { + return count_.load(std::memory_order_acquire) == kRefIncrement; + } + + bool IsImmortal() const { + return (count_.load(std::memory_order_relaxed) & kImmortalTag) != 0; + } private: + // We reserve the bottom bit to tag a reference count as immortal. + // By making it `1` we ensure that we never reach `0` when adding/subtracting + // `2`, thus it never looks as if it should be destroyed. + // These are used for the StringConstant constructor where we do not increase + // the refcount at construction time (due to constinit requirements) but we + // will still decrease it at destruction time to avoid branching on Unref. + enum { + kImmortalShift = 1, + kRefIncrement = 1 << kImmortalShift, + kImmortalTag = kRefIncrement - 1 + }; + std::atomic count_; }; @@ -83,7 +111,22 @@ struct CordRepConcat; struct CordRepSubstring; struct CordRepExternal; +// Various representations that we allow +enum CordRepKind { + CONCAT = 0, + EXTERNAL = 1, + SUBSTRING = 2, + + // We have different tags for different sized flat arrays, + // starting with FLAT + FLAT = 3, +}; + struct CordRep { + CordRep() = default; + constexpr CordRep(Refcount::Immortal immortal, size_t l) + : length(l), refcount(immortal), tag(EXTERNAL), data{} {} + // The following three fields have to be less than 32 bytes since // that is the smallest supported flat node size. size_t length; @@ -114,35 +157,112 @@ struct CordRepSubstring : public CordRep { CordRep* child; }; -// TODO(strel): replace the following logic (and related functions in cord.cc) -// with container_internal::Layout. - -// Alignment requirement for CordRepExternal so that the type erased releaser -// will be stored at a suitably aligned address. -constexpr size_t ExternalRepAlignment() { -#if defined(__STDCPP_DEFAULT_NEW_ALIGNMENT__) - return __STDCPP_DEFAULT_NEW_ALIGNMENT__; -#else - return alignof(max_align_t); -#endif -} - -// Type for function pointer that will invoke and destroy the type-erased -// releaser function object. Accepts a pointer to the releaser and the -// `string_view` that were passed in to `NewExternalRep` below. The return value -// is the size of the `Releaser` type. -using ExternalReleaserInvoker = size_t (*)(void*, absl::string_view); +// Type for function pointer that will invoke the releaser function and also +// delete the `CordRepExternalImpl` corresponding to the passed in +// `CordRepExternal`. +using ExternalReleaserInvoker = void (*)(CordRepExternal*); // External CordReps are allocated together with a type erased releaser. The // releaser is stored in the memory directly following the CordRepExternal. -struct alignas(ExternalRepAlignment()) CordRepExternal : public CordRep { +struct CordRepExternal : public CordRep { + CordRepExternal() = default; + explicit constexpr CordRepExternal(absl::string_view str) + : CordRep(Refcount::Immortal{}, str.size()), + base(str.data()), + releaser_invoker(nullptr) {} + const char* base; // Pointer to function that knows how to call and destroy the releaser. ExternalReleaserInvoker releaser_invoker; }; -// TODO(strel): look into removing, it doesn't seem like anything relies on this -static_assert(sizeof(CordRepConcat) == sizeof(CordRepSubstring), ""); +struct Rank1 {}; +struct Rank0 : Rank1 {}; + +template > +void InvokeReleaser(Rank0, Releaser&& releaser, absl::string_view data) { + ::absl::base_internal::invoke(std::forward(releaser), data); +} + +template > +void InvokeReleaser(Rank1, Releaser&& releaser, absl::string_view) { + ::absl::base_internal::invoke(std::forward(releaser)); +} + +// We use CompressedTuple so that we can benefit from EBCO. +template +struct CordRepExternalImpl + : public CordRepExternal, + public ::absl::container_internal::CompressedTuple { + // The extra int arg is so that we can avoid interfering with copy/move + // constructors while still benefitting from perfect forwarding. + template + CordRepExternalImpl(T&& releaser, int) + : CordRepExternalImpl::CompressedTuple(std::forward(releaser)) { + this->releaser_invoker = &Release; + } + + ~CordRepExternalImpl() { + InvokeReleaser(Rank0{}, std::move(this->template get<0>()), + absl::string_view(base, length)); + } + + static void Release(CordRepExternal* rep) { + delete static_cast(rep); + } +}; + +template +struct ConstInitExternalStorage { + ABSL_CONST_INIT static CordRepExternal value; +}; + +template +CordRepExternal ConstInitExternalStorage::value(Str::value); + +enum { + kMaxInline = 15, + // Tag byte & kMaxInline means we are storing a pointer. + kTreeFlag = 1 << 4, + // Tag byte & kProfiledFlag means we are profiling the Cord. + kProfiledFlag = 1 << 5 +}; + +// If the data has length <= kMaxInline, we store it in `as_chars`, and +// store the size in `tagged_size`. +// Else we store it in a tree and store a pointer to that tree in +// `as_tree.rep` and store a tag in `tagged_size`. +struct AsTree { + absl::cord_internal::CordRep* rep; + char padding[kMaxInline + 1 - sizeof(absl::cord_internal::CordRep*) - 1]; + char tagged_size; +}; + +constexpr char GetOrNull(absl::string_view data, size_t pos) { + return pos < data.size() ? data[pos] : '\0'; +} + +union InlineData { + constexpr InlineData() : as_chars{} {} + explicit constexpr InlineData(AsTree tree) : as_tree(tree) {} + explicit constexpr InlineData(absl::string_view chars) + : as_chars{GetOrNull(chars, 0), GetOrNull(chars, 1), + GetOrNull(chars, 2), GetOrNull(chars, 3), + GetOrNull(chars, 4), GetOrNull(chars, 5), + GetOrNull(chars, 6), GetOrNull(chars, 7), + GetOrNull(chars, 8), GetOrNull(chars, 9), + GetOrNull(chars, 10), GetOrNull(chars, 11), + GetOrNull(chars, 12), GetOrNull(chars, 13), + GetOrNull(chars, 14), static_cast(chars.size())} {} + + AsTree as_tree; + char as_chars[kMaxInline + 1]; +}; +static_assert(sizeof(InlineData) == kMaxInline + 1, ""); +static_assert(sizeof(AsTree) == sizeof(InlineData), ""); +static_assert(offsetof(AsTree, tagged_size) == kMaxInline, ""); } // namespace cord_internal ABSL_NAMESPACE_END diff --git a/third_party/abseil_cpp/absl/strings/internal/str_format/arg.cc b/third_party/abseil_cpp/absl/strings/internal/str_format/arg.cc index 9feb22487..e28a29b17 100644 --- a/third_party/abseil_cpp/absl/strings/internal/str_format/arg.cc +++ b/third_party/abseil_cpp/absl/strings/internal/str_format/arg.cc @@ -1,3 +1,17 @@ +// Copyright 2020 The Abseil 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 +// +// https://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. + // // POSIX spec: // http://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html diff --git a/third_party/abseil_cpp/absl/strings/internal/str_format/arg.h b/third_party/abseil_cpp/absl/strings/internal/str_format/arg.h index d441e87ff..7040c8667 100644 --- a/third_party/abseil_cpp/absl/strings/internal/str_format/arg.h +++ b/third_party/abseil_cpp/absl/strings/internal/str_format/arg.h @@ -1,3 +1,17 @@ +// Copyright 2020 The Abseil 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 +// +// https://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 ABSL_STRINGS_INTERNAL_STR_FORMAT_ARG_H_ #define ABSL_STRINGS_INTERNAL_STR_FORMAT_ARG_H_ @@ -25,10 +39,12 @@ class Cord; class FormatCountCapture; class FormatSink; -namespace str_format_internal { - +template +struct FormatConvertResult; class FormatConversionSpec; +namespace str_format_internal { + template struct HasUserDefinedConvert : std::false_type {}; @@ -39,6 +55,22 @@ struct HasUserDefinedConvert()))>> : std::true_type {}; +void AbslFormatConvert(); // Stops the lexical name lookup +template +auto FormatConvertImpl(const T& v, FormatConversionSpecImpl conv, + FormatSinkImpl* sink) + -> decltype(AbslFormatConvert(v, + std::declval(), + std::declval())) { + using FormatConversionSpecT = + absl::enable_if_t; + using FormatSinkT = + absl::enable_if_t; + auto fcs = conv.Wrap(); + auto fs = sink->Wrap(); + return AbslFormatConvert(v, fcs, &fs); +} + template class StreamedWrapper; @@ -46,6 +78,13 @@ class StreamedWrapper; // then convert it, appending to `sink` and return `true`. // Otherwise fail and return `false`. +// AbslFormatConvert(v, conv, sink) is intended to be found by ADL on 'v' +// as an extension mechanism. These FormatConvertImpl functions are the default +// implementations. +// The ADL search is augmented via the 'Sink*' parameter, which also +// serves as a disambiguator to reject possible unintended 'AbslFormatConvert' +// functions in the namespaces associated with 'v'. + // Raw pointers. struct VoidPtr { VoidPtr() = default; @@ -61,6 +100,11 @@ struct ArgConvertResult { bool value; }; +template +constexpr FormatConversionCharSet ExtractCharSet(FormatConvertResult) { + return C; +} + template constexpr FormatConversionCharSet ExtractCharSet(ArgConvertResult) { return C; diff --git a/third_party/abseil_cpp/absl/strings/internal/str_format/arg_test.cc b/third_party/abseil_cpp/absl/strings/internal/str_format/arg_test.cc index bf3d7e8e3..1261937c3 100644 --- a/third_party/abseil_cpp/absl/strings/internal/str_format/arg_test.cc +++ b/third_party/abseil_cpp/absl/strings/internal/str_format/arg_test.cc @@ -6,6 +6,12 @@ // // https://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 "absl/strings/internal/str_format/arg.h" #include @@ -23,8 +29,17 @@ class FormatArgImplTest : public ::testing::Test { enum Color { kRed, kGreen, kBlue }; static const char *hi() { return "hi"; } + + struct X {}; + + X x_; }; +inline FormatConvertResult AbslFormatConvert( + const FormatArgImplTest::X &, const FormatConversionSpec &, FormatSink *) { + return {false}; +} + TEST_F(FormatArgImplTest, ToInt) { int out = 0; EXPECT_TRUE(FormatArgImplFriend::ToInt(FormatArgImpl(1), &out)); @@ -59,6 +74,7 @@ TEST_F(FormatArgImplTest, ToInt) { FormatArgImpl(static_cast(nullptr)), &out)); EXPECT_FALSE(FormatArgImplFriend::ToInt(FormatArgImpl(hi()), &out)); EXPECT_FALSE(FormatArgImplFriend::ToInt(FormatArgImpl("hi"), &out)); + EXPECT_FALSE(FormatArgImplFriend::ToInt(FormatArgImpl(x_), &out)); EXPECT_TRUE(FormatArgImplFriend::ToInt(FormatArgImpl(kBlue), &out)); EXPECT_EQ(2, out); } diff --git a/third_party/abseil_cpp/absl/strings/internal/str_format/bind.cc b/third_party/abseil_cpp/absl/strings/internal/str_format/bind.cc index 6980ed1d8..4e68b90b5 100644 --- a/third_party/abseil_cpp/absl/strings/internal/str_format/bind.cc +++ b/third_party/abseil_cpp/absl/strings/internal/str_format/bind.cc @@ -1,3 +1,17 @@ +// Copyright 2020 The Abseil 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 +// +// https://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 "absl/strings/internal/str_format/bind.h" #include @@ -221,7 +235,7 @@ int FprintF(std::FILE* output, const UntypedFormatSpecImpl format, errno = sink.error(); return -1; } - if (sink.count() > std::numeric_limits::max()) { + if (sink.count() > static_cast(std::numeric_limits::max())) { errno = EFBIG; return -1; } diff --git a/third_party/abseil_cpp/absl/strings/internal/str_format/bind.h b/third_party/abseil_cpp/absl/strings/internal/str_format/bind.h index 585246e77..267cc0ef6 100644 --- a/third_party/abseil_cpp/absl/strings/internal/str_format/bind.h +++ b/third_party/abseil_cpp/absl/strings/internal/str_format/bind.h @@ -1,3 +1,17 @@ +// Copyright 2020 The Abseil 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 +// +// https://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 ABSL_STRINGS_INTERNAL_STR_FORMAT_BIND_H_ #define ABSL_STRINGS_INTERNAL_STR_FORMAT_BIND_H_ @@ -119,10 +133,11 @@ class FormatSpecTemplate #endif // ABSL_INTERNAL_ENABLE_FORMAT_CHECKER - template ::type> + template < + FormatConversionCharSet... C, + typename = typename std::enable_if::type, + typename = typename std::enable_if::type> FormatSpecTemplate(const ExtendedParsedFormat& pc) // NOLINT : Base(&pc) {} }; diff --git a/third_party/abseil_cpp/absl/strings/internal/str_format/bind_test.cc b/third_party/abseil_cpp/absl/strings/internal/str_format/bind_test.cc index 64790a85f..1eef9c432 100644 --- a/third_party/abseil_cpp/absl/strings/internal/str_format/bind_test.cc +++ b/third_party/abseil_cpp/absl/strings/internal/str_format/bind_test.cc @@ -1,3 +1,17 @@ +// Copyright 2020 The Abseil 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 +// +// https://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 "absl/strings/internal/str_format/bind.h" #include diff --git a/third_party/abseil_cpp/absl/strings/internal/str_format/checker.h b/third_party/abseil_cpp/absl/strings/internal/str_format/checker.h index 424c51f74..2a2601ecc 100644 --- a/third_party/abseil_cpp/absl/strings/internal/str_format/checker.h +++ b/third_party/abseil_cpp/absl/strings/internal/str_format/checker.h @@ -1,3 +1,17 @@ +// Copyright 2020 The Abseil 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 +// +// https://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 ABSL_STRINGS_INTERNAL_STR_FORMAT_CHECKER_H_ #define ABSL_STRINGS_INTERNAL_STR_FORMAT_CHECKER_H_ diff --git a/third_party/abseil_cpp/absl/strings/internal/str_format/checker_test.cc b/third_party/abseil_cpp/absl/strings/internal/str_format/checker_test.cc index a76d70b05..7c70f47d6 100644 --- a/third_party/abseil_cpp/absl/strings/internal/str_format/checker_test.cc +++ b/third_party/abseil_cpp/absl/strings/internal/str_format/checker_test.cc @@ -1,3 +1,17 @@ +// Copyright 2020 The Abseil 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 +// +// https://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 #include "gmock/gmock.h" diff --git a/third_party/abseil_cpp/absl/strings/internal/str_format/convert_test.cc b/third_party/abseil_cpp/absl/strings/internal/str_format/convert_test.cc index 0e8535c27..375db0a05 100644 --- a/third_party/abseil_cpp/absl/strings/internal/str_format/convert_test.cc +++ b/third_party/abseil_cpp/absl/strings/internal/str_format/convert_test.cc @@ -1,3 +1,17 @@ +// Copyright 2020 The Abseil 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 +// +// https://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 #include #include @@ -12,6 +26,7 @@ #include "gtest/gtest.h" #include "absl/base/internal/raw_logging.h" #include "absl/strings/internal/str_format/bind.h" +#include "absl/strings/match.h" #include "absl/types/optional.h" namespace absl { @@ -19,6 +34,13 @@ ABSL_NAMESPACE_BEGIN namespace str_format_internal { namespace { +struct NativePrintfTraits { + bool hex_float_has_glibc_rounding; + bool hex_float_prefers_denormal_repr; + bool hex_float_uses_minimal_precision_when_not_specified; + bool hex_float_optimizes_leading_digit_bit_count; +}; + template size_t ArraySize(T (&)[N]) { return N; @@ -118,6 +140,63 @@ std::string StrPrint(const char *format, ...) { return result; } +NativePrintfTraits VerifyNativeImplementationImpl() { + NativePrintfTraits result; + + // >>> hex_float_has_glibc_rounding. To have glibc's rounding behavior we need + // to meet three requirements: + // + // - The threshold for rounding up is 8 (for e.g. MSVC uses 9). + // - If the digits lower than than the 8 are non-zero then we round up. + // - If the digits lower than the 8 are all zero then we round toward even. + // + // The numbers below represent all the cases covering {below,at,above} the + // threshold (8) with both {zero,non-zero} lower bits and both {even,odd} + // preceding digits. + const double d0079 = 65657.0; // 0x1.0079p+16 + const double d0179 = 65913.0; // 0x1.0179p+16 + const double d0080 = 65664.0; // 0x1.0080p+16 + const double d0180 = 65920.0; // 0x1.0180p+16 + const double d0081 = 65665.0; // 0x1.0081p+16 + const double d0181 = 65921.0; // 0x1.0181p+16 + result.hex_float_has_glibc_rounding = + StartsWith(StrPrint("%.2a", d0079), "0x1.00") && + StartsWith(StrPrint("%.2a", d0179), "0x1.01") && + StartsWith(StrPrint("%.2a", d0080), "0x1.00") && + StartsWith(StrPrint("%.2a", d0180), "0x1.02") && + StartsWith(StrPrint("%.2a", d0081), "0x1.01") && + StartsWith(StrPrint("%.2a", d0181), "0x1.02"); + + // >>> hex_float_prefers_denormal_repr. Formatting `denormal` on glibc yields + // "0x0.0000000000001p-1022", whereas on std libs that don't use denormal + // representation it would either be 0x1p-1074 or 0x1.0000000000000-1074. + const double denormal = std::numeric_limits::denorm_min(); + result.hex_float_prefers_denormal_repr = + StartsWith(StrPrint("%a", denormal), "0x0.0000000000001"); + + // >>> hex_float_uses_minimal_precision_when_not_specified. Some (non-glibc) + // libs will format the following as "0x1.0079000000000p+16". + result.hex_float_uses_minimal_precision_when_not_specified = + (StrPrint("%a", d0079) == "0x1.0079p+16"); + + // >>> hex_float_optimizes_leading_digit_bit_count. The number 1.5, when + // formatted by glibc should yield "0x1.8p+0" for `double` and "0xcp-3" for + // `long double`, i.e., number of bits in the leading digit is adapted to the + // number of bits in the mantissa. + const double d_15 = 1.5; + const long double ld_15 = 1.5; + result.hex_float_optimizes_leading_digit_bit_count = + StartsWith(StrPrint("%a", d_15), "0x1.8") && + StartsWith(StrPrint("%La", ld_15), "0xc"); + + return result; +} + +const NativePrintfTraits &VerifyNativeImplementation() { + static NativePrintfTraits native_traits = VerifyNativeImplementationImpl(); + return native_traits; +} + class FormatConvertTest : public ::testing::Test { }; template @@ -474,6 +553,68 @@ TEST_F(FormatConvertTest, Uint128) { } } +template +void TestWithMultipleFormatsHelper(const std::vector &floats) { + const NativePrintfTraits &native_traits = VerifyNativeImplementation(); + // Reserve the space to ensure we don't allocate memory in the output itself. + std::string str_format_result; + str_format_result.reserve(1 << 20); + std::string string_printf_result; + string_printf_result.reserve(1 << 20); + + const char *const kFormats[] = { + "%", "%.3", "%8.5", "%500", "%.5000", "%.60", "%.30", "%03", + "%+", "% ", "%-10", "%#15.3", "%#.0", "%.0", "%1$*2$", "%1$.*2$"}; + + for (const char *fmt : kFormats) { + for (char f : {'f', 'F', // + 'g', 'G', // + 'a', 'A', // + 'e', 'E'}) { + std::string fmt_str = std::string(fmt) + f; + + if (fmt == absl::string_view("%.5000") && f != 'f' && f != 'F' && + f != 'a' && f != 'A') { + // This particular test takes way too long with snprintf. + // Disable for the case we are not implementing natively. + continue; + } + + if ((f == 'a' || f == 'A') && + !native_traits.hex_float_has_glibc_rounding) { + continue; + } + + for (Floating d : floats) { + if (!native_traits.hex_float_prefers_denormal_repr && + (f == 'a' || f == 'A') && std::fpclassify(d) == FP_SUBNORMAL) { + continue; + } + int i = -10; + FormatArgImpl args[2] = {FormatArgImpl(d), FormatArgImpl(i)}; + UntypedFormatSpecImpl format(fmt_str); + + string_printf_result.clear(); + StrAppend(&string_printf_result, fmt_str.c_str(), d, i); + str_format_result.clear(); + + { + AppendPack(&str_format_result, format, absl::MakeSpan(args)); + } + + if (string_printf_result != str_format_result) { + // We use ASSERT_EQ here because failures are usually correlated and a + // bug would print way too many failed expectations causing the test + // to time out. + ASSERT_EQ(string_printf_result, str_format_result) + << fmt_str << " " << StrPrint("%.18g", d) << " " + << StrPrint("%a", d) << " " << StrPrint("%.50f", d); + } + } + } + } +} + TEST_F(FormatConvertTest, Float) { #ifdef _MSC_VER // MSVC has a different rounding policy than us so we can't test our @@ -481,9 +622,62 @@ TEST_F(FormatConvertTest, Float) { return; #endif // _MSC_VER - const char *const kFormats[] = { - "%", "%.3", "%8.5", "%500", "%.5000", "%.60", "%.30", "%03", - "%+", "% ", "%-10", "%#15.3", "%#.0", "%.0", "%1$*2$", "%1$.*2$"}; + std::vector floats = {0.0f, + -0.0f, + .9999999f, + 9999999.f, + std::numeric_limits::max(), + -std::numeric_limits::max(), + std::numeric_limits::min(), + -std::numeric_limits::min(), + std::numeric_limits::lowest(), + -std::numeric_limits::lowest(), + std::numeric_limits::epsilon(), + std::numeric_limits::epsilon() + 1.0f, + std::numeric_limits::infinity(), + -std::numeric_limits::infinity()}; + + // Some regression tests. + floats.push_back(0.999999989f); + + if (std::numeric_limits::has_denorm != std::denorm_absent) { + floats.push_back(std::numeric_limits::denorm_min()); + floats.push_back(-std::numeric_limits::denorm_min()); + } + + for (float base : + {1.f, 12.f, 123.f, 1234.f, 12345.f, 123456.f, 1234567.f, 12345678.f, + 123456789.f, 1234567890.f, 12345678901.f, 12345678.f, 12345678.f}) { + for (int exp = -123; exp <= 123; ++exp) { + for (int sign : {1, -1}) { + floats.push_back(sign * std::ldexp(base, exp)); + } + } + } + + for (int exp = -300; exp <= 300; ++exp) { + const float all_ones_mantissa = 0xffffff; + floats.push_back(std::ldexp(all_ones_mantissa, exp)); + } + + // Remove duplicates to speed up the logic below. + std::sort(floats.begin(), floats.end()); + floats.erase(std::unique(floats.begin(), floats.end()), floats.end()); + +#ifndef __APPLE__ + // Apple formats NaN differently (+nan) vs. (nan) + floats.push_back(std::nan("")); +#endif + + TestWithMultipleFormatsHelper(floats); +} + +TEST_F(FormatConvertTest, Double) { +#ifdef _MSC_VER + // MSVC has a different rounding policy than us so we can't test our + // implementation against the native one there. + return; +#endif // _MSC_VER std::vector doubles = {0.0, -0.0, @@ -554,52 +748,10 @@ TEST_F(FormatConvertTest, Float) { doubles.push_back(std::nan("")); #endif - // Reserve the space to ensure we don't allocate memory in the output itself. - std::string str_format_result; - str_format_result.reserve(1 << 20); - std::string string_printf_result; - string_printf_result.reserve(1 << 20); - - for (const char *fmt : kFormats) { - for (char f : {'f', 'F', // - 'g', 'G', // - 'a', 'A', // - 'e', 'E'}) { - std::string fmt_str = std::string(fmt) + f; - - if (fmt == absl::string_view("%.5000") && f != 'f' && f != 'F') { - // This particular test takes way too long with snprintf. - // Disable for the case we are not implementing natively. - continue; - } - - for (double d : doubles) { - int i = -10; - FormatArgImpl args[2] = {FormatArgImpl(d), FormatArgImpl(i)}; - UntypedFormatSpecImpl format(fmt_str); - - string_printf_result.clear(); - StrAppend(&string_printf_result, fmt_str.c_str(), d, i); - str_format_result.clear(); - - { - AppendPack(&str_format_result, format, absl::MakeSpan(args)); - } - - if (string_printf_result != str_format_result) { - // We use ASSERT_EQ here because failures are usually correlated and a - // bug would print way too many failed expectations causing the test - // to time out. - ASSERT_EQ(string_printf_result, str_format_result) - << fmt_str << " " << StrPrint("%.18g", d) << " " - << StrPrint("%a", d) << " " << StrPrint("%.1080f", d); - } - } - } - } + TestWithMultipleFormatsHelper(doubles); } -TEST_F(FormatConvertTest, FloatRound) { +TEST_F(FormatConvertTest, DoubleRound) { std::string s; const auto format = [&](const char *fmt, double d) -> std::string & { s.clear(); @@ -704,6 +856,193 @@ TEST_F(FormatConvertTest, FloatRound) { "1837869002408041296803276054561138153076171875"); } +TEST_F(FormatConvertTest, DoubleRoundA) { + const NativePrintfTraits &native_traits = VerifyNativeImplementation(); + std::string s; + const auto format = [&](const char *fmt, double d) -> std::string & { + s.clear(); + FormatArgImpl args[1] = {FormatArgImpl(d)}; + AppendPack(&s, UntypedFormatSpecImpl(fmt), absl::MakeSpan(args)); + if (native_traits.hex_float_has_glibc_rounding) { + EXPECT_EQ(StrPrint(fmt, d), s); + } + return s; + }; + + // 0x1.00018000p+100 + const double on_boundary_odd = 1267679614447900152596896153600.0; + EXPECT_EQ(format("%.0a", on_boundary_odd), "0x1p+100"); + EXPECT_EQ(format("%.1a", on_boundary_odd), "0x1.0p+100"); + EXPECT_EQ(format("%.2a", on_boundary_odd), "0x1.00p+100"); + EXPECT_EQ(format("%.3a", on_boundary_odd), "0x1.000p+100"); + EXPECT_EQ(format("%.4a", on_boundary_odd), "0x1.0002p+100"); // round + EXPECT_EQ(format("%.5a", on_boundary_odd), "0x1.00018p+100"); + EXPECT_EQ(format("%.6a", on_boundary_odd), "0x1.000180p+100"); + + // 0x1.00028000p-2 + const double on_boundary_even = 0.250009536743164062500; + EXPECT_EQ(format("%.0a", on_boundary_even), "0x1p-2"); + EXPECT_EQ(format("%.1a", on_boundary_even), "0x1.0p-2"); + EXPECT_EQ(format("%.2a", on_boundary_even), "0x1.00p-2"); + EXPECT_EQ(format("%.3a", on_boundary_even), "0x1.000p-2"); + EXPECT_EQ(format("%.4a", on_boundary_even), "0x1.0002p-2"); // no round + EXPECT_EQ(format("%.5a", on_boundary_even), "0x1.00028p-2"); + EXPECT_EQ(format("%.6a", on_boundary_even), "0x1.000280p-2"); + + // 0x1.00018001p+1 + const double slightly_over = 2.00004577683284878730773925781250; + EXPECT_EQ(format("%.0a", slightly_over), "0x1p+1"); + EXPECT_EQ(format("%.1a", slightly_over), "0x1.0p+1"); + EXPECT_EQ(format("%.2a", slightly_over), "0x1.00p+1"); + EXPECT_EQ(format("%.3a", slightly_over), "0x1.000p+1"); + EXPECT_EQ(format("%.4a", slightly_over), "0x1.0002p+1"); + EXPECT_EQ(format("%.5a", slightly_over), "0x1.00018p+1"); + EXPECT_EQ(format("%.6a", slightly_over), "0x1.000180p+1"); + + // 0x1.00017fffp+0 + const double slightly_under = 1.000022887950763106346130371093750; + EXPECT_EQ(format("%.0a", slightly_under), "0x1p+0"); + EXPECT_EQ(format("%.1a", slightly_under), "0x1.0p+0"); + EXPECT_EQ(format("%.2a", slightly_under), "0x1.00p+0"); + EXPECT_EQ(format("%.3a", slightly_under), "0x1.000p+0"); + EXPECT_EQ(format("%.4a", slightly_under), "0x1.0001p+0"); + EXPECT_EQ(format("%.5a", slightly_under), "0x1.00018p+0"); + EXPECT_EQ(format("%.6a", slightly_under), "0x1.000180p+0"); + EXPECT_EQ(format("%.7a", slightly_under), "0x1.0001800p+0"); + + // 0x1.1b3829ac28058p+3 + const double hex_value = 8.85060580848964661981881363317370414733886718750; + EXPECT_EQ(format("%.0a", hex_value), "0x1p+3"); + EXPECT_EQ(format("%.1a", hex_value), "0x1.2p+3"); + EXPECT_EQ(format("%.2a", hex_value), "0x1.1bp+3"); + EXPECT_EQ(format("%.3a", hex_value), "0x1.1b4p+3"); + EXPECT_EQ(format("%.4a", hex_value), "0x1.1b38p+3"); + EXPECT_EQ(format("%.5a", hex_value), "0x1.1b383p+3"); + EXPECT_EQ(format("%.6a", hex_value), "0x1.1b382ap+3"); + EXPECT_EQ(format("%.7a", hex_value), "0x1.1b3829bp+3"); + EXPECT_EQ(format("%.8a", hex_value), "0x1.1b3829acp+3"); + EXPECT_EQ(format("%.9a", hex_value), "0x1.1b3829ac3p+3"); + EXPECT_EQ(format("%.10a", hex_value), "0x1.1b3829ac28p+3"); + EXPECT_EQ(format("%.11a", hex_value), "0x1.1b3829ac280p+3"); + EXPECT_EQ(format("%.12a", hex_value), "0x1.1b3829ac2806p+3"); + EXPECT_EQ(format("%.13a", hex_value), "0x1.1b3829ac28058p+3"); + EXPECT_EQ(format("%.14a", hex_value), "0x1.1b3829ac280580p+3"); + EXPECT_EQ(format("%.15a", hex_value), "0x1.1b3829ac2805800p+3"); + EXPECT_EQ(format("%.16a", hex_value), "0x1.1b3829ac28058000p+3"); + EXPECT_EQ(format("%.17a", hex_value), "0x1.1b3829ac280580000p+3"); + EXPECT_EQ(format("%.18a", hex_value), "0x1.1b3829ac2805800000p+3"); + EXPECT_EQ(format("%.19a", hex_value), "0x1.1b3829ac28058000000p+3"); + EXPECT_EQ(format("%.20a", hex_value), "0x1.1b3829ac280580000000p+3"); + EXPECT_EQ(format("%.21a", hex_value), "0x1.1b3829ac2805800000000p+3"); + + // 0x1.0818283848586p+3 + const double hex_value2 = 8.2529488658208371987257123691961169242858886718750; + EXPECT_EQ(format("%.0a", hex_value2), "0x1p+3"); + EXPECT_EQ(format("%.1a", hex_value2), "0x1.1p+3"); + EXPECT_EQ(format("%.2a", hex_value2), "0x1.08p+3"); + EXPECT_EQ(format("%.3a", hex_value2), "0x1.082p+3"); + EXPECT_EQ(format("%.4a", hex_value2), "0x1.0818p+3"); + EXPECT_EQ(format("%.5a", hex_value2), "0x1.08183p+3"); + EXPECT_EQ(format("%.6a", hex_value2), "0x1.081828p+3"); + EXPECT_EQ(format("%.7a", hex_value2), "0x1.0818284p+3"); + EXPECT_EQ(format("%.8a", hex_value2), "0x1.08182838p+3"); + EXPECT_EQ(format("%.9a", hex_value2), "0x1.081828385p+3"); + EXPECT_EQ(format("%.10a", hex_value2), "0x1.0818283848p+3"); + EXPECT_EQ(format("%.11a", hex_value2), "0x1.08182838486p+3"); + EXPECT_EQ(format("%.12a", hex_value2), "0x1.081828384858p+3"); + EXPECT_EQ(format("%.13a", hex_value2), "0x1.0818283848586p+3"); + EXPECT_EQ(format("%.14a", hex_value2), "0x1.08182838485860p+3"); + EXPECT_EQ(format("%.15a", hex_value2), "0x1.081828384858600p+3"); + EXPECT_EQ(format("%.16a", hex_value2), "0x1.0818283848586000p+3"); + EXPECT_EQ(format("%.17a", hex_value2), "0x1.08182838485860000p+3"); + EXPECT_EQ(format("%.18a", hex_value2), "0x1.081828384858600000p+3"); + EXPECT_EQ(format("%.19a", hex_value2), "0x1.0818283848586000000p+3"); + EXPECT_EQ(format("%.20a", hex_value2), "0x1.08182838485860000000p+3"); + EXPECT_EQ(format("%.21a", hex_value2), "0x1.081828384858600000000p+3"); +} + +TEST_F(FormatConvertTest, LongDoubleRoundA) { + if (std::numeric_limits::digits % 4 != 0) { + // This test doesn't really make sense to run on platforms where a long + // double has a different mantissa size (mod 4) than Prod, since then the + // leading digit will be formatted differently. + return; + } + const NativePrintfTraits &native_traits = VerifyNativeImplementation(); + std::string s; + const auto format = [&](const char *fmt, long double d) -> std::string & { + s.clear(); + FormatArgImpl args[1] = {FormatArgImpl(d)}; + AppendPack(&s, UntypedFormatSpecImpl(fmt), absl::MakeSpan(args)); + if (native_traits.hex_float_has_glibc_rounding && + native_traits.hex_float_optimizes_leading_digit_bit_count) { + EXPECT_EQ(StrPrint(fmt, d), s); + } + return s; + }; + + // 0x8.8p+4 + const long double on_boundary_even = 136.0; + EXPECT_EQ(format("%.0La", on_boundary_even), "0x8p+4"); + EXPECT_EQ(format("%.1La", on_boundary_even), "0x8.8p+4"); + EXPECT_EQ(format("%.2La", on_boundary_even), "0x8.80p+4"); + EXPECT_EQ(format("%.3La", on_boundary_even), "0x8.800p+4"); + EXPECT_EQ(format("%.4La", on_boundary_even), "0x8.8000p+4"); + EXPECT_EQ(format("%.5La", on_boundary_even), "0x8.80000p+4"); + EXPECT_EQ(format("%.6La", on_boundary_even), "0x8.800000p+4"); + + // 0x9.8p+4 + const long double on_boundary_odd = 152.0; + EXPECT_EQ(format("%.0La", on_boundary_odd), "0xap+4"); + EXPECT_EQ(format("%.1La", on_boundary_odd), "0x9.8p+4"); + EXPECT_EQ(format("%.2La", on_boundary_odd), "0x9.80p+4"); + EXPECT_EQ(format("%.3La", on_boundary_odd), "0x9.800p+4"); + EXPECT_EQ(format("%.4La", on_boundary_odd), "0x9.8000p+4"); + EXPECT_EQ(format("%.5La", on_boundary_odd), "0x9.80000p+4"); + EXPECT_EQ(format("%.6La", on_boundary_odd), "0x9.800000p+4"); + + // 0x8.80001p+24 + const long double slightly_over = 142606352.0; + EXPECT_EQ(format("%.0La", slightly_over), "0x9p+24"); + EXPECT_EQ(format("%.1La", slightly_over), "0x8.8p+24"); + EXPECT_EQ(format("%.2La", slightly_over), "0x8.80p+24"); + EXPECT_EQ(format("%.3La", slightly_over), "0x8.800p+24"); + EXPECT_EQ(format("%.4La", slightly_over), "0x8.8000p+24"); + EXPECT_EQ(format("%.5La", slightly_over), "0x8.80001p+24"); + EXPECT_EQ(format("%.6La", slightly_over), "0x8.800010p+24"); + + // 0x8.7ffffp+24 + const long double slightly_under = 142606320.0; + EXPECT_EQ(format("%.0La", slightly_under), "0x8p+24"); + EXPECT_EQ(format("%.1La", slightly_under), "0x8.8p+24"); + EXPECT_EQ(format("%.2La", slightly_under), "0x8.80p+24"); + EXPECT_EQ(format("%.3La", slightly_under), "0x8.800p+24"); + EXPECT_EQ(format("%.4La", slightly_under), "0x8.8000p+24"); + EXPECT_EQ(format("%.5La", slightly_under), "0x8.7ffffp+24"); + EXPECT_EQ(format("%.6La", slightly_under), "0x8.7ffff0p+24"); + EXPECT_EQ(format("%.7La", slightly_under), "0x8.7ffff00p+24"); + + // 0xc.0828384858688000p+128 + const long double eights = 4094231060438608800781871108094404067328.0; + EXPECT_EQ(format("%.0La", eights), "0xcp+128"); + EXPECT_EQ(format("%.1La", eights), "0xc.1p+128"); + EXPECT_EQ(format("%.2La", eights), "0xc.08p+128"); + EXPECT_EQ(format("%.3La", eights), "0xc.083p+128"); + EXPECT_EQ(format("%.4La", eights), "0xc.0828p+128"); + EXPECT_EQ(format("%.5La", eights), "0xc.08284p+128"); + EXPECT_EQ(format("%.6La", eights), "0xc.082838p+128"); + EXPECT_EQ(format("%.7La", eights), "0xc.0828385p+128"); + EXPECT_EQ(format("%.8La", eights), "0xc.08283848p+128"); + EXPECT_EQ(format("%.9La", eights), "0xc.082838486p+128"); + EXPECT_EQ(format("%.10La", eights), "0xc.0828384858p+128"); + EXPECT_EQ(format("%.11La", eights), "0xc.08283848587p+128"); + EXPECT_EQ(format("%.12La", eights), "0xc.082838485868p+128"); + EXPECT_EQ(format("%.13La", eights), "0xc.0828384858688p+128"); + EXPECT_EQ(format("%.14La", eights), "0xc.08283848586880p+128"); + EXPECT_EQ(format("%.15La", eights), "0xc.082838485868800p+128"); + EXPECT_EQ(format("%.16La", eights), "0xc.0828384858688000p+128"); +} + // We don't actually store the results. This is just to exercise the rest of the // machinery. struct NullSink { @@ -735,6 +1074,7 @@ TEST_F(FormatConvertTest, LongDouble) { // implementation against the native one there. return; #endif // _MSC_VER + const NativePrintfTraits &native_traits = VerifyNativeImplementation(); const char *const kFormats[] = {"%", "%.3", "%8.5", "%9", "%.5000", "%.60", "%+", "% ", "%-10"}; @@ -777,12 +1117,20 @@ TEST_F(FormatConvertTest, LongDouble) { 'e', 'E'}) { std::string fmt_str = std::string(fmt) + 'L' + f; - if (fmt == absl::string_view("%.5000") && f != 'f' && f != 'F') { + if (fmt == absl::string_view("%.5000") && f != 'f' && f != 'F' && + f != 'a' && f != 'A') { // This particular test takes way too long with snprintf. // Disable for the case we are not implementing natively. continue; } + if (f == 'a' || f == 'A') { + if (!native_traits.hex_float_has_glibc_rounding || + !native_traits.hex_float_optimizes_leading_digit_bit_count) { + continue; + } + } + for (auto d : doubles) { FormatArgImpl arg(d); UntypedFormatSpecImpl format(fmt_str); @@ -797,7 +1145,8 @@ TEST_F(FormatConvertTest, LongDouble) { } } -TEST_F(FormatConvertTest, IntAsFloat) { +TEST_F(FormatConvertTest, IntAsDouble) { + const NativePrintfTraits &native_traits = VerifyNativeImplementation(); const int kMin = std::numeric_limits::min(); const int kMax = std::numeric_limits::max(); const int ia[] = { @@ -813,14 +1162,17 @@ TEST_F(FormatConvertTest, IntAsFloat) { const char *fmt; }; const double dx = static_cast(fx); - const Expectation kExpect[] = { - { __LINE__, StrPrint("%f", dx), "%f" }, - { __LINE__, StrPrint("%12f", dx), "%12f" }, - { __LINE__, StrPrint("%.12f", dx), "%.12f" }, - { __LINE__, StrPrint("%12a", dx), "%12a" }, - { __LINE__, StrPrint("%.12a", dx), "%.12a" }, + std::vector expect = { + {__LINE__, StrPrint("%f", dx), "%f"}, + {__LINE__, StrPrint("%12f", dx), "%12f"}, + {__LINE__, StrPrint("%.12f", dx), "%.12f"}, + {__LINE__, StrPrint("%.12a", dx), "%.12a"}, }; - for (const Expectation &e : kExpect) { + if (native_traits.hex_float_uses_minimal_precision_when_not_specified) { + Expectation ex = {__LINE__, StrPrint("%12a", dx), "%12a"}; + expect.push_back(ex); + } + for (const Expectation &e : expect) { SCOPED_TRACE(e.line); SCOPED_TRACE(e.fmt); UntypedFormatSpecImpl format(e.fmt); @@ -865,6 +1217,25 @@ TEST_F(FormatConvertTest, ExpectedFailures) { EXPECT_TRUE(FormatFails("%*d", "")); } +// Sanity check to make sure that we are testing what we think we're testing on +// e.g. the x86_64+glibc platform. +TEST_F(FormatConvertTest, GlibcHasCorrectTraits) { +#if !defined(__GLIBC__) || !defined(__x86_64__) + return; +#endif + const NativePrintfTraits &native_traits = VerifyNativeImplementation(); + // If one of the following tests break then it is either because the above PP + // macro guards failed to exclude a new platform (likely) or because something + // has changed in the implemention of glibc sprintf float formatting behavior. + // If the latter, then the code that computes these flags needs to be + // revisited and/or possibly the StrFormat implementation. + EXPECT_TRUE(native_traits.hex_float_has_glibc_rounding); + EXPECT_TRUE(native_traits.hex_float_prefers_denormal_repr); + EXPECT_TRUE( + native_traits.hex_float_uses_minimal_precision_when_not_specified); + EXPECT_TRUE(native_traits.hex_float_optimizes_leading_digit_bit_count); +} + } // namespace } // namespace str_format_internal ABSL_NAMESPACE_END diff --git a/third_party/abseil_cpp/absl/strings/internal/str_format/extension.cc b/third_party/abseil_cpp/absl/strings/internal/str_format/extension.cc index 94f2b9c20..bb0d96cf3 100644 --- a/third_party/abseil_cpp/absl/strings/internal/str_format/extension.cc +++ b/third_party/abseil_cpp/absl/strings/internal/str_format/extension.cc @@ -33,6 +33,29 @@ std::string Flags::ToString() const { return s; } +#define ABSL_INTERNAL_X_VAL(id) \ + constexpr absl::FormatConversionChar FormatConversionCharInternal::id; +ABSL_INTERNAL_CONVERSION_CHARS_EXPAND_(ABSL_INTERNAL_X_VAL, ) +#undef ABSL_INTERNAL_X_VAL +// NOLINTNEXTLINE(readability-redundant-declaration) +constexpr absl::FormatConversionChar FormatConversionCharInternal::kNone; + +#define ABSL_INTERNAL_CHAR_SET_CASE(c) \ + constexpr FormatConversionCharSet FormatConversionCharSetInternal::c; +ABSL_INTERNAL_CONVERSION_CHARS_EXPAND_(ABSL_INTERNAL_CHAR_SET_CASE, ) +#undef ABSL_INTERNAL_CHAR_SET_CASE + +// NOLINTNEXTLINE(readability-redundant-declaration) +constexpr FormatConversionCharSet FormatConversionCharSetInternal::kStar; +// NOLINTNEXTLINE(readability-redundant-declaration) +constexpr FormatConversionCharSet FormatConversionCharSetInternal::kIntegral; +// NOLINTNEXTLINE(readability-redundant-declaration) +constexpr FormatConversionCharSet FormatConversionCharSetInternal::kFloating; +// NOLINTNEXTLINE(readability-redundant-declaration) +constexpr FormatConversionCharSet FormatConversionCharSetInternal::kNumeric; +// NOLINTNEXTLINE(readability-redundant-declaration) +constexpr FormatConversionCharSet FormatConversionCharSetInternal::kPointer; + bool FormatSinkImpl::PutPaddedString(string_view value, int width, int precision, bool left) { size_t space_remaining = 0; diff --git a/third_party/abseil_cpp/absl/strings/internal/str_format/extension.h b/third_party/abseil_cpp/absl/strings/internal/str_format/extension.h index 6c60c6c3a..a9b9e137d 100644 --- a/third_party/abseil_cpp/absl/strings/internal/str_format/extension.h +++ b/third_party/abseil_cpp/absl/strings/internal/str_format/extension.h @@ -31,11 +31,11 @@ namespace absl { ABSL_NAMESPACE_BEGIN -namespace str_format_internal { - enum class FormatConversionChar : uint8_t; enum class FormatConversionCharSet : uint64_t; +namespace str_format_internal { + class FormatRawSinkImpl { public: // Implicitly convert from any type that provides the hook function as @@ -361,14 +361,12 @@ struct FormatConversionCharSetInternal { static constexpr FormatConversionCharSet kStar = FormatConversionCharToConvValue('*'); - // Some predefined values (TODO(matthewbr), delete any that are unused). static constexpr FormatConversionCharSet kIntegral = FormatConversionCharSetUnion(d, i, u, o, x, X); static constexpr FormatConversionCharSet kFloating = FormatConversionCharSetUnion(a, e, f, g, A, E, F, G); static constexpr FormatConversionCharSet kNumeric = FormatConversionCharSetUnion(kIntegral, kFloating); - static constexpr FormatConversionCharSet kString = s; static constexpr FormatConversionCharSet kPointer = p; }; diff --git a/third_party/abseil_cpp/absl/strings/internal/str_format/extension_test.cc b/third_party/abseil_cpp/absl/strings/internal/str_format/extension_test.cc index 0a023f9c0..1c93fdb1c 100644 --- a/third_party/abseil_cpp/absl/strings/internal/str_format/extension_test.cc +++ b/third_party/abseil_cpp/absl/strings/internal/str_format/extension_test.cc @@ -80,4 +80,19 @@ TEST(FormatExtensionTest, SinkAppendChars) { EXPECT_EQ(actual, expected); } } + +TEST(FormatExtensionTest, VerifyEnumEquality) { +#define X_VAL(id) \ + EXPECT_EQ(absl::FormatConversionChar::id, \ + absl::str_format_internal::FormatConversionCharInternal::id); + ABSL_INTERNAL_CONVERSION_CHARS_EXPAND_(X_VAL, ); +#undef X_VAL + +#define X_VAL(id) \ + EXPECT_EQ(absl::FormatConversionCharSet::id, \ + absl::str_format_internal::FormatConversionCharSetInternal::id); + ABSL_INTERNAL_CONVERSION_CHARS_EXPAND_(X_VAL, ); +#undef X_VAL +} + } // namespace diff --git a/third_party/abseil_cpp/absl/strings/internal/str_format/float_conversion.cc b/third_party/abseil_cpp/absl/strings/internal/str_format/float_conversion.cc index 10e469541..0ded0a66a 100644 --- a/third_party/abseil_cpp/absl/strings/internal/str_format/float_conversion.cc +++ b/third_party/abseil_cpp/absl/strings/internal/str_format/float_conversion.cc @@ -1,3 +1,17 @@ +// Copyright 2020 The Abseil 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 +// +// https://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 "absl/strings/internal/str_format/float_conversion.h" #include @@ -15,6 +29,7 @@ #include "absl/functional/function_ref.h" #include "absl/meta/type_traits.h" #include "absl/numeric/int128.h" +#include "absl/strings/numbers.h" #include "absl/types/optional.h" #include "absl/types/span.h" @@ -119,7 +134,7 @@ class BinaryToDecimal { assert(exp > 0); assert(exp <= std::numeric_limits::max_exponent); static_assert( - StackArray::kMaxCapacity >= + static_cast(StackArray::kMaxCapacity) >= ChunksNeeded(std::numeric_limits::max_exponent), ""); @@ -204,7 +219,7 @@ class BinaryToDecimal { } private: - static constexpr size_t kDigitsPerChunk = 9; + static constexpr int kDigitsPerChunk = 9; int decimal_start_; int decimal_end_; @@ -441,8 +456,10 @@ struct Padding { }; Padding ExtraWidthToPadding(size_t total_size, const FormatState &state) { - if (state.conv.width() < 0 || state.conv.width() <= total_size) + if (state.conv.width() < 0 || + static_cast(state.conv.width()) <= total_size) { return {0, 0, 0}; + } int missing_chars = state.conv.width() - total_size; if (state.conv.has_left_flag()) { return {0, 0, missing_chars}; @@ -453,26 +470,31 @@ Padding ExtraWidthToPadding(size_t total_size, const FormatState &state) { } } -void FinalPrint(absl::string_view data, int trailing_zeros, - const FormatState &state) { +void FinalPrint(const FormatState &state, absl::string_view data, + int padding_offset, int trailing_zeros, + absl::string_view data_postfix) { if (state.conv.width() < 0) { // No width specified. Fast-path. if (state.sign_char != '\0') state.sink->Append(1, state.sign_char); state.sink->Append(data); state.sink->Append(trailing_zeros, '0'); + state.sink->Append(data_postfix); return; } - auto padding = - ExtraWidthToPadding((state.sign_char != '\0' ? 1 : 0) + data.size() + - static_cast(trailing_zeros), - state); + auto padding = ExtraWidthToPadding((state.sign_char != '\0' ? 1 : 0) + + data.size() + data_postfix.size() + + static_cast(trailing_zeros), + state); state.sink->Append(padding.left_spaces, ' '); if (state.sign_char != '\0') state.sink->Append(1, state.sign_char); + // Padding in general needs to be inserted somewhere in the middle of `data`. + state.sink->Append(data.substr(0, padding_offset)); state.sink->Append(padding.zeros, '0'); - state.sink->Append(data); + state.sink->Append(data.substr(padding_offset)); state.sink->Append(trailing_zeros, '0'); + state.sink->Append(data_postfix); state.sink->Append(padding.right_spaces, ' '); } @@ -525,10 +547,11 @@ void FormatFFast(Int v, int exp, const FormatState &state) { // In `alt` mode (flag #) we keep the `.` even if there are no fractional // digits. In non-alt mode, we strip it. if (!state.ShouldPrintDot()) --size; - FinalPrint(absl::string_view(integral_digits_start, size), + FinalPrint(state, absl::string_view(integral_digits_start, size), + /*padding_offset=*/0, static_cast(state.precision - (fractional_digits_end - fractional_digits_start)), - state); + /*data_postfix=*/""); } // Slow %f formatter for when the shifted value does not fit in a uint128, and @@ -655,6 +678,255 @@ void FormatF(Int mantissa, int exp, const FormatState &state) { return FormatFFast(mantissa, exp, state); } +// Grab the group of four bits (nibble) from `n`. E.g., nibble 1 corresponds to +// bits 4-7. +template +uint8_t GetNibble(Int n, int nibble_index) { + constexpr Int mask_low_nibble = Int{0xf}; + int shift = nibble_index * 4; + n &= mask_low_nibble << shift; + return static_cast((n >> shift) & 0xf); +} + +// Add one to the given nibble, applying carry to higher nibbles. Returns true +// if overflow, false otherwise. +template +bool IncrementNibble(int nibble_index, Int *n) { + constexpr int kShift = sizeof(Int) * 8 - 1; + constexpr int kNumNibbles = sizeof(Int) * 8 / 4; + Int before = *n >> kShift; + // Here we essentially want to take the number 1 and move it into the requsted + // nibble, then add it to *n to effectively increment the nibble. However, + // ASan will complain if we try to shift the 1 beyond the limits of the Int, + // i.e., if the nibble_index is out of range. So therefore we check for this + // and if we are out of range we just add 0 which leaves *n unchanged, which + // seems like the reasonable thing to do in that case. + *n += ((nibble_index >= kNumNibbles) ? 0 : (Int{1} << (nibble_index * 4))); + Int after = *n >> kShift; + return (before && !after) || (nibble_index >= kNumNibbles); +} + +// Return a mask with 1's in the given nibble and all lower nibbles. +template +Int MaskUpToNibbleInclusive(int nibble_index) { + constexpr int kNumNibbles = sizeof(Int) * 8 / 4; + static const Int ones = ~Int{0}; + return ones >> std::max(0, 4 * (kNumNibbles - nibble_index - 1)); +} + +// Return a mask with 1's below the given nibble. +template +Int MaskUpToNibbleExclusive(int nibble_index) { + return nibble_index <= 0 ? 0 : MaskUpToNibbleInclusive(nibble_index - 1); +} + +template +Int MoveToNibble(uint8_t nibble, int nibble_index) { + return Int{nibble} << (4 * nibble_index); +} + +// Given mantissa size, find optimal # of mantissa bits to put in initial digit. +// +// In the hex representation we keep a single hex digit to the left of the dot. +// However, the question as to how many bits of the mantissa should be put into +// that hex digit in theory is arbitrary, but in practice it is optimal to +// choose based on the size of the mantissa. E.g., for a `double`, there are 53 +// mantissa bits, so that means that we should put 1 bit to the left of the dot, +// thereby leaving 52 bits to the right, which is evenly divisible by four and +// thus all fractional digits represent actual precision. For a `long double`, +// on the other hand, there are 64 bits of mantissa, thus we can use all four +// bits for the initial hex digit and still have a number left over (60) that is +// a multiple of four. Once again, the goal is to have all fractional digits +// represent real precision. +template +constexpr int HexFloatLeadingDigitSizeInBits() { + return std::numeric_limits::digits % 4 > 0 + ? std::numeric_limits::digits % 4 + : 4; +} + +// This function captures the rounding behavior of glibc for hex float +// representations. E.g. when rounding 0x1.ab800000 to a precision of .2 +// ("%.2a") glibc will round up because it rounds toward the even number (since +// 0xb is an odd number, it will round up to 0xc). However, when rounding at a +// point that is not followed by 800000..., it disregards the parity and rounds +// up if > 8 and rounds down if < 8. +template +bool HexFloatNeedsRoundUp(Int mantissa, int final_nibble_displayed, + uint8_t leading) { + // If the last nibble (hex digit) to be displayed is the lowest on in the + // mantissa then that means that we don't have any further nibbles to inform + // rounding, so don't round. + if (final_nibble_displayed <= 0) { + return false; + } + int rounding_nibble_idx = final_nibble_displayed - 1; + constexpr int kTotalNibbles = sizeof(Int) * 8 / 4; + assert(final_nibble_displayed <= kTotalNibbles); + Int mantissa_up_to_rounding_nibble_inclusive = + mantissa & MaskUpToNibbleInclusive(rounding_nibble_idx); + Int eight = MoveToNibble(8, rounding_nibble_idx); + if (mantissa_up_to_rounding_nibble_inclusive != eight) { + return mantissa_up_to_rounding_nibble_inclusive > eight; + } + // Nibble in question == 8. + uint8_t round_if_odd = (final_nibble_displayed == kTotalNibbles) + ? leading + : GetNibble(mantissa, final_nibble_displayed); + return round_if_odd % 2 == 1; +} + +// Stores values associated with a Float type needed by the FormatA +// implementation in order to avoid templatizing that function by the Float +// type. +struct HexFloatTypeParams { + template + explicit HexFloatTypeParams(Float) + : min_exponent(std::numeric_limits::min_exponent - 1), + leading_digit_size_bits(HexFloatLeadingDigitSizeInBits()) { + assert(leading_digit_size_bits >= 1 && leading_digit_size_bits <= 4); + } + + int min_exponent; + int leading_digit_size_bits; +}; + +// Hex Float Rounding. First check if we need to round; if so, then we do that +// by manipulating (incrementing) the mantissa, that way we can later print the +// mantissa digits by iterating through them in the same way regardless of +// whether a rounding happened. +template +void FormatARound(bool precision_specified, const FormatState &state, + uint8_t *leading, Int *mantissa, int *exp) { + constexpr int kTotalNibbles = sizeof(Int) * 8 / 4; + // Index of the last nibble that we could display given precision. + int final_nibble_displayed = + precision_specified ? std::max(0, (kTotalNibbles - state.precision)) : 0; + if (HexFloatNeedsRoundUp(*mantissa, final_nibble_displayed, *leading)) { + // Need to round up. + bool overflow = IncrementNibble(final_nibble_displayed, mantissa); + *leading += (overflow ? 1 : 0); + if (ABSL_PREDICT_FALSE(*leading > 15)) { + // We have overflowed the leading digit. This would mean that we would + // need two hex digits to the left of the dot, which is not allowed. So + // adjust the mantissa and exponent so that the result is always 1.0eXXX. + *leading = 1; + *mantissa = 0; + *exp += 4; + } + } + // Now that we have handled a possible round-up we can go ahead and zero out + // all the nibbles of the mantissa that we won't need. + if (precision_specified) { + *mantissa &= ~MaskUpToNibbleExclusive(final_nibble_displayed); + } +} + +template +void FormatANormalize(const HexFloatTypeParams float_traits, uint8_t *leading, + Int *mantissa, int *exp) { + constexpr int kIntBits = sizeof(Int) * 8; + static const Int kHighIntBit = Int{1} << (kIntBits - 1); + const int kLeadDigitBitsCount = float_traits.leading_digit_size_bits; + // Normalize mantissa so that highest bit set is in MSB position, unless we + // get interrupted by the exponent threshold. + while (*mantissa && !(*mantissa & kHighIntBit)) { + if (ABSL_PREDICT_FALSE(*exp - 1 < float_traits.min_exponent)) { + *mantissa >>= (float_traits.min_exponent - *exp); + *exp = float_traits.min_exponent; + return; + } + *mantissa <<= 1; + --*exp; + } + // Extract bits for leading digit then shift them away leaving the + // fractional part. + *leading = + static_cast(*mantissa >> (kIntBits - kLeadDigitBitsCount)); + *exp -= (*mantissa != 0) ? kLeadDigitBitsCount : *exp; + *mantissa <<= kLeadDigitBitsCount; +} + +template +void FormatA(const HexFloatTypeParams float_traits, Int mantissa, int exp, + bool uppercase, const FormatState &state) { + // Int properties. + constexpr int kIntBits = sizeof(Int) * 8; + constexpr int kTotalNibbles = sizeof(Int) * 8 / 4; + // Did the user specify a precision explicitly? + const bool precision_specified = state.conv.precision() >= 0; + + // ========== Normalize/Denormalize ========== + exp += kIntBits; // make all digits fractional digits. + // This holds the (up to four) bits of leading digit, i.e., the '1' in the + // number 0x1.e6fp+2. It's always > 0 unless number is zero or denormal. + uint8_t leading = 0; + FormatANormalize(float_traits, &leading, &mantissa, &exp); + + // =============== Rounding ================== + // Check if we need to round; if so, then we do that by manipulating + // (incrementing) the mantissa before beginning to print characters. + FormatARound(precision_specified, state, &leading, &mantissa, &exp); + + // ============= Format Result =============== + // This buffer holds the "0x1.ab1de3" portion of "0x1.ab1de3pe+2". Compute the + // size with long double which is the largest of the floats. + constexpr size_t kBufSizeForHexFloatRepr = + 2 // 0x + + std::numeric_limits::digits / 4 // number of hex digits + + 1 // round up + + 1; // "." (dot) + char digits_buffer[kBufSizeForHexFloatRepr]; + char *digits_iter = digits_buffer; + const char *const digits = + static_cast("0123456789ABCDEF0123456789abcdef") + + (uppercase ? 0 : 16); + + // =============== Hex Prefix ================ + *digits_iter++ = '0'; + *digits_iter++ = uppercase ? 'X' : 'x'; + + // ========== Non-Fractional Digit =========== + *digits_iter++ = digits[leading]; + + // ================== Dot ==================== + // There are three reasons we might need a dot. Keep in mind that, at this + // point, the mantissa holds only the fractional part. + if ((precision_specified && state.precision > 0) || + (!precision_specified && mantissa > 0) || state.conv.has_alt_flag()) { + *digits_iter++ = '.'; + } + + // ============ Fractional Digits ============ + int digits_emitted = 0; + while (mantissa > 0) { + *digits_iter++ = digits[GetNibble(mantissa, kTotalNibbles - 1)]; + mantissa <<= 4; + ++digits_emitted; + } + int trailing_zeros = + precision_specified ? state.precision - digits_emitted : 0; + assert(trailing_zeros >= 0); + auto digits_result = string_view(digits_buffer, digits_iter - digits_buffer); + + // =============== Exponent ================== + constexpr size_t kBufSizeForExpDecRepr = + numbers_internal::kFastToBufferSize // requred for FastIntToBuffer + + 1 // 'p' or 'P' + + 1; // '+' or '-' + char exp_buffer[kBufSizeForExpDecRepr]; + exp_buffer[0] = uppercase ? 'P' : 'p'; + exp_buffer[1] = exp >= 0 ? '+' : '-'; + numbers_internal::FastIntToBuffer(exp < 0 ? -exp : exp, exp_buffer + 2); + + // ============ Assemble Result ============== + FinalPrint(state, // + digits_result, // 0xN.NNN... + 2, // offset in `data` to start padding if needed. + trailing_zeros, // num remaining mantissa padding zeros + exp_buffer); // exponent +} + char *CopyStringTo(absl::string_view v, char *out) { std::memcpy(out, v.data(), v.size()); return out + v.size(); @@ -1103,7 +1375,10 @@ bool FloatToSink(const Float v, const FormatConversionSpecImpl &conv, } } else if (c == FormatConversionCharInternal::a || c == FormatConversionCharInternal::A) { - return FallbackToSnprintf(v, conv, sink); + bool uppercase = (c == FormatConversionCharInternal::A); + FormatA(HexFloatTypeParams(Float{}), decomposed.mantissa, + decomposed.exponent, uppercase, {sign_char, precision, conv, sink}); + return true; } else { return false; } @@ -1131,7 +1406,7 @@ bool ConvertFloatImpl(long double v, const FormatConversionSpecImpl &conv, bool ConvertFloatImpl(float v, const FormatConversionSpecImpl &conv, FormatSinkImpl *sink) { - return FloatToSink(v, conv, sink); + return FloatToSink(static_cast(v), conv, sink); } bool ConvertFloatImpl(double v, const FormatConversionSpecImpl &conv, diff --git a/third_party/abseil_cpp/absl/strings/internal/str_format/float_conversion.h b/third_party/abseil_cpp/absl/strings/internal/str_format/float_conversion.h index e78bc1910..71100e714 100644 --- a/third_party/abseil_cpp/absl/strings/internal/str_format/float_conversion.h +++ b/third_party/abseil_cpp/absl/strings/internal/str_format/float_conversion.h @@ -1,3 +1,17 @@ +// Copyright 2020 The Abseil 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 +// +// https://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 ABSL_STRINGS_INTERNAL_STR_FORMAT_FLOAT_CONVERSION_H_ #define ABSL_STRINGS_INTERNAL_STR_FORMAT_FLOAT_CONVERSION_H_ diff --git a/third_party/abseil_cpp/absl/strings/internal/str_format/parser.cc b/third_party/abseil_cpp/absl/strings/internal/str_format/parser.cc index cc55dfa9c..f308d0235 100644 --- a/third_party/abseil_cpp/absl/strings/internal/str_format/parser.cc +++ b/third_party/abseil_cpp/absl/strings/internal/str_format/parser.cc @@ -1,3 +1,17 @@ +// Copyright 2020 The Abseil 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 +// +// https://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 "absl/strings/internal/str_format/parser.h" #include diff --git a/third_party/abseil_cpp/absl/strings/internal/str_format/parser.h b/third_party/abseil_cpp/absl/strings/internal/str_format/parser.h index fffed04fa..6504dd3dd 100644 --- a/third_party/abseil_cpp/absl/strings/internal/str_format/parser.h +++ b/third_party/abseil_cpp/absl/strings/internal/str_format/parser.h @@ -1,3 +1,17 @@ +// Copyright 2020 The Abseil 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 +// +// https://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 ABSL_STRINGS_INTERNAL_STR_FORMAT_PARSER_H_ #define ABSL_STRINGS_INTERNAL_STR_FORMAT_PARSER_H_ diff --git a/third_party/abseil_cpp/absl/strings/internal/str_format/parser_test.cc b/third_party/abseil_cpp/absl/strings/internal/str_format/parser_test.cc index 5aced9872..a5fa1c79a 100644 --- a/third_party/abseil_cpp/absl/strings/internal/str_format/parser_test.cc +++ b/third_party/abseil_cpp/absl/strings/internal/str_format/parser_test.cc @@ -1,3 +1,17 @@ +// Copyright 2020 The Abseil 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 +// +// https://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 "absl/strings/internal/str_format/parser.h" #include diff --git a/third_party/abseil_cpp/absl/strings/internal/str_split_internal.h b/third_party/abseil_cpp/absl/strings/internal/str_split_internal.h index 6f5bc095f..a2f41c153 100644 --- a/third_party/abseil_cpp/absl/strings/internal/str_split_internal.h +++ b/third_party/abseil_cpp/absl/strings/internal/str_split_internal.h @@ -51,9 +51,9 @@ ABSL_NAMESPACE_BEGIN namespace strings_internal { // This class is implicitly constructible from everything that absl::string_view -// is implicitly constructible from. If it's constructed from a temporary -// string, the data is moved into a data member so its lifetime matches that of -// the ConvertibleToStringView instance. +// is implicitly constructible from, except for rvalue strings. This means it +// can be used as a function parameter in places where passing a temporary +// string might cause memory lifetime issues. class ConvertibleToStringView { public: ConvertibleToStringView(const char* s) // NOLINT(runtime/explicit) @@ -65,41 +65,12 @@ class ConvertibleToStringView { : value_(s) {} // Matches rvalue strings and moves their data to a member. - ConvertibleToStringView(std::string&& s) // NOLINT(runtime/explicit) - : copy_(std::move(s)), value_(copy_) {} - - ConvertibleToStringView(const ConvertibleToStringView& other) - : copy_(other.copy_), - value_(other.IsSelfReferential() ? copy_ : other.value_) {} - - ConvertibleToStringView(ConvertibleToStringView&& other) { - StealMembers(std::move(other)); - } - - ConvertibleToStringView& operator=(ConvertibleToStringView other) { - StealMembers(std::move(other)); - return *this; - } + ConvertibleToStringView(std::string&& s) = delete; + ConvertibleToStringView(const std::string&& s) = delete; absl::string_view value() const { return value_; } private: - // Returns true if ctsp's value refers to its internal copy_ member. - bool IsSelfReferential() const { return value_.data() == copy_.data(); } - - void StealMembers(ConvertibleToStringView&& other) { - if (other.IsSelfReferential()) { - copy_ = std::move(other.copy_); - value_ = copy_; - other.value_ = other.copy_; - } else { - value_ = other.value_; - } - } - - // Holds the data moved from temporary std::string arguments. Declared first - // so that 'value' can refer to 'copy_'. - std::string copy_; absl::string_view value_; }; @@ -273,7 +244,11 @@ struct SplitterIsConvertibleTo // the split strings: only strings for which the predicate returns true will be // kept. A Predicate object is any unary functor that takes an absl::string_view // and returns bool. -template +// +// The StringType parameter can be either string_view or string, depending on +// whether the Splitter refers to a string stored elsewhere, or if the string +// resides inside the Splitter itself. +template class Splitter { public: using DelimiterType = Delimiter; @@ -281,12 +256,12 @@ class Splitter { using const_iterator = strings_internal::SplitIterator; using value_type = typename std::iterator_traits::value_type; - Splitter(ConvertibleToStringView input_text, Delimiter d, Predicate p) + Splitter(StringType input_text, Delimiter d, Predicate p) : text_(std::move(input_text)), delimiter_(std::move(d)), predicate_(std::move(p)) {} - absl::string_view text() const { return text_.value(); } + absl::string_view text() const { return text_; } const Delimiter& delimiter() const { return delimiter_; } const Predicate& predicate() const { return predicate_; } @@ -336,7 +311,7 @@ class Splitter { Container operator()(const Splitter& splitter) const { Container c; auto it = std::inserter(c, c.end()); - for (const auto sp : splitter) { + for (const auto& sp : splitter) { *it++ = ValueType(sp); } return c; @@ -401,7 +376,7 @@ class Splitter { Container m; typename Container::iterator it; bool insert = true; - for (const auto sp : splitter) { + for (const auto& sp : splitter) { if (insert) { it = Inserter::Insert(&m, First(sp), Second()); } else { @@ -443,7 +418,7 @@ class Splitter { }; }; - ConvertibleToStringView text_; + StringType text_; Delimiter delimiter_; Predicate predicate_; }; diff --git a/third_party/abseil_cpp/absl/strings/internal/string_constant.h b/third_party/abseil_cpp/absl/strings/internal/string_constant.h new file mode 100644 index 000000000..b15f1d9bc --- /dev/null +++ b/third_party/abseil_cpp/absl/strings/internal/string_constant.h @@ -0,0 +1,70 @@ +// Copyright 2020 The Abseil 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 +// +// https://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 ABSL_STRINGS_INTERNAL_STRING_CONSTANT_H_ +#define ABSL_STRINGS_INTERNAL_STRING_CONSTANT_H_ + +#include "absl/meta/type_traits.h" +#include "absl/strings/string_view.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace strings_internal { + +// StringConstant represents a compile time string constant. +// It can be accessed via its `absl::string_view value` static member. +// It is guaranteed that the `string_view` returned has constant `.data()`, +// constant `.size()` and constant `value[i]` for all `0 <= i < .size()` +// +// The `T` is an opaque type. It is guaranteed that different string constants +// will have different values of `T`. This allows users to associate the string +// constant with other static state at compile time. +// +// Instances should be made using the `MakeStringConstant()` factory function +// below. +template +struct StringConstant { + private: + // Returns true if `view` points to constant data. + // Otherwise, it can't be constant evaluated. + static constexpr bool ValidateConstant(absl::string_view view) { + return view.empty() || 2 * view[0] != 1; + } + + public: + static constexpr absl::string_view value = T{}(); + constexpr absl::string_view operator()() const { return value; } + + static_assert(ValidateConstant(value), + "The input string_view must point to constant data."); +}; + +template +constexpr absl::string_view StringConstant::value; // NOLINT + +// Factory function for `StringConstant` instances. +// It supports callables that have a constexpr default constructor and a +// constexpr operator(). +// It must return an `absl::string_view` or `const char*` pointing to constant +// data. This is validated at compile time. +template +constexpr StringConstant MakeStringConstant(T) { + return {}; +} + +} // namespace strings_internal +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_STRINGS_INTERNAL_STRING_CONSTANT_H_ diff --git a/third_party/abseil_cpp/absl/strings/internal/string_constant_test.cc b/third_party/abseil_cpp/absl/strings/internal/string_constant_test.cc new file mode 100644 index 000000000..392833cf1 --- /dev/null +++ b/third_party/abseil_cpp/absl/strings/internal/string_constant_test.cc @@ -0,0 +1,60 @@ +// Copyright 2020 The Abseil 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 +// +// https://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 "absl/strings/internal/string_constant.h" + +#include "absl/meta/type_traits.h" +#include "gmock/gmock.h" +#include "gtest/gtest.h" + +namespace { + +using absl::strings_internal::MakeStringConstant; + +struct Callable { + constexpr absl::string_view operator()() const { + return absl::string_view("Callable", 8); + } +}; + +TEST(StringConstant, Traits) { + constexpr auto str = MakeStringConstant(Callable{}); + using T = decltype(str); + + EXPECT_TRUE(std::is_empty::value); + EXPECT_TRUE(std::is_trivial::value); + EXPECT_TRUE(absl::is_trivially_default_constructible::value); + EXPECT_TRUE(absl::is_trivially_copy_constructible::value); + EXPECT_TRUE(absl::is_trivially_move_constructible::value); + EXPECT_TRUE(absl::is_trivially_destructible::value); +} + +TEST(StringConstant, MakeFromCallable) { + constexpr auto str = MakeStringConstant(Callable{}); + using T = decltype(str); + EXPECT_EQ(Callable{}(), T::value); + EXPECT_EQ(Callable{}(), str()); +} + +TEST(StringConstant, MakeFromStringConstant) { + // We want to make sure the StringConstant itself is a valid input to the + // factory function. + constexpr auto str = MakeStringConstant(Callable{}); + constexpr auto str2 = MakeStringConstant(str); + using T = decltype(str2); + EXPECT_EQ(Callable{}(), T::value); + EXPECT_EQ(Callable{}(), str2()); +} + +} // namespace diff --git a/third_party/abseil_cpp/absl/strings/numbers.cc b/third_party/abseil_cpp/absl/strings/numbers.cc index 68c26dd6f..3da1059c9 100644 --- a/third_party/abseil_cpp/absl/strings/numbers.cc +++ b/third_party/abseil_cpp/absl/strings/numbers.cc @@ -736,9 +736,18 @@ struct LookupTables { X / 35, X / 36, \ } +// This kVmaxOverBase is generated with +// for (int base = 2; base < 37; ++base) { +// absl::uint128 max = std::numeric_limits::max(); +// auto result = max / base; +// std::cout << " MakeUint128(" << absl::Uint128High64(result) << "u, " +// << absl::Uint128Low64(result) << "u),\n"; +// } +// See https://godbolt.org/z/aneYsb +// // uint128& operator/=(uint128) is not constexpr, so hardcode the resulting // array to avoid a static initializer. -template <> +template<> const uint128 LookupTables::kVmaxOverBase[] = { 0, 0, @@ -779,6 +788,111 @@ const uint128 LookupTables::kVmaxOverBase[] = { MakeUint128(512409557603043100u, 8198552921648689607u), }; +// This kVmaxOverBase generated with +// for (int base = 2; base < 37; ++base) { +// absl::int128 max = std::numeric_limits::max(); +// auto result = max / base; +// std::cout << "\tMakeInt128(" << absl::Int128High64(result) << ", " +// << absl::Int128Low64(result) << "u),\n"; +// } +// See https://godbolt.org/z/7djYWz +// +// int128& operator/=(int128) is not constexpr, so hardcode the resulting array +// to avoid a static initializer. +template<> +const int128 LookupTables::kVmaxOverBase[] = { + 0, + 0, + MakeInt128(4611686018427387903, 18446744073709551615u), + MakeInt128(3074457345618258602, 12297829382473034410u), + MakeInt128(2305843009213693951, 18446744073709551615u), + MakeInt128(1844674407370955161, 11068046444225730969u), + MakeInt128(1537228672809129301, 6148914691236517205u), + MakeInt128(1317624576693539401, 2635249153387078802u), + MakeInt128(1152921504606846975, 18446744073709551615u), + MakeInt128(1024819115206086200, 16397105843297379214u), + MakeInt128(922337203685477580, 14757395258967641292u), + MakeInt128(838488366986797800, 13415813871788764811u), + MakeInt128(768614336404564650, 12297829382473034410u), + MakeInt128(709490156681136600, 11351842506898185609u), + MakeInt128(658812288346769700, 10540996613548315209u), + MakeInt128(614891469123651720, 9838263505978427528u), + MakeInt128(576460752303423487, 18446744073709551615u), + MakeInt128(542551296285575047, 9765923333140350855u), + MakeInt128(512409557603043100, 8198552921648689607u), + MakeInt128(485440633518672410, 17475862806672206794u), + MakeInt128(461168601842738790, 7378697629483820646u), + MakeInt128(439208192231179800, 7027331075698876806u), + MakeInt128(419244183493398900, 6707906935894382405u), + MakeInt128(401016175515425035, 2406097053092550210u), + MakeInt128(384307168202282325, 6148914691236517205u), + MakeInt128(368934881474191032, 5902958103587056517u), + MakeInt128(354745078340568300, 5675921253449092804u), + MakeInt128(341606371735362066, 17763531330238827482u), + MakeInt128(329406144173384850, 5270498306774157604u), + MakeInt128(318047311615681924, 7633135478776366185u), + MakeInt128(307445734561825860, 4919131752989213764u), + MakeInt128(297528130221121800, 4760450083537948804u), + MakeInt128(288230376151711743, 18446744073709551615u), + MakeInt128(279496122328932600, 4471937957262921603u), + MakeInt128(271275648142787523, 14106333703424951235u), + MakeInt128(263524915338707880, 4216398645419326083u), + MakeInt128(256204778801521550, 4099276460824344803u), +}; + +// This kVminOverBase generated with +// for (int base = 2; base < 37; ++base) { +// absl::int128 min = std::numeric_limits::min(); +// auto result = min / base; +// std::cout << "\tMakeInt128(" << absl::Int128High64(result) << ", " +// << absl::Int128Low64(result) << "u),\n"; +// } +// +// See https://godbolt.org/z/7djYWz +// +// int128& operator/=(int128) is not constexpr, so hardcode the resulting array +// to avoid a static initializer. +template<> +const int128 LookupTables::kVminOverBase[] = { + 0, + 0, + MakeInt128(-4611686018427387904, 0u), + MakeInt128(-3074457345618258603, 6148914691236517206u), + MakeInt128(-2305843009213693952, 0u), + MakeInt128(-1844674407370955162, 7378697629483820647u), + MakeInt128(-1537228672809129302, 12297829382473034411u), + MakeInt128(-1317624576693539402, 15811494920322472814u), + MakeInt128(-1152921504606846976, 0u), + MakeInt128(-1024819115206086201, 2049638230412172402u), + MakeInt128(-922337203685477581, 3689348814741910324u), + MakeInt128(-838488366986797801, 5030930201920786805u), + MakeInt128(-768614336404564651, 6148914691236517206u), + MakeInt128(-709490156681136601, 7094901566811366007u), + MakeInt128(-658812288346769701, 7905747460161236407u), + MakeInt128(-614891469123651721, 8608480567731124088u), + MakeInt128(-576460752303423488, 0u), + MakeInt128(-542551296285575048, 8680820740569200761u), + MakeInt128(-512409557603043101, 10248191152060862009u), + MakeInt128(-485440633518672411, 970881267037344822u), + MakeInt128(-461168601842738791, 11068046444225730970u), + MakeInt128(-439208192231179801, 11419412998010674810u), + MakeInt128(-419244183493398901, 11738837137815169211u), + MakeInt128(-401016175515425036, 16040647020617001406u), + MakeInt128(-384307168202282326, 12297829382473034411u), + MakeInt128(-368934881474191033, 12543785970122495099u), + MakeInt128(-354745078340568301, 12770822820260458812u), + MakeInt128(-341606371735362067, 683212743470724134u), + MakeInt128(-329406144173384851, 13176245766935394012u), + MakeInt128(-318047311615681925, 10813608594933185431u), + MakeInt128(-307445734561825861, 13527612320720337852u), + MakeInt128(-297528130221121801, 13686293990171602812u), + MakeInt128(-288230376151711744, 0u), + MakeInt128(-279496122328932601, 13974806116446630013u), + MakeInt128(-271275648142787524, 4340410370284600381u), + MakeInt128(-263524915338707881, 14230345428290225533u), + MakeInt128(-256204778801521551, 14347467612885206813u), +}; + template const IntType LookupTables::kVmaxOverBase[] = X_OVER_BASE_INITIALIZER(std::numeric_limits::max()); @@ -948,6 +1062,10 @@ bool safe_strto64_base(absl::string_view text, int64_t* value, int base) { return safe_int_internal(text, value, base); } +bool safe_strto128_base(absl::string_view text, int128* value, int base) { + return safe_int_internal(text, value, base); +} + bool safe_strtou32_base(absl::string_view text, uint32_t* value, int base) { return safe_uint_internal(text, value, base); } diff --git a/third_party/abseil_cpp/absl/strings/numbers.h b/third_party/abseil_cpp/absl/strings/numbers.h index d872cca5d..2e004b44f 100644 --- a/third_party/abseil_cpp/absl/strings/numbers.h +++ b/third_party/abseil_cpp/absl/strings/numbers.h @@ -127,6 +127,8 @@ inline void PutTwoDigits(size_t i, char* buf) { // safe_strto?() functions for implementing SimpleAtoi() bool safe_strto32_base(absl::string_view text, int32_t* value, int base); bool safe_strto64_base(absl::string_view text, int64_t* value, int base); +bool safe_strto128_base(absl::string_view text, absl::int128* value, + int base); bool safe_strtou32_base(absl::string_view text, uint32_t* value, int base); bool safe_strtou64_base(absl::string_view text, uint64_t* value, int base); bool safe_strtou128_base(absl::string_view text, absl::uint128* value, @@ -255,6 +257,11 @@ ABSL_MUST_USE_RESULT bool SimpleAtoi(absl::string_view str, int_type* out) { return numbers_internal::safe_strtoi_base(str, out, 10); } +ABSL_MUST_USE_RESULT inline bool SimpleAtoi(absl::string_view str, + absl::int128* out) { + return numbers_internal::safe_strto128_base(str, out, 10); +} + ABSL_MUST_USE_RESULT inline bool SimpleAtoi(absl::string_view str, absl::uint128* out) { return numbers_internal::safe_strtou128_base(str, out, 10); diff --git a/third_party/abseil_cpp/absl/strings/numbers_test.cc b/third_party/abseil_cpp/absl/strings/numbers_test.cc index 7db85e754..4ab67fb66 100644 --- a/third_party/abseil_cpp/absl/strings/numbers_test.cc +++ b/third_party/abseil_cpp/absl/strings/numbers_test.cc @@ -251,7 +251,7 @@ TEST(Numbers, TestFastPrints) { template void VerifySimpleAtoiGood(in_val_type in_value, int_type exp_value) { std::string s; - // uint128 can be streamed but not StrCat'd + // (u)int128 can be streamed but not StrCat'd. absl::strings_internal::OStringStream(&s) << in_value; int_type x = static_cast(~exp_value); EXPECT_TRUE(SimpleAtoi(s, &x)) @@ -264,7 +264,9 @@ void VerifySimpleAtoiGood(in_val_type in_value, int_type exp_value) { template void VerifySimpleAtoiBad(in_val_type in_value) { - std::string s = absl::StrCat(in_value); + std::string s; + // (u)int128 can be streamed but not StrCat'd. + absl::strings_internal::OStringStream(&s) << in_value; int_type x; EXPECT_FALSE(SimpleAtoi(s, &x)); EXPECT_FALSE(SimpleAtoi(s.c_str(), &x)); @@ -347,6 +349,31 @@ TEST(NumbersTest, Atoi) { std::numeric_limits::max(), std::numeric_limits::max()); + // SimpleAtoi(absl::string_view, absl::int128) + VerifySimpleAtoiGood(0, 0); + VerifySimpleAtoiGood(42, 42); + VerifySimpleAtoiGood(-42, -42); + + VerifySimpleAtoiGood(std::numeric_limits::min(), + std::numeric_limits::min()); + VerifySimpleAtoiGood(std::numeric_limits::max(), + std::numeric_limits::max()); + VerifySimpleAtoiGood(std::numeric_limits::max(), + std::numeric_limits::max()); + VerifySimpleAtoiGood(std::numeric_limits::min(), + std::numeric_limits::min()); + VerifySimpleAtoiGood(std::numeric_limits::max(), + std::numeric_limits::max()); + VerifySimpleAtoiGood(std::numeric_limits::max(), + std::numeric_limits::max()); + VerifySimpleAtoiGood( + std::numeric_limits::min(), + std::numeric_limits::min()); + VerifySimpleAtoiGood( + std::numeric_limits::max(), + std::numeric_limits::max()); + VerifySimpleAtoiBad(std::numeric_limits::max()); + // Some other types VerifySimpleAtoiGood(-42, -42); VerifySimpleAtoiGood(-42, -42); @@ -359,6 +386,12 @@ TEST(NumbersTest, Atoi) { VerifySimpleAtoiGood(42, 42); } +TEST(NumbersTest, Atod) { + double d; + EXPECT_TRUE(absl::SimpleAtod("nan", &d)); + EXPECT_TRUE(std::isnan(d)); +} + TEST(NumbersTest, Atoenum) { enum E01 { E01_zero = 0, @@ -719,6 +752,51 @@ TEST(stringtest, safe_strtou128_random) { EXPECT_FALSE(parse_func(s, &parsed_value, base)); } } +TEST(stringtest, safe_strto128_random) { + // random number generators don't work for int128, and + // int128 can be streamed but not StrCat'd, so this code must be custom + // implemented for int128, but is generally the same as what's above. + // test_random_integer_parse_base( + // &absl::numbers_internal::safe_strto128_base); + using RandomEngine = std::minstd_rand0; + using IntType = absl::int128; + constexpr auto parse_func = &absl::numbers_internal::safe_strto128_base; + + std::random_device rd; + RandomEngine rng(rd()); + std::uniform_int_distribution random_int64( + std::numeric_limits::min()); + std::uniform_int_distribution random_uint64( + std::numeric_limits::min()); + std::uniform_int_distribution random_base(2, 35); + + for (size_t i = 0; i < kNumRandomTests; ++i) { + int64_t high = random_int64(rng); + uint64_t low = random_uint64(rng); + IntType value = absl::MakeInt128(high, low); + + int base = random_base(rng); + std::string str_value; + EXPECT_TRUE(Itoa(value, base, &str_value)); + IntType parsed_value; + + // Test successful parse + EXPECT_TRUE(parse_func(str_value, &parsed_value, base)); + EXPECT_EQ(parsed_value, value); + + // Test overflow + std::string s; + absl::strings_internal::OStringStream(&s) + << std::numeric_limits::max() << value; + EXPECT_FALSE(parse_func(s, &parsed_value, base)); + + // Test underflow + s.clear(); + absl::strings_internal::OStringStream(&s) + << std::numeric_limits::min() << value; + EXPECT_FALSE(parse_func(s, &parsed_value, base)); + } +} TEST(stringtest, safe_strtou32_base) { for (int i = 0; strtouint32_test_cases()[i].str != nullptr; ++i) { diff --git a/third_party/abseil_cpp/absl/strings/str_cat.cc b/third_party/abseil_cpp/absl/strings/str_cat.cc index d9afe2f38..dd5d25b0d 100644 --- a/third_party/abseil_cpp/absl/strings/str_cat.cc +++ b/third_party/abseil_cpp/absl/strings/str_cat.cc @@ -141,12 +141,12 @@ namespace strings_internal { std::string CatPieces(std::initializer_list pieces) { std::string result; size_t total_size = 0; - for (const absl::string_view piece : pieces) total_size += piece.size(); + for (const absl::string_view& piece : pieces) total_size += piece.size(); strings_internal::STLStringResizeUninitialized(&result, total_size); char* const begin = &result[0]; char* out = begin; - for (const absl::string_view piece : pieces) { + for (const absl::string_view& piece : pieces) { const size_t this_size = piece.size(); if (this_size != 0) { memcpy(out, piece.data(), this_size); @@ -170,7 +170,7 @@ void AppendPieces(std::string* dest, std::initializer_list pieces) { size_t old_size = dest->size(); size_t total_size = old_size; - for (const absl::string_view piece : pieces) { + for (const absl::string_view& piece : pieces) { ASSERT_NO_OVERLAP(*dest, piece); total_size += piece.size(); } @@ -178,7 +178,7 @@ void AppendPieces(std::string* dest, char* const begin = &(*dest)[0]; char* out = begin + old_size; - for (const absl::string_view piece : pieces) { + for (const absl::string_view& piece : pieces) { const size_t this_size = piece.size(); if (this_size != 0) { memcpy(out, piece.data(), this_size); diff --git a/third_party/abseil_cpp/absl/strings/str_cat_benchmark.cc b/third_party/abseil_cpp/absl/strings/str_cat_benchmark.cc index ee4ad112f..02c4dbe6d 100644 --- a/third_party/abseil_cpp/absl/strings/str_cat_benchmark.cc +++ b/third_party/abseil_cpp/absl/strings/str_cat_benchmark.cc @@ -137,4 +137,51 @@ void BM_DoubleToString_By_SixDigits(benchmark::State& state) { } BENCHMARK(BM_DoubleToString_By_SixDigits); +template +void BM_StrAppendImpl(benchmark::State& state, size_t total_bytes, + Chunks... chunks) { + for (auto s : state) { + std::string result; + while (result.size() < total_bytes) { + absl::StrAppend(&result, chunks...); + benchmark::DoNotOptimize(result); + } + } +} + +void BM_StrAppend(benchmark::State& state) { + const int total_bytes = state.range(0); + const int chunks_at_a_time = state.range(1); + const absl::string_view kChunk = "0123456789"; + + switch (chunks_at_a_time) { + case 1: + return BM_StrAppendImpl(state, total_bytes, kChunk); + case 2: + return BM_StrAppendImpl(state, total_bytes, kChunk, kChunk); + case 4: + return BM_StrAppendImpl(state, total_bytes, kChunk, kChunk, kChunk, + kChunk); + case 8: + return BM_StrAppendImpl(state, total_bytes, kChunk, kChunk, kChunk, + kChunk, kChunk, kChunk, kChunk, kChunk); + default: + std::abort(); + } +} + +template +void StrAppendConfig(B* benchmark) { + for (int bytes : {10, 100, 1000, 10000}) { + for (int chunks : {1, 2, 4, 8}) { + // Only add the ones that divide properly. Otherwise we are over counting. + if (bytes % (10 * chunks) == 0) { + benchmark->Args({bytes, chunks}); + } + } + } +} + +BENCHMARK(BM_StrAppend)->Apply(StrAppendConfig); + } // namespace diff --git a/third_party/abseil_cpp/absl/strings/str_format.h b/third_party/abseil_cpp/absl/strings/str_format.h index 36bd84a3e..01465107e 100644 --- a/third_party/abseil_cpp/absl/strings/str_format.h +++ b/third_party/abseil_cpp/absl/strings/str_format.h @@ -63,6 +63,9 @@ // loosely typed. `FormatUntyped()` is not a template and does not perform // any compile-time checking of the format string; instead, it returns a // boolean from a runtime check. +// +// In addition, the `str_format` library provides extension points for +// augmenting formatting to new types. See "StrFormat Extensions" below. #ifndef ABSL_STRINGS_STR_FORMAT_H_ #define ABSL_STRINGS_STR_FORMAT_H_ @@ -278,9 +281,36 @@ using FormatSpec = str_format_internal::FormatSpecTemplate< // } else { // ... error case ... // } + +#if defined(__cpp_nontype_template_parameter_auto) +// If C++17 is available, an 'extended' format is also allowed that can specify +// multiple conversion characters per format argument, using a combination of +// `absl::FormatConversionCharSet` enum values (logically a set union) +// via the `|` operator. (Single character-based arguments are still accepted, +// but cannot be combined). Some common conversions also have predefined enum +// values, such as `absl::FormatConversionCharSet::kIntegral`. +// +// Example: +// // Extended format supports multiple conversion characters per argument, +// // specified via a combination of `FormatConversionCharSet` enums. +// using MyFormat = absl::ParsedFormat; +// MyFormat GetFormat(bool use_hex) { +// if (use_hex) return MyFormat("foo %x bar"); +// return MyFormat("foo %d bar"); +// } +// // `format` can be used with any value that supports 'd' and 'x', +// // like `int`. +// auto format = GetFormat(use_hex); +// value = StringF(format, i); +template +using ParsedFormat = absl::str_format_internal::ExtendedParsedFormat< + absl::str_format_internal::ToFormatConversionCharSet(Conv)...>; +#else template using ParsedFormat = str_format_internal::ExtendedParsedFormat< absl::str_format_internal::ToFormatConversionCharSet(Conv)...>; +#endif // defined(__cpp_nontype_template_parameter_auto) // StrFormat() // @@ -537,6 +567,246 @@ ABSL_MUST_USE_RESULT inline bool FormatUntyped( str_format_internal::UntypedFormatSpecImpl::Extract(format), args); } +//------------------------------------------------------------------------------ +// StrFormat Extensions +//------------------------------------------------------------------------------ +// +// AbslFormatConvert() +// +// The StrFormat library provides a customization API for formatting +// user-defined types using absl::StrFormat(). The API relies on detecting an +// overload in the user-defined type's namespace of a free (non-member) +// `AbslFormatConvert()` function, usually as a friend definition with the +// following signature: +// +// absl::FormatConvertResult<...> AbslFormatConvert( +// const X& value, +// const absl::FormatConversionSpec& spec, +// absl::FormatSink *sink); +// +// An `AbslFormatConvert()` overload for a type should only be declared in the +// same file and namespace as said type. +// +// The abstractions within this definition include: +// +// * An `absl::FormatConversionSpec` to specify the fields to pull from a +// user-defined type's format string +// * An `absl::FormatSink` to hold the converted string data during the +// conversion process. +// * An `absl::FormatConvertResult` to hold the status of the returned +// formatting operation +// +// The return type encodes all the conversion characters that your +// AbslFormatConvert() routine accepts. The return value should be {true}. +// A return value of {false} will result in `StrFormat()` returning +// an empty string. This result will be propagated to the result of +// `FormatUntyped`. +// +// Example: +// +// struct Point { +// // To add formatting support to `Point`, we simply need to add a free +// // (non-member) function `AbslFormatConvert()`. This method interprets +// // `spec` to print in the request format. The allowed conversion characters +// // can be restricted via the type of the result, in this example +// // string and integral formatting are allowed (but not, for instance +// // floating point characters like "%f"). You can add such a free function +// // using a friend declaration within the body of the class: +// friend absl::FormatConvertResult +// AbslFormatConvert(const Point& p, const absl::FormatConversionSpec& spec, +// absl::FormatSink* s) { +// if (spec.conversion_char() == absl::FormatConversionChar::s) { +// s->Append(absl::StrCat("x=", p.x, " y=", p.y)); +// } else { +// s->Append(absl::StrCat(p.x, ",", p.y)); +// } +// return {true}; +// } +// +// int x; +// int y; +// }; + +// clang-format off + +// FormatConversionChar +// +// Specifies the formatting character provided in the format string +// passed to `StrFormat()`. +enum class FormatConversionChar : uint8_t { + c, s, // text + d, i, o, u, x, X, // int + f, F, e, E, g, G, a, A, // float + n, p // misc +}; +// clang-format on + +// FormatConversionSpec +// +// Specifies modifications to the conversion of the format string, through use +// of one or more format flags in the source format string. +class FormatConversionSpec { + public: + // FormatConversionSpec::is_basic() + // + // Indicates that width and precision are not specified, and no additional + // flags are set for this conversion character in the format string. + bool is_basic() const { return impl_.is_basic(); } + + // FormatConversionSpec::has_left_flag() + // + // Indicates whether the result should be left justified for this conversion + // character in the format string. This flag is set through use of a '-' + // character in the format string. E.g. "%-s" + bool has_left_flag() const { return impl_.has_left_flag(); } + + // FormatConversionSpec::has_show_pos_flag() + // + // Indicates whether a sign column is prepended to the result for this + // conversion character in the format string, even if the result is positive. + // This flag is set through use of a '+' character in the format string. + // E.g. "%+d" + bool has_show_pos_flag() const { return impl_.has_show_pos_flag(); } + + // FormatConversionSpec::has_sign_col_flag() + // + // Indicates whether a mandatory sign column is added to the result for this + // conversion character. This flag is set through use of a space character + // (' ') in the format string. E.g. "% i" + bool has_sign_col_flag() const { return impl_.has_sign_col_flag(); } + + // FormatConversionSpec::has_alt_flag() + // + // Indicates whether an "alternate" format is applied to the result for this + // conversion character. Alternative forms depend on the type of conversion + // character, and unallowed alternatives are undefined. This flag is set + // through use of a '#' character in the format string. E.g. "%#h" + bool has_alt_flag() const { return impl_.has_alt_flag(); } + + // FormatConversionSpec::has_zero_flag() + // + // Indicates whether zeroes should be prepended to the result for this + // conversion character instead of spaces. This flag is set through use of the + // '0' character in the format string. E.g. "%0f" + bool has_zero_flag() const { return impl_.has_zero_flag(); } + + // FormatConversionSpec::conversion_char() + // + // Returns the underlying conversion character. + FormatConversionChar conversion_char() const { + return impl_.conversion_char(); + } + + // FormatConversionSpec::width() + // + // Returns the specified width (indicated through use of a non-zero integer + // value or '*' character) of the conversion character. If width is + // unspecified, it returns a negative value. + int width() const { return impl_.width(); } + + // FormatConversionSpec::precision() + // + // Returns the specified precision (through use of the '.' character followed + // by a non-zero integer value or '*' character) of the conversion character. + // If precision is unspecified, it returns a negative value. + int precision() const { return impl_.precision(); } + + private: + explicit FormatConversionSpec( + str_format_internal::FormatConversionSpecImpl impl) + : impl_(impl) {} + + friend str_format_internal::FormatConversionSpecImpl; + + absl::str_format_internal::FormatConversionSpecImpl impl_; +}; + +// Type safe OR operator for FormatConversionCharSet to allow accepting multiple +// conversion chars in custom format converters. +constexpr FormatConversionCharSet operator|(FormatConversionCharSet a, + FormatConversionCharSet b) { + return static_cast(static_cast(a) | + static_cast(b)); +} + +// FormatConversionCharSet +// +// Specifies the _accepted_ conversion types as a template parameter to +// FormatConvertResult for custom implementations of `AbslFormatConvert`. +// Note the helper predefined alias definitions (kIntegral, etc.) below. +enum class FormatConversionCharSet : uint64_t { + // text + c = str_format_internal::FormatConversionCharToConvInt('c'), + s = str_format_internal::FormatConversionCharToConvInt('s'), + // integer + d = str_format_internal::FormatConversionCharToConvInt('d'), + i = str_format_internal::FormatConversionCharToConvInt('i'), + o = str_format_internal::FormatConversionCharToConvInt('o'), + u = str_format_internal::FormatConversionCharToConvInt('u'), + x = str_format_internal::FormatConversionCharToConvInt('x'), + X = str_format_internal::FormatConversionCharToConvInt('X'), + // Float + f = str_format_internal::FormatConversionCharToConvInt('f'), + F = str_format_internal::FormatConversionCharToConvInt('F'), + e = str_format_internal::FormatConversionCharToConvInt('e'), + E = str_format_internal::FormatConversionCharToConvInt('E'), + g = str_format_internal::FormatConversionCharToConvInt('g'), + G = str_format_internal::FormatConversionCharToConvInt('G'), + a = str_format_internal::FormatConversionCharToConvInt('a'), + A = str_format_internal::FormatConversionCharToConvInt('A'), + // misc + n = str_format_internal::FormatConversionCharToConvInt('n'), + p = str_format_internal::FormatConversionCharToConvInt('p'), + + // Used for width/precision '*' specification. + kStar = static_cast( + absl::str_format_internal::FormatConversionCharSetInternal::kStar), + // Some predefined values: + kIntegral = d | i | u | o | x | X, + kFloating = a | e | f | g | A | E | F | G, + kNumeric = kIntegral | kFloating, + kString = s, + kPointer = p, +}; + +// FormatSink +// +// An abstraction to which conversions write their string data. +// +class FormatSink { + public: + // Appends `count` copies of `ch`. + void Append(size_t count, char ch) { sink_->Append(count, ch); } + + void Append(string_view v) { sink_->Append(v); } + + // Appends the first `precision` bytes of `v`. If this is less than + // `width`, spaces will be appended first (if `left` is false), or + // after (if `left` is true) to ensure the total amount appended is + // at least `width`. + bool PutPaddedString(string_view v, int width, int precision, bool left) { + return sink_->PutPaddedString(v, width, precision, left); + } + + private: + friend str_format_internal::FormatSinkImpl; + explicit FormatSink(str_format_internal::FormatSinkImpl* s) : sink_(s) {} + str_format_internal::FormatSinkImpl* sink_; +}; + +// FormatConvertResult +// +// Indicates whether a call to AbslFormatConvert() was successful. +// This return type informs the StrFormat extension framework (through +// ADL but using the return type) of what conversion characters are supported. +// It is strongly discouraged to return {false}, as this will result in an +// empty string in StrFormat. +template +struct FormatConvertResult { + bool value; +}; + ABSL_NAMESPACE_END } // namespace absl diff --git a/third_party/abseil_cpp/absl/strings/str_format_test.cc b/third_party/abseil_cpp/absl/strings/str_format_test.cc index 22cfef66d..c60027ad2 100644 --- a/third_party/abseil_cpp/absl/strings/str_format_test.cc +++ b/third_party/abseil_cpp/absl/strings/str_format_test.cc @@ -1,3 +1,16 @@ +// Copyright 2020 The Abseil 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 +// +// https://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 "absl/strings/str_format.h" @@ -16,7 +29,6 @@ namespace absl { ABSL_NAMESPACE_BEGIN namespace { using str_format_internal::FormatArgImpl; -using str_format_internal::FormatConversionCharSetInternal; using FormatEntryPointTest = ::testing::Test; @@ -537,46 +549,90 @@ TEST_F(ParsedFormatTest, SimpleUncheckedIncorrect) { EXPECT_FALSE((ParsedFormat<'s', 'd', 'g'>::New(format))); } -using absl::str_format_internal::FormatConversionCharSet; +#if defined(__cpp_nontype_template_parameter_auto) + +template +std::true_type IsValidParsedFormatArgTest(ParsedFormat*); + +template +std::false_type IsValidParsedFormatArgTest(...); + +template +using IsValidParsedFormatArg = decltype(IsValidParsedFormatArgTest(nullptr)); + +TEST_F(ParsedFormatTest, OnlyValidTypesAllowed) { + ASSERT_TRUE(IsValidParsedFormatArg<'c'>::value); + + ASSERT_TRUE(IsValidParsedFormatArg::value); + + ASSERT_TRUE(IsValidParsedFormatArg::value); + ASSERT_TRUE( + IsValidParsedFormatArg::value); + + // This is an easy mistake to make, however, this will reduce to an integer + // which has no meaning, so we need to ensure it doesn't compile. + ASSERT_FALSE(IsValidParsedFormatArg<'x' | 'd'>::value); + + // For now, we disallow construction based on ConversionChar (rather than + // CharSet) + ASSERT_FALSE(IsValidParsedFormatArg::value); +} + +TEST_F(ParsedFormatTest, ExtendedTyping) { + EXPECT_FALSE(ParsedFormat::New("")); + ASSERT_TRUE(ParsedFormat::New("%d")); + auto v1 = ParsedFormat<'d', absl::FormatConversionCharSet::s>::New("%d%s"); + ASSERT_TRUE(v1); + auto v2 = ParsedFormat::New("%d%s"); + ASSERT_TRUE(v2); + auto v3 = ParsedFormat::New("%d%s"); + ASSERT_TRUE(v3); + auto v4 = ParsedFormat::New("%s%s"); + ASSERT_TRUE(v4); +} +#endif TEST_F(ParsedFormatTest, UncheckedCorrect) { auto f = - ExtendedParsedFormat::New("ABC%dDEF"); + ExtendedParsedFormat::New("ABC%dDEF"); ASSERT_TRUE(f); EXPECT_EQ("[ABC]{d:1$d}[DEF]", SummarizeParsedFormat(*f)); std::string format = "%sFFF%dZZZ%f"; auto f2 = ExtendedParsedFormat< - FormatConversionCharSetInternal::kString, - FormatConversionCharSetInternal::d, - FormatConversionCharSetInternal::kFloating>::New(format); + absl::FormatConversionCharSet::kString, absl::FormatConversionCharSet::d, + absl::FormatConversionCharSet::kFloating>::New(format); ASSERT_TRUE(f2); EXPECT_EQ("{s:1$s}[FFF]{d:2$d}[ZZZ]{f:3$f}", SummarizeParsedFormat(*f2)); f2 = ExtendedParsedFormat< - FormatConversionCharSetInternal::kString, - FormatConversionCharSetInternal::d, - FormatConversionCharSetInternal::kFloating>::New("%s %d %f"); + absl::FormatConversionCharSet::kString, absl::FormatConversionCharSet::d, + absl::FormatConversionCharSet::kFloating>::New("%s %d %f"); ASSERT_TRUE(f2); EXPECT_EQ("{s:1$s}[ ]{d:2$d}[ ]{f:3$f}", SummarizeParsedFormat(*f2)); auto star = - ExtendedParsedFormat::New("%*d"); + ExtendedParsedFormat::New("%*d"); ASSERT_TRUE(star); EXPECT_EQ("{*d:2$1$*d}", SummarizeParsedFormat(*star)); - auto dollar = ExtendedParsedFormat< - FormatConversionCharSetInternal::d, - FormatConversionCharSetInternal::s>::New("%2$s %1$d"); + auto dollar = + ExtendedParsedFormat::New("%2$s %1$d"); ASSERT_TRUE(dollar); EXPECT_EQ("{2$s:2$s}[ ]{1$d:1$d}", SummarizeParsedFormat(*dollar)); // with reuse dollar = ExtendedParsedFormat< - FormatConversionCharSetInternal::d, - FormatConversionCharSetInternal::s>::New("%2$s %1$d %1$d"); + absl::FormatConversionCharSet::d, + absl::FormatConversionCharSet::s>::New("%2$s %1$d %1$d"); ASSERT_TRUE(dollar); EXPECT_EQ("{2$s:2$s}[ ]{1$d:1$d}[ ]{1$d:1$d}", SummarizeParsedFormat(*dollar)); @@ -584,62 +640,61 @@ TEST_F(ParsedFormatTest, UncheckedCorrect) { TEST_F(ParsedFormatTest, UncheckedIgnoredArgs) { EXPECT_FALSE( - (ExtendedParsedFormat::New("ABC"))); + (ExtendedParsedFormat::New("ABC"))); EXPECT_FALSE( - (ExtendedParsedFormat::New("%dABC"))); - EXPECT_FALSE((ExtendedParsedFormat< - FormatConversionCharSetInternal::d, - FormatConversionCharSetInternal::s>::New("ABC%2$s"))); + (ExtendedParsedFormat::New("%dABC"))); + EXPECT_FALSE( + (ExtendedParsedFormat::New("ABC%2$s"))); auto f = ExtendedParsedFormat< - FormatConversionCharSetInternal::d, - FormatConversionCharSetInternal::s>::NewAllowIgnored("ABC"); + absl::FormatConversionCharSet::d, + absl::FormatConversionCharSet::s>::NewAllowIgnored("ABC"); ASSERT_TRUE(f); EXPECT_EQ("[ABC]", SummarizeParsedFormat(*f)); f = ExtendedParsedFormat< - FormatConversionCharSetInternal::d, - FormatConversionCharSetInternal::s>::NewAllowIgnored("%dABC"); + absl::FormatConversionCharSet::d, + absl::FormatConversionCharSet::s>::NewAllowIgnored("%dABC"); ASSERT_TRUE(f); EXPECT_EQ("{d:1$d}[ABC]", SummarizeParsedFormat(*f)); f = ExtendedParsedFormat< - FormatConversionCharSetInternal::d, - FormatConversionCharSetInternal::s>::NewAllowIgnored("ABC%2$s"); + absl::FormatConversionCharSet::d, + absl::FormatConversionCharSet::s>::NewAllowIgnored("ABC%2$s"); ASSERT_TRUE(f); EXPECT_EQ("[ABC]{2$s:2$s}", SummarizeParsedFormat(*f)); } TEST_F(ParsedFormatTest, UncheckedMultipleTypes) { - auto dx = ExtendedParsedFormat< - FormatConversionCharSetInternal::d | - FormatConversionCharSetInternal::x>::New("%1$d %1$x"); + auto dx = + ExtendedParsedFormat::New("%1$d %1$x"); EXPECT_TRUE(dx); EXPECT_EQ("{1$d:1$d}[ ]{1$x:1$x}", SummarizeParsedFormat(*dx)); - dx = ExtendedParsedFormat::New("%1$d"); + dx = ExtendedParsedFormat::New("%1$d"); EXPECT_TRUE(dx); EXPECT_EQ("{1$d:1$d}", SummarizeParsedFormat(*dx)); } TEST_F(ParsedFormatTest, UncheckedIncorrect) { - EXPECT_FALSE( - ExtendedParsedFormat::New("")); + EXPECT_FALSE(ExtendedParsedFormat::New("")); - EXPECT_FALSE(ExtendedParsedFormat::New( + EXPECT_FALSE(ExtendedParsedFormat::New( "ABC%dDEF%d")); std::string format = "%sFFF%dZZZ%f"; EXPECT_FALSE( - (ExtendedParsedFormat::New(format))); + (ExtendedParsedFormat::New(format))); } TEST_F(ParsedFormatTest, RegressionMixPositional) { - EXPECT_FALSE((ExtendedParsedFormat< - FormatConversionCharSetInternal::d, - FormatConversionCharSetInternal::o>::New("%1$d %o"))); + EXPECT_FALSE( + (ExtendedParsedFormat::New("%1$d %o"))); } using FormatWrapperTest = ::testing::Test; @@ -664,6 +719,38 @@ TEST_F(FormatWrapperTest, ParsedFormat) { ABSL_NAMESPACE_END } // namespace absl +using FormatExtensionTest = ::testing::Test; + +struct Point { + friend absl::FormatConvertResult + AbslFormatConvert(const Point& p, const absl::FormatConversionSpec& spec, + absl::FormatSink* s) { + if (spec.conversion_char() == absl::FormatConversionChar::s) { + s->Append(absl::StrCat("x=", p.x, " y=", p.y)); + } else { + s->Append(absl::StrCat(p.x, ",", p.y)); + } + return {true}; + } + + int x = 10; + int y = 20; +}; + +TEST_F(FormatExtensionTest, AbslFormatConvertExample) { + Point p; + EXPECT_EQ(absl::StrFormat("a %s z", p), "a x=10 y=20 z"); + EXPECT_EQ(absl::StrFormat("a %d z", p), "a 10,20 z"); + + // Typed formatting will fail to compile an invalid format. + // StrFormat("%f", p); // Does not compile. + std::string actual; + absl::UntypedFormatSpec f1("%f"); + // FormatUntyped will return false for bad character. + EXPECT_FALSE(absl::FormatUntyped(&actual, f1, {absl::FormatArg(p)})); +} + // Some codegen thunks that we can use to easily dump the generated assembly for // different StrFormat calls. diff --git a/third_party/abseil_cpp/absl/strings/str_split.h b/third_party/abseil_cpp/absl/strings/str_split.h index 1ce17f38a..bfbca422a 100644 --- a/third_party/abseil_cpp/absl/strings/str_split.h +++ b/third_party/abseil_cpp/absl/strings/str_split.h @@ -369,6 +369,12 @@ struct SkipWhitespace { } }; +template +using EnableSplitIfString = + typename std::enable_if::value || + std::is_same::value, + int>::type; + //------------------------------------------------------------------------------ // StrSplit() //------------------------------------------------------------------------------ @@ -489,22 +495,50 @@ struct SkipWhitespace { // Try not to depend on this distinction because the bug may one day be fixed. template strings_internal::Splitter< - typename strings_internal::SelectDelimiter::type, AllowEmpty> + typename strings_internal::SelectDelimiter::type, AllowEmpty, + absl::string_view> StrSplit(strings_internal::ConvertibleToStringView text, Delimiter d) { using DelimiterType = typename strings_internal::SelectDelimiter::type; - return strings_internal::Splitter( + return strings_internal::Splitter( + text.value(), DelimiterType(d), AllowEmpty()); +} + +template = 0> +strings_internal::Splitter< + typename strings_internal::SelectDelimiter::type, AllowEmpty, + std::string> +StrSplit(StringType&& text, Delimiter d) { + using DelimiterType = + typename strings_internal::SelectDelimiter::type; + return strings_internal::Splitter( std::move(text), DelimiterType(d), AllowEmpty()); } template strings_internal::Splitter< - typename strings_internal::SelectDelimiter::type, Predicate> + typename strings_internal::SelectDelimiter::type, Predicate, + absl::string_view> StrSplit(strings_internal::ConvertibleToStringView text, Delimiter d, Predicate p) { using DelimiterType = typename strings_internal::SelectDelimiter::type; - return strings_internal::Splitter( + return strings_internal::Splitter( + text.value(), DelimiterType(d), std::move(p)); +} + +template = 0> +strings_internal::Splitter< + typename strings_internal::SelectDelimiter::type, Predicate, + std::string> +StrSplit(StringType&& text, Delimiter d, Predicate p) { + using DelimiterType = + typename strings_internal::SelectDelimiter::type; + return strings_internal::Splitter( std::move(text), DelimiterType(d), std::move(p)); } diff --git a/third_party/abseil_cpp/absl/strings/str_split_test.cc b/third_party/abseil_cpp/absl/strings/str_split_test.cc index fcd58d2ee..7f7c097fa 100644 --- a/third_party/abseil_cpp/absl/strings/str_split_test.cc +++ b/third_party/abseil_cpp/absl/strings/str_split_test.cc @@ -27,7 +27,7 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" -#include "absl/base/dynamic_annotations.h" // for RunningOnValgrind +#include "absl/base/dynamic_annotations.h" #include "absl/base/macros.h" #include "absl/container/flat_hash_map.h" #include "absl/container/node_hash_map.h" @@ -367,7 +367,7 @@ TEST(SplitIterator, EqualityAsEndCondition) { TEST(Splitter, RangeIterators) { auto splitter = absl::StrSplit("a,b,c", ','); std::vector output; - for (const absl::string_view p : splitter) { + for (const absl::string_view& p : splitter) { output.push_back(p); } EXPECT_THAT(output, ElementsAre("a", "b", "c")); diff --git a/third_party/abseil_cpp/absl/strings/string_view.h b/third_party/abseil_cpp/absl/strings/string_view.h index 8a9db8c3d..5260b5b73 100644 --- a/third_party/abseil_cpp/absl/strings/string_view.h +++ b/third_party/abseil_cpp/absl/strings/string_view.h @@ -111,6 +111,11 @@ ABSL_NAMESPACE_BEGIN // example, when splitting a string, `std::vector` is a // natural data type for the output. // +// For another example, a Cord is a non-contiguous, potentially very +// long string-like object. The Cord class has an interface that iteratively +// provides string_view objects that point to the successive pieces of a Cord +// object. +// // When constructed from a source which is NUL-terminated, the `string_view` // itself will not include the NUL-terminator unless a specific size (including // the NUL) is passed to the constructor. As a result, common idioms that work @@ -382,6 +387,7 @@ class string_view { // Returns a "substring" of the `string_view` (at offset `pos` and length // `n`) as another string_view. This function throws `std::out_of_bounds` if // `pos > size`. + // Use absl::ClippedSubstr if you need a truncating substr operation. constexpr string_view substr(size_type pos, size_type n = npos) const { return ABSL_PREDICT_FALSE(pos > length_) ? (base_internal::ThrowStdOutOfRange( diff --git a/third_party/abseil_cpp/absl/strings/string_view_test.cc b/third_party/abseil_cpp/absl/strings/string_view_test.cc index ff31b51e8..dcebb1500 100644 --- a/third_party/abseil_cpp/absl/strings/string_view_test.cc +++ b/third_party/abseil_cpp/absl/strings/string_view_test.cc @@ -1177,9 +1177,9 @@ TEST(FindOneCharTest, EdgeCases) { EXPECT_EQ(absl::string_view::npos, a.rfind('x')); } -#ifndef THREAD_SANITIZER // Allocates too much memory for tsan. +#ifndef ABSL_HAVE_THREAD_SANITIZER // Allocates too much memory for tsan. TEST(HugeStringView, TwoPointTwoGB) { - if (sizeof(size_t) <= 4 || RunningOnValgrind()) + if (sizeof(size_t) <= 4) return; // Try a huge string piece. const size_t size = size_t{2200} * 1000 * 1000; @@ -1191,7 +1191,7 @@ TEST(HugeStringView, TwoPointTwoGB) { sp.remove_suffix(2); EXPECT_EQ(size - 1 - 2, sp.length()); } -#endif // THREAD_SANITIZER +#endif // ABSL_HAVE_THREAD_SANITIZER #if !defined(NDEBUG) && !defined(ABSL_USES_STD_STRING_VIEW) TEST(NonNegativeLenTest, NonNegativeLen) { diff --git a/third_party/abseil_cpp/absl/synchronization/BUILD.bazel b/third_party/abseil_cpp/absl/synchronization/BUILD.bazel index 3f876b9fd..cd4009a15 100644 --- a/third_party/abseil_cpp/absl/synchronization/BUILD.bazel +++ b/third_party/abseil_cpp/absl/synchronization/BUILD.bazel @@ -24,7 +24,7 @@ load( package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) # Internal data structure for efficiently detecting mutex dependency cycles cc_library( @@ -73,15 +73,14 @@ cc_library( "internal/create_thread_identity.cc", "internal/per_thread_sem.cc", "internal/waiter.cc", + "mutex.cc", "notification.cc", - ] + select({ - "//conditions:default": ["mutex.cc"], - }), + ], hdrs = [ "barrier.h", "blocking_counter.h", "internal/create_thread_identity.h", - "internal/mutex_nonprod.inc", + "internal/futex.h", "internal/per_thread_sem.h", "internal/waiter.h", "mutex.h", @@ -90,6 +89,7 @@ cc_library( copts = ABSL_DEFAULT_COPTS, linkopts = select({ "//absl:windows": [], + "//absl:wasm": [], "//conditions:default": ["-pthread"], }) + ABSL_DEFAULT_LINKOPTS, deps = [ @@ -189,6 +189,7 @@ cc_test( ":synchronization", ":thread_pool", "//absl/base", + "//absl/base:config", "//absl/base:core_headers", "//absl/base:raw_logging_internal", "//absl/memory", @@ -210,6 +211,7 @@ cc_library( ":synchronization", ":thread_pool", "//absl/base", + "//absl/base:config", "@com_github_google_benchmark//:benchmark_main", ], alwayslink = 1, @@ -248,6 +250,7 @@ cc_library( deps = [ ":synchronization", "//absl/base", + "//absl/base:config", "//absl/strings", "//absl/time", "@com_google_googletest//:gtest", diff --git a/third_party/abseil_cpp/absl/synchronization/CMakeLists.txt b/third_party/abseil_cpp/absl/synchronization/CMakeLists.txt index dfe5d05df..e633d0bf5 100644 --- a/third_party/abseil_cpp/absl/synchronization/CMakeLists.txt +++ b/third_party/abseil_cpp/absl/synchronization/CMakeLists.txt @@ -52,7 +52,7 @@ absl_cc_library( "barrier.h" "blocking_counter.h" "internal/create_thread_identity.h" - "internal/mutex_nonprod.inc" + "internal/futex.h" "internal/per_thread_sem.h" "internal/waiter.h" "mutex.h" @@ -149,6 +149,7 @@ absl_cc_test( absl::synchronization absl::thread_pool absl::base + absl::config absl::core_headers absl::memory absl::raw_logging_internal @@ -179,6 +180,7 @@ absl_cc_library( DEPS absl::synchronization absl::base + absl::config absl::strings absl::time gmock diff --git a/third_party/abseil_cpp/absl/synchronization/internal/futex.h b/third_party/abseil_cpp/absl/synchronization/internal/futex.h new file mode 100644 index 000000000..06fbd6d07 --- /dev/null +++ b/third_party/abseil_cpp/absl/synchronization/internal/futex.h @@ -0,0 +1,154 @@ +// Copyright 2020 The Abseil 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 +// +// https://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 ABSL_SYNCHRONIZATION_INTERNAL_FUTEX_H_ +#define ABSL_SYNCHRONIZATION_INTERNAL_FUTEX_H_ + +#include "absl/base/config.h" + +#ifdef _WIN32 +#include +#else +#include +#include +#endif + +#ifdef __linux__ +#include +#include +#endif + +#include +#include +#include + +#include +#include + +#include "absl/base/optimization.h" +#include "absl/synchronization/internal/kernel_timeout.h" + +#ifdef ABSL_INTERNAL_HAVE_FUTEX +#error ABSL_INTERNAL_HAVE_FUTEX may not be set on the command line +#elif defined(__BIONIC__) +// Bionic supports all the futex operations we need even when some of the futex +// definitions are missing. +#define ABSL_INTERNAL_HAVE_FUTEX +#elif defined(__linux__) && defined(FUTEX_CLOCK_REALTIME) +// FUTEX_CLOCK_REALTIME requires Linux >= 2.6.28. +#define ABSL_INTERNAL_HAVE_FUTEX +#endif + +#ifdef ABSL_INTERNAL_HAVE_FUTEX + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace synchronization_internal { + +// Some Android headers are missing these definitions even though they +// support these futex operations. +#ifdef __BIONIC__ +#ifndef SYS_futex +#define SYS_futex __NR_futex +#endif +#ifndef FUTEX_WAIT_BITSET +#define FUTEX_WAIT_BITSET 9 +#endif +#ifndef FUTEX_PRIVATE_FLAG +#define FUTEX_PRIVATE_FLAG 128 +#endif +#ifndef FUTEX_CLOCK_REALTIME +#define FUTEX_CLOCK_REALTIME 256 +#endif +#ifndef FUTEX_BITSET_MATCH_ANY +#define FUTEX_BITSET_MATCH_ANY 0xFFFFFFFF +#endif +#endif + +#if defined(__NR_futex_time64) && !defined(SYS_futex_time64) +#define SYS_futex_time64 __NR_futex_time64 +#endif + +#if defined(SYS_futex_time64) && !defined(SYS_futex) +#define SYS_futex SYS_futex_time64 +#endif + +class FutexImpl { + public: + static int WaitUntil(std::atomic *v, int32_t val, + KernelTimeout t) { + int err = 0; + if (t.has_timeout()) { + // https://locklessinc.com/articles/futex_cheat_sheet/ + // Unlike FUTEX_WAIT, FUTEX_WAIT_BITSET uses absolute time. + struct timespec abs_timeout = t.MakeAbsTimespec(); + // Atomically check that the futex value is still 0, and if it + // is, sleep until abs_timeout or until woken by FUTEX_WAKE. + err = syscall( + SYS_futex, reinterpret_cast(v), + FUTEX_WAIT_BITSET | FUTEX_PRIVATE_FLAG | FUTEX_CLOCK_REALTIME, val, + &abs_timeout, nullptr, FUTEX_BITSET_MATCH_ANY); + } else { + // Atomically check that the futex value is still 0, and if it + // is, sleep until woken by FUTEX_WAKE. + err = syscall(SYS_futex, reinterpret_cast(v), + FUTEX_WAIT | FUTEX_PRIVATE_FLAG, val, nullptr); + } + if (ABSL_PREDICT_FALSE(err != 0)) { + err = -errno; + } + return err; + } + + static int WaitBitsetAbsoluteTimeout(std::atomic *v, int32_t val, + int32_t bits, + const struct timespec *abstime) { + int err = syscall(SYS_futex, reinterpret_cast(v), + FUTEX_WAIT_BITSET | FUTEX_PRIVATE_FLAG, val, abstime, + nullptr, bits); + if (ABSL_PREDICT_FALSE(err != 0)) { + err = -errno; + } + return err; + } + + static int Wake(std::atomic *v, int32_t count) { + int err = syscall(SYS_futex, reinterpret_cast(v), + FUTEX_WAKE | FUTEX_PRIVATE_FLAG, count); + if (ABSL_PREDICT_FALSE(err < 0)) { + err = -errno; + } + return err; + } + + // FUTEX_WAKE_BITSET + static int WakeBitset(std::atomic *v, int32_t count, int32_t bits) { + int err = syscall(SYS_futex, reinterpret_cast(v), + FUTEX_WAKE_BITSET | FUTEX_PRIVATE_FLAG, count, nullptr, + nullptr, bits); + if (ABSL_PREDICT_FALSE(err < 0)) { + err = -errno; + } + return err; + } +}; + +class Futex : public FutexImpl {}; + +} // namespace synchronization_internal +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_INTERNAL_HAVE_FUTEX + +#endif // ABSL_SYNCHRONIZATION_INTERNAL_FUTEX_H_ diff --git a/third_party/abseil_cpp/absl/synchronization/internal/graphcycles.cc b/third_party/abseil_cpp/absl/synchronization/internal/graphcycles.cc index 19f9aab5b..27fec2168 100644 --- a/third_party/abseil_cpp/absl/synchronization/internal/graphcycles.cc +++ b/third_party/abseil_cpp/absl/synchronization/internal/graphcycles.cc @@ -37,6 +37,7 @@ #include #include +#include #include "absl/base/internal/hide_ptr.h" #include "absl/base/internal/raw_logging.h" #include "absl/base/internal/spinlock.h" diff --git a/third_party/abseil_cpp/absl/synchronization/internal/kernel_timeout.h b/third_party/abseil_cpp/absl/synchronization/internal/kernel_timeout.h index d6ac5db0a..bbd4d2d70 100644 --- a/third_party/abseil_cpp/absl/synchronization/internal/kernel_timeout.h +++ b/third_party/abseil_cpp/absl/synchronization/internal/kernel_timeout.h @@ -26,6 +26,7 @@ #define ABSL_SYNCHRONIZATION_INTERNAL_KERNEL_TIMEOUT_H_ #include + #include #include @@ -57,6 +58,10 @@ class KernelTimeout { bool has_timeout() const { return ns_ != 0; } + // Convert to parameter for sem_timedwait/futex/similar. Only for approved + // users. Do not call if !has_timeout. + struct timespec MakeAbsTimespec(); + private: // internal rep, not user visible: ns after unix epoch. // zero = no timeout. @@ -82,34 +87,6 @@ class KernelTimeout { return x; } - // Convert to parameter for sem_timedwait/futex/similar. Only for approved - // users. Do not call if !has_timeout. - struct timespec MakeAbsTimespec() { - int64_t n = ns_; - static const int64_t kNanosPerSecond = 1000 * 1000 * 1000; - if (n == 0) { - ABSL_RAW_LOG( - ERROR, - "Tried to create a timespec from a non-timeout; never do this."); - // But we'll try to continue sanely. no-timeout ~= saturated timeout. - n = (std::numeric_limits::max)(); - } - - // Kernel APIs validate timespecs as being at or after the epoch, - // despite the kernel time type being signed. However, no one can - // tell the difference between a timeout at or before the epoch (since - // all such timeouts have expired!) - if (n < 0) n = 0; - - struct timespec abstime; - int64_t seconds = (std::min)(n / kNanosPerSecond, - int64_t{(std::numeric_limits::max)()}); - abstime.tv_sec = static_cast(seconds); - abstime.tv_nsec = - static_cast(n % kNanosPerSecond); - return abstime; - } - #ifdef _WIN32 // Converts to milliseconds from now, or INFINITE when // !has_timeout(). For use by SleepConditionVariableSRW on @@ -148,6 +125,30 @@ class KernelTimeout { friend class Waiter; }; +inline struct timespec KernelTimeout::MakeAbsTimespec() { + int64_t n = ns_; + static const int64_t kNanosPerSecond = 1000 * 1000 * 1000; + if (n == 0) { + ABSL_RAW_LOG( + ERROR, "Tried to create a timespec from a non-timeout; never do this."); + // But we'll try to continue sanely. no-timeout ~= saturated timeout. + n = (std::numeric_limits::max)(); + } + + // Kernel APIs validate timespecs as being at or after the epoch, + // despite the kernel time type being signed. However, no one can + // tell the difference between a timeout at or before the epoch (since + // all such timeouts have expired!) + if (n < 0) n = 0; + + struct timespec abstime; + int64_t seconds = (std::min)(n / kNanosPerSecond, + int64_t{(std::numeric_limits::max)()}); + abstime.tv_sec = static_cast(seconds); + abstime.tv_nsec = static_cast(n % kNanosPerSecond); + return abstime; +} + } // namespace synchronization_internal ABSL_NAMESPACE_END } // namespace absl diff --git a/third_party/abseil_cpp/absl/synchronization/internal/mutex_nonprod.cc b/third_party/abseil_cpp/absl/synchronization/internal/mutex_nonprod.cc deleted file mode 100644 index 1732f8365..000000000 --- a/third_party/abseil_cpp/absl/synchronization/internal/mutex_nonprod.cc +++ /dev/null @@ -1,324 +0,0 @@ -// Copyright 2017 The Abseil 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 -// -// https://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. - -// Implementation of a small subset of Mutex and CondVar functionality -// for platforms where the production implementation hasn't been fully -// ported yet. - -#include "absl/synchronization/mutex.h" - -#if defined(_WIN32) -#include // NOLINT(build/c++11) -#else -#include -#include -#endif - -#include - -#include "absl/base/internal/raw_logging.h" -#include "absl/time/time.h" - -namespace absl { -ABSL_NAMESPACE_BEGIN - -void SetMutexDeadlockDetectionMode(OnDeadlockCycle) {} -void EnableMutexInvariantDebugging(bool) {} - -namespace synchronization_internal { - -namespace { - -// Return the current time plus the timeout. -absl::Time DeadlineFromTimeout(absl::Duration timeout) { - return absl::Now() + timeout; -} - -// Limit the deadline to a positive, 32-bit time_t value to accommodate -// implementation restrictions. This also deals with InfinitePast and -// InfiniteFuture. -absl::Time LimitedDeadline(absl::Time deadline) { - deadline = std::max(absl::FromTimeT(0), deadline); - deadline = std::min(deadline, absl::FromTimeT(0x7fffffff)); - return deadline; -} - -} // namespace - -#if defined(_WIN32) - -MutexImpl::MutexImpl() {} - -MutexImpl::~MutexImpl() { - if (locked_) { - std_mutex_.unlock(); - } -} - -void MutexImpl::Lock() { - std_mutex_.lock(); - locked_ = true; -} - -bool MutexImpl::TryLock() { - bool locked = std_mutex_.try_lock(); - if (locked) locked_ = true; - return locked; -} - -void MutexImpl::Unlock() { - locked_ = false; - released_.SignalAll(); - std_mutex_.unlock(); -} - -CondVarImpl::CondVarImpl() {} - -CondVarImpl::~CondVarImpl() {} - -void CondVarImpl::Signal() { std_cv_.notify_one(); } - -void CondVarImpl::SignalAll() { std_cv_.notify_all(); } - -void CondVarImpl::Wait(MutexImpl* mu) { - mu->released_.SignalAll(); - std_cv_.wait(mu->std_mutex_); -} - -bool CondVarImpl::WaitWithDeadline(MutexImpl* mu, absl::Time deadline) { - mu->released_.SignalAll(); - time_t when = ToTimeT(deadline); - int64_t nanos = ToInt64Nanoseconds(deadline - absl::FromTimeT(when)); - std::chrono::system_clock::time_point deadline_tp = - std::chrono::system_clock::from_time_t(when) + - std::chrono::duration_cast( - std::chrono::nanoseconds(nanos)); - auto deadline_since_epoch = - std::chrono::duration_cast>( - deadline_tp - std::chrono::system_clock::from_time_t(0)); - return std_cv_.wait_until(mu->std_mutex_, deadline_tp) == - std::cv_status::timeout; -} - -#else // ! _WIN32 - -MutexImpl::MutexImpl() { - ABSL_RAW_CHECK(pthread_mutex_init(&pthread_mutex_, nullptr) == 0, - "pthread error"); -} - -MutexImpl::~MutexImpl() { - if (locked_) { - ABSL_RAW_CHECK(pthread_mutex_unlock(&pthread_mutex_) == 0, "pthread error"); - } - ABSL_RAW_CHECK(pthread_mutex_destroy(&pthread_mutex_) == 0, "pthread error"); -} - -void MutexImpl::Lock() { - ABSL_RAW_CHECK(pthread_mutex_lock(&pthread_mutex_) == 0, "pthread error"); - locked_ = true; -} - -bool MutexImpl::TryLock() { - bool locked = (0 == pthread_mutex_trylock(&pthread_mutex_)); - if (locked) locked_ = true; - return locked; -} - -void MutexImpl::Unlock() { - locked_ = false; - released_.SignalAll(); - ABSL_RAW_CHECK(pthread_mutex_unlock(&pthread_mutex_) == 0, "pthread error"); -} - -CondVarImpl::CondVarImpl() { - ABSL_RAW_CHECK(pthread_cond_init(&pthread_cv_, nullptr) == 0, - "pthread error"); -} - -CondVarImpl::~CondVarImpl() { - ABSL_RAW_CHECK(pthread_cond_destroy(&pthread_cv_) == 0, "pthread error"); -} - -void CondVarImpl::Signal() { - ABSL_RAW_CHECK(pthread_cond_signal(&pthread_cv_) == 0, "pthread error"); -} - -void CondVarImpl::SignalAll() { - ABSL_RAW_CHECK(pthread_cond_broadcast(&pthread_cv_) == 0, "pthread error"); -} - -void CondVarImpl::Wait(MutexImpl* mu) { - mu->released_.SignalAll(); - ABSL_RAW_CHECK(pthread_cond_wait(&pthread_cv_, &mu->pthread_mutex_) == 0, - "pthread error"); -} - -bool CondVarImpl::WaitWithDeadline(MutexImpl* mu, absl::Time deadline) { - mu->released_.SignalAll(); - struct timespec ts = ToTimespec(deadline); - int rc = pthread_cond_timedwait(&pthread_cv_, &mu->pthread_mutex_, &ts); - if (rc == ETIMEDOUT) return true; - ABSL_RAW_CHECK(rc == 0, "pthread error"); - return false; -} - -#endif // ! _WIN32 - -void MutexImpl::Await(const Condition& cond) { - if (cond.Eval()) return; - released_.SignalAll(); - do { - released_.Wait(this); - } while (!cond.Eval()); -} - -bool MutexImpl::AwaitWithDeadline(const Condition& cond, absl::Time deadline) { - if (cond.Eval()) return true; - released_.SignalAll(); - while (true) { - if (released_.WaitWithDeadline(this, deadline)) return false; - if (cond.Eval()) return true; - } -} - -} // namespace synchronization_internal - -Mutex::Mutex() {} - -Mutex::~Mutex() {} - -void Mutex::Lock() { impl()->Lock(); } - -void Mutex::Unlock() { impl()->Unlock(); } - -bool Mutex::TryLock() { return impl()->TryLock(); } - -void Mutex::ReaderLock() { Lock(); } - -void Mutex::ReaderUnlock() { Unlock(); } - -void Mutex::Await(const Condition& cond) { impl()->Await(cond); } - -void Mutex::LockWhen(const Condition& cond) { - Lock(); - Await(cond); -} - -bool Mutex::AwaitWithDeadline(const Condition& cond, absl::Time deadline) { - return impl()->AwaitWithDeadline( - cond, synchronization_internal::LimitedDeadline(deadline)); -} - -bool Mutex::AwaitWithTimeout(const Condition& cond, absl::Duration timeout) { - return AwaitWithDeadline( - cond, synchronization_internal::DeadlineFromTimeout(timeout)); -} - -bool Mutex::LockWhenWithDeadline(const Condition& cond, absl::Time deadline) { - Lock(); - return AwaitWithDeadline(cond, deadline); -} - -bool Mutex::LockWhenWithTimeout(const Condition& cond, absl::Duration timeout) { - return LockWhenWithDeadline( - cond, synchronization_internal::DeadlineFromTimeout(timeout)); -} - -void Mutex::ReaderLockWhen(const Condition& cond) { - ReaderLock(); - Await(cond); -} - -bool Mutex::ReaderLockWhenWithTimeout(const Condition& cond, - absl::Duration timeout) { - return LockWhenWithTimeout(cond, timeout); -} -bool Mutex::ReaderLockWhenWithDeadline(const Condition& cond, - absl::Time deadline) { - return LockWhenWithDeadline(cond, deadline); -} - -void Mutex::EnableDebugLog(const char*) {} -void Mutex::EnableInvariantDebugging(void (*)(void*), void*) {} -void Mutex::ForgetDeadlockInfo() {} -void Mutex::AssertHeld() const {} -void Mutex::AssertReaderHeld() const {} -void Mutex::AssertNotHeld() const {} - -CondVar::CondVar() {} - -CondVar::~CondVar() {} - -void CondVar::Signal() { impl()->Signal(); } - -void CondVar::SignalAll() { impl()->SignalAll(); } - -void CondVar::Wait(Mutex* mu) { return impl()->Wait(mu->impl()); } - -bool CondVar::WaitWithDeadline(Mutex* mu, absl::Time deadline) { - return impl()->WaitWithDeadline( - mu->impl(), synchronization_internal::LimitedDeadline(deadline)); -} - -bool CondVar::WaitWithTimeout(Mutex* mu, absl::Duration timeout) { - return WaitWithDeadline(mu, absl::Now() + timeout); -} - -void CondVar::EnableDebugLog(const char*) {} - -#ifdef THREAD_SANITIZER -extern "C" void __tsan_read1(void *addr); -#else -#define __tsan_read1(addr) // do nothing if TSan not enabled -#endif - -// A function that just returns its argument, dereferenced -static bool Dereference(void *arg) { - // ThreadSanitizer does not instrument this file for memory accesses. - // This function dereferences a user variable that can participate - // in a data race, so we need to manually tell TSan about this memory access. - __tsan_read1(arg); - return *(static_cast(arg)); -} - -Condition::Condition() {} // null constructor, used for kTrue only -const Condition Condition::kTrue; - -Condition::Condition(bool (*func)(void *), void *arg) - : eval_(&CallVoidPtrFunction), - function_(func), - method_(nullptr), - arg_(arg) {} - -bool Condition::CallVoidPtrFunction(const Condition *c) { - return (*c->function_)(c->arg_); -} - -Condition::Condition(const bool *cond) - : eval_(CallVoidPtrFunction), - function_(Dereference), - method_(nullptr), - // const_cast is safe since Dereference does not modify arg - arg_(const_cast(cond)) {} - -bool Condition::Eval() const { - // eval_ == null for kTrue - return (this->eval_ == nullptr) || (*this->eval_)(this); -} - -void RegisterSymbolizer(bool (*)(const void*, char*, int)) {} - -ABSL_NAMESPACE_END -} // namespace absl diff --git a/third_party/abseil_cpp/absl/synchronization/internal/mutex_nonprod.inc b/third_party/abseil_cpp/absl/synchronization/internal/mutex_nonprod.inc deleted file mode 100644 index d83bc8a94..000000000 --- a/third_party/abseil_cpp/absl/synchronization/internal/mutex_nonprod.inc +++ /dev/null @@ -1,249 +0,0 @@ -// Do not include. This is an implementation detail of base/mutex.h. -// -// Declares three classes: -// -// base::internal::MutexImpl - implementation helper for Mutex -// base::internal::CondVarImpl - implementation helper for CondVar -// base::internal::SynchronizationStorage - implementation helper for -// Mutex, CondVar - -#include - -#if defined(_WIN32) -#include -#include -#else -#include -#endif - -#include "absl/base/call_once.h" -#include "absl/time/time.h" - -// Declare that Mutex::ReaderLock is actually Lock(). Intended primarily -// for tests, and even then as a last resort. -#ifdef ABSL_MUTEX_READER_LOCK_IS_EXCLUSIVE -#error ABSL_MUTEX_READER_LOCK_IS_EXCLUSIVE cannot be directly set -#else -#define ABSL_MUTEX_READER_LOCK_IS_EXCLUSIVE 1 -#endif - -// Declare that Mutex::EnableInvariantDebugging is not implemented. -// Intended primarily for tests, and even then as a last resort. -#ifdef ABSL_MUTEX_ENABLE_INVARIANT_DEBUGGING_NOT_IMPLEMENTED -#error ABSL_MUTEX_ENABLE_INVARIANT_DEBUGGING_NOT_IMPLEMENTED cannot be directly set -#else -#define ABSL_MUTEX_ENABLE_INVARIANT_DEBUGGING_NOT_IMPLEMENTED 1 -#endif - -namespace absl { -ABSL_NAMESPACE_BEGIN -class Condition; - -namespace synchronization_internal { - -class MutexImpl; - -// Do not use this implementation detail of CondVar. Provides most of the -// implementation, but should not be placed directly in static storage -// because it will not linker initialize properly. See -// SynchronizationStorage below for what we mean by linker -// initialization. -class CondVarImpl { - public: - CondVarImpl(); - CondVarImpl(const CondVarImpl&) = delete; - CondVarImpl& operator=(const CondVarImpl&) = delete; - ~CondVarImpl(); - - void Signal(); - void SignalAll(); - void Wait(MutexImpl* mutex); - bool WaitWithDeadline(MutexImpl* mutex, absl::Time deadline); - - private: -#if defined(_WIN32) - std::condition_variable_any std_cv_; -#else - pthread_cond_t pthread_cv_; -#endif -}; - -// Do not use this implementation detail of Mutex. Provides most of the -// implementation, but should not be placed directly in static storage -// because it will not linker initialize properly. See -// SynchronizationStorage below for what we mean by linker -// initialization. -class MutexImpl { - public: - MutexImpl(); - MutexImpl(const MutexImpl&) = delete; - MutexImpl& operator=(const MutexImpl&) = delete; - ~MutexImpl(); - - void Lock(); - bool TryLock(); - void Unlock(); - void Await(const Condition& cond); - bool AwaitWithDeadline(const Condition& cond, absl::Time deadline); - - private: - friend class CondVarImpl; - -#if defined(_WIN32) - std::mutex std_mutex_; -#else - pthread_mutex_t pthread_mutex_; -#endif - - // True if the underlying mutex is locked. If the destructor is entered - // while locked_, the underlying mutex is unlocked. Mutex supports - // destruction while locked, but the same is undefined behavior for both - // pthread_mutex_t and std::mutex. - bool locked_ = false; - - // Signaled before releasing the lock, in support of Await. - CondVarImpl released_; -}; - -// Do not use this implementation detail of CondVar and Mutex. A storage -// space for T that supports a LinkerInitialized constructor. T must -// have a default constructor, which is called by the first call to -// get(). T's destructor is never called if the LinkerInitialized -// constructor is called. -// -// Objects constructed with the default constructor are constructed and -// destructed like any other object, and should never be allocated in -// static storage. -// -// Objects constructed with the LinkerInitialized constructor should -// always be in static storage. For such objects, calls to get() are always -// valid, except from signal handlers. -// -// Note that this implementation relies on undefined language behavior that -// are known to hold for the set of supported compilers. An analysis -// follows. -// -// From the C++11 standard: -// -// [basic.life] says an object has non-trivial initialization if it is of -// class type and it is initialized by a constructor other than a trivial -// default constructor. (the LinkerInitialized constructor is -// non-trivial) -// -// [basic.life] says the lifetime of an object with a non-trivial -// constructor begins when the call to the constructor is complete. -// -// [basic.life] says the lifetime of an object with non-trivial destructor -// ends when the call to the destructor begins. -// -// [basic.life] p5 specifies undefined behavior when accessing non-static -// members of an instance outside its -// lifetime. (SynchronizationStorage::get() access non-static members) -// -// So, LinkerInitialized object of SynchronizationStorage uses a -// non-trivial constructor, which is called at some point during dynamic -// initialization, and is therefore subject to order of dynamic -// initialization bugs, where get() is called before the object's -// constructor is, resulting in undefined behavior. -// -// Similarly, a LinkerInitialized SynchronizationStorage object has a -// non-trivial destructor, and so its lifetime ends at some point during -// destruction of objects with static storage duration [basic.start.term] -// p4. There is a window where other exit code could call get() after this -// occurs, resulting in undefined behavior. -// -// Combined, these statements imply that LinkerInitialized instances -// of SynchronizationStorage rely on undefined behavior. -// -// However, in practice, the implementation works on all supported -// compilers. Specifically, we rely on: -// -// a) zero-initialization being sufficient to initialize -// LinkerInitialized instances for the purposes of calling -// get(), regardless of when the constructor is called. This is -// because the is_dynamic_ boolean is correctly zero-initialized to -// false. -// -// b) the LinkerInitialized constructor is a NOP, and immaterial to -// even to concurrent calls to get(). -// -// c) the destructor being a NOP for LinkerInitialized objects -// (guaranteed by a check for !is_dynamic_), and so any concurrent and -// subsequent calls to get() functioning as if the destructor were not -// called, by virtue of the instances' storage remaining valid after the -// destructor runs. -// -// d) That a-c apply transitively when SynchronizationStorage is the -// only member of a class allocated in static storage. -// -// Nothing in the language standard guarantees that a-d hold. In practice, -// these hold in all supported compilers. -// -// Future direction: -// -// Ideally, we would simply use std::mutex or a similar class, which when -// allocated statically would support use immediately after static -// initialization up until static storage is reclaimed (i.e. the properties -// we require of all "linker initialized" instances). -// -// Regarding construction in static storage, std::mutex is required to -// provide a constexpr default constructor [thread.mutex.class], which -// ensures the instance's lifetime begins with static initialization -// [basic.start.init], and so is immune to any problems caused by the order -// of dynamic initialization. However, as of this writing Microsoft's -// Visual Studio does not provide a constexpr constructor for std::mutex. -// See -// https://blogs.msdn.microsoft.com/vcblog/2015/06/02/constexpr-complete-for-vs-2015-rtm-c11-compiler-c17-stl/ -// -// Regarding destruction of instances in static storage, [basic.life] does -// say an object ends when storage in which the occupies is released, in -// the case of non-trivial destructor. However, std::mutex is not specified -// to have a trivial destructor. -// -// So, we would need a class with a constexpr default constructor and a -// trivial destructor. Today, we can achieve neither desired property using -// std::mutex directly. -template -class SynchronizationStorage { - public: - // Instances allocated on the heap or on the stack should use the default - // constructor. - SynchronizationStorage() - : destruct_(true), once_() {} - - constexpr explicit SynchronizationStorage(absl::ConstInitType) - : destruct_(false), once_(), space_{{0}} {} - - SynchronizationStorage(SynchronizationStorage&) = delete; - SynchronizationStorage& operator=(SynchronizationStorage&) = delete; - - ~SynchronizationStorage() { - if (destruct_) { - get()->~T(); - } - } - - // Retrieve the object in storage. This is fast and thread safe, but does - // incur the cost of absl::call_once(). - T* get() { - absl::call_once(once_, SynchronizationStorage::Construct, this); - return reinterpret_cast(&space_); - } - - private: - static void Construct(SynchronizationStorage* self) { - new (&self->space_) T(); - } - - // When true, T's destructor is run when this is destructed. - const bool destruct_; - - absl::once_flag once_; - - // An aligned space for the T. - alignas(T) unsigned char space_[sizeof(T)]; -}; - -} // namespace synchronization_internal -ABSL_NAMESPACE_END -} // namespace absl diff --git a/third_party/abseil_cpp/absl/synchronization/internal/per_thread_sem.h b/third_party/abseil_cpp/absl/synchronization/internal/per_thread_sem.h index 8ab439153..2228b6e8e 100644 --- a/third_party/abseil_cpp/absl/synchronization/internal/per_thread_sem.h +++ b/third_party/abseil_cpp/absl/synchronization/internal/per_thread_sem.h @@ -78,7 +78,7 @@ class PerThreadSem { // !t.has_timeout() => Wait(t) will return true. static inline bool Wait(KernelTimeout t); - // White-listed callers. + // Permitted callers. friend class PerThreadSemTest; friend class absl::Mutex; friend absl::base_internal::ThreadIdentity* CreateThreadIdentity(); diff --git a/third_party/abseil_cpp/absl/synchronization/internal/per_thread_sem_test.cc b/third_party/abseil_cpp/absl/synchronization/internal/per_thread_sem_test.cc index b5a2f6d4b..8cf59e64e 100644 --- a/third_party/abseil_cpp/absl/synchronization/internal/per_thread_sem_test.cc +++ b/third_party/abseil_cpp/absl/synchronization/internal/per_thread_sem_test.cc @@ -23,6 +23,7 @@ #include // NOLINT(build/c++11) #include "gtest/gtest.h" +#include "absl/base/config.h" #include "absl/base/internal/cycleclock.h" #include "absl/base/internal/thread_identity.h" #include "absl/strings/str_cat.h" diff --git a/third_party/abseil_cpp/absl/synchronization/internal/waiter.cc b/third_party/abseil_cpp/absl/synchronization/internal/waiter.cc index b6150b9b2..2123be60f 100644 --- a/third_party/abseil_cpp/absl/synchronization/internal/waiter.cc +++ b/third_party/abseil_cpp/absl/synchronization/internal/waiter.cc @@ -48,6 +48,7 @@ #include "absl/base/optimization.h" #include "absl/synchronization/internal/kernel_timeout.h" + namespace absl { ABSL_NAMESPACE_BEGIN namespace synchronization_internal { @@ -66,71 +67,6 @@ static void MaybeBecomeIdle() { #if ABSL_WAITER_MODE == ABSL_WAITER_MODE_FUTEX -// Some Android headers are missing these definitions even though they -// support these futex operations. -#ifdef __BIONIC__ -#ifndef SYS_futex -#define SYS_futex __NR_futex -#endif -#ifndef FUTEX_WAIT_BITSET -#define FUTEX_WAIT_BITSET 9 -#endif -#ifndef FUTEX_PRIVATE_FLAG -#define FUTEX_PRIVATE_FLAG 128 -#endif -#ifndef FUTEX_CLOCK_REALTIME -#define FUTEX_CLOCK_REALTIME 256 -#endif -#ifndef FUTEX_BITSET_MATCH_ANY -#define FUTEX_BITSET_MATCH_ANY 0xFFFFFFFF -#endif -#endif - -#if defined(__NR_futex_time64) && !defined(SYS_futex_time64) -#define SYS_futex_time64 __NR_futex_time64 -#endif - -#if defined(SYS_futex_time64) && !defined(SYS_futex) -#define SYS_futex SYS_futex_time64 -#endif - -class Futex { - public: - static int WaitUntil(std::atomic *v, int32_t val, - KernelTimeout t) { - int err = 0; - if (t.has_timeout()) { - // https://locklessinc.com/articles/futex_cheat_sheet/ - // Unlike FUTEX_WAIT, FUTEX_WAIT_BITSET uses absolute time. - struct timespec abs_timeout = t.MakeAbsTimespec(); - // Atomically check that the futex value is still 0, and if it - // is, sleep until abs_timeout or until woken by FUTEX_WAKE. - err = syscall( - SYS_futex, reinterpret_cast(v), - FUTEX_WAIT_BITSET | FUTEX_PRIVATE_FLAG | FUTEX_CLOCK_REALTIME, val, - &abs_timeout, nullptr, FUTEX_BITSET_MATCH_ANY); - } else { - // Atomically check that the futex value is still 0, and if it - // is, sleep until woken by FUTEX_WAKE. - err = syscall(SYS_futex, reinterpret_cast(v), - FUTEX_WAIT | FUTEX_PRIVATE_FLAG, val, nullptr); - } - if (err != 0) { - err = -errno; - } - return err; - } - - static int Wake(std::atomic *v, int32_t count) { - int err = syscall(SYS_futex, reinterpret_cast(v), - FUTEX_WAKE | FUTEX_PRIVATE_FLAG, count); - if (ABSL_PREDICT_FALSE(err < 0)) { - err = -errno; - } - return err; - } -}; - Waiter::Waiter() { futex_.store(0, std::memory_order_relaxed); } diff --git a/third_party/abseil_cpp/absl/synchronization/internal/waiter.h b/third_party/abseil_cpp/absl/synchronization/internal/waiter.h index ae83907b1..be3df180d 100644 --- a/third_party/abseil_cpp/absl/synchronization/internal/waiter.h +++ b/third_party/abseil_cpp/absl/synchronization/internal/waiter.h @@ -36,6 +36,7 @@ #include #include "absl/base/internal/thread_identity.h" +#include "absl/synchronization/internal/futex.h" #include "absl/synchronization/internal/kernel_timeout.h" // May be chosen at compile time via -DABSL_FORCE_WAITER_MODE= @@ -48,12 +49,7 @@ #define ABSL_WAITER_MODE ABSL_FORCE_WAITER_MODE #elif defined(_WIN32) && _WIN32_WINNT >= _WIN32_WINNT_VISTA #define ABSL_WAITER_MODE ABSL_WAITER_MODE_WIN32 -#elif defined(__BIONIC__) -// Bionic supports all the futex operations we need even when some of the futex -// definitions are missing. -#define ABSL_WAITER_MODE ABSL_WAITER_MODE_FUTEX -#elif defined(__linux__) && defined(FUTEX_CLOCK_REALTIME) -// FUTEX_CLOCK_REALTIME requires Linux >= 2.6.28. +#elif defined(ABSL_INTERNAL_HAVE_FUTEX) #define ABSL_WAITER_MODE ABSL_WAITER_MODE_FUTEX #elif defined(ABSL_HAVE_SEMAPHORE_H) #define ABSL_WAITER_MODE ABSL_WAITER_MODE_SEM @@ -100,7 +96,7 @@ class Waiter { } // How many periods to remain idle before releasing resources -#ifndef THREAD_SANITIZER +#ifndef ABSL_HAVE_THREAD_SANITIZER static constexpr int kIdlePeriods = 60; #else // Memory consumption under ThreadSanitizer is a serious concern, diff --git a/third_party/abseil_cpp/absl/synchronization/mutex.cc b/third_party/abseil_cpp/absl/synchronization/mutex.cc index 1f8a696e0..9e01393ca 100644 --- a/third_party/abseil_cpp/absl/synchronization/mutex.cc +++ b/third_party/abseil_cpp/absl/synchronization/mutex.cc @@ -39,6 +39,7 @@ #include // NOLINT(build/c++11) #include "absl/base/attributes.h" +#include "absl/base/call_once.h" #include "absl/base/config.h" #include "absl/base/dynamic_annotations.h" #include "absl/base/internal/atomic_hook.h" @@ -49,6 +50,7 @@ #include "absl/base/internal/spinlock.h" #include "absl/base/internal/sysinfo.h" #include "absl/base/internal/thread_identity.h" +#include "absl/base/internal/tsan_mutex_interface.h" #include "absl/base/port.h" #include "absl/debugging/stacktrace.h" #include "absl/debugging/symbolize.h" @@ -58,6 +60,7 @@ using absl::base_internal::CurrentThreadIdentityIfPresent; using absl::base_internal::PerThreadSynch; +using absl::base_internal::SchedulingGuard; using absl::base_internal::ThreadIdentity; using absl::synchronization_internal::GetOrCreateCurrentThreadIdentity; using absl::synchronization_internal::GraphCycles; @@ -75,7 +78,7 @@ ABSL_NAMESPACE_BEGIN namespace { -#if defined(THREAD_SANITIZER) +#if defined(ABSL_HAVE_THREAD_SANITIZER) constexpr OnDeadlockCycle kDeadlockDetectionDefault = OnDeadlockCycle::kIgnore; #else constexpr OnDeadlockCycle kDeadlockDetectionDefault = OnDeadlockCycle::kAbort; @@ -85,31 +88,9 @@ ABSL_CONST_INIT std::atomic synch_deadlock_detection( kDeadlockDetectionDefault); ABSL_CONST_INIT std::atomic synch_check_invariants(false); -// ------------------------------------------ spinlock support - -// Make sure read-only globals used in the Mutex code are contained on the -// same cacheline and cacheline aligned to eliminate any false sharing with -// other globals from this and other modules. -static struct MutexGlobals { - MutexGlobals() { - // Find machine-specific data needed for Delay() and - // TryAcquireWithSpinning(). This runs in the global constructor - // sequence, and before that zeros are safe values. - num_cpus = absl::base_internal::NumCPUs(); - spinloop_iterations = num_cpus > 1 ? 1500 : 0; - } - int num_cpus; - int spinloop_iterations; - // Pad this struct to a full cacheline to prevent false sharing. - char padding[ABSL_CACHELINE_SIZE - 2 * sizeof(int)]; -} ABSL_CACHELINE_ALIGNED mutex_globals; -static_assert( - sizeof(MutexGlobals) == ABSL_CACHELINE_SIZE, - "MutexGlobals must occupy an entire cacheline to prevent false sharing"); - ABSL_INTERNAL_ATOMIC_HOOK_ATTRIBUTES - absl::base_internal::AtomicHook - submit_profile_data; +absl::base_internal::AtomicHook + submit_profile_data; ABSL_INTERNAL_ATOMIC_HOOK_ATTRIBUTES absl::base_internal::AtomicHook mutex_tracer; @@ -143,33 +124,55 @@ void RegisterSymbolizer(bool (*fn)(const void *pc, char *out, int out_size)) { symbolizer.Store(fn); } -// spinlock delay on iteration c. Returns new c. +struct ABSL_CACHELINE_ALIGNED MutexGlobals { + absl::once_flag once; + int num_cpus = 0; + int spinloop_iterations = 0; +}; + +static const MutexGlobals& GetMutexGlobals() { + ABSL_CONST_INIT static MutexGlobals data; + absl::base_internal::LowLevelCallOnce(&data.once, [&]() { + data.num_cpus = absl::base_internal::NumCPUs(); + data.spinloop_iterations = data.num_cpus > 1 ? 1500 : 0; + }); + return data; +} + +// Spinlock delay on iteration c. Returns new c. namespace { enum DelayMode { AGGRESSIVE, GENTLE }; }; -static int Delay(int32_t c, DelayMode mode) { + +namespace synchronization_internal { +int MutexDelay(int32_t c, int mode) { // If this a uniprocessor, only yield/sleep. Otherwise, if the mode is // aggressive then spin many times before yielding. If the mode is // gentle then spin only a few times before yielding. Aggressive spinning is // used to ensure that an Unlock() call, which must get the spin lock for // any thread to make progress gets it without undue delay. - int32_t limit = (mutex_globals.num_cpus > 1) ? - ((mode == AGGRESSIVE) ? 5000 : 250) : 0; + const int32_t limit = + GetMutexGlobals().num_cpus > 1 ? (mode == AGGRESSIVE ? 5000 : 250) : 0; if (c < limit) { - c++; // spin + // Spin. + c++; } else { + SchedulingGuard::ScopedEnable enable_rescheduling; ABSL_TSAN_MUTEX_PRE_DIVERT(nullptr, 0); - if (c == limit) { // yield once + if (c == limit) { + // Yield once. AbslInternalMutexYield(); c++; - } else { // then wait + } else { + // Then wait. absl::SleepFor(absl::Microseconds(10)); c = 0; } ABSL_TSAN_MUTEX_POST_DIVERT(nullptr, 0); } - return (c); + return c; } +} // namespace synchronization_internal // --------------------------Generic atomic ops // Ensure that "(*pv & bits) == bits" by doing an atomic update of "*pv" to @@ -489,7 +492,7 @@ struct SynchWaitParams { std::atomic *cv_word; int64_t contention_start_cycles; // Time (in cycles) when this thread started - // to contend for the mutex. + // to contend for the mutex. }; struct SynchLocksHeld { @@ -703,7 +706,7 @@ static constexpr bool kDebugMode = false; static constexpr bool kDebugMode = true; #endif -#ifdef THREAD_SANITIZER +#ifdef ABSL_INTERNAL_HAVE_TSAN_INTERFACE static unsigned TsanFlags(Mutex::MuHow how) { return how == kShared ? __tsan_mutex_read_lock : 0; } @@ -1054,6 +1057,7 @@ static PerThreadSynch *DequeueAllWakeable(PerThreadSynch *head, // Try to remove thread s from the list of waiters on this mutex. // Does nothing if s is not on the waiter list. void Mutex::TryRemove(PerThreadSynch *s) { + SchedulingGuard::ScopedDisable disable_rescheduling; intptr_t v = mu_.load(std::memory_order_relaxed); // acquire spinlock & lock if ((v & (kMuWait | kMuSpin | kMuWriter | kMuReader)) == kMuWait && @@ -1118,7 +1122,7 @@ ABSL_XRAY_LOG_ARGS(1) void Mutex::Block(PerThreadSynch *s) { this->TryRemove(s); int c = 0; while (s->next != nullptr) { - c = Delay(c, GENTLE); + c = synchronization_internal::MutexDelay(c, GENTLE); this->TryRemove(s); } if (kDebugMode) { @@ -1437,7 +1441,7 @@ void Mutex::AssertNotHeld() const { // Attempt to acquire *mu, and return whether successful. The implementation // may spin for a short while if the lock cannot be acquired immediately. static bool TryAcquireWithSpinning(std::atomic* mu) { - int c = mutex_globals.spinloop_iterations; + int c = GetMutexGlobals().spinloop_iterations; do { // do/while somewhat faster on AMD intptr_t v = mu->load(std::memory_order_relaxed); if ((v & (kMuReader|kMuEvent)) != 0) { @@ -1764,7 +1768,7 @@ static inline bool EvalConditionAnnotated(const Condition *cond, Mutex *mu, // All memory accesses are ignored inside of mutex operations + for unlock // operation tsan considers that we've already released the mutex. bool res = false; -#ifdef THREAD_SANITIZER +#ifdef ABSL_INTERNAL_HAVE_TSAN_INTERFACE const int flags = read_lock ? __tsan_mutex_read_lock : 0; const int tryflags = flags | (trylock ? __tsan_mutex_try_lock : 0); #endif @@ -1814,9 +1818,9 @@ static inline bool EvalConditionIgnored(Mutex *mu, const Condition *cond) { // So we "divert" (which un-ignores both memory accesses and synchronization) // and then separately turn on ignores of memory accesses. ABSL_TSAN_MUTEX_PRE_DIVERT(mu, 0); - ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN(); + ABSL_ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN(); bool res = cond->Eval(); - ANNOTATE_IGNORE_READS_AND_WRITES_END(); + ABSL_ANNOTATE_IGNORE_READS_AND_WRITES_END(); ABSL_TSAN_MUTEX_POST_DIVERT(mu, 0); static_cast(mu); // Prevent unused param warning in non-TSAN builds. return res; @@ -1897,6 +1901,7 @@ static void CheckForMutexCorruption(intptr_t v, const char* label) { } void Mutex::LockSlowLoop(SynchWaitParams *waitp, int flags) { + SchedulingGuard::ScopedDisable disable_rescheduling; int c = 0; intptr_t v = mu_.load(std::memory_order_relaxed); if ((v & kMuEvent) != 0) { @@ -1998,7 +2003,8 @@ void Mutex::LockSlowLoop(SynchWaitParams *waitp, int flags) { ABSL_RAW_CHECK( waitp->thread->waitp == nullptr || waitp->thread->suppress_fatal_errors, "detected illegal recursion into Mutex code"); - c = Delay(c, GENTLE); // delay, then try again + // delay, then try again + c = synchronization_internal::MutexDelay(c, GENTLE); } ABSL_RAW_CHECK( waitp->thread->waitp == nullptr || waitp->thread->suppress_fatal_errors, @@ -2016,6 +2022,7 @@ void Mutex::LockSlowLoop(SynchWaitParams *waitp, int flags) { // or it is in the process of blocking on a condition variable; it must requeue // itself on the mutex/condvar to wait for its condition to become true. ABSL_ATTRIBUTE_NOINLINE void Mutex::UnlockSlow(SynchWaitParams *waitp) { + SchedulingGuard::ScopedDisable disable_rescheduling; intptr_t v = mu_.load(std::memory_order_relaxed); this->AssertReaderHeld(); CheckForMutexCorruption(v, "Unlock"); @@ -2292,7 +2299,8 @@ ABSL_ATTRIBUTE_NOINLINE void Mutex::UnlockSlow(SynchWaitParams *waitp) { mu_.store(nv, std::memory_order_release); break; // out of for(;;)-loop } - c = Delay(c, AGGRESSIVE); // aggressive here; no one can proceed till we do + // aggressive here; no one can proceed till we do + c = synchronization_internal::MutexDelay(c, AGGRESSIVE); } // end of for(;;)-loop if (wake_list != kPerThreadSynchNull) { @@ -2304,7 +2312,8 @@ ABSL_ATTRIBUTE_NOINLINE void Mutex::UnlockSlow(SynchWaitParams *waitp) { if (!cond_waiter) { // Sample lock contention events only if the (first) waiter was trying to // acquire the lock, not waiting on a condition variable or Condition. - int64_t wait_cycles = base_internal::CycleClock::Now() - enqueue_timestamp; + int64_t wait_cycles = + base_internal::CycleClock::Now() - enqueue_timestamp; mutex_tracer("slow release", this, wait_cycles); ABSL_TSAN_MUTEX_PRE_DIVERT(this, 0); submit_profile_data(enqueue_timestamp); @@ -2331,6 +2340,7 @@ void Mutex::Trans(MuHow how) { // It will later acquire the mutex with high probability. Otherwise, we // enqueue thread w on this mutex. void Mutex::Fer(PerThreadSynch *w) { + SchedulingGuard::ScopedDisable disable_rescheduling; int c = 0; ABSL_RAW_CHECK(w->waitp->cond == nullptr, "Mutex::Fer while waiting on Condition"); @@ -2380,7 +2390,7 @@ void Mutex::Fer(PerThreadSynch *w) { return; } } - c = Delay(c, GENTLE); + c = synchronization_internal::MutexDelay(c, GENTLE); } } @@ -2429,6 +2439,7 @@ CondVar::~CondVar() { // Remove thread s from the list of waiters on this condition variable. void CondVar::Remove(PerThreadSynch *s) { + SchedulingGuard::ScopedDisable disable_rescheduling; intptr_t v; int c = 0; for (v = cv_.load(std::memory_order_relaxed);; @@ -2457,7 +2468,8 @@ void CondVar::Remove(PerThreadSynch *s) { std::memory_order_release); return; } else { - c = Delay(c, GENTLE); // try again after a delay + // try again after a delay + c = synchronization_internal::MutexDelay(c, GENTLE); } } } @@ -2490,7 +2502,7 @@ static void CondVarEnqueue(SynchWaitParams *waitp) { !cv_word->compare_exchange_weak(v, v | kCvSpin, std::memory_order_acquire, std::memory_order_relaxed)) { - c = Delay(c, GENTLE); + c = synchronization_internal::MutexDelay(c, GENTLE); v = cv_word->load(std::memory_order_relaxed); } ABSL_RAW_CHECK(waitp->thread->waitp == nullptr, "waiting when shouldn't be"); @@ -2589,6 +2601,7 @@ void CondVar::Wakeup(PerThreadSynch *w) { } void CondVar::Signal() { + SchedulingGuard::ScopedDisable disable_rescheduling; ABSL_TSAN_MUTEX_PRE_SIGNAL(nullptr, 0); intptr_t v; int c = 0; @@ -2621,7 +2634,7 @@ void CondVar::Signal() { ABSL_TSAN_MUTEX_POST_SIGNAL(nullptr, 0); return; } else { - c = Delay(c, GENTLE); + c = synchronization_internal::MutexDelay(c, GENTLE); } } ABSL_TSAN_MUTEX_POST_SIGNAL(nullptr, 0); @@ -2658,7 +2671,8 @@ void CondVar::SignalAll () { ABSL_TSAN_MUTEX_POST_SIGNAL(nullptr, 0); return; } else { - c = Delay(c, GENTLE); // try again after a delay + // try again after a delay + c = synchronization_internal::MutexDelay(c, GENTLE); } } ABSL_TSAN_MUTEX_POST_SIGNAL(nullptr, 0); @@ -2671,7 +2685,7 @@ void ReleasableMutexLock::Release() { this->mu_ = nullptr; } -#ifdef THREAD_SANITIZER +#ifdef ABSL_HAVE_THREAD_SANITIZER extern "C" void __tsan_read1(void *addr); #else #define __tsan_read1(addr) // do nothing if TSan not enabled diff --git a/third_party/abseil_cpp/absl/synchronization/mutex.h b/third_party/abseil_cpp/absl/synchronization/mutex.h index 876698ca5..598d1e061 100644 --- a/third_party/abseil_cpp/absl/synchronization/mutex.h +++ b/third_party/abseil_cpp/absl/synchronization/mutex.h @@ -31,22 +31,23 @@ // // MutexLock - An RAII wrapper to acquire and release a `Mutex` for exclusive/ // write access within the current scope. +// // ReaderMutexLock // - An RAII wrapper to acquire and release a `Mutex` for shared/read // access within the current scope. // // WriterMutexLock -// - Alias for `MutexLock` above, designed for use in distinguishing -// reader and writer locks within code. +// - Effectively an alias for `MutexLock` above, designed for use in +// distinguishing reader and writer locks within code. // // In addition to simple mutex locks, this file also defines ways to perform // locking under certain conditions. // -// Condition - (Preferred) Used to wait for a particular predicate that -// depends on state protected by the `Mutex` to become true. -// CondVar - A lower-level variant of `Condition` that relies on -// application code to explicitly signal the `CondVar` when -// a condition has been met. +// Condition - (Preferred) Used to wait for a particular predicate that +// depends on state protected by the `Mutex` to become true. +// CondVar - A lower-level variant of `Condition` that relies on +// application code to explicitly signal the `CondVar` when +// a condition has been met. // // See below for more information on using `Condition` or `CondVar`. // @@ -72,15 +73,6 @@ #include "absl/synchronization/internal/per_thread_sem.h" #include "absl/time/time.h" -// Decide if we should use the non-production implementation because -// the production implementation hasn't been fully ported yet. -#ifdef ABSL_INTERNAL_USE_NONPROD_MUTEX -#error ABSL_INTERNAL_USE_NONPROD_MUTEX cannot be directly set -#elif defined(ABSL_LOW_LEVEL_ALLOC_MISSING) -#define ABSL_INTERNAL_USE_NONPROD_MUTEX 1 -#include "absl/synchronization/internal/mutex_nonprod.inc" -#endif - namespace absl { ABSL_NAMESPACE_BEGIN @@ -461,15 +453,6 @@ class ABSL_LOCKABLE Mutex { static void InternalAttemptToUseMutexInFatalSignalHandler(); private: -#ifdef ABSL_INTERNAL_USE_NONPROD_MUTEX - friend class CondVar; - - synchronization_internal::MutexImpl *impl() { return impl_.get(); } - - synchronization_internal::SynchronizationStorage< - synchronization_internal::MutexImpl> - impl_; -#else std::atomic mu_; // The Mutex state. // Post()/Wait() versus associated PerThreadSem; in class for required @@ -504,7 +487,6 @@ class ABSL_LOCKABLE Mutex { void Trans(MuHow how); // used for CondVar->Mutex transfer void Fer( base_internal::PerThreadSynch *w); // used for CondVar->Mutex transfer -#endif // Catch the error of writing Mutex when intending MutexLock. Mutex(const volatile Mutex * /*ignored*/) {} // NOLINT(runtime/explicit) @@ -525,22 +507,36 @@ class ABSL_LOCKABLE Mutex { // Example: // // Class Foo { -// +// public: // Foo::Bar* Baz() { -// MutexLock l(&lock_); +// MutexLock lock(&mu_); // ... // return bar; // } // // private: -// Mutex lock_; +// Mutex mu_; // }; class ABSL_SCOPED_LOCKABLE MutexLock { public: + // Constructors + + // Calls `mu->Lock()` and returns when that call returns. That is, `*mu` is + // guaranteed to be locked when this object is constructed. Requires that + // `mu` be dereferenceable. explicit MutexLock(Mutex *mu) ABSL_EXCLUSIVE_LOCK_FUNCTION(mu) : mu_(mu) { this->mu_->Lock(); } + // Like above, but calls `mu->LockWhen(cond)` instead. That is, in addition to + // the above, the condition given by `cond` is also guaranteed to hold when + // this object is constructed. + explicit MutexLock(Mutex *mu, const Condition &cond) + ABSL_EXCLUSIVE_LOCK_FUNCTION(mu) + : mu_(mu) { + this->mu_->LockWhen(cond); + } + MutexLock(const MutexLock &) = delete; // NOLINT(runtime/mutex) MutexLock(MutexLock&&) = delete; // NOLINT(runtime/mutex) MutexLock& operator=(const MutexLock&) = delete; @@ -562,6 +558,12 @@ class ABSL_SCOPED_LOCKABLE ReaderMutexLock { mu->ReaderLock(); } + explicit ReaderMutexLock(Mutex *mu, const Condition &cond) + ABSL_SHARED_LOCK_FUNCTION(mu) + : mu_(mu) { + mu->ReaderLockWhen(cond); + } + ReaderMutexLock(const ReaderMutexLock&) = delete; ReaderMutexLock(ReaderMutexLock&&) = delete; ReaderMutexLock& operator=(const ReaderMutexLock&) = delete; @@ -584,6 +586,12 @@ class ABSL_SCOPED_LOCKABLE WriterMutexLock { mu->WriterLock(); } + explicit WriterMutexLock(Mutex *mu, const Condition &cond) + ABSL_EXCLUSIVE_LOCK_FUNCTION(mu) + : mu_(mu) { + mu->WriterLockWhen(cond); + } + WriterMutexLock(const WriterMutexLock&) = delete; WriterMutexLock(WriterMutexLock&&) = delete; WriterMutexLock& operator=(const WriterMutexLock&) = delete; @@ -622,16 +630,26 @@ class ABSL_SCOPED_LOCKABLE WriterMutexLock { // `noexcept`; until then this requirement cannot be enforced in the // type system.) // -// Note: to use a `Condition`, you need only construct it and pass it within the -// appropriate `Mutex' member function, such as `Mutex::Await()`. +// Note: to use a `Condition`, you need only construct it and pass it to a +// suitable `Mutex' member function, such as `Mutex::Await()`, or to the +// constructor of one of the scope guard classes. // -// Example: +// Example using LockWhen/Unlock: // // // assume count_ is not internal reference count // int count_ ABSL_GUARDED_BY(mu_); +// Condition count_is_zero(+[](int *count) { return *count == 0; }, &count_); // -// mu_.LockWhen(Condition(+[](int* count) { return *count == 0; }, -// &count_)); +// mu_.LockWhen(count_is_zero); +// // ... +// mu_.Unlock(); +// +// Example using a scope guard: +// +// { +// MutexLock lock(&mu_, count_is_zero); +// // ... +// } // // When multiple threads are waiting on exactly the same condition, make sure // that they are constructed with the same parameters (same pointer to function @@ -685,6 +703,11 @@ class Condition { // return processed_ >= current; // }; // mu_.Await(Condition(&reached)); + // + // NOTE: never use "mu_.AssertHeld()" instead of "mu_.AssertReaderHeld()" in + // the lambda as it may be called when the mutex is being unlocked from a + // scope holding only a reader lock, which will make the assertion not + // fulfilled and crash the binary. // See class comment for performance advice. In particular, if there // might be more than one waiter for the same condition, make sure @@ -833,17 +856,10 @@ class CondVar { void EnableDebugLog(const char *name); private: -#ifdef ABSL_INTERNAL_USE_NONPROD_MUTEX - synchronization_internal::CondVarImpl *impl() { return impl_.get(); } - synchronization_internal::SynchronizationStorage< - synchronization_internal::CondVarImpl> - impl_; -#else bool WaitCommon(Mutex *mutex, synchronization_internal::KernelTimeout t); void Remove(base_internal::PerThreadSynch *s); void Wakeup(base_internal::PerThreadSynch *w); std::atomic cv_; // Condition variable state. -#endif CondVar(const CondVar&) = delete; CondVar& operator=(const CondVar&) = delete; }; @@ -865,6 +881,15 @@ class ABSL_SCOPED_LOCKABLE MutexLockMaybe { this->mu_->Lock(); } } + + explicit MutexLockMaybe(Mutex *mu, const Condition &cond) + ABSL_EXCLUSIVE_LOCK_FUNCTION(mu) + : mu_(mu) { + if (this->mu_ != nullptr) { + this->mu_->LockWhen(cond); + } + } + ~MutexLockMaybe() ABSL_UNLOCK_FUNCTION() { if (this->mu_ != nullptr) { this->mu_->Unlock(); } } @@ -887,6 +912,13 @@ class ABSL_SCOPED_LOCKABLE ReleasableMutexLock { : mu_(mu) { this->mu_->Lock(); } + + explicit ReleasableMutexLock(Mutex *mu, const Condition &cond) + ABSL_EXCLUSIVE_LOCK_FUNCTION(mu) + : mu_(mu) { + this->mu_->LockWhen(cond); + } + ~ReleasableMutexLock() ABSL_UNLOCK_FUNCTION() { if (this->mu_ != nullptr) { this->mu_->Unlock(); } } @@ -901,12 +933,6 @@ class ABSL_SCOPED_LOCKABLE ReleasableMutexLock { ReleasableMutexLock& operator=(ReleasableMutexLock&&) = delete; }; -#ifdef ABSL_INTERNAL_USE_NONPROD_MUTEX - -inline constexpr Mutex::Mutex(absl::ConstInitType) : impl_(absl::kConstInit) {} - -#else - inline Mutex::Mutex() : mu_(0) { ABSL_TSAN_MUTEX_CREATE(this, __tsan_mutex_not_static); } @@ -915,8 +941,6 @@ inline constexpr Mutex::Mutex(absl::ConstInitType) : mu_(0) {} inline CondVar::CondVar() : cv_(0) {} -#endif // ABSL_INTERNAL_USE_NONPROD_MUTEX - // static template bool Condition::CastAndCallMethod(const Condition *c) { @@ -983,7 +1007,7 @@ void RegisterMutexProfiler(void (*fn)(int64_t wait_timestamp)); // // This has the same memory ordering concerns as RegisterMutexProfiler() above. void RegisterMutexTracer(void (*fn)(const char *msg, const void *obj, - int64_t wait_cycles)); + int64_t wait_cycles)); // TODO(gfalcon): Combine RegisterMutexProfiler() and RegisterMutexTracer() // into a single interface, since they are only ever called in pairs. diff --git a/third_party/abseil_cpp/absl/synchronization/mutex_benchmark.cc b/third_party/abseil_cpp/absl/synchronization/mutex_benchmark.cc index ab1880012..933ea14f8 100644 --- a/third_party/abseil_cpp/absl/synchronization/mutex_benchmark.cc +++ b/third_party/abseil_cpp/absl/synchronization/mutex_benchmark.cc @@ -16,6 +16,7 @@ #include // NOLINT(build/c++11) #include +#include "absl/base/config.h" #include "absl/base/internal/cycleclock.h" #include "absl/base/internal/spinlock.h" #include "absl/synchronization/blocking_counter.h" @@ -213,7 +214,7 @@ void BM_ConditionWaiters(benchmark::State& state) { } // Some configurations have higher thread limits than others. -#if defined(__linux__) && !defined(THREAD_SANITIZER) +#if defined(__linux__) && !defined(ABSL_HAVE_THREAD_SANITIZER) constexpr int kMaxConditionWaiters = 8192; #else constexpr int kMaxConditionWaiters = 1024; diff --git a/third_party/abseil_cpp/absl/synchronization/mutex_test.cc b/third_party/abseil_cpp/absl/synchronization/mutex_test.cc index afb363af6..058f757b4 100644 --- a/third_party/abseil_cpp/absl/synchronization/mutex_test.cc +++ b/third_party/abseil_cpp/absl/synchronization/mutex_test.cc @@ -30,6 +30,7 @@ #include "gtest/gtest.h" #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/base/internal/raw_logging.h" #include "absl/base/internal/sysinfo.h" #include "absl/memory/memory.h" @@ -706,6 +707,40 @@ TEST(Mutex, LockWhen) { t.join(); } +TEST(Mutex, LockWhenGuard) { + absl::Mutex mu; + int n = 30; + bool done = false; + + // We don't inline the lambda because the conversion is ambiguous in MSVC. + bool (*cond_eq_10)(int *) = [](int *p) { return *p == 10; }; + bool (*cond_lt_10)(int *) = [](int *p) { return *p < 10; }; + + std::thread t1([&mu, &n, &done, cond_eq_10]() { + absl::ReaderMutexLock lock(&mu, absl::Condition(cond_eq_10, &n)); + done = true; + }); + + std::thread t2[10]; + for (std::thread &t : t2) { + t = std::thread([&mu, &n, cond_lt_10]() { + absl::WriterMutexLock lock(&mu, absl::Condition(cond_lt_10, &n)); + ++n; + }); + } + + { + absl::MutexLock lock(&mu); + n = 0; + } + + for (std::thread &t : t2) t.join(); + t1.join(); + + EXPECT_TRUE(done); + EXPECT_EQ(n, 10); +} + // -------------------------------------------------------- // The following test requires Mutex::ReaderLock to be a real shared // lock, which is not the case in all builds. @@ -815,7 +850,7 @@ TEST(Mutex, MutexReaderDecrementBug) ABSL_NO_THREAD_SAFETY_ANALYSIS { // Test that we correctly handle the situation when a lock is // held and then destroyed (w/o unlocking). -#ifdef THREAD_SANITIZER +#ifdef ABSL_HAVE_THREAD_SANITIZER // TSAN reports errors when locked Mutexes are destroyed. TEST(Mutex, DISABLED_LockedMutexDestructionBug) NO_THREAD_SAFETY_ANALYSIS { #else @@ -1001,9 +1036,6 @@ TEST(Mutex, AcquireFromCondition) { x.mu0.Unlock(); } -// The deadlock detector is not part of non-prod builds, so do not test it. -#if !defined(ABSL_INTERNAL_USE_NONPROD_MUTEX) - TEST(Mutex, DeadlockDetector) { absl::SetMutexDeadlockDetectionMode(absl::OnDeadlockCycle::kAbort); @@ -1067,7 +1099,7 @@ class ScopedDisableBazelTestWarnings { const char ScopedDisableBazelTestWarnings::kVarName[] = "TEST_WARNINGS_OUTPUT_FILE"; -#ifdef THREAD_SANITIZER +#ifdef ABSL_HAVE_THREAD_SANITIZER // This test intentionally creates deadlocks to test the deadlock detector. TEST(Mutex, DISABLED_DeadlockDetectorBazelWarning) { #else @@ -1101,7 +1133,7 @@ TEST(Mutex, DeadlockDetectorBazelWarning) { // annotation-based static thread-safety analysis is not currently // predicate-aware and cannot tell if the two for-loops that acquire and // release the locks have the same predicates. -TEST(Mutex, DeadlockDetectorStessTest) ABSL_NO_THREAD_SAFETY_ANALYSIS { +TEST(Mutex, DeadlockDetectorStressTest) ABSL_NO_THREAD_SAFETY_ANALYSIS { // Stress test: Here we create a large number of locks and use all of them. // If a deadlock detector keeps a full graph of lock acquisition order, // it will likely be too slow for this test to pass. @@ -1119,7 +1151,7 @@ TEST(Mutex, DeadlockDetectorStessTest) ABSL_NO_THREAD_SAFETY_ANALYSIS { } } -#ifdef THREAD_SANITIZER +#ifdef ABSL_HAVE_THREAD_SANITIZER // TSAN reports errors when locked Mutexes are destroyed. TEST(Mutex, DISABLED_DeadlockIdBug) NO_THREAD_SAFETY_ANALYSIS { #else @@ -1157,7 +1189,6 @@ TEST(Mutex, DeadlockIdBug) ABSL_NO_THREAD_SAFETY_ANALYSIS { c.Lock(); c.Unlock(); } -#endif // !defined(ABSL_INTERNAL_USE_NONPROD_MUTEX) // -------------------------------------------------------- // Test for timeouts/deadlines on condition waits that are specified using diff --git a/third_party/abseil_cpp/absl/time/BUILD.bazel b/third_party/abseil_cpp/absl/time/BUILD.bazel index 9ab2adb88..991241a0d 100644 --- a/third_party/abseil_cpp/absl/time/BUILD.bazel +++ b/third_party/abseil_cpp/absl/time/BUILD.bazel @@ -24,7 +24,7 @@ load( package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) cc_library( name = "time", @@ -70,6 +70,7 @@ cc_library( ], deps = [ ":time", + "//absl/base:config", "//absl/base:raw_logging_internal", "//absl/time/internal/cctz:time_zone", "@com_google_googletest//:gtest", diff --git a/third_party/abseil_cpp/absl/time/CMakeLists.txt b/third_party/abseil_cpp/absl/time/CMakeLists.txt index 853563e87..00bdd499c 100644 --- a/third_party/abseil_cpp/absl/time/CMakeLists.txt +++ b/third_party/abseil_cpp/absl/time/CMakeLists.txt @@ -99,6 +99,7 @@ absl_cc_library( ${ABSL_DEFAULT_COPTS} DEPS absl::time + absl::config absl::raw_logging_internal absl::time_zone gmock diff --git a/third_party/abseil_cpp/absl/time/clock.cc b/third_party/abseil_cpp/absl/time/clock.cc index e5c423c7e..6862e011b 100644 --- a/third_party/abseil_cpp/absl/time/clock.cc +++ b/third_party/abseil_cpp/absl/time/clock.cc @@ -74,9 +74,7 @@ ABSL_NAMESPACE_END #if !ABSL_USE_CYCLECLOCK_FOR_GET_CURRENT_TIME_NANOS namespace absl { ABSL_NAMESPACE_BEGIN -int64_t GetCurrentTimeNanos() { - return GET_CURRENT_TIME_NANOS_FROM_SYSTEM(); -} +int64_t GetCurrentTimeNanos() { return GET_CURRENT_TIME_NANOS_FROM_SYSTEM(); } ABSL_NAMESPACE_END } // namespace absl #else // Use the cyclecounter-based implementation below. diff --git a/third_party/abseil_cpp/absl/time/duration.cc b/third_party/abseil_cpp/absl/time/duration.cc index d0f1aadbf..4443109a5 100644 --- a/third_party/abseil_cpp/absl/time/duration.cc +++ b/third_party/abseil_cpp/absl/time/duration.cc @@ -69,6 +69,7 @@ #include "absl/base/casts.h" #include "absl/base/macros.h" #include "absl/numeric/int128.h" +#include "absl/strings/string_view.h" #include "absl/strings/strip.h" #include "absl/time/time.h" @@ -355,7 +356,7 @@ namespace time_internal { // the remainder. If it does not saturate, the remainder remain accurate, // but the returned quotient will over/underflow int64_t and should not be used. int64_t IDivDuration(bool satq, const Duration num, const Duration den, - Duration* rem) { + Duration* rem) { int64_t q = 0; if (IDivFastPath(num, den, &q, rem)) { return q; @@ -710,16 +711,17 @@ char* Format64(char* ep, int width, int64_t v) { // fractional digits, because it is in the noise of what a Duration can // represent. struct DisplayUnit { - const char* abbr; + absl::string_view abbr; int prec; double pow10; }; -const DisplayUnit kDisplayNano = {"ns", 2, 1e2}; -const DisplayUnit kDisplayMicro = {"us", 5, 1e5}; -const DisplayUnit kDisplayMilli = {"ms", 8, 1e8}; -const DisplayUnit kDisplaySec = {"s", 11, 1e11}; -const DisplayUnit kDisplayMin = {"m", -1, 0.0}; // prec ignored -const DisplayUnit kDisplayHour = {"h", -1, 0.0}; // prec ignored +ABSL_CONST_INIT const DisplayUnit kDisplayNano = {"ns", 2, 1e2}; +ABSL_CONST_INIT const DisplayUnit kDisplayMicro = {"us", 5, 1e5}; +ABSL_CONST_INIT const DisplayUnit kDisplayMilli = {"ms", 8, 1e8}; +ABSL_CONST_INIT const DisplayUnit kDisplaySec = {"s", 11, 1e11}; +ABSL_CONST_INIT const DisplayUnit kDisplayMin = {"m", -1, 0.0}; // prec ignored +ABSL_CONST_INIT const DisplayUnit kDisplayHour = {"h", -1, + 0.0}; // prec ignored void AppendNumberUnit(std::string* out, int64_t n, DisplayUnit unit) { char buf[sizeof("2562047788015216")]; // hours in max duration @@ -727,7 +729,7 @@ void AppendNumberUnit(std::string* out, int64_t n, DisplayUnit unit) { char* bp = Format64(ep, 0, n); if (*bp != '0' || bp + 1 != ep) { out->append(bp, ep - bp); - out->append(unit.abbr); + out->append(unit.abbr.data(), unit.abbr.size()); } } @@ -750,7 +752,7 @@ void AppendNumberUnit(std::string* out, double n, DisplayUnit unit) { while (ep[-1] == '0') --ep; out->append(bp, ep - bp); } - out->append(unit.abbr); + out->append(unit.abbr.data(), unit.abbr.size()); } } @@ -761,7 +763,8 @@ void AppendNumberUnit(std::string* out, double n, DisplayUnit unit) { // form "72h3m0.5s". Leading zero units are omitted. As a special // case, durations less than one second format use a smaller unit // (milli-, micro-, or nanoseconds) to ensure that the leading digit -// is non-zero. The zero duration formats as 0, with no unit. +// is non-zero. +// Unlike Go, we format the zero duration as 0, with no unit. std::string FormatDuration(Duration d) { const Duration min_duration = Seconds(kint64min); if (d == min_duration) { diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/BUILD.bazel b/third_party/abseil_cpp/absl/time/internal/cctz/BUILD.bazel index 7a53c815b..45a952924 100644 --- a/third_party/abseil_cpp/absl/time/internal/cctz/BUILD.bazel +++ b/third_party/abseil_cpp/absl/time/internal/cctz/BUILD.bazel @@ -16,7 +16,7 @@ load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") package(features = ["-parse_headers"]) -licenses(["notice"]) # Apache License +licenses(["notice"]) filegroup( name = "zoneinfo", @@ -92,6 +92,11 @@ cc_library( ### tests +test_suite( + name = "all_tests", + visibility = ["//visibility:public"], +) + cc_test( name = "civil_time_test", size = "small", diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h b/third_party/abseil_cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h index d1b4222b1..8aadde57c 100644 --- a/third_party/abseil_cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +++ b/third_party/abseil_cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h @@ -416,16 +416,10 @@ class civil_time { // Assigning arithmetic. CONSTEXPR_M civil_time& operator+=(diff_t n) noexcept { - f_ = step(T{}, f_, n); - return *this; + return *this = *this + n; } CONSTEXPR_M civil_time& operator-=(diff_t n) noexcept { - if (n != (std::numeric_limits::min)()) { - f_ = step(T{}, f_, -n); - } else { - f_ = step(T{}, step(T{}, f_, -(n + 1)), 1); - } - return *this; + return *this = *this - n; } CONSTEXPR_M civil_time& operator++() noexcept { return *this += 1; } CONSTEXPR_M civil_time operator++(int) noexcept { @@ -442,13 +436,15 @@ class civil_time { // Binary arithmetic operators. friend CONSTEXPR_F civil_time operator+(civil_time a, diff_t n) noexcept { - return a += n; + return civil_time(step(T{}, a.f_, n)); } friend CONSTEXPR_F civil_time operator+(diff_t n, civil_time a) noexcept { - return a += n; + return a + n; } friend CONSTEXPR_F civil_time operator-(civil_time a, diff_t n) noexcept { - return a -= n; + return n != (std::numeric_limits::min)() + ? civil_time(step(T{}, a.f_, -n)) + : civil_time(step(T{}, step(T{}, a.f_, -(n + 1)), 1)); } friend CONSTEXPR_F diff_t operator-(civil_time lhs, civil_time rhs) noexcept { return difference(T{}, lhs.f_, rhs.f_); diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/src/time_zone_format.cc b/third_party/abseil_cpp/absl/time/internal/cctz/src/time_zone_format.cc index 2e02233ce..d8cb04742 100644 --- a/third_party/abseil_cpp/absl/time/internal/cctz/src/time_zone_format.cc +++ b/third_party/abseil_cpp/absl/time/internal/cctz/src/time_zone_format.cc @@ -654,14 +654,23 @@ const char* ParseTM(const char* dp, const char* fmt, std::tm* tm) { } // Sets year, tm_mon and tm_mday given the year, week_num, and tm_wday, -// and the day on which weeks are defined to start. -void FromWeek(int week_num, weekday week_start, year_t* year, std::tm* tm) { +// and the day on which weeks are defined to start. Returns false if year +// would need to move outside its bounds. +bool FromWeek(int week_num, weekday week_start, year_t* year, std::tm* tm) { const civil_year y(*year % 400); civil_day cd = prev_weekday(y, week_start); // week 0 cd = next_weekday(cd - 1, FromTmWday(tm->tm_wday)) + (week_num * 7); - *year += cd.year() - y.year(); + if (const year_t shift = cd.year() - y.year()) { + if (shift > 0) { + if (*year > std::numeric_limits::max() - shift) return false; + } else { + if (*year < std::numeric_limits::min() - shift) return false; + } + *year += shift; + } tm->tm_mon = cd.month() - 1; tm->tm_mday = cd.day(); + return true; } } // namespace @@ -965,7 +974,12 @@ bool parse(const std::string& format, const std::string& input, } // Compute year, tm.tm_mon and tm.tm_mday if we parsed a week number. - if (week_num != -1) FromWeek(week_num, week_start, &year, &tm); + if (week_num != -1) { + if (!FromWeek(week_num, week_start, &year, &tm)) { + if (err != nullptr) *err = "Out-of-range field"; + return false; + } + } const int month = tm.tm_mon + 1; civil_second cs(year, month, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/src/time_zone_format_test.cc b/third_party/abseil_cpp/absl/time/internal/cctz/src/time_zone_format_test.cc index e625a839f..a11f93e2a 100644 --- a/third_party/abseil_cpp/absl/time/internal/cctz/src/time_zone_format_test.cc +++ b/third_party/abseil_cpp/absl/time/internal/cctz/src/time_zone_format_test.cc @@ -1481,6 +1481,11 @@ TEST(Parse, WeekYearShift) { EXPECT_EQ(exp, tp); EXPECT_TRUE(parse("%Y-%W-%w", "2020-52-5", utc, &tp)); EXPECT_EQ(exp, tp); + + // Slipping into the previous/following calendar years should fail when + // we're already at the extremes. + EXPECT_FALSE(parse("%Y-%U-%u", "-9223372036854775808-0-7", utc, &tp)); + EXPECT_FALSE(parse("%Y-%U-%u", "9223372036854775807-53-7", utc, &tp)); } TEST(Parse, MaxRange) { diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/src/time_zone_info.cc b/third_party/abseil_cpp/absl/time/internal/cctz/src/time_zone_info.cc index 665fb424f..8039353e5 100644 --- a/third_party/abseil_cpp/absl/time/internal/cctz/src/time_zone_info.cc +++ b/third_party/abseil_cpp/absl/time/internal/cctz/src/time_zone_info.cc @@ -40,7 +40,6 @@ #include #include #include -#include #include #include #include @@ -83,6 +82,27 @@ const std::int_least32_t kSecsPerYear[2] = { 366 * kSecsPerDay, }; +// Convert a cctz::weekday to a POSIX TZ weekday number (0==Sun, ..., 6=Sat). +inline int ToPosixWeekday(weekday wd) { + switch (wd) { + case weekday::sunday: + return 0; + case weekday::monday: + return 1; + case weekday::tuesday: + return 2; + case weekday::wednesday: + return 3; + case weekday::thursday: + return 4; + case weekday::friday: + return 5; + case weekday::saturday: + return 6; + } + return 0; /*NOTREACHED*/ +} + // Single-byte, unsigned numeric values are encoded directly. inline std::uint_fast8_t Decode8(const char* cp) { return static_cast(*cp) & 0xff; @@ -188,15 +208,13 @@ bool TimeZoneInfo::ResetToBuiltinUTC(const seconds& offset) { tt.is_dst = false; tt.abbr_index = 0; - // We temporarily add some redundant, contemporary (2013 through 2023) + // We temporarily add some redundant, contemporary (2015 through 2025) // transitions for performance reasons. See TimeZoneInfo::LocalTime(). // TODO: Fix the performance issue and remove the extra transitions. transitions_.clear(); transitions_.reserve(12); for (const std::int_fast64_t unix_time : { - -(1LL << 59), // BIG_BANG - 1356998400LL, // 2013-01-01T00:00:00+00:00 - 1388534400LL, // 2014-01-01T00:00:00+00:00 + -(1LL << 59), // a "first half" transition 1420070400LL, // 2015-01-01T00:00:00+00:00 1451606400LL, // 2016-01-01T00:00:00+00:00 1483228800LL, // 2017-01-01T00:00:00+00:00 @@ -206,7 +224,8 @@ bool TimeZoneInfo::ResetToBuiltinUTC(const seconds& offset) { 1609459200LL, // 2021-01-01T00:00:00+00:00 1640995200LL, // 2022-01-01T00:00:00+00:00 1672531200LL, // 2023-01-01T00:00:00+00:00 - 2147483647LL, // 2^31 - 1 + 1704067200LL, // 2024-01-01T00:00:00+00:00 + 1735689600LL, // 2025-01-01T00:00:00+00:00 }) { Transition& tr(*transitions_.emplace(transitions_.end())); tr.unix_time = unix_time; @@ -217,8 +236,8 @@ bool TimeZoneInfo::ResetToBuiltinUTC(const seconds& offset) { default_transition_type_ = 0; abbreviations_ = FixedOffsetToAbbr(offset); - abbreviations_.append(1, '\0'); // add NUL - future_spec_.clear(); // never needed for a fixed-offset zone + abbreviations_.append(1, '\0'); + future_spec_.clear(); // never needed for a fixed-offset zone extended_ = false; tt.civil_max = LocalTime(seconds::max().count(), tt).cs; @@ -259,21 +278,6 @@ std::size_t TimeZoneInfo::Header::DataLength(std::size_t time_len) const { return len; } -// Check that the TransitionType has the expected offset/is_dst/abbreviation. -void TimeZoneInfo::CheckTransition(const std::string& name, - const TransitionType& tt, - std::int_fast32_t offset, bool is_dst, - const std::string& abbr) const { - if (tt.utc_offset != offset || tt.is_dst != is_dst || - &abbreviations_[tt.abbr_index] != abbr) { - std::clog << name << ": Transition" - << " offset=" << tt.utc_offset << "/" - << (tt.is_dst ? "DST" : "STD") - << "/abbr=" << &abbreviations_[tt.abbr_index] - << " does not match POSIX spec '" << future_spec_ << "'\n"; - } -} - // zic(8) can generate no-op transitions when a zone changes rules at an // instant when there is actually no discontinuity. So we check whether // two transitions have equivalent types (same offset/is_dst/abbr). @@ -282,117 +286,108 @@ bool TimeZoneInfo::EquivTransitions(std::uint_fast8_t tt1_index, if (tt1_index == tt2_index) return true; const TransitionType& tt1(transition_types_[tt1_index]); const TransitionType& tt2(transition_types_[tt2_index]); - if (tt1.is_dst != tt2.is_dst) return false; if (tt1.utc_offset != tt2.utc_offset) return false; + if (tt1.is_dst != tt2.is_dst) return false; if (tt1.abbr_index != tt2.abbr_index) return false; return true; } +// Find/make a transition type with these attributes. +bool TimeZoneInfo::GetTransitionType(std::int_fast32_t utc_offset, bool is_dst, + const std::string& abbr, + std::uint_least8_t* index) { + std::size_t type_index = 0; + std::size_t abbr_index = abbreviations_.size(); + for (; type_index != transition_types_.size(); ++type_index) { + const TransitionType& tt(transition_types_[type_index]); + const char* tt_abbr = &abbreviations_[tt.abbr_index]; + if (tt_abbr == abbr) abbr_index = tt.abbr_index; + if (tt.utc_offset == utc_offset && tt.is_dst == is_dst) { + if (abbr_index == tt.abbr_index) break; // reuse + } + } + if (type_index > 255 || abbr_index > 255) { + // No index space (8 bits) available for a new type or abbreviation. + return false; + } + if (type_index == transition_types_.size()) { + TransitionType& tt(*transition_types_.emplace(transition_types_.end())); + tt.utc_offset = static_cast(utc_offset); + tt.is_dst = is_dst; + if (abbr_index == abbreviations_.size()) { + abbreviations_.append(abbr); + abbreviations_.append(1, '\0'); + } + tt.abbr_index = static_cast(abbr_index); + } + *index = static_cast(type_index); + return true; +} + // Use the POSIX-TZ-environment-variable-style string to handle times // in years after the last transition stored in the zoneinfo data. -void TimeZoneInfo::ExtendTransitions(const std::string& name, - const Header& hdr) { +bool TimeZoneInfo::ExtendTransitions() { extended_ = false; - bool extending = !future_spec_.empty(); + if (future_spec_.empty()) return true; // last transition prevails PosixTimeZone posix; - if (extending && !ParsePosixSpec(future_spec_, &posix)) { - std::clog << name << ": Failed to parse '" << future_spec_ << "'\n"; - extending = false; + if (!ParsePosixSpec(future_spec_, &posix)) return false; + + // Find transition type for the future std specification. + std::uint_least8_t std_ti; + if (!GetTransitionType(posix.std_offset, false, posix.std_abbr, &std_ti)) + return false; + + if (posix.dst_abbr.empty()) { // std only + // The future specification should match the last transition, and + // that means that handling the future will fall out naturally. + return EquivTransitions(transitions_.back().type_index, std_ti); } - if (extending && posix.dst_abbr.empty()) { // std only - // The future specification should match the last/default transition, - // and that means that handling the future will fall out naturally. - std::uint_fast8_t index = default_transition_type_; - if (hdr.timecnt != 0) index = transitions_[hdr.timecnt - 1].type_index; - const TransitionType& tt(transition_types_[index]); - CheckTransition(name, tt, posix.std_offset, false, posix.std_abbr); - extending = false; - } - - if (extending && hdr.timecnt < 2) { - std::clog << name << ": Too few transitions for POSIX spec\n"; - extending = false; - } - - if (!extending) { - // Ensure that there is always a transition in the second half of the - // time line (the BIG_BANG transition is in the first half) so that the - // signed difference between a civil_second and the civil_second of its - // previous transition is always representable, without overflow. - const Transition& last(transitions_.back()); - if (last.unix_time < 0) { - const std::uint_fast8_t type_index = last.type_index; - Transition& tr(*transitions_.emplace(transitions_.end())); - tr.unix_time = 2147483647; // 2038-01-19T03:14:07+00:00 - tr.type_index = type_index; - } - return; // last transition wins - } + // Find transition type for the future dst specification. + std::uint_least8_t dst_ti; + if (!GetTransitionType(posix.dst_offset, true, posix.dst_abbr, &dst_ti)) + return false; // Extend the transitions for an additional 400 years using the // future specification. Years beyond those can be handled by // mapping back to a cycle-equivalent year within that range. - // zic(8) should probably do this so that we don't have to. - // TODO: Reduce the extension by the number of compatible - // transitions already in place. - transitions_.reserve(hdr.timecnt + 400 * 2 + 1); - transitions_.resize(hdr.timecnt + 400 * 2); + // We may need two additional transitions for the current year. + transitions_.reserve(transitions_.size() + 400 * 2 + 2); extended_ = true; - // The future specification should match the last two transitions, - // and those transitions should have different is_dst flags. Note - // that nothing says the UTC offset used by the is_dst transition - // must be greater than that used by the !is_dst transition. (See - // Europe/Dublin, for example.) - const Transition* tr0 = &transitions_[hdr.timecnt - 1]; - const Transition* tr1 = &transitions_[hdr.timecnt - 2]; - const TransitionType* tt0 = &transition_types_[tr0->type_index]; - const TransitionType* tt1 = &transition_types_[tr1->type_index]; - const TransitionType& dst(tt0->is_dst ? *tt0 : *tt1); - const TransitionType& std(tt0->is_dst ? *tt1 : *tt0); - CheckTransition(name, dst, posix.dst_offset, true, posix.dst_abbr); - CheckTransition(name, std, posix.std_offset, false, posix.std_abbr); - - // Add the transitions to tr1 and back to tr0 for each extra year. - last_year_ = LocalTime(tr0->unix_time, *tt0).cs.year(); + const Transition& last(transitions_.back()); + const std::int_fast64_t last_time = last.unix_time; + const TransitionType& last_tt(transition_types_[last.type_index]); + last_year_ = LocalTime(last_time, last_tt).cs.year(); bool leap_year = IsLeap(last_year_); - const civil_day jan1(last_year_, 1, 1); - std::int_fast64_t jan1_time = civil_second(jan1) - civil_second(); - int jan1_weekday = (static_cast(get_weekday(jan1)) + 1) % 7; - Transition* tr = &transitions_[hdr.timecnt]; // next trans to fill - if (LocalTime(tr1->unix_time, *tt1).cs.year() != last_year_) { - // Add a single extra transition to align to a calendar year. - transitions_.resize(transitions_.size() + 1); - assert(tr == &transitions_[hdr.timecnt]); // no reallocation - const PosixTransition& pt1(tt0->is_dst ? posix.dst_end : posix.dst_start); - std::int_fast64_t tr1_offset = TransOffset(leap_year, jan1_weekday, pt1); - tr->unix_time = jan1_time + tr1_offset - tt0->utc_offset; - tr++->type_index = tr1->type_index; - tr0 = &transitions_[hdr.timecnt]; - tr1 = &transitions_[hdr.timecnt - 1]; - tt0 = &transition_types_[tr0->type_index]; - tt1 = &transition_types_[tr1->type_index]; - } - const PosixTransition& pt1(tt0->is_dst ? posix.dst_end : posix.dst_start); - const PosixTransition& pt0(tt0->is_dst ? posix.dst_start : posix.dst_end); - for (const year_t limit = last_year_ + 400; last_year_ < limit;) { - last_year_ += 1; // an additional year of generated transitions + const civil_second jan1(last_year_); + std::int_fast64_t jan1_time = jan1 - civil_second(); + int jan1_weekday = ToPosixWeekday(get_weekday(jan1)); + + Transition dst = {0, dst_ti, civil_second(), civil_second()}; + Transition std = {0, std_ti, civil_second(), civil_second()}; + for (const year_t limit = last_year_ + 400;; ++last_year_) { + auto dst_trans_off = TransOffset(leap_year, jan1_weekday, posix.dst_start); + auto std_trans_off = TransOffset(leap_year, jan1_weekday, posix.dst_end); + dst.unix_time = jan1_time + dst_trans_off - posix.std_offset; + std.unix_time = jan1_time + std_trans_off - posix.dst_offset; + const auto* ta = dst.unix_time < std.unix_time ? &dst : &std; + const auto* tb = dst.unix_time < std.unix_time ? &std : &dst; + if (last_time < tb->unix_time) { + if (last_time < ta->unix_time) transitions_.push_back(*ta); + transitions_.push_back(*tb); + } + if (last_year_ == limit) break; jan1_time += kSecsPerYear[leap_year]; jan1_weekday = (jan1_weekday + kDaysPerYear[leap_year]) % 7; - leap_year = !leap_year && IsLeap(last_year_); - std::int_fast64_t tr1_offset = TransOffset(leap_year, jan1_weekday, pt1); - tr->unix_time = jan1_time + tr1_offset - tt0->utc_offset; - tr++->type_index = tr1->type_index; - std::int_fast64_t tr0_offset = TransOffset(leap_year, jan1_weekday, pt0); - tr->unix_time = jan1_time + tr0_offset - tt1->utc_offset; - tr++->type_index = tr0->type_index; + leap_year = !leap_year && IsLeap(last_year_ + 1); } - assert(tr == &transitions_[0] + transitions_.size()); + + return true; } -bool TimeZoneInfo::Load(const std::string& name, ZoneInfoSource* zip) { +bool TimeZoneInfo::Load(ZoneInfoSource* zip) { // Read and validate the header. tzhead tzh; if (zip->Read(&tzh, sizeof(tzh)) != sizeof(tzh)) return false; @@ -430,7 +425,7 @@ bool TimeZoneInfo::Load(const std::string& name, ZoneInfoSource* zip) { const char* bp = tbuf.data(); // Decode and validate the transitions. - transitions_.reserve(hdr.timecnt + 2); // We might add a couple. + transitions_.reserve(hdr.timecnt + 2); transitions_.resize(hdr.timecnt); for (std::size_t i = 0; i != hdr.timecnt; ++i) { transitions_[i].unix_time = (time_len == 4) ? Decode32(bp) : Decode64(bp); @@ -449,6 +444,7 @@ bool TimeZoneInfo::Load(const std::string& name, ZoneInfoSource* zip) { } // Decode and validate the transition types. + transition_types_.reserve(hdr.typecnt + 2); transition_types_.resize(hdr.typecnt); for (std::size_t i = 0; i != hdr.typecnt; ++i) { transition_types_[i].utc_offset = @@ -475,6 +471,7 @@ bool TimeZoneInfo::Load(const std::string& name, ZoneInfoSource* zip) { } // Copy all the abbreviations. + abbreviations_.reserve(hdr.charcnt + 10); abbreviations_.assign(bp, hdr.charcnt); bp += hdr.charcnt; @@ -525,19 +522,29 @@ bool TimeZoneInfo::Load(const std::string& name, ZoneInfoSource* zip) { transitions_.resize(hdr.timecnt); // Ensure that there is always a transition in the first half of the - // time line (the second half is handled in ExtendTransitions()) so that - // the signed difference between a civil_second and the civil_second of - // its previous transition is always representable, without overflow. - // A contemporary zic will usually have already done this for us. + // time line (the second half is handled below) so that the signed + // difference between a civil_second and the civil_second of its + // previous transition is always representable, without overflow. if (transitions_.empty() || transitions_.front().unix_time >= 0) { Transition& tr(*transitions_.emplace(transitions_.begin())); - tr.unix_time = -(1LL << 59); // see tz/zic.c "BIG_BANG" + tr.unix_time = -(1LL << 59); // -18267312070-10-26T17:01:52+00:00 tr.type_index = default_transition_type_; - hdr.timecnt += 1; } // Extend the transitions using the future specification. - ExtendTransitions(name, hdr); + if (!ExtendTransitions()) return false; + + // Ensure that there is always a transition in the second half of the + // time line (the first half is handled above) so that the signed + // difference between a civil_second and the civil_second of its + // previous transition is always representable, without overflow. + const Transition& last(transitions_.back()); + if (last.unix_time < 0) { + const std::uint_fast8_t type_index = last.type_index; + Transition& tr(*transitions_.emplace(transitions_.end())); + tr.unix_time = 2147483647; // 2038-01-19T03:14:07+00:00 + tr.type_index = type_index; + } // Compute the local civil time for each transition and the preceding // second. These will be used for reverse conversions in MakeTime(). @@ -718,12 +725,12 @@ bool TimeZoneInfo::Load(const std::string& name) { // Find and use a ZoneInfoSource to load the named zone. auto zip = cctz_extension::zone_info_source_factory( - name, [](const std::string& name) -> std::unique_ptr { - if (auto zip = FileZoneInfoSource::Open(name)) return zip; - if (auto zip = AndroidZoneInfoSource::Open(name)) return zip; + name, [](const std::string& n) -> std::unique_ptr { + if (auto z = FileZoneInfoSource::Open(n)) return z; + if (auto z = AndroidZoneInfoSource::Open(n)) return z; return nullptr; }); - return zip != nullptr && Load(name, zip.get()); + return zip != nullptr && Load(zip.get()); } // BreakTime() translation for a particular transition type. @@ -897,8 +904,8 @@ bool TimeZoneInfo::NextTransition(const time_point& tp, const Transition* begin = &transitions_[0]; const Transition* end = begin + transitions_.size(); if (begin->unix_time <= -(1LL << 59)) { - // Do not report the BIG_BANG found in recent zoneinfo data as it is - // really a sentinel, not a transition. See tz/zic.c. + // Do not report the BIG_BANG found in some zoneinfo data as it is + // really a sentinel, not a transition. See pre-2018f tz/zic.c. ++begin; } std::int_fast64_t unix_time = ToUnixSeconds(tp); @@ -923,8 +930,8 @@ bool TimeZoneInfo::PrevTransition(const time_point& tp, const Transition* begin = &transitions_[0]; const Transition* end = begin + transitions_.size(); if (begin->unix_time <= -(1LL << 59)) { - // Do not report the BIG_BANG found in recent zoneinfo data as it is - // really a sentinel, not a transition. See tz/zic.c. + // Do not report the BIG_BANG found in some zoneinfo data as it is + // really a sentinel, not a transition. See pre-2018f tz/zic.c. ++begin; } std::int_fast64_t unix_time = ToUnixSeconds(tp); diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/src/time_zone_info.h b/third_party/abseil_cpp/absl/time/internal/cctz/src/time_zone_info.h index 2a10c06c7..2467ff559 100644 --- a/third_party/abseil_cpp/absl/time/internal/cctz/src/time_zone_info.h +++ b/third_party/abseil_cpp/absl/time/internal/cctz/src/time_zone_info.h @@ -95,15 +95,14 @@ class TimeZoneInfo : public TimeZoneIf { std::size_t DataLength(std::size_t time_len) const; }; - void CheckTransition(const std::string& name, const TransitionType& tt, - std::int_fast32_t offset, bool is_dst, - const std::string& abbr) const; + bool GetTransitionType(std::int_fast32_t utc_offset, bool is_dst, + const std::string& abbr, std::uint_least8_t* index); bool EquivTransitions(std::uint_fast8_t tt1_index, std::uint_fast8_t tt2_index) const; - void ExtendTransitions(const std::string& name, const Header& hdr); + bool ExtendTransitions(); bool ResetToBuiltinUTC(const seconds& offset); - bool Load(const std::string& name, ZoneInfoSource* zip); + bool Load(ZoneInfoSource* zip); // Helpers for BreakTime() and MakeTime(). time_zone::absolute_lookup LocalTime(std::int_fast64_t unix_time, diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/src/time_zone_libc.cc b/third_party/abseil_cpp/absl/time/internal/cctz/src/time_zone_libc.cc index 47cf84c66..887dd097c 100644 --- a/third_party/abseil_cpp/absl/time/internal/cctz/src/time_zone_libc.cc +++ b/third_party/abseil_cpp/absl/time/internal/cctz/src/time_zone_libc.cc @@ -27,6 +27,12 @@ #include "absl/time/internal/cctz/include/cctz/civil_time.h" #include "absl/time/internal/cctz/include/cctz/time_zone.h" +#if defined(_AIX) +extern "C" { +extern long altzone; +} +#endif + namespace absl { ABSL_NAMESPACE_BEGIN namespace time_internal { @@ -44,7 +50,7 @@ auto tm_zone(const std::tm& tm) -> decltype(_tzname[0]) { const bool is_dst = tm.tm_isdst > 0; return _tzname[is_dst]; } -#elif defined(__sun) +#elif defined(__sun) || defined(_AIX) // Uses the globals: 'timezone', 'altzone' and 'tzname'. auto tm_gmtoff(const std::tm& tm) -> decltype(timezone) { const bool is_dst = tm.tm_isdst > 0; @@ -153,7 +159,8 @@ std::time_t find_trans(std::time_t lo, std::time_t hi, int offset) { std::tm tm; while (lo + 1 != hi) { const std::time_t mid = lo + (hi - lo) / 2; - if (std::tm* tmp = local_time(&mid, &tm)) { + std::tm* tmp = local_time(&mid, &tm); + if (tmp != nullptr) { if (tm_gmtoff(*tmp) == offset) { hi = mid; } else { @@ -163,7 +170,8 @@ std::time_t find_trans(std::time_t lo, std::time_t hi, int offset) { // If std::tm cannot hold some result we resort to a linear search, // ignoring all failed conversions. Slow, but never really happens. while (++lo != hi) { - if (std::tm* tmp = local_time(&lo, &tm)) { + tmp = local_time(&lo, &tm); + if (tmp != nullptr) { if (tm_gmtoff(*tmp) == offset) break; } } @@ -223,11 +231,10 @@ time_zone::civil_lookup TimeZoneLibC::MakeTime(const civil_second& cs) const { civil_second() + ToUnixSeconds(time_point::min()); static const civil_second max_tp_cs = civil_second() + ToUnixSeconds(time_point::max()); - const time_point tp = - (cs < min_tp_cs) - ? time_point::min() - : (cs > max_tp_cs) ? time_point::max() - : FromUnixSeconds(cs - civil_second()); + const time_point tp = (cs < min_tp_cs) ? time_point::min() + : (cs > max_tp_cs) + ? time_point::max() + : FromUnixSeconds(cs - civil_second()); return {time_zone::civil_lookup::UNIQUE, tp, tp, tp}; } diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/src/time_zone_lookup_test.cc b/third_party/abseil_cpp/absl/time/internal/cctz/src/time_zone_lookup_test.cc index 8f7ab154f..9a1a8d6e4 100644 --- a/third_party/abseil_cpp/absl/time/internal/cctz/src/time_zone_lookup_test.cc +++ b/third_party/abseil_cpp/absl/time/internal/cctz/src/time_zone_lookup_test.cc @@ -1004,13 +1004,17 @@ TEST(MakeTime, SysSecondsLimits) { #if defined(_WIN32) || defined(_WIN64) // localtime_s() and gmtime_s() don't believe in years outside [1970:3000]. #else - const time_zone utc = LoadZone("libc:UTC"); + const time_zone cut = LoadZone("libc:UTC"); const year_t max_tm_year = year_t{std::numeric_limits::max()} + 1900; - tp = convert(civil_second(max_tm_year, 12, 31, 23, 59, 59), utc); - EXPECT_EQ("2147485547-12-31T23:59:59+00:00", format(RFC3339, tp, utc)); + tp = convert(civil_second(max_tm_year, 12, 31, 23, 59, 59), cut); +#if defined(__FreeBSD__) || defined(__OpenBSD__) + // The BSD gmtime_r() fails on extreme positive tm_year values. +#else + EXPECT_EQ("2147485547-12-31T23:59:59+00:00", format(RFC3339, tp, cut)); +#endif const year_t min_tm_year = year_t{std::numeric_limits::min()} + 1900; - tp = convert(civil_second(min_tm_year, 1, 1, 0, 0, 0), utc); - EXPECT_EQ("-2147481748-01-01T00:00:00+00:00", format(RFC3339, tp, utc)); + tp = convert(civil_second(min_tm_year, 1, 1, 0, 0, 0), cut); + EXPECT_EQ("-2147481748-01-01T00:00:00+00:00", format(RFC3339, tp, cut)); #endif } } diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/version b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/version index 7f680eec3..b4410dce1 100644 --- a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/version +++ b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/version @@ -1 +1 @@ -2020a +2020d diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Abidjan b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Abidjan index 28b32ab2e0b9053f39a91d9f28b6072e41423954..8906e88c819d9ad3b794eb6356a240a74a95ffae 100644 GIT binary patch delta 27 gcmbQj*u*$Nd13+!4fq{vEfq`Svvq>I||NsB7V1NJ?AKwrLci#|(3Ca`0bO8Ln3mpIe diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Accra b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Accra index 697b9933eb72e93be3a144fe610354076a53e50a..9ca907bf9bb1ec4cc54ea34fb803d6c801b2df84 100644 GIT binary patch delta 30 jcmdnMwuWVb^5g(U79K_h1_lsjU|?XFptCud@hl?%T*w8n delta 223 zcmZ3(vVm=aa=ktS0|PSy0|VbYgS0J+O{yCfU;Y!YRCGPV(yjUzmVJBFuzXr_z=|7U z3@gj0U0AhiHpA*D=?iOSpKDla?H{nNmWg4#Ow)x8ai$F${%#A{qAu)S!P~IMy)R&Ir<)_gK8=GH_Ggte z9N_#KaM0&x!@)OI0f+T;84jOad*LX5Lc`H@4+D;Un8I*;g2;svmn9ia7R|hHYKu?9 k>EN>gXQnnVoHb>*F!>>)>f{fMT$98ti3?R(Fz%a2;gOO$8EQg5?qyc^R2fqLS delta 79 zcmdnS_?vNpvM37!0|P4q1B1xMcenm*IW+6S@rmv?CRQs*F)(NuFtGUehA_A~hA?Ow b7#SOYNE1_r3CgTsT@#}n*dVGV&XxuMumluN diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Algiers b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Algiers index ae043423130aac19d7d851c9f092fedbb3dbb698..56a4dd2a19fac5cc1bb1951dedf3ae93e0b9e321 100644 GIT binary patch delta 167 zcmcc5dX0I4v;+eZU}Rum0AY~O1ZhbS1;R=U3=C`x3=C5L|NsA=eR8(S<`_m!#x!Oo z6v)cL%EHRb3K9b`n3!1^7?|#W^fMVUurM(22{3YicnrJ@3^EFgf*=tFF(2O$h5+9X ahH%$l5D~)Q3}QIDhA?nByN2i*asdEyb`+NY delta 387 zcmcb{e4llKbUgqWkx|Nofq{XSfk8%rQILUwPk=!T zL^5*t_=Ye9_=Yfqy9R@Z5C&%u!`U^2fq{XMaiYGwB*?QMufsk5|NsC0*(W?7Y)t25 VR3yr7dvfds*~#VX8lr2+1ppYpUPb@_ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Asmara b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Asmara index 9a2918f40404340d576ce850f2950baad751f8a8..d3c0bb328ce933c3aba335781f91b7435bfef230 100644 GIT binary patch delta 32 lcmey(xQ%gw^27-&+>8ti3?R(Fz%a2;gOO$8EQg5?qyc^R2fqLS delta 79 zcmdnS_?vNpvM37!0|P4q1B1xMcenm*IW+6S@rmv?CRQs*F)(NuFtGUehA_A~hA?Ow b7#SOYNE1_r3CgTsT@#}n*dVGV&XxuMumluN diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Asmera b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Asmera index 9a2918f40404340d576ce850f2950baad751f8a8..d3c0bb328ce933c3aba335781f91b7435bfef230 100644 GIT binary patch delta 32 lcmey(xQ%gw^27-&+>8ti3?R(Fz%a2;gOO$8EQg5?qyc^R2fqLS delta 79 zcmdnS_?vNpvM37!0|P4q1B1xMcenm*IW+6S@rmv?CRQs*F)(NuFtGUehA_A~hA?Ow b7#SOYNE1_r3CgTsT@#}n*dVGV&XxuMumluN diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Bamako b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Bamako index 28b32ab2e0b9053f39a91d9f28b6072e41423954..8906e88c819d9ad3b794eb6356a240a74a95ffae 100644 GIT binary patch delta 27 gcmbQj*u*$Nd13+!4fq{vEfq`Svvq>I||NsB7V1NJ?AKwrLci#|(3Ca`0bO8Ln3mpIe diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Bangui b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Bangui index 0c80137c74865843bda4de544fbd726522ec3521..2f2ce2f7728e0830d6f033ba8f1c54b608e156f4 100644 GIT binary patch delta 27 gcmbQr*vvRVd13+!4oXR*sS&5N>fq{vEfq`RT;O78F1_ovW1_lNOJ^=<6AKws$aK{ja3Ca`0bOE!k B2qpjk diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Banjul b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Banjul index 28b32ab2e0b9053f39a91d9f28b6072e41423954..8906e88c819d9ad3b794eb6356a240a74a95ffae 100644 GIT binary patch delta 27 gcmbQj*u*$Nd13+!4fq{vEfq`Svvq>I||NsB7V1NJ?AKwrLci#|(3Ca`0bO8Ln3mpIe diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Bissau b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Bissau index 82ea5aaf0c6ae2b3ec582013b6d16e6d6f29eb0a..0da1d1e211bc6b9b081959c1d510583cb9eb7102 100644 GIT binary patch delta 53 ocmX@aIF)gNxC{dtU}Rum0AY~u1aVdn#W1nVfsM=EH^hJo0EgNIL;wH) delta 66 zcmbQrc!+U=xFjZ2><{9 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Blantyre b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Blantyre index 52753c0f87bbfa457ada89d400908a3d6537ac0e..651e5cf67a54ea3c729780cc8991407dd2a8a841 100644 GIT binary patch delta 27 gcmbQr*vvRVd13+!4oXR*sS&5N>fq{vEfq|pR?dTUq1_rqv1_lNO83hIwAKwrLXU7nR3Ca`0bOFYp B2=f2{ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Brazzaville b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Brazzaville index 0c80137c74865843bda4de544fbd726522ec3521..2f2ce2f7728e0830d6f033ba8f1c54b608e156f4 100644 GIT binary patch delta 27 gcmbQr*vvRVd13+!4oXR*sS&5N>fq{vEfq`RT;O78F1_ovW1_lNOJ^=<6AKws$aK{ja3Ca`0bOE!k B2qpjk diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Bujumbura b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Bujumbura index 52753c0f87bbfa457ada89d400908a3d6537ac0e..651e5cf67a54ea3c729780cc8991407dd2a8a841 100644 GIT binary patch delta 27 gcmbQr*vvRVd13+!4oXR*sS&5N>fq{vEfq|pR?dTUq1_rqv1_lNO83hIwAKwrLXU7nR3Ca`0bOFYp B2=f2{ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Cairo b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Cairo index d3f819623fc9ef90d327380fad15341ec1a0e202..ea38c970086c6ddca48d6f5703cee91ed1ac98b4 100644 GIT binary patch delta 81 zcmZ3?|A%vev;+eZU}Rum0AY~O1ZiFn1;X_V3=GVhe=vozOtxoIo4lM!NW{lCgu&G{ Q7(|3HaJjmM=o)bW0IUoQW&i*H delta 687 zcmeyvxtM=~bUh0L1k^JyFo4*+4GatnCnj%saN<|>g_D2YKR9*##f8(S*Cm{}uX*9@ znuib09s6?Oe1F=53o9!xTx>~raH(r;zzehFgco0Q1730OOn7xQ;lk@TzdpR#n#=I^ zeEo-a(?2o1->|vhL#1lN$BEBAe2R)>_*^Vi@Wr~P;cIC9{DN`_SKpKezXN_`9^J;oqK51^?T&F)++i{lJ+1vVo~SvVhrBmVqVl zUIDB2A_g{R!4K>_R~tA~TnjkfaWZhRR(#+(Z_~j2{O<>zjRzZePZ}2RP5R2fzbfT} zK#4|!VE2pyq0krx;rcw;0ul3v45I!4AH*a@8pIb&{viI#gF&)j@dwG<)eTZ#Y(7Zu zV`z}MT2LT6--JPK+u{%M4e1RE)2|mOCeCJ1s){L4c2QtZNm4IRRSj-XvpHO#&eqPL zA^Yuv#`9ebS`5`6v`*PKXg^$EptHJ|LHE$34|+Yz8uS+kKQPGVxlnId|Mh{9*SibG z@z)=iXkEBqYQOV=8P}!@<{H-$%s-zGu;kd0V0n3CfYpmx3D%n@2iTmbNwA$<8eq2~ zF2TMyJiuXM)dR^q+5n^5g&}7H&oc1_lsjU|`s6z+}Y4?0b5_QkeXdt(N(@*n-Ka?6u4dixnn6W%p&CU%X(lDTgkz Ml>UOvsT>lF02j9-UjP6A delta 493 zcmey*_g83wa(z4l0|P4q0|U>rz@KxD{TFFC9l7CR-*Hn2@d;fJDju^SwB~_A=xUY)VLIju!oJ%r2oG*w z5Z<^(Awo1nA>z8if=Gog3nC+e7eszFQ;6Emv>@vH9EE7r0}G%nQNI> z9afl}&QibCz1>yLS{Or?b{FmuD=P{G8R7d77odWOFuMW`VB?o734O7y-dQ B(y{;m diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Ceuta b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Ceuta index 850c8f06fa7918684e67e9ab8192ac933dac90b3..a461dceaa2adccd6cb3196b6eccf5395130881ff 100644 GIT binary patch delta 160 zcmeyuzlmjnxC{dtU}Rum0AY~u1aUzS1;g453=FKBC75Fv;~AN-KxP(f@c;kcEKn0z p7#R2j7&$;B11|%Ei~^&ek8cP=xGM+;hcGz1f^cvM!{i(6G62WR54QjS literal 2036 zcmWHE%1kq2zyRzF3=AL)lBk2S#TpnG80K9oEttPBFJTqy`+`-^^BC5iT>fF*awCTI z3;YWSju7EtmD5m2^q6;RPJ6Ht{=7f|Do5Kw1zo}m8K zWP-+1)d`wc#U^MSWuKtE<;Mh_B`+uFPPsKfujTXv{gOQs3{uukFpRw^U{th4z}R-T zfJx9a0aMwz0%k@P0%m{f1uUeeOt83{C}8=!Y=YHZX94Tm5ff~d#ZR!^Z8gEJ&2fVL zY?%oTY048ETPy{f+*l_#r$`I9s6Lik#0jrHUNcjfy6?(d!ncrqUp@H}@y!0Yj1 z0q=FI1boiypWxfqBjC4Y;ROG@Jb{3o<_Uq}T@!+GQYQqP=S&Fkai0(>?l&P!M{`2h zcY_HLqHY2a*M%lTe$^0&+V*8a^i?i_m<56Yv0L5<#MOTmh@Wy!AR+#$Kw|By2}$dhz6A@83Uq0!p0@0xI2tyd-a&`^THFS0j4$<*7)-%;J(D5}i0MYu!TmXKK_RatR diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Conakry b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Conakry index 28b32ab2e0b9053f39a91d9f28b6072e41423954..8906e88c819d9ad3b794eb6356a240a74a95ffae 100644 GIT binary patch delta 27 gcmbQj*u*$Nd13+!4fq{vEfq`Svvq>I||NsB7V1NJ?AKwrLci#|(3Ca`0bO8Ln3mpIe diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Dakar b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Dakar index 28b32ab2e0b9053f39a91d9f28b6072e41423954..8906e88c819d9ad3b794eb6356a240a74a95ffae 100644 GIT binary patch delta 27 gcmbQj*u*$Nd13+!4fq{vEfq`Svvq>I||NsB7V1NJ?AKwrLci#|(3Ca`0bO8Ln3mpIe diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Dar_es_Salaam b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Dar_es_Salaam index 9a2918f40404340d576ce850f2950baad751f8a8..d3c0bb328ce933c3aba335781f91b7435bfef230 100644 GIT binary patch delta 32 lcmey(xQ%gw^27-&+>8ti3?R(Fz%a2;gOO$8EQg5?qyc^R2fqLS delta 79 zcmdnS_?vNpvM37!0|P4q1B1xMcenm*IW+6S@rmv?CRQs*F)(NuFtGUehA_A~hA?Ow b7#SOYNE1_r3CgTsT@#}n*dVGV&XxuMumluN diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Djibouti b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Djibouti index 9a2918f40404340d576ce850f2950baad751f8a8..d3c0bb328ce933c3aba335781f91b7435bfef230 100644 GIT binary patch delta 32 lcmey(xQ%gw^27-&+>8ti3?R(Fz%a2;gOO$8EQg5?qyc^R2fqLS delta 79 zcmdnS_?vNpvM37!0|P4q1B1xMcenm*IW+6S@rmv?CRQs*F)(NuFtGUehA_A~hA?Ow b7#SOYNE1_r3CgTsT@#}n*dVGV&XxuMumluN diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Douala b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Douala index 0c80137c74865843bda4de544fbd726522ec3521..2f2ce2f7728e0830d6f033ba8f1c54b608e156f4 100644 GIT binary patch delta 27 gcmbQr*vvRVd13+!4oXR*sS&5N>fq{vEfq`RT;O78F1_ovW1_lNOJ^=<6AKws$aK{ja3Ca`0bOE!k B2qpjk diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/El_Aaiun b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/El_Aaiun index 066fbed008cf662455eeca2c012ab8cb5bf1731a..772e23c4cd8bb1942efdc18155585f9b8f0e8429 100644 GIT binary patch delta 111 zcmew^xQuUt@?-@j79K_h1_lsjU|?XFpuAa~X&WQ6@971TA28Q4KaWtDoWN4c-0)<< zP-Gh)?K(Q1O@rp*8gn6hc?CEC|yvUl8`) zZb5i(`-1SsH3|`;Aqo-K6&6G)d|40~5xgMstC>R7cBTbU-{&Yqs~%VoeN{ps=A83_ zm_Hc`akDoph`Y?cAfYHiAz?wyf+YK+3Q6TE3Mpba3sPJrDx|&@QAm@vSdhM}Q6c@~ z1BJ|q8VfS_`zmCoUr@-7n)+oyuBoj;Zq6KqeC{U;@~t=(3T_52C=}SRplJP1g`#`1 z3rgA+EGXG>RG}<{cR^Wq&VmZ9tqK(pHy2d?P*SMUZ&av0cXB}uo5q6LrG*N$m!~eM zFS@5tzsh#99$V<-muw~zlsATLV`O%js4$tIsh0Vk?1IVtOtsAAs}v^lGuJW;nk|^z z&s@vA>afCOewJEh7ykv5`&nw4@7__E%+FfOT%NIDazCpt^E69^$@f`xnFYQoZ02VZ GX9NJ7dAOzk diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Freetown b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Freetown index 28b32ab2e0b9053f39a91d9f28b6072e41423954..8906e88c819d9ad3b794eb6356a240a74a95ffae 100644 GIT binary patch delta 27 gcmbQj*u*$Nd13+!4fq{vEfq`Svvq>I||NsB7V1NJ?AKwrLci#|(3Ca`0bO8Ln3mpIe diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Gaborone b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Gaborone index 52753c0f87bbfa457ada89d400908a3d6537ac0e..651e5cf67a54ea3c729780cc8991407dd2a8a841 100644 GIT binary patch delta 27 gcmbQr*vvRVd13+!4oXR*sS&5N>fq{vEfq|pR?dTUq1_rqv1_lNO83hIwAKwrLXU7nR3Ca`0bOFYp B2=f2{ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Harare b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Harare index 52753c0f87bbfa457ada89d400908a3d6537ac0e..651e5cf67a54ea3c729780cc8991407dd2a8a841 100644 GIT binary patch delta 27 gcmbQr*vvRVd13+!4oXR*sS&5N>fq{vEfq|pR?dTUq1_rqv1_lNO83hIwAKwrLXU7nR3Ca`0bOFYp B2=f2{ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Johannesburg b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Johannesburg index b1c425daced454f53d7d18fea807bf8d081cf97e..bada0638f8a2224a603f13afff16c0d8e986a591 100644 GIT binary patch delta 27 gcmeyyxQ}sy^27!f9!3TR1`uXoU|^V_GjV!609vL6&;S4c delta 44 zcmdnT_>FObvMd_|0|N^K0|RFR0|P^o+xd($>v|f_&dV=2*O%8Yv0HnB^2D$V03Y`c Ad;kCd diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Juba b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Juba index 625b1acccfa7fa206b39f61aafa69dfd5d65cfc4..36b05220ac0090ee29bb5d3f292f4e881e222a27 100644 GIT binary patch delta 30 dcmeBWJ;*#kS%86ofq@Z)&zmJ;sC*p=LtgT z%Pt6KoJa|kiOs@AagPIf$YY* Y3lP%4H7?#Zl0LEZGHUIzs diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Kampala b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Kampala index 9a2918f40404340d576ce850f2950baad751f8a8..d3c0bb328ce933c3aba335781f91b7435bfef230 100644 GIT binary patch delta 32 lcmey(xQ%gw^27-&+>8ti3?R(Fz%a2;gOO$8EQg5?qyc^R2fqLS delta 79 zcmdnS_?vNpvM37!0|P4q1B1xMcenm*IW+6S@rmv?CRQs*F)(NuFtGUehA_A~hA?Ow b7#SOYNE1_r3CgTsT@#}n*dVGV&XxuMumluN diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Khartoum b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Khartoum index 8ee8cb92e72d9c507ad0ee06dc6a38406ab06f34..3f8e44b8a6e171a0fde96736ed9d4fcde1bcd4a8 100644 GIT binary patch delta 36 pcmZ3^dWw01@?-@@79K_h1_lsjU|?XFpw7s$*@!WmadJPC1ORvF1}Ojl delta 236 zcmX@byqtA{a=kJG0|P4q1B2kU#kUw3=7~RGtTG8;s{Q$ZIXe9UOG4cPR@*lh*c=ib zu*)k1a40xE;A9BCz{Q~Qfa_s<0QUp72Rui30(keoc)+*R{sR9>)&zmJ;sC*p=LtgT z%Pt6KoJKMW>L75fo_>Ixw QjB+^Ca5+1M=o)bW0Pssn@Bjb+ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Kigali b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Kigali index 52753c0f87bbfa457ada89d400908a3d6537ac0e..651e5cf67a54ea3c729780cc8991407dd2a8a841 100644 GIT binary patch delta 27 gcmbQr*vvRVd13+!4oXR*sS&5N>fq{vEfq|pR?dTUq1_rqv1_lNO83hIwAKwrLXU7nR3Ca`0bOFYp B2=f2{ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Kinshasa b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Kinshasa index 0c80137c74865843bda4de544fbd726522ec3521..2f2ce2f7728e0830d6f033ba8f1c54b608e156f4 100644 GIT binary patch delta 27 gcmbQr*vvRVd13+!4oXR*sS&5N>fq{vEfq`RT;O78F1_ovW1_lNOJ^=<6AKws$aK{ja3Ca`0bOE!k B2qpjk diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Lagos b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Lagos index 0c80137c74865843bda4de544fbd726522ec3521..2f2ce2f7728e0830d6f033ba8f1c54b608e156f4 100644 GIT binary patch delta 27 gcmbQr*vvRVd13+!4oXR*sS&5N>fq{vEfq`RT;O78F1_ovW1_lNOJ^=<6AKws$aK{ja3Ca`0bOE!k B2qpjk diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Libreville b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Libreville index 0c80137c74865843bda4de544fbd726522ec3521..2f2ce2f7728e0830d6f033ba8f1c54b608e156f4 100644 GIT binary patch delta 27 gcmbQr*vvRVd13+!4oXR*sS&5N>fq{vEfq`RT;O78F1_ovW1_lNOJ^=<6AKws$aK{ja3Ca`0bOE!k B2qpjk diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Lome b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Lome index 28b32ab2e0b9053f39a91d9f28b6072e41423954..8906e88c819d9ad3b794eb6356a240a74a95ffae 100644 GIT binary patch delta 27 gcmbQj*u*$Nd13+!4fq{vEfq`Svvq>I||NsB7V1NJ?AKwrLci#|(3Ca`0bO8Ln3mpIe diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Luanda b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Luanda index 0c80137c74865843bda4de544fbd726522ec3521..2f2ce2f7728e0830d6f033ba8f1c54b608e156f4 100644 GIT binary patch delta 27 gcmbQr*vvRVd13+!4oXR*sS&5N>fq{vEfq`RT;O78F1_ovW1_lNOJ^=<6AKws$aK{ja3Ca`0bOE!k B2qpjk diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Lubumbashi b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Lubumbashi index 52753c0f87bbfa457ada89d400908a3d6537ac0e..651e5cf67a54ea3c729780cc8991407dd2a8a841 100644 GIT binary patch delta 27 gcmbQr*vvRVd13+!4oXR*sS&5N>fq{vEfq|pR?dTUq1_rqv1_lNO83hIwAKwrLXU7nR3Ca`0bOFYp B2=f2{ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Lusaka b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Lusaka index 52753c0f87bbfa457ada89d400908a3d6537ac0e..651e5cf67a54ea3c729780cc8991407dd2a8a841 100644 GIT binary patch delta 27 gcmbQr*vvRVd13+!4oXR*sS&5N>fq{vEfq|pR?dTUq1_rqv1_lNO83hIwAKwrLXU7nR3Ca`0bOFYp B2=f2{ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Malabo b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Malabo index 0c80137c74865843bda4de544fbd726522ec3521..2f2ce2f7728e0830d6f033ba8f1c54b608e156f4 100644 GIT binary patch delta 27 gcmbQr*vvRVd13+!4oXR*sS&5N>fq{vEfq`RT;O78F1_ovW1_lNOJ^=<6AKws$aK{ja3Ca`0bOE!k B2qpjk diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Maputo b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Maputo index 52753c0f87bbfa457ada89d400908a3d6537ac0e..651e5cf67a54ea3c729780cc8991407dd2a8a841 100644 GIT binary patch delta 27 gcmbQr*vvRVd13+!4oXR*sS&5N>fq{vEfq|pR?dTUq1_rqv1_lNO83hIwAKwrLXU7nR3Ca`0bOFYp B2=f2{ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Maseru b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Maseru index b1c425daced454f53d7d18fea807bf8d081cf97e..bada0638f8a2224a603f13afff16c0d8e986a591 100644 GIT binary patch delta 27 gcmeyyxQ}sy^27!f9!3TR1`uXoU|^V_GjV!609vL6&;S4c delta 44 zcmdnT_>FObvMd_|0|N^K0|RFR0|P^o+xd($>v|f_&dV=2*O%8Yv0HnB^2D$V03Y`c Ad;kCd diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Mbabane b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Mbabane index b1c425daced454f53d7d18fea807bf8d081cf97e..bada0638f8a2224a603f13afff16c0d8e986a591 100644 GIT binary patch delta 27 gcmeyyxQ}sy^27!f9!3TR1`uXoU|^V_GjV!609vL6&;S4c delta 44 zcmdnT_>FObvMd_|0|N^K0|RFR0|P^o+xd($>v|f_&dV=2*O%8Yv0HnB^2D$V03Y`c Ad;kCd diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Mogadishu b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Mogadishu index 9a2918f40404340d576ce850f2950baad751f8a8..d3c0bb328ce933c3aba335781f91b7435bfef230 100644 GIT binary patch delta 32 lcmey(xQ%gw^27-&+>8ti3?R(Fz%a2;gOO$8EQg5?qyc^R2fqLS delta 79 zcmdnS_?vNpvM37!0|P4q1B1xMcenm*IW+6S@rmv?CRQs*F)(NuFtGUehA_A~hA?Ow b7#SOYNE1_r3CgTsT@#}n*dVGV&XxuMumluN diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Monrovia b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Monrovia index 6d688502a1ca80f2e57a6de2790ac3193879d248..837780922f23fc58ff7f73930954840e9c63c908 100644 GIT binary patch delta 28 ccmcb>xP);M1& diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Nairobi b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Nairobi index 9a2918f40404340d576ce850f2950baad751f8a8..d3c0bb328ce933c3aba335781f91b7435bfef230 100644 GIT binary patch delta 32 lcmey(xQ%gw^27-&+>8ti3?R(Fz%a2;gOO$8EQg5?qyc^R2fqLS delta 79 zcmdnS_?vNpvM37!0|P4q1B1xMcenm*IW+6S@rmv?CRQs*F)(NuFtGUehA_A~hA?Ow b7#SOYNE1_r3CgTsT@#}n*dVGV&XxuMumluN diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Ndjamena b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Ndjamena index a968845e29b8b2b47d4a73f74ae04ef681d7d485..ecbc0966dc2dc01fd4f93139318eccc0dddce5a6 100644 GIT binary patch delta 27 gcmX@kxPWnj^27ob9!3TR1`uXoU|^V_GqKGP08v8)L;wH) delta 32 lcmZ3$c${&9vLG`90|N;2PI}gmB9vBGFtJ!|g7U;LF93lU2?PKD diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Niamey b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Niamey index 0c80137c74865843bda4de544fbd726522ec3521..2f2ce2f7728e0830d6f033ba8f1c54b608e156f4 100644 GIT binary patch delta 27 gcmbQr*vvRVd13+!4oXR*sS&5N>fq{vEfq`RT;O78F1_ovW1_lNOJ^=<6AKws$aK{ja3Ca`0bOE!k B2qpjk diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Nouakchott b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Nouakchott index 28b32ab2e0b9053f39a91d9f28b6072e41423954..8906e88c819d9ad3b794eb6356a240a74a95ffae 100644 GIT binary patch delta 27 gcmbQj*u*$Nd13+!4fq{vEfq`Svvq>I||NsB7V1NJ?AKwrLci#|(3Ca`0bO8Ln3mpIe diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Ouagadougou b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Ouagadougou index 28b32ab2e0b9053f39a91d9f28b6072e41423954..8906e88c819d9ad3b794eb6356a240a74a95ffae 100644 GIT binary patch delta 27 gcmbQj*u*$Nd13+!4fq{vEfq`Svvq>I||NsB7V1NJ?AKwrLci#|(3Ca`0bO8Ln3mpIe diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Porto-Novo b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Porto-Novo index 0c80137c74865843bda4de544fbd726522ec3521..2f2ce2f7728e0830d6f033ba8f1c54b608e156f4 100644 GIT binary patch delta 27 gcmbQr*vvRVd13+!4oXR*sS&5N>fq{vEfq`RT;O78F1_ovW1_lNOJ^=<6AKws$aK{ja3Ca`0bOE!k B2qpjk diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Sao_Tome b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Sao_Tome index 59f3759c409a1fb50e632ef5ef613d3fee7af7ef..425ad3fda7c517742fe01db74e38c0130be4a7ab 100644 GIT binary patch delta 82 zcmeyzxR!B(xC{dtU}Rum0AY~u1aUzS1;Z>13=Aw2=cqF>O>~eD^6?E}aQ6*i2zLx& L;Bxm3G2j9KMwJP2 literal 254 zcmWHE%1kq2zyPca3=AL)l3;=K)ZwQ0CZwN!UV+aES10zU~k%55}JOBUx|3A*=uK|b#*$pxR QWIu?e#0^~Tz99x&0Q0IRegFUf diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Timbuktu b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Timbuktu index 28b32ab2e0b9053f39a91d9f28b6072e41423954..8906e88c819d9ad3b794eb6356a240a74a95ffae 100644 GIT binary patch delta 27 gcmbQj*u*$Nd13+!4fq{vEfq`Svvq>I||NsB7V1NJ?AKwrLci#|(3Ca`0bO8Ln3mpIe diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Tripoli b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Tripoli index 07b393bb7db14cef1e906ebe63cfbbe8cddc79d5..e0c89971aabea2c87842a9276b043d0fd946e34e 100644 GIT binary patch delta 30 jcmey!vYvT@@?-%<79K_h1_lsjU|?XFptD(#F@O;OT%!c@ delta 151 zcmZ3_{E=mXa=iir0|N^K1B2kgPX|@*?%pVHPkC*^!-`7+51*$#c&cw-@O0&w2e18( zeGr@ElpxOWy+Hhz_5+DmS|22D$0tagS^q(L?~??XEma?6=Zim(o6KDx-}Ej)p}?y^ zF|qD}QqcJVWf$fLDke-HR8`Fr)Eu^dF!KADVC-U6U}Bo}AYd-rOoqUan+=nr8GR=x JZw!lM1OON5L0|v? diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Tunis b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Tunis index 427fa563033fdd8533ae56337fa20befe9719b42..ca324cb4cd26cc29529faaee4c0465ae0cecc8f6 100644 GIT binary patch delta 97 zcmdnUdXRa7v={>tU}Rum0AU7($^4A6yf7Ih1_lO}&6bR!jQq?@C~$Htla_>!ZwNzx VZwQ04YcPliVc>Fh4be5^0sypr3e*4q delta 299 zcmX@eypeT+bUhmb1Sl~uFo4*C4Gatn6B7dbk6Cp*I36)C;rMN(2d5r|JUG2J^TV0v z-U4S=icdIuNQ~j^nGFKx7MU`fpJXC%q4V*Bi$!7rm;A&Mc#q%zz}LB^fPYoW2Z0i) z0;R=PACzr0KB(wOeo&R+`k-cWxImp%y}+r2_k**IRs(~J>hlS%&VL2mSWixHSH3Uc z{_dH8C-Xr8MiwS!CKgsWoLtYSrO3d*C&0kVz#yZ*$l>D~!Vusa!r<&03?f1p7#J8C jCmPD~g8TvU71&Q3qeU6{u^6RA&?p85E@#&eT|+Jamr74U diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Windhoek b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Windhoek index abecd137b1fc3220637b22ffea0e7256a58e9377..0edc52b9b783827a8ac1090fe350bfe13977f745 100644 GIT binary patch delta 27 dcmdnZ{*PsXGCuv|f_&dV=QV_W_}x950*UZ#wIe(g&J z1CM_KhUu&gMj8(UjNP6$mV@*Aut zwoI^D-@{;Am^Q(#Kaasas#(AxKY+o}DpkPA--y9k%3Z)kKS_ka<(H;_8{anuw_Dr- z?mvVYJPxZ*@Vx$|!D}(+1n=$F8hn~wPw<_-qrorf>;(VvSq%YB>n8*zY-b2knm8fY zVJ1Te_d0=4g=&V-*AoQ78Dbg2PZtS9Jg{eoTpc37$i&PvS&&J4vH}y^WE&>y3CbJ8 GG?)O1s$2B{ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Adak b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Adak index 43236498f681cc06f64ca2afa613880331fe6fbb..b1497bda631efdcb6635ffb6b0ee6f7da9e2a280 100644 GIT binary patch delta 75 zcmdlYbdr67xHtnEU}RumU}RvJoWLx@i!2qgxs!PX6DuPVGYivX1rC|XRvgBYS8>En ImgbZM06p6Z6#xJL delta 1351 zcmX@fzC~z)cs(Zr0|N*%FfcGofU*@E7#J8%ce-4-r2M7eQeuF^uS=mD{_Q9X_`f2= zfni2)0Aq)l15<@*0CQo`0hYwT3#@@A2iP2qFR&Ym9boUxy}&8(;{fN{mjPTKZXMu$ zaPtDs&F>Dp2XY>RP)D)c#qni2V27AZn?UL-f6i z1~Dyv9AfuvHi%2P=MX<{szHM9uLFtg8#g5B-Z_w*K6yh5@4f@6?xh=2-!3?it{%Q2 z{cO{LOm@o+nQK!HWIdOz-;h16(IMx8g+XpvvP0emDTDklSBHZBKL&+n>JCNu_Y8`~ zI2}s-4;YmES3OW>ac4u>ef9$t68kn(?0b2j^2dS=Rr5|CsJ_v(p{8!_f!ZA@8|vcv z57f_a+rY@g%*euu53+HvbJVkQ&i9 zU<9Rq5N4dHC&SCdz`y{)Ac2V+!&flXgIJ(=1k;xXa>=ss0PuX=mycCC_fM`(K0MVfI0ir=^1Vn?<35W)z6%Y+dFCZF}Wsbdi06xC{dtU}Rum0AY~u1aV#v1;ZhmCor#InykPPGI=9MiWHZlcW{WMqqj?l Uj<2zvk)DB$uc4uyp`HO300f*3>Hq)$ delta 1374 zcmcb}epqONcs(Zr0|N*%FfcGofU-3j7#J8%cbXlzr2M7eQlgW=uS@O={_RM1_`kx< zfMJHK17nAV0aJy#19PFv29`wU1FV5+8`vCG53n0@Y+&z=Kfo#QY6Ium+YVeG&TQa* zaQXnx&6fte2i6|o+j-i6f8{9$fthO!1UuI_2vyei8wh9iIfz6S8i;xpIEYyW8;ENL zIY=nwZ;<3PagbsP+#sbbA|Un2X@m45)dez_R5r*SVqYM)iEV@Y!j}sa$}9~O8&5A# z3X?Wa&U&GsV*1xW)$5dkn&^E4b*(iD>i>Rk(B$e<(7bndgVw781?_$NH|SjMS)e;_ z;Re0Uc?zX$hOb%FJn7+WksMu(Mv3rw&NwCNQQ}q-BGox<{%-P)xEM$ZgES_r^ zSpNR1V0E0!!20%e1)B|O8*F#)RIr=CvB7@!Yz2q>R~sB#wl8qyxztrc+WYw!RK1Vf_mSY#T)##MJ@1;Y26So z&1ONMP5OqQGPwo8GM*bk!Wb5W{L$VJX8LGB*i#RK2)X|X5l6KQBL6*9h+4{H5Pk2k zLQKm$gV=pb72;AZ7{t$OS4i-Evmvp4@q#4Xa~qP=TNkA8ZrG6Op1vUU?W7Iq>YfYI z&z5Y+WY=Dhxi)M=)^pza1=-Vz4RS7MDdd)g8su%@QOFN7Hz??Tr%-4nX;74ZL7`am zw?T>jCWVs!;v32=&Mhdr_j5yq#D)bG`)+Tj{4r@k)x5nMs&AAmsHvO3p>{{ug1WfI z4fQiD7BDg~GqSMagKQk^9QEuR^nwfwM}9Cc{QqB^z`*kVe`5h7$N&G0lk=E8c^McO z7(wYDgc&F5$?$S9Fff2HNMPc|@D)t;AQmVd!SvOnLp`oZ)c?fMNM1}GhX>8BoG3qk1t z#0RAb5DiKfAR3f5Kr|?QfM`$}0nwmz0-`}_1w@0=3y21#84wLhHy|36c0e>J{eb8c z-uew-2Y?b1NC1?WKr|>pf$6g)V0lo&0`WnK3q)r<=Uo7zL1_#`gVGs@2BkF+4N7ky z8kFWhG$`GHXi(Y%(V+APqKmUde}jDtN{Aofq{vEfq`SPx$zpt|NoDLFfjc8fBXOgi;r&zgJWfq{vEfq`SPx$zpt|NoDLFfjc8fBXOgi;r&zgJW@`Y`Ja=i%y0|PSy0|U>rRV4;H_&p!&`0KD>=SLHRUH3{9Zdt4|xb^y%!5ztm z8}96kRJi+F)ZpIidkXjO&N6rqVyy6G`u`1IS>qJG9Y`_w&L_9vN1%?ukK;!besNve z@N3171;5|08T{$4T_Ah1&p@u?`U3d{rW+KD&o5AH%rsEqKCwVKB1&L`@}mL;Rr609 zRIeOYFleYWFqHLOU=*&f!I&*e!NelOz~sk41v3SC1GDoP3(UVA+hDPyRl)N9V*{&x zodwn>{%^3!=UZTVWTJtc--iVO&8Y@~3YH7%|Ns9#nUP6zvH%m;WKAad3CfHn8^aec NaxgG3FrZ1Q0|0H}bCdu8 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Buenos_Aires b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Buenos_Aires index 260f86a9180677d86fc3280b06f01d6a6cd91c94..d6f999b8605c9f73653a16e2ddbd5a49b96c0f56 100644 GIT binary patch delta 54 zcmdnOafEe(^5hMSEIf=13=AO5z`(#TL7CBZ^FGE8jEszv4>HS7c3|Y1{D4__auTD( IWE~a`08%Rqy8r+H delta 317 zcmX@Yx`ktca=je`0|Ofa1A|Bd0|UdNN&N=fs)HQ1OP$=XL$2Rp$CUzuUE;L|c5Pj} zVfT-X4tu6uH`sgg$$@DN z2H%VX9KJo9zu||l^MN17FB|;)Qtt5Uve|~;hfNRs*%NH=cTJGPzd5D`|9eav*cW?k z;84k5pgd*k1{HxR3slWNZBYGCwm@Bx-$4CB!~#u*j|Q3>tQKfJxNM+3GhD&^+p!H6 z`?WT>mve4#zf-T^@oUir&pn9>^(_DY|7V;Wz@#`io{3{}A(QarW+uxC%8Yg!!#^-` NGB7YO)MHWM2mohKmAn7| diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Catamarca b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Catamarca index 0ae222a2f8bb2fb1b7abe17d08e076674c51541d..1dcc8d85434c9d016f170cb2f16811ebef327b77 100644 GIT binary patch delta 54 zcmdnOafEe(^5hMSEIf=13=AO5z`(#TL7CBZ^FGE8jEszv4>HS7c3|Y1{D4__auTD( IWE~a`08%Rqy8r+H delta 317 zcmX@Yx`ktca=je`0|Ofa1A|Bd0|UdNN&N=fs)HQ1OP$=XL$2Rp$CUzuUE;L|c5Pj} zVfT-X4tu6uH`sgg$$@DN z2H%VX9KJo9zu||l^MN17FB|;)Qtt5Uve|~;hfNRs*%NH=cTJGPzd5D`|9eav*cW?k z;84k5pgd*k1{HxR3slWNZBYGCwm@Bx-$4CB!~#u*{|=fPtQKfJxNM+3GhD&^+p!H6 z`?WSW?EYxraFzRjdpYL@_dE3p^(_DY|7V;Wz@#`io{3{}A(QarW+uxC%8Yg!!#^-` NGB7YO)MHWM2mo(KmAn7| diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/ComodRivadavia b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/ComodRivadavia index 0ae222a2f8bb2fb1b7abe17d08e076674c51541d..1dcc8d85434c9d016f170cb2f16811ebef327b77 100644 GIT binary patch delta 54 zcmdnOafEe(^5hMSEIf=13=AO5z`(#TL7CBZ^FGE8jEszv4>HS7c3|Y1{D4__auTD( IWE~a`08%Rqy8r+H delta 317 zcmX@Yx`ktca=je`0|Ofa1A|Bd0|UdNN&N=fs)HQ1OP$=XL$2Rp$CUzuUE;L|c5Pj} zVfT-X4tu6uH`sgg$$@DN z2H%VX9KJo9zu||l^MN17FB|;)Qtt5Uve|~;hfNRs*%NH=cTJGPzd5D`|9eav*cW?k z;84k5pgd*k1{HxR3slWNZBYGCwm@Bx-$4CB!~#u*{|=fPtQKfJxNM+3GhD&^+p!H6 z`?WSW?EYxraFzRjdpYL@_dE3p^(_DY|7V;Wz@#`io{3{}A(QarW+uxC%8Yg!!#^-` NGB7YO)MHWM2mo(KmAn7| diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Cordoba b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Cordoba index da4c23a545b3603bcdd4555ba8feba117802e7b4..35a52e53d123b5ef5d293b3af19046630f02bb66 100644 GIT binary patch delta 54 zcmdnOafEe(^5hMSEIf=13=AO5z`(#TL7CBZ^FGE8jEszv4>HS7c3|Y1{D4__auTD( IWE~a`08%Rqy8r+H delta 317 zcmX@Yx`ktca=je`0|Ofa1A|Bd0|UdNN&N=fs)HQ1OP$=XL$2Rp$CUzuUE;L|c5Pj} zVfT-X4tu6uH`sgg$$@DN z2H%VX9KJo9zu||l^MN17FB|;)Qtt5Uve|~;hfNRs*%NH=cTJGPzd5D`|9eav*cW?k z;84k5pgd*k1{HxR3slWNZBYGCwm@Bx-$4CB!~#u*{|=fPtQKfJxNM+3GhD&^+p!H6 z`?WT>mve4#zf-T^@oUir&pn9>^(_DY|7V;Wz@#`io{3{}A(QarW+uxC%8Yg!!#^-` NGB7YO)MHWM2mo?JmD&IR diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Jujuy b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Jujuy index 604b85663672d83658f331a69cc8f41cf2a2b5a1..b275f27c0287415674d2ccc850c3d612f4a45b0f 100644 GIT binary patch delta 50 ycmbQiv59qpvH$}E0|O%zgV+<48Lc;OVSK>I$T(S%QFXEbBgmGnqzRG$ delta 340 zcmdnQI)h_^a=i@$0|Ofa1A|Bd0|UdNN&N=fs)HQ1OP$=XL$2Rp$CUzuUE;L|c5Pj} zVfT-X4tu6uH`sgg$$@DN z2H%VX9KJo9zu||l^MN17FB|;)Qtt5Uve|~;hfNRs*%NH=cTJGPzd5D`|9eav*cW?k z;84k5pgd*k1{HxR3slWNZBYGCwm@Ag{DAtS+Z#0AbvbBmuv(z?;Ie`C%y0$sZ^t%R z?AO}hUe39}{Z73?{r~^}8JU=wm?yh1$xilX;t*tI0YN5aCJ@cc%ECIikjZj_GNaAL W@CS^X3=9kmU_Fx^m=tlUcLV^J8ZBgf>o%p#MSSR4T5776$O delta 303 zcmX@hdWd6!a=kqR0|Ofa1A|Bd0|UdNN&N=fs)HQ1OP$=XL$2Rp$CUzuUE;L|c5Pj} zVfT-X4tu6uH`sgg$$@DN z2H%VX9KJo9zu||l^MN17FB|;)Qtt5Uve|~;hfNRs*%NH=cTJGPzd5D`|9eav*cW?k z;84k5pgd*k1{HxR3slWNZBYGCwm@Bx-$4EB)&&}BY7UwV9}P4&SS`?caM?h6X1Id+ zw__VD_G@i$*!|JK;VSn5_j1k+?(BE!73%;0|3BHE$!>BFljQ_uM*EH7KNvX}7#J9k GBpd->1(NLm diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Mendoza b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Mendoza index f9e677f171b3900dfd978eb8ea2aa226557d2c5b..691c56978a033586e3302db2ef600e4b0ffd6366 100644 GIT binary patch delta 54 zcmdnOafEe(^5hMSEIf=13=AO5z`(#TL7CBZ^FGE8jEszv4>HS7c3|Y1{D4__auTD( IWE~a`08%Rqy8r+H delta 317 zcmX@Yx`ktca=je`0|Ofa1A|Bd0|UdNN&N=fs)HQ1OP$=XL$2Rp$CUzuUE;L|c5Pj} zVfT-X4tu6uH`sgg$$@DN z2H%VX9KJo9zu||l^MN17FB|;)Qtt5Uve|~;hfNRs*%NH=cTJGPzd5D`|9eav*cW?k z;84k5pgd*k1{HxR3slWNZBYGCwm@Cd#6kV+;SCzU(hq2E@YtaB;Gu)|%y0$sZ^t%R z?AO}hut9i(W0>6m_j1k+?sw`H>RJB(|Iau%fJt$3JQK&{LMGwK%}kaPlo{ NWME)msK=th5dh_UmdXGC diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Rio_Gallegos b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Rio_Gallegos index c36587e1c292673fa537cecf729f4c873d375c9a..991d1fae69ee1602fc6a07e6e85a3b62d66650c2 100644 GIT binary patch delta 54 zcmdnOafEe(^5hMSEIf=13=AO5z`(#TL7CBZ^FGE8jEszv4>HS7c3|Y1{D4__auTD( IWE~a`08%Rqy8r+H delta 317 zcmX@Yx`ktca=je`0|Ofa1A|Bd0|UdNN&N=fs)HQ1OP$=XL$2Rp$CUzuUE;L|c5Pj} zVfT-X4tu6uH`sgg$$@DN z2H%VX9KJo9zu||l^MN17FB|;)Qtt5Uve|~;hfNRs*%NH=cTJGPzd5D`|9eav*cW?k z;84k5pgd*k1{HxR3slWNZBYGCwm@Bx-$4CB!~#u*j|Q3>tQKfJxNM+3GhD&^+p!H6 z`?WSW?EYxraFzRjdpYL@_dE3p^(_DY|7V;Wz@#`io{3{}A(QarW+uxC%8Yg!!#^-` NGB7YO)MHWM2moYLm7V|q diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Salta b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Salta index 0e797f2215ab398bc59b8e4d60e5260fcb365c3b..58863e0436d16ef8ff8ba3d96b452086e4ae8ff5 100644 GIT binary patch delta 50 ycmbQiv59qpvH$}E0|O%zgV+<48Lc;OVSK>I$T(S%QFXEbBgmGnqzRG$ delta 340 zcmdnQI)h_^a=i@$0|Ofa1A|Bd0|UdNN&N=fs)HQ1OP$=XL$2Rp$CUzuUE;L|c5Pj} zVfT-X4tu6uH`sgg$$@DN z2H%VX9KJo9zu||l^MN17FB|;)Qtt5Uve|~;hfNRs*%NH=cTJGPzd5D`|9eav*cW?k z;84k5pgd*k1{HxR3slWNZBYGCwm@Bx-$4CB!~#u*{|=fPtQKfJxNM+3GhD&^+p!H6 z`?WT>mve4#zf-SJ|NsAgMkZz^=E*KhvXlLpI0RW)Adm?}GqbX=PA+7!oS@8TvoZVu TBPRm`0|QvkWCtcioa!9`r74f1 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/San_Juan b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/San_Juan index 2698495bb3f953685e45edb916798cd24f772664..7eba33c1c5b13cbd9b7566f450d524a45cf8b65e 100644 GIT binary patch delta 50 ycmX@aah7$0vH$}E0|O%zgV+<48SOS7X8gg($T-=MQE{>ZBgf>o%p#MSSR4T5776$O delta 303 zcmX@hdWd6!a=kqR0|Ofa1A|Bd0|UdNN&N=fs)HQ1OP$=XL$2Rp$CUzuUE;L|c5Pj} zVfT-X4tu6uH`sgg$$@DN z2H%VX9KJo9zu||l^MN17FB|;)Qtt5Uve|~;hfNRs*%NH=cTJGPzd5D`|9eav*cW?k z;84k5pgd*k1{HxR3slWNZBYGCwm@Bx-$4EB)&&}BY7UwV9}P4&SS`?caM?h6X1Id+ zw__VD_G@i$*foEHBeQ{ndpYL@clJB=3ibd0|DWv7WH-5o$#Q}+qy5J4AB-Ff3=9lN G5{>{b7?JJ( diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/San_Luis b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/San_Luis index fe50f6211cff908f21257cb42259fe2692abdc4e..0a81cbddfa2813041472b716baa91c35a8451379 100644 GIT binary patch delta 58 zcmX@dah7$0^5g@IEIf=13=AO5z`(#TL7CN#fq{W-^I66(jEszv4H*?DJ1}xg{>&^g MnS(`TvJs060ADN z2H%VX9KJo9zu||l^MN17FB|;)Qtt5Uve|~;hfNRs*%NH=cTJGPzd5D`|9eav*cW?k z;84k5pgd*k1{HxR3slWNZBYHYbb-30iG%vt!y7c*r4N{YJGQ}Mzt#qaUGq0MG8;I! zmve4#pZsTm`{kew9v{mbJU5$c@M6Ch;ZXno|NqJUOm>rdm{eK+|G#>Haqk{e_W(fq{Vmt1?*tn}VMX diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Tucuman b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Tucuman index c954000ba9b28204cc3223628d13e9dcfa4b6eb0..10556d5d856a0f33afd8da2b07a2005e7be80fb0 100644 GIT binary patch delta 39 tcmcb>agB9?^5g@IEIf=13=AO5z`(#TL7CBh@d-wz$rqUICkwDR006TX2)Y0O delta 324 zcmcb{dVynta=ils0|Ofa1A|Bd0|UdNN&N=fs)HQ1OP$=XL$2Rp$CUzuUE;L|c5Pj} zVfT-X4tu6uH`sgg$$@DN z2H%VX9KJo9zu||l^MN17FB|;)Qtt5Uve|~;hfNRs*%NH=cTJGPzd5D`|9eav*cW?k z;84k5pgd*k1{HxR3slWNZBYGCwm@Bx-$4CB!~#u*{|=fPtQKfJxNM+3GhD&^+p!H6 z`?WSW?EYxraQdQydpYL@_dE3p9z4GmZSdTas8Ij^|9{5G2~3KU^O-m%H!_J%p2}o7 TL7CBEVK@^f0|NsCHU*9VEvcE+ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Ushuaia b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Ushuaia index 3643628a24723239a13d61b2215c907cdba03985..e0317502769271ad0c038493df2ad2b90ec402d4 100644 GIT binary patch delta 54 zcmdnOafEe(^5hMSEIf=13=AO5z`(#TL7CBZ^FGE8jEszv4>HS7c3|Y1{D4__auTD( IWE~a`08%Rqy8r+H delta 317 zcmX@Yx`ktca=je`0|Ofa1A|Bd0|UdNN&N=fs)HQ1OP$=XL$2Rp$CUzuUE;L|c5Pj} zVfT-X4tu6uH`sgg$$@DN z2H%VX9KJo9zu||l^MN17FB|;)Qtt5Uve|~;hfNRs*%NH=cTJGPzd5D`|9eav*cW?k z;84k5pgd*k1{HxR3slWNZBYGCwm@Bx-$4CB!~#u*j|Q3>tQKfJxNM+3GhD&^+p!H6 z`?WSW?DR8mxXOLNy_|D{`<;4)dY1qH|1(YwU{ahM&%`mgkV$xQGn3^6Wk$P=;U5?| N85kHC>anPB1OPWPl=%Pv diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Aruba b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Aruba index f7ab6efcc0f5bfd5c4172cbe32c03a8e08b0099c..d6ddf7d8f6bf58d3f61e4adcb760e11fcd866db8 100644 GIT binary patch delta 27 gcmdnRIGu5V^27ob9!3TR1`uXoU|^V_GqK4608a7+ApigX delta 28 kcmbQvxQlUuGA|PY0|PSy0|Vb=IX&fx*=iG%Cx$r!08khPCIA2c diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Asuncion b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Asuncion index 2f3bbda6d3586a2ef5b94bc28ff37906fbc758f5..622503674225a20bb6fd3cc79d149bd7d354166f 100644 GIT binary patch delta 51 zcmeyv|AlRW@+4*!9!3TR1`uXoU|^V_%<9j;z`(j$h`EM|nURTkvLlnvwL)p?&+sC@NE2ffVbkG z0pDa@2mUC-4FV+z2Lw}`HwcAJaS(Ppu|dQ_(m_=HkAaw^&jE2x{SD&38XP2EB^yZI z-h4pn%nJkQeHI5~)=6)WouA_%*Y9s2-!T7xLP668#l*`FO2PH)8o-{MzwBVM zew%@9;e-Qr{WA>gqt-e&)aO?jI2OKha57%A!8!1PgNtzA23NyP4z8aIHn>ZjJK%mf zXoJVE4F^0on{4p9HR*u&L2Cn_<^K=(E|fL!Ykzpazu~_@K*2wUK))P=pnwMs!FqlM zAqIyWLir2~!UUE$gnjqf5dNXfA>z8;hR6#U4pG|$Hbn1iIS@1L(}viYX$R`#%C2mP zuk<*O5dYC2F;eS5lKo|aWJ{g{De_wlQYGFUNc}(EAf1WZA^m=(LB_+k4w?I-4YCfN zcgS8*z9DDfMu*&v$PIaolO6IitTz;7tv^ucA-kc-YvO@o_5T}6w2BXu3d$IiafKcz z`|!`8{FV8EiVF`6Do;rssM>JIpn9{JghS1QB?h&VB^>Gs+6?N8emT_t|NozniFxt^ zCb!8Sn9P`%SSG77%ZvU0fBXOghmUUvgQIT2F diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Atikokan b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Atikokan index 629ed4231944255aaa0725f807517df48b39e135..c82871528308b02a45d17b3973c108c20e561c40 100644 GIT binary patch delta 53 ocmcb>^nh`KxC{dtU}Rum0AY~u1aVdn#V~PmHyf90aEK`v0G@gVF8}}l delta 98 zcmaFBc!6nxxGoz50|N*%FfcH%L)j7y3=9nOb}Vd|zw2kgi67w!r#t>NTvGm0FmbXw h4@e;+h+tr3m>|vy(#tl{zgq|-1QX|S4GuBo0sweG6!-uD diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Atka b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Atka index 43236498f681cc06f64ca2afa613880331fe6fbb..b1497bda631efdcb6635ffb6b0ee6f7da9e2a280 100644 GIT binary patch delta 75 zcmdlYbdr67xHtnEU}RumU}RvJoWLx@i!2qgxs!PX6DuPVGYivX1rC|XRvgBYS8>En ImgbZM06p6Z6#xJL delta 1351 zcmX@fzC~z)cs(Zr0|N*%FfcGofU*@E7#J8%ce-4-r2M7eQeuF^uS=mD{_Q9X_`f2= zfni2)0Aq)l15<@*0CQo`0hYwT3#@@A2iP2qFR&Ym9boUxy}&8(;{fN{mjPTKZXMu$ zaPtDs&F>Dp2XY>RP)D)c#qni2V27AZn?UL-f6i z1~Dyv9AfuvHi%2P=MX<{szHM9uLFtg8#g5B-Z_w*K6yh5@4f@6?xh=2-!3?it{%Q2 z{cO{LOm@o+nQK!HWIdOz-;h16(IMx8g+XpvvP0emDTDklSBHZBKL&+n>JCNu_Y8`~ zI2}s-4;YmES3OW>ac4u>ef9$t68kn(?0b2j^2dS=Rr5|CsJ_v(p{8!_f!ZA@8|vcv z57f_a+rY@g%*euu53+HvbJVkQ&i9 zU<9Rq5N4dHC&SCdz`y{)Ac2V+!&flXgIJ(=1k;xXa>=ss0PuX=mycCC_fM`(K0MVfI0ir=^1Vn?<35W)z6%Y+dFCZF}WBc^P`Euu6rd4w=C8f+}%D%|}oYH)A%J%#&sXBj*QF;@68{r`rqtZ@q84x|`-=aXCTBT&cS$MK^Izql@K z__gB4g5Pi04E}W2E|5LhXCPN`eS!P}(+vv7=NBk8W*R7QpID$AQ7^DT`B8y_s`;l4 zs#lIHs4MatsPBEeK$GF4f##HM1+7=S8?>{H7U&$!Mdu=D${z;Bkv27k{<3iZtY|NoyH$YeY@fr(3=>Hq)RPZ${f|9|{|k>&sYs}~qJ le0)O~bPbFcbPbFdCMYx7Z4Cdw$icwCz)+8*adI=0IslXVkpTbz diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Bahia_Banderas b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Bahia_Banderas index 896af3f56abd712e2fa85d69592bd33b88d364bc..cbe22a7622d82eca2b7d6333842a91fc0c3e2772 100644 GIT binary patch delta 48 wcmeC;nZza0HTcunE(I) literal 1546 zcmWHE%1kq2zzbp-7#P?Y7#Jj$ZhKL%{!`wAZE0Z%+np~Z?BFp=*zvdR!|7Lr2{$Hg z`M|(X&|sL}B4AW3)?ncGT?=&NxBF)P_g@yv4*U> zD?Vgz{Lzqe>}Wym#9Iw{%a#}97w%~&XzMH}jJnBCl$KpkY_*%A#Lc&$RBA3mnSSPn zvS0NK75v^GDsCk*RKC~!P_@gMq53@khnmIl4Ylh&eyD49Y^d+M{DF}P44D~O@IY23 z^5Fmfb3+&y{{Nplfq~`!|J4f^IR5|dZ(!g7u^9#a|KGWRQ3S+h;PCMcVekzOVQ>x( zVF(BgVeoYcVQ_W{VIU>>{Qv*|KPU--Xizc&(V(ORqCv?CM1ztPnEu=L0Yrn67Knx< zFHkZqXaJF*WCo%^Nex7Uk{gHyB{>icN_HR`l=MI}DEWbCP!a^w&v^tuG$<*8Xi#zl z(V!#=qCv?LM1zthhz2E35DiMAAR3fRK{P0-f@n~31<{}+3!*{E7DR)RE{FytUl0vS z!eIKxM6ms!qzvMNk~4?~C20^1O4cA6l(a##?+i^41y1511}K?>Xi!oI(V*lGqCrU> zM1zt&hz2En5DiNHAR3efKr|>DfM`%w0MifFgTob+B|v;owgAzftO24y*#ks_vIvL< zWfKq$$|@illwCkHD9eCoP__ZlpsWL;LD>gHgR&5a24y1<4a!Pj`jZLReo&SI@j=-N zM1!&xhz4aZ5Dm&=AR3g-Kr|?;foM>61JR%?2ckjQ4n%{p9*72IKM)Pdf*=}{4M8+0 zD}w1?^&kqIB|!{Owgl0jtO=q)*%L&AvM7iKWm6Ch%Bmn5lwCpe5XiDz&cPvO&MqN3 Tz9xExdImbah6Z}3dInqoO?$QU diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Barbados b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Barbados index 9b90e306a68c3285f6cd2de26d02cf8e7106ae8e..9d3afa6a53bd83dce2ccaa77b1cc6cae885dd328 100644 GIT binary patch delta 27 gcmdnR^qg^m^27x!Jd6ws3?R(Fz`!s;XX2&~09#B3A^-pY delta 60 zcmaFPxQl6mvMv_`0|N^K1B1ZIN|mQOT9cphF?@Q!H>KwS|8#~20wsAD1j`;h5DE#n SARPZcVd84D3Ca`0CISF`r5CmU diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Belem b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Belem index 60b5924dc12f14c274073b1fe4ccc590b742da5a..e0d7653c64c1e3b3e546d4c5e7644865b237f128 100644 GIT binary patch delta 50 ycmX@W(#1SMS%86ofq@ZBc^P`Euu6rd4w=C8f+}%D%|}oYH)A%J%#&sXBj*QF;@68{r`rqtZ@q84x|`-=aXCTBT&cS$MK^Izql@K z__gB4g5Pi04E}W2E|5LhXCPN`eS!P}(+vv7=NBk8W*R7QpIA`;pXvYq$$^Z*lM@(O zKv|NlRJz{v9d|J4f&96r7w47vtJ47vu!3=@u~7IsmhTUb+AP diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Belize b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Belize index 851051ae94a6e518d52b93464bdaab51aa9d1413..de99b845019f3a6d04d59899f78eeaee47032838 100644 GIT binary patch delta 30 jcmdnO{*PsX^5h0a79K_h1_lsjU|?XFptE@@qdXG;Y7zy# delta 255 zcmeyzvW0zua=keN0|N^K1B1}yxSJd1&$oWCz%}s3!g|>Ui}dm$7RUX6u!JulVyWH3 z2TR`>MJ!kUm$3YtNW@C^2MH_Jev4T3{7}N`=|VTw9AA>Kw(QG|b<5il)`wlYv7tR9 zVWZiO8=DGR9&8qybz@6F+Ji0MYHn;Z@OZH8{>+FS0$LAt?5~d4`5}$x!LIqS5xZ|{ zChV!VkJ!7DJ7HhEV#NL#ZxasKGe;b(IG=DxL;l9$h>ZzHI2dmnwV0f6^!ei(#}(H< zIDY)-jgyQMADmpi{Klz=#SczTI1+K@VCaLh1V!Z delta 90 zcmX@hxQc0lxF#zD0|N*%FfcH%LD?b=3=9nOcC;qU-*q?ObjPEFOUhpgCU)C!ffO-< Zi3#GYAYH5z{VN2(0$_s6F*wA83jj$85mx{J diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Boa_Vista b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Boa_Vista index 978c33100fb2d9b14c1faa581890c16c8747b42b..fca97207b2833031d00d3ff0246d7518b3042644 100644 GIT binary patch delta 40 tcmeytvW|Iz@?-%<79K_h1_lsjU|?XFpvrRrL>c@P~ic@z-y|&W}zGyY4j^+_Ko?aO(|+!yU=@ z2kz`lH@N#-+2P*oHwO3bu5fq|;%M+?2JeBdtT_hX4iq_j=hNBnBhbp>$MMSszqlS8 z__dO4!|yjD4u874H^`ox;~-b@bc6f?=K~7HcQ+_DmOChMU)x~*P3X!2iye~|C0+D#V0o~axgJ6O>SqDpP?0W}0}^5CCrk1_J;9 delta 66 zcmdnY_>FObvLY)30|N^K1A{;V0|Ud1h|mHp=HdYDeX$Pp|NsAIWM*QX*rYi@nUQs3 OxCRdc0|Ns>*bo3e_!6T4 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Boise b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Boise index f8d54e27479149d35f6ddff12f709096f08bfac3..72fec9e8c52ab8bb3dc6519b9d7f0c311900ac16 100644 GIT binary patch delta 77 zcmca5^qhTyxD*2#U}Rum0AU7($%V|4yvVXqo2N71VB%n6WMX7uWoDV2$PqMIp4n}( H6Q=|KPiqOM delta 1222 zcmaFPeoJVAcs)A<0|N*%FfcGohq7fF7#JAlE%R6~f4As_1#Maj7S8%UVTGHI!s$+) z373?=6kJM_VEFZ;RN(iE2!=m5!Ug`GuwwYP!&2b?3K<558PWob?f)2<%Kr*57fLm- zBuY+T4fxZ*=J0z0yTQE%_D%8=I0X(gaIW1b!1bYiQ3Lmbg%fyg?q}dV&^&=}=RyYl zl?wy}W;Qbjb~XtJRi-isXQl{0CfMVnN2Bpyd0?Juu7*tFj3aEOmV^9-4ETFD6 zfkFM>{Rx`&Tty6;_YO|bdKJQ;y>IaZoy!Fcy7O8m=xq*a(639MU@+OF!7#l=z^GWP z!Pq@bz$EBLgQ>cQfSJ*)26J{T0SoEx3>MFM1T25wWUxB+PQd#1ZU&nTToY_}&t1^;c0Geb{<#T`EwdY({5MQ+PN{8h(VsNI)g`{c_484IdUxF#2KUR$1w47<7(6$3 z3V6MBVDO%^bb`;dm>B)IGA9H~Q)mdZ@tzP=#?%ljqdOra^hra=AN~np zrpFq>p6Uoh$USC=ILapw`R^!0)RGSZ(f5`!#I#%zh~3x85SOw=AbwspLxS&x35o6P z4N1D2CM2h4Hl*-Qsh^PQ?%k03wroPWx^6@I*@y|5?EDRxYpo_^J^R>@JuO@y=K>!? zZkeS(-ue#=`C-xm1^t&83QhkC6yFghP~tz0q2%B131t?W8p`h7olqe$rJ-Wq z{t1;o${MQXEu2t&Bch?Eu6aW34y%T`xYP;tGh`Z=7?~KESeaQ^*(O^u2Tb;7wqj;w zW1ZZ|?8XC1hm0VCfq`+Np(HOTZGtdJX!^$R8%*^e7AVxf^yTFOAQ}{UV0v>Wm=6j? z5FZqhAQ}{!AQ}{+AQ}{^AQ}|1AQ}|9AQ}|HAQ}|PAQ}|XAQ}|fVEPY#{R9vL6zpL7 zsSemeQ1FBJpeO**plATmpr`=Rpy&Y6peO;+plAWnpr`@Spy&b7peO>-plAZopr``T zpy&e8DZKSlzzzUK8%O{Ybs!oPePH@*1XvyvjUYZKDnT?TIzcojN;OHS7c3|Y1{D4__auTD( IWE~a`08%Rqy8r+H delta 317 zcmX@Yx`ktca=je`0|Ofa1A|Bd0|UdNN&N=fs)HQ1OP$=XL$2Rp$CUzuUE;L|c5Pj} zVfT-X4tu6uH`sgg$$@DN z2H%VX9KJo9zu||l^MN17FB|;)Qtt5Uve|~;hfNRs*%NH=cTJGPzd5D`|9eav*cW?k z;84k5pgd*k1{HxR3slWNZBYGCwm@Bx-$4CB!~#u*j|Q3>tQKfJxNM+3GhD&^+p!H6 z`?WT>mve4#zf-T^@oUir&pn9>^(_DY|7V;Wz@#`io{3{}A(QarW+uxC%8Yg!!#^-` NGB7YO)MHWM2mohKmAn7| diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Cambridge_Bay b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Cambridge_Bay index f8db4b6ebf5b66d3d566fc3975d6151783f6e645..0a2225244a67b412ace9a98978a9a9f1f5535f1f 100644 GIT binary patch delta 90 zcmZ1?(7-l9T!sM+FfuSOfG|jSg18`vf?+!b1_sW}7R+B5S(zD`m{}$(GO0{XU}Bl< T$|N|spWSToMRwK6JRA}Lbd?KW delta 1194 zcmZo*TOu$)yq=qZfdPaW7#J9;p={NKpUyU%?&O(pN%>2`r9=sa@A^>%KQvlD2xq1U zh(x+GhV&BA)!wiLjLei2s1s_5cX6@AVTgjL&Q-& zfyjSH8KRba5Qx6FoFS&=l0fXfPKLOYEdufLvKbP5FHERUY;SK!(%m#6IX$x>g?Gw? zRCn)&)VF05($#ev($7Xr$Ykel$XshRA?w-4hU{tK0y!7>7;?)j1@hK^V8{=X7AWYy z#87DZSD+|=3q!H!eSs4HX$&R*eorW~*wj#V@9u;Oi75>g`}R+${883WHE-dB>KhRa zHFeDsYIj&Q)WxN;PN<(D(=gee$!>BU6W`8VpHi!nrIEV(tI*10v zJctIxK8OaT01ypI1t1!f5Ne4vN#ifGvlbnL|&{7b{Fa`z&F5ln~b6=Mb9baQTBRvBh MUqeGZLp=j700=5$>Hq)$ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Campo_Grande b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Campo_Grande index 81206247d9efa7d3dd10dd9e88c669718d86cc50..6855e4e9fe021cbbc392c76e1effef86dd53510c 100644 GIT binary patch delta 44 xcmZ3&y@P#%@?--h79K_h1_lsjU|?XFpv)M(*^21_)8qw=;mnLojFW3w)d9Z72&Vu5 delta 431 zcmdnNzJz;%a(xT~0|PSy0|U>rRaGWC_`^T!`0KY}=SL@pUH6&{ZdvScxb=p^;g00{ z19x_&8{GY^>~L@P8-x3IS2#QfaWwccgZIE!)*ORx2Z|iN^XY8(5oqP`-suWe9{sFypS{HV@A)q>%G z>XoYo>WZ=s>U%$K&}8`UpgCoxfz~VO1KQaR8*~mFcF;|`WT3ZTse``T76XHZb_YY* z=nY2UdIyZzDhy04k{nEaoHsC2&~-37U$(*g+m!z+ZP*n z{MvB9b9$?R*R4qhyc-s7@Yz*zz&D|JgWs&M1OA>13<8>q9Rd~HHv}bzIs`LlZU}KU zcL;guW)P+<=@52O!ytm`w?o8AE`!KNcO9ZS-WWvR%R3O0an7Lr|Ns9?j7*G^U739+ i2QYI@p2#deL76dTWB3Cm4h9AW29Scuj?95jNp%2;3%lU} diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Cancun b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Cancun index f907f0a5ba77b9ec845c450cd535ee589b46c5ad..640b259fd0f87a34f03554cf34b4346cffd5ef22 100644 GIT binary patch delta 27 dcmeBUo5(UjnV*4yfq@Z<85kHg>oeYG1OPRF1F--A delta 191 zcmbQp(#JMIxn7Hbfq|8Qfk9;Hwp$5eZC4Wv)6+i~75z#ucK7^X5_BiQR9*Xn=@Etm zGov#F=Ik;I7Sb<1SUmg3VEOyh2dl3v4c6NZeXv>or@?l2-v_(?dkyxp3qCmHA82rF z=`C>bU)127l3(DW-_qdf5?J8IpVr{6VqD<4hF&Uz*W>R6-aFhGe9j7g x@SUN_;J4=M2mcCghJc>y9|9BA8-j9neh7BtYzXn0{bBNI#)JvV8^d-p0sv#WP`3a8 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Caracas b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Caracas index eedf725e8de1a61c4db886ce8b8b60fb4ee91c77..8dbe6ff74127e02577fdccd694af5a61580369e5 100644 GIT binary patch delta 40 tcmeBR+Q&FSdEx{X9!3TR1`uXoU|^V_%*Z-%h5-vB6Eo99Pwh#J8~~Yj2JQd= delta 72 zcmdnT*ugYGS&fZ>fq{jAfkCK&fq`MNoQ}=68E-t?qbC)FtFA1l|Ns9#BNHHS7c3|Y1{D4__auTD( IWE~a`08%Rqy8r+H delta 317 zcmX@Yx`ktca=je`0|Ofa1A|Bd0|UdNN&N=fs)HQ1OP$=XL$2Rp$CUzuUE;L|c5Pj} zVfT-X4tu6uH`sgg$$@DN z2H%VX9KJo9zu||l^MN17FB|;)Qtt5Uve|~;hfNRs*%NH=cTJGPzd5D`|9eav*cW?k z;84k5pgd*k1{HxR3slWNZBYGCwm@Bx-$4CB!~#u*{|=fPtQKfJxNM+3GhD&^+p!H6 z`?WSW?EYxraFzRjdpYL@_dE3p^(_DY|7V;Wz@#`io{3{}A(QarW+uxC%8Yg!!#^-` NGB7YO)MHWM2mo(KmAn7| diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Cayenne b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Cayenne index e5bc06fdbe5a3062f90274a6b5cc5c56e2d74d5f..cd49f0534438cc3bfa0e09bb5701552ce9a177cc 100644 GIT binary patch delta 34 ncmX@cIGu5V^27ob9!3TR1`uXoU|^V_%*ZscR)Udn;(T=gbJ7M| delta 74 zcmbQvc#Ls^vN$sX0|N;2O#Grf;rC(F1NHy^|7T>HSRg+^Ss5e&!aV=~|NjqC0HQ&P L7#J8BU<%a%;!7S# diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Cayman b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Cayman index 9964b9a33452f4b636f43703b7cdec4891cbda5f..9154643f4c9189998392afb8a93e2e2eb9eaecf5 100644 GIT binary patch delta 27 gcmdnSIF)gN^27ob9!3TR1`uXoU|^V_GqJ%808UN?7XSbN delta 28 jcmbQrxQ%gwGA|PY0|PSy0|QS30|UdvY?TSh6T|EQN*e{3 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Chicago b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Chicago index a5b1617c7f70bfc77b7d504aaa3f23603082c3cb..b016880653929aa40dd5ac0e82e4094a9d787cdf 100644 GIT binary patch delta 100 zcmew%eT#R3xC{dtU}Rum0AY~u1aUzS1;gtZ7#P?#JFwQUP8MWQoqUp~Yw`qM6>%Tm d5C&(L5C-Sq5C+%a5C-S)5C-RfkjeLXB>{?k5ZeF% delta 1628 zcmcb``$Kwycs)A<0|N*%FfcH@fwCnU7#JAlEz@b3zw2kgf;PT}g|luKEIM7nu(k=>;o{cQdT`xB0^=;kgW}?oIu$`g1+QntkOT)?Q9zST`^7 z!}`t63>)gKKWv;6->@k?qF{54W5X7AtAedD$_?Ap>tzbI+psq5VEb3FQ~G(s&Swt_ zcC)fD>^^p=V9%3h413q#`>^lG35Nas2Rkn5$uQFUy zIQ!wc>2`)24C_DKtQVchaPz^$54ZkpZMc1)_`{uh(;M!toKSFYUuDDn&Z2?`^P(Fb zW`-0zs}gi;Bu>8JX}HaYXYMu(&&}mNyik{8cqz{C;T1ar!>ezPKD>VRh~dq( zBOl%#JHqg8|HFd!>mM|Hn18t7WB;LsPxVU+KIboK_!8e<@YTPq;hTMCLH&3AjD{Z? ztsj2!do}#xNdNHbM>@mr7oH#f-0)=hdqVreza82P|5xySV3@(nz}Wu&15^2X2IfMZ z0+vMX2G)Rg1#Av)8`upl6tMTIH*gAUD&SnZn1SoVlmhMtlN)$$Zur1^ptON+=cEt( zDqe0!fZP3{p&z1yY|R z8l)foE|9tSt3meQ-2%CdcN*ju?k`X%<7ZH8Tv(tK`jJ67YwrgY)5{F1Uh_YwiEd?3 z*J}Kr{_kRgCRg$Y&3l_0v|hP>(B3z-LFaN(f$qHW2EENL1^RW74F;3d3JlZB7>tVR zISP#3BN$AAUKNjh9A7=OmFbH=2zfbQ`z9R&7iW&_kkD%dA%7Sf z!c2D*ggupGh>*MTA>t?lL*&10AEK5#Vu-#s<3mi#5r)`(RUhI~mNCT7i}{e?d#E9? zy|N%lcS%EXdUQbwZ(BpEyKO=0+l+>Eb@_tyvtA9E?2HAOYjqm3o;@zep61DrbN>H_ z+%jzjpS<-CKjeq;G8FV5{!nQ8o}nmz>4##`iwq_H?H@}1y=^G7SW-}S?|egrL|Z|{ zzKso)KQaoc=1p#>zTs6+Q&-whyF;g-E-t*GegP5#5$HCchpc5)k= ziq8N4s~0eE`1pn}IJ<-}I0uI?xCVzXIERNYI0uA)ayR3lvWv8WdL`8Wdk3 z8Wd+B8We9J8WeXR8WevZ8We{h8WfKp8WfixI)%5s4eS6=q=E!M5euS0kqf5JdV%FZ zkqqL4A{s=4A{#`5A{<16A{|77A|6D8;vPhU;vYnV(g27Cr2`NRN(&&mI9v20hz2JL z5CfDjKr|?Efa!bZ!43c=5)dDhP(U;&v4Ch$f&tN>L<6Eh2?s=j5)X(5B_I%uD-mgv LkccK9WRnB{Did$a diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Chihuahua b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Chihuahua index 8ed5f93b02001a63ce43dd221ff48cc5faa6752e..e1780a5750e39be0849b70a08c4ace57037c1377 100644 GIT binary patch delta 63 zcmX@ZeT8X)@?-}l79K_h1_lsjU|?XFpv)@Fz`(#d*^gy?0N=={Bsi=TV^*n`EQuuoKoB1qCaVZt4n-?8-K|JcNND5_a74lJXw?*JZ}^W zcs*fl@ZJ$B;B!`q!FPtafZtjc2LB34fq7Se?Wckr* z#e}?NTO0BVPfaLjo8C|u^<1DRt+Jum>ZCx4TXaLI)M|k;{R)P%U%dhq{80=QxAFxl z-`g-$?FtmAJ}<{mvp9D`?Ro}=x@P|g^?i>R7@0tjnTeT+g^{}O|Nl8X3=IGO&z-=) z^8f$p1q>Yj|L@$u$OB?C3P8ktd_x#~gF_gcLD(gP!Pg~(fs|D8|NsC0pp*ilL8%2q zgHjBL2BjJh4N5s+`fu9@P}&2fAP@~oMIaiKl0Y;lHGybQiUQG~R0X0zDGNk{QWuzh z&LaS#L8%NxgHjrZ2BkI-4N7q!8kFilG$`ePXi(|{(V!FvqCu$;M1xWyhz6xb5DiL^ zAR3e^K{P03f@o0c1k*nzg6#*TQV<`MQb9B*wSs6+iUrZ2R12a(DHlY8QZI-GrC<;Z zO2r@=l#)R-C^ds

Kf8pi~W_K`9$VgHkt$2BmNi4NB!;`oZ1_AR3g~K{P1EgJ@8y z2hpIE528V-A4G$40Ehp(Op=YeQY?gP=F90;O8xe!Eyaw3Qx foVk(9H#o%H*Cj;9*F?`y&p^l5&_K^r&wvX6U;28P diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Coral_Harbour b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Coral_Harbour index 629ed4231944255aaa0725f807517df48b39e135..c82871528308b02a45d17b3973c108c20e561c40 100644 GIT binary patch delta 53 ocmcb>^nh`KxC{dtU}Rum0AY~u1aVdn#V~PmHyf90aEK`v0G@gVF8}}l delta 98 zcmaFBc!6nxxGoz50|N*%FfcH%L)j7y3=9nOb}Vd|zw2kgi67w!r#t>NTvGm0FmbXw h4@e;+h+tr3m>|vy(#tl{zgq|-1QX|S4GuBo0sweG6!-uD diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Cordoba b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Cordoba index da4c23a545b3603bcdd4555ba8feba117802e7b4..35a52e53d123b5ef5d293b3af19046630f02bb66 100644 GIT binary patch delta 54 zcmdnOafEe(^5hMSEIf=13=AO5z`(#TL7CBZ^FGE8jEszv4>HS7c3|Y1{D4__auTD( IWE~a`08%Rqy8r+H delta 317 zcmX@Yx`ktca=je`0|Ofa1A|Bd0|UdNN&N=fs)HQ1OP$=XL$2Rp$CUzuUE;L|c5Pj} zVfT-X4tu6uH`sgg$$@DN z2H%VX9KJo9zu||l^MN17FB|;)Qtt5Uve|~;hfNRs*%NH=cTJGPzd5D`|9eav*cW?k z;84k5pgd*k1{HxR3slWNZBYGCwm@Bx-$4CB!~#u*{|=fPtQKfJxNM+3GhD&^+p!H6 z`?WT>mve4#zf-T^@oUir&pn9>^(_DY|7V;Wz@#`io{3{}A(QarW+uxC%8Yg!!#^-` NGB7YO)MHWM2mo?JmD&IR diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Costa_Rica b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Costa_Rica index 37cb85e4dbfb7ac9c01eecf584a1a721ed251e93..08f0128ee681d8f7e1df186d93514f3f4cff2830 100644 GIT binary patch delta 27 gcmdnP^n!7M^27x!Jd6ws3?R(Fz`!s;XX55g09&30CjbBd delta 60 zcmaFCxQA(ivMv_`0|N^K1A|}#0|Ue27h=AGW}XRx+w%g1#k3QIrw0V6Pk)f0k+gC{GNV1OVF|69fPN diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Creston b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Creston index ca648573e483c86c1ca09d6d5be131877398c8f9..9d69a0ab819e936a1f4f8029e111a7b960db8b8f 100644 GIT binary patch delta 49 xcmcb>IFE6HvH$}E0|O%zgV+<)8JQ=x8w&aOhA{XBhcE;LhcIyY28Wn)0RX^e2x9;M literal 208 zcmWHE%1kq2zzdie7#LU>7#MgO7#J94U-K@Q_tTnzk%{sD|4By}82~L@P8-x3IS2#QfaWwccgZIE!)*ORx2Z|iN^XY8(5oqP`-suWe9{sFypS{HV@A)q>%G z>XoYo>WZ=s>U%$K&}8`UpgCoxfz~VO1KQaR8*~mFcF;|`WT3ZTse``T76XHZb_YY* z=nY2UdIyZzDhy04k{nEaoHsC2&~-37U$(*g+m!GbGbpUX3xQPG& diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Curacao b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Curacao index f7ab6efcc0f5bfd5c4172cbe32c03a8e08b0099c..d6ddf7d8f6bf58d3f61e4adcb760e11fcd866db8 100644 GIT binary patch delta 27 gcmdnRIGu5V^27ob9!3TR1`uXoU|^V_GqK4608a7+ApigX delta 28 kcmbQvxQlUuGA|PY0|PSy0|Vb=IX&fx*=iG%Cx$r!08khPCIA2c diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Danmarkshavn b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Danmarkshavn index 9549adcb657569ea304592a4070ceecb4550a4db..8718efcce25cd28ff9fa0f48bba0a2a7e6be4ed0 100644 GIT binary patch delta 116 zcmdnRx}SN1xC{dtU}Rum0AY~u1aUzS1;a`V3=Axr?HENFb(t9PL+1bg-!(8W{QrOT R0t3s$cQR~T?!F-gTmU9n4s8Gc delta 344 zcmdnbyo+^$cs&~f0|N*%FfcGELD>Sc8$20=eQN?ljDJlKRen7|O!&?OaptoV#6Rzw zAn|zp1j)+_CP*EgI6->PUICdk>jY%y%omXBnIIrv(jQzW1mlPsX*6C$8&<0_z{ zVO4XHtH}h7r>YY)uZm63IvT+~L3_)O2|7z&PSBllYl2?O=?VHJ zdnOp9tes%++|PiKg^3w2Wc~mDT>}Hd|NmDnFtEVL#}61eCeLM*;bLH5WCVGPk#VA- hq#($fAPf=#dv#;9D5E7sHV7eXU|`^K_YE=N0szLqTP6Si diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Dawson b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Dawson index 2b6c3eeaba0903d03c3d44fc6eb661b136fffdaa..07e4c5f4ac3852571b17cb33fe565a5ea2c49f0a 100644 GIT binary patch delta 80 zcmX@W)5?1hA_bAiPytcT5Ct(ya{+NpGX)8y;0cnP5(-jGrW2$- znJkcgBtAjrlGp;-gFh$8ZTzu7e&Ov23T4^~ijDPqCn$ySDkx{&5>PRHub}F+M?g*V zqJp~CJOTB8Zx?8CH3(?lJHJ5dRg!@AzKsiXF4s-aoi}-b-sXe}`gNrX3?@5GFifAM zU{tI!!Pvb-!6cY%f~k6#f|=2a3Fhn;3KlY~0v6Au6fA!~7qB|^N5T5`NdcP;5({j1 zuNJWD|Fyures-^bL;jrwjx8%EIQj2e;GEJu!9{<;0#}#Z39g?nE4b@+3AkV0s^H0+ zBjCAtx`NkRKLPJKn-}<8%bMU@Gj)OAHlGRpG35&ars+)xw2530R3K*UiQg~)%G1)`SxQ;5E|RUoG2fdWVDzUcySDTfp$yE8{m uUd$ZB2Z{(r5COuB6ZNHeLD2)kAc2^T;V+nAY9&A-2(=&{mv3;0ITrwv$fVc+ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Dawson_Creek b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Dawson_Creek index db9e3396557652707c0c2232e119e13a2dd172fb..761d1d9af53662efdb521bef949ded15e3f1f4dc 100644 GIT binary patch delta 55 qcmbQmv6^*)xC{dtU}Rum0AY~u1aVdn#jtr3V;B<~mv3;0ITrwvP6fvR delta 310 zcmZ3@I*Vh1cs&~f0|N*%FfcG!LD>=w3=9nOcI;g+f4As_)16WaE-8O0xRj_Sa5eO! z!Zn3g0@qD1E8Ji>BXCo6tHR9(>jZB7ySU)?fe8Y4?rmOhcjcN1_x4R)aKE!}!h?C` z3m#?`On6imx!|#9(1a&()(f6$noM}+9-;7DC{W;qdcBpxi%-S^uh?Z2UR@Fuc>V03 z!kdlX1>PQepzvJLu%oPS`!m-xjKzWOg(@Xfw;!gu|a z1wS+v3H;LYb_9 zV&nP-rTWnS0?Juu7*tFj3aEOmV^9-4ETFD6fkFM>{Rx^}MGTtv4o=W|6~dssZ}9}3 z%LNU(^I9k9Z4PSCuS=g`FxjNRFug^2H%?Y34Yt`8vJ82 zCj?AWXb80No)A>V)DSGAJ0T?WNkhmV{t02G#~Q+(>Ig*0J!XhF$|n%{?_u36(#}8mi_koKSs3D59aJu6aW34y%T` zxYP;tGh`Yjr!yx`p1^D|c>*)*6x)&7ELADC9tVQ0ReZPzZu(P$+_EP)LGkP-uc^P>6zPP^f}vP{@L4Q0Rha zPzZzRKm7F*Knze&gXyO_U<*M(4&sA?9YlkI9z=tJA4G$q07QeL0Yt~{>jY8Y*Z?s= zF#@7Nu>zt&F$1DOu>+z(F$AJhcwqqCsf@M1#@+h_1d70V;MFK*<5b2PFv*4N4Xu8k97c7@?4v1-zGRgyq=ALfdPaW7#J9Op=^oPy-LwDZKg1s?)Xq}N%>2`rG(!PuA8p-aD!pt zgWtvzdVasKe(>jp)rY?)WFN3O+%I4^IF!KND_OuPuq1(tVQ~T1hqeUn2dxD>Hy1tN zJ&<0&x3lE||H|eM0yEPd2zI7^5UTWeAe`y`K_s$X>w&1J<_9rLo(JNZ+#e*AG!rB_ z-hPl`;!cqI#8n{u@NI(3#Ww}A2hS(SZ9G>Xzi?xMLK(vc#m31AN}-QFC}*vIpkjLD zgR0lW2Wq0rKB#LIKT!X7xImLD^nvERr3G5A%pYj)YcJ5b9Fm|rFS9^zvsr?Eop*u3 zWQhdB^z;u#^+mrDjNLsym;~KPFjd$7U}m&0!JM71@Z@!T;JG>HgV$T-2i|i!3w*9QB>2{37x-;cO7M^IEvOHe#*z?dqhAnI`Ya(> zMzA0x^h83)@6QEcrmGUdp7MW)kURDu;>gDjk^fdah+1;_L-f6_2Qe*MKg90Kc@UQ} z{X_gbzXu7vTM81}vlEhZrxhfp`zECDRurVV>nEhXjVef27feV$Yg3TP_BkPQtz1FY zv#SZ&)2u$^od5VBw@k+OL*Dw!5As9*eJJSP`k>JC!H1&!=?{uU4}B={uY6GQ?|wm< z#k7R7dj|_DBq|ar_AM@`{1KHOm|}Sb^!wT^~R+D9ph0<{U5| z6m}p!DEvS)C=5X~C>%jFC@euVC_F(lC`dsxC|E%>C}=@6D0o3MD2T!I@6YuGAO10-{0j0-`~21EN9k z1EN831fo-T>np$x07Vu^02E;$8Wd?@`m7CD9u#>XJ}3e~G$;~5G$(fM`&{0MXbIhYCmnmN>XvgF{SRT|#txjrEN540L=A K4fPE547dQdBB&q$ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Dominica b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Dominica index 697cf5bcf7f151ffc1c1fc4247e4e9c7e3ff01a3..f4fe59034242c4416bc84f06f38530d625149329 100644 GIT binary patch delta 27 gcmbQj*u*$Nd13+!4fq{vEfq`SPx$zpt|NoDLFfjc8fBXOgi;r&zgJWtC%k^O>SX|oGis`B*Eny9AfV45~Aa4 StY@TWpyO+3sAs5Wzy$!%tqkS> delta 1256 zcmX@bK1XPRcs(lv0|N*%FfcGogR(_B?wxxuZ^!xx^LMj1ESNEI!h%b!4U4*7Ojz8) z#;_#o)P$v`hZ~j!KNnaoy0l@1@kxOd{|+&n?&O(pN%>2`r9=satD%ntt|{DMU`dpm zz#8zUfz9Ff1a^aa4IB!0CvXZJXy9VlKY{DRq6Y2<^$REP+}zK=d!Ts&-_C^${3{m- z2+V9|5bSIc5UNaN5Y9{y5Q%hW5cPBu5VO=|5ZBZYkWg}MkmTeNkYZAAkou%HLHZGA zgUlt439<)YH^^;#H9>yi*#?C&Spmhy^$kj){{@t@&M>H$J`_;(TF0O!dRRbRYXXD% zzxxw3xr!Jx>+c<$p!F(*L3`ig2|AYx8g%EiPSD#N)SzFNKEYtJNrPc}i-1wFSc9>9 znt(~rj|Nk94*@fyTMg#yS^^f*-x(~P^9We}zR6&9?45x1?cEGE8@MLe?w-qF*Z*dM z{p@-Mhx~IB99w2LIQegw;G9z1;G#cif~!k>gX`y`0`9ss4E64pmkW6E#xZzq?iBEP z>%ibWXXyl=YcUPJHSH7pw%IlK$7D_jn5NJWXyZL0sEny0SVnh3Na&M>kU#tr!c31f zggw;}h>&~C5OI`GAoAZ)hNvYU1fuUPXNYOJBoMo=lOZl;i$MImY=#8i3lkFC+Z&Q} zH%&-R&umEHoiZWS-MhXa^=;XNbamZ^^s^BYGTHeXGS^y7$a?m%A$wZ5K+Xj|hTJks zfxPt}81loU1q%8vF%+8q6)4Kz!cZ)FU!cT)8bisy-xJC#HZ_#pyE~ymVoF2BzWoy_ zf0Q*;&09F3`bI=UOSxF_Ffk%Q=Ehz12Ghz12I zhz12Khz12Mhz12Ohz12Qhz12Shz12Uhz12WnEu0GKLNx5g*%vjsspwV6#gJSC=Nh0 zC>}sGC@w%WC_X?mC{92$C|*D`C~iPBD1JaRD2_lhD4swxD6T*>D84{+3UB=sume)v zy&FIRptu9kp!fsRXCuJ!pm+rFL2(J9LGcNqL2(MALGcQrL2(PBLGcTsL2(SCLGcWt zL2(VDLGcZui|a-2gMAE&c#r@n@@jhRqbz^P`kHM1*na!~>)h9nm*-{25)UzZRaUt>KZJp&zILqk17 HJp(QP0P1_i diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Eirunepe b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Eirunepe index 39d6daeb9b6dd3b225b0ddacceb6984e8204ac7d..7da4b98fe3c70a1aecae8e0f4264324eaf9e1fb6 100644 GIT binary patch delta 68 zcmbQhx`layvH$}E0|O%zgV+<4Srr)=7+5xIF!C@?c3_g8c%E%?9Fv5Ik8cQru7L@I Qu7N27myNE0shueo091YovH$=8 delta 282 zcmdnOJb`tBa=j7*0|P4q0|U>rRUHjG_|q76{Ea!V^J753u6q+4ZdsfPxb;RX;Ev?q z3wL&wI^6wj7;ta)FNgbgw*@>1@pt$#L;Av3)+&c@2O0vt^I0AE5$F-{pIpc&I=O+7ZE^!6i!L)0)Bpeb8W&sYof{Z9Kx_sm+s8MA lLD#^9LD#^PVS+L%*gG4ec^Eku7#JAPjZ-9O+~fs}A^;yafK31Z diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/El_Salvador b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/El_Salvador index e2f22304aad56062cfb66d23f3a8c296689286ed..43484117e2858004a0377195b5c83c3a9748062d 100644 GIT binary patch delta 27 gcmaFBxPftk^27!f9!3TR1`uXoU|^V_GqFDq09M!qmH+?% delta 40 xcmdnM_<(VOvLq`50|PSy0|U?EtIHG=X5D$97&ALSscPSYiOuR0lqZHo0RZ%f4fp^6 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Ensenada b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Ensenada index ada6bf78b2815d3d99c97d521ab9a6b35c8af8c3..19ccd3576d46b262f8b9f00b302f67bb4d26c4d4 100644 GIT binary patch delta 68 xcmZ1`)W|VGT!sM+FfuSOfG|jSf;caTg5kK$jm$roCL40ZO+Ln9GntQ50s!A92-5%n delta 1166 zcmZqVSSB<V{Ra)Oipz6H)H-4k5&7c6jf$(`WF-?YG8#eahPkNFDqo-BqFJa05Acs&uG z;5}#a0-tMH6MSo?F7VstGr>Qmd_ll8y$OLfkqdSSN_ST6_({WKxukL-dl(<>9g zo?0nH$bA%uI4YwM`R}qo)RKP+(f76r#I!t6h}}0`ATH&QLj1f+fdt=s3liI>PDs){ zupl|Td_oHEq6Mk$krPtiw&X5ISGS&!el~4ECcEr}%(Wg1vY!2)kUcF`A?JdOKyI14 zLf-m+0{LN@3I+WS1PaZ#6^il?2^5RIRVeXaB2e<5b3vKKfeB^zUN5MSSTvzx-`NF~ zKUyYK&0D{q`bOG>n!1S#YIk@{sEaFJP(MR!!eoEuxXJm<=9AYl+wg!=90MbSoFL8% zN`xQ`5}3L%{0CD#hy@A`5Df|v5Df|z5Df|%5Df|*5Df|<5Df|@5Df|{5Df}0F#Sh% z0f+_#8<>7-r2wKq!3U;~%7FQxU>yC^gZQ8*0MVdm0Ml#hJ-`Y;@c|M5#R-T8 z#S4fA#SMrC#Se%E#Sw@G#S@4I#TAGK#TSSM#TkeO#T%IZ&j~gk6n`K-C=Nk1C?3JI z^}e%U1)vB834kIMM1vw0M1vw1M1vw2M1vw3M59Nv3P=zZ(Odz+Ar=8HAv(UsdPaH% NI=+U6dWL!iTmY*?f*Sw; diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Fort_Nelson b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Fort_Nelson index 5a0b7f1ca032be1adf8ba91f863e727c5ec6a026..2a49c6c50f4c21765232712d18a6cbbeedafc441 100644 GIT binary patch delta 55 qcmX>gxPp6vxC{dtU}Rum0AY~u1aVdn#jrV=Ihd7=%Qra0oC^S&O9i9= delta 661 zcmZ3%eL!%6cs&~f0|N*%FfcImL)j7y3=9nOcI;g+f4As_)16WaE-8O0xRj_Sa5eO! z!Zn3g0@qD1E8Ji>BXCo6tHR9(>jZB7ySU)?fe8Y4?rmOhcjcN1_x4R)aKE!}!h?C` z3m#?`On6imx!|#9(1a&()(f6$noM}+9-;7DC{W;qdcBpxi%-S^uh?Z2UR@Fuc>V03 z!kdlX1>PQepzvJLu%oPS`!m-xjKzWOg(@Xfw;!gu|a z1wS+v3H;<5f`3x+PGrV)|Y|)oYJ{ zn&?FZb**^<>i^y@(Bx_m(7bnkf!3=e0quPo7wBBBo1i;y@&dih2@~||N*5SRcA8+A zK1so-SY?8-dx?TcFxv!E^)Ll9qZbp**)0?-WLO0(o=YiM{(dfCb?lFV_3e`aHX9@s z*zR5}VAua^f&J`W0f+oM3mjWkMon5oO6Z~V!7X(bxn-FLdxge-aU_!8r^@5Pl zPZL7^$Sz=FWMXES{D7r(aw4lE4=8Cdf(Qmih6&=Vpwz~;(Lb0~2qXrR;PMR)G3NpR De!B_5 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Fort_Wayne b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Fort_Wayne index 09511ccdcf97a5baa8e1b0eb75e040eee6b6e0c4..6b08d15bdaba6cf94dcb2681887154f4d265d8ba 100644 GIT binary patch delta 89 zcmZqToy;;pT!sM+FfuSOfG|jSf;caTf?>7IlbI|SC+}cXn=H-bCc)(z9AfI~5~Aa4 StY@TWpyO+3sAs5Wzy$!A`U~3t literal 1666 zcmWHE%1kq2zyRzF3=AL)l1PTKWf~Y580Ib0X_&w3XTgFtzJ`UfZWo*iS86zQ!@b~i z$G?V4%3lgDC31eaT>6>eio@#_-#{4@Q?8=2$;r_5NM-c5LEgsAy`JRASCoeLdfsW1!1PE62hMHe~6Gf z_8{WO#}ASJRy>GWa`{8_y{-o_En7dt?#p=)mooiB{5-!03BFqj65F#Al60pPB&Yi( zr0`Z0q`K=Tq`r+RNLLq3NIz>+kjeHrA#<%k(vU>*$DkLfrD)ucdsQeL?P&Kc$ zp!$YQLQP$ILG2E?gt|D-g8CT@2~3P&$jkz!ARHLU%EZb>1^EB}dMgHo|NnPxU}X9K zfAs1|>TX4N7_-8kGD%G$;vzXizc)(>L4;Kr|>hf@n~Z1k;I} zA3!uHX@Y1_@&wVKBnqNI$rMC`k}8M>C07s)O0r=3!9=irP|^kQLCF_HgOV_a1|?$< z4NA%&8kC$tG$=`fXi%~S(V(OaqCv?UM1ztzhz2Ed5DiM|AR3(9K@3om2Zi4Be;+^; zDCvV}Q1S=Spez8UKd%7GgR%mM56TW88k8l#^yVC}JSb~`_@L|oqCr^%M1!&khz4a9 z5Dm&MAR3fqKr|@ZfM`(G0nwoB1EN7$2u%O}TmYg$SqV%(>f~-1o1)H5=4WtCYW9;2bKqAQ4k-LO+hp$tAc1yb_LO(EDNGR*%m~DvMz`QWnT~t z%EBNTl#M|&C@X{MfA_)WgR(S;56adc8kDuc^uEPlc~BMy@j=-fM1!(Ahz4bM5Dm)m lAR3hILG%#L`dqHTA*QY_Av(UsdPaH%I=+U6dWL!iTmY~Ia9#ia diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Fortaleza b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Fortaleza index be57dc20b46142787cbd820e0d1c927d2f02f046..092e40d70122f764fd2630957be1d3e32858f6f5 100644 GIT binary patch delta 43 wcmX@Z`h7H&oc1_lsjU|^Um$f&}ozS)e?fpKyJlPV+Q&`a=iuv0|PSy0|U>rRoN0d_&p!&`0KD>=SLHRUH3{9Zdt4|xb^y%!5ztm z8}96kRJi+F)ZpIidkXjO&N6rqVyy6G`u`1IS>qJG9Y`_w&L_9vN1%?ukK;!besNve z@N3171;5|08T{$4T_Ah1&p@u?`U3d{rW+KD&o5AH%rsEqKCwVKLQ7zS@}mL;Rr609 zRIeOYF#mRJgT;C$I)w3Se`%n80qZC4fU=a{{Npv;Z!KsR>*kDgwA4lqc}qoN|HpKx6{n z&aw;qD@z{;%#64o*ctvnsM6|!aHi!0kw}>fqMr5A55z3~T@cs!`#?fTIzW=+{sSq- zzX4Jo|0GC1ydNNQ@m_-L!Gi&E8xJJNFI*g;Q2ObCVq`)NX$>70PDr;HCG%lIDTtv~8_AwTrPgM$9$7Ya=;Jt)fWyihE< zZBD3=$O@>~H#MR1hfhG&yz+$V8+rjXb&(0RI|Ksi;;a+ur+*4yVq{`wnf!psZSn^u zv&kQrxF@SI8*zb>6(g9KAkGU)XCMsX_iPMrV5$ePK*0s3FV{Q((V$=h)0^YKd{FR# z_@E#J(V$=i(V(CN(V*Z2(V!p&(V$=j(V&n8(V)-;(V!3p(V$QU)4!kACx95B;0DuA z8Nn8Uf*r&M1wDuc1wV)eMFEHgMFWTiMFofkMF)rmMG1%oMGJ@qMGc4sMGuGuMG=Sw zMH7fl;jPaCI{*}4AOTREfoM>?f$6h)V0lpdf%u>}1ks>)1ks?l1ks@Q1ks>41<`ry zk6r-Lpr{4Wpy&nBpeP2>plAls#r2|Fz&-}WH%I^!=O7vs?_m1gX0QW5@eksI(g27C zr2`NRN(&$wlpa7dC{2K9P`UuoptJ#^;pu~k5d}_u&t#6AT$DhHA<2cyF*wA;(IrI3 T*I3U;&p^l5&`{4%&wvX6xRsWy diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Godthab b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Godthab index 0160308bf63690a6dee51c3c8849f494a47186c2..4ddc99d8b74c4b525263ca1337cb57d1a15692c0 100644 GIT binary patch delta 128 zcmcb{caeF5xC{dtU}Rum0AY~u1aUzS1;a`V3=GVhuQ7=*+A}f{g8%=YZ(v~f|NrU* c2A2Q-A3tE^@bL{{&^0h-&^0icY|O3<06{$yCjbBd literal 1878 zcmWHE%1kq6zyPca3=AL)k|=|+d1g0cFbMnB1c(^_njotDdV-knoeAR1XD5h%-Zw$w z@%jmpmlsTsIy`ZL^q#!}GHcce$j+HBAlEZNK)$9?Kq03{Krtp+K*=XWK-tDsKt;z) zKvhOvK#fO2K%Lcjg8EmJ2^vpTCum+3o1k@+eS-Fu9}{$zyqusr<<E?FnEkC6u#lcI!QyVBfaUM9308ZZ1*~sJ zOt4uNKf!jl)dagX#|iecWhOYJDNk^0u@rD}W1ZlfA}!#e`h0?`^Iris){_(5mG29< zzk4R&$$U`2^V|smug8l8yw|M~@Hw-8f^T1sfZv*h6a4e?1Oj@RCj^FfO$f?Koe*rE zGaEj#1ple{vple{nz`(%B2q8#Gt^fc3{|`#B zpd<`RwICXlazQjG^@37lLR|P6W}Q+z6sUITB32dj_^2lruqmQ0@fLpd1RKLAew}gK{c} z2IW=|4a%_~8kB26G$`kSXi)A2(V!d*qCvSBM1yiNhz8|m5Dm)FVEVfOI6go*8^j0Y zZV(O1;UF56%Rw|Kr-NuvZU@nz91o&FxgJD=az2O#<$e$iDgi(=s1yLvpppPYgGvJs z4Jr{pG^kVn(V&t6Ouv{8b`Pk80P#Vk1c(Ne6d)Q@T7YO!i2;2R@Oj5crcD~B6t3<#^=OL58HVjUE-8O0xRmhh z#N`f`8&|xTJ+5Y`-MFUt)Z@Ab$Bi4D$31SUzq)brW&KKz+k)&7w=W$%apzu1#NCy- z9{2WzMcnW7_joYRBI04Dp~s^-sffp(!X8gz|3p01`0DY@UE;=bA;A+b)PCJ~@$vJC zS8R7~yt;Vx#Or7KZoJvJ{lwd23vRsIzt7|S`n?e!<}dL0*grqwQ+<=i=lsTqFYzfJ zU;UFKzS+BZeAjo4_))KsbmGUY?1-QIdI`Tcyf6Iv;q~D63*8HUZs}eFAI1r2saEiwW!oTLL%~HYacjObg&*n3}-# zp(23$L3skt%_$dn4@4&L?JT>%zq0g!z|4pXf}P5?mv)X{2L(k@lS&E!}|d;7w;v=9y}NzxA8!N{KCZn3Z>WnC^ly1 zD249$qnuTKN5yp3A62jPH)^6af7G=+->CnaS)<9N{YLX%b&b|5-Z$F&Vrz6RYvt(9 zv#-(H%#)*Er&wb!>0ORty6qpMq6_so#_sZeOoBG$n5r}WF*BNyW6t*YkA?JxHx|#1 z{;~W$>5bK~<$tVim%OoAf278Cci0=d{$(}xvn}2@T zx=7}@ey;oDu50?n{c^$|PhRmio|~Qic)j`g#(PeDjn6f)9N!wp8ozBK0sb-e2?0~< zzXb%^C?*7z-UtYmVNM7M-4zh>`)NX$>70PDr;HCG%lIDTd96QsAwTrPgM$9$7Ya=;Jt)fWyihE< zZBD3=$O@>~H#MR1hfhG&yz+$V8+rjXb&(0RI|Ksi;;a+u zr+=C($2xOzKC1*6Z)SC1`~Uyy1xAs{pIH?JLAi^85ln&!#)*0|f}m^%!XOcF*4r3; zgry$D1BDHU4w(8a07Qd=2t4K|u;e%r1e$5(*0<+9uv!1Ez;<`T1H1kU1@^O(9ysK0DsXJ6PjK>|QsA7DnBbycR^aO5 zoZ$L-#RqrY_y_KnyFPf<^Ey88+??~l>#gzw?>U_XKGz%)d~31`{I)42_{aDb1WaQ| z2(-~J2r7M+5G*5D5E6PKA>{Yxf-uun2~kTfe~7-<^&qBY>xbBVIS=AerhkZ^=l3AN zcS}KHdv-#S?zDpBbl-#&-im@$cm0Iaw^0S@>VgUBXKe~H**+&^u9Yi@&3bkPz6a5u5CGAjPyo@OkO0x3&;Ze(5CPGkPyx}P zkO9%4&;iqLqY6MYD3rkTSsO4P6j~sD=32RWumC93KmwqU1JR(+1JR%m1ks>S1ks?7 z1ks?-1ks=n1<{~T1<|081<|0;1=IiTgUttpGKdcfX%GzxZ7{vhdNEi5DA+*)pr8lQ fpx_75peO**plATmpr`=RSfWFPnCO^n#H<4V`KxMH diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Grenada b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Grenada index 697cf5bcf7f151ffc1c1fc4247e4e9c7e3ff01a3..f4fe59034242c4416bc84f06f38530d625149329 100644 GIT binary patch delta 27 gcmbQj*u*$Nd13+!4fq{vEfq`SPx$zpt|NoDLFfjc8fBXOgi;r&zgJWfq{vEfq`SPx$zpt|NoDLFfjc8fBXOgi;r&zgJWaX5C&^Qru!6hUp NVd7%#3Ca`0>Hr}+75xAJ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Guayaquil b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Guayaquil index 0559a7a4a4288d7e3c3b1bcf47c57a7ea82be2ef..381ae6c463260d85ce92d6585b6420fed0c096dd 100644 GIT binary patch delta 37 lcmeyyxS4T+vH$}E0|O%zgV+<48CfPy)L>?0W}0}^5CCrk1_J;9 delta 66 zcmdnY_>FObvLY)30|N^K1A{;V0|UdhB~B9BVt+1Z7d~^S|Ns9#BQq28#3s!N%8aZN O!!>vq7#J83!iE5J>=XL{ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Guyana b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Guyana index d5dab14969306692ae95a1e9434252737b6c4b9d..ebd85d0f3e022a63253d529931cf8b4842e21500 100644 GIT binary patch delta 44 xcmaFExQ20p^27!f9!3TR1`uXoU|^V_%*Z^kPl1V%X`;P02bYbmfr*_77XZR;2f_dV delta 60 zcmZ3(_=a(UvJ49Y0|N*P&A3_F!BxA(M!o*GLH+;#{~4K>Cst}tP-bMA7_Pw0z`(!& H7c~X|IBOGs diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Halifax b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Halifax index 756099abe6cee44295a5566ad6cd0c352fb82e64..9fa850a7d4c36dea84149bc0ea2fcd3581d61a8c 100644 GIT binary patch delta 92 zcmaDL)xkSKT!sM+FfuSOfG|jSf;caTg5l+xSRGg=e`GeC{Fb?F@&Xnk2`9bZF3JwrVME&wN94(R{@ delta 1525 zcmeC+eIPYKyq=YTfdPaW7#J9yK-nS(=Iv-rn7`|8z@oY04vP&o z8Z4;_b66@ZZ?G(Q!GUFef;OzM+3T?4j>(2qGV>i)owYJp{io4k&Hjl7Yv0{)Sl9E< zVErCfhYj_i1{>GSaoFTtuwipwox>KD-3D9p5*)UP)*slg-OtHk2Z#8EohmO6?0o)n z!)}(-2X#%pO;f8&mwm9scaLeGp<>vg{tl95Bz|NN$0{QG*79 zV?{O&#|4rMPMGB#IPtS?!zrt=E2Per5Enpt4_GPvLxW%zSxBOonZkF=GiAa%(Mu2RHvBm z*i$OtnY;Xh=Ry(}UZ^uZc=7Sqg;#8kAH2GF=fdk}M<2Y|xbMQp{$&ZD>N^8I=XWH0 ziO&xB>YtVH&E7ZQyS`7t4~@(VKl$|%esOqT`1Ql_ zU;gm|!}Jdi7~3yjU@E`#fVtp9087IA1lE8{0c;Kz6W9&51aK&9PT&-n7Qn?YHG%6x zMF97M@&ulnQ!elxh)m$yS$2VcW$6QfnGqKRJHsCcRa#vT&a`|W5-D>*)KmI_n8m*f z;u?P+NGM4MNOIhNAjSAMKjPvi-b;`@crZY21WhjY3!3+)CuqIWyr8|WGC}9ETY&Do z=mfpZ8Ugxswh0E4xdIH+BOe$Qy$LXOw|-y}bS}VDUG{;Q(S`tXw*L<-q|aQic=qst zjqwMzg+Xclh^oy=jONvUT;M&c+aU$@VRCb;9C=$;I~aAz(2-5Az4@j*nr+>Q$oM;w4M@`MNJvh%4@lw7N=S8A3`l+JlaQ{?9FTri zFCmldX+Y*$frPAQ#{;sb={(3e|M)^~8Q+7v^+zw{hkkfa(7*gbq3NXuMfsfBmjzY5DkiU yFnw<`*a4vE2k}8k07Qe50f+`A1rQBN4j>woBtSGMS%7Fz(g4v!B#+4jY!U#rwO$DT diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Havana b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Havana index b69ac4510784f23ee794cd6d11e62315a7318e5e..e06629d36841463326ff3350bc2f94d0417c3cdd 100644 GIT binary patch delta 131 zcmew$beCg-v;+eZU}Rum0AY~O1ZiFn1;SYj3=AxrXEBE`GcrzY#qkcFMb=E=Zq`age#qbwPH$or7Fe zaDaTjf`dYoX@FvVK9hrzbKnJKzb6hV%ElK|^^Q5HiFRF37k_j>{onEcjqjH(Xx{4# z(7L|mg7&`b0G;jAF6hql4bYojaY4UMKfs_o>Vjdq_XVSHn+wM7x))3wA_GiiuLhVI zZ3r;?yFI`{`pgB3XO}Nn{$6*%>e$u`*0(2Iuvvd8z;<`h1-t$&0rmE?LoPU^MPG1r zF%5A2+;hQQMLfX$&dLB!=AQwcn*%O*J-!{_JtsH7=gjvDzO9`X{Pz1@@GpOGAzXJ1#^Vxq2b;->eH!OSWH#zE^W0 zre)@Z*nM#q;!>(F#LsiMkl;I`J|M9@HXup2Dj+%CJ|KlRCLq;aF(CD=T|l}zb3po8 zg@8=9rvaI3nF6w&9S_K!CU+s{{NoF`WegYc)*ro)ANuG*LI3g#g{DU?6yC9I zp~OG?Ldn0w0c92)0cH1=22@C71yt;752*a%6HqlTGobp0UO-KqcR=k9fq=R=R^5R5 z>7ORAV|J-$VM2neEYySl|8F|M!0`Y7rUMKt|NkF9z{v6c|IQ5zJTMX@;^Qk4!r z!r<%@!r&Yn0?rhSj1#1JL74)?180zp(IL$BARZ{_K{P1%K{O}|Kr|>C!1V9y0U#O_ z9bo#&=L;Yj6fI!-$W<^O6g?n5D2hNdD4IYtD5^j-D7rv2D9S)|{5*$xu*L-68DI-Q z(Fc+MMInd=MI(p?MJ0#^MJJekYX?>jidGOG6ty546un@2EfZKC6wM$$D5^m;D7ry3 zD9S-}-un8ZUuOHcX6OseoG*mv3;0ITrxp9x^Tf diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Indianapolis b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Indianapolis index 09511ccdcf97a5baa8e1b0eb75e040eee6b6e0c4..6b08d15bdaba6cf94dcb2681887154f4d265d8ba 100644 GIT binary patch delta 89 zcmZqToy;;pT!sM+FfuSOfG|jSf;caTf?>7IlbI|SC+}cXn=H-bCc)(z9AfI~5~Aa4 StY@TWpyO+3sAs5Wzy$!A`U~3t literal 1666 zcmWHE%1kq2zyRzF3=AL)l1PTKWf~Y580Ib0X_&w3XTgFtzJ`UfZWo*iS86zQ!@b~i z$G?V4%3lgDC31eaT>6>eio@#_-#{4@Q?8=2$;r_5NM-c5LEgsAy`JRASCoeLdfsW1!1PE62hMHe~6Gf z_8{WO#}ASJRy>GWa`{8_y{-o_En7dt?#p=)mooiB{5-!03BFqj65F#Al60pPB&Yi( zr0`Z0q`K=Tq`r+RNLLq3NIz>+kjeHrA#<%k(vU>*$DkLfrD)ucdsQeL?P&Kc$ zp!$YQLQP$ILG2E?gt|D-g8CT@2~3P&$jkz!ARHLU%EZb>1^EB}dMgHo|NnPxU}X9K zfAs1|>TX4N7_-8kGD%G$;vzXizc)(>L4;Kr|>hf@n~Z1k;I} zA3!uHX@Y1_@&wVKBnqNI$rMC`k}8M>C07s)O0r=3!9=irP|^kQLCF_HgOV_a1|?$< z4NA%&8kC$tG$=`fXi%~S(V(OaqCv?UM1ztzhz2Ed5DiM|AR3(9K@3om2Zi4Be;+^; zDCvV}Q1S=Spez8UKd%7GgR%mM56TW88k8l#^yVC}JSb~`_@L|oqCr^%M1!&khz4a9 z5Dm&MAR3fqKr|@ZfM`(G0nwoB1EN7$2u%O}TmYg$SqV%(>f~-1o1)H5=4WtCYW9;2bKqAQ4k-LO+hp$tAc1yb_LO(EDNGR*%m~DvMz`QWnT~t z%EBNTl#M|&C@X{MfA_)WgR(S;56adc8kDuc^uEPlc~BMy@j=-fM1!(Ahz4bM5Dm)m lAR3hILG%#L`dqHTA*QY_Av(UsdPaH%I=+U6dWL!iTmY~Ia9#ia diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Knox b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Knox index fcd408d74df43310a9a85c475f83d545f6d75911..b187d5f8c75685af67913e9360b50ecad19fe6ad 100644 GIT binary patch delta 97 zcmew(^n-nZxC{dtU}Rum0AY~u1aUzS1;eon3=C|WmodL#nq0*ZJ6VreWwITogans! aaEO_+ONfrIv7V8hfsU`Cp`M|h0T%#S{0^-E delta 1324 zcmeyt{zqtncs)A<0|N*%FfcI8g0dwV7#JAlEz@b3zw2kgf;PT}g|luKobLG7a7p<~ z!KFmb4_8C4GF($Q`{BCjc7_`a>p$ESoylpf(P@W8y;qc6g;Z4ZFuZyR`4WFzTs)O&4*|1^)?L8&E-D4P?uwP@k#8%D|QBk zR~LVLc>U}V!<%bIKD<44gyG%(hXwD~KWO+c|8T*_{zDC4;@b;;{YYo{{lfFZpBtVG ze@|$C__srw;r|NW4-7MS85rB&e_$$q&%j*BQ^1nQ-M|{~u7J(qZ3DZ(g#z|o^#)FX zO$D557c+2um{P!9|6p@Vcn_2|@a>%Rfq&&B27#F+9|Su~7=$XrJ_u)qF^EK3 zd=T}tU=XvE`XH_;#UP<%ULeWwhe3)-vOwySM1%Ch-vu%ke>KP+yjvi*@lJ#M!uROE-)c;*<(Bw+~Q17B&R^aLqSm643 zJA=D!?g#hFGZ{R2{Xckau4eFhYxu!?&h!SKYkmd3HI)s1+YAc)W1<@ZrU?}U+SoP( zm3}D*mXU7=3B6Vj@`te@%ydUV*i$)%2)QdCB91aJME=|MA!^AZhUj}UKE$*fVTj#V z^&u{08AJTMm=6iQhZ+*wE9(oAbeA+Fr$-m0@U}Iiy4x0{zRhSzSC=nHKkL)GRi>}j41Ip_a>$Su=m$XoyLLw*=9LqY%H4~3@h8H)0kekc~b$WY?n{-NaG z+lDfWB?V>o&Noy@v=vnB+t^U~Bcq^d-sFbr8(sx9b)^lpJ9G-_;=&v1XK?ZrFflSQ zGBLAEE?}0QoXc!JxrA9~as#vA=MG@92~;n93H~p91z0b z8XN*jvJ8x1l7Vrep`;)v9fL4P2%MHTM!#XI2k}553#Kp61X17+1~EXP45C3H4WdDz z4WdCI4x)W)DnWUH0Tl8eJ}C4-G$;l@G$hfM`&X0MW(uq8C9lIBkF!p!5NvL1_d`-#ZU>04S}1_@MLxqCsf} zM1#@|hz6w{5DiK{AR3g0Kr|>Ff#~`f@T3GzQJ_=>!jo&6h0xQLHu33-Ve)-uNdPAl B#CZS! diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Marengo b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Marengo index 1abf75e7e864625b975feebdd0b232d0de624b27..a730fe666b6522026ec2eb74f94616699178a346 100644 GIT binary patch delta 68 ycmdnRyPai%xD*2#U}Rum0AU7($&E~syvVXzo0l_1Fit+fs5M!i$!+o?HVFXwqX|R+ literal 1722 zcmWHE%1kq2zyRzF3=AL)l1PWLWf~Y580Ib0X_&w3XTgFtzJ`UfZWo;H_}6er`Afm2 zM9vR)?oDsFyK+LoqdMD$$DU>dPvYboo@z=IJae~UcrIk};f1;!!;4R1A6~IDFuc0> z-G8{9pe60mJlv9~j#oK42<;@PWDDUjj?Q z-vZWv2MKHr_Y2q!4kfVnN)~VmY%1VfJLLn{hqeS4{jvgA7v}`m&nrH->&8EDzufh~ zlh^Tq=jNObUT>8jc+cr9@VVxY;9HYj;I~aF!9T{gAYd9xLZFR)K~U+lgkTxLf{@S? z2_e5f7lfIvN(g(({~k5x_qra$v~2wlyD#TKT*~wh@$>v1 zB=~MANNmqeNYb5Fkeu$DkiuJ0km|0Vkoq>NAYENBA^ogPK_=Vhgv_;a1zFFoCS*^u z`jB(}^yO{KqQ06|NqAiFiQCNhA=q0gfKV< zhcGyYhcGw?gfO@UhcLLhgn$wi10$FOQKTfn|NsC0k7NF~07Qe5B8UbhM-UB4k{}wC zEI~9VX@Y1_@&wa~oF70mD4Bw2P*MfapyUdoK}i-wgOV+X1|?k(4NATs8kB@VG$@fa$eUz~+In2Z#^KA|M)+O~CZ$ z6<~Q#b^-B0Sq4OdvJIHtoCB5zWgie9l!ZVvC>w!jP*wubpzH*qL0Jk!gR&Kf24yV} z4a#018kEIAG$@;a>EEBh?geEx5FeD~Kr|@Zf$1Y3!S;i)ABYdif*=}{4M8+0D}rcH zb_CI&ED54P*%Cy9vL=WIWls9ulTc~CY6@j+P`M1!(3hz4b85Dm)KAR3glK{P0PgJ@6|2hpHx4x&L>9Ylk&JDC1= zA8bA-+k^O^tPi3=*&j^rTMU*56$2nXs3-u@pyB{TgNg(Y4JsBuG^l6*(L=m=;BpNP ZF?Dqb(eX9bGtx8A@ijEmGt@KS0swdYUh)6{ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Petersburg b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Petersburg index 0133548ecac014f4b37f0abcd471a5a6b4e7ed5f..341a0235ef488ee623aba36a8b5928122774d2fb 100644 GIT binary patch delta 101 zcmeysx0-c=xC{dtU}Rum0AY~u1aVOi1;Z8$3=C`x3=9&RKQJ9&oIHWeVsZhK%49uu e2?;LO;1E++mk=FaV?851107#OLp?)111%-e)M;P8s z-1Fi6`Uedk<{vKj*ng#Tpy+sa6g#bz;koM2i^mv4SYK%eQ?n)D{yrQEO7n2oxxo<_k;W8 zt`DBPjt@LH=X~&btNg%wPG^D7HHQS>n(P9(^wJ$ZS)I*N}nYJ%Lo>P zgq}zU`Te;d%yd;k*i-%w5pu^KL>&3}A@bjf2T@Bde~7-<^&qBY>xbBVIS=AerhkZ^ z=l3ANcS}KHdv-#S?zDpBbl-#&-im@$cm0Iaw^0S@>VgUBXKe~H**+&^u9YjudUiD- zdz#gUobw+a z?_fcNL`6cyzQqNVKcW(<=Cu}7->^xjsY@@Y-65Ay7w1_}KZ7BGiIItsiJ1jVftbjc z6{{#CDWuHV>E-0FewL|NkF9z$oG48^Yl1 z62jmd9Kzrn9>U-p5W?UZ9Kzu05&}w<42)nBM3It)|NsC0KaTm|0uT*K%ODz*oI_~G3C>#}1}J}lXiy#l z(V%<=qCt5LM1%4hh-NpqPynWT)j>rC1E;_yFdvlvK;oc02%8*dL%g4&sCIIfw@3bufM8BiMdWo(J(k z`5r`r@;-v|0cF diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Tell_City b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Tell_City index 7bbb653cd7ce09d88f8a1701853bfe92ac7db0c4..76e1f6285b552c11ceae9bc6cdbd6a308419b0e8 100644 GIT binary patch delta 88 zcmbQj+r=_LT!sM+FfuSOfG|jSg18`vf?-t#1_t)ci2po_v9o Rd$I(Z)?`06naMS55&%zm3V8qk literal 1684 zcmWHE%1kq2zyO>K3=AL)l1PHGWf~Y580Ib0X_&w3XTgFtzJ`UfZWo;H_}6er`Afm2 zM9vRS(rq6+)s!fB=5E9AT*&0Z3w1e$7oWsFykciycy;l|hu6;@F}&G$>%-e)M;P8s z-1Fi6`Uedk<{vKj*ng#gAj?>W;Oe6INw z_|{Z5_-!*N@Q;aZ2$&{R5NKoD5LEi5AXrAeAtdx#LC7D*hA`6|1z}I+7$W4Ze26&8 zz!3Rw+lQznj~Jrw&G-=0a)cpvU)6`Wlw}O@^I|?E_#SFVY_BXx(p}P!oE}|}!rRu6 z>TX+*`Zl8>U0uE){j66*COcz6=31SGtY?o4vZr}6*wn|9{;|28RFtcWz*0 z`Tu|Q0tOB+n+Hq^fJg?B|NoC4V3Yu{VQPGQLl~T0LKvKbLl~UHLl~R`LKs|wLl|6L zLO|(=fe}nHFhCfjq`d$C|NoC;{IKoD6bzz4sTf3qQZk4J zrDhNfO3@%1l&V2AC}o3aQ0fNJpcD?GL8%->gHk$(2Bmfo4NCDK`X4COgBYNc4+^>I z|2}{yP!0gmpj-f=K{)|Tf8GwFz&QfM0Obl04ayl{dUG|10_PAA1C&cZG$^NlXy2Mj zPzGlJ{=*2?56V#>J}6g#Xi&}q(?>xh zB!_`mpj-x`K{*XXgK`^)2IV*q4a#*O8kF-uG${9hXiyFW(V$!iqCq(kM1yi8hz8|I zF#R?I>>g0g1o1(+6GVe@D41TW1C|HnR1hDOTR}7^$AV~3t_9JcoC~5sxfeu(axjPn zA56ayj8kEDq^uCQ?c~DLV@jU^zT!sM+FfuSOfG|jSf;caTf?<)#mP{)q7ch!UKFH`cIgeEW0Nfb}SpWb4 literal 1414 zcmWHE%1kq2zyRzF3=AL)k_d#dWf~Y580Ib0X_&w3XTgFtzJ`UfZWo;H_}6er`Afm2 zM9vS7>TDbS?U4EKfBF9h4AcL8U~GT*fT{e!2j+r*2`mYJ3s?glB)I686}Y-MC%ArI z@xfg;{(<}Dt`DBPjt@LH=X~&btNg%wPG^D7HHQS>n(P9(^wJ$ZS)I* zN}nYJ%Lo>Pgq}zU`Te;d%yd;k*i-%w5pu^KL>&3}A@bjf2T@Bde~7-<^&qBY>xbBV zIS=AerhkZ^=l3ANcS}KHdv-#S?zDpBbl-#&-im@$cm0Iaw^0S@>VgUBXKe~H**+&^ zu9YjudUiD-dz#gUobw+a?_fcNL`6cyzQqNVKcW(<=Cu}7->^xjsY@@Y-65Ay7w1_}KZ7BGiIIts ziJ66om5oa9|NjjR3=IGO@7%!1^8f$p1q>WuHV>E-0FewL|NkF9z$oG48^Yl162jmd z9Kzrn9>U-p5W?UZ9Kzu05(0{521YOmqDV;;|NsC0AIJP}0f+`A4iF7WARro)NI*0w zp@3*mVgb>h1OuiMIX{4CP{IMx;KT!BfD#bMHPion08yZX1foHS2}FYu6o>{TDi94y zSRfjdxIi>0fr07IE5Q0e2@S*tB{mQZN^oF$a}HP@l<+`&P~rp8pack_L5UDVgAyW$ z1|>!i4N8z88k8tOG$>($Xi(w=(Vzqhrhk7f0MVd?3Z|d(gY5$)SP&nSXhAe6;eu#T z;sw#51Pr18C}D$WP~ryBpac%0L5UnhgAzKJej5dL z4=BNd_@G1&qCp8COs|y#%Y!lih!4sHAR3erKr|>bfM`&L0MVdK0ir<}14M%|2Z#n` z5D*Q@Bp@1;QNZ-S`(X1y83x1$Wf~9-$~a(p-(s*lCIoXKKO@hlcIKc^7+!o5 z`|ygLf#KD~A0J*nd&KZ&9VC1)uYmG<=C~ zFZk-;*6?qK%!mKW|36@u{_g{0`@;t=`eg;KE`bHEpSLr(>*juNzufh~lh^Tq=jNOb zUT>8jc+cr9@VVxY;9HYj;I~aF!9T{gAYd9xLZFR)K~U+lgkTxLf{@S?2_e5f7lfIv zN(g(({~k5x_qra$v~2wlyD#TKT*~wh@$>v1B=~MANNmqe zNYb5Fkeu$DkiuJ0km|0Vkoq>NAYENBA^ogPK_=Vhgv_;a1zFFoCS*^u`jB(};uK5114HkqjdL{~tfVDB0!m5@j9?N(k&^KK|Ns9#j``mL5DiLzAR3eiK{O~Kf@n};1ks=b z38F!X5=PqCp88M1vAHhz2Ea5DiM?AR3g=K{P0_gJ@8K2hpHJ z528T{A4G!^KZpir01yL|2|%Ga{oe-=1Pm>Cf9i6gYE$7@!OSqCuGi zOmEHs>jz~P5FeCbKr|@RfM`(00nwn$1EN702tV_`pTK ztiaVJu)y{6b_RFd_y_KnyFPgGIzI5+ob$o!t?~o!Ih_SQ*BlajYqAUcwkaj}$M_Zm zOk+t1w9zjJDt(p^EF)MD5_%#bnf@Vup5KE6-z^1+?b!)Qy3-1h(|r?Ccq)F+W>}ggXa?XEzkXt76A#eTV2l=7@J{0tCeNbrn;6qXV^asVF zhdz|}S3W5DcfX*_Vp>Aky@Lf65)}y*`xX~e{)kGbn%7!TeZwZ9rY^mpc86R-U7Tk@ z{S1Z#CPpSkCT12e1!7{ytZb}otc*+`l6?IC|GM)G4FCV{+`!24|NrU*3>;uK5114H zkqjdL{~tfVDB0!nBMj9?N(k&-O`|Ns9# zj``mL5DiM6AR3fJK{P0tf@n}u1<|173Zg+t7EC8{egM&+qzj@!$rnU}k}!w{C1Vf` zO3EM_l$=2{C`p6q2NS{iK}j3L2PJP14NBr58kEdIG$^TqXi#zo(V!#`qCv?XM1zt( zhz2Ep5Dm%#AR3enKr|>TfM`&50MVc<0j58Rf$axn4GTf$7iNK@>Pkff%4{1)@P&3rug$ z0qX~4F%Tb=%|J9LtAS`xb_3C%EC-@N*$za5vL1*AWj_!N%7P#olnp^NC@X^L-=7OW zG$>1g>8Jc)`#@O}#0O7IlbI|SC+}cXn=H-bCc)(z9AfI~5~Aa4 StY@TWpyO+3sAs5Wzy$!A`U~3t literal 1666 zcmWHE%1kq2zyRzF3=AL)l1PTKWf~Y580Ib0X_&w3XTgFtzJ`UfZWo*iS86zQ!@b~i z$G?V4%3lgDC31eaT>6>eio@#_-#{4@Q?8=2$;r_5NM-c5LEgsAy`JRASCoeLdfsW1!1PE62hMHe~6Gf z_8{WO#}ASJRy>GWa`{8_y{-o_En7dt?#p=)mooiB{5-!03BFqj65F#Al60pPB&Yi( zr0`Z0q`K=Tq`r+RNLLq3NIz>+kjeHrA#<%k(vU>*$DkLfrD)ucdsQeL?P&Kc$ zp!$YQLQP$ILG2E?gt|D-g8CT@2~3P&$jkz!ARHLU%EZb>1^EB}dMgHo|NnPxU}X9K zfAs1|>TX4N7_-8kGD%G$;vzXizc)(>L4;Kr|>hf@n~Z1k;I} zA3!uHX@Y1_@&wVKBnqNI$rMC`k}8M>C07s)O0r=3!9=irP|^kQLCF_HgOV_a1|?$< z4NA%&8kC$tG$=`fXi%~S(V(OaqCv?UM1ztzhz2Ed5DiM|AR3(9K@3om2Zi4Be;+^; zDCvV}Q1S=Spez8UKd%7GgR%mM56TW88k8l#^yVC}JSb~`_@L|oqCr^%M1!&khz4a9 z5Dm&MAR3fqKr|@ZfM`(G0nwoB1EN7$2u%O}TmYg$SqV%(>f~-1o1)H5=4WtCYW9;2bKqAQ4k-LO+hp$tAc1yb_LO(EDNGR*%m~DvMz`QWnT~t z%EBNTl#M|&C@X{MfA_)WgR(S;56adc8kDuc^uEPlc~BMy@j=-fM1!(Ahz4bM5Dm)m lAR3hILG%#L`dqHTA*QY_Av(UsdPaH%I=+U6dWL!iTmY~Ia9#ia diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Inuvik b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Inuvik index 87bb355295a3efcacd4baecb5a8bfa3fb9ce9c54..af3107db51e3848767a443adf8b3c87c55579061 100644 GIT binary patch delta 44 ycmaFHx0iK-^5hFlEIf=13=AO5z`(#TL7CBd^KGUFjLb}oOp^tfEGA2{djkO8fC(o6 delta 1053 zcmdnX`iyUaa(x8@0|P4q1B2)THou1N`WX#BG^Q{Jc1}h;uv(#h| z*VGV@P;zaM84d*9*-I+qI?bmz5B z(Ayl;pkJ3h!CfJxAg22*tp0W+gp4d(1x0v6KW87!Xj2w48U z$zXNtoq+Z2-3&GxxF*={p37j@|7L>y?0N=={Bsi=TV^*n`EQuuoKoB1qCaVZt4n-? z>*u2a?z%M$?w6Mfc-HgAF?eq76!3cMz~DV+=>(r^F%7;o?GyaA*){mbWKIZ}rqB>* z<2@m$jHw}5Mt4F;=#z$!Kl~HIOpi5$J=GD2kbBG!agWOHh6LXW6B66o8ZG6q^1OD9Yc$P%L_1pu~R~ zL&?A26Ur<$HI&`EJE1~iN<+oI{SzvGlr>b%TR5TmMnpqRUGs$69aar>aj6sPXUH@# zF)}f;pu))kOiEC!IJt<)c!Dxx#m4XljP(o*3=E)90@Ih53xH@(-Z&5i4lob{6lfqC z6mTFK6nG#S6o4Qa6o?=i6p$bq6qq0y6rdm)6sRB?6tEx~6u4me4}bjx5Cas-VEU;J z*a4u>2Jt~54x&M!4x&LJ528V#528Ua0HQ&$0HQ%L0ir>%0ir=M0-`~&0-`}N1EN8( z1EN!S>!*Mn0E#A%04SN(SBlJG4F! diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Iqaluit b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Iqaluit index c8138bdbb3cf141ad42ace037e144bee98d81481..eb2c99cca53a5559c5b3ebe6e08032bb60ab4930 100644 GIT binary patch delta 97 zcmeys|AcjdxC{dtU}Rum0AY~u1aUzS1;aKB3=ABbm6)F}P8MLYncT@_F!?Bxq6C*~ aaEPg^ONfrIv7V8hfsU`Cp`M|h0T%!_s}4N? literal 2032 zcmWHE%1kq2zyMqf3=AL)lBk5T70=`>Y`CQSrQlM+?+4%Y?E-#iWL^-?bpId{sr5kA zQ}ctECC>wKP3{j8N}36h9B)5JF>xnIec~#Re)u*)=Hi7%YFE`e1eJ;s@*7^B&l&e^+3;yWxRd|Ahkk*+~x^@;4PYw$vv$`A;cuPDxB~ z(Jw1-b#YE`{k-CXyKejg_sd-$Jb4`-cy7-5;PqDdf%lxw0-tLR3BEPi1%BI<68vL) z3j(IGBm~;%7X+0)O9++`EC>lbkr49xb3vHts)Vqo{2wCZjy;Gt^6^9DzZDOnmR$Z2 zeXr|5Ov}~}vHNl!#HCFC5I@iFL4xm=g2eXhge2W*1ED2P-ZbLq3qtlf(nU>go=HO3o3s^B~;C8EvUX>lTcHaUQoM3E}<^Y zv!H$kLjo%!6EhPFagdFjICVs+0;MzthX4PMA7Etp|9|HO29E##uU=r}0gDKNNzwoR zS1(|Y1j#bWf<**DYz7Wp0|N%vfDi`P;1C8^7Z(r_!r&Sn!r&Yn!r<%@!oa`?F`fa5 zMM}#5|NsAgQ0fQKpd0|E6MjDc(V(0FqCvR<14M&z2#5yd z5)ci_DIgk@Tfp=ut^yDZ$~7Pwlyg8dDEEM9P!0mopj-r^K{*LTgK`sy2IVLa4a!v@ z8kDm@G$?n0XiyFV(V$!grvDuV+Xu>RAU-I^foM>!1JR(I2cki_4@84 zpxg_hK{*&igK{y52IXWB4a&_R8kD0!G$>btXi&}u(V*N7qCq(vM1yiUnEt%t1BeFY zb})Up3(N=QdJrF!^FcHy_k(Cq2>_x&r2vQql>{IfR2qP2P>BGdL8StS29*pT8dN%f zXiy0OqCuqunEw449R8rv0>lTE7$6!{YJlk@AHnVcl^!5Is00Dgpi%@xgGv$*4Ju7Q zG^j)Y(V$WVM1x8e5Dh9_Ks2a?0nwmR21J8O8W0UCZNT)~D6o4#r4EP>DtSOOsPqBT zYvsW5pi&6L2bDx18dMsAXi$j+qCuq+hz6BRAR1IUfoM<(1)@Qv6o>|uR3I8uT7l_* z_rd0aN-Yo{RC0l6Q0WDx_bmp?gGwlx`8==d5M>KW=8Z~*}8*Fp;b diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Jamaica b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Jamaica index 2a9b7fd52d37a1ffe9fc589daa04d88c6c71a6e0..be6b1b6f1e77a8f13a7400bcfc10c63a7ee1d55d 100644 GIT binary patch delta 25 ecmaFFe3@y2^27%$+>8ti3?R(Fz_9V4A|n7;`vrsm delta 109 zcmcc2^oV(aa;z8w0|N^K1A{;V0|Uck{w@F5dnF4v1(qamuATCM>qA=t_k-2~o|}sv z@E%An;M>{qfPZE42Z5Ps4+J|?KL}NNJP^)w{~!{n^+429^MjZr&jWEy?hg`5nhBB| QZ$C`tW^|gMJTdGq08ncwKL7v# diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Jujuy b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Jujuy index 604b85663672d83658f331a69cc8f41cf2a2b5a1..b275f27c0287415674d2ccc850c3d612f4a45b0f 100644 GIT binary patch delta 50 ycmbQiv59qpvH$}E0|O%zgV+<48Lc;OVSK>I$T(S%QFXEbBgmGnqzRG$ delta 340 zcmdnQI)h_^a=i@$0|Ofa1A|Bd0|UdNN&N=fs)HQ1OP$=XL$2Rp$CUzuUE;L|c5Pj} zVfT-X4tu6uH`sgg$$@DN z2H%VX9KJo9zu||l^MN17FB|;)Qtt5Uve|~;hfNRs*%NH=cTJGPzd5D`|9eav*cW?k z;84k5pgd*k1{HxR3slWNZBYGCwm@Ag{DAtS+Z#0AbvbBmuv(z?;Ie`C%y0$sZ^t%R z?AO}hUe39}{Z73?{r~^}8JU=wm?yh1$xilX;t*tI0YN5aCJ@cc%ECIikjZj_GNaAL W@CS^X3=9kmU_Fx^m=tlUcLV^J8U)lBBpCy@Nw69lc#b UbbO8VjPwk2d<_lt4D}4S00bBg0RR91 delta 1369 zcmX@czENm`cs(Zr0|N*%FfcImL)mH#3=9mXJEay}QvOnKDN#+}-wt<$|0}cv7-ncH zFm~_=Fja6XFc)e}U`bS8z#7Okfz6R~0lUGQ3GBVj3pfSNP2gO+UxDkxh6&sc)-T|> zc~*e;z{CZ7JJ$>FuUw}fFms}SVCMt{p~_+b;mrCX1(C>P1yRos1u;u=0dY+;1qr3# z36h)=3Q|m_6Qs071f)JWZIFJXxJv2BoF_;P_lnWceZBRVYJ+3T_61JPrI_*|=4;9IkJL%rX&s0IEpts4TS*(?aO zN#77uCbuA1#&bhR7{h{)KiV6@Odl->d+K2jA@^S);;5EEFYqVFA6h-rCe z5W8=wLR`uPgZO#v3JJb%HYBz$UXY}FZbNc<>w*;C4I5J3(-)+^owOlc-E%?u*^&*J z?Ai-5*M@D#dd|Bbds=b5LCys&h1{}GgS-tq3i)B?1_k}^6bj8G4T|zFC=`qSHYoAm zq)_r-d_$SVxdmnSer~9c*s!2t-|Y>RKPD}xnzwgD^^KARHFfhh)b0pdP#4#@p?-$N z0!AigMi#7)6(Y*U!484-5Q@em1H3@;Z00|N+y1SV_@U%*rkVu9ikOkX~10HQ&03Z^$N1@l313*v*~7es^N z7(|2O8AOAk8bpJl8$^Sm97Kbn9Ylko9z=tpA4G$a0GR%xUB3au0Hp;m{nP_&At+6N z_@HzFqCsf`M1#@?hz6w*5DiKvAR3fbKr|@5fM`&f0nwmz1EN7`2SkI?4~Pb(ArPIy zTfYJ908nBA34jt5hz2DpFnzWJEDuUtAU-I8foM=71JT*jiop&Br8N*Al-@uzD9wRr zP`U%rptJ{~LFo@fgVG>~F0L2-4K@Ij7(oJ{1PP)+i4siT`w4acC~<=Lpacq{L5UPZ zgAyu;1|?Py4N9;e8kA^3G$`SMXlUYPVPZvvlewAgCmS$JK{4lKFXkj+kOp|Vfux|x HtC^(%l*WUN diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Kentucky/Louisville b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Kentucky/Louisville index 177836e4fd98399bd4cdda410648cc286408b95b..f2136d6ed41bb7dc0646b91bab366efb46bacb78 100644 GIT binary patch delta 68 xcmca2dW&;{xC{dtU}Rum0AY~u1aV#v1;eGA=013B~{b delta 1341 zcmcb`c|~-Bcs)A<0|N*%FfcG|g0f{A7#JAlEz@b3zw2kgf;PT}g|luKEGhoZuvAR2 z;1sW4!>JqY1*bdyHC$5uQgA7e^TXxR>oS*@a2DM9x3%H+f#MH$?oDsFyK+Loy?vDp z_dAOU9?Xkwc$gVd@TktV;jyP#!IL=ohNqem1<%~;Z5W=L%YAsEF30dvoZ-VOb_Rx5 z-yVH<{p=CLn`=ityghb=;obg+1@G5CX!syEq2SLAs}Fxq$UgYDL*~Q(<^LZrO#k>c{TORP&uWbGxFf;9eU}x$Fp-PVj!kO+LL?X2wh*LoSdK(`sjml*7^r3 zrbj-gdQE(wCc5l{x>oT6^?!#8G`T__Xx>{|p!Lf9f%d-k0-eht3H7@3G7I!JnR2R7^971-`>cwpCmp}>B2(gTP5O$ClE^$AY?Qwp3@5))kX%L-gwoD*C>ulV4u z8~?!la@Pk>UdIQXn{z&Ry;ZJ%;610az~`Dnf^SWBf!{Wz1pgS{f`Dl(34u2H1wp0H z5`tv}3qnFqB!v9_To7iuDk1DC|Az>yL2|lpLJDt1L8`lcLh9S7f^>Dkg!HpE1(|F~pA$0I z$`xciyPA+a&FVwW`Hv5B%Va*}t-t&rKlI;+g8r=!3QZq;D9WGypjhD14Bx<94`P7=3rt_``T(Lqfd-~G z=YaWMZyf$6h0VEIh8&j}ztC;~w=C=x+*_B1Q7 zgF%rA;)5a-M1vv~M1vw0M1vw1M1vw2M1vw3L>JeK9s(NxifxbpD8@lFDAvLBy@Ox} zfMOrS2c-ZI4N3(d8k7=1G$=KIXi$m((V$cTqCqJGM1xWX6C)Hdvp^Y)Op~Qq5|L93 PFGw*g#V|}h$RY^RA_d+=_7 z+{QZ%@(cGDD3tLtC^jxEPzwFXpq#b$gNo^8234>5AJjy*GN@}ceo+5+u|bn7`Ge-Y z%?(pH$1TGzffR5JL!Q#{-y%Q zmih!I|0xB|DTxU#`eg;KF3t(ApI3Zv*NuPRe!1&|C$Hm!de6-{AH3cwKk%N@S>SWc zA;GsMyTEUoQi6YsZ$ZE`mV`hX{eqyYFf(0R=ClW$_e=Z0!U6l~_l>bA7+_47{ zM?QXt{I}vk)RM~|qVIJ*h-umSA$DKRgSeFGAL8fvJxK7~Qjpl5osgtEtsptwHz9?$ zq9D~>KOyyPR6)ABV0}XRS(}1Pw$BNfYvl^Eo?T7Io@VtS=lsV9xn(jR^44E|kRST* zLqY%62Zg2&J{09oe^4xX=tGHr<%5!c_Y2A_rX`f!J6KR5QISxwZ*f88kEn#Id94N2 zH*6AW>e35pcgQ8w#d#Lg&tOPkVq{`uVrBtTASMJ))@L@H9LFqR%f?CpoSet(#sf;h zj39!6fpMatBrhmcgD^;F%Es^mO!XiZDDc7b<*pAP8Wag&dUFn#4~h#A9~2)T8WblW z8Wb-e8WcAm8WcYu8Wcw$8Wc|;8WdL`8Wdk38Wd+>`uFGh0uTcfd0_e}KiEQ0B!c*$ zhy>A~$OO@#2nErgNCnZLhy~H0$OX}$2nNxhNCwfMhz8N1$Oh4%2nW%iNC(j=y!91e z2Y_N9BmhbQAUa)LFab=TwE@e65(9`2N)R9#lqf(nC}DtTP~rg5pacS_( zXi(|`(V!FtqCu$)M1xWqh{l!LChIaAQzxydfvkb0H3kMQ*WeISSCKZJp&zI LLqk17Jp(QP2Cbxt diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Knox_IN b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Knox_IN index fcd408d74df43310a9a85c475f83d545f6d75911..b187d5f8c75685af67913e9360b50ecad19fe6ad 100644 GIT binary patch delta 97 zcmew(^n-nZxC{dtU}Rum0AY~u1aUzS1;eon3=C|WmodL#nq0*ZJ6VreWwITogans! aaEO_+ONfrIv7V8hfsU`Cp`M|h0T%#S{0^-E delta 1324 zcmeyt{zqtncs)A<0|N*%FfcI8g0dwV7#JAlEz@b3zw2kgf;PT}g|luKobLG7a7p<~ z!KFmb4_8C4GF($Q`{BCjc7_`a>p$ESoylpf(P@W8y;qc6g;Z4ZFuZyR`4WFzTs)O&4*|1^)?L8&E-D4P?uwP@k#8%D|QBk zR~LVLc>U}V!<%bIKD<44gyG%(hXwD~KWO+c|8T*_{zDC4;@b;;{YYo{{lfFZpBtVG ze@|$C__srw;r|NW4-7MS85rB&e_$$q&%j*BQ^1nQ-M|{~u7J(qZ3DZ(g#z|o^#)FX zO$D557c+2um{P!9|6p@Vcn_2|@a>%Rfq&&B27#F+9|Su~7=$XrJ_u)qF^EK3 zd=T}tU=XvE`XH_;#UP<%ULeWwhe3)-vOwySM1%Ch-vu%ke>KP+yjvi*@lJ#M!uROE-)c;*<(Bw+~Q17B&R^aLqSm643 zJA=D!?g#hFGZ{R2{Xckau4eFhYxu!?&h!SKYkmd3HI)s1+YAc)W1<@ZrU?}U+SoP( zm3}D*mXU7=3B6Vj@`te@%ydUV*i$)%2)QdCB91aJME=|MA!^AZhUj}UKE$*fVTj#V z^&u{08AJTMm=6iQhZ+*wE9(oAbeA+Fr$-m0@U}Iiy4x0{zRhSzSC=nHKkL)GRi>}j41Ip_a>$Su=m$XoyLLw*=9LqY%H4~3@h8H)0kekc~b$WY?n{-NaG z+lDfWB?V>o&Noy@v=vnB+t^U~Bcq^d-sFbr8(sx9b)^lpJ9G-_;=&v1XK?ZrFflSQ zGBLAEE?}0QoXc!JxrA9~as#vA=MG@92~;n93H~p91z0b z8XN*jvJ8x1l7Vrep`;)v9fL4P2%MHTM!#XI2k}553#Kp61X17+1~EXP45C3H4WdDz z4WdCI4x)W)DnWUH0Tl8eJ}C4-G$;l@G$hfM`&X0MW(uq8C9lIBkF!p!5NvL1_d`-#ZU>04S}1_@MLxqCsf} zM1#@|hz6w{5DiK{AR3g0Kr|>Ff#~`f@T3GzQJ_=>!jo&6h0xQLHu33-Ve)-uNdPAl B#CZS! diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Kralendijk b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Kralendijk index f7ab6efcc0f5bfd5c4172cbe32c03a8e08b0099c..d6ddf7d8f6bf58d3f61e4adcb760e11fcd866db8 100644 GIT binary patch delta 27 gcmdnRIGu5V^27ob9!3TR1`uXoU|^V_GqK4608a7+ApigX delta 28 kcmbQvxQlUuGA|PY0|PSy0|Vb=IX&fx*=iG%Cx$r!08khPCIA2c diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/La_Paz b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/La_Paz index a10137243577a8b312dc463571c4c94ecd3bf1f1..68ddaae768e665a8170ea1485aae51c686f5cfed 100644 GIT binary patch delta 38 rcmaFCxQcOt^27!f9!3TR1`uXoU|^V_%*Z^kM}divX`;R6#0MMzm`exN delta 60 zcmZ3*_=0hQvJ49Y0|N*PG%zqQ?2w!GWXHR!SL*-&|If(8Jh4)9f-)n^#Bc>}1_lNO HxTqljIDiw_ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Lima b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Lima index 3c6529b7567f032882863fcd48b790e0988261bf..b643c5517f923f075d58897764ba6885197f5758 100644 GIT binary patch delta 52 vcmbQnJez5P^27ryJd6ws3?R(Fz`!s;nNeWk$qs%-W+r4fu|aimA0r0<^9Trr delta 138 zcmbQuG>v(Ja;zW&0|N^K0|QS30|P@(iNlq{=e+`sxIT6`s_%8-n7rFVeW)z$l O-XX!jz`%fAi7o&Y?kooY diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Los_Angeles b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Los_Angeles index 9dad4f4c75b373635ccbe634798f8d9e587e36c1..aaf07787ad92b65eadae63b64bba290f9f961507 100644 GIT binary patch delta 76 zcmbOt*2gtLT!sM+FfuSOfG|jSf;caTg5lcDdMqE9*_jxb7@3$^CMzZGu3R(W-oEw;_dEM0JeZd`;bCUMghzGW z6CQg8O?VQgJK?FO$%JR_UINdB0tH^E>j=E~WGwKCy`E3t)g@7Z*Uvr(yxI6&;O((X z0`Df?6nMY>-GmQ?y9GY>UzqTz{@{eq`I{zuiC;Y7tN)Y<-|Sl_eAh3V@Izyfz)${& z3BNd61b+Q!R`~rQP2kUsRE57MJOuvja98-hLQ8;QhNc2z2af<#1-Alop~eK3MD+!% zfm{>V961-T8@!poUf=7yfK%Yy1kSbl6}UcZn85vD{Q{nwX9aiXXR==||!d zWG;y}U51ION}1;MlTqf|LKg1yyg34%o2M&y zz4a6Dp0jy@&$X-xzBN-9_-*r<;2%@IAYhu_gg~3f1wmy36M|)|7led$O)-$TNb3NTTe(oo3aHgtB|D7gR_rnozOt z?1IW4EfcEdtzS@mBW*%W-NXg8J3J=T#T758=bE84fr*ick%^gQasW%o zxIo!~5ll=F=LO{t5C-vgZ4CdwTn}P_0t-xE-l_niL4gLQH%|xiL4gP2g8~plg8~sm zg8~vng8~yog8~#pg8~&qg8~*rg8~;sg8~>tg8~^$|BNT4T>ZXox)qc z2%k`7BMN+5-hq{0;t9AXjR5~Aa4tY@TW OpyO+3sAs5Wzy$#GvDJ?N diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Louisville b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Louisville index 177836e4fd98399bd4cdda410648cc286408b95b..f2136d6ed41bb7dc0646b91bab366efb46bacb78 100644 GIT binary patch delta 68 xcmca2dW&;{xC{dtU}Rum0AY~u1aV#v1;eGA=013B~{b delta 1341 zcmcb`c|~-Bcs)A<0|N*%FfcG|g0f{A7#JAlEz@b3zw2kgf;PT}g|luKEGhoZuvAR2 z;1sW4!>JqY1*bdyHC$5uQgA7e^TXxR>oS*@a2DM9x3%H+f#MH$?oDsFyK+Loy?vDp z_dAOU9?Xkwc$gVd@TktV;jyP#!IL=ohNqem1<%~;Z5W=L%YAsEF30dvoZ-VOb_Rx5 z-yVH<{p=CLn`=ityghb=;obg+1@G5CX!syEq2SLAs}Fxq$UgYDL*~Q(<^LZrO#k>c{TORP&uWbGxFf;9eU}x$Fp-PVj!kO+LL?X2wh*LoSdK(`sjml*7^r3 zrbj-gdQE(wCc5l{x>oT6^?!#8G`T__Xx>{|p!Lf9f%d-k0-eht3H7@3G7I!JnR2R7^971-`>cwpCmp}>B2(gTP5O$ClE^$AY?Qwp3@5))kX%L-gwoD*C>ulV4u z8~?!la@Pk>UdIQXn{z&Ry;ZJ%;610az~`Dnf^SWBf!{Wz1pgS{f`Dl(34u2H1wp0H z5`tv}3qnFqB!v9_To7iuDk1DC|Az>yL2|lpLJDt1L8`lcLh9S7f^>Dkg!HpE1(|F~pA$0I z$`xciyPA+a&FVwW`Hv5B%Va*}t-t&rKlI;+g8r=!3QZq;D9WGypjhD14Bx<94`P7=3rt_``T(Lqfd-~G z=YaWMZyf$6h0VEIh8&j}ztC;~w=C=x+*_B1Q7 zgF%rA;)5a-M1vv~M1vw0M1vw1M1vw2M1vw3L>JeK9s(NxifxbpD8@lFDAvLBy@Ox} zfMOrS2c-ZI4N3(d8k7=1G$=KIXi$m((V$cTqCqJGM1xWX6C)Hdvp^Y)Op~Qq5|L93 PFGw*g#V|}h$RY^79K_h1_lsjU|?XFpvDaqrRT(uq_&p!&`0KD>=SLHRUH3{9Zdt4|xb^y%!5ztm z8}96kRJi+F)ZpIidkXjO&N6rqVyy6G`u`1IS>qJG9Y`_w&L_9vN1%?ukK;!besNve z@N3171;5|08T{$4T_Ah1&p@u?`U3d{rW+KD&o5AH%rsEqKCwVK!bo6)@}mL;Rr609 zRIeOYFleYWFqHLOVE*mc28$i73YPaD8(4nwQm{Vpe}hdv--7!8|Nl?k$S6Pg03+Ar Y^NjKnlo_=)h6gZmFfcGMph>C&03y0*_W%F@ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Managua b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Managua index e0242bff6e5df45de8b235abb4a8405fbb8ba6a6..86ef76bf2241b6abde0f4790d23b180db4b4b1cc 100644 GIT binary patch delta 39 tcmZ3-yqsx*^27@)Jd6ws3?R(Fz`!s;oso6oolO%Lh_G=v2Zxw(0RXV92;2Yw delta 128 zcmZ3^w2pa#va0|C0|Ofa1A|Bd0|UceU5^)R&Ls()OY8y!1AjaaypkUvYrRrM}A_`^T!`0KY}=SL@pUH6&{ZdvScxb=p^;g00{ z19x_&8{GY^>~L@P8-x3IS2#QfaWwccgZIE!)*ORx2Z|iN^XY8(5oqP`-suWisdz;)O`H|>%^{r~^} kCnqwBPA*_%n_R%iGP#sdeu6Ti!oqMy4h9AW1}yUG0Gc{hT>t<8 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Marigot b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Marigot index 697cf5bcf7f151ffc1c1fc4247e4e9c7e3ff01a3..f4fe59034242c4416bc84f06f38530d625149329 100644 GIT binary patch delta 27 gcmbQj*u*$Nd13+!4fq{vEfq`SPx$zpt|NoDLFfjc8fBXOgi;r&zgJW5!SeU14_04U8mzY+`e3vEPlN65z7KZ&_ZsYH7kqHYKhWUV z(p%uB&bi)ex8jZ_A&$KMOQ=S*+#x#m~k zTT|KKx6PoyKPI{%V46@tpp9)qQ0bR~U>W&_kkD%dA%7Sf!c2D*ggupGh>*MTA>t?l zL*&10AEK5#Vu-#s<3mi#5r)`(RUhI~mNCT7i}{e?d#E9?y|N%lcS%EXdUQbwZ(BpE zyKO=0+l+>Eb@_tyvtA9E?2HAOYjqm3o;@zep61DrbN>H_+%j#3y!8)1kcZ78!?Qc!m9d_#pqTS3LXjSZDQG775ZO>U^Z;Z;ym zSK3g!L#LoFF1(?B244Xq6HVa%|BDJlXi&le(V)Zy zqCp7^M1v9;hz2DzF#V$$M1d0=hyhA;AR3hLKr|@vfoMG2%G58{Io zJ%|P+d@#LM2P_ZD03bdn6M$$?MgY;E%mAW683IIuG6jeRWegAv${ZjXltDl=D3gF_ zP(}gM|K5Vl2W1!#ACzf8G$`YM>3ti)@}LX^;)5~~hz4aO5Dm&qAR3gRKr|>*f#?Ct dSX|D*A!g1lAv(UsdPaH%I=+U6dWL!iTmb3SV>JK( diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Mazatlan b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Mazatlan index e4a785743d75f939c3e4798ebe7c79d38e4cfd08..4c819fab0247e15f1ff9b6c76108c7290e536699 100644 GIT binary patch delta 51 zcmeyy{hn!p^5g&}79K_h1_lsjU|?XFpv)@9z`(#dIhJY54c!16AZzQ z;uAuARxyMs{G1S`)58$XaC<_8=!%Aj2YV+(e(h?AIxv4i^wpe(n3a13Vz>G=#C6US zh@WcEkdWCRkXYx-kmQ*pkQ}GakfP}#kZLE$kS3HcAzk(}L;5GD2^oK{GGty-nUHmN zJ45y+wh1}ME;r;(d@&(!+17^q!c!9p+NL)YMm-lON~>%rwmK{qWq1%DJn#jSjS%J()5Rl5QOs?W!i4N8z88k8tO zG$>($Xi(w=(VzqhqCtriM1vA4hz2EA5DiMOAR3ftK{P1gg6SUrfM`&r0MVd~0ir>f14M%|2#5w{5)ci_C?Fb? zSwJ)>!+>Z|rUB8Qj02)UnFmCJG7y;lk^{lYoceUXQ1P2XrO1RXTSvj D%8ZYB diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Mendoza b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Mendoza index f9e677f171b3900dfd978eb8ea2aa226557d2c5b..691c56978a033586e3302db2ef600e4b0ffd6366 100644 GIT binary patch delta 54 zcmdnOafEe(^5hMSEIf=13=AO5z`(#TL7CBZ^FGE8jEszv4>HS7c3|Y1{D4__auTD( IWE~a`08%Rqy8r+H delta 317 zcmX@Yx`ktca=je`0|Ofa1A|Bd0|UdNN&N=fs)HQ1OP$=XL$2Rp$CUzuUE;L|c5Pj} zVfT-X4tu6uH`sgg$$@DN z2H%VX9KJo9zu||l^MN17FB|;)Qtt5Uve|~;hfNRs*%NH=cTJGPzd5D`|9eav*cW?k z;84k5pgd*k1{HxR3slWNZBYGCwm@Cd#6kV+;SCzU(hq2E@YtaB;Gu)|%y0$sZ^t%R z?AO}hut9i(W0>6m_j1k+?sw`H>RJB(|Iau%fJt$3JQK&{LMGwK%}kaPlo{ NWME)msK=th5dh_UmdXGC diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Menominee b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Menominee index 314613866de53e1457f6cbf2fb617be7e4955edf..28d2c56e1a991556b5aca45108e3415f3ebfe868 100644 GIT binary patch delta 97 zcmaDPIF)^ZxC{dtU}Rum0AY~u1aUzS1;arM3=C|W^O>hGO@7TDG`WgHWwIi(gans! aaEO_+ONfrIv7V8hfsU`Cp`M|h0T%!#VGbw& delta 1244 zcmbQr{z!0wcs)A<0|N*%FfcImL)j7y3=9nOmgzLi-}SR#K^tGg!dbTqPIvrkxTO50 z;8G&zhs&j(8Ll|I{_vCEtKk<%`iFlzv>DhO?ia8dTqt1gRd3)F*i^u|b}<9jhbaZz z4<}6AyGJmX1idOSRkva=GdfdX&Mw1XA^qZm#j}45mcLJZ zusZgD!TR=^4>s%nG}!L$`(W39ufcwH!3T%@0}YNXy#-GGiyE9$@(Wz_TN+$l0t;L} zZ)b4V&Hdnhc_xD=um1hfqzVNL%=klf|f1;H}%4I!b|3PS!cHiVh(CH;~r7UBJpBM8X!S_%@VtZvllJ1g*FV+Y>1VwfGT9jm zGS})fWIcOakUh;alp*K*{|~uk+6;N?AAZOW<7Fu5Km4K4^gTmS{?ZS{q8AxT{M$d2 z{CnF_X0fE8?B4l?3W>IYihUa!Dt}}YRLz^*P<_Lzpr)?0p>~H(L0w#UL;VcCg30fh zf+q7b8%^eC=AP`xtfKY*|LO${96r7w49+eg49>wJ49?*p49)=|46eZ;prpsZ2qqaA zCmKo$g3==hgM`3oa%1!qrg{($6r5oC@=Oo~4ptBY6to~36uclB6vQAJ6wDwR6x1LZ z6xtvf6yhKn6zU)v6!IV%6#5_<6ayd{6boSb4`V$jQ!s#{10(>75)ciF7BGDjL_(qm z!~#VThz3Oyhz3O!hz3O$hz3O&hz3O)hz3O+hz3O;hz3O=hz3O?h)&_HZv#636rUgg zP@IBjP`rZavtD3%Q2c`Upg0E6pm+w++0#5h6gav;3{aGVXi&6+Xi(IHXi)TnXiyRW z(V%1iqKmUdFM?=rdH^v%X#zxp(gm2lcOL8jQ2GGzL1_d;gVG6z2Bj4c4N5N{8kA;0 ZG$`GGXi(Y#(b&?DHu33)VR8+#Bmh2%m?QuI diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Merida b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Merida index ea852da33a81478433a389e2b4da03b425d9f764..d3b0ca12c95f35897fb64cd7098b6320a3c5db34 100644 GIT binary patch delta 60 vcmeC5`MgVk4-2J3ByKG>}P(_p*1?}J_cy$1W)1s@#p4>UNo z^cFbzFKTd3$uDrxZ)tFK2`q5qPit^jF)ncb(ahk+XsV*&BZ}(#Xi(w;(Vzqd zqCtraM1v9`2%rfoM>s0@0w11)@Qj q3q*r57>EXCG7vpzG8&h2aEO_+ONfrIiJqaJfsU`Cfu5kekLhiWJ#UPW=t83ER0OdER!#=NKU@b!p6zQ4uVW< k?32Y={iL`Yy@Nw69lc#bbbO8VjPwk2d<_lt4D}4S0EdbWg#Z8m literal 1423 zcmWHE%1kq2zyRzF3=AL)k_dpZ3Y?q3xpuz-*M|)gxF4)vz;pAg z0Plf`3;1@f7vNvHPC;PiL;=Ch2?|1$#R9^aMG7L3p#q|wAqrxa<^tlHW(pEY!4o7o zB^0EXOechyK3Wj=)WaY`?!Q9BQ7wbWe-9O+mhu=x-#e@j2ABkl4O>L6Yvd4aw=P3sQJDY)ExaUy%BC(uQ<(&jsmcOEzS(YcI%L8@3_q zIq!n(X~hOP7qk>|%R&wEHt;CqhnX7`^uJRmG?O$a%DKep+aKAf{J~&H&p(Zw4iF<-VN0^N*2`A&EHVFBWyukT;qoN85Ro|nV1<_@IqEL z5M%@qL|_JnYibM(|Nr+lFtGgpKX(En2bkmmlLG($Hx@96fMgjZeSAY00)j&r0>VQW z0s=x90$f5E9KC}%47#Khpq%aW5mizzz|9|^Ke=maQ+I9me z5DiKpAR3fPz;vRT0Eh;s77zoJVnC+M&{P0Xpp*lmL8%8sgHjNP2Bjhp4N6HM8kCwq zG$=)Z>0ajrAR3gi!1UVvVDmsJ48#YeG7t?)X&@Su+CVfY#ery0ssquWln0_gsSiYh zQXq&1r9u!5N{JvElo~-aC`E#3P^tvcpp*%sL8%i&gHkAn2BlIk{nWz%M1xW*m_Din z=7Ul#h!0A+AR3f>$VlB8b4StktrNN*N5CwLs1VWic*L-m`S{ Xb_vn(HP$oIGtluhG}JTHGvERMOqp$z diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Mexico_City b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Mexico_City index e7fb6f2953d123efbc2550f450decd794b017d4f..ffcf8bee10e5aa57dff8bb5764de94d73eab348d 100644 GIT binary patch delta 63 zcmdnMGlzMC^5g_279K_h1_lsjU|?XFpv)*eIfvUs}}$y Cya(t2 literal 1584 zcmWHE%1kq2zzdQX7#LU?7#KvBZhKL%{!`wAZE0Z%+np~Z?BFp=*zvdR!_j*i5{^wb z2{;-0@xjSgcLUBd9eZ$odsx7&nW7JFmo;B7OfO?FD&{CKc8_2%33^pvs&2(#W^|^& zoLz>&Li)uAi)a5BEPtQ+VD*)y!Ft=F4>s%nG}!L$`(W39ufcwH!3T%@0}YNXy#-GG ziyE9$@(Wz_TN+$l0t?*u(;D1Wj0@aNM-PP{Jp??hdYDMS>X@9Gc+0e z)_ncoU%|}~&~yDmV4`|MP|nT|!H%2_AwIJ|getsl2-B(k5YBM6AwqOkLBxag4Uu1K z3Zf27Y>2)ZR}iyu9YgF^hl04y2@LU5l?oCvix?8?>^>xUhAlfoM>g0@0v!1)@P|3rzoQ`v9Ur zX$(Yz(iw;br8O}9>TUpt2BkSLy*&)f2ct%7J!dIiy-Gz+3Z=@vwT(k_SwrC$&YO2Z%; zl#W3(C@q6%P{i7K~fzvsN0ZQv28kF8aG$_r3Xi&Nb z(Y`Y@K@>RsgBYMZ0HQ(p07QfG0*D6X2M`U)6CfItFF-UXZ-8h}{s7USJOZLY`2&Xiz=^(V)BpqCxoyM1%4ahz8{=5Dm&( zAR3gvKr|?ifoM=Z1Jj>O!1jak8;B3eb08X&??5yt?}2Dg{sYmVJP4ve`4B{d@*;=^ z)Xiz=|(V)Bxq6ce!=5h`WF>`ha(eX9WGt@KC@ijEiGu1QT0syd-;=}*| diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Miquelon b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Miquelon index b924b7100438cfacf25c56c494fd1abf3f262100..3b62585d0a13c9b35824ff7ecc91e29428c360e1 100644 GIT binary patch delta 41 ucmZqTUB)s&d2$023pXPJ0|N*%FfdF`U{Yb!-rUNRz&QB=qxNJwHWvV@DhQnb literal 1666 zcmWHE%1kq2zzZ@N7#LU>7#IX5ZnIb+oR@q+q4dcG#l~_6rO;y+l(QxuP%&L`LDj4D zfSPF61$C|P1M2^l2WWCx9?-nk8KCt_`hfPn>;Rq177n`ed;|10OF8J*=?550`r}}j z?tQ_i=$?bIyY2;(paTx3>iieXj21bVvwgf^A-(T_#k0#7EPpRJV0CQk1?$^Q2W-|~ z3b5Usa=@;COMv}sw*wCO(*hh@k{z7fs@-m)L?o|7Bkb4|s;x5hufZyTF~e~e*3z|E?IAk4JSA?(TL3lVaw4n!QedLi;(&w;2V+b=}l%R3O$GV?<0zJLR9Db*L^=NTPH z@SPEm*zWI;q+1n`oNnll!W$Ei>Mrb%`qnNWUG1ww`dNj5Ot$L|nQNH>vYzd9$et#5 zA?N(n1G!}k7xLC`Kad~#=t4pN%mam{M=liQS05-AU3Q_wKlVV$zrz7#7F7;q_m&1! zNW?f)>}wCG{9)%%H7_%u`i6o-O`Uf@?G7e~x;Wi{`sq&`>i_@$&&b3~7s&Mg|LF(@ zhX4PMA7Ehl|NrU*29E##A3tE^@$n5|a10J%&^0h-&^0h(ASHqQ|Ns9#D3O7ZBPgMP zXi#DU(VzqeqCtrcM1v9@hz2D-5DiLzAR3eiK{O~Kg6V(D13)w=L4xUfonSsFVS@Oe z#0jE72^2(w5-ErVB~%a%N~|Cnlwd(LDA9swP{IY#pu`KJK?xW{gAy@_1|?(=4NA-) z8kC^H^s~zsKr|>}gJ@9V2GO7d4x&Mc97KZ>I*0}(b`T9p@E{tL=s`3n;e%*U;s?>7 z3;?1*nE*tCG6I_K^X+Z2W1iv4az7W8kAW;G$_M> zXi%mB(V&b2qCuGlM1wLAhz4aM5Dm&mVEXrUaCn0<6o?PXR3I9ZvB30^t6=*<84Sb+ zWik*A%4i@Ol-WQuD8qqhP^JUXpo|BiL75LkgEAn924zAJ4a$fh8k8A9G$=!Y>9=-Z z_kc1ch!4t~AR3fG!Sq@tuskTEg7~1!3Zg+77DR(GEry Y6GxX29baQTBRvBhUqeGZLp=j706kU?e*gdg delta 1444 zcmcc0eMw@1cs&~f0|N*%FfcHjhq5Ia7#J8DK5h$`x1%*-{;sw-b9wl5-{!(x$;q8UXrPm%@ai~9k;cDoP2iFufUbt>L>%k3% z$ro;l);zfRp!CA6e=`$q9|*s2=U#Qf-IXN)_x8mm-0utvcredC;bEplz@s|FgvXvz z0Z-zX6P{}P33%o%|KPch#Dy2?j1OLlJ-P6T?eT+G-;P~){p{$2H`i8NczbO5gLnIn z2E1Q?B;mvS0QZCP1fH8yF7O_ROyJvDc7cCo=>vh85f=nI!ynWORa#vT z&a`|W5-D>*)KmI_n8m*f;u?P+NGM4MNOIhNAjSAMKq^)&{Q-sKpk+x{^sx{zb+F8{|QXj6`)p~NN;#!@$Bdy%iojUSRGsb$NF~38=Lh3x1txk=Ts;7Tr&#r zt*MVq@Y^O5;2&e35HR&yK%k9cLQv_AfM6Nsgpkl(0U^JiCWM*J2?%@2_#i@V$AyR^ zj~_(-n{^>-$B(}!}B~DEW6Wq0FKqpzPk}gbInQfQo%n6DoiB1XRr{PpH13 z7f@3dnNYh!AfPVJI-!30rvS#uf~=yGSy^i)v9eB9V6~Xs$ZEp_%3}kZ4-XH-`n1g6gxP$23|&wicb(96sI5>6t5r}6t^H66u%%E6vrSM6we^K zI7f5~*Z@$3g9Jd44x&L352o*J20H+h06=_DA^_2#gaD#Ji2+1|5(J0_B?=G?N*Ev- PlsG^%Q3+)7URDVJ``R~p diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Monterrey b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Monterrey index a8928c8dc94aaebfaf9cdeb93011d41b482a4cc6..dea9e3f5864fd19796de89bb456eaa54ee90cc38 100644 GIT binary patch delta 56 scmaFIwUlXsvH$}E0|O%zgV+<483iUQGIa5!SeU14_04U8mzY+`e3vEPlN65z7KZ&_ZsYH7kqHYKhWUV z(p%uB&bi)ex8jZ_A&$KMOQcepe7oE84y zJ42JfZ_U>a{uSH|0X^401SYCC1m*1f5bVg=5aKiYL#V>*hA^Gl58(`F8zMw!6+}E( z-w^q=rXcFT#D?graRo6e*D=Iybts7IoWKx2RjD8$vxp(F&hA5!X9z=boWh3`O*4j6 zJEjk5LO~7bvQIvwe==#v_4q=7+Lh^$ZpK-XAJ%B{EdL*Zokn%bB72JpYH9 z#qkZb>pp&{Yj$j?@4Nhgk%=bo|Nn(w7#RNlU%h~V<^TVk8yGo!d_x$VgF_gcT|yX0 ziTwZn|NjRi08ml^B?1r)N(dktlo&uXC_#W|P@(|Qpo9UUL5TxIgAxdc1|<>@4N53r z`q@7a1x_#^1}M>hXi&ld(V)ZwqCp7=M1v9$hz2Dj5DiL9AR3gQKr|>(foM>|0@0wv z1)@O-3`Bzx8HffYG%)?68AO2-9Ebr*bRZg(@IW*u@quVi0tC^%Gc-XII3a=gAyf(1|>`o4N9CK8k9gmG$@gRXi!20(V)Z%qCp83Og~uP0HQ$&7es>+FNg*u zU=R&T#2^}!kU=ykF@tDOf(Fr`L=B=r2^&O%5;uqjC2$Z8O5`9Kl+ZymD6xZRP=W{3 zpG?5^gAzW74@&$X8k7M*G$<2*Xi!D~(V)x#qCpt~M1wK~hz4a05Dm&4AR3fGKr|?m zfM`%g0nwn$0-`|~22B5|2T|aR17d(O4~Pb3AP^18L?9ZJkw7#kGl6JOh62%`Oa-C` fEMsvw2ZxwByM*ZYn&=to8R+;L8t9qo8E^pr!?9+Z diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Montevideo b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Montevideo index 2f357bcf50da794541a518510777bd5c470b9b77..4b2fb3e560f6ad26b30b2215d26b3d6176d076b2 100644 GIT binary patch delta 53 zcmaFHeUg2G^5g_27H&oc1_lsjU|^W+z@)+&#=yY9xjB<*3)AEd#<0ov8O{5tQN3Olit97|JDqSWAimQqx=jwZx<`@ zN(mY8*0(Rgbf!hP&^!Bprl@*puF(O1{HxR3sk+* zH>f_hQBYUpH&DM2u|ShcdxK{B2CD^H4=x*MPmo#Q==06M$xZ)&v&Z5KF2ZvTxXOD6 zxPGoX;LeeL!ToZ=0go4+7d$sR9q>A#eZhN9yo1jQ-V44pjt+k9?=SerC_4lc@&p9h zusQ?JDn OOdJdh3=G)S=>Y&%47z6k diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Montreal b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Montreal index 6752c5b05285678b86aea170f0921fc5f5e57738..fe6be8ea8c97db1c1d99c4198f4b9b024e3aba4c 100644 GIT binary patch delta 72 zcmZ1`y_I)@xC{dtU}Rum0AY~u1aV#v1;cALOR{FLPF~2PH~AlP-Q=AtMw9z^B>)?E B3oifw delta 1537 zcmdnWyG(k5cs(lv0|N*%FfcH@gtA2%7#JAl?U-CJf7k1T1?_q#7S7t}uxJX~hsB{Q z9hS7kepsqek+3Yy{=;$}zXvPa6hEwZWAI>=%*ldPSA7#!|5;tIW~+X}+B>}k>!u1O ztlyJgu%S-(!Nxg(1)I{n5;oTu7i@9YN!S`ATCh#Mo-bj$_4k4uY#$PKstSMD`Rr1{ zZkDefcAtOuV9%55ANH=l@L=DOogeo1Z+dWG$?OjY^QSyG)KdH5uz%TuBPsD8j_OA| zIObbZaGc-j!3o{Cg3}!z3N9&sDY%sI`@!YXCm*gj+fwW6Ta(575vaBfAEvvrl9^8N92QF zKO#Q-eqsIK&kd^&e^1Ch__ssm!~f;~A23Y+_kpqf;RB}f2OpRV{w1&^{4HP&c#y#6 zaKC`v;7|gG!odPgfh7rC42ui6KC~rpKWHuBxw+^8?}79JzMU-(_*XW65SW?vK(I6Q zgHWZ%1K~{f4%0pLCQBq3rl)@}D*BaR?C$x&B%UN7KRfAx zL;j`$$Cmm8C;ur0&MAorF8XB!t}f0AuAf(YaMz80;C{L5gD0=!1JBJlAH3cwKk%N@ zS>SWcA;GsMyTEUoQi6YsZ$ZE`mV`hX{eqyaeGJ*vmp(heTet#|qGhLMs_LToa zgxs+Q5l23Li2S$WLDZ7VAENJdJ&0-9`XP2-&V#s==^x_f`8`PR-BOU)o}G}SJFOr& z-8UhHx1u1`T|Xi9ZB#+Jx?n>3S(}1Pw$BNfYvl^Eo?T7Io@VtS=lsV9xn(jR^44E| zkRST*LqY%62M&d%4?Yy-Pk&G>dgw!mf8~RcfA02J~dJ}C4- zG$;l@G$X;G$>|3G$?jJG$@8ZbP8{M1=s`MJb2|MJtE~MJ2h;Zsf*k;gdJrEJ{U92Y1VA(>8GvX|QUKAQfq{vEfq`SPx$zpt|NoDLFfjc8fBXOgi;r&zgJWeo1hGa{W{W1_ovZ1_qwV=1yH-{VNK-*+(aQ*N-arp;7+eC%;X>FOJ9uzkWn~ z`2E8A!JiveAO4<@eeiFG%!mKW|36@u{_g{0`@;uJ2&Eb9l zyTPFZ4uyjSoB~S{xEK}}aD8Y?;C|3rz;koa1KtDa1$;YO9`LWMZ~h=KGwp$3XX*!` zN{^^Mgsyodi>L z?GI)~`x4CAc|TZ4-+Ey2?EMGJ-+LZd9lQ9!`u4mBHtXLN*zRt4VAp@4zB6I?&9_~5P^|G@on*9T8t#|NI9b3S;zRen(KJ*Tt4 z=bA%;Z%uZA-!`QL{}|tbfN3lVfj0UDL8Z?Uf@K5?LPAd@g#7+o5N5h6A?zvthX}c2 z4v|B=vh_pkzMKbfDbqj1&+~hb;Jc+Du{}E>Nq1U7a=LFq z3U5V0s=Izd>f5M-balam^s_bvnQWgE6EfGz6=XfTnvgxs>O;=?j}LOoWIp7rzx*IS z^xubq{;dxRO&@$H%AfwASoF|`6938vCI9XhlvzwmD7$yCphBV|p<>_Sg32FJ303o2 z3#xC}B-GTU7u4>MOQ?(UEU2HskT6-1Ic%~%v;E|9X1NKJgF*^KgF*{LgF*~MgF+2NgF+5OgF+8PgF+BQ zgF+EZ|NdNG0AhfG6HGtl2U`dVRuCT)v>+N3ydWAB#2^|J%pe*R)F2uZ+#nhh>wHx^dK4({2&?>1t1y}4Iny&x4r`G08o5@1VC{DqCxQjrq9}d(XzZn27Hm@!K diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/New_York b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/New_York index 2f75480e069b60b6c58a9137c7eebd4796f74226..2b6c2eea14df07392729ae9f5712a44ec4f02bae 100644 GIT binary patch delta 93 zcmca0eSvp^xC{dtU}Rum0AY~u1aV#v1;gt%Yp^!3P8MV_oXpEoH@Sw_NP^2XIKdqH}Fcs(lv0|N*%FfcH@fwDy!7#JAlEt4ylzw33vf;NVNg|p5kEJ}S;u(ceu;&V&`lYd);_xAeg(;l2;6?zKNy{kh=7nthoM)?Ni2{H5Sh!tV!{OP_qW;&AuD)zD)f zt|{z)aNTsphZ_tFAKa`L?fP)@LGy!K|CSfrK9Kt0&b`ipyDOU#?(NGixZjzQ@L-;A z!NW|qghzGy1&=*75}w2f7Ca5td+^L%_rr5@fd?wSed5q6fSO(hK-@ zwmjfp+5ACZX4(V6&eRV=l^zd-Gu=OkL~7MP5cSmjAZE$)KwOjigM^Z1f+WY=4^m9r z2~wZ93Zx&tO^~_xra<=K`2@L*=L+N(ZcI=pWB8!hI5|Nn^w9_9to096Opkm}^_uuV zO?24@b*i-TGXmW)<(7d;_Ke?U7jP@m%v-5tikiPZ6;@SHTmcRErusU|}gZ1rs4{X-I zE3n<&@W8JBLV^A4qz4Z9n+hCT>Jyy&rxZA+Bqq4%mle3WI48J%Uh%C7---uOOD=zizSs32re*7g*nK$<;!>u6h@a>8 zAi;M_L1KG$LXz&Zg5-4HgcRP2f>d|?gw(fD1?lR73F&8T3NqO~CuFXbE693wH6eSN z)rXw(A0OnF$$aq1TYvdMe(1js1^rte6q-KxP?SIYL9yte4<-JU4@&;sFDSE^mQZ%@ zU_pgMMMA~C#RZi=q7tg+wH8$0ut}(?OE0M1A(v1W=UGrcgCSw^Lss?4A6U62bFkG- zR$#N8+{R|a1jQ`eg&LUNoCD^ALJ!0T zg&>Fqg(8Rsg(Qdug(ipwg(!#)n8uO-qCo)*qCtTRqCo)+qCtTSrhk8~F90z>p$(>= z@`Eh|g*u223V9F>3Vjd_iUAM}iUkl2iU|-6iVYAAiV+YEiWLwIiWv|MiX9LQiXjjU ziX{-8!dqVfb^s{4KmwpB1JR&p1Jh@1!1AEz1Mxvo2%3!*_W45C4?45Ev(MGt{}42o`$04T~qG$`7^^u2>%2Y{j<#0Mn-5DiKO zAR3euKr|>hfM`&X0MVdi0ir=k14QFW9!eldNb=xv4GuANbqUe&HP$oIGtluhG}JTH HGvERM`Y)4H diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Nipigon b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Nipigon index f6a856e693420d6d989c45acff2c48b60db69186..b9f67a9f9495e155418baa8bacbebe278aca70f9 100644 GIT binary patch delta 89 zcmX>laF}g^xC{dtU}Rum0AY~u1aV#v1;bvO^_e4>Cg-zzO+L?LB*Enx9AfI~5~Aa4 StY@TWpyO+3sAs5Wzy$!#E)2T> delta 1162 zcmX@ic1mD^cs(lv0|N*%FfcH*L)jt?3=9nOc1$jqzw33vi65Q;r#n6rTvGm0a4F&U z0}h3Q1)Ks)61W%^7jS)OOW=OcTEKI2(F5KC=>>c{TORPQZ2llHGwp$3XX*!`N{*LoSdK(`sjml*7^r3rbj-gdQE(wCc5l{x>oT6^?!#8G`T__Xx>{| zp!Lf9f%d-k0-eht3A*z#3-mUdCFs|A7Z^;INH9!K|6o+~E5X>^^Mgsyodi>L?GI)~ z`x4CAc|TaxOW%56@$CHv%int*SRK3g!TR>R2R7^971-`>cwpCmp}>B2(gTP5O$ClE z^$AY?Qwp3@5))kX%L-gwoD*C>ulV4u8~?!la@Pk>UdIQXn{z&Ry;XkTJ*Tt4=bA%; zZ%uZA-!`QL{}|tbfN3lVfj0UDL8Z?Uf@K5?LPAd@g#7+oP#yL2|lpLJDt1 zL8`lcLh9S7f^>Dkg!HpE1(|H06EfGz6=XfTnvgxs>O;=?j}LOoWIp7rzx*IS^xubq z{;dxRO&@$H%AfwASoDzThZ6tF2POaR7nE5{ODMZ{u%JSsBB5g6;)2Q_Q3+M^S_`Ug z*d)}{r5DuhkV~kG^DL;J!H_U{J(Jhu^GsTk&oc>6{>fy-1xh`PU}AzeFDN;IFo@s2 zF+75)9>fBL6qvr;^#MeKLJUlA&H?j5AqV1vLJvfPLJ&lQLJ>rRLJ~xSLK8%TLKH-U zLKQ@VLKZ}WLKj4XLKsZ{{#;)GVt_&#Oh4rZTL=nq5FZrkAQ}|%AQ}|agQ5^bgQ5{cgQ5~dgQ62egQ65fgQ68ggQ6BhgQ6EigQ6Hj7iWte0{a*g z)gS>-bc1M6l!NJe2f+>iMLmcQihd9cN&+Anlng*LC@FwwP;vm#pdDp2X%DL6fUbLG#|-4O*`X6tws4-=K53XMyg# zg&XuX=Pl5$uWR05Fgaj>Vfq3Cqhg~4#_ml9Ccz>LOx05i%#6M*FlTo&u#gc}uz0Rv zVEOy2g4J;@1MAz@6>K)BZLr$#Ji2V0ZA!;d)LG-=D z3NbD33}W{!RftQuU=TmAT_M5u&4$GG#S4;j&uvIfZ(WeWyJ17Bd-{UZx05!ct9vd; zKU=aPlU;j3=Gw3gSHpsc4rI1?|YLK^qMs1%+bK z-v%ZAn-og^i*G2iIJcne-p>sc5*rp&?7O|8^2ekFRrB_4sJ>CMpr&sAhT0ur3+mz; zH`LFtSis1{%*euu53+HvbJVkQ&fNUO{|N+=6IO z{DNpu6oY6`G=peRRD)X?+VvYi3{W}%(@#CX7J||P zh!08=AR3e|Kr|?AfM`(q0MVc{0-{0b1Vn?<3Wx@!7Z43fGawq2Za_3B?SN=d`T@}? zy!9Kv4ge)2kN_w#foM>I0@G(p!1ADk1>%De7l_V!&bt6agVGp?2Bk9)4N7Yu8kF8Z zG$_r1Xi&NX(V(;kqCx2oL>Fg^{s#LPln_Azpu`BGK?xE}-}?!604QOC_@KlIqCp81 zM1vA3hz2E85DiMKAR3flK{P1Qf@n~}o&29EWU@W82n;iFP7Y>H(gR7uQwcP^a5;Jh bhgdp#yM*ZY8tWP98R+;L8tNJ98E^prxSo=l diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Noronha b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Noronha index f140726f2a6945357b325f0bb452dce7557bbff7..9e74745ca79137918281337fa270c5fec4bd7da1 100644 GIT binary patch delta 43 wcmX@Z`h7H&oc1_lsjU|^Um$f&}ozS)e?fpKyJlPV+Q&`a=iuv0|PSy0|U>rRjDaE_^mJO_-iy_=SMY#UH8%iZdoi)xb^yt!X3%W z3-0Xn7P$MHUE$vB3j+7=_9#3EQ5EI)Q%4^B{Qj8;(M-ZeovLW^mE@}ndHRr4nc zRIlt5F#on=fyIt;0n7VW6)ayePOv`lae+-f!-V?(|Nl>3$S6B`10&buy^Qh`lo>TP QhC48FFfcGMph>C&06IWoT>t<8 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/North_Dakota/Beulah b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/North_Dakota/Beulah index 246345dde7cada7b0de81cc23fabc66b60d51e79..becf4383301e2d90db0c0c06659b588d25042ee5 100644 GIT binary patch delta 126 zcmX>jG?`<9xC{dtU}Rum0AY~u1aVOi1;Ysp3=C`x3=9&BXE8HR_Tq?VWS#tgL&0SA z0tOKu-w+00mkKZJp&zILqk17Jp(QP D-#`=I delta 1366 zcmbQtaYkr@cs)A<0|N*%FfcGogR*5B7#JAlEwh?1e>Z!>f;O263unD-INixJ;ga%~ zf=h`K48MMq3jBT%!SLrsxWL~NRt*1kSPJ}KA;Z8hLt22b{T~BU`CkF%La7FpM9B%P z0e>3U9DYw=H@Mfp-fKF6Q{X@Y=h}?|Tpt!Sa6hPDIDzNpeg@tH%@g=`E@a?exj;Z* zW;26eXOnHC$$OEk2o7- zE^$ndJ@~poZsV&7@(a&4D3r+xC^oKdPzwDopqzDvLB;f;fU4Iz1~t*c0_s{57}WpW zpPJz_FlW~iu#o=FVDX$s!1DJ^2CHN51gvlGX0X}7HNkfGTn4-THxuk< z*E2ZepPS&=GP}Xaf5Qall-dRt{YevCUE&*DKOYrv*R5fwcfY(`z>_zQ!Ekl0>Xkfgh$ zAvry|AceQBA=TZsz998&Mnk%~d_nqIuZB!^#)8bXIt^LR9v5U!^JK_5|Nld7nKnb- z`iCF#!+04A`VW67G=0xdl)v;tvFJsH694uOCI8+wlvyk(D7$yQp+cgqpkm*~hRPoq z1y%DVH&oy7DyXR|ZK&O$Q&1Nd-cUb-uYie>iIIt!1xztAP0nQwG-qQa3r^n8tYEZr z1Ea|Q|Em`;Nci}MF!;KJF!%`VSxmDDFTsDE>e+C=Nk1C>}vHC@w)XC_X_n zC{95%C|*G{C~iS?s=I9gn0}i9b`U6jbdP<4xC{dtU}Rum0AY~u1aV#v1;de>Cox}On(W09Ir#yHn*^70aEO_+ONfrI Sv7V8hfsU`Cp`M|h0T%%Knhn?h delta 1379 zcmcb|enx15cs)A<0|N*%FfcGogR*5B7#JAlEwh?1e>Z!>f;O263unD-INixJ;ga%~ zf=h`K48MMq3jBT%!SLrsxWL~NRt*1kSPJ}KA;Z8hLt22b{T~BU`CkF%La7FpM9B%P z0e>3U9DYw=H@Mfp-fKF6Q{X@Y=h}?|Tpt!Sa6hPDIDzNpeg@tH%@g=`E@a?exj;Z* zW;26eXOnHC$$OEk2o7- zE^$ndJ@~poZsV&7@(a&4D3r+xC^oKdPzwDopqzDvLB;f;fU4Iz1~t*c0_s{57}WpW zpP-DV6s|)VR{*ZQ87n>v3mrA zNzkhTQ*|o_Gov#F=Ik;I7Sb<1SUmg3VEOyh2diTb7_4uv`CzmDPlN65z7KZ&_ZsYH z7kqHYKhWUV(p%uWnhT>x9vmJl1B{D_hx*EX*t3WyRYg)T*@+r_<1oO5_}IeB(_%;BKZJp&zILqk17Jp(QPl1_?J diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/North_Dakota/New_Salem b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/North_Dakota/New_Salem index 123f2aeecfc88f2e543f99d6a859e02788170852..ecefc15d8cdf601347e114ff25b3bb2df4d56a57 100644 GIT binary patch delta 89 zcmX>jbdP<4xC{dtU}Rum0AY~u1aV#v1;de>Cox}On(W09Ir#yHn*^70aEO_+ONfrI Sv7V8hfsU`Cp`M|h0T%%Knhn?h delta 1391 zcmcb|enx15cs)A<0|N*%FfcGogR*5B7#JAlEwh?1e>Z!>f;O263unD-INixJ;ga%~ zf=h`K48MMq3jBT%!SLrsxWL~NRt*1kSPJ}KA;Z8hLt22b{T~BU`CkF%La7FpM9B%P z0e>3U9DYw=H@Mfp-fKF6Q{X@Y=h}?|Tpt!Sa6hPDIDzNpeg@tH%@g=`E@a?exj;Z* zW;26eXOnHC$$OEk2o7- zE^$ndJ@~poZsV&7@(a&4D3r+xC^oKdPzwDopqzDvLB;f;fU4Iz1~t*c0_s{57}WpW zpPJz_FlW~iu#o=FVDX$s!1DJ^2CHN51gvlGX0X}7HNkfGTn4-THxuk< z*E2ZeA82rF=`C>bU)127l3(DW-_qdf5?J8+c{_u;cy6v{@Oo?b z!F$g12A^ww1->>Y6$IMYHUyP^DF~L4ZwLv!RuJ-su_4TKM?u(A zIfe+iD<2|`GB8B`+x8)9$s>m7dow=7v>aiG-BI=FGxS@)sV@~Sdh6^ry=XvQ28UH zplaUahUyz$1vPc04YfOT3hLs*8|r896)-U}F)}f;fGI|%$>z+C?o5nqtWf9#J(#{c6GVYy0K@>r0*D611c(O328ag5 z2#EHrsRZQ>22jj^_@LMU(V!Rt(V$oY(V&qReuXmHvAF+k}DM1#^0n7(%&>;O<&0`WoV2}Fa^6o>|; zD-aDzTOb;gzCbi6je%%TIs?&|X$_R{7?~#9GFwwK#i@ZTgQYkI1}^8|5Hn|&5FKA* RJtI8>9bZF3JwrVME&yL>gkJyv diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Nuuk b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Nuuk index 0160308bf63690a6dee51c3c8849f494a47186c2..4ddc99d8b74c4b525263ca1337cb57d1a15692c0 100644 GIT binary patch delta 128 zcmcb{caeF5xC{dtU}Rum0AY~u1aUzS1;a`V3=GVhuQ7=*+A}f{g8%=YZ(v~f|NrU* c2A2Q-A3tE^@bL{{&^0h-&^0icY|O3<06{$yCjbBd literal 1878 zcmWHE%1kq6zyPca3=AL)k|=|+d1g0cFbMnB1c(^_njotDdV-knoeAR1XD5h%-Zw$w z@%jmpmlsTsIy`ZL^q#!}GHcce$j+HBAlEZNK)$9?Kq03{Krtp+K*=XWK-tDsKt;z) zKvhOvK#fO2K%Lcjg8EmJ2^vpTCum+3o1k@+eS-Fu9}{$zyqusr<<E?FnEkC6u#lcI!QyVBfaUM9308ZZ1*~sJ zOt4uNKf!jl)dagX#|iecWhOYJDNk^0u@rD}W1ZlfA}!#e`h0?`^Iris){_(5mG29< zzk4R&$$U`2^V|smug8l8yw|M~@Hw-8f^T1sfZv*h6a4e?1Oj@RCj^FfO$f?Koe*rE zGaEj#1ple{vple{nz`(%B2q8#Gt^fc3{|`#B zpd<`RwICXlazQjG^@37lLR|P6W}Q+z6sUITB32dj_^2lruqmQ0@fLpd1RKLAew}gK{c} z2IW=|4a%_~8kB26G$`kSXi)A2(V!d*qCvSBM1yiNhz8|m5Dm)FVEVfOI6go*8^j0Y zZV(O1;UF56%Rw|Kr-NuvZU@nz91o&FxgJD=az2O#<$e$iDgi(=s1yLvpppPYgGvJs z4Jr{pG^kVn(V&t6Ouv{8b`Pk80P#Vk1c(Ne6d)Q@T7YO!i2y?0N=={Bsi=TV^*n`EQuuoKoB1qCaVZt4n-?8-K|JcNND5_a74lJXw?*JZ}^W zcs*fl@Sd}Dg3q;>2H%?Y34Yt`8vJ82Cj?AWXb80No)A>V)DSGAJ0T?WNkhmV{t02G z#~Q+(>Ig*0J!XhF$|n%{?37PEt4Vi1LCS*PP*pNLfTp;HHA46`L zr9j^L4-ENX(gFqjmlz67{|Xf4Z(%4Fy)RJWKaHW}-|q=!7MmK%?%kbGAu*+)V&DD= zl|RZFs^%@6P<CkeP{@iG`86@c;jLG7Jp=|IeMk z!1Dk9>IDoO|NrmYz{mq)GYUY&eSAY0e1k(6oI%(ngu&M(gn^V)^8f$;|DcotqCu$z zM1xWchz6w^5DiK>VES*{2TKT4pi~8-K`9GFgHjim ze$FERqCu$)M1xWqhz6xL5DiLkAR3hFKr|@jfoM?b1JR%q2%>IBn2CW7q;rBVKc7pi~Q@K`9qRgHkVu2BlyS z4NAoz8kCYjG$=KLXi$m<(V$cfrvLCy0MVe-4W^&!fb9pRau6Ss(m^yRwS#C-iU-l4 zR1cy-DIY|GQa^|Wul6pj-i>K{*3NgK`I$ep?214=9&_ z_@JBuqCvR@Os};9%Y$+ah!4s+AR3f=Kr|=^foM=J0@0wH1foH?2}FZ(6o>}pDi96I zSs)seyTJ6n-(d4WxeUYyDA$4bpqvMyLAeh^gK{8<2IWE!4a$ii gdT{1OF5ln~b6=Mb9baQTBRvBhUqeGZLp=j705h41ssI20 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Panama b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Panama index 9964b9a33452f4b636f43703b7cdec4891cbda5f..9154643f4c9189998392afb8a93e2e2eb9eaecf5 100644 GIT binary patch delta 27 gcmdnSIF)gN^27ob9!3TR1`uXoU|^V_GqJ%808UN?7XSbN delta 28 jcmbQrxQ%gwGA|PY0|PSy0|QS30|UdvY?TSh6T|EQN*e{3 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Pangnirtung b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Pangnirtung index 3e4e0db6ae0a5a704f8cdd549071cc5b7124e2fd..5be6f9b0160d75c9c10822f22f7c9a7a0c14b21e 100644 GIT binary patch delta 102 zcmZ1{(8xAHT$BL~FfuSOFisX=mJ>vluw`Ii;M#1@{DzU0nURT^WwIiZ_+$en#mRk4 jHj}S0X-aUp28Wosx`gQX8tWP98R+;L8tNJ98E^prSMUzz literal 2094 zcmWHE%1kq2zyLf93=AL)lBj~RH5XqEYB=5TDB+Uwmx4?nxYQCT*I^%)5R_X=ye_InYx!f;k-kYAF^-A-C z_P)vloy%?ky7QtF^fqe*=-1gM7)+K(FicPXU{v%g!PwpNgGtbx1XFeG4`xRD63p3o zKUhfLdSLPFAA{xZQy;93UHo8ud)@<^_3sL7cQ-t+>%UN7KRfAxL;j`$$Cmm8C;ur0 z&MAorF8XB!t}f0AuAf(YaMz80;C{L5gD0=!1JBJlAH3cwKk%N@S>SWcA;GsMyTEUo zQi6YsZ$ZE`mV`hX{eqyYFf(0R=ClW$_e=Z0!U6l~_l>bA7+_47{M?QXt{I}vk z)RM~|qVIJ*h-umSA$DKRgSeFGAL8fvJxK7~Qjpl5osgtEtsptwHz9?$q9D~>KOyyP zR6)ABU_$y?n}STX&k31p*ANub@LI2hVg{BWa z6y;BUP%L`rLy3RogOY#u3(72}C6wJeSWqERkx;R3aY5yesD!F{tp(LLY!Yhf(hF*L z$R*Upc^1^qU`SwQWMXDvX2lEH*rAYv6UL$f4N7hd4FCUMy}-xM#=yGcWz*i{r`XU0tQ78n^6^6T-U&W!7)69!7(6&!7(_5!O_J9M1(N7 zx`Z&e28S>>gRn~o0|Nsi#7;1YV3U$9{{R2~ACxsfG$?z3Xiydb(+O`cfM`%w0nwoB z0;s}fSqMafvJr>|WhD>|%1&VVu2&VsS1=|P8jvziL zOM+-nwgl0jtO=q)*%L&AvM7iKWm6Ch%Bmn5lwCnID9eIqP__lppsWj`LD?5XgR(G) z24!Oq4a&+O8kC*E^s|2;3Y@J$3{chv(V*-NqCr_4M1!(9hz4bK5Dm)iAR3hAK{P1a zgJ@9J2hpJH528Uu0Eh+^17P~|iVq+fR2+cm%UxhTs8|5;K}7?I1{Dt=8dOApXizZ$ zqCrIkhz1oGAR1I;fM`&$0ir=g2Z#n0A0Qf3gn(#JF#@K4e=Y#gpyC8fKjjD84=Pqb zd{EH>qCv$Ahz1ogAR1K6fM`%r1EN924TuI6IUpKT?0{%c(F3AE#Se%E6+s{xR1AS= zP*DV;LB$c6ej5dL52#oI@j*oshz1o;V0x__SRPbNf%u@J3Pgj7D-aDTvOqMb*aFd@ zq6 ClVbS* diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Paramaribo b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Paramaribo index bc8a6edf1331b6912c26e81078b00c8e5d87ffdf..24f925a2dd33d487e41cb38b9c3b4c420af69c1d 100644 GIT binary patch delta 36 pcmZo;+RZpYdEx{X9!3TR1`uXoU|^V_%*ZlvrUo-36Z6EgmH>Z=2Gsxn delta 66 zcmdnZ*v2$LS&@~2fdPbtCbIVJ*r(-v=c|If(8%rddbaDp-;>%?#k M9tH*m286IB0IFRTPXGV_ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Phoenix b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Phoenix index ac6bb0c78291f1e341f42c34639458fb385bf8ed..c2bd2f949b248b835c98216b4dc66f9f6eb0265e 100644 GIT binary patch delta 27 gcmX@X^nr1L^27x!Jd6ws3?R(Fz`!s;XX5sW0A0EUM*si- delta 64 zcmeysc!FtyvLQDE0|N^K1A{;V0|UdnWmXgB?`CgU&?Yls;jEVpr#pEjoEN_@bH4xS WnhT9mGQWP53QXK=K0$e6*en3b78(%% diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Port-au-Prince b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Port-au-Prince index 287f1439266639f9564149d6e162feaba3fbed86..3e75731baa7c47f2a60ad07733d6f8467ccfbebf 100644 GIT binary patch delta 103 zcmbQmy_IExv;+eZU}Rum0AY~O1ZiFn1;V-v3=AxrZJBZy85t*UWYpwmVrKgPe~$qJ p!~g$#To_m;$Fs^xaJdGDn7X=z==d7z8R;45_!=7O8R{8u0RZa05*`2m literal 1434 zcmWHE%1kq2zzW!)qG1dS3?Q~(0|NuYoV>z6lG1J$q!`~jNPT=4ApP*7gUrPX0kQ`- zJIHO^6d=EFs)NGBDFKR&Xz!~`(77CvpgS)*L2t8Jf_|NCg27~o1jF>m2S!D|5{%ugAD9H)NpSM7 z2yjkub#T#-3UGB%ckqw#EeM##k`QR4Ul3IKEFoA%uplJ#L_)~#&jn$os}drPeEbmk zZ^eVCC6_-$-|Ko1)3WtL?7o}_aVgV3#Lx44kl?$eAhA6=AxU>yL2|lpLJDt1L8`lc zLh9S7f^>Dkg!HpE1(|H06EfGz6=XfTnvgxs>O;=?j}LOoWIp7rzx*IS^xubq{;dxR zO&@$H%AfwASoF|`6938vCI9XhlvzwmD7$yCphBV|p<>_Sg32FJ303o23#xC}B-GTU z7u4>MOQ?(UEU2Hskif{y1cxlFm=GaL3hV#>Jq8R6|NrlCVPN_H|M&q$&j0^+ZeZX= zX8ZVtFa!knhA_CggfO@Uhk#?8k&%={@&Et-|C#Ob0U#QbI6y{#5(tO}B@!_G@m&Cj z1|=2{4N5Q|8kA^2G$`SKXi(w-(VzqbqCtrWM1v9%hz2Dl5DiLDAR3gYKr|>}foM?T z0@MGtCV*&AA_LR+ri1yQ#0KJn5*&yIB{~odN_Zd|l=wh2C;@_KP$C4;po9pbL5UGW zgAyc&1|>=m4N90G8k9IeG$?_BXiy>r(V&D1qCtrjM1vA6hz2EE5DiMWAR3f-!SwIX z1t1!fh(R zpo|5gL759ggEAP124yl34a#UBdQfIIF4y1?Q&*P|9baQTBRvBhUqeGZLp=j702;oA AqW}N^ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Port_of_Spain b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Port_of_Spain index 697cf5bcf7f151ffc1c1fc4247e4e9c7e3ff01a3..f4fe59034242c4416bc84f06f38530d625149329 100644 GIT binary patch delta 27 gcmbQj*u*$Nd13+!4fq{vEfq`SPx$zpt|NoDLFfjc8fBXOgi;r&zgJWrRc#Y?@TW2C_#1Oz=f{A6UH2w9+_E?oaO;g&z#YlI z7w+sVb-4T6FyP+oUk>;0ZVPx2;_vWfhV+H6tW^%*4m1RO=d(KSBhVw@$MJ^_zqsCA z__b2x!0$Io0e`w@9*{k`DnPE{^8xt~L@P8-x3IS2#QfaWwccgZIE!)*ORx2Z|iN^XY8(5oqP`-suWhLR&-DNQ4nG&z}39RLE_UdsRg diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Puerto_Rico b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Puerto_Rico index a662a57137b69e8ba445e899566222cdd422a764..47b4dc34160dd3ff97ebc35ccdc99fcf49c7ffbb 100644 GIT binary patch delta 53 ocmeyyxRG&!xC{dtU}Rum0AY~u1aVdn#W1lahKFObxFQP!0|N*%Kxq(Lpn-vb;q*771DBM)6ilo(;9y{2WB}m_;;bNfmWlo` Pd>}pub2$cwm~a6A4H68L diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Punta_Arenas b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Punta_Arenas index a5a8af52c2f26baf6f85a1786f69593491ad5195..5c9a20b947f3763da250afdf005bc7f0136ad537 100644 GIT binary patch delta 176 zcmaFIx07>%xC{dtU}Rum0AY~u1aUzS1;Zr_3=Hg>KQb+0p2Q>?&&*0o$Tqo@Np12% PCJ7EM8(jlqJ7X>YYaa|@ delta 844 zcmdnV`HpXbcs&OL0|N*%FfcHbLfIk>3=9nY2JUXNW1a@guX%KAAw%JT4RPhiHkR8u zY;t6{usNdOz!oKwfUTBG9JVp1U)U~n{lNAovjcYgjXALMxI(}gnLLLxInOU#H4Z&+ zwQQ2Z--|X5|0ey~@c+!&0}MrXHZYb39AI+r+`t@KZ*+h~L3;zMoxcMc1MdcQ?mZ6d z_up^e_$TbZx&Pt@uDf3yxL3S0;MsfKfw$v=0pHx64*VIL3DAwmQIVf5FHc<9^;-DgV*Fe>R;ehJT{RV2EejHH0xzIr4`;h~hhxTsJ zy1wjy_M-V4bhdXK&~0kmpf^41fPPZ)27`un2SX><4Mqu>4#u|E4NM%o9Zb1h49s|U zIGD3t-C)7M?_hD7!@%;T_5rI^uMDhD@*c41I%8nF;{5@;taS!C_8k`wI0T>C;Fz)b zfRpi>4bC1@54Z^TZE!W*kw%N#uSHMn*V2 kL0k}&1VI=i22O?>qn9v)1?cKlaF}g^xC{dtU}Rum0AY~u1aV#v1;bvO^_e4>Cg-zzO+L?LB*Enz9Af6|5~Aa4 StY@TWpyO+3sAs5Wzy$!!?hLp9 delta 1162 zcmX@ic1mD^cs(lv0|N*%FfcH*L)jt?3=9nOb}Vd|zw2kgi67w!r#t>NTvGm0a4C`V z1Bb%-22O!Z1zZdp8@N79Dd2uExq;{Ah7Y_4N*nlgPWr&VauS2U%#sg+oh1xHm0=%* zGs74}A}v0MdRj1uSxS8n*OX$AP%y_&V?R`@lbS@_q=*}x|(A(@%pkEi+U@%#&z%adx!Kj#{z}P*4!6fKafvLI`gPGBp z0&{j528(*>7auI1{bR8Fed>eNu?Gy+x7U2IS^uZOc6Z+gyZ(C(_OlB z+ZLq0&1gthmoG>^>(!9S&RCGSR;MBB+2exjX`T!@=l_4mEz@SmTmSGwei$!9LI2?o zg{JQrit?9!C>FhF%249p{-NaG+lDfWB?V>o&Noy@v=vnB+t^U~Bcq^d-sFbr8(sx9 zb)^lpJ9G-_;=&v1XYdtFUeDw;`8<=>Ep$VcvAqt{Fp$eiw zAq%2Gp$noxAq=MfFxG?8GXp53K?0!A2GO7p2h&GEBqZcPEKul!XiyA*XizMGXi!Xm zXi#i`Xi$uRXi%(xXi&_6Xi)5cXiyA+=oH@iHn0OgQ3VnJMHh$$MH!er>jjnvMIDF_ ziarnxib4<#ibfC(ib@a-icSy>ic$~_idGN}idqm2ie3;6ieeC5oGp40M1!Lm!~jJ% zhz3PDn7(%&>;O>IgZQB62hpG;0HQ(307Qe50*D4B2M`TP5+E9sEI>52q@e_ofFunr b=im@CXO|EiUt>KZJp&zILqk17Jp(QPS%H2= diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Rankin_Inlet b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Rankin_Inlet index 3a70587472c633aaa178c7f979b8b3884d604372..92e2ed2dbe0ff9481f27ff331263beb060f919a1 100644 GIT binary patch delta 55 zcmaFDw}o|r^5hFlEIf=13=AO5z`(#TL7CNxfq{W_^8=XSr+^uyl;G8ca}$R4~~Ah+>OgZ#q%1qx;S42q2l3zR}XGAL*5 z{h(rcnL*WS{s%SDtqkf~jUUwiU2M?gO8%gEZ*zmzE7uR&`|77Q=v+=J(4AM_ptsqj zK))`s!C1~a2G1?KEB3>MNaK3F{a$6)#U)Ca3$ z4;ZX(ulZoJ{!fGL?!FIp{r4K|XBT{M$Uo5F*wS0z5hW1r*aGta#ub?9A#jL{I~5x)RIRG(f4M2h-o>(5WBDH zLtM%-hWL3g9};{IH6*rI79{B|X-H0wE=b{RYe;psEl7Qv(U7h#UyzZ0)~g|tov|Qu ztxiMMv&RM5(>xh+&j0_ATc*vBxBlUW{4idIg8suF3QgZL6y-1dP%L_pp~S!aL&?9l z4P_Qf3d-)CZ>W%HE2!AFv7z!uMnToQ$qm&vyb5aSN*ii-=oHk&g*VjC;47G{&tx^( zmPu~1J(CPG6EoA~OeQ($|NmDnVBpj>FkoQV7H&oc1_lsjU|^Um$f&}ozS)e?fpKyJlPV+Q&`a=iuv0|PSy0|U>rRp~o+@OwVk@z-I&&W|PryY7`J+_G3_aO?FigFBKB zH{977sc`qVsKLG2_Z05mon`PK#8~0W^#2>avc@TVJCI`VolkDTk3b!RAIFa>{NlQ_ z;n#{E3x2<0Gx*b8yFm72pMhM(^#$?^OgAVPpI@NZm}#KIePV%fgqFYt21c&Qdl}^?C^Kqo Q40mAUU|?WiK$BDl03~Z?C;$Ke diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Regina b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Regina index 20c9c84df491e4072ec4c5d2c931a7433d9fd394..a3f8217a544ebb0993473bbffaae8e2d723c4ec3 100644 GIT binary patch delta 55 qcmcb@{*PsXxC{dtU}Rum0AY~u1aVdn#jtrMqb3s@mveB485aPptp))A delta 293 zcmeyza)o_@cs&~f0|N*%FfcHfLfH~+e<#b#+p&Ja{N3ygTT}f%Y%}n9u-(=0!wvzh z2Rl`TKkWR#^I$ihLBa0x?;h-VCseR^CwIc3B90G-6JI|#68P%FQH#k5#|+PWIIg(< z!3n9C1t+=AB%J(py5Q8SbqS|Cc_v&^{!(x$QG(%ea#oMPmEe4atD%ntt|{DMxNdq> z;0D7!hMS_x1#UiAz;Nr|;R&}7G%?({w{*hYmGc_z?Q5TKzq6s?!Mw}~4>OY*9@TkI zcS@6sW-0YSTvLic zLdm>9lH(796q96u)F+7s>4(1yWG?<{kUe;}KyKrm2Kj~i3lz%u85A2A7AS>&WKho9 z`$5I@GJ~qu{10lPTN%`~8b7H2yV#(~mHa{T-sT3aSFRtl_tj5r(7BvcpgXU;L2t85 zfqq?NgTZ9A0>kt&2BTt*0%P|G29uyy1*Ym&3}!}W3e4GM7%Ze;e6V=-kHPZysSj4i z9xzznUh~0b{htQg-F+YI`tLQ^&o21jkbj`Tv8A`b$$wFUb4q@Ji+)Rkt4m;k>*wtZ z?z*`j+%L~$@Z|OX;90-9n!)R>;Ro+I(;IxQ`4#xqR5ti+Gbr$niEap(CR7k;W7`l^ z`lTRPM!q2=^jbm4AI63-(;Wq2PvsaQ(ILg2f`ET2Ys3ngWqVLW45YuvmA$DKY zhq#nw4Ds_~J|y@aYDjFaEJ)H_(vX}UU68`t){yFMTafxTqaj^gz91w0tXD%OJ7YoS zTAhZhXO9cAr+G5uod5qJw@jNMZ~em$`C+^a1^tIV6q>$gD9T^@p;+`HLy3R;hmwD9 z8_Fz}6qMaN-%ugZR#35TV?*VSjDo6plN+jUcoo#tl{VDw&?%^k3vZ~O!B;R@pUG-+ zEECscYbJ%s_DsT)GnwS1|NmdTfPqujz<|No#U+HnIXHyD*(HR*H8_M}f-);OX>5$X z!dTD1zyJ<5FnxI@hyn*6h~c@p8bpCZ5ySw6B!~uuCWr=wD2N7yDu@P!EQkh$E{Fz& zFo*_)GKdC+G>8U;HkkgySl<9*fPx)NKa~Sf;NS-_Kv4jqLD2xBK~VvsLD2!CK~Vyt zLD2%DK~V#uLD2)EK~V&vLD2-FK~V*wLD2=GQ+Vs!zzzV#8%O{YcOV)Re_;Bo7g!z? zjUYZKDnT?TIzcojN8j#0RAX5DiKXAR3e=Kr|>_fM`(K0MVfI0ir=^1VrOXCv1>( JGP#{e7XUl}WvBoE diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Rio_Branco b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Rio_Branco index a374cb43d98bfbd06c82ca306a74f96993fd5657..fb5185ca60283bd56f795e9a956274c0b6e63325 100644 GIT binary patch delta 52 zcmeyuvWR(t@?-%<79K_h1_lsjU|?XFpv)@Iz`(#VS&s3~#0`?Hj7*G7%#$6NBqt{@ Gi2wlZ5D4%9 delta 293 zcmZ3){DozLa=iir0|P4q0|U>rRc#Y?@TW2C_#1Oz=f{A6UH2w9+_E?oaO;g&z#YlI z7w+sVb-4T6FyP+oUk>;0ZVPx2;_vWfhV+H6tW^%*4m1RO=d(KSBhVw@$MJ^_zqsCA z__b2x!0$Io0e`w@9*{k`DnPE{^8xtHS7c3|Y1{D4__auTD( IWE~a`08%Rqy8r+H delta 317 zcmX@Yx`ktca=je`0|Ofa1A|Bd0|UdNN&N=fs)HQ1OP$=XL$2Rp$CUzuUE;L|c5Pj} zVfT-X4tu6uH`sgg$$@DN z2H%VX9KJo9zu||l^MN17FB|;)Qtt5Uve|~;hfNRs*%NH=cTJGPzd5D`|9eav*cW?k z;84k5pgd*k1{HxR3slWNZBYGCwm@Bx-$4CB!~#u*{|=fPtQKfJxNM+3GhD&^+p!H6 z`?WT>mve4#zf-T^@oUir&pn9>^(_DY|7V;Wz@#`io{3{}A(QarW+uxC%8Yg!!#^-` NGB7YO)MHWM2mo?JmD&IR diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Santa_Isabel b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Santa_Isabel index ada6bf78b2815d3d99c97d521ab9a6b35c8af8c3..19ccd3576d46b262f8b9f00b302f67bb4d26c4d4 100644 GIT binary patch delta 68 xcmZ1`)W|VGT!sM+FfuSOfG|jSf;caTg5kK$jm$roCL40ZO+Ln9GntQ50s!A92-5%n delta 1166 zcmZqVSSB<V{Ra)Oipz6H)H-4k5&7c6jf$(`WF-?YG8#eahPkNFDqo-BqFJa05Acs&uG z;5}#a0-tMH6MSo?F7VstGr>Qmd_ll8y$OLfkqdSSN_ST6_({WKxukL-dl(<>9g zo?0nH$bA%uI4YwM`R}qo)RKP+(f76r#I!t6h}}0`ATH&QLj1f+fdt=s3liI>PDs){ zupl|Td_oHEq6Mk$krPtiw&X5ISGS&!el~4ECcEr}%(Wg1vY!2)kUcF`A?JdOKyI14 zLf-m+0{LN@3I+WS1PaZ#6^il?2^5RIRVeXaB2e<5b3vKKfeB^zUN5MSSTvzx-`NF~ zKUyYK&0D{q`bOG>n!1S#YIk@{sEaFJP(MR!!eoEuxXJm<=9AYl+wg!=90MbSoFL8% zN`xQ`5}3L%{0CD#hy@A`5Df|v5Df|z5Df|%5Df|*5Df|<5Df|@5Df|{5Df}0F#Sh% z0f+_#8<>7-r2wKq!3U;~%7FQxU>yC^gZQ8*0MVdm0Ml#hJ-`Y;@c|M5#R-T8 z#S4fA#SMrC#Se%E#Sw@G#S@4I#TAGK#TSSM#TkeO#T%IZ&j~gk6n`K-C=Nk1C?3JI z^}e%U1)vB834kIMM1vw0M1vw1M1vw2M1vw3M59Nv3P=zZ(Odz+Ar=8HAv(UsdPaH% NI=+U6dWL!iTmY*?f*Sw; diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Santarem b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Santarem index c28f36063bd264e932a1910861e884d2a1669b00..f81d144206ac5bd2029d59beac0bb82801ebe67a 100644 GIT binary patch delta 41 ucmcb`GLw0N@+3wU9!3TR1`uXoU|^V_%qTaRpYg|JK_+P?MyAQSOu7J?zy|dI delta 181 zcmbQqe2Zm*a=knQ0|N^K0|U>rRaG84_`^T!`0KY}=SL@pUH6&{ZdvScxb=p^;g00{ z19x_&8{GY^>~L@P8-x3IS2#QfaWwccgZIE!)*ORx2Z|iN^XY8(5oqP`-suWj&1U@LT}|NsC0@ z_4&mm{48qsHIS?s+ z!XUE$+<~a?s|=#^HynsrnO?skwxs4jT&L%T_>i~*37Og(5=|TqBzf{~NET5#kfQN^ zL&_JH18G7$25EN{9nwF(GsxJ>?2vi!f;(b*d})f<2qptu9kp!fsPpg084pm+q)ptuClp!fvQpg0B5pm+t*ptuFm zp!fyTPqV=e0>v|k4~lCL4T^6N4T^IRU3J*V9P9v4+=B!_@eiUwX#hln(gBDDr3ElO LT++kjhb)Q!@lTf; diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Santo_Domingo b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Santo_Domingo index 4fe36fd4c11f998ba3f626c5e23d97bd82d12791..3e0785086639e483597890d2b53b9bc4c4ccfe91 100644 GIT binary patch delta 26 ccmX@byq9T$GCuV!Z delta 88 zcmdnXbc%U`vZo*e0|Ofa1A}w}0|UdZ`%VeJIJ__XT7KB!|MHI)7@Vt5Ft%U5!1$}) vgSp^C0P|fI57vN70j&EwJ=hJl1h6mIbAnS~T7c#6Jr5>64w;}lG3+@2vW_Hr diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Sao_Paulo b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Sao_Paulo index 13ff083869a9ac8476775587de8476654a100017..a16da2c4d5a980cd944d86c34ea8a2f597e39b71 100644 GIT binary patch delta 44 xcmZ3&y@P#%@?--h79K_h1_lsjU|?XFpv)M(*^21_)8qw=;mnLojFW3w)d9Z72&Vu5 delta 431 zcmdnNzJz;%a(xT~0|PSy0|U>rRYhBN@OwVk@z-I&&W|PryY7`J+_G3_aO?FigFBKB zH{977sc`qVsKLG2_Z05mon`PK#8}}=6sN&g);NW42T}~a^T{pv5vXJEg9UtE_q z{95s2!S6S027kJ17s#IMGmxvezCeC~=>`Sk^9vLkGYyouPb^T5s2A9v{HQ=d)%?>2 z)hovp)D`&+)b~DKpvmyjKyymBg4QeE4cgg83v>=_HPB5vqM)~6x`DpiG6jQ%N&`b# z-vvhD3LA{svJ^}#LJUlP98@q{!M>epFded7NHn|!_n zwnru!*!g`}U_bGnfrH+q1&;M?KMb72-zzu=9x`zLeo?{IH+X~VgSQLZ1=|eVw@+2@ z__b(*=k#&~uUjn}yc;Gj@Y$8N!8f6Ff!{2T4gQ{!6at!44FVM`7X&4{8w4{*F9>ng zGzfWVp%A9bZ4h=+N+E*jtwF?!KMIkL&KpE^+*63Ym#`rwut^feg_ZRvA literal 1916 zcmWHE%1kq2zyRzF3=AL)k|=|+1!gz+NC^ApIf$6391vChxj;<#&IEDhvlGNW@0%d; zc>M&)%L^t*9iBKrde2?~nKkPKWarEmkn5QsAYaocppa7}pcs=ZpyU%GplstRprT_Y zpemy-pvEI1pw8+%LH(=A1dXSv6Ev@iP0%{ZK0$lSj|nLF3SV&KqU~xB5!18z51gpKy0@k-9 zCfF>CpJ2P&YJy#x;{^NJG7}uqlqWd0SPD3~u}*MKkrr@KeLlg}`LBQ*>&Xf3%J&7_ z-#ruXWIib1dG3UO*W<+k-s@Hg_?+24!MCqRz;DgM3I2I`0s%eE69U7#CIscAP6#&7 znGoXRJ|R@xZ$g-k=7g~C1`{Gg-2@`83r&dpsv!`y?aPGdt6Tyx3j_sXx4aREtN$zz zKjoZ2Li|;M#M)OAlI*t&B*&hakRm@*Ak}u=gfxz=6VhcTOh|t*eL}|Hq6wKNDko&! z4VjR=B6>p3u|k2|4%-QN%Yp^+Gvp@}w3!MN2HFS|rHKm^8_Efkxc(F<6=V=7(-)mk z_TiC01>g4x6&H>ORKB}8p=!f2f$DR+C)CV5G@*9g+zEA+OD5F!)laDZ|NlQD6EhnN zE1eul6pj-i> zK{*3NgK`I${%Qht2Pl_-_@JBuqCvR@M1yh+hz8{v5Dm&XAR3f=Kr|=^foM=J0@0wH z1foH?2}FZ(6o>}pDi96ISs)seyTJ6{dI1m(%4J~sZX%cu%55M%D93?lP_6^fpqvMy zLAeh^gK{8<2IWE!4a$ii8k8GBG$==cXi%;M(V(0OqCvS6M1yiDhz8|SF#YZs*nUuM z1@S>S7DR(`ErfM`%@0HQ%9 z0*D5c3LqL(GJt4M=>VcZB?O2Dl@cHtR8oLwP-y|CUrYzP2UKc+_@I&lM1x8X5Dh9p zKs2Zn0nwn61Vn>M6A%q5Q9v}PQ~}YTk_AMAN*53fDq%o0sFVTGppphegGw7P{oxTf zK0u`ohz}}xKs2cI0nwlm2t6}5(z|uN+mEoK}Jp+9M9bZEOFw2k&0D!*1kpKVy diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Shiprock b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Shiprock index 5fbe26b1d93d1acb2561c390c1e097d07f1a262e..09e54e5c7c5bb2384e37626d4b985cfad29ed29b 100644 GIT binary patch delta 89 zcmeAXp2RUhT!sM+FfuSOfG|jSf;caTg5ku?iLYb_9 zV&nP-rTWnS0?Juu7*tFj3aEOmV^9-4ETFD6fkFM>{Rx^}MGTtv4o=W|6~dssZ}9}3 z%LNU(^I9k9Z4PSCuS=g`FxjNRFug^2H%?Y34Yt`8vJ82 zCj?AWXb80No)A>V)DSGAJ0T?WNkhmV{t02G#~Q+(>Ig*0J!XhF$|n%{?_u36(#}8mi_koKSs3D59aJu6aW34y%T` zxYP;tGh`Yjr!yx`p1^D|c>*)*6x)&7ELADC9tVQ0ReZPzZu(P$+_EP)LGkP-uc^P>6zPP^f}vP{@L4Q0Rha zPzZzRKm7F*Knze&gXyO_U<*M(4&sA?9YlkI9z=tJA4G$q07QeL0Yt~{>jY8Y*Z?s= zF#@7Nu>zt&F$1DOu>+z(F$AJhcwqqCsf@M1#@+h_1d70V;MFK*<5b2PFv*4N4Xu8k97c7@?4v1 zc~*e;z{CZ7JJ$>FuUw}fFms}SVCMt{p~_+b;mrCX1(C>50a4Eo1u;u=0dY+;1qr3# z36h)=3Q|m_6Qs071f)JWZIFJXxJv2BoF_;P_lnWceZBRVYJ+3T_61JPrI_*|=4;9IkJL%rX&s0IEpts4TS*(?aO zN#77uCbuA1#&bhR7{h{)KiV6@Odl->d+K2jA@^S);;5EEFYqVFA6h-rCe z5W8=wLR`uPgZO#v3JJb%HYBz$UXY}FZbNc<>w*;C4I5J3(-)+^owOlc-E%?u*^&*J z?Ai-5*M@D#dd|Bbds=b5LCys&h1{}GgS-tq3i)B?1_k}^6bj8G4T|zFC=`qSHYoAm zq)_r-d_$SVxdmnSer~9c*s!2t-|Y>RKPD}xnzwgD^^KARHFfhh)b0pdP#4#@p?-$N z0!AigMizXKm7NU&>md}4Nd|^X%NZE{|L<>LVEO-l?gT~-Fv;`(|Ku!Y3mygr21Zc& z2hkJtrFl6S7#KhpBsO7V_yVSS5DOHQVEXc50}u_0QZT)FDVPt6S`Z%;y&xJC#UL6K z%^(^S(;ylY+aMYg;~*Lo>mV8w^B@`&`yd*W0>Jbi?fMNM1}G_j>8BoG3qeT�Mn{ z5DiKiAR3fBKr|?cfM`%M0nwnO0-{051w@0A42T9L8xRdjIv^U9d_XiP34!Po-uew- z2Y}KNNC1?cKr|>#f$6g)V0lp50`WoV3q*s`7>LfERt$D9D5-(?pyURkK}ilogOVMH z1|>ZZ4N86>8k7Vfq{vEfq`SPx$zpt|NoDLFfjc8fBXOgi;r&zgJWubB%9;xC{dtU}Rum0AY~u1aUzS1;e`;7#KJzvtV1torMSW?awc4yMta*~= zv-a-%JL}Fioms!P@y>>|DQ7k=n-{aG*X_*awuYE3x%C=nwx%V;Z1d$hv)#=lW{1w3 zGdtDPVs?pf`t0U+y0iQ1Yo9&uRqpJ)de&#(Jl~vs=h;^5-@0Dnzz#!;gO%@B9GW3) zaX9kgiX-J;Esk1lUU4i@aK~}UsVh!6eBN=AX_Lk&g{wPGJ({9%hGF}TOUhpgE+srW zak<0g#uYDSkEaT9xe7Vx&wjg`N?Mp{b+__g0ad%~| z$Gv@F5%)X&Js!-nhm&_F!{36~S(>)`LS~O$4VvzXumXUj)~OLJ#f- z1raenSmz+I|J%(2vr)N5Y9BZArdKiLex{_hM2|o6XF`* zZb&GJct~>GxFN;(%|q(r*9hr{H#}r6UXPGHxXVLsyU|asB1YrQU5ooM3YP9iRQhM60KKkPqg=imFQenPSKrbQKGk* zHATO!UaG`k((@F62EP{9{w>F5dl-*dj#4@ zMFf>z^az&z6A==+*(2oly@)W=sUBfZe%*+W+jt`4$ekOJ|0bV^TC(p(^u5v(F)a&j z#O@0}5tq_*BYvLci3H#I5sB?#9!a{55y|Nm9x1%Z5vlG{9;t6#BhuCWc%+|IkH}=Z z=aIRVGa~ER0gs66X{tAJ&fhtaTgHAPZ~eX#`Jpdw6!b4RQD}PlMp1s#iDJ>UH%k0d zPL%vR6;Wo<=uviWO+g+sC(4Z1x3{E;Pj}AGl{65{@P=* zBb)T(05-14F>KQ&H?WyZ{={aW_y7N$8;mSIz99^LE+Gtl!66KO0U->2;UKlUCC@MfSC_2FOTUW4yK+yu?gQ5mRgQ5paujK^GgQ5w<2gMYK z&N*Ly2kZb)lz{|5(FUSHQ3s+y(FdYIQ3#?z(FmeJQ3;|!(FvyiodR0`idGOG6ty54 z6un@2UmsW=6wM$$D5^npwek&h4-f+s=O7vs?;si!_aGWq{2P!K{|pS1t=MG%HRO9e diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/St_Kitts b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/St_Kitts index 697cf5bcf7f151ffc1c1fc4247e4e9c7e3ff01a3..f4fe59034242c4416bc84f06f38530d625149329 100644 GIT binary patch delta 27 gcmbQj*u*$Nd13+!4fq{vEfq`SPx$zpt|NoDLFfjc8fBXOgi;r&zgJWfq{vEfq`SPx$zpt|NoDLFfjc8fBXOgi;r&zgJWfq{vEfq`SPx$zpt|NoDLFfjc8fBXOgi;r&zgJWfq{vEfq`SPx$zpt|NoDLFfjc8fBXOgi;r&zgJWz+p&Ja{N3ygr#pEjTvGm0a4AuO;c^+H zz?I;9hO42E1+FRFVYqI3RNw}~K8Bm3%LQ&eSitZ?T}R-hI6uSdXCDOKT)WKh_ShwX zcN0%DykGxr!iU1O3@nL~6POs8m|2(@p>VP)qbm={ZblHnz{oH`oE798wvGPMj6xtW Mm;{$|aEKWf0J@Mgwg3PC diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Tegucigalpa b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Tegucigalpa index 2adacb2e500e2f9621b2debc1756d308747b67f6..38036a32831d149c6c737dfa49f0947f066288b1 100644 GIT binary patch delta 28 ccmeyvc!+U=vH$}E0|O%zgV+;vCeBO-07!oX&j0`b delta 48 zcmX@a_=j@^-s@nHJ*`_wYCAR0m#L1cylqZJe F003i)5Y7Mq diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Thule b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Thule index 6f802f1c2acf9cc73481ae86c9e099fcfc28cf25..f38dc56bf20d9db68515ea7602c9edb39fabae8d 100644 GIT binary patch delta 40 tcmcb|eVloM@?-}l79K_h1_lsjU|?XFpvpmW(RKzCkr zg5GA00R1}K1cS+30fy<34~&Z51Q@$pKQIY87htL``@qa-Lx4Hk{|6S*XD(Pgd-%Ze z_qq#K#|}TRzCGcB&H4ukw!4ci*!3Suu%8`r!6AQ1f@4czfRle)f^$l6fQx=cf~$*Z zfa~X358QPFFSuW>dEm)we8F>b+yk$-q8Gg9R44dcGYasniB0g^CKBKuW1kQ(^;5YJ38RmqL&|Lu`zn>AALT<-}h$D|5ME;v~A!^Cd2hsOxF2uAf ze-OJb?m}Ej=Y#lp4i^%9mn9^&#|9+nb|fUH+XtlZW+kM$D+Z*#^+`xqXAVd|tCx_; z_B0@Ktw2K7v*Q8T({vu>oPT^Fw~X&W-uj~#@+&BcSZw=7b7~tbmGrQxhtG_yknVD^IAtp%+k77nxAILm;3o&N`uf`lkRU zMw-I^|M#~rF#P|2^#UWy|NqAiFmU+zhA=p~gfKV;hcJ+mNdEu-{~wf4KuHReSU@x= z!GLH`q5;vMgae{Mi3dc35)g<6B_a?FN=P6Yl$by?C_#Z}P@)3Spo9gYL5T}QgAy2s z1|>2O4N7Pr8kE>TG$_G=>1PigfM`&{1JR(w2ckg<5JZC#A&3SgL=X*1j3646AVD-J zQG#et!UWNv#0jE72^2(w5-ErVB~&o|c^23{P=W>VL5UVbgAy*7-W&&(2PI$-AC!ne zG$2nWjHYX?;_ZIP{srCL75LkgEAnP-ZvF256XxjJ}5JS xXi$a((V$ETqCpuGM1wLXh#v3^%HpabxC{dtU}Rum0AY~u1aV#v1;c)u{h2G6Ca-7rn{35lGr5UF0s!wQ2*v;a delta 1182 zcmey!HcN1Vcs&~f0|N*%FfcH5L)j7y3=9nYD%B58cYG+gr2M7eQo`>C4AcL8U~GT* zfT{e!2j+r*2`mYJ3s?glBycDkEZ`JalEB5VxPa?JTLSlk)&icJiyrVENH5^q+46vY zW%CDtnQ0FMJ5xUhReC%S&UF7E5~=k-)Kl|=m}NcB194664-!h636dOdKS(igCrEwb zDv*BoHbLg%n*!N`=M&^Mo-2@FxG_PYjNyY~#gzw?>U_XKGz%)d~31`{I)42_{aDb1WaQ|2(-~Js1GWAmJlo>SP&9=A|d4W z=YlZPRS98F`9DO+9eWUQRCZwOWDad5|oRGOzt|05#)r9P6Rv&WC ze|(TzCi5Y0{pAPwq5oVz6!dR>P-yz#Ls9+N3ydWAB#9;dO=lTK=0~FR^`YAuyLQt54 z_@HnH(V(yg(V*}L(V#d0(V%z$(V(~h(V+MM(V#d1(V%z%(V(~i(V+MN(V#d2(J8$3 z6<`N|A`2t{iZBojiZn2N)&?vOiaZb>6oDWb6p0`j6pwmqCs&CqKmUd4}lecA{!(Cif|AOigYl2?;zL#pvVXDK?wjvgAxIV1|JkXi&lc(by7)3P=K$IJjJcLrh&=LUeqM^^EikbbJjB^$hh4xB!V{Ra)Oipz6H)H-4k5&7c6jf$(`WF-?YG8#eahPkNFDqo-BqFJa05Acs&uG z;5}#a0-tMH6MSo?F7VstGr>Qmd_ll8y$OLfkqdSSN_ST6_({WKxukL-dl(<>9g zo?0nH$bA%uI4YwM`R}qo)RKP+(f76r#I!t6h}}0`ATH&QLj1f+fdt=s3liI>PDs){ zupl|Td_oHEq6Mk$krPtiw&X5ISGS&!el~4ECcEr}%(Wg1vY!2)kUcF`A?JdOKyI14 zLf-m+0{LN@3I+WS1PaZ#6^il?2^5RIRVeXaB2e<5b3vKKfeB^zUN5MSSTvzx-`NF~ zKUyYK&0D{q`bOG>n!1S#YIk@{sEaFJP(MR!!eoEuxXJm<=9AYl+wg!=90MbSoFL8% zN`xQ`5}3L%{0CD#hy@A`5Df|v5Df|z5Df|%5Df|*5Df|<5Df|@5Df|{5Df}0F#Sh% z0f+_#8<>7-r2wKq!3U;~%7FQxU>yC^gZQ8*0MVdm0Ml#hJ-`Y;@c|M5#R-T8 z#S4fA#SMrC#Se%E#Sw@G#S@4I#TAGK#TSSM#TkeO#T%IZ&j~gk6n`K-C=Nk1C?3JI z^}e%U1)vB834kIMM1vw0M1vw1M1vw2M1vw3M59Nv3P=zZ(Odz+Ar=8HAv(UsdPaH% NI=+U6dWL!iTmY*?f*Sw; diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Toronto b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Toronto index 6752c5b05285678b86aea170f0921fc5f5e57738..fe6be8ea8c97db1c1d99c4198f4b9b024e3aba4c 100644 GIT binary patch delta 72 zcmZ1`y_I)@xC{dtU}Rum0AY~u1aV#v1;cALOR{FLPF~2PH~AlP-Q=AtMw9z^B>)?E B3oifw delta 1537 zcmdnWyG(k5cs(lv0|N*%FfcH@gtA2%7#JAl?U-CJf7k1T1?_q#7S7t}uxJX~hsB{Q z9hS7kepsqek+3Yy{=;$}zXvPa6hEwZWAI>=%*ldPSA7#!|5;tIW~+X}+B>}k>!u1O ztlyJgu%S-(!Nxg(1)I{n5;oTu7i@9YN!S`ATCh#Mo-bj$_4k4uY#$PKstSMD`Rr1{ zZkDefcAtOuV9%55ANH=l@L=DOogeo1Z+dWG$?OjY^QSyG)KdH5uz%TuBPsD8j_OA| zIObbZaGc-j!3o{Cg3}!z3N9&sDY%sI`@!YXCm*gj+fwW6Ta(575vaBfAEvvrl9^8N92QF zKO#Q-eqsIK&kd^&e^1Ch__ssm!~f;~A23Y+_kpqf;RB}f2OpRV{w1&^{4HP&c#y#6 zaKC`v;7|gG!odPgfh7rC42ui6KC~rpKWHuBxw+^8?}79JzMU-(_*XW65SW?vK(I6Q zgHWZ%1K~{f4%0pLCQBq3rl)@}D*BaR?C$x&B%UN7KRfAx zL;j`$$Cmm8C;ur0&MAorF8XB!t}f0AuAf(YaMz80;C{L5gD0=!1JBJlAH3cwKk%N@ zS>SWcA;GsMyTEUoQi6YsZ$ZE`mV`hX{eqyaeGJ*vmp(heTet#|qGhLMs_LToa zgxs+Q5l23Li2S$WLDZ7VAENJdJ&0-9`XP2-&V#s==^x_f`8`PR-BOU)o}G}SJFOr& z-8UhHx1u1`T|Xi9ZB#+Jx?n>3S(}1Pw$BNfYvl^Eo?T7Io@VtS=lsV9xn(jR^44E| zkRST*LqY%62M&d%4?Yy-Pk&G>dgw!mf8~RcfA02J~dJ}C4- zG$;l@G$X;G$>|3G$?jJG$@8ZbP8{M1=s`MJb2|MJtE~MJ2h;Zsf*k;gdJrEJ{U92Y1VA(>8GvX|QUKAQfq{vEfq`SPx$zpt|NoDLFfjc8fBXOgi;r&zgJWjwux(kxC{dtU}Rum0AY~u1aV#v1;dS-omd1|SeY1^m{}$pGS^K0!DS@D6%ZU^ Y5#SP{<7=#Eq-UVxYiOuvsAs?h0P%ng1^@s6 delta 1401 zcmdnQbw+H0cs(lv0|N*%FfcIegR(^$7#JAl?by3u{%+9;r#qzXo58G)OkTNQ3TSSN7n-^B&D4@?lab8qv4yDQgBxVLZW zg8Q9)6CTVfU+^%qV8Wxi$OVr*gC;zQvtIC2(`3Rk_xcEh=R$!3FVw9RUVJhZc*QQG z@amGN!0TuK6y9w7F7Wo)1BG`JZwkC$|7XF6!rcNN`|mCIRDW>7=llZ;zQiw{@YR3O zf^YV%6Ta)WEcl_ZNZ==b+JavkEdsxOG%NgmktXoxMykT!6CMKpcDO72U!f(yFhf&; zv4cl|se)U9xlm&QOMRmH0@gsT32cs>3)l_bOyE#>y?|5T+ypL$vkSOBY?#3PVEqD~ zn`Z@h4@_LZw{yJ!|H^d=0y8HH2zE|T5UMN|5Y8-85Qz*G5cLdE5VJHF5Z5$QkWdPq zAjv7AAjM=lLF$vq0_jKM6J#!lEs#C6Hm#PpuRpRRj2eCjw1*R`=RRGbTAOq8z zr-S*Rpabzi!3Uy2K?tHj!3d&3K?$Nk!3m;4K?wuvfq{vEfq`SPx$zpt|NoDLFfjc8fBXOgi;r&zgJW6iTcvKpy&Z%kU-4F@E1%lwGto^gjx`f%Qra0oC^R@Rivx{ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Winnipeg b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Winnipeg index ac40299f6b27043e8f2454ac594b0ec184c1a237..7e646d18e18851bfde743b379e52df4ec5b5a20f 100644 GIT binary patch delta 110 zcmdlY*2gtLT!sM+FfuSOfG|jSg18`vg5g>Q1_sv6PAqSjIhh#2keOxjL@xWu3%Cp> k8!)p@zQ83X?Bg54;Or8@;2a#n;2a*p;2aP#S(;lC0GD+T0RR91 delta 1669 zcmeC<+9EbVyq=wbfdPaW7#J9KLD?b=3=9mj8Gk>ReRx;Eyd4W0=I{DhaA<*b!(soH z52ri+HC$5uQgA7e^TXwi42CPg2_LS8US+tZaQ4G>)9nm57}kHdDLRwk=7WhJZZohm z+&&TW;m*D34R=>gD7d$;vf+MbQNe?G(G3qXLkb?%)!Q~a_B1Pa5+~pAR8ykhnY#_c zb0L!tFVy82UVIY!@QR&*;nl?-A6`Fu#PH_Ykq>W=9btGkanFa(`AZtU7$$xA$?w(h zi=&L;*N=3D-!CE<{@n0n_N;olBzhW{&M7#L>oGBCFPV_+(O&%j(L)xeU--M|{~ zr-9AkZ3DZ(y#|hYh4T%Z0tXtn7&bO=eOT1M{a|tf&&~Y|ya!4f_;xO2;9oh3L11Px zgJ5R~gHUBEgK%aTgGi)1gQ%wkgP5fzgSe&?gM^Z6gCxfv1}P@>2B}XH4bqP|8)Pp2 zYLGqnxP2I>Vr1dYM7hYaK(qn&?&rb*%{u>i;e_ zXmS-XXx`i0p!F(*L3`iS2A#_V4Z8En8}v2@HR#txHW*AcX)sJLV=yWfYcO_?U@!^# z(O{}>#b9Q1tHGRIhQUJmJA=iue+-ttZ!%aNd%$3QdpCp4`acb}yXP|4_1|l-pIy)3 zkbj`Tv1N9HlmDUy=aky|1{eL723MEB0@u&m8QgVqKe%6>$>7QB|G{%}HG|h%!w=qb zrZ@Op^DFSJsci7uW>DZC6WtInO{gHy#1}^53=(QA-{%MBkh7A*SUBL+rk)4{<5W7~*t)ODx#)irt83k4I zCO1^y@G7XOD{ZLVp;J&77v50MJcF-bvO9}b04p1H;p9LT2e1GCm%L$M`2TRtKnzeEf@n}Yf@n}&f@n~Df@n~jf@n~@f@o0Of@o0u zf@n}2gJ@7ZgJ@7(gJ@8EgXuqv^`NqX0Tl5d0Z`xhBq4xUpu_;8K?wpx zgAxUZ1|nVgu2j1P7vv z>qReuXmH8{F+iygM1xWwn7(%&>;OSQwd@Stc`bNKY2vV3{n#VKBLq h!%vFK(K|TA($U)`M90@y&q&We$JfwM&rr{R3jj+A4sQSe delta 1378 zcmdnQ-Y7Idyq=wbfdPaW7#JA(p=`MZ1_p-Hof;c1DSs)rlxU*xZ%3%X{}mPr3^U9P z7(1jCm?|U?vFlhtj ztQQI@rhg4oy-q2piQYF**IJ{X{_pn&O|Cu#&3kt@XuT>>(B8LygU;oi1-kPVZqVDD zw?MzHd4oay!#vtZ!deu-Txt!FKmf1-l6x8|-J#R&dCFwZXAv`vNEbGaH;!W-f5iU$?>4rFwzu z=Z6OFx-%5qFCRAWurpJ_nd)B^vQ)(rvEY!(FC zq;Ci+lUoohDLHxXSg#_O>8xq?WFG$iow;?&bbwLX6h7GCi=?hZdPTG*J?ztfSY{`a9 zcI^e3Yr{5VJ?CAJJ*~LjAm@UXLT*{8LEZ))h5RscgM$8d3Wa8p21WT76pBTE876wC+3EQk+^T@Ve5VGs?9 zWe^RDXb=sGY!D5Ka1afObPx@Scn}SWd=L#v0ATu$cKrqr1C$cL^ivP8g`gAx;)7BJ zhz6w$5DiKlAR3fHKr|?ofM`%k0nwn;0-`}F21J8W4TuJ%91smkJs=vCfqONfrIv7V8hfsU`Cp`M|h0T%$>Y>Mju diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Yellowknife b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Yellowknife index e6afa390e879f97cef351e382ae62daf183e8d77..c779cef92c8a166f597be7ab3e1078b6699d84fb 100644 GIT binary patch delta 95 zcmZ3-f0K2BxC{dtU}Rum0AY~u1aV#v1;e(Re=~hxWMyV#VrH4F$Ye3OkI7bo%Qra0 Y+}9;U$JbcTNY6mW*U(VUP|tu101%iBkpKVy delta 1116 zcmcb~x{iN>cs&~f0|N*%FfcGwLD`b~v?Lf#ck)cQr2M7eQlbRIcm1e>9~!M6gfmkF zL?Yc8L_OUE#4I%##5FYpB$QkmBssYRq?ptjq&}%lkbcD3AajXhg6zT94RRY_O^{!B zwn3pxRzR_FeS=cye*xvJGYl%G4+T`c)-kAw)*lv7*P6hf{_p+-O|Bva&3gwYXuS$y z(B8Lrg3jfF2HknB6ZAF*HR#u+PcWEl(qNe0B4AW3)?n%Q4i2Qey zA!^A7f#`e78Dd&43B>N}WQa@IA`m|>n<2sX!i2>3_J;Z--Axmc(=!`Vc&AKAb@y&a zeOopmU0t^!{cOa9Om_Z;%(Ye%vYvfx$etE1kaK~LA-Bv@AaDH#hWs#Tfr9=^427nD z1&Z>wFcgd47bx+c#!&L__k=QwO$}xD?oOzXn9@+OZ~uhKA7u?y^A=91z7f$-Q`bD9 zc866%U0mvf`WZ584a|&8%q)`wm`o-oFsV#VV3M8O!eqvp8 zB2^p1KQPvVSfJnn)0dYEfM`&#f$7biU_L1LKzvXTf@n}Mf@n}sf@n~1f@n~Xf@n~% zf@o0Cf@o0if@n|>gJ@7NgXur~^%Fo0P>0gW>^1 zgW>{2gW>~3gW?24gW?55gW?86gW?B7gQ5sTgQ5vUr|{NK0XqN`UmyWcoPlUiyn*Sn z5ny>x{DJtOI0Vt4cm&a)xCGIl_yp0QI0ez5cm>g*xCPOm_yy6RI0n(6cm~nM^`iH| zJ_bcNNB|V+AQ}|$VEW!&umeB|0K^9+0uT*K2p}4i7(g^AL4asbq5#pLgaM*Ki33E} d&yazn4`x;rI60n46*;+Z!;=dG!{h@@k^q$pMArZS diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Casey b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Casey index f100f47461ac8e48a4df03bea0429e464b30a22e..30315cc07893d4da19ffd04a655084908c369d29 100644 GIT binary patch literal 243 zcmWHE%1kq2AP5*47#Khpq>u$5bfQ6>H~=O zTR8{J_jf)!0mP5svIeV*TEZ^?;z#ckaRAXVy|Q5O*lDf?Abwo(Q4qxtU$MZ3kqH68 pf(#4{1q}==3=Fe2FmUJ^7%*rXSTJZC8ZvO%Xd4>Z=^7ex0RV6FAlLu^ literal 297 zcmWHE%1kq2zyK@^3=AL)lHh={dH%_rY4Ezmrr_Ow>Vx0PIST&HXD38(SvN#2;TNd? z|NlQD6C)Ed6C)!?69^YHfXtY+fq{d80mRldFksL&uwc+OGz3Y5)G?A`|NsC0|AX8B p(hPD3hz7X@M1$M|qCsu~(I9t$Xpq}LG`a5Mve7oMu+z2R0sxzeGD!dc diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Davis b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Davis index 916f2c25926bf444b7c366110a29a3fafb17fbc0..3ec32224f2982db46a19d1a159f9017286fd1413 100644 GIT binary patch delta 105 zcmZ3z=GB7eRGQm_aBo#2QFfh0U cFmUJ^7%*rXm@{Y_m@;tLXd9T@>6&u^0JH-MO8@`> literal 297 zcmWHE%1kq2zyK@^3=AL)lHh={d7jU4VEE>KU*MnnY6h=cA_m^me>wQATxHmf diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/DumontDUrville b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/DumontDUrville index a71b39c0046b02c20e17d33d333e5af0b01eced2..c0cfc85a29e833d02896066e54126317826ed90f 100644 GIT binary patch delta 46 zcmX@aID>J5^27ob9!3TR1`uXoU|^V_%*Z^kLV<~qVWPb#7nhB;p@E&Qp#c{F!gdFp literal 194 zcmWHE%1kq2zzbLy7#Nrs7#KLN>?v!wXOfWc+=i*4{{R2~j0}v7Fr7UM7+7=-3>dTx m4H!r<^Z)<<|3T)0Xpq?;8e~4mTzqzL*=QRY*y$P?Z~*}EiYTD~ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Macquarie b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Macquarie index 616afd9c83d7992f86477f866926d61d2f65c25b..232717b613f1a8df7ffa4b6f1a755cecb28016dd 100644 GIT binary patch delta 209 zcmeyseSv*~^yC00HW21vWME(bVFm^U28b{>14A?e0|PSy0|VdYbfzmz^}f?R7#Nut zL70h=`VeF_2=^>tU}0dGwSkdS*T8_m(KR@P!O_(vgh7rA#MU)50P%Eu4Gr`R^$c`; KO+b{sF&6;C9u`~x delta 762 zcmcb>{(*afbUix*1jH~fFo4)X4Gatnv#(Y(%-N&xVL|(rgzG#R48ITcGW^+8$ME-f zB*VY54GsU7TQe|(O=@6lmt|nGU(di?VA;UJE5pDVAl<@W z%?x4|9t`5l{tOa|DGd^j4H={u-5R8pCpSnx)M$`tcWsb8$kia1uHGO&eG`L1WL<+| z!?^|}r`Zh3nXegClxi7NJ;_6GeDI|hT?%m%~Qs0O33HU?u`n+6lJ3W^G{Pgo%LJDsTw~K3xL?21nQ65C%tAmk llgY;TD@^quAAm#$$P;D^FdxBuhsP6KHrj@UcDja!TmUfGtyTa4 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Mawson b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Mawson index b32e7fd6c6a3faddaa98dec06b88dcca3574486f..05e4c6c5867330a5af95cd6816ade311a0cac82d 100644 GIT binary patch delta 34 ncmX@kID>J5^27ob9!3TR1`uXoU|^V_%*ZscR)Udn;(QGNbQK0( delta 74 zcmbQic${&9vN$sX0|N;2JW?=f@VcesQ2+n`e@3Q>1@aS=l|d39%=7>M|NkHb3=9km LAVnY=rceU_8CMqF diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/McMurdo b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/McMurdo index 6575fdce31183d8238b18f2f30ab5b9227c7071c..afb3929318475d4f0ea9d6c9e94d0f5f81d8b82e 100644 GIT binary patch delta 71 zcmZn_p3E^pdh!Hj_Q?~NS$P;47#Kj9fq{VmBFx5+z`(%3ws{FN3o{cF0Y VlMgVtOtxTFnViHdJUN3?769pY4f+58 delta 1254 zcmbQt(JDMax}Kc@0_HF|OWm#lFL*9_;VC@#4VZH4hHv z?Rs&jx$nVYzd0|CBo{n5s#o{om``uQalV8XCv@@?PJFMg&A4=HmIJ56-v^v)mOkKm zzchh+-k%3NHx54Ft-JStZ^z;X{BZ{!2+U}GAZWMfflx*I17W$A2O<%k4@CZ@JrJ|d zejxU|IYC0vBSGSLYJwD_R)W-W_XO#OJP9)GnhCN8-X+MTb0^3zxR9XW_BKJWVN-&V z0p|nd%ySP^_+LLzt=D5rP-Aj>pw9a^LH&`+1C6&w6EqL8J;(O+=LrV6z6pk2ClidqG9MUgtxhm8^L}8;)tg`@ru)F`^U4S2-}oO`T<(5g zdG+H1tIfF&toQRJ*i80+U_0+af?cuU1N*v52@WxS3661F5}a%d66&4prX{$@2qn16 zRV29n{*vJKFDk+Pd+P&_do~H4*V7+(?UPIJ-tPIpXC6a>?{w`4ezlJh{L6VC1f>0Y z5SXBq5ajmYL9hc)LWtU-2ch!s62jP)JP7-LAtC%(+k=Svn-U_AWju)5KP4f0eQQF@ ziVY89`_mKRIwn1c&-YA7$SA3Qkm#?SkmM2eAX%R`Aw|RDK`P(-gfzj>gtQ;r57IxH zCuCfI`ylh8WJ1>V^AEB&{7%T3zVSisgu4lO<&z)e7wk_cNZ6227GN+st%C}RjqDEry?p!|VFLdDJG2bBk;5~_B(KB!)4_Mm1_QbKK~#DlsfHkX9@ zj9(8X$1}??vQ2Jawx8V3Y%sZ>Szz*hW|hfznI%DKl7W$tVS+R-n90Dv08XkKqgj~i zK}i=BSRfh{U?3V4XdoICa3C5Kcpw@SfFK$ah#(pikRTcqm>?PypdcC)s2~~?upk-~ zxF8x7z#tkF$RIk5ZAtwDFysG)1P~1haS#m(br1~-c@PZ>eGm6fqz^C~`nFD1tyVD3U;QDqsD3u*IO*0ttX(3`B!s4Mc-t4n%`u z4@84v5JZDw5k!Mx5=4Vy6GVez6hwn!6-0w#7DR($7es?%7(|0&8AO*PE0lm80E%vq z04U1A^v_1H4?s~5;)9|eM1zt5hz2DC5DiKSAR3e$Kr|>xfatm=7qGebQ-%siDI+5T hmtRzHh_0cLUzAITj<2Pjsh)w3uZfJ)Acuc*Ob!0`m^iR6_S(RqlD|OQV9y2#w%7v_7sED4KC?d{wb5dO^!XSE znTb*xWY^m{$QAtAAm6Xxpis|jpqS6(pk(>mK-sVUiGzydT?17Mh6AcU_Zz5v`f))0 z=0XFF??(=39@@J>>-w?-+Kc9I(AnN`K)0!JgWmM41NuqH8w?uS9SogZHy9;kIvCqt zH!yMVb};33F)-uZ;b6{ob%O;1zk|hT4g<@V+6Sywy)v*q$$P-2>x_ZziuVWXvep^c zcU(N+5PWKbV|~Wv15UVkTx53qLlY{H$f(`D1QykpiGZ}b%EOYSOlW*X4 zF~Y%n2g3%RjaCl6$Jh=00-6r^&sn!2!0G0Jz?umgg0#Om1jiI@2;sir5N`g=AbkCs z0};+`8|wf6|Ifq-gDlJ}jI3u|BQ?f_5c50y}-btYhb{jYhcVkib){-Ak#oJ OZWFm|bPbH{jJW_4P!+@g diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/South_Pole b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/South_Pole index 6575fdce31183d8238b18f2f30ab5b9227c7071c..afb3929318475d4f0ea9d6c9e94d0f5f81d8b82e 100644 GIT binary patch delta 71 zcmZn_p3E^pdh!Hj_Q?~NS$P;47#Kj9fq{VmBFx5+z`(%3ws{FN3o{cF0Y VlMgVtOtxTFnViHdJUN3?769pY4f+58 delta 1254 zcmbQt(JDMax}Kc@0_HF|OWm#lFL*9_;VC@#4VZH4hHv z?Rs&jx$nVYzd0|CBo{n5s#o{om``uQalV8XCv@@?PJFMg&A4=HmIJ56-v^v)mOkKm zzchh+-k%3NHx54Ft-JStZ^z;X{BZ{!2+U}GAZWMfflx*I17W$A2O<%k4@CZ@JrJ|d zejxU|IYC0vBSGSLYJwD_R)W-W_XO#OJP9)GnhCN8-X+MTb0^3zxR9XW_BKJWVN-&V z0p|nd%ySP^_+LLzt=D5rP-Aj>pw9a^LH&`+1C6&w6EqL8J;(O+=LrV6z6pk2ClidqG9MUgtxhm8^L}8;)tg`@ru)F`^U4S2-}oO`T<(5g zdG+H1tIfF&toQRJ*i80+U_0+af?cuU1N*v52@WxS3661F5}a%d66&4prX{$@2qn16 zRV29n{*vJKFDk+Pd+P&_do~H4*V7+(?UPIJ-tPIpXC6a>?{w`4ezlJh{L6VC1f>0Y z5SXBq5ajmYL9hc)LWtU-2ch!s62jP)JP7-LAtC%(+k=Svn-U_AWju)5KP4f0eQQF@ ziVY89`_mKRIwn1c&-YA7$SA3Qkm#?SkmM2eAX%R`Aw|RDK`P(-gfzj>gtQ;r57IxH zCuCfI`ylh8WJ1>V^AEB&{7%T3zVSisgu4lO<&z)e7wk_cNZ6227GN+st%C}RjqDEry?p!|VFLdDJG2bBk;5~_B(KB!)4_Mm1_QbKK~#DlsfHkX9@ zj9(8X$1}??vQ2Jawx8V3Y%sZ>Szz*hW|hfznI%DKl7W$tVS+R-n90Dv08XkKqgj~i zK}i=BSRfh{U?3V4XdoICa3C5Kcpw@SfFK$ah#(pikRTcqm>?PypdcC)s2~~?upk-~ zxF8x7z#tkF$RIk5ZAtwDFysG)1P~1haS#m(br1~-c@PZ>eGm6fqz^C~`nFD1tyVD3U;QDqsD3u*IO*0ttX(3`B!s4Mc-t4n%`u z4@84v5JZDw5k!Mx5=4Vy6GVez6hwn!6-0w#7DR($7es?%7(|0&8AO*PE0lm80E%vq z04U1A^v_1H4?s~5;)9|eM1zt5hz2DC5DiKSAR3e$Kr|>xfatm=7qGebQ-%siDI+5T hmtRzHh_0cLUzAITj<2Pjsh)w3uZfu~XFlZYXGmv7^|NsC0gG>XN QgWE(d8*Kw)J6&Tg09NuAy#N3J diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Troll b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Troll index 5e565da2f6b138b70179cb7e72347163ab44b6ab..4e31affb50e350376824492ff086867df62ae130 100644 GIT binary patch literal 177 zcmWHE%1kq2AP5*47#Khpq>uyzU^1!O4wv0u#&-1{noL7O*gf vu7LrAwt*3Ywt)cymyNc8ft`Vkwtff^t$P1e@nf z2=Q^B5Gw9BAxuYeLfChM2@#@h0uk4RCPaSK5Qy6LWkU2-E`gW@f&#Hy-U!6ie-?9P|hq`#OxA>(h+gv=9_6SD4x zOvqjlJt5~>YGxjqP`hsKgu2Ql6YBfwC)EG{|DTzWiBiY} z3SbbHQDB6GHwTEvz@ckkz@Tkl#Gq|pz`(%B2*#wu7047&e1T~<)(IdQ6mK9J6n7vR z6n`KZ6o()h6pvu~-7^6Y4T?`NeeML94~kb19~8GB8Wg`E8WhJM8WhhU8Wh(c8Wi6k z8WiUs8Wis!8Wi^+8WjH^8k7b=G$F)+$_kz*`h!08=AR3e|Kr|?AfM`(q0MVc{ z0-{0b1Vn?<3Wx@!7Z43fGawq2Za_3B?SN=d`T^0PGz6kS=?FxF(h`UUr6(}`VmjD8 zpmYV|gVGj=2Bj|$4N7Am8kEjJG$^fsXi$0s(V#R3qCx2nM1#^Ehz6xU5DiL$AR3eo zK{O~Wf@n~B1k)cLfx{n^EO&G3Sab~x7_<${7)UYc|NsC0L8gJs Q!EGX!jkbZAovs-d0J;qrF#rGn diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Arctic/Longyearbyen b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Arctic/Longyearbyen index 15a34c3cedb7c9ca519c195f5ec0ce9d8d1885a5..dfc509570a5be7ea90f64610ad5ca5a58fa3d172 100644 GIT binary patch delta 133 zcmdlYxP*0rxC{dtU}Rum0AY~u1aUzS1;bVh3=GVhqnNKSIxsPk3mF)=L>L$*7jj5W Ip1~ml06Gi^Hvj+t literal 2228 zcmWHE%1kq2zyRzF3=AL)lIVr9c^eoQ7-p+KW|)1YI^o22--I*Iy#>y$6rXTzk+Z=0 zNhSgpnp6cY7KsU5N@5pyyxYvk83vaA|_DuZw_)@vjM@%C9Gg3E!C@&U|))_~(5SBp$Dy zAbEMg1gXOlCrIzvDIgV&}%t8LBC|r1cQ{d z6AWW-3K$h_5iqvhEnpHfO~6!ku7H_Qg@D=LdI1aRDHAO2CJI>oE}LMr*IB^&cEkjm zW$_bicUw)cYjd1nKU-#kLz?mg#}-QgCpXp!&MDFYE~?KbxH|t8aAQ3=!Cm>jfcv{= z0-nqV1w7B45b%1uSipPTDgmD}`zQGJ^$7T_SvbKzFHaz#r+GqPc-MrWoYV=y<~b8W zeB395iu+9n)6tv|_T6AYgs7W9#C4$wkzX|gqPBgR5Pg+PAZCG}K&ci z6G(`^Dv((FYC@9zc7f#BGZRweX9}d+uA7j?v2{Ya?1TyFFQ!k(_**m~^F-x@th*r- zvR6b;$T?OhklSH9A#Yi*Kz@e&gn~9xfxPfoM=}0@0ux1)@Q@3Pgi)7KjGrE)WgMVIUfm z%Rn?Jr-5itZUfPv90#I7xei2wavq2VAgP$>bTK_vx< z29*|I`ft4ehz6A!VES$%m=7vFKzvXM0-`~s2#5xiBp@18nt*6fi2|ZQr3#1!l`J3{ zRJwp@PzeK~L8T0c29-1*8dTbVXi$j*qCuq&n11&RY(J><0r5d45QqkqLLeGc5`kz? zX#}D{B@&1Rl}aEQR5F2RQ0WAsK_wK329;7E8dOq&Xi#YdqCq7Vhz6BfVEVfOI6gq7 z7l;ok!9X;q6a&$qk_<$HN;41*D$zhRs8j>dppp$lgGx6L4JzS4G^msV(V&tJM1x8@ z5DhBvKs2b-1JR(84@84XKQR4bI@mp+QV_%km4qM~R2qV4P>BelL8T&y29=B;8dN%h zXiy0WqCur3hz6CEAR1I!f@n~Q38F!zCWr==oFE!hdV=W>kHGN(Dn&tjP)Q1+L8U2( z29>BF8dR!+Xi&)tqCurAhz6CgAbNO~vRuxtA-aa3B3Q@QSkF|?K*!h607UB>a{&O$ Cb5tGx diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Aden b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Aden index 2aea25f8c210369e0b805d0dd5f0e899190c2340..01c47ccb86ccbde2bf9ad0803298e8df87178a34 100644 GIT binary patch delta 45 wcmZ3=*vdFTd13+!4CrM^VDa${VbC@(W+26+|NsC0 U2bl&k1GkA>HrfWpcDlw~0P?IEKL7v# diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Almaty b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Almaty index a4b00779005803d665d613e326bb77d86f45ebd8..3ec4fc89fe99d5ec414ca8f12909802b6133a595 100644 GIT binary patch delta 136 zcmaFL{*YyYv;+eZU}Rum0AY~O1ZiFn1;WM*3=FKB*D=mvG-hOG!U9>a3qzDnHei&I gX5{hl4PnqWFlEp-FlW#3D)0Pn*KVgLXD delta 502 zcmaFJ@|1mobUhaX1eh=|Fo4(st0b%MY+d}`KvcbUftbW50dbCv3gSPXPLO!{WP#*u zNdc)dnG2-%lpT;+lYT&UPQ(GZ9?t{vHC6`{agB{^5H$8Z2j+miuU^hs?rY* zsBvFBpw9BwLH)}+2aP9h12ik9254Tn;GlKnpo8|7`b`cxOBOrmPMPAM*V5{sUsC2^ zkdp3T7(3~JQBm#zW80DgCPDrOOl89km>C%!F#Bt9z(U&3!Q!se0n6V84pw{q9I(DE zb914B{)BL@RRNCG1d1A|)t0}Dcgfyc);ghAWDltJ6ToI%^b3>=V*U@$?N7ZjKv k5pck6jGn`21L6^M5W)?}EUDe*gdg diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Amman b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Amman index c9e8707912d45ec0f9eaf56d46877fe9289d4a11..1bd09fef27c9f005bbd84e8262a56a3f2a72364f 100644 GIT binary patch delta 104 zcmdnXH<@jMv;+eZU}Rum0AY~O1ZiFn1;TC&3=GVh&oY@XO>Sh9nk>L11jQWk3=E1J fKuWX>7+Dw?WE2=UeSAY0TwQ}fLQ zf53CA^aAfmjBN?#Rg)9UUoCoI@u=p3<>mbe zR)^vqSZ`jKV6%8qg6-ty1iR*v1p68O2@c6&366Q+9ys|FJ#e;3e&C`L^1#(m|A8Bi z*#mb)!3XYdBp!Hj=_Poc{`J7?l|X{`>N^j7PJT-8o$@omZ{?K)|B~AYL7U?Of=%Wp zgamDQ5GvA`5N0&(LD=894Os`r#0SxrY#zkSb$$@LN$x>ht?GmL z+13dOvFr~Lt7Q|C+*A^hqy8tPsIeuaT0KliV||g3E_FB|{pqQMOy>I!GLNoF$a;M6 zLH5$Vgq*{RALRC}dXTrc^+A4K&x3;I^aq80c@K(`Js%Y71w1J6NlPf@GkQ>_%#2{j!VH2C zHX6x<#s{m%C&s{_xB-;7v2W1Qp4ayuK8k9jmG$@mRXi!E0(V)x%qCpu3M1wL7hz4aG5Dm&a zAR3f`Kr|>5foM=h0@0w%1g2jtdH|w9nF>UMG8TviWiAj6%3vTGl*vFeD5HUBP-X+s zpbQ71L75IjgEAh724y}F4a$HZ8k7k^G$+OkaX~aF^MYtl1_sffObnty85vCfoeQ=Pl%YX< zP^Jdapo|ToL75vwgEBaX24!*(4a(>s8kE^VG$_M^Xi%mH(V&bEqCuG-M1u+d5Dh8> zKs2Zz0MVer07Qcd1Tg*dR04Pyqv?L4^#6 z1{E|Q8dTVTXi$LzqCtfYh#oQp50|TJh^`T+Fw*fg)-%;J(Kj;D@ijEiGu1QIH{=2U DkQ&r- diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Anadyr b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Anadyr index 6ed8b7cb07634b9d669c6c36448fb8df0fdb32a3..551884d322bcd2201b4b9898ec765141277e6eee 100644 GIT binary patch delta 154 zcmZ3&`J8ov^yCMOY#_|T$iTn=!VC-y3=m;<1_lQP1_t)cpBY)092l9Im{}OnAuAh( z5V{f&pOuYqav`IV8Y2q>!>kPq0zSSW4BCc94BCb!4BCdq4BCc<3|uzahDLU}hDKZf D`EL=< delta 577 zcmaFPx`cCrbUhaX1UNDs1LV+Orc>rF#<8 zxN8&CSynty|1$G|#*-NzG%FlFXkMv)pmikYf%caA*atdG{2u5|v45b~V(>t}MDc+^ ziqHeYSi1zHBFO|}TZIIZz~2d`vP=nPhIbRp{ya&rkox(+;?A)I%U`!2SnXMnV0~-v z1DmBs9@y@h|G=(w*#rAojSn1BJ03VT&r5J}&3fRR+>qd+>hr+WIVr)7RquhjvP**d zJMRQfX0-&*h;zCLUXM8vyw~w3_?$8N;M@DZp#J~=|BTE`%q)y7j4Z5dNRXWaiGwVG z%4X+aWt}{qNy&nNg@Iw)1x6kQh7|`GSr`~*ZD0@pu^Cu=d_x$t4UHJI4NVxd4UHMJ s4Gkgjzz6~pqv;+eZU}Rum0AY~OjTjgh*fy_ZoWf|t$i&RTgbrC5AwrC- nn2>3*Hlva>BZrS~2!pnP34^wQDTB6w83UJ%wt=agt|=D)9FPms delta 484 zcmcb|a-DsGbUhaX1Q;_gFo4(st0bp9*t+zp70CuH69lfax5<>#%Nto@{zuvY{PRwMf>jsRq1yZ)VS|o zP-o>1Q2+8LK;y~p1kH-Y37S{#1!x^PAE3SEK!DDY`i%j)Qx*m2wM-7sFPW5JkkXuB z7`yI)QBmguW7`Q2OoFl>n93GCFf;OfVD>lUfrWHdg2i342bRBm60G)0Jg~m4mteEZ zG{JVaK!RPHc!K?`PYDjGKNB2V_#V{%|NozniJ66og^7ig4GFSyKsX%i9PC0M0vWTi zPF7@6GGX9gU3J+0HDQq6aWAK diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Aqtobe b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Aqtobe index 06f0a13a662aacfa70c489d2fec5276362576089..62c5840a83e29b4fcedba95e438581cec96b3cf6 100644 GIT binary patch delta 136 zcmey&{+wlkv;+eZU}Rum0AY~O1ZiFn1;WM*3=C|Ww=&LQG-hOCW?^PRhpdbkLI@?3 j4H%WA8997>Lm0FTOc=BcOc}Hd%owJ zq?862#xA&ER8)Pz*tY3{Nl@$sQ`wXYW=8fG%>KGvu#k=ku(+#n!Sc6VfYn~E3)Z(4 z0&JG42iWdr3b1SA46vW|B)}o{b%0|F!-e|)|Nk>GF|#l;F*7l#@*UCyW^7#0M bFlZZ?FlZZ?F=!i@GH}^w8<^VZnsNaEB_ay^ literal 619 zcmWHE%1kq2zzR5_qEZYD3?R0^D#>1#t&9IUh^lvQ5R*8dAkMMhK>X+D1rjemZIHaJ zt{`=$e1r6!mJ2d#N-xOHNxLA|6MjLy#^ZuQj^zc#7_AFRKGGMIZFnxIX#c&SD*f() z8u$GR>a5%W>R|BTE`5Xi!c1lib`nHd<&_JCYv;lRMczz~wa z$icwi7Qny*BVi(pJPZsFH6U3Z-w+0E0}}>q12YC~15=Oz42+D7j0~iB{{R2~|3Lu& zqCtTGG6fV6AQ}`HAQ}`PVEX6h1t1y}Fd!NfI3OAnKp+|vNFW*%P#_u?PypdcC)s9^fbp8yaI3S1Bk3SbaT*Ffg7 M(Kax((>3J+07)EwHvj+t diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ashkhabad b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ashkhabad index 73891af1ee95a4d5d602967fd5a965c8a7ec1327..8482167269080ead3a6046ae5e64b56d48dac1dd 100644 GIT binary patch delta 107 zcmaFO@||gdv;+eZU}Rum0AY~O1ZiFn1;UaH3=FK3RT#@*UCyW^7#0M bFlZZ?FlZZ?F=!i@GH}^w8<^VZnsNaEB_ay^ literal 619 zcmWHE%1kq2zzR5_qEZYD3?R0^D#>1#t&9IUh^lvQ5R*8dAkMMhK>X+D1rjemZIHaJ zt{`=$e1r6!mJ2d#N-xOHNxLA|6MjLy#^ZuQj^zc#7_AFRKGGMIZFnxIX#c&SD*f() z8u$GR>a5%W>R|BTE`5Xi!c1lib`nHd<&_JCYv;lRMczz~wa z$icwi7Qny*BVi(pJPZsFH6U3Z-w+0E0}}>q12YC~15=Oz42+D7j0~iB{{R2~|3Lu& zqCtTGG6fV6AQ}`HAQ}`PVEX6h1t1y}Fd!NfI3OAnKp+|vNFW*%P#_u?PypdcC)s9^fbp8yaI3S1Bk3SbaT*Ffg7 M(Kax((>3J+07)EwHvj+t diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Atyrau b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Atyrau index 8b5153e0545f550c6f9b0da9ce134a8a7a4ebe36..cb2c82f657c7380462b3ea38d5e58cc3d692e0b2 100644 GIT binary patch delta 145 zcmcc5{(@zKv;+eZU}Rum0AY~O1ZiFn1;R!Q3=Hg>*D_9FG-708W?@2ytZZmPtZZ<| vG`WUZNtKa1MAy*2{y}2 z6Kr=2B-piyC)m&Wl;Dv1Gr_Ti??L_l|Nj}8m|2)um{?fZkRUq;f+GZGvU9*8E9+!M zCM6374hDvh1V$bP2Dbo44h9Ab2L=HUn}Nf}H-tgkz?ebXz?4DTz>GoLzyuP4j36*U lnimv`AQ5ngZj7G7Xbs{K`z*X|G3 delta 464 zcmeyya-DsGbUhmb1eh~0Fo4(s4Gatn^9*brh#O=Ci2ve0An{^vfaGmw2dOiYFG%k_ z;UKg2c!2Djk_U1?VA{EmM>XWNSnF1m*rT;*9A-1xpRxHDKZ)c^ngpOJ|f0$Erg&<;Wo zAXyj~G?#$FNpk@M3j>3e0RsmEgM|Yl&*VTR8BnM(FfvY%<^{7D7#P4|xiNYRV>n0; cR(lCp2yq==YxzNDGct17Xd4*Y=^AqZ0BoFV;{X5v diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Bahrain b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Bahrain index 63188b269d077e29f48a42a03c2a52aefdb61320..7409d74983c8d0cd8347a663c3bfbc1c041124da 100644 GIT binary patch delta 34 ncmX@kID>J5^27ob9!3TR1`uXoU|^V_%*ZscR)Udn;(QGNbQK0( delta 74 zcmbQic${&9vN$sX0|N;2Ec`UrfTe5Ff%^ad|1&a8ERdg|tPGL>VV?j0|NjRmU|?Wi L04V~|FohZbWPupz diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Baku b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Baku index a0de74b958e42ade6f93ec0c4bc06ae714d5c606..96203d7a4266cd8646032165950374761090e318 100644 GIT binary patch delta 114 zcmX@j`GR$VxC{dtU}Rum0AY~u1aUzS1;b7Z3=FKBnVCeG7#SxgGKw;@FtSWeWR#p- rz{oYZfRSx-5{ry9Bae@72!pnPF@v^&DTB6w2?Ljnwt}a|ejq!iI3&WW@!`S+p0!Bq!1dMIhGMEH)Fqq2rGng4= zF_`@=WU!EKYp}Q*%wYLDqrqygDTDQGuLhfCfep61bsFs2j2rA{^EEi6i8eU4Xfrsu zes6G2;bm}9z1iUE{GP#$b$5fi@`|S_qsU@K4&&I`1aK? z_^p}T;BTLoz!1<=+7K9C(-4#s-Vkga*AU`k*$^u3&=960-BADk|9?hiCJ1CFSxQ5F{+rY$5*MtiI DJ|~I2 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Bangkok b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Bangkok index c292ac5b5f489a88bf10a1263b14e7412479d9e7..ed687d2985c208171adcaa3401496b05325edca4 100644 GIT binary patch delta 34 ncmX@kID>J5^27ob9!3TR1`uXoU|^V_%*ZscR)Udn;(QGNbQK0( delta 74 zcmbQic${&9vN$sX0|N;2G%zqQEXqnhQvd(|e@3Q>1@aS=l|d39%=7>M|NmjzT91He NkRk>K1_qcy4FF!j8>j#P diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Barnaul b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Barnaul index 759592a255408caf354d0c4a2e406ee5a1638181..ff976dd3b27ac5f14dcbac2362f1b4638c5684aa 100644 GIT binary patch delta 152 zcmX@g`H^*kv;+eZU}Rum0AY~O1ZiFn1;Wk@3=FKB|1ruiIWsadVSy}gVHQUGkeQKr kas#7`G$W6XZwQ07ff<9gfdzxMfjI-0jkbZgovt|-09Kp}!TC%!F#Bt9z(U&3!Q!se0n6V84pw{q z9I(DE@W@oI~!ie!p_1nc^8w66$1|gLqP*02LnS=0V59sLr4Mx3yhsqz`*0<8^WM% zV8)s7*?^gYX>tOS!(?3!TL7Ye2Xz1d delta 1245 zcmcb^`buDea(yoY0|PSy0|RdZ0|UdN)Z_8fZVpJ59FsXUr?BSGC{G_JV0r&&I9G}Jpn4|@d>IH z?=Ps?Y)w#?QV!6Neepo!ci06jhTI2Q=QuBDZ#kEsvt(m{?vxD)dM%R!^h+is7^IX2 z7{;!9VB|aTg0by{2PV437fkDAiyoNqhF&oH8}h(HIwrv4uGs_2-*y33dnF!N-&P2) zS!SAGyPGM%u1!3_e%6x!ht!`5jx7uqoLp}wI43{4;G()W!PWW51vl3D3GT|vF1Wwj z{lJsC zl&KdI;#WOLtlbolWZ&~3Id)1wihSOKRNJzEG>-0sblHf2^cT4a8Go$;GEev?WZjhs z$X;QXkaNu9LT-m}Lf$f|3;F3^6AD`YI9@0W6ns#WdhbH9!RH4ht_LoZ3S50qrgt}> z?8Ej46@2>xDlW`?Q2B0QK-Gro2i51A18Qc@NT^+x8cB!lfmSC zCi%(pndB!ZGxlx_=U}R5U|?VX1u2-mYxV#{gMt=BgMt@CgMt`DgMt}EgMu1FgMu4G zgMu7HgMuAIgMuDJgMuGKgQ5ULgQ5XMgQ5aNyRpu%PXIAMaRR2_?FKsl6gMC~D1JaR zD2_lhD4swxD6T*>D84{6D9%7MDBeIcDDFTsDE>e+C=Nk1C>lXDC@Mj8sCc~!*a4t8 z1qp!S6-0yL7EE7z0hR~FF^CU}XAljFYY+{JZx9WNa}W)RcMuJVdk_tZe-I5y10Wid z4nQ<0Er95hdigxCk3oq7BmhbnAR3f7!1Rk;umeDe1jGj=6c7zcEFc<`U_dk|(ST@B z!U55s!~>#12?#_NwEnpOqCx2hM1#^2h|U2eC=dgbs6aF*VS#8+;sVnjwu2oAN@O5D lD4~I9P+|kopach^L5U7TgAyKy1|>ca4N8C@8cQOy1pw~Bw;2Ec diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Bishkek b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Bishkek index f6e20dd3a85eadd3dcc28cf59f3acc5b95584f0e..fe7832cdf99ed9da3b64e3b8f6c5cd0b8b4c8de7 100644 GIT binary patch delta 142 zcmcc4{)%OSv;+eZU}Rum0AY~O1ZiFn1;Qo_3=FKBmohG4^k!sc!U95WAVYOHAhV^Yp51VCr z5w^R2d)T!JMA*-|>*0|4DZ;V&=Lsj*D-lk=Cn?nb|NoznnF#_}SdkzbBU=h18x*oL zqCsY61_sv;pwMv(U|?ZjNGf3DU|1&R}tl|d39%=iEQ|NkHbAR45I Lfq{Vmrcet2bxa#g diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Calcutta b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Calcutta index 0014046d29a38e9b8006f746fea794d7f71eb479..00bc80a65e9a7aa470d63fba1ce1b29ef173d922 100644 GIT binary patch delta 27 gcmbQsbcb<*^27-&Jd6ws3?R(Fz`!s;dE)do09B3!!~g&Q delta 93 zcmcb^IG1UHav&Q60|N^K1A|Zl0|P_*+&#Na-R{vi!&)eDW~$MOOC>@x7@3%vn3)(D wf^IM{Ffe$#fmHiOFmNz1L}xJa`1pn}`1*!0cm{_sXd9Rr8!${zo*32!0Bigfy#N3J diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Chita b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Chita index c4149c05ce2638c976aec0d18eb7567c7276bc80..9d49cd35cd5e52c5ff0f2c0cc6bd3f4f6e856915 100644 GIT binary patch delta 155 zcmX@g`Hpphv;+eZU}Rum0AY~O1ZiFn1;S1Y3=C|Wm_(Qy8JU@|Ko;!6m`Yh0C&#hK nDl+mgF!U^7;PCMcVbC_PV9+)+V9++OWZ<&VHn6nQwd4W-AZH8F delta 604 zcmaFIdX#g5bUil%1UNG=Fo4(s3vd5iuyyfK22u6k0x^m92jU!UAH;v|PLO!Ht3dMB zy9ZKd>>~1j@|^h9{CCKH3Ab9au_ElMt_>1x;R?w`-R?xh%OhD_%bOG%x^&J8_ODY9)r(_A}wL}Z(m-q-6 zq}U1=#%4?~DsrA+Z0j|_BuI6FsjSWfGb8p1W`Fr6SV*e~SlszA!SXkofYqK$6RdB& z5U^SLUch$ODFM6Iivsqu)(AMHZWeHCJ~6?`b*g}K@~R0gs^tQ%&OH;{SR)18mGdUJ zzbl>K$s91jGx1#b1h2JKhKxcEXGf&>YB6^r4+BF%0|N_4gn{+GXb~na5RZC}^rG02TsGPUmUg<9TmWn#kj4N2 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Choibalsan b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Choibalsan index e48daa82435078a2a731225ee963b30a48f78ce1..0a948c2eaca30cde2963c330144215ba52d67c5e 100644 GIT binary patch delta 57 zcmdnW{+eZivH$}E0|O%zgV+<4S&bPO7}z#XW1Pdt#K<&>QHza*nTeH&b+SIA>f{;B FvHwmw+;=8Oygbn$dF$N+sWbKk(tDH=WY#Da$j)I& zkn3SCkgtB0ppgBvKr#A6f|B>~0%hw}2`btv3sj|h64bc63)ERwJW&6#{Da1mt_PY| zIzMO~$$6l?CHsTU62Aw!Q+z+@wHQ3mFVX*CkRtTJFxIEQ$Tvnm!Pr)>z(iLt!BkeD zz>Mc}g4N5V6Rfw)Yp_`|cY^Jdh6cNq`U&jLCjXvH*#EZUX=S diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Chongqing b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Chongqing index 91f6f8bc2e234bafd484146986bdb289082c3588..d6b66984a2f36ae36b35e174756707aa7286c292 100644 GIT binary patch delta 29 icmdnU(#bqQdEy5a9!3TR1`uXoU|^V_vzeVyixB`|s|6|m delta 156 zcmeBV-pDdRxn7omfq|KUfq|!ifq`Mc^hFH|D_K6Ah>UAE$@#P3o6{- diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Chungking b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Chungking index 91f6f8bc2e234bafd484146986bdb289082c3588..d6b66984a2f36ae36b35e174756707aa7286c292 100644 GIT binary patch delta 29 icmdnU(#bqQdEy5a9!3TR1`uXoU|^V_vzeVyixB`|s|6|m delta 156 zcmeBV-pDdRxn7omfq|KUfq|!ifq`Mc^hFH|D_K6Ah>UAE$@#P3o6{- diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Colombo b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Colombo index 62c64d85dfbdc41ae8e78bc8304ceb35b16b4255..3eeb1b72b68993e26a2452afe98a6420ac66bafb 100644 GIT binary patch delta 49 zcmeyu^qp~n^27ry+>8ti3?R(Fz%X%v3M&T#0|WcSlP>IxOw24ytZb8I8MP<-F{%Lo D1yl(Q delta 114 zcmey)_=RbLvMDD60|N&G1A{~Z0|P_*+`TfVqhvJBOx0d+skFhua2bP!Q6YnZi~TE& v`v3p`Gcqx=FtM^RO9 delta 84 zcmaFPc#&y>vH=GJ0|Ofa1A|Nh0|UdU+ie@puog<3nQFA+?utt@ysVE1c-!2VQ2+n` fe?}%|CKgtfiE|w%C^K?Q40qsXU|?WCk?{fmu}B;2 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Damascus b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Damascus index d9104a7ab8cb13b4c87eb25ff633b03ec12ddd81..168ef9baa47ee3db368ded8a8ad1385491b3631f 100644 GIT binary patch delta 44 scmew+IGtmHvH$}E0|O%zgV+<48Iw0BF)J`np1_nmS)N&b@(m6-0INR;s{jB1 delta 1076 zcmbQv@l9}oa{Y7$1_ovZ1_s`RpH^2aYSeF795=UMNuprGQoH(sWe%Skmdhm;tWdbx zu#&y@!^i$0hELIR3O*NWG<>nHEBG3^w&9z6$cOJ{4;jAyH~a9D?-s+)hr2)g`su;& z`_TJ>Kex{^{9Rg7@NX|e!~eGB9~kDDFfgXyE?}xpZ(#Q1`@oV||E7Ued-4Z1X9Wg! zp5p}^D!~mLZ-0H@Vr^&OIA3CNPIcUAbC5t zKiwLneOr9quly+Hk2 z^aG9O69P0JNhfHX5)II<-=v+OvpD{O?rir5dObA(`Zd)F2D$4m7{)Us7zLPIFt&S? zU}BgNU@CVc!AxlO1#_lZ56nNG53qPD|G@HENPyL`-~{XK?H6p8w>_|(u{*%7V^@NG z<+}?G+4c#JF~t|0e2N}8+b$1q(Os6{D)cwNjmPYPyOv#m``6$EPwv7C^`57HJ@9(P z6yUv8Ji+JWlK|f-KNI{`9t-d-M4$^3+npk)_AMH&;rj5;oa zeMwG;5X!m`aku_KXqLT=xx z2YHLjFXZR-JSb?6yin+u_n;`*`a-c@z=IN>h=5W)qX%U=Rsm)2L>^S|$OKeeH%zE} z{V$+uyKqAF=?4Kd)4nFuZuxVeuIze3{gitbCO0xiPM*MQH~AK``~+pj=^MipnClrB z7#Ki41<@eif@qMBK{UwMAR6Rz5DoG@hz5lKhz5lMnEsNS0HQ&m0jBTPKLF97Pyx}P zkO9%4&;ik)5CYM$n*{1FfEb{l0@0x00@0u#1JR&h1JR(M1JR)11JR%$1ks>i1ks?N z1kveITLZxK(^FsvfkG9;2Zbz%28Aw&28A$)&N*B^73=^|P=f?O!40B8K@Orp!49H9 zK@Xxq!4INAQ2?Sr(Ey@BQ30Ys(E+C4iGV`@6fGb=C~817D0)CND2hOIwesl)U>Aep S3M2rEFAxoiGZ2jyZ?*vOjFFN6 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Dhaka b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Dhaka index b11c92841068c12a5d0102402127ff4537a66899..28136808b6d1029676448d8711265d8c55cb4bae 100644 GIT binary patch delta 40 tcmcb}^qg^m^27}+Jd6ws3?R(Fz`!s;nUQ_s4hJ?yCT1oU*2(OQUI48~2Lb>9 delta 84 zcmaFPc#&y>vH=GJ0|Ofa1A|Nh0|UdU+ie@puog<3nQFA+?utt@ysVE1c-!2VQ2+n` fe?}%|CKgtfiE|w%C^K?Q40qsXU|?WCk?{fmu}B;2 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Dili b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Dili index 30943bbd0a8251404c407cde82243294071baf22..bb7be9f3a47112bffcb2f33f70810819b5c2b726 100644 GIT binary patch delta 36 pcmaFNxQcOt^27!f9!3TR1`uXoU|^V_%*ZmaU4xmCiE-j?4FHFU2H5}r literal 227 zcmWHE%1kq2zzbLz7#Nrt7#MgaJ(D-ebAq?6E77W@3mJFm=@&Et-{~&8XG{`EDsUYh>G{{O2O{BG4HrfW3 IcDj~a0P#XDwEzGB diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Dubai b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Dubai index fc0a589e2b22acd9a76e402f0e7ef3c7b0547148..58d75bc26eec90272e97696f40483eb56c2b8b45 100644 GIT binary patch delta 45 xcmZ3=*vdFTd13+!4q{qU6fyKu+ghAWDgn<;3{{R2~ VA7mQH4BRGi*=QS>*y);Z0RX8`8=C+C diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Dushanbe b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Dushanbe index 82d85b8c1b387ffc54acf509ac75220465b64d4c..d83fb076a256817ca0a3ec4e43c7768e6680dc84 100644 GIT binary patch delta 109 zcmX@l@{VbOv;+eZU}Rum0AY~O#E;UvAR2^0idZL0G9Hm&WM;wwSr{k(W0a9*TZE*|= literal 591 zcmWHE%1kq2zzR5^qLK^@3?R0^D#_-Ct&86qh^p5v5R=#>AkMK-LHy^_2@)@#EReh{ zDIj$wbAj}pvI8<}(htbai8vtF<9R^7#_E7Vj`jh?7?}e~KD-B%t^XZR(SCnGRr2~;i{Z39y~T~jUq^T>Jm diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Famagusta b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Famagusta index 653b146a60e5e5641a07bfc82f9590dad1ed69f5..cc44179564afe36db0f1f7aab0a19cbc3e4fa4d0 100644 GIT binary patch delta 124 zcmaFEzlME+xC{dtU}Rum0AY~u1aUzS1;b$s3=Axrg_*Z7O%`NVo9w_O0>y0F%uEan r@>f6#wG0?p7#L&}7&sXiv2SVX|A6c6qzl}?QXcT^I~KsZ#4>@e>){3d z7U=|mQvVBr$$t}sf*%A3`$|3#F+LO^s(dg(On6CvIP>BJ@y~4m5|3LGBrj(KNF7d3 zklxdBL1s}Juow>5HR~&FJK`(WrD@sL;=g+WfQFSIty6ej+kJxEPjIRZmS7) zZH^P{XUj}*NK>BR*kUQ*TJZD0PkNbpBalZ*+ zI+_#0z8g#kzfgZ6@~ehG)V41ZqOWoZ#4HdLh~4r=Ag=ziK>U<*0txX~1rlptO-Qoe zE|461W^6L!N4GY1(Xc63>aA$ z7-SR}IAJ72M9YAI7b4>08^Yk~8Vn*r7_<$HLAn?j85kKD7(f&$N&Wx-|NlYB9b^P3 z$%AN6vIo(iqz|G&$sa_6vH*w%Wdjfm$_gMFlpR1cC`*87P__WkpsWF+LD>UDgR%&S z24xcv4azED`g2pKgR&Ng24yc04a#C58kEgIG$^ZqXi#1hXi&BW(V(miqCwdkM1!(8hz4bI5Dm)e zAR3h2K{P1KgJ@8;2h;DKf$axne-Iy31b}EzF#w`LMFEHg6$c<1R3w0CP_Y1_K}7?I z1{Dt=8dOApXizZ$qCrIkhz1oGAR1I;fM`&$0j9qjOaRfK;sZp3iVzSDDn>vws3-x^ zpyC8XgNhUo4JuYZG^l6+(V*f5M1zVL5DhA3Ks2bR0nwo121J9391smEc0e?!=mFC& zri0x9DuO_KP%#9eK}8XW1{Fsj8dM~KXi%{PqCrIyhz1o;AR1IefoM=M1)@Pk6^I5E zS0EZxWPxZi5y$1~8lr0iDg$+VjrC0R4D^k4d<_l2EE6sOtd`I> diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Gaza b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Gaza index 592b6326066dbcba3ae770763f024de7fe718dd2..4278ffa512b33083e189c4c40c4b9c6b4753fcd3 100644 GIT binary patch delta 189 zcmeAXTFn_95|x=|%s>z@GB7ZJFi0U0S_&B$7+5!#GdnRe#UxDL&1T1y6adm1S67}e z`683TA~!ua^YmcA*){(d&K>)5;e3DE zg9|GwFI;R%cyOufWWnXs4GmYaA6$50mYne7i*CRx?wtv*t|nY~{pQz)H(PTV-kz`j z@NW7ihW8sb7ksExZTL9x*@sV2kqn=Ur3$`S_cVMBonP=xPO#y-S^cFC-~YQZ{FGoT z`1$Y@!>^x~AAYMl1#r}KKj8Sg;R5HkR|#Cpj4uekSoJ_ef%AdX&yokyy)qAE_WgJu z+xhW=+?oFg@(D8o6q+_BD0*(apcFUnfwDqufJ&4>f+~Z3fExGP2Wr=zT~L30{(;5; z<^atrZxXat%3sjlo%%qhlktLX{cQIKdhsg*^s6-=7++O4txWAEj;IUosg6HX959+-Z z*d%zb)tlp!xc7qZl%I3_Ob-S4m)uSWh@SW$Fl28+kjsLAV3YX?A)Yw_p`w=_glYN( zgnd2qAwu|6Ld4Z2A0j`mNr>9o_96OmUqZ}W=LfNy3lidLRUgF9>3NV4%l;s-ChtL# z&C3VLF#!)!)YuYIZHykIvA#%1ml1i8{`6F8LdNfJ4>FIgNyvICoRGb=FCpj1*M!`@ zRS)u(Tu;c)>v>SnvNNI3FYiH7%It(GJg=;c9iy|v4BP%28WJ4D9 z$qpuDgr!(sP$~t9fm7_p zXeVYSzktc}neFNe5sXy`+tPm7UAE$@#P3o6{- diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Hebron b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Hebron index ae82f9b54657dfe41bbfe921a4c11ac94e0f915e..e55318aaca8cbbef651e57359371d9517cfd1481 100644 GIT binary patch delta 144 zcmZ1>w3m}LBq}q_cyc1M@ZNnvs*hvMYROh%JWbI478&mpS7ee!%f}!v)T7uM)VH8D9{7vFd?{0_Ov%pCu2Zdu1NT?ECRR zw)5i!xikM0RN63iIe63oRC6D-(V0xbU5KCpbBaKY++`~&OrP8V$UJ3g>ouX4d|zVZY6 zezpq^^{fvZV;Ubg#XW!E?701di|(=nSE0WFZhSW%xV^|PaDOB5z+*RCfamF759+-Z z*d%zbzVpB*aqk7+DL?1qQ;hxYGd>ujrB!tLb{B|gY>7T5;A^&dysi_O+waF;e_m^ zeF-^7z9!`Mt$L8RjgY0aj8uxKY6pLKr+_=>P(Xv}>xN)^KmiWog905ytAIit z!~lgphz7*~hz7+1h$b#3>S(uoan3*Q7mzQQ>NGf39^zjX02mle<2IdUf1{Mt329^vHlv%-M UPmJ~vWME*x(8~tVJMo+x06Oj`=l}o! diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Hong_Kong b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Hong_Kong index 23d0375fba3377a3d513d849c0d29c82ad2add64..c80e364801be87687625f72e8e2c3dbd0f7ae4bc 100644 GIT binary patch delta 73 zcmdnY+0HgWdh!EC_Q?+zS$P;47#Kj9fq{VmBFx6%%D}+Dy7>#E5!2)(M&-%*jAE1X X8QCVcGRjR}&nU*u<>4KoYrzEoW&c*HcyU%gOzjY2f{?Aih!O*9)gRzcv1ydf& z4(8bBD_DG=?O=6h(O|POXSQHhd#1tOY-_>Ec0z;m+i?r7XR9>0udTG;Io6{gINQ=f zC_iTfBNHW nUcn)d5N2eYAk7O3Vh|S`+#92fn0T?8X+X4@Tpr#bx)xjj0OYQW diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Hovd b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Hovd index 4cb800a9187901afa985f1ae67565d654021cabc..6e08a261274e48f93eb5e221ba294e54ca671b94 100644 GIT binary patch delta 56 zcmey(c8O(z^5gMS~jm@(JoJM;X+=91+lXvYbKl z$}$11Bb^M|TRH@EmSi*NPRSC`Yw=~!FYysDNYQ67jLn!}xtT^h@eN_{^bKLqHZW( delta 616 zcmeytdYf~CbUhCP1UNG=Fo4)14Gatni-h?1Z(V#@KvX@kK}=%m2XT(64B|ge7D&82 z(I9#2&j+b9z75iQq87-k@m?T1$7X?CkM08b8o31uIs6M0V;B}Fd4F7>Z2f3~iuUCN zs?tXmsBv#ypw9A8LH)}m1&t>c4Kyn%4K%N8QP4V4zf?hc%QOX@CG85jQz{hnS~3;% zOQIAEQoI!mW6Ks86$LIZwvAX|5@fu&(EdB*}5)m8;p=UEHfSko2U zm1`EbziVFLnZz8o!1G+{0;~T=@=^MhJ zZD7uzZD7fuZD0Y39YzS4Ak7PkBaj$4zBWdSFnNP`RCKC8b)3p&qitYer)$9l0KTA< AZ2$lO diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Istanbul b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Istanbul index 508446bb6aee2841ab88e82607a6ad6e748e7db7..c89186687300068ac4e8505cc0012a1dbf6a9960 100644 GIT binary patch delta 122 zcmbQuzkzdtxHJPAU}Rum0AU6OhRF|@Bm|MAiy0Ug*fw)A&tYa{oXp6iHTeJ=3o{EV t3zRK3S%FOGMetN>qm-ZKKz25xb_NADBJ6A3w z+}&gs@bSyegfB_&1HNXkC47^&xWJY-xq#hrRss9(QU*@RngY%Xry00@#uadH{MW#9 z)1iQONoWJ#vb6>LE#?jUKLi6LJ2w4NPbY2;rgJ){riJDt9pU@SBV0Rr}9eG`#z2#1U z&XThQy4}qm^jg*z=$9-gFi4qLU>LjSgHh4+55~6hK9~emelV47_+Vxf{lV;S(gzFa ziUNzfE*~s^M-^D@Rr_Fl+or%~nR9{dZn*-xHq`?A*$f2^Y3v1=jx91DoLpZPI4A%6 z;G%lEz}5M|2RGJ}6Wo>W3%I{~Cg90@P{8xt2?4Liiv_&btrGA#vwwnb|J@0GYZgxM z&&v}C=xLr17~VA@C?|D7u*E)s5Fhsmq2hiM!tCZv2>Wg@A^f~vK>h#!{~0G6vgo<6 zu(B|-u@etDI58m0=xxBja!Oq?Ay JL3v`>A^_2h6te&T diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Jayapura b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Jayapura index 3002c82022f7e9a4ff1ad545ea617106a13b24e0..7c22f539d948e5757a0847892da344309b582473 100644 GIT binary patch delta 27 gcmcc1xSDZ-^27!f9!3TR1`uXoU|^V_GjXC109FYFivR!s delta 32 ocmZ3@c$aa4vLG`90|N^K1B1{mv4b-%MC|-9vDk2e^2D%E0FmPgh5!Hn diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Jerusalem b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Jerusalem index 440ef06b5d55fba8f1407184757e1785aec1fe8e..e6e6cc6ca58485d6305a44d8a42527a619dbd53f 100644 GIT binary patch delta 48 zcmew$xPW7V^5g_&79K_h1_lsjU|?XFpv;=Yz`($|Ifq$)5;e3DEg9|Gw zFI;R%cyOufWWnXs4GmYaA6&Q|C6aLczWjk3`dbTb%DFwbCGg_It=F3$+}>isaA&8& zgS!uU8SZU4*KmKy{)PwLWeg9)Y8f8w^GbMZW^&=lobL=z#l$W=E2+Qy;JM(Xh8ODp z8D6~bzraz`{ea`|h6|kEUL|lXGrl1FV$}l?1PYP2g(Yu0V+`j391bC0czZDAE;e>c0v91`3D*Ym;*Ggyh+en zDSttGcj^P3PR0wmv)v!)#jgy|udmj8VBm4|f}zK>2Szq|0mg=#6HKK3T`(1#nqc~I zS%5hUM}zr!#sZ6P@eP)Dem=0e@V3BuU37xY;sph^3pOR#H8&O5*UW$5P;6G<7_cP4 z$)}&e*~7oUMW>L#RqopdH=bYyw>QZj+~1focs&1F;CV)z!E4`~58kVPGWhgxeyI1I zD%#-JKD)rbF^eWeW`DV5Y_w;aV4=K z@+>??f+5v* zQb8IUOGCPBNkRJ4XAK#D!wNEwo@mIrYY|zHy>wMW&asdWxvf17dCSZ`-QC`$eHp;#}Mp~Ushhf+R&hBCdM1!eCH87la07gU@RW~h9(x1eh6SBC0y^9yRG z3pUiQYb>ZM``l39ms~J8pE+rAKeOTFi_CIt3=CQZj2x5SGmB18W(6m?jnN{^^$ZLQ z3?R>fXpo0NG|1B+8su>h4e~sg{!$N0q70xw0P#Tq0ir>H0irhfI=KZgF+odgF+regF+uf zgJJ+ggJJ$uB4gB^f7x(oq< Cq>(xR diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kabul b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kabul index d19b9bd51d701d8bfe7b3e95c9f6f3c736a9aeee..660ce4cf695702ee8c6eef5c0e2419de37d6df74 100644 GIT binary patch delta 34 ncmcb>IG=HX^27ob9!3TR1`uXoU|^V_%*ZscUV@Qv;zE4@c0dMs delta 74 zcmbQwc!6<(vN$sX0|N;2H83zRT=;q2q5l8>|BOr%3lt|PD}y9JnD77p|Nk@FW-S2G NAVmxe3=A-Z`T&oc9P0o8 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kamchatka b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kamchatka index 3e80b4e09f792e37422ffafe42355aeb3e6940eb..c65155402db6a465c05a8cd71ec7a0fc0f792762 100644 GIT binary patch delta 150 zcmeC^7#0MFlZYZGH4qbGiVzcF>u*v8yeZ^8X9o{00^oJMF0Q* delta 567 zcmcc4+Q&ITx}K8(0vs6_7(i@+WtkGp4DTkG{dtmLA@%ct#hqgbmcMR4u-daC!TQ$T z2R2KOJh0t0|AAfWvIq9F8Xq{Mc06!wo|oX{n)Sdrxgo(t)#rh$b5epEtKI{5WtRl^ zcist}%xVdq5$ALhydHBTc(3D6@Hu1j!MFE+LH+;#{~4K?AdrO>39_*xagZfY*=+1A zER*Lm$rv;6FfeSpz{tVCu;KtC4+F!j4Gb(GHUp23ZwQ07p&^5|p)rHDp%FL^7(rly kG%qL`Kmy<>*%-~jHrfVecDiO<0C4IW(EtDd diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kathmandu b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kathmandu index a5d510753f02d5dedcf1ffac153558466dca9b99..3a0d330ffd2f08396290960527fc8fc186356161 100644 GIT binary patch delta 38 mcmcb@xR7yzvH$}E0|O%zgV+<48JQ+FN-#1`v{IgUj1K^BYX))v delta 74 zcmZ3;c!hC-vN$sX0|N*PEc{g4A}3+6qW=H?|BOr%3zR1)D}y9JSm6Kv|NlV>7#J8B LK#D*#OraqFMEV!l diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Katmandu b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Katmandu index a5d510753f02d5dedcf1ffac153558466dca9b99..3a0d330ffd2f08396290960527fc8fc186356161 100644 GIT binary patch delta 38 mcmcb@xR7yzvH$}E0|O%zgV+<48JQ+FN-#1`v{IgUj1K^BYX))v delta 74 zcmZ3;c!hC-vN$sX0|N*PEc{g4A}3+6qW=H?|BOr%3zR1)D}y9JSm6Kv|NlV>7#J8B LK#D*#OraqFMEV!l diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Khandyga b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Khandyga index 72bea64ba83546e72ff9d6a4f9a9e64cc2d93b47..aeb733202acd5d9d2a19a54fc64c226302887423 100644 GIT binary patch delta 174 zcmey)+0HgWT7m%yFfuSOfG|jCf;2CP0%2zc1_qAJ;!HA3&Wy}VSRe~_VUSWbRust2 z#yq)!QO1ywhk;?%21Wq}hMols93VD>fRAqogSLSMgSMdogSLSsgSMd|1DB1qfu)_U GB^Ll9pbu;S delta 648 zcmZo?`_4H*x}KK-0$dmv7(i^1g}0x)-n#fGgQ$9NftW=5196VF58^*}CrG^9RUmom z-2=d?v`Ov7I10M{j~$kNgDr8i5H4IgAq&qd!eh@_sx)+4{-^744%FRHe5~ zP~%=cL7nBYfclps0vb;aD`-|^D`;L>CZKg>x`6hU`VIk|C6xlYQ?dl~TA~H?OMC2cg6**5Zw)L7|5~Mo8R90t#nGyR0v%h>3ETmNgEbe@mVELO(z-rH>3D&n> z2-qxrFJQatlz?69MFIO+YXs~+Jt=TVUCQ9tysN>WXR3Q!ZLXmlT0uJ4+BHb0!9u7hPnxiJPZs44Gb&{46`;c3V_5J zIAG+g4GaPxH4HpHz99_S1{Mt3h6W7U29^xkhKAtiVgv&QM#c%!yr5VE34&vAW3&vD W4~R!ihsV&s;aoP_29|cZmRta4ewWbz diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kolkata b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kolkata index 0014046d29a38e9b8006f746fea794d7f71eb479..00bc80a65e9a7aa470d63fba1ce1b29ef173d922 100644 GIT binary patch delta 27 gcmbQsbcb<*^27-&Jd6ws3?R(Fz`!s;dE)do09B3!!~g&Q delta 93 zcmcb^IG1UHav&Q60|N^K1A|Zl0|P_*+&#Na-R{vi!&)eDW~$MOOC>@x7@3%vn3)(D wf^IM{Ffe$#fmHiOFmNz1L}xJa`1pn}`1*!0cm{_sXd9Rr8!${zo*32!0Bigfy#N3J diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Krasnoyarsk b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Krasnoyarsk index 30c6f165052efa4fbc176cbcf19b626b1615d88b..e0d4fcb5c3d781943a65dc53cca9fab5d1905f9f 100644 GIT binary patch delta 156 zcmdna`IL2nv;+eZU}Rum0AY~O1ZiFn1;UOD3=C|We>3thIWjUcVSy~zg)x<~GEWX< okx^viVPGg|VBqla4PnqWFk{d*uwc+OFlXSh(Kax*(>3P;0CbKFV*mgE delta 600 zcmaFLx}9@^bUil%1UNA;Fo4(s3xD!{+Pe6mf~b1_1Tl#v4B{M%1;l?|Z;*I-ZGz-& zZU(6{(G#TiWNeUG6S+Zlj@Jgc9_tPAH98vHU^u#k2zu(->!!Sc6~fz_UO8?0}$ z7}zZ1Hn83G%)qYot%3cl69x{c=M5a2pKNe)-Du#Pd~Ab@>SO~~=M@{=SW6AumAf{$ zzni$hlR0ODXY9G+4PKA^Hh8ZK-QaU3+rYQad_#!$Q-%8f|Nk>GGeIB=D-vX5N8%t$ zptCtxSSGJvl5u3FmQlKh&Tg}k8cQrwt*Rgwt)qM swt+b~QWzm%f;2BEW0Z0Lb~05dZ)H diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kuala_Lumpur b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kuala_Lumpur index 612b01e71cf873b7f8a80d25d7906d77aa91ca5c..e93dd5141bcad38d256cb53b7bc5a7637d9ac77a 100644 GIT binary patch delta 50 zcmey*)W9@BdEx;U9!3TR1`uXoU|^V_%*ZkEtOq+I6Eh1d8|%b~Ku#_jZ37ECT?;M% D`g#cF delta 90 zcmZo*`p+~$*_4xkfq{d8fkB~xfq|i|xpncbbiWA)xSk}O+Wa)(^u&0MOCGrp{_ ksQ>@}KO++}3o9Ed`^05|6O diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kuching b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kuching index c86750cb7d512966b1a8b19cb44531a618b00930..59bc6e40b7bb0b4eb199dd8c17f416ee00ca4158 100644 GIT binary patch delta 68 zcmaFNe1K_!^27%$Jd6ws3?R(Fz`!s;nN^5^fq`}6`zeBq%uFbdW%67``HAZ#IJs=J K4J_<*Ew})lt_w8) delta 176 zcmX@W^q6^qa=I`B0|Ofa1B1lcF187~(%n1uSF1Pd|12GFFm_GD!K(`b4%4M%6N2OMW~XEYP0GYluA_g^@5CrM^VDa${VbC@(W+26+|NsC0 U2bl&k1GkA>HrfWpcDlw~0P?IEKL7v# diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Macao b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Macao index cac65063d0dbf48e37c547fba3b67f34110d5a90..c22f75e42db6b12db3c837056436cb77d176b83e 100644 GIT binary patch delta 147 zcmX@jIh}2Sv;+eZU}Rum0AY~O1ZiFn1;XwO3=FKB|1i2R*)g(E0w?z|%1itBhA=n> ahcIXx8Zc-ZSTZ=fgfMV92Z!idZ~*`*B@CMY delta 568 zcmbQvcA9g7bUix*1h_LWFo4)1t(nn%r`=0Goc?s`!I|H?0?uCkmvCc8uxs7IBoieNB){09+y>qc%sk!;c5J|f@gg7Z$CV@U%BG>56>Mh<-1qB zyrI40)&JZTuXph7cyr%>#oOuccf321qw&7{;*Jk1{4_p>Z{G2#!$9M+!v%{k8A2Lg z6*gIXbN{08UA4~QhiI_GPu2vBpI=QSem!-v_v=GYAS;5H6#LUFZ$ij*RGO`g385pvPK;d36`8kuQIs-#N0|N^KL)`>M z0UzHG2It@q25mzF25kdN24|NLkU|DVMurK}yr38Yalx^*G1`U6jxvW#zRM)9N2K*! K&cPwN7F+-wPrLpA diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Macau b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Macau index cac65063d0dbf48e37c547fba3b67f34110d5a90..c22f75e42db6b12db3c837056436cb77d176b83e 100644 GIT binary patch delta 147 zcmX@jIh}2Sv;+eZU}Rum0AY~O1ZiFn1;XwO3=FKB|1i2R*)g(E0w?z|%1itBhA=n> ahcIXx8Zc-ZSTZ=fgfMV92Z!idZ~*`*B@CMY delta 568 zcmbQvcA9g7bUix*1h_LWFo4)1t(nn%r`=0Goc?s`!I|H?0?uCkmvCc8uxs7IBoieNB){09+y>qc%sk!;c5J|f@gg7Z$CV@U%BG>56>Mh<-1qB zyrI40)&JZTuXph7cyr%>#oOuccf321qw&7{;*Jk1{4_p>Z{G2#!$9M+!v%{k8A2Lg z6*gIXbN{08UA4~QhiI_GPu2vBpI=QSem!-v_v=GYAS;5H6#LUFZ$ij*RGO`g385pvPK;d36`8kuQIs-#N0|N^KL)`>M z0UzHG2It@q25mzF25kdN24|NLkU|DVMurK}yr38Yalx^*G1`U6jxvW#zRM)9N2K*! K&cPwN7F+-wPrLpA diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Magadan b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Magadan index b4fcac18e3540f029f01bbf2751045b3983d96fa..16bac8444656c393288dcc0209a96c7c3f487a19 100644 GIT binary patch delta 157 zcmX@c`JQ!xv;+eZU}Rum0AY~O1ZiFn1;S1Y3=C|Wm_(SI7@3){Ko;!6m`Yh0nJ34y p$S5)LFfgn*z`)_-8^WM%XuzOtXvCmxXvn~2qitwtr)y})1pqni3@QKs delta 607 zcmaFQdW>^|bUil%1UNG=Fo4(st0c`9Y+bzKfvCE9fS5$~0dbD33*tZLJ4n2o7a)1- z(gCS6$^p`Q3<_k{C>F@h5h{@DVJ?ub{!*Zj{j@+a`dWdK_wfQ{>m3Cu+A9lGrDqkW zad#J}vuyjI{$=?GjVH?)G%NfWG_Q1i&^l7}L3>Mm_6MCMF&}iN_CtWSYak$Qo#tzLmi5NCm@tU!U8;p+mkKc5OLq}e}M+__R<`RnBet3BHatZ$wE zV6*hn2isk1KiIWy`Cvb*|ARy7v=5HWYYLoPD?T_U_Z7IPMtyK~E+}wgwfW$#98}=` zF0#Or*`&ZT>6~?e*JH5)?{%^TK4*+R`1bxU2=QL?AY6J5L;e5%{~4K?AdrO>39_*x zagZg@*&OUFER#1f$v86bFfgn*z{tVCFlz%N4+BHb0tOb42m=R*gorcn`1pn}Xd4XadvM37!0|P4q1B2+oPq7nriCvv=x&=ZkFGBIz+dXt zAdpt|fr*icnTe5!k?H?``40>X3=DM>7+Dw?3K|$VKx_sc2;0XugdxBsgdrd}guyE~ bgkgd*D;EO;1KY&t8d>ZrxB`MhbS=05{fH;c diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Muscat b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Muscat index fc0a589e2b22acd9a76e402f0e7ef3c7b0547148..58d75bc26eec90272e97696f40483eb56c2b8b45 100644 GIT binary patch delta 45 xcmZ3=*vdFTd13+!4q{qU6fyKu+ghAWDgn<;3{{R2~ VA7mQH4BRGi*=QS>*y);Z0RX8`8=C+C diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Nicosia b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Nicosia index f7f10ab7665e94ca44fd8cd98a362cd4b304eff1..c210d0a5989c228886b400ab74c75b6fca94b70a 100644 GIT binary patch delta 126 zcmcb_f0bo|xC{dtU}Rum0AY~u1aUzS1;d663=GVhS(tkmC$SsYF)=X6dw`_03>aA$ t7-SR}IDLFW7+hV0K|}}xm#b@tt`Uf<<7=#Es%M~YtmA8F0A`tR0RS=M5E1|Y literal 2002 zcmWHE%1kq2zyPca3=AL)lBkEWd6$;U?cjX7{sGtBNf)?(r99x-cPxN+iDd#`*TW0^ zEz$`BrT!NLlm8|N1wRN7_LY1fVtgn-RQX_nnDCMSapuJd;-A|BBp$aWNM6nekUE^6 zAibyMg3Oxc2eNb0F39zyK9H~RxS){Z{y;HC>w=Px<^yFLo(n2E+z(Wx-(67Se)~Y3 zl{-NFD_4TXleYnySKcIO9XTJMz2#hj&XSD*x>GhJ=(S7^&@Y*kV31N8U>LjZfsyaT z3&yq+9+>DBUoe#|dSGT$Az=2mUcf?n$^?tMi2|0t%O+Uubr!I`9WlXXS^Nas-BuIq z+8ig?&z70skfuDrvBgrr$&Gb_bBeTpi|X?UuFii2+*nUea96%B;QsEJfG6`o0nc+M z1iT(E7VuuTO2FsL{t3Q)Jpz7f7EbWb%M%FbX`T=m-Zdd8Cv`%wdCr6oANL8N;(imt zbTlV~eK(j8A?hX&ab0La+L|^3+h*=;g5WD4#KwSN2f%qxs1QOz}3MAIP znvi6_T_8F3%!CyAnF6V{>n5aeY@LuUJ7Gfli|G?G{uWKhJW)9z>u$(|>=n@ya*h=W zuK$*Vigt8Bh1S*h|Vt6VanzOQ})6C-JmnT4v5fkEB_loquN7+Dw? zWE2=UVI)Yz$2Ww*)ioGIgn(2rGBPkQFfx*ow*UYC{~wgTLE1rS97KcCIfw?Obr20o z?;skK=0P+l-GgXQ+6U2~^bevzc>qL%@&SkjS3ooC_jN{ zP@V$OpnL_QL3s;AgYp-c{>lZmAC%8Pd{ABk(V+YWqCt5MM1%4jhz8|75Dm(IAR3eh zK{O~If@n})1ks@U2%L3tQNgYq$m2IXZC4a(0T8kDC&G$>z#Xi(k;(V+YdqCt5aM1%4< zn11&RY(FT!gZQ94528W&9z=ukK8Ob8e-I5S13)yW901XvvH(Pb$^#G$Dic67s9XTi zpt1o(gUSaG4Jso*G^m^a)87pyfM`&80j94Df%%|v1H=cF9UvN1et>9D83Lj~hhz6B4AR1KOfaw?0!S;j79S|Q> z_JC+m`2(UsWe|u4l|vvJR2G3~P91*Shd0>=la+ye1IWfzDBm0utlREB|QP&o#oL1h_;29;+Z8dRo%=%HG!ak;vN a=o*0vJRM(SJySgcePbP8Ljy3&gbM%&q|NOB diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Novokuznetsk b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Novokuznetsk index d983276119c95872882589a9fdd829eb1f86f606..9378d50539dfa8f1dabcb40d3720f64906d36202 100644 GIT binary patch delta 149 zcmeC>yv8~~T7m%yFfuSOfG|jCf;2CP0$~RR1_sv6FBn;v92l9Ius{~3fRq0C` z)VL3CP-l5>p#J57fyR^j4w@D14w_dE8E75ZY@ofReu;t3lBou|Q`!vlTFMRdOEL@$ zQX&luV_P;D6~%8bwoTh$66CnSRMumInUV4av%gv!ETkO_Ebj7bu>7rLV72Gn2J71_ z1~$vM4QzKkGq7uYYhXX?gn>iqc>~AhCmWnxHySu6AKT!fI@!S0dBp}d)=~p^<*p6x z?(8F8+7gV$rf4c_ZQH~5^XbnxwSJy8Gu|9?hiCJ1C*%-~j zH-prf=n2w$GB(JpiQFJN$7_RJkM#!m8l4RaIkFoRWB4{GdH>&_Z2e(_iuS_|s?wJ> zsBs_Opw9B%K>f=D1C1y59W*Q29W<{TGSE7**+6?s{SpK1e|`))OBOrmPMPAM*V5{s zUsC2^kdp3T7(3~JQBm#zW80DgCPDrOOl89km>C%!F#Bt9z(U&3!Q!se0n6V84pw{q z9I(DEGoLz=A>Bz#JSgjEszo42%<`c|nl_5&=il#%LKP9}th4?sF#JeOxx$2Ih9U=3D^! C$(TF< diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Omsk b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Omsk index b29b7693118fb1ed214adb8a4e686172d0914b2f..dc0ed422f6193fb5d7dcb59dd0eb3e06eec8d4de 100644 GIT binary patch delta 156 zcmdna`IL2nv;+eZU}Rum0AY~O1ZiFn1;UOD3=C|We>3thIWjUcVSy~zg)x<~GEWX< okx^viVPHrqVBqla4PnqWFlEp-FlW#3D)0C5BiKmY&$ delta 600 zcmaFLx}9@^bUil%1UNA;Fo4(s3pYD#+q(F@fv9@z0x^kA0^%GS6~uo&ogne@$pXpS zk^)j^G8ahiDLWvuCjEfyoQMN*J)Q^TYpf0^IIbeNT z$iZfrq=W6QFAjFCza8vnU2||qz3brE{ON#`>wX94>=79IQSN9|NlQDGZO@|up&V=b|en6 z1Uj38g=O*zCK*Qt9tMV_0!9u7hL8kC9tH-t00tJ22m=R*gorcn`1pn}Xd9R^Xd9R_ sXd9S;BZUzHCP?#wVg@7xj-`#!JWO679`zjQMX@8fY_tu`>~zhz08$K=(*OVf diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Oral b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Oral index ad1f9ca1ca321f6852d1d654d1fb0b14c556330f..25a63ec8b9951c94fc00a8c6c9d18d2151b26dde 100644 GIT binary patch delta 143 zcmaFM{*h&Z^yCGMtRT$Cz`)1=!3+!x3=jzp1_lOW1_lQ9&6^nKFd8#5F|#l;AwyO+ z5M%-oSTWON14boPMh*rB3kL=PAKwrLZ3ANlZ39yVZ38m~Z37bqE*otFQ#)N#E&xHD B5S0J` delta 498 zcmey!@|JyqbUhaX1eh=|Fo4)1t0X7i*}8-~KvcbZgP6nt1#ymz3gSOMFOYcoX@lf# zbp@$2zp70CuH69lfax5<>#%Nto@{zuvY{PRwMf>jsRp~zu z)VSY1P-m4)Q2)x6pz-8)f@a0y1kEe=0<@0YP0-#_e=b31$^Hc0DH{^>S{5egmrP19 zNNG+mj9vG@sHpRSvF(HhCPCQ`Ol6B6m>Ky#F#8+wz(P7J!Q!sj1Iyn&308Y09$4Sj zOR!mHnqa$IAi=IpJi&g}rv!)8p9zjFd=KjX|Nqa(#LU9X#LUFZ$_9n(93aRFBE&%i z24-cQti_~c!N9@55R$;i!@%Gcz{tVCVBx?Z0Ae$6`1pn}Xd4(aXd9R^Xd9R@Xd8gS ykAZ=K5dJ5^27ob9!3TR1`uXoU|^V_%*ZscR)Udn;(QGNbQK0( delta 74 zcmbQic${&9vN$sX0|N;2G%zqQEXqnhQvd(|e@3Q>1@aS=l|d39%=7>M|NmjzT91He NkRk>K1_qcy4FF!j8>j#P diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Pontianak b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Pontianak index 12ce24cbeae404efe6921081d21289be452ff88d..285bed2c63a5debe034a661431d2a1c03dfb0dad 100644 GIT binary patch delta 28 ccmaFJ^qp~nvH$}E0|O%zgV+;vCZ3!D085<(PXGV_ delta 52 zcmey)_>gIWvML7y0|Pq)1A~0`|2~FYV)q$NS1#eW6!xy*y3H|;TmRJ!Y2 J1m%fg3jyo26{-LL diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Pyongyang b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Pyongyang index 7ad7e0b2cf8fa4fc844fe8cc9c58e4f3018cead1..57240cf89fb33139a92451ec2eb99cb67b2f49c1 100644 GIT binary patch delta 27 gcmaFMxSer=^27!f9!3TR1`uXoU|^V_GjVDJ09g42w*UYD delta 40 wcmdna_?B^kvLq`50|N^K0|QU@^^bEVJrnzJNk6e5^c+*c#Ae+I$`iv90SZD6pa1{> diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Qatar b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Qatar index 63188b269d077e29f48a42a03c2a52aefdb61320..7409d74983c8d0cd8347a663c3bfbc1c041124da 100644 GIT binary patch delta 34 ncmX@kID>J5^27ob9!3TR1`uXoU|^V_%*ZscR)Udn;(QGNbQK0( delta 74 zcmbQic${&9vN$sX0|N;2Ec`UrfTe5Ff%^ad|1&a8ERdg|tPGL>VV?j0|NjRmU|?Wi L04V~|FohZbWPupz diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Qostanay b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Qostanay index 73b9d963efc99f7af196755a6b2be015d9cb7a67..ff6fe61d50757f9afe24eebe9aa2a9793c40eb18 100644 GIT binary patch delta 136 zcmey&{+wlkv;+eZU}Rum0AY~O1ZiFn1;WM*3=C|Ww=&LQG-hOCW?^PRhpdbkLU1K4 klMNV^q!~GUd_x$t4NMrc4NMud4a^w0Y_tu`>~zhz0R7hsfB*mh delta 504 zcmaFP@|k^tbUil%1eh=|Fo4(st0X&Owl4nbAgbQIK}_O+f;h)U1@WJs7f8JPv_bN= zx`Nc1@(t2^S}w?}DZL;&C+&hJ zq?862#xA&ER8)Pz*tY3{Nl@$sQ`wXYW=8fG%>KGvu#k=ku(+#n!Sc6VfYn~E3)Z(4 z0&JG42iWdr3b1SA46vW|B)}o{b%0|F!-e|)|Nk>GF|#l;F*7lu*v8<^VZnsNaE8ZQhf delta 508 zcmeys(#SDEx}KW>0!$eg7(i@+Rg!HBwl4nbAgbQIK}_O+f;h)U1@WJs7f8JPv_bN= zx`Nc1@(t2^S}w?}DZL;&C+&hJ zq?862#xA&ER8)Pz*tY3{Nl@$sQ`wXYW=8fG%>KGvu#k=ku(+#n!Sc6VfYn~E3)Z(4 z0&JG42iWdr3b1SA46vW|B)}o{b%0|F!-W{>8w=|H|Nqa(#LU9X#LUFZ%7z5lSvjPU z`6z4-rpZQ3%GL}V3=AO&j64hsZUKy7HUkergn`4yH-tgkz=T2Dz?4DTzzh3J+05%YMM*si- diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Rangoon b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Rangoon index dd77395b05a89b875683f8aa82062748f2ed504c..14b2ad09ead50a62d5e2b426396c51f9beb293be 100644 GIT binary patch delta 43 xcmeBS+RZpYdEx{X9!3TR1`uXoU|^V_%*w*Rz`!zbt_m|F6Z6Egk`v!3005{-2w(sJ literal 268 zcmWHE%1kq2zzbLz7#KiUsDXijVd1CZz|)`pNL-wi{-OT=|No3k%uGxS3{mD?!es+?l%1}bm9YUA02U)YF8}}l diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Riyadh b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Riyadh index 2aea25f8c210369e0b805d0dd5f0e899190c2340..01c47ccb86ccbde2bf9ad0803298e8df87178a34 100644 GIT binary patch delta 45 wcmZ3=*vdFTd13+!4CrM^VDa${VbC@(W+26+|NsC0 U2bl&k1GkA>HrfWpcDlw~0P?IEKL7v# diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Saigon b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Saigon index e2934e371b6d5cf80244d8d55594f7094bc9cbb8..7ca99725028879bc5ed9ee294795b4d20229f83c 100644 GIT binary patch delta 49 zcmcc5^oDVQ^27}+Jd6ws3?R(Fz`!s;nU#})fq`}6ejg4-CT12UW+vu|vGS808RY=$ CA_!9e delta 138 zcmaFEc%Ny4vK1Et0|Ofa1A}Nsk8{Js#oAnFO`kPfj67Fx$=dG2RioVkPqsa2c&k5y zfy?$dL;e5%{~4K>S(uoan3*Q7mzQQ>NGf39^zjX02mle<2IdUf1{Mt329^vHlv%-M UPmJ~vWME*x(8~tVJMo+x06Oj`=l}o! diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Sakhalin b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Sakhalin index 485459ce0397787a099064952c66989712ae707f..69f0faad1e7247882721bb81a7242ddd4b1d269f 100644 GIT binary patch delta 147 zcmdnQ`I&Wsv;+eZU}Rum0AY~O1ZiFn1;S1Y3=C|WzcGq1IWaObVSy~HNP;Y^xFItu i^WF@h5h{@DVJ?ub{!*Zj{j@+a`dWdK_wfQ{>m3Cu+A9lGrDqkW zad#J}vuyjI{$=?GjVH?)G%NfWG_Q1i&^l7}L3>Mm_6MCMF&}iN_CtWSYak$Qo#tzLmika&ZstXzYc;m-!MzYGl)(qar2cOErZ{`$dSwdY8K^{rbB zHcKBe*zVfHVApz>!G6{}28Yz8435pa8k}6)8Jv^nG`Of{GPpX|HMp^QGq@`!G`PP@ zZ}4PxYVb@t=h@)(Sf#;xopyuI8Ak@+KHi29?_D3lzHMTt|Ns9#BQp~OvaljSHg*&a z8#^w@!p_1nc_WjIIRg&^!-@lp91IMzHZbxqF!U^75CE|mczk?A7_<#68MFh#!{~4K>S(uranV4Dm*;tVw>tu6AIb{Y0w*UqX28NIX zMjjvE5C&}n69#PqQwD7VGl*ju87D~df?NyYf?Yl_`iLTkgK9dm(QK?>!*z%-oXbYr Kz|>CHlnVd>K^$!)3o{9aq=dOJc5gF6i^(g?>TBi|1c5UhxN2ygGg@ zlX@!U~1O2@@3a(kCc2J55mb^PIrQG})8UUW|dEX8|LR ok8cQrcW?-US8xb}w@V1a1Z7sR<2FX?GRk6C!sQ(tqHDUAE$@#P3o6{- diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Singapore b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Singapore index 2364b2178b03853b1771cb3f34b964fdb82e2e91..350d77e28ee770be54bff6aea7f03ebbb82effaa 100644 GIT binary patch delta 50 zcmey*)W9@BdEx;U9!3TR1`uXoU|^V_%*ZkEtOq+I6Eh1d8|%b~Ku#_jZ37ECT?;M% D`g#cF delta 90 zcmZo*`p+~$*_4xkfq{d8fkB~xfq|i|xpncbbiWA)xSk}O+Wa)(^u&0MOCGrp{_ ksQ>@}KO++}3o9Ed`^05|6O diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Srednekolymsk b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Srednekolymsk index 261a9832b3ee4bda7c9935b566a7f7f0e6489e97..7fdee5cbee2b1ba0904a672dde16240404466fb9 100644 GIT binary patch delta 157 zcmdnN`HXdfv;+eZU}Rum0AY~O1ZiFn1;UOD3=C|We>3thIWjUcVSy~zg)x<~GEWX< pkx^pgVPIHsfPuruH-tgk(11bP(1=0X(2#-4M%&QPPS?F@h5h{@DVJ?ub{!*Zj{j@+a`dWdK_wfQ{>m3Cu+A9lGrDqkW zad#J}vuyjI{$=?GjVH?)G%NfWG_Q1i&^l7}L3>Mm_6MCMF&}iN_CtWSYak$Qo#tzLmi5NCm@tU!U8;p+mkKc5OLq}e}M+__R<`RnBet3BHatZ$wE zV6*hn2isk1KiIWy`Cvb*|ARy7v=5HWYYLoPD?T_U_Z7IPMtyK~E+}wgwfW$#98}=` zF0#Or*`&ZT_MCNr*JH5)?{%^TK4*+R`1bxU2=QL?p#J~=|BTE`5Xi!c1lib;ILH#{ zYz`Kd$t##-92s~R7*-r$?nIIaC~)m4e%n$P|Z*KPJQ z++a&9xGDRo;pX$1A8!3uW4L|dY{8uekqviOF?_gJRLpRHYf8a`npTE~)24rT6uYD0 zarx#3|Y~VV#_k-Z=g$+U>cMBMqCU0bvpL~FkWAX(? w2{8tSf(8Z_AKwrL=im?quiy{{XO|F$3CgTsUu}%;Wt7FPgv&WNMAw1~09TZ8hyVZp diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tashkent b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tashkent index 32a9d7d0c9cbfa841cc4e922fd1b486a34b57370..65ee428ce1c5093a4b3dd29512d98a33b4c753a0 100644 GIT binary patch delta 109 zcmX@l@{VbOv;+eZU}Rum0AY~O#E;UvAR2^0idZL0G9Hm&WM;wwSr{k(W0a9*TZE*|= literal 591 zcmWHE%1kq2zzR5^qLK^@3?R0^D#>Qft&86qh^p5v5R=#>AkMK-LHy^_2@)@#EReh{ zDIj$wbAj}pvI8<}(htbai8vtF<9R^7#_E7Vj`jh?7?}e~KD-B%t^XZR(SCnGRrh#!{~4K?AdrO>39_-XGcY)O2RX;42T8=4u}Q?5Qqi^5{L!`6o>`|7KjD~ z7>EW18i)o39Eb)59*717AczJ9B8UbBB$)p4&H+S&0u)5kB~ZC+v<*z{bWOPcUF~}5 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tbilisi b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tbilisi index b608d79748884c4a8271e695fe4ed992a91fea65..166e4341d6ce65728367641a467a925800044df6 100644 GIT binary patch delta 124 zcmeC?_{uUtT7m%yFfuSOfG|jCf;2CP0$~#d1_rjx`x%!o8Z$DnFk^wNOkfC-L6c@> ZnmnIbnUQhwLuN5fE*otF6FXfKE&y@%3atPD delta 517 zcmey$(#0!$eg7(i^%1_lO(Rg$w9pWosM5LKUfKuqGCfjGxm2k~Ew8zf#a z9FV+iY9Mu{^?>xANe^V!G(V7?Q}RHrC-s4RP1pm49QOx`F%}P$d^8^@+ekf7(cyle zD*fky8u!}=>a3Cp>R-7MG@f!6XkNJ&pmpS+gZ7sC0|7cq7CY!pSrnkx((0gJQs!Wg z5@}!bet37`XSl?zbuvsSQ zV7u#?fnDow2m4tk3>;GLIyl@tzQM6Y=7W>#%Yyp<|Nk>Gu`oj*D;pAI=aA-P;$-3k zNkQd7Oc3VeV3};hq-@6^$iUzhz{tzMVBx?h$iSdwz`zM(TR1QX`uK)0ggE(zFlZYX zGiV!_GH4r^Kthy}k&$ttp)4;bR6!!(5Z)NQgwY1X!|N&nj`F0;Q49=RHrfUzcDg29 E0P53sH~;_u diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tehran b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tehran index 8cec5ad7de2f2c14dd4b0a6c375d7198ef7429b6..f1555f0032f55d90a01db26c09d50bb5deaff5c5 100644 GIT binary patch delta 62 zcmbOxa)p0_^5h0479K_h1_lsjU|?XFpv-!bfq{W-b03or8!ICd3p2~)j~u%vUtr{% QtiYr)*^5bL@+VFe0EaIP(EtDd delta 516 zcmcb@KTTwUa(xN|0|Pq)1B1-0oZ1tYZVR2@+r7wxzeLwTpwGcT;H{N|U}*XYAy=;* z!sc&Ii0F#$&`>Blp>cce4$aeZPH62@+M&JXf``uhFbmy2<`a4iojdgN%{>ef_gWYR zWSuZ_`mn>;==}*3)zTfNBFY|SY%49yzJ{GJe|~3&#kDRE%aip27FIj?J*-zxwXm7x zbi%gh#16aaG7tOQKNb!#D^EE3>+f)~*E`{CxMhd?qmv#USN$zKkNSCdZNFmSy{z$s z&rJ3mzU^B*{Hm-i{4-vh2#C(x5$K(JBFOghj$oaI9wGAT7NNXXPJ}T;?Ff6%;Sv6@ z&m!VtuSet&VT-6u2TnxSFLm1yGx>{0Y+IE@T&enr`1G|q62jM(l;x{|; zlV*7ogeq7Ry2^VLnJ={{Rtq{&B5`9!DSMko=`S9OvKKo~l;5`BQE}Stgkt61BRi_r z6nRw7`(aVjyYxhDgZ7TPyqg~NiSZVUOf1YSlQ*!%PcC3rQDR^)v|!-y@eN@J@eN_n zHZV3eV9+)&WzaS-0byeUh6&27r$EuUG1`ZXmw|zS;lBS-xFH87A7Enz8N>!LXz~)5;e3DEg9|Gw zFI;R%cyOufWWnXs4GmYaA6&Q|C6aLczWjk3`dbTb%DFwbCGg_It=F3$+}>isaA&8& zgS!uU8SZU4*KmKy{)PwLWeg9)Y8f8w^GbMZW^&=lobL=z#l$W=E2+Qy;JM(Xh8ODp z8D6~bzraz`{ea`|h6|kEUL|lXGrl1FV$}l?1PYP2g(Yu0V+`j391bC0czZDAE;e>c0v91`3D*Ym;*Ggyh+en zDSttGcj^P3PR0wmv)v!)#jgy|udmj8VBm4|f}zK>2Szq|0mg=#6HKK3T`(1#nqc~I zS%5hUM}zr!#sZ6P@eP)Dem=0e@V3BuU37xY;sph^3pOR#H8&O5*UW$5P;6G<7_cP4 z$)}&e*~7oUMW>L#RqopdH=bYyw>QZj+~1focs&1F;CV)z!E4`~58kVPGWhgxeyI1I zD%#-JKD)rbF^eWeW`DV5Y_w;aV4=K z@+>??f+5v* zQb8IUOGCPBNkRJ4XAK#D!wNEwo@mIrYY|zHy>wMW&asdWxvf17dCSZ`-QC`$eHp;#}Mp~Ushhf+R&hBCdM1!eCH87la07gU@RW~h9(x1eh6SBC0y^9yRG z3pUiQYb>ZM``l39ms~J8pE+rAKeOTFi_CIt3=CQZj2x5SGmB18W(6m?jnN{^^$ZLQ z3?R>fXpo0NG|1B+8su>h4e~sg{!$N0q70xw0P#Tq0ir>H0irhfI=KZgF+odgF+regF+uf zgJJ+ggJJ$uB4gB^f7x(oq< Cq>(xR diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Thimbu b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Thimbu index fe409c7a2a40294af6bae4523492be88d38a97bc..0edc72cfe46b1976bff562929501f202a205d0cc 100644 GIT binary patch delta 34 ncmX@jIE!(D^27ob9!3TR1`uXoU|^V_%*ZscUV@Qv;zBI|bnymi delta 74 zcmbQmc$#s7vN$sX0|N;2U4156qL}ErqW=H?|BOr%3lt|PD}y9JnD77p|NlV>7#J8B LK#D*#OraJ4L!cM! diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Thimphu b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Thimphu index fe409c7a2a40294af6bae4523492be88d38a97bc..0edc72cfe46b1976bff562929501f202a205d0cc 100644 GIT binary patch delta 34 ncmX@jIE!(D^27ob9!3TR1`uXoU|^V_%*ZscUV@Qv;zBI|bnymi delta 74 zcmbQmc$#s7vN$sX0|N;2U4156qL}ErqW=H?|BOr%3lt|PD}y9JnD77p|NlV>7#J8B LK#D*#OraJ4L!cM! diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tokyo b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tokyo index 26f4d34d67b46513491f26c2e661c6e653cc130d..1aa066ce38fce7bd0a680f51d6f075718d153a77 100644 GIT binary patch delta 83 zcmdnWbd_;}xC{dtU}Rum0AY~u1aUzS1;d;S3=GT@*ZMFrO$?M0_VEp2@Nx-Z@CpuL M;PMI%(Y53P08N4k-T(jq literal 309 zcmWHE%1kq2zyK@^3=AL)lHi20c^ViP7_Qqf6Z delta 598 zcmey!dX#g5bUhaX1h_CTFo4(s3!nPk+`9Oof~b1_1Tl#v4B{M%1;l?|Z;*I-ZGz-& zZU(6{(G#TiWNeUG6S+Zlj@Jgc9_tPAH98vHU^u#k2zu(->!!Sc6~fz_UO8?0}$ z7}zZ1Hn2JOa)a%zFAjFCza8vnU2||qz3brE{ON#`>wX94>=79IQMpB{BfZE|NsAt%uEo- z!iogh*pWC$5*+MoXpn`Sg=O+CCK)RR9tMVj21X7BhNJ>U9tMVx1O^ruJE?$y$HzB> zLEFHLLEFHBLEFF_95IZHjEoG76Qp@TkpmI|N7Tk>873bPkDBgtCf|KrHrfW}cDm+V E022+D+5i9m diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ujung_Pandang b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ujung_Pandang index 556ba866933d37f3cfcf8042045d64e209bae30f..5990010b649745369501c7641c401bcad4345b85 100644 GIT binary patch delta 27 gcmeyzxQ}sy^27-&Jd6ws3?R(Fz`!s;XX5;L09?)m@Bjb+ delta 36 scmdnT_>XadvM37!0|P4q1B2+oPq7nriCvv=xVD)nI0_!bnCfF=ly}))#-vqms-Uaq01rr=n@)tOU1Wj;q30&Z8Vlu%+#dv|M zY@k4>=&S`{tce9-UuzbGKXops|NsC0VD)nI0_!bnCfF=ly}))#-vqms-Uaq01rr=n@)tOU1Wj;q30&Z8Vlu%+#dv|M zY@k4>=&S`{tce9-UuzbGKXops|NsC0HrfVecDiO<0C4IW(EtDd diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ust-Nera b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ust-Nera index 9e4a78f6a547de2a91e728ac4ab5ffa4884105b4..c39331e3aa7d7c3c9f38e8ef83e739f0d09194b3 100644 GIT binary patch delta 162 zcmaFD*~~UUT7m%yFfuSOfG|jCf;2CP0%0cx1_qAJ{7fQDPK-<}%$Sgs4T~VAG8Sfb yX12+BEJ~B-u<$AQ_=YfO8(1)C8(1=E8yYfb8yYca8yYZh*=QRY*y$P?Z~*{uxD7J^ delta 587 zcmZo>d%`(Ex}Jvt0-PBb7(i@^g}3kS+Pe5CgQ$9NftW=00dbD33*tZLJ4n2o7a)1- z(gCS6$^p`Q3<_k{C>F@h5h{@DVJ?ub{!*Zj{j@+a`dWdK_wfQ{>m3Cu+A9lGrDqkW zad#J}vuyjI{$=?GjVH?)G%NfWG_Q1i&^l7}L3>Mm_6MCMF&}iN_CtWSYak$Qo#tzLmi5NCm@tU!U8;p+mkKc5OLq}e}M+__R<`RnBet3BHatZ$wE zV6*hn2isk1KiIWy`Cvb*|ARy7v=5HWYYLoPD?T_U_Z7IPMtyK~E+}wgwfW$#98}=` zF0#Or*`&ZT>6~?e*JH5)?{%^TK4*+R`1bxU@XP(;5aPY-L;e5%{~4KBn8A>h4GFSy zAaRf-(Ak`<92}E3GAXHn!gj?0MgazfSsNI67#MmMFo-ZPtT@0R03t!+Ad$%rnIu4w sz`(!=0TZNoA$$e~a0G3P7Gd%RMcBZ&O$=l;%xzpY+J**px`qZ^02&FPC;$Ke diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Vientiane b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Vientiane index c292ac5b5f489a88bf10a1263b14e7412479d9e7..ed687d2985c208171adcaa3401496b05325edca4 100644 GIT binary patch delta 34 ncmX@kID>J5^27ob9!3TR1`uXoU|^V_%*ZscR)Udn;(QGNbQK0( delta 74 zcmbQic${&9vN$sX0|N;2G%zqQEXqnhQvd(|e@3Q>1@aS=l|d39%=7>M|NmjzT91He NkRk>K1_qcy4FF!j8>j#P diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Vladivostok b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Vladivostok index 8ab253ce73555cbbf42ec67a8560acef080fc480..72a3d4e87a0d6f568eeb84b4a9dfae0b679d23ff 100644 GIT binary patch delta 157 zcmdnN`HXdfv;+eZU}Rum0AY~O1ZiFn1;UOD3=C|We>3thIWjUcVSy~zg)x<~GEWX< pkx^pgVPKfGfq}!vH-tgkz>-1R(2zmf(13xlTB} z(uWMTyY?{HwH{`$pEZxcA$2K(WAm;CC)aic=j1sJE~=RfuFiE0Zmix6?#c-b?(fnY zJei#uJY&y!Hh4W&Y4BdB-QaV^k-@i*w;{xP*N6K5|Nk>GGeIB=D-vX5N8%t$ptCtx zSSGJvl5u3P3+ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Yakutsk b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Yakutsk index c815e99b1a8f2d4b9bd45d3a6f39c95db5bbf563..336f932e8d458b5096d4aa9483f3177f8d5888eb 100644 GIT binary patch delta 156 zcmdna`IL2nv;+eZU}Rum0AY~O1ZiFn1;UOD3=C|We>3thIWjUcVSy~zg)x<~GEWX< okx^viVPNQ4z`)_-8^WM%V8NhmXuzOtV9CH`qitYmr)$Xt0DBw^pa1{> delta 600 zcmaFLx}9@^bUil%1UNA;Fo4(s3va)Q+q(EDgQ$9NftW=5196VF58^*}CrG^9RUmom z-2=d?v`Ov7I10M{j~$kNgDr8i5H4IgAq&qd!eh@_sx)+4{-^744%FRHe5~ zP~%=cL7nBYfclps0vb;aD`-|^D`;L>CZKg>x`6hU`VIk|C6xlYQ?dl~TA~H?OMC2cg6**5Zw)L7|5~Mo8R90t#nGyR0v%h>3ETmNgEbe@mVELO(z-rH>3D&n> z2-qxrFJQatlz?69MFIO+YXlrpHw!p6pP1m}I#s|qdDR3L)p7w>=bi~}tdRol%6Svq z-<3}AWDc0%8G9~#g4biC3Et~0C-|K47x3+qo)F@FlA-?p|No54Oc2PziUir%kvPZ_ z=xh!amdPuaWE>fI7#MmMFmf<3)JFmQlKh&Tg}k8cQrwt)qMwxI!o swt*!$QWzm%f;2BEWD?!es+?l%1}bm9YUA02U)YF8}}l diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Yekaterinburg b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Yekaterinburg index 6958d7edddb85d298c5f2b890b21d9ca2056e9c5..a3bf7f29b6f14debfbd0f8ccb45f1ea338009ef7 100644 GIT binary patch delta 161 zcmcc3`Ga+Wv;+eZU}Rum0AY~O1ZiFn1;S1Y3=Hg>xtT+Uc5d0RV?G4BP+! delta 616 zcmeytdYf~CbUhCP1UNG=Fo4)1v*S6{7Yc3szjg6n2T}Fz4Pp`p6vR398;Jk>yg=gR zrwx*~)fJ@9ly8vU({e#(P3Z;MIcXQf>~0F5WV6ErIpCum-|7oc^d{(OM;mIDDgOEw1RPFWP7*D^Uk zzoaF=Af+_GFm}NOqoV2y#Gu`oj*D;pAI z=Ro2hOQ5qkSy?AkNnqq*U~mgy6kuSmaA4p7iGac!Ce9$>;~T;d;2XlA zZD7KnZD7WrZD0zC9YzS4Ak7PkBaj$4zBWdSFnNP`RCKC8b)3p&qitYnr)$au00Ehr AL;wH) diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Yerevan b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Yerevan index 250bfe020ada912671d670e77403a269c74b658e..6dd927cb94101609afa1d505129296370cd8aabe 100644 GIT binary patch delta 147 zcmey*afEe(v;+eZU}Rum0AY~O1ZiFn1;Ta=3=FKBpE7=7v}0su!U9jCLKlOD*dX?`F(r{sZLPwE5tny?27IqnY>V=Nvh`Di{+wvl?EqQm__Rr=2Z zHSV_$)LA7H)W32iXguXC(7f`iK~F{e3+b!`i@RnIEPwkXSnZW~V0~LJ!Dg9hg6(dB1iLoz z1p8T^5*$*0COEe6J#ccpo#34O;em_l-UL_YOAp*w=O?%;Z+YPUZubLE=4lT+&&_?{ z^|<1J_qzHAK7MDWCiwOxKJZ&po>2e)|9?hiCJ1C3XkEDvL|Ozvfpv0~t1 zU~mgyZ~*{0Adv(B diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Azores b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Azores index 56593dbfff9bc50bb32e64ff282d0502e75526c0..b7f75a9cf6501c55bbeab18694b69f3c0f47a2d2 100644 GIT binary patch delta 203 zcmbOuJ)3)ixC{dtU}Rum0AY~u1aUzS1;bqo3=Hg>wOB(~k{Fqph=(jp%uL9bD4mlx oGAnSfv9N;SCFR+S@d%~(Os|D7cJR-1exr4y^1=$le zv?~d0?CcQORA4t@bJ3CsTLKg&Y&Xi7u!H}}gdP8{PT2YW*n~YNt_bYiaa3U6{OSq& zXDk;uFq>E4U`40Ep^Pel!x7m6N9+|R9JTNjIA*n3;CRG|3CC~#o^X=Ud&0?&HWN-g zsuwuDHDBQLn*$7I8ZsEp+}SU1c50x&*~94#=Zf|-oI84Z!ue8Tf%9ux7%l`YWVo<& z?}Uq?q5>Ct(ikooH8Wgloj>7n8=MCmZv5QnaP#FN zhdVn<9qw*gaNypei3jdaYC7#W23u6+(4s@6Mv%v#{^Df#q) z&%t{Rd~sfT;H&Yx1K*VU4}2GHIPinH@W7AHNe6gmYYOmnO9}9|xK0o#F`FQmqCP<= zL~Vhv3+Dt86OIL<%0Cx~3BOt(&U|};_~$bVBp#pMAbEM+0;$9E7fA0ptst{zkAm!+ zwF+`Q^AzN3`V|y%8Wa>`3Kf)mk`$C}f)!MBTohDgOcm64)D+ZN0~e@&by}eD)OdmB zRh0!=M@1KCZ}~AnXUWS6x>IgV&}%t8LBC|r1cQ{d6AWW-3K$h_5iqvhEnpHfO~6!k zu7H_Qg@D=LdI1aRDHAO2CJI>oE}LMr*IB^&cEkjmW$_bicUw)cYjd1nKU-#kLz?mg z#}-QgCpXp!&MDFYE~?KbxH|t8aAQ3=!Cm>jfcv{=0-nqV1w7B45b%1uSipPTDgmD} z`zQGJ^$7T_SvbKzFHaz#r+GqPc-MrWoYV=y<~b8WeB395iu+9n)6tv|_T6AYgs7W9 z#C4$wkzX|gqPBgR5Pg+PAZCG}K&ci6G(`^Dv((FYC@9zc7f#BGZRwe zX9}d+uA7j?v2{Ya?1TyFFQ!k(_**m~^F-x@th*r-vR6b;$T?OhklSH9A#Yi*Kz@e& zgn~9xfxXJlhyW?>}~va_(VAY-ERak6vZgkC{j2N^H3>d;)LqJLx7(oC;f_V&#Ac~QZloIg&|NsBvY^5iFXi!NAqCur0 znEv;80f+{biXa+PGJk-!1ACH7Q_dYvLG5%(t_## zSHbe25*Ne=mAW7rRPusoQ0WVzK_xJV29?4f8dMU4Xi#YkqCq7xhz6C)AR1IMgJ@9c z45C3LG?>2m8*Cq_qz3Upr8S5KmDnH}RBD6iHwPF%^qGbX2z_Ti*#DqX93&1Z$w4%z zGzZg1Z-dPRmFgfqsALDx7lIao^@B=y5Fb>^gXx|$usEo+2k}8AK8OaD`XCxq@`Gql z=?|hoH2{bP)dC|5gXv3#v^(d{B)7qCvF^hz8XxAR1J= zfM`$+1EN8-42TBRG$0yO+kj|LjRT@VwGM~|)jS{?RQrHvPz?m4zY8}U0MVeD2uy!Y zIsnQ^pc)B8gK8xZ4XT+yG^ln0(V!X%M1yK65DluSKs2bf0@0uv3q*rzEf5W=xxn=2 zGYdd8s0IVkpjr$>gK9Dm4XVvRG^j=c(V$ulM1yKJ5Dlu`Ks2a^1JR&b4n%`$IuH%2 z?LaiB#skryS`S2nYCaGRs{O$9S0}JLK(!!<52^`4G^jQN(V!X;M1yKY5DlssK{Tj# z1ks=x5=4V)Ne~UHDM2)-wgl0j8WTi=YE2LgsyRV4sP+WYf9nN6G^iE@({~fWd{Au) z;)7~b5DltTK{Tjl1<|0|6-0w-SP*SLTV?`?2Gz768dTeYXi$v{qCvGThz8ZXAR1Kr zf@n|;45C4`FqnS#3~WEBHU{xQH8O|>)yg0mR5OEUQ0)w&K{Ygp2G!Ca8dOt*Xi#kp zqCqt_hz8Z#AR1J2gJ@9g4WdCcIEV(-;$Zr_0oWg)+8o3O)#xA^RI7t%P|XgaLA5)G z2G#H&8dS@JXi!ZLqCvGihz8a8AR1KbgJ@9A528V}KZpjk06;XT6#$|^EddY>Y7Kzt z7t_J+0ksN1d{D~(M1xufAR5#{0MVdU0*D5+6hJhnwE&_)Ed~$`YBhjpP|E>CgIW(D z8q|US(V$iYhz7MJKs2Z|0j57Z0>=laRRQ9IS{5K0)VcuCpcV#*2DLIkG^nKkqCu?< z5DjW^fM`&w15A&$Jix6G+O<5mY;+9_?F?N!?Mpf6gDSt3QP;&Vwjr1^`Rnw`$2gE&&??pcn?G- z@a-(Sz`wHefxyg&3xb{D4}>bME(m8@J`jnNxghE({Xop(-vx1vzYipoqyr>5?mv)X z{2L(k@lS&E!}|d;7w;v=9y}NzxA8!N{KCZn3Zi1Q z`UeTNyNfQ^^&d*GpB-|+p+0{}f@4czfRle)f^$l6fQx=cf~$*Zfa~X358QPFFSuW> zdEm)we8F>b+yk$-q8Gg9R44dcGYasniB0g^CKBKuW1kQ(^;5YJ38RmqL z&|Lu`zn>AALT<-}h$D|5ME;v~A!^Cd2hsOxF2uAfe-OJb?m~TBO6P<4 zc@7s6e3vC8w#Nn}>2@R}r`rdl@Ma~Xx+?~xzV%5+S7#1LKdYCJ$@VlLbFDx^*0bXQ z+0%3$&I`q&TOO47XJ07!cQK*Nq9dT} z-sXe~iL8K%eNz)EfA|Dc%_~o+zM&@=P*WF~P`g7Qpf1ijp?>Hk;BI~guyX5gu&4zgkgd*W8=nf4W@bq1_lODXo2a= zH4i{EDAd68<~T4P6nY>&CY zD3rnU@2B+%AO$AWP07Vx_02E~)8We3{`m7#U9u$2bJ}3%7G$j@G$?98G$?vOG$@KeG$@)ubaA%m7O;;&@eL9H#W{!u#XFe3 yw;AjJQ2c}VpfmuYLFoWQgVF+suD+oc0HQ%j0z`w71&9VE4G@iJ6V$(&Owf3$IzjWQ*aWSk>=U%N{FtD#*VuH=G_zAYVttQyDIZm*jEi=I(O?iT2i=}{*8|wt;6lnn$)#npjo&O5Bv7VgZ zu6$p>{oOMGPv(OHp65;ocs*V$;Jt2@fX|uz6MXx61pL-4oZz3AClJunJRvZ=YeG;? z>V#nPoCzU5?h``A{U(IzXif(L7S;SVW5pbQJT0wv7wwmiR({+Qb7iR zGJVkrWgi|1RPcSDP;udiK;^re6RI{W6R1A7dqU03LlbJ(&7DwJxnx3pU;P9|CT12^ zy2JnfKTcp^`2YXo2L={UGGpLiVBiyA8TzYcTzJ-vkg1O5PwEl*B<&;C0r5fE1Vn?f3Wx?}7Z44~G9Vh1Z9p_A>wsub_5snLECixK*$6~~vJ!{} zWhW2~%2FU2l&wHCC~JY~zx4tj8kEJr^xZ@-AC%QVd{A}+(V#2`qCwdXM1!&(hz4ap z5Dm(LAR3enK{O~Uf@n~71ks=@38F#S5=4WtCWr=QPY?~tqG0;nGqC-jtP0|TvMY!N zWmymn%C;aHlyyNgDEoqFP!7iXadTDuzHbs3-!_pyCKb58)z-E8I2208~)v_!{e(>KW)8>i8NO HfLL4rM@+Br diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Cape_Verde b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Cape_Verde index e2a49d248de086306d2dd16a2b2d497a008c8f07..8f7de1c0a19a8d3e0e749626c76c8d4dbd3c4de7 100644 GIT binary patch literal 175 zcmWHE%1kq2AP5*47#Khpq>uE{qR&j7qX42WmDC7;%;6UQ z?!d^z$o&8R%P$NJ|NlRJz`*kV|HluE93YZ`!^by-LD#^DLD#^Lfy+kMz|hW+3jlf@ BDnI}L literal 270 zcmWHE%1kq2zyPca3=AL)k^s>l%roiPss(4J&QZ8jQX{}E{@tPe|NsAtOw24S|Np=I z!ocwV|KkS?EdT$1{J_Y8U^8&|_=Yg(8W=I?8W=J#FoH}35u{lB|NsC0Aj?5C$N?Z4 X6e|yQ1S^8P_}UuP|-0HP?b>^P~(vh zP-k_Xp#Iflg2q$T37S{MCTJaHpP;?v#{``vFDK|uxivwr<@5yol06d)Qr1o|jJ+vf zRJ29F*mk#oNzgO_Q`xx!W=0hPW`FAiETpGQu(+EjVEMajg4JGU0qffl6Ks~nPq5u> zHNmdUaf1D9nF$VQ$`c%0ECrn0SSL8ANDH{AKA+&~{8zw@_2dM1<@*Be@16;GG9MK1 zJa+xa%?{%vLe9r8j;M>Rd4dnz%Tz?9b3Ni?k>5EP%`|wDhg75o; ziVH^sD&O6lP_<#1K=rxZ6KZB2nozrL?u5F^B@^oV>L)NVG1D9V|NnCZC_O=v6Q2Mh z2bjm=;~T;d?h3-eAq)%*jEo>mO1k|2|Nnnb+5{N~N}nJaltw``D4l}o&-*5TXi$0u z(V#R7qCx2vM1#^Uhz6x!5DiMhAR3g8K{O~WgJ@8C2GO824WdEm8bpKAHi!nLZx9Vi z;~*N8&OtONt%K>WCSZ4f(maR{O7|cdl=eY1DE)(IP#yr$pnL$LL3sg0gYpB22IUD5 z4ayfF8k9FcG$?<7Xiy#j(V%<+qCt5DO#iJH0MVd41E%jLg887l1LA}74~PckArKA9 zM<5!Mmq0WqKY?gao&wRJd(Xiz=`(V)BtqCxo)M1%4qhz8|L5Dm(kAR3fEK{P0jf@n}a1<|0q z3Zg;z6-0ybESUao0FDn(-UabN`4>ck@-T=7F#X{X zI6gpS2#60VM?f^FECJD=@&rVK$`lX{Dpx=>sB8hzpz;Mo4}~&@E8I22Alx-LM90@y R&s5Jq-%!Wb&;Z2Z0sy3qm&E`8 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Faroe b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Faroe index 4dab7ef0859c244b916d61b7489d7371881e0ca2..9558bf7180acab14d3b3f63c956f5224f680b2a3 100644 GIT binary patch delta 128 zcmbQvx088-xC{dtU}Rum0AY~u1aUzS1;Yvq3=GVh4=}MX+A}iYhyVZoTmjX_!oa{M Wz{ug_8^RFo3c|r543qz`Ndo|fIt_&Y literal 1815 zcmWHE%1kq2zyK@^3=AL)k|>6e|yQ1S^8P_}UuP|-0HP?b>^P~(vh zP-k_Xp#Iflg2q$T37S{MCTJaHpP;?v#{``vFDK|uxivwr<@5yol06d)Qr1o|jJ+vf zRJ29F*mk#oNzgO_Q`xx!W=0hPW`FAiETpGQu(+EjVEMajg4JGU0qffl6Ks~nPq5u> zHNmdUaf1D9nF$VQ$`c%0ECrn0SSL8ANDH{AKA+&~{8zw@_2dM1<@*Be@16;GG9MK1 zJa+xa%?{%vLe9r8j;M>Rd4dnz%Tz?9b3Ni?k>5EP%`|wDhg75o; ziVH^sD&O6lP_<#1K=rxZ6KZB2nozrL?u5F^B@^oV>L)NVG1D9V|NnCZC_O=v6Q2Mh z2bjm=;~T;d?h3-eAq)%*jEo>mO1k|2|Nnnb+5{N~N}nJaltw``D4l}o&-*5TXi$0u z(V#R7qCx2vM1#^Uhz6x!5DiMhAR3g8K{O~WgJ@8C2GO824WdEm8bpKAHi!nLZx9Vi z;~*N8&OtONt%K>WCSZ4f(maR{O7|cdl=eY1DE)(IP#yr$pnL$LL3sg0gYpB22IUD5 z4ayfF8k9FcG$?<7Xiy#j(V%<+qCt5DO#iJH0MVd41E%jLg887l1LA}74~PckArKA9 zM<5!Mmq0WqKY?gao&wRJd(Xiz=`(V)BtqCxo)M1%4qhz8|L5Dm(kAR3fEK{P0jf@n}a1<|0q z3Zg;z6-0ybESUao0FDn(-UabN`4>ck@-T=7F#X{X zI6gpS2#60VM?f^FECJD=@&rVK$`lX{Dpx=>sB8hzpz;Mo4}~&@E8I22Alx-LM90@y R&s5Jq-%!Wb&;Z2Z0sy3qm&E`8 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Jan_Mayen b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Jan_Mayen index 15a34c3cedb7c9ca519c195f5ec0ce9d8d1885a5..dfc509570a5be7ea90f64610ad5ca5a58fa3d172 100644 GIT binary patch delta 133 zcmdlYxP*0rxC{dtU}Rum0AY~u1aUzS1;bVh3=GVhqnNKSIxsPk3mF)=L>L$*7jj5W Ip1~ml06Gi^Hvj+t literal 2228 zcmWHE%1kq2zyRzF3=AL)lIVr9c^eoQ7-p+KW|)1YI^o22--I*Iy#>y$6rXTzk+Z=0 zNhSgpnp6cY7KsU5N@5pyyxYvk83vaA|_DuZw_)@vjM@%C9Gg3E!C@&U|))_~(5SBp$Dy zAbEMg1gXOlCrIzvDIgV&}%t8LBC|r1cQ{d z6AWW-3K$h_5iqvhEnpHfO~6!ku7H_Qg@D=LdI1aRDHAO2CJI>oE}LMr*IB^&cEkjm zW$_bicUw)cYjd1nKU-#kLz?mg#}-QgCpXp!&MDFYE~?KbxH|t8aAQ3=!Cm>jfcv{= z0-nqV1w7B45b%1uSipPTDgmD}`zQGJ^$7T_SvbKzFHaz#r+GqPc-MrWoYV=y<~b8W zeB395iu+9n)6tv|_T6AYgs7W9#C4$wkzX|gqPBgR5Pg+PAZCG}K&ci z6G(`^Dv((FYC@9zc7f#BGZRweX9}d+uA7j?v2{Ya?1TyFFQ!k(_**m~^F-x@th*r- zvR6b;$T?OhklSH9A#Yi*Kz@e&gn~9xfxPfoM=}0@0ux1)@Q@3Pgi)7KjGrE)WgMVIUfm z%Rn?Jr-5itZUfPv90#I7xei2wavq2VAgP$>bTK_vx< z29*|I`ft4ehz6A!VES$%m=7vFKzvXM0-`~s2#5xiBp@18nt*6fi2|ZQr3#1!l`J3{ zRJwp@PzeK~L8T0c29-1*8dTbVXi$j*qCuq&n11&RY(J><0r5d45QqkqLLeGc5`kz? zX#}D{B@&1Rl}aEQR5F2RQ0WAsK_wK329;7E8dOq&Xi#YdqCq7Vhz6BfVEVfOI6gq7 z7l;ok!9X;q6a&$qk_<$HN;41*D$zhRs8j>dppp$lgGx6L4JzS4G^msV(V&tJM1x8@ z5DhBvKs2b-1JR(84@84XKQR4bI@mp+QV_%km4qM~R2qV4P>BelL8T&y29=B;8dN%h zXiy0WqCur3hz6CEAR1I!f@n~Q38F!zCWr==oFE!hdV=W>kHGN(Dn&tjP)Q1+L8U2( z29>BF8dR!+Xi&)tqCurAhz6CgAbNO~vRuxtA-aa3B3Q@QSkF|?K*!h607UB>a{&O$ Cb5tGx diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Madeira b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Madeira index 5213761f891303f95e1962570568ae62ed387950..7c3a49c0e8cdcf1fa43835b3767a999b9b2b6b01 100644 GIT binary patch delta 240 zcmbO%J)3)ixC{dtU}Rum0AY~u1aUzS1;bqo3=Hg>wOB(~>KU1th=(jp%uL9bD4lGq vcpx{DKW)8>i8NOfLL4rxW10>u1=UU=Xb;0lM@@})i*TE zUv-pWL3~of!tNgpiyWUfEY7QKSfVV=u+)De!z$Ll4XeJ)WmtQ18^gNgMhxp0#5Qbb z7h%}gS;eraz@TAs(X@sw0YVMijiMTM@Ly}#@&9w3nc?i=$bxf48$O&ndbZ(wsVc+yHKiXe1Wo#IVd?sY zi=pfc7kk1#Trw*8aH(}-!{x}!3|BmlFkH2~Z*WcXg28pkg9bM^HyPacx!B<5%P9tT zcBUKL-85;#y+zF%?oTS&@SrJm!^5Jm4UdxCH#`oq*zm+jbHh_3sSVGRxHmkPHaB>| ztzq!ux1_<#*IWj#Zv8fRed>+Dn_YJe-mW@l@NU+AgZEt<3_esXH29b`$>3A+-VL9F z*KPRXJb%Mi;|UwSDK~ETE?l(X2XpdYD3OPjriZRIoNa5Na)W4cc(0HmkLG!BE z1g)d&6STMdn4q)d~Fn*h4hpO7IzZ`EPt0xu-fY^V0}Acg3Yq{3AVefCfKz(POzUXGr=KEd4gk$ zrGS$g>jdW%X#p42=M!9={|dOVo}A#Wd|$x*-7^7C=7R#B=S~QCJzgx}y>69&&zb!b zeEWI?{MIa-;GdT#5YW>+AuzmaLQqcXgkbZW2_Zi26GFxPCWPr|P6+#MFd;(JO(5dB z(1ggZ8Uj(u$_>%ELb2vLw-U* zo2fuypp8ILnz%r*p`1X8>ra7FK?Z>`ebEVJA07!*@O__9ap8zS<-3~`sx~YWs6MxQ zLe0!W6KdDZolsY~WI}yk{RBofCT12^A|X2qD+@9vN*@;oClci5p(FhN|APht1DIq1 zl{AbT|Nnpdz`%pdhKcYAFbXg*@Ch)AfMgjYQAv=vk8cQrn{Nn%wt)eIu7M$gwt*o- zxNC3-L%3@QST!RUFfcNLc?@8Rk&%=V@c;k+|Kn_hBS18$Bm~i*(hyAlyE*|xgGxmZ z4JsKyG^lh0(V!9%M1x965Dh9RK{Tke1ks=p6GVebO%M$#IYBh2^aRsi<}!fjwI{cM zX;4WD;)6<45Dh9(LG;GXDzH4LWCig-r7MUAm9QWhRLX*AP)Q4>{~vDv(V!9+M1x9Q z5DhAMK{TlJ1<{}q7(|0gVGs=}i9s}|GzQV25*b8;N@WlYDw#nvsB{L=pb{EP-+T+U z4^&cv_@L4nM1x9f5DhA|!StJrA3!vy^aj&+HiG>HD#by3P)QD=L8UpEK6(~xE~r!o z@j)d!hz6DJV0!6#uso=g2k}8AJ%|RC_F%eoB3K?&>Vx>8k{?8aN`DXyssTVWs1^Xx zpqcQ-EktZ2_V|H3orS}^Ru8HjL3~gR38F!@B!~vp zlpq>ZTY_j%jR~SbwI+xL)tn$2RC|Kyzx4tj8dQsd>AQ(wKBzVY@j*2zhz8ZFAR1J& zf@o0f3Zg+ZEQkixvLG5%(}HMFZ4077H7$LAOM_@oO%0+!wKa$a)z}~!RBMB1P|XdZ zLA5uC2G!so8dQse>F);M@CDW8AU>!@2hpHf9Ylj_b`TA!-9a>{h6mB0S{_7$YI+b2 zs_j8EsKy7;pjsb9gKB;d4XXV?G^hmtqCu?y5DjVxfM`%_08GD_4t5WyRRH3HS_U8* z)H(pspcVp%2DK7EG^nKjqCu?%5DjWEfM`&w0YrmZ4j>xTdH~U&76ga}wIVwqbEe#M2YHfgMP>TaZkG48KF!0d4 d)xj0+8e#xyo#^-)>zV2q=o{+z8XACDTmU5T4$%Mr diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Reykjavik b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Reykjavik index 10e0fc8190a401f67b861ced3b8b16401432a565..2451aca76d7c555b06d358c2e30799c9b599fd1e 100644 GIT binary patch delta 135 zcmeC;{Kz^%dh!KERuJZ6U|?i`Uz0$dmv7(i@+?u6zAb0*3$%)Qt#VO~*S!~Cnv0t6eXM0o@oZGWr;d~C; zf(vsdDqQq_vEWkc+69-jPc68T+P~ncSu7wM(OV)2zxS<-n;Kt9X3b*(Q6mH!t zSGfIDe8HWakqURunJC;_RJ!2)Ix&R@P2me3_Wn?Klw`T!aqcaJCr;7}p8D=lc&7Mw z!E>`43tn(bDZCWhwczEeKMJqD%~|mJ)IEha*XkC$U3Ea=-L`}U@4FT$e3<66;A2*c z!l(Lph0nnY7JP|!RQOtN+_d1Ey|Ti0;gkhGf_;Ljdc z1tvxWWM&}?vi|@7Isp>Uj4c2EfBe9}0U?z@f{ZL6l7Yv^H-tgkz<@#5z>vY+Hv}Ze n$jCTBnimu?ARai9HbxsTRgmQh7G|980GW>88C>qZAqHFkB!{?M diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/South_Georgia b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/South_Georgia index 446660861227aa8ceb7084f48c3b2654ea64f4dc..7fa5f4683538498b93d1e639c14256c1f033c354 100644 GIT binary patch delta 45 wcmZ3&*upqLd13+!4|BQ_P|KB~p!0`Y7;|B~ZKE5Fgx&}rJq?q*o Y|NsA)ZGR7d?8R*&myNE0k)0720A^Jrq5uE@ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/St_Helena b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/St_Helena index 28b32ab2e0b9053f39a91d9f28b6072e41423954..8906e88c819d9ad3b794eb6356a240a74a95ffae 100644 GIT binary patch delta 27 gcmbQj*u*$Nd13+!4fq{vEfq`Svvq>I||NsB7V1NJ?AKwrLci#|(3Ca`0bO8Ln3mpIe diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Stanley b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Stanley index 88077f110715ac1e349708821ac1e00f35bf6395..1a4c8ea86361731f4d7e854ac66d96a5ce6b2dbf 100644 GIT binary patch delta 48 wcmdnTIhAdKvH$}E0|O%zgV+<4S=|^I7}z#{Wi(-$Y{=p^xt~#G@*)-)0J3igwEzGB delta 376 zcmbQrwvTgya=kkP0|Pq)1A|Bd0|Uckmw21Q{!s^xm@yk1)weltO!TS2afwKWc4X19%I-K5jbid$0G{Tt5OVPE-q7$?Q%1a zTM@lMKFiEOp~H5AqL+k&Qil8nWzAm>Djtj*R5|ZBs2R!`sJ*P;=b$0TV4!j7)&b2A zj|{Xn?Kz-*;fR6Gqng@1^Gz09TP9``saR)eB ztxj-Cd>h~_)tlhrcs{^I{a1d1o8ra*w_AY;9$aTHcpT1s;Q4C(1+T^a54=xJyx`Mp z_@Ms(|NoQwncOB{VN#X)|NrU*Mh+j}5Qbpi5C&ZXV+LIV69!!aBZdjetl+@h7;VDD S!N9=4fUJ)dtZ(uUCRqSWm6=}v diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/ACT b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/ACT index 7636592aa7773fad6810a93b305c7dcd688cff34..f235d0dc742a4552dbaa240f06b74e7b7de6d4b0 100644 GIT binary patch delta 150 zcmbOu*ug$QT7m%yFfuSOfG|jCf;2CP0^wi=1_tKM-pq5DBAFPe4jCAFk1#Myj^~h? IT*n~?0G~GrApigX literal 2204 zcmWHE%1kq2zzSHQqJ0bu3?MdN0|NuY9KU6A=Il}Ua5`i&!|CJU1!uO0HJn{;S#WMa zF~j+G=>p~g%LW!+83xt>=?2zs77gtBe;e4ZNi}ft-*4dD`lo^G{lNzA`H~DgH|{a; z*8OJS+i`$_KkhDrz>GxP4f4}BF(^dVH7GWmYfy5U&7hq5nn6XWmO<6? zEQ9L%R}AW!>lxI~pJCACoXDWLejS6>%VGxY8K)X_F7-F)R;+2z+f>+~AJNxfFe$jf zFgB{esK~Uz*w&`OBuKo$R93FR% zkfR}Y!q0}hhF1;w1-Batve+34BY!XydA?*Qw!FnqqIsI3RB{hP8RuGtvY+!9%3t;~ zRNQP}s61K7P_;9Op?XtqL(QVPhT2K_4RuWk4fREV4NQzs$jmYbAOl115m3sWwSkd^ zfuUys11AFmg6-oQ!rmJgR&Hu{$>Hni435u1>%FU7l;OBF)+RL z4_F?Q)j)ji`H~&PgR&rq24zDK4a$lj8k8MDG$>1g>3_{2 z3Y;}T3{dt2(V#2}rjIv*?FVI55FeCXK{P1Kf@n~-1<|0a3!*{U7es@yFo*_aV-O9> z${-q)ok27xOM_@owg%CltPQ5$zXDOi0 zQ1%DWpdtW7gNgwV4JryiG^jWL(V!v$M1zV25Dh9CKs2a$0MTZKKf(S66%!ynsHgzb zcOHSoK}80L4=Of5G^pqR(V*f3M1zVD5Dh9uKs2Z*0nwo11Vn?16c7z6RzNhUXaUin z;sr#5iWm?LDrP{myK(~9UQlrZ;)9AD5DhAJKs2c60nwo12SkI4AP@~IhCno^C<4)- z;s`{8iX;#XDwaSrsAvMwpyCNcgNi5+4JxKUG^nTo)BoRq-2p1HKzvZK1)@Pk7l;NG zUmzM(gn?*KF$SVRMHz?&6=xtCRHT7uP_YK0K}8#g1{H508dSuAXizZ+qCrI+hz1pR zAR1KUf$5LIVE2HEJ`f*N{DEjt5eT9|#UO|V6@?%gR2+h6P>~3tLB%471{IAU8dN-j zXiyOeqCv$Zhz1pvAR1I$f@n~Y38sI}15x0j6T|=&pCB4kgo0>LF$$tVMJb2|6{jE? qRHTAvP_YW4he6TG<>(q5qHAaXDsgpu4Gr`R^$c`;O+b{sF&6+PVFGCY diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Adelaide b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Adelaide index 0b1252abb7e4ab478da26eb0be59c45b9b15abca..f397b3b9eda65192f1a4f64271aa89d3fc57440f 100644 GIT binary patch delta 155 zcmZ1{IFo&Xv;+eZU}Rum0AY~O1ZiFn1;QZ=3=Axry_uIV#W6B7Q5`ZcG`;~@Q#WC9 L4u{O-J`M!{`qT>Y literal 2222 zcmWHE%1kq2zzSHQqJ0bu3?MdN0|NuY9KW?o=Il}baXMrd$LZs76=$}`cAQ=AP;qWS z703B@r3&T(hYl8AWe(N=r4H6__8sg7EFJ9E6gxQipLK9lcG8d zV-q`!iflTJZJj$zg5)|(WmP-Oj2Jr1{<3#iNXv3q+~M1J<8V%1+~K0Ps>9W}wZn}yh{Ihuy~F+cN)C_b zvp77jcXN0hui^0Cp3C90JdVS6x<7|sy90-RxgkeDK}<(rf^SDqfL%whgMLSdfkH>9 zf?!9O08>ZU|IZ!a@1Jx;+`rlpdHz^O)c)-q(K{Y<#H_f&5j*23M_k7?j`)h@90?gS zI1(c|Ig&i8IFc>0IZ`xYI8r5iIno3xI?@?4JJLT!b!0sB?#R4o(~)&hw|q5A3O339(5FC@o^MJ{^uz2{J>Fc`H-VT^Abm?P=HRY8JJ2)J`hvsB22^s4t4>U}A(qW|lz!85kPhfKvA46^twl z46QR5I2jlaY#-kc21jQX5D^>#QpU)LCyTIwR4_0w^fNFpfY^Nh|NsAAEY>XoqN|0N z3qUj|%Yf-U>OVjaf<8c)r8kB`VG$@foRqMr4BIt z%^pmHvKWXD%4Q%Ml-0oWHfFFqD9eHPplk=CL0Jz(gR&op24z7I4a$Zf8k7}5G$=cQ zXi$~}(V%PzqCr^`O#kcR0MVc<3Z|bg1KS76svtfnyMky?mIc$xv%vD8tPA3UvM-1R zWnmBv%EllXl$Aj=C_95_P?iSKpll7IL0KC_gR(b>24!&&4a(*q8kE(+^!dwR_kprJ zh!4v4AR3hQK{P1)gJ@6@0HQ&~0Eh+^1t1z!9Drz0kpQAW#R7;16%8O7R6KxaP!R#5 zLB#}!1{D=x`Y$`!zn~%m#0M1{AR1J3fM`(h0ir=g2#5w1BOn@7lz?bZaRQ=2MGA-p z6)PYbRJ4F-Q1JqyK}8IR1{E_P8dTJPXi#wjqCrItnEt*J93G&e2gC;zKOh=Z1c7K! zF$AJPMG=Sw6-OW%R3w3DP_YD}K}8dY1{F^r8dOAqXizZ)qCrI!hz1o`AR1I;f$9IB z!QlZax12ckhm9*71NdmtKA^nvM*QDFCgia-z_R1AV>P*Dh?LB%161{H}Q8dNNT zXi(7zqCv$Yhz1prAR1Imf@n}t38F#8C5Q$UnIIZeY=US|(Fvx1E(OO2s0an|LB%MD z1{I|s8dRKuXi$*~qCv$fhz1p{AR1J>f@n|?%gD?Gg)FRt0K&@Hx(N&{;L?>7T+*Vj uAth}vsHAlPm$VFwj9iY+!6CYqR>lUPGFZpg&_K^n&p^l51Vrf@a{&NajS8Fq diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Brisbane b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Brisbane index 3021bdb61473603f78138e235d1d66472b4e3d04..c7915db30baeb4304f317e9b0d5b8e0e2e381635 100644 GIT binary patch delta 100 zcmdnUypU;vv;+eZU}Rum0AY~O1ZiFn1;T<13=GT@Z%s91WP(5jhW-kW#HA&{22yK&WQ|~>(?(q5qHAct1prg-EfN3# diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Broken_Hill b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Broken_Hill index 1ac3fc8f529e5431ff61c43232f243c72e1eac2f..ed0d17a610e05679d2cdd516d1aab1500872e97d 100644 GIT binary patch delta 100 zcmX>sxR!l_v;+eZU}Rum0AY~O1ZiFn1;U{W3=FKBy_wfAF)=btE?^3t9M2&)xsyX! jfy>c3I7HXd%Gkis*(F5B*U&)EP|rZe*91iA8*>2wj7|@n delta 1343 zcmZ3>epqmVbUiBr1oSa5Fo4*64GatnbNtpWnX^az$LWw=9H)=RRh-!#+i`ZeL&doT zRUGHrl`5DE96DHdl{r`glsZ_y*>|uTuyn9rQ|#d6f7Zddjk$yC{fQ3l`3f97H=c6v z)-!SN?KsZCANPbqV8%)gLAzrdLKWQ{!g4D(L?Y^QIYj<-afn&?bBOay=#Ws%?vOa% z(ILg?+aa|)t3&#seuqrEPlxP5!4A2~#U1j~cXB91wst5sT>U=;vK$t7UUpdi`p;pt=X8hlt%n>o zOJ8ue%4YBhtxG3j?D)L#gjwFvNj%15$jued;j#LR>jx@oFj&#P%j`WXF9T^Y3J2EfYbYvaW?a1CJ z*O9Z3zaw`dLs&;%!^e*Nf=3+%S$rIYk^ec0JU?(0TR!9{(Y(Y_DtVZrjB^V|+0UgM z8TTHi!lVIEV%XI*0}Z zJctGbK8OZI0GR&&xxNF$0L27|2E_)52E_=72E_`92E`1B2E`7D2E`DF2E`JH2E`PJ z2E`VL2E`bN2E`hP2E`nR2E`tT2E`zVP7|!J06PE_l^_97bb@G5l!9nbw1Q|*)PiVG z^nz$m6ocs8i40)@K`{=ZL9q^^K`{@aL9q{_K`8)4m)1)j<^VB3NdZj% zTngrck_3nkN){j*lr%szD0zTrP!a*rpkxA~K}iKfgOUq~1|=CrCKhHWWM#tv>v2iY lLL8Q2dloRTFfi0jVBln!oX^ZXIgeQ$k}w$=C-*Wd001)AV)Ot2 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Canberra b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Canberra index 7636592aa7773fad6810a93b305c7dcd688cff34..f235d0dc742a4552dbaa240f06b74e7b7de6d4b0 100644 GIT binary patch delta 150 zcmbOu*ug$QT7m%yFfuSOfG|jCf;2CP0^wi=1_tKM-pq5DBAFPe4jCAFk1#Myj^~h? IT*n~?0G~GrApigX literal 2204 zcmWHE%1kq2zzSHQqJ0bu3?MdN0|NuY9KU6A=Il}Ua5`i&!|CJU1!uO0HJn{;S#WMa zF~j+G=>p~g%LW!+83xt>=?2zs77gtBe;e4ZNi}ft-*4dD`lo^G{lNzA`H~DgH|{a; z*8OJS+i`$_KkhDrz>GxP4f4}BF(^dVH7GWmYfy5U&7hq5nn6XWmO<6? zEQ9L%R}AW!>lxI~pJCACoXDWLejS6>%VGxY8K)X_F7-F)R;+2z+f>+~AJNxfFe$jf zFgB{esK~Uz*w&`OBuKo$R93FR% zkfR}Y!q0}hhF1;w1-Batve+34BY!XydA?*Qw!FnqqIsI3RB{hP8RuGtvY+!9%3t;~ zRNQP}s61K7P_;9Op?XtqL(QVPhT2K_4RuWk4fREV4NQzs$jmYbAOl115m3sWwSkd^ zfuUys11AFmg6-oQ!rmJgR&Hu{$>Hni435u1>%FU7l;OBF)+RL z4_F?Q)j)ji`H~&PgR&rq24zDK4a$lj8k8MDG$>1g>3_{2 z3Y;}T3{dt2(V#2}rjIv*?FVI55FeCXK{P1Kf@n~-1<|0a3!*{U7es@yFo*_aV-O9> z${-q)ok27xOM_@owg%CltPQ5$zXDOi0 zQ1%DWpdtW7gNgwV4JryiG^jWL(V!v$M1zV25Dh9CKs2a$0MTZKKf(S66%!ynsHgzb zcOHSoK}80L4=Of5G^pqR(V*f3M1zVD5Dh9uKs2Z*0nwo11Vn?16c7z6RzNhUXaUin z;sr#5iWm?LDrP{myK(~9UQlrZ;)9AD5DhAJKs2c60nwo12SkI4AP@~IhCno^C<4)- z;s`{8iX;#XDwaSrsAvMwpyCNcgNi5+4JxKUG^nTo)BoRq-2p1HKzvZK1)@Pk7l;NG zUmzM(gn?*KF$SVRMHz?&6=xtCRHT7uP_YK0K}8#g1{H508dSuAXizZ+qCrI+hz1pR zAR1KUf$5LIVE2HEJ`f*N{DEjt5eT9|#UO|V6@?%gR2+h6P>~3tLB%471{IAU8dN-j zXiyOeqCv$Zhz1pvAR1I$f@n~Y38sI}15x0j6T|=&pCB4kgo0>LF$$tVMJb2|6{jE? qRHTAvP_YW4he6TG<>(q5qHAaXDsgpu4Gr`R^$c`;O+b{sF&6+PVFGCY diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Currie b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Currie index f65a990efe119312e1fbeb832f836097ecd2eff1..55ceaefc60755375cc2545df8134d36e1e35e49b 100644 GIT binary patch delta 184 zcmbOu_@8Zpv;+eZU}Rum0AY~O1ZiFn1;RlL3=GVhy_u&l)iW|t8!|AoJpftKvw(qx lfnnALMou5!5C%urU=ZOF!oUS$>KYn2y1InuOz!3o1OT=h5qwFf-~F08qO}aEI7BI znBjc8bOCdLWdjSZ3BI6{nNnp{$K<5d`SkL8}}G^ z>wYuv?Kr@|A9t5QV8$W_LA(77LKQ6x!g324L?Y4{ME*51h*@|rh%@^$NGPT>NIW)V zkYaRekXoMHApKCIL8jfcLG~b5gIv0LgZ%VO3<{BT4T=rt8kC%7Gbm@iW>8V8Wl;4z z%b>;-&!DckoV+OBI98+NBM;Q(_qOdfOZHOY9g7ax)tY zW1||3!rB;&ZEYG%%rY2EW#t;o#Jm{H{xUR}f74;GxbvvNa{0>!t35{=toLg**erd> zU^}0u!LIc%gMHn*28Yz8432RZ8k}6)8Jz7lHMr<4Zg7>G(%{DG&EU?yk-`1@A_kA= zlNmg(w=j4eFJem3MaylTiVxZO~Y#m-O|`GcXz^Cd&EI1&C?8}l6x4+IM*_i{hY^8{<5E; z;${Ow<;g;Zs+~y;)th=7Y8KTs)K1E8sB21Ss4og^U}SDfouk4B@hkDP9PeTrNHzz3s6pEVAuZ(p|44SX;2me$%C>P zhz4af5Y0Vb5=4Qs9EbtRb|4y*^*}Tz`+;as76j3tYzU%3SrJ5ovLlEFWl1pouNg#v zvnGfE%AOz^ltsbxV?z)H&Z-~=D7%7aP?iPJpll1GL0K0>gR(D(24!Io4a&wK8kChm zG$=cRXi%00(V%P%qCr_3M1!(7hz4bGF#Tm4hyrJI5CfFmK{P1KgJ@8;2hpIc528WY zA4G$S01yo-20%2ZC;-u*;s8X0iUbf1Di%OAsAvGupyB~UgNg_+{g(k8AE2TF#0M1@ zAR1I;fM`&$0ir=g2Z#n0A0Qf3gn(#JF#@7NMG1%o6(=AXRHT4tP_Y7{K}8FQ1{E(L z8dSu9XizZ&qCrIsnEt*9M1hMO5Cc@~fM`(B1EN924~Pa8K_D7b41s7+Q3Rqv#Sw@G z6-gi(R4jpLP|*aULB$h@1{F~t8dOYyXi!lFrvJYIhX<(00`Wn`7KjEFT_74%e1T|C z5eA|`#TbYN6=fhARGfimP>}|rLB$$~1{G}}8dSW2XiyOcqCv$Rhz1pPAR1KMfoM>X z2c|y;gWUrv`apb8@du(oMIeX<6@wreR1|_}P;m&NK}8~n1{I4S8dNlbXi)J8qCrI@ zhz1ptAR1Iuf@n~238FzoCYb&?4@7~BP7niBe1d3D5elL~#VCjd6{R2=RGflnP>~9v mLB%SF9tK4#7pSP!H8gN^bqUe&H8jvO)HBfWH33oj##{hq>G^g5 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Darwin b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Darwin index 1cf502984a27deae869b3a39ccbbc056e487d398..7114153b65c3115ccd1dc1c726267fa02090d9c3 100644 GIT binary patch delta 27 gcmdnM^ontU^27-&Jd6ws3?R(Fz`!s;dE%TY09geE_y7O^ delta 98 zcmaFGxPfVcau_EA0|PSy0|Q?J0|UbxzqL!|>{0)5I%F5e>Em$~XST<7oL%lvac)5s w$N6@p3MNJ6nZYC2^YSr{0q ic^J5Sd_x$t4J=Je8MF;7OiUTLY{0agu7#C}DHj074-KjS delta 243 zcmdnR^n`hWbUiBr1c)#&Fo4(s4GatnbNqG~%-LhqaysP5l+(vESGpyGjvH<`5CjbI~I8|NsAI zVgy5G76fErV5qnNvbIx(gOP=Sp_+$*Yq9{N49I>)#tG8AAO=Vt?5K&+bM!zQ!iFK6 ZCCtFUz{tpDqitYeVrr*rVP#^<1ppkYF_{1W diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Hobart b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Hobart index 02b07ca232053d1d908d019621b792986bd9b429..21ef2d396f6bb95d65967cffec373b03fdbcf0a4 100644 GIT binary patch delta 178 zcmeAXI?g^pdU66Y8wm3-GB7ZJFarYv14Njefgy^4fq{8*G4mCsdPXK%K?a5{8IY|# g3m8}!7-nr?4M*fdKvy~s$=+jJd)vG*@lMy%dHt0!X`B^w#zaw*{^3{F0gE1;gw-v4UleN z{btd?uK%}z{hCw*C;$Bh&aHnMxZWRZ;GQqZz;ojs18?1L2EH8!82IDvG6>9A#2{$5 zpFyaig+W+uA%jRn8iUBcW(F|}4+e2&e+CJ~lm>~%h73}SZVgh)lN+QTYBb2SyEe!k z$^3>J4DHCQfx*b}aP|W+Kv@vv#IQ-A9Lxa9iXbj1JA!CXmITqDYzd-4SrbfuvjD4S z*Z&KluStPvP*w%WgR(1#24z_g%{^ZdM1iv|hylvJAR3f~K{O~EgJ@7z2GOAG45C3< z8bpJ#HHZdfZ7}_>8AO4zIEVqt<{%oB)xq>*Ll6bd@*oB%+k<^+rMF5Bf z6$2m|R1|<{P;mgFK}7}+nLB$G)1{EzJ8dSW1XiyOYqCv$B zhz1okVEQiuI6go{4u}sbc0e?!=mF87;s->7iXadTDuzHbs3-!_pyCKbgNh^&4JwvE zG^l6-(V*f9M1zVb5DhA(Ks2bR0@0x23Pgj7EHM3j5r_g8T_6Ui_yWiZKuk zD#}1Ks5k@Bpdt-KgNii}4Jz6|G^lt3(V!v@M1zVs5DhBoKs2bh1JR%&4^01m0}c;R z(Ffv#ia!tyDgr??s2Bv%prQ~&gNj2C4Jr~rG^khv(V(IcM1zV)5Dh9KK{TkC1ks?P z5=4WFOArkzGC?$`*aXp_q7zJi36dR6LC^_|fP|ke(Lq#d?gR1AzAFA(fe^A$4 z{zLuz-Vd6boj)|!&;OwHGW&=2j6DT9mpUqRE9MpGZOW?9kEm}bFqq_1VHoREU{s`6 zVQi~cU=k!yVJa(7U}pHK!tBqd0t;!r9~O766j&~QRAIGeTY>ehOFwLuUix6WYs(M2 z)-50GXHEOzkUH&yWAo+;C)bJ(&dF0NT=b?ExH^|txUt%Na9573aQ{B}gU9pkAD-7s zKX@I_{o%bm{DaSO{~x~f(=9*vwHyBMFPHuhP~cY)m|#&56kt#h>>yPTVjxrzD*vY- zjQ>kT*#CP4;qR|iMBG165P5z_Mb!R91<^aM{D@hx??dd2Z9n2V7JP`WnDHYaqv=Cp zMAeTZkCYF|7BN3kG~7O>V5Df||5Df}15Df}5 z5Df}95Df}D5Df}H5Df}L5Df}P5Df}TF#Z2teF2C83RDmc3Rn;g3S1Bk3SbZo3Sgb^s_=Kmwqc z0nwn?0nwls0@0vY0@0v|0@0wz0@0ud1JR&J1JR&}1JR(!1JR%e1ks>K1ks>~1ks?# z1kt6*l54?13W`;b04QcbG$?jKG$@8aG$@uqG$^J)G$^(~G$_VFG$__VG$`glG${7L JG_Dj73jowsdd>g< diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Lindeman b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Lindeman index eab0fb998ab17868a2ea232e986d312c94bb1c7b..e271d5b3e50e1b0e0a0250649a55b69685f4ccfe 100644 GIT binary patch delta 83 zcmaFKe3WT|v;+eZU}Rum0AY~O1ZiFn1;U~X3=GT@-)$9QWI{j&hVC^C43iHsN^x>I Mx(0{n8X9l`0CZ{!9{>OV literal 489 zcmWHE%1kq2zzSHQqM{583?MdN0|NuY9KU6A=Il}Ua5`i&!|CJU1!uO0HJn{;S#WMa zF~j+G=>p~g%LW!+83t9)vka>5Uoog_u4hm`e}+Mmb0UN0`gIIiFN+zpXPj!#xzyjF zTd}5ri4h8!SrCwcp?eL;@>v@gSr{047BFx!Fd*1Iz99^bt}Y-VI0U4Ok&zT%{Qv*| zf6?1TS3oq#H(+{?!Uqry@)ejq9$o;VLB0dgARmHgkS{?r$fqEiLB0jiARmKhkgvh? w`&S?e?0XOc6apX`6bfK^{W=f@4h;|k6e1uR6e=K^dLhH*=o%cNYiPg)0OCZ1BLDyZ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Lord_Howe b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Lord_Howe index 9e04a80ecea45473faabeb609eb06cfe62193d48..4d4ec8ceea9a96956864eddff4900fc4fb9ba8f1 100644 GIT binary patch delta 44 ycmX@Yw}o|r^5g?dEIf=13=AO5z`(#TL7CBF^J%6NjFbN`T1+lrGM_BRt_A?;Gzz@{ delta 1019 zcmdnOdW3I+a(xK{0|P4q1A}A(0|SG|zqAKp77jneo_A$PD8^Pu9M8#+VzjT2TJD!2 z{ZO$&rrjVz_8@bGTxDN@{Pa~n6e0@>6dR6LC^_|fP|ke(Lq#d?gR1AzAFA(fe^A$4 z{zLuz-Vd6boj)|!&;OwHGW&=2j6DT9mpUqRE9MpGZOW?9kEm}bFqq_1VHoREU{s`6 zVQi~cU=k!yVJa(7U}pHK!tBqd0t;!r9~O766j&~QRAIGeTY>ehOFwLuUix6WYs(M2 z)-50GXHEOzkUH&yWAo+;C)bJ(&dF0NT=b?ExH^|txUt%Na9573aQ{B}gU9pkAD-7s zKX@I_{o%bm{DaSO{~x~f(=9*vwHyBMFPHuhP~cY)m|#&56kt#h>>yPTVjxrzD*vY- zjQ>kT*#CP4;qR|iMBG165P5z_Mb!R91<^aM{D@hx??dd2Z9n2V7JP`WnDHYaqv=Cp zMAeTZkCYF|7BN3kG~7O>V5Df||5Df}15Df}5 z5Df}95Df}D5Df}H5Df}L5Df}P5Df}TF#Z2teF2C83RDmc3Rn;g3S1Bk3SbZo3Sgb^s_=Kmwqc z0nwn?0nwls0@0vY0@0v|0@0wz0@0ud1JR&J1JR&}1JR(!1JR%e1ks>K1ks>~1ks?# z1kt6*l54?13W`;b04QcbG$?jKG$@8aG$@uqG$^J)G$^(~G$_VFG$__VG$`glG${7L JG_Dj73jowsdd>g< diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Melbourne b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Melbourne index ba457338ba7ec8f6d3e3950deb1b7e82b15c9a6c..c7160da33f3e23098ca2542ef6e9cc22c0c6753d 100644 GIT binary patch delta 150 zcmbOu*ug$QT7m%yFfuSOfG|jCf;2CP0^wi=1_tKM-pq5DBAFPe4jCBQUobFCj^~h? IT*n~?0HAvbKL7v# literal 2204 zcmWHE%1kq2zzSHQqJ0bu3?MdN0|NuY9KU6A=Il}Ua5`i&!|CJU1!uO0HJn{;S#WMa zF~j+G=>p~g%LW!+83xt>=?2zs77gtBe;e4ZNi}ft-*4dD`lo^G{lNzA`H~DgH|{a; z*8OJS+i`$_KkhDrz>GxlxI~pJCACoXDWLejS6>%VGxY8K)X_F7-F)R;+2z+f>+~Ut-5#Fe$jf zFgB{esK~Uz*w&`OBuKo$R93FR% zkfR}Y!q0}hhF1;w1-Batve+34BY!XydA?*Qw!FnqqIsI3RB{hP8RuGtvY+!9%3t;~ zRNQP}s61K7P_;9Op?XtqL(QVPhT2K_4RuWk4fREV4NQzs$jmYbAOl1D3sB0QwSkd^ zfuUys11AFmg6-oQ!rOkqCr^&Oz%mJgR&Hu{$>Hni435u1>%FU7l;OBF)+RL z4_F?Q)j)ji`H~&PgR&rq24zDK4a$lj8k8MDG$>1g>3_{2 z3Y;}T3{dt2(V#2}rjIv*?FVI55FeCXK{P1Kf@n~-1<|0a3!*{U7es@yFo*_aV-O9> z${-q)ok27xOM_@owg%CltPP?;*&9TIvN)JNe+EQ>vpR?Y%I+WqvFgNh6gA5?6BXi(7sqCv$6hz1oQAR1JRfM`%r0-{0135W(2DIgkDtbk}x(E_4D z#S4fA6)_+hRLp>AcjW}Iy`bU-#0M2QAR1KcfM`(B1EN924~Pa8K_D7b41s7+Q3Rqv z#Sw@G6-gi(R4jpLP|*aULB$h@1{F~t8dOYyXi!lFrvJYIy8~2Yf%u?e3q*s8E)WeW zzCbjn2m{feVhlusiZT!lD$YPOs7M3RpkfU~gNil~4JzJ1G^mIJ(V$`uM1zVt5DhBs zKs2bx1JfUa!R`SSeIP!l_yf_PA`nD_ia`(!Dhfd~s5k`Cpdt}OgNj8E4JsNzG^lt4 z(V!v{M1zV+5Dh9SK{Tki1ks=(6HNb{2cp15Cx`(mK0!372nErgViZJ!ic$~_Do#N( qs7M9Tpkft74}+qW%h5GBMAy&&RO0IR8XD*s>KW+xnt&*MV=e#_AO3s* diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/NSW b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/NSW index 7636592aa7773fad6810a93b305c7dcd688cff34..f235d0dc742a4552dbaa240f06b74e7b7de6d4b0 100644 GIT binary patch delta 150 zcmbOu*ug$QT7m%yFfuSOfG|jCf;2CP0^wi=1_tKM-pq5DBAFPe4jCAFk1#Myj^~h? IT*n~?0G~GrApigX literal 2204 zcmWHE%1kq2zzSHQqJ0bu3?MdN0|NuY9KU6A=Il}Ua5`i&!|CJU1!uO0HJn{;S#WMa zF~j+G=>p~g%LW!+83xt>=?2zs77gtBe;e4ZNi}ft-*4dD`lo^G{lNzA`H~DgH|{a; z*8OJS+i`$_KkhDrz>GxP4f4}BF(^dVH7GWmYfy5U&7hq5nn6XWmO<6? zEQ9L%R}AW!>lxI~pJCACoXDWLejS6>%VGxY8K)X_F7-F)R;+2z+f>+~AJNxfFe$jf zFgB{esK~Uz*w&`OBuKo$R93FR% zkfR}Y!q0}hhF1;w1-Batve+34BY!XydA?*Qw!FnqqIsI3RB{hP8RuGtvY+!9%3t;~ zRNQP}s61K7P_;9Op?XtqL(QVPhT2K_4RuWk4fREV4NQzs$jmYbAOl115m3sWwSkd^ zfuUys11AFmg6-oQ!rmJgR&Hu{$>Hni435u1>%FU7l;OBF)+RL z4_F?Q)j)ji`H~&PgR&rq24zDK4a$lj8k8MDG$>1g>3_{2 z3Y;}T3{dt2(V#2}rjIv*?FVI55FeCXK{P1Kf@n~-1<|0a3!*{U7es@yFo*_aV-O9> z${-q)ok27xOM_@owg%CltPQ5$zXDOi0 zQ1%DWpdtW7gNgwV4JryiG^jWL(V!v$M1zV25Dh9CKs2a$0MTZKKf(S66%!ynsHgzb zcOHSoK}80L4=Of5G^pqR(V*f3M1zVD5Dh9uKs2Z*0nwo11Vn?16c7z6RzNhUXaUin z;sr#5iWm?LDrP{myK(~9UQlrZ;)9AD5DhAJKs2c60nwo12SkI4AP@~IhCno^C<4)- z;s`{8iX;#XDwaSrsAvMwpyCNcgNi5+4JxKUG^nTo)BoRq-2p1HKzvZK1)@Pk7l;NG zUmzM(gn?*KF$SVRMHz?&6=xtCRHT7uP_YK0K}8#g1{H508dSuAXizZ+qCrI+hz1pR zAR1KUf$5LIVE2HEJ`f*N{DEjt5eT9|#UO|V6@?%gR2+h6P>~3tLB%471{IAU8dN-j zXiyOeqCv$Zhz1pvAR1I$f@n~Y38sI}15x0j6T|=&pCB4kgo0>LF$$tVMJb2|6{jE? qRHTAvP_YW4he6TG<>(q5qHAaXDsgpu4Gr`R^$c`;O+b{sF&6+PVFGCY diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/North b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/North index 1cf502984a27deae869b3a39ccbbc056e487d398..7114153b65c3115ccd1dc1c726267fa02090d9c3 100644 GIT binary patch delta 27 gcmdnM^ontU^27-&Jd6ws3?R(Fz`!s;dE%TY09geE_y7O^ delta 98 zcmaFGxPfVcau_EA0|PSy0|Q?J0|UbxzqL!|>{0)5I%F5e>Em$~XST<7oL%lvac)5s w$N6@p3MNJrW}T7VcMYV@+3ZSFTy${;qj}Cv)5a&vU5@m>9v3 znFRqE7;@%-Y^F3S>1S;{<755CbF+cF)A<#c~L(%q(b{p?Y~4 Q7#J8Cxg5iTLv$^;0K%UzD*ylh diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Queensland b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Queensland index 3021bdb61473603f78138e235d1d66472b4e3d04..c7915db30baeb4304f317e9b0d5b8e0e2e381635 100644 GIT binary patch delta 100 zcmdnUypU;vv;+eZU}Rum0AY~O1ZiFn1;T<13=GT@Z%s91WP(5jhW-kW#HA&{22yK&WQ|~>(?(q5qHAct1prg-EfN3# diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/South b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/South index 0b1252abb7e4ab478da26eb0be59c45b9b15abca..f397b3b9eda65192f1a4f64271aa89d3fc57440f 100644 GIT binary patch delta 155 zcmZ1{IFo&Xv;+eZU}Rum0AY~O1ZiFn1;QZ=3=Axry_uIV#W6B7Q5`ZcG`;~@Q#WC9 L4u{O-J`M!{`qT>Y literal 2222 zcmWHE%1kq2zzSHQqJ0bu3?MdN0|NuY9KW?o=Il}baXMrd$LZs76=$}`cAQ=AP;qWS z703B@r3&T(hYl8AWe(N=r4H6__8sg7EFJ9E6gxQipLK9lcG8d zV-q`!iflTJZJj$zg5)|(WmP-Oj2Jr1{<3#iNXv3q+~M1J<8V%1+~K0Ps>9W}wZn}yh{Ihuy~F+cN)C_b zvp77jcXN0hui^0Cp3C90JdVS6x<7|sy90-RxgkeDK}<(rf^SDqfL%whgMLSdfkH>9 zf?!9O08>ZU|IZ!a@1Jx;+`rlpdHz^O)c)-q(K{Y<#H_f&5j*23M_k7?j`)h@90?gS zI1(c|Ig&i8IFc>0IZ`xYI8r5iIno3xI?@?4JJLT!b!0sB?#R4o(~)&hw|q5A3O339(5FC@o^MJ{^uz2{J>Fc`H-VT^Abm?P=HRY8JJ2)J`hvsB22^s4t4>U}A(qW|lz!85kPhfKvA46^twl z46QR5I2jlaY#-kc21jQX5D^>#QpU)LCyTIwR4_0w^fNFpfY^Nh|NsAAEY>XoqN|0N z3qUj|%Yf-U>OVjaf<8c)r8kB`VG$@foRqMr4BIt z%^pmHvKWXD%4Q%Ml-0oWHfFFqD9eHPplk=CL0Jz(gR&op24z7I4a$Zf8k7}5G$=cQ zXi$~}(V%PzqCr^`O#kcR0MVc<3Z|bg1KS76svtfnyMky?mIc$xv%vD8tPA3UvM-1R zWnmBv%EllXl$Aj=C_95_P?iSKpll7IL0KC_gR(b>24!&&4a(*q8kE(+^!dwR_kprJ zh!4v4AR3hQK{P1)gJ@6@0HQ&~0Eh+^1t1z!9Drz0kpQAW#R7;16%8O7R6KxaP!R#5 zLB#}!1{D=x`Y$`!zn~%m#0M1{AR1J3fM`(h0ir=g2#5w1BOn@7lz?bZaRQ=2MGA-p z6)PYbRJ4F-Q1JqyK}8IR1{E_P8dTJPXi#wjqCrItnEt*J93G&e2gC;zKOh=Z1c7K! zF$AJPMG=Sw6-OW%R3w3DP_YD}K}8dY1{F^r8dOAqXizZ)qCrI!hz1o`AR1I;f$9IB z!QlZax12ckhm9*71NdmtKA^nvM*QDFCgia-z_R1AV>P*Dh?LB%161{H}Q8dNNT zXi(7zqCv$Yhz1prAR1Imf@n}t38F#8C5Q$UnIIZeY=US|(Fvx1E(OO2s0an|LB%MD z1{I|s8dRKuXi$*~qCv$fhz1p{AR1J>f@n|?%gD?Gg)FRt0K&@Hx(N&{;L?>7T+*Vj uAth}vsHAlPm$VFwj9iY+!6CYqR>lUPGFZpg&_K^n&p^l51Vrf@a{&NajS8Fq diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Sydney b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Sydney index 7636592aa7773fad6810a93b305c7dcd688cff34..f235d0dc742a4552dbaa240f06b74e7b7de6d4b0 100644 GIT binary patch delta 150 zcmbOu*ug$QT7m%yFfuSOfG|jCf;2CP0^wi=1_tKM-pq5DBAFPe4jCAFk1#Myj^~h? IT*n~?0G~GrApigX literal 2204 zcmWHE%1kq2zzSHQqJ0bu3?MdN0|NuY9KU6A=Il}Ua5`i&!|CJU1!uO0HJn{;S#WMa zF~j+G=>p~g%LW!+83xt>=?2zs77gtBe;e4ZNi}ft-*4dD`lo^G{lNzA`H~DgH|{a; z*8OJS+i`$_KkhDrz>GxP4f4}BF(^dVH7GWmYfy5U&7hq5nn6XWmO<6? zEQ9L%R}AW!>lxI~pJCACoXDWLejS6>%VGxY8K)X_F7-F)R;+2z+f>+~AJNxfFe$jf zFgB{esK~Uz*w&`OBuKo$R93FR% zkfR}Y!q0}hhF1;w1-Batve+34BY!XydA?*Qw!FnqqIsI3RB{hP8RuGtvY+!9%3t;~ zRNQP}s61K7P_;9Op?XtqL(QVPhT2K_4RuWk4fREV4NQzs$jmYbAOl115m3sWwSkd^ zfuUys11AFmg6-oQ!rmJgR&Hu{$>Hni435u1>%FU7l;OBF)+RL z4_F?Q)j)ji`H~&PgR&rq24zDK4a$lj8k8MDG$>1g>3_{2 z3Y;}T3{dt2(V#2}rjIv*?FVI55FeCXK{P1Kf@n~-1<|0a3!*{U7es@yFo*_aV-O9> z${-q)ok27xOM_@owg%CltPQ5$zXDOi0 zQ1%DWpdtW7gNgwV4JryiG^jWL(V!v$M1zV25Dh9CKs2a$0MTZKKf(S66%!ynsHgzb zcOHSoK}80L4=Of5G^pqR(V*f3M1zVD5Dh9uKs2Z*0nwo11Vn?16c7z6RzNhUXaUin z;sr#5iWm?LDrP{myK(~9UQlrZ;)9AD5DhAJKs2c60nwo12SkI4AP@~IhCno^C<4)- z;s`{8iX;#XDwaSrsAvMwpyCNcgNi5+4JxKUG^nTo)BoRq-2p1HKzvZK1)@Pk7l;NG zUmzM(gn?*KF$SVRMHz?&6=xtCRHT7uP_YK0K}8#g1{H508dSuAXizZ+qCrI+hz1pR zAR1KUf$5LIVE2HEJ`f*N{DEjt5eT9|#UO|V6@?%gR2+h6P>~3tLB%471{IAU8dN-j zXiyOeqCv$Zhz1pvAR1I$f@n~Y38sI}15x0j6T|=&pCB4kgo0>LF$$tVMJb2|6{jE? qRHTAvP_YW4he6TG<>(q5qHAaXDsgpu4Gr`R^$c`;O+b{sF&6+PVFGCY diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Tasmania b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Tasmania index 02b07ca232053d1d908d019621b792986bd9b429..21ef2d396f6bb95d65967cffec373b03fdbcf0a4 100644 GIT binary patch delta 178 zcmeAXI?g^pdU66Y8wm3-GB7ZJFarYv14Njefgy^4fq{8*G4mCsdPXK%K?a5{8IY|# g3m8}!7-nr?4M*fdKvy~s$=+jJd)vG*@lMy%dHt0!X`B^w#zaw*{^3{F0gE1;gw-v4UleN z{btd?uK%}z{hCw*C;$Bh&aHnMxZWRZ;GQqZz;ojs18?1L2EH8!82IDvG6>9A#2{$5 zpFyaig+W+uA%jRn8iUBcW(F|}4+e2&e+CJ~lm>~%h73}SZVgh)lN+QTYBb2SyEe!k z$^3>J4DHCQfx*b}aP|W+Kv@vv#IQ-A9Lxa9iXbj1JA!CXmITqDYzd-4SrbfuvjD4S z*Z&KluStPvP*w%WgR(1#24z_g%{^ZdM1iv|hylvJAR3f~K{O~EgJ@7z2GOAG45C3< z8bpJ#HHZdfZ7}_>8AO4zIEVqt<{%oB)xq>*Ll6bd@*oB%+k<^+rMF5Bf z6$2m|R1|<{P;mgFK}7}+nLB$G)1{EzJ8dSW1XiyOYqCv$B zhz1okVEQiuI6go{4u}sbc0e?!=mF87;s->7iXadTDuzHbs3-!_pyCKbgNh^&4JwvE zG^l6-(V*f9M1zVb5DhA(Ks2bR0@0x23Pgj7EHM3j5r_g8T_6Ui_yWiZKuk zD#}1Ks5k@Bpdt-KgNii}4Jz6|G^lt3(V!v@M1zVs5DhBoKs2bh1JR%&4^01m0}c;R z(Ffv#ia!tyDgr??s2Bv%prQ~&gNj2C4Jr~rG^khv(V(IcM1zV)5Dh9KK{TkC1ks?P z5=4WFOArkzGC?$`*aXp_q7zJi3p~g%LW!+83xt>=?2zs77gtBe;e4ZNi}ft-*4dD`lo^G{lNzA`H~DgH|{a; z*8OJS+i`$_KkhDrz>GxlxI~pJCACoXDWLejS6>%VGxY8K)X_F7-F)R;+2z+f>+~Ut-5#Fe$jf zFgB{esK~Uz*w&`OBuKo$R93FR% zkfR}Y!q0}hhF1;w1-Batve+34BY!XydA?*Qw!FnqqIsI3RB{hP8RuGtvY+!9%3t;~ zRNQP}s61K7P_;9Op?XtqL(QVPhT2K_4RuWk4fREV4NQzs$jmYbAOl1D3sB0QwSkd^ zfuUys11AFmg6-oQ!rOkqCr^&Oz%mJgR&Hu{$>Hni435u1>%FU7l;OBF)+RL z4_F?Q)j)ji`H~&PgR&rq24zDK4a$lj8k8MDG$>1g>3_{2 z3Y;}T3{dt2(V#2}rjIv*?FVI55FeCXK{P1Kf@n~-1<|0a3!*{U7es@yFo*_aV-O9> z${-q)ok27xOM_@owg%CltPP?;*&9TIvN)JNe+EQ>vpR?Y%I+WqvFgNh6gA5?6BXi(7sqCv$6hz1oQAR1JRfM`%r0-{0135W(2DIgkDtbk}x(E_4D z#S4fA6)_+hRLp>AcjW}Iy`bU-#0M2QAR1KcfM`(B1EN924~Pa8K_D7b41s7+Q3Rqv z#Sw@G6-gi(R4jpLP|*aULB$h@1{F~t8dOYyXi!lFrvJYIy8~2Yf%u?e3q*s8E)WeW zzCbjn2m{feVhlusiZT!lD$YPOs7M3RpkfU~gNil~4JzJ1G^mIJ(V$`uM1zVt5DhBs zKs2bx1JfUa!R`SSeIP!l_yf_PA`nD_ia`(!Dhfd~s5k`Cpdt}OgNj8E4JsNzG^lt4 z(V!v{M1zV+5Dh9SK{Tki1ks=(6HNb{2cp15Cx`(mK0!372nErgViZJ!ic$~_Do#N( qs7M9Tpkft74}+qW%h5GBMAy&&RO0IR8XD*s>KW+xnt&*MV=e#_AO3s* diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/West b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/West index a876b9e7856347c06bf8cd9c8d1c306df48d1d44..e449b03fcf2538ccf8ad011870e766f4b483abdb 100644 GIT binary patch delta 71 zcmX@ZyoqUo^u!D76ECpxFfuSOfG`6C0|Qu)jX{`!fq{AAlf^=eObE!pkTZvYVd7jV N4lc*=;1FF4E&v)P4Tb;! delta 216 zcmdnQbcT6?bUiBr1PC)QFo4*64GatnbNmkNnX|`M;B?4&h1182C!E<{wBYRW&rW}T7VcMYV@+3ZSFTy${;qj}Cv)5a&vU5@m>9v3 znFRqE7;@%-Y^F3S>1S;{<755CbF+cF)A<#c~L(%q(b{p?Y~4 Q7#J8Cxg5iTLv$^;0K%UzD*ylh diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Yancowinna b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Yancowinna index 1ac3fc8f529e5431ff61c43232f243c72e1eac2f..ed0d17a610e05679d2cdd516d1aab1500872e97d 100644 GIT binary patch delta 100 zcmX>sxR!l_v;+eZU}Rum0AY~O1ZiFn1;U{W3=FKBy_wfAF)=btE?^3t9M2&)xsyX! jfy>c3I7HXd%Gkis*(F5B*U&)EP|rZe*91iA8*>2wj7|@n delta 1343 zcmZ3>epqmVbUiBr1oSa5Fo4*64GatnbNtpWnX^az$LWw=9H)=RRh-!#+i`ZeL&doT zRUGHrl`5DE96DHdl{r`glsZ_y*>|uTuyn9rQ|#d6f7Zddjk$yC{fQ3l`3f97H=c6v z)-!SN?KsZCANPbqV8%)gLAzrdLKWQ{!g4D(L?Y^QIYj<-afn&?bBOay=#Ws%?vOa% z(ILg?+aa|)t3&#seuqrEPlxP5!4A2~#U1j~cXB91wst5sT>U=;vK$t7UUpdi`p;pt=X8hlt%n>o zOJ8ue%4YBhtxG3j?D)L#gjwFvNj%15$jued;j#LR>jx@oFj&#P%j`WXF9T^Y3J2EfYbYvaW?a1CJ z*O9Z3zaw`dLs&;%!^e*Nf=3+%S$rIYk^ec0JU?(0TR!9{(Y(Y_DtVZrjB^V|+0UgM z8TTHi!lVIEV%XI*0}Z zJctGbK8OZI0GR&&xxNF$0L27|2E_)52E_=72E_`92E`1B2E`7D2E`DF2E`JH2E`PJ z2E`VL2E`bN2E`hP2E`nR2E`tT2E`zVP7|!J06PE_l^_97bb@G5l!9nbw1Q|*)PiVG z^nz$m6ocs8i40)@K`{=ZL9q^^K`{@aL9q{_K`8)4m)1)j<^VB3NdZj% zTngrck_3nkN){j*lr%szD0zTrP!a*rpkxA~K}iKfgOUq~1|=CrCKhHWWM#tv>v2iY lLL8Q2dloRTFfi0jVBln!oX^ZXIgeQ$k}w$=C-*Wd001)AV)Ot2 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Brazil/Acre b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Brazil/Acre index a374cb43d98bfbd06c82ca306a74f96993fd5657..fb5185ca60283bd56f795e9a956274c0b6e63325 100644 GIT binary patch delta 52 zcmeyuvWR(t@?-%<79K_h1_lsjU|?XFpv)@Iz`(#VS&s3~#0`?Hj7*G7%#$6NBqt{@ Gi2wlZ5D4%9 delta 293 zcmZ3){DozLa=iir0|P4q0|U>rRc#Y?@TW2C_#1Oz=f{A6UH2w9+_E?oaO;g&z#YlI z7w+sVb-4T6FyP+oUk>;0ZVPx2;_vWfhV+H6tW^%*4m1RO=d(KSBhVw@$MJ^_zqsCA z__b2x!0$Io0e`w@9*{k`DnPE{^8xt7H&oc1_lsjU|^Um$f&}ozS)e?fpKyJlPV+Q&`a=iuv0|PSy0|U>rRjDaE_^mJO_-iy_=SMY#UH8%iZdoi)xb^yt!X3%W z3-0Xn7P$MHUE$vB3j+7=_9#3EQ5EI)Q%4^B{Qj8;(M-ZeovLW^mE@}ndHRr4nc zRIlt5F#on=fyIt;0n7VW6)ayePOv`lae+-f!-V?(|Nl>3$S6B`10&buy^Qh`lo>TP QhC48FFfcGMph>C&06IWoT>t<8 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Brazil/East b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Brazil/East index 13ff083869a9ac8476775587de8476654a100017..a16da2c4d5a980cd944d86c34ea8a2f597e39b71 100644 GIT binary patch delta 44 xcmZ3&y@P#%@?--h79K_h1_lsjU|?XFpv)M(*^21_)8qw=;mnLojFW3w)d9Z72&Vu5 delta 431 zcmdnNzJz;%a(xT~0|PSy0|U>rRYhBN@OwVk@z-I&&W|PryY7`J+_G3_aO?FigFBKB zH{977sc`qVsKLG2_Z05mon`PK#8}}=6sN&g);NW42T}~a^T{pv5vXJEg9UtE_q z{95s2!S6S027kJ17s#IMGmxvezCeC~=>`Sk^9vLkGYyouPb^T5s2A9v{HQ=d)%?>2 z)hovp)D`&+)b~DKpvmyjKyymBg4QeE4cgg83v>=_HPB5vqM)~6x`DpiG6jQ%N&`b# z-vvhD3LA{svJ^}#LJUlP98@q{!M>epFded7NHn|!_n zwnru!*!g`}U_bGnfrH+q1&;M?KMb72-zzu=9x`zLeo?{IH+X~VgSQLZ1=|eVw@+2@ z__b(*=k#&~uUjn}yc;Gj@Y$8N!8f6Ff!{2T4gQ{!6at!44FVM`7X&4{8w4{*F9>ng zGzfWVp%A9bZ4h=+N+E*jtwF?!KMIkL&KpE^+*63Ym#`rwrRrM}A_`^T!`0KY}=SL@pUH6&{ZdvScxb=p^;g00{ z19x_&8{GY^>~L@P8-x3IS2#QfaWwccgZIE!)*ORx2Z|iN^XY8(5oqP`-suWisdz;)O`H|>%^{r~^} kCnqwBPA*_%n_R%iGP#sdeu6Ti!oqMy4h9AW1}yUG0Gc{hT>t<8 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/CET b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/CET index 122e934210cabf0b29a2dd7d11eb8220ed1cad43..546748d6eace6007bc1239dbe2bd5c324623ca56 100644 GIT binary patch delta 155 zcmZ1{@RntQ^ke~M78vGXWME(bVFm^U280x=DFXuo(`H5HHH>MD4CFutJ^=<+1_l`g nMh0is;1C99*ANCSXV(y2Ll9TT*I3U~&p^l5&;Ug18*>2w9?}r` literal 2094 zcmWHE%1kq2zzSHPq8$tj3?Me=Y##B1*;j9Um~(U8gt<$$PMEiI!i4!P(4OW z1Yutn0TJV06GW9?PY@HnGeMmB>;&=8`zA;{UOz$d@`4FchbK;u-m_OgX3aVQ**WtC z4&%!D_Fwfc5Q&2{y~(C)n<`nqb%FIKh6l%mjxt_qtUAK4IU(%3!Gs7=H-U)j zLK7mtY6wJa`!XT=Dwjaa0zrY;EpG(k>OTv_PdO)$5Pwx5vG&!3B>U|G$+2f9q{z<{ zNVQ!zA&q0}gml>n6VhKypOEplXhPeRw2L!S{Va#f2jRmG5p&sM@ehp!(eI z2{khhO{iTrcS2p|k_q*F^%EEwn3x9xWMJSEU|?lnkWpY{fRP{(XV>5m24~k01_lO3 zMp6>~|NsC0gAzZOzIy8ehz4Z>5Dm%*AR3ezKr|>rfM`&r0MVd~0ir>f14M%|2#5w{ z5)ci_C?Fb?SwJ)>!+Pn zXi&xi(V)x)ra$kS0HQ&e3`B!68i)pEHV_TUa3C6#=|D6nU<^$273<#n@nGi&S zG9riuWkwJU%8(!$lqo?pC}VL1c(L|6kz(@GqC-j0t3Vc6&fHKRB(W3P~ichK?Mki1{ES88dQ*gXi#AS zqCo`;hz1oZAR1J#fM`(R0-`|$42T95G9VgM(17Xh2H^Mr6*wS1sL%n?pn?ZPg9;xI z4Jv>@G^h{)(V&6|M1u+=5DhAjKs2aO0@0v?2}FYmClC!Ppg=UJkOI-5f(k@~3M&u| zDzL!xi|JtZfC?@UA5?gOXixzLqCtfihz1p8AR1JdfoM>H2BJZQ8i)oJY#%NP=N=gKRg1*2dLl!@j-K}Jp&zILjw@4Z_EV%(C7@( diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/CST6CDT b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/CST6CDT index ca67929fbeb05083c63e8319dd9ebf65b3d75e4d..d9315580584f6ad8f741781fab24d7af992c5df8 100644 GIT binary patch delta 108 zcmZn@+Ri>fT!sM+FfuSOfG|jSg18`vg5d}T1_qYRrOZc|CM$A8sQ>@JdI1B=|NlET fFfxEi4lv2%>=MG@92~;n93H~p91t@3Er%okud*31 delta 1285 zcmdna-X=6byq=YTfdPaW7#J9)LfHcImgzLi-}SR#K^tGg!dbTqPIvrkxTO50;8G&z zhhIO^8GgU;{P5?7C&S+p+8_Sy&}R6*g7*W%3|#Tpy+sa6g#bz;m;H!w232r44*LCw<^wIf+4FX2}P^ z&JqTp%CHZ@nPChfkrp3BJuMi-ETuk(Yf3RlD47>Xa{OVCVv;P7`XtdH{qT2z%*9^~ zvIp-L$ZfpSAir>bfkGKSgJR>t0;SN849Z!1Kd6{qW>EE-|3OW3D}%aL;|KMB7aKIW zl0RtP+uWd4|H}1)_P(hNI+v3Qbmx^f=xuf>(65VZFqo`XV3=OUU{uUeVC){jU=sAI zz*OCe!OZAPfjPSjgN5{q4;Ih~TT%G*5<{^Z!5OmT5EOt$+9- zKa7{5p#SiPLeuvQMfpoV6pLPDDDiLqQ1b6>Lz%^rg0g$(8!9B)3M%$(Y^eN^QBXB+ zazphEuY#Jo(uUd{It6uc;SKdO_zEV=Ge=CeXSSGZ&&+D^|NrU*3@rcu@7%!1046!W zBo9Q~*(HR*IXHyDIXr~HIUod-JQ*Rx1aU!7f(2oa065WZj6T9t58{Es6--~A38EN4 z!3$!5f*3@Df*C}Ef*M4Ff*VAGf*eGHf*nMIf*wSJf*(YKq5wpLq5(vMq5?#Nq619- zVXSWeF+lMGrk~1zC~*9M7@#-;(V%z&(V(~j(V+MO(V#d3(V%z((V(~k(V+MP(V#d4 z(V%z)(V(~l(V+MQ(J8$3ZD0q0A{Hc&`Zfd12gNUl4~kx z8Wis!8Wi^+8WjH^8k7b=G$Qqi33D~5(t>ScOGmZ zD4~G(pu_^AK?w##gAxsh1|=L24N5#98kB%QG$;{)X!L|+4oNWJ#6wC#nmmtL5&-ux BxJdv2 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Canada/Atlantic b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Canada/Atlantic index 756099abe6cee44295a5566ad6cd0c352fb82e64..9fa850a7d4c36dea84149bc0ea2fcd3581d61a8c 100644 GIT binary patch delta 92 zcmaDL)xkSKT!sM+FfuSOfG|jSf;caTg5l+xSRGg=e`GeC{Fb?F@&Xnk2`9bZF3JwrVME&wN94(R{@ delta 1525 zcmeC+eIPYKyq=YTfdPaW7#J9yK-nS(=Iv-rn7`|8z@oY04vP&o z8Z4;_b66@ZZ?G(Q!GUFef;OzM+3T?4j>(2qGV>i)owYJp{io4k&Hjl7Yv0{)Sl9E< zVErCfhYj_i1{>GSaoFTtuwipwox>KD-3D9p5*)UP)*slg-OtHk2Z#8EohmO6?0o)n z!)}(-2X#%pO;f8&mwm9scaLeGp<>vg{tl95Bz|NN$0{QG*79 zV?{O&#|4rMPMGB#IPtS?!zrt=E2Per5Enpt4_GPvLxW%zSxBOonZkF=GiAa%(Mu2RHvBm z*i$OtnY;Xh=Ry(}UZ^uZc=7Sqg;#8kAH2GF=fdk}M<2Y|xbMQp{$&ZD>N^8I=XWH0 ziO&xB>YtVH&E7ZQyS`7t4~@(VKl$|%esOqT`1Ql_ zU;gm|!}Jdi7~3yjU@E`#fVtp9087IA1lE8{0c;Kz6W9&51aK&9PT&-n7Qn?YHG%6x zMF97M@&ulnQ!elxh)m$yS$2VcW$6QfnGqKRJHsCcRa#vT&a`|W5-D>*)KmI_n8m*f z;u?P+NGM4MNOIhNAjSAMKjPvi-b;`@crZY21WhjY3!3+)CuqIWyr8|WGC}9ETY&Do z=mfpZ8Ugxswh0E4xdIH+BOe$Qy$LXOw|-y}bS}VDUG{;Q(S`tXw*L<-q|aQic=qst zjqwMzg+Xclh^oy=jONvUT;M&c+aU$@VRCb;9C=$;I~aAz(2-5Az4@j*nr+>Q$oM;w4M@`MNJvh%4@lw7N=S8A3`l+JlaQ{?9FTri zFCmldX+Y*$frPAQ#{;sb={(3e|M)^~8Q+7v^+zw{hkkfa(7*gbq3NXuMfsfBmjzY5DkiU yFnw<`*a4vE2k}8k07Qe50f+`A1rQBN4j>woBtSGMS%7Fz(g4v!B#+4jY!U#rwO$DT diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Canada/Central b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Canada/Central index ac40299f6b27043e8f2454ac594b0ec184c1a237..7e646d18e18851bfde743b379e52df4ec5b5a20f 100644 GIT binary patch delta 110 zcmdlY*2gtLT!sM+FfuSOfG|jSg18`vg5g>Q1_sv6PAqSjIhh#2keOxjL@xWu3%Cp> k8!)p@zQ83X?Bg54;Or8@;2a#n;2a*p;2aP#S(;lC0GD+T0RR91 delta 1669 zcmeC<+9EbVyq=wbfdPaW7#J9KLD?b=3=9mj8Gk>ReRx;Eyd4W0=I{DhaA<*b!(soH z52ri+HC$5uQgA7e^TXwi42CPg2_LS8US+tZaQ4G>)9nm57}kHdDLRwk=7WhJZZohm z+&&TW;m*D34R=>gD7d$;vf+MbQNe?G(G3qXLkb?%)!Q~a_B1Pa5+~pAR8ykhnY#_c zb0L!tFVy82UVIY!@QR&*;nl?-A6`Fu#PH_Ykq>W=9btGkanFa(`AZtU7$$xA$?w(h zi=&L;*N=3D-!CE<{@n0n_N;olBzhW{&M7#L>oGBCFPV_+(O&%j(L)xeU--M|{~ zr-9AkZ3DZ(y#|hYh4T%Z0tXtn7&bO=eOT1M{a|tf&&~Y|ya!4f_;xO2;9oh3L11Px zgJ5R~gHUBEgK%aTgGi)1gQ%wkgP5fzgSe&?gM^Z6gCxfv1}P@>2B}XH4bqP|8)Pp2 zYLGqnxP2I>Vr1dYM7hYaK(qn&?&rb*%{u>i;e_ zXmS-XXx`i0p!F(*L3`iS2A#_V4Z8En8}v2@HR#txHW*AcX)sJLV=yWfYcO_?U@!^# z(O{}>#b9Q1tHGRIhQUJmJA=iue+-ttZ!%aNd%$3QdpCp4`acb}yXP|4_1|l-pIy)3 zkbj`Tv1N9HlmDUy=aky|1{eL723MEB0@u&m8QgVqKe%6>$>7QB|G{%}HG|h%!w=qb zrZ@Op^DFSJsci7uW>DZC6WtInO{gHy#1}^53=(QA-{%MBkh7A*SUBL+rk)4{<5W7~*t)ODx#)irt83k4I zCO1^y@G7XOD{ZLVp;J&77v50MJcF-bvO9}b04p1H;p9LT2e1GCm%L$M`2TRtKnzeEf@n}Yf@n}&f@n~Df@n~jf@n~@f@o0Of@o0u zf@n}2gJ@7ZgJ@7(gJ@8EgXuqv^`NqX0Tl5d0Z`xhBq4xUpu_;8K?wpx zgAxUZ1|nVgu2j1P7vv z>qReuXmH8{F+iygM1xWwn7(%&>;O)?E B3oifw delta 1537 zcmdnWyG(k5cs(lv0|N*%FfcH@gtA2%7#JAl?U-CJf7k1T1?_q#7S7t}uxJX~hsB{Q z9hS7kepsqek+3Yy{=;$}zXvPa6hEwZWAI>=%*ldPSA7#!|5;tIW~+X}+B>}k>!u1O ztlyJgu%S-(!Nxg(1)I{n5;oTu7i@9YN!S`ATCh#Mo-bj$_4k4uY#$PKstSMD`Rr1{ zZkDefcAtOuV9%55ANH=l@L=DOogeo1Z+dWG$?OjY^QSyG)KdH5uz%TuBPsD8j_OA| zIObbZaGc-j!3o{Cg3}!z3N9&sDY%sI`@!YXCm*gj+fwW6Ta(575vaBfAEvvrl9^8N92QF zKO#Q-eqsIK&kd^&e^1Ch__ssm!~f;~A23Y+_kpqf;RB}f2OpRV{w1&^{4HP&c#y#6 zaKC`v;7|gG!odPgfh7rC42ui6KC~rpKWHuBxw+^8?}79JzMU-(_*XW65SW?vK(I6Q zgHWZ%1K~{f4%0pLCQBq3rl)@}D*BaR?C$x&B%UN7KRfAx zL;j`$$Cmm8C;ur0&MAorF8XB!t}f0AuAf(YaMz80;C{L5gD0=!1JBJlAH3cwKk%N@ zS>SWcA;GsMyTEUoQi6YsZ$ZE`mV`hX{eqyaeGJ*vmp(heTet#|qGhLMs_LToa zgxs+Q5l23Li2S$WLDZ7VAENJdJ&0-9`XP2-&V#s==^x_f`8`PR-BOU)o}G}SJFOr& z-8UhHx1u1`T|Xi9ZB#+Jx?n>3S(}1Pw$BNfYvl^Eo?T7Io@VtS=lsV9xn(jR^44E| zkRST*LqY%62M&d%4?Yy-Pk&G>dgw!mf8~RcfA02J~dJ}C4- zG$;l@G$X;G$>|3G$?jJG$@8ZbP8{M1=s`MJb2|MJtE~MJ2h;Zsf*k;gdJrEJ{U92Y1VA(>8GvX|QUKAQtC%k^O>SX|oGis`B*Eny9AfV45~Aa4 StY@TWpyO+3sAs5Wzy$!%tqkS> delta 1256 zcmX@bK1XPRcs(lv0|N*%FfcGogR(_B?wxxuZ^!xx^LMj1ESNEI!h%b!4U4*7Ojz8) z#;_#o)P$v`hZ~j!KNnaoy0l@1@kxOd{|+&n?&O(pN%>2`r9=satD%ntt|{DMU`dpm zz#8zUfz9Ff1a^aa4IB!0CvXZJXy9VlKY{DRq6Y2<^$REP+}zK=d!Ts&-_C^${3{m- z2+V9|5bSIc5UNaN5Y9{y5Q%hW5cPBu5VO=|5ZBZYkWg}MkmTeNkYZAAkou%HLHZGA zgUlt439<)YH^^;#H9>yi*#?C&Spmhy^$kj){{@t@&M>H$J`_;(TF0O!dRRbRYXXD% zzxxw3xr!Jx>+c<$p!F(*L3`ig2|AYx8g%EiPSD#N)SzFNKEYtJNrPc}i-1wFSc9>9 znt(~rj|Nk94*@fyTMg#yS^^f*-x(~P^9We}zR6&9?45x1?cEGE8@MLe?w-qF*Z*dM z{p@-Mhx~IB99w2LIQegw;G9z1;G#cif~!k>gX`y`0`9ss4E64pmkW6E#xZzq?iBEP z>%ibWXXyl=YcUPJHSH7pw%IlK$7D_jn5NJWXyZL0sEny0SVnh3Na&M>kU#tr!c31f zggw;}h>&~C5OI`GAoAZ)hNvYU1fuUPXNYOJBoMo=lOZl;i$MImY=#8i3lkFC+Z&Q} zH%&-R&umEHoiZWS-MhXa^=;XNbamZ^^s^BYGTHeXGS^y7$a?m%A$wZ5K+Xj|hTJks zfxPt}81loU1q%8vF%+8q6)4Kz!cZ)FU!cT)8bisy-xJC#HZ_#pyE~ymVoF2BzWoy_ zf0Q*;&09F3`bI=UOSxF_Ffk%Q=Ehz12Ghz12I zhz12Khz12Mhz12Ohz12Qhz12Shz12Uhz12WnEu0GKLNx5g*%vjsspwV6#gJSC=Nh0 zC>}sGC@w%WC_X?mC{92$C|*D`C~iPBD1JaRD2_lhD4swxD6T*>D84{+3UB=sume)v zy&FIRptu9kp!fsRXCuJ!pm+rFL2(J9LGcNqL2(MALGcQrL2(PBLGcTsL2(SCLGcWt zL2(VDLGcZui|a-2gMAE&c#r@n@@jhRqbz^P`kHM1*na!~>)h9nm*-{25)UzZRaUt>KZJp&zILqk17 HJp(QP0P1_i diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Canada/Newfoundland b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Canada/Newfoundland index 65a5b0c720dad151ffdcba3dbe91c8bd638845c6..e5f2aec2bb2b56dbdb66f0c0a00ba243ed788d58 100644 GIT binary patch delta 80 zcmX>ubB%9;xC{dtU}Rum0AY~u1aUzS1;e`;7#KJzvtV1torMSW?awc4yMta*~= zv-a-%JL}Fioms!P@y>>|DQ7k=n-{aG*X_*awuYE3x%C=nwx%V;Z1d$hv)#=lW{1w3 zGdtDPVs?pf`t0U+y0iQ1Yo9&uRqpJ)de&#(Jl~vs=h;^5-@0Dnzz#!;gO%@B9GW3) zaX9kgiX-J;Esk1lUU4i@aK~}UsVh!6eBN=AX_Lk&g{wPGJ({9%hGF}TOUhpgE+srW zak<0g#uYDSkEaT9xe7Vx&wjg`N?Mp{b+__g0ad%~| z$Gv@F5%)X&Js!-nhm&_F!{36~S(>)`LS~O$4VvzXumXUj)~OLJ#f- z1raenSmz+I|J%(2vr)N5Y9BZArdKiLex{_hM2|o6XF`* zZb&GJct~>GxFN;(%|q(r*9hr{H#}r6UXPGHxXVLsyU|asB1YrQU5ooM3YP9iRQhM60KKkPqg=imFQenPSKrbQKGk* zHATO!UaG`k((@F62EP{9{w>F5dl-*dj#4@ zMFf>z^az&z6A==+*(2oly@)W=sUBfZe%*+W+jt`4$ekOJ|0bV^TC(p(^u5v(F)a&j z#O@0}5tq_*BYvLci3H#I5sB?#9!a{55y|Nm9x1%Z5vlG{9;t6#BhuCWc%+|IkH}=Z z=aIRVGa~ER0gs66X{tAJ&fhtaTgHAPZ~eX#`Jpdw6!b4RQD}PlMp1s#iDJ>UH%k0d zPL%vR6;Wo<=uviWO+g+sC(4Z1x3{E;Pj}AGl{65{@P=* zBb)T(05-14F>KQ&H?WyZ{={aW_y7N$8;mSIz99^LE+Gtl!66KO0U->2;UKlUCC@MfSC_2FOTUW4yK+yu?gQ5mRgQ5paujK^GgQ5w<2gMYK z&N*Ly2kZb)lz{|5(FUSHQ3s+y(FdYIQ3#?z(FmeJQ3;|!(FvyiodR0`idGOG6ty54 z6un@2UmsW=6wM$$D5^npwek&h4-f+s=O7vs?;si!_aGWq{2P!K{|pS1t=MG%HRO9e diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Canada/Pacific b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Canada/Pacific index bb60cbced30763c08b6cf73554c8d6651ff387d0..c998491112ea5e4430b8266498cf7f23e1266bc5 100644 GIT binary patch delta 95 zcmX>jwux(kxC{dtU}Rum0AY~u1aV#v1;dS-omd1|SeY1^m{}$pGS^K0!DS@D6%ZU^ Y5#SP{<7=#Eq-UVxYiOuvsAs?h0P%ng1^@s6 delta 1401 zcmdnQbw+H0cs(lv0|N*%FfcIegR(^$7#JAl?by3u{%+9;r#qzXo58G)OkTNQ3TSSN7n-^B&D4@?lab8qv4yDQgBxVLZW zg8Q9)6CTVfU+^%qV8Wxi$OVr*gC;zQvtIC2(`3Rk_xcEh=R$!3FVw9RUVJhZc*QQG z@amGN!0TuK6y9w7F7Wo)1BG`JZwkC$|7XF6!rcNN`|mCIRDW>7=llZ;zQiw{@YR3O zf^YV%6Ta)WEcl_ZNZ==b+JavkEdsxOG%NgmktXoxMykT!6CMKpcDO72U!f(yFhf&; zv4cl|se)U9xlm&QOMRmH0@gsT32cs>3)l_bOyE#>y?|5T+ypL$vkSOBY?#3PVEqD~ zn`Z@h4@_LZw{yJ!|H^d=0y8HH2zE|T5UMN|5Y8-85Qz*G5cLdE5VJHF5Z5$QkWdPq zAjv7AAjM=lLF$vq0_jKM6J#!lEs#C6Hm#PpuRpRRj2eCjw1*R`=RRGbTAOq8z zr-S*Rpabzi!3Uy2K?tHj!3d&3K?$Nk!3m;4K?wuv z;0D7!hMS_x1#UiAz;Nr|;R&}7G%?({w{*hYmGc_z?Q5TKzq6s?!Mw}~4>OY*9@TkI zc6iTcvKpy&Z%kU-4F@E1%lwGto^gjx`f%Qra0oC^R@Rivx{ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Chile/Continental b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Chile/Continental index 816a0428188d99f437004312ee73c3860ee0f54f..8d6032264b656186dc23df35402b1be0079fd670 100644 GIT binary patch delta 217 zcmaDT+{86OT!sM+FfuSOfG|jSg18`vg5fF#1_rjxCz!7=*E2FPGBdI;!5}jeGb@ z_4&mm{48qsHIS?s+ z!XUE$+<~a?s|=#^HynsrnO?skwxs4jT&L%T_>i~*37Og(5=|TqBzf{~NET5#kfQN^ zL&_JH18G7$25EN{9nwF(GsxJ>?2vi!f;(b*d})f<2qptu9kp!fsPpg084pm+q)ptuClp!fvQpg0B5pm+t*ptuFm zp!fyTPqV=e0>v|k4~lCL4T^6N4T^IRU3J*V9P9v4+=B!_@eiUwX#hln(gBDDr3ElO LT++kjhb)Q!@lTf; diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Chile/EasterIsland b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Chile/EasterIsland index cae3744096402e8a452336544edf96ca9ae5ad8d..d29bcd68b0202ab8deefa1537cb12b03e057a521 100644 GIT binary patch delta 156 zcmdlfc#dO&xC{dtU}Rum0AY~u1aUzS1;c3!3=C|WW0*~t85t)hGD-L{Gchx1M z4BH_2%>IDXMvD#7=VKgXCQ5CPU2o?gSMXIf?gE`yP4HgXi4i=|53@l%2AFx{W%E0<0 z?*W^xGX}OR-XE~bT4!M2aq)md@Tm=s8JiC{8L!#k>@oF#i*VltSHn#XuAd7wxC>5k zaDUHa;PJ7{!E;Z(f!D9|6)vbaDY8Fcx)aL0q)HVG!sP_|asQ>@}KO@WJiOkaVtZejz zZ2$kytYBaOlPv%LuU^2x$npRG+zAXkli69+_!t-%89@ky85t*t3xZNQ2*XqR#%L4f zdJqp3t{@r|wjdf5z91SD#vmFL&LA2T)*u=b-XIzj=3x2@%K;D#3VSepSJ44PgW>>0 zgW>^1gW>{2gW>~3XK&n8ZvbL|A_hc*A_qi+A_zq1S8dn;qCxQlqCs&5qCxQmqCs&6 zqCxQnqCs&7rk`em9R!L)5FZqeAQ}{xAQ}{(AiC#qkcFMb=E=Zq`age#qbwPH$or7Fe zaDaTjf`dYoX@FvVK9hrzbKnJKzb6hV%ElK|^^Q5HiFRF37k_j>{onEcjqjH(Xx{4# z(7L|mg7&`b0G;jAF6hql4bYojaY4UMKfs_o>Vjdq_XVSHn+wM7x))3wA_GiiuLhVI zZ3r;?yFI`{`pgB3XO}Nn{$6*%>e$u`*0(2Iuvvd8z;<`h1-t$&0rmE?LoPU^MPG1r zF%5A2+;hQQMLfX$&dLB!=AQwcn*%O*J-!{_JtsH7=gjvDzO9`X{Pz1@@GpOGAzXJ1#^Vxq2b;->eH!OSWH#zE^W0 zre)@Z*nM#q;!>(F#LsiMkl;I`J|M9@HXup2Dj+%CJ|KlRCLq;aF(CD=T|l}zb3po8 zg@8=9rvaI3nF6w&9S_K!CU+s{{NoF`WegYc)*ro)ANuG*LI3g#g{DU?6yC9I zp~OG?Ldn0w0c92)0cH1=22@C71yt;752*a%6HqlTGobp0UO-KqcR=k9fq=R=R^5R5 z>7ORAV|J-$VM2neEYySl|8F|M!0`Y7rUMKt|NkF9z{v6c|IQ5zJTMX@;^Qk4!r z!r<%@!r&Yn0?rhSj1#1JL74)?180zp(IL$BARZ{_K{P1%K{O}|Kr|>C!1V9y0U#O_ z9bo#&=L;Yj6fI!-$W<^O6g?n5D2hNdD4IYtD5^j-D7rv2D9S)|{5*$xu*L-68DI-Q z(Fc+MMInd=MI(p?MJ0#^MJJekYX?>jidGOG6ty546un@2EfZKC6wM$$D5^m;D7ry3 zD9S-}-un8ZU|}r2*}qo z3Mk|h2`I)S3n=-72q@dQ3aIFq38>1b3#jo(2&l6IBWJViUBEvQN<7 z@?(O|l9v;7r`(#L*K&G-e#xE*1}SSN7{=ZdFe=(2U~Icvz$9pzfT`?U0W+ft0kgmL z0v6I!CRp4}6tMhVHoFH0247EtUdKZmbiW zQ=|o4RG&|9b^a^h#(HvsyYhVj_jk_(Jedy)c%C~U;PrU1fcLsp0zPNp~MEziJ3X zZTm7I`YM+|%mP7y*e!1a;_5#O#7{XVkPv@WAhGtx6XK2@}#^OrMbPw`fAPN>?jOrZMQ?g=$B4^60D zH+Mo^<&p{Yef1L<83qb6Fvut{ure@c889-yNRWuDYj6mIt7`}YBNUL5Y(Z%llypHf zDEWeDP!a~wpkxf9K}i`zgOW3d1|?|_4NBG^8kDp_G$?t4XiyRd)1UWE0MVeN4x&NH z9YlkYJctG*dk_su`XCyV{6RD*3xH@)HUQC}tN@}x*#Sg@vIK|*WeX4u${HXVls!N+ zD2sq-P&NV6UroU70A&{tACzT4G$`AEXi(Mx(V*-DqCr^*M1!&shz4aP5Dm&sAR3gV zKr|>@foM?H0@0xC1)@P&3`B#n8JPZCF94!J*$qtJO$75n*$%`9WjzoL%6=dklm$UF zC>w%kP*w!dpzH{uL0J++gR&)v24zhU4a%M%8k9vrG$@;bXi!!K(V*-Krr$jS+YidN zAU-JTf@o0o1<{}^45C5V7(|1zGKdCcXAlj_(jXd?twA&>YlCP|_6E_QEDoYU*&IZJ zvO0(cWp^5d)$@#SDlB6*V9lRNR1QP>}KdYJ1S++3e2w)? Q^$hflb$ksCz$_Ck0NePQ{{R30 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/EST b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/EST index 21ebc00b3fc096035b9810519d778d04a3562a44..3ae969114563a5d7a1df96237c38a10df92baf56 100644 GIT binary patch delta 22 YcmXTQpP0stPN1X2J1 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/EST5EDT b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/EST5EDT index 9bce5007d4dbb871974a69cb0f68151c1ee22556..50c95e0cb07692f2a177a505041a10f284cf0a60 100644 GIT binary patch delta 108 zcmZn@+Ri>fT!sM+FfuSOfG|jSg18`vg5d}T1_qYRrOZc|CM$A8sQ>@Ja{~j*|NqAi fFfxEi4lv2%>Jq}>8XUsl8Xm&n8W1x1Er%okzS&-}O3SK^sHC!dYh%PIr7LxTO50;8Mcx z2fuzqeE9vs`oW(YRv-SJkbUrPhs=ln%l|)MnEvkrWBbDgOyv(gFcwSebl{h|lF2ht1pcD6j=U)lUYU}o9_ z!OqkVLX{p5gfrbgh(u~V5cSmjAZE$)KwOjigM^Z1f+WY=4^m9r2~wZ93Zx&tO^~_x zra<=K`2@L*=L+N(ZcI=pWB8!hI5|Nn^w9_9to096Opkm}^_uuVO?24@b*i-TG zXmW)<(7d;_K&$?h`2+2J?FBlQLlSi7WftgdHcQa2^DZ!$ERkTCp8mn8=vRWVyXOa! zpgRes>e?U7jP@m%v-5tikiPZ6;@SHTmcRErusU|}gZ1rs4{X-IE3n<&@W8JBLV^A4 zqz4Z9n+hCT>Jyy&rxZA+Bqq4%mle3WI48J%Uh%5oa3H~v@1p(7o5&~`X3xZ0YB?QX|7KDVJNC^4;xggARRYKTP z{tppy#~wr+`S>C7---uOOD=zizSs32re*7g*nK$<;!>u6h@a>8Ai;M_L1KG$LXz&Z zg5-4HgcRP2f>d|?gw(fDxdrL!f(hwoZ3;5kJ||?Zl`F`4b~Pb;n$?G#^B*7NmdSj` zTYvdMe(1js1^rte6q-KxP?SIYL9yte4<-JU4@&;sFDSE^mQZ%@U_pgMMMA~C#RZi= zq7tg+wH8$0ut}(?OE0M1A(v1W=UGrcgCSwEJafckduEHt_ROpn|NrmYz`*kV|M3Hi z3}BK2O!7d)U0p<!TXxT*E^cTmwQt$&(R6Ob{0YC0Gy!34jyr#^@tV^&lQ7T*36^ zt`8s@6ue-1a}Jmf3T6-=6x1LZ6x<*h6yzWp6zm`x6!ah(6#O6>6a^p}6b&F66cr#E z6dhpt_viWo5Car1VEQRP*g{bJfcT&|0@0v&0@0wj0@0xO0@0v21JR&(1JR(k1JR)P z1JR&31ks>)1ks?l1ks@Q1kowH^%Y9Uh!2Wm5DkiFFuhg|EDwrr z5FZrhAQ}|!AQ}|+AQ}|^AR3egKr|>FfM`%!0MVfI0HTYtMGt{}3`!Uv0Z`%q(VzqZ zrtcjDTL?-hAU-IufM`&H0nwmD1EN6*2SkGs4~PaOAP@~oL?9YHA(=xG3^?(Sl8`3P HW0nK}K}_As diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Egypt b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Egypt index d3f819623fc9ef90d327380fad15341ec1a0e202..ea38c970086c6ddca48d6f5703cee91ed1ac98b4 100644 GIT binary patch delta 81 zcmZ3?|A%vev;+eZU}Rum0AY~O1ZiFn1;X_V3=GVhe=vozOtxoIo4lM!NW{lCgu&G{ Q7(|3HaJjmM=o)bW0IUoQW&i*H delta 687 zcmeyvxtM=~bUh0L1k^JyFo4*+4GatnCnj%saN<|>g_D2YKR9*##f8(S*Cm{}uX*9@ znuib09s6?Oe1F=53o9!xTx>~raH(r;zzehFgco0Q1730OOn7xQ;lk@TzdpR#n#=I^ zeEo-a(?2o1->|vhL#1lN$BEBAe2R)>_*^Vi@Wr~P;cIC9{DN`_SKpKezXN_`9^J;oqK51^?T&F)++i{lJ+1vVo~SvVhrBmVqVl zUIDB2A_g{R!4K>_R~tA~TnjkfaWZhRR(#+(Z_~j2{O<>zjRzZePZ}2RP5R2fzbfT} zK#4|!VE2pyq0krx;rcw;0ul3v45I!4AH*a@8pIb&{viI#gF&)j@dwG<)eTZ#Y(7Zu zV`z}MT2LT6--JPK+u{%M4e1RE)2|mOCeCJ1s){L4c2QtZNm4IRRSj-XvpHO#&eqPL zA^Yuv#`9ebS`5`6v`*PKXg^$EptHJ|LHE$34|+Yz8uS+kKQPGVxlnId|Mh{9*SibG z@z)=iXkEBqYQOV=8P}!@<{H-$%s-zGu;kd0V0n3CfYpmx3D%n@2iTmbNwA$<8eq2~ zF2TMyJiuXM)dR>~xC{dtU}Rum0AY~u1aUzS1;Y~=7#KJ|4obv_?<}NwBVBVa$3+7Lk zTCkvXm%_rbKMNM6&QVxgePY29za0yf+W%HqrkbFzT>Y5B3N0Ol6|a9RSjBL8!K$mG z3aej!P*`(3M`7*BOA70j`zfqnP`O}3yMe;SNf#DuDya8au(@c{f-M1h3$}VjDQq(k zSg_rwY{3rxPYZSmMJ(9){>p+~FBuee-}tDo=XSWl-W`_}_HF#PVE>G*3I}FOD;%tt zu5hU8ufpMoN`)hVOBNiph*mgebx`4W#I*&-Z*eZT;`u<~s+{72Ykq4KuIp$h+|cV& zxbbtU!Y#f6g2nHqkNjM4Z_BF%_t%LjJeYE3!NVet1&^{z6dng@ zEqD?#VZl=)o(0cr*D5@h)>L>Q60+dMZ*GN`e+v~}-FmC=`fjkon_cG>-fsT2;N7f^ z3hx`!7krpstMD<=bHS(jc!keiX$oKB9TmPR@-FyhudMK$;r)Ui@~jF!9$Z{d|MTB- zge!m_zUkX5SXdAKrryY0-;KQ1;U1l7KlWAS|FM&)A6*lq4o{pQ{cw4`fXte80|}r2*@wY7Es735>RaP z6;SdC5l~Ll7f{hL6HxW?o}k7fA)v0MJ3;-c$plR<{t22_#U^OI{5U~-%Z~{W3%I{~Cg90@P{8xt2?4Liiv_&btrGA#vwwnbUyp#_nuQbm^YR1& zdYUH$hIdT}%1NCNY@RbA#K(O?sJP#RFdfYaVc!iVMAVDA2}E2Mnh^O_Lm+C~mkH5V zxddVs2nxh*c_R>4|5+e@$~l3A_^SemwXY^5*>4v}jy*FWMSiA0s_nW7X&hT8q{~j2 zkp5!&gp9vM6EaU!PRP0&G9i0K^n{#ag#x)9wiEJ}1q4$z>OnkEw1H?))PZPF^nqwl6oP0_G=k~B z^#ULo6rEuDZX%d(`MYcah!2Wc5Dki55Dki95DkiD5DkiH5DkiL5bcnrTo2X=igu6y zDC$8pDEdJ(C<%aQP%;3~prinzLCFD3zk3FD04Q02_@JZ#qCv?6M1ztDhz2DS5DiKy zAR3fhK(v2eeID2VP`UvLfYJ_#2BjYm4N5~G8kCMeG$<{BXi$0r)87ri9*7Wi1DgX% zS|D*y@&eJIBnF~E$qYn;k{XBxB{vWqS6}}btPzy%Kmwq&2ckjg4@85~AczK~Ll6y0 ziy#`59zirHO@e4px&+fNrh^>>N}nJ;D2;+>P&x(CptK62LFpAl*Mkx*hyhBtAR3f- zK{O}8TzY7h-d*I@d?Bd~`+=^MlcrEw4qO6MRNl-5Bs jD7`Z)fFe>_&k diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT index c63474664a289aa3c3c0d8b2ce06d484679754c0..157573b1d340e0f57a0dd4d9698bd3798cbf7136 100644 GIT binary patch delta 22 YcmXTQpP0stPN1X2J1 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+0 b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+0 index c63474664a289aa3c3c0d8b2ce06d484679754c0..157573b1d340e0f57a0dd4d9698bd3798cbf7136 100644 GIT binary patch delta 22 YcmXTQpP0stPN1X2J1 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+1 b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+1 index 4dab6f9005bea50a065c685ec8260b0da2bff921..98d5dcf917c6f1d9bd0018db0dc4dd0590e6a8ca 100644 GIT binary patch delta 18 VcmXRZoS@CY$N&Ko%qHe=001HQ19boZ delta 12 RcmXRcnV>x}jvGV>0{|Y;1Xut7 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+10 b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+10 index c749290af2f6b5fe22770c34eb1e8fc87cd85aff..ecb287e667868e92d97cdf5fee601e09cded0ff2 100644 GIT binary patch delta 18 VcmXRdnxM_W$N&Ko%qHe=0stZ$19$)c delta 12 RcmXRaouEB2jvGXX001881X}x}jvGV>0{|Y;1Xut7 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+3 b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+3 index ee246ef56f18de61105af0c14d201fd090f74905..5ef7be71fd96e4ef66fce3ab675303559dbb22a3 100644 GIT binary patch delta 18 VcmXRZoS@CY$N&Ko%qHe=001HQ19boZ delta 12 RcmXRcnV>x}jvGV>0{|Y;1Xut7 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+4 b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+4 index 5a25ff2a6afda2cb09b9e147ad20610bc1923444..75f16216f0d39ff98d969cd1f6703473f6fea50f 100644 GIT binary patch delta 18 VcmXRZoS@CY$N&Ko%qHe=001HQ19boZ delta 12 RcmXRcnV>x}jvGV>0{|Y;1Xut7 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+5 b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+5 index c0b745f1cc44d03a00f8bdf127c154392e3baf27..589990ae8966d1af67f1e05c21e14149adec2089 100644 GIT binary patch delta 18 VcmXRZoS@CY$N&Ko%qHe=001HQ19boZ delta 12 RcmXRcnV>x}jvGV>0{|Y;1Xut7 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+6 b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+6 index 06e777d57e0267a0635b6b284729fddcfe6221dd..fcb60ca2465a3e0c4febd41ac1a05bbb39fd96ed 100644 GIT binary patch delta 18 VcmXRZoS@CY$N&Ko%qHe=001HQ19boZ delta 12 RcmXRcnV>x}jvGV>0{|Y;1Xut7 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+7 b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+7 index 4e0b53a082f11f9b9debf5e110b97b1b0473c9a6..c0427a40eef929dcf25451be77c74af6e9111065 100644 GIT binary patch delta 18 VcmXRZoS@CY$N&Ko%qHe=001HQ19boZ delta 12 RcmXRcnV>x}jvGV>0{|Y;1Xut7 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+8 b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+8 index 714b0c562889a8a774d9aa27810d8400164d00e6..9bdc2283c07d8dae0bb0147c7a7c648ac6a30405 100644 GIT binary patch delta 18 VcmXRZoS@CY$N&Ko%qHe=001HQ19boZ delta 12 RcmXRcnV>x}jvGV>0{|Y;1Xut7 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+9 b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+9 index 78b9daa373d2aa2856eafcc92ebc6d899cafde5c..ca7a81f656f206f32586fdd294a2b385bb519b6a 100644 GIT binary patch delta 18 VcmXRZoS@CY$N&Ko%qHe=001HQ19boZ delta 12 RcmXRcnV>x}jvGV>0{|Y;1Xut7 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-0 b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-0 index c63474664a289aa3c3c0d8b2ce06d484679754c0..157573b1d340e0f57a0dd4d9698bd3798cbf7136 100644 GIT binary patch delta 22 YcmXTQpP0stPN1X2J1 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-1 b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-1 index a838bebf5e7bac3e1257eeb0a61c1b83feb1324c..cb45601c958da687b3e3d63366aa259a8a1c5376 100644 GIT binary patch delta 18 VcmXRdnxM_W$N&Ko%qHe=0stZ$19$)c delta 12 RcmXRaouEB2jvGXX001881X}0stPN1X2J1 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/Greenwich b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/Greenwich index c63474664a289aa3c3c0d8b2ce06d484679754c0..157573b1d340e0f57a0dd4d9698bd3798cbf7136 100644 GIT binary patch delta 22 YcmXTQpP0stPN1X2J1 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/UCT b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/UCT index 91558be0c2bf903b2364215ba26d5227d6126508..00841a62213e6cccf7f0b7353e5e8ae214185486 100644 GIT binary patch delta 22 YcmXTQpPL!1q`04-qyq5uE@ delta 12 Rcmc~VnxH)~jvGV>0stPN1X2J1 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/UTC b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/UTC index 91558be0c2bf903b2364215ba26d5227d6126508..00841a62213e6cccf7f0b7353e5e8ae214185486 100644 GIT binary patch delta 22 YcmXTQpPL!1q`04-qyq5uE@ delta 12 Rcmc~VnxH)~jvGV>0stPN1X2J1 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/Universal b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/Universal index 91558be0c2bf903b2364215ba26d5227d6126508..00841a62213e6cccf7f0b7353e5e8ae214185486 100644 GIT binary patch delta 22 YcmXTQpPL!1q`04-qyq5uE@ delta 12 Rcmc~VnxH)~jvGV>0stPN1X2J1 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/Zulu b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/Zulu index 91558be0c2bf903b2364215ba26d5227d6126508..00841a62213e6cccf7f0b7353e5e8ae214185486 100644 GIT binary patch delta 22 YcmXTQpPL!1q`04-qyq5uE@ delta 12 Rcmc~VnxH)~jvGV>0stPN1X2J1 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Amsterdam b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Amsterdam index c3ff07b436aedf662eae60f50668f5abcdb172b6..4a6fa1d4945d6646652e2972ee8b632ca64c00cc 100644 GIT binary patch delta 210 zcmca7ww_~xxC{dtU}Rum0AY~u1aUzS1;dF93=Hg>6Ipne6PXx^hb+t>$i_+%oV| literal 2910 zcmWHE%1kq2zyQ1q3=AL)lGp-eD>g7NFwExBdo%m$wU{|Kcks+zvY%((a#f!B)5Ule zOmOU3SoVWwQGs&L;;>shO9EJXmYVJ1S*9A@vt0dP&x*LmJuBH4_pE#u#k1;pYtI_> zM?7ner}wOVo5r(lxo6M%b2EE3v}^Zl+$h(xslbD0^Q0i2Edg3QTZ>zJwi)p7Y!BJV zvxEN~&rXMmo}KS6@a&c-?Ad+eP0ya6OL_M0IM=i9){UP1GdA=b*c;n(uwqirq2;H0 z4&8~3IUG?^aHRf7!BLB_f@2BaKO9#q`f$Q!Q^1+$-U4S=icdJV$XVe0Bol!PO{xMH zi^K#j`8iDBU6MS3uUkrhzr}TeK#AD|!4&lgLLm|pgneBEM2vq;5LJFXK}`701aaoG z6U0C7n;`Lc{RGL&3noY%o;X2z&t3tUHR}Xq=gb$7>zN=RU(+a{kW(a}7?UiZu1&gwit{j13Yji;&;G_Q(H&^pRKL3_)O2|7z&PSBllYl2?O z=?VHJdnOp9tes#OdsD!uXp4Zc?QQ{+plJf8vU3H@j4A}o{?-dvNKctyaW_%G@^{$; ztG&(w*0&=j*er{mV7uFDf?b>A1pC=C6CBc%CpflP3OKp3PH;|<7I0C0KEc)buYeot z$qDYt_XXVFJrnR`J}BUM?u3BXsAT)oY_CYx35RQZ_UC9{&{%<0X@wV0>ir| z1m&bo2sY1|5aQ!LAynLNLYR)`gs|@h6Cy<21R|~rO^E!eArQ6g%Y^8wTmmr*1O;NZ zyb*}2|11zc<(xo5{8fR(+E){j?6(Uf$DWyxB0p0g)pp&4G>)wk(q$)1NPjVXLdM^s z37ID7mf&2zPmZ0YQr*t>T|m%)XY3Ip?2Ne33ZiACe-)UPhetX zVrC%{va_&p<&229_zHOewU4kp;}=U|>LIvut4CVPFtCz$gSG`2-jw z7#L&}7-djNkhqU;2!mg62!o?<2!pnPfsp}&wt=CM0fVz^2!pe0a0tjIMn*fM`%b0-`~M35W(2C?FbCsDNlt!2+T|g$sxV z6)+$gRLFp6P(cHtL4^&71{F9U8dT_jXi&ieqCtfZn0^<<1EN8N5Qqj9L}2=OdJl*O z6-Xc&R49RHP{9PEL4^~D1{F{s8dOMuXiz}~qCtffhz1o{AR1I?foM>{1)@QP7l;NG zU|{dB4Jx=nv|;Q`0T2x;z(F*q5C_qqf*eGH3Ud$*D$v37-+HimP{9u3g9>*L4JzP4 zG^mgV(V&7JM1u-@5DhBuK{Tk)2hpH{A4G!+e-I6-06;XT5&+SliU34|DgzJ=st`al zs8RsYpo#%Zzk3FD52%6w@j;aYhz3;@AR1IzfM`&K0ir>b28ae#93UE0d4On81p=Z$ zl?aFiRU{x9RGENiP=x}bL6r)K230Iz`nv%*K0p-=h!3h{Ks2bL0nwn!21J7@91snv zbU-wy;sMd1$_GS)Dj*OIs)Rr^s3HQWe1``6&{ENReB&ARPljmP~``rK@}i~233L} jdbA>>up;Dgb`8-r1l5*0zQ%f{dImbah6W&7-`7#MS)%2^l~ z_yia@7#L&}7oX%h@$V*U;HDI7G+SSkF|?K*!h607UB>a{&Mf CkPz4a literal 1742 zcmWHE%1kq2zyPca3=AL)lE{Iw1sfO`7_KH=y!5(4V1&J)zXnoQ7msyadQs@MdrqwEv3xBQr(v*hIj z-6^*w=(U`lpkK0Qfnvb>J7R*(viJ$MyR9bJwK-0(pDi=NAx(LLV~eGLlN;*<=M-rH7uDwz zT%G?4xUrs`;I4dM!2R7b0Z-x(CylX;GPU?hU^PCAGKJF7j#r-CP>1a*}`))8HLexzl;=0g;$gdg#QQN*uh`!1t z5VJr~Aa=_efw=n50`XJM2_(c{6-caoH6h7Z^*(;(aBdr56?k20j4>4h9Ap1x6kS+s8MAA>1{D!5NH$LqN(H85tND z7#T@PfdBvh|6gaec?yUIB}9-hpu`BGK?xE>gAyf(1|>`o4N9CK8k9gmG$@gRXi!20 z(V)Z%qCp83M1vA7hz2EGF#XkJ0*D4BU=R&T#2^}!kU=ykF@tDOf(Fr`L=B=r2^&O% z5;uqjC2$Z8O5`9Kl+ZymD6xZRP=W{1phOR%K?xsB|E(7Q(Vz?frtc<#`Jjvd;)5~+ zhz4Z{5Dm%{AR3f0Kr|?GfM`$#0nwmL0-`|~1w?}~3y20~7!VE0G$0z3aX>UE^MGhj z1_IOXo`LNLWh4+El$k&@C_{m0P^JRWpo|5gL759ggEAP124yl34a#UB8kE^UG$_M? zXi%mD(V&b6qCuGtM1wLQnEq}6jt@{q1o1(c5k!MBB!~uON)Qdom>?RIIYBfigMw&K zCI!);j0&PbnH5BXGAxJ&Wm*so%D5mJlzBlkCyv8~~T7m%yFfuSOfG|jCf;2CP0$~RR1_sv6FBn;v92l9I&>#yV3nMd#AdHzA mnI{)A%1ATv`1pn}Xd4(aXd9R^Xd9R?aM@@ZnAqu>Z~*}PBnuV* delta 566 zcmcb{+RHgXx}K8(0vs6_7(i@+RT8cxTbFPLh^o&#ASQ9nK%C>OgZMAT4HB;y4oKcM zHIO>fdO&*5qz5ufr=KAI1dZKNKk=x{$!mEroJ z#{K()I;(nt`d5hp%`0ybw2r(k(B5*VKxfI>0^KR~`wH}0))(lPEGRHYnOI;LyXS*Z z(ew|-w(~xi1XX@8m2LQ7W)%Iw>~GQs3+ajii@Po#EPqE8SnXB&V13)Bz-F0qf$eU& z0=qWV0{htv1rBNK1&%E;ADmoY7C0yW`{1H_y1>=>!3Q_iwFU0Vhd#K!JNdzrdC3RQ zbE`jiJ#PEp9kH(WgU^}81-^axA3}U&6T-fW6x9F!|DTbW2?AMIp^%N8jhzKV5XLO* zEG(1fGsze;@GvmA1u$|jFjzP+@-Q%H88EPb*bF>Az99_S2F4892Br+!1}5M*U<82) j(!8K(011GjWMec7lP8ErHCNe?;VLd0Z37cKT@x+8r POe&M5n58D~;E)3VM>Yw~ literal 2262 zcmWHE%1kq2zyMqf3=AL)lIVi6r5YF*7-lypHtei<`C#X<^%qWlN`7!kU`4>0=iUNm zSNVK6w@Bi_`N^3D_l4&r+~3X>!1*RFfm`BB0{7W<3_N@1Gw?16ZQ$#PZQyS)ZxG1( zBOsVk{Xr;b)dyj>rUVh=Ljj`7uP2BJ-s!~~mV@e^!!TTQTQbDUs5 zTV{eon(_q47E1vqH`WQxDbfNis?R65I{y`LV?8;+UHQI%`@3fXp3DaYJkOmF@Or#h zz)0iQGbC;0aD2>7j8IKe+JPavSDc|u@#*My*))Cs}nITJ#B+$V&J`%MVb(VP(W z-C#n5sGC5{rccQDTQni_MCF96yCD;@S42<9IaVl;+hIE) zZ&|QFeun&nf;Llu!ay5=qBL=VVnaEB64##srGg9sW%{BM%04_2sNnlPq2j_3fy#F` zCsb`%CQyBD_k^06hbGjnn>(Sda><1HzWND_%uLKotSqc7%uLK|>|h8IVdmhZH)LQC zvjHVxF&hRJ1_mtyMh*rB83hJj1_nL>20;*;Q501ip~lBIgu&4_gu&G{7(|3HIJ<&y za0tji1_lO3Mn*;`lYxEYtGY}2RYakkw-#|1d&w=UfTmc|gf$|=R2IW66eRds)0_Q^z1C$p*G$=oUXi%O6 z(V%<@qCt5RM1%4thz8|R5Dm(wAR3fcK{P18f@n~l1=FARO#soLybGd1`4>ck@-T=7 z{P#FWFLFEjH29-4+8dTnZXi%90qCw>jhz6BCAR1Kufa!P7!1ja6ArK!_ z7J+C`c?6(hz6CFAR1I&f@n~g38F#eCWr==ogf-ieu8LF84997=hz6ChAR1K8f@n}#3!+DAdCTSM8lr0iDw}nDjrC0R P4D^k4d<_l2EE6sOM4lyC diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Belfast b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Belfast index ac02a81440f47a67b9f01d3fbcdb085266d20894..323cd3818ac6f77b4394982ea5a342b9ed262777 100644 GIT binary patch delta 128 zcmX>gv!7>zxC{dtU}Rum0AY~u1aUzS1;g_h7#LVLhqL}+nf#GQXR-hb+hkc@YdHHZ tubj4zZwP}^a0r7th;|7MVc>H24KZ*E4$<*7)-%;J&^OfaH8cRRxB$U<7SI3y delta 2113 zcmdnbb3kT-cs)A<0|N*%FfcHDg0cl07#J94tF2uy`x>jlobv_?<}NwBVBVa$3+7Lk zTCkvXm%_rbKMNM6&QVxgePY29za0yf+W%HqrkbFzT>Y5B3N0Ol6|a9RSjBL8!K$mG z3aej!P*`(3M`7*BOA70j`zfqnP`O}3yMe;SNf#DuDya8au(@c{f-M1h3$}VjDQq(k zSg_rwY{3rxPYZSmMJ(9){>p+~FBuee-}tDo=XSWl-W`_}_HF#PVE>G*3I}FOD;%tt zu5hU8ufpMoN`)hVOBNiph*mgebx`4W#I*&-Z*eX-C8jpv)bz*+r!UG)I8$yt;p|3+ z3Fi_b1kO)*G~q&C+=PquMPdRMe;Wy0%KWErIazbT70(9>SLGBJTy^?8;p+Vd0@wW3 zC|vu;yx@jjpTdowQx$IU6)4<#{YK&TQ}G3NPM=e_d*tVWds|*DxW7(J;lY$M3mz7E zEO?Y%qVPCKYr&I{2@9SY@ho^|yH?@3w5Gxfk&p#1ese3l{9CB->egF@*LQ;z>fh`- zukd#BuLbXBZB%&Qn7-h{{91*NiJl8S)yFG*_DWOu67Q(+RgrhWH+yA;?+ou3{E%l= z`0?Q4f}j7MEBrdJdBN`&%nSZhuU_!?`0fJcf@2CSnh^@D0V@>PIIR@e4Z0NAU&<(O z3gjqop7^K0^}$bpdy~`xo(l#Fyc7Q{;M*WnufSh;Z-Kx}y#<1S2Nnob3M>#dT(m$W z;?n|A<<}F$ERIbOXFfYYLSn@PiO1_FNdD-WAa!`+1nGy%1!UH&6OcXFDInJ~K|p?C zwtzxTk$_^OuYi(Ih=6jUzJQ93nSiR7_XIT_2?2F2-3jVnO(tk^@lVjaDmFpu<;Mxy zTYgN?Iaz;sg6@=C6ZBSYouFT`XM#cJ^a+NsHwBD}wg?#8?iMf!nkHZ>J6FKWs6xQ( zZ@qwp^ppt}cM}CHf0s?L+UqP}eLG@;&9e9jw!5t+*tI!Mu%9h6!68j~f@6!NfRh{R z1m_fK0Ts{GXYQLg94uCP6&9_KVB^0y>69&&zb!beEWI? z{MIa-;GdT#5YW>+AuzmaLQqcXgkbZW2_Zi26GFxPCWPr|P6+#MFd;(JO(5dB(1ggZ z8Uj((L7S;S zVW5pbQJT0wv7wwmiR({+Qb7iRGJVkrWgi|1RPcSDP;udiK;^re6RI{W6R1A7dqU03 zLlbJ(&7DwJxnx3pU;Tv1iL4rvAFy&w?qs#DXJceShpcS$gHWp`e`A%?W?;O=51o1&h z5=47FUJMoorA!bXlsZ8)D20M(P$~t{{(1FzV1=OM3K9S%Sr83MwjdgmbU`#I`GROr z5(d$rWDKUi8-P6kO3olYC`p58P_hQmprj3=LCG6LgOWIi1|@S49amrf8SDU1dIt%B z(maR;rF#$!O8X!hl>R|9C=Y;WP(A?Bpu7O0LHPkpznBho5GY%K_@Jx-qCwdMM1!&j zhz4a75M2+-DC_jPe50Ahe z0_7_ZAC$L1G$?<8Xiy#l(V%?Bz`!8O0LpA20Z@hm(V$ERq6cxtb0s0;ak=}37&rxo U==d7znd%wn8|wHP8h}__01kb6FaQ7m diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Belgrade b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Belgrade index 27de456f16ab549627b284a39e2265cbdb4ad8e9..a1bf9281ed1bc2c9b82ee64efdca60b4af762ede 100644 GIT binary patch delta 156 zcmZqRzsEd5T!sM+FfuSOfG|jSg18`vf?*W~1_tKMZuG literal 1920 zcmWHE%1kq2zyRzF3=AL)k|>9=c^eoQ7)~*nJ~;E-Tj1s!~~mV@e^!!TTQTQbDUs5TV{eon(_q47E1vqH`WQxDbfNis?R65I{y`L zV?8;+UHQI%`@3fXp3DaYJkOmF@Or#hz)0iQGbC;0aD2>7j8IKe+JPavSDc|u@# z*My*))Cs}nITJ#B+$V&J`%MVb(VP(W-C#n5sGC5{rccQD zTQni_MCF96yCD;@S42<9IaVl;+hIE)Z&|QFeun&nf;Llu!ay5=qBL=VVnaEB64##s zrGg9sW%{BM%04_2sNnlPq2j_3fy#F`Csb`%CQyBD_k^06hbGjnn>(Sda><1HzWND_ zEKJN`$jU}f$iN_M0ZL8~aeKr|@7fM`&j0nwm*1EN8B2SkJN4~PckArKA9M<5!Mmq0WqKY?ga zo&wRJdck@-T=7<}-7RSzJ rVBqNh87ZT{$il$DC&0kTz@TNo$m`=9!r<&03?e|-H-usGJq{TF_OlJv literal 2298 zcmWHE%1kq2zyO>K3=AL)lIVxBg&G(b7-sW`C(OQj>%*Lz>n6-yvUS3|of9U^Z<#*f z1ZUxdGta#R&aM=naBh*a!1+lg0vDQ81uhne30&MZjp0(nzJ^N+{RJ*3OHa7stvunX zCY!zT~W+%O>>LDbsZ^z8=TVwZZaL5aPwt_fUvKNfQa$038KocCx{8(nIO)5 zc7pileG?=eub&`!dBFs!!xJY+@7XILvu2%u?40=may=6SSkPw%sjY5;RS~RCca_nNfv++248r3+X8nEbb->SpF`X zV71p-!1{K?1e;~?6Kr=|O|WZooM1m&W`aYS@&v~gO93Z0)(Orj(gH53&nLJ#{}pg! zJvqT$`M!YryJrHP%m)QL&z%tPdc0V`d)+DlpELU>`1bV(_^nwu!9OogAfTstLST5; zgrJ<%3Bl$$6GD94CxnXoO$gJ`oDlZiU_ykbn?S^Mp$U;+H3XuzeVGt_l}jLIfuKO_ zmNx=%^`8aer<@Z=h`%b3So>;1lKpmp$Rw$6$VLKsjS+GEUhWvzrHdBGZKpTOgG;x7qLpgyG*PjBV zf(!y>`l1ucK0Fer;QKzI;=&Pu%6B&>RBc!$P|T>0YNk<6M|?^Mg-H_rZIqMP=*B43;hK^G$><& zXi(+^(Vz?prqiEK0Mjdq!TLa%6~qT+SP%`$v>+Okal!P<3IR}HfHE+M24!Lp4a&$M z8kCtqG$=!Z>CgKnfM`(02GO9*4WdCA97KaMIfw>jbPx^7>>wJH;XyPg(}QSG#s|@$ z%nzbL1ptT!6#^g{R1kn@P+L z1&9U}7$6!{Xn<%?!2zN{g$IZR6(ArQREU6RP(cEsL4^s31{EkE8dRu&>A&^ha03-C zAU>#o0nwmB21J7j8W0UCY(O-qzyZ;qLI*^H3LX#*DttgRr~m@dph5^lg9;)L4JwR4 zG^juV(V#*JM1u+@5DhAv!1TLkVE2FuDG(o2P=RPrVFjW=1r~?~6^5k!LuM-UAv zAVD;!kOb2&ri0xBDl9>KP=N`eL4_uW1{Itj8dP|KXixzPqCtfyhz1p;AR1Jdf@n~I z3Zg-UDu@OZtRNaxxPoX<0Slr*g)Er<@CY0qpu!f!2Nk#=8dT_lXi&imqCtf(hz1qF qAR1H%gJ@7e45CL=Va(<18lr0mDzbHajrC0R40L=A4M4QMF&6-ysBuI9 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Bratislava b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Bratislava index ce8f433ece44f0b96b18d3b5780730e7f9cad9f5..fb7c145ac4c8ab8f39731e75db8c384b7dc4ee11 100644 GIT binary patch delta 192 zcmew>c$syAxC{dtU}Rum0AY~u1aUzS1;e%s3=FKB3z*+9)-y6Qp+OcjKDs;-pMin5 z17s#|2LlTOgNybj8V|XH-sU;H-y32H5f#MFu41MFmO4$hUglCgmiq3 L^-L#!;NS%SPd^fD literal 2301 zcmWHE%1kq2zyKT!3=AL)lIVxB1sfO`7-sW`C(OQj>%*Lz>n6-yvUS3|of9U^Z<#*f z1ZUxdGta#R&aM=naBh*a!1+lg0vDQ81uhne30z8I7r5LYGvSKoC4noGwIt)@l%wG#|uZweR{Z4ofG-7R1eG)=%%cCLV#QH6ln-+BQH=_wN|?j{OY{w|wf zwbxm|`gX(wn`QA6Ywuc zIl*1|zJU9?X9Awg2L(LOoe=PPyjZ|{-6{c}Gy5m__Voz(tywt1KQB)ppr?64V0hPr zpq$hR!R9#=LVVmOgo^u32-DG=5cb_*LWHQBK*V*S36Wnl1fsTmnGk)IOCV-}pg`=F zHv)0>p9SKloD)chzbcSe`)Wdx{dR%m*fSGSJ0Wjbut0u>{DguwQ-Q)j8-b!Uae-n(Ie`+_p8}z+cFA_EDQ{M0t}oC49IK-21Z_F5g*?W24~k`5D~)Q?i&Kq z%gD&U$OvLEFfcOW$VZ$E3?QSyswP0$qW}N@|1ak`=?93;IsXbwgYp%K56W908kE04 zG$@aOXiz=_(V)BrqCxo$M1%4ihz8|55Dm(EAR3haKr|>1f@n}a1ks?p2%%ODz*pTYF!eV}k*0Oe~CAC$L2G$?hz8|( z5Dm)rAR3hSK{P1;gJ@700HQ(V0Eh;a1t1z!9)M_2nEHgFrN> z90JjxvIsMjhz6BaAR1I&foM>f1)@Ra z7KjFwT_74%et~FE83v+3JP-{k_dqnL>;uuD@()CV%0LheDhEL{s4N80pz;tzgUUn@4JsEw zG^lI@(V+4XM1#smF#TdW*gc@K62u3UmmnHcW`bx?xe1~{WhaORm7gFQREC0RP&o>s zL1ih329>8E8dRo&Xi&KdqCsUVhz6CfAR1K0g6R*B!0`bpYe9Tac?+UJWiE&YmAfDs zRQ7^sQ27g@L1i$A29?7g8dMfDGBYu=up&b?D4(5UARw$T=Ivl$0T;R);364P0K?e~ w42*)vvY;Y4086n9DwJX6G6N$cm$Pe#t|6%G*6}sgGu1QD@ijC6(fY<*0D*jEW&i*H diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Brussels b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Brussels index 40d7124e5346af056c75e2f7012a51d94e8154b7..31973271d2f87f7e9df4e8b0a1481f09a9e5407d 100644 GIT binary patch delta 200 zcmew=cAjH`xC{dtU}Rum0AY~u1aUzS1;c3!3=C|WqgYIs(-@hUS-_Bqm3RozK>|7X iK9`aVqo|K>2!oSv2t&AQ2!k^i2ZK1lAq!@A|lAJ#AMFWAt|`e9>d_J>UcJ_|M%ZCbD;KySfT z&nSg$1_BGV8Okk;2{`mlgKS?_98d##V&` zv!xXdR!mnol+mGZIHFSFh`s)TqZZK$$E*%29FMrR;P@@h1t+{D70x{O7C5_7e8Ra! z&I0ErnFw6Si<@wofU6MS3uUkrhzr}TeK#AD|!4&lgLLm|p zgneBEM2vq;5LJFXK}`701aaoG6U0C7n;`Lc{RGL&3noY%o;X2z&t3tUHR}Xq=gb$7 z>zN=RU(+a{kW(a}7?UiZu1&gwit{j13Yji;&;G_Q(H z&^pRKL3_)O2|7z&PSBllYl2?O=?VHJdnOp9tes#OdsD!uXp4Zc?QQ{+plJf8vU3H@ zj4A}o{?-dvNKctyaW_%G@^{$;tG&(w*0&=j*er{mV7uFDf?b>A1pC=C6CBc%CpflP z3OKp3PH;|<7I0C0KEc)buYeot$qDYt_XXVFJrnR`J}BUM?u3BXsAT)oY_CY zx35RQZ_UC9{&{%<0X@wV0>ir|1m&bo2sY1|5aQ!LAynLNLYR)`gs|@h6Cy<21R|~r zO^E!eArQ6g%Y^8wTmmr*1O;NZyb*}2|11zc<(xo5{8fR(+E){j?6(Uf$DWyxB0p0g z)pp&4G>)wk(q$)1NPjVXLdM^s37ID7mf&2zPmZ0YQr*t>T|m% z)XY3Ip?2Ne33ZiACe-)UPhezXWnyMwX5nCCCmMp(Log@TKtTou7Aa6hWnf@nVPN1B zVBlb2kWpadL1!}xf>p7=NQ4?6-w=jy*AND0Fb)QBf)-CVMazq93=)1 z0|NsHgH-K=vZen2|NlR1+x=%CI`_p11`rJ@K|nO96amv$Z+!sKpwa|HgGv+-4JuVY zG^k_&)8~E|fM`$&1EN8t42TAmG$0yO+JIHm)xfM`%@2BJYF8i)p!Y9Ja^vVmw&=?0=fB^-zbm2w~& zRMLTHP-zFEK_woD29`hsXs2@Ik^r7(yFmBb(#R2qY5P>BqpL8UT?29?Yp8dN%iXiy0aroWni-2p18 zL3~hY4WdCMHi!n5+8`QKa)W44=?$VmB{+x%mEs^8RFZ>eP-zaLK_xnf29@d{8dS1_ zXi(`6qCq7*nEqQY0HQ%9J(#|m2Vs%d$q%AIr9X%U)c_zGR11J;P)z`$ zLA3#h2Gs~48dNKQXi&`nqCvF-hz8XVAR1IlfM`%n0jA$Q1KSU(F+hA!tpTDzH3x_W z)gB-kRD*zMP%Q$YK{W}82Gu4Y8dRfzXi%*JqCqtahz8XzAR1J|fM`%H1EN7S4VeCJ z0FDn(jRWF?Y8?;_s(C;(sP+NTpc)87gK8lV4XTMiG^jQL(V!X$M1yK25DluCKs2a! z0@0uv3PgiyDG&{+sX#QSwgSl_UdtEeWbKxtv`? abPb(dgF|$DjrC0R40L=A4M4QMF&6+CA-G)t diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Bucharest b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Bucharest index 4303b903e5e007484c0d8e1eea43a35e9b53f38b..efa689ba9e0a782c9367f660a59060d9b1965345 100644 GIT binary patch delta 136 zcmeAWoXR>uT!sM+FfuSOfG|jSg18`vf?;z81_qYRzRY_Vof(;#$bk$D5)~lRBq|tK NCfjnzPR``&00vLQjQWpaRi$)p5>l+pmh*mVz#imERd+wK-H37RHgDmz!e z%&0=Z>~Fn*h4hpO7IzZ`EPt0xu-fY^V0}Acg3Yq{3AVefCfKz(POzUXGr=KEd4gk$ zrGS$g>jdW%X#p42=M!9={|dOVo}A#Wd|$x*-7^7C=7R#B=S~QCJzgx}y>69&&zb!b zeEWI?{MIa-;GdT#5YW>+AuzmaLQqcXgkbZW2_Zi26GFxPCWPr|P6+#MFd;(JO(5dB z(1ggZ8Uj(u$_>%ELb2vLw-U* zo2fuypp8ILnz%r*p`1X8>ra7FK?Z>`ebEVJA07!*@O__9ap8zS<-3~`sx~YWs6MxQ zLe0!W6KdDZolsY~WI}yk{RBo76t|_ z14a%81{nngUR-P+-w*~T-w*~@*I*D4!oa}5$Oyq8V;C7p$t3^(|NozJ{s9Mw24xly z4azWJ`u&^)5Dm&WAR3f;Kr|==foM=B0@0w11foHi2}FZ36o>|8Di96ISRfjdxj-~1 zgMsLy7D^95G$^BiXi#PY`2dvRKr|@RfoM?11JR(&2ckh45JZDAA&3TLL@@n%11Qfk zfHEYA56YAv8k8|XwDg|!APSs8K@3nP1<|043Zg-o6-0wFEQkhWS`ZD&xF8yoc|kNN z1A}N#CI-=g^pACdxC{dtU}Rum0AY~u1aVmq1;Z{33=GT+3=F*g|NsA=Ek1G1^ezSF?;${6FOM{Qg%6D8CcmBZ_$Ry z8Z0LDj~1=?0Frnd_$dKIKWSPH*7wx#A6VhDl7C?SbHN8-{)>#ezNoShYSpYPeAs| wC@``xFz^X5aQgU$FgUvggNP6YE@#&eT|*F8$JbcTRL?-i*U$h&>lyk?aZg5T$xXE;I!p)Zz0=M4kPq_UoTHw*56(1f4eoA=Ke5c^4vFd|o zB@aJ57u=TcBIFXoi;ssU2>Y5bh#3ExAgcU&f|&4~3F6FWCy0OEH$md@`U#Sk7fg^k zJaK~bp1lGxYt{+K&Y3SD*E2ytzNS$?A*V<{F(z3+$tOfW*~V2sMaN7)RYqMvjYmR2 zoz;1Q`d5<)8c$UxXkHbYpmmgeg7%gl6LglmoS-}9)&#wl(-ZVd_DnEHSv$cn_NIVQ z(G~$?+uZ^tLDK|GW#4|5+e@$~l3A_^Sem zwXY^5*>4v}jy*FWMSiA0s_nW7X&hT8q{~j2kp5!&gp9vM6EaU!PRP0&G9i0K^n{#a zg#x)9wiEJ}1qv2BMSoqp8x|V0|PP}A>!j3!r<&03?f26Iv5!l89_7yBO@t! z?EnA&|Fhn0mI2YAyauMP-ueKdL3s{DgYq4S2IV~v4a$EY8k7e?G$chz6A*AR1JTfa$L$V0VDZ6A&L% zrhsTrxdNg=WebP~l`kL~RK|d4P&oslL1hhy29-A;8dTrhz6BiAR1JDfoM<}2BJab7>EXyWgr? z29>hz6ClAR1KOf@n~g3!*{g zE{Fz|y&xJ?{(@*w84RL9>8qL2rArle2w)?^$c`;4GloFzA+a7 D39Y@2 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Busingen b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Busingen index ad6cf59281a1046d9dcd045fda521585e3e33e06..388df2969f2dc56738183bd4f0d5755c4533a797 100644 GIT binary patch delta 118 zcmey$_mO#mxC{dtU}Rum0AY~u1aUzS1;eTg3=Axr?=a~w8Zt675rzy59AK?%zZh61 M8?ehxj%1es03Q|z>Hq)$ literal 1909 zcmWHE%1kq2zyPca3=AL)k|>9=c^eoQ7*2_2F`Rl-$Z-0*55t*5!3?6xuP2BJ-s!~~mV@e^!!TTQTQbDUs5TV{eon(_q47E1vqH`WQxDbfNis?R65I{y`L zV?8;+UHQI%`@3fXp3DaYJkOmF@Or#hz)0iQGbC;0aD2>7j8IKe+JPavSDc|u@# z*My*))Cs}nITJ#B+$V&J`%MVb(VP(W-C#n5sGC5{rccQD zTQni_MCF96yCD;@S42<9IaVl;+hIE)Z&|QFeun&nf;Llu!ay5=qBL=VVnaEB64##s zrGg9sW%{BM%04_2sNnlPq2j_3fy#F`Csb`%CQyBD_k^06hbGjnn>(Sda><1HzWNDF zj7*G7%q;YV3=ABgB*q}4z{tYDz$d`K$$-T6@eN^cb`1s*As}Upj0_A6jEp$aEE@v@ z0|Q8kF}yG${XpXiy#m(V%ck@-T=7tU}Rum0AU7($&Jjiyf7IX1_lPs&8wN8FxoIOu`r`UHdZ!PHV$@7 qh^BJ#TP6iDJ^=<%1_l`gMo9(+3kOCy1_mty2Bpcq%xaUZIAs9VpbaAc literal 2390 zcmWHE%1kq2zzPJQqP+|Z3?Q~z0|NuYyzKcr+c#X|*lG7UVdwif3A^t1ChR_6m$2u= z$_IOQ%zChIMfZdKGin|j=*WF=up;ikp$z{Aha(&w9Pu!GaMVKS!7&Zt2gfB?9-P=S zIpI`!ZNQo5-U4S=icdJV$XVe0Bol!PeiITz)t6roleps`&T%_H{1^WLiC26VByT%A zNS&E{L3+=E4>D^eevqBh^g*tt_=9{+$_Is<&<~0+ZXc9<%s(jGXnau7k^G=4!}URp z`}YSmXP*b^tfmd>U)35ko{BeUUU`$Cb>w`2_Lg%AI!iVN=uX*?pw}`vK)+;Cf`|S_qsU@K4&&I`1aK?_^p}T;GdVk5YSWF5Ex$55R?<%5NsaT5aMIm z5GwA_5T+yD5cXZEAwtxGA>ukqL*!Q}hNx}N8ltcKVTf74%n-Zf9z$IHQ-=5{2N)9K zk256J-f2j(U&)XhyRRWdzMCP{c0ofL$MS}B*`|i{7o80me^VMVPh>Y_-F0ioUg6u2 zb1a!5w?n@nZ<#AYeuiK}L7O^5VW1vEQ5q*hv7rD%iR){IQh`qlW%}$5Wgo6ERPeoQ zsJO6=q4M47hN=xS7^=^$ZK#>KrJ;6Re?wj6w1)b=!UjerR%RAd$i~Ue!Op?W1%W)g z2*}35%)-V>JIKHw%>hc(QePNY7#Jif7&sUhvKT+^BuoTmf{$+qgR^f4gOhIvgR5&WhzMbDb_Lhh$MFWTi6%Qa9R78MiP%#0bK}7|K1{D_|8dPL}Xi%{Mrk#BrfM`(h z0j9r#OF#xtF#_U)iV_eFDo#K&s7L|Ppkf6?gNhaq4JuwhG^mIH(V$`mM1zVN5DhAB zKs2bx0nwmh2SkI49uN&Ge!%qKLJ$QmhCmEZQ3Rqv#Sw@G6-gi(R4jpLP|*aULB$h@ z1{F~t8dOYyXi!lFqCv$Khz1o|AR1I`foM?C1)@R47l;NGVIUe*jDhKQH$W7)I0G?2 zMH+|(6>A_GRJ4I;Q1J$$K}8&h1{HH48dTJQXi#wnqCrI-hz1pVAR1KkfoM?i2ckhm zAczJPgJAl*5~xOE02PNIKB!0p(V$`xM1zV(5Dh9GK{Tj{1ks>k5=4WFN)QbyEDn3Cps0anopkfq6gNjlR4JuB-^ovfgdqBl1hz}}SK{Tj%1<{}) z7DR)JSr82>YC$xpxCPOmA{Ru1id_&5DtbXQsQ3lZpduJVgNk7g4JwL3G^jWR(;u#Y zC~&b1Vt|Tf5DhAxK{Tj{2GO8m8bpJNY7h-7u0b@Y$Oh4)#kMQB$R<#1bGf>P=o*2F Vc^zM4JySgc9bZEO5Up>_1prAKh}{4H diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Copenhagen b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Copenhagen index 776be6e4a6d5a054152135a1ad149576052f49a1..45984a7599d238b389829ef9d63e5c5c0609e785 100644 GIT binary patch delta 124 zcmca9@SbIYxC{dtU}Rum0AY~u1aUzS1;fS+3=AxrjhN>!8Z$C8kqRfjVV9UJ!y!1? HmO};rG5!f5 literal 2137 zcmWHE%1kq2zyRzF3=AL)l4ympc^eoQ7-q}$B+S0L@4^Y^@PaeXy#>y$6rXTzk+Z=0 zNhSgpnp6cY7KsU5QW2PNxw2K@iuBqESL4%S>=cQ=Z`1VkzL{#yY_{MOwf` z_4x!>=f47OtS2Y9E8iDzfA>tlllh>4=eZLCUXK?Gc&}R};B#jG1mC_M0lzg1C-~>( z2?X>sPY4X}nh=zeIw9CRXF`aN`-D(&zX@SFniIml8%&50brXoVE;J$XtA;?-wl5Q+ zuW|{*ED#ik-SS2tuKu$?{FHM73Gr725^G;gNV4B9kQ{qvLW=xMfmGXd6Vf=gPDq!X zFd_ZL^a&Y%izZ~AsGN{>H)KNgis%VB#|i~uxApj-)}K{*pdgK{T`2IWu?4a%h;8kAE(G$^-%>8~bWcYty& zh!4uSAR3f=K{O}_gJ@7L2GO9L45C4~8AO9}G>8V}Y7h;|*&rH}yFoN4hl6NPE(g(| zoDQNvxgAXZtp|r2DA$Adpqvk)LAf79gGvAp4JrjdG^iv1(V)@*M1x8M5Dh97Ks2ai z0MVe*0YrmJ2oMb_B|tQ&qyW*N(gH+-N(>MUDmB3LyJukcfJzS#A5?;XXizBvqCq7I zhz6A=AR1JnfM`&u0-`}B3y21lE+86I!hmQ{DFdQGB@KuMl{O$6RN{bWP^kl^zZ-z# z162Be_@EL9M1x8p5DhAcKs2Z{0@0un2}FZRB@hiNnLsqCbOOWE2=V zz{MmljD(0lNIn4uUT|TFR$wx~OH2kvMlNU95M4u1d8*@UtY@lcpyO+30HXDcxd5fW BBVPaj diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Dublin b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Dublin index 1d994902db21814a626e42639d7a96b18ee73756..4a45ea8f73f8e2a3f0b7a9ee4e387745fa859c3d 100644 GIT binary patch delta 80 zcmZ1?eS>>~xC{dtU}Rum0AY~u1aUzS1;Y~=7#KJ|4obv_?<}NwBVBVa$3+7Lk zTCkvXm%_rbKMNM6&QVxgePY29za0yf+W%HqrkbFzT>Y5B3N0Ol6|a9RSjBL8!K$mG z3aej!P*`(3M`7*BOA70j`zfqnP`O}3yMe;SNf#DuDya8au(@c{f-M1h3$}VjDQq(k zSg_rwY{3rxPYZSmMJ(9){>p+~FBuee-}tDo=XSWl-W`_}_HF#PVE>G*3I}FOD;%tt zu5hU8ufpMoN`)hVOBNiph*mgebx`4W#I*&-Z*eZT;`u<~s+{72Ykq4KuIp$h+|cV& zxbbtU!Y#f6g2nHqkNjM4Z_BF%_t%LjJeYE3!NVet1&^{z6dng@ zEqD?#VZl=)o(0cr*D5@h)>L>Q60+dMZ*GN`e+v~}-FmC=`fjkon_cG>-fsT2;N7f^ z3hx`!7krpstMD<=bHS(jc!keiX$oKB9TmPR@-FyhudMK$;r)Ui@~jF!9$Z{d|MTB- zge!m_zUkX5SXdAKrryY0-;KQ1;U1l7KlWAS|FM&)A6*lq4o{pQ{cw4`fXte80|}r2*@wY7Es735>RaP z6;SdC5l~Ll7f{hL6HxW?o}k7fA)v0MJ3;-c$plR<{t22_#U^OI{5U~-%Z~{W3%I{~Cg90@P{8xt2?4Liiv_&btrGA#vwwnbUyp#_nuQbm^YR1& zdYUH$hIdT}%1NCNY@RbA#K(O?sJP#RFdfYaVc!iVMAVDA2}E2Mnh^O_Lm+C~mkH5V zxddVs2nxh*c_R>4|5+e@$~l3A_^SemwXY^5*>4v}jy*FWMSiA0s_nW7X&hT8q{~j2 zkp5!&gp9vM6EaU!PRP0&G9i0K^n{#ag#x)9wiEJ}1q4$z>OnkEw1H?))PZPF^nqwl6oP0_G=k~B z^#ULo6rEuDZX%d(`MYcah!2Wc5Dki55Dki95DkiD5DkiH5DkiL5bcnrTo2X=igu6y zDC$8pDEdJ(C<%aQP%;3~prinzLCFD3zk3FD04Q02_@JZ#qCv?6M1ztDhz2DS5DiKy zAR3fhK(v2eeID2VP`UvLfYJ_#2BjYm4N5~G8kCMeG$<{BXi$0r)87ri9*7Wi1DgX% zS|D*y@&eJIBnF~E$qYn;k{XBxB{vWqS6}}btPzy%Kmwq&2ckjg4@85~AczK~Ll6y0 ziy#`59zirHO@e4px&+fNrh^>>N}nJ;D2;+>P&x(CptK62LFpAl*Mkx*hyhBtAR3f- zK{O}8TzY7h-d*I@d?Bd~`+=^MlcrEw4qO6MRNl-5Bs jD7`Z)fFe>_&k diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Gibraltar b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Gibraltar index 117aadb8364cd7901388098503f4538c7b445aeb..017bb2e34746c8a11c6955d49cc492c974412801 100644 GIT binary patch delta 136 zcmaDOeuQ&^xC{dtU}Rum0AY~u1aUzS1;fP*3=C|WTUh2WPd>n@t*}frL1DT2F@+UcItnXZ|5&h!;qro2S49<8 zzx<%E=6H_6+LMmR2}eF-wx z1x$jb37E>x6)-cZ5HR~&FJK`(WrD@sL;=g+WfQFSIty6ej+kJxEPjIRZmS7)ZH^P{ zXUj}*NK>BR*kUQ*TJZD0PkNbpBalZ*+I+_#0 zz8g%45OouXxGppy@~ehG)V41ZqOWoZ#4HdLh~4r=Ag=ziK>U<*0txX~1rlptO-Qoe zE|461WklZq z^9eArfM^B|1_l`gMji$RJ^=92BJY_8i)p!Yakj_wt;9+`39mv zWgM7(e+BFwP+14!gUUM)4Jz|MG^pGI(V(&qM1#sd5Dh8=K{Tiw1ks?f5JZE@Ll6xr z6G1enTm;devJpgs%11DLixX@wsGJ1xL1iU~29=i}8dPS2Xi&KcqCsURhz6CPAR1JL zf@n}V3Z{P>34mx&c?zOIWh#gUm8&2cRJMX?r@s@x^!*25^`LSV#0QnNAR1KOg6W@A z!SMnrcR_qm*$bjU$vK&N%%5xA6 zD$_wUs9Xoppt2oAgUWXh4JzY7G^m^h(V(&(M1#tE5DhBxK{Tk`2hpIiA54EW0lNcK z2Y~pXdH_U&>H-iAst-Uks7?UUpn3sBgX#tl4XPhNG^maM(V%()M1$%I5Dls?Ks2b% z0MVd&14M)B4lw<JTt}HxbMS)g>T4s6GMFpgILagX$F!4XRr}G^l<7(V#j8 zM1$%X5DltpKs2bn0nwm32SkJF9S{wwdq6a({sGaTItWa^dj_^2R2PBxp!x_zgX$y@ z4XT$wG^lO@(V+SXM1$%m5DluQKs2bX0@0xQ3PgkIED#NM$_< z-2faPpt=mi2i0dF8dRr&Xi&WdqCs^Vhz8YfAR1K1foM=Y2ckiB9f$_icOV*6=YeQY zy$7N}bsvZZ)qfxwR0o1+P(28uL3JURelZ>F9#EYK;)Ci%5DlsuK{Tj-1ks>65=4XQ zNe~UHD?v1P-+0syjh6sQv`epgI&pgX&Qb4XR7Q^oK{__yE#G z1<|0o6-0yTR}c-VV?i{io(0jMx)wx(>RS*!TIb@fbGe*dLv#(DU4uh(e2w)?^$c`; L4GloFzA+a7TLM}D diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Guernsey b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Guernsey index ac02a81440f47a67b9f01d3fbcdb085266d20894..323cd3818ac6f77b4394982ea5a342b9ed262777 100644 GIT binary patch delta 128 zcmX>gv!7>zxC{dtU}Rum0AY~u1aUzS1;g_h7#LVLhqL}+nf#GQXR-hb+hkc@YdHHZ tubj4zZwP}^a0r7th;|7MVc>H24KZ*E4$<*7)-%;J&^OfaH8cRRxB$U<7SI3y delta 2113 zcmdnbb3kT-cs)A<0|N*%FfcHDg0cl07#J94tF2uy`x>jlobv_?<}NwBVBVa$3+7Lk zTCkvXm%_rbKMNM6&QVxgePY29za0yf+W%HqrkbFzT>Y5B3N0Ol6|a9RSjBL8!K$mG z3aej!P*`(3M`7*BOA70j`zfqnP`O}3yMe;SNf#DuDya8au(@c{f-M1h3$}VjDQq(k zSg_rwY{3rxPYZSmMJ(9){>p+~FBuee-}tDo=XSWl-W`_}_HF#PVE>G*3I}FOD;%tt zu5hU8ufpMoN`)hVOBNiph*mgebx`4W#I*&-Z*eX-C8jpv)bz*+r!UG)I8$yt;p|3+ z3Fi_b1kO)*G~q&C+=PquMPdRMe;Wy0%KWErIazbT70(9>SLGBJTy^?8;p+Vd0@wW3 zC|vu;yx@jjpTdowQx$IU6)4<#{YK&TQ}G3NPM=e_d*tVWds|*DxW7(J;lY$M3mz7E zEO?Y%qVPCKYr&I{2@9SY@ho^|yH?@3w5Gxfk&p#1ese3l{9CB->egF@*LQ;z>fh`- zukd#BuLbXBZB%&Qn7-h{{91*NiJl8S)yFG*_DWOu67Q(+RgrhWH+yA;?+ou3{E%l= z`0?Q4f}j7MEBrdJdBN`&%nSZhuU_!?`0fJcf@2CSnh^@D0V@>PIIR@e4Z0NAU&<(O z3gjqop7^K0^}$bpdy~`xo(l#Fyc7Q{;M*WnufSh;Z-Kx}y#<1S2Nnob3M>#dT(m$W z;?n|A<<}F$ERIbOXFfYYLSn@PiO1_FNdD-WAa!`+1nGy%1!UH&6OcXFDInJ~K|p?C zwtzxTk$_^OuYi(Ih=6jUzJQ93nSiR7_XIT_2?2F2-3jVnO(tk^@lVjaDmFpu<;Mxy zTYgN?Iaz;sg6@=C6ZBSYouFT`XM#cJ^a+NsHwBD}wg?#8?iMf!nkHZ>J6FKWs6xQ( zZ@qwp^ppt}cM}CHf0s?L+UqP}eLG@;&9e9jw!5t+*tI!Mu%9h6!68j~f@6!NfRh{R z1m_fK0Ts{GXYQLg94uCP6&9_KVB^0y>69&&zb!beEWI? z{MIa-;GdT#5YW>+AuzmaLQqcXgkbZW2_Zi26GFxPCWPr|P6+#MFd;(JO(5dB(1ggZ z8Uj((L7S;S zVW5pbQJT0wv7wwmiR({+Qb7iRGJVkrWgi|1RPcSDP;udiK;^re6RI{W6R1A7dqU03 zLlbJ(&7DwJxnx3pU;Tv1iL4rvAFy&w?qs#DXJceShpcS$gHWp`e`A%?W?;O=51o1&h z5=47FUJMoorA!bXlsZ8)D20M(P$~t{{(1FzV1=OM3K9S%Sr83MwjdgmbU`#I`GROr z5(d$rWDKUi8-P6kO3olYC`p58P_hQmprj3=LCG6LgOWIi1|@S49amrf8SDU1dIt%B z(maR;rF#$!O8X!hl>R|9C=Y;WP(A?Bpu7O0LHPkpznBho5GY%K_@Jx-qCwdMM1!&j zhz4a75M2+-DC_jPe50Ahe z0_7_ZAC$L1G$?<8Xiy#l(V%?Bz`!8O0LpA20Z@hm(V$ERq6cxtb0s0;ak=}37&rxo U==d7znd%wn8|wHP8h}__01kb6FaQ7m diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Helsinki b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Helsinki index b4f8f9cbb57450549933f83ac90dd56a2ca75344..ff5e56530570974516d249927952c69da601b664 100644 GIT binary patch delta 122 zcmaFE_mFvlxC{dtU}Rum0AY~u1aUzS1;fe=3=AxrA2Z1?Dl;-O5rUI>*(C&hd_x#K Sd_x#qU4ubH2*YGQb~ylA+zV^~ literal 1900 zcmWHE%1kq2zyNFv3=AL)k|=|+1sfO`7?u?0OP@X$m~iI6(*#lFyA5K(=NiPB_cw@t z-q0ZNc>M&)%L^t*9iBKrde2?~nKkPKWarEmkn5QsAYaocppa7}pcs=ZpyU%GplstR zprT_Ypemy-pvEI1pw8+%LH(=A1dXSv6Ev@iP0%{ZK0$lSj|nLF3SV&KqU~xB5!18z51gpKy z0@k-9CfF>CpJ2P&YJy#x;{^NJG7}uqlqWd0SPD3~u}*MKkrr@KeLlg}`LBQ*>&Xf3 z%J&7_-#ruXWIib1dG3UO*W<+k-s@Hg_?+24!MCqRz;DgM3I2I`0s%eE69U7#CIscA zP6#&7nGoXRJ|R@xZ$g-k=7g~C1`{Gg-2@`83r&dpsv!`y?aPGdt6Tyx3j_sXx4aRE ztN$zzKjoZ2Li|;M#M)OAlI*t&B*&hakRm@*Ak}u=gfxz=6VhcTOh|t*eL}|Hq6wKN zDko&!4VjR=B6>p3u|k2|4%-QN%Yp^+Gvp@}w3!MN2HFS|rHKm^8_Efkxc(F<6=V=7 z(-)mk_TiC01>g4x6&H>ORKB}8p=!f2f$DR+C)CV5G@*9g+zEA+OD5F!)lXn#W&%SN zR(e7P2Juu-@)A#FU}0d;GGOFjV31K@;6-Np_=Yfe_=YgJx(0)Y5RiHXMn(|D$Vf`k z{r~^}|KMF}vq3Z{34>@*G6vD0qzp0_Idr>4Ruc@(0nNEC8ZG*#Ja?vI2+(Wd{%q$`T+Nlr2Cs zC~JV}uO<^fG$@OJXizo*(V(mXqCwdOM1!&nhz4aF5Dm&YAR3f?Kr|=|foM=R0@0wX z1foIN2}Fak6o>|8D-aFJT44Hby#R;?Wic>)HxbMSWi=2Vl-)oyD9eFpP__fnpsWX? zLD>&PgR&rq24zDK4a$lj8k8MDG$>1gXi&BU(V(meqCwdcM1!&@n11&RY(FTgg7~29 z3Zg+-7DR)xEr56bQ!8kFThG$`AHXi(M%(V*-PqCrIfhz1n{AR1H@fM`&00HQ%f z0*D3`3m_U)G=OMO@c^PhMFfZj6%!yDR8)ZJ7t_J+0Tme_KB(9L(V(IOM1zVC5Dh9q zKs2Zr0nwnM1Vn?16A%q5Qb07QSOL+Xq6I{QiWd+KDq=u1sF(rKprQs$e|Q9r4^WW< z;)9AE5DhANKs2cM0nwl$2tgv!7>zxC{dtU}Rum0AY~u1aUzS1;g_h7#LVLhqL}+nf#GQXR-hb+hkc@YdHHZ tubj4zZwP}^a0r7th;|7MVc>H24KZ*E4$<*7)-%;J&^OfaH8cRRxB$U<7SI3y delta 2113 zcmdnbb3kT-cs)A<0|N*%FfcHDg0cl07#J94tF2uy`x>jlobv_?<}NwBVBVa$3+7Lk zTCkvXm%_rbKMNM6&QVxgePY29za0yf+W%HqrkbFzT>Y5B3N0Ol6|a9RSjBL8!K$mG z3aej!P*`(3M`7*BOA70j`zfqnP`O}3yMe;SNf#DuDya8au(@c{f-M1h3$}VjDQq(k zSg_rwY{3rxPYZSmMJ(9){>p+~FBuee-}tDo=XSWl-W`_}_HF#PVE>G*3I}FOD;%tt zu5hU8ufpMoN`)hVOBNiph*mgebx`4W#I*&-Z*eX-C8jpv)bz*+r!UG)I8$yt;p|3+ z3Fi_b1kO)*G~q&C+=PquMPdRMe;Wy0%KWErIazbT70(9>SLGBJTy^?8;p+Vd0@wW3 zC|vu;yx@jjpTdowQx$IU6)4<#{YK&TQ}G3NPM=e_d*tVWds|*DxW7(J;lY$M3mz7E zEO?Y%qVPCKYr&I{2@9SY@ho^|yH?@3w5Gxfk&p#1ese3l{9CB->egF@*LQ;z>fh`- zukd#BuLbXBZB%&Qn7-h{{91*NiJl8S)yFG*_DWOu67Q(+RgrhWH+yA;?+ou3{E%l= z`0?Q4f}j7MEBrdJdBN`&%nSZhuU_!?`0fJcf@2CSnh^@D0V@>PIIR@e4Z0NAU&<(O z3gjqop7^K0^}$bpdy~`xo(l#Fyc7Q{;M*WnufSh;Z-Kx}y#<1S2Nnob3M>#dT(m$W z;?n|A<<}F$ERIbOXFfYYLSn@PiO1_FNdD-WAa!`+1nGy%1!UH&6OcXFDInJ~K|p?C zwtzxTk$_^OuYi(Ih=6jUzJQ93nSiR7_XIT_2?2F2-3jVnO(tk^@lVjaDmFpu<;Mxy zTYgN?Iaz;sg6@=C6ZBSYouFT`XM#cJ^a+NsHwBD}wg?#8?iMf!nkHZ>J6FKWs6xQ( zZ@qwp^ppt}cM}CHf0s?L+UqP}eLG@;&9e9jw!5t+*tI!Mu%9h6!68j~f@6!NfRh{R z1m_fK0Ts{GXYQLg94uCP6&9_KVB^0y>69&&zb!beEWI? z{MIa-;GdT#5YW>+AuzmaLQqcXgkbZW2_Zi26GFxPCWPr|P6+#MFd;(JO(5dB(1ggZ z8Uj((L7S;S zVW5pbQJT0wv7wwmiR({+Qb7iRGJVkrWgi|1RPcSDP;udiK;^re6RI{W6R1A7dqU03 zLlbJ(&7DwJxnx3pU;Tv1iL4rvAFy&w?qs#DXJceShpcS$gHWp`e`A%?W?;O=51o1&h z5=47FUJMoorA!bXlsZ8)D20M(P$~t{{(1FzV1=OM3K9S%Sr83MwjdgmbU`#I`GROr z5(d$rWDKUi8-P6kO3olYC`p58P_hQmprj3=LCG6LgOWIi1|@S49amrf8SDU1dIt%B z(maR;rF#$!O8X!hl>R|9C=Y;WP(A?Bpu7O0LHPkpznBho5GY%K_@Jx-qCwdMM1!&j zhz4a75M2+-DC_jPe50Ahe z0_7_ZAC$L1G$?<8Xiy#l(V%?Bz`!8O0LpA20Z@hm(V$ERq6cxtb0s0;ak=}37&rxo U==d7znd%wn8|wHP8h}__01kb6FaQ7m diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Istanbul b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Istanbul index 508446bb6aee2841ab88e82607a6ad6e748e7db7..c89186687300068ac4e8505cc0012a1dbf6a9960 100644 GIT binary patch delta 122 zcmbQuzkzdtxHJPAU}Rum0AU6OhRF|@Bm|MAiy0Ug*fw)A&tYa{oXp6iHTeJ=3o{EV t3zRK3S%FOGMetN>qm-ZKKz25xb_NADBJ6A3w z+}&gs@bSyegfB_&1HNXkC47^&xWJY-xq#hrRss9(QU*@RngY%Xry00@#uadH{MW#9 z)1iQONoWJ#vb6>LE#?jUKLi6LJ2w4NPbY2;rgJ){riJDt9pU@SBV0Rr}9eG`#z2#1U z&XThQy4}qm^jg*z=$9-gFi4qLU>LjSgHh4+55~6hK9~emelV47_+Vxf{lV;S(gzFa ziUNzfE*~s^M-^D@Rr_Fl+or%~nR9{dZn*-xHq`?A*$f2^Y3v1=jx91DoLpZPI4A%6 z;G%lEz}5M|2RGJ}6Wo>W3%I{~Cg90@P{8xt2?4Liiv_&btrGA#vwwnb|J@0GYZgxM z&&v}C=xLr17~VA@C?|D7u*E)s5Fhsmq2hiM!tCZv2>Wg@A^f~vK>h#!{~0G6vgo<6 zu(B|-u@etDI58m0gv!7>zxC{dtU}Rum0AY~u1aUzS1;g_h7#LVLhqL}+nf#GQXR-hb+hkc@YdHHZ tubj4zZwP}^a0r7th;|7MVc>H24KZ*E4$<*7)-%;J&^OfaH8cRRxB$U<7SI3y delta 2113 zcmdnbb3kT-cs)A<0|N*%FfcHDg0cl07#J94tF2uy`x>jlobv_?<}NwBVBVa$3+7Lk zTCkvXm%_rbKMNM6&QVxgePY29za0yf+W%HqrkbFzT>Y5B3N0Ol6|a9RSjBL8!K$mG z3aej!P*`(3M`7*BOA70j`zfqnP`O}3yMe;SNf#DuDya8au(@c{f-M1h3$}VjDQq(k zSg_rwY{3rxPYZSmMJ(9){>p+~FBuee-}tDo=XSWl-W`_}_HF#PVE>G*3I}FOD;%tt zu5hU8ufpMoN`)hVOBNiph*mgebx`4W#I*&-Z*eX-C8jpv)bz*+r!UG)I8$yt;p|3+ z3Fi_b1kO)*G~q&C+=PquMPdRMe;Wy0%KWErIazbT70(9>SLGBJTy^?8;p+Vd0@wW3 zC|vu;yx@jjpTdowQx$IU6)4<#{YK&TQ}G3NPM=e_d*tVWds|*DxW7(J;lY$M3mz7E zEO?Y%qVPCKYr&I{2@9SY@ho^|yH?@3w5Gxfk&p#1ese3l{9CB->egF@*LQ;z>fh`- zukd#BuLbXBZB%&Qn7-h{{91*NiJl8S)yFG*_DWOu67Q(+RgrhWH+yA;?+ou3{E%l= z`0?Q4f}j7MEBrdJdBN`&%nSZhuU_!?`0fJcf@2CSnh^@D0V@>PIIR@e4Z0NAU&<(O z3gjqop7^K0^}$bpdy~`xo(l#Fyc7Q{;M*WnufSh;Z-Kx}y#<1S2Nnob3M>#dT(m$W z;?n|A<<}F$ERIbOXFfYYLSn@PiO1_FNdD-WAa!`+1nGy%1!UH&6OcXFDInJ~K|p?C zwtzxTk$_^OuYi(Ih=6jUzJQ93nSiR7_XIT_2?2F2-3jVnO(tk^@lVjaDmFpu<;Mxy zTYgN?Iaz;sg6@=C6ZBSYouFT`XM#cJ^a+NsHwBD}wg?#8?iMf!nkHZ>J6FKWs6xQ( zZ@qwp^ppt}cM}CHf0s?L+UqP}eLG@;&9e9jw!5t+*tI!Mu%9h6!68j~f@6!NfRh{R z1m_fK0Ts{GXYQLg94uCP6&9_KVB^0y>69&&zb!beEWI? z{MIa-;GdT#5YW>+AuzmaLQqcXgkbZW2_Zi26GFxPCWPr|P6+#MFd;(JO(5dB(1ggZ z8Uj((L7S;S zVW5pbQJT0wv7wwmiR({+Qb7iRGJVkrWgi|1RPcSDP;udiK;^re6RI{W6R1A7dqU03 zLlbJ(&7DwJxnx3pU;Tv1iL4rvAFy&w?qs#DXJceShpcS$gHWp`e`A%?W?;O=51o1&h z5=47FUJMoorA!bXlsZ8)D20M(P$~t{{(1FzV1=OM3K9S%Sr83MwjdgmbU`#I`GROr z5(d$rWDKUi8-P6kO3olYC`p58P_hQmprj3=LCG6LgOWIi1|@S49amrf8SDU1dIt%B z(maR;rF#$!O8X!hl>R|9C=Y;WP(A?Bpu7O0LHPkpznBho5GY%K_@Jx-qCwdMM1!&j zhz4a75M2+-DC_jPe50Ahe z0_7_ZAC$L1G$?<8Xiy#l(V%?Bz`!8O0LpA20Z@hm(V$ERq6cxtb0s0;ak=}37&rxo U==d7znd%wn8|wHP8h}__01kb6FaQ7m diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Kaliningrad b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Kaliningrad index cc99beabe4ffc5107c4719d1201d6583b9ead03a..0ec475647055bd235131c6620aa46da7f43209ac 100644 GIT binary patch delta 154 zcmcc0-N8OVT7m%yFfuSOfG|jCf;2CP0^tA#1_qAJ`AqFh!Hi6B$imFR#)<}+S%`=1 eEDQ|777PrN&oOE;%1xfjs>IIa>KdYJ#03BxT?+>Q delta 680 zcmeBRzsfy9x}Ki_0ss)J3#yw{{e|td>15dJ3C07nS4Qd&w>v!YbJh>om1cRL9VCxgM3ZO2Zfx_4~j8v zAC!E|KPcO1d{EJm{Gci$$)Lu=#h}h=+MxbbtwH0dc!TCujs~qGKO3~SylT){a=Sry z%9#eemc0%7CF>dtQsy@p#-3&{Dq6;1Y`d1hB&dVIRJNbN%qWY&>~A51g>+kk#ob^A z%ikFdR(nkutm|)kHP|c*Y_Q#}(_q(T++aVOufZWrw861Oo59KTdxLWdFN2Hf%?4NJ z_Y7{VyBpkvmJBS&m#b@tt`Qdik;b21 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Kiev b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Kiev index 9337c9ea27c0a61b1082f4be37cfb0f9484cf5e2..8f83cefbcc116a4f5e6c57cb3bf372ef623a06a4 100644 GIT binary patch delta 122 zcmZ1>u#{zjxC{dtU}Rum0AY~u1aUzS1;c6#3=ABbt(i?2)fkzWSy@ef zXIB)6sxQAFCUM6>oa1(Y_%Hqg60i6!NZxjKkUBH@g7lsRA7s`{{2)80>4RKP@dx>u zln)9yp&t}u+&(Dzn14{V(fFXEBl$s9hUw`2_Lg%A zI!iVN=uX*?pw}`vK)+oE}LMr*IB^&cEkjmW$_bicUw)cYjd1nKU-#kLz?mg#}-QgCpXp!&MDFY zE~?KbxH|t8aAQ3=!Cm>jfcv{=0-nqV1w7B45b%1uSipPTDgmD}`zQGJ^$7T_SvbKz zFHaz#r+GqPc-MrWoYV=y<~b8WeB395iu+9n)6tv|_T6AYgs7W9#C4$wkzX|gqPBgR z5Pg+PAZCG}K&ci6G(`^Dv((FYC@9zc7f#BGZRweX9}d+uA7j?v2{Ya z?1TyFFQ!k(_**m~^F-x@th*r-vR6b;$T?OhklSH9A#Yi*Kz@e&gn~9xfx=4MoiGW;85Xj9#3&_AAGY6E~WacoiFfhm{FmNz1Xc;i@ zFfi~5FbIG|7)4;Dg#)7`Ocuswlm&@^NRVD1-w+0G-w*~@*ANEZU~dLz*AND0*I*FG zg~1iX0NKUJ$iTqJ2tptp1T!*{k|qBC|NlR1+wl|-4ayoI8k9XiG$@OJXizo*(V(mX zqCwdOOrKp*0J0O5Z9p_A>wsub_5sts_z!?+P&NY5psWOmJgR&He24yP{4a!;| z8kD_2G$@OKXizo-(V(mbqCwdWM1!&%hz4al5Unc1^#MeKvLBf4Rd@iRLD>*QgR&xs z24zPO4a$-r8k8+TG$?C=Xi)Y9(V#2}qCwddM1!&_hz4a>5Dm(*AR3fyK{P1qf@o0o z1=D})1wb??8-wY)iC{h`JA?S3EDfST*&0NHvNnhYWp5A-%Hkjzl+8gjD64~LP<98= zpezrfLD?QegR(w|24#N`4JraaG^iK=)9;>v?FSVHAU>!_0MVdg0Yrm}1`rJ@9zZmx zhyc-`Vgf{iiV6@7DlR}YsK@}(pkf0=gNhCi4JtlBG^hvx(V$`kOn*0+0HQ&~37Ebv z1m=T^6%Zd(w18+(@dBbjMGS}r6*C|jRMdcIP;mpIK}8OT1{FIX8dUUvXi)J3qCrIv zhz1oyAR1H@foM>11g2k12ip%SmOy+^(FCGF#S@4I6;U7>R7`T6IRJ?&`P!R{B zLB$-11{HN68dThYXi$*{qDPB822e4`OUyq<%BfdPaW7#J8FplpGK43-UBmv9G&s?R(iCUMR{oa3y6_%Fr{60aBz zNZvLzkUGMZ_)<~>52l2yDlFre@7Kq?N$3=ecPtMW|?z= z?QXdOyEfGV``HWy4r%NKjx91DoLpZPI4A%6;G%lEz}5M|2RGKW1@6j+KDfU-`N5NU z$p_DKt3Pi_@$&&bRKfh??0$i~jb&H^F`V-|LH z1_r$updi&UU|?Zja0_7MU|_ItVBmp~FcBq29tH-GA|Kxn25kdl25kdV25kcq1_nk3 z21Z6kMh3=-y0U_x7y@CCk>FU`82yK_9>k-kW6|8IgvGHSCowQ^*=QRW+vyr}0RSJZ Bl#T!Z diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Lisbon b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Lisbon index 355817b52b1b05680bbb57e4dc8de358eff27a39..64841661a01a1cf9e33b5ae3f013f569168eb77c 100644 GIT binary patch delta 268 zcmeB`p2IysT!sM+FfuSOfG|jSg18`vg5hok1_rjxs;sdr^-PS!LuN)MMr2HsP8PhX z^ck5LSy;i4@&Ett$siZ<2{5vNXa-IO1{noLUIqp}0R|y3TWqpDue3B*xNC?(xNC5T Uj<2zvsh)wpp^mSi0f@x~0LKjxc>n+a literal 3469 zcmWHE%1kq2zyLf93=AL)lDG$DOE)kuFid*Z*D%{Vw_x_a;|+7>ye*h}vbkVheNn;u zRogx+hz}`P*!`+tk>kyR#d-M!OO$y&EcIXXVHNB9f>mGoKCC^t{KLBC${*G*@GscV z&iY|vXZD9p1xf{*i#iIn1h5orH}Wai!GEG)$N!xLJKwJ=*mGk0hrK&ieAqWXzF_~1 zt`7%hefV&&BIm=QjMxu{Bm6!bv1ctfYGLrtZiyxe6@P2US&Y}-zryn!lZg4J9xbbtU!p)a$ z3U_u!D%{=Fvf$pL(gpV?r7d{S6u#hLk;j5ZNtO#92Wc&M;v~J`sS(eDXNrFpJeSr~ zc)=~D@ZvYO!pm2G6kgqWtMK~NJ%u;B&MUlKbwJ_Wtc?oqyA~;YsG6+sF{?%4Q}X%+ zpMw`H_~JZq!B^v^1>cm57kn2^S@457bit3$ZVPx;YccT7mS*7V=3(G(F>eqk(P$7% zk!%nOk(eOt{JTNK_}2tc<<}F$gzrocXFfYY{PVsE5|8&Tki5KLg4E%O6QuX-6_8o8 zPC$0fd;z(h2?FvpjRFceMFNU3$pT6~Ap*)at^z7LW&)}*>H=y!5(4V1&J)zXnoQ7m zsyadQs@MdrqwEv3xBQr(v*hIj-6^*w=(U`lpkK0Qfnvb>J7R*(viJ$MyR9bJwK-0(pDi=N zAx(LLV~eGLlN;*<=M-rH7uDwzT%G?4xUrs`;I4dM!2R7b0Z-x(CylX;GPU?hU^PCAGKJF7j#r-CP>1a*}`))8H zLexzl;=0g;$gdg#QQN*uh`!1t5VJr~Aa=_efw=n50`XJM2_(c{6-caoH6h7Z^*(;(anLD>Dl-GA2qNJ0bHqIKhyMjr#Ea z|L@75VunwEkp)CEa569;vt<+*c@g3aLLgZXDWkwB24cf>`S^w~gu4cV2oUxSVQ_W@ z;ouOEZbn8%Mg}ke;xRzjq!fPt|Ns9VXUiiCqCtfqhz1peVEW(j1`rJ@5J5DkPz2GS zf)PZ63P%tPDj-2LsE`EFpn?)ag9=L!4Jt4}G^o%7(V&78On>S70HQ$!D2N6Xq97Vn zkb-DXVG5!_1uBRJ6{;W_RIq|*P~i%qK?N*`1{Jbk`v1-X5DhA9K{Tkq1<{~F7es>! zUJwl`d_gp*00z;ZLKsAY3StlqDvUuis6YnMph6i$g9>I44Jw?$^v(NV`#^;>hz}~L zK{Tka2GO7b8%)1h`~XCQ3T`lcXA#){paLAk2NmKV8dQ*j>7)C>=7I`z5Fb>igJ@8} z4yKnb1j~a8cn}{{$b)E5K@X-|o5Av+0w2T&75X3=RPcjnP~i`vK@|Xq22}!J`sY*y z5DlsfKs2aA0MVdI0Yrl;1`rLZ96&Uvf&kH=N&-ZKDhdz{sw_Y>sKNlzph^QogDMUX z4XQjqG^hdr)4#dF_JS%B5Fb>TfM`&K0-`~c3Wx?(EFc_9ZA!UNHuN)JSXDn1Ym zs{Fw8R}-*1K$Ref52^@3G^jEJ(Vz+uM1v|t5DlsrK{Tjx1ks=h5=4V4Ne~UHC_yx+ zvINnf3KK+wDoqd#syIP3sPY8Uf9nN6G^i2<({~fWd{AWy;)5zw5DltSK{Tjh1<|0& z6-0w7SP%`WWI;5jq6N{Q$`(X}DqIi^s&qj#sNx0Dpvo6SgDPMU4XT8}^t)$Z`$3g4 zh!3ieK{TjR2GO938AO9BXAljlpg}aKk_OSBiW)?NDr*o8s<1&csL}?}po$wrgDP(j z4XVIFG^i2>)87ri@d2vLL3~h!4x&MoI*0~U>>wIcxr1m>1rMS@l{|uG literal 1920 zcmWHE%1kq2zyRzF3=AL)k|>9=c^eoQ7)~*nJ~;E-Tj1s!~~mV@e^!!TTQTQbDUs5TV{eon(_q47E1vqH`WQxDbfNis?R65I{y`L zV?8;+UHQI%`@3fXp3DaYJkOmF@Or#hz)0iQGbC;0aD2>7j8IKe+JPavSDc|u@# z*My*))Cs}nITJ#B+$V&J`%MVb(VP(W-C#n5sGC5{rccQD zTQni_MCF96yCD;@S42<9IaVl;+hIE)Z&|QFeun&nf;Llu!ay5=qBL=VVnaEB64##s zrGg9sW%{BM%04_2sNnlPq2j_3fy#F`Csb`%CQyBD_k^06hbGjnn>(Sda><1HzWND_ zEKJN`$jU}f$iN_M0ZL8~aeKr|@7fM`&j0nwm*1EN8B2SkJN4~PckArKA9M<5!Mmq0WqKY?ga zo&wRJdck@-T=7gv!7>zxC{dtU}Rum0AY~u1aUzS1;g_h7#LVLhqL}+nf#GQXR-hb+hkc@YdHHZ tubj4zZwP}^a0r7th;|7MVc>H24KZ*E4$<*7)-%;J&^OfaH8cRRxB$U<7SI3y delta 2113 zcmdnbb3kT-cs)A<0|N*%FfcHDg0cl07#J94tF2uy`x>jlobv_?<}NwBVBVa$3+7Lk zTCkvXm%_rbKMNM6&QVxgePY29za0yf+W%HqrkbFzT>Y5B3N0Ol6|a9RSjBL8!K$mG z3aej!P*`(3M`7*BOA70j`zfqnP`O}3yMe;SNf#DuDya8au(@c{f-M1h3$}VjDQq(k zSg_rwY{3rxPYZSmMJ(9){>p+~FBuee-}tDo=XSWl-W`_}_HF#PVE>G*3I}FOD;%tt zu5hU8ufpMoN`)hVOBNiph*mgebx`4W#I*&-Z*eX-C8jpv)bz*+r!UG)I8$yt;p|3+ z3Fi_b1kO)*G~q&C+=PquMPdRMe;Wy0%KWErIazbT70(9>SLGBJTy^?8;p+Vd0@wW3 zC|vu;yx@jjpTdowQx$IU6)4<#{YK&TQ}G3NPM=e_d*tVWds|*DxW7(J;lY$M3mz7E zEO?Y%qVPCKYr&I{2@9SY@ho^|yH?@3w5Gxfk&p#1ese3l{9CB->egF@*LQ;z>fh`- zukd#BuLbXBZB%&Qn7-h{{91*NiJl8S)yFG*_DWOu67Q(+RgrhWH+yA;?+ou3{E%l= z`0?Q4f}j7MEBrdJdBN`&%nSZhuU_!?`0fJcf@2CSnh^@D0V@>PIIR@e4Z0NAU&<(O z3gjqop7^K0^}$bpdy~`xo(l#Fyc7Q{;M*WnufSh;Z-Kx}y#<1S2Nnob3M>#dT(m$W z;?n|A<<}F$ERIbOXFfYYLSn@PiO1_FNdD-WAa!`+1nGy%1!UH&6OcXFDInJ~K|p?C zwtzxTk$_^OuYi(Ih=6jUzJQ93nSiR7_XIT_2?2F2-3jVnO(tk^@lVjaDmFpu<;Mxy zTYgN?Iaz;sg6@=C6ZBSYouFT`XM#cJ^a+NsHwBD}wg?#8?iMf!nkHZ>J6FKWs6xQ( zZ@qwp^ppt}cM}CHf0s?L+UqP}eLG@;&9e9jw!5t+*tI!Mu%9h6!68j~f@6!NfRh{R z1m_fK0Ts{GXYQLg94uCP6&9_KVB^0y>69&&zb!beEWI? z{MIa-;GdT#5YW>+AuzmaLQqcXgkbZW2_Zi26GFxPCWPr|P6+#MFd;(JO(5dB(1ggZ z8Uj((L7S;S zVW5pbQJT0wv7wwmiR({+Qb7iRGJVkrWgi|1RPcSDP;udiK;^re6RI{W6R1A7dqU03 zLlbJ(&7DwJxnx3pU;Tv1iL4rvAFy&w?qs#DXJceShpcS$gHWp`e`A%?W?;O=51o1&h z5=47FUJMoorA!bXlsZ8)D20M(P$~t{{(1FzV1=OM3K9S%Sr83MwjdgmbU`#I`GROr z5(d$rWDKUi8-P6kO3olYC`p58P_hQmprj3=LCG6LgOWIi1|@S49amrf8SDU1dIt%B z(maR;rF#$!O8X!hl>R|9C=Y;WP(A?Bpu7O0LHPkpznBho5GY%K_@Jx-qCwdMM1!&j zhz4a75M2+-DC_jPe50Ahe z0_7_ZAC$L1G$?<8Xiy#l(V%?Bz`!8O0LpA20Z@hm(V$ERq6cxtb0s0;ak=}37&rxo U==d7znd%wn8|wHP8h}__01kb6FaQ7m diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Luxembourg b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Luxembourg index c4ca733f5345df24e5286b70464a6c0498353372..682bcbf61ac74f99905a5ea01072d5868a5a0189 100644 GIT binary patch delta 230 zcmZn?-_J2YT!sM+FfuSOfG|jSg18`vg5eYf1_t)cxhyKoDNKxD$ihrKWMgGxWdrMi z=p{%_e!wL%`93p`4W9sm5CemZ0wb@FZwQ04YcPliVF(8?!d*icxSU->bPYk`I=;qw Qrg{cCzJ>-MTHlxp0D(;u)c^nh literal 2946 zcmWHE%1kq2zyN#<3=AL)lGqMqi?u9TyJxmsPr~f0w?52ywfw={B{K`=?VK=Se#`U; z^B){3Sdg&v!@|0!3l`}KeOO$TDX_$}@x#(M`w7cbO+PGGU&XLOi}Axs_E`ce-mR2}e zFg_H_{u zG5$3{RQdG;G2uHC#F@`d5dXYyg2dzX6C^J$m>_j{;sohEdj(|HtP_x(GhaZiXM%uy zO{0K9PLY6OOtOHIPl$lBjjMo)j+ua}jJkjtkA#3atMdf)uO<^To~lmJyec+9>nQsK z?JYkh=q!0TL3hfn33@H3C+L^#nP8Bzc7kE-O#!2#Eds{2y9G>wrU{tJ&J{2-st_>y zTQ6WCJ!OK$-9!P)-(?f5_Bsn#-;S7Ivn+ms?QW|Hc5RLm>}ShNa7a_0;Mig*;N-?S z!8t`*z(w`>1Xt(30&c7)C%7x$7jS>~Ou&=*pn&JO69Qh37Ylf=TP5IgX8#1=z8(R; zH47*B=j90m^fXTh4DXr{l#@Ck*gR)Kh>!b(P;tKrVLF-Kvq1cma{>wRR|OJlUrk7|-!70GduBq4{7ivV+jSGt zIJQnmmz^*n{l)YN8Gnl=WS*#;kaag?LiUR22|33K1#&xVC*&;)7Rb+#pHR?dDo_|` zBT$qkE>LVJCs5-0Q=n9kL7+@ubVAvOM*22KVBWHz4wBQHpvK?p`dMEC?iA~FgfSvUzb!N)g*!Pzw!M1(MegBaniAt3FH zj0_BnjEsy7AO=VPf*Bb}DMbGN|NkFUkbr1VVFISF-ueKdL4^v41{EwI8dSJ|XixzI zrXL(B0MVd=21J7j8xRdDa6mMu&;ik)f(Jx{3Lg*+Du6&Vs1O3tpn?cQg9;-s{mukz zE~rof@j(R>hz1o-AR1IafoM=61)@O(6^I5ERv;QwV1Z~*p#`Er1s8}06<#13RDgkK zP$34QK?NCz1{G#t`v2nvAR1JtfoM>{2BJZQ8;AxKa3C5~$bo23K?kBig&l|n6?h;T zROo?dP{9YHL4_ZP1{HuH8dL~^Xiz~2qCtfrn7+jcwjWd|g7~0<5k!LuM-UAvAVD;! zkOa}7f)Yf73QG_TDlkDbsL%w_pn?;WHb8|Zhz1p)AR1JNf@n}d3Zg-UDToFYs300t zsDfxv!3v^5g)4{#6|f*0RLFwq&-*5TXi#AbqCo{Nhz1q9AR1Kgf@o0T3!*^R70MtQR4{{RP~i-sK?O931{KmE8dOk&>8~bWcYq3P5Fb=% zgJ@8}4WdDXH;4um;2;`Qh=XWQK@Orpg*k`@73d%uRH%b!P{9tOL4`Yr1{Lri8dS)G zXiz~9rvKIpfM`&G52o)Xg886=AH)Y0{vaAu0f1;wB>eP$dSUK@}N@232Mt8dRZyXi%jFqCpiK zhz3<|AR1J`foM=A2ckh09f$^1b|4y5;elvSr3a!x6(5-X@CY0qpb8Mg2UUU~8dMR2 zXi#McqCpiRhz3=PAR1ILf@o0X2%<+TNM7V>mGlad%h@$V*AP^x>i8P#nd%wn_!=63 IXnkWY0O!A^0{{R3 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Madrid b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Madrid index 16f6420ab7efc7ceac3b0e42fe37836185cfc463..60bdf4d07e6ef544ff18013b272dfb851f1cc27c 100644 GIT binary patch delta 172 zcmdlc(#SqRT!sM+FfuSOfG|jSg18`vf?;sN3lL|QBu7ALFrKEs+x6A{c)zTk$mslq7b^ZOo-{Lw!pu}u~ zV2b(#p%94)!oDs7BF4Wah$_FHASQfgf;jWp3F4pkO^|rJeuCuX1rwwWPn;mVXRmQHl~ET^C+JSOH9@cC^aTBqJrfL4)=n^ty(wT+v_-(!cDH~@ z&@=&4*|`E{Mil~Pf9nM-q^C@)R0%Y?j4Ou-$Dn!LH45g8gin z2@Yw>6C7JC1)SViCpf1_3%IC0pWy2JSHO++ff^t$P1e@nf2=Q^B5Gw9BAxuYeLfChM z2@#@h0uk4RCPaSK5Qy6LWkU2-E`gW@f&#Hy-U!6ie-?9P|hq`#OxA>(h+gv=9_6SD4xOvqjlJt5~>YGxjqP`hsKgu2Ql6YBfwC$KOwp+ROwCN@?qke!2*YarnN|9^TwS%*)6 zkp)CEa56B+C@}IOv4t2I_yicl!QxohKE5Fg;jY0T0)%}-7@R>oXV(x01_nluIgE^q zU>d|`U}PjEBme*Z|9_p?Rt69a%FrMhl&L{9C}V?YQ04~FpbQSCpXY(qgEBgZ56bKy z8kFHdG$_-9=#8CKV0EC(58{Ig01yo-1VA*XAOO*z!T>~r3Is5nEBydOg9-)^4JsVK z^w+)*AR1IifM`%b0ir>L1&9U}7$6!{Xn<%?!2zN{g$IZR6(ArQREU6RP(cEsL4^sJ zei{7%6ojBc1x$aLQ~;tug$sxV6)+$gRLFp6P(cHtL4^&71{F9U8dT_jXi&ieqCtfZ zhz1ovAR1H%foM=c1foHO5r_sANFW+iD1qtE`zC;BP~ilkK?M|u1{G2u8dOk$Xi#AV zqCo`~hz1o}AR1I~foM?S1)@O(7>EWHVjvn+kb!7WVFsc>1saG36>1-mHum#be z0vAMs3SAHlDtJLOsPF~RpaK{~g9>2~4JwF1G^j8J(VzkuM1u-t5DhArK{Tjv2GO7b z8ccsT0EaKApa$_lg*Au<71$seRA_@}P{9qNL4`Mn1{L5S8dQjbXiz~8qCtf@hz1qt zAR1JtgJ@8}4x&MYJBS7q@E{sg$b)E5K@X;1Ob5FMRN#a7ph6!+g9?5S4J!OWG^hdq z(V$8IM1v{<5DlsfKs2aA0MVdI0Yrl;1`rLZ96&Uvf&kH=N&-ZKDhe?D;So4KKotgv z52`dkG^pYL(V)r$M1v|25DltCKs2Z#0nwn!1VoQkC^#w literal 2620 zcmWHE%1kq2zyRzF3=AL)l2{34^ENOrFwD02Q84@JnFn)@p8ha*J43>}&VL2-7sxzV zkg)W_!n(Byi(1nraAq?wbu<3Zg5T$_-VZL!_S*X9{iTMRPcM}mJfgaY$^CVbJ~Z0 zPcMA<-?X`a;pnChj7d`qnC3(kFgukOu(XzaVAY=dflbP|fSpUFfJ0oYfa8`)0q1v- z30#MG8@R81o4~X1eFN{d8x!~%FE;Q`+ciNTadU%U*_;VNj#C?iU84m=v^Ft_D!-l} zCVXdtIP=*F;-B|Tka)a)g5>1|6QmALoFKhtuYk;&bpo<;<_pO6Oc0Q-X%tY%DH2eO zNfuD@2@z1XaTQR}F%wXgQ5R6-kq}U4b)KO9)ntOkQ`HHYSH&i19c7=Oz2(OQoh2_P z=uWvcL9gZX1pSgd6AV(;PB4tUDPUBzMZnm0w}45|GyzlDxdLWJ6#`~|>jf;Nr%bT8 znu7-EB3&uFY|R{cM>D4r$6099t{}oZMI^IHyPpxTrp# z;OhKWz>W3f1b5~80`Bjg33xIe6!1KELcr_sVgc`Us|0+`?4RJ<*CXJ!X5j??ygY$` zp5_UG;awAga#AM*o99dj@o}FJD(*KSOh>pDB=PyKX`n$JPnyvJ)nx zznDHD<8RS~%oCLpvhIdV$X*dWA?H}3KyHWaguG?J0{I#86AIc)1quUg1d7tc1&R&j z1WH_g3X}>m2$boIPAL2ENT7o6`-F-MM+7S0-JDRhVVOYnx!n_LW*(YQyKe4;y2>RJ z>ig;^Ff%g2Au|gz3o|1Vh-6`Afze=5kQiJY6C)EV8@(X|1MeJA?vhbpWMN?76JX$k zkq{9G2@?154PkJ04F(Y*ARUa1jEo?ffsv7v-24Ck|NjMhFQ{*Al?EUhR3dM6c7z6RX{YTWC78j(gj3= zN*E9gDrLa*Et3Ke4JvIwG^oS@(V$WXM1x8m5DhAQKs2ZX0@0vS2tdppp$lgGx6L4JzS4G^msV(V&tJOn)^2y8~3> zf%u?O4@84XJ`fEm{XjIR1O(BbQV>LgNn5zGgboFG1^^aRnM5)?#(N>LCEDoH^!s5Ax9pb`~C zgGyBp4JuhdG^lh1(V!9*M1x9M5DhA6K{Tke1<{}q7fio<2DTqm@`CuF(icR7N?;HT zDuqEbs3Zo_pwbvbgGyu&4JwsEG^k_-(V)^9M1x9b5DhA&K{TkO2GO9>8bpIiY%u-Z z0308nk{iSamEIs4RDy$OP$>?gK_xke29@R@8dRc#Xi%vRqCq7)hz6DJAR1J{gJ@7G z528UOJ%|RC_8=Nm;)7^VsSlz-B|n&cF&*q4Pz?a$gK7Z~4XO!1G^jQJ(V!XuM1yJt z5DlssKs2a!0MVct0z`vq2@nmcDL^!+wgAzf8UsXwY7Gz#syV>)hezP}0M#HMKByJ} z(V&_HM1yJ*5DltPKs2aU0nwnE1w?~t7Z5%2Y8WnO*AQJpQ1zqZYpiFgXQ1P2XaJ)1 Gjky5IVf7vW diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Mariehamn b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Mariehamn index b4f8f9cbb57450549933f83ac90dd56a2ca75344..ff5e56530570974516d249927952c69da601b664 100644 GIT binary patch delta 122 zcmaFE_mFvlxC{dtU}Rum0AY~u1aUzS1;fe=3=AxrA2Z1?Dl;-O5rUI>*(C&hd_x#K Sd_x#qU4ubH2*YGQb~ylA+zV^~ literal 1900 zcmWHE%1kq2zyNFv3=AL)k|=|+1sfO`7?u?0OP@X$m~iI6(*#lFyA5K(=NiPB_cw@t z-q0ZNc>M&)%L^t*9iBKrde2?~nKkPKWarEmkn5QsAYaocppa7}pcs=ZpyU%GplstR zprT_Ypemy-pvEI1pw8+%LH(=A1dXSv6Ev@iP0%{ZK0$lSj|nLF3SV&KqU~xB5!18z51gpKy z0@k-9CfF>CpJ2P&YJy#x;{^NJG7}uqlqWd0SPD3~u}*MKkrr@KeLlg}`LBQ*>&Xf3 z%J&7_-#ruXWIib1dG3UO*W<+k-s@Hg_?+24!MCqRz;DgM3I2I`0s%eE69U7#CIscA zP6#&7nGoXRJ|R@xZ$g-k=7g~C1`{Gg-2@`83r&dpsv!`y?aPGdt6Tyx3j_sXx4aRE ztN$zzKjoZ2Li|;M#M)OAlI*t&B*&hakRm@*Ak}u=gfxz=6VhcTOh|t*eL}|Hq6wKN zDko&!4VjR=B6>p3u|k2|4%-QN%Yp^+Gvp@}w3!MN2HFS|rHKm^8_Efkxc(F<6=V=7 z(-)mk_TiC01>g4x6&H>ORKB}8p=!f2f$DR+C)CV5G@*9g+zEA+OD5F!)lXn#W&%SN zR(e7P2Juu-@)A#FU}0d;GGOFjV31K@;6-Np_=Yfe_=YgJx(0)Y5RiHXMn(|D$Vf`k z{r~^}|KMF}vq3Z{34>@*G6vD0qzp0_Idr>4Ruc@(0nNEC8ZG*#Ja?vI2+(Wd{%q$`T+Nlr2Cs zC~JV}uO<^fG$@OJXizo*(V(mXqCwdOM1!&nhz4aF5Dm&YAR3f?Kr|=|foM=R0@0wX z1foIN2}Fak6o>|8D-aFJT44Hby#R;?Wic>)HxbMSWi=2Vl-)oyD9eFpP__fnpsWX? zLD>&PgR&rq24zDK4a$lj8k8MDG$>1gXi&BU(V(meqCwdcM1!&@n11&RY(FTgg7~29 z3Zg+-7DR)xEr56bQ!8kFThG$`AHXi(M%(V*-PqCrIfhz1n{AR1H@fM`&00HQ%f z0*D3`3m_U)G=OMO@c^PhMFfZj6%!yDR8)ZJ7t_J+0Tme_KB(9L(V(IOM1zVC5Dh9q zKs2Zr0nwnM1Vn?16A%q5Qb07QSOL+Xq6I{QiWd+KDq=u1sF(rKprQs$e|Q9r4^WW< z;)9AE5DhANKs2cM0nwl$2t23=Eu`^_WzcTo{>{Sy@PdK;8S>XI6 z6M+j{ObMdu%P)vY+;I@+xE&z=i~oScE4~Yox1AlN&P=`_y=TD(nKctX$j)i{AlFm; zLB1yCgF;T|2gMk-4@y4fACzr0KB(wOeo&R+`k?-`UZOzbsd$6tRgMO&BR?Cox4df5 zS#rBUcgmRty_UTV`X%cc3{vJd7{;DvFe+NcU~IdV!6c}I!Bn=N!OSR&!R&7#gN1Zk zgT>uo2Fu?W4OV+i8LV%6HP|c*Y_Q#}(_q(T++aVOufZWrw861Oo59KTdxLWdFN2Hf z%?4NJ_Y7|Jth*cBl`k^5zq`TU$-J4t^V}{5ug6mvyw}ZP@Hw-w!MCrDq5l8>|BOt` zY%HuStjz2X$iWGRT-?M#9v%h;$s3^1mOR10!oVP-z`(&U`5Ke3l8geQ2m^zK1EVAZ zgO&jU4}#4o3sE=uGm{P|b{H5L85kHrV1hI+Sb%|n0UUK3qg9xEL55S!wUZAssS)Wk TF_6V@r*YY68yMT^8gl^v6u*%I diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Monaco b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Monaco index 686ae8831550bb0fe033409c8b4df460fcd61a04..f30dfc7014f46670a12fab61dbd74d3b0349afbe 100644 GIT binary patch delta 183 zcmZn=zr`^@T!sM+FfuSOfG|jSg18EZg5fj<1_pKp1_t^6|NsBb6P!N%%F$)tEvau2iC%@&AVv$i`6rB8@SzCt7*)>Gh(AhOOM90@y&s5Jq N$JfvRMC%)K0RYEE9B}{u literal 2944 zcmWHE%1kq2zyRC~3=AL)lGq7l%QrAEFicDc@Sp8o@nQCLoq{=gCKk*+;PGKz=f8sa z3$#8gNLcz|VFS;HMS4OX7FYRvSYq1vVQHLl!7^3T56jhOe^?QrRbKdlgSJY-nfwu(31y!=?hIg3U!81zQ4G3buOcf7qt~ ztYEv5Pr(lU69qf|?=0B)epSJ)YY88A-#GSR&x!3H_U>5mVc-1tg8ehPJ{*|!;lsg- zoDYXGVm};?@cVGYp0(hpg~5koR?|Klk62T1{1)eeQ{vGdPCW{FaC&X#hcnN;1y{GWZ*iR93?VP6*k5#wJIM3rAp5EH&LL7e&Q1o6-NCP+M9KSA>Hf(cTGCr*&wvsXZ7%{l?u zIr9bNdL{_S*E9+!u|7tQp|6meqY44Dzx4tZ(o-f_+)Wg){9QJ|YOk|^_3elWHp}8C*zUHPVAtk2!G5;P1cx-` z363q60#0tM6P#0|1zc30PjGeqE8xa@a)P_^eF67(&jdV~4+?mmJ0alpc(H)@x>W)` zXZBCI!A?&-sga}bL zfr#ru6C%HA2t;lBG9mgZmq5${L4nvUZv^7%KMTZ9IVX@1e^nr{_SJ+W`|SeBv1cZv z$j=l=wOuzMjbrPCblC|L(qBxUkny)@LgtCe30ZeTCS_Lv?F}fmG8rl7#J8B z8NmiXDG-~Hk(Bb||NsC0vro8A0nwmx1Vn?%5-@#TrvOBQ$`lX{Dpx=>sB8hzpz;Mo zgUT2X4Jv0qG^nfr(V+4MM1#s45DhAKKs2cA0nwoH2SkI)AP@~IhrskZ6R^FY@(9ES zl}R8PR4##NP}u~cLFE&O29;4D8dOe!Xi!-NqCw>qhz6BeAR1I|foM?K1)@Ra7l;Ox zVIUe*j)Cd_JHhsY$}<2ckh`ABYB(e;^uE27+i%IS8h2aV`MSpz;t*KMHvOqCw>%hz6C7AR1IYf@n|~ z38F#eB!~u;l^_~aUV>;)nF&f6pmGyLgUU`24JtoDG^h*((V%h^M1#sw5Dh9%K{TjL z1<{~#6-0x|RuBy;UqLjej0Mr4au!T~-Zue6gUVYF4Jva%G^pGK(V(&yM1#s-5DhAW zK{Tiw2GO9h7(|20V-O80lR-47Tn5pgvKd5!%4ZM_Dx*O(sGJ7Tpt2fFe>DNS15{>% z_@HtdM1#t15DhB7K{Tig2hpH%97Kc4au5wF&p|Y(Ob5}Ravem2%61S9D&IjgsEh~E zpmH8WgUWg^{kL8KM1#tFFnu=>%m%42hpH907Qf80T2zU3qUleJ^<06Isrt3 z>ID!DsvAHwsD1#^pgICXgX#$o4XP_ZG^oA+(V#j5Ouu^uwjWe?fcT*L14M)B5D*Qj zM?f^FE&J$(Ss#icXsBQt#p!x+wgX$O%4XS5AG^nlt(V+SUM1$%aF#X*C z93P;%2gC=}KOh=Z2Z3l%Jp`gbbrFaL)kh#2R40LGP`w1AL3I;|2Gvg>8dOJtXiz-` zqCs^Phz8YHAR1I>foM>@1)@Q97npuA9qb-Z9R}iq>M;-vs>?t$s6GSHpgIjigX%R9 z4XWEfG^l<9(V#jGM1$%%5Dlv9Ks2bn1JR&54@86NJrE75`@r;vN8tDX)qx;Bs2&8- zpt=x5gX%*N4XP7CG^kz#(V)5!M1$%_5ItH)l3qu0IlG4F8iFcP9baQTQ#}J6Uqb^B It#8Z)0IUSWT>t<8 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Moscow b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Moscow index ddb3f4e99a1030f33b56fad986c8d9c16e59eb32..5e6b6de6451b4408fb71ef73950712a0827d49a6 100644 GIT binary patch delta 167 zcmey*-NQaXT!sM+FfuSOfG|jSg18`vf?+=f1_tiU9Za=MuB_~=Y#eN?SRf~MVN9i5 rY?HlMbwu0(7$q4PWE2==85pz-7!?^9EF31UW7S~i@(uRZHRb{U$!HAo delta 716 zcmeBS|Ia-^yk3xjfdPaW7#JA*plr1U1_p-N@p8xK+I^~=r}ggVyziEo^IO7yF1V5N zav_6d!$O;74od`b4=k}Y+OSkKW5ZHg<^#*+Tm!Z)kxUR(Uw%PM;*Ntj$L#>|U;GCo zUh!R!yzT5Db!PGf={*ZR$gG+8L3U2l2f3c&5ArqjDIXMaLO&?RxP4IaG5?@!qwzsS zNAiQJ4A%!W?%yBOS=9^Fze*HnJQZ)ytk~b6dF5Au){)l*+FR}v=qx!~pgUz>fnLk{ z0{xN&1qLY-3k+lTd@w4S{=wLG-UpMQ$`7Wp4Ij*mqCc4ZP5NLVT~T0h*X4ud@2CQ+ zy=otvUnBQp~-3lj?~8#@O( z8z&n(1afgBK^|TtjvTTKI-8GcvMjTXg@ps7AOnM20HY)WgNy=$ECYj<0fQ(514LZQ zfKd@9ZsC9|J~@_ILmCvX42&R>5duI=h`>Z0IYCg=gD^-G9Q_-kYnfb$bUeCyk@-|` cyC%p{5T`<%4)z8_04&A8z~vk4t!vB$0F3&tH2?qr diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Nicosia b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Nicosia index f7f10ab7665e94ca44fd8cd98a362cd4b304eff1..c210d0a5989c228886b400ab74c75b6fca94b70a 100644 GIT binary patch delta 126 zcmcb_f0bo|xC{dtU}Rum0AY~u1aUzS1;d663=GVhS(tkmC$SsYF)=X6dw`_03>aA$ t7-SR}IDLFW7+hV0K|}}xm#b@tt`Uf<<7=#Es%M~YtmA8F0A`tR0RS=M5E1|Y literal 2002 zcmWHE%1kq2zyPca3=AL)lBkEWd6$;U?cjX7{sGtBNf)?(r99x-cPxN+iDd#`*TW0^ zEz$`BrT!NLlm8|N1wRN7_LY1fVtgn-RQX_nnDCMSapuJd;-A|BBp$aWNM6nekUE^6 zAibyMg3Oxc2eNb0F39zyK9H~RxS){Z{y;HC>w=Px<^yFLo(n2E+z(Wx-(67Se)~Y3 zl{-NFD_4TXleYnySKcIO9XTJMz2#hj&XSD*x>GhJ=(S7^&@Y*kV31N8U>LjZfsyaT z3&yq+9+>DBUoe#|dSGT$Az=2mUcf?n$^?tMi2|0t%O+Uubr!I`9WlXXS^Nas-BuIq z+8ig?&z70skfuDrvBgrr$&Gb_bBeTpi|X?UuFii2+*nUea96%B;QsEJfG6`o0nc+M z1iT(E7VuuTO2FsL{t3Q)Jpz7f7EbWb%M%FbX`T=m-Zdd8Cv`%wdCr6oANL8N;(imt zbTlV~eK(j8A?hX&ab0La+L|^3+h*=;g5WD4#KwSN2f%qxs1QOz}3MAIP znvi6_T_8F3%!CyAnF6V{>n5aeY@LuUJ7Gfli|G?G{uWKhJW)9z>u$(|>=n@ya*h=W zuK$*Vigt8Bh1S*h|Vt6VanzOQ})6C-JmnT4v5fkEB_loquN7+Dw? zWE2=UVI)Yz$2Ww*)ioGIgn(2rGBPkQFfx*ow*UYC{~wgTLE1rS97KcCIfw?Obr20o z?;skK=0P+l-GgXQ+6U2~^bevzc>qL%@&SkjS3ooC_jN{ zP@V$OpnL_QL3s;AgYp-c{>lZmAC%8Pd{ABk(V+YWqCt5MM1%4jhz8|75Dm(IAR3eh zK{O~If@n})1ks@U2%L3tQNgYq$m2IXZC4a(0T8kDC&G$>z#Xi(k;(V+YdqCt5aM1%4< zn11&RY(FT!gZQ94528W&9z=ukK8Ob8e-I5S13)yW901XvvH(Pb$^#G$Dic67s9XTi zpt1o(gUSaG4Jso*G^m^a)87pyfM`&80j94Df%%|v1H=cF9UvN1et>9D83Lj~hhz6B4AR1KOfaw?0!S;j79S|Q> z_JC+m`2(UsWe|u4l|vvJR2G3~P91*Shd0>=la+ye1IWfzDBm0utlREB|QP&o#oL1h_;29;+Z8dRo%=%HG!ak;vN a=o*0vJRM(SJySgcePbP8Ljy3&gbM%&q|NOB diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Oslo b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Oslo index 15a34c3cedb7c9ca519c195f5ec0ce9d8d1885a5..dfc509570a5be7ea90f64610ad5ca5a58fa3d172 100644 GIT binary patch delta 133 zcmdlYxP*0rxC{dtU}Rum0AY~u1aUzS1;bVh3=GVhqnNKSIxsPk3mF)=L>L$*7jj5W Ip1~ml06Gi^Hvj+t literal 2228 zcmWHE%1kq2zyRzF3=AL)lIVr9c^eoQ7-p+KW|)1YI^o22--I*Iy#>y$6rXTzk+Z=0 zNhSgpnp6cY7KsU5N@5pyyxYvk83vaA|_DuZw_)@vjM@%C9Gg3E!C@&U|))_~(5SBp$Dy zAbEMg1gXOlCrIzvDIgV&}%t8LBC|r1cQ{d z6AWW-3K$h_5iqvhEnpHfO~6!ku7H_Qg@D=LdI1aRDHAO2CJI>oE}LMr*IB^&cEkjm zW$_bicUw)cYjd1nKU-#kLz?mg#}-QgCpXp!&MDFYE~?KbxH|t8aAQ3=!Cm>jfcv{= z0-nqV1w7B45b%1uSipPTDgmD}`zQGJ^$7T_SvbKzFHaz#r+GqPc-MrWoYV=y<~b8W zeB395iu+9n)6tv|_T6AYgs7W9#C4$wkzX|gqPBgR5Pg+PAZCG}K&ci z6G(`^Dv((FYC@9zc7f#BGZRweX9}d+uA7j?v2{Ya?1TyFFQ!k(_**m~^F-x@th*r- zvR6b;$T?OhklSH9A#Yi*Kz@e&gn~9xfxPfoM=}0@0ux1)@Q@3Pgi)7KjGrE)WgMVIUfm z%Rn?Jr-5itZUfPv90#I7xei2wavq2VAgP$>bTK_vx< z29*|I`ft4ehz6A!VES$%m=7vFKzvXM0-`~s2#5xiBp@18nt*6fi2|ZQr3#1!l`J3{ zRJwp@PzeK~L8T0c29-1*8dTbVXi$j*qCuq&n11&RY(J><0r5d45QqkqLLeGc5`kz? zX#}D{B@&1Rl}aEQR5F2RQ0WAsK_wK329;7E8dOq&Xi#YdqCq7Vhz6BfVEVfOI6gq7 z7l;ok!9X;q6a&$qk_<$HN;41*D$zhRs8j>dppp$lgGx6L4JzS4G^msV(V&tJM1x8@ z5DhBvKs2b-1JR(84@84XKQR4bI@mp+QV_%km4qM~R2qV4P>BelL8T&y29=B;8dN%h zXiy0WqCur3hz6CEAR1I!f@n~Q38F!zCWr==oFE!hdV=W>kHGN(Dn&tjP)Q1+L8U2( z29>BF8dR!+Xi&)tqCurAhz6CgAbNO~vRuxtA-aa3B3Q@QSkF|?K*!h607UB>a{&O$ Cb5tGx diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Paris b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Paris index ca854351687d88b3919ff33138f0a71994356b29..00a27264c2cb3e28f2f46e5c267e12d575236a9d 100644 GIT binary patch delta 184 zcmbOvevxB>xC{dtU}Rum0AY~u1aVam1;eQf3=HfH3=H!B|NsA=eRB4B5Ir#=z<+Z) ziv%+x<77c*-N_2ftVXOXtSqc-Ol%;EI6V11m(1ih%)E?JlWn=>Ww@MOLv#(DU4uh( Te2w)?^$c`;4GloFzA+a7d+8n$ literal 2962 zcmWHE%1kq2zyQ1q3=AL)lGp)d%QrAEFicDc=$`Ff@nQCLoq{=gCKk*+;PGKz=f8sa z3$#8gNLcz|VFS;HMS4OX7FYRvSYq1vVQHLl!7^3T56jhOe^?QrRbKdlgSJY-nfwu(31y!=?hIg3U!81zQ4G3buOcf7qt~ ztYEv5Pr(lU69qf|?=0B)epSJ)YY88A-#GSR&x!3H_U>5mVc-1tg8ehPJ{*|!;lsg- zoDYXGVm};?@cVGYp0(hpg~5koR?|Klk62T1{1)ee6FKS+&OG-PIJ;7O!nsAx0_P{0 z2wd=g_~1h4#}5~a!~`z+IZWW*ZOOp1TKWU;lH>_|-BJSlEv^#;O3Wq*rl?O43Xzx~ z?CT;RV*G1@sPgLxV#0SOh%=v^ApUvZ1c}G%CrDmiFhT0@#0k=S_6o?XStlSnXTE@3 z&jbPannnSIoFW0mm}CJZpAZ3M8&?4p9Wwz{8Fc|Q9ti<;R_6)oUri=xJXM{bc~xwJ z)=~Be+FO21&{^_wg6@=C6ZBe6PtY&fGr=Hb?F7Tvn*v5fTLg@4cMF&VO%pJcohx8w zR3TvYw_d9IqPH^QmCj`76FBb4#w@Se0%>D_! zeLVtxYZgxM&&v}C=xLr17~VA@C?|D7uzAje5Fhsmq2hiM!gMqzgnc)d5FzR&5OG~- zLgZHsfv9a?CPZK55{OwKC=k2ljX+%eXMy-B=L8bsuL>mAzM7C^zg-|X_RNG7`I!Q# zw(BOOacrHCE<0gD`itokGX54#$UIRwA?t3)gzOd36LO9f3gmX!PRLspERdfeKcS$_ zRG=`>MxZE7T%g!cPN2l~r$DJ7gFu|isHbyos)%=i-U`sXP_Vh1Ct>rqcRyXurM(2 z2{3Yic%b}?%4QH`V31K@6h$JXKX2@d=_qMJR{{6{8>;RFr~fP;m;PK}9Nv1{JFy8dS7` zXi)JAqCrJ0hz1q2AR1KEf@n~23#LEsn*gFg#V&{j6}=!DRQ!TyP!SBGLB%kL1{K91 z8dMyEXi$+1qCv$nhz1qSAR1IWgJ@6@4WdECG>8Tj)gT&FT!Uy(kqxH5nt diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Podgorica b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Podgorica index 27de456f16ab549627b284a39e2265cbdb4ad8e9..a1bf9281ed1bc2c9b82ee64efdca60b4af762ede 100644 GIT binary patch delta 156 zcmZqRzsEd5T!sM+FfuSOfG|jSg18`vf?*W~1_tKMZuG literal 1920 zcmWHE%1kq2zyRzF3=AL)k|>9=c^eoQ7)~*nJ~;E-Tj1s!~~mV@e^!!TTQTQbDUs5TV{eon(_q47E1vqH`WQxDbfNis?R65I{y`L zV?8;+UHQI%`@3fXp3DaYJkOmF@Or#hz)0iQGbC;0aD2>7j8IKe+JPavSDc|u@# z*My*))Cs}nITJ#B+$V&J`%MVb(VP(W-C#n5sGC5{rccQD zTQni_MCF96yCD;@S42<9IaVl;+hIE)Z&|QFeun&nf;Llu!ay5=qBL=VVnaEB64##s zrGg9sW%{BM%04_2sNnlPq2j_3fy#F`Csb`%CQyBD_k^06hbGjnn>(Sda><1HzWND_ zEKJN`$jU}f$iN_M0ZL8~aeKr|@7fM`&j0nwm*1EN8B2SkJN4~PckArKA9M<5!Mmq0WqKY?ga zo&wRJdck@-T=7c$syAxC{dtU}Rum0AY~u1aUzS1;e%s3=FKB3z*+9)-y6Qp+OcjKDs;-pMin5 z17s#|2LlTOgNybj8V|XH-sU;H-y32H5f#MFu41MFmO4$hUglCgmiq3 L^-L#!;NS%SPd^fD literal 2301 zcmWHE%1kq2zyKT!3=AL)lIVxB1sfO`7-sW`C(OQj>%*Lz>n6-yvUS3|of9U^Z<#*f z1ZUxdGta#R&aM=naBh*a!1+lg0vDQ81uhne30z8I7r5LYGvSKoC4noGwIt)@l%wG#|uZweR{Z4ofG-7R1eG)=%%cCLV#QH6ln-+BQH=_wN|?j{OY{w|wf zwbxm|`gX(wn`QA6Ywuc zIl*1|zJU9?X9Awg2L(LOoe=PPyjZ|{-6{c}Gy5m__Voz(tywt1KQB)ppr?64V0hPr zpq$hR!R9#=LVVmOgo^u32-DG=5cb_*LWHQBK*V*S36Wnl1fsTmnGk)IOCV-}pg`=F zHv)0>p9SKloD)chzbcSe`)Wdx{dR%m*fSGSJ0Wjbut0u>{DguwQ-Q)j8-b!Uae-n(Ie`+_p8}z+cFA_EDQ{M0t}oC49IK-21Z_F5g*?W24~k`5D~)Q?i&Kq z%gD&U$OvLEFfcOW$VZ$E3?QSyswP0$qW}N@|1ak`=?93;IsXbwgYp%K56W908kE04 zG$@aOXiz=_(V)BrqCxo$M1%4ihz8|55Dm(EAR3haKr|>1f@n}a1ks?p2%%ODz*pTYF!eV}k*0Oe~CAC$L2G$?hz8|( z5Dm)rAR3hSK{P1;gJ@700HQ(V0Eh;a1t1z!9)M_2nEHgFrN> z90JjxvIsMjhz6BaAR1I&foM>f1)@Ra z7KjFwT_74%et~FE83v+3JP-{k_dqnL>;uuD@()CV%0LheDhEL{s4N80pz;tzgUUn@4JsEw zG^lI@(V+4XM1#smF#TdW*gc@K62u3UmmnHcW`bx?xe1~{WhaORm7gFQREC0RP&o>s zL1ih329>8E8dRo&Xi&KdqCsUVhz6CfAR1K0g6R*B!0`bpYe9Tac?+UJWiE&YmAfDs zRQ7^sQ27g@L1i$A29?7g8dMfDGBYu=up&b?D4(5UARw$T=Ivl$0T;R);364P0K?e~ w42*)vvY;Y4086n9DwJX6G6N$cm$Pe#t|6%G*6}sgGu1QD@ijC6(fY<*0D*jEW&i*H diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Riga b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Riga index 8db477d01736445cafce8af7a7085d226d81f546..26af4c90b3b75009916ac78884371bc2d8f5302d 100644 GIT binary patch delta 137 zcmbOxxQ%s!xC{dtU}Rum0AY~u1aUzS1;eHc3=Eu`Gnm&fnldsmGBGlU61&15}mgx)5 literal 2198 zcmWHE%1kq2zySOV3=AL)lBk2S)fyNW80PJ4|2My-@85zBx4H$VoBpkR{_)<4^(hIb zl2QZCJogqjyHb3@xkb(b=O>v6Txe1ixGa3;>>R;6wG@gn#XkO)L&^q$7L3_)q2Aw6h8+50fY0zug+n`^vuE8K>euH7` zX$B+TJq*USy9G>wrU{tJ&J{2-st_>yTQ6WCJ!OK`US|R8+Yu9Nmc>u7-EB3&uFY|R z{cM>D4r$6099t{}oZMI^IHyPpxTrp#;OhKWz>W3f1b5~80`Bjg33xIe6!1KELcr_s zVgc`Us|0+`?4RJ<*CXJ!X5j??ygY$`p5_UG;awAga#AM*o99dj@o}FJD(*KSOh>pDB=PyKX`n$JPnyvJ)nxznDHD<8RS~%oCLpvhIdV$X*dWA?H}3KyHWa zguG?J0{I#86AIc)1quUg1d7tc1&R&j1WH_g3X}>m2$boIPAL2ENT7o6`-F-MM+7S0 z-JDRhVVOYnx!n_LW*(YQyKe4;y2>RJ>ig;^FfuVRF*38Tv$CG+h;~T;dKek}8|=;C>>9%0>>3Q>xG=ba7$CbD7#SHD7{LI{ zg%OO5q~xFf|Ns9F+jce%M1%4Xhz8{)5Dm&tVES~^KM)PdS0Eacw?H%~e}QOF9s|*! zdJVd(V+YXqCt5OO#k9P0HQ&85k!OXBZvm&Ne~Un zmmnIHH$gNge}ZUG9tF{$dghz6B0AR1K8fM`%z1EN9Y4TuJnIUpKT?to}e*#n|MIS>sh>p(Q9 zyaUmoG7m(9$~_PbD*He*sQd%bpfV6dgUUe=4Jr#kG^jiT(;psz;{#MKg7~1a5k!N^ zM-UAvBSAE%oCMLJvJymt%1aOpDlEH(m#b@tt`Vq!)$ujfGu1QDH`ehr JGyt5m9baQTQ#}J6Uqb^Bt#8Z)0N$DpQ~&?~ literal 2641 zcmWHE%1kq2zyRzF3=AL)l2{34^ENOrFwD02Q84@JnFn)@p8ha*J43>}&VL2-7sxzV zkg)W_!n(Byi(!3VyszaRL|{w)wFktz^ed%r*^_)mebuZw_)@vjM@%C9Gg z3E!C@&U|))_~(5SBp$DyAbEMg1gXOlCrIzvDIgV&}%t8LBC|r1cQ{d6AWW-3K$h_5iqvhEnpHfO~6!ku7H_Qg@D=LdI1aRDHAO2 zCJI>oE}LMr*IB^&cEkjmW$_bicUw)cYjd1nKU-#kLz?mg#}-QgCpXp!&MDFYE~?Kb zxH|t8aAQ3=!Cm>jfcv{=0-nqV1w7B45b%1uSipPTDgmD}`zQGJ^$7T_SvbKzFHaz# zr+GqPc-MrWoYV=y<~b8WeB395iu+9n)6tv|_T6AYgs7W9#C4$wkzX|gqPBgR5Pg+P zAZCG}K&ci6G(`^Dv((FYC@9zc7f#BGZRweX9}d+uA7j?v2{Ya?1TyF zFQ!k(_**m~^F-x@th*r-vR6b;$T?OhklSH9A#Yi*Kz@e&gn~9xfxr z1(?2h1nhoLsR81HN)8YWDm_3ns00Dg;8Fy{0F@-5&^fy41Be2ZC?FbCs(@%v$pWH5 zr3;7#l`tS0RLX#8P)P%#L8T3tejN@r2UO~S_@I&pM1x8nFuhtDEDtJ$KzvY11foHu z5r_trNFW+iDuHNF$poT7r4xt-l~5oWR7!zpP)P-%L8TR#{=9Djhz6BfAR1J1foM?a z1)@PE7>EXyVjvn+l7VPYX$GP}B^rnZm1-awRI-6+Q0WGuK_wiB29_DGH)NB`Jsom8KvX zRHA}tP^k){K_x4Q29>TL8dSo9XizB&qCq7shz6CmAR1KSf@n~w3!*_KFPMJ!3~WEB z1P1Xzr7(yFmBb(#R2qY5P>BqpL8UT?29?Yp8dN%iXiy0aqCurJhz6C^AR1I!gJ@8R z4WdD%Hi!n5++g~<0XRNDB{+x=D#bxGs3Zr`pwb*fgGzJ|4Jy?^G^k_;(V)^DM1x9r z5DhBjK{TkO2hpI?9z=smd=L#P^+7bKFY5*|(VmjD8pqc>02h|238dM{I zXi%*HqCqtShz8XTAR1IdfM`%H0ir=Q1&9XK79bi_V}NK-tpTDzH3x_W)gB-kRD*!& z50Aj{0jfzrd{AuyqCqtZhz8XvAR1J&fM`(d0-`}R42TBRG9VgM(=akKAs`DY3o8o~ zGl*nmVTI9PQK%S{&BjiD2&-ziw=l3UFvut{a)7HEUKj}xfslLx47{KUCkU<5VSv{< g42+Ci&aNT4hM+o0$JbcTRL?-i*U$h&>lcg-GH{`N_*+AHzE z`nFzz%`(#j+uZ^Qc5UJb_Om`EIHdkeaBSgw;N*Hc!8!TE0~gi339inU9=Ng2PjFY> z^1%Jw?gySR%+nrto}2r?>v6>c?{)PLe9kN`@a@b0Q2+n`e?}%|2xMV}LN<0bb`EwX z7#APS#?Hbrc|MbjD+31ugIfS24+DdR10x3mgO&jU3y5T7fr(f+FmU+zhA?Ow7&B-a zm@sG?m@+UhGB7Yg0EjtJM@|qFOCSu7sg2PrOr9Vf)f^j26~}^{#K6G7Wut9iVyA1u F1pvwgl8OKT diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/San_Marino b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/San_Marino index ac4c16342b5bbfa4c58a26f57db33b95f5b3e533..639ca3be4062496b10a8dee26be3733cf457fbdd 100644 GIT binary patch delta 193 zcmca8vYCB?xC{dtU}Rum0AY~u1aUzS1;gPC3=AxrpE2)YN@iqcq6K7N;NAkVje83N k%VZ8NSs5;8*AQJpXV>5m9baQTQ#}J6Uqb^Bt#8Z)0N$DpQ~&?~ literal 2641 zcmWHE%1kq2zyRzF3=AL)l2{34^ENOrFwD02Q84@JnFn)@p8ha*J43>}&VL2-7sxzV zkg)W_!n(Byi(!3VyszaRL|{w)wFktz^ed%r*^_)mebuZw_)@vjM@%C9Gg z3E!C@&U|))_~(5SBp$DyAbEMg1gXOlCrIzvDIgV&}%t8LBC|r1cQ{d6AWW-3K$h_5iqvhEnpHfO~6!ku7H_Qg@D=LdI1aRDHAO2 zCJI>oE}LMr*IB^&cEkjmW$_bicUw)cYjd1nKU-#kLz?mg#}-QgCpXp!&MDFYE~?Kb zxH|t8aAQ3=!Cm>jfcv{=0-nqV1w7B45b%1uSipPTDgmD}`zQGJ^$7T_SvbKzFHaz# zr+GqPc-MrWoYV=y<~b8WeB395iu+9n)6tv|_T6AYgs7W9#C4$wkzX|gqPBgR5Pg+P zAZCG}K&ci6G(`^Dv((FYC@9zc7f#BGZRweX9}d+uA7j?v2{Ya?1TyF zFQ!k(_**m~^F-x@th*r-vR6b;$T?OhklSH9A#Yi*Kz@e&gn~9xfxr z1(?2h1nhoLsR81HN)8YWDm_3ns00Dg;8Fy{0F@-5&^fy41Be2ZC?FbCs(@%v$pWH5 zr3;7#l`tS0RLX#8P)P%#L8T3tejN@r2UO~S_@I&pM1x8nFuhtDEDtJ$KzvY11foHu z5r_trNFW+iDuHNF$poT7r4xt-l~5oWR7!zpP)P-%L8TR#{=9Djhz6BfAR1J1foM?a z1)@PE7>EXyVjvn+l7VPYX$GP}B^rnZm1-awRI-6+Q0WGuK_wiB29_DGH)NB`Jsom8KvX zRHA}tP^k){K_x4Q29>TL8dSo9XizB&qCq7shz6CmAR1KSf@n~w3!*_KFPMJ!3~WEB z1P1Xzr7(yFmBb(#R2qY5P>BqpL8UT?29?Yp8dN%iXiy0aqCurJhz6C^AR1I!gJ@8R z4WdD%Hi!n5++g~<0XRNDB{+x=D#bxGs3Zr`pwb*fgGzJ|4Jy?^G^k_;(V)^DM1x9r z5DhBjK{TkO2hpI?9z=smd=L#P^+7bKFY5*|(VmjD8pqc>02h|238dM{I zXi%*HqCqtShz8XTAR1IdfM`%H0ir=Q1&9XK79bi_V}NK-tpTDzH3x_W)gB-kRD*!& z50Aj{0jfzrd{AuyqCqtZhz8XvAR1J&fM`(d0-`}R42TBRG9VgM(=akKAs`DY3o8o~ zGl*nmVTI9PQK%S{&BjiD2&-ziw=l3UFvut{a)7HEUKj}xfslLx47{KUCkU<5VSv{< g42+Ci&aNT4hM+o0$JbcTRL?-i*U$h&>luG literal 1920 zcmWHE%1kq2zyRzF3=AL)k|>9=c^eoQ7)~*nJ~;E-Tj1s!~~mV@e^!!TTQTQbDUs5TV{eon(_q47E1vqH`WQxDbfNis?R65I{y`L zV?8;+UHQI%`@3fXp3DaYJkOmF@Or#hz)0iQGbC;0aD2>7j8IKe+JPavSDc|u@# z*My*))Cs}nITJ#B+$V&J`%MVb(VP(W-C#n5sGC5{rccQD zTQni_MCF96yCD;@S42<9IaVl;+hIE)Z&|QFeun&nf;Llu!ay5=qBL=VVnaEB64##s zrGg9sW%{BM%04_2sNnlPq2j_3fy#F`Csb`%CQyBD_k^06hbGjnn>(Sda><1HzWND_ zEKJN`$jU}f$iN_M0ZL8~aeKr|@7fM`&j0nwm*1EN8B2SkJN4~PckArKA9M<5!Mmq0WqKY?ga zo&wRJdck@-T=7nc5SK!_OlrZ9Maee99v{QIJv$oa8CaB!A13SfvfX_4{oe$3*40teQ6ej4=Zb1A|)tBL@S6g##lG1A~?U0}F`Fz~kc^!k}$n%%E*x%Ajpv!oa}D uz`zIs6SWisL2&}Y@Oar6&BEjf;!(|Mu4Fh3{g7>fxC{dtU}Rum0AY~u1aUzS1;gG93=Eu`Q<>tKJXl#+Sy-9bFd!2<2tvfc qOb{0*=3t)8!>Yz-;lL=#z@TNoD9gZL;V}6(qY68hZ?LznF&6-5t_$n{ delta 689 zcmaFJww8N>cs)M@0|N*%FfcH9L)l6V3=9mbB$p^`T_Txqnx*%`ndjaDXIF|(IJd}I z;QS;Lf%Ee%9*C+hzaS=Y$3dLqc7XUV{sR)P_%2A^c6N|DGx>t_o&_Id)=c~$JE!S` zTu<=_`I?ju3OS)46l2^zDEXLwP`1(dprRxBK~<)n>w{Xa-UrPqZxXbQoDb06axOt< z$;JTPDH{@W4;{Op*V5{sU(ym_kdp3T7`xztQPDC6W82*VCPC8#Ol9W^m>E?FnEkC6 zu#lcI!QyVBfaUM9308ZZ1*~sJOt4uNKf!jl)dagX#|iecWhOYJDNk^0u@rD}W1Zlf zA}!#e`h0?Gz4KoIH`bFA+?DSOxW9WQ;K_VY!1LS*0k6l41-#d-67V^*e}ZpckAUBr zg%kYq@&p2UnkNK?cTEV&Nu3aE9@h}!Bb&g;#LULR%EHRb4uKq;aLB|3f*^5D4sISS zkRL^mmt!&$vzn2N0;326gM|a5Bm;w%0Rs<$%_s{J0g*Ba3>+YFkgS%$WHV+J8Bi25 zGBPkQGJ+9^3&o6#6AdK=LD3AtAVF|cZ;Xy-@*vyk)N{Ei$VIqZ&cMLs8|uG literal 1920 zcmWHE%1kq2zyRzF3=AL)k|>9=c^eoQ7)~*nJ~;E-Tj1s!~~mV@e^!!TTQTQbDUs5TV{eon(_q47E1vqH`WQxDbfNis?R65I{y`L zV?8;+UHQI%`@3fXp3DaYJkOmF@Or#hz)0iQGbC;0aD2>7j8IKe+JPavSDc|u@# z*My*))Cs}nITJ#B+$V&J`%MVb(VP(W-C#n5sGC5{rccQD zTQni_MCF96yCD;@S42<9IaVl;+hIE)Z&|QFeun&nf;Llu!ay5=qBL=VVnaEB64##s zrGg9sW%{BM%04_2sNnlPq2j_3fy#F`Csb`%CQyBD_k^06hbGjnn>(Sda><1HzWND_ zEKJN`$jU}f$iN_M0ZL8~aeKr|@7fM`&j0nwm*1EN8B2SkJN4~PckArKA9M<5!Mmq0WqKY?ga zo&wRJdck@-T=7xGbs3qMS(sUvnOKQ|lc%z) NOuoo2HTgfg901)C3C#ci literal 2077 zcmWHE%1kq2zyO>K3=AL)lBk8U#TpnG7|uNR7C5_7e8Ra!&I0ErnFw5HQWdyZq@p00 z{60V^)c%36FZTrzQ^g0OI&UwC2_GmB=Q)2t{PTteiN^~YBri{DkUHGlAiZZjgUp%* z46<`3GRXBbG04{xGbrSwFet`^GAQ}DF(})ZGpOijFsRB%GN|!zF{rbeHmHB)O3--n zHbC>rn*^;R=L592oJ-JIvN1q+%7z5JmdOG7C6f{iQc431W7j<}DyqI4&%!D_Fwfc5Q&2{y~(C)n<`nqb%FIKh6l%mjxt z_qtUA zK4IU(%3!Gs7= zH-U)jLK7mtY6wJa`!XT=Dwjaa0zrY;EpG(k>OTv_PdO)$5Pwx5vG&!3B>U|G$+2f9 zq{z<{NVQ!zA&q0}gml>n6VhKypOEplXhPeRw2L!S{Va#f2jRmG5p&sM@eh zp!(eI2{khhO{iTrcS2p|k_q*F^%EGGn3=U7&&9yN0Ky=3bx^j{|NsC0hiyBj0-}o!Kb8Q|psWC*LD>OBgR%sO24xEn z4ayoI8k9XihJmsOhz4a75Dm&IAR3fiKr|@JfM`&*0nwnW1ExQ30OdReP!jI zgR&Bcmfo`-M1ivuhylu0AR3glKr|?OfoM<`1JR&t2BJY(4Mc;o8;AyFIS>uXb|4y* z^*}Tz`+@1NTnQi=lnp^NC@X?!P<8~-pezZZLD>>SgR&-w24znW4a%Y*8k9{zG$^Zr zXi#YlCP| z_6E_QEDoYU*&IZJvO0(cWp@w_%JLu@li0Q1%DWpdtW7gNgw#{q7mqeo%1$ z;)99=5Dh98Ks2am0MVf00Yrm}2oMb_CO|Z(r~uKR;sQj2iVP49DmFkgsOSLEpyC5W zgNhIk4Jt;!^ml^^AR1Jhfa&W(U_Pi=0r5da3y204FCZFJ#DHi}F$1DOMGc4s6*nLn zROEnYP_YA|K}8RU1{FUb8dL;GK73B(5#O&}UnJb`FX z5e1?_#T1AJ6;&V_R9t~*P>}_qLB$q`1{GZ(8dQ9NXiyObqCv$Nhz1p9AR1Jhf$0yA z!0`bp)%UMRLp^BP*De>LB$=2uB%)Ec0aV(V_{}tW@3dvHg+@! z6$i_5a8et>%01}}Q28dK04n$R1Q>WgB_5*yxbzbRu|eWm28^P}BB0XG6GsV%Rs=FI gGIF`PhUgl(x(0{n_!{e(>KW)8>-ZWPfLSJ701(^Tng9R* diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Stockholm b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Stockholm index f3e0c7f0f25f0a7290e56281c91190e3611498a7..dd3eb32278521a84d7821b573b0111089d27bc15 100644 GIT binary patch delta 143 zcmey$_mO#mxC{dtU}Rum0AY~u1aUzS1;eTg3=Axr?=a~w`Y|#w6NU^70&hTi`Q#W_ i7#R2j7&sUhWE2>Ae0)O~f?Y!xoWVFagkf?dy9@vsdJK~Q literal 1909 zcmWHE%1kq2zyPca3=AL)k|>9=c^eoQ7-q}$B+R~g>w~bbi-3snuL+{cuP2BJ-s!~~mV@e^!!TTQTQbDUs5TV{eon(_q47E1vqH`WQxDbfNis?R65I{y`L zV?8;+UHQI%`@3fXp3DaYJkOmF@Or#hz)0iQGbC;0aD2>7j8IKe+JPavSDc|u@# z*My*))Cs}nITJ#B+$V&J`%MVb(VP(W-C#n5sGC5{rccQD zTQni_MCF96yCD;@S42<9IaVl;+hIE)Z&|QFeun&nf;Llu!ay5=qBL=VVnaEB64##s zrGg9sW%{BM%04_2sNnlPq2j_3fy#F`Csb`%CQyBD_k^06hbGjnn>(Sda><1HzWND_ zOpMGd^oI-#0&hTRj8A}pg@Hjvfsq47f<%0LLl~T0K{z-Bq>7P|fq{XM5l5P3V_;wa zVUWrSC|mIV|Ns9(uFjtVqH98nlRz{m4TI^cw?2RrgVHjH2Bl{Z4NB7>8kDXCgKnfM`$}2hpH(4x&M69YllDJBS9Qc@Pas_aGXS_CYi#{ex&w9stpxd;p?Bc>zR& z@&kwlFSls7;$D1U(IuO?u3fbt2556UYb8kAo^G$_x2Xi&ZZ(V)BoqCxow zM1%4Whz8{&5Dm&pAR3gPKr|>%foM>^0@0wn1)@Ru3rzp57XZb09C=Y^YP(B3Fpu7m8LHQ9xgYqPZ2IWf-4a%D!8k9dlG$@aP zXiz={)9;>v?FZ#o5FeChK{P1ef@o0Q1<|1V3!*`J7(|2eF^C4`We^R@&mbCzV2q==d5MfM|VVE&xYav3&pl diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Tallinn b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Tallinn index b5acca3cf51e7f7b3176965748688ff41720246f..5321bbd46e7a035956ac16584b13b397e192b5fe 100644 GIT binary patch delta 141 zcmaDNu$Xm%xC{dtU}Rum0AY~u1aUzS1;Zu`3=ABbLz$N_nlLgmF*CBTGBGnTGqJLv lL3S3baPk^`L(o=N35&oS$SOaG~V%15x$m7sMp)IEZuH4iNvve?a0D-v!Cr&JI#% zCSQ==v*3fwnu#A|=QMqg>nZ*qUz74dAt&^MVvO4dB_Hz-$~GDwRCFXisLDt(sPS+y zsI!_jsDD*!(0D4|pm~*}LF>rR2JJ1c8g!Q2ZqS`_ra`Y|Z-aixx(0)k`3;7#rx}cj zmN6LHu4OO@>R>RH?PoAEst_>yTQ6WCJ!OK;viJ$MyR9bJwK-0(pDi=NAx(LLV~eGL zlN;*<=M-rH7uDwzT%G?4xUrs`;I4dM!2R7b0Z-x(CylX;GPU?hU^PCAGKJF7j#r-CP>1a*}`))8HLexzl;=0g; z$gdg#QQN*uh`!1t5VJr~Aa=_efw=n50`XJM2_(c{6-caoH6h7Z^*(;(a~j2sLMd;$!-Fj7W=L6Ct#%YZ=?CTroqCo_j0MVe#1EN702tpo|8hL75Fq|KdLYqCuGsM1wLOhz4ao5Dm(JAR3ejK{O~Mf@n}?1ks=j38F!n z5=4VCCWr=QP7n>spdcEQNkKFyqk?EqW(Cop3=5{es)5Q522jQY@j;mvM1wLghz4b1 z5Dm)6AR3gJK{O~sgJ@8u2GO954WdDr8$^RLIEV&iau5y5=pY)D*+DcY!-MI+^#ULo zl<`3{DD#78PyqmL1c(L| z6kz(@Gq8Q20t3Vc6&fHKRB(W3P~ichK?Mki1{ES88dQ*gXi#ASqCo`;hz1oZAR1J# zfM`(R0-`|$42T95G9VgM(17Xh1`|LusK5c!*M-1*P{9M@g9;xI4Jv>@G^h{)(V&6| zM1u+=5DhAjKs2aO0@0v?2}FYmClC!Ppg=UJkOI-5f(k@~3M&u|DzL!xi|JtdK?N6x z4=TJsG^hXr(V#*MM1u-45DhBKKs2a81JR&D4Mc+qHV_Re+(0y_fCJH>LJmZO3OW!C zD(pZssK5i$A0C0@161&V_@KfMM1u-I5Dh8>K{Ti!1ks?v5JZCtL=X)s6hZW8!3ZiJ mK_w$7G~k$#k;~OJMAryZg6jAh>zV2q=o{WE2=Ve0)O~oLxaUID}y`2Zsy*g;Nbt literal 2084 zcmWHE%1kq2zyPca3=AL)l4ympd8e&1$vBbQUU25Qx4_wz;uFs9csYSX!}0^id%FZK z)`|~Y7YZM6zw|HQ+2WDFdnx+^-xRF`{tbT$1WI@k1Si}p5DI>mAY5>uK*V}yf~d#N z0x{uD3F3xVKZyT1_dt?iN`d6<_ynml>pw{E*()HkW}SfSocRKBJre}vYZ?UIt)@l%wG#|uZweR{Z4ofG-7R1eG)=%%cCLV#QH6ln-+BQH=_wN| z?j{OY{w|wfwbxm|`gX(wn`QA6YwucIl*1|zJU9?X9Awg2L(LOoe=PPyjZ|{-6{c}Gy5m__Voz(tywt1KQB)p zpr?64V0hPrpq$hR!R9#=LVVmOgo^u32-DG=5cb_*LWHQBK*V*S36Wnl1fsTmnGk)I zOCV-}pg`=FHv)0>p9SKloD)chzbcSe`)Wdx{dR%m*fSGSJ0Wjbut0u>{DguwQ-Q)j8-b!Uae-n( zIe`+_p8})DNOTIRHe1ash}2!1JR(I2cki_4@84N&pZIDg{6^s3ZWK}Jp&zILjw@4Z_EV%;y&Xi diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Tiraspol b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Tiraspol index 5ee23fe0e59f044598675db44d53c20590b88934..6970b14c506c8119341052c2c142ac11b28a4917 100644 GIT binary patch delta 148 zcmca6^qF;nv={>tU}Rum0AU7($&Jjiyf7IX1_lPs&8wN8FxoIOu`r`UHdZ!PHV$@7 qh^BJ#TP6iDJ^=<%1_l`gMo9(+3kOCy1_mty2Bpcq%xaUZIAs9VpbaAc literal 2390 zcmWHE%1kq2zzPJQqP+|Z3?Q~z0|NuYyzKcr+c#X|*lG7UVdwif3A^t1ChR_6m$2u= z$_IOQ%zChIMfZdKGin|j=*WF=up;ikp$z{Aha(&w9Pu!GaMVKS!7&Zt2gfB?9-P=S zIpI`!ZNQo5-U4S=icdJV$XVe0Bol!PeiITz)t6roleps`&T%_H{1^WLiC26VByT%A zNS&E{L3+=E4>D^eevqBh^g*tt_=9{+$_Is<&<~0+ZXc9<%s(jGXnau7k^G=4!}URp z`}YSmXP*b^tfmd>U)35ko{BeUUU`$Cb>w`2_Lg%AI!iVN=uX*?pw}`vK)+;Cf`|S_qsU@K4&&I`1aK?_^p}T;GdVk5YSWF5Ex$55R?<%5NsaT5aMIm z5GwA_5T+yD5cXZEAwtxGA>ukqL*!Q}hNx}N8ltcKVTf74%n-Zf9z$IHQ-=5{2N)9K zk256J-f2j(U&)XhyRRWdzMCP{c0ofL$MS}B*`|i{7o80me^VMVPh>Y_-F0ioUg6u2 zb1a!5w?n@nZ<#AYeuiK}L7O^5VW1vEQ5q*hv7rD%iR){IQh`qlW%}$5Wgo6ERPeoQ zsJO6=q4M47hN=xS7^=^$ZK#>KrJ;6Re?wj6w1)b=!UjerR%RAd$i~Ue!Op?W1%W)g z2*}35%)-V>JIKHw%>hc(QePNY7#Jif7&sUhvKT+^BuoTmf{$+qgR^f4gOhIvgR5&WhzMbDb_Lhh$MFWTi6%Qa9R78MiP%#0bK}7|K1{D_|8dPL}Xi%{Mrk#BrfM`(h z0j9r#OF#xtF#_U)iV_eFDo#K&s7L|Ppkf6?gNhaq4JuwhG^mIH(V$`mM1zVN5DhAB zKs2bx0nwmh2SkI49uN&Ge!%qKLJ$QmhCmEZQ3Rqv#Sw@G6-gi(R4jpLP|*aULB$h@ z1{F~t8dOYyXi!lFqCv$Khz1o|AR1I`foM?C1)@R47l;NGVIUe*jDhKQH$W7)I0G?2 zMH+|(6>A_GRJ4I;Q1J$$K}8&h1{HH48dTJQXi#wnqCrI-hz1pVAR1KkfoM?i2ckhm zAczJPgJAl*5~xOE02PNIKB!0p(V$`xM1zV(5Dh9GK{Tj{1ks>k5=4WFN)QbyEDn3Cps0anopkfq6gNjlR4JuB-^ovfgdqBl1hz}}SK{Tj%1<{}) z7DR)JSr82>YC$xpxCPOmA{Ru1id_&5DtbXQsQ3lZpduJVgNk7g4JwL3G^jWR(;u#Y zC~&b1Vt|Tf5DhAxK{Tj{2GO8m8bpJNY7h-7u0b@Y$Oh4)#kMQB$R<#1bGf>P=o*2F Vc^zM4JySgc9bZEO5Up>_1prAKh}{4H diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Ulyanovsk b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Ulyanovsk index 7b61bdc522b5b7f4397fdb9246185f4d972f4b6c..bb842cb1f5087d422630f76f17c3a5eee6490a6b 100644 GIT binary patch delta 175 zcmey&`Ga+WxC{dtU}Rum0AY~u1aUzS1;b7Z3=Hg>#hFByoEVvz&>#yV3nMEVBZwl5 znHiZUS2N0JGx9JnXc;iFFfhm{FbMeghA?Ow7&B-am@;S^m@sG?7%_0!Xd9T=>6&l> E0Kwc0KL7v# delta 654 zcmeyt`k8Zrcs&mT0|N*%FfcGUL)jt=87v#NF5wOkRiAl4OyZn@ILBEB@n4J^BwjHb zki2bbAa$nofb^b84`kLfKaibM@<6U9^?`g%*aL+e_XmnG77vtsG#@D2NIg)|;eMbh z!}URp`}YTRR`mk)uM!0sPsJNFEA}^NUinp^b)^1vf%cX=1v*R47U)jdSD@FjzCgcZ zL4iTa!~(YOmS{ z>)SR3Hp`p~YaBPwJ;N<$Uz&ZKf2N%`T1+LByKDe>2EpS&p z^uhhz$q$}s%u7Cao?HFF>v7u$?{&Q&e9kN`@a@b05aJ`75cXZ9p#J~=|BTE`5Xiy` zg>39>>>QlzAc`<%VP|2Pypc&J5ERaC0gN0B3>FTIJPZt41`I49l97dhK}LZ=048qX zz`*0<8^WM%V9cOxV9KCvV8WnnV8p<{$iTn|1t2!VL>)OnP~3qqJpMLDi!gbEcvN(H WBGsJ^av%c(1DB1qfr*{22^Ro(K%4de diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Uzhgorod b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Uzhgorod index 66ae8d69e3f86cfdd8d90a9b1d094d807f75f27a..a5755685e390bd5ad54402ee61b1319e9a66296e 100644 GIT binary patch delta 175 zcmZn?n8Y$cT!sM+FfuSOfG|jSg18`vf?-t#1_t)cTFg3({)|ju$ij>P8Clt2kbyzu z1xPQS00RpHgNya;WBx(eM&pBuj^qbb8Lkg%y?P(izd9|@yz(YN>&W>4?JegLbe3!k z(4Dd&L9b*XB6Eezwd6hcx90jxCk~PHwCdoKvI)TvVS= zaCQDG;Kq7#g1hp40rz*$1U#7!3V5D7A>j3Rv4HowRRTU|_D}Hb>k;rG#0!3-!0>y@M z0wu0L1xf`O1j_V9CzO47Bv8TkeL}^BBLbE0ZceD$uuP!(-0lfAGY?IuT{m|^UFDJq z^?mgd7@3%vn3)(^Ss;*&9S#{eIKhyMn--9PLF5G}q45bYurM&lC@^v`FhJNA4vf4E z3|a;Zf-n*yBBQ_{3KC(IgpnW-AKwrLXIBso4q@;Oc46=h_GWN(4PkI~4Gv*oU|?iK zV32(v%*aSe4*387|NpFa8zew9C?|kuP;LOxpd10BLAe4%gK`Fl2IUSA4ay-P8$r1Q zM1yh)hz8{rF#U`F0Ehs4a#{S8kGA$G$;pxXizQ$(V(0N zqCvS4M1yi9hz8|K5Dm(iAR3fAK{P0bf@n}K1<|0K3a037e-_JeXhh!4vBAR1HxfM`%D0HQ%90f+{b1|S+#B7kU6sQ{uuB?E{Cl@1^p zR6>AgP$>bTK_vx<29*{d8dPF{>F)*;Ks2c20Mplnz!UX{8Pwhhh diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Vaduz b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Vaduz index ad6cf59281a1046d9dcd045fda521585e3e33e06..388df2969f2dc56738183bd4f0d5755c4533a797 100644 GIT binary patch delta 118 zcmey$_mO#mxC{dtU}Rum0AY~u1aUzS1;eTg3=Axr?=a~w8Zt675rzy59AK?%zZh61 M8?ehxj%1es03Q|z>Hq)$ literal 1909 zcmWHE%1kq2zyPca3=AL)k|>9=c^eoQ7*2_2F`Rl-$Z-0*55t*5!3?6xuP2BJ-s!~~mV@e^!!TTQTQbDUs5TV{eon(_q47E1vqH`WQxDbfNis?R65I{y`L zV?8;+UHQI%`@3fXp3DaYJkOmF@Or#hz)0iQGbC;0aD2>7j8IKe+JPavSDc|u@# z*My*))Cs}nITJ#B+$V&J`%MVb(VP(W-C#n5sGC5{rccQD zTQni_MCF96yCD;@S42<9IaVl;+hIE)Z&|QFeun&nf;Llu!ay5=qBL=VVnaEB64##s zrGg9sW%{BM%04_2sNnlPq2j_3fy#F`Csb`%CQyBD_k^06hbGjnn>(Sda><1HzWNDF zj7*G7%q;YV3=ABgB*q}4z{tYDz$d`K$$-T6@eN^cb`1s*As}Upj0_A6jEp$aEE@v@ z0|Q8kF}yG${XpXiy#m(V%ck@-T=75m9baQTQ#}J6Uqb^Bt#8Z)0N$DpQ~&?~ literal 2641 zcmWHE%1kq2zyRzF3=AL)l2{34^ENOrFwD02Q84@JnFn)@p8ha*J43>}&VL2-7sxzV zkg)W_!n(Byi(!3VyszaRL|{w)wFktz^ed%r*^_)mebuZw_)@vjM@%C9Gg z3E!C@&U|))_~(5SBp$DyAbEMg1gXOlCrIzvDIgV&}%t8LBC|r1cQ{d6AWW-3K$h_5iqvhEnpHfO~6!ku7H_Qg@D=LdI1aRDHAO2 zCJI>oE}LMr*IB^&cEkjmW$_bicUw)cYjd1nKU-#kLz?mg#}-QgCpXp!&MDFYE~?Kb zxH|t8aAQ3=!Cm>jfcv{=0-nqV1w7B45b%1uSipPTDgmD}`zQGJ^$7T_SvbKzFHaz# zr+GqPc-MrWoYV=y<~b8WeB395iu+9n)6tv|_T6AYgs7W9#C4$wkzX|gqPBgR5Pg+P zAZCG}K&ci6G(`^Dv((FYC@9zc7f#BGZRweX9}d+uA7j?v2{Ya?1TyF zFQ!k(_**m~^F-x@th*r-vR6b;$T?OhklSH9A#Yi*Kz@e&gn~9xfxr z1(?2h1nhoLsR81HN)8YWDm_3ns00Dg;8Fy{0F@-5&^fy41Be2ZC?FbCs(@%v$pWH5 zr3;7#l`tS0RLX#8P)P%#L8T3tejN@r2UO~S_@I&pM1x8nFuhtDEDtJ$KzvY11foHu z5r_trNFW+iDuHNF$poT7r4xt-l~5oWR7!zpP)P-%L8TR#{=9Djhz6BfAR1J1foM?a z1)@PE7>EXyVjvn+l7VPYX$GP}B^rnZm1-awRI-6+Q0WGuK_wiB29_DGH)NB`Jsom8KvX zRHA}tP^k){K_x4Q29>TL8dSo9XizB&qCq7shz6CmAR1KSf@n~w3!*_KFPMJ!3~WEB z1P1Xzr7(yFmBb(#R2qY5P>BqpL8UT?29?Yp8dN%iXiy0aqCurJhz6C^AR1I!gJ@8R z4WdD%Hi!n5++g~<0XRNDB{+x=D#bxGs3Zr`pwb*fgGzJ|4Jy?^G^k_;(V)^DM1x9r z5DhBjK{TkO2hpI?9z=smd=L#P^+7bKFY5*|(VmjD8pqc>02h|238dM{I zXi%*HqCqtShz8XTAR1IdfM`%H0ir=Q1&9XK79bi_V}NK-tpTDzH3x_W)gB-kRD*!& z50Aj{0jfzrd{AuyqCqtZhz8XvAR1J&fM`(d0-`}R42TBRG9VgM(=akKAs`DY3o8o~ zGl*nmVTI9PQK%S{&BjiD2&-ziw=l3UFvut{a)7HEUKj}xfslLx47{KUCkU<5VSv{< g42+Ci&aNT4hM+o0$JbcTRL?-i*U$h&>l%*Lz>n6-yvUS3|of9U^Z<#(} zQGt}eVwdO%CpZfyoO$joaCW8mgma6W1PUICdk>jY%y%omXBnIIrv(jQzW1mlPsX*6C$8&<0_z{VO4XHtH}h7r>YY)uZm63I?6sld&`drI!j(o(4BH?f?mt%3Hl{_CK#lwonRPyQ^2Tb zi-581ZUK{^X#%FQa|O(dDg?~_)(cojPnlqGH&MXyci9B1z0LyGw<9LlEQ_CDyW47l zU7OD~~6Yyj{DByYS zgn-xM#RA^zRtfl=*+0RzuSdXd&B6)(d3gc>J3ltm536!}06etyB5Gd0Zoly4Skw69C_X!mj zjtEq~yE&n1!!m*DbGs+h%se!qcHP_wb(Kpd)c4g-U}9uqX2FDvOss75h71h+fuM9O zqrk|*z`!TKz{$XXo$ccr!r<&03?f26Iv5!l89_7yBO@vKw{=eegV^0 zZ+!sKpnLuXcOV*+_dql#|AA;w9t3$6ln+5PC@+F&P<{l_pgakp zLHQC)f8I9%M1%4thz8|R5Dm(wAR3fcK{P18f@n~l1<{~<3!*`J7es^dFNg-^VGs?< z#~>P%mq9crKZ9sco(9pNd<~*Oc^gcBH37Q=l*d7QP(BCIpu7&ELHQj-gYrCx2IYGY z4a)l<8kGM*G^h*!(V%hwM1#r#5Dh91Ks2aK0MVdw0Yrn!1~C1%UI0Xc$_OxhHxbMS zl@%a9sJsBtpfUqQgUSsM4Jtc8G^qRl(V#K}M1#r^5Dh9zKs2a40nwl`1w@0&6%Y+7 zTR=3Zd;!s*G6qb)dj_^2RMvp_pz;PpgUTEb4Jvm)G^p$W(V+4NM1#s85DhAaKs2Z< z0@0xI2trh#Zsxdx&^WgCbFm2V&#RK|g5P&o&pL1i77 zelZ>F9#EMF;)BXP5DhB(Ks2cQ1JR%|5JZE@K@bfp3qdrfJOt68G7&_B%0&$v1ks?f6GVf`PY?|%LqRmC90k#!vJ^yv j%2N~dTF?k-l8kdX$qXYwkg#)APV=q$P2pgZMEgI>$t2K|zC4F)Om8w_JlGZ+;uV=%T| z%U}}J!C)#oSHR4uLcr{Ay?}-ElnHiijuY%>%S>=cQ=Z`1VkzL{#yY_{MOwf`_4x!> z=f47OtS2Y9E8iDzfA>tlllh>4=eZLCUXK?Gc&}R};B#jG1mC_M0lzg1C-~>(2?X>s zPY4X}nh=zeIw9CRXF`aN`-D(&zX@SFniIml8%&50brXoVE;J$XtA;?-wl5Q+uW|{* zED#ik-SS2tuKu$?{FHM73Gr725^G;gNV4B9kQ{qvLW=xMfmGXd6Vf=gPDq!XFd_ZL z^a&Y%izZ~AsGN{>H)KNgis%VB#|i~2#f>?k&<)%|Ns9#Y}*+Z z5Dm&fAR3g5Kr|>PfoM=}0@0ux1)@Q@3Pgi)7KjGrE)WgMVIUfm%Rn?Jr-9rB%55MT zl;c1&DA$4MU;GC^G${9hXiyFW(V$!iqCq(kM1yi8hz8|I5Dm(eAR3f2K{P0Lf@n|< z1<{~f3Zg+d6-0w_D~JZ=SP%`$wICXlbHVgiZ~?*q%E2H$C>MihP)-KXpxg|iK{*;k zgK{;92IXuJ4a(gh8kEC9G$@yYXi!cE(V*N8qCq(xM1yiYhz8|+F#We)07QdI01yo- z1wb^YBmmK%(f~w*N(2xMDiuI9sAK@qpwav%?FhjAU>$n z0MVe514M&L4-gG1K|nO96amqok_1G9N)r$bDp5c*s8j*bpppedgGv_=4Ju(kG^msT z(V&tBOn*0+0HQ%94w$|!1m=TE9uOZ?`haLq2?U}+r4Wb)l|&#KR2qS3P>BShL8TIi z29-=88dN%gXiy0SqCuq;hz6BZAR1I!foM>P1*Tt22ip%Sxj=kS=>?)eB^ZbXm0}{{2pk`v zk`KfOm3|-^R04u%P$>waK_wxG29<^&8dM^JXi%vLqDMyv8~~T7m%yFfuSOfG|jCf;2CP0$~RR1_sv6FBn;v92l9HQ6LK=2r_{P!kCGX lX>uW>j5H&Mk8cQrwt+E&wt)$Qwt*=FmyNc8iJh(q7XbRy3l0DP delta 566 zcmcb{+RHgXx}K8(0vs6_7(i@+gjCLKlOD*dX?`F(r{sZLPwE5tny?27IqnY>V=Nvh`Di{+w$b>Yq9gf1Rfg+> z8u#xH>a6Mo>R%-aG_Sl#&^q$EKzqxb0-Ysi3v{Q{?<>%2Szn-EvY@~qWnzJ0?4A!s zMbkeR+s^x75>)xYRJP%RnNjoyv%g6nETk(6Ebh8|u>2iWV6|86gY|8j0-I&d1-858 z3hdfc3+!hz6gZ@@7dW=ad~kAoS>T-f?}Ll#=>k{h2Or#6*A}=dANt__?&Jqg<|Q9I z&#nI8^|ZF28UAq%5 zC;czD;;lU4YTR0ZYnodGuIoq%+~AxhaFglagqtrb1YU$(VtDa!OT){DOB-HYoYwG0 zWE#VpU7H!+u3EzIZq`(W_gA7AK2()6eB5Hg@F^;i;qw$ZhA&pu3}0)l8oo)%GVm@5 zZQ$$XVc>5uZxATaXb?=1Y!C|JY7q7{V-PWZ(;%vRw?Rz!T!T3C{s!^S8yX}YFKm#! zJgGtIaC3w7p7jheYZfrb&Y8#{*VDuxUsKGWkdwlo7!%5%u1&gwit{j13Yji;&;G_Q(H&^pRKL3_)O2|7z&PSBllYl2?O=?VHJdnOp9tes#O zdsD!uXp4Zc?QQ{+plJf8vU3H@j4A}o{?-dvNKctyaW_%G@^{$;tG&(w*0&=j*er{m zV7uFDf?b>A1pC=C6CBc%CpflP3OKp3PH;|<7I0C0KEc)buYeot$qDYt_XXVFJrnR` zJ}BUM?u3BXsAT)oY_CYx35RQZ_UC9{&{%<0X@wV0>ir|1m&bo2sY1|5aQ!L zAynLNLYR)`gs|@h6Cy<21R|~rO^E!eArQ6g%Y^8wTmmr*1O;NZyb*}2|11zc<(xo5 z{8fR(+E){j?6(Uf$DWyxB0p0g)pp&4G>)wk(q$)1NPjVXLdM^s37ID7mf&2zPmZ0YQr*t>T|m%)XY3Ip?2Ne33ZiACe-)UPhezbVrF4w;b3EDW@2Sw zWr1)(EFv){7wsVfgYX7WP7>b0z{0>Fqrk|)z`!TKz>CV(GGG)0i7<#ENSI0=-w=jy z-w+08*I*D4!r%&GxVnabjAdYCWMpJuWCXK81S2CU+4}$g|Nq0bT?hctpzIBzL0KG3 zU%mAKM1!(Ahz4bM5Dm)mAR3hIK{P1qgJ@9p2hpG+07Qd|0T2x;3P3cdH~`V0A^}8$ ziUkl2DjGmEsCWR;pdtc9gNg|d4Js-?G^n@$(V!v&M1zVA5Dh9iKs2cM0Mjok1VA*X z7y;8Cw={rgP;mmHK}8CP1{Et{de>$K5Dh9`Ks2a`0nwmh21J938W0UCZa_4s$N|xy zVh2QniXIRRDt}04W&jmiAU>$*0@0x23q(urSr4MX#TbYID#}1Ks5k@Bpdt-K zgNii}4Jz6|G^lt3(V!v@M1zVs5DhBoKs2bh1JR%&4@`eGnE;|eMIVR;6@MTaR0M)( zP%#LiK}8{m1{H@O8dM~LXi%{TqCrI?hz1ppAR1Ief@n}N38FzoC5Q$UmmnHcWP<6x z^#ULoRCI#ryNO^vs0an|LB%MD1{I|s8dRKuXi$*~qCv$fhz1p{AR1J>f@n|?3!*{A zEQkgbwICW)+=6IOkqe?h#V&{j6}@2k-7~QLpduK=2NlC08dMa6Xi#wsqCrJ6hz1qQ zAR1IOgJ@9k45C3rG>8Tj(;ymDRD)zpihB?ZD)K=zsMrV5 zprRi{gNlC;4XOgb^o!|W_kgMb5Fb<>fM`&a0HQ(F0*D4x4Imm+J%DIX6#=3_)dYwJ zRTUr_R9%2*P?Z6qLDdF`22~v(8dQCNXiyabrawFa#|Nk?0r5fA35W(&DIgkDt$=7y z)dHeH)eDFQRWTsCu5t<3{i9V4&Z>sX*)>Gh5L7Yg_!{e(>KW+x8XACTePb>FJa`E$ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Zagreb b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Zagreb index 27de456f16ab549627b284a39e2265cbdb4ad8e9..a1bf9281ed1bc2c9b82ee64efdca60b4af762ede 100644 GIT binary patch delta 156 zcmZqRzsEd5T!sM+FfuSOfG|jSg18`vf?*W~1_tKMZuG literal 1920 zcmWHE%1kq2zyRzF3=AL)k|>9=c^eoQ7)~*nJ~;E-Tj1s!~~mV@e^!!TTQTQbDUs5TV{eon(_q47E1vqH`WQxDbfNis?R65I{y`L zV?8;+UHQI%`@3fXp3DaYJkOmF@Or#hz)0iQGbC;0aD2>7j8IKe+JPavSDc|u@# z*My*))Cs}nITJ#B+$V&J`%MVb(VP(W-C#n5sGC5{rccQD zTQni_MCF96yCD;@S42<9IaVl;+hIE)Z&|QFeun&nf;Llu!ay5=qBL=VVnaEB64##s zrGg9sW%{BM%04_2sNnlPq2j_3fy#F`Csb`%CQyBD_k^06hbGjnn>(Sda><1HzWND_ zEKJN`$jU}f$iN_M0ZL8~aeKr|@7fM`&j0nwm*1EN8B2SkJN4~PckArKA9M<5!Mmq0WqKY?ga zo&wRJdck@-T=7x=7*Ma}}} z_FgLxRbPHVOyZ7%ILGY(@n8H0Bwq1dki6~eAa!Q)1?fEtKFF+@_(66~(+9bp;t%pQ zDIXMaLO&?RxP4IaG5?@!qwzsSNAiQJ4A%!W?%yBOS=9^Fze*HnJb4?SdF4%l){*l8 z+FQ;g=q%Y7pgUzlf?mty0R56Z6AV(;PB4tUDPUBzMZnm0w}45|GyzlDxdLWJ6#`~| z>jf;Nr%bT8nu7-EB3&uFY|R{cM>D4r$6099t{}oZMI^ zIHyPpxTrp#;OhKWz>W3f1b5~80`Bjg33xIe6!1KELcr_sVgc`Us|0+`?4RJ<*CXJ! zX5j??ygY$`p5_UG;awAga#AM*o99dj@o}FJD(*KSOh>pDB=PyKX`n z$JPnyvJ)nxznDHD<8RS~%oCLpvhIdV$X*dWA?H}3KyHWaguG?J0{I#86AIc)1quUg z1d7tc1&R&j1WH_g3X}>m2$boIPAL2ENT7o6`-F-MM+7S0-JDRhVVOYnx!n_LW*(YQ zyKe4;y2>RJ>ig;^FfuW-v9Pi*vqK;UClcghft{?`;HbzDU21Z5@0`VZ2k&%>~@&Et-|6$t>bAV`24gt}iTmqs&IR!+6 zatnwCnEu6o07Qdw6Nm=oC=d%m?Lc5FeDgK{P0bgJ@7L2hpIM4x&N19Ylk2 zJctJ6dJqlD`5+pU`$06Q1OU;XQUFAQN&*lKDh)t1s6+tM@1B9}2bByUKB#m6(V!9n zM1x8R5Dh9RKs2bd0MVcl14M&L4G;|~IY2b1^Z?PI5(GqpN)ZqZDoH>zs5Al5pb`a4 ze>a!_qCq7Kn7%Fq=7UNY5Fb>^fM`%j1EN8t4TuJnI3OBS>VRla$pfN6r4NV(l|UdG zR0@G;P)P)$L8TFh29-!48dNHQXi&)nre914+Yc(CKzvXs1)@PE6^I6vRv;QwVu5H- zsRg1zB^QVWm0lnkRDywMP$>qYK_wZ829;(Y8dRczXi%vJqCq7anEvnx93P+(4#WqQ zav&O1(t&7DX$PV~B_4-~MXaHuJZ~*`@`uA`E diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Zurich b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Zurich index ad6cf59281a1046d9dcd045fda521585e3e33e06..388df2969f2dc56738183bd4f0d5755c4533a797 100644 GIT binary patch delta 118 zcmey$_mO#mxC{dtU}Rum0AY~u1aUzS1;eTg3=Axr?=a~w8Zt675rzy59AK?%zZh61 M8?ehxj%1es03Q|z>Hq)$ literal 1909 zcmWHE%1kq2zyPca3=AL)k|>9=c^eoQ7*2_2F`Rl-$Z-0*55t*5!3?6xuP2BJ-s!~~mV@e^!!TTQTQbDUs5TV{eon(_q47E1vqH`WQxDbfNis?R65I{y`L zV?8;+UHQI%`@3fXp3DaYJkOmF@Or#hz)0iQGbC;0aD2>7j8IKe+JPavSDc|u@# z*My*))Cs}nITJ#B+$V&J`%MVb(VP(W-C#n5sGC5{rccQD zTQni_MCF96yCD;@S42<9IaVl;+hIE)Z&|QFeun&nf;Llu!ay5=qBL=VVnaEB64##s zrGg9sW%{BM%04_2sNnlPq2j_3fy#F`Csb`%CQyBD_k^06hbGjnn>(Sda><1HzWNDF zj7*G7%q;YV3=ABgB*q}4z{tYDz$d`K$$-T6@eN^cb`1s*As}Upj0_A6jEp$aEE@v@ z0|Q8kF}yG${XpXiy#m(V%ck@-T=7x}jvGV>0{|Y;1Xut7 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/GB b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/GB index ac02a81440f47a67b9f01d3fbcdb085266d20894..323cd3818ac6f77b4394982ea5a342b9ed262777 100644 GIT binary patch delta 128 zcmX>gv!7>zxC{dtU}Rum0AY~u1aUzS1;g_h7#LVLhqL}+nf#GQXR-hb+hkc@YdHHZ tubj4zZwP}^a0r7th;|7MVc>H24KZ*E4$<*7)-%;J&^OfaH8cRRxB$U<7SI3y delta 2113 zcmdnbb3kT-cs)A<0|N*%FfcHDg0cl07#J94tF2uy`x>jlobv_?<}NwBVBVa$3+7Lk zTCkvXm%_rbKMNM6&QVxgePY29za0yf+W%HqrkbFzT>Y5B3N0Ol6|a9RSjBL8!K$mG z3aej!P*`(3M`7*BOA70j`zfqnP`O}3yMe;SNf#DuDya8au(@c{f-M1h3$}VjDQq(k zSg_rwY{3rxPYZSmMJ(9){>p+~FBuee-}tDo=XSWl-W`_}_HF#PVE>G*3I}FOD;%tt zu5hU8ufpMoN`)hVOBNiph*mgebx`4W#I*&-Z*eX-C8jpv)bz*+r!UG)I8$yt;p|3+ z3Fi_b1kO)*G~q&C+=PquMPdRMe;Wy0%KWErIazbT70(9>SLGBJTy^?8;p+Vd0@wW3 zC|vu;yx@jjpTdowQx$IU6)4<#{YK&TQ}G3NPM=e_d*tVWds|*DxW7(J;lY$M3mz7E zEO?Y%qVPCKYr&I{2@9SY@ho^|yH?@3w5Gxfk&p#1ese3l{9CB->egF@*LQ;z>fh`- zukd#BuLbXBZB%&Qn7-h{{91*NiJl8S)yFG*_DWOu67Q(+RgrhWH+yA;?+ou3{E%l= z`0?Q4f}j7MEBrdJdBN`&%nSZhuU_!?`0fJcf@2CSnh^@D0V@>PIIR@e4Z0NAU&<(O z3gjqop7^K0^}$bpdy~`xo(l#Fyc7Q{;M*WnufSh;Z-Kx}y#<1S2Nnob3M>#dT(m$W z;?n|A<<}F$ERIbOXFfYYLSn@PiO1_FNdD-WAa!`+1nGy%1!UH&6OcXFDInJ~K|p?C zwtzxTk$_^OuYi(Ih=6jUzJQ93nSiR7_XIT_2?2F2-3jVnO(tk^@lVjaDmFpu<;Mxy zTYgN?Iaz;sg6@=C6ZBSYouFT`XM#cJ^a+NsHwBD}wg?#8?iMf!nkHZ>J6FKWs6xQ( zZ@qwp^ppt}cM}CHf0s?L+UqP}eLG@;&9e9jw!5t+*tI!Mu%9h6!68j~f@6!NfRh{R z1m_fK0Ts{GXYQLg94uCP6&9_KVB^0y>69&&zb!beEWI? z{MIa-;GdT#5YW>+AuzmaLQqcXgkbZW2_Zi26GFxPCWPr|P6+#MFd;(JO(5dB(1ggZ z8Uj((L7S;S zVW5pbQJT0wv7wwmiR({+Qb7iRGJVkrWgi|1RPcSDP;udiK;^re6RI{W6R1A7dqU03 zLlbJ(&7DwJxnx3pU;Tv1iL4rvAFy&w?qs#DXJceShpcS$gHWp`e`A%?W?;O=51o1&h z5=47FUJMoorA!bXlsZ8)D20M(P$~t{{(1FzV1=OM3K9S%Sr83MwjdgmbU`#I`GROr z5(d$rWDKUi8-P6kO3olYC`p58P_hQmprj3=LCG6LgOWIi1|@S49amrf8SDU1dIt%B z(maR;rF#$!O8X!hl>R|9C=Y;WP(A?Bpu7O0LHPkpznBho5GY%K_@Jx-qCwdMM1!&j zhz4a75M2+-DC_jPe50Ahe z0_7_ZAC$L1G$?<8Xiy#l(V%?Bz`!8O0LpA20Z@hm(V$ERq6cxtb0s0;ak=}37&rxo U==d7znd%wn8|wHP8h}__01kb6FaQ7m diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/GB-Eire b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/GB-Eire index ac02a81440f47a67b9f01d3fbcdb085266d20894..323cd3818ac6f77b4394982ea5a342b9ed262777 100644 GIT binary patch delta 128 zcmX>gv!7>zxC{dtU}Rum0AY~u1aUzS1;g_h7#LVLhqL}+nf#GQXR-hb+hkc@YdHHZ tubj4zZwP}^a0r7th;|7MVc>H24KZ*E4$<*7)-%;J&^OfaH8cRRxB$U<7SI3y delta 2113 zcmdnbb3kT-cs)A<0|N*%FfcHDg0cl07#J94tF2uy`x>jlobv_?<}NwBVBVa$3+7Lk zTCkvXm%_rbKMNM6&QVxgePY29za0yf+W%HqrkbFzT>Y5B3N0Ol6|a9RSjBL8!K$mG z3aej!P*`(3M`7*BOA70j`zfqnP`O}3yMe;SNf#DuDya8au(@c{f-M1h3$}VjDQq(k zSg_rwY{3rxPYZSmMJ(9){>p+~FBuee-}tDo=XSWl-W`_}_HF#PVE>G*3I}FOD;%tt zu5hU8ufpMoN`)hVOBNiph*mgebx`4W#I*&-Z*eX-C8jpv)bz*+r!UG)I8$yt;p|3+ z3Fi_b1kO)*G~q&C+=PquMPdRMe;Wy0%KWErIazbT70(9>SLGBJTy^?8;p+Vd0@wW3 zC|vu;yx@jjpTdowQx$IU6)4<#{YK&TQ}G3NPM=e_d*tVWds|*DxW7(J;lY$M3mz7E zEO?Y%qVPCKYr&I{2@9SY@ho^|yH?@3w5Gxfk&p#1ese3l{9CB->egF@*LQ;z>fh`- zukd#BuLbXBZB%&Qn7-h{{91*NiJl8S)yFG*_DWOu67Q(+RgrhWH+yA;?+ou3{E%l= z`0?Q4f}j7MEBrdJdBN`&%nSZhuU_!?`0fJcf@2CSnh^@D0V@>PIIR@e4Z0NAU&<(O z3gjqop7^K0^}$bpdy~`xo(l#Fyc7Q{;M*WnufSh;Z-Kx}y#<1S2Nnob3M>#dT(m$W z;?n|A<<}F$ERIbOXFfYYLSn@PiO1_FNdD-WAa!`+1nGy%1!UH&6OcXFDInJ~K|p?C zwtzxTk$_^OuYi(Ih=6jUzJQ93nSiR7_XIT_2?2F2-3jVnO(tk^@lVjaDmFpu<;Mxy zTYgN?Iaz;sg6@=C6ZBSYouFT`XM#cJ^a+NsHwBD}wg?#8?iMf!nkHZ>J6FKWs6xQ( zZ@qwp^ppt}cM}CHf0s?L+UqP}eLG@;&9e9jw!5t+*tI!Mu%9h6!68j~f@6!NfRh{R z1m_fK0Ts{GXYQLg94uCP6&9_KVB^0y>69&&zb!beEWI? z{MIa-;GdT#5YW>+AuzmaLQqcXgkbZW2_Zi26GFxPCWPr|P6+#MFd;(JO(5dB(1ggZ z8Uj((L7S;S zVW5pbQJT0wv7wwmiR({+Qb7iRGJVkrWgi|1RPcSDP;udiK;^re6RI{W6R1A7dqU03 zLlbJ(&7DwJxnx3pU;Tv1iL4rvAFy&w?qs#DXJceShpcS$gHWp`e`A%?W?;O=51o1&h z5=47FUJMoorA!bXlsZ8)D20M(P$~t{{(1FzV1=OM3K9S%Sr83MwjdgmbU`#I`GROr z5(d$rWDKUi8-P6kO3olYC`p58P_hQmprj3=LCG6LgOWIi1|@S49amrf8SDU1dIt%B z(maR;rF#$!O8X!hl>R|9C=Y;WP(A?Bpu7O0LHPkpznBho5GY%K_@Jx-qCwdMM1!&j zhz4a75M2+-DC_jPe50Ahe z0_7_ZAC$L1G$?<8Xiy#l(V%?Bz`!8O0LpA20Z@hm(V$ERq6cxtb0s0;ak=}37&rxo U==d7znd%wn8|wHP8h}__01kb6FaQ7m diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/GMT b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/GMT index c63474664a289aa3c3c0d8b2ce06d484679754c0..157573b1d340e0f57a0dd4d9698bd3798cbf7136 100644 GIT binary patch delta 22 YcmXTQpP0stPN1X2J1 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/GMT+0 b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/GMT+0 index c63474664a289aa3c3c0d8b2ce06d484679754c0..157573b1d340e0f57a0dd4d9698bd3798cbf7136 100644 GIT binary patch delta 22 YcmXTQpP0stPN1X2J1 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/GMT-0 b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/GMT-0 index c63474664a289aa3c3c0d8b2ce06d484679754c0..157573b1d340e0f57a0dd4d9698bd3798cbf7136 100644 GIT binary patch delta 22 YcmXTQpP0stPN1X2J1 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/GMT0 b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/GMT0 index c63474664a289aa3c3c0d8b2ce06d484679754c0..157573b1d340e0f57a0dd4d9698bd3798cbf7136 100644 GIT binary patch delta 22 YcmXTQpP0stPN1X2J1 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Greenwich b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Greenwich index c63474664a289aa3c3c0d8b2ce06d484679754c0..157573b1d340e0f57a0dd4d9698bd3798cbf7136 100644 GIT binary patch delta 22 YcmXTQpP0stPN1X2J1 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/HST b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/HST index cccd45eb8cb2f56b6a1b75e2d7b9530cb5abf2e1..160a53e045c872be729de80a522bb8b6f6ddee91 100644 GIT binary patch delta 23 ZcmXRen4rzU$N&Ko%-Fd+f0RSGk1XTb4 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Hongkong b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Hongkong index 23d0375fba3377a3d513d849c0d29c82ad2add64..c80e364801be87687625f72e8e2c3dbd0f7ae4bc 100644 GIT binary patch delta 73 zcmdnY+0HgWdh!EC_Q?+zS$P;47#Kj9fq{VmBFx6%%D}+Dy7>#E5!2)(M&-%*jAE1X X8QCVcGRjR}&nU*u<>4KoYrzEoW&c*HcyU%gOzjY2f{?Aih!O*9)gRzcv1ydf& z4(8bBD_DG=?O=6h(O|POXSQHhd#1tOY-_>Ec0z;m+i?r7XR9>0udTG;Io6{gINQ=f zC_iTfBNHW nUcn)d5N2eYAk7O3Vh|S`+#92fn0T?8X+X4@Tpr#bx)xjj0OYQW diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Iceland b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Iceland index 10e0fc8190a401f67b861ced3b8b16401432a565..2451aca76d7c555b06d358c2e30799c9b599fd1e 100644 GIT binary patch delta 135 zcmeC;{Kz^%dh!KERuJZ6U|?i`Uz0$dmv7(i@+?u6zAb0*3$%)Qt#VO~*S!~Cnv0t6eXM0o@oZGWr;d~C; zf(vsdDqQq_vEWkc+69-jPc68T+P~ncSu7wM(OV)2zxS<-n;Kt9X3b*(Q6mH!t zSGfIDe8HWakqURunJC;_RJ!2)Ix&R@P2me3_Wn?Klw`T!aqcaJCr;7}p8D=lc&7Mw z!E>`43tn(bDZCWhwczEeKMJqD%~|mJ)IEha*XkC$U3Ea=-L`}U@4FT$e3<66;A2*c z!l(Lph0nnY7JP|!RQOtN+_d1Ey|Ti0;gkhGf_;Ljdc z1tvxWWM&}?vi|@7Isp>Uj4c2EfBe9}0U?z@f{ZL6l7Yv^H-tgkz<@#5z>vY+Hv}Ze n$jCTBnimu?ARai9HbxsTRgmQh7G|980GW>88C>qZAqHFkB!{?M diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Indian/Antananarivo b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Indian/Antananarivo index 9a2918f40404340d576ce850f2950baad751f8a8..d3c0bb328ce933c3aba335781f91b7435bfef230 100644 GIT binary patch delta 32 lcmey(xQ%gw^27-&+>8ti3?R(Fz%a2;gOO$8EQg5?qyc^R2fqLS delta 79 zcmdnS_?vNpvM37!0|P4q1B1xMcenm*IW+6S@rmv?CRQs*F)(NuFtGUehA_A~hA?Ow b7#SOYNE1_r3CgTsT@#}n*dVGV&XxuMumluN diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Indian/Chagos b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Indian/Chagos index 93d6dda50f579093f25617c77081ae99c8631ea5..8b8ce226b6b7f67229577b837775e7d448348bde 100644 GIT binary patch delta 34 ncmX@kID>J5^27ob9!3TR1`uXoU|^V_%*ZscR)Udn;(QGNbQK0( delta 74 zcmbQic${&9vN$sX0|N;2bk=>JWANVV?j0|NjRmU|?Wi L04V~|FohZbsMs3g diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Indian/Christmas b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Indian/Christmas index d18c3810d97bbd424dc3c8fa98de46bfa08c3fa8..766024b36c50c66e097b9811e5650468b1695746 100644 GIT binary patch delta 45 wcmZ3=*vdFTd13+!4|BQ?b49PMeJxK)&EIz&=4B7_f45XO!|NsC0 W#bPU;fXu*cBA1P}fw`ToITrv|WEe33 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Indian/Cocos b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Indian/Cocos index f8116e7025cadc709bbd995905e88c92ed03642a..117503410ce98195cd30ca4f63777465b2991e13 100644 GIT binary patch delta 45 wcmZ3-*uywMd13+!4|BQ?b3{iJLdZIHJSbTg#7_<${j13q_G3)>T a|Nm=3)s}!v!Dl9y4cKfuT{A0V118ti3?R(Fz%a2;gOO$8EQg5?qyc^R2fqLS delta 79 zcmdnS_?vNpvM37!0|P4q1B1xMcenm*IW+6S@rmv?CRQs*F)(NuFtGUehA_A~hA?Ow b7#SOYNE1_r3CgTsT@#}n*dVGV&XxuMumluN diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Indian/Kerguelen b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Indian/Kerguelen index cde4cf7ea7086a3fa3609566ff03e9425b096f36..8ce93e01247e18c9d97ac51b19f618b80bfd9c95 100644 GIT binary patch delta 45 wcmZ3=*vdFTd13+!4fHhuSab~x7_<#c8Avhd|NsC0L8gJs Q!EGX!jkbZQovtYt0FLYzmjD0& diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Indian/Mahe b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Indian/Mahe index cba7dfe7358ebf0d27542ca3abf3ac0045fae196..75362bbf033d0c0ec37358b63c12bc4323a64cec 100644 GIT binary patch delta 45 wcmZ3=*vdFTd13+!46Oa1@<{}~w>7>xgb^jJ7Bu=x0fFlZZ?Fpy%>|NsC0 UgG>XNf!jnb8*KvJ5^27ob9!3TR1`uXoU|^V_%*ZscR)Udn;(QGNbQK0( delta 74 zcmbQic${&9vN$sX0|N;2G%zqQywyKEqyGQ@|BOr%3*;v#D}y9JnCJih|Nq0b&6fbt NAVmxe3=A-Z8USP+82k%@8QNeuvy;|C7_ delta 72 zcmdnY_>pmfvKku$0|PSy0|QTIJ?jh!*0&B4w~GusnWsJQJlB7r{{R2~OpHv7OcT51 UCnz(rO$;~SWnf@nKoZvg043KJw*UYD diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Indian/Mayotte b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Indian/Mayotte index 9a2918f40404340d576ce850f2950baad751f8a8..d3c0bb328ce933c3aba335781f91b7435bfef230 100644 GIT binary patch delta 32 lcmey(xQ%gw^27-&+>8ti3?R(Fz%a2;gOO$8EQg5?qyc^R2fqLS delta 79 zcmdnS_?vNpvM37!0|P4q1B1xMcenm*IW+6S@rmv?CRQs*F)(NuFtGUehA_A~hA?Ow b7#SOYNE1_r3CgTsT@#}n*dVGV&XxuMumluN diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Indian/Reunion b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Indian/Reunion index dfe08313dffde345044d5053e3359f92163d3e38..248a7c93a52b8bee6e7dea4f513025894ae6a397 100644 GIT binary patch delta 45 wcmZ3=*vdFTd13+!4Blp>cce4$aeZPH62@+M&JXf``uhFbmy2<`a4iojdgN%{>ef_gWYR zWSuZ_`mn>;==}*3)zTfNBFY|SY%49yzJ{GJe|~3&#kDRE%aip27FIj?J*-zxwXm7x zbi%gh#16aaG7tOQKNb!#D^EE3>+f)~*E`{CxMhd?qmv#USN$zKkNSCdZNFmSy{z$s z&rJ3mzU^B*{Hm-i{4-vh2#C(x5$K(JBFOghj$oaI9wGAT7NNXXPJ}T;?Ff6%;Sv6@ z&m!VtuSet&VT-6u2TnxSFLm1yGx>{0Y+IE@T&enr`1G|q62jM(l;x{|; zlV*7ogeq7Ry2^VLnJ={{Rtq{&B5`9!DSMko=`S9OvKKo~l;5`BQE}Stgkt61BRi_r z6nRw7`(aVjyYxhDgZ7TPyqg~NiSZVUOf1YSlQ*!%PcC3rQDR^)v|!-y@eN@J@eN_n zHZV3eV9+)&WzaS-0byeUh6&27r$EuUG1`ZXmw|zS;lBS-xFH87A7Enz8N>!LXz~)5;e3DEg9|Gw zFI;R%cyOufWWnXs4GmYaA6&Q|C6aLczWjk3`dbTb%DFwbCGg_It=F3$+}>isaA&8& zgS!uU8SZU4*KmKy{)PwLWeg9)Y8f8w^GbMZW^&=lobL=z#l$W=E2+Qy;JM(Xh8ODp z8D6~bzraz`{ea`|h6|kEUL|lXGrl1FV$}l?1PYP2g(Yu0V+`j391bC0czZDAE;e>c0v91`3D*Ym;*Ggyh+en zDSttGcj^P3PR0wmv)v!)#jgy|udmj8VBm4|f}zK>2Szq|0mg=#6HKK3T`(1#nqc~I zS%5hUM}zr!#sZ6P@eP)Dem=0e@V3BuU37xY;sph^3pOR#H8&O5*UW$5P;6G<7_cP4 z$)}&e*~7oUMW>L#RqopdH=bYyw>QZj+~1focs&1F;CV)z!E4`~58kVPGWhgxeyI1I zD%#-JKD)rbF^eWeW`DV5Y_w;aV4=K z@+>??f+5v* zQb8IUOGCPBNkRJ4XAK#D!wNEwo@mIrYY|zHy>wMW&asdWxvf17dCSZ`-QC`$eHp;#}Mp~Ushhf+R&hBCdM1!eCH87la07gU@RW~h9(x1eh6SBC0y^9yRG z3pUiQYb>ZM``l39ms~J8pE+rAKeOTFi_CIt3=CQZj2x5SGmB18W(6m?jnN{^^$ZLQ z3?R>fXpo0NG|1B+8su>h4e~sg{!$N0q70xw0P#Tq0ir>H0irhfI=KZgF+odgF+regF+uf zgJJ+ggJJ$uB4gB^f7x(oq< Cq>(xR diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Jamaica b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Jamaica index 2a9b7fd52d37a1ffe9fc589daa04d88c6c71a6e0..be6b1b6f1e77a8f13a7400bcfc10c63a7ee1d55d 100644 GIT binary patch delta 25 ecmaFFe3@y2^27%$+>8ti3?R(Fz_9V4A|n7;`vrsm delta 109 zcmcc2^oV(aa;z8w0|N^K1A{;V0|Uck{w@F5dnF4v1(qamuATCM>qA=t_k-2~o|}sv z@E%An;M>{qfPZE42Z5Ps4+J|?KL}NNJP^)w{~!{n^+429^MjZr&jWEy?hg`5nhBB| QZ$C`tW^|gMJTdGq08ncwKL7v# diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Japan b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Japan index 26f4d34d67b46513491f26c2e661c6e653cc130d..1aa066ce38fce7bd0a680f51d6f075718d153a77 100644 GIT binary patch delta 83 zcmdnWbd_;}xC{dtU}Rum0AY~u1aUzS1;d;S3=GT@*ZMFrO$?M0_VEp2@Nx-Z@CpuL M;PMI%(Y53P08N4k-T(jq literal 309 zcmWHE%1kq2zyK@^3=AL)lHi20c^ViP7_Qqf6MD4CFutJ^=<+1_l`g nMh0Kk;1C91*ANCSU)K;_Ll9TT*I3U~&p^l5&;Ug18*>2wBW@8P literal 2094 zcmWHE%1kq2zzSHPq8$tj3?Me=Y##B1*;j9Um~(U8gt<$$PMEiI!i4!P(4OW z1Yutn0TJV06GW9?PY@HnGeMmB>;&=8`zA;{UOz$d@`4FchbK;u-m_OgX3aVQ**WtC z4&%!D_Fwfc5Q&2{y~(C)n<`nqb%FIKh6l%mjxt_qtUAK4IU(%3!Gs7=H-U)j zLK7mtY6wJa`!XT=Dwjaa0zrY;EpG(k>OTv_PdO)$5Pwx5vG&!3B>U|G$+2f9q{z<{ zNVQ!zA&q0}gml>n6VhKypOEplXhPeRw2L!S{Va#f2jRmG5p&sM@ehp!(eI z2{khhO{iTrcS2p|k_q*F^%EEwn3x9xWMJSEU|?lnkWpY{fRP{(U)SIe24B|@1_lO3 zMp6>~|NsC0gAzZOzIy8ehz4Z>5Dm%*AR3ezKr|>rfM`&r0MVd~0ir>f14M%|2#5w{ z5)ci_C?Fb?SwJ)>!+Pn zXi&xi(V)x)ra$kS0HQ&e3`B!68i)pEHV_TUa3C6#=|D6nU<^$273<#n@nGi&S zG9riuWkwJU%8(!$lqo?pC}VL1c(L|6kz(@GqC-j0t3Vc6&fHKRB(W3P~ichK?Mki1{ES88dQ*gXi#AS zqCo`;hz1oZAR1J#fM`(R0-`|$42T95G9VgM(17Xh2H^Mr6*wS1sL%n?pn?ZPg9;xI z4Jv>@G^h{)(V&6|M1u+=5DhAjKs2aO0@0v?2}FYmClC!Ppg=UJkOI-5f(k@~3M&u| zDzL!xi|JtZfC?@UA5?gOXixzLqCtfihz1p8AR1JdfoM>H2BJZQ8i)oJY#%NP=N=gKRg1*2dLl!@j-K}Jp&zILjw@4Z_EV%KG_Wp diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/MST b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/MST index c93a58eee8b32f672fd3a96ca3e6ada5b0a0e168..a0953d1e791eaddbec13d086f7c4588738297606 100644 GIT binary patch delta 22 YcmXTQpPb%7 delta 12 Rcmc~VnxH)~jvGV>0stPN1X2J1 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/MST7MDT b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/MST7MDT index 4506a6e150dfd73884811c8c0f5a0e21dc76a756..137867c8bf5b2df2e55e8c0c84ecc7deafc3ba79 100644 GIT binary patch delta 108 zcmZn@+Ri>fT!sM+FfuSOfG|jSg18`vg5d}T1_qYRrOZc|CM$A8sQ>>zcLD>;|NpBO fFfxEi4lv2%>k`7?8yv#m8y>>o8xS)2Er%okqWT!% delta 1285 zcmdna-X=6byq=YTfdPaW7#J9)LfHcImRU`hzni^bL7U8kg|l8ZobKeAa7p<~!KFkA zhF?EQ1%AJXVEA(*T;T5sD~5kNECv3rkYQk$AuYhz{*QsF{I39Wp;QA)qT~eDfIkgv z4!z;m;HKLhW9<_UZ|7c%g#Tp%DYvzbA# zvq?axGL=C%Getlo(w#xn(@j9kQj&(xAD~k`Gsd26v|`;6dTt!D24tPP|iBTpkn$^K-FsxPtfEl zV$i&IaDrC-s}Kh5eTygPTrOzPo!2@+Z*x$CeqH(mgUKchhUqN=M#W+c#_nkXCP6lqyK z&rNV_ncd*zzhQ!NN^OIS{-g=6F7XYnpN|T->((&1UtTUy@5vj-;JLX|!0W98gZG@J z6MU}4H2BuEPw?Aj*We$MIU!)0LPMa9_k^G_riNe{-3cL~PZ~o0@J|RcJ=PHRR7W5} z?lD8eQ9gmle@7XjmV6M1zPFqqrsa}A?7mKhxRfmd@$<475_~UANNjI!NYdRjAvry> zA%%C!gj9F$hSaxZxf9aWbsN&pMoh?L=WobdYc(P3*~fvFLq)68~uoCI5a;D6`nqP1v7{b3ThAy3T_Y$3UUw)3U&|;3VIL?3Vsj`iUJS~iUtr3iV6@7iViUS zhrfOThyjWhF#S{qY#}IqKzvXffoM=XfoM=%foM>CfoM>ifoM>?foM?NfoM?tfoM=1 zf@n}Yf@n}&f@n~Dg6I_9`YB)sfFc$okovX^%m>9Uh!2Wm5DkiFFum3aEDwrr5FZrh zAQ}|!AQ}|+AQ}|^AR3egKr|>FfM`%!0MVfI0HTYtMel=s3`!Uv0Z`%q(VzqZrtjSa zTL?-hAU-IufM`&H0nwmD1EN6*2SkGs4~PaOAP@~oL?9YHA(=xG3^?(Sl8`3PW0nK} D9tD;q diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaNorte b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaNorte index ada6bf78b2815d3d99c97d521ab9a6b35c8af8c3..19ccd3576d46b262f8b9f00b302f67bb4d26c4d4 100644 GIT binary patch delta 68 xcmZ1`)W|VGT!sM+FfuSOfG|jSf;caTg5kK$jm$roCL40ZO+Ln9GntQ50s!A92-5%n delta 1166 zcmZqVSSB<V{Ra)Oipz6H)H-4k5&7c6jf$(`WF-?YG8#eahPkNFDqo-BqFJa05Acs&uG z;5}#a0-tMH6MSo?F7VstGr>Qmd_ll8y$OLfkqdSSN_ST6_({WKxukL-dl(<>9g zo?0nH$bA%uI4YwM`R}qo)RKP+(f76r#I!t6h}}0`ATH&QLj1f+fdt=s3liI>PDs){ zupl|Td_oHEq6Mk$krPtiw&X5ISGS&!el~4ECcEr}%(Wg1vY!2)kUcF`A?JdOKyI14 zLf-m+0{LN@3I+WS1PaZ#6^il?2^5RIRVeXaB2e<5b3vKKfeB^zUN5MSSTvzx-`NF~ zKUyYK&0D{q`bOG>n!1S#YIk@{sEaFJP(MR!!eoEuxXJm<=9AYl+wg!=90MbSoFL8% zN`xQ`5}3L%{0CD#hy@A`5Df|v5Df|z5Df|%5Df|*5Df|<5Df|@5Df|{5Df}0F#Sh% z0f+_#8<>7-r2wKq!3U;~%7FQxU>yC^gZQ8*0MVdm0Ml#hJ-`Y;@c|M5#R-T8 z#S4fA#SMrC#Se%E#Sw@G#S@4I#TAGK#TSSM#TkeO#T%IZ&j~gk6n`K-C=Nk1C?3JI z^}e%U1)vB834kIMM1vw0M1vw1M1vw2M1vw3M59Nv3P=zZ(Odz+Ar=8HAv(UsdPaH% NI=+U6dWL!iTmY*?f*Sw; diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaSur b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaSur index e4a785743d75f939c3e4798ebe7c79d38e4cfd08..4c819fab0247e15f1ff9b6c76108c7290e536699 100644 GIT binary patch delta 51 zcmeyy{hn!p^5g&}79K_h1_lsjU|?XFpv)@9z`(#dIhJY54c!16AZzQ z;uAuARxyMs{G1S`)58$XaC<_8=!%Aj2YV+(e(h?AIxv4i^wpe(n3a13Vz>G=#C6US zh@WcEkdWCRkXYx-kmQ*pkQ}GakfP}#kZLE$kS3HcAzk(}L;5GD2^oK{GGty-nUHmN zJ45y+wh1}ME;r;(d@&(!+17^q!c!9p+NL)YMm-lON~>%rwmK{qWq1%DJn#jSjS%J()5Rl5QOs?W!i4N8z88k8tO zG$>($Xi(w=(VzqhqCtriM1vA4hz2EA5DiMOAR3ftK{P1gg6SUrfM`&r0MVd~0ir>f14M%|2#5w{5)ci_C?Fb? zSwJ)>!+>Z|rUB8Qj02)UnFmCJG7y;lk^{lYoceUXQ1P2XrO1RXTSvj D%8ZYB diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/General b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/General index e7fb6f2953d123efbc2550f450decd794b017d4f..ffcf8bee10e5aa57dff8bb5764de94d73eab348d 100644 GIT binary patch delta 63 zcmdnMGlzMC^5g_279K_h1_lsjU|?XFpv)*eIfvUs}}$y Cya(t2 literal 1584 zcmWHE%1kq2zzdQX7#LU?7#KvBZhKL%{!`wAZE0Z%+np~Z?BFp=*zvdR!_j*i5{^wb z2{;-0@xjSgcLUBd9eZ$odsx7&nW7JFmo;B7OfO?FD&{CKc8_2%33^pvs&2(#W^|^& zoLz>&Li)uAi)a5BEPtQ+VD*)y!Ft=F4>s%nG}!L$`(W39ufcwH!3T%@0}YNXy#-GG ziyE9$@(Wz_TN+$l0t?*u(;D1Wj0@aNM-PP{Jp??hdYDMS>X@9Gc+0e z)_ncoU%|}~&~yDmV4`|MP|nT|!H%2_AwIJ|getsl2-B(k5YBM6AwqOkLBxag4Uu1K z3Zf27Y>2)ZR}iyu9YgF^hl04y2@LU5l?oCvix?8?>^>xUhAlfoM>g0@0v!1)@P|3rzoQ`v9Ur zX$(Yz(iw;br8O}9>TUpt2BkSLy*&)f2ct%7J!dIiy-Gz+3Z=@vwT(k_SwrC$&YO2Z%; zl#W3(C@q6%P{i7K~fzvsN0ZQv28kF8aG$_r3Xi&Nb z(Y`Y@K@>RsgBYMZ0HQ(p07QfG0*D6X2M`U)6CfItFF-UXZ-8h}{s7USJOZLY`2&Xiz=^(V)BpqCxoyM1%4ahz8{=5Dm&( zAR3gvKr|?ifoM=Z1Jj>O!1jak8;B3eb08X&??5yt?}2Dg{sYmVJP4ve`4B{d@*;=^ z)Xiz=|(V)Bxq6ce!=5h`WF>`ha(eX9WGt@KC@ijEiGu1QT0syd-;=}*| diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/NZ b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/NZ index 6575fdce31183d8238b18f2f30ab5b9227c7071c..afb3929318475d4f0ea9d6c9e94d0f5f81d8b82e 100644 GIT binary patch delta 71 zcmZn_p3E^pdh!Hj_Q?~NS$P;47#Kj9fq{VmBFx5+z`(%3ws{FN3o{cF0Y VlMgVtOtxTFnViHdJUN3?769pY4f+58 delta 1254 zcmbQt(JDMax}Kc@0_HF|OWm#lFL*9_;VC@#4VZH4hHv z?Rs&jx$nVYzd0|CBo{n5s#o{om``uQalV8XCv@@?PJFMg&A4=HmIJ56-v^v)mOkKm zzchh+-k%3NHx54Ft-JStZ^z;X{BZ{!2+U}GAZWMfflx*I17W$A2O<%k4@CZ@JrJ|d zejxU|IYC0vBSGSLYJwD_R)W-W_XO#OJP9)GnhCN8-X+MTb0^3zxR9XW_BKJWVN-&V z0p|nd%ySP^_+LLzt=D5rP-Aj>pw9a^LH&`+1C6&w6EqL8J;(O+=LrV6z6pk2ClidqG9MUgtxhm8^L}8;)tg`@ru)F`^U4S2-}oO`T<(5g zdG+H1tIfF&toQRJ*i80+U_0+af?cuU1N*v52@WxS3661F5}a%d66&4prX{$@2qn16 zRV29n{*vJKFDk+Pd+P&_do~H4*V7+(?UPIJ-tPIpXC6a>?{w`4ezlJh{L6VC1f>0Y z5SXBq5ajmYL9hc)LWtU-2ch!s62jP)JP7-LAtC%(+k=Svn-U_AWju)5KP4f0eQQF@ ziVY89`_mKRIwn1c&-YA7$SA3Qkm#?SkmM2eAX%R`Aw|RDK`P(-gfzj>gtQ;r57IxH zCuCfI`ylh8WJ1>V^AEB&{7%T3zVSisgu4lO<&z)e7wk_cNZ6227GN+st%C}RjqDEry?p!|VFLdDJG2bBk;5~_B(KB!)4_Mm1_QbKK~#DlsfHkX9@ zj9(8X$1}??vQ2Jawx8V3Y%sZ>Szz*hW|hfznI%DKl7W$tVS+R-n90Dv08XkKqgj~i zK}i=BSRfh{U?3V4XdoICa3C5Kcpw@SfFK$ah#(pikRTcqm>?PypdcC)s2~~?upk-~ zxF8x7z#tkF$RIk5ZAtwDFysG)1P~1haS#m(br1~-c@PZ>eGm6fqz^C~`nFD1tyVD3U;QDqsD3u*IO*0ttX(3`B!s4Mc-t4n%`u z4@84v5JZDw5k!Mx5=4Vy6GVez6hwn!6-0w#7DR($7es?%7(|0&8AO*PE0lm80E%vq z04U1A^v_1H4?s~5;)9|eM1zt5hz2DC5DiKSAR3e$Kr|>xfatm=7qGebQ-%siDI+5T hmtRzHh_0cLUzAITj<2Pjsh)w3uZfn4BJ{^FB^cf28t2d@`3p`{s$J9yB}Cy{rJFYbM6D{{d@^F zll>pq&ijyHS6^)Sz`pKMfnj!6&V z^F0$1GD;pK`fDd7d4xSk*5^$~(Xe=s%J)7YO)xYe?FaXR^pEBV8Q0%F$h;_-khT5% zgX|5z6LO|+e2_cgZbDx9&g2D55|d9eNlw1UB*V(Uz{tojL7EqoUO=e_oOU)w>oC=Wc%YyH(V*Z0(V!p$ z(V$=h(V(CM(V*Z1(V!p%(V$=i(V(CN(V*Z2(V!p&(V$=j(V(CO(V*Z3(V!p((P3;$ z>K}j^|1TtfXi#{AXi%7gXi&I=Xi(ULXi)frXiyY@XizkOXi!vuXi#*3Xi$`ZXi&6( zXi(IEXi)TkXiyY^=v2P?_h5@baRm|p#TSSM#TkeO#T$qQ#T|$S#UF?U#UY3W#UqFY z#U+Ra#V3dc#VLpe#Vd#g#Vv>i#V?2k#W9F3$yF!;I{*~fAOTQ>gXy1*;E(}DJctj9 vd=OoEKnkoLlmLYb_9 zV&nP-rTWnS0?Juu7*tFj3aEOmV^9-4ETFD6fkFM>{Rx^}MGTtv4o=W|6~dssZ}9}3 z%LNU(^I9k9Z4PSCuS=g`FxjNRFug^2H%?Y34Yt`8vJ82 zCj?AWXb80No)A>V)DSGAJ0T?WNkhmV{t02G#~Q+(>Ig*0J!XhF$|n%{?_u36(#}8mi_koKSs3D59aJu6aW34y%T` zxYP;tGh`Yjr!yx`p1^D|c>*)*6x)&7ELADC9tVQ0ReZPzZu(P$+_EP)LGkP-uc^P>6zPP^f}vP{@L4Q0Rha zPzZzRKm7F*Knze&gXyO_U<*M(4&sA?9YlkI9z=tJA4G$q07QeL0Yt~{>jY8Y*Z?s= zF#@7Nu>zt&F$1DOu>+z(F$AJhcwqqCsf@M1#@+h_1d70V;MFK*<5b2PFv*4N4Xu8k97c7@?4v1UAE$@#P3o6{- diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/PST8PDT b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/PST8PDT index 99d246baa35cb9c6f56d50adbec163452e2a47fa..fde4833f6be38b0d3627ec08d861e25e789fddb4 100644 GIT binary patch delta 108 zcmZn@+Ri>fT!sM+FfuSOfG|jSg18`vg5d}T1_qYRrOZc|CM$A8sQ>@p-@w4~|Nql-3w@ delta 1285 zcmdna-X=6byq=YTfdPaW7#J9)LfHcImU%3gzgu*|f;O!M3uk?waJo}!!6oG{1(y=l z1b+Q!R`~rQP2kUsRE57MJOuvja98-hLQ8;QhNc2z2af<#1-Alop~eK3MD+!%fm{>V z961-T8@!po-s`-8Q{dbL&b9j$xIS!{!2MwT0-l@oX9aiXXR==||!dWG;y< zkUjWwg51U*3*;Bxo}f^st)SSrcY;zFuYz*cEddqN_X?_Bdj!-(FDj^O%@a`n_jZ9M zSA&4&z4HsS>R%-ZXz$y&K<9GZ1l@U)7wBzHn4n)*y1-zv(*(oxNeV{ADie&|OB76k z*(R8(hbfpDy_jImZlPcy!zy6$TuQ<6_j3WOV}BH^Z=V#f*&wmNcK2!lyZ&Db>}U51 zION}1;MlTqf|LKg1ig&38`;eau=klTTe(oo3aHgtB|D7gR_rnozOt?1IW4 zEfcEdtzS@mBW*%W-NXg8J3J=T#T758pP@BjvOIIdWP4_d$@a{w7XSbEH!!gL|37yE zBLkS^0Fyir@c@?)hJfG@hJf%8hJb(&Q1WDi5EH}&K?xRwK?2}JyD|C*Q$2_W3Rf_F zd8-151_dve-aH-52L&^T4+?4!4GL}$4GMA)4GMM;4GMY?4GMk`4T=H~4T=U34T=g7 z4T=sh{YSQb0f+&L7cl+Q3Tz=Len5Os9D!(1Jb`FXT!Cm%e1T|CoPlUiyn$#?+<|CN z{DEjt9D-<2Jc4LYT!Ls&e1hl{-ugvg2Y@0LB#`>H1L<6Eh2?s=j5)X(5B_I$DN<<(UJt3Jx5)3%;kdlxl I&tsMZ01T?4ng9R* diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Apia b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Apia index dab1f3f602b297cff53222906fe7c20230587395..244af26f8a2f44b8530ba639cb3c7393c58b3783 100644 GIT binary patch delta 48 zcmX@f(Ze)BdGZEE79K_h1_lsjU|?XFpv=fI`2eE_2O|>;GYc~t>*NSVm&qC|iU8IE B2lW5| literal 1097 zcmWHE%1kq2zzb{`7#P?Y7#O4)7#J8Pvi@PXmBeDgic?N3jL>zMQ)KHoDTA*19$qQ7=Rl1JEsWPRR*6b*|9seJDf(gZ^j(tdD1 zNdIV_ka7L(gUpMP30d3EKgizjJ0WNK#s|3*?k41wPkxYJus@+7VM9V;ej3F$c>}TVH@&^_P6*rR~R34B@sM_iJpn9d*gPKK23ALRP59*p+ z66!O4J*fZx|34!W3o{Ed8!H)*je%i90|UeV|M3hUGR}j6<^TWU1V*m^|5F1P_!tD84{6D9*t2-|ht<8WeXR8WevZ8We{h8WfKp8Wfix8Wf)(8Wg7>8WgW! z`u~Ll5Dki75DkiB5DkiF5DkiJ5DkiN5DkiR5DkiV5DkiZ5Dkid5DiKLAR3eoKr|>V zfM`&90MVc{0ir?a0z`w-2AKZA{QyLR(g=tKr4tYhN-H25lwLqID9wOqP`UxpptJ*` zLForXgVGR)2Bjkq4N6NO8kC+uG$>7hXi&NW(V(;iqCx2kO#f^Iy91QYKzvYI1JR)L z2BJY}4n%{}9f$^{JrE5_e;^u^20=6^9fIjWkQTXYv<;2zbPbJdv<*${bbKxKO!W-( PjdgrY^bGY3^i8+`3|=wB diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Auckland b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Auckland index 6575fdce31183d8238b18f2f30ab5b9227c7071c..afb3929318475d4f0ea9d6c9e94d0f5f81d8b82e 100644 GIT binary patch delta 71 zcmZn_p3E^pdh!Hj_Q?~NS$P;47#Kj9fq{VmBFx5+z`(%3ws{FN3o{cF0Y VlMgVtOtxTFnViHdJUN3?769pY4f+58 delta 1254 zcmbQt(JDMax}Kc@0_HF|OWm#lFL*9_;VC@#4VZH4hHv z?Rs&jx$nVYzd0|CBo{n5s#o{om``uQalV8XCv@@?PJFMg&A4=HmIJ56-v^v)mOkKm zzchh+-k%3NHx54Ft-JStZ^z;X{BZ{!2+U}GAZWMfflx*I17W$A2O<%k4@CZ@JrJ|d zejxU|IYC0vBSGSLYJwD_R)W-W_XO#OJP9)GnhCN8-X+MTb0^3zxR9XW_BKJWVN-&V z0p|nd%ySP^_+LLzt=D5rP-Aj>pw9a^LH&`+1C6&w6EqL8J;(O+=LrV6z6pk2ClidqG9MUgtxhm8^L}8;)tg`@ru)F`^U4S2-}oO`T<(5g zdG+H1tIfF&toQRJ*i80+U_0+af?cuU1N*v52@WxS3661F5}a%d66&4prX{$@2qn16 zRV29n{*vJKFDk+Pd+P&_do~H4*V7+(?UPIJ-tPIpXC6a>?{w`4ezlJh{L6VC1f>0Y z5SXBq5ajmYL9hc)LWtU-2ch!s62jP)JP7-LAtC%(+k=Svn-U_AWju)5KP4f0eQQF@ ziVY89`_mKRIwn1c&-YA7$SA3Qkm#?SkmM2eAX%R`Aw|RDK`P(-gfzj>gtQ;r57IxH zCuCfI`ylh8WJ1>V^AEB&{7%T3zVSisgu4lO<&z)e7wk_cNZ6227GN+st%C}RjqDEry?p!|VFLdDJG2bBk;5~_B(KB!)4_Mm1_QbKK~#DlsfHkX9@ zj9(8X$1}??vQ2Jawx8V3Y%sZ>Szz*hW|hfznI%DKl7W$tVS+R-n90Dv08XkKqgj~i zK}i=BSRfh{U?3V4XdoICa3C5Kcpw@SfFK$ah#(pikRTcqm>?PypdcC)s2~~?upk-~ zxF8x7z#tkF$RIk5ZAtwDFysG)1P~1haS#m(br1~-c@PZ>eGm6fqz^C~`nFD1tyVD3U;QDqsD3u*IO*0ttX(3`B!s4Mc-t4n%`u z4@84v5JZDw5k!Mx5=4Vy6GVez6hwn!6-0w#7DR($7es?%7(|0&8AO*PE0lm80E%vq z04U1A^v_1H4?s~5;)9|eM1zt5hz2DC5DiKSAR3e$Kr|>xfatm=7qGebQ-%siDI+5T hmtRzHh_0cLUzAITj<2Pjsh)w3uZf|UeS%86ofq@Z@4cI2agaZD8Q>@eN_nHZ)++Hn3#SHZ)|Ipv=fNG2DO`q!yx?nTcg$w;ce# C1{)jz diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Chatham b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Chatham index c00410988272dec2ae70ede88720b4a46146a4d1..f06065ebd18315683f60cf87839d477a1d699f01 100644 GIT binary patch delta 70 zcmbOtu!3!Zv;+eZU}Rum0AY~O1ZiFn1;VZj3=Axr#hG=O7#Sx!GPz7%%Pukb3X|C6 HXY6_a_j?Jv delta 1119 zcmZ3%Hbr29bUiBr1T--)Fo4)%4Gatnmu^kl!zuCi0q2^f54hehP2isQ=K;@+gAaJ? z?mgh!vG@Uh+<^xIGg==A+AVq@RFVEbSgz%PNQCDDk$-6q#4NNQh&^vkkWlnUkT{;2 zAjPPaAhp~*LHZ$2f=s(+g6x5J33BP&3GxdrBq+GmzfDkV*p#4T!1+Kq^V|a!{?`vw z^%xV>n4BJ{^FB^cf28t2d@`3p`{s$J9yB}Cy{rJFYbM6D{{d@^F zll>pq&ijyHS6^)Sz`pKMfnj!6&V z^F0$1GD;pK`fDd7d4xSk*5^$~(Xe=s%J)7YO)xYe?FaXR^pEBV8Q0%F$h;_-khT5% zgX|5z6LO|+e2_cgZbDx9&g2D55|d9eNlw1UB*V(Uz{tojL7EqoUO=e_oOU)w>oC=Wc%YyH(V*Z0(V!p$ z(V$=h(V(CM(V*Z1(V!p%(V$=i(V(CN(V*Z2(V!p&(V$=j(V(CO(V*Z3(V!p((P3;$ z>K}j^|1TtfXi#{AXi%7gXi&I=Xi(ULXi)frXiyY@XizkOXi!vuXi#*3Xi$`ZXi&6( zXi(IEXi)TkXiyY^=v2P?_h5@baRm|p#TSSM#TkeO#T$qQ#T|$S#UF?U#UY3W#UqFY z#U+Ra#V3dc#VLpe#Vd#g#Vv>i#V?2k#W9F3$yF!;I{*~fAOTQ>gXy1*;E(}DJctj9 vd=OoEKnkoLlmw}(Ka-&(={~U0suWe4om<5 literal 269 zcmWHE%1kq2zzf(I7#LU>7#MgO7#J942rhoG!1CvZldrfEE(!8|sQ>@}KO++(6C>mQ z|2Ahp=JYH8sji#Az`?)(V*B`pFlZYZFlZZCG7w=KI|Bm)E6BG0|Ns9NdAQ#MMAwGJ_efE>cWfZb7CHrj>;cDjZJTma#r BOXdIo diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Easter b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Easter index cae3744096402e8a452336544edf96ca9ae5ad8d..d29bcd68b0202ab8deefa1537cb12b03e057a521 100644 GIT binary patch delta 156 zcmdlfc#dO&xC{dtU}Rum0AY~u1aUzS1;c3!3=C|WW0*~t85t)hGD-L{Gchx1M z4BH_2%>IDXMvD#7=VKgXCQ5CPU2o?gSMXIf?gE`yP4HgXi4i=|53@l%2AFx{W%E0<0 z?*W^xGX}OR-XE~bT4!M2aq)md@Tm=s8JiC{8L!#k>@oF#i*VltSHn#XuAd7wxC>5k zaDUHa;PJ7{!E;Z(f!D9|6)vbaDY8Fcx)aL0q)HVG!sP_|asQ>@}KO@WJiOkaVtZejz zZ2$kytYBaOlPv%LuU^2x$npRG+zAXkli69+_!t-%89@ky85t*t3xZNQ2*XqR#%L4f zdJqp3t{@r|wjdf5z91SD#vmFL&LA2T)*u=b-XIzj=3x2@%K;D#3VSepSJ44PgW>>0 zgW>^1gW>{2gW>~3XK&n8ZvbL|A_hc*A_qi+A_zq1S8dn;qCxQlqCs&5qCxQmqCs&6 zqCxQnqCs&7rk`em9R!L)5FZqeAQ}{xAQ}{(AiC0|PSy0|U>buZOlsUiyAP>d>tN(znts$Sm4(Kz8=G0J)}l2jr`7 z1Sn+hc2JDo6`^rJG_(K! diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Enderbury b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Enderbury index f0b8252362b0916405ad479b9f3ac148a2527814..b22ab147c3b669f04d0334155b8873a04c9552c5 100644 GIT binary patch delta 38 rcmaFGxQ20p^27!f9!3TR1`uXoU|^V_%*Z^kM}divX`;R6#0OjenBfQ9 delta 60 zcmZ3(_=<6YvJ49Y0|N*PG%zqQ2!*j6&}X&WQ2+n`e?}(eiItiYlo?qjhAVJ0FfcH{ GMU4T#oDhfr diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Fakaofo b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Fakaofo index e40307f6aab2a169bb957979f5580affb379131e..b7b30213e154012a5275c1384b41dbff29860644 100644 GIT binary patch delta 34 ncmX@XIFoUL^27ob9!3TR1`uXoU|^V_%*ZscR)Udn;(Sd2bXW#q delta 74 zcmbQqc!F_)vN$sX0|N;2G%zqQ`2C%^q5l8>|BOr%3*;v#D}y9JnCJih|NraELpvCt Kia<0>p(X$re;1|z diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Fiji b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Fiji index d39bf536456d70f7f08608e264bca743fd864548..e3934e423c9cc007352e61b6f65b83f7e5c9adfc 100644 GIT binary patch delta 55 zcmdnWv6y*+^5g}KEIf=13=AO5z`(#TL77o@@;b(+-1pcMK>P%zj|r0v7-c8tFv?99 HVNnDCNjVH7 literal 1077 zcmWHE%1kq6zzZB07#Nrt7#MhF32!`LW-b1}?E0?+3l)_JfWsRu!~sxE|tJWmMOmGvOZOi1iM@*wfi<%Hz?We<`M zZB0n^?|6{9XnI1re%6EZrpkm&exC=K*;5~6z1Mq??OpyL=Z1Geu6E>uydAm;`P|kI z3TE&p6ug#wP*nagq3G2A2PNT`6H2zoB$PS4e^560UqXe##RnC|4-%>vHb1BeK9o@X zVCsV!<0T2T2g)DR$sBl4zaa8K{hvh->i_@$&%{U(WMW`gegG8G+b%G&Ffgn*z`)_- z8^WM%Xw0B(Xv9EDO#J`<|34@;K&F9W1WaH5l>nkaF$1Qz-vRSMF$Cg+VhKcpVhTiq zVhcorVhlusVhu!tVh&9ITJ``$gJKX&->SL*qCqhUrgvq5>p4{0P#Vo0YrmR z1ejhl9V`z@86Z9=b%1D43IWsEQ^D>5r4$e!lv+SED8+ziP^tmZpp*lmL8%8sgHjNf zek}{u4@yZOJ}5PTXi$m*(_3V~_JdLuh!09#AR3gyz;y8guskTGf%u@*2BJYJ4n%`e z9f$^{JP-{^eIOc?0>Sj3MPU1BpAxxjv<;2ybPbJcv<;2zbbJjB^^EikbbLXSvA(4x F7XWl7E$#pS diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Funafuti b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Funafuti index ea728637ac1fa43f2d73469151c688468b34c3e3..78ab35b6b02f38fdc95fe9afd1618a97fe717313 100644 GIT binary patch delta 45 wcmZ3+*v2?Pd13+!4|BQ?b3@cbbdR81@VDa${VbC@-Vj#t&|NsC0 XuQTKM12O}*iCi|?hDLU}hDKZf!5|rZ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Galapagos b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Galapagos index 31f0921ea04cd201675b613082fb4b0b0b91941c..a9403eca467d3b2ccf85b76bf2d94678a2ce3030 100644 GIT binary patch delta 36 pcmaFIxSnx>^27!f9!3TR1`uXoU|^V_%*ZmaSA&_6nQ7udT>y#?2K)d3 delta 66 zcmZ3__>OUcvLY)30|N^K0|U>tB|Z&u5=R2G#kn467k&w-|Ns9#BQq28#3t1V%8aZN O!!>vq7#J83!ny#BDHL1) diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Gambier b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Gambier index e1fc3daa55eb2bc8c5d6a78bd77a01d193a821a7..ddfc34ffc0971e01ec4f13b78ddfa40033853cd1 100644 GIT binary patch delta 45 wcmZ3&*upqLd13+!47^Z#!>6x{GfyKu+ghAWTkbxAF{{R2~ WA7mQH4BRGi*=QRY+UXh^asdFVryKtO diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Guam b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Guam index 66490d25dff9bcc8f710b0141f1a02e64aeb32f3..bf9a2d955fc23bb6c2043472e8292d4adc20d4ed 100644 GIT binary patch delta 28 hcmaFIe2-~@^27%$Jd6ws3?R(Fz`!s;dE+w3N&{c&;sPt@xCBNf mMrJg~^8de?2?GNIL(c*R76yj82@D*QO&Ap?C~pkoU<3ebx+&oR diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Honolulu b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Honolulu index c7cd060159bd22fc5e6f10ac5a2089afb2c19c6a..40e3d492e6c22c30041c31f159d4fe0ee9451c03 100644 GIT binary patch delta 54 pcmX@fbeD00xC{dtU}Rum0AY~u1aVdn#V~PwJ3E(0aEPG+7XYHG22B6} delta 99 zcmcc1c#>&?xGoz50|N*%FfcH%L)jt?3=9mrS)Dz0D;7qa?zBB|N%>2`r9@AQiIbgq hKnfW_1Op?(1aVf7Ubcz;?ZO}-m^hb5aEPG+7XY_K5sm-= diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Johnston b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Johnston index c7cd060159bd22fc5e6f10ac5a2089afb2c19c6a..40e3d492e6c22c30041c31f159d4fe0ee9451c03 100644 GIT binary patch delta 54 pcmX@fbeD00xC{dtU}Rum0AY~u1aVdn#V~PwJ3E(0aEPG+7XYHG22B6} delta 99 zcmcc1c#>&?xGoz50|N*%FfcH%L)jt?3=9mrS)Dz0D;7qa?zBB|N%>2`r9@AQiIbgq hKnfW_1Op?(1aVf7Ubcz;?ZO}-m^hb5aEPG+7XY_K5sm-= diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kiritimati b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kiritimati index 7cae0cb7562e5c0f9fa46913b71a5c3628c01bbf..2f676d3bf5c8599994bcabd402ca30efa4cde5dd 100644 GIT binary patch delta 46 zcmaFIxQ=mx^27!f9!3TR1`uXoU|^V_%*Z^kPl1V%X`;P07nhB;p^2TYp$QiN(|!mg delta 60 zcmZ3-_>OUcvJ49Y0|N*PH83zR2!(!P&}Y?NQ2+n`e?}(eiIv(Dlo?qjhAVJ0FfcH{ GMNI+52N0tG diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kosrae b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kosrae index a584aae5eb8187f88600e97b6d6c764245a37e65..f5d58242c8198bfd7139883e1299b0706704bd32 100644 GIT binary patch delta 50 zcmcc5^oenT^27}++>8ti3?R(Fz%X%w3M(fA0|VQ{ojx3lOw3Fy%uKA4#TZp5J2J`v E00HL+sQ>@~ delta 164 zcmeywc%Ny4vK1!-0|Ofa1A|Bd0|Ubh!KoJ(SpNKQ@U7{EldrfEE(!8|_}?ZSVAh@P zQ2+n`e?}%oW+p}!M#lgD-F+tRl9FOzn6-g{#m6^G_=z-G~@yRSCcEB diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kwajalein b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kwajalein index 1a7975fad7f7e96f7101eb3c64c9b420eeebb621..9416d522d0a3e19ab6b81317f5b94961c55e91fc 100644 GIT binary patch delta 49 zcmdnPbenO4^27x!Jd6ws3?R(Fz`!s;nUQVcdJ9%YCT2#KiGH?RTsGQ@} fKO++(GZQ1r#JR>3lo>fDhCA>xFfcHn$k+k^!-^a} diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Marquesas b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Marquesas index 74d6792bf6fcb791bfc0af1f827737f612abef67..6ea24b72cd9552c973510d1c17ace66fd35e1cc5 100644 GIT binary patch delta 45 wcmZ3>*v&XWd13+!4GA|PY0|PSy0|Q3`0|UdvY=sHR6T@r(NWuk! diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Nauru b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Nauru index acec0429f147f40279107a48cb85c3b0e9f56c94..ae13aac7792a04fe97b0a746f546e52d32f484c5 100644 GIT binary patch delta 37 lcmeyvxSer=vH$}E0|O%zgV+<48CfPy)?j92Vw`x~6aa941`_}P delta 66 zcmdna_=jXJlezp4g;4L79qm0|NsCLf8}l^IjIZ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Niue b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Niue index 684b010e8b6bad56b084072403110b94e8cfe2dd..7b3579351395393825ba3770ac94e729131fabef 100644 GIT binary patch delta 45 ycmey!xSnx>^27!f9!3TR1`uXoU|^V_%*Z@(f&vpG(?ok+PA(f=Lqj`5LoNW!90&UV delta 60 zcmZ3__>pmfvJ49Y0|N+)G%zqQ+;KKd5GXliQUCw{e?}(eiIut&lo?qjhAVJ0FfcH{ GMa=-{r4fz* diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Norfolk b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Norfolk index 53c1aad4e0a541ee3c2c4c6de33a79ca93a7d244..79e2a9419adfef6279900d8453a361007fb665ed 100644 GIT binary patch delta 70 zcmeys_MLHpv;+eZU}Rum0AY~O1ZiFn1;T6$3=C|Os~An#7@3%vSXd`BGD}TXX4IG* Hz^niO1JMU( literal 880 zcmWHE%1kq2zzW!*qS_1$3?Q~#0|NuY9mgLHocyOUIJZ8}2;+a25j$i3hq#UfAL1(} zen`k@`j8k={2|FB6J8hOHQXu4FF0FJkon_7VdTpXMV_}l6kDGDP@=i#L#gE24`rP5K9v3J z|4{z2;X}pE!Vi@vlRi}K4E|8PslK3QQ9(iNq{M={rl5lQBIkno|Ns9pGBLBTvJnH> z7#QYOfV?`lfq{jAVc`x2E(V76Cm01_>{%Na#26S>9AK34@eN_nHZ(Le0+GfB4BCc9 zVA2r80vW-`$jC@ai2nco|9_pCcn63Eg)GPnQ0Ri`ti3Z_9Z1LA{X2SkHn2tF$|(Xu?(U?F%6 literal 304 zcmWHE%1kq2zzSHQq8tni3?Meoq_0Ox_@3>Aq?7vMhx19h9E_ZjHEc>|NsC0 tLCyf_1UUsngPa4RK~4hEAZLMSkkddk$ax@|0w;3WXd4>Z=^7ex0RX6GI)eZJ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Pago_Pago b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Pago_Pago index cb56709a77dedb471150f4907771bf38f1879ba4..001289ceecff85fe0d0f376a6bc394329445f13f 100644 GIT binary patch delta 25 bcmZ3_IEitBGCuGA|PY0|PSy0|Q3`0|UdvY=sHR6T@r(NWuk! diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Palau b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Palau index 146b35152aaeffb5940d30910ba37703f4096285..bc8eb7a55b8a20a8c800507b620d0afef1d477a4 100644 GIT binary patch delta 32 lcmdnOIE8V7^27ud9!3TR1`uXoU|^V_KCw`gk#XV#6#!><1{MGS literal 180 zcmWHE%1kq2zzdid7#Kj9qk(~eq5l8>|BQ_P|LaTv>8YE*z~bW@!k}$n$v}ij%nS?+ sAk6Xq|Ns9Y56|a-=sGjAHz2dXCNnX?jTQk3B3r;^qitYmr)$Xt055POvH$=8 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Pitcairn b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Pitcairn index ef91b061bb145b2658d49fd5065ed74b1a6cf6f7..8a4ba4d30a6b7da8399f20a8b98c91169e04ae40 100644 GIT binary patch delta 34 ncmX@bIFoUL^27ob9!3TR1`uXoU|^V_%*ZscUV@Qv;zCUTbgl+x delta 74 zcmbQqc#3g?vN$sX0|N;2H83zRn7TM|)c^ngpOI-|f#L*ZWsn32^Zoz-|9_pi-WLX_ KA`lHzs0je2loU|_ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Pohnpei b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Pohnpei index c298ddd4debb649220e5dfde60948591bc6a3501..b92b254a9af107fc4e40c4ca38d1ddc110effefc 100644 GIT binary patch delta 65 zcmZ3_bd7O>vH$}E0|O%zgV+;vCa$z#V`O4xVqu>6L0-zoH-tgk(2zmfz>-1R(13x< NM%&QPPS?@}KO++( zGZQ1@|Nl-`7#J8BW^G_#VPL46z`()4(6fMn2O{F*8^WM%Xvm;#V9B6uXuvQ*nU#Zq efq`vev<*K<7sMcDCKhIvH$}E0|O%zgV+;vCa$z#V`O4xVqu>6L0-zoH-tgk(2zmfz>-1R(13x< NM%&QPPS?@}KO++( zGZQ1@|Nl-`7#J8BW^G_#VPL46z`()4(6fMn2O{F*8^WM%Xvm;#V9B6uXuvQ*nU#Zq efq`vev<*K<7sMcDCKhIlY`RNiOk;w`o|0^ZLEL|1E zUQC@Kp_I5l;zaojDJJIyQY#{7NIz0tAk$$zL-r8+0=W#?8S)EXE>Lj)KSQzc^a3SA z842aA7YZr@|0GnsPARB3N&{c&;sPt@xCBNf mMrJg~^8de?2?GNIL(c*R76yj82@D*QO&Ap?C~pkoU<3ebx+&oR diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Samoa b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Samoa index cb56709a77dedb471150f4907771bf38f1879ba4..001289ceecff85fe0d0f376a6bc394329445f13f 100644 GIT binary patch delta 25 bcmZ3_IEitBGCuGA|PY0|PSy0|Q3`0|UdvY=sHR6T@r(NWuk! diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Tahiti b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Tahiti index 442b8eb5a438985092d8657ebcabe8859037482a..50a064fa0166a0dc22f89cdadf957a545d3f6544 100644 GIT binary patch delta 45 wcmZ3=*vdFTd13+!4n+a literal 166 zcmWHE%1kq2zzdid7#Kj9qk(~eq5l8>|BQ?b42w)adR81@VDa${VbC@-Vj#t&|NsC0 XuQL-m12O}*iCi|?hDLU}hDKZf(6AY& diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Tongatapu b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Tongatapu index 5553c6009acd272cae012a08b618c2fd649dceae..54aeb0ffa227e767e88d7bbe57447d0b1e690ffc 100644 GIT binary patch delta 78 zcmeyu^pk|NsC0>&)19fM}32K}LX_3Zg;I1<@cUgXy9j4j>xj gbPx@4K8OZ+0ZdmZTmaEj^a_`awxO||uAwm(03GB`#sB~S diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Truk b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Truk index 07c84b7110ad9589810b916390aedc7ef498f423..ea3fb5cd3c9e5e132c19a5320516dbc45a089135 100644 GIT binary patch delta 81 zcmeBWI?OmhS%86ofq@Zw}(Ka-&(={~U0suWe4om<5 literal 269 zcmWHE%1kq2zzf(I7#LU>7#MgO7#J942rhoG!1CvZldrfEE(!8|sQ>@}KO++(6C>mQ z|2Ahp=JYH8sji#Az`?)(V*B`pFlZYZFlZZCG7w=KI|Bm)E6BG0|Ns9NdAQ#MMAwGJ_efE>cWfZb7CHrj>;cDjZJTma#r BOXdIo diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Wake b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Wake index c9e310670f07e9e577791bfa19fefde61351fcdf..71cca8877d33561091fe0faf319f3d3a4f14bbc4 100644 GIT binary patch delta 45 wcmZ3+*v2?Pd13+!4|BQ?b40B9CdR81@VDa${VbC@-Vj#t&|NsC0 XuQQW412O}*iCi|?hDLU}hDKZf&Ttu_ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Wallis b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Wallis index b35344b312c6ca690c0f79a858c3995a05c71ff3..4bce893003069bd2f7a3602b674c1ebf9aa55bac 100644 GIT binary patch delta 45 wcmZ3+*v2?Pd13+!4 literal 166 zcmWHE%1kq2zzdid7#Kj9qk(~eq5l8>|BQ?b3~M4ldR81@VDa${VbC@-Vj#t&|NsC0 XuQTIV0Wt%(iCi|?hDLU}hDKZf;mjG; diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Yap b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Yap index 07c84b7110ad9589810b916390aedc7ef498f423..ea3fb5cd3c9e5e132c19a5320516dbc45a089135 100644 GIT binary patch delta 81 zcmeBWI?OmhS%86ofq@Zw}(Ka-&(={~U0suWe4om<5 literal 269 zcmWHE%1kq2zzf(I7#LU>7#MgO7#J942rhoG!1CvZldrfEE(!8|sQ>@}KO++(6C>mQ z|2Ahp=JYH8sji#Az`?)(V*B`pFlZYZFlZZCG7w=KI|Bm)E6BG0|Ns9NdAQ#MMAwGJ_efE>cWfZb7CHrj>;cDjZJTma#r BOXdIo diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Poland b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Poland index e33cf67171da78aa9e6eb02e50f9b9603da4c3f4..efe1a40f2a8ffd499d22cd83e6b5df6c6c1e8e5c 100644 GIT binary patch delta 206 zcmca7GMjyZxC{dtU}Rum0AY~u1aUzS1;arM3=C|W|1(cv3Swkt0zp<5RuDxEJoy5r z)Z}hvE;AqB5QcEy5C&)0U=R_);0j{6x`r@tIlG4F8iK@ie2w)?^$c`;4GloFzA+a7 Da-S8Z literal 2654 zcmWHE%1kq2zyRC~3=AL)l2{65OEoYsFw9(`bzwG-c*5+fw?53dxo*PTC0i%V+c{yv z{Fdnx7R=hlurPHm!?N0%gcD`=1kOD77C5_7e8Ra!&I0ErnFw5H*~M^i>ZF28UAq%5 zC;czD;;lU4YTR0ZYnodGuIoq%+~AxhaFglagqtrb1YU$(VtDa!OT){DOB-HYoYwG0 zWE#VpU7H!+u3EzIZq`(W_gA7AK2()6eB5Hg@F^;i;qw$ZhA&pu3}0)l8oo)%GVm@5 zZQ$$XVc>5uZxATaXb?=1Y!C|JY7q7{V-PWZ(;%vRw?Rz!T!T3C{s!^S8yX}YFKm#! zJgGtIaC3w7p7jheYZfrb&Y8#{*VDuxUsKGWkdwlo7!%5%u1&gwit{j13Yji;&;G_Q(H&^pRKL3_)O2|7z&PSBllYl2?O=?VHJdnOp9tes#O zdsD!uXp4Zc?QQ{+plJf8vU3H@j4A}o{?-dvNKctyaW_%G@^{$;tG&(w*0&=j*er{m zV7uFDf?b>A1pC=C6CBc%CpflP3OKp3PH;|<7I0C0KEc)buYeot$qDYt_XXVFJrnR` zJ}BUM?u3BXsAT)oY_CYx35RQZ_UC9{&{%<0X@wV0>ir|1m&bo2sY1|5aQ!L zAynLNLYR)`gs|@h6Cy<21R|~rO^E!eArQ6g%Y^8wTmmr*1O;NZyb*}2|11zc<(xo5 z{8fR(+E){j?6(Uf$DWyxB0p0g)pp&4G>)wk(q$)1NPjVXLdM^s37ID7mf&2zPmZ0YQr*t>T|m%)XY3Ip?2Ne33ZiACe-)UPhezbVrF4w;b3EDW@2Sw zWr1)(EFv){7wsVfgYX7WP7>b0z{0>Fqrk|)z`!TKz>CV(GGG)0i7<#ENSI0=-w=jy z-w+08*I*D4!r%&GxVnabjAdYCWMpJuWCXK81S2CU+4}$g|Nq0bT?hctpzIBzL0KG3 zU%mAKM1!(Ahz4bM5Dm)mAR3hIK{P1qgJ@9p2hpG+07Qd|0T2x;3P3cdH~`V0A^}8$ ziUkl2DjGmEsCWR;pdtc9gNg|d4Js-?G^n@$(V!v&M1zVA5Dh9iKs2cM0Mjok1VA*X z7y;8Cw={rgP;mmHK}8CP1{Et{de>$K5Dh9`Ks2a`0nwmh21J938W0UCZa_4s$N|xy zVh2QniXIRRDt}04W&jmiAU>$*0@0x23q(urSr4MX#TbYID#}1Ks5k@Bpdt-K zgNii}4Jz6|G^lt3(V!v@M1zVs5DhBoKs2bh1JR%&4@`eGnE;|eMIVR;6@MTaR0M)( zP%#LiK}8{m1{H@O8dM~LXi%{TqCrI?hz1ppAR1Ief@n}N38FzoC5Q$UmmnHcWP<6x z^#ULoRCI#ryNO^vs0an|LB%MD1{I|s8dRKuXi$*~qCv$fhz1p{AR1J>f@n|?3!*{A zEQkgbwICW)+=6IOkqe?h#V&{j6}@2k-7~QLpduK=2NlC08dMa6Xi#wsqCrJ6hz1qQ zAR1IOgJ@9k45C3rG>8Tj(;ymDRD)zpihB?ZD)K=zsMrV5 zprRi{gNlC;4XOgb^o!|W_kgMb5Fb<>fM`&a0HQ(F0*D4x4Imm+J%DIX6#=3_)dYwJ zRTUr_R9%2*P?Z6qLDdF`22~v(8dQCNXiyabrawFa#|Nk?0r5fA35W(&DIgkDt$=7y z)dHeH)eDFQRWTsCu5t<3{i9V4&Z>sX*)>Gh5L7Yg_!{e(>KW+x8XACTePb>FJa`E$ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Portugal b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Portugal index 355817b52b1b05680bbb57e4dc8de358eff27a39..64841661a01a1cf9e33b5ae3f013f569168eb77c 100644 GIT binary patch delta 268 zcmeB`p2IysT!sM+FfuSOfG|jSg18`vg5hok1_rjxs;sdr^-PS!LuN)MMr2HsP8PhX z^ck5LSy;i4@&Ett$siZ<2{5vNXa-IO1{noLUIqp}0R|y3TWqpDue3B*xNC?(xNC5T Uj<2zvsh)wpp^mSi0f@x~0LKjxc>n+a literal 3469 zcmWHE%1kq2zyLf93=AL)lDG$DOE)kuFid*Z*D%{Vw_x_a;|+7>ye*h}vbkVheNn;u zRogx+hz}`P*!`+tk>kyR#d-M!OO$y&EcIXXVHNB9f>mGoKCC^t{KLBC${*G*@GscV z&iY|vXZD9p1xf{*i#iIn1h5orH}Wai!GEG)$N!xLJKwJ=*mGk0hrK&ieAqWXzF_~1 zt`7%hefV&&BIm=QjMxu{Bm6!bv1ctfYGLrtZiyxe6@P2US&Y}-zryn!lZg4J9xbbtU!p)a$ z3U_u!D%{=Fvf$pL(gpV?r7d{S6u#hLk;j5ZNtO#92Wc&M;v~J`sS(eDXNrFpJeSr~ zc)=~D@ZvYO!pm2G6kgqWtMK~NJ%u;B&MUlKbwJ_Wtc?oqyA~;YsG6+sF{?%4Q}X%+ zpMw`H_~JZq!B^v^1>cm57kn2^S@457bit3$ZVPx;YccT7mS*7V=3(G(F>eqk(P$7% zk!%nOk(eOt{JTNK_}2tc<<}F$gzrocXFfYY{PVsE5|8&Tki5KLg4E%O6QuX-6_8o8 zPC$0fd;z(h2?FvpjRFceMFNU3$pT6~Ap*)at^z7LW&)}*>H=y!5(4V1&J)zXnoQ7m zsyadQs@MdrqwEv3xBQr(v*hIj-6^*w=(U`lpkK0Qfnvb>J7R*(viJ$MyR9bJwK-0(pDi=N zAx(LLV~eGLlN;*<=M-rH7uDwzT%G?4xUrs`;I4dM!2R7b0Z-x(CylX;GPU?hU^PCAGKJF7j#r-CP>1a*}`))8H zLexzl;=0g;$gdg#QQN*uh`!1t5VJr~Aa=_efw=n50`XJM2_(c{6-caoH6h7Z^*(;(anLD>Dl-GA2qNJ0bHqIKhyMjr#Ea z|L@75VunwEkp)CEa569;vt<+*c@g3aLLgZXDWkwB24cf>`S^w~gu4cV2oUxSVQ_W@ z;ouOEZbn8%Mg}ke;xRzjq!fPt|Ns9VXUiiCqCtfqhz1peVEW(j1`rJ@5J5DkPz2GS zf)PZ63P%tPDj-2LsE`EFpn?)ag9=L!4Jt4}G^o%7(V&78On>S70HQ$!D2N6Xq97Vn zkb-DXVG5!_1uBRJ6{;W_RIq|*P~i%qK?N*`1{Jbk`v1-X5DhA9K{Tkq1<{~F7es>! zUJwl`d_gp*00z;ZLKsAY3StlqDvUuis6YnMph6i$g9>I44Jw?$^v(NV`#^;>hz}~L zK{Tka2GO7b8%)1h`~XCQ3T`lcXA#){paLAk2NmKV8dQ*j>7)C>=7I`z5Fb>igJ@8} z4yKnb1j~a8cn}{{$b)E5K@X-|o5Av+0w2T&75X3=RPcjnP~i`vK@|Xq22}!J`sY*y z5DlsfKs2aA0MVdI0Yrl;1`rLZ96&Uvf&kH=N&-ZKDhdz{sw_Y>sKNlzph^QogDMUX z4XQjqG^hdr)4#dF_JS%B5Fb>TfM`&K0-`~c3Wx?(EFc_9ZA!UNHuN)JSXDn1Ym zs{Fw8R}-*1K$Ref52^@3G^jEJ(Vz+uM1v|t5DlsrK{Tjx1ks=h5=4V4Ne~UHC_yx+ zvINnf3KK+wDoqd#syIP3sPY8Uf9nN6G^i2<({~fWd{AWy;)5zw5DltSK{Tjh1<|0& z6-0w7SP%`WWI;5jq6N{Q$`(X}DqIi^s&qj#sNx0Dpvo6SgDPMU4XT8}^t)$Z`$3g4 zh!3ieK{TjR2GO938AO9BXAljlpg}aKk_OSBiW)?NDr*o8s<1&csL}?}po$wrgDP(j z4XVIFG^i2>)87ri@d2vLL3~h!4x&MoI*0~U>>wIcxr1m>1rMS@l{|?nIIaC~)m4e%n$P|Z*KPJQ z++a&9xGDRo;pX$1A8!3uW4L|dY{8uekqviOF?_gJRLpRHYf8a`npTE~)24rT6uYD0 zarx#3|Y~VV#_k-Z=g$+U>cMBMqCU0bvpL~FkWAX(? w2{8tSf(8Z_AKwrL=im?quiy{{XO|F$3CgTsUu}%;Wt7FPgv&WNMAw1~09TZ8hyVZp diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/ROK b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/ROK index 96199e73e73aafacd89e48cb2855a96d7a134e1d..1755147fab44e07b7527ce1eaf3ae991473fb222 100644 GIT binary patch delta 36 pcmaFKGM{;Z@?-%<79K_h1_lsjU|?XFpw7s)S)NgsadHroH~@D~1-1YH delta 203 zcmbQw{E}sYa=k1A0|Pq)1A{>K^$!)3o{9aq=dOJc5gF6i^(g?>TBi|1c5UhxN2ygGg@ zlX@!U~1O2@@3a(kCc2J55mb^PIrQG})8UUW|dEX8|LR ok8cQrcW?-US8xb}w@V1a1Z7sR<2FX?GRk6C!sQ(tqHD@}KO++}3o9Ed`^05|6O diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Turkey b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Turkey index 508446bb6aee2841ab88e82607a6ad6e748e7db7..c89186687300068ac4e8505cc0012a1dbf6a9960 100644 GIT binary patch delta 122 zcmbQuzkzdtxHJPAU}Rum0AU6OhRF|@Bm|MAiy0Ug*fw)A&tYa{oXp6iHTeJ=3o{EV t3zRK3S%FOGMetN>qm-ZKKz25xb_NADBJ6A3w z+}&gs@bSyegfB_&1HNXkC47^&xWJY-xq#hrRss9(QU*@RngY%Xry00@#uadH{MW#9 z)1iQONoWJ#vb6>LE#?jUKLi6LJ2w4NPbY2;rgJ){riJDt9pU@SBV0Rr}9eG`#z2#1U z&XThQy4}qm^jg*z=$9-gFi4qLU>LjSgHh4+55~6hK9~emelV47_+Vxf{lV;S(gzFa ziUNzfE*~s^M-^D@Rr_Fl+or%~nR9{dZn*-xHq`?A*$f2^Y3v1=jx91DoLpZPI4A%6 z;G%lEz}5M|2RGJ}6Wo>W3%I{~Cg90@P{8xt2?4Liiv_&btrGA#vwwnb|J@0GYZgxM z&&v}C=xLr17~VA@C?|D7u*E)s5Fhsmq2hiM!tCZv2>Wg@A^f~vK>h#!{~0G6vgo<6 zu(B|-u@etDI58m0L!1q`04-qyq5uE@ delta 12 Rcmc~VnxH)~jvGV>0stPN1X2J1 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/US/Alaska b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/US/Alaska index 9bbb2fd3b361ea8aa4c126d14df5fa370343a63f..cdf0572be31d3052a98494e3d01802b83737f23c 100644 GIT binary patch delta 91 zcmX>sbdi06xC{dtU}Rum0AY~u1aV#v1;ZhmCor#InykPPGI=9MiWHZlcW{WMqqj?l Uj<2zvk)DB$uc4uyp`HO300f*3>Hq)$ delta 1374 zcmcb}epqONcs(Zr0|N*%FfcGofU-3j7#J8%cbXlzr2M7eQlgW=uS@O={_RM1_`kx< zfMJHK17nAV0aJy#19PFv29`wU1FV5+8`vCG53n0@Y+&z=Kfo#QY6Ium+YVeG&TQa* zaQXnx&6fte2i6|o+j-i6f8{9$fthO!1UuI_2vyei8wh9iIfz6S8i;xpIEYyW8;ENL zIY=nwZ;<3PagbsP+#sbbA|Un2X@m45)dez_R5r*SVqYM)iEV@Y!j}sa$}9~O8&5A# z3X?Wa&U&GsV*1xW)$5dkn&^E4b*(iD>i>Rk(B$e<(7bndgVw781?_$NH|SjMS)e;_ z;Re0Uc?zX$hOb%FJn7+WksMu(Mv3rw&NwCNQQ}q-BGox<{%-P)xEM$ZgES_r^ zSpNR1V0E0!!20%e1)B|O8*F#)RIr=CvB7@!Yz2q>R~sB#wl8qyxztrc+WYw!RK1Vf_mSY#T)##MJ@1;Y26So z&1ONMP5OqQGPwo8GM*bk!Wb5W{L$VJX8LGB*i#RK2)X|X5l6KQBL6*9h+4{H5Pk2k zLQKm$gV=pb72;AZ7{t$OS4i-Evmvp4@q#4Xa~qP=TNkA8ZrG6Op1vUU?W7Iq>YfYI z&z5Y+WY=Dhxi)M=)^pza1=-Vz4RS7MDdd)g8su%@QOFN7Hz??Tr%-4nX;74ZL7`am zw?T>jCWVs!;v32=&Mhdr_j5yq#D)bG`)+Tj{4r@k)x5nMs&AAmsHvO3p>{{ug1WfI z4fQiD7BDg~GqSMagKQk^9QEuR^nwfwM}9Cc{QqB^z`*kVe`5h7$N&G0lk=E8c^McO z7(wYDgc&F5$?$S9Fff2HNMPc|@D)t;AQmVd!SvOnLp`oZ)c?fMNM1}GhX>8BoG3qk1t z#0RAb5DiKfAR3f5Kr|?QfM`$}0nwmz0-`}_1w@0=3y21#84wLhHy|36c0e>J{eb8c z-uew-2Y?b1NC1?WKr|>pf$6g)V0lo&0`WnK3q)r<=Uo7zL1_#`gVGs@2BkF+4N7ky z8kFWhG$`GHXi(Y%(V+APqKmUde}jDtN{AoEn ImgbZM06p6Z6#xJL delta 1351 zcmX@fzC~z)cs(Zr0|N*%FfcGofU*@E7#J8%ce-4-r2M7eQeuF^uS=mD{_Q9X_`f2= zfni2)0Aq)l15<@*0CQo`0hYwT3#@@A2iP2qFR&Ym9boUxy}&8(;{fN{mjPTKZXMu$ zaPtDs&F>Dp2XY>RP)D)c#qni2V27AZn?UL-f6i z1~Dyv9AfuvHi%2P=MX<{szHM9uLFtg8#g5B-Z_w*K6yh5@4f@6?xh=2-!3?it{%Q2 z{cO{LOm@o+nQK!HWIdOz-;h16(IMx8g+XpvvP0emDTDklSBHZBKL&+n>JCNu_Y8`~ zI2}s-4;YmES3OW>ac4u>ef9$t68kn(?0b2j^2dS=Rr5|CsJ_v(p{8!_f!ZA@8|vcv z57f_a+rY@g%*euu53+HvbJVkQ&i9 zU<9Rq5N4dHC&SCdz`y{)Ac2V+!&flXgIJ(=1k;xXa>=ss0PuX=mycCC_fM`(K0MVfI0ir=^1Vn?<35W)z6%Y+dFCZF}W%Tm d5C&(L5C-Sq5C+%a5C-S)5C-RfkjeLXB>{?k5ZeF% delta 1628 zcmcb``$Kwycs)A<0|N*%FfcH@fwCnU7#JAlEz@b3zw2kgf;PT}g|luKEIM7nu(k=>;o{cQdT`xB0^=;kgW}?oIu$`g1+QntkOT)?Q9zST`^7 z!}`t63>)gKKWv;6->@k?qF{54W5X7AtAedD$_?Ap>tzbI+psq5VEb3FQ~G(s&Swt_ zcC)fD>^^p=V9%3h413q#`>^lG35Nas2Rkn5$uQFUy zIQ!wc>2`)24C_DKtQVchaPz^$54ZkpZMc1)_`{uh(;M!toKSFYUuDDn&Z2?`^P(Fb zW`-0zs}gi;Bu>8JX}HaYXYMu(&&}mNyik{8cqz{C;T1ar!>ezPKD>VRh~dq( zBOl%#JHqg8|HFd!>mM|Hn18t7WB;LsPxVU+KIboK_!8e<@YTPq;hTMCLH&3AjD{Z? ztsj2!do}#xNdNHbM>@mr7oH#f-0)=hdqVreza82P|5xySV3@(nz}Wu&15^2X2IfMZ z0+vMX2G)Rg1#Av)8`upl6tMTIH*gAUD&SnZn1SoVlmhMtlN)$$Zur1^ptON+=cEt( zDqe0!fZP3{p&z1yY|R z8l)foE|9tSt3meQ-2%CdcN*ju?k`X%<7ZH8Tv(tK`jJ67YwrgY)5{F1Uh_YwiEd?3 z*J}Kr{_kRgCRg$Y&3l_0v|hP>(B3z-LFaN(f$qHW2EENL1^RW74F;3d3JlZB7>tVR zISP#3BN$AAUKNjh9A7=OmFbH=2zfbQ`z9R&7iW&_kkD%dA%7Sf z!c2D*ggupGh>*MTA>t?lL*&10AEK5#Vu-#s<3mi#5r)`(RUhI~mNCT7i}{e?d#E9? zy|N%lcS%EXdUQbwZ(BpEyKO=0+l+>Eb@_tyvtA9E?2HAOYjqm3o;@zep61DrbN>H_ z+%jzjpS<-CKjeq;G8FV5{!nQ8o}nmz>4##`iwq_H?H@}1y=^G7SW-}S?|egrL|Z|{ zzKso)KQaoc=1p#>zTs6+Q&-whyF;g-E-t*GegP5#5$HCchpc5)k= ziq8N4s~0eE`1pn}IJ<-}I0uI?xCVzXIERNYI0uA)ayR3lvWv8WdL`8Wdk3 z8Wd+B8We9J8WeXR8WevZ8We{h8WfKp8WfixI)%5s4eS6=q=E!M5euS0kqf5JdV%FZ zkqqL4A{s=4A{#`5A{<16A{|77A|6D8;vPhU;vYnV(g27Cr2`NRN(&&mI9v20hz2JL z5CfDjKr|?Efa!bZ!43c=5)dDhP(U;&v4Ch$f&tN>L<6Eh2?s=j5)X(5B_I%uD-mgv LkccK9WRnB{Did$a diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/US/East-Indiana b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/US/East-Indiana index 09511ccdcf97a5baa8e1b0eb75e040eee6b6e0c4..6b08d15bdaba6cf94dcb2681887154f4d265d8ba 100644 GIT binary patch delta 89 zcmZqToy;;pT!sM+FfuSOfG|jSf;caTf?>7IlbI|SC+}cXn=H-bCc)(z9AfI~5~Aa4 StY@TWpyO+3sAs5Wzy$!A`U~3t literal 1666 zcmWHE%1kq2zyRzF3=AL)l1PTKWf~Y580Ib0X_&w3XTgFtzJ`UfZWo*iS86zQ!@b~i z$G?V4%3lgDC31eaT>6>eio@#_-#{4@Q?8=2$;r_5NM-c5LEgsAy`JRASCoeLdfsW1!1PE62hMHe~6Gf z_8{WO#}ASJRy>GWa`{8_y{-o_En7dt?#p=)mooiB{5-!03BFqj65F#Al60pPB&Yi( zr0`Z0q`K=Tq`r+RNLLq3NIz>+kjeHrA#<%k(vU>*$DkLfrD)ucdsQeL?P&Kc$ zp!$YQLQP$ILG2E?gt|D-g8CT@2~3P&$jkz!ARHLU%EZb>1^EB}dMgHo|NnPxU}X9K zfAs1|>TX4N7_-8kGD%G$;vzXizc)(>L4;Kr|>hf@n~Z1k;I} zA3!uHX@Y1_@&wVKBnqNI$rMC`k}8M>C07s)O0r=3!9=irP|^kQLCF_HgOV_a1|?$< z4NA%&8kC$tG$=`fXi%~S(V(OaqCv?UM1ztzhz2Ed5DiM|AR3(9K@3om2Zi4Be;+^; zDCvV}Q1S=Spez8UKd%7GgR%mM56TW88k8l#^yVC}JSb~`_@L|oqCr^%M1!&khz4a9 z5Dm&MAR3fqKr|@ZfM`(G0nwoB1EN7$2u%O}TmYg$SqV%(>f~-1o1)H5=4WtCYW9;2bKqAQ4k-LO+hp$tAc1yb_LO(EDNGR*%m~DvMz`QWnT~t z%EBNTl#M|&C@X{MfA_)WgR(S;56adc8kDuc^uEPlc~BMy@j=-fM1!(Ahz4bM5Dm)m lAR3hILG%#L`dqHTA*QY_Av(UsdPaH%I=+U6dWL!iTmY~Ia9#ia diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/US/Eastern b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/US/Eastern index 2f75480e069b60b6c58a9137c7eebd4796f74226..2b6c2eea14df07392729ae9f5712a44ec4f02bae 100644 GIT binary patch delta 93 zcmca0eSvp^xC{dtU}Rum0AY~u1aV#v1;gt%Yp^!3P8MV_oXpEoH@Sw_NP^2XIKdqH}Fcs(lv0|N*%FfcH@fwDy!7#JAlEt4ylzw33vf;NVNg|p5kEJ}S;u(ceu;&V&`lYd);_xAeg(;l2;6?zKNy{kh=7nthoM)?Ni2{H5Sh!tV!{OP_qW;&AuD)zD)f zt|{z)aNTsphZ_tFAKa`L?fP)@LGy!K|CSfrK9Kt0&b`ipyDOU#?(NGixZjzQ@L-;A z!NW|qghzGy1&=*75}w2f7Ca5td+^L%_rr5@fd?wSed5q6fSO(hK-@ zwmjfp+5ACZX4(V6&eRV=l^zd-Gu=OkL~7MP5cSmjAZE$)KwOjigM^Z1f+WY=4^m9r z2~wZ93Zx&tO^~_xra<=K`2@L*=L+N(ZcI=pWB8!hI5|Nn^w9_9to096Opkm}^_uuV zO?24@b*i-TGXmW)<(7d;_Ke?U7jP@m%v-5tikiPZ6;@SHTmcRErusU|}gZ1rs4{X-I zE3n<&@W8JBLV^A4qz4Z9n+hCT>Jyy&rxZA+Bqq4%mle3WI48J%Uh%C7---uOOD=zizSs32re*7g*nK$<;!>u6h@a>8 zAi;M_L1KG$LXz&Zg5-4HgcRP2f>d|?gw(fD1?lR73F&8T3NqO~CuFXbE693wH6eSN z)rXw(A0OnF$$aq1TYvdMe(1js1^rte6q-KxP?SIYL9yte4<-JU4@&;sFDSE^mQZ%@ zU_pgMMMA~C#RZi=q7tg+wH8$0ut}(?OE0M1A(v1W=UGrcgCSw^Lss?4A6U62bFkG- zR$#N8+{R|a1jQ`eg&LUNoCD^ALJ!0T zg&>Fqg(8Rsg(Qdug(ipwg(!#)n8uO-qCo)*qCtTRqCo)+qCtTSrhk8~F90z>p$(>= z@`Eh|g*u223V9F>3Vjd_iUAM}iUkl2iU|-6iVYAAiV+YEiWLwIiWv|MiX9LQiXjjU ziX{-8!dqVfb^s{4KmwpB1JR&p1Jh@1!1AEz1Mxvo2%3!*_W45C4?45Ev(MGt{}42o`$04T~qG$`7^^u2>%2Y{j<#0Mn-5DiKO zAR3euKr|>hfM`&X0MVdi0ir=k14QFW9!eldNb=xv4GuANbqUe&HP$oIGtluhG}JTH HGvERM`Y)4H diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/US/Hawaii b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/US/Hawaii index c7cd060159bd22fc5e6f10ac5a2089afb2c19c6a..40e3d492e6c22c30041c31f159d4fe0ee9451c03 100644 GIT binary patch delta 54 pcmX@fbeD00xC{dtU}Rum0AY~u1aVdn#V~PwJ3E(0aEPG+7XYHG22B6} delta 99 zcmcc1c#>&?xGoz50|N*%FfcH%L)jt?3=9mrS)Dz0D;7qa?zBB|N%>2`r9@AQiIbgq hKnfW_1Op?(1aVf7Ubcz;?ZO}-m^hb5aEPG+7XY_K5sm-= diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/US/Indiana-Starke b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/US/Indiana-Starke index fcd408d74df43310a9a85c475f83d545f6d75911..b187d5f8c75685af67913e9360b50ecad19fe6ad 100644 GIT binary patch delta 97 zcmew(^n-nZxC{dtU}Rum0AY~u1aUzS1;eon3=C|WmodL#nq0*ZJ6VreWwITogans! aaEO_+ONfrIv7V8hfsU`Cp`M|h0T%#S{0^-E delta 1324 zcmeyt{zqtncs)A<0|N*%FfcI8g0dwV7#JAlEz@b3zw2kgf;PT}g|luKobLG7a7p<~ z!KFmb4_8C4GF($Q`{BCjc7_`a>p$ESoylpf(P@W8y;qc6g;Z4ZFuZyR`4WFzTs)O&4*|1^)?L8&E-D4P?uwP@k#8%D|QBk zR~LVLc>U}V!<%bIKD<44gyG%(hXwD~KWO+c|8T*_{zDC4;@b;;{YYo{{lfFZpBtVG ze@|$C__srw;r|NW4-7MS85rB&e_$$q&%j*BQ^1nQ-M|{~u7J(qZ3DZ(g#z|o^#)FX zO$D557c+2um{P!9|6p@Vcn_2|@a>%Rfq&&B27#F+9|Su~7=$XrJ_u)qF^EK3 zd=T}tU=XvE`XH_;#UP<%ULeWwhe3)-vOwySM1%Ch-vu%ke>KP+yjvi*@lJ#M!uROE-)c;*<(Bw+~Q17B&R^aLqSm643 zJA=D!?g#hFGZ{R2{Xckau4eFhYxu!?&h!SKYkmd3HI)s1+YAc)W1<@ZrU?}U+SoP( zm3}D*mXU7=3B6Vj@`te@%ydUV*i$)%2)QdCB91aJME=|MA!^AZhUj}UKE$*fVTj#V z^&u{08AJTMm=6iQhZ+*wE9(oAbeA+Fr$-m0@U}Iiy4x0{zRhSzSC=nHKkL)GRi>}j41Ip_a>$Su=m$XoyLLw*=9LqY%H4~3@h8H)0kekc~b$WY?n{-NaG z+lDfWB?V>o&Noy@v=vnB+t^U~Bcq^d-sFbr8(sx9b)^lpJ9G-_;=&v1XK?ZrFflSQ zGBLAEE?}0QoXc!JxrA9~as#vA=MG@92~;n93H~p91z0b z8XN*jvJ8x1l7Vrep`;)v9fL4P2%MHTM!#XI2k}553#Kp61X17+1~EXP45C3H4WdDz z4WdCI4x)W)DnWUH0Tl8eJ}C4-G$;l@G$hfM`&X0MW(uq8C9lIBkF!p!5NvL1_d`-#ZU>04S}1_@MLxqCsf} zM1#@|hz6w{5DiK{AR3g0Kr|>Ff#~`f@T3GzQJ_=>!jo&6h0xQLHu33-Ve)-uNdPAl B#CZS! diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/US/Michigan b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/US/Michigan index e104faa46545ee873295cde34e1d46bccad8647c..6eb3ac46ec56985b52488ae6a8d80247c2adcd4a 100644 GIT binary patch delta 68 xcmdlc*vvjbT!sM+FfuSOfG|jSf;caTg5iM8k<1-TlM|Q%CckB}nLLj}0s!5y2?ziH delta 1190 zcmZo>-zGRgyq=ALfdPaW7#J9Op=^oPy-LwDZKg1s?)Xq}N%>2`rG(!PuA8p-aD!pt zgWtvzdVasKe(>jp)rY?)WFN3O+%I4^IF!KND_OuPuq1(tVQ~T1hqeUn2dxD>Hy1tN zJ&<0&x3lE||H|eM0yEPd2zI7^5UTWeAe`y`K_s$X>w&1J<_9rLo(JNZ+#e*AG!rB_ z-hPl`;!cqI#8n{u@NI(3#Ww}A2hS(SZ9G>Xzi?xMLK(vc#m31AN}-QFC}*vIpkjLD zgR0lW2Wq0rKB#LIKT!X7xImLD^nvERr3G5A%pYj)YcJ5b9Fm|rFS9^zvsr?Eop*u3 zWQhdB^z;u#^+mrDjNLsym;~KPFjd$7U}m&0!JM71@Z@!T;JG>HgV$T-2i|i!3w*9QB>2{37x-;cO7M^IEvOHe#*z?dqhAnI`Ya(> zMzA0x^h83)@6QEcrmGUdp7MW)kURDu;>gDjk^fdah+1;_L-f6_2Qe*MKg90Kc@UQ} z{X_gbzXu7vTM81}vlEhZrxhfp`zECDRurVV>nEhXjVef27feV$Yg3TP_BkPQtz1FY zv#SZ&)2u$^od5VBw@k+OL*Dw!5As9*eJJSP`k>JC!H1&!=?{uU4}B={uY6GQ?|wm< z#k7R7dj|_DBq|ar_AM@`{1KHOm|}Sb^!wT^~R+D9ph0<{U5| z6m}p!DEvS)C=5X~C>%jFC@euVC_F(lC`dsxC|E%>C}=@6D0o3MD2T!I@6YuGAO10-{0j0-`~21EN9k z1EN831fo-T>np$x07Vu^02E;$8Wd?@`m7CD9u#>XJ}3e~G$;~5G$(fM`&{0MXbIhYCmnmN>XvgF{SRT|#txjrEN540L=A K4fPE547dQdBB&q$ diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/US/Mountain b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/US/Mountain index 5fbe26b1d93d1acb2561c390c1e097d07f1a262e..09e54e5c7c5bb2384e37626d4b985cfad29ed29b 100644 GIT binary patch delta 89 zcmeAXp2RUhT!sM+FfuSOfG|jSf;caTg5ku?iLYb_9 zV&nP-rTWnS0?Juu7*tFj3aEOmV^9-4ETFD6fkFM>{Rx^}MGTtv4o=W|6~dssZ}9}3 z%LNU(^I9k9Z4PSCuS=g`FxjNRFug^2H%?Y34Yt`8vJ82 zCj?AWXb80No)A>V)DSGAJ0T?WNkhmV{t02G#~Q+(>Ig*0J!XhF$|n%{?_u36(#}8mi_koKSs3D59aJu6aW34y%T` zxYP;tGh`Yjr!yx`p1^D|c>*)*6x)&7ELADC9tVQ0ReZPzZu(P$+_EP)LGkP-uc^P>6zPP^f}vP{@L4Q0Rha zPzZzRKm7F*Knze&gXyO_U<*M(4&sA?9YlkI9z=tJA4G$q07QeL0Yt~{>jY8Y*Z?s= zF#@7Nu>zt&F$1DOu>+z(F$AJhcwqqCsf@M1#@+h_1d70V;MFK*<5b2PFv*4N4Xu8k97c7@?4v1ZGu3R(W-oEw;_dEM0JeZd`;bCUMghzGW z6CQg8O?VQgJK?FO$%JR_UINdB0tH^E>j=E~WGwKCy`E3t)g@7Z*Uvr(yxI6&;O((X z0`Df?6nMY>-GmQ?y9GY>UzqTz{@{eq`I{zuiC;Y7tN)Y<-|Sl_eAh3V@Izyfz)${& z3BNd61b+Q!R`~rQP2kUsRE57MJOuvja98-hLQ8;QhNc2z2af<#1-Alop~eK3MD+!% zfm{>V961-T8@!poUf=7yfK%Yy1kSbl6}UcZn85vD{Q{nwX9aiXXR==||!d zWG;y}U51ION}1;MlTqf|LKg1yyg34%o2M&y zz4a6Dp0jy@&$X-xzBN-9_-*r<;2%@IAYhu_gg~3f1wmy36M|)|7led$O)-$TNb3NTTe(oo3aHgtB|D7gR_rnozOt z?1IW4EfcEdtzS@mBW*%W-NXg8J3J=T#T758=bE84fr*ick%^gQasW%o zxIo!~5ll=F=LO{t5C-vgZ4CdwTn}P_0t-xE-l_niL4gLQH%|xiL4gP2g8~plg8~sm zg8~vng8~yog8~#pg8~&qg8~*rg8~;sg8~>tg8~^$|BNT4T>ZXox)qc z2%k`7BMN+5-hq{0;t9AXjR5~Aa4tY@TW OpyO+3sAs5Wzy$#GvDJ?N diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/US/Samoa b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/US/Samoa index cb56709a77dedb471150f4907771bf38f1879ba4..001289ceecff85fe0d0f376a6bc394329445f13f 100644 GIT binary patch delta 25 bcmZ3_IEitBGCuGA|PY0|PSy0|Q3`0|UdvY=sHR6T@r(NWuk! diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/UTC b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/UTC index 91558be0c2bf903b2364215ba26d5227d6126508..00841a62213e6cccf7f0b7353e5e8ae214185486 100644 GIT binary patch delta 22 YcmXTQpPL!1q`04-qyq5uE@ delta 12 Rcmc~VnxH)~jvGV>0stPN1X2J1 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Universal b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Universal index 91558be0c2bf903b2364215ba26d5227d6126508..00841a62213e6cccf7f0b7353e5e8ae214185486 100644 GIT binary patch delta 22 YcmXTQpPL!1q`04-qyq5uE@ delta 12 Rcmc~VnxH)~jvGV>0stPN1X2J1 diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/W-SU b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/W-SU index ddb3f4e99a1030f33b56fad986c8d9c16e59eb32..5e6b6de6451b4408fb71ef73950712a0827d49a6 100644 GIT binary patch delta 167 zcmey*-NQaXT!sM+FfuSOfG|jSg18`vf?+=f1_tiU9Za=MuB_~=Y#eN?SRf~MVN9i5 rY?HlMbwu0(7$q4PWE2==85pz-7!?^9EF31UW7S~i@(uRZHRb{U$!HAo delta 716 zcmeBS|Ia-^yk3xjfdPaW7#JA*plr1U1_p-N@p8xK+I^~=r}ggVyziEo^IO7yF1V5N zav_6d!$O;74od`b4=k}Y+OSkKW5ZHg<^#*+Tm!Z)kxUR(Uw%PM;*Ntj$L#>|U;GCo zUh!R!yzT5Db!PGf={*ZR$gG+8L3U2l2f3c&5ArqjDIXMaLO&?RxP4IaG5?@!qwzsS zNAiQJ4A%!W?%yBOS=9^Fze*HnJQZ)ytk~b6dF5Au){)l*+FR}v=qx!~pgUz>fnLk{ z0{xN&1qLY-3k+lTd@w4S{=wLG-UpMQ$`7Wp4Ij*mqCc4ZP5NLVT~T0h*X4ud@2CQ+ zy=otvUnBQp~-3lj?~8#@O( z8z&n(1afgBK^|TtjvTTKI-8GcvMjTXg@ps7AOnM20HY)WgNy=$ECYj<0fQ(514LZQ zfKd@9ZsC9|J~@_ILmCvX42&R>5duI=h`>Z0IYCg=gD^-G9Q_-kYnfb$bUeCyk@-|` cyC%p{5T`<%4)z8_04&A8z~vk4t!vB$0F3&tH2?qr diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/WET b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/WET index c27390b5b638399057d5f5c6d09ef8c81d5f01c1..423c6c203a508a162f86fbe44822b78213b575ff 100644 GIT binary patch delta 112 zcmey!_l|jjxC{dtU}Rum0AY~u1aUzS1;gqL3=B-0?=#sjPCm${p$`&fWnkbFU}Ok) i4Gv)lcMW0S3U>`L0P%EujrC0R4D=0kd<_jiEG_`eun$iF literal 1905 zcmWHE%1kq2zyK@^3=AL)lBj~RIeC{PPvGm865wxfogh$RHbF2&eS%Pk!~|hq7XcCD zUlT-?Ur!JdzB56b`RoMo&-*4wJYGLR^74WSQimr_klwRbKxWN40ogh81>|}r2*}qo z3Mk|h2`I)S3n=-72q@dQ3aIFq38>1b3#jo(2&l6IBWJViUBEvQN<7 z@?(O|l9v;7r`(#L*K&G-e#xE*1}SSN7{=ZdFe=(2U~Icvz$9pzfT`?U0W+ft0kgmL z0v6I!CRp4}6tMhVHoFH0247EtUdKZmbiW zQ=|o4RG&|9b^a^h#(HvsyYhVj_jk_(Jedy)c%C~U;PrU1fcLsp0zPNp~MEziJ3X zZTm7I`YM+|%mP7y*e!1a;_5#O#7{XVkPv@WAhGtx6XK2@}#^OrMbPw`fAPN>?jOrZMQ?g=$B4^60D zH+Mo^<&p{Yef1L<83qc1k{bgn0|TD`BLj?NU|?VkcMT3<2zL!(V1xovk}b$kP|^j_ zpyUgpK}i@ygOV|b1|?+>4NA@+8kD3#G$>hvXi(Ay(V*lFqCrU_Idr>4Ruc@(0nNEC8ZG*#Ja?vI2+(Wd{%q$`T+Nlr2CsC~JUdQ1$@P zpezESLD>XMe>DNS1C(7rd{CAF(V%PtqCr^)M1!&qhz4aL5Dm&kAR3gFKr|>jfoM>c z0@0vs1)@P&3q*sm7l;OBF%S*PW?=eny#R;?Wj8Q=HxbMSWjhcbl=VO~DEonEP!${-q)ok27xOM_@owg%CltPP?;*&9TIvN(taWpfY> z%IY8*l-_()MH7e~BE=I|xNC?3sL;~!HP$oL OGtf8G@ijC6vA6&M`k40s diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Zulu b/third_party/abseil_cpp/absl/time/internal/cctz/testdata/zoneinfo/Zulu index 91558be0c2bf903b2364215ba26d5227d6126508..00841a62213e6cccf7f0b7353e5e8ae214185486 100644 GIT binary patch delta 22 YcmXTQpPL!1q`04-qyq5uE@ delta 12 Rcmc~VnxH)~jvGV>0stPN1X2J1 diff --git a/third_party/abseil_cpp/absl/time/internal/test_util.cc b/third_party/abseil_cpp/absl/time/internal/test_util.cc index 9bffe121d..9a485a075 100644 --- a/third_party/abseil_cpp/absl/time/internal/test_util.cc +++ b/third_party/abseil_cpp/absl/time/internal/test_util.cc @@ -18,6 +18,7 @@ #include #include +#include "absl/base/config.h" #include "absl/base/internal/raw_logging.h" #include "absl/time/internal/cctz/include/cctz/zone_info_source.h" diff --git a/third_party/abseil_cpp/absl/time/time.cc b/third_party/abseil_cpp/absl/time/time.cc index 6bb36cb3e..1ec2026e2 100644 --- a/third_party/abseil_cpp/absl/time/time.cc +++ b/third_party/abseil_cpp/absl/time/time.cc @@ -60,9 +60,10 @@ inline cctz::time_point unix_epoch() { inline int64_t FloorToUnit(absl::Duration d, absl::Duration unit) { absl::Duration rem; int64_t q = absl::IDivDuration(d, unit, &rem); - return (q > 0 || - rem >= ZeroDuration() || - q == std::numeric_limits::min()) ? q : q - 1; + return (q > 0 || rem >= ZeroDuration() || + q == std::numeric_limits::min()) + ? q + : q - 1; } inline absl::Time::Breakdown InfiniteFutureBreakdown() { diff --git a/third_party/abseil_cpp/absl/time/time.h b/third_party/abseil_cpp/absl/time/time.h index 37f6131dd..72508031a 100644 --- a/third_party/abseil_cpp/absl/time/time.h +++ b/third_party/abseil_cpp/absl/time/time.h @@ -639,7 +639,7 @@ class Time { // Deprecated. Use `absl::TimeZone::CivilInfo`. struct Breakdown { - int64_t year; // year (e.g., 2013) + int64_t year; // year (e.g., 2013) int month; // month of year [1:12] int day; // day of month [1:31] int hour; // hour of day [0:23] @@ -1494,12 +1494,10 @@ constexpr Duration Hours(int64_t n) { constexpr bool operator<(Duration lhs, Duration rhs) { return time_internal::GetRepHi(lhs) != time_internal::GetRepHi(rhs) ? time_internal::GetRepHi(lhs) < time_internal::GetRepHi(rhs) - : time_internal::GetRepHi(lhs) == - (std::numeric_limits::min)() - ? time_internal::GetRepLo(lhs) + 1 < - time_internal::GetRepLo(rhs) + 1 - : time_internal::GetRepLo(lhs) < - time_internal::GetRepLo(rhs); + : time_internal::GetRepHi(lhs) == (std::numeric_limits::min)() + ? time_internal::GetRepLo(lhs) + 1 < + time_internal::GetRepLo(rhs) + 1 + : time_internal::GetRepLo(lhs) < time_internal::GetRepLo(rhs); } constexpr bool operator==(Duration lhs, Duration rhs) { diff --git a/third_party/abseil_cpp/absl/time/time_test.cc b/third_party/abseil_cpp/absl/time/time_test.cc index 6f89672c6..cde9423fe 100644 --- a/third_party/abseil_cpp/absl/time/time_test.cc +++ b/third_party/abseil_cpp/absl/time/time_test.cc @@ -58,8 +58,7 @@ const char kZoneAbbrRE[] = "[A-Za-z]{3,4}|[-+][0-9]{2}([0-9]{2})?"; // timespec ts1, ts2; // EXPECT_THAT(ts1, TimespecMatcher(ts2)); MATCHER_P(TimespecMatcher, ts, "") { - if (ts.tv_sec == arg.tv_sec && ts.tv_nsec == arg.tv_nsec) - return true; + if (ts.tv_sec == arg.tv_sec && ts.tv_nsec == arg.tv_nsec) return true; *result_listener << "expected: {" << ts.tv_sec << ", " << ts.tv_nsec << "} "; *result_listener << "actual: {" << arg.tv_sec << ", " << arg.tv_nsec << "}"; return false; @@ -69,8 +68,7 @@ MATCHER_P(TimespecMatcher, ts, "") { // timeval tv1, tv2; // EXPECT_THAT(tv1, TimevalMatcher(tv2)); MATCHER_P(TimevalMatcher, tv, "") { - if (tv.tv_sec == arg.tv_sec && tv.tv_usec == arg.tv_usec) - return true; + if (tv.tv_sec == arg.tv_sec && tv.tv_usec == arg.tv_usec) return true; *result_listener << "expected: {" << tv.tv_sec << ", " << tv.tv_usec << "} "; *result_listener << "actual: {" << arg.tv_sec << ", " << arg.tv_usec << "}"; return false; @@ -103,7 +101,7 @@ TEST(Time, ValueSemantics) { EXPECT_EQ(a, b); EXPECT_EQ(a, c); EXPECT_EQ(b, c); - b = c; // Assignment + b = c; // Assignment EXPECT_EQ(a, b); EXPECT_EQ(a, c); EXPECT_EQ(b, c); @@ -228,6 +226,9 @@ TEST(Time, Infinity) { constexpr absl::Time t = absl::UnixEpoch(); // Any finite time. static_assert(t < ifuture, ""); static_assert(t > ipast, ""); + + EXPECT_EQ(ifuture, t + absl::InfiniteDuration()); + EXPECT_EQ(ipast, t - absl::InfiniteDuration()); } TEST(Time, FloorConversion) { @@ -358,19 +359,21 @@ TEST(Time, FloorConversion) { const int64_t min_plus_1 = std::numeric_limits::min() + 1; EXPECT_EQ(min_plus_1, absl::ToUnixSeconds(absl::FromUnixSeconds(min_plus_1))); EXPECT_EQ(std::numeric_limits::min(), - absl::ToUnixSeconds( - absl::FromUnixSeconds(min_plus_1) - absl::Nanoseconds(1) / 2)); + absl::ToUnixSeconds(absl::FromUnixSeconds(min_plus_1) - + absl::Nanoseconds(1) / 2)); // Tests flooring near positive infinity. EXPECT_EQ(std::numeric_limits::max(), - absl::ToUnixSeconds(absl::FromUnixSeconds( - std::numeric_limits::max()) + absl::Nanoseconds(1) / 2)); + absl::ToUnixSeconds( + absl::FromUnixSeconds(std::numeric_limits::max()) + + absl::Nanoseconds(1) / 2)); EXPECT_EQ(std::numeric_limits::max(), absl::ToUnixSeconds( absl::FromUnixSeconds(std::numeric_limits::max()))); EXPECT_EQ(std::numeric_limits::max() - 1, - absl::ToUnixSeconds(absl::FromUnixSeconds( - std::numeric_limits::max()) - absl::Nanoseconds(1) / 2)); + absl::ToUnixSeconds( + absl::FromUnixSeconds(std::numeric_limits::max()) - + absl::Nanoseconds(1) / 2)); } TEST(Time, RoundtripConversion) { @@ -1045,15 +1048,15 @@ TEST(Time, ConversionSaturation) { // Checks how TimeZone::At() saturates on infinities. auto ci = utc.At(absl::InfiniteFuture()); - EXPECT_CIVIL_INFO(ci, std::numeric_limits::max(), 12, 31, 23, - 59, 59, 0, false); + EXPECT_CIVIL_INFO(ci, std::numeric_limits::max(), 12, 31, 23, 59, 59, + 0, false); EXPECT_EQ(absl::InfiniteDuration(), ci.subsecond); EXPECT_EQ(absl::Weekday::thursday, absl::GetWeekday(ci.cs)); EXPECT_EQ(365, absl::GetYearDay(ci.cs)); EXPECT_STREQ("-00", ci.zone_abbr); // artifact of TimeZone::At() ci = utc.At(absl::InfinitePast()); - EXPECT_CIVIL_INFO(ci, std::numeric_limits::min(), 1, 1, 0, 0, - 0, 0, false); + EXPECT_CIVIL_INFO(ci, std::numeric_limits::min(), 1, 1, 0, 0, 0, 0, + false); EXPECT_EQ(-absl::InfiniteDuration(), ci.subsecond); EXPECT_EQ(absl::Weekday::sunday, absl::GetWeekday(ci.cs)); EXPECT_EQ(1, absl::GetYearDay(ci.cs)); @@ -1067,7 +1070,8 @@ TEST(Time, ConversionSaturation) { EXPECT_EQ("292277026596-12-04T15:30:07+00:00", absl::FormatTime(absl::RFC3339_full, t, utc)); EXPECT_EQ( - absl::UnixEpoch() + absl::Seconds(std::numeric_limits::max()), t); + absl::UnixEpoch() + absl::Seconds(std::numeric_limits::max()), + t); // Checks that we can also get the maximal Time value for a far-east zone. const absl::TimeZone plus14 = absl::FixedTimeZone(14 * 60 * 60); @@ -1075,7 +1079,8 @@ TEST(Time, ConversionSaturation) { EXPECT_EQ("292277026596-12-05T05:30:07+14:00", absl::FormatTime(absl::RFC3339_full, t, plus14)); EXPECT_EQ( - absl::UnixEpoch() + absl::Seconds(std::numeric_limits::max()), t); + absl::UnixEpoch() + absl::Seconds(std::numeric_limits::max()), + t); // One second later should push us to infinity. t = absl::FromCivil(absl::CivilSecond(292277026596, 12, 4, 15, 30, 8), utc); @@ -1089,7 +1094,8 @@ TEST(Time, ConversionSaturation) { EXPECT_EQ("-292277022657-01-27T08:29:52+00:00", absl::FormatTime(absl::RFC3339_full, t, utc)); EXPECT_EQ( - absl::UnixEpoch() + absl::Seconds(std::numeric_limits::min()), t); + absl::UnixEpoch() + absl::Seconds(std::numeric_limits::min()), + t); // Checks that we can also get the minimal Time value for a far-west zone. const absl::TimeZone minus12 = absl::FixedTimeZone(-12 * 60 * 60); @@ -1098,7 +1104,8 @@ TEST(Time, ConversionSaturation) { EXPECT_EQ("-292277022657-01-26T20:29:52-12:00", absl::FormatTime(absl::RFC3339_full, t, minus12)); EXPECT_EQ( - absl::UnixEpoch() + absl::Seconds(std::numeric_limits::min()), t); + absl::UnixEpoch() + absl::Seconds(std::numeric_limits::min()), + t); // One second before should push us to -infinity. t = absl::FromCivil(absl::CivilSecond(-292277022657, 1, 27, 8, 29, 51), utc); @@ -1171,14 +1178,13 @@ TEST(Time, LegacyDateTime) { const int kMin = std::numeric_limits::min(); absl::Time t; - t = absl::FromDateTime(std::numeric_limits::max(), - kMax, kMax, kMax, kMax, kMax, utc); + t = absl::FromDateTime(std::numeric_limits::max(), kMax, + kMax, kMax, kMax, kMax, utc); EXPECT_EQ("infinite-future", absl::FormatTime(ymdhms, t, utc)); // no overflow - t = absl::FromDateTime(std::numeric_limits::min(), - kMin, kMin, kMin, kMin, kMin, utc); - EXPECT_EQ("infinite-past", - absl::FormatTime(ymdhms, t, utc)); // no overflow + t = absl::FromDateTime(std::numeric_limits::min(), kMin, + kMin, kMin, kMin, kMin, utc); + EXPECT_EQ("infinite-past", absl::FormatTime(ymdhms, t, utc)); // no overflow // Check normalization. EXPECT_TRUE(absl::ConvertDateTime(2013, 10, 32, 8, 30, 0, utc).normalized); diff --git a/third_party/abseil_cpp/absl/types/BUILD.bazel b/third_party/abseil_cpp/absl/types/BUILD.bazel index de71c7347..83be9360f 100644 --- a/third_party/abseil_cpp/absl/types/BUILD.bazel +++ b/third_party/abseil_cpp/absl/types/BUILD.bazel @@ -12,7 +12,6 @@ # 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("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") load( @@ -24,7 +23,7 @@ load( package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) cc_library( name = "any", diff --git a/third_party/abseil_cpp/absl/types/CMakeLists.txt b/third_party/abseil_cpp/absl/types/CMakeLists.txt index 0dc0d2c7c..3f99ad8a4 100644 --- a/third_party/abseil_cpp/absl/types/CMakeLists.txt +++ b/third_party/abseil_cpp/absl/types/CMakeLists.txt @@ -259,7 +259,7 @@ absl_cc_library( absl::strings absl::utility gmock_main - PUBLIC + TESTONLY ) absl_cc_test( diff --git a/third_party/abseil_cpp/absl/types/any.h b/third_party/abseil_cpp/absl/types/any.h index 7eed51979..fc5a07469 100644 --- a/third_party/abseil_cpp/absl/types/any.h +++ b/third_party/abseil_cpp/absl/types/any.h @@ -47,9 +47,9 @@ // this abstraction, make sure that you should not instead be rewriting your // code to be more specific. // -// Abseil expects to release an `absl::variant` type shortly (a C++11 compatible -// version of the C++17 `std::variant), which is generally preferred for use -// over `absl::any`. +// Abseil has also released an `absl::variant` type (a C++11 compatible version +// of the C++17 `std::variant`), which is generally preferred for use over +// `absl::any`. #ifndef ABSL_TYPES_ANY_H_ #define ABSL_TYPES_ANY_H_ diff --git a/third_party/abseil_cpp/absl/types/compare.h b/third_party/abseil_cpp/absl/types/compare.h index 62ca70f9a..19b076e7f 100644 --- a/third_party/abseil_cpp/absl/types/compare.h +++ b/third_party/abseil_cpp/absl/types/compare.h @@ -86,7 +86,8 @@ enum class ncmp : value_type { unordered = -127 }; // incomplete types so they need to be defined after the types are complete. #ifdef __cpp_inline_variables -#define ABSL_COMPARE_INLINE_BASECLASS_DECL(name) +// A no-op expansion that can be followed by a semicolon at class level. +#define ABSL_COMPARE_INLINE_BASECLASS_DECL(name) static_assert(true, "") #define ABSL_COMPARE_INLINE_SUBCLASS_DECL(type, name) \ static const type name @@ -99,7 +100,8 @@ enum class ncmp : value_type { unordered = -127 }; #define ABSL_COMPARE_INLINE_BASECLASS_DECL(name) \ ABSL_CONST_INIT static const T name -#define ABSL_COMPARE_INLINE_SUBCLASS_DECL(type, name) +// A no-op expansion that can be followed by a semicolon at class level. +#define ABSL_COMPARE_INLINE_SUBCLASS_DECL(type, name) static_assert(true, "") #define ABSL_COMPARE_INLINE_INIT(type, name, init) \ template \ diff --git a/third_party/abseil_cpp/absl/types/internal/variant.h b/third_party/abseil_cpp/absl/types/internal/variant.h index 71bd3adfc..772008c74 100644 --- a/third_party/abseil_cpp/absl/types/internal/variant.h +++ b/third_party/abseil_cpp/absl/types/internal/variant.h @@ -45,7 +45,7 @@ ABSL_NAMESPACE_BEGIN template class variant; -ABSL_INTERNAL_INLINE_CONSTEXPR(size_t, variant_npos, -1); +ABSL_INTERNAL_INLINE_CONSTEXPR(size_t, variant_npos, static_cast(-1)); template struct variant_size; @@ -292,7 +292,7 @@ struct UnreachableSwitchCase { template struct ReachableSwitchCase { static VisitIndicesResultT Run(Op&& op) { - return absl::base_internal::Invoke(absl::forward(op), SizeT()); + return absl::base_internal::invoke(absl::forward(op), SizeT()); } }; @@ -424,7 +424,7 @@ struct VisitIndicesSwitch { return PickCase::Run(absl::forward(op)); default: ABSL_ASSERT(i == variant_npos); - return absl::base_internal::Invoke(absl::forward(op), NPos()); + return absl::base_internal::invoke(absl::forward(op), NPos()); } } }; @@ -488,7 +488,7 @@ struct VisitIndicesVariadicImpl, EndIndices...> { template VisitIndicesResultT operator()( SizeT /*index*/) && { - return base_internal::Invoke( + return base_internal::invoke( absl::forward(op), SizeT::value - std::size_t{1}>()...); @@ -930,7 +930,7 @@ struct PerformVisitation { absl::result_of_t...)>>::value, "All visitation overloads must have the same return type."); - return absl::base_internal::Invoke( + return absl::base_internal::invoke( absl::forward(op), VariantCoreAccess::Access( absl::forward(std::get(variant_tup)))...); diff --git a/third_party/abseil_cpp/absl/types/span.h b/third_party/abseil_cpp/absl/types/span.h index 4e450fc95..95fe79262 100644 --- a/third_party/abseil_cpp/absl/types/span.h +++ b/third_party/abseil_cpp/absl/types/span.h @@ -17,10 +17,13 @@ // span.h // ----------------------------------------------------------------------------- // -// This header file defines a `Span` type for holding a view of an existing -// array of data. The `Span` object, much like the `absl::string_view` object, -// does not own such data itself. A span provides a lightweight way to pass -// around view of such data. +// This header file defines a `Span` type for holding a reference to existing +// array data. The `Span` object, much like the `absl::string_view` object, +// does not own such data itself, and the data being referenced by the span must +// outlive the span itself. Unlike `view` type references, a span can hold a +// reference to mutable data (and can mutate it for underlying types of +// non-const T.) A span provides a lightweight way to pass a reference to such +// data. // // Additionally, this header file defines `MakeSpan()` and `MakeConstSpan()` // factory functions, for clearly creating spans of type `Span` or read-only @@ -72,9 +75,9 @@ ABSL_NAMESPACE_BEGIN // Span //------------------------------------------------------------------------------ // -// A `Span` is an "array view" type for holding a view of a contiguous data -// array; the `Span` object does not and cannot own such data itself. A span -// provides an easy way to provide overloads for anything operating on +// A `Span` is an "array reference" type for holding a reference of contiguous +// array data; the `Span` object does not and cannot own such data itself. A +// span provides an easy way to provide overloads for anything operating on // contiguous sequences without needing to manage pointers and array lengths // manually. @@ -92,7 +95,8 @@ ABSL_NAMESPACE_BEGIN // constructors. // // A `Span` is somewhat analogous to an `absl::string_view`, but for an array -// of elements of type `T`. A user of `Span` must ensure that the data being +// of elements of type `T`, and unlike an `absl::string_view`, a span can hold a +// reference to mutable data. A user of `Span` must ensure that the data being // pointed to outlives the `Span` itself. // // You can construct a `Span` in several ways: @@ -122,7 +126,7 @@ ABSL_NAMESPACE_BEGIN // Note that `Span` objects, in addition to requiring that the memory they // point to remains alive, must also ensure that such memory does not get // reallocated. Therefore, to avoid undefined behavior, containers with -// associated span views should not invoke operations that may reallocate memory +// associated spans should not invoke operations that may reallocate memory // (such as resizing) or invalidate iterators into the container. // // One common use for a `Span` is when passing arguments to a routine that can diff --git a/third_party/abseil_cpp/absl/types/variant.h b/third_party/abseil_cpp/absl/types/variant.h index 776d19a1c..ac93464bf 100644 --- a/third_party/abseil_cpp/absl/types/variant.h +++ b/third_party/abseil_cpp/absl/types/variant.h @@ -604,7 +604,10 @@ class variant : private variant_internal::VariantBase { // emplace() Functions - // Constructs a value of the given alternative type T within the variant. + // Constructs a value of the given alternative type T within the variant. The + // existing value of the variant is destroyed first (provided that + // `absl::valueless_by_exception()` is false). Requires that T is unambiguous + // in the variant. // // Example: // @@ -624,7 +627,9 @@ class variant : private variant_internal::VariantBase { } // Constructs a value of the given alternative type T within the variant using - // an initializer list. + // an initializer list. The existing value of the variant is destroyed first + // (provided that `absl::valueless_by_exception()` is false). Requires that T + // is unambiguous in the variant. // // Example: // @@ -643,7 +648,7 @@ class variant : private variant_internal::VariantBase { } // Destroys the current value of the variant (provided that - // `absl::valueless_by_exception()` is false, and constructs a new value at + // `absl::valueless_by_exception()` is false) and constructs a new value at // the given index. // // Example: @@ -662,7 +667,7 @@ class variant : private variant_internal::VariantBase { } // Destroys the current value of the variant (provided that - // `absl::valueless_by_exception()` is false, and constructs a new value at + // `absl::valueless_by_exception()` is false) and constructs a new value at // the given index using an initializer list and the provided arguments. // // Example: diff --git a/third_party/abseil_cpp/absl/types/variant_test.cc b/third_party/abseil_cpp/absl/types/variant_test.cc index cf8f7f337..cf237334d 100644 --- a/third_party/abseil_cpp/absl/types/variant_test.cc +++ b/third_party/abseil_cpp/absl/types/variant_test.cc @@ -2311,7 +2311,8 @@ TEST(VariantTest, TestRvalueConversion) { ASSERT_TRUE(absl::holds_alternative(variant2)); EXPECT_EQ(42, absl::get(variant2)); - variant2 = ConvertVariantTo>(variant(42)); + variant2 = + ConvertVariantTo>(variant(42)); ASSERT_TRUE(absl::holds_alternative(variant2)); EXPECT_EQ(42, absl::get(variant2)); #endif // !ABSL_USES_STD_VARIANT @@ -2453,7 +2454,8 @@ TEST(VariantTest, TestRvalueConversionViaConvertVariantTo) { ConvertVariantTo>(variant(42))); EXPECT_THAT(absl::get_if(&variant2), Pointee(42)); - variant2 = ConvertVariantTo>(variant(42)); + variant2 = + ConvertVariantTo>(variant(42)); EXPECT_THAT(absl::get_if(&variant2), Pointee(42)); #endif diff --git a/third_party/abseil_cpp/absl/utility/BUILD.bazel b/third_party/abseil_cpp/absl/utility/BUILD.bazel index 6881f939c..02b2c407f 100644 --- a/third_party/abseil_cpp/absl/utility/BUILD.bazel +++ b/third_party/abseil_cpp/absl/utility/BUILD.bazel @@ -24,7 +24,7 @@ load( package(default_visibility = ["//visibility:public"]) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) cc_library( name = "utility", diff --git a/third_party/abseil_cpp/absl/utility/utility.h b/third_party/abseil_cpp/absl/utility/utility.h index e6647c7b2..bf9232209 100644 --- a/third_party/abseil_cpp/absl/utility/utility.h +++ b/third_party/abseil_cpp/absl/utility/utility.h @@ -236,10 +236,10 @@ namespace utility_internal { // Helper method for expanding tuple into a called method. template auto apply_helper(Functor&& functor, Tuple&& t, index_sequence) - -> decltype(absl::base_internal::Invoke( + -> decltype(absl::base_internal::invoke( absl::forward(functor), std::get(absl::forward(t))...)) { - return absl::base_internal::Invoke( + return absl::base_internal::invoke( absl::forward(functor), std::get(absl::forward(t))...); } diff --git a/third_party/abseil_cpp/ci/cmake_common.sh b/third_party/abseil_cpp/ci/cmake_common.sh new file mode 100644 index 000000000..aec8a1171 --- /dev/null +++ b/third_party/abseil_cpp/ci/cmake_common.sh @@ -0,0 +1,25 @@ +# Copyright 2020 The Abseil 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 +# +# https://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 commit of GoogleTest to be used in the CMake tests in this directory. +# Keep this in sync with the commit in the WORKSPACE file. +readonly ABSL_GOOGLETEST_COMMIT="8567b09290fe402cf01923e2131c5635b8ed851b" + +# Avoid depending on GitHub by looking for a cached copy of the commit first. +if [[ -r "${KOKORO_GFILE_DIR:-}/distdir/${ABSL_GOOGLETEST_COMMIT}.zip" ]]; then + DOCKER_EXTRA_ARGS="--mount type=bind,source=${KOKORO_GFILE_DIR}/distdir,target=/distdir,readonly ${DOCKER_EXTRA_ARGS:-}" + ABSL_GOOGLETEST_DOWNLOAD_URL="file:///distdir/${ABSL_GOOGLETEST_COMMIT}.zip" +else + ABSL_GOOGLETEST_DOWNLOAD_URL="https://github.com/google/googletest/archive/${ABSL_GOOGLETEST_COMMIT}.zip" +fi diff --git a/third_party/abseil_cpp/ci/cmake_install_test.sh b/third_party/abseil_cpp/ci/cmake_install_test.sh index b31e4b8cd..5bf540c53 100755 --- a/third_party/abseil_cpp/ci/cmake_install_test.sh +++ b/third_party/abseil_cpp/ci/cmake_install_test.sh @@ -20,11 +20,13 @@ if [[ -z ${ABSEIL_ROOT:-} ]]; then ABSEIL_ROOT="$(realpath $(dirname ${0})/..)" fi +source "${ABSEIL_ROOT}/ci/cmake_common.sh" + source "${ABSEIL_ROOT}/ci/linux_docker_containers.sh" readonly DOCKER_CONTAINER=${LINUX_GCC_LATEST_CONTAINER} time docker run \ - --volume="${ABSEIL_ROOT}:/abseil-cpp:ro" \ + --mount type=bind,source="${ABSEIL_ROOT}",target=/abseil-cpp,readonly \ --workdir=/abseil-cpp \ --tmpfs=/buildfs:exec \ --cap-add=SYS_PTRACE \ diff --git a/third_party/abseil_cpp/ci/linux_clang-latest_libcxx_asan_bazel.sh b/third_party/abseil_cpp/ci/linux_clang-latest_libcxx_asan_bazel.sh index 0c250a62e..ffbb8327e 100755 --- a/third_party/abseil_cpp/ci/linux_clang-latest_libcxx_asan_bazel.sh +++ b/third_party/abseil_cpp/ci/linux_clang-latest_libcxx_asan_bazel.sh @@ -42,7 +42,7 @@ readonly DOCKER_CONTAINER=${LINUX_CLANG_LATEST_CONTAINER} # USE_BAZEL_CACHE=1 only works on Kokoro. # Without access to the credentials this won't work. if [[ ${USE_BAZEL_CACHE:-0} -ne 0 ]]; then - DOCKER_EXTRA_ARGS="--volume=${KOKORO_KEYSTORE_DIR}:/keystore:ro ${DOCKER_EXTRA_ARGS:-}" + DOCKER_EXTRA_ARGS="--mount type=bind,source=${KOKORO_KEYSTORE_DIR},target=/keystore,readonly ${DOCKER_EXTRA_ARGS:-}" # Bazel doesn't track changes to tools outside of the workspace # (e.g. /usr/bin/gcc), so by appending the docker container to the # remote_http_cache url, we make changes to the container part of @@ -55,7 +55,7 @@ fi # external dependencies first. # https://docs.bazel.build/versions/master/guide.html#distdir if [[ ${KOKORO_GFILE_DIR:-} ]] && [[ -d "${KOKORO_GFILE_DIR}/distdir" ]]; then - DOCKER_EXTRA_ARGS="--volume=${KOKORO_GFILE_DIR}/distdir:/distdir:ro ${DOCKER_EXTRA_ARGS:-}" + DOCKER_EXTRA_ARGS="--mount type=bind,source=${KOKORO_GFILE_DIR}/distdir,target=/distdir,readonly ${DOCKER_EXTRA_ARGS:-}" BAZEL_EXTRA_ARGS="--distdir=/distdir ${BAZEL_EXTRA_ARGS:-}" fi @@ -64,12 +64,11 @@ for std in ${STD}; do for exceptions_mode in ${EXCEPTIONS_MODE}; do echo "--------------------------------------------------------------------" time docker run \ - --volume="${ABSEIL_ROOT}:/abseil-cpp:ro" \ + --mount type=bind,source="${ABSEIL_ROOT}",target=/abseil-cpp,readonly \ --workdir=/abseil-cpp \ --cap-add=SYS_PTRACE \ --rm \ -e CC="/opt/llvm/clang/bin/clang" \ - -e BAZEL_COMPILER="llvm" \ -e BAZEL_CXXOPTS="-std=${std}:-nostdinc++" \ -e BAZEL_LINKOPTS="-L/opt/llvm/libcxx/lib:-lc++:-lc++abi:-lm:-Wl,-rpath=/opt/llvm/libcxx/lib" \ -e CPLUS_INCLUDE_PATH="/opt/llvm/libcxx/include/c++/v1" \ @@ -78,8 +77,6 @@ for std in ${STD}; do /usr/local/bin/bazel test ... \ --compilation_mode="${compilation_mode}" \ --copt="${exceptions_mode}" \ - --copt="-DADDRESS_SANITIZER" \ - --copt="-DUNDEFINED_BEHAVIOR_SANITIZER" \ --copt="-fsanitize=address" \ --copt="-fsanitize=float-divide-by-zero" \ --copt="-fsanitize=nullability" \ diff --git a/third_party/abseil_cpp/ci/linux_clang-latest_libcxx_bazel.sh b/third_party/abseil_cpp/ci/linux_clang-latest_libcxx_bazel.sh index eb04e69e3..f6a2221e8 100755 --- a/third_party/abseil_cpp/ci/linux_clang-latest_libcxx_bazel.sh +++ b/third_party/abseil_cpp/ci/linux_clang-latest_libcxx_bazel.sh @@ -42,7 +42,7 @@ readonly DOCKER_CONTAINER=${LINUX_CLANG_LATEST_CONTAINER} # USE_BAZEL_CACHE=1 only works on Kokoro. # Without access to the credentials this won't work. if [[ ${USE_BAZEL_CACHE:-0} -ne 0 ]]; then - DOCKER_EXTRA_ARGS="--volume=${KOKORO_KEYSTORE_DIR}:/keystore:ro ${DOCKER_EXTRA_ARGS:-}" + DOCKER_EXTRA_ARGS="--mount type=bind,source=${KOKORO_KEYSTORE_DIR},target=/keystore,readonly ${DOCKER_EXTRA_ARGS:-}" # Bazel doesn't track changes to tools outside of the workspace # (e.g. /usr/bin/gcc), so by appending the docker container to the # remote_http_cache url, we make changes to the container part of @@ -55,7 +55,7 @@ fi # external dependencies first. # https://docs.bazel.build/versions/master/guide.html#distdir if [[ ${KOKORO_GFILE_DIR:-} ]] && [[ -d "${KOKORO_GFILE_DIR}/distdir" ]]; then - DOCKER_EXTRA_ARGS="--volume=${KOKORO_GFILE_DIR}/distdir:/distdir:ro ${DOCKER_EXTRA_ARGS:-}" + DOCKER_EXTRA_ARGS="--mount type=bind,source=${KOKORO_GFILE_DIR}/distdir,target=/distdir,readonly ${DOCKER_EXTRA_ARGS:-}" BAZEL_EXTRA_ARGS="--distdir=/distdir ${BAZEL_EXTRA_ARGS:-}" fi @@ -64,13 +64,12 @@ for std in ${STD}; do for exceptions_mode in ${EXCEPTIONS_MODE}; do echo "--------------------------------------------------------------------" time docker run \ - --volume="${ABSEIL_ROOT}:/abseil-cpp-ro:ro" \ + --mount type=bind,source="${ABSEIL_ROOT}",target=/abseil-cpp-ro,readonly \ --tmpfs=/abseil-cpp \ --workdir=/abseil-cpp \ --cap-add=SYS_PTRACE \ --rm \ -e CC="/opt/llvm/clang/bin/clang" \ - -e BAZEL_COMPILER="llvm" \ -e BAZEL_CXXOPTS="-std=${std}:-nostdinc++" \ -e BAZEL_LINKOPTS="-L/opt/llvm/libcxx/lib:-lc++:-lc++abi:-lm:-Wl,-rpath=/opt/llvm/libcxx/lib" \ -e CPLUS_INCLUDE_PATH="/opt/llvm/libcxx/include/c++/v1" \ diff --git a/third_party/abseil_cpp/ci/linux_clang-latest_libcxx_tsan_bazel.sh b/third_party/abseil_cpp/ci/linux_clang-latest_libcxx_tsan_bazel.sh index c2eb5baee..e70e8214c 100755 --- a/third_party/abseil_cpp/ci/linux_clang-latest_libcxx_tsan_bazel.sh +++ b/third_party/abseil_cpp/ci/linux_clang-latest_libcxx_tsan_bazel.sh @@ -42,7 +42,7 @@ readonly DOCKER_CONTAINER=${LINUX_CLANG_LATEST_CONTAINER} # USE_BAZEL_CACHE=1 only works on Kokoro. # Without access to the credentials this won't work. if [[ ${USE_BAZEL_CACHE:-0} -ne 0 ]]; then - DOCKER_EXTRA_ARGS="--volume=${KOKORO_KEYSTORE_DIR}:/keystore:ro ${DOCKER_EXTRA_ARGS:-}" + DOCKER_EXTRA_ARGS="--mount type=bind,source=${KOKORO_KEYSTORE_DIR},target=/keystore,readonly ${DOCKER_EXTRA_ARGS:-}" # Bazel doesn't track changes to tools outside of the workspace # (e.g. /usr/bin/gcc), so by appending the docker container to the # remote_http_cache url, we make changes to the container part of @@ -55,7 +55,7 @@ fi # external dependencies first. # https://docs.bazel.build/versions/master/guide.html#distdir if [[ ${KOKORO_GFILE_DIR:-} ]] && [[ -d "${KOKORO_GFILE_DIR}/distdir" ]]; then - DOCKER_EXTRA_ARGS="--volume=${KOKORO_GFILE_DIR}/distdir:/distdir:ro ${DOCKER_EXTRA_ARGS:-}" + DOCKER_EXTRA_ARGS="--mount type=bind,source=${KOKORO_GFILE_DIR}/distdir,target=/distdir,readonly ${DOCKER_EXTRA_ARGS:-}" BAZEL_EXTRA_ARGS="--distdir=/distdir ${BAZEL_EXTRA_ARGS:-}" fi @@ -64,12 +64,11 @@ for std in ${STD}; do for exceptions_mode in ${EXCEPTIONS_MODE}; do echo "--------------------------------------------------------------------" time docker run \ - --volume="${ABSEIL_ROOT}:/abseil-cpp:ro" \ + --mount type=bind,source="${ABSEIL_ROOT}",target=/abseil-cpp,readonly \ --workdir=/abseil-cpp \ --cap-add=SYS_PTRACE \ --rm \ -e CC="/opt/llvm/clang/bin/clang" \ - -e BAZEL_COMPILER="llvm" \ -e BAZEL_CXXOPTS="-std=${std}:-nostdinc++" \ -e BAZEL_LINKOPTS="-L/opt/llvm/libcxx-tsan/lib:-lc++:-lc++abi:-lm:-Wl,-rpath=/opt/llvm/libcxx-tsan/lib" \ -e CPLUS_INCLUDE_PATH="/opt/llvm/libcxx-tsan/include/c++/v1" \ @@ -79,8 +78,6 @@ for std in ${STD}; do --build_tag_filters="-notsan" \ --compilation_mode="${compilation_mode}" \ --copt="${exceptions_mode}" \ - --copt="-DDYNAMIC_ANNOTATIONS_ENABLED=1" \ - --copt="-DTHREAD_SANITIZER" \ --copt="-fsanitize=thread" \ --copt="-fno-sanitize-blacklist" \ --copt=-Werror \ diff --git a/third_party/abseil_cpp/ci/linux_clang-latest_libstdcxx_bazel.sh b/third_party/abseil_cpp/ci/linux_clang-latest_libstdcxx_bazel.sh index 0192ee49a..0986ff40c 100755 --- a/third_party/abseil_cpp/ci/linux_clang-latest_libstdcxx_bazel.sh +++ b/third_party/abseil_cpp/ci/linux_clang-latest_libstdcxx_bazel.sh @@ -42,7 +42,7 @@ readonly DOCKER_CONTAINER=${LINUX_CLANG_LATEST_CONTAINER} # USE_BAZEL_CACHE=1 only works on Kokoro. # Without access to the credentials this won't work. if [[ ${USE_BAZEL_CACHE:-0} -ne 0 ]]; then - DOCKER_EXTRA_ARGS="--volume=${KOKORO_KEYSTORE_DIR}:/keystore:ro ${DOCKER_EXTRA_ARGS:-}" + DOCKER_EXTRA_ARGS="--mount type=bind,source=${KOKORO_KEYSTORE_DIR},target=/keystore,readonly ${DOCKER_EXTRA_ARGS:-}" # Bazel doesn't track changes to tools outside of the workspace # (e.g. /usr/bin/gcc), so by appending the docker container to the # remote_http_cache url, we make changes to the container part of @@ -55,7 +55,7 @@ fi # external dependencies first. # https://docs.bazel.build/versions/master/guide.html#distdir if [[ ${KOKORO_GFILE_DIR:-} ]] && [[ -d "${KOKORO_GFILE_DIR}/distdir" ]]; then - DOCKER_EXTRA_ARGS="--volume=${KOKORO_GFILE_DIR}/distdir:/distdir:ro ${DOCKER_EXTRA_ARGS:-}" + DOCKER_EXTRA_ARGS="--mount type=bind,source=${KOKORO_GFILE_DIR}/distdir,target=/distdir,readonly ${DOCKER_EXTRA_ARGS:-}" BAZEL_EXTRA_ARGS="--distdir=/distdir ${BAZEL_EXTRA_ARGS:-}" fi @@ -64,22 +64,22 @@ for std in ${STD}; do for exceptions_mode in ${EXCEPTIONS_MODE}; do echo "--------------------------------------------------------------------" time docker run \ - --volume="${ABSEIL_ROOT}:/abseil-cpp:ro" \ + --mount type=bind,source="${ABSEIL_ROOT}",target=/abseil-cpp,readonly \ --workdir=/abseil-cpp \ --cap-add=SYS_PTRACE \ --rm \ -e CC="/opt/llvm/clang/bin/clang" \ - -e BAZEL_COMPILER="llvm" \ -e BAZEL_CXXOPTS="-std=${std}" \ - -e CPLUS_INCLUDE_PATH="/usr/include/c++/8" \ ${DOCKER_EXTRA_ARGS:-} \ ${DOCKER_CONTAINER} \ /usr/local/bin/bazel test ... \ --compilation_mode="${compilation_mode}" \ + --copt="--gcc-toolchain=/usr/local" \ --copt="${exceptions_mode}" \ --copt=-Werror \ --define="absl=1" \ --keep_going \ + --linkopt="--gcc-toolchain=/usr/local" \ --show_timestamps \ --test_env="GTEST_INSTALL_FAILURE_SIGNAL_HANDLER=1" \ --test_env="TZDIR=/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo" \ diff --git a/third_party/abseil_cpp/ci/linux_docker_containers.sh b/third_party/abseil_cpp/ci/linux_docker_containers.sh index 82a10ac62..1c29d9a1f 100644 --- a/third_party/abseil_cpp/ci/linux_docker_containers.sh +++ b/third_party/abseil_cpp/ci/linux_docker_containers.sh @@ -15,7 +15,7 @@ # The file contains Docker container identifiers currently used by test scripts. # Test scripts should source this file to get the identifiers. -readonly LINUX_ALPINE_CONTAINER="gcr.io/google.com/absl-177019/alpine:20191016" -readonly LINUX_CLANG_LATEST_CONTAINER="gcr.io/google.com/absl-177019/linux_clang-latest:20200401" -readonly LINUX_GCC_LATEST_CONTAINER="gcr.io/google.com/absl-177019/linux_gcc-latest:20200319" -readonly LINUX_GCC_49_CONTAINER="gcr.io/google.com/absl-177019/linux_gcc-4.9:20191018" +readonly LINUX_ALPINE_CONTAINER="gcr.io/google.com/absl-177019/alpine:20201026" +readonly LINUX_CLANG_LATEST_CONTAINER="gcr.io/google.com/absl-177019/linux_hybrid-latest:20201008" +readonly LINUX_GCC_LATEST_CONTAINER="gcr.io/google.com/absl-177019/linux_hybrid-latest:20201008" +readonly LINUX_GCC_FLOOR_CONTAINER="gcr.io/google.com/absl-177019/linux_gcc-floor:20201015" diff --git a/third_party/abseil_cpp/ci/linux_gcc-4.9_libstdcxx_bazel.sh b/third_party/abseil_cpp/ci/linux_gcc-floor_libstdcxx_bazel.sh similarity index 96% rename from third_party/abseil_cpp/ci/linux_gcc-4.9_libstdcxx_bazel.sh rename to third_party/abseil_cpp/ci/linux_gcc-floor_libstdcxx_bazel.sh index 8e6540cf0..224aef81c 100755 --- a/third_party/abseil_cpp/ci/linux_gcc-4.9_libstdcxx_bazel.sh +++ b/third_party/abseil_cpp/ci/linux_gcc-floor_libstdcxx_bazel.sh @@ -1,6 +1,6 @@ #!/bin/bash # -# Copyright 2019 The Abseil Authors. +# Copyright 2020 The Abseil Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -37,7 +37,7 @@ if [[ -z ${EXCEPTIONS_MODE:-} ]]; then fi source "${ABSEIL_ROOT}/ci/linux_docker_containers.sh" -readonly DOCKER_CONTAINER=${LINUX_GCC_49_CONTAINER} +readonly DOCKER_CONTAINER=${LINUX_GCC_FLOOR_CONTAINER} # USE_BAZEL_CACHE=1 only works on Kokoro. # Without access to the credentials this won't work. @@ -68,7 +68,7 @@ for std in ${STD}; do --workdir=/abseil-cpp \ --cap-add=SYS_PTRACE \ --rm \ - -e CC="/usr/bin/gcc-4.9" \ + -e CC="/usr/local/bin/gcc" \ -e BAZEL_CXXOPTS="-std=${std}" \ ${DOCKER_EXTRA_ARGS:-} \ ${DOCKER_CONTAINER} \ diff --git a/third_party/abseil_cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh b/third_party/abseil_cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh index 3ec022620..37d89d9f8 100755 --- a/third_party/abseil_cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh +++ b/third_party/abseil_cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh @@ -25,7 +25,7 @@ if [[ -z ${ABSEIL_ROOT:-} ]]; then fi if [[ -z ${STD:-} ]]; then - STD="c++11 c++14 c++17 c++2a" + STD="c++11 c++14 c++17 c++20" fi if [[ -z ${COMPILATION_MODE:-} ]]; then @@ -42,7 +42,7 @@ readonly DOCKER_CONTAINER=${LINUX_GCC_LATEST_CONTAINER} # USE_BAZEL_CACHE=1 only works on Kokoro. # Without access to the credentials this won't work. if [[ ${USE_BAZEL_CACHE:-0} -ne 0 ]]; then - DOCKER_EXTRA_ARGS="--volume=${KOKORO_KEYSTORE_DIR}:/keystore:ro ${DOCKER_EXTRA_ARGS:-}" + DOCKER_EXTRA_ARGS="--mount type=bind,source=${KOKORO_KEYSTORE_DIR},target=/keystore,readonly ${DOCKER_EXTRA_ARGS:-}" # Bazel doesn't track changes to tools outside of the workspace # (e.g. /usr/bin/gcc), so by appending the docker container to the # remote_http_cache url, we make changes to the container part of @@ -55,7 +55,7 @@ fi # external dependencies first. # https://docs.bazel.build/versions/master/guide.html#distdir if [[ ${KOKORO_GFILE_DIR:-} ]] && [[ -d "${KOKORO_GFILE_DIR}/distdir" ]]; then - DOCKER_EXTRA_ARGS="--volume=${KOKORO_GFILE_DIR}/distdir:/distdir:ro ${DOCKER_EXTRA_ARGS:-}" + DOCKER_EXTRA_ARGS="--mount type=bind,source=${KOKORO_GFILE_DIR}/distdir,target=/distdir,readonly ${DOCKER_EXTRA_ARGS:-}" BAZEL_EXTRA_ARGS="--distdir=/distdir ${BAZEL_EXTRA_ARGS:-}" fi @@ -64,7 +64,7 @@ for std in ${STD}; do for exceptions_mode in ${EXCEPTIONS_MODE}; do echo "--------------------------------------------------------------------" time docker run \ - --volume="${ABSEIL_ROOT}:/abseil-cpp-ro:ro" \ + --mount type=bind,source="${ABSEIL_ROOT}",target=/abseil-cpp-ro,readonly \ --tmpfs=/abseil-cpp \ --workdir=/abseil-cpp \ --cap-add=SYS_PTRACE \ @@ -75,7 +75,7 @@ for std in ${STD}; do ${DOCKER_CONTAINER} \ /bin/sh -c " cp -r /abseil-cpp-ro/* /abseil-cpp/ - if [[ -n \"${ALTERNATE_OPTIONS:-}\" ]]; then + if [ -n \"${ALTERNATE_OPTIONS:-}\" ]; then cp ${ALTERNATE_OPTIONS:-} absl/base/options.h || exit 1 fi /usr/local/bin/bazel test ... \ diff --git a/third_party/abseil_cpp/ci/linux_gcc-latest_libstdcxx_cmake.sh b/third_party/abseil_cpp/ci/linux_gcc-latest_libstdcxx_cmake.sh index db5f69181..ed9cfa385 100755 --- a/third_party/abseil_cpp/ci/linux_gcc-latest_libstdcxx_cmake.sh +++ b/third_party/abseil_cpp/ci/linux_gcc-latest_libstdcxx_cmake.sh @@ -14,51 +14,52 @@ # See the License for the specific language governing permissions and # limitations under the License. -# TODO(absl-team): This script isn't fully hermetic because -# -DABSL_USE_GOOGLETEST_HEAD=ON means that this script isn't pinned to a fixed -# version of GoogleTest. This means that an upstream change to GoogleTest could -# break this test. Fix this by allowing this script to pin to a known-good -# version of GoogleTest. - set -euox pipefail if [[ -z ${ABSEIL_ROOT:-} ]]; then ABSEIL_ROOT="$(realpath $(dirname ${0})/..)" fi +source "${ABSEIL_ROOT}/ci/cmake_common.sh" + if [[ -z ${ABSL_CMAKE_CXX_STANDARDS:-} ]]; then - ABSL_CMAKE_CXX_STANDARDS="11 14 17" + ABSL_CMAKE_CXX_STANDARDS="11 14 17 20" fi if [[ -z ${ABSL_CMAKE_BUILD_TYPES:-} ]]; then ABSL_CMAKE_BUILD_TYPES="Debug Release" fi +if [[ -z ${ABSL_CMAKE_BUILD_SHARED:-} ]]; then + ABSL_CMAKE_BUILD_SHARED="OFF ON" +fi + source "${ABSEIL_ROOT}/ci/linux_docker_containers.sh" readonly DOCKER_CONTAINER=${LINUX_GCC_LATEST_CONTAINER} for std in ${ABSL_CMAKE_CXX_STANDARDS}; do for compilation_mode in ${ABSL_CMAKE_BUILD_TYPES}; do - echo "--------------------------------------------------------------------" - echo "Testing with CMAKE_BUILD_TYPE=${compilation_mode} and -std=c++${std}" - - time docker run \ - --volume="${ABSEIL_ROOT}:/abseil-cpp:ro" \ - --workdir=/abseil-cpp \ - --tmpfs=/buildfs:exec \ - --cap-add=SYS_PTRACE \ - --rm \ - -e CFLAGS="-Werror" \ - -e CXXFLAGS="-Werror" \ - ${DOCKER_CONTAINER} \ - /bin/bash -c " - cd /buildfs && \ - cmake /abseil-cpp \ - -DABSL_USE_GOOGLETEST_HEAD=ON \ - -DABSL_RUN_TESTS=ON \ - -DCMAKE_BUILD_TYPE=${compilation_mode} \ - -DCMAKE_CXX_STANDARD=${std} && \ - make -j$(nproc) && \ - ctest -j$(nproc) --output-on-failure" + for build_shared in ${ABSL_CMAKE_BUILD_SHARED}; do + time docker run \ + --mount type=bind,source="${ABSEIL_ROOT}",target=/abseil-cpp,readonly \ + --tmpfs=/buildfs:exec \ + --workdir=/buildfs \ + --cap-add=SYS_PTRACE \ + --rm \ + -e CFLAGS="-Werror" \ + -e CXXFLAGS="-Werror" \ + ${DOCKER_EXTRA_ARGS:-} \ + "${DOCKER_CONTAINER}" \ + /bin/bash -c " + cmake /abseil-cpp \ + -DABSL_GOOGLETEST_DOWNLOAD_URL=${ABSL_GOOGLETEST_DOWNLOAD_URL} \ + -DABSL_RUN_TESTS=ON \ + -DBUILD_SHARED_LIBS=${build_shared} \ + -DCMAKE_BUILD_TYPE=${compilation_mode} \ + -DCMAKE_CXX_STANDARD=${std} \ + -DCMAKE_MODULE_LINKER_FLAGS=\"-Wl,--no-undefined\" && \ + make -j$(nproc) && \ + ctest -j$(nproc) --output-on-failure" + done done done diff --git a/third_party/abseil_cpp/ci/linux_gcc_alpine_cmake.sh b/third_party/abseil_cpp/ci/linux_gcc_alpine_cmake.sh index f57ab12b1..31310ac79 100755 --- a/third_party/abseil_cpp/ci/linux_gcc_alpine_cmake.sh +++ b/third_party/abseil_cpp/ci/linux_gcc_alpine_cmake.sh @@ -14,18 +14,14 @@ # See the License for the specific language governing permissions and # limitations under the License. -# TODO(absl-team): This script isn't fully hermetic because -# -DABSL_USE_GOOGLETEST_HEAD=ON means that this script isn't pinned to a fixed -# version of GoogleTest. This means that an upstream change to GoogleTest could -# break this test. Fix this by allowing this script to pin to a known-good -# version of GoogleTest. - set -euox pipefail if [[ -z ${ABSEIL_ROOT:-} ]]; then ABSEIL_ROOT="$(realpath $(dirname ${0})/..)" fi +source "${ABSEIL_ROOT}/ci/cmake_common.sh" + if [[ -z ${ABSL_CMAKE_CXX_STANDARDS:-} ]]; then ABSL_CMAKE_CXX_STANDARDS="11 14 17" fi @@ -34,31 +30,35 @@ if [[ -z ${ABSL_CMAKE_BUILD_TYPES:-} ]]; then ABSL_CMAKE_BUILD_TYPES="Debug Release" fi +if [[ -z ${ABSL_CMAKE_BUILD_SHARED:-} ]]; then + ABSL_CMAKE_BUILD_SHARED="OFF ON" +fi + source "${ABSEIL_ROOT}/ci/linux_docker_containers.sh" readonly DOCKER_CONTAINER=${LINUX_ALPINE_CONTAINER} for std in ${ABSL_CMAKE_CXX_STANDARDS}; do for compilation_mode in ${ABSL_CMAKE_BUILD_TYPES}; do - echo "--------------------------------------------------------------------" - echo "Testing with CMAKE_BUILD_TYPE=${compilation_mode} and -std=c++${std}" - - time docker run \ - --volume="${ABSEIL_ROOT}:/abseil-cpp:ro" \ - --workdir=/abseil-cpp \ - --tmpfs=/buildfs:exec \ - --cap-add=SYS_PTRACE \ - --rm \ - -e CFLAGS="-Werror" \ - -e CXXFLAGS="-Werror" \ - "${DOCKER_CONTAINER}" \ - /bin/sh -c " - cd /buildfs && \ - cmake /abseil-cpp \ - -DABSL_USE_GOOGLETEST_HEAD=ON \ - -DABSL_RUN_TESTS=ON \ - -DCMAKE_BUILD_TYPE=${compilation_mode} \ - -DCMAKE_CXX_STANDARD=${std} && \ - make -j$(nproc) && \ - ctest -j$(nproc) --output-on-failure" + for build_shared in ${ABSL_CMAKE_BUILD_SHARED}; do + time docker run \ + --mount type=bind,source="${ABSEIL_ROOT}",target=/abseil-cpp,readonly \ + --tmpfs=/buildfs:exec \ + --workdir=/buildfs \ + --cap-add=SYS_PTRACE \ + --rm \ + -e CFLAGS="-Werror" \ + -e CXXFLAGS="-Werror" \ + ${DOCKER_EXTRA_ARGS:-} \ + "${DOCKER_CONTAINER}" \ + /bin/sh -c " + cmake /abseil-cpp \ + -DABSL_GOOGLETEST_DOWNLOAD_URL=${ABSL_GOOGLETEST_DOWNLOAD_URL} \ + -DABSL_RUN_TESTS=ON \ + -DCMAKE_BUILD_TYPE=${compilation_mode} \ + -DCMAKE_CXX_STANDARD=${std} \ + -DCMAKE_MODULE_LINKER_FLAGS=\"-Wl,--no-undefined\" && \ + make -j$(nproc) && \ + ctest -j$(nproc) --output-on-failure" + done done done diff --git a/third_party/abseil_cpp/ci/macos_xcode_cmake.sh b/third_party/abseil_cpp/ci/macos_xcode_cmake.sh index cf78e207e..0847b3ea7 100755 --- a/third_party/abseil_cpp/ci/macos_xcode_cmake.sh +++ b/third_party/abseil_cpp/ci/macos_xcode_cmake.sh @@ -14,9 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -# This script is invoked on Kokoro to test Abseil on macOS. -# It is not hermetic and may break when Kokoro is updated. - set -euox pipefail if [[ -z ${ABSEIL_ROOT:-} ]]; then @@ -24,21 +21,36 @@ if [[ -z ${ABSEIL_ROOT:-} ]]; then fi ABSEIL_ROOT=$(realpath ${ABSEIL_ROOT}) +source "${ABSEIL_ROOT}/ci/cmake_common.sh" + +# The MacOS build doesn't run in a docker container, so we have to override ABSL_GOOGLETEST_DOWNLOAD_URL. +if [[ -r "${KOKORO_GFILE_DIR}/distdir/${ABSL_GOOGLETEST_COMMIT}.zip" ]]; then + ABSL_GOOGLETEST_DOWNLOAD_URL="file://${KOKORO_GFILE_DIR}/distdir/${ABSL_GOOGLETEST_COMMIT}.zip" +fi + if [[ -z ${ABSL_CMAKE_BUILD_TYPES:-} ]]; then ABSL_CMAKE_BUILD_TYPES="Debug" fi -for compilation_mode in ${ABSL_CMAKE_BUILD_TYPES}; do - BUILD_DIR=$(mktemp -d ${compilation_mode}.XXXXXXXX) - cd ${BUILD_DIR} +if [[ -z ${ABSL_CMAKE_BUILD_SHARED:-} ]]; then + ABSL_CMAKE_BUILD_SHARED="OFF ON" +fi - # TODO(absl-team): Enable -Werror once all warnings are fixed. - time cmake ${ABSEIL_ROOT} \ - -GXcode \ - -DCMAKE_BUILD_TYPE=${compilation_mode} \ - -DCMAKE_CXX_STANDARD=11 \ - -DABSL_USE_GOOGLETEST_HEAD=ON \ - -DABSL_RUN_TESTS=ON - time cmake --build . - time ctest -C ${compilation_mode} --output-on-failure +for compilation_mode in ${ABSL_CMAKE_BUILD_TYPES}; do + for build_shared in ${ABSL_CMAKE_BUILD_SHARED}; do + BUILD_DIR=$(mktemp -d ${compilation_mode}.XXXXXXXX) + cd ${BUILD_DIR} + + # TODO(absl-team): Enable -Werror once all warnings are fixed. + time cmake ${ABSEIL_ROOT} \ + -GXcode \ + -DBUILD_SHARED_LIBS=${build_shared} \ + -DCMAKE_BUILD_TYPE=${compilation_mode} \ + -DCMAKE_CXX_STANDARD=11 \ + -DCMAKE_MODULE_LINKER_FLAGS="-Wl,--no-undefined" \ + -DABSL_GOOGLETEST_DOWNLOAD_URL="${ABSL_GOOGLETEST_DOWNLOAD_URL}" \ + -DABSL_RUN_TESTS=ON + time cmake --build . + time ctest -C ${compilation_mode} --output-on-failure + done done diff --git a/third_party/abseil_cpp/conanfile.py b/third_party/abseil_cpp/conanfile.py old mode 100644 new mode 100755