From af7882601aad93ada881486eeaabc562f1733961 Mon Sep 17 00:00:00 2001 From: Abseil Team Date: Mon, 23 Apr 2018 08:17:58 -0700 Subject: [PATCH] - fd5f3d7077270ffc5ea74cdb9e18bbae3b9b46aa Fix typo optional -> variant by Abseil Team - 9136c06dfa8dbfdde0a427ad3509e34763d607a6 Fix string_view_test and str_cat_test build under MSVC de... by Derek Mauro - a463820f9441888f4368aa87328599e3209f9b07 Removes constexpr optional::operator->(). This was don... by Abseil Team - 3bf78a7f126daafff329f7815d507422f1ca378d Remove dependencies on external CCTZ project. by Shaindel Schwartz - a4ae574a11b1ddf6e88459af3d638cf79aea7ecd Internal change by Jon Cohen GitOrigin-RevId: fd5f3d7077270ffc5ea74cdb9e18bbae3b9b46aa Change-Id: I6ab8ab99863716fe9b2745a12ef285f7a6da6d1e --- CMake/AbseilHelpers.cmake | 2 +- CMake/README.md | 9 +- CMakeLists.txt | 6 - WORKSPACE | 7 - absl/base/config.h | 2 +- absl/strings/str_cat_test.cc | 2 + absl/strings/string_view_test.cc | 2 + absl/time/BUILD.bazel | 8 +- absl/time/CMakeLists.txt | 25 +- absl/time/format.cc | 4 +- absl/time/internal/cctz/BUILD.bazel | 105 ++ .../internal/cctz/include/cctz/civil_time.h | 329 ++++ .../cctz/include/cctz/civil_time_detail.h | 564 +++++++ .../internal/cctz/include/cctz/time_zone.h | 316 ++++ .../cctz/include/cctz/zone_info_source.h | 91 ++ .../internal/cctz/src/civil_time_detail.cc | 90 ++ .../time/internal/cctz/src/civil_time_test.cc | 1049 ++++++++++++ .../time/internal/cctz/src/time_zone_fixed.cc | 133 ++ absl/time/internal/cctz/src/time_zone_fixed.h | 49 + .../internal/cctz/src/time_zone_format.cc | 848 ++++++++++ .../cctz/src/time_zone_format_test.cc | 1408 +++++++++++++++++ absl/time/internal/cctz/src/time_zone_if.cc | 41 + absl/time/internal/cctz/src/time_zone_if.h | 70 + absl/time/internal/cctz/src/time_zone_impl.cc | 117 ++ absl/time/internal/cctz/src/time_zone_impl.h | 97 ++ absl/time/internal/cctz/src/time_zone_info.cc | 956 +++++++++++ absl/time/internal/cctz/src/time_zone_info.h | 132 ++ absl/time/internal/cctz/src/time_zone_libc.cc | 156 ++ absl/time/internal/cctz/src/time_zone_libc.h | 50 + .../internal/cctz/src/time_zone_lookup.cc | 142 ++ .../cctz/src/time_zone_lookup_test.cc | 1259 +++++++++++++++ .../time/internal/cctz/src/time_zone_posix.cc | 155 ++ absl/time/internal/cctz/src/time_zone_posix.h | 118 ++ absl/time/internal/cctz/src/tzfile.h | 117 ++ .../internal/cctz/src/zone_info_source.cc | 70 + .../internal/cctz/testdata/README.zoneinfo | 37 + absl/time/internal/cctz/testdata/version | 1 + .../cctz/testdata/zoneinfo/Africa/Abidjan | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/Africa/Accra | Bin 0 -> 842 bytes .../cctz/testdata/zoneinfo/Africa/Addis_Ababa | Bin 0 -> 285 bytes .../cctz/testdata/zoneinfo/Africa/Algiers | Bin 0 -> 760 bytes .../cctz/testdata/zoneinfo/Africa/Asmara | Bin 0 -> 285 bytes .../cctz/testdata/zoneinfo/Africa/Asmera | Bin 0 -> 285 bytes .../cctz/testdata/zoneinfo/Africa/Bamako | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/Africa/Bangui | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Banjul | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/Africa/Bissau | Bin 0 -> 208 bytes .../cctz/testdata/zoneinfo/Africa/Blantyre | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Brazzaville | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Bujumbura | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Cairo | Bin 0 -> 1972 bytes .../cctz/testdata/zoneinfo/Africa/Casablanca | Bin 0 -> 1643 bytes .../cctz/testdata/zoneinfo/Africa/Ceuta | Bin 0 -> 2059 bytes .../cctz/testdata/zoneinfo/Africa/Conakry | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/Africa/Dakar | Bin 0 -> 170 bytes .../testdata/zoneinfo/Africa/Dar_es_Salaam | Bin 0 -> 285 bytes .../cctz/testdata/zoneinfo/Africa/Djibouti | Bin 0 -> 285 bytes .../cctz/testdata/zoneinfo/Africa/Douala | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/El_Aaiun | Bin 0 -> 1473 bytes .../cctz/testdata/zoneinfo/Africa/Freetown | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/Africa/Gaborone | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Harare | Bin 0 -> 171 bytes .../testdata/zoneinfo/Africa/Johannesburg | Bin 0 -> 271 bytes .../cctz/testdata/zoneinfo/Africa/Juba | Bin 0 -> 683 bytes .../cctz/testdata/zoneinfo/Africa/Kampala | Bin 0 -> 285 bytes .../cctz/testdata/zoneinfo/Africa/Khartoum | Bin 0 -> 713 bytes .../cctz/testdata/zoneinfo/Africa/Kigali | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Kinshasa | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Lagos | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Libreville | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Lome | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/Africa/Luanda | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Lubumbashi | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Lusaka | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Malabo | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Maputo | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Maseru | Bin 0 -> 271 bytes .../cctz/testdata/zoneinfo/Africa/Mbabane | Bin 0 -> 271 bytes .../cctz/testdata/zoneinfo/Africa/Mogadishu | Bin 0 -> 285 bytes .../cctz/testdata/zoneinfo/Africa/Monrovia | Bin 0 -> 233 bytes .../cctz/testdata/zoneinfo/Africa/Nairobi | Bin 0 -> 285 bytes .../cctz/testdata/zoneinfo/Africa/Ndjamena | Bin 0 -> 225 bytes .../cctz/testdata/zoneinfo/Africa/Niamey | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Nouakchott | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/Africa/Ouagadougou | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/Africa/Porto-Novo | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Africa/Sao_Tome | Bin 0 -> 234 bytes .../cctz/testdata/zoneinfo/Africa/Timbuktu | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/Africa/Tripoli | Bin 0 -> 655 bytes .../cctz/testdata/zoneinfo/Africa/Tunis | Bin 0 -> 710 bytes .../cctz/testdata/zoneinfo/Africa/Windhoek | Bin 0 -> 1030 bytes .../cctz/testdata/zoneinfo/America/Adak | Bin 0 -> 2365 bytes .../cctz/testdata/zoneinfo/America/Anchorage | Bin 0 -> 2380 bytes .../cctz/testdata/zoneinfo/America/Anguilla | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/America/Antigua | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/America/Araguaina | Bin 0 -> 910 bytes .../zoneinfo/America/Argentina/Buenos_Aires | Bin 0 -> 1109 bytes .../zoneinfo/America/Argentina/Catamarca | Bin 0 -> 1109 bytes .../zoneinfo/America/Argentina/ComodRivadavia | Bin 0 -> 1109 bytes .../zoneinfo/America/Argentina/Cordoba | Bin 0 -> 1109 bytes .../testdata/zoneinfo/America/Argentina/Jujuy | Bin 0 -> 1081 bytes .../zoneinfo/America/Argentina/La_Rioja | Bin 0 -> 1123 bytes .../zoneinfo/America/Argentina/Mendoza | Bin 0 -> 1109 bytes .../zoneinfo/America/Argentina/Rio_Gallegos | Bin 0 -> 1109 bytes .../testdata/zoneinfo/America/Argentina/Salta | Bin 0 -> 1081 bytes .../zoneinfo/America/Argentina/San_Juan | Bin 0 -> 1123 bytes .../zoneinfo/America/Argentina/San_Luis | Bin 0 -> 1139 bytes .../zoneinfo/America/Argentina/Tucuman | Bin 0 -> 1137 bytes .../zoneinfo/America/Argentina/Ushuaia | Bin 0 -> 1109 bytes .../cctz/testdata/zoneinfo/America/Aruba | Bin 0 -> 212 bytes .../cctz/testdata/zoneinfo/America/Asuncion | Bin 0 -> 2077 bytes .../cctz/testdata/zoneinfo/America/Atikokan | Bin 0 -> 345 bytes .../cctz/testdata/zoneinfo/America/Atka | Bin 0 -> 2365 bytes .../cctz/testdata/zoneinfo/America/Bahia | Bin 0 -> 1050 bytes .../testdata/zoneinfo/America/Bahia_Banderas | Bin 0 -> 1588 bytes .../cctz/testdata/zoneinfo/America/Barbados | Bin 0 -> 344 bytes .../cctz/testdata/zoneinfo/America/Belem | Bin 0 -> 602 bytes .../cctz/testdata/zoneinfo/America/Belize | Bin 0 -> 978 bytes .../testdata/zoneinfo/America/Blanc-Sablon | Bin 0 -> 307 bytes .../cctz/testdata/zoneinfo/America/Boa_Vista | Bin 0 -> 658 bytes .../cctz/testdata/zoneinfo/America/Bogota | Bin 0 -> 271 bytes .../cctz/testdata/zoneinfo/America/Boise | Bin 0 -> 2403 bytes .../testdata/zoneinfo/America/Buenos_Aires | Bin 0 -> 1109 bytes .../testdata/zoneinfo/America/Cambridge_Bay | Bin 0 -> 2098 bytes .../testdata/zoneinfo/America/Campo_Grande | Bin 0 -> 2016 bytes .../cctz/testdata/zoneinfo/America/Cancun | Bin 0 -> 816 bytes .../cctz/testdata/zoneinfo/America/Caracas | Bin 0 -> 289 bytes .../cctz/testdata/zoneinfo/America/Catamarca | Bin 0 -> 1109 bytes .../cctz/testdata/zoneinfo/America/Cayenne | Bin 0 -> 224 bytes .../cctz/testdata/zoneinfo/America/Cayman | Bin 0 -> 203 bytes .../cctz/testdata/zoneinfo/America/Chicago | Bin 0 -> 3585 bytes .../cctz/testdata/zoneinfo/America/Chihuahua | Bin 0 -> 1522 bytes .../testdata/zoneinfo/America/Coral_Harbour | Bin 0 -> 345 bytes .../cctz/testdata/zoneinfo/America/Cordoba | Bin 0 -> 1109 bytes .../cctz/testdata/zoneinfo/America/Costa_Rica | Bin 0 -> 341 bytes .../cctz/testdata/zoneinfo/America/Creston | Bin 0 -> 233 bytes .../cctz/testdata/zoneinfo/America/Cuiaba | Bin 0 -> 1988 bytes .../cctz/testdata/zoneinfo/America/Curacao | Bin 0 -> 212 bytes .../testdata/zoneinfo/America/Danmarkshavn | Bin 0 -> 712 bytes .../cctz/testdata/zoneinfo/America/Dawson | Bin 0 -> 2093 bytes .../testdata/zoneinfo/America/Dawson_Creek | Bin 0 -> 1059 bytes .../cctz/testdata/zoneinfo/America/Denver | Bin 0 -> 2453 bytes .../cctz/testdata/zoneinfo/America/Detroit | Bin 0 -> 2188 bytes .../cctz/testdata/zoneinfo/America/Dominica | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/America/Edmonton | Bin 0 -> 2402 bytes .../cctz/testdata/zoneinfo/America/Eirunepe | Bin 0 -> 690 bytes .../testdata/zoneinfo/America/El_Salvador | Bin 0 -> 250 bytes .../cctz/testdata/zoneinfo/America/Ensenada | Bin 0 -> 2356 bytes .../testdata/zoneinfo/America/Fort_Nelson | Bin 0 -> 2249 bytes .../cctz/testdata/zoneinfo/America/Fort_Wayne | Bin 0 -> 1675 bytes .../cctz/testdata/zoneinfo/America/Fortaleza | Bin 0 -> 742 bytes .../cctz/testdata/zoneinfo/America/Glace_Bay | Bin 0 -> 2206 bytes .../cctz/testdata/zoneinfo/America/Godthab | Bin 0 -> 1892 bytes .../cctz/testdata/zoneinfo/America/Goose_Bay | Bin 0 -> 3219 bytes .../cctz/testdata/zoneinfo/America/Grand_Turk | Bin 0 -> 1881 bytes .../cctz/testdata/zoneinfo/America/Grenada | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/America/Guadeloupe | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/America/Guatemala | Bin 0 -> 306 bytes .../cctz/testdata/zoneinfo/America/Guayaquil | Bin 0 -> 271 bytes .../cctz/testdata/zoneinfo/America/Guyana | Bin 0 -> 266 bytes .../cctz/testdata/zoneinfo/America/Halifax | Bin 0 -> 3438 bytes .../cctz/testdata/zoneinfo/America/Havana | Bin 0 -> 2437 bytes .../cctz/testdata/zoneinfo/America/Hermosillo | Bin 0 -> 454 bytes .../zoneinfo/America/Indiana/Indianapolis | Bin 0 -> 1675 bytes .../testdata/zoneinfo/America/Indiana/Knox | Bin 0 -> 2437 bytes .../testdata/zoneinfo/America/Indiana/Marengo | Bin 0 -> 1731 bytes .../zoneinfo/America/Indiana/Petersburg | Bin 0 -> 1913 bytes .../zoneinfo/America/Indiana/Tell_City | Bin 0 -> 1735 bytes .../testdata/zoneinfo/America/Indiana/Vevay | Bin 0 -> 1423 bytes .../zoneinfo/America/Indiana/Vincennes | Bin 0 -> 1703 bytes .../testdata/zoneinfo/America/Indiana/Winamac | Bin 0 -> 1787 bytes .../testdata/zoneinfo/America/Indianapolis | Bin 0 -> 1675 bytes .../cctz/testdata/zoneinfo/America/Inuvik | Bin 0 -> 1928 bytes .../cctz/testdata/zoneinfo/America/Iqaluit | Bin 0 -> 2046 bytes .../cctz/testdata/zoneinfo/America/Jamaica | Bin 0 -> 507 bytes .../cctz/testdata/zoneinfo/America/Jujuy | Bin 0 -> 1081 bytes .../cctz/testdata/zoneinfo/America/Juneau | Bin 0 -> 2362 bytes .../zoneinfo/America/Kentucky/Louisville | Bin 0 -> 2781 bytes .../zoneinfo/America/Kentucky/Monticello | Bin 0 -> 2361 bytes .../cctz/testdata/zoneinfo/America/Knox_IN | Bin 0 -> 2437 bytes .../cctz/testdata/zoneinfo/America/Kralendijk | Bin 0 -> 212 bytes .../cctz/testdata/zoneinfo/America/La_Paz | Bin 0 -> 257 bytes .../cctz/testdata/zoneinfo/America/Lima | Bin 0 -> 431 bytes .../testdata/zoneinfo/America/Los_Angeles | Bin 0 -> 2845 bytes .../cctz/testdata/zoneinfo/America/Louisville | Bin 0 -> 2781 bytes .../testdata/zoneinfo/America/Lower_Princes | Bin 0 -> 212 bytes .../cctz/testdata/zoneinfo/America/Maceio | Bin 0 -> 770 bytes .../cctz/testdata/zoneinfo/America/Managua | Bin 0 -> 463 bytes .../cctz/testdata/zoneinfo/America/Manaus | Bin 0 -> 630 bytes .../cctz/testdata/zoneinfo/America/Marigot | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/America/Martinique | Bin 0 -> 257 bytes .../cctz/testdata/zoneinfo/America/Matamoros | Bin 0 -> 1416 bytes .../cctz/testdata/zoneinfo/America/Mazatlan | Bin 0 -> 1564 bytes .../cctz/testdata/zoneinfo/America/Mendoza | Bin 0 -> 1109 bytes .../cctz/testdata/zoneinfo/America/Menominee | Bin 0 -> 2283 bytes .../cctz/testdata/zoneinfo/America/Merida | Bin 0 -> 1456 bytes .../cctz/testdata/zoneinfo/America/Metlakatla | Bin 0 -> 1418 bytes .../testdata/zoneinfo/America/Mexico_City | Bin 0 -> 1618 bytes .../cctz/testdata/zoneinfo/America/Miquelon | Bin 0 -> 1696 bytes .../cctz/testdata/zoneinfo/America/Moncton | Bin 0 -> 3163 bytes .../cctz/testdata/zoneinfo/America/Monterrey | Bin 0 -> 1416 bytes .../cctz/testdata/zoneinfo/America/Montevideo | Bin 0 -> 1564 bytes .../cctz/testdata/zoneinfo/America/Montreal | Bin 0 -> 3503 bytes .../cctz/testdata/zoneinfo/America/Montserrat | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/America/Nassau | Bin 0 -> 2284 bytes .../cctz/testdata/zoneinfo/America/New_York | Bin 0 -> 3545 bytes .../cctz/testdata/zoneinfo/America/Nipigon | Bin 0 -> 2131 bytes .../cctz/testdata/zoneinfo/America/Nome | Bin 0 -> 2376 bytes .../cctz/testdata/zoneinfo/America/Noronha | Bin 0 -> 742 bytes .../zoneinfo/America/North_Dakota/Beulah | Bin 0 -> 2389 bytes .../zoneinfo/America/North_Dakota/Center | Bin 0 -> 2389 bytes .../zoneinfo/America/North_Dakota/New_Salem | Bin 0 -> 2389 bytes .../cctz/testdata/zoneinfo/America/Ojinaga | Bin 0 -> 1522 bytes .../cctz/testdata/zoneinfo/America/Panama | Bin 0 -> 203 bytes .../testdata/zoneinfo/America/Pangnirtung | Bin 0 -> 2108 bytes .../cctz/testdata/zoneinfo/America/Paramaribo | Bin 0 -> 296 bytes .../cctz/testdata/zoneinfo/America/Phoenix | Bin 0 -> 353 bytes .../testdata/zoneinfo/America/Port-au-Prince | Bin 0 -> 1455 bytes .../testdata/zoneinfo/America/Port_of_Spain | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/America/Porto_Acre | Bin 0 -> 662 bytes .../testdata/zoneinfo/America/Porto_Velho | Bin 0 -> 602 bytes .../testdata/zoneinfo/America/Puerto_Rico | Bin 0 -> 255 bytes .../testdata/zoneinfo/America/Punta_Arenas | Bin 0 -> 1911 bytes .../testdata/zoneinfo/America/Rainy_River | Bin 0 -> 2131 bytes .../testdata/zoneinfo/America/Rankin_Inlet | Bin 0 -> 1930 bytes .../cctz/testdata/zoneinfo/America/Recife | Bin 0 -> 742 bytes .../cctz/testdata/zoneinfo/America/Regina | Bin 0 -> 994 bytes .../cctz/testdata/zoneinfo/America/Resolute | Bin 0 -> 1930 bytes .../cctz/testdata/zoneinfo/America/Rio_Branco | Bin 0 -> 662 bytes .../cctz/testdata/zoneinfo/America/Rosario | Bin 0 -> 1109 bytes .../testdata/zoneinfo/America/Santa_Isabel | Bin 0 -> 2356 bytes .../cctz/testdata/zoneinfo/America/Santarem | Bin 0 -> 632 bytes .../cctz/testdata/zoneinfo/America/Santiago | Bin 0 -> 2538 bytes .../testdata/zoneinfo/America/Santo_Domingo | Bin 0 -> 491 bytes .../cctz/testdata/zoneinfo/America/Sao_Paulo | Bin 0 -> 2016 bytes .../testdata/zoneinfo/America/Scoresbysund | Bin 0 -> 1930 bytes .../cctz/testdata/zoneinfo/America/Shiprock | Bin 0 -> 2453 bytes .../cctz/testdata/zoneinfo/America/Sitka | Bin 0 -> 2350 bytes .../testdata/zoneinfo/America/St_Barthelemy | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/America/St_Johns | Bin 0 -> 3664 bytes .../cctz/testdata/zoneinfo/America/St_Kitts | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/America/St_Lucia | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/America/St_Thomas | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/America/St_Vincent | Bin 0 -> 170 bytes .../testdata/zoneinfo/America/Swift_Current | Bin 0 -> 574 bytes .../testdata/zoneinfo/America/Tegucigalpa | Bin 0 -> 278 bytes .../cctz/testdata/zoneinfo/America/Thule | Bin 0 -> 1528 bytes .../testdata/zoneinfo/America/Thunder_Bay | Bin 0 -> 2211 bytes .../cctz/testdata/zoneinfo/America/Tijuana | Bin 0 -> 2356 bytes .../cctz/testdata/zoneinfo/America/Toronto | Bin 0 -> 3503 bytes .../cctz/testdata/zoneinfo/America/Tortola | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/America/Vancouver | Bin 0 -> 2901 bytes .../cctz/testdata/zoneinfo/America/Virgin | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/America/Whitehorse | Bin 0 -> 2093 bytes .../cctz/testdata/zoneinfo/America/Winnipeg | Bin 0 -> 2891 bytes .../cctz/testdata/zoneinfo/America/Yakutat | Bin 0 -> 2314 bytes .../testdata/zoneinfo/America/Yellowknife | Bin 0 -> 1980 bytes .../cctz/testdata/zoneinfo/Antarctica/Casey | Bin 0 -> 311 bytes .../cctz/testdata/zoneinfo/Antarctica/Davis | Bin 0 -> 311 bytes .../zoneinfo/Antarctica/DumontDUrville | Bin 0 -> 216 bytes .../testdata/zoneinfo/Antarctica/Macquarie | Bin 0 -> 1543 bytes .../cctz/testdata/zoneinfo/Antarctica/Mawson | Bin 0 -> 225 bytes .../cctz/testdata/zoneinfo/Antarctica/McMurdo | Bin 0 -> 2460 bytes .../cctz/testdata/zoneinfo/Antarctica/Palmer | Bin 0 -> 1432 bytes .../cctz/testdata/zoneinfo/Antarctica/Rothera | Bin 0 -> 186 bytes .../testdata/zoneinfo/Antarctica/South_Pole | Bin 0 -> 2460 bytes .../cctz/testdata/zoneinfo/Antarctica/Syowa | Bin 0 -> 187 bytes .../cctz/testdata/zoneinfo/Antarctica/Troll | Bin 0 -> 1176 bytes .../cctz/testdata/zoneinfo/Antarctica/Vostok | Bin 0 -> 187 bytes .../testdata/zoneinfo/Arctic/Longyearbyen | Bin 0 -> 2251 bytes .../internal/cctz/testdata/zoneinfo/Asia/Aden | Bin 0 -> 187 bytes .../cctz/testdata/zoneinfo/Asia/Almaty | Bin 0 -> 1031 bytes .../cctz/testdata/zoneinfo/Asia/Amman | Bin 0 -> 1877 bytes .../cctz/testdata/zoneinfo/Asia/Anadyr | Bin 0 -> 1222 bytes .../cctz/testdata/zoneinfo/Asia/Aqtau | Bin 0 -> 1017 bytes .../cctz/testdata/zoneinfo/Asia/Aqtobe | Bin 0 -> 1047 bytes .../cctz/testdata/zoneinfo/Asia/Ashgabat | Bin 0 -> 651 bytes .../cctz/testdata/zoneinfo/Asia/Ashkhabad | Bin 0 -> 651 bytes .../cctz/testdata/zoneinfo/Asia/Atyrau | Bin 0 -> 1025 bytes .../cctz/testdata/zoneinfo/Asia/Baghdad | Bin 0 -> 1004 bytes .../cctz/testdata/zoneinfo/Asia/Bahrain | Bin 0 -> 225 bytes .../internal/cctz/testdata/zoneinfo/Asia/Baku | Bin 0 -> 1269 bytes .../cctz/testdata/zoneinfo/Asia/Bangkok | Bin 0 -> 220 bytes .../cctz/testdata/zoneinfo/Asia/Barnaul | Bin 0 -> 1255 bytes .../cctz/testdata/zoneinfo/Asia/Beirut | Bin 0 -> 2175 bytes .../cctz/testdata/zoneinfo/Asia/Bishkek | Bin 0 -> 1045 bytes .../cctz/testdata/zoneinfo/Asia/Brunei | Bin 0 -> 229 bytes .../cctz/testdata/zoneinfo/Asia/Calcutta | Bin 0 -> 312 bytes .../cctz/testdata/zoneinfo/Asia/Chita | Bin 0 -> 1257 bytes .../cctz/testdata/zoneinfo/Asia/Choibalsan | Bin 0 -> 991 bytes .../cctz/testdata/zoneinfo/Asia/Chongqing | Bin 0 -> 414 bytes .../cctz/testdata/zoneinfo/Asia/Chungking | Bin 0 -> 414 bytes .../cctz/testdata/zoneinfo/Asia/Colombo | Bin 0 -> 413 bytes .../cctz/testdata/zoneinfo/Asia/Dacca | Bin 0 -> 370 bytes .../cctz/testdata/zoneinfo/Asia/Damascus | Bin 0 -> 2320 bytes .../cctz/testdata/zoneinfo/Asia/Dhaka | Bin 0 -> 370 bytes .../internal/cctz/testdata/zoneinfo/Asia/Dili | Bin 0 -> 253 bytes .../cctz/testdata/zoneinfo/Asia/Dubai | Bin 0 -> 187 bytes .../cctz/testdata/zoneinfo/Asia/Dushanbe | Bin 0 -> 621 bytes .../cctz/testdata/zoneinfo/Asia/Famagusta | Bin 0 -> 2042 bytes .../internal/cctz/testdata/zoneinfo/Asia/Gaza | Bin 0 -> 2295 bytes .../cctz/testdata/zoneinfo/Asia/Harbin | Bin 0 -> 414 bytes .../cctz/testdata/zoneinfo/Asia/Hebron | Bin 0 -> 2323 bytes .../cctz/testdata/zoneinfo/Asia/Ho_Chi_Minh | Bin 0 -> 389 bytes .../cctz/testdata/zoneinfo/Asia/Hong_Kong | Bin 0 -> 1189 bytes .../internal/cctz/testdata/zoneinfo/Asia/Hovd | Bin 0 -> 921 bytes .../cctz/testdata/zoneinfo/Asia/Irkutsk | Bin 0 -> 1276 bytes .../cctz/testdata/zoneinfo/Asia/Istanbul | Bin 0 -> 2166 bytes .../cctz/testdata/zoneinfo/Asia/Jakarta | Bin 0 -> 392 bytes .../cctz/testdata/zoneinfo/Asia/Jayapura | Bin 0 -> 251 bytes .../cctz/testdata/zoneinfo/Asia/Jerusalem | Bin 0 -> 2265 bytes .../cctz/testdata/zoneinfo/Asia/Kabul | Bin 0 -> 229 bytes .../cctz/testdata/zoneinfo/Asia/Kamchatka | Bin 0 -> 1198 bytes .../cctz/testdata/zoneinfo/Asia/Karachi | Bin 0 -> 417 bytes .../cctz/testdata/zoneinfo/Asia/Kashgar | Bin 0 -> 187 bytes .../cctz/testdata/zoneinfo/Asia/Kathmandu | Bin 0 -> 238 bytes .../cctz/testdata/zoneinfo/Asia/Katmandu | Bin 0 -> 238 bytes .../cctz/testdata/zoneinfo/Asia/Khandyga | Bin 0 -> 1311 bytes .../cctz/testdata/zoneinfo/Asia/Kolkata | Bin 0 -> 312 bytes .../cctz/testdata/zoneinfo/Asia/Krasnoyarsk | Bin 0 -> 1243 bytes .../cctz/testdata/zoneinfo/Asia/Kuala_Lumpur | Bin 0 -> 424 bytes .../cctz/testdata/zoneinfo/Asia/Kuching | Bin 0 -> 521 bytes .../cctz/testdata/zoneinfo/Asia/Kuwait | Bin 0 -> 187 bytes .../cctz/testdata/zoneinfo/Asia/Macao | Bin 0 -> 771 bytes .../cctz/testdata/zoneinfo/Asia/Macau | Bin 0 -> 771 bytes .../cctz/testdata/zoneinfo/Asia/Magadan | Bin 0 -> 1258 bytes .../cctz/testdata/zoneinfo/Asia/Makassar | Bin 0 -> 288 bytes .../cctz/testdata/zoneinfo/Asia/Manila | Bin 0 -> 367 bytes .../cctz/testdata/zoneinfo/Asia/Muscat | Bin 0 -> 187 bytes .../cctz/testdata/zoneinfo/Asia/Nicosia | Bin 0 -> 2016 bytes .../cctz/testdata/zoneinfo/Asia/Novokuznetsk | Bin 0 -> 1197 bytes .../cctz/testdata/zoneinfo/Asia/Novosibirsk | Bin 0 -> 1255 bytes .../internal/cctz/testdata/zoneinfo/Asia/Omsk | Bin 0 -> 1243 bytes .../internal/cctz/testdata/zoneinfo/Asia/Oral | Bin 0 -> 1039 bytes .../cctz/testdata/zoneinfo/Asia/Phnom_Penh | Bin 0 -> 220 bytes .../cctz/testdata/zoneinfo/Asia/Pontianak | Bin 0 -> 395 bytes .../cctz/testdata/zoneinfo/Asia/Pyongyang | Bin 0 -> 272 bytes .../cctz/testdata/zoneinfo/Asia/Qatar | Bin 0 -> 225 bytes .../cctz/testdata/zoneinfo/Asia/Qyzylorda | Bin 0 -> 1047 bytes .../cctz/testdata/zoneinfo/Asia/Rangoon | Bin 0 -> 297 bytes .../cctz/testdata/zoneinfo/Asia/Riyadh | Bin 0 -> 187 bytes .../cctz/testdata/zoneinfo/Asia/Saigon | Bin 0 -> 389 bytes .../cctz/testdata/zoneinfo/Asia/Sakhalin | Bin 0 -> 1234 bytes .../cctz/testdata/zoneinfo/Asia/Samarkand | Bin 0 -> 619 bytes .../cctz/testdata/zoneinfo/Asia/Seoul | Bin 0 -> 531 bytes .../cctz/testdata/zoneinfo/Asia/Shanghai | Bin 0 -> 414 bytes .../cctz/testdata/zoneinfo/Asia/Singapore | Bin 0 -> 424 bytes .../cctz/testdata/zoneinfo/Asia/Srednekolymsk | Bin 0 -> 1244 bytes .../cctz/testdata/zoneinfo/Asia/Taipei | Bin 0 -> 790 bytes .../cctz/testdata/zoneinfo/Asia/Tashkent | Bin 0 -> 635 bytes .../cctz/testdata/zoneinfo/Asia/Tbilisi | Bin 0 -> 1080 bytes .../cctz/testdata/zoneinfo/Asia/Tehran | Bin 0 -> 1718 bytes .../cctz/testdata/zoneinfo/Asia/Tel_Aviv | Bin 0 -> 2265 bytes .../cctz/testdata/zoneinfo/Asia/Thimbu | Bin 0 -> 229 bytes .../cctz/testdata/zoneinfo/Asia/Thimphu | Bin 0 -> 229 bytes .../cctz/testdata/zoneinfo/Asia/Tokyo | Bin 0 -> 318 bytes .../cctz/testdata/zoneinfo/Asia/Tomsk | Bin 0 -> 1255 bytes .../cctz/testdata/zoneinfo/Asia/Ujung_Pandang | Bin 0 -> 288 bytes .../cctz/testdata/zoneinfo/Asia/Ulaanbaatar | Bin 0 -> 921 bytes .../cctz/testdata/zoneinfo/Asia/Ulan_Bator | Bin 0 -> 921 bytes .../cctz/testdata/zoneinfo/Asia/Urumqi | Bin 0 -> 187 bytes .../cctz/testdata/zoneinfo/Asia/Ust-Nera | Bin 0 -> 1290 bytes .../cctz/testdata/zoneinfo/Asia/Vientiane | Bin 0 -> 220 bytes .../cctz/testdata/zoneinfo/Asia/Vladivostok | Bin 0 -> 1244 bytes .../cctz/testdata/zoneinfo/Asia/Yakutsk | Bin 0 -> 1243 bytes .../cctz/testdata/zoneinfo/Asia/Yangon | Bin 0 -> 297 bytes .../cctz/testdata/zoneinfo/Asia/Yekaterinburg | Bin 0 -> 1281 bytes .../cctz/testdata/zoneinfo/Asia/Yerevan | Bin 0 -> 1213 bytes .../cctz/testdata/zoneinfo/Atlantic/Azores | Bin 0 -> 3493 bytes .../cctz/testdata/zoneinfo/Atlantic/Bermuda | Bin 0 -> 2004 bytes .../cctz/testdata/zoneinfo/Atlantic/Canary | Bin 0 -> 1911 bytes .../testdata/zoneinfo/Atlantic/Cape_Verde | Bin 0 -> 284 bytes .../cctz/testdata/zoneinfo/Atlantic/Faeroe | Bin 0 -> 1829 bytes .../cctz/testdata/zoneinfo/Atlantic/Faroe | Bin 0 -> 1829 bytes .../cctz/testdata/zoneinfo/Atlantic/Jan_Mayen | Bin 0 -> 2251 bytes .../cctz/testdata/zoneinfo/Atlantic/Madeira | Bin 0 -> 3484 bytes .../cctz/testdata/zoneinfo/Atlantic/Reykjavik | Bin 0 -> 1188 bytes .../testdata/zoneinfo/Atlantic/South_Georgia | Bin 0 -> 181 bytes .../cctz/testdata/zoneinfo/Atlantic/St_Helena | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/Atlantic/Stanley | Bin 0 -> 1251 bytes .../cctz/testdata/zoneinfo/Australia/ACT | Bin 0 -> 2223 bytes .../cctz/testdata/zoneinfo/Australia/Adelaide | Bin 0 -> 2238 bytes .../cctz/testdata/zoneinfo/Australia/Brisbane | Bin 0 -> 452 bytes .../testdata/zoneinfo/Australia/Broken_Hill | Bin 0 -> 2274 bytes .../cctz/testdata/zoneinfo/Australia/Canberra | Bin 0 -> 2223 bytes .../cctz/testdata/zoneinfo/Australia/Currie | Bin 0 -> 2223 bytes .../cctz/testdata/zoneinfo/Australia/Darwin | Bin 0 -> 323 bytes .../cctz/testdata/zoneinfo/Australia/Eucla | Bin 0 -> 503 bytes .../cctz/testdata/zoneinfo/Australia/Hobart | Bin 0 -> 2335 bytes .../cctz/testdata/zoneinfo/Australia/LHI | Bin 0 -> 1889 bytes .../cctz/testdata/zoneinfo/Australia/Lindeman | Bin 0 -> 522 bytes .../testdata/zoneinfo/Australia/Lord_Howe | Bin 0 -> 1889 bytes .../testdata/zoneinfo/Australia/Melbourne | Bin 0 -> 2223 bytes .../cctz/testdata/zoneinfo/Australia/NSW | Bin 0 -> 2223 bytes .../cctz/testdata/zoneinfo/Australia/North | Bin 0 -> 323 bytes .../cctz/testdata/zoneinfo/Australia/Perth | Bin 0 -> 479 bytes .../testdata/zoneinfo/Australia/Queensland | Bin 0 -> 452 bytes .../cctz/testdata/zoneinfo/Australia/South | Bin 0 -> 2238 bytes .../cctz/testdata/zoneinfo/Australia/Sydney | Bin 0 -> 2223 bytes .../cctz/testdata/zoneinfo/Australia/Tasmania | Bin 0 -> 2335 bytes .../cctz/testdata/zoneinfo/Australia/Victoria | Bin 0 -> 2223 bytes .../cctz/testdata/zoneinfo/Australia/West | Bin 0 -> 479 bytes .../testdata/zoneinfo/Australia/Yancowinna | Bin 0 -> 2274 bytes .../cctz/testdata/zoneinfo/Brazil/Acre | Bin 0 -> 662 bytes .../cctz/testdata/zoneinfo/Brazil/DeNoronha | Bin 0 -> 742 bytes .../cctz/testdata/zoneinfo/Brazil/East | Bin 0 -> 2016 bytes .../cctz/testdata/zoneinfo/Brazil/West | Bin 0 -> 630 bytes absl/time/internal/cctz/testdata/zoneinfo/CET | Bin 0 -> 2102 bytes .../internal/cctz/testdata/zoneinfo/CST6CDT | Bin 0 -> 2294 bytes .../cctz/testdata/zoneinfo/Canada/Atlantic | Bin 0 -> 3438 bytes .../cctz/testdata/zoneinfo/Canada/Central | Bin 0 -> 2891 bytes .../cctz/testdata/zoneinfo/Canada/Eastern | Bin 0 -> 3503 bytes .../cctz/testdata/zoneinfo/Canada/Mountain | Bin 0 -> 2402 bytes .../testdata/zoneinfo/Canada/Newfoundland | Bin 0 -> 3664 bytes .../cctz/testdata/zoneinfo/Canada/Pacific | Bin 0 -> 2901 bytes .../testdata/zoneinfo/Canada/Saskatchewan | Bin 0 -> 994 bytes .../cctz/testdata/zoneinfo/Canada/Yukon | Bin 0 -> 2093 bytes .../cctz/testdata/zoneinfo/Chile/Continental | Bin 0 -> 2538 bytes .../cctz/testdata/zoneinfo/Chile/EasterIsland | Bin 0 -> 2242 bytes .../time/internal/cctz/testdata/zoneinfo/Cuba | Bin 0 -> 2437 bytes absl/time/internal/cctz/testdata/zoneinfo/EET | Bin 0 -> 1876 bytes absl/time/internal/cctz/testdata/zoneinfo/EST | Bin 0 -> 127 bytes .../internal/cctz/testdata/zoneinfo/EST5EDT | Bin 0 -> 2294 bytes .../internal/cctz/testdata/zoneinfo/Egypt | Bin 0 -> 1972 bytes .../time/internal/cctz/testdata/zoneinfo/Eire | Bin 0 -> 3531 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT | Bin 0 -> 127 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+0 | Bin 0 -> 127 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+1 | Bin 0 -> 148 bytes .../cctz/testdata/zoneinfo/Etc/GMT+10 | Bin 0 -> 149 bytes .../cctz/testdata/zoneinfo/Etc/GMT+11 | Bin 0 -> 149 bytes .../cctz/testdata/zoneinfo/Etc/GMT+12 | Bin 0 -> 149 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+2 | Bin 0 -> 148 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+3 | Bin 0 -> 148 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+4 | Bin 0 -> 148 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+5 | Bin 0 -> 148 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+6 | Bin 0 -> 148 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+7 | Bin 0 -> 148 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+8 | Bin 0 -> 148 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+9 | Bin 0 -> 148 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-0 | Bin 0 -> 127 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-1 | Bin 0 -> 149 bytes .../cctz/testdata/zoneinfo/Etc/GMT-10 | Bin 0 -> 150 bytes .../cctz/testdata/zoneinfo/Etc/GMT-11 | Bin 0 -> 150 bytes .../cctz/testdata/zoneinfo/Etc/GMT-12 | Bin 0 -> 150 bytes .../cctz/testdata/zoneinfo/Etc/GMT-13 | Bin 0 -> 150 bytes .../cctz/testdata/zoneinfo/Etc/GMT-14 | Bin 0 -> 150 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-2 | Bin 0 -> 149 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-3 | Bin 0 -> 149 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-4 | Bin 0 -> 149 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-5 | Bin 0 -> 149 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-6 | Bin 0 -> 149 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-7 | Bin 0 -> 149 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-8 | Bin 0 -> 149 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-9 | Bin 0 -> 149 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT0 | Bin 0 -> 127 bytes .../cctz/testdata/zoneinfo/Etc/Greenwich | Bin 0 -> 127 bytes .../internal/cctz/testdata/zoneinfo/Etc/UCT | Bin 0 -> 127 bytes .../internal/cctz/testdata/zoneinfo/Etc/UTC | Bin 0 -> 127 bytes .../cctz/testdata/zoneinfo/Etc/Universal | Bin 0 -> 127 bytes .../internal/cctz/testdata/zoneinfo/Etc/Zulu | Bin 0 -> 127 bytes .../cctz/testdata/zoneinfo/Europe/Amsterdam | Bin 0 -> 2949 bytes .../cctz/testdata/zoneinfo/Europe/Andorra | Bin 0 -> 1751 bytes .../cctz/testdata/zoneinfo/Europe/Astrakhan | Bin 0 -> 1197 bytes .../cctz/testdata/zoneinfo/Europe/Athens | Bin 0 -> 2271 bytes .../cctz/testdata/zoneinfo/Europe/Belfast | Bin 0 -> 3687 bytes .../cctz/testdata/zoneinfo/Europe/Belgrade | Bin 0 -> 1957 bytes .../cctz/testdata/zoneinfo/Europe/Berlin | Bin 0 -> 2335 bytes .../cctz/testdata/zoneinfo/Europe/Bratislava | Bin 0 -> 2272 bytes .../cctz/testdata/zoneinfo/Europe/Brussels | Bin 0 -> 2970 bytes .../cctz/testdata/zoneinfo/Europe/Bucharest | Bin 0 -> 2221 bytes .../cctz/testdata/zoneinfo/Europe/Budapest | Bin 0 -> 2405 bytes .../cctz/testdata/zoneinfo/Europe/Busingen | Bin 0 -> 1918 bytes .../cctz/testdata/zoneinfo/Europe/Chisinau | Bin 0 -> 2445 bytes .../cctz/testdata/zoneinfo/Europe/Copenhagen | Bin 0 -> 2160 bytes .../cctz/testdata/zoneinfo/Europe/Dublin | Bin 0 -> 3531 bytes .../cctz/testdata/zoneinfo/Europe/Gibraltar | Bin 0 -> 3061 bytes .../cctz/testdata/zoneinfo/Europe/Guernsey | Bin 0 -> 3687 bytes .../cctz/testdata/zoneinfo/Europe/Helsinki | Bin 0 -> 1909 bytes .../cctz/testdata/zoneinfo/Europe/Isle_of_Man | Bin 0 -> 3687 bytes .../cctz/testdata/zoneinfo/Europe/Istanbul | Bin 0 -> 2166 bytes .../cctz/testdata/zoneinfo/Europe/Jersey | Bin 0 -> 3687 bytes .../cctz/testdata/zoneinfo/Europe/Kaliningrad | Bin 0 -> 1518 bytes .../cctz/testdata/zoneinfo/Europe/Kiev | Bin 0 -> 2097 bytes .../cctz/testdata/zoneinfo/Europe/Kirov | Bin 0 -> 1167 bytes .../cctz/testdata/zoneinfo/Europe/Lisbon | Bin 0 -> 3469 bytes .../cctz/testdata/zoneinfo/Europe/Ljubljana | Bin 0 -> 1957 bytes .../cctz/testdata/zoneinfo/Europe/London | Bin 0 -> 3687 bytes .../cctz/testdata/zoneinfo/Europe/Luxembourg | Bin 0 -> 2974 bytes .../cctz/testdata/zoneinfo/Europe/Madrid | Bin 0 -> 2637 bytes .../cctz/testdata/zoneinfo/Europe/Malta | Bin 0 -> 2629 bytes .../cctz/testdata/zoneinfo/Europe/Mariehamn | Bin 0 -> 1909 bytes .../cctz/testdata/zoneinfo/Europe/Minsk | Bin 0 -> 1370 bytes .../cctz/testdata/zoneinfo/Europe/Monaco | Bin 0 -> 2953 bytes .../cctz/testdata/zoneinfo/Europe/Moscow | Bin 0 -> 1544 bytes .../cctz/testdata/zoneinfo/Europe/Nicosia | Bin 0 -> 2016 bytes .../cctz/testdata/zoneinfo/Europe/Oslo | Bin 0 -> 2251 bytes .../cctz/testdata/zoneinfo/Europe/Paris | Bin 0 -> 2971 bytes .../cctz/testdata/zoneinfo/Europe/Podgorica | Bin 0 -> 1957 bytes .../cctz/testdata/zoneinfo/Europe/Prague | Bin 0 -> 2272 bytes .../cctz/testdata/zoneinfo/Europe/Riga | Bin 0 -> 2235 bytes .../cctz/testdata/zoneinfo/Europe/Rome | Bin 0 -> 2692 bytes .../cctz/testdata/zoneinfo/Europe/Samara | Bin 0 -> 1253 bytes .../cctz/testdata/zoneinfo/Europe/San_Marino | Bin 0 -> 2692 bytes .../cctz/testdata/zoneinfo/Europe/Sarajevo | Bin 0 -> 1957 bytes .../cctz/testdata/zoneinfo/Europe/Saratov | Bin 0 -> 1197 bytes .../cctz/testdata/zoneinfo/Europe/Simferopol | Bin 0 -> 1490 bytes .../cctz/testdata/zoneinfo/Europe/Skopje | Bin 0 -> 1957 bytes .../cctz/testdata/zoneinfo/Europe/Sofia | Bin 0 -> 2130 bytes .../cctz/testdata/zoneinfo/Europe/Stockholm | Bin 0 -> 1918 bytes .../cctz/testdata/zoneinfo/Europe/Tallinn | Bin 0 -> 2187 bytes .../cctz/testdata/zoneinfo/Europe/Tirane | Bin 0 -> 2098 bytes .../cctz/testdata/zoneinfo/Europe/Tiraspol | Bin 0 -> 2445 bytes .../cctz/testdata/zoneinfo/Europe/Ulyanovsk | Bin 0 -> 1281 bytes .../cctz/testdata/zoneinfo/Europe/Uzhgorod | Bin 0 -> 2103 bytes .../cctz/testdata/zoneinfo/Europe/Vaduz | Bin 0 -> 1918 bytes .../cctz/testdata/zoneinfo/Europe/Vatican | Bin 0 -> 2692 bytes .../cctz/testdata/zoneinfo/Europe/Vienna | Bin 0 -> 2237 bytes .../cctz/testdata/zoneinfo/Europe/Vilnius | Bin 0 -> 2199 bytes .../cctz/testdata/zoneinfo/Europe/Volgograd | Bin 0 -> 1167 bytes .../cctz/testdata/zoneinfo/Europe/Warsaw | Bin 0 -> 2705 bytes .../cctz/testdata/zoneinfo/Europe/Zagreb | Bin 0 -> 1957 bytes .../cctz/testdata/zoneinfo/Europe/Zaporozhye | Bin 0 -> 2115 bytes .../cctz/testdata/zoneinfo/Europe/Zurich | Bin 0 -> 1918 bytes .../internal/cctz/testdata/zoneinfo/Factory | Bin 0 -> 148 bytes absl/time/internal/cctz/testdata/zoneinfo/GB | Bin 0 -> 3687 bytes .../internal/cctz/testdata/zoneinfo/GB-Eire | Bin 0 -> 3687 bytes absl/time/internal/cctz/testdata/zoneinfo/GMT | Bin 0 -> 127 bytes .../internal/cctz/testdata/zoneinfo/GMT+0 | Bin 0 -> 127 bytes .../internal/cctz/testdata/zoneinfo/GMT-0 | Bin 0 -> 127 bytes .../time/internal/cctz/testdata/zoneinfo/GMT0 | Bin 0 -> 127 bytes .../internal/cctz/testdata/zoneinfo/Greenwich | Bin 0 -> 127 bytes absl/time/internal/cctz/testdata/zoneinfo/HST | Bin 0 -> 128 bytes .../internal/cctz/testdata/zoneinfo/Hongkong | Bin 0 -> 1189 bytes .../internal/cctz/testdata/zoneinfo/Iceland | Bin 0 -> 1188 bytes .../testdata/zoneinfo/Indian/Antananarivo | Bin 0 -> 285 bytes .../cctz/testdata/zoneinfo/Indian/Chagos | Bin 0 -> 225 bytes .../cctz/testdata/zoneinfo/Indian/Christmas | Bin 0 -> 182 bytes .../cctz/testdata/zoneinfo/Indian/Cocos | Bin 0 -> 191 bytes .../cctz/testdata/zoneinfo/Indian/Comoro | Bin 0 -> 285 bytes .../cctz/testdata/zoneinfo/Indian/Kerguelen | Bin 0 -> 187 bytes .../cctz/testdata/zoneinfo/Indian/Mahe | Bin 0 -> 187 bytes .../cctz/testdata/zoneinfo/Indian/Maldives | Bin 0 -> 220 bytes .../cctz/testdata/zoneinfo/Indian/Mauritius | Bin 0 -> 267 bytes .../cctz/testdata/zoneinfo/Indian/Mayotte | Bin 0 -> 285 bytes .../cctz/testdata/zoneinfo/Indian/Reunion | Bin 0 -> 187 bytes .../time/internal/cctz/testdata/zoneinfo/Iran | Bin 0 -> 1718 bytes .../internal/cctz/testdata/zoneinfo/Israel | Bin 0 -> 2265 bytes .../internal/cctz/testdata/zoneinfo/Jamaica | Bin 0 -> 507 bytes .../internal/cctz/testdata/zoneinfo/Japan | Bin 0 -> 318 bytes .../internal/cctz/testdata/zoneinfo/Kwajalein | Bin 0 -> 259 bytes .../internal/cctz/testdata/zoneinfo/Libya | Bin 0 -> 655 bytes absl/time/internal/cctz/testdata/zoneinfo/MET | Bin 0 -> 2102 bytes absl/time/internal/cctz/testdata/zoneinfo/MST | Bin 0 -> 127 bytes .../internal/cctz/testdata/zoneinfo/MST7MDT | Bin 0 -> 2294 bytes .../cctz/testdata/zoneinfo/Mexico/BajaNorte | Bin 0 -> 2356 bytes .../cctz/testdata/zoneinfo/Mexico/BajaSur | Bin 0 -> 1564 bytes .../cctz/testdata/zoneinfo/Mexico/General | Bin 0 -> 1618 bytes absl/time/internal/cctz/testdata/zoneinfo/NZ | Bin 0 -> 2460 bytes .../internal/cctz/testdata/zoneinfo/NZ-CHAT | Bin 0 -> 2087 bytes .../internal/cctz/testdata/zoneinfo/Navajo | Bin 0 -> 2453 bytes absl/time/internal/cctz/testdata/zoneinfo/PRC | Bin 0 -> 414 bytes .../internal/cctz/testdata/zoneinfo/PST8PDT | Bin 0 -> 2294 bytes .../cctz/testdata/zoneinfo/Pacific/Apia | Bin 0 -> 1134 bytes .../cctz/testdata/zoneinfo/Pacific/Auckland | Bin 0 -> 2460 bytes .../testdata/zoneinfo/Pacific/Bougainville | Bin 0 -> 296 bytes .../cctz/testdata/zoneinfo/Pacific/Chatham | Bin 0 -> 2087 bytes .../cctz/testdata/zoneinfo/Pacific/Chuuk | Bin 0 -> 183 bytes .../cctz/testdata/zoneinfo/Pacific/Easter | Bin 0 -> 2242 bytes .../cctz/testdata/zoneinfo/Pacific/Efate | Bin 0 -> 492 bytes .../cctz/testdata/zoneinfo/Pacific/Enderbury | Bin 0 -> 259 bytes .../cctz/testdata/zoneinfo/Pacific/Fakaofo | Bin 0 -> 221 bytes .../cctz/testdata/zoneinfo/Pacific/Fiji | Bin 0 -> 1104 bytes .../cctz/testdata/zoneinfo/Pacific/Funafuti | Bin 0 -> 183 bytes .../cctz/testdata/zoneinfo/Pacific/Galapagos | Bin 0 -> 268 bytes .../cctz/testdata/zoneinfo/Pacific/Gambier | Bin 0 -> 186 bytes .../testdata/zoneinfo/Pacific/Guadalcanal | Bin 0 -> 188 bytes .../cctz/testdata/zoneinfo/Pacific/Guam | Bin 0 -> 225 bytes .../cctz/testdata/zoneinfo/Pacific/Honolulu | Bin 0 -> 276 bytes .../cctz/testdata/zoneinfo/Pacific/Johnston | Bin 0 -> 276 bytes .../cctz/testdata/zoneinfo/Pacific/Kiritimati | Bin 0 -> 263 bytes .../cctz/testdata/zoneinfo/Pacific/Kosrae | Bin 0 -> 251 bytes .../cctz/testdata/zoneinfo/Pacific/Kwajalein | Bin 0 -> 259 bytes .../cctz/testdata/zoneinfo/Pacific/Majuro | Bin 0 -> 221 bytes .../cctz/testdata/zoneinfo/Pacific/Marquesas | Bin 0 -> 195 bytes .../cctz/testdata/zoneinfo/Pacific/Midway | Bin 0 -> 196 bytes .../cctz/testdata/zoneinfo/Pacific/Nauru | Bin 0 -> 282 bytes .../cctz/testdata/zoneinfo/Pacific/Niue | Bin 0 -> 266 bytes .../cctz/testdata/zoneinfo/Pacific/Norfolk | Bin 0 -> 323 bytes .../cctz/testdata/zoneinfo/Pacific/Noumea | Bin 0 -> 328 bytes .../cctz/testdata/zoneinfo/Pacific/Pago_Pago | Bin 0 -> 196 bytes .../cctz/testdata/zoneinfo/Pacific/Palau | Bin 0 -> 182 bytes .../cctz/testdata/zoneinfo/Pacific/Pitcairn | Bin 0 -> 223 bytes .../cctz/testdata/zoneinfo/Pacific/Pohnpei | Bin 0 -> 183 bytes .../cctz/testdata/zoneinfo/Pacific/Ponape | Bin 0 -> 183 bytes .../testdata/zoneinfo/Pacific/Port_Moresby | Bin 0 -> 206 bytes .../cctz/testdata/zoneinfo/Pacific/Rarotonga | Bin 0 -> 602 bytes .../cctz/testdata/zoneinfo/Pacific/Saipan | Bin 0 -> 225 bytes .../cctz/testdata/zoneinfo/Pacific/Samoa | Bin 0 -> 196 bytes .../cctz/testdata/zoneinfo/Pacific/Tahiti | Bin 0 -> 187 bytes .../cctz/testdata/zoneinfo/Pacific/Tarawa | Bin 0 -> 183 bytes .../cctz/testdata/zoneinfo/Pacific/Tongatapu | Bin 0 -> 393 bytes .../cctz/testdata/zoneinfo/Pacific/Truk | Bin 0 -> 183 bytes .../cctz/testdata/zoneinfo/Pacific/Wake | Bin 0 -> 183 bytes .../cctz/testdata/zoneinfo/Pacific/Wallis | Bin 0 -> 183 bytes .../cctz/testdata/zoneinfo/Pacific/Yap | Bin 0 -> 183 bytes .../internal/cctz/testdata/zoneinfo/Poland | Bin 0 -> 2705 bytes .../internal/cctz/testdata/zoneinfo/Portugal | Bin 0 -> 3469 bytes absl/time/internal/cctz/testdata/zoneinfo/ROC | Bin 0 -> 790 bytes absl/time/internal/cctz/testdata/zoneinfo/ROK | Bin 0 -> 531 bytes .../internal/cctz/testdata/zoneinfo/Singapore | Bin 0 -> 424 bytes .../internal/cctz/testdata/zoneinfo/Turkey | Bin 0 -> 2166 bytes absl/time/internal/cctz/testdata/zoneinfo/UCT | Bin 0 -> 127 bytes .../internal/cctz/testdata/zoneinfo/US/Alaska | Bin 0 -> 2380 bytes .../cctz/testdata/zoneinfo/US/Aleutian | Bin 0 -> 2365 bytes .../cctz/testdata/zoneinfo/US/Arizona | Bin 0 -> 353 bytes .../cctz/testdata/zoneinfo/US/Central | Bin 0 -> 3585 bytes .../cctz/testdata/zoneinfo/US/East-Indiana | Bin 0 -> 1675 bytes .../cctz/testdata/zoneinfo/US/Eastern | Bin 0 -> 3545 bytes .../internal/cctz/testdata/zoneinfo/US/Hawaii | Bin 0 -> 276 bytes .../cctz/testdata/zoneinfo/US/Indiana-Starke | Bin 0 -> 2437 bytes .../cctz/testdata/zoneinfo/US/Michigan | Bin 0 -> 2188 bytes .../cctz/testdata/zoneinfo/US/Mountain | Bin 0 -> 2453 bytes .../cctz/testdata/zoneinfo/US/Pacific | Bin 0 -> 2845 bytes .../internal/cctz/testdata/zoneinfo/US/Samoa | Bin 0 -> 196 bytes absl/time/internal/cctz/testdata/zoneinfo/UTC | Bin 0 -> 127 bytes .../internal/cctz/testdata/zoneinfo/Universal | Bin 0 -> 127 bytes .../time/internal/cctz/testdata/zoneinfo/W-SU | Bin 0 -> 1544 bytes absl/time/internal/cctz/testdata/zoneinfo/WET | Bin 0 -> 1873 bytes .../time/internal/cctz/testdata/zoneinfo/Zulu | Bin 0 -> 127 bytes .../cctz/testdata/zoneinfo/iso3166.tab | 274 ++++ .../internal/cctz/testdata/zoneinfo/localtime | Bin 0 -> 148 bytes .../cctz/testdata/zoneinfo/zone1970.tab | 382 +++++ absl/time/internal/test_util.cc | 8 +- absl/time/time.cc | 6 +- absl/time/time.h | 20 +- absl/time/time_zone_test.cc | 4 +- absl/types/optional.h | 12 +- absl/types/optional_test.cc | 47 +- 638 files changed, 9262 insertions(+), 58 deletions(-) create mode 100644 absl/time/internal/cctz/BUILD.bazel create mode 100644 absl/time/internal/cctz/include/cctz/civil_time.h create mode 100644 absl/time/internal/cctz/include/cctz/civil_time_detail.h create mode 100644 absl/time/internal/cctz/include/cctz/time_zone.h create mode 100644 absl/time/internal/cctz/include/cctz/zone_info_source.h create mode 100644 absl/time/internal/cctz/src/civil_time_detail.cc create mode 100644 absl/time/internal/cctz/src/civil_time_test.cc create mode 100644 absl/time/internal/cctz/src/time_zone_fixed.cc create mode 100644 absl/time/internal/cctz/src/time_zone_fixed.h create mode 100644 absl/time/internal/cctz/src/time_zone_format.cc create mode 100644 absl/time/internal/cctz/src/time_zone_format_test.cc create mode 100644 absl/time/internal/cctz/src/time_zone_if.cc create mode 100644 absl/time/internal/cctz/src/time_zone_if.h create mode 100644 absl/time/internal/cctz/src/time_zone_impl.cc create mode 100644 absl/time/internal/cctz/src/time_zone_impl.h create mode 100644 absl/time/internal/cctz/src/time_zone_info.cc create mode 100644 absl/time/internal/cctz/src/time_zone_info.h create mode 100644 absl/time/internal/cctz/src/time_zone_libc.cc create mode 100644 absl/time/internal/cctz/src/time_zone_libc.h create mode 100644 absl/time/internal/cctz/src/time_zone_lookup.cc create mode 100644 absl/time/internal/cctz/src/time_zone_lookup_test.cc create mode 100644 absl/time/internal/cctz/src/time_zone_posix.cc create mode 100644 absl/time/internal/cctz/src/time_zone_posix.h create mode 100644 absl/time/internal/cctz/src/tzfile.h create mode 100644 absl/time/internal/cctz/src/zone_info_source.cc create mode 100644 absl/time/internal/cctz/testdata/README.zoneinfo create mode 100644 absl/time/internal/cctz/testdata/version create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Abidjan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Accra create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Addis_Ababa create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Algiers create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Asmara create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Asmera create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Bamako create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Bangui create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Banjul create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Bissau create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Blantyre create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Brazzaville create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Bujumbura create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Cairo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Casablanca create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Ceuta create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Conakry create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Dakar create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Dar_es_Salaam create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Djibouti create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Douala create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/El_Aaiun create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Freetown create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Gaborone create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Harare create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Johannesburg create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Juba create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Kampala create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Khartoum create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Kigali create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Kinshasa create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Lagos create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Libreville create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Lome create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Luanda create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Lubumbashi create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Lusaka create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Malabo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Maputo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Maseru create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Mbabane create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Mogadishu create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Monrovia create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Nairobi create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Ndjamena create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Niamey create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Nouakchott create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Ouagadougou create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Porto-Novo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Sao_Tome create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Timbuktu create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Tripoli create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Tunis create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Windhoek create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Adak create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Anchorage create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Anguilla create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Antigua create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Araguaina create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Buenos_Aires create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Catamarca create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/ComodRivadavia create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Cordoba create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Jujuy create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/La_Rioja create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Mendoza create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Rio_Gallegos create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Salta create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/San_Juan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/San_Luis create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Tucuman create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Ushuaia create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Aruba create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Asuncion create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Atikokan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Atka create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Bahia create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Bahia_Banderas create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Barbados create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Belem create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Belize create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Blanc-Sablon create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Boa_Vista create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Bogota create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Boise create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Buenos_Aires create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Cambridge_Bay create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Campo_Grande create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Cancun create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Caracas create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Catamarca create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Cayenne create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Cayman create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Chicago create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Chihuahua create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Coral_Harbour create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Cordoba create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Costa_Rica create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Creston create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Cuiaba create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Curacao create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Danmarkshavn create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Dawson create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Dawson_Creek create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Denver create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Detroit create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Dominica create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Edmonton create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Eirunepe create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/El_Salvador create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Ensenada create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Fort_Nelson create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Fort_Wayne create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Fortaleza create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Glace_Bay create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Godthab create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Goose_Bay create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Grand_Turk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Grenada create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Guadeloupe create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Guatemala create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Guayaquil create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Guyana create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Halifax create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Havana create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Hermosillo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Indianapolis create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Knox create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Marengo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Petersburg create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Tell_City create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Vevay create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Vincennes create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Winamac create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Indianapolis create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Inuvik create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Iqaluit create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Jamaica create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Jujuy create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Juneau create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Kentucky/Louisville create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Kentucky/Monticello create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Knox_IN create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Kralendijk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/La_Paz create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Lima create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Los_Angeles create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Louisville create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Lower_Princes create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Maceio create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Managua create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Manaus create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Marigot create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Martinique create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Matamoros create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Mazatlan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Mendoza create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Menominee create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Merida create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Metlakatla create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Mexico_City create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Miquelon create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Moncton create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Monterrey create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Montevideo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Montreal create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Montserrat create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Nassau create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/New_York create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Nipigon create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Nome create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Noronha create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/North_Dakota/Beulah create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/North_Dakota/Center create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/North_Dakota/New_Salem create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Ojinaga create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Panama create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Pangnirtung create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Paramaribo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Phoenix create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Port-au-Prince create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Port_of_Spain create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Porto_Acre create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Porto_Velho create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Puerto_Rico create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Punta_Arenas create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Rainy_River create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Rankin_Inlet create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Recife create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Regina create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Resolute create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Rio_Branco create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Rosario create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Santa_Isabel create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Santarem create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Santiago create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Santo_Domingo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Sao_Paulo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Scoresbysund create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Shiprock create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Sitka create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/St_Barthelemy create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/St_Johns create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/St_Kitts create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/St_Lucia create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/St_Thomas create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/St_Vincent create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Swift_Current create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Tegucigalpa create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Thule create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Thunder_Bay create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Tijuana create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Toronto create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Tortola create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Vancouver create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Virgin create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Whitehorse create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Winnipeg create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Yakutat create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Yellowknife create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Casey create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Davis create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/DumontDUrville create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Macquarie create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Mawson create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/McMurdo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Palmer create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Rothera create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/South_Pole create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Syowa create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Troll create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Vostok create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Arctic/Longyearbyen create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Aden create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Almaty create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Amman create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Anadyr create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Aqtau create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Aqtobe create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Ashgabat create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Ashkhabad create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Atyrau create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Baghdad create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Bahrain create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Baku create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Bangkok create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Barnaul create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Beirut create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Bishkek create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Brunei create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Calcutta create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Chita create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Choibalsan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Chongqing create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Chungking create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Colombo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Dacca create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Damascus create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Dhaka create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Dili create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Dubai create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Dushanbe create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Famagusta create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Gaza create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Harbin create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Hebron create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Ho_Chi_Minh create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Hong_Kong create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Hovd create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Irkutsk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Istanbul create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Jakarta create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Jayapura create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Jerusalem create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Kabul create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Kamchatka create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Karachi create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Kashgar create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Kathmandu create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Katmandu create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Khandyga create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Kolkata create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Krasnoyarsk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Kuala_Lumpur create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Kuching create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Kuwait create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Macao create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Macau create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Magadan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Makassar create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Manila create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Muscat create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Nicosia create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Novokuznetsk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Novosibirsk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Omsk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Oral create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Phnom_Penh create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Pontianak create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Pyongyang create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Qatar create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Qyzylorda create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Rangoon create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Riyadh create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Saigon create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Sakhalin create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Samarkand create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Seoul create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Shanghai create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Singapore create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Srednekolymsk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Taipei create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Tashkent create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Tbilisi create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Tehran create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Tel_Aviv create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Thimbu create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Thimphu create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Tokyo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Tomsk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Ujung_Pandang create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Ulaanbaatar create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Ulan_Bator create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Urumqi create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Ust-Nera create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Vientiane create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Vladivostok create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Yakutsk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Yangon create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Yekaterinburg create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Yerevan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Azores create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Bermuda create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Canary create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Cape_Verde create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Faeroe create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Faroe create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Jan_Mayen create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Madeira create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Reykjavik create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/South_Georgia create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/St_Helena create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Stanley create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/ACT create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Adelaide create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Brisbane create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Broken_Hill create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Canberra create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Currie create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Darwin create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Eucla create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Hobart create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/LHI create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Lindeman create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Lord_Howe create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Melbourne create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/NSW create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/North create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Perth create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Queensland create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/South create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Sydney create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Tasmania create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Victoria create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/West create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Yancowinna create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Brazil/Acre create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Brazil/DeNoronha create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Brazil/East create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Brazil/West create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/CET create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/CST6CDT create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Canada/Atlantic create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Canada/Central create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Canada/Eastern create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Canada/Mountain create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Canada/Newfoundland create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Canada/Pacific create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Canada/Saskatchewan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Canada/Yukon create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Chile/Continental create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Chile/EasterIsland create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Cuba create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/EET create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/EST create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/EST5EDT create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Egypt create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Eire create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+0 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+1 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+10 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+11 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+12 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+2 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+3 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+4 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+5 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+6 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+7 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+8 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+9 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-0 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-1 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-10 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-11 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-12 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-13 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-14 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-2 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-3 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-4 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-5 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-6 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-7 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-8 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-9 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT0 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/Greenwich create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/UCT create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/UTC create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/Universal create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/Zulu create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Amsterdam create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Andorra create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Astrakhan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Athens create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Belfast create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Belgrade create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Berlin create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Bratislava create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Brussels create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Bucharest create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Budapest create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Busingen create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Chisinau create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Copenhagen create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Dublin create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Gibraltar create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Guernsey create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Helsinki create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Isle_of_Man create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Istanbul create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Jersey create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Kaliningrad create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Kiev create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Kirov create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Lisbon create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Ljubljana create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/London create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Luxembourg create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Madrid create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Malta create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Mariehamn create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Minsk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Monaco create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Moscow create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Nicosia create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Oslo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Paris create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Podgorica create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Prague create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Riga create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Rome create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Samara create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/San_Marino create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Sarajevo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Saratov create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Simferopol create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Skopje create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Sofia create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Stockholm create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Tallinn create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Tirane create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Tiraspol create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Ulyanovsk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Uzhgorod create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Vaduz create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Vatican create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Vienna create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Vilnius create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Volgograd create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Warsaw create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Zagreb create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Zaporozhye create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Zurich create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Factory create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/GB create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/GB-Eire create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/GMT create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/GMT+0 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/GMT-0 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/GMT0 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Greenwich create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/HST create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Hongkong create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Iceland create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Antananarivo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Chagos create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Christmas create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Cocos create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Comoro create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Kerguelen create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Mahe create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Maldives create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Mauritius create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Mayotte create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Reunion create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Iran create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Israel create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Jamaica create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Japan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Kwajalein create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Libya create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/MET create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/MST create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/MST7MDT create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaNorte create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaSur create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Mexico/General create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/NZ create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/NZ-CHAT create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Navajo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/PRC create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/PST8PDT create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Apia create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Auckland create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Bougainville create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Chatham create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Chuuk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Easter create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Efate create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Enderbury create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Fakaofo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Fiji create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Funafuti create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Galapagos create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Gambier create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Guadalcanal create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Guam create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Honolulu create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Johnston create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kiritimati create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kosrae create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kwajalein create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Majuro create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Marquesas create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Midway create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Nauru create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Niue create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Norfolk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Noumea create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Pago_Pago create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Palau create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Pitcairn create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Pohnpei create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Ponape create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Port_Moresby create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Rarotonga create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Saipan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Samoa create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Tahiti create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Tarawa create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Tongatapu create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Truk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Wake create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Wallis create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Yap create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Poland create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Portugal create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/ROC create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/ROK create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Singapore create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Turkey create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/UCT create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Alaska create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Aleutian create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Arizona create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Central create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/East-Indiana create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Eastern create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Hawaii create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Indiana-Starke create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Michigan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Mountain create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Pacific create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Samoa create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/UTC create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Universal create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/W-SU create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/WET create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Zulu create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/iso3166.tab create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/localtime create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab diff --git a/CMake/AbseilHelpers.cmake b/CMake/AbseilHelpers.cmake index b114b297c..0520fba3f 100644 --- a/CMake/AbseilHelpers.cmake +++ b/CMake/AbseilHelpers.cmake @@ -34,7 +34,7 @@ function(absl_library) cmake_parse_arguments(ABSL_LIB "DISABLE_INSTALL" # keep that in case we want to support installation one day "TARGET;EXPORT_NAME" - "SOURCES;PUBLIC_LIBRARIES;PRIVATE_COMPILE_FLAGS;PUBLIC_INCLUDE_DIRS;PRIVATE_INCLUDE_DIRS" + "SOURCES;PUBLIC_LIBRARIES;PRIVATE_COMPILE_FLAGS" ${ARGN} ) diff --git a/CMake/README.md b/CMake/README.md index bfcf5807a..e99340cc6 100644 --- a/CMake/README.md +++ b/CMake/README.md @@ -19,10 +19,8 @@ googletest framework ### Step-by-Step Instructions -1. If you haven't done so already, integrate the Abseil dependency -[CCTZ](https://github.com/google/cctz) into your CMake project. Consequently, the -target 'cctz' needs to be declared in your CMake project **before** including Abseil.
-Note: If you want to build the Abseil tests, you'll also need [Google Test](https://github.com/google/googletest). To disable Abseil tests, you have to pass +1. If you want to build the Abseil tests, integrate the Abseil dependency +[Google Test](https://github.com/google/googletest) into your CMake project. To disable Abseil tests, you have to pass `-DBUILD_TESTING=OFF` when configuring your project with CMake. 2. Download Abseil and copy it into a subdirectory in your CMake project or add @@ -31,8 +29,7 @@ CMake project. 3. You can then use the CMake command [`add_subdirectory()`](https://cmake.org/cmake/help/latest/command/add_subdirectory.html) -to include Abseil directly in your CMake project. In addition, it's possible to -customize the name of the `cctz` target with the `-DABSL_CCTZ_TARGET=*my_cctz*` option. +to include Abseil directly in your CMake project. 4. Add the **absl::** target you wish to use to the [`target_link_libraries()`](https://cmake.org/cmake/help/latest/command/target_link_libraries.html) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6e715afc6..e46bdf455 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -65,15 +65,9 @@ set(ABSL_EXCEPTIONS_FLAG "${CMAKE_CXX_EXCEPTIONS}") ## pthread find_package(Threads REQUIRED) -if(NOT ABSL_CCTZ_TARGET) - set(ABSL_CCTZ_TARGET cctz) -endif() - # commented: used only for standalone test # Don't remove these or else CMake CI will break -#add_subdirectory(cctz) #add_subdirectory(googletest) -check_target(${ABSL_CCTZ_TARGET}) ## check targets if(BUILD_TESTING) diff --git a/WORKSPACE b/WORKSPACE index cac4047fc..0546573f3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -17,13 +17,6 @@ http_archive( strip_prefix = "googletest-master", ) -# CCTZ (Time-zone framework). -http_archive( - name = "com_googlesource_code_cctz", - urls = ["https://github.com/google/cctz/archive/master.zip"], - strip_prefix = "cctz-master", -) - # RE2 regular-expression framework. Used by some unit-tests. http_archive( name = "com_googlesource_code_re2", diff --git a/absl/base/config.h b/absl/base/config.h index de33120f2..2f5f15951 100644 --- a/absl/base/config.h +++ b/absl/base/config.h @@ -384,7 +384,7 @@ // ABSL_HAVE_STD_VARIANT // -// Checks whether C++17 std::optional is available. +// Checks whether C++17 std::variant is available. #ifdef ABSL_HAVE_STD_VARIANT #error "ABSL_HAVE_STD_VARIANT cannot be directly set." #endif diff --git a/absl/strings/str_cat_test.cc b/absl/strings/str_cat_test.cc index 58ab743ac..c86a5952f 100644 --- a/absl/strings/str_cat_test.cc +++ b/absl/strings/str_cat_test.cc @@ -206,6 +206,8 @@ struct Mallocator { typedef Mallocator other; }; Mallocator() = default; + template + Mallocator(const Mallocator&) {} // NOLINT(runtime/explicit) T* allocate(size_t n) { return static_cast(std::malloc(n * sizeof(T))); } void deallocate(T* p, size_t) { std::free(p); } diff --git a/absl/strings/string_view_test.cc b/absl/strings/string_view_test.cc index a26f6c3ae..bb149d5c2 100644 --- a/absl/strings/string_view_test.cc +++ b/absl/strings/string_view_test.cc @@ -50,6 +50,8 @@ struct Mallocator { typedef Mallocator other; }; Mallocator() = default; + template + Mallocator(const Mallocator&) {} // NOLINT(runtime/explicit) T* allocate(size_t n) { return static_cast(std::malloc(n * sizeof(T))); } void deallocate(T* p, size_t) { std::free(p); } diff --git a/absl/time/BUILD.bazel b/absl/time/BUILD.bazel index 3d1d2df56..d4f653f40 100644 --- a/absl/time/BUILD.bazel +++ b/absl/time/BUILD.bazel @@ -44,8 +44,8 @@ cc_library( "//absl/base", "//absl/base:core_headers", "//absl/numeric:int128", - "@com_googlesource_code_cctz//:civil_time", - "@com_googlesource_code_cctz//:time_zone", + "//absl/time/internal/cctz:civil_time", + "//absl/time/internal/cctz:time_zone", ], ) @@ -63,7 +63,7 @@ cc_library( deps = [ ":time", "//absl/base", - "@com_googlesource_code_cctz//:time_zone", + "//absl/time/internal/cctz:time_zone", ], ) @@ -91,7 +91,7 @@ cc_test( "//absl/base", "//absl/base:config", "//absl/base:core_headers", + "//absl/time/internal/cctz:time_zone", "@com_google_googletest//:gtest_main", - "@com_googlesource_code_cctz//:time_zone", ], ) diff --git a/absl/time/CMakeLists.txt b/absl/time/CMakeLists.txt index a35617895..72bb4d25b 100644 --- a/absl/time/CMakeLists.txt +++ b/absl/time/CMakeLists.txt @@ -22,6 +22,10 @@ list(APPEND TIME_PUBLIC_HEADERS list(APPEND TIME_INTERNAL_HEADERS "internal/test_util.h" + "internal/cctz/include/cctz/civil_time.h" + "internal/cctz/include/cctz/civil_time_detail.h" + "internal/cctz/include/cctz/time_zone.h" + "internal/cctz/include/cctz/zone_info_source.h" ) list(APPEND TIME_SRC @@ -29,10 +33,27 @@ list(APPEND TIME_SRC "clock.cc" "duration.cc" "format.cc" + "internal/cctz/src/civil_time_detail.cc" + "internal/cctz/src/time_zone_fixed.cc" + "internal/cctz/src/time_zone_fixed.h" + "internal/cctz/src/time_zone_format.cc" + "internal/cctz/src/time_zone_if.cc" + "internal/cctz/src/time_zone_if.h" + "internal/cctz/src/time_zone_impl.cc" + "internal/cctz/src/time_zone_impl.h" + "internal/cctz/src/time_zone_info.cc" + "internal/cctz/src/time_zone_info.h" + "internal/cctz/src/time_zone_libc.cc" + "internal/cctz/src/time_zone_libc.h" + "internal/cctz/src/time_zone_lookup.cc" + "internal/cctz/src/time_zone_posix.cc" + "internal/cctz/src/time_zone_posix.h" + "internal/cctz/src/tzfile.h" + "internal/cctz/src/zone_info_source.cc" ${TIME_PUBLIC_HEADERS} ${TIME_INTERNAL_HEADERS} ) -set(TIME_PUBLIC_LIBRARIES absl::base absl::stacktrace absl::int128 ${ABSL_CCTZ_TARGET}) +set(TIME_PUBLIC_LIBRARIES absl::base absl::stacktrace absl::int128) absl_library( TARGET @@ -41,8 +62,6 @@ absl_library( ${TIME_SRC} PUBLIC_LIBRARIES ${TIME_PUBLIC_LIBRARIES} - PUBLIC_INCLUDE_DIRS - ${CCTZ_INCLUDE_DIRS} EXPORT_NAME time ) diff --git a/absl/time/format.cc b/absl/time/format.cc index 7c88db5b0..5dc01bda1 100644 --- a/absl/time/format.cc +++ b/absl/time/format.cc @@ -16,8 +16,10 @@ #include #include +#include "absl/time/internal/cctz/include/cctz/time_zone.h" #include "absl/time/time.h" -#include "cctz/time_zone.h" + +namespace cctz = absl::time_internal::cctz; namespace absl { diff --git a/absl/time/internal/cctz/BUILD.bazel b/absl/time/internal/cctz/BUILD.bazel new file mode 100644 index 000000000..fe17b3e31 --- /dev/null +++ b/absl/time/internal/cctz/BUILD.bazel @@ -0,0 +1,105 @@ +# Copyright 2016 Google Inc. 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. + +licenses(["notice"]) # Apache License + +### libraries + +cc_library( + name = "includes", + textual_hdrs = [ + "include/cctz/civil_time.h", + "include/cctz/civil_time_detail.h", + "include/cctz/time_zone.h", + ], + visibility = ["//absl/time:__pkg__"], +) + +cc_library( + name = "civil_time", + srcs = ["src/civil_time_detail.cc"], + hdrs = [ + "include/cctz/civil_time.h", + ], + textual_hdrs = ["include/cctz/civil_time_detail.h"], + visibility = ["//visibility:public"], +) + +cc_library( + name = "time_zone", + srcs = [ + "src/time_zone_fixed.cc", + "src/time_zone_fixed.h", + "src/time_zone_format.cc", + "src/time_zone_if.cc", + "src/time_zone_if.h", + "src/time_zone_impl.cc", + "src/time_zone_impl.h", + "src/time_zone_info.cc", + "src/time_zone_info.h", + "src/time_zone_libc.cc", + "src/time_zone_libc.h", + "src/time_zone_lookup.cc", + "src/time_zone_posix.cc", + "src/time_zone_posix.h", + "src/tzfile.h", + "src/zone_info_source.cc", + ], + hdrs = [ + "include/cctz/time_zone.h", + "include/cctz/zone_info_source.h", + ], + visibility = ["//visibility:public"], + deps = [":civil_time"], +) + +### tests + +cc_test( + name = "civil_time_test", + size = "small", + srcs = ["src/civil_time_test.cc"], + deps = [ + ":civil_time", + "@com_google_googletest//:gtest_main", + ], +) + +cc_test( + name = "time_zone_format_test", + size = "small", + srcs = ["src/time_zone_format_test.cc"], + deps = [ + ":civil_time", + ":time_zone", + "@com_google_googletest//:gtest_main", + ], +) + +cc_test( + name = "time_zone_lookup_test", + size = "small", + srcs = ["src/time_zone_lookup_test.cc"], + deps = [ + ":civil_time", + ":time_zone", + "@com_google_googletest//:gtest_main", + ], +) + +### benchmarks + +### examples + +### binaries diff --git a/absl/time/internal/cctz/include/cctz/civil_time.h b/absl/time/internal/cctz/include/cctz/civil_time.h new file mode 100644 index 000000000..898222b4c --- /dev/null +++ b/absl/time/internal/cctz/include/cctz/civil_time.h @@ -0,0 +1,329 @@ +// Copyright 2016 Google Inc. 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. + +#ifndef ABSL_TIME_INTERNAL_CCTZ_CIVIL_TIME_H_ +#define ABSL_TIME_INTERNAL_CCTZ_CIVIL_TIME_H_ + +#include "absl/time/internal/cctz/include/cctz/civil_time_detail.h" + +namespace absl { +namespace time_internal { +namespace cctz { + +// The term "civil time" refers to the legally recognized human-scale time +// that is represented by the six fields YYYY-MM-DD hh:mm:ss. Modern-day civil +// time follows the Gregorian Calendar and is a time-zone-independent concept. +// A "date" is perhaps the most common example of a civil time (represented in +// this library as cctz::civil_day). This library provides six classes and a +// handful of functions that help with rounding, iterating, and arithmetic on +// civil times while avoiding complications like daylight-saving time (DST). +// +// The following six classes form the core of this civil-time library: +// +// * civil_second +// * civil_minute +// * civil_hour +// * civil_day +// * civil_month +// * civil_year +// +// Each class is a simple value type with the same interface for construction +// and the same six accessors for each of the civil fields (year, month, day, +// hour, minute, and second, aka YMDHMS). These classes differ only in their +// alignment, which is indicated by the type name and specifies the field on +// which arithmetic operates. +// +// Each class can be constructed by passing up to six optional integer +// arguments representing the YMDHMS fields (in that order) to the +// constructor. Omitted fields are assigned their minimum valid value. Hours, +// minutes, and seconds will be set to 0, month and day will be set to 1, and +// since there is no minimum valid year, it will be set to 1970. So, a +// default-constructed civil-time object will have YMDHMS fields representing +// "1970-01-01 00:00:00". Fields that are out-of-range are normalized (e.g., +// October 32 -> November 1) so that all civil-time objects represent valid +// values. +// +// Each civil-time class is aligned to the civil-time field indicated in the +// class's name after normalization. Alignment is performed by setting all the +// inferior fields to their minimum valid value (as described above). The +// following are examples of how each of the six types would align the fields +// representing November 22, 2015 at 12:34:56 in the afternoon. (Note: the +// std::string format used here is not important; it's just a shorthand way of +// showing the six YMDHMS fields.) +// +// civil_second 2015-11-22 12:34:56 +// civil_minute 2015-11-22 12:34:00 +// civil_hour 2015-11-22 12:00:00 +// civil_day 2015-11-22 00:00:00 +// civil_month 2015-11-01 00:00:00 +// civil_year 2015-01-01 00:00:00 +// +// Each civil-time type performs arithmetic on the field to which it is +// aligned. This means that adding 1 to a civil_day increments the day field +// (normalizing as necessary), and subtracting 7 from a civil_month operates +// on the month field (normalizing as necessary). All arithmetic produces a +// valid civil time. Difference requires two similarly aligned civil-time +// objects and returns the scalar answer in units of the objects' alignment. +// For example, the difference between two civil_hour objects will give an +// answer in units of civil hours. +// +// In addition to the six civil-time types just described, there are +// a handful of helper functions and algorithms for performing common +// calculations. These are described below. +// +// Note: In C++14 and later, this library is usable in a constexpr context. +// +// CONSTRUCTION: +// +// Each of the civil-time types can be constructed in two ways: by directly +// passing to the constructor up to six (optional) integers representing the +// YMDHMS fields, or by copying the YMDHMS fields from a differently aligned +// civil-time type. +// +// civil_day default_value; // 1970-01-01 00:00:00 +// +// civil_day a(2015, 2, 3); // 2015-02-03 00:00:00 +// civil_day b(2015, 2, 3, 4, 5, 6); // 2015-02-03 00:00:00 +// civil_day c(2015); // 2015-01-01 00:00:00 +// +// civil_second ss(2015, 2, 3, 4, 5, 6); // 2015-02-03 04:05:06 +// civil_minute mm(ss); // 2015-02-03 04:05:00 +// civil_hour hh(mm); // 2015-02-03 04:00:00 +// civil_day d(hh); // 2015-02-03 00:00:00 +// civil_month m(d); // 2015-02-01 00:00:00 +// civil_year y(m); // 2015-01-01 00:00:00 +// +// m = civil_month(y); // 2015-01-01 00:00:00 +// d = civil_day(m); // 2015-01-01 00:00:00 +// hh = civil_hour(d); // 2015-01-01 00:00:00 +// mm = civil_minute(hh); // 2015-01-01 00:00:00 +// ss = civil_second(mm); // 2015-01-01 00:00:00 +// +// ALIGNMENT CONVERSION: +// +// The alignment of a civil-time object cannot change, but the object may be +// used to construct a new object with a different alignment. This is referred +// to as "realigning". When realigning to a type with the same or more +// precision (e.g., civil_day -> civil_second), the conversion may be +// performed implicitly since no information is lost. However, if information +// could be discarded (e.g., civil_second -> civil_day), the conversion must +// be explicit at the call site. +// +// void fun(const civil_day& day); +// +// civil_second cs; +// fun(cs); // Won't compile because data may be discarded +// fun(civil_day(cs)); // OK: explicit conversion +// +// civil_day cd; +// fun(cd); // OK: no conversion needed +// +// civil_month cm; +// fun(cm); // OK: implicit conversion to civil_day +// +// NORMALIZATION: +// +// Integer arguments passed to the constructor may be out-of-range, in which +// case they are normalized to produce a valid civil-time object. This enables +// natural arithmetic on constructor arguments without worrying about the +// field's range. Normalization guarantees that there are no invalid +// civil-time objects. +// +// civil_day d(2016, 10, 32); // Out-of-range day; normalized to 2016-11-01 +// +// Note: If normalization is undesired, you can signal an error by comparing +// the constructor arguments to the normalized values returned by the YMDHMS +// properties. +// +// PROPERTIES: +// +// All civil-time types have accessors for all six of the civil-time fields: +// year, month, day, hour, minute, and second. Recall that fields inferior to +// the type's aligment will be set to their minimum valid value. +// +// civil_day d(2015, 6, 28); +// // d.year() == 2015 +// // d.month() == 6 +// // d.day() == 28 +// // d.hour() == 0 +// // d.minute() == 0 +// // d.second() == 0 +// +// COMPARISON: +// +// Comparison always considers all six YMDHMS fields, regardless of the type's +// alignment. Comparison between differently aligned civil-time types is +// allowed. +// +// civil_day feb_3(2015, 2, 3); // 2015-02-03 00:00:00 +// civil_day mar_4(2015, 3, 4); // 2015-03-04 00:00:00 +// // feb_3 < mar_4 +// // civil_year(feb_3) == civil_year(mar_4) +// +// civil_second feb_3_noon(2015, 2, 3, 12, 0, 0); // 2015-02-03 12:00:00 +// // feb_3 < feb_3_noon +// // feb_3 == civil_day(feb_3_noon) +// +// // Iterates all the days of February 2015. +// for (civil_day d(2015, 2, 1); d < civil_month(2015, 3); ++d) { +// // ... +// } +// +// STREAMING: +// +// Each civil-time type may be sent to an output stream using operator<<(). +// The output format follows the pattern "YYYY-MM-DDThh:mm:ss" where fields +// inferior to the type's alignment are omitted. +// +// civil_second cs(2015, 2, 3, 4, 5, 6); +// std::cout << cs << "\n"; // Outputs: 2015-02-03T04:05:06 +// +// civil_day cd(cs); +// std::cout << cd << "\n"; // Outputs: 2015-02-03 +// +// civil_year cy(cs); +// std::cout << cy << "\n"; // Outputs: 2015 +// +// ARITHMETIC: +// +// Civil-time types support natural arithmetic operators such as addition, +// subtraction, and difference. Arithmetic operates on the civil-time field +// indicated in the type's name. Difference requires arguments with the same +// alignment and returns the answer in units of the alignment. +// +// civil_day a(2015, 2, 3); +// ++a; // 2015-02-04 00:00:00 +// --a; // 2015-02-03 00:00:00 +// civil_day b = a + 1; // 2015-02-04 00:00:00 +// civil_day c = 1 + b; // 2015-02-05 00:00:00 +// int n = c - a; // n = 2 (civil days) +// int m = c - civil_month(c); // Won't compile: different types. +// +// EXAMPLE: Adding a month to January 31. +// +// One of the classic questions that arises when considering a civil-time +// library (or a date library or a date/time library) is this: "What happens +// when you add a month to January 31?" This is an interesting question +// because there could be a number of possible answers: +// +// 1. March 3 (or 2 if a leap year). This may make sense if the operation +// wants the equivalent of February 31. +// 2. February 28 (or 29 if a leap year). This may make sense if the operation +// wants the last day of January to go to the last day of February. +// 3. Error. The caller may get some error, an exception, an invalid date +// object, or maybe false is returned. This may make sense because there is +// no single unambiguously correct answer to the question. +// +// Practically speaking, any answer that is not what the programmer intended +// is the wrong answer. +// +// This civil-time library avoids the problem by making it impossible to ask +// ambiguous questions. All civil-time objects are aligned to a particular +// civil-field boundary (such as aligned to a year, month, day, hour, minute, +// or second), and arithmetic operates on the field to which the object is +// aligned. This means that in order to "add a month" the object must first be +// aligned to a month boundary, which is equivalent to the first day of that +// month. +// +// Of course, there are ways to compute an answer the question at hand using +// this civil-time library, but they require the programmer to be explicit +// about the answer they expect. To illustrate, let's see how to compute all +// three of the above possible answers to the question of "Jan 31 plus 1 +// month": +// +// const civil_day d(2015, 1, 31); +// +// // Answer 1: +// // Add 1 to the month field in the constructor, and rely on normalization. +// const auto ans_normalized = civil_day(d.year(), d.month() + 1, d.day()); +// // ans_normalized == 2015-03-03 (aka Feb 31) +// +// // Answer 2: +// // Add 1 to month field, capping to the end of next month. +// const auto next_month = civil_month(d) + 1; +// const auto last_day_of_next_month = civil_day(next_month + 1) - 1; +// const auto ans_capped = std::min(ans_normalized, last_day_of_next_month); +// // ans_capped == 2015-02-28 +// +// // Answer 3: +// // Signal an error if the normalized answer is not in next month. +// if (civil_month(ans_normalized) != next_month) { +// // error, month overflow +// } +// +using civil_year = detail::civil_year; +using civil_month = detail::civil_month; +using civil_day = detail::civil_day; +using civil_hour = detail::civil_hour; +using civil_minute = detail::civil_minute; +using civil_second = detail::civil_second; + +// An enum class with members monday, tuesday, wednesday, thursday, friday, +// saturday, and sunday. These enum values may be sent to an output stream +// using operator<<(). The result is the full weekday name in English with a +// leading capital letter. +// +// weekday wd = weekday::thursday; +// std::cout << wd << "\n"; // Outputs: Thursday +// +using detail::weekday; + +// Returns the weekday for the given civil_day. +// +// civil_day a(2015, 8, 13); +// weekday wd = get_weekday(a); // wd == weekday::thursday +// +using detail::get_weekday; + +// Returns the civil_day that strictly follows or precedes the given +// civil_day, and that falls on the given weekday. +// +// For example, given: +// +// August 2015 +// Su Mo Tu We Th Fr Sa +// 1 +// 2 3 4 5 6 7 8 +// 9 10 11 12 13 14 15 +// 16 17 18 19 20 21 22 +// 23 24 25 26 27 28 29 +// 30 31 +// +// civil_day a(2015, 8, 13); // get_weekday(a) == weekday::thursday +// civil_day b = next_weekday(a, weekday::thursday); // b = 2015-08-20 +// civil_day c = prev_weekday(a, weekday::thursday); // c = 2015-08-06 +// +// civil_day d = ... +// // Gets the following Thursday if d is not already Thursday +// civil_day thurs1 = prev_weekday(d, weekday::thursday) + 7; +// // Gets the previous Thursday if d is not already Thursday +// civil_day thurs2 = next_weekday(d, weekday::thursday) - 7; +// +using detail::next_weekday; +using detail::prev_weekday; + +// Returns the day-of-year for the given civil_day. +// +// civil_day a(2015, 1, 1); +// int yd_jan_1 = get_yearday(a); // yd_jan_1 = 1 +// civil_day b(2015, 12, 31); +// int yd_dec_31 = get_yearday(b); // yd_dec_31 = 365 +// +using detail::get_yearday; + +} // namespace cctz +} // namespace time_internal +} // namespace absl + +#endif // ABSL_TIME_INTERNAL_CCTZ_CIVIL_TIME_H_ diff --git a/absl/time/internal/cctz/include/cctz/civil_time_detail.h b/absl/time/internal/cctz/include/cctz/civil_time_detail.h new file mode 100644 index 000000000..4c39c7d12 --- /dev/null +++ b/absl/time/internal/cctz/include/cctz/civil_time_detail.h @@ -0,0 +1,564 @@ +// Copyright 2016 Google Inc. 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. + +#ifndef ABSL_TIME_INTERNAL_CCTZ_CIVIL_TIME_DETAIL_H_ +#define ABSL_TIME_INTERNAL_CCTZ_CIVIL_TIME_DETAIL_H_ + +#include +#include +#include +#include + +// Disable constexpr support unless we are using clang in C++14 mode. +#if __clang__ && __cpp_constexpr >= 201304 +#define CONSTEXPR_D constexpr // data +#define CONSTEXPR_F constexpr // function +#define CONSTEXPR_M constexpr // member +#else +#define CONSTEXPR_D const +#define CONSTEXPR_F inline +#define CONSTEXPR_M +#endif + +namespace absl { +namespace time_internal { +namespace cctz { + +// Support years that at least span the range of 64-bit time_t values. +using year_t = std::int_fast64_t; + +// Type alias that indicates an argument is not normalized (e.g., the +// constructor parameters and operands/results of addition/subtraction). +using diff_t = std::int_fast64_t; + +namespace detail { + +// Type aliases that indicate normalized argument values. +using month_t = std::int_fast8_t; // [1:12] +using day_t = std::int_fast8_t; // [1:31] +using hour_t = std::int_fast8_t; // [0:23] +using minute_t = std::int_fast8_t; // [0:59] +using second_t = std::int_fast8_t; // [0:59] + +// Normalized civil-time fields: Y-M-D HH:MM:SS. +struct fields { + CONSTEXPR_M fields(year_t year, month_t month, day_t day, + hour_t hour, minute_t minute, second_t second) + : y(year), m(month), d(day), hh(hour), mm(minute), ss(second) {} + std::int_least64_t y; + std::int_least8_t m; + std::int_least8_t d; + std::int_least8_t hh; + std::int_least8_t mm; + std::int_least8_t ss; +}; + +struct second_tag {}; +struct minute_tag : second_tag {}; +struct hour_tag : minute_tag {}; +struct day_tag : hour_tag {}; +struct month_tag : day_tag {}; +struct year_tag : month_tag {}; + +//////////////////////////////////////////////////////////////////////// + +// Field normalization (without avoidable overflow). + +namespace impl { + +CONSTEXPR_F bool is_leap_year(year_t y) noexcept { + return y % 4 == 0 && (y % 100 != 0 || y % 400 == 0); +} +CONSTEXPR_F int year_index(year_t y, month_t m) noexcept { + return (static_cast((y + (m > 2)) % 400) + 400) % 400; +} +CONSTEXPR_F int days_per_century(year_t y, month_t m) noexcept { + const int yi = year_index(y, m); + return 36524 + (yi == 0 || yi > 300); +} +CONSTEXPR_F int days_per_4years(year_t y, month_t m) noexcept { + const int yi = year_index(y, m); + return 1460 + (yi == 0 || yi > 300 || (yi - 1) % 100 < 96); +} +CONSTEXPR_F int days_per_year(year_t y, month_t m) noexcept { + return is_leap_year(y + (m > 2)) ? 366 : 365; +} +CONSTEXPR_F int days_per_month(year_t y, month_t m) noexcept { + CONSTEXPR_D int k_days_per_month[1 + 12] = { + -1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 // non leap year + }; + return k_days_per_month[m] + (m == 2 && is_leap_year(y)); +} + +CONSTEXPR_F fields n_day(year_t y, month_t m, diff_t d, diff_t cd, + hour_t hh, minute_t mm, second_t ss) noexcept { + y += (cd / 146097) * 400; + cd %= 146097; + if (cd < 0) { + y -= 400; + cd += 146097; + } + y += (d / 146097) * 400; + d = d % 146097 + cd; + if (d > 0) { + if (d > 146097) { + y += 400; + d -= 146097; + } + } else { + if (d > -365) { + // We often hit the previous year when stepping a civil time backwards, + // so special case it to avoid counting up by 100/4/1-year chunks. + y -= 1; + d += days_per_year(y, m); + } else { + y -= 400; + d += 146097; + } + } + if (d > 365) { + for (int n = days_per_century(y, m); d > n; n = days_per_century(y, m)) { + d -= n; + y += 100; + } + for (int n = days_per_4years(y, m); d > n; n = days_per_4years(y, m)) { + d -= n; + y += 4; + } + for (int n = days_per_year(y, m); d > n; n = days_per_year(y, m)) { + d -= n; + ++y; + } + } + if (d > 28) { + for (int n = days_per_month(y, m); d > n; n = days_per_month(y, m)) { + d -= n; + if (++m > 12) { + ++y; + m = 1; + } + } + } + return fields(y, m, static_cast(d), hh, mm, ss); +} +CONSTEXPR_F fields n_mon(year_t y, diff_t m, diff_t d, diff_t cd, + hour_t hh, minute_t mm, second_t ss) noexcept { + if (m != 12) { + y += m / 12; + m %= 12; + if (m <= 0) { + y -= 1; + m += 12; + } + } + return n_day(y, static_cast(m), d, cd, hh, mm, ss); +} +CONSTEXPR_F fields n_hour(year_t y, diff_t m, diff_t d, diff_t cd, + diff_t hh, minute_t mm, second_t ss) noexcept { + cd += hh / 24; + hh %= 24; + if (hh < 0) { + cd -= 1; + hh += 24; + } + return n_mon(y, m, d, cd, static_cast(hh), mm, ss); +} +CONSTEXPR_F fields n_min(year_t y, diff_t m, diff_t d, diff_t hh, diff_t ch, + diff_t mm, second_t ss) noexcept { + ch += mm / 60; + mm %= 60; + if (mm < 0) { + ch -= 1; + mm += 60; + } + return n_hour(y, m, d, hh / 24 + ch / 24, hh % 24 + ch % 24, + static_cast(mm), ss); +} +CONSTEXPR_F fields n_sec(year_t y, diff_t m, diff_t d, diff_t hh, diff_t mm, + diff_t ss) noexcept { + // Optimization for when (non-constexpr) fields are already normalized. + if (0 <= ss && ss < 60) { + const second_t nss = static_cast(ss); + if (0 <= mm && mm < 60) { + const minute_t nmm = static_cast(mm); + if (0 <= hh && hh < 24) { + const hour_t nhh = static_cast(hh); + if (1 <= d && d <= 28 && 1 <= m && m <= 12) { + const day_t nd = static_cast(d); + const month_t nm = static_cast(m); + return fields(y, nm, nd, nhh, nmm, nss); + } + return n_mon(y, m, d, 0, nhh, nmm, nss); + } + return n_hour(y, m, d, hh / 24, hh % 24, nmm, nss); + } + return n_min(y, m, d, hh, mm / 60, mm % 60, nss); + } + diff_t cm = ss / 60; + ss %= 60; + if (ss < 0) { + cm -= 1; + ss += 60; + } + return n_min(y, m, d, hh, mm / 60 + cm / 60, mm % 60 + cm % 60, + static_cast(ss)); +} + +} // namespace impl + +//////////////////////////////////////////////////////////////////////// + +// Increments the indicated (normalized) field by "n". +CONSTEXPR_F fields step(second_tag, fields f, diff_t n) noexcept { + return impl::n_sec(f.y, f.m, f.d, f.hh, f.mm + n / 60, f.ss + n % 60); +} +CONSTEXPR_F fields step(minute_tag, fields f, diff_t n) noexcept { + return impl::n_min(f.y, f.m, f.d, f.hh + n / 60, 0, f.mm + n % 60, f.ss); +} +CONSTEXPR_F fields step(hour_tag, fields f, diff_t n) noexcept { + return impl::n_hour(f.y, f.m, f.d + n / 24, 0, f.hh + n % 24, f.mm, f.ss); +} +CONSTEXPR_F fields step(day_tag, fields f, diff_t n) noexcept { + return impl::n_day(f.y, f.m, f.d, n, f.hh, f.mm, f.ss); +} +CONSTEXPR_F fields step(month_tag, fields f, diff_t n) noexcept { + return impl::n_mon(f.y + n / 12, f.m + n % 12, f.d, 0, f.hh, f.mm, f.ss); +} +CONSTEXPR_F fields step(year_tag, fields f, diff_t n) noexcept { + return fields(f.y + n, f.m, f.d, f.hh, f.mm, f.ss); +} + +//////////////////////////////////////////////////////////////////////// + +namespace impl { + +// Returns (v * f + a) but avoiding intermediate overflow when possible. +CONSTEXPR_F diff_t scale_add(diff_t v, diff_t f, diff_t a) noexcept { + return (v < 0) ? ((v + 1) * f + a) - f : ((v - 1) * f + a) + f; +} + +// Map a (normalized) Y/M/D to the number of days before/after 1970-01-01. +// Probably overflows for years outside [-292277022656:292277026595]. +CONSTEXPR_F diff_t ymd_ord(year_t y, month_t m, day_t d) noexcept { + const diff_t eyear = (m <= 2) ? y - 1 : y; + const diff_t era = (eyear >= 0 ? eyear : eyear - 399) / 400; + const diff_t yoe = eyear - era * 400; + const diff_t doy = (153 * (m + (m > 2 ? -3 : 9)) + 2) / 5 + d - 1; + const diff_t doe = yoe * 365 + yoe / 4 - yoe / 100 + doy; + return era * 146097 + doe - 719468; +} + +// Returns the difference in days between two normalized Y-M-D tuples. +// ymd_ord() will encounter integer overflow given extreme year values, +// yet the difference between two such extreme values may actually be +// small, so we take a little care to avoid overflow when possible by +// exploiting the 146097-day cycle. +CONSTEXPR_F diff_t day_difference(year_t y1, month_t m1, day_t d1, + year_t y2, month_t m2, day_t d2) noexcept { + const diff_t a_c4_off = y1 % 400; + const diff_t b_c4_off = y2 % 400; + diff_t c4_diff = (y1 - a_c4_off) - (y2 - b_c4_off); + diff_t delta = ymd_ord(a_c4_off, m1, d1) - ymd_ord(b_c4_off, m2, d2); + if (c4_diff > 0 && delta < 0) { + delta += 2 * 146097; + c4_diff -= 2 * 400; + } else if (c4_diff < 0 && delta > 0) { + delta -= 2 * 146097; + c4_diff += 2 * 400; + } + return (c4_diff / 400 * 146097) + delta; +} + +} // namespace impl + +// Returns the difference between fields structs using the indicated unit. +CONSTEXPR_F diff_t difference(year_tag, fields f1, fields f2) noexcept { + return f1.y - f2.y; +} +CONSTEXPR_F diff_t difference(month_tag, fields f1, fields f2) noexcept { + return impl::scale_add(difference(year_tag{}, f1, f2), 12, (f1.m - f2.m)); +} +CONSTEXPR_F diff_t difference(day_tag, fields f1, fields f2) noexcept { + return impl::day_difference(f1.y, f1.m, f1.d, f2.y, f2.m, f2.d); +} +CONSTEXPR_F diff_t difference(hour_tag, fields f1, fields f2) noexcept { + return impl::scale_add(difference(day_tag{}, f1, f2), 24, (f1.hh - f2.hh)); +} +CONSTEXPR_F diff_t difference(minute_tag, fields f1, fields f2) noexcept { + return impl::scale_add(difference(hour_tag{}, f1, f2), 60, (f1.mm - f2.mm)); +} +CONSTEXPR_F diff_t difference(second_tag, fields f1, fields f2) noexcept { + return impl::scale_add(difference(minute_tag{}, f1, f2), 60, f1.ss - f2.ss); +} + +//////////////////////////////////////////////////////////////////////// + +// Aligns the (normalized) fields struct to the indicated field. +CONSTEXPR_F fields align(second_tag, fields f) noexcept { + return f; +} +CONSTEXPR_F fields align(minute_tag, fields f) noexcept { + return fields{f.y, f.m, f.d, f.hh, f.mm, 0}; +} +CONSTEXPR_F fields align(hour_tag, fields f) noexcept { + return fields{f.y, f.m, f.d, f.hh, 0, 0}; +} +CONSTEXPR_F fields align(day_tag, fields f) noexcept { + return fields{f.y, f.m, f.d, 0, 0, 0}; +} +CONSTEXPR_F fields align(month_tag, fields f) noexcept { + return fields{f.y, f.m, 1, 0, 0, 0}; +} +CONSTEXPR_F fields align(year_tag, fields f) noexcept { + return fields{f.y, 1, 1, 0, 0, 0}; +} + +//////////////////////////////////////////////////////////////////////// + +template +class civil_time { + public: + explicit CONSTEXPR_M civil_time(year_t y, diff_t m = 1, diff_t d = 1, + diff_t hh = 0, diff_t mm = 0, + diff_t ss = 0) noexcept + : civil_time(impl::n_sec(y, m, d, hh, mm, ss)) {} + + CONSTEXPR_M civil_time() noexcept : f_{1970, 1, 1, 0, 0, 0} {} + civil_time(const civil_time&) = default; + civil_time& operator=(const civil_time&) = default; + + // Conversion between civil times of different alignment. Conversion to + // a more precise alignment is allowed implicitly (e.g., day -> hour), + // but conversion where information is discarded must be explicit + // (e.g., second -> minute). + template + using preserves_data = + typename std::enable_if::value>::type; + template + CONSTEXPR_M civil_time(const civil_time& ct, + preserves_data* = nullptr) noexcept + : civil_time(ct.f_) {} + template + explicit CONSTEXPR_M civil_time(const civil_time& ct, + preserves_data* = nullptr) noexcept + : civil_time(ct.f_) {} + + // Factories for the maximum/minimum representable civil_time. + static civil_time max() { + const auto max_year = std::numeric_limits::max(); + return civil_time(max_year, 12, 31, 23, 59, 59); + } + static civil_time min() { + const auto min_year = std::numeric_limits::min(); + return civil_time(min_year, 1, 1, 0, 0, 0); + } + + // Field accessors. Note: All but year() return an int. + CONSTEXPR_M year_t year() const noexcept { return f_.y; } + CONSTEXPR_M int month() const noexcept { return f_.m; } + CONSTEXPR_M int day() const noexcept { return f_.d; } + CONSTEXPR_M int hour() const noexcept { return f_.hh; } + CONSTEXPR_M int minute() const noexcept { return f_.mm; } + CONSTEXPR_M int second() const noexcept { return f_.ss; } + + // Assigning arithmetic. + CONSTEXPR_M civil_time& operator+=(diff_t n) noexcept { + f_ = step(T{}, f_, n); + return *this; + } + 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; + } + CONSTEXPR_M civil_time& operator++() noexcept { + return *this += 1; + } + CONSTEXPR_M civil_time operator++(int) noexcept { + const civil_time a = *this; + ++*this; + return a; + } + CONSTEXPR_M civil_time& operator--() noexcept { + return *this -= 1; + } + CONSTEXPR_M civil_time operator--(int) noexcept { + const civil_time a = *this; + --*this; + return a; + } + + // Binary arithmetic operators. + inline friend CONSTEXPR_M civil_time operator+(civil_time a, + diff_t n) noexcept { + return a += n; + } + inline friend CONSTEXPR_M civil_time operator+(diff_t n, + civil_time a) noexcept { + return a += n; + } + inline friend CONSTEXPR_M civil_time operator-(civil_time a, + diff_t n) noexcept { + return a -= n; + } + inline friend CONSTEXPR_M diff_t operator-(const civil_time& lhs, + const civil_time& rhs) noexcept { + return difference(T{}, lhs.f_, rhs.f_); + } + + private: + // All instantiations of this template are allowed to call the following + // private constructor and access the private fields member. + template + friend class civil_time; + + // The designated constructor that all others eventually call. + explicit CONSTEXPR_M civil_time(fields f) noexcept : f_(align(T{}, f)) {} + + fields f_; +}; + +// Disallows difference between differently aligned types. +// auto n = civil_day(...) - civil_hour(...); // would be confusing. +template +CONSTEXPR_F diff_t operator-(civil_time, civil_time) = delete; + +using civil_year = civil_time; +using civil_month = civil_time; +using civil_day = civil_time; +using civil_hour = civil_time; +using civil_minute = civil_time; +using civil_second = civil_time; + +//////////////////////////////////////////////////////////////////////// + +// Relational operators that work with differently aligned objects. +// Always compares all six fields. +template +CONSTEXPR_F bool operator<(const civil_time& lhs, + const civil_time& rhs) noexcept { + return (lhs.year() < rhs.year() || + (lhs.year() == rhs.year() && + (lhs.month() < rhs.month() || + (lhs.month() == rhs.month() && + (lhs.day() < rhs.day() || + (lhs.day() == rhs.day() && + (lhs.hour() < rhs.hour() || + (lhs.hour() == rhs.hour() && + (lhs.minute() < rhs.minute() || + (lhs.minute() == rhs.minute() && + (lhs.second() < rhs.second()))))))))))); +} +template +CONSTEXPR_F bool operator<=(const civil_time& lhs, + const civil_time& rhs) noexcept { + return !(rhs < lhs); +} +template +CONSTEXPR_F bool operator>=(const civil_time& lhs, + const civil_time& rhs) noexcept { + return !(lhs < rhs); +} +template +CONSTEXPR_F bool operator>(const civil_time& lhs, + const civil_time& rhs) noexcept { + return rhs < lhs; +} +template +CONSTEXPR_F bool operator==(const civil_time& lhs, + const civil_time& rhs) noexcept { + return lhs.year() == rhs.year() && lhs.month() == rhs.month() && + lhs.day() == rhs.day() && lhs.hour() == rhs.hour() && + lhs.minute() == rhs.minute() && lhs.second() == rhs.second(); +} +template +CONSTEXPR_F bool operator!=(const civil_time& lhs, + const civil_time& rhs) noexcept { + return !(lhs == rhs); +} + +//////////////////////////////////////////////////////////////////////// + +enum class weekday { + monday, + tuesday, + wednesday, + thursday, + friday, + saturday, + sunday, +}; + +CONSTEXPR_F weekday get_weekday(const civil_day& cd) noexcept { + CONSTEXPR_D weekday k_weekday_by_sun_off[7] = { + weekday::sunday, weekday::monday, weekday::tuesday, + weekday::wednesday, weekday::thursday, weekday::friday, + weekday::saturday, + }; + CONSTEXPR_D int k_weekday_offsets[1 + 12] = { + -1, 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4, + }; + year_t wd = cd.year() - (cd.month() < 3); + if (wd >= 0) { + wd += wd / 4 - wd / 100 + wd / 400; + } else { + wd += (wd - 3) / 4 - (wd - 99) / 100 + (wd - 399) / 400; + } + wd += k_weekday_offsets[cd.month()] + cd.day(); + return k_weekday_by_sun_off[(wd % 7 + 7) % 7]; +} + +//////////////////////////////////////////////////////////////////////// + +CONSTEXPR_F civil_day next_weekday(civil_day cd, weekday wd) noexcept { + do { cd += 1; } while (get_weekday(cd) != wd); + return cd; +} + +CONSTEXPR_F civil_day prev_weekday(civil_day cd, weekday wd) noexcept { + do { cd -= 1; } while (get_weekday(cd) != wd); + return cd; +} + +CONSTEXPR_F int get_yearday(const civil_day& cd) noexcept { + CONSTEXPR_D int k_month_offsets[1 + 12] = { + -1, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, + }; + const int feb29 = (cd.month() > 2 && impl::is_leap_year(cd.year())); + return k_month_offsets[cd.month()] + feb29 + cd.day(); +} + +//////////////////////////////////////////////////////////////////////// + +std::ostream& operator<<(std::ostream& os, const civil_year& y); +std::ostream& operator<<(std::ostream& os, const civil_month& m); +std::ostream& operator<<(std::ostream& os, const civil_day& d); +std::ostream& operator<<(std::ostream& os, const civil_hour& h); +std::ostream& operator<<(std::ostream& os, const civil_minute& m); +std::ostream& operator<<(std::ostream& os, const civil_second& s); +std::ostream& operator<<(std::ostream& os, weekday wd); + +} // namespace detail +} // namespace cctz +} // namespace time_internal +} // namespace absl + +#undef CONSTEXPR_M +#undef CONSTEXPR_F +#undef CONSTEXPR_D + +#endif // ABSL_TIME_INTERNAL_CCTZ_CIVIL_TIME_DETAIL_H_ diff --git a/absl/time/internal/cctz/include/cctz/time_zone.h b/absl/time/internal/cctz/include/cctz/time_zone.h new file mode 100644 index 000000000..31abc2c4b --- /dev/null +++ b/absl/time/internal/cctz/include/cctz/time_zone.h @@ -0,0 +1,316 @@ +// Copyright 2016 Google Inc. 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. + +// A library for translating between absolute times (represented by +// std::chrono::time_points of the std::chrono::system_clock) and civil +// times (represented by cctz::civil_second) using the rules defined by +// a time zone (cctz::time_zone). + +#ifndef ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_H_ +#define ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_H_ + +#include +#include +#include +#include + +#include "absl/time/internal/cctz/include/cctz/civil_time.h" + +namespace absl { +namespace time_internal { +namespace cctz { + +// Convenience aliases. Not intended as public API points. +template +using time_point = std::chrono::time_point; +using sys_seconds = std::chrono::duration; + +namespace detail { +template +inline std::pair, D> +split_seconds(const time_point& tp) { + auto sec = std::chrono::time_point_cast(tp); + auto sub = tp - sec; + if (sub.count() < 0) { + sec -= sys_seconds(1); + sub += sys_seconds(1); + } + return {sec, std::chrono::duration_cast(sub)}; +} +inline std::pair, sys_seconds> +split_seconds(const time_point& tp) { + return {tp, sys_seconds(0)}; +} +} // namespace detail + +// cctz::time_zone is an opaque, small, value-type class representing a +// geo-political region within which particular rules are used for mapping +// between absolute and civil times. Time zones are named using the TZ +// identifiers from the IANA Time Zone Database, such as "America/Los_Angeles" +// or "Australia/Sydney". Time zones are created from factory functions such +// as load_time_zone(). Note: strings like "PST" and "EDT" are not valid TZ +// identifiers. +// +// Example: +// cctz::time_zone utc = cctz::utc_time_zone(); +// cctz::time_zone pst = cctz::fixed_time_zone(std::chrono::hours(-8)); +// cctz::time_zone loc = cctz::local_time_zone(); +// cctz::time_zone lax; +// if (!cctz::load_time_zone("America/Los_Angeles", &lax)) { ... } +// +// See also: +// - http://www.iana.org/time-zones +// - http://en.wikipedia.org/wiki/Zoneinfo +class time_zone { + public: + time_zone() : time_zone(nullptr) {} // Equivalent to UTC + time_zone(const time_zone&) = default; + time_zone& operator=(const time_zone&) = default; + + std::string name() const; + + // An absolute_lookup represents the civil time (cctz::civil_second) within + // this time_zone at the given absolute time (time_point). There are + // additionally a few other fields that may be useful when working with + // older APIs, such as std::tm. + // + // Example: + // const cctz::time_zone tz = ... + // const auto tp = std::chrono::system_clock::now(); + // const cctz::time_zone::absolute_lookup al = tz.lookup(tp); + struct absolute_lookup { + civil_second cs; + // Note: The following fields exist for backward compatibility with older + // APIs. Accessing these fields directly is a sign of imprudent logic in + // the calling code. Modern time-related code should only access this data + // indirectly by way of cctz::format(). + int offset; // civil seconds east of UTC + bool is_dst; // is offset non-standard? + const char* abbr; // time-zone abbreviation (e.g., "PST") + }; + absolute_lookup lookup(const time_point& tp) const; + template + absolute_lookup lookup(const time_point& tp) const { + return lookup(detail::split_seconds(tp).first); + } + + // A civil_lookup represents the absolute time(s) (time_point) that + // correspond to the given civil time (cctz::civil_second) within this + // time_zone. Usually the given civil time represents a unique instant + // in time, in which case the conversion is unambiguous. However, + // within this time zone, the given civil time may be skipped (e.g., + // during a positive UTC offset shift), or repeated (e.g., during a + // negative UTC offset shift). To account for these possibilities, + // civil_lookup is richer than just a single time_point. + // + // In all cases the civil_lookup::kind enum will indicate the nature + // of the given civil-time argument, and the pre, trans, and post + // members will give the absolute time answers using the pre-transition + // offset, the transition point itself, and the post-transition offset, + // respectively (all three times are equal if kind == UNIQUE). If any + // of these three absolute times is outside the representable range of a + // time_point the field is set to its maximum/minimum value. + // + // Example: + // cctz::time_zone lax; + // if (!cctz::load_time_zone("America/Los_Angeles", &lax)) { ... } + // + // // A unique civil time. + // auto jan01 = lax.lookup(cctz::civil_second(2011, 1, 1, 0, 0, 0)); + // // jan01.kind == cctz::time_zone::civil_lookup::UNIQUE + // // jan01.pre is 2011/01/01 00:00:00 -0800 + // // jan01.trans is 2011/01/01 00:00:00 -0800 + // // jan01.post is 2011/01/01 00:00:00 -0800 + // + // // A Spring DST transition, when there is a gap in civil time. + // auto mar13 = lax.lookup(cctz::civil_second(2011, 3, 13, 2, 15, 0)); + // // mar13.kind == cctz::time_zone::civil_lookup::SKIPPED + // // mar13.pre is 2011/03/13 03:15:00 -0700 + // // mar13.trans is 2011/03/13 03:00:00 -0700 + // // mar13.post is 2011/03/13 01:15:00 -0800 + // + // // A Fall DST transition, when civil times are repeated. + // auto nov06 = lax.lookup(cctz::civil_second(2011, 11, 6, 1, 15, 0)); + // // nov06.kind == cctz::time_zone::civil_lookup::REPEATED + // // nov06.pre is 2011/11/06 01:15:00 -0700 + // // nov06.trans is 2011/11/06 01:00:00 -0800 + // // nov06.post is 2011/11/06 01:15:00 -0800 + struct civil_lookup { + enum civil_kind { + UNIQUE, // the civil time was singular (pre == trans == post) + SKIPPED, // the civil time did not exist (pre >= trans > post) + REPEATED, // the civil time was ambiguous (pre < trans <= post) + } kind; + time_point pre; // uses the pre-transition offset + time_point trans; // instant of civil-offset change + time_point post; // uses the post-transition offset + }; + civil_lookup lookup(const civil_second& cs) const; + + class Impl; + + private: + explicit time_zone(const Impl* impl) : impl_(impl) {} + const Impl* impl_; +}; + +// Relational operators. +bool operator==(time_zone lhs, time_zone rhs); +inline bool operator!=(time_zone lhs, time_zone rhs) { return !(lhs == rhs); } + +// Loads the named time zone. May perform I/O on the initial load. +// If the name is invalid, or some other kind of error occurs, returns +// false and "*tz" is set to the UTC time zone. +bool load_time_zone(const std::string& name, time_zone* tz); + +// Returns a time_zone representing UTC. Cannot fail. +time_zone utc_time_zone(); + +// Returns a time zone that is a fixed offset (seconds east) from UTC. +// Note: If the absolute value of the offset is greater than 24 hours +// you'll get UTC (i.e., zero offset) instead. +time_zone fixed_time_zone(const sys_seconds& offset); + +// Returns a time zone representing the local time zone. Falls back to UTC. +time_zone local_time_zone(); + +// Returns the civil time (cctz::civil_second) within the given time zone at +// the given absolute time (time_point). Since the additional fields provided +// by the time_zone::absolute_lookup struct should rarely be needed in modern +// code, this convert() function is simpler and should be preferred. +template +inline civil_second convert(const time_point& tp, const time_zone& tz) { + return tz.lookup(tp).cs; +} + +// Returns the absolute time (time_point) that corresponds to the given civil +// time within the given time zone. If the civil time is not unique (i.e., if +// it was either repeated or non-existent), then the returned time_point is +// the best estimate that preserves relative order. That is, this function +// guarantees that if cs1 < cs2, then convert(cs1, tz) <= convert(cs2, tz). +inline time_point convert(const civil_second& cs, + const time_zone& tz) { + const time_zone::civil_lookup cl = tz.lookup(cs); + if (cl.kind == time_zone::civil_lookup::SKIPPED) return cl.trans; + return cl.pre; +} + +namespace detail { +using femtoseconds = std::chrono::duration; +std::string format(const std::string&, const time_point&, + const femtoseconds&, const time_zone&); +bool parse(const std::string&, const std::string&, const time_zone&, + time_point*, femtoseconds*, std::string* err = nullptr); +} // namespace detail + +// Formats the given time_point in the given cctz::time_zone according to +// the provided format std::string. Uses strftime()-like formatting options, +// with the following extensions: +// +// - %Ez - RFC3339-compatible numeric UTC offset (+hh:mm or -hh:mm) +// - %E*z - Full-resolution numeric UTC offset (+hh:mm:ss or -hh:mm:ss) +// - %E#S - Seconds with # digits of fractional precision +// - %E*S - Seconds with full fractional precision (a literal '*') +// - %E#f - Fractional seconds with # digits of precision +// - %E*f - Fractional seconds with full precision (a literal '*') +// - %E4Y - Four-character years (-999 ... -001, 0000, 0001 ... 9999) +// +// Note that %E0S behaves like %S, and %E0f produces no characters. In +// contrast %E*f always produces at least one digit, which may be '0'. +// +// Note that %Y produces as many characters as it takes to fully render the +// year. A year outside of [-999:9999] when formatted with %E4Y will produce +// more than four characters, just like %Y. +// +// Tip: Format strings should include the UTC offset (e.g., %z, %Ez, or %E*z) +// so that the resulting std::string uniquely identifies an absolute time. +// +// Example: +// cctz::time_zone lax; +// if (!cctz::load_time_zone("America/Los_Angeles", &lax)) { ... } +// auto tp = cctz::convert(cctz::civil_second(2013, 1, 2, 3, 4, 5), lax); +// std::string f = cctz::format("%H:%M:%S", tp, lax); // "03:04:05" +// f = cctz::format("%H:%M:%E3S", tp, lax); // "03:04:05.000" +template +inline std::string format(const std::string& fmt, const time_point& tp, + const time_zone& tz) { + const auto p = detail::split_seconds(tp); + const auto n = std::chrono::duration_cast(p.second); + return detail::format(fmt, p.first, n, tz); +} + +// Parses an input std::string according to the provided format std::string and +// returns the corresponding time_point. Uses strftime()-like formatting +// options, with the same extensions as cctz::format(), but with the +// exceptions that %E#S is interpreted as %E*S, and %E#f as %E*f. %Ez +// and %E*z also accept the same inputs. +// +// %Y consumes as many numeric characters as it can, so the matching data +// should always be terminated with a non-numeric. %E4Y always consumes +// exactly four characters, including any sign. +// +// Unspecified fields are taken from the default date and time of ... +// +// "1970-01-01 00:00:00.0 +0000" +// +// For example, parsing a std::string of "15:45" (%H:%M) will return a time_point +// that represents "1970-01-01 15:45:00.0 +0000". +// +// Note that parse() returns time instants, so it makes most sense to parse +// fully-specified date/time strings that include a UTC offset (%z, %Ez, or +// %E*z). +// +// Note also that parse() only heeds the fields year, month, day, hour, +// minute, (fractional) second, and UTC offset. Other fields, like weekday (%a +// or %A), while parsed for syntactic validity, are ignored in the conversion. +// +// Date and time fields that are out-of-range will be treated as errors rather +// than normalizing them like cctz::civil_second() would do. For example, it +// is an error to parse the date "Oct 32, 2013" because 32 is out of range. +// +// A second of ":60" is normalized to ":00" of the following minute with +// fractional seconds discarded. The following table shows how the given +// seconds and subseconds will be parsed: +// +// "59.x" -> 59.x // exact +// "60.x" -> 00.0 // normalized +// "00.x" -> 00.x // exact +// +// Errors are indicated by returning false. +// +// Example: +// const cctz::time_zone tz = ... +// std::chrono::system_clock::time_point tp; +// if (cctz::parse("%Y-%m-%d", "2015-10-09", tz, &tp)) { +// ... +// } +template +inline bool parse(const std::string& fmt, const std::string& input, + const time_zone& tz, time_point* tpp) { + time_point sec; + detail::femtoseconds fs; + const bool b = detail::parse(fmt, input, tz, &sec, &fs); + if (b) { + // TODO: Return false if unrepresentable as a time_point. + *tpp = std::chrono::time_point_cast(sec); + *tpp += std::chrono::duration_cast(fs); + } + return b; +} + +} // namespace cctz +} // namespace time_internal +} // namespace absl + +#endif // ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_H_ diff --git a/absl/time/internal/cctz/include/cctz/zone_info_source.h b/absl/time/internal/cctz/include/cctz/zone_info_source.h new file mode 100644 index 000000000..4d9d8f875 --- /dev/null +++ b/absl/time/internal/cctz/include/cctz/zone_info_source.h @@ -0,0 +1,91 @@ +// Copyright 2016 Google Inc. 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. + +#ifndef ABSL_TIME_INTERNAL_CCTZ_ZONE_INFO_SOURCE_H_ +#define ABSL_TIME_INTERNAL_CCTZ_ZONE_INFO_SOURCE_H_ + +#include +#include +#include +#include + +namespace absl { +namespace time_internal { +namespace cctz { + +// A stdio-like interface for providing zoneinfo data for a particular zone. +class ZoneInfoSource { + public: + virtual ~ZoneInfoSource(); + + virtual std::size_t Read(void* ptr, std::size_t size) = 0; // like fread() + virtual int Skip(std::size_t offset) = 0; // like fseek() +}; + +} // namespace cctz +} // namespace time_internal +} // namespace absl + +namespace absl { +namespace time_internal { +namespace cctz_extension { + +// A function-pointer type for a factory that returns a ZoneInfoSource +// given the name of a time zone and a fallback factory. Returns null +// when the data for the named zone cannot be found. +using ZoneInfoSourceFactory = + std::unique_ptr (*)( + const std::string&, + const std::function( + const std::string&)>&); + +// The user can control the mapping of zone names to zoneinfo data by +// providing a definition for cctz_extension::zone_info_source_factory. +// For example, given functions my_factory() and my_other_factory() that +// can return a ZoneInfoSource for a named zone, we could inject them into +// cctz::load_time_zone() with: +// +// namespace cctz_extension { +// namespace { +// std::unique_ptr CustomFactory( +// const std::string& name, +// const std::function( +// const std::string& name)>& fallback_factory) { +// if (auto zip = my_factory(name)) return zip; +// if (auto zip = fallback_factory(name)) return zip; +// if (auto zip = my_other_factory(name)) return zip; +// return nullptr; +// } +// } // namespace +// ZoneInfoSourceFactory zone_info_source_factory = CustomFactory; +// } // namespace cctz_extension +// +// This might be used, say, to use zoneinfo data embedded in the program, +// or read from a (possibly compressed) file archive, or both. +// +// cctz_extension::zone_info_source_factory() will be called: +// (1) from the same thread as the cctz::load_time_zone() call, +// (2) only once for any zone name, and +// (3) serially (i.e., no concurrent execution). +// +// The fallback factory obtains zoneinfo data by reading files in ${TZDIR}, +// and it is used automatically when no zone_info_source_factory definition +// is linked into the program. +extern ZoneInfoSourceFactory zone_info_source_factory; + +} // namespace cctz_extension +} // namespace time_internal +} // namespace absl + +#endif // ABSL_TIME_INTERNAL_CCTZ_ZONE_INFO_SOURCE_H_ diff --git a/absl/time/internal/cctz/src/civil_time_detail.cc b/absl/time/internal/cctz/src/civil_time_detail.cc new file mode 100644 index 000000000..780d5c96e --- /dev/null +++ b/absl/time/internal/cctz/src/civil_time_detail.cc @@ -0,0 +1,90 @@ +// Copyright 2016 Google Inc. 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. + +#include "absl/time/internal/cctz/include/cctz/civil_time_detail.h" + +#include +#include +#include + +namespace absl { +namespace time_internal { +namespace cctz { +namespace detail { + +// Output stream operators output a format matching YYYY-MM-DDThh:mm:ss, +// while omitting fields inferior to the type's alignment. For example, +// civil_day is formatted only as YYYY-MM-DD. +std::ostream& operator<<(std::ostream& os, const civil_year& y) { + std::stringstream ss; + ss << y.year(); // No padding. + return os << ss.str(); +} +std::ostream& operator<<(std::ostream& os, const civil_month& m) { + std::stringstream ss; + ss << civil_year(m) << '-'; + ss << std::setfill('0') << std::setw(2) << m.month(); + return os << ss.str(); +} +std::ostream& operator<<(std::ostream& os, const civil_day& d) { + std::stringstream ss; + ss << civil_month(d) << '-'; + ss << std::setfill('0') << std::setw(2) << d.day(); + return os << ss.str(); +} +std::ostream& operator<<(std::ostream& os, const civil_hour& h) { + std::stringstream ss; + ss << civil_day(h) << 'T'; + ss << std::setfill('0') << std::setw(2) << h.hour(); + return os << ss.str(); +} +std::ostream& operator<<(std::ostream& os, const civil_minute& m) { + std::stringstream ss; + ss << civil_hour(m) << ':'; + ss << std::setfill('0') << std::setw(2) << m.minute(); + return os << ss.str(); +} +std::ostream& operator<<(std::ostream& os, const civil_second& s) { + std::stringstream ss; + ss << civil_minute(s) << ':'; + ss << std::setfill('0') << std::setw(2) << s.second(); + return os << ss.str(); +} + +//////////////////////////////////////////////////////////////////////// + +std::ostream& operator<<(std::ostream& os, weekday wd) { + switch (wd) { + case weekday::monday: + return os << "Monday"; + case weekday::tuesday: + return os << "Tuesday"; + case weekday::wednesday: + return os << "Wednesday"; + case weekday::thursday: + return os << "Thursday"; + case weekday::friday: + return os << "Friday"; + case weekday::saturday: + return os << "Saturday"; + case weekday::sunday: + return os << "Sunday"; + } + return os; // Should never get here, but -Wreturn-type may warn without this. +} + +} // namespace detail +} // namespace cctz +} // namespace time_internal +} // namespace absl diff --git a/absl/time/internal/cctz/src/civil_time_test.cc b/absl/time/internal/cctz/src/civil_time_test.cc new file mode 100644 index 000000000..6df0395ba --- /dev/null +++ b/absl/time/internal/cctz/src/civil_time_test.cc @@ -0,0 +1,1049 @@ +// Copyright 2016 Google Inc. 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. + +#include "absl/time/internal/cctz/include/cctz/civil_time.h" + +#include +#include +#include +#include +#include + +#include "gtest/gtest.h" + +namespace absl { +namespace time_internal { +namespace cctz { + +namespace { + +template +std::string Format(const T& t) { + std::stringstream ss; + ss << t; + return ss.str(); +} + +} // namespace + +#if __clang__ && __cpp_constexpr >= 201304 +// Construction constexpr tests + +TEST(CivilTime, Normal) { + constexpr civil_second css(2016, 1, 28, 17, 14, 12); + static_assert(css.second() == 12, "Normal.second"); + constexpr civil_minute cmm(2016, 1, 28, 17, 14); + static_assert(cmm.minute() == 14, "Normal.minute"); + constexpr civil_hour chh(2016, 1, 28, 17); + static_assert(chh.hour() == 17, "Normal.hour"); + constexpr civil_day cd(2016, 1, 28); + static_assert(cd.day() == 28, "Normal.day"); + constexpr civil_month cm(2016, 1); + static_assert(cm.month() == 1, "Normal.month"); + constexpr civil_year cy(2016); + static_assert(cy.year() == 2016, "Normal.year"); +} + +TEST(CivilTime, Conversion) { + constexpr civil_year cy(2016); + static_assert(cy.year() == 2016, "Conversion.year"); + constexpr civil_month cm(cy); + static_assert(cm.month() == 1, "Conversion.month"); + constexpr civil_day cd(cm); + static_assert(cd.day() == 1, "Conversion.day"); + constexpr civil_hour chh(cd); + static_assert(chh.hour() == 0, "Conversion.hour"); + constexpr civil_minute cmm(chh); + static_assert(cmm.minute() == 0, "Conversion.minute"); + constexpr civil_second css(cmm); + static_assert(css.second() == 0, "Conversion.second"); +} + +// Normalization constexpr tests + +TEST(CivilTime, Normalized) { + constexpr civil_second cs(2016, 1, 28, 17, 14, 12); + static_assert(cs.year() == 2016, "Normalized.year"); + static_assert(cs.month() == 1, "Normalized.month"); + static_assert(cs.day() == 28, "Normalized.day"); + static_assert(cs.hour() == 17, "Normalized.hour"); + static_assert(cs.minute() == 14, "Normalized.minute"); + static_assert(cs.second() == 12, "Normalized.second"); +} + +TEST(CivilTime, SecondOverflow) { + constexpr civil_second cs(2016, 1, 28, 17, 14, 121); + static_assert(cs.year() == 2016, "SecondOverflow.year"); + static_assert(cs.month() == 1, "SecondOverflow.month"); + static_assert(cs.day() == 28, "SecondOverflow.day"); + static_assert(cs.hour() == 17, "SecondOverflow.hour"); + static_assert(cs.minute() == 16, "SecondOverflow.minute"); + static_assert(cs.second() == 1, "SecondOverflow.second"); +} + +TEST(CivilTime, SecondUnderflow) { + constexpr civil_second cs(2016, 1, 28, 17, 14, -121); + static_assert(cs.year() == 2016, "SecondUnderflow.year"); + static_assert(cs.month() == 1, "SecondUnderflow.month"); + static_assert(cs.day() == 28, "SecondUnderflow.day"); + static_assert(cs.hour() == 17, "SecondUnderflow.hour"); + static_assert(cs.minute() == 11, "SecondUnderflow.minute"); + static_assert(cs.second() == 59, "SecondUnderflow.second"); +} + +TEST(CivilTime, MinuteOverflow) { + constexpr civil_second cs(2016, 1, 28, 17, 121, 12); + static_assert(cs.year() == 2016, "MinuteOverflow.year"); + static_assert(cs.month() == 1, "MinuteOverflow.month"); + static_assert(cs.day() == 28, "MinuteOverflow.day"); + static_assert(cs.hour() == 19, "MinuteOverflow.hour"); + static_assert(cs.minute() == 1, "MinuteOverflow.minute"); + static_assert(cs.second() == 12, "MinuteOverflow.second"); +} + +TEST(CivilTime, MinuteUnderflow) { + constexpr civil_second cs(2016, 1, 28, 17, -121, 12); + static_assert(cs.year() == 2016, "MinuteUnderflow.year"); + static_assert(cs.month() == 1, "MinuteUnderflow.month"); + static_assert(cs.day() == 28, "MinuteUnderflow.day"); + static_assert(cs.hour() == 14, "MinuteUnderflow.hour"); + static_assert(cs.minute() == 59, "MinuteUnderflow.minute"); + static_assert(cs.second() == 12, "MinuteUnderflow.second"); +} + +TEST(CivilTime, HourOverflow) { + constexpr civil_second cs(2016, 1, 28, 49, 14, 12); + static_assert(cs.year() == 2016, "HourOverflow.year"); + static_assert(cs.month() == 1, "HourOverflow.month"); + static_assert(cs.day() == 30, "HourOverflow.day"); + static_assert(cs.hour() == 1, "HourOverflow.hour"); + static_assert(cs.minute() == 14, "HourOverflow.minute"); + static_assert(cs.second() == 12, "HourOverflow.second"); +} + +TEST(CivilTime, HourUnderflow) { + constexpr civil_second cs(2016, 1, 28, -49, 14, 12); + static_assert(cs.year() == 2016, "HourUnderflow.year"); + static_assert(cs.month() == 1, "HourUnderflow.month"); + static_assert(cs.day() == 25, "HourUnderflow.day"); + static_assert(cs.hour() == 23, "HourUnderflow.hour"); + static_assert(cs.minute() == 14, "HourUnderflow.minute"); + static_assert(cs.second() == 12, "HourUnderflow.second"); +} + +TEST(CivilTime, MonthOverflow) { + constexpr civil_second cs(2016, 25, 28, 17, 14, 12); + static_assert(cs.year() == 2018, "MonthOverflow.year"); + static_assert(cs.month() == 1, "MonthOverflow.month"); + static_assert(cs.day() == 28, "MonthOverflow.day"); + static_assert(cs.hour() == 17, "MonthOverflow.hour"); + static_assert(cs.minute() == 14, "MonthOverflow.minute"); + static_assert(cs.second() == 12, "MonthOverflow.second"); +} + +TEST(CivilTime, MonthUnderflow) { + constexpr civil_second cs(2016, -25, 28, 17, 14, 12); + static_assert(cs.year() == 2013, "MonthUnderflow.year"); + static_assert(cs.month() == 11, "MonthUnderflow.month"); + static_assert(cs.day() == 28, "MonthUnderflow.day"); + static_assert(cs.hour() == 17, "MonthUnderflow.hour"); + static_assert(cs.minute() == 14, "MonthUnderflow.minute"); + static_assert(cs.second() == 12, "MonthUnderflow.second"); +} + +TEST(CivilTime, C4Overflow) { + constexpr civil_second cs(2016, 1, 292195, 17, 14, 12); + static_assert(cs.year() == 2816, "C4Overflow.year"); + static_assert(cs.month() == 1, "C4Overflow.month"); + static_assert(cs.day() == 1, "C4Overflow.day"); + static_assert(cs.hour() == 17, "C4Overflow.hour"); + static_assert(cs.minute() == 14, "C4Overflow.minute"); + static_assert(cs.second() == 12, "C4Overflow.second"); +} + +TEST(CivilTime, C4Underflow) { + constexpr civil_second cs(2016, 1, -292195, 17, 14, 12); + static_assert(cs.year() == 1215, "C4Underflow.year"); + static_assert(cs.month() == 12, "C4Underflow.month"); + static_assert(cs.day() == 30, "C4Underflow.day"); + static_assert(cs.hour() == 17, "C4Underflow.hour"); + static_assert(cs.minute() == 14, "C4Underflow.minute"); + static_assert(cs.second() == 12, "C4Underflow.second"); +} + +TEST(CivilTime, MixedNormalization) { + constexpr civil_second cs(2016, -42, 122, 99, -147, 4949); + static_assert(cs.year() == 2012, "MixedNormalization.year"); + static_assert(cs.month() == 10, "MixedNormalization.month"); + static_assert(cs.day() == 4, "MixedNormalization.day"); + static_assert(cs.hour() == 1, "MixedNormalization.hour"); + static_assert(cs.minute() == 55, "MixedNormalization.minute"); + static_assert(cs.second() == 29, "MixedNormalization.second"); +} + +// Relational constexpr tests + +TEST(CivilTime, Less) { + constexpr civil_second cs1(2016, 1, 28, 17, 14, 12); + constexpr civil_second cs2(2016, 1, 28, 17, 14, 13); + constexpr bool less = cs1 < cs2; + static_assert(less, "Less"); +} + +// Arithmetic constexpr tests + +TEST(CivilTime, Addition) { + constexpr civil_second cs1(2016, 1, 28, 17, 14, 12); + constexpr civil_second cs2 = cs1 + 50; + static_assert(cs2.year() == 2016, "Addition.year"); + static_assert(cs2.month() == 1, "Addition.month"); + static_assert(cs2.day() == 28, "Addition.day"); + static_assert(cs2.hour() == 17, "Addition.hour"); + static_assert(cs2.minute() == 15, "Addition.minute"); + static_assert(cs2.second() == 2, "Addition.second"); +} + +TEST(CivilTime, Subtraction) { + constexpr civil_second cs1(2016, 1, 28, 17, 14, 12); + constexpr civil_second cs2 = cs1 - 50; + static_assert(cs2.year() == 2016, "Subtraction.year"); + static_assert(cs2.month() == 1, "Subtraction.month"); + static_assert(cs2.day() == 28, "Subtraction.day"); + static_assert(cs2.hour() == 17, "Subtraction.hour"); + static_assert(cs2.minute() == 13, "Subtraction.minute"); + static_assert(cs2.second() == 22, "Subtraction.second"); +} + +TEST(CivilTime, Difference) { + constexpr civil_day cd1(2016, 1, 28); + constexpr civil_day cd2(2015, 1, 28); + constexpr int diff = cd1 - cd2; + static_assert(diff == 365, "Difference"); +} + +// NOTE: Run this with --copt=-ftrapv to detect overflow problems. +TEST(CivilTime, DifferenceWithHugeYear) { + { + constexpr civil_day d1(9223372036854775807, 1, 1); + constexpr civil_day d2(9223372036854775807, 12, 31); + static_assert(d2 - d1 == 364, "DifferenceWithHugeYear"); + } + { + constexpr civil_day d1(-9223372036854775807 - 1, 1, 1); + constexpr civil_day d2(-9223372036854775807 - 1, 12, 31); + static_assert(d2 - d1 == 365, "DifferenceWithHugeYear"); + } + { + // Check the limits of the return value at the end of the year range. + constexpr civil_day d1(9223372036854775807, 1, 1); + constexpr civil_day d2(9198119301927009252, 6, 6); + static_assert(d1 - d2 == 9223372036854775807, "DifferenceWithHugeYear"); + static_assert((d2 - 1) - d1 == -9223372036854775807 - 1, + "DifferenceWithHugeYear"); + } + { + // Check the limits of the return value at the start of the year range. + constexpr civil_day d1(-9223372036854775807 - 1, 1, 1); + constexpr civil_day d2(-9198119301927009254, 7, 28); + static_assert(d2 - d1 == 9223372036854775807, "DifferenceWithHugeYear"); + static_assert(d1 - (d2 + 1) == -9223372036854775807 - 1, + "DifferenceWithHugeYear"); + } + { + // Check the limits of the return value from either side of year 0. + constexpr civil_day d1(-12626367463883278, 9, 3); + constexpr civil_day d2(12626367463883277, 3, 28); + static_assert(d2 - d1 == 9223372036854775807, "DifferenceWithHugeYear"); + static_assert(d1 - (d2 + 1) == -9223372036854775807 - 1, + "DifferenceWithHugeYear"); + } +} + +// NOTE: Run this with --copt=-ftrapv to detect overflow problems. +TEST(CivilTime, DifferenceNoIntermediateOverflow) { + { + // The difference up to the minute field would be below the minimum + // diff_t, but the 52 extra seconds brings us back to the minimum. + constexpr civil_second s1(-292277022657, 1, 27, 8, 29 - 1, 52); + constexpr civil_second s2(1970, 1, 1, 0, 0 - 1, 0); + static_assert(s1 - s2 == -9223372036854775807 - 1, + "DifferenceNoIntermediateOverflow"); + } + { + // The difference up to the minute field would be above the maximum + // diff_t, but the -53 extra seconds brings us back to the maximum. + constexpr civil_second s1(292277026596, 12, 4, 15, 30, 7 - 7); + constexpr civil_second s2(1970, 1, 1, 0, 0, 0 - 7); + static_assert(s1 - s2 == 9223372036854775807, + "DifferenceNoIntermediateOverflow"); + } +} + +// Helper constexpr tests + +TEST(CivilTime, WeekDay) { + constexpr civil_day cd(2016, 1, 28); + constexpr weekday wd = get_weekday(cd); + static_assert(wd == weekday::thursday, "Weekday"); +} + +TEST(CivilTime, NextWeekDay) { + constexpr civil_day cd(2016, 1, 28); + constexpr civil_day next = next_weekday(cd, weekday::thursday); + static_assert(next.year() == 2016, "NextWeekDay.year"); + static_assert(next.month() == 2, "NextWeekDay.month"); + static_assert(next.day() == 4, "NextWeekDay.day"); +} + +TEST(CivilTime, PrevWeekDay) { + constexpr civil_day cd(2016, 1, 28); + constexpr civil_day prev = prev_weekday(cd, weekday::thursday); + static_assert(prev.year() == 2016, "PrevWeekDay.year"); + static_assert(prev.month() == 1, "PrevWeekDay.month"); + static_assert(prev.day() == 21, "PrevWeekDay.day"); +} + +TEST(CivilTime, YearDay) { + constexpr civil_day cd(2016, 1, 28); + constexpr int yd = get_yearday(cd); + static_assert(yd == 28, "YearDay"); +} +#endif // __clang__ && __cpp_constexpr >= 201304 + +// The remaining tests do not use constexpr. + +TEST(CivilTime, DefaultConstruction) { + civil_second ss; + EXPECT_EQ("1970-01-01T00:00:00", Format(ss)); + + civil_minute mm; + EXPECT_EQ("1970-01-01T00:00", Format(mm)); + + civil_hour hh; + EXPECT_EQ("1970-01-01T00", Format(hh)); + + civil_day d; + EXPECT_EQ("1970-01-01", Format(d)); + + civil_month m; + EXPECT_EQ("1970-01", Format(m)); + + civil_year y; + EXPECT_EQ("1970", Format(y)); +} + +TEST(CivilTime, StructMember) { + struct S { + civil_day day; + }; + S s = {}; + EXPECT_EQ(civil_day{}, s.day); +} + +TEST(CivilTime, FieldsConstruction) { + EXPECT_EQ("2015-01-02T03:04:05", Format(civil_second(2015, 1, 2, 3, 4, 5))); + EXPECT_EQ("2015-01-02T03:04:00", Format(civil_second(2015, 1, 2, 3, 4))); + EXPECT_EQ("2015-01-02T03:00:00", Format(civil_second(2015, 1, 2, 3))); + EXPECT_EQ("2015-01-02T00:00:00", Format(civil_second(2015, 1, 2))); + EXPECT_EQ("2015-01-01T00:00:00", Format(civil_second(2015, 1))); + EXPECT_EQ("2015-01-01T00:00:00", Format(civil_second(2015))); + + EXPECT_EQ("2015-01-02T03:04", Format(civil_minute(2015, 1, 2, 3, 4, 5))); + EXPECT_EQ("2015-01-02T03:04", Format(civil_minute(2015, 1, 2, 3, 4))); + EXPECT_EQ("2015-01-02T03:00", Format(civil_minute(2015, 1, 2, 3))); + EXPECT_EQ("2015-01-02T00:00", Format(civil_minute(2015, 1, 2))); + EXPECT_EQ("2015-01-01T00:00", Format(civil_minute(2015, 1))); + EXPECT_EQ("2015-01-01T00:00", Format(civil_minute(2015))); + + EXPECT_EQ("2015-01-02T03", Format(civil_hour(2015, 1, 2, 3, 4, 5))); + EXPECT_EQ("2015-01-02T03", Format(civil_hour(2015, 1, 2, 3, 4))); + EXPECT_EQ("2015-01-02T03", Format(civil_hour(2015, 1, 2, 3))); + EXPECT_EQ("2015-01-02T00", Format(civil_hour(2015, 1, 2))); + EXPECT_EQ("2015-01-01T00", Format(civil_hour(2015, 1))); + EXPECT_EQ("2015-01-01T00", Format(civil_hour(2015))); + + EXPECT_EQ("2015-01-02", Format(civil_day(2015, 1, 2, 3, 4, 5))); + EXPECT_EQ("2015-01-02", Format(civil_day(2015, 1, 2, 3, 4))); + EXPECT_EQ("2015-01-02", Format(civil_day(2015, 1, 2, 3))); + EXPECT_EQ("2015-01-02", Format(civil_day(2015, 1, 2))); + EXPECT_EQ("2015-01-01", Format(civil_day(2015, 1))); + EXPECT_EQ("2015-01-01", Format(civil_day(2015))); + + EXPECT_EQ("2015-01", Format(civil_month(2015, 1, 2, 3, 4, 5))); + EXPECT_EQ("2015-01", Format(civil_month(2015, 1, 2, 3, 4))); + EXPECT_EQ("2015-01", Format(civil_month(2015, 1, 2, 3))); + EXPECT_EQ("2015-01", Format(civil_month(2015, 1, 2))); + EXPECT_EQ("2015-01", Format(civil_month(2015, 1))); + EXPECT_EQ("2015-01", Format(civil_month(2015))); + + EXPECT_EQ("2015", Format(civil_year(2015, 1, 2, 3, 4, 5))); + EXPECT_EQ("2015", Format(civil_year(2015, 1, 2, 3, 4))); + EXPECT_EQ("2015", Format(civil_year(2015, 1, 2, 3))); + EXPECT_EQ("2015", Format(civil_year(2015, 1, 2))); + EXPECT_EQ("2015", Format(civil_year(2015, 1))); + EXPECT_EQ("2015", Format(civil_year(2015))); +} + +TEST(CivilTime, FieldsConstructionLimits) { + const int kIntMax = std::numeric_limits::max(); + EXPECT_EQ("2038-01-19T03:14:07", + Format(civil_second(1970, 1, 1, 0, 0, kIntMax))); + EXPECT_EQ("6121-02-11T05:21:07", + Format(civil_second(1970, 1, 1, 0, kIntMax, kIntMax))); + EXPECT_EQ("251104-11-20T12:21:07", + Format(civil_second(1970, 1, 1, kIntMax, kIntMax, kIntMax))); + EXPECT_EQ("6130715-05-30T12:21:07", + Format(civil_second(1970, 1, kIntMax, kIntMax, kIntMax, kIntMax))); + EXPECT_EQ( + "185087685-11-26T12:21:07", + Format(civil_second(1970, kIntMax, kIntMax, kIntMax, kIntMax, kIntMax))); + + const int kIntMin = std::numeric_limits::min(); + EXPECT_EQ("1901-12-13T20:45:52", + Format(civil_second(1970, 1, 1, 0, 0, kIntMin))); + EXPECT_EQ("-2182-11-20T18:37:52", + Format(civil_second(1970, 1, 1, 0, kIntMin, kIntMin))); + EXPECT_EQ("-247165-02-11T10:37:52", + Format(civil_second(1970, 1, 1, kIntMin, kIntMin, kIntMin))); + EXPECT_EQ("-6126776-08-01T10:37:52", + Format(civil_second(1970, 1, kIntMin, kIntMin, kIntMin, kIntMin))); + EXPECT_EQ( + "-185083747-10-31T10:37:52", + Format(civil_second(1970, kIntMin, kIntMin, kIntMin, kIntMin, kIntMin))); +} + +TEST(CivilTime, ImplicitCrossAlignment) { + civil_year year(2015); + civil_month month = year; + civil_day day = month; + civil_hour hour = day; + civil_minute minute = hour; + civil_second second = minute; + + second = year; + EXPECT_EQ(second, year); + second = month; + EXPECT_EQ(second, month); + second = day; + EXPECT_EQ(second, day); + second = hour; + EXPECT_EQ(second, hour); + second = minute; + EXPECT_EQ(second, minute); + + minute = year; + EXPECT_EQ(minute, year); + minute = month; + EXPECT_EQ(minute, month); + minute = day; + EXPECT_EQ(minute, day); + minute = hour; + EXPECT_EQ(minute, hour); + + hour = year; + EXPECT_EQ(hour, year); + hour = month; + EXPECT_EQ(hour, month); + hour = day; + EXPECT_EQ(hour, day); + + day = year; + EXPECT_EQ(day, year); + day = month; + EXPECT_EQ(day, month); + + month = year; + EXPECT_EQ(month, year); + + // Ensures unsafe conversions are not allowed. + EXPECT_FALSE((std::is_convertible::value)); + EXPECT_FALSE((std::is_convertible::value)); + EXPECT_FALSE((std::is_convertible::value)); + EXPECT_FALSE((std::is_convertible::value)); + EXPECT_FALSE((std::is_convertible::value)); + + EXPECT_FALSE((std::is_convertible::value)); + EXPECT_FALSE((std::is_convertible::value)); + EXPECT_FALSE((std::is_convertible::value)); + EXPECT_FALSE((std::is_convertible::value)); + + EXPECT_FALSE((std::is_convertible::value)); + EXPECT_FALSE((std::is_convertible::value)); + EXPECT_FALSE((std::is_convertible::value)); + + EXPECT_FALSE((std::is_convertible::value)); + EXPECT_FALSE((std::is_convertible::value)); + + EXPECT_FALSE((std::is_convertible::value)); +} + +TEST(CivilTime, ExplicitCrossAlignment) { + // + // Assign from smaller units -> larger units + // + + civil_second second(2015, 1, 2, 3, 4, 5); + EXPECT_EQ("2015-01-02T03:04:05", Format(second)); + + civil_minute minute(second); + EXPECT_EQ("2015-01-02T03:04", Format(minute)); + + civil_hour hour(minute); + EXPECT_EQ("2015-01-02T03", Format(hour)); + + civil_day day(hour); + EXPECT_EQ("2015-01-02", Format(day)); + + civil_month month(day); + EXPECT_EQ("2015-01", Format(month)); + + civil_year year(month); + EXPECT_EQ("2015", Format(year)); + + // + // Now assign from larger units -> smaller units + // + + month = civil_month(year); + EXPECT_EQ("2015-01", Format(month)); + + day = civil_day(month); + EXPECT_EQ("2015-01-01", Format(day)); + + hour = civil_hour(day); + EXPECT_EQ("2015-01-01T00", Format(hour)); + + minute = civil_minute(hour); + EXPECT_EQ("2015-01-01T00:00", Format(minute)); + + second = civil_second(minute); + EXPECT_EQ("2015-01-01T00:00:00", Format(second)); +} + +// Metafunction to test whether difference is allowed between two types. +template +struct HasDifference { + template + static std::false_type test(...); + template + static std::true_type test(decltype(std::declval() - std::declval())); + static constexpr bool value = decltype(test(0))::value; +}; + +TEST(CivilTime, DisallowCrossAlignedDifference) { + // Difference is allowed between types with the same alignment. + static_assert(HasDifference::value, ""); + static_assert(HasDifference::value, ""); + static_assert(HasDifference::value, ""); + static_assert(HasDifference::value, ""); + static_assert(HasDifference::value, ""); + static_assert(HasDifference::value, ""); + + // Difference is disallowed between types with different alignments. + static_assert(!HasDifference::value, ""); + static_assert(!HasDifference::value, ""); + static_assert(!HasDifference::value, ""); + static_assert(!HasDifference::value, ""); + static_assert(!HasDifference::value, ""); + + static_assert(!HasDifference::value, ""); + static_assert(!HasDifference::value, ""); + static_assert(!HasDifference::value, ""); + static_assert(!HasDifference::value, ""); + + static_assert(!HasDifference::value, ""); + static_assert(!HasDifference::value, ""); + static_assert(!HasDifference::value, ""); + + static_assert(!HasDifference::value, ""); + static_assert(!HasDifference::value, ""); + + static_assert(!HasDifference::value, ""); +} + +TEST(CivilTime, ValueSemantics) { + const civil_hour a(2015, 1, 2, 3); + const civil_hour b = a; + const civil_hour c(b); + civil_hour d; + d = c; + EXPECT_EQ("2015-01-02T03", Format(d)); +} + +TEST(CivilTime, Relational) { + // Tests that the alignment unit is ignored in comparison. + const civil_year year(2014); + const civil_month month(year); + EXPECT_EQ(year, month); + +#define TEST_RELATIONAL(OLDER, YOUNGER) \ + do { \ + EXPECT_FALSE(OLDER < OLDER); \ + EXPECT_FALSE(OLDER > OLDER); \ + EXPECT_TRUE(OLDER >= OLDER); \ + EXPECT_TRUE(OLDER <= OLDER); \ + EXPECT_FALSE(YOUNGER < YOUNGER); \ + EXPECT_FALSE(YOUNGER > YOUNGER); \ + EXPECT_TRUE(YOUNGER >= YOUNGER); \ + EXPECT_TRUE(YOUNGER <= YOUNGER); \ + EXPECT_EQ(OLDER, OLDER); \ + EXPECT_NE(OLDER, YOUNGER); \ + EXPECT_LT(OLDER, YOUNGER); \ + EXPECT_LE(OLDER, YOUNGER); \ + EXPECT_GT(YOUNGER, OLDER); \ + EXPECT_GE(YOUNGER, OLDER); \ + } while (0) + + // Alignment is ignored in comparison (verified above), so kSecond is used + // to test comparison in all field positions. + TEST_RELATIONAL(civil_second(2014, 1, 1, 0, 0, 0), + civil_second(2015, 1, 1, 0, 0, 0)); + TEST_RELATIONAL(civil_second(2014, 1, 1, 0, 0, 0), + civil_second(2014, 2, 1, 0, 0, 0)); + TEST_RELATIONAL(civil_second(2014, 1, 1, 0, 0, 0), + civil_second(2014, 1, 2, 0, 0, 0)); + TEST_RELATIONAL(civil_second(2014, 1, 1, 0, 0, 0), + civil_second(2014, 1, 1, 1, 0, 0)); + TEST_RELATIONAL(civil_second(2014, 1, 1, 1, 0, 0), + civil_second(2014, 1, 1, 1, 1, 0)); + TEST_RELATIONAL(civil_second(2014, 1, 1, 1, 1, 0), + civil_second(2014, 1, 1, 1, 1, 1)); + + // Tests the relational operators of two different CivilTime types. + TEST_RELATIONAL(civil_day(2014, 1, 1), civil_minute(2014, 1, 1, 1, 1)); + TEST_RELATIONAL(civil_day(2014, 1, 1), civil_month(2014, 2)); + +#undef TEST_RELATIONAL +} + +TEST(CivilTime, Arithmetic) { + civil_second second(2015, 1, 2, 3, 4, 5); + EXPECT_EQ("2015-01-02T03:04:06", Format(second += 1)); + EXPECT_EQ("2015-01-02T03:04:07", Format(second + 1)); + EXPECT_EQ("2015-01-02T03:04:08", Format(2 + second)); + EXPECT_EQ("2015-01-02T03:04:05", Format(second - 1)); + EXPECT_EQ("2015-01-02T03:04:05", Format(second -= 1)); + EXPECT_EQ("2015-01-02T03:04:05", Format(second++)); + EXPECT_EQ("2015-01-02T03:04:07", Format(++second)); + EXPECT_EQ("2015-01-02T03:04:07", Format(second--)); + EXPECT_EQ("2015-01-02T03:04:05", Format(--second)); + + civil_minute minute(2015, 1, 2, 3, 4); + EXPECT_EQ("2015-01-02T03:05", Format(minute += 1)); + EXPECT_EQ("2015-01-02T03:06", Format(minute + 1)); + EXPECT_EQ("2015-01-02T03:07", Format(2 + minute)); + EXPECT_EQ("2015-01-02T03:04", Format(minute - 1)); + EXPECT_EQ("2015-01-02T03:04", Format(minute -= 1)); + EXPECT_EQ("2015-01-02T03:04", Format(minute++)); + EXPECT_EQ("2015-01-02T03:06", Format(++minute)); + EXPECT_EQ("2015-01-02T03:06", Format(minute--)); + EXPECT_EQ("2015-01-02T03:04", Format(--minute)); + + civil_hour hour(2015, 1, 2, 3); + EXPECT_EQ("2015-01-02T04", Format(hour += 1)); + EXPECT_EQ("2015-01-02T05", Format(hour + 1)); + EXPECT_EQ("2015-01-02T06", Format(2 + hour)); + EXPECT_EQ("2015-01-02T03", Format(hour - 1)); + EXPECT_EQ("2015-01-02T03", Format(hour -= 1)); + EXPECT_EQ("2015-01-02T03", Format(hour++)); + EXPECT_EQ("2015-01-02T05", Format(++hour)); + EXPECT_EQ("2015-01-02T05", Format(hour--)); + EXPECT_EQ("2015-01-02T03", Format(--hour)); + + civil_day day(2015, 1, 2); + EXPECT_EQ("2015-01-03", Format(day += 1)); + EXPECT_EQ("2015-01-04", Format(day + 1)); + EXPECT_EQ("2015-01-05", Format(2 + day)); + EXPECT_EQ("2015-01-02", Format(day - 1)); + EXPECT_EQ("2015-01-02", Format(day -= 1)); + EXPECT_EQ("2015-01-02", Format(day++)); + EXPECT_EQ("2015-01-04", Format(++day)); + EXPECT_EQ("2015-01-04", Format(day--)); + EXPECT_EQ("2015-01-02", Format(--day)); + + civil_month month(2015, 1); + EXPECT_EQ("2015-02", Format(month += 1)); + EXPECT_EQ("2015-03", Format(month + 1)); + EXPECT_EQ("2015-04", Format(2 + month)); + EXPECT_EQ("2015-01", Format(month - 1)); + EXPECT_EQ("2015-01", Format(month -= 1)); + EXPECT_EQ("2015-01", Format(month++)); + EXPECT_EQ("2015-03", Format(++month)); + EXPECT_EQ("2015-03", Format(month--)); + EXPECT_EQ("2015-01", Format(--month)); + + civil_year year(2015); + EXPECT_EQ("2016", Format(year += 1)); + EXPECT_EQ("2017", Format(year + 1)); + EXPECT_EQ("2018", Format(2 + year)); + EXPECT_EQ("2015", Format(year - 1)); + EXPECT_EQ("2015", Format(year -= 1)); + EXPECT_EQ("2015", Format(year++)); + EXPECT_EQ("2017", Format(++year)); + EXPECT_EQ("2017", Format(year--)); + EXPECT_EQ("2015", Format(--year)); +} + +TEST(CivilTime, ArithmeticLimits) { + const int kIntMax = std::numeric_limits::max(); + const int kIntMin = std::numeric_limits::min(); + + civil_second second(1970, 1, 1, 0, 0, 0); + second += kIntMax; + EXPECT_EQ("2038-01-19T03:14:07", Format(second)); + second -= kIntMax; + EXPECT_EQ("1970-01-01T00:00:00", Format(second)); + second += kIntMin; + EXPECT_EQ("1901-12-13T20:45:52", Format(second)); + second -= kIntMin; + EXPECT_EQ("1970-01-01T00:00:00", Format(second)); + + civil_minute minute(1970, 1, 1, 0, 0); + minute += kIntMax; + EXPECT_EQ("6053-01-23T02:07", Format(minute)); + minute -= kIntMax; + EXPECT_EQ("1970-01-01T00:00", Format(minute)); + minute += kIntMin; + EXPECT_EQ("-2114-12-08T21:52", Format(minute)); + minute -= kIntMin; + EXPECT_EQ("1970-01-01T00:00", Format(minute)); + + civil_hour hour(1970, 1, 1, 0); + hour += kIntMax; + EXPECT_EQ("246953-10-09T07", Format(hour)); + hour -= kIntMax; + EXPECT_EQ("1970-01-01T00", Format(hour)); + hour += kIntMin; + EXPECT_EQ("-243014-03-24T16", Format(hour)); + hour -= kIntMin; + EXPECT_EQ("1970-01-01T00", Format(hour)); + + civil_day day(1970, 1, 1); + day += kIntMax; + EXPECT_EQ("5881580-07-11", Format(day)); + day -= kIntMax; + EXPECT_EQ("1970-01-01", Format(day)); + day += kIntMin; + EXPECT_EQ("-5877641-06-23", Format(day)); + day -= kIntMin; + EXPECT_EQ("1970-01-01", Format(day)); + + civil_month month(1970, 1); + month += kIntMax; + EXPECT_EQ("178958940-08", Format(month)); + month -= kIntMax; + EXPECT_EQ("1970-01", Format(month)); + month += kIntMin; + EXPECT_EQ("-178955001-05", Format(month)); + month -= kIntMin; + EXPECT_EQ("1970-01", Format(month)); + + civil_year year(0); + year += kIntMax; + EXPECT_EQ("2147483647", Format(year)); + year -= kIntMax; + EXPECT_EQ("0", Format(year)); + year += kIntMin; + EXPECT_EQ("-2147483648", Format(year)); + year -= kIntMin; + EXPECT_EQ("0", Format(year)); +} + +TEST(CivilTime, ArithmeticDifference) { + civil_second second(2015, 1, 2, 3, 4, 5); + EXPECT_EQ(0, second - second); + EXPECT_EQ(10, (second + 10) - second); + EXPECT_EQ(-10, (second - 10) - second); + + civil_minute minute(2015, 1, 2, 3, 4); + EXPECT_EQ(0, minute - minute); + EXPECT_EQ(10, (minute + 10) - minute); + EXPECT_EQ(-10, (minute - 10) - minute); + + civil_hour hour(2015, 1, 2, 3); + EXPECT_EQ(0, hour - hour); + EXPECT_EQ(10, (hour + 10) - hour); + EXPECT_EQ(-10, (hour - 10) - hour); + + civil_day day(2015, 1, 2); + EXPECT_EQ(0, day - day); + EXPECT_EQ(10, (day + 10) - day); + EXPECT_EQ(-10, (day - 10) - day); + + civil_month month(2015, 1); + EXPECT_EQ(0, month - month); + EXPECT_EQ(10, (month + 10) - month); + EXPECT_EQ(-10, (month - 10) - month); + + civil_year year(2015); + EXPECT_EQ(0, year - year); + EXPECT_EQ(10, (year + 10) - year); + EXPECT_EQ(-10, (year - 10) - year); +} + +TEST(CivilTime, DifferenceLimits) { + const int kIntMax = std::numeric_limits::max(); + const int kIntMin = std::numeric_limits::min(); + + // Check day arithmetic at the end of the year range. + const civil_day max_day(kIntMax, 12, 31); + EXPECT_EQ(1, max_day - (max_day - 1)); + EXPECT_EQ(-1, (max_day - 1) - max_day); + + // Check day arithmetic at the end of the year range. + const civil_day min_day(kIntMin, 1, 1); + EXPECT_EQ(1, (min_day + 1) - min_day); + EXPECT_EQ(-1, min_day - (min_day + 1)); + + // Check the limits of the return value. + const civil_day d1(1970, 1, 1); + const civil_day d2(5881580, 7, 11); + EXPECT_EQ(kIntMax, d2 - d1); + EXPECT_EQ(kIntMin, d1 - (d2 + 1)); +} + +TEST(CivilTime, Properties) { + civil_second ss(2015, 2, 3, 4, 5, 6); + EXPECT_EQ(2015, ss.year()); + EXPECT_EQ(2, ss.month()); + EXPECT_EQ(3, ss.day()); + EXPECT_EQ(4, ss.hour()); + EXPECT_EQ(5, ss.minute()); + EXPECT_EQ(6, ss.second()); + + civil_minute mm(2015, 2, 3, 4, 5, 6); + EXPECT_EQ(2015, mm.year()); + EXPECT_EQ(2, mm.month()); + EXPECT_EQ(3, mm.day()); + EXPECT_EQ(4, mm.hour()); + EXPECT_EQ(5, mm.minute()); + EXPECT_EQ(0, mm.second()); + + civil_hour hh(2015, 2, 3, 4, 5, 6); + EXPECT_EQ(2015, hh.year()); + EXPECT_EQ(2, hh.month()); + EXPECT_EQ(3, hh.day()); + EXPECT_EQ(4, hh.hour()); + EXPECT_EQ(0, hh.minute()); + EXPECT_EQ(0, hh.second()); + + civil_day d(2015, 2, 3, 4, 5, 6); + EXPECT_EQ(2015, d.year()); + EXPECT_EQ(2, d.month()); + EXPECT_EQ(3, d.day()); + EXPECT_EQ(0, d.hour()); + EXPECT_EQ(0, d.minute()); + EXPECT_EQ(0, d.second()); + EXPECT_EQ(weekday::tuesday, get_weekday(d)); + EXPECT_EQ(34, get_yearday(d)); + + civil_month m(2015, 2, 3, 4, 5, 6); + EXPECT_EQ(2015, m.year()); + EXPECT_EQ(2, m.month()); + EXPECT_EQ(1, m.day()); + EXPECT_EQ(0, m.hour()); + EXPECT_EQ(0, m.minute()); + EXPECT_EQ(0, m.second()); + + civil_year y(2015, 2, 3, 4, 5, 6); + EXPECT_EQ(2015, y.year()); + EXPECT_EQ(1, y.month()); + EXPECT_EQ(1, y.day()); + EXPECT_EQ(0, y.hour()); + EXPECT_EQ(0, y.minute()); + EXPECT_EQ(0, y.second()); +} + +TEST(CivilTime, OutputStream) { + // Tests formatting of civil_year, which does not pad. + EXPECT_EQ("2016", Format(civil_year(2016))); + EXPECT_EQ("123", Format(civil_year(123))); + EXPECT_EQ("0", Format(civil_year(0))); + EXPECT_EQ("-1", Format(civil_year(-1))); + + // Tests formatting of sub-year types, which pad to 2 digits + EXPECT_EQ("2016-02", Format(civil_month(2016, 2))); + EXPECT_EQ("2016-02-03", Format(civil_day(2016, 2, 3))); + EXPECT_EQ("2016-02-03T04", Format(civil_hour(2016, 2, 3, 4))); + EXPECT_EQ("2016-02-03T04:05", Format(civil_minute(2016, 2, 3, 4, 5))); + EXPECT_EQ("2016-02-03T04:05:06", Format(civil_second(2016, 2, 3, 4, 5, 6))); + + // Tests formatting of weekday. + EXPECT_EQ("Monday", Format(weekday::monday)); + EXPECT_EQ("Tuesday", Format(weekday::tuesday)); + EXPECT_EQ("Wednesday", Format(weekday::wednesday)); + EXPECT_EQ("Thursday", Format(weekday::thursday)); + EXPECT_EQ("Friday", Format(weekday::friday)); + EXPECT_EQ("Saturday", Format(weekday::saturday)); + EXPECT_EQ("Sunday", Format(weekday::sunday)); +} + +TEST(CivilTime, OutputStreamLeftFillWidth) { + civil_second cs(2016, 2, 3, 4, 5, 6); + { + std::stringstream ss; + ss << std::left << std::setfill('.'); + ss << std::setw(3) << 'X'; + ss << std::setw(21) << civil_year(cs); + ss << std::setw(3) << 'X'; + EXPECT_EQ("X..2016.................X..", ss.str()); + } + { + std::stringstream ss; + ss << std::left << std::setfill('.'); + ss << std::setw(3) << 'X'; + ss << std::setw(21) << civil_month(cs); + ss << std::setw(3) << 'X'; + EXPECT_EQ("X..2016-02..............X..", ss.str()); + } + { + std::stringstream ss; + ss << std::left << std::setfill('.'); + ss << std::setw(3) << 'X'; + ss << std::setw(21) << civil_day(cs); + ss << std::setw(3) << 'X'; + EXPECT_EQ("X..2016-02-03...........X..", ss.str()); + } + { + std::stringstream ss; + ss << std::left << std::setfill('.'); + ss << std::setw(3) << 'X'; + ss << std::setw(21) << civil_hour(cs); + ss << std::setw(3) << 'X'; + EXPECT_EQ("X..2016-02-03T04........X..", ss.str()); + } + { + std::stringstream ss; + ss << std::left << std::setfill('.'); + ss << std::setw(3) << 'X'; + ss << std::setw(21) << civil_minute(cs); + ss << std::setw(3) << 'X'; + EXPECT_EQ("X..2016-02-03T04:05.....X..", ss.str()); + } + { + std::stringstream ss; + ss << std::left << std::setfill('.'); + ss << std::setw(3) << 'X'; + ss << std::setw(21) << civil_second(cs); + ss << std::setw(3) << 'X'; + EXPECT_EQ("X..2016-02-03T04:05:06..X..", ss.str()); + } +} + +TEST(CivilTime, NextPrevWeekday) { + // Jan 1, 1970 was a Thursday. + const civil_day thursday(1970, 1, 1); + EXPECT_EQ(weekday::thursday, get_weekday(thursday)); + + // Thursday -> Thursday + civil_day d = next_weekday(thursday, weekday::thursday); + EXPECT_EQ(7, d - thursday) << Format(d); + EXPECT_EQ(d - 14, prev_weekday(thursday, weekday::thursday)); + + // Thursday -> Friday + d = next_weekday(thursday, weekday::friday); + EXPECT_EQ(1, d - thursday) << Format(d); + EXPECT_EQ(d - 7, prev_weekday(thursday, weekday::friday)); + + // Thursday -> Saturday + d = next_weekday(thursday, weekday::saturday); + EXPECT_EQ(2, d - thursday) << Format(d); + EXPECT_EQ(d - 7, prev_weekday(thursday, weekday::saturday)); + + // Thursday -> Sunday + d = next_weekday(thursday, weekday::sunday); + EXPECT_EQ(3, d - thursday) << Format(d); + EXPECT_EQ(d - 7, prev_weekday(thursday, weekday::sunday)); + + // Thursday -> Monday + d = next_weekday(thursday, weekday::monday); + EXPECT_EQ(4, d - thursday) << Format(d); + EXPECT_EQ(d - 7, prev_weekday(thursday, weekday::monday)); + + // Thursday -> Tuesday + d = next_weekday(thursday, weekday::tuesday); + EXPECT_EQ(5, d - thursday) << Format(d); + EXPECT_EQ(d - 7, prev_weekday(thursday, weekday::tuesday)); + + // Thursday -> Wednesday + d = next_weekday(thursday, weekday::wednesday); + EXPECT_EQ(6, d - thursday) << Format(d); + EXPECT_EQ(d - 7, prev_weekday(thursday, weekday::wednesday)); +} + +TEST(CivilTime, NormalizeWithHugeYear) { + civil_month c(9223372036854775807, 1); + EXPECT_EQ("9223372036854775807-01", Format(c)); + c = c - 1; // Causes normalization + EXPECT_EQ("9223372036854775806-12", Format(c)); + + c = civil_month(-9223372036854775807 - 1, 1); + EXPECT_EQ("-9223372036854775808-01", Format(c)); + c = c + 12; // Causes normalization + EXPECT_EQ("-9223372036854775807-01", Format(c)); +} + +TEST(CivilTime, LeapYears) { + // Test data for leap years. + const struct { + int year; + int days; + struct { + int month; + int day; + } leap_day; // The date of the day after Feb 28. + } kLeapYearTable[]{ + {1900, 365, {3, 1}}, + {1999, 365, {3, 1}}, + {2000, 366, {2, 29}}, // leap year + {2001, 365, {3, 1}}, + {2002, 365, {3, 1}}, + {2003, 365, {3, 1}}, + {2004, 366, {2, 29}}, // leap year + {2005, 365, {3, 1}}, + {2006, 365, {3, 1}}, + {2007, 365, {3, 1}}, + {2008, 366, {2, 29}}, // leap year + {2009, 365, {3, 1}}, + {2100, 365, {3, 1}}, + }; + + for (const auto& e : kLeapYearTable) { + // Tests incrementing through the leap day. + const civil_day feb28(e.year, 2, 28); + const civil_day next_day = feb28 + 1; + EXPECT_EQ(e.leap_day.month, next_day.month()); + EXPECT_EQ(e.leap_day.day, next_day.day()); + + // Tests difference in days of leap years. + const civil_year year(feb28); + const civil_year next_year = year + 1; + EXPECT_EQ(e.days, civil_day(next_year) - civil_day(year)); + } +} + +TEST(CivilTime, FirstThursdayInMonth) { + const civil_day nov1(2014, 11, 1); + const civil_day thursday = prev_weekday(nov1, weekday::thursday) + 7; + EXPECT_EQ("2014-11-06", Format(thursday)); + + // Bonus: Date of Thanksgiving in the United States + // Rule: Fourth Thursday of November + const civil_day thanksgiving = thursday + 7 * 3; + EXPECT_EQ("2014-11-27", Format(thanksgiving)); +} + +} // namespace cctz +} // namespace time_internal +} // namespace absl diff --git a/absl/time/internal/cctz/src/time_zone_fixed.cc b/absl/time/internal/cctz/src/time_zone_fixed.cc new file mode 100644 index 000000000..8d3b14425 --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_fixed.cc @@ -0,0 +1,133 @@ +// Copyright 2016 Google Inc. 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. + +#include "time_zone_fixed.h" + +#include +#include +#include +#include +#include + +namespace absl { +namespace time_internal { +namespace cctz { + +namespace { + +// The prefix used for the internal names of fixed-offset zones. +const char kFixedOffsetPrefix[] = "Fixed/"; + +int Parse02d(const char* p) { + static const char kDigits[] = "0123456789"; + if (const char* ap = std::strchr(kDigits, *p)) { + int v = static_cast(ap - kDigits); + if (const char* bp = std::strchr(kDigits, *++p)) { + return (v * 10) + static_cast(bp - kDigits); + } + } + return -1; +} + +} // namespace + +bool FixedOffsetFromName(const std::string& name, sys_seconds* offset) { + if (name.compare(0, std::string::npos, "UTC", 3) == 0) { + *offset = sys_seconds::zero(); + return true; + } + + const std::size_t prefix_len = sizeof(kFixedOffsetPrefix) - 1; + const char* const ep = kFixedOffsetPrefix + prefix_len; + if (name.size() != prefix_len + 12) // "UTC+99:99:99" + return false; + if (!std::equal(kFixedOffsetPrefix, ep, name.begin())) + return false; + const char* np = name.data() + prefix_len; + if (*np++ != 'U' || *np++ != 'T' || *np++ != 'C') + return false; + if (np[0] != '+' && np[0] != '-') + return false; + if (np[3] != ':' || np[6] != ':') // see note below about large offsets + return false; + + int hours = Parse02d(np + 1); + if (hours == -1) return false; + int mins = Parse02d(np + 4); + if (mins == -1) return false; + int secs = Parse02d(np + 7); + if (secs == -1) return false; + + secs += ((hours * 60) + mins) * 60; + if (secs > 24 * 60 * 60) return false; // outside supported offset range + *offset = sys_seconds(secs * (np[0] == '-' ? -1 : 1)); // "-" means west + return true; +} + +std::string FixedOffsetToName(const sys_seconds& offset) { + if (offset == sys_seconds::zero()) return "UTC"; + if (offset < std::chrono::hours(-24) || offset > std::chrono::hours(24)) { + // We don't support fixed-offset zones more than 24 hours + // away from UTC to avoid complications in rendering such + // offsets and to (somewhat) limit the total number of zones. + return "UTC"; + } + int seconds = static_cast(offset.count()); + const char sign = (seconds < 0 ? '-' : '+'); + int minutes = seconds / 60; + seconds %= 60; + if (sign == '-') { + if (seconds > 0) { + seconds -= 60; + minutes += 1; + } + seconds = -seconds; + minutes = -minutes; + } + int hours = minutes / 60; + minutes %= 60; + char buf[sizeof(kFixedOffsetPrefix) + sizeof("UTC-24:00:00")]; + snprintf(buf, sizeof(buf), "%sUTC%c%02d:%02d:%02d", + kFixedOffsetPrefix, sign, hours, minutes, seconds); + return buf; +} + +std::string FixedOffsetToAbbr(const sys_seconds& offset) { + std::string abbr = FixedOffsetToName(offset); + const std::size_t prefix_len = sizeof(kFixedOffsetPrefix) - 1; + const char* const ep = kFixedOffsetPrefix + prefix_len; + if (abbr.size() >= prefix_len) { + if (std::equal(kFixedOffsetPrefix, ep, abbr.begin())) { + abbr.erase(0, prefix_len); + if (abbr.size() == 12) { // UTC+99:99:99 + abbr.erase(9, 1); // UTC+99:9999 + abbr.erase(6, 1); // UTC+999999 + if (abbr[8] == '0' && abbr[9] == '0') { // UTC+999900 + abbr.erase(8, 2); // UTC+9999 + if (abbr[6] == '0' && abbr[7] == '0') { // UTC+9900 + abbr.erase(6, 2); // UTC+99 + if (abbr[4] == '0') { // UTC+09 + abbr.erase(4, 1); // UTC+9 + } + } + } + } + } + } + return abbr; +} + +} // namespace cctz +} // namespace time_internal +} // namespace absl diff --git a/absl/time/internal/cctz/src/time_zone_fixed.h b/absl/time/internal/cctz/src/time_zone_fixed.h new file mode 100644 index 000000000..7c9d11db9 --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_fixed.h @@ -0,0 +1,49 @@ +// Copyright 2016 Google Inc. 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. + +#ifndef ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_FIXED_H_ +#define ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_FIXED_H_ + +#include + +#include "absl/time/internal/cctz/include/cctz/time_zone.h" + +namespace absl { +namespace time_internal { +namespace cctz { + +// Helper functions for dealing with the names and abbreviations +// of time zones that are a fixed offset (seconds east) from UTC. +// FixedOffsetFromName() extracts the offset from a valid fixed-offset +// name, while FixedOffsetToName() and FixedOffsetToAbbr() generate +// the canonical zone name and abbreviation respectively for the given +// offset. +// +// A fixed-offset name looks like "Fixed/UTC<+->::". +// Its abbreviation is of the form "UTC(<+->H?H(MM(SS)?)?)?" where the +// optional pieces are omitted when their values are zero. (Note that +// the sign is the opposite of that used in a POSIX TZ specification.) +// +// Note: FixedOffsetFromName() fails on syntax errors or when the parsed +// offset exceeds 24 hours. FixedOffsetToName() and FixedOffsetToAbbr() +// both produce "UTC" when the argument offset exceeds 24 hours. +bool FixedOffsetFromName(const std::string& name, sys_seconds* offset); +std::string FixedOffsetToName(const sys_seconds& offset); +std::string FixedOffsetToAbbr(const sys_seconds& offset); + +} // namespace cctz +} // namespace time_internal +} // namespace absl + +#endif // ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_FIXED_H_ diff --git a/absl/time/internal/cctz/src/time_zone_format.cc b/absl/time/internal/cctz/src/time_zone_format.cc new file mode 100644 index 000000000..6d5ccba1c --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_format.cc @@ -0,0 +1,848 @@ +// Copyright 2016 Google Inc. 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. + +#if !defined(HAS_STRPTIME) +# if !defined(_MSC_VER) +# define HAS_STRPTIME 1 // assume everyone has strptime() except windows +# endif +#endif + +#include "absl/time/internal/cctz/include/cctz/time_zone.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if !HAS_STRPTIME +#include +#include +#endif + +#include "absl/time/internal/cctz/include/cctz/civil_time.h" +#include "time_zone_if.h" + +namespace absl { +namespace time_internal { +namespace cctz { +namespace detail { + +namespace { + +#if !HAS_STRPTIME +// Build a strptime() using C++11's std::get_time(). +char* strptime(const char* s, const char* fmt, std::tm* tm) { + std::istringstream input(s); + input >> std::get_time(tm, fmt); + if (input.fail()) return nullptr; + return const_cast(s) + + (input.eof() ? strlen(s) : static_cast(input.tellg())); +} +#endif + +std::tm ToTM(const time_zone::absolute_lookup& al) { + std::tm tm{}; + tm.tm_sec = al.cs.second(); + tm.tm_min = al.cs.minute(); + tm.tm_hour = al.cs.hour(); + tm.tm_mday = al.cs.day(); + tm.tm_mon = al.cs.month() - 1; + + // Saturate tm.tm_year is cases of over/underflow. + if (al.cs.year() < std::numeric_limits::min() + 1900) { + tm.tm_year = std::numeric_limits::min(); + } else if (al.cs.year() - 1900 > std::numeric_limits::max()) { + tm.tm_year = std::numeric_limits::max(); + } else { + tm.tm_year = static_cast(al.cs.year() - 1900); + } + + switch (get_weekday(civil_day(al.cs))) { + case weekday::sunday: + tm.tm_wday = 0; + break; + case weekday::monday: + tm.tm_wday = 1; + break; + case weekday::tuesday: + tm.tm_wday = 2; + break; + case weekday::wednesday: + tm.tm_wday = 3; + break; + case weekday::thursday: + tm.tm_wday = 4; + break; + case weekday::friday: + tm.tm_wday = 5; + break; + case weekday::saturday: + tm.tm_wday = 6; + break; + } + tm.tm_yday = get_yearday(civil_day(al.cs)) - 1; + tm.tm_isdst = al.is_dst ? 1 : 0; + return tm; +} + +const char kDigits[] = "0123456789"; + +// Formats a 64-bit integer in the given field width. Note that it is up +// to the caller of Format64() [and Format02d()/FormatOffset()] to ensure +// that there is sufficient space before ep to hold the conversion. +char* Format64(char* ep, int width, std::int_fast64_t v) { + bool neg = false; + if (v < 0) { + --width; + neg = true; + if (v == std::numeric_limits::min()) { + // Avoid negating minimum value. + std::int_fast64_t last_digit = -(v % 10); + v /= 10; + if (last_digit < 0) { + ++v; + last_digit += 10; + } + --width; + *--ep = kDigits[last_digit]; + } + v = -v; + } + do { + --width; + *--ep = kDigits[v % 10]; + } while (v /= 10); + while (--width >= 0) *--ep = '0'; // zero pad + if (neg) *--ep = '-'; + return ep; +} + +// Formats [0 .. 99] as %02d. +char* Format02d(char* ep, int v) { + *--ep = kDigits[v % 10]; + *--ep = kDigits[(v / 10) % 10]; + return ep; +} + +// Formats a UTC offset, like +00:00. +char* FormatOffset(char* ep, int offset, const char* mode) { + char sign = '+'; + if (offset < 0) { + offset = -offset; // bounded by 24h so no overflow + sign = '-'; + } + char sep = mode[0]; + if (sep != '\0' && mode[1] == '*') { + ep = Format02d(ep, offset % 60); + *--ep = sep; + } + int minutes = offset / 60; + ep = Format02d(ep, minutes % 60); + if (sep != '\0') *--ep = sep; + ep = Format02d(ep, minutes / 60); + *--ep = sign; + return ep; +} + +// Formats a std::tm using strftime(3). +void FormatTM(std::string* out, const std::string& fmt, const std::tm& tm) { + // strftime(3) returns the number of characters placed in the output + // array (which may be 0 characters). It also returns 0 to indicate + // an error, like the array wasn't large enough. To accommodate this, + // the following code grows the buffer size from 2x the format std::string + // length up to 32x. + for (std::size_t i = 2; i != 32; i *= 2) { + std::size_t buf_size = fmt.size() * i; + std::vector buf(buf_size); + if (std::size_t len = strftime(&buf[0], buf_size, fmt.c_str(), &tm)) { + out->append(&buf[0], len); + return; + } + } +} + +// Used for %E#S/%E#f specifiers and for data values in parse(). +template +const char* ParseInt(const char* dp, int width, T min, T max, T* vp) { + if (dp != nullptr) { + const T kmin = std::numeric_limits::min(); + bool erange = false; + bool neg = false; + T value = 0; + if (*dp == '-') { + neg = true; + if (width <= 0 || --width != 0) { + ++dp; + } else { + dp = nullptr; // width was 1 + } + } + if (const char* const bp = dp) { + while (const char* cp = strchr(kDigits, *dp)) { + int d = static_cast(cp - kDigits); + if (d >= 10) break; + if (value < kmin / 10) { + erange = true; + break; + } + value *= 10; + if (value < kmin + d) { + erange = true; + break; + } + value -= d; + dp += 1; + if (width > 0 && --width == 0) break; + } + if (dp != bp && !erange && (neg || value != kmin)) { + if (!neg || value != 0) { + if (!neg) value = -value; // make positive + if (min <= value && value <= max) { + *vp = value; + } else { + dp = nullptr; + } + } else { + dp = nullptr; + } + } else { + dp = nullptr; + } + } + } + return dp; +} + +// The number of base-10 digits that can be represented by a signed 64-bit +// integer. That is, 10^kDigits10_64 <= 2^63 - 1 < 10^(kDigits10_64 + 1). +const int kDigits10_64 = 18; + +// 10^n for everything that can be represented by a signed 64-bit integer. +const std::int_fast64_t kExp10[kDigits10_64 + 1] = { + 1, + 10, + 100, + 1000, + 10000, + 100000, + 1000000, + 10000000, + 100000000, + 1000000000, + 10000000000, + 100000000000, + 1000000000000, + 10000000000000, + 100000000000000, + 1000000000000000, + 10000000000000000, + 100000000000000000, + 1000000000000000000, +}; + +} // namespace + +// Uses strftime(3) to format the given Time. The following extended format +// specifiers are also supported: +// +// - %Ez - RFC3339-compatible numeric UTC offset (+hh:mm or -hh:mm) +// - %E*z - Full-resolution numeric UTC offset (+hh:mm:ss or -hh:mm:ss) +// - %E#S - Seconds with # digits of fractional precision +// - %E*S - Seconds with full fractional precision (a literal '*') +// - %E4Y - Four-character years (-999 ... -001, 0000, 0001 ... 9999) +// +// The standard specifiers from RFC3339_* (%Y, %m, %d, %H, %M, and %S) are +// handled internally for performance reasons. strftime(3) is slow due to +// a POSIX requirement to respect changes to ${TZ}. +// +// The TZ/GNU %s extension is handled internally because strftime() has +// to use mktime() to generate it, and that assumes the local time zone. +// +// We also handle the %z and %Z specifiers to accommodate platforms that do +// not support the tm_gmtoff and tm_zone extensions to std::tm. +// +// Requires that zero() <= fs < seconds(1). +std::string format(const std::string& format, const time_point& tp, + const detail::femtoseconds& fs, const time_zone& tz) { + std::string result; + result.reserve(format.size()); // A reasonable guess for the result size. + const time_zone::absolute_lookup al = tz.lookup(tp); + const std::tm tm = ToTM(al); + + // Scratch buffer for internal conversions. + char buf[3 + kDigits10_64]; // enough for longest conversion + char* const ep = buf + sizeof(buf); + char* bp; // works back from ep + + // Maintain three, disjoint subsequences that span format. + // [format.begin() ... pending) : already formatted into result + // [pending ... cur) : formatting pending, but no special cases + // [cur ... format.end()) : unexamined + // Initially, everything is in the unexamined part. + const char* pending = format.c_str(); // NUL terminated + const char* cur = pending; + const char* end = pending + format.length(); + + while (cur != end) { // while something is unexamined + // Moves cur to the next percent sign. + const char* start = cur; + while (cur != end && *cur != '%') ++cur; + + // If the new pending text is all ordinary, copy it out. + if (cur != start && pending == start) { + result.append(pending, static_cast(cur - pending)); + pending = start = cur; + } + + // Span the sequential percent signs. + const char* percent = cur; + while (cur != end && *cur == '%') ++cur; + + // If the new pending text is all percents, copy out one + // percent for every matched pair, then skip those pairs. + if (cur != start && pending == start) { + std::size_t escaped = static_cast(cur - pending) / 2; + result.append(pending, escaped); + pending += escaped * 2; + // Also copy out a single trailing percent. + if (pending != cur && cur == end) { + result.push_back(*pending++); + } + } + + // Loop unless we have an unescaped percent. + if (cur == end || (cur - percent) % 2 == 0) continue; + + // Simple specifiers that we handle ourselves. + if (strchr("YmdeHMSzZs%", *cur)) { + if (cur - 1 != pending) { + FormatTM(&result, std::string(pending, cur - 1), tm); + } + switch (*cur) { + case 'Y': + // This avoids the tm.tm_year overflow problem for %Y, however + // tm.tm_year will still be used by other specifiers like %D. + bp = Format64(ep, 0, al.cs.year()); + result.append(bp, static_cast(ep - bp)); + break; + case 'm': + bp = Format02d(ep, al.cs.month()); + result.append(bp, static_cast(ep - bp)); + break; + case 'd': + case 'e': + bp = Format02d(ep, al.cs.day()); + if (*cur == 'e' && *bp == '0') *bp = ' '; // for Windows + result.append(bp, static_cast(ep - bp)); + break; + case 'H': + bp = Format02d(ep, al.cs.hour()); + result.append(bp, static_cast(ep - bp)); + break; + case 'M': + bp = Format02d(ep, al.cs.minute()); + result.append(bp, static_cast(ep - bp)); + break; + case 'S': + bp = Format02d(ep, al.cs.second()); + result.append(bp, static_cast(ep - bp)); + break; + case 'z': + bp = FormatOffset(ep, al.offset, ""); + result.append(bp, static_cast(ep - bp)); + break; + case 'Z': + result.append(al.abbr); + break; + case 's': + bp = Format64(ep, 0, ToUnixSeconds(tp)); + result.append(bp, static_cast(ep - bp)); + break; + case '%': + result.push_back('%'); + break; + } + pending = ++cur; + continue; + } + + // Loop if there is no E modifier. + if (*cur != 'E' || ++cur == end) continue; + + // Format our extensions. + if (*cur == 'z') { + // Formats %Ez. + if (cur - 2 != pending) { + FormatTM(&result, std::string(pending, cur - 2), tm); + } + bp = FormatOffset(ep, al.offset, ":"); + result.append(bp, static_cast(ep - bp)); + pending = ++cur; + } else if (*cur == '*' && cur + 1 != end && *(cur + 1) == 'z') { + // Formats %E*z. + if (cur - 2 != pending) { + FormatTM(&result, std::string(pending, cur - 2), tm); + } + bp = FormatOffset(ep, al.offset, ":*"); + result.append(bp, static_cast(ep - bp)); + pending = cur += 2; + } else if (*cur == '*' && cur + 1 != end && + (*(cur + 1) == 'S' || *(cur + 1) == 'f')) { + // Formats %E*S or %E*F. + if (cur - 2 != pending) { + FormatTM(&result, std::string(pending, cur - 2), tm); + } + char* cp = ep; + bp = Format64(cp, 15, fs.count()); + while (cp != bp && cp[-1] == '0') --cp; + switch (*(cur + 1)) { + case 'S': + if (cp != bp) *--bp = '.'; + bp = Format02d(bp, al.cs.second()); + break; + case 'f': + if (cp == bp) *--bp = '0'; + break; + } + result.append(bp, static_cast(cp - bp)); + pending = cur += 2; + } else if (*cur == '4' && cur + 1 != end && *(cur + 1) == 'Y') { + // Formats %E4Y. + if (cur - 2 != pending) { + FormatTM(&result, std::string(pending, cur - 2), tm); + } + bp = Format64(ep, 4, al.cs.year()); + result.append(bp, static_cast(ep - bp)); + pending = cur += 2; + } else if (std::isdigit(*cur)) { + // Possibly found %E#S or %E#f. + int n = 0; + if (const char* np = ParseInt(cur, 0, 0, 1024, &n)) { + if (*np == 'S' || *np == 'f') { + // Formats %E#S or %E#f. + if (cur - 2 != pending) { + FormatTM(&result, std::string(pending, cur - 2), tm); + } + bp = ep; + if (n > 0) { + if (n > kDigits10_64) n = kDigits10_64; + bp = Format64(bp, n, (n > 15) ? fs.count() * kExp10[n - 15] + : fs.count() / kExp10[15 - n]); + if (*np == 'S') *--bp = '.'; + } + if (*np == 'S') bp = Format02d(bp, al.cs.second()); + result.append(bp, static_cast(ep - bp)); + pending = cur = ++np; + } + } + } + } + + // Formats any remaining data. + if (end != pending) { + FormatTM(&result, std::string(pending, end), tm); + } + + return result; +} + +namespace { + +const char* ParseOffset(const char* dp, const char* mode, int* offset) { + if (dp != nullptr) { + const char first = *dp++; + if (first == '+' || first == '-') { + char sep = mode[0]; + int hours = 0; + int minutes = 0; + int seconds = 0; + const char* ap = ParseInt(dp, 2, 0, 23, &hours); + if (ap != nullptr && ap - dp == 2) { + dp = ap; + if (sep != '\0' && *ap == sep) ++ap; + const char* bp = ParseInt(ap, 2, 0, 59, &minutes); + if (bp != nullptr && bp - ap == 2) { + dp = bp; + if (sep != '\0' && *bp == sep) ++bp; + const char* cp = ParseInt(bp, 2, 0, 59, &seconds); + if (cp != nullptr && cp - bp == 2) dp = cp; + } + *offset = ((hours * 60 + minutes) * 60) + seconds; + if (first == '-') *offset = -*offset; + } else { + dp = nullptr; + } + } else if (first == 'Z') { // Zulu + *offset = 0; + } else { + dp = nullptr; + } + } + return dp; +} + +const char* ParseZone(const char* dp, std::string* zone) { + zone->clear(); + if (dp != nullptr) { + while (*dp != '\0' && !std::isspace(*dp)) zone->push_back(*dp++); + if (zone->empty()) dp = nullptr; + } + return dp; +} + +const char* ParseSubSeconds(const char* dp, detail::femtoseconds* subseconds) { + if (dp != nullptr) { + std::int_fast64_t v = 0; + std::int_fast64_t exp = 0; + const char* const bp = dp; + while (const char* cp = strchr(kDigits, *dp)) { + int d = static_cast(cp - kDigits); + if (d >= 10) break; + if (exp < 15) { + exp += 1; + v *= 10; + v += d; + } + ++dp; + } + if (dp != bp) { + v *= kExp10[15 - exp]; + *subseconds = detail::femtoseconds(v); + } else { + dp = nullptr; + } + } + return dp; +} + +// Parses a std::string into a std::tm using strptime(3). +const char* ParseTM(const char* dp, const char* fmt, std::tm* tm) { + if (dp != nullptr) { + dp = strptime(dp, fmt, tm); + } + return dp; +} + +} // namespace + +// Uses strptime(3) to parse the given input. Supports the same extended +// format specifiers as format(), although %E#S and %E*S are treated +// identically (and similarly for %E#f and %E*f). %Ez and %E*z also accept +// the same inputs. +// +// The standard specifiers from RFC3339_* (%Y, %m, %d, %H, %M, and %S) are +// handled internally so that we can normally avoid strptime() altogether +// (which is particularly helpful when the native implementation is broken). +// +// The TZ/GNU %s extension is handled internally because strptime() has to +// use localtime_r() to generate it, and that assumes the local time zone. +// +// We also handle the %z specifier to accommodate platforms that do not +// support the tm_gmtoff extension to std::tm. %Z is parsed but ignored. +bool parse(const std::string& format, const std::string& input, + const time_zone& tz, time_point* sec, + detail::femtoseconds* fs, std::string* err) { + // The unparsed input. + const char* data = input.c_str(); // NUL terminated + + // Skips leading whitespace. + while (std::isspace(*data)) ++data; + + const year_t kyearmax = std::numeric_limits::max(); + const year_t kyearmin = std::numeric_limits::min(); + + // Sets default values for unspecified fields. + bool saw_year = false; + year_t year = 1970; + std::tm tm{}; + tm.tm_year = 1970 - 1900; + tm.tm_mon = 1 - 1; // Jan + tm.tm_mday = 1; + tm.tm_hour = 0; + tm.tm_min = 0; + tm.tm_sec = 0; + tm.tm_wday = 4; // Thu + tm.tm_yday = 0; + tm.tm_isdst = 0; + auto subseconds = detail::femtoseconds::zero(); + bool saw_offset = false; + int offset = 0; // No offset from passed tz. + std::string zone = "UTC"; + + const char* fmt = format.c_str(); // NUL terminated + bool twelve_hour = false; + bool afternoon = false; + + bool saw_percent_s = false; + std::int_fast64_t percent_s = 0; + + // Steps through format, one specifier at a time. + while (data != nullptr && *fmt != '\0') { + if (std::isspace(*fmt)) { + while (std::isspace(*data)) ++data; + while (std::isspace(*++fmt)) continue; + continue; + } + + if (*fmt != '%') { + if (*data == *fmt) { + ++data; + ++fmt; + } else { + data = nullptr; + } + continue; + } + + const char* percent = fmt; + if (*++fmt == '\0') { + data = nullptr; + continue; + } + switch (*fmt++) { + case 'Y': + // Symmetrically with FormatTime(), directly handing %Y avoids the + // tm.tm_year overflow problem. However, tm.tm_year will still be + // used by other specifiers like %D. + data = ParseInt(data, 0, kyearmin, kyearmax, &year); + if (data != nullptr) saw_year = true; + continue; + case 'm': + data = ParseInt(data, 2, 1, 12, &tm.tm_mon); + if (data != nullptr) tm.tm_mon -= 1; + continue; + case 'd': + case 'e': + data = ParseInt(data, 2, 1, 31, &tm.tm_mday); + continue; + case 'H': + data = ParseInt(data, 2, 0, 23, &tm.tm_hour); + twelve_hour = false; + continue; + case 'M': + data = ParseInt(data, 2, 0, 59, &tm.tm_min); + continue; + case 'S': + data = ParseInt(data, 2, 0, 60, &tm.tm_sec); + continue; + case 'I': + case 'l': + case 'r': // probably uses %I + twelve_hour = true; + break; + case 'R': // uses %H + case 'T': // uses %H + case 'c': // probably uses %H + case 'X': // probably uses %H + twelve_hour = false; + break; + case 'z': + data = ParseOffset(data, "", &offset); + if (data != nullptr) saw_offset = true; + continue; + case 'Z': // ignored; zone abbreviations are ambiguous + data = ParseZone(data, &zone); + continue; + case 's': + data = ParseInt(data, 0, + std::numeric_limits::min(), + std::numeric_limits::max(), + &percent_s); + if (data != nullptr) saw_percent_s = true; + continue; + case '%': + data = (*data == '%' ? data + 1 : nullptr); + continue; + case 'E': + if (*fmt == 'z' || (*fmt == '*' && *(fmt + 1) == 'z')) { + data = ParseOffset(data, ":", &offset); + if (data != nullptr) saw_offset = true; + fmt += (*fmt == 'z') ? 1 : 2; + continue; + } + if (*fmt == '*' && *(fmt + 1) == 'S') { + data = ParseInt(data, 2, 0, 60, &tm.tm_sec); + if (data != nullptr && *data == '.') { + data = ParseSubSeconds(data + 1, &subseconds); + } + fmt += 2; + continue; + } + if (*fmt == '*' && *(fmt + 1) == 'f') { + if (data != nullptr && std::isdigit(*data)) { + data = ParseSubSeconds(data, &subseconds); + } + fmt += 2; + continue; + } + if (*fmt == '4' && *(fmt + 1) == 'Y') { + const char* bp = data; + data = ParseInt(data, 4, year_t{-999}, year_t{9999}, &year); + if (data != nullptr) { + if (data - bp == 4) { + saw_year = true; + } else { + data = nullptr; // stopped too soon + } + } + fmt += 2; + continue; + } + if (std::isdigit(*fmt)) { + int n = 0; // value ignored + if (const char* np = ParseInt(fmt, 0, 0, 1024, &n)) { + if (*np == 'S') { + data = ParseInt(data, 2, 0, 60, &tm.tm_sec); + if (data != nullptr && *data == '.') { + data = ParseSubSeconds(data + 1, &subseconds); + } + fmt = ++np; + continue; + } + if (*np == 'f') { + if (data != nullptr && std::isdigit(*data)) { + data = ParseSubSeconds(data, &subseconds); + } + fmt = ++np; + continue; + } + } + } + if (*fmt == 'c') twelve_hour = false; // probably uses %H + if (*fmt == 'X') twelve_hour = false; // probably uses %H + if (*fmt != '\0') ++fmt; + break; + case 'O': + if (*fmt == 'H') twelve_hour = false; + if (*fmt == 'I') twelve_hour = true; + if (*fmt != '\0') ++fmt; + break; + } + + // Parses the current specifier. + const char* orig_data = data; + std::string spec(percent, static_cast(fmt - percent)); + data = ParseTM(data, spec.c_str(), &tm); + + // If we successfully parsed %p we need to remember whether the result + // was AM or PM so that we can adjust tm_hour before ConvertDateTime(). + // So reparse the input with a known AM hour, and check if it is shifted + // to a PM hour. + if (spec == "%p" && data != nullptr) { + std::string test_input = "1"; + test_input.append(orig_data, static_cast(data - orig_data)); + const char* test_data = test_input.c_str(); + std::tm tmp{}; + ParseTM(test_data, "%I%p", &tmp); + afternoon = (tmp.tm_hour == 13); + } + } + + // Adjust a 12-hour tm_hour value if it should be in the afternoon. + if (twelve_hour && afternoon && tm.tm_hour < 12) { + tm.tm_hour += 12; + } + + if (data == nullptr) { + if (err != nullptr) *err = "Failed to parse input"; + return false; + } + + // Skip any remaining whitespace. + while (std::isspace(*data)) ++data; + + // parse() must consume the entire input std::string. + if (*data != '\0') { + if (err != nullptr) *err = "Illegal trailing data in input string"; + return false; + } + + // If we saw %s then we ignore anything else and return that time. + if (saw_percent_s) { + *sec = FromUnixSeconds(percent_s); + *fs = detail::femtoseconds::zero(); + return true; + } + + // If we saw %z, %Ez, or %E*z then we want to interpret the parsed fields + // in UTC and then shift by that offset. Otherwise we want to interpret + // the fields directly in the passed time_zone. + time_zone ptz = saw_offset ? utc_time_zone() : tz; + + // Allows a leap second of 60 to normalize forward to the following ":00". + if (tm.tm_sec == 60) { + tm.tm_sec -= 1; + offset -= 1; + subseconds = detail::femtoseconds::zero(); + } + + if (!saw_year) { + year = year_t{tm.tm_year}; + if (year > kyearmax - 1900) { + // Platform-dependent, maybe unreachable. + if (err != nullptr) *err = "Out-of-range year"; + return false; + } + year += 1900; + } + + const int month = tm.tm_mon + 1; + civil_second cs(year, month, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); + + // parse() should not allow normalization. Due to the restricted field + // ranges above (see ParseInt()), the only possibility is for days to roll + // into months. That is, parsing "Sep 31" should not produce "Oct 1". + if (cs.month() != month || cs.day() != tm.tm_mday) { + if (err != nullptr) *err = "Out-of-range field"; + return false; + } + + // Accounts for the offset adjustment before converting to absolute time. + if ((offset < 0 && cs > civil_second::max() + offset) || + (offset > 0 && cs < civil_second::min() + offset)) { + if (err != nullptr) *err = "Out-of-range field"; + return false; + } + cs -= offset; + + const auto tp = ptz.lookup(cs).pre; + // Checks for overflow/underflow and returns an error as necessary. + if (tp == time_point::max()) { + const auto al = ptz.lookup(time_point::max()); + if (cs > al.cs) { + if (err != nullptr) *err = "Out-of-range field"; + return false; + } + } + if (tp == time_point::min()) { + const auto al = ptz.lookup(time_point::min()); + if (cs < al.cs) { + if (err != nullptr) *err = "Out-of-range field"; + return false; + } + } + + *sec = tp; + *fs = subseconds; + return true; +} + +} // namespace detail +} // namespace cctz +} // namespace time_internal +} // namespace absl diff --git a/absl/time/internal/cctz/src/time_zone_format_test.cc b/absl/time/internal/cctz/src/time_zone_format_test.cc new file mode 100644 index 000000000..6cea0360d --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_format_test.cc @@ -0,0 +1,1408 @@ +// Copyright 2016 Google Inc. 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. + +#include "absl/time/internal/cctz/include/cctz/time_zone.h" + +#include +#include +#include +#include + +#include "absl/time/internal/cctz/include/cctz/civil_time.h" +#include "gmock/gmock.h" +#include "gtest/gtest.h" + +using std::chrono::time_point_cast; +using std::chrono::system_clock; +using std::chrono::nanoseconds; +using std::chrono::microseconds; +using std::chrono::milliseconds; +using std::chrono::seconds; +using std::chrono::minutes; +using std::chrono::hours; +using testing::HasSubstr; + +namespace absl { +namespace time_internal { +namespace cctz { + +namespace { + +// This helper is a macro so that failed expectations show up with the +// correct line numbers. +#define ExpectTime(tp, tz, y, m, d, hh, mm, ss, off, isdst, zone) \ + do { \ + time_zone::absolute_lookup al = tz.lookup(tp); \ + EXPECT_EQ(y, al.cs.year()); \ + EXPECT_EQ(m, al.cs.month()); \ + EXPECT_EQ(d, al.cs.day()); \ + EXPECT_EQ(hh, al.cs.hour()); \ + EXPECT_EQ(mm, al.cs.minute()); \ + EXPECT_EQ(ss, al.cs.second()); \ + EXPECT_EQ(off, al.offset); \ + EXPECT_TRUE(isdst == al.is_dst); \ + EXPECT_STREQ(zone, al.abbr); \ + } while (0) + +const char RFC3339_full[] = "%Y-%m-%dT%H:%M:%E*S%Ez"; +const char RFC3339_sec[] = "%Y-%m-%dT%H:%M:%S%Ez"; + +const char RFC1123_full[] = "%a, %d %b %Y %H:%M:%S %z"; +const char RFC1123_no_wday[] = "%d %b %Y %H:%M:%S %z"; + +// A helper that tests the given format specifier by itself, and with leading +// and trailing characters. For example: TestFormatSpecifier(tp, "%a", "Thu"). +template +void TestFormatSpecifier(time_point tp, time_zone tz, const std::string& fmt, + const std::string& ans) { + EXPECT_EQ(ans, format(fmt, tp, tz)) << fmt; + EXPECT_EQ("xxx " + ans, format("xxx " + fmt, tp, tz)); + EXPECT_EQ(ans + " yyy", format(fmt + " yyy", tp, tz)); + EXPECT_EQ("xxx " + ans + " yyy", format("xxx " + fmt + " yyy", tp, tz)); +} + +} // namespace + +// +// Testing format() +// + +TEST(Format, TimePointResolution) { + const char kFmt[] = "%H:%M:%E*S"; + const time_zone utc = utc_time_zone(); + const time_point t0 = system_clock::from_time_t(1420167845) + + milliseconds(123) + microseconds(456) + + nanoseconds(789); + EXPECT_EQ("03:04:05.123456789", + format(kFmt, time_point_cast(t0), utc)); + EXPECT_EQ("03:04:05.123456", + format(kFmt, time_point_cast(t0), utc)); + EXPECT_EQ("03:04:05.123", + format(kFmt, time_point_cast(t0), utc)); + EXPECT_EQ("03:04:05", + format(kFmt, time_point_cast(t0), utc)); + EXPECT_EQ("03:04:05", + format(kFmt, time_point_cast(t0), utc)); + EXPECT_EQ("03:04:00", + format(kFmt, time_point_cast(t0), utc)); + EXPECT_EQ("03:00:00", + format(kFmt, time_point_cast(t0), utc)); +} + +TEST(Format, TimePointExtendedResolution) { + const char kFmt[] = "%H:%M:%E*S"; + const time_zone utc = utc_time_zone(); + const time_point tp = + std::chrono::time_point_cast( + std::chrono::system_clock::from_time_t(0)) + + std::chrono::hours(12) + std::chrono::minutes(34) + + std::chrono::seconds(56); + + EXPECT_EQ( + "12:34:56.123456789012345", + detail::format(kFmt, tp, detail::femtoseconds(123456789012345), utc)); + EXPECT_EQ( + "12:34:56.012345678901234", + detail::format(kFmt, tp, detail::femtoseconds(12345678901234), utc)); + EXPECT_EQ( + "12:34:56.001234567890123", + detail::format(kFmt, tp, detail::femtoseconds(1234567890123), utc)); + EXPECT_EQ( + "12:34:56.000123456789012", + detail::format(kFmt, tp, detail::femtoseconds(123456789012), utc)); + + EXPECT_EQ("12:34:56.000000000000123", + detail::format(kFmt, tp, detail::femtoseconds(123), utc)); + EXPECT_EQ("12:34:56.000000000000012", + detail::format(kFmt, tp, detail::femtoseconds(12), utc)); + EXPECT_EQ("12:34:56.000000000000001", + detail::format(kFmt, tp, detail::femtoseconds(1), utc)); +} + +TEST(Format, Basics) { + time_zone tz = utc_time_zone(); + time_point tp = system_clock::from_time_t(0); + + // Starts with a couple basic edge cases. + EXPECT_EQ("", format("", tp, tz)); + EXPECT_EQ(" ", format(" ", tp, tz)); + EXPECT_EQ(" ", format(" ", tp, tz)); + EXPECT_EQ("xxx", format("xxx", tp, tz)); + std::string big(128, 'x'); + EXPECT_EQ(big, format(big, tp, tz)); + // Cause the 1024-byte buffer to grow. + std::string bigger(100000, 'x'); + EXPECT_EQ(bigger, format(bigger, tp, tz)); + + tp += hours(13) + minutes(4) + seconds(5); + tp += milliseconds(6) + microseconds(7) + nanoseconds(8); + EXPECT_EQ("1970-01-01", format("%Y-%m-%d", tp, tz)); + EXPECT_EQ("13:04:05", format("%H:%M:%S", tp, tz)); + EXPECT_EQ("13:04:05.006", format("%H:%M:%E3S", tp, tz)); + EXPECT_EQ("13:04:05.006007", format("%H:%M:%E6S", tp, tz)); + EXPECT_EQ("13:04:05.006007008", format("%H:%M:%E9S", tp, tz)); +} + +TEST(Format, PosixConversions) { + const time_zone tz = utc_time_zone(); + auto tp = system_clock::from_time_t(0); + + TestFormatSpecifier(tp, tz, "%d", "01"); + TestFormatSpecifier(tp, tz, "%e", " 1"); // extension but internal support + TestFormatSpecifier(tp, tz, "%H", "00"); + TestFormatSpecifier(tp, tz, "%I", "12"); + TestFormatSpecifier(tp, tz, "%j", "001"); + TestFormatSpecifier(tp, tz, "%m", "01"); + TestFormatSpecifier(tp, tz, "%M", "00"); + TestFormatSpecifier(tp, tz, "%S", "00"); + TestFormatSpecifier(tp, tz, "%U", "00"); + TestFormatSpecifier(tp, tz, "%w", "4"); // 4=Thursday + TestFormatSpecifier(tp, tz, "%W", "00"); + TestFormatSpecifier(tp, tz, "%y", "70"); + TestFormatSpecifier(tp, tz, "%Y", "1970"); + TestFormatSpecifier(tp, tz, "%z", "+0000"); + TestFormatSpecifier(tp, tz, "%Z", "UTC"); + TestFormatSpecifier(tp, tz, "%%", "%"); + +#if defined(__linux__) + // SU/C99/TZ extensions + TestFormatSpecifier(tp, tz, "%C", "19"); + TestFormatSpecifier(tp, tz, "%D", "01/01/70"); + TestFormatSpecifier(tp, tz, "%F", "1970-01-01"); + TestFormatSpecifier(tp, tz, "%g", "70"); + TestFormatSpecifier(tp, tz, "%G", "1970"); + TestFormatSpecifier(tp, tz, "%k", " 0"); + TestFormatSpecifier(tp, tz, "%l", "12"); + TestFormatSpecifier(tp, tz, "%n", "\n"); + TestFormatSpecifier(tp, tz, "%R", "00:00"); + TestFormatSpecifier(tp, tz, "%t", "\t"); + TestFormatSpecifier(tp, tz, "%T", "00:00:00"); + TestFormatSpecifier(tp, tz, "%u", "4"); // 4=Thursday + TestFormatSpecifier(tp, tz, "%V", "01"); + TestFormatSpecifier(tp, tz, "%s", "0"); +#endif +} + +TEST(Format, LocaleSpecific) { + const time_zone tz = utc_time_zone(); + auto tp = system_clock::from_time_t(0); + + TestFormatSpecifier(tp, tz, "%a", "Thu"); + TestFormatSpecifier(tp, tz, "%A", "Thursday"); + TestFormatSpecifier(tp, tz, "%b", "Jan"); + TestFormatSpecifier(tp, tz, "%B", "January"); + + // %c should at least produce the numeric year and time-of-day. + const std::string s = format("%c", tp, utc_time_zone()); + EXPECT_THAT(s, HasSubstr("1970")); + EXPECT_THAT(s, HasSubstr("00:00:00")); + + TestFormatSpecifier(tp, tz, "%p", "AM"); + TestFormatSpecifier(tp, tz, "%x", "01/01/70"); + TestFormatSpecifier(tp, tz, "%X", "00:00:00"); + +#if defined(__linux__) + // SU/C99/TZ extensions + TestFormatSpecifier(tp, tz, "%h", "Jan"); // Same as %b + TestFormatSpecifier(tp, tz, "%P", "am"); + TestFormatSpecifier(tp, tz, "%r", "12:00:00 AM"); + + // Modified conversion specifiers %E_ + TestFormatSpecifier(tp, tz, "%Ec", "Thu Jan 1 00:00:00 1970"); + TestFormatSpecifier(tp, tz, "%EC", "19"); + TestFormatSpecifier(tp, tz, "%Ex", "01/01/70"); + TestFormatSpecifier(tp, tz, "%EX", "00:00:00"); + TestFormatSpecifier(tp, tz, "%Ey", "70"); + TestFormatSpecifier(tp, tz, "%EY", "1970"); + + // Modified conversion specifiers %O_ + TestFormatSpecifier(tp, tz, "%Od", "01"); + TestFormatSpecifier(tp, tz, "%Oe", " 1"); + TestFormatSpecifier(tp, tz, "%OH", "00"); + TestFormatSpecifier(tp, tz, "%OI", "12"); + TestFormatSpecifier(tp, tz, "%Om", "01"); + TestFormatSpecifier(tp, tz, "%OM", "00"); + TestFormatSpecifier(tp, tz, "%OS", "00"); + TestFormatSpecifier(tp, tz, "%Ou", "4"); // 4=Thursday + TestFormatSpecifier(tp, tz, "%OU", "00"); + TestFormatSpecifier(tp, tz, "%OV", "01"); + TestFormatSpecifier(tp, tz, "%Ow", "4"); // 4=Thursday + TestFormatSpecifier(tp, tz, "%OW", "00"); + TestFormatSpecifier(tp, tz, "%Oy", "70"); +#endif +} + +TEST(Format, Escaping) { + const time_zone tz = utc_time_zone(); + auto tp = system_clock::from_time_t(0); + + TestFormatSpecifier(tp, tz, "%%", "%"); + TestFormatSpecifier(tp, tz, "%%a", "%a"); + TestFormatSpecifier(tp, tz, "%%b", "%b"); + TestFormatSpecifier(tp, tz, "%%Ea", "%Ea"); + TestFormatSpecifier(tp, tz, "%%Es", "%Es"); + TestFormatSpecifier(tp, tz, "%%E3S", "%E3S"); + TestFormatSpecifier(tp, tz, "%%OS", "%OS"); + TestFormatSpecifier(tp, tz, "%%O3S", "%O3S"); + + // Multiple levels of escaping. + TestFormatSpecifier(tp, tz, "%%%Y", "%1970"); + TestFormatSpecifier(tp, tz, "%%%E3S", "%00.000"); + TestFormatSpecifier(tp, tz, "%%%%E3S", "%%E3S"); +} + +TEST(Format, ExtendedSeconds) { + const time_zone tz = utc_time_zone(); + + // No subseconds. + time_point tp = system_clock::from_time_t(0); + tp += seconds(5); + EXPECT_EQ("05", format("%E*S", tp, tz)); + EXPECT_EQ("05", format("%E0S", tp, tz)); + EXPECT_EQ("05.0", format("%E1S", tp, tz)); + EXPECT_EQ("05.00", format("%E2S", tp, tz)); + EXPECT_EQ("05.000", format("%E3S", tp, tz)); + EXPECT_EQ("05.0000", format("%E4S", tp, tz)); + EXPECT_EQ("05.00000", format("%E5S", tp, tz)); + EXPECT_EQ("05.000000", format("%E6S", tp, tz)); + EXPECT_EQ("05.0000000", format("%E7S", tp, tz)); + EXPECT_EQ("05.00000000", format("%E8S", tp, tz)); + EXPECT_EQ("05.000000000", format("%E9S", tp, tz)); + EXPECT_EQ("05.0000000000", format("%E10S", tp, tz)); + EXPECT_EQ("05.00000000000", format("%E11S", tp, tz)); + EXPECT_EQ("05.000000000000", format("%E12S", tp, tz)); + EXPECT_EQ("05.0000000000000", format("%E13S", tp, tz)); + EXPECT_EQ("05.00000000000000", format("%E14S", tp, tz)); + EXPECT_EQ("05.000000000000000", format("%E15S", tp, tz)); + + // With subseconds. + tp += milliseconds(6) + microseconds(7) + nanoseconds(8); + EXPECT_EQ("05.006007008", format("%E*S", tp, tz)); + EXPECT_EQ("05", format("%E0S", tp, tz)); + EXPECT_EQ("05.0", format("%E1S", tp, tz)); + EXPECT_EQ("05.00", format("%E2S", tp, tz)); + EXPECT_EQ("05.006", format("%E3S", tp, tz)); + EXPECT_EQ("05.0060", format("%E4S", tp, tz)); + EXPECT_EQ("05.00600", format("%E5S", tp, tz)); + EXPECT_EQ("05.006007", format("%E6S", tp, tz)); + EXPECT_EQ("05.0060070", format("%E7S", tp, tz)); + EXPECT_EQ("05.00600700", format("%E8S", tp, tz)); + EXPECT_EQ("05.006007008", format("%E9S", tp, tz)); + EXPECT_EQ("05.0060070080", format("%E10S", tp, tz)); + EXPECT_EQ("05.00600700800", format("%E11S", tp, tz)); + EXPECT_EQ("05.006007008000", format("%E12S", tp, tz)); + EXPECT_EQ("05.0060070080000", format("%E13S", tp, tz)); + EXPECT_EQ("05.00600700800000", format("%E14S", tp, tz)); + EXPECT_EQ("05.006007008000000", format("%E15S", tp, tz)); + + // Times before the Unix epoch. + tp = system_clock::from_time_t(0) + microseconds(-1); + EXPECT_EQ("1969-12-31 23:59:59.999999", + format("%Y-%m-%d %H:%M:%E*S", tp, tz)); + + // Here is a "%E*S" case we got wrong for a while. While the first + // instant below is correctly rendered as "...:07.333304", the second + // one used to appear as "...:07.33330499999999999". + tp = system_clock::from_time_t(0) + microseconds(1395024427333304); + EXPECT_EQ("2014-03-17 02:47:07.333304", + format("%Y-%m-%d %H:%M:%E*S", tp, tz)); + tp += microseconds(1); + EXPECT_EQ("2014-03-17 02:47:07.333305", + format("%Y-%m-%d %H:%M:%E*S", tp, tz)); +} + +TEST(Format, ExtendedSubeconds) { + const time_zone tz = utc_time_zone(); + + // No subseconds. + time_point tp = system_clock::from_time_t(0); + tp += seconds(5); + EXPECT_EQ("0", format("%E*f", tp, tz)); + EXPECT_EQ("", format("%E0f", tp, tz)); + EXPECT_EQ("0", format("%E1f", tp, tz)); + EXPECT_EQ("00", format("%E2f", tp, tz)); + EXPECT_EQ("000", format("%E3f", tp, tz)); + EXPECT_EQ("0000", format("%E4f", tp, tz)); + EXPECT_EQ("00000", format("%E5f", tp, tz)); + EXPECT_EQ("000000", format("%E6f", tp, tz)); + EXPECT_EQ("0000000", format("%E7f", tp, tz)); + EXPECT_EQ("00000000", format("%E8f", tp, tz)); + EXPECT_EQ("000000000", format("%E9f", tp, tz)); + EXPECT_EQ("0000000000", format("%E10f", tp, tz)); + EXPECT_EQ("00000000000", format("%E11f", tp, tz)); + EXPECT_EQ("000000000000", format("%E12f", tp, tz)); + EXPECT_EQ("0000000000000", format("%E13f", tp, tz)); + EXPECT_EQ("00000000000000", format("%E14f", tp, tz)); + EXPECT_EQ("000000000000000", format("%E15f", tp, tz)); + + // With subseconds. + tp += milliseconds(6) + microseconds(7) + nanoseconds(8); + EXPECT_EQ("006007008", format("%E*f", tp, tz)); + EXPECT_EQ("", format("%E0f", tp, tz)); + EXPECT_EQ("0", format("%E1f", tp, tz)); + EXPECT_EQ("00", format("%E2f", tp, tz)); + EXPECT_EQ("006", format("%E3f", tp, tz)); + EXPECT_EQ("0060", format("%E4f", tp, tz)); + EXPECT_EQ("00600", format("%E5f", tp, tz)); + EXPECT_EQ("006007", format("%E6f", tp, tz)); + EXPECT_EQ("0060070", format("%E7f", tp, tz)); + EXPECT_EQ("00600700", format("%E8f", tp, tz)); + EXPECT_EQ("006007008", format("%E9f", tp, tz)); + EXPECT_EQ("0060070080", format("%E10f", tp, tz)); + EXPECT_EQ("00600700800", format("%E11f", tp, tz)); + EXPECT_EQ("006007008000", format("%E12f", tp, tz)); + EXPECT_EQ("0060070080000", format("%E13f", tp, tz)); + EXPECT_EQ("00600700800000", format("%E14f", tp, tz)); + EXPECT_EQ("006007008000000", format("%E15f", tp, tz)); + + // Times before the Unix epoch. + tp = system_clock::from_time_t(0) + microseconds(-1); + EXPECT_EQ("1969-12-31 23:59:59.999999", + format("%Y-%m-%d %H:%M:%S.%E*f", tp, tz)); + + // Here is a "%E*S" case we got wrong for a while. While the first + // instant below is correctly rendered as "...:07.333304", the second + // one used to appear as "...:07.33330499999999999". + tp = system_clock::from_time_t(0) + microseconds(1395024427333304); + EXPECT_EQ("2014-03-17 02:47:07.333304", + format("%Y-%m-%d %H:%M:%S.%E*f", tp, tz)); + tp += microseconds(1); + EXPECT_EQ("2014-03-17 02:47:07.333305", + format("%Y-%m-%d %H:%M:%S.%E*f", tp, tz)); +} + +TEST(Format, CompareExtendSecondsVsSubseconds) { + const time_zone tz = utc_time_zone(); + + // This test case illustrates the differences/similarities between: + // fmt_A: %ES + // fmt_B: %S.%Ef + auto fmt_A = [](const std::string& prec) { return "%E" + prec + "S"; }; + auto fmt_B = [](const std::string& prec) { return "%S.%E" + prec + "f"; }; + + // No subseconds: + time_point tp = system_clock::from_time_t(0); + tp += seconds(5); + // ... %E*S and %S.%E*f are different. + EXPECT_EQ("05", format(fmt_A("*"), tp, tz)); + EXPECT_EQ("05.0", format(fmt_B("*"), tp, tz)); + // ... %E0S and %S.%E0f are different. + EXPECT_EQ("05", format(fmt_A("0"), tp, tz)); + EXPECT_EQ("05.", format(fmt_B("0"), tp, tz)); + // ... %ES and %S.%Ef are the same for prec in [1:15]. + for (int prec = 1; prec <= 15; ++prec) { + const std::string a = format(fmt_A(std::to_string(prec)), tp, tz); + const std::string b = format(fmt_B(std::to_string(prec)), tp, tz); + EXPECT_EQ(a, b) << "prec=" << prec; + } + + // With subseconds: + // ... %E*S and %S.%E*f are the same. + tp += milliseconds(6) + microseconds(7) + nanoseconds(8); + EXPECT_EQ("05.006007008", format(fmt_A("*"), tp, tz)); + EXPECT_EQ("05.006007008", format(fmt_B("*"), tp, tz)); + // ... %E0S and %S.%E0f are different. + EXPECT_EQ("05", format(fmt_A("0"), tp, tz)); + EXPECT_EQ("05.", format(fmt_B("0"), tp, tz)); + // ... %ES and %S.%Ef are the same for prec in [1:15]. + for (int prec = 1; prec <= 15; ++prec) { + const std::string a = format(fmt_A(std::to_string(prec)), tp, tz); + const std::string b = format(fmt_B(std::to_string(prec)), tp, tz); + EXPECT_EQ(a, b) << "prec=" << prec; + } +} + +TEST(Format, ExtendedOffset) { + auto tp = system_clock::from_time_t(0); + + time_zone tz = utc_time_zone(); + TestFormatSpecifier(tp, tz, "%Ez", "+00:00"); + + EXPECT_TRUE(load_time_zone("America/New_York", &tz)); + TestFormatSpecifier(tp, tz, "%Ez", "-05:00"); + + EXPECT_TRUE(load_time_zone("America/Los_Angeles", &tz)); + TestFormatSpecifier(tp, tz, "%Ez", "-08:00"); + + EXPECT_TRUE(load_time_zone("Australia/Sydney", &tz)); + TestFormatSpecifier(tp, tz, "%Ez", "+10:00"); + + EXPECT_TRUE(load_time_zone("Africa/Monrovia", &tz)); + // The true offset is -00:44:30 but %z only gives (truncated) minutes. + TestFormatSpecifier(tp, tz, "%z", "-0044"); + TestFormatSpecifier(tp, tz, "%Ez", "-00:44"); +} + +TEST(Format, ExtendedSecondOffset) { + const time_zone utc = utc_time_zone(); + time_point tp; + time_zone tz; + + EXPECT_TRUE(load_time_zone("America/New_York", &tz)); + tp = convert(civil_second(1883, 11, 18, 16, 59, 59), utc); + if (tz.lookup(tp).offset == -5 * 60 * 60) { + // We're likely dealing with zoneinfo that doesn't support really old + // timestamps, so America/New_York never looks to be on local mean time. + } else { + TestFormatSpecifier(tp, tz, "%E*z", "-04:56:02"); + TestFormatSpecifier(tp, tz, "%Ez", "-04:56"); + } + tp += seconds(1); + TestFormatSpecifier(tp, tz, "%E*z", "-05:00:00"); + + EXPECT_TRUE(load_time_zone("Europe/Moscow", &tz)); + tp = convert(civil_second(1919, 6, 30, 23, 59, 59), utc); + TestFormatSpecifier(tp, tz, "%E*z", "+04:31:19"); + TestFormatSpecifier(tp, tz, "%Ez", "+04:31"); + tp += seconds(1); + TestFormatSpecifier(tp, tz, "%E*z", "+04:00:00"); +} + +TEST(Format, ExtendedYears) { + const time_zone utc = utc_time_zone(); + const char e4y_fmt[] = "%E4Y%m%d"; // no separators + + // %E4Y zero-pads the year to produce at least 4 chars, including the sign. + auto tp = convert(civil_second(-999, 11, 27, 0, 0, 0), utc); + EXPECT_EQ("-9991127", format(e4y_fmt, tp, utc)); + tp = convert(civil_second(-99, 11, 27, 0, 0, 0), utc); + EXPECT_EQ("-0991127", format(e4y_fmt, tp, utc)); + tp = convert(civil_second(-9, 11, 27, 0, 0, 0), utc); + EXPECT_EQ("-0091127", format(e4y_fmt, tp, utc)); + tp = convert(civil_second(-1, 11, 27, 0, 0, 0), utc); + EXPECT_EQ("-0011127", format(e4y_fmt, tp, utc)); + tp = convert(civil_second(0, 11, 27, 0, 0, 0), utc); + EXPECT_EQ("00001127", format(e4y_fmt, tp, utc)); + tp = convert(civil_second(1, 11, 27, 0, 0, 0), utc); + EXPECT_EQ("00011127", format(e4y_fmt, tp, utc)); + tp = convert(civil_second(9, 11, 27, 0, 0, 0), utc); + EXPECT_EQ("00091127", format(e4y_fmt, tp, utc)); + tp = convert(civil_second(99, 11, 27, 0, 0, 0), utc); + EXPECT_EQ("00991127", format(e4y_fmt, tp, utc)); + tp = convert(civil_second(999, 11, 27, 0, 0, 0), utc); + EXPECT_EQ("09991127", format(e4y_fmt, tp, utc)); + tp = convert(civil_second(9999, 11, 27, 0, 0, 0), utc); + EXPECT_EQ("99991127", format(e4y_fmt, tp, utc)); + + // When the year is outside [-999:9999], more than 4 chars are produced. + tp = convert(civil_second(-1000, 11, 27, 0, 0, 0), utc); + EXPECT_EQ("-10001127", format(e4y_fmt, tp, utc)); + tp = convert(civil_second(10000, 11, 27, 0, 0, 0), utc); + EXPECT_EQ("100001127", format(e4y_fmt, tp, utc)); +} + +TEST(Format, RFC3339Format) { + time_zone tz; + EXPECT_TRUE(load_time_zone("America/Los_Angeles", &tz)); + + time_point tp = + convert(civil_second(1977, 6, 28, 9, 8, 7), tz); + EXPECT_EQ("1977-06-28T09:08:07-07:00", format(RFC3339_full, tp, tz)); + EXPECT_EQ("1977-06-28T09:08:07-07:00", format(RFC3339_sec, tp, tz)); + + tp += milliseconds(100); + EXPECT_EQ("1977-06-28T09:08:07.1-07:00", format(RFC3339_full, tp, tz)); + EXPECT_EQ("1977-06-28T09:08:07-07:00", format(RFC3339_sec, tp, tz)); + + tp += milliseconds(20); + EXPECT_EQ("1977-06-28T09:08:07.12-07:00", format(RFC3339_full, tp, tz)); + EXPECT_EQ("1977-06-28T09:08:07-07:00", format(RFC3339_sec, tp, tz)); + + tp += milliseconds(3); + EXPECT_EQ("1977-06-28T09:08:07.123-07:00", format(RFC3339_full, tp, tz)); + EXPECT_EQ("1977-06-28T09:08:07-07:00", format(RFC3339_sec, tp, tz)); + + tp += microseconds(400); + EXPECT_EQ("1977-06-28T09:08:07.1234-07:00", format(RFC3339_full, tp, tz)); + EXPECT_EQ("1977-06-28T09:08:07-07:00", format(RFC3339_sec, tp, tz)); + + tp += microseconds(50); + EXPECT_EQ("1977-06-28T09:08:07.12345-07:00", format(RFC3339_full, tp, tz)); + EXPECT_EQ("1977-06-28T09:08:07-07:00", format(RFC3339_sec, tp, tz)); + + tp += microseconds(6); + EXPECT_EQ("1977-06-28T09:08:07.123456-07:00", format(RFC3339_full, tp, tz)); + EXPECT_EQ("1977-06-28T09:08:07-07:00", format(RFC3339_sec, tp, tz)); + + tp += nanoseconds(700); + EXPECT_EQ("1977-06-28T09:08:07.1234567-07:00", format(RFC3339_full, tp, tz)); + EXPECT_EQ("1977-06-28T09:08:07-07:00", format(RFC3339_sec, tp, tz)); + + tp += nanoseconds(80); + EXPECT_EQ("1977-06-28T09:08:07.12345678-07:00", format(RFC3339_full, tp, tz)); + EXPECT_EQ("1977-06-28T09:08:07-07:00", format(RFC3339_sec, tp, tz)); + + tp += nanoseconds(9); + EXPECT_EQ("1977-06-28T09:08:07.123456789-07:00", + format(RFC3339_full, tp, tz)); + EXPECT_EQ("1977-06-28T09:08:07-07:00", format(RFC3339_sec, tp, tz)); +} + +TEST(Format, RFC1123Format) { // locale specific + time_zone tz; + EXPECT_TRUE(load_time_zone("America/Los_Angeles", &tz)); + + auto tp = convert(civil_second(1977, 6, 28, 9, 8, 7), tz); + EXPECT_EQ("Tue, 28 Jun 1977 09:08:07 -0700", format(RFC1123_full, tp, tz)); + EXPECT_EQ("28 Jun 1977 09:08:07 -0700", format(RFC1123_no_wday, tp, tz)); +} + +// +// Testing parse() +// + +TEST(Parse, TimePointResolution) { + const char kFmt[] = "%H:%M:%E*S"; + const time_zone utc = utc_time_zone(); + + time_point tp_ns; + EXPECT_TRUE(parse(kFmt, "03:04:05.123456789", utc, &tp_ns)); + EXPECT_EQ("03:04:05.123456789", format(kFmt, tp_ns, utc)); + EXPECT_TRUE(parse(kFmt, "03:04:05.123456", utc, &tp_ns)); + EXPECT_EQ("03:04:05.123456", format(kFmt, tp_ns, utc)); + + time_point tp_us; + EXPECT_TRUE(parse(kFmt, "03:04:05.123456789", utc, &tp_us)); + EXPECT_EQ("03:04:05.123456", format(kFmt, tp_us, utc)); + EXPECT_TRUE(parse(kFmt, "03:04:05.123456", utc, &tp_us)); + EXPECT_EQ("03:04:05.123456", format(kFmt, tp_us, utc)); + EXPECT_TRUE(parse(kFmt, "03:04:05.123", utc, &tp_us)); + EXPECT_EQ("03:04:05.123", format(kFmt, tp_us, utc)); + + time_point tp_ms; + EXPECT_TRUE(parse(kFmt, "03:04:05.123456", utc, &tp_ms)); + EXPECT_EQ("03:04:05.123", format(kFmt, tp_ms, utc)); + EXPECT_TRUE(parse(kFmt, "03:04:05.123", utc, &tp_ms)); + EXPECT_EQ("03:04:05.123", format(kFmt, tp_ms, utc)); + EXPECT_TRUE(parse(kFmt, "03:04:05", utc, &tp_ms)); + EXPECT_EQ("03:04:05", format(kFmt, tp_ms, utc)); + + time_point tp_s; + EXPECT_TRUE(parse(kFmt, "03:04:05.123", utc, &tp_s)); + EXPECT_EQ("03:04:05", format(kFmt, tp_s, utc)); + EXPECT_TRUE(parse(kFmt, "03:04:05", utc, &tp_s)); + EXPECT_EQ("03:04:05", format(kFmt, tp_s, utc)); + + time_point tp_m; + EXPECT_TRUE(parse(kFmt, "03:04:05", utc, &tp_m)); + EXPECT_EQ("03:04:00", format(kFmt, tp_m, utc)); + + time_point tp_h; + EXPECT_TRUE(parse(kFmt, "03:04:05", utc, &tp_h)); + EXPECT_EQ("03:00:00", format(kFmt, tp_h, utc)); +} + +TEST(Parse, TimePointExtendedResolution) { + const char kFmt[] = "%H:%M:%E*S"; + const time_zone utc = utc_time_zone(); + + time_point tp; + detail::femtoseconds fs; + EXPECT_TRUE(detail::parse(kFmt, "12:34:56.123456789012345", utc, &tp, &fs)); + EXPECT_EQ("12:34:56.123456789012345", detail::format(kFmt, tp, fs, utc)); + EXPECT_TRUE(detail::parse(kFmt, "12:34:56.012345678901234", utc, &tp, &fs)); + EXPECT_EQ("12:34:56.012345678901234", detail::format(kFmt, tp, fs, utc)); + EXPECT_TRUE(detail::parse(kFmt, "12:34:56.001234567890123", utc, &tp, &fs)); + EXPECT_EQ("12:34:56.001234567890123", detail::format(kFmt, tp, fs, utc)); + EXPECT_TRUE(detail::parse(kFmt, "12:34:56.000000000000123", utc, &tp, &fs)); + EXPECT_EQ("12:34:56.000000000000123", detail::format(kFmt, tp, fs, utc)); + EXPECT_TRUE(detail::parse(kFmt, "12:34:56.000000000000012", utc, &tp, &fs)); + EXPECT_EQ("12:34:56.000000000000012", detail::format(kFmt, tp, fs, utc)); + EXPECT_TRUE(detail::parse(kFmt, "12:34:56.000000000000001", utc, &tp, &fs)); + EXPECT_EQ("12:34:56.000000000000001", detail::format(kFmt, tp, fs, utc)); +} + +TEST(Parse, Basics) { + time_zone tz = utc_time_zone(); + time_point tp = system_clock::from_time_t(1234567890); + + // Simple edge cases. + EXPECT_TRUE(parse("", "", tz, &tp)); + EXPECT_EQ(system_clock::from_time_t(0), tp); // everything defaulted + EXPECT_TRUE(parse(" ", " ", tz, &tp)); + EXPECT_TRUE(parse(" ", " ", tz, &tp)); + EXPECT_TRUE(parse("x", "x", tz, &tp)); + EXPECT_TRUE(parse("xxx", "xxx", tz, &tp)); + + EXPECT_TRUE( + parse("%Y-%m-%d %H:%M:%S %z", "2013-06-28 19:08:09 -0800", tz, &tp)); + ExpectTime(tp, tz, 2013, 6, 29, 3, 8, 9, 0, false, "UTC"); +} + +TEST(Parse, WithTimeZone) { + time_zone tz; + EXPECT_TRUE(load_time_zone("America/Los_Angeles", &tz)); + time_point tp; + + // We can parse a std::string without a UTC offset if we supply a timezone. + EXPECT_TRUE(parse("%Y-%m-%d %H:%M:%S", "2013-06-28 19:08:09", tz, &tp)); + ExpectTime(tp, tz, 2013, 6, 28, 19, 8, 9, -7 * 60 * 60, true, "PDT"); + + // But the timezone is ignored when a UTC offset is present. + EXPECT_TRUE(parse("%Y-%m-%d %H:%M:%S %z", "2013-06-28 19:08:09 +0800", + utc_time_zone(), &tp)); + ExpectTime(tp, tz, 2013, 6, 28, 19 - 8 - 7, 8, 9, -7 * 60 * 60, true, "PDT"); + + // Check a skipped time (a Spring DST transition). parse() returns + // the preferred-offset result, as defined for ConvertDateTime(). + EXPECT_TRUE(parse("%Y-%m-%d %H:%M:%S", "2011-03-13 02:15:00", tz, &tp)); + ExpectTime(tp, tz, 2011, 3, 13, 3, 15, 0, -7 * 60 * 60, true, "PDT"); + + // Check a repeated time (a Fall DST transition). parse() returns + // the preferred-offset result, as defined for ConvertDateTime(). + EXPECT_TRUE(parse("%Y-%m-%d %H:%M:%S", "2011-11-06 01:15:00", tz, &tp)); + ExpectTime(tp, tz, 2011, 11, 6, 1, 15, 0, -7 * 60 * 60, true, "PDT"); +} + +TEST(Parse, LeapSecond) { + time_zone tz; + EXPECT_TRUE(load_time_zone("America/Los_Angeles", &tz)); + time_point tp; + + // ":59" -> ":59" + EXPECT_TRUE(parse(RFC3339_full, "2013-06-28T07:08:59-08:00", tz, &tp)); + ExpectTime(tp, tz, 2013, 6, 28, 8, 8, 59, -7 * 60 * 60, true, "PDT"); + + // ":59.5" -> ":59.5" + EXPECT_TRUE(parse(RFC3339_full, "2013-06-28T07:08:59.5-08:00", tz, &tp)); + ExpectTime(tp, tz, 2013, 6, 28, 8, 8, 59, -7 * 60 * 60, true, "PDT"); + + // ":60" -> ":00" + EXPECT_TRUE(parse(RFC3339_full, "2013-06-28T07:08:60-08:00", tz, &tp)); + ExpectTime(tp, tz, 2013, 6, 28, 8, 9, 0, -7 * 60 * 60, true, "PDT"); + + // ":60.5" -> ":00.0" + EXPECT_TRUE(parse(RFC3339_full, "2013-06-28T07:08:60.5-08:00", tz, &tp)); + ExpectTime(tp, tz, 2013, 6, 28, 8, 9, 0, -7 * 60 * 60, true, "PDT"); + + // ":61" -> error + EXPECT_FALSE(parse(RFC3339_full, "2013-06-28T07:08:61-08:00", tz, &tp)); +} + +TEST(Parse, ErrorCases) { + const time_zone tz = utc_time_zone(); + auto tp = system_clock::from_time_t(0); + + // Illegal trailing data. + EXPECT_FALSE(parse("%S", "123", tz, &tp)); + + // Can't parse an illegal format specifier. + EXPECT_FALSE(parse("%Q", "x", tz, &tp)); + + // Fails because of trailing, unparsed data "blah". + EXPECT_FALSE(parse("%m-%d", "2-3 blah", tz, &tp)); + + // Trailing whitespace is allowed. + EXPECT_TRUE(parse("%m-%d", "2-3 ", tz, &tp)); + EXPECT_EQ(2, convert(tp, utc_time_zone()).month()); + EXPECT_EQ(3, convert(tp, utc_time_zone()).day()); + + // Feb 31 requires normalization. + EXPECT_FALSE(parse("%m-%d", "2-31", tz, &tp)); + + // Check that we cannot have spaces in UTC offsets. + EXPECT_TRUE(parse("%z", "-0203", tz, &tp)); + EXPECT_FALSE(parse("%z", "- 2 3", tz, &tp)); + EXPECT_TRUE(parse("%Ez", "-02:03", tz, &tp)); + EXPECT_FALSE(parse("%Ez", "- 2: 3", tz, &tp)); + + // Check that we reject other malformed UTC offsets. + EXPECT_FALSE(parse("%Ez", "+-08:00", tz, &tp)); + EXPECT_FALSE(parse("%Ez", "-+08:00", tz, &tp)); + + // Check that we do not accept "-0" in fields that allow zero. + EXPECT_FALSE(parse("%Y", "-0", tz, &tp)); + EXPECT_FALSE(parse("%E4Y", "-0", tz, &tp)); + EXPECT_FALSE(parse("%H", "-0", tz, &tp)); + EXPECT_FALSE(parse("%M", "-0", tz, &tp)); + EXPECT_FALSE(parse("%S", "-0", tz, &tp)); + EXPECT_FALSE(parse("%z", "+-000", tz, &tp)); + EXPECT_FALSE(parse("%Ez", "+-0:00", tz, &tp)); + EXPECT_FALSE(parse("%z", "-00-0", tz, &tp)); + EXPECT_FALSE(parse("%Ez", "-00:-0", tz, &tp)); +} + +TEST(Parse, PosixConversions) { + time_zone tz = utc_time_zone(); + auto tp = system_clock::from_time_t(0); + const auto reset = convert(civil_second(1977, 6, 28, 9, 8, 7), tz); + + tp = reset; + EXPECT_TRUE(parse("%d", "15", tz, &tp)); + EXPECT_EQ(15, convert(tp, tz).day()); + + // %e is an extension, but is supported internally. + tp = reset; + EXPECT_TRUE(parse("%e", "15", tz, &tp)); + EXPECT_EQ(15, convert(tp, tz).day()); // Equivalent to %d + + tp = reset; + EXPECT_TRUE(parse("%H", "17", tz, &tp)); + EXPECT_EQ(17, convert(tp, tz).hour()); + + tp = reset; + EXPECT_TRUE(parse("%I", "5", tz, &tp)); + EXPECT_EQ(5, convert(tp, tz).hour()); + + // %j is parsed but ignored. + EXPECT_TRUE(parse("%j", "32", tz, &tp)); + + tp = reset; + EXPECT_TRUE(parse("%m", "11", tz, &tp)); + EXPECT_EQ(11, convert(tp, tz).month()); + + tp = reset; + EXPECT_TRUE(parse("%M", "33", tz, &tp)); + EXPECT_EQ(33, convert(tp, tz).minute()); + + tp = reset; + EXPECT_TRUE(parse("%S", "55", tz, &tp)); + EXPECT_EQ(55, convert(tp, tz).second()); + + // %U is parsed but ignored. + EXPECT_TRUE(parse("%U", "15", tz, &tp)); + + // %w is parsed but ignored. + EXPECT_TRUE(parse("%w", "2", tz, &tp)); + + // %W is parsed but ignored. + EXPECT_TRUE(parse("%W", "22", tz, &tp)); + + tp = reset; + EXPECT_TRUE(parse("%y", "04", tz, &tp)); + EXPECT_EQ(2004, convert(tp, tz).year()); + + tp = reset; + EXPECT_TRUE(parse("%Y", "2004", tz, &tp)); + EXPECT_EQ(2004, convert(tp, tz).year()); + + EXPECT_TRUE(parse("%%", "%", tz, &tp)); + +#if defined(__linux__) + // SU/C99/TZ extensions + + // Because we handle each (non-internal) specifier in a separate call + // to strptime(), there is no way to group %C and %y together. So we + // just skip the %C/%y case. +#if 0 + tp = reset; + EXPECT_TRUE(parse("%C %y", "20 04", tz, &tp)); + EXPECT_EQ(2004, convert(tp, tz).year()); +#endif + + tp = reset; + EXPECT_TRUE(parse("%D", "02/03/04", tz, &tp)); + EXPECT_EQ(2, convert(tp, tz).month()); + EXPECT_EQ(3, convert(tp, tz).day()); + EXPECT_EQ(2004, convert(tp, tz).year()); + + EXPECT_TRUE(parse("%n", "\n", tz, &tp)); + + tp = reset; + EXPECT_TRUE(parse("%R", "03:44", tz, &tp)); + EXPECT_EQ(3, convert(tp, tz).hour()); + EXPECT_EQ(44, convert(tp, tz).minute()); + + EXPECT_TRUE(parse("%t", "\t\v\f\n\r ", tz, &tp)); + + tp = reset; + EXPECT_TRUE(parse("%T", "03:44:55", tz, &tp)); + EXPECT_EQ(3, convert(tp, tz).hour()); + EXPECT_EQ(44, convert(tp, tz).minute()); + EXPECT_EQ(55, convert(tp, tz).second()); + + tp = reset; + EXPECT_TRUE(parse("%s", "1234567890", tz, &tp)); + EXPECT_EQ(system_clock::from_time_t(1234567890), tp); + + // %s conversion, like %z/%Ez, pays no heed to the optional zone. + time_zone lax; + EXPECT_TRUE(load_time_zone("America/Los_Angeles", &lax)); + tp = reset; + EXPECT_TRUE(parse("%s", "1234567890", lax, &tp)); + EXPECT_EQ(system_clock::from_time_t(1234567890), tp); + + // This is most important when the time has the same YMDhms + // breakdown in the zone as some other time. For example, ... + // 1414917000 in US/Pacific -> Sun Nov 2 01:30:00 2014 (PDT) + // 1414920600 in US/Pacific -> Sun Nov 2 01:30:00 2014 (PST) + tp = reset; + EXPECT_TRUE(parse("%s", "1414917000", lax, &tp)); + EXPECT_EQ(system_clock::from_time_t(1414917000), tp); + tp = reset; + EXPECT_TRUE(parse("%s", "1414920600", lax, &tp)); + EXPECT_EQ(system_clock::from_time_t(1414920600), tp); +#endif +} + +TEST(Parse, LocaleSpecific) { + time_zone tz = utc_time_zone(); + auto tp = system_clock::from_time_t(0); + const auto reset = convert(civil_second(1977, 6, 28, 9, 8, 7), tz); + + // %a is parsed but ignored. + EXPECT_TRUE(parse("%a", "Mon", tz, &tp)); + + // %A is parsed but ignored. + EXPECT_TRUE(parse("%A", "Monday", tz, &tp)); + + tp = reset; + EXPECT_TRUE(parse("%b", "Feb", tz, &tp)); + EXPECT_EQ(2, convert(tp, tz).month()); + + tp = reset; + EXPECT_TRUE(parse("%B", "February", tz, &tp)); + EXPECT_EQ(2, convert(tp, tz).month()); + + // %p is parsed but ignored if it's alone. But it's used with %I. + EXPECT_TRUE(parse("%p", "AM", tz, &tp)); + tp = reset; + EXPECT_TRUE(parse("%I %p", "5 PM", tz, &tp)); + EXPECT_EQ(17, convert(tp, tz).hour()); + + tp = reset; + EXPECT_TRUE(parse("%x", "02/03/04", tz, &tp)); + if (convert(tp, tz).month() == 2) { + EXPECT_EQ(3, convert(tp, tz).day()); + } else { + EXPECT_EQ(2, convert(tp, tz).day()); + EXPECT_EQ(3, convert(tp, tz).month()); + } + EXPECT_EQ(2004, convert(tp, tz).year()); + + tp = reset; + EXPECT_TRUE(parse("%X", "15:44:55", tz, &tp)); + EXPECT_EQ(15, convert(tp, tz).hour()); + EXPECT_EQ(44, convert(tp, tz).minute()); + EXPECT_EQ(55, convert(tp, tz).second()); + +#if defined(__linux__) + // SU/C99/TZ extensions + + tp = reset; + EXPECT_TRUE(parse("%h", "Feb", tz, &tp)); + EXPECT_EQ(2, convert(tp, tz).month()); // Equivalent to %b + + tp = reset; + EXPECT_TRUE(parse("%l %p", "5 PM", tz, &tp)); + EXPECT_EQ(17, convert(tp, tz).hour()); + + tp = reset; + EXPECT_TRUE(parse("%r", "03:44:55 PM", tz, &tp)); + EXPECT_EQ(15, convert(tp, tz).hour()); + EXPECT_EQ(44, convert(tp, tz).minute()); + EXPECT_EQ(55, convert(tp, tz).second()); + + tp = reset; + EXPECT_TRUE(parse("%Ec", "Tue Nov 19 05:06:07 2013", tz, &tp)); + EXPECT_EQ(convert(civil_second(2013, 11, 19, 5, 6, 7), tz), tp); + + // Modified conversion specifiers %E_ + + tp = reset; + EXPECT_TRUE(parse("%Ex", "02/03/04", tz, &tp)); + EXPECT_EQ(2, convert(tp, tz).month()); + EXPECT_EQ(3, convert(tp, tz).day()); + EXPECT_EQ(2004, convert(tp, tz).year()); + + tp = reset; + EXPECT_TRUE(parse("%EX", "15:44:55", tz, &tp)); + EXPECT_EQ(15, convert(tp, tz).hour()); + EXPECT_EQ(44, convert(tp, tz).minute()); + EXPECT_EQ(55, convert(tp, tz).second()); + + // %Ey, the year offset from %EC, doesn't really make sense alone as there + // is no way to represent it in tm_year (%EC is not simply the century). + // Yet, because we handle each (non-internal) specifier in a separate call + // to strptime(), there is no way to group %EC and %Ey either. So we just + // skip the %EC and %Ey cases. + + tp = reset; + EXPECT_TRUE(parse("%EY", "2004", tz, &tp)); + EXPECT_EQ(2004, convert(tp, tz).year()); + + // Modified conversion specifiers %O_ + + tp = reset; + EXPECT_TRUE(parse("%Od", "15", tz, &tp)); + EXPECT_EQ(15, convert(tp, tz).day()); + + tp = reset; + EXPECT_TRUE(parse("%Oe", "15", tz, &tp)); + EXPECT_EQ(15, convert(tp, tz).day()); // Equivalent to %d + + tp = reset; + EXPECT_TRUE(parse("%OH", "17", tz, &tp)); + EXPECT_EQ(17, convert(tp, tz).hour()); + + tp = reset; + EXPECT_TRUE(parse("%OI", "5", tz, &tp)); + EXPECT_EQ(5, convert(tp, tz).hour()); + + tp = reset; + EXPECT_TRUE(parse("%Om", "11", tz, &tp)); + EXPECT_EQ(11, convert(tp, tz).month()); + + tp = reset; + EXPECT_TRUE(parse("%OM", "33", tz, &tp)); + EXPECT_EQ(33, convert(tp, tz).minute()); + + tp = reset; + EXPECT_TRUE(parse("%OS", "55", tz, &tp)); + EXPECT_EQ(55, convert(tp, tz).second()); + + // %OU is parsed but ignored. + EXPECT_TRUE(parse("%OU", "15", tz, &tp)); + + // %Ow is parsed but ignored. + EXPECT_TRUE(parse("%Ow", "2", tz, &tp)); + + // %OW is parsed but ignored. + EXPECT_TRUE(parse("%OW", "22", tz, &tp)); + + tp = reset; + EXPECT_TRUE(parse("%Oy", "04", tz, &tp)); + EXPECT_EQ(2004, convert(tp, tz).year()); +#endif +} + +TEST(Parse, ExtendedSeconds) { + const time_zone tz = utc_time_zone(); + const time_point unix_epoch = system_clock::from_time_t(0); + + // All %ES cases are treated the same as %E*S on input. + auto precisions = {"*", "0", "1", "2", "3", "4", "5", "6", "7", + "8", "9", "10", "11", "12", "13", "14", "15"}; + for (const std::string& prec : precisions) { + const std::string fmt = "%E" + prec + "S"; + SCOPED_TRACE(fmt); + time_point tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "5", tz, &tp)); + EXPECT_EQ(unix_epoch + seconds(5), tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "05", tz, &tp)); + EXPECT_EQ(unix_epoch + seconds(5), tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "05.0", tz, &tp)); + EXPECT_EQ(unix_epoch + seconds(5), tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "05.00", tz, &tp)); + EXPECT_EQ(unix_epoch + seconds(5), tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "05.6", tz, &tp)); + EXPECT_EQ(unix_epoch + seconds(5) + milliseconds(600), tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "05.60", tz, &tp)); + EXPECT_EQ(unix_epoch + seconds(5) + milliseconds(600), tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "05.600", tz, &tp)); + EXPECT_EQ(unix_epoch + seconds(5) + milliseconds(600), tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "05.67", tz, &tp)); + EXPECT_EQ(unix_epoch + seconds(5) + milliseconds(670), tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "05.670", tz, &tp)); + EXPECT_EQ(unix_epoch + seconds(5) + milliseconds(670), tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "05.678", tz, &tp)); + EXPECT_EQ(unix_epoch + seconds(5) + milliseconds(678), tp); + } + + // Here is a "%E*S" case we got wrong for a while. The fractional + // part of the first instant is less than 2^31 and was correctly + // parsed, while the second (and any subsecond field >=2^31) failed. + time_point tp = unix_epoch; + EXPECT_TRUE(parse("%E*S", "0.2147483647", tz, &tp)); + EXPECT_EQ(unix_epoch + nanoseconds(214748364), tp); + tp = unix_epoch; + EXPECT_TRUE(parse("%E*S", "0.2147483648", tz, &tp)); + EXPECT_EQ(unix_epoch + nanoseconds(214748364), tp); + + // We should also be able to specify long strings of digits far + // beyond the current resolution and have them convert the same way. + tp = unix_epoch; + EXPECT_TRUE(parse( + "%E*S", "0.214748364801234567890123456789012345678901234567890123456789", + tz, &tp)); + EXPECT_EQ(unix_epoch + nanoseconds(214748364), tp); +} + +TEST(Parse, ExtendedSecondsScan) { + const time_zone tz = utc_time_zone(); + time_point tp; + for (int ms = 0; ms < 1000; ms += 111) { + for (int us = 0; us < 1000; us += 27) { + const int micros = ms * 1000 + us; + for (int ns = 0; ns < 1000; ns += 9) { + const auto expected = + system_clock::from_time_t(0) + nanoseconds(micros * 1000 + ns); + std::ostringstream oss; + oss << "0." << std::setfill('0') << std::setw(3); + oss << ms << std::setw(3) << us << std::setw(3) << ns; + const std::string input = oss.str(); + EXPECT_TRUE(parse("%E*S", input, tz, &tp)); + EXPECT_EQ(expected, tp) << input; + } + } + } +} + +TEST(Parse, ExtendedSubeconds) { + const time_zone tz = utc_time_zone(); + const time_point unix_epoch = system_clock::from_time_t(0); + + // All %Ef cases are treated the same as %E*f on input. + auto precisions = {"*", "0", "1", "2", "3", "4", "5", "6", "7", + "8", "9", "10", "11", "12", "13", "14", "15"}; + for (const std::string& prec : precisions) { + const std::string fmt = "%E" + prec + "f"; + SCOPED_TRACE(fmt); + time_point tp = unix_epoch - seconds(1); + EXPECT_TRUE(parse(fmt, "", tz, &tp)); + EXPECT_EQ(unix_epoch, tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "6", tz, &tp)); + EXPECT_EQ(unix_epoch + milliseconds(600), tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "60", tz, &tp)); + EXPECT_EQ(unix_epoch + milliseconds(600), tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "600", tz, &tp)); + EXPECT_EQ(unix_epoch + milliseconds(600), tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "67", tz, &tp)); + EXPECT_EQ(unix_epoch + milliseconds(670), tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "670", tz, &tp)); + EXPECT_EQ(unix_epoch + milliseconds(670), tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "678", tz, &tp)); + EXPECT_EQ(unix_epoch + milliseconds(678), tp); + tp = unix_epoch; + EXPECT_TRUE(parse(fmt, "6789", tz, &tp)); + EXPECT_EQ(unix_epoch + milliseconds(678) + microseconds(900), tp); + } + + // Here is a "%E*f" case we got wrong for a while. The fractional + // part of the first instant is less than 2^31 and was correctly + // parsed, while the second (and any subsecond field >=2^31) failed. + time_point tp = unix_epoch; + EXPECT_TRUE(parse("%E*f", "2147483647", tz, &tp)); + EXPECT_EQ(unix_epoch + nanoseconds(214748364), tp); + tp = unix_epoch; + EXPECT_TRUE(parse("%E*f", "2147483648", tz, &tp)); + EXPECT_EQ(unix_epoch + nanoseconds(214748364), tp); + + // We should also be able to specify long strings of digits far + // beyond the current resolution and have them convert the same way. + tp = unix_epoch; + EXPECT_TRUE(parse( + "%E*f", "214748364801234567890123456789012345678901234567890123456789", + tz, &tp)); + EXPECT_EQ(unix_epoch + nanoseconds(214748364), tp); +} + +TEST(Parse, ExtendedSubecondsScan) { + time_point tp; + const time_zone tz = utc_time_zone(); + for (int ms = 0; ms < 1000; ms += 111) { + for (int us = 0; us < 1000; us += 27) { + const int micros = ms * 1000 + us; + for (int ns = 0; ns < 1000; ns += 9) { + std::ostringstream oss; + oss << std::setfill('0') << std::setw(3) << ms; + oss << std::setw(3) << us << std::setw(3) << ns; + const std::string nanos = oss.str(); + const auto expected = + system_clock::from_time_t(0) + nanoseconds(micros * 1000 + ns); + for (int ps = 0; ps < 1000; ps += 250) { + std::ostringstream oss; + oss << std::setfill('0') << std::setw(3) << ps; + const std::string input = nanos + oss.str() + "999"; + EXPECT_TRUE(parse("%E*f", input, tz, &tp)); + EXPECT_EQ(expected + nanoseconds(ps) / 1000, tp) << input; + } + } + } + } +} + +TEST(Parse, ExtendedOffset) { + const time_zone utc = utc_time_zone(); + time_point tp; + + // %z against +-HHMM. + EXPECT_TRUE(parse("%z", "+0000", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse("%z", "-1234", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 12, 34, 0), utc), tp); + EXPECT_TRUE(parse("%z", "+1234", utc, &tp)); + EXPECT_EQ(convert(civil_second(1969, 12, 31, 11, 26, 0), utc), tp); + EXPECT_FALSE(parse("%z", "-123", utc, &tp)); + + // %z against +-HH. + EXPECT_TRUE(parse("%z", "+00", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse("%z", "-12", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 12, 0, 0), utc), tp); + EXPECT_TRUE(parse("%z", "+12", utc, &tp)); + EXPECT_EQ(convert(civil_second(1969, 12, 31, 12, 0, 0), utc), tp); + EXPECT_FALSE(parse("%z", "-1", utc, &tp)); + + // %Ez against +-HH:MM. + EXPECT_TRUE(parse("%Ez", "+00:00", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse("%Ez", "-12:34", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 12, 34, 0), utc), tp); + EXPECT_TRUE(parse("%Ez", "+12:34", utc, &tp)); + EXPECT_EQ(convert(civil_second(1969, 12, 31, 11, 26, 0), utc), tp); + EXPECT_FALSE(parse("%Ez", "-12:3", utc, &tp)); + + // %Ez against +-HHMM. + EXPECT_TRUE(parse("%Ez", "+0000", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse("%Ez", "-1234", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 12, 34, 0), utc), tp); + EXPECT_TRUE(parse("%Ez", "+1234", utc, &tp)); + EXPECT_EQ(convert(civil_second(1969, 12, 31, 11, 26, 0), utc), tp); + EXPECT_FALSE(parse("%Ez", "-123", utc, &tp)); + + // %Ez against +-HH. + EXPECT_TRUE(parse("%Ez", "+00", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse("%Ez", "-12", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 12, 0, 0), utc), tp); + EXPECT_TRUE(parse("%Ez", "+12", utc, &tp)); + EXPECT_EQ(convert(civil_second(1969, 12, 31, 12, 0, 0), utc), tp); + EXPECT_FALSE(parse("%Ez", "-1", utc, &tp)); +} + +TEST(Parse, ExtendedSecondOffset) { + const time_zone utc = utc_time_zone(); + time_point tp; + + // %Ez against +-HH:MM:SS. + EXPECT_TRUE(parse("%Ez", "+00:00:00", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse("%Ez", "-12:34:56", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 12, 34, 56), utc), tp); + EXPECT_TRUE(parse("%Ez", "+12:34:56", utc, &tp)); + EXPECT_EQ(convert(civil_second(1969, 12, 31, 11, 25, 4), utc), tp); + EXPECT_FALSE(parse("%Ez", "-12:34:5", utc, &tp)); + + // %Ez against +-HHMMSS. + EXPECT_TRUE(parse("%Ez", "+000000", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse("%Ez", "-123456", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 12, 34, 56), utc), tp); + EXPECT_TRUE(parse("%Ez", "+123456", utc, &tp)); + EXPECT_EQ(convert(civil_second(1969, 12, 31, 11, 25, 4), utc), tp); + EXPECT_FALSE(parse("%Ez", "-12345", utc, &tp)); + + // %E*z against +-HH:MM:SS. + EXPECT_TRUE(parse("%E*z", "+00:00:00", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse("%E*z", "-12:34:56", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 12, 34, 56), utc), tp); + EXPECT_TRUE(parse("%E*z", "+12:34:56", utc, &tp)); + EXPECT_EQ(convert(civil_second(1969, 12, 31, 11, 25, 4), utc), tp); + EXPECT_FALSE(parse("%E*z", "-12:34:5", utc, &tp)); + + // %E*z against +-HHMMSS. + EXPECT_TRUE(parse("%E*z", "+000000", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse("%E*z", "-123456", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 12, 34, 56), utc), tp); + EXPECT_TRUE(parse("%E*z", "+123456", utc, &tp)); + EXPECT_EQ(convert(civil_second(1969, 12, 31, 11, 25, 4), utc), tp); + EXPECT_FALSE(parse("%E*z", "-12345", utc, &tp)); + + // %E*z against +-HH:MM. + EXPECT_TRUE(parse("%E*z", "+00:00", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse("%E*z", "-12:34", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 12, 34, 0), utc), tp); + EXPECT_TRUE(parse("%E*z", "+12:34", utc, &tp)); + EXPECT_EQ(convert(civil_second(1969, 12, 31, 11, 26, 0), utc), tp); + EXPECT_FALSE(parse("%E*z", "-12:3", utc, &tp)); + + // %E*z against +-HHMM. + EXPECT_TRUE(parse("%E*z", "+0000", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse("%E*z", "-1234", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 12, 34, 0), utc), tp); + EXPECT_TRUE(parse("%E*z", "+1234", utc, &tp)); + EXPECT_EQ(convert(civil_second(1969, 12, 31, 11, 26, 0), utc), tp); + EXPECT_FALSE(parse("%E*z", "-123", utc, &tp)); + + // %E*z against +-HH. + EXPECT_TRUE(parse("%E*z", "+00", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse("%E*z", "-12", utc, &tp)); + EXPECT_EQ(convert(civil_second(1970, 1, 1, 12, 0, 0), utc), tp); + EXPECT_TRUE(parse("%E*z", "+12", utc, &tp)); + EXPECT_EQ(convert(civil_second(1969, 12, 31, 12, 0, 0), utc), tp); + EXPECT_FALSE(parse("%E*z", "-1", utc, &tp)); +} + +TEST(Parse, ExtendedYears) { + const time_zone utc = utc_time_zone(); + const char e4y_fmt[] = "%E4Y%m%d"; // no separators + time_point tp; + + // %E4Y consumes exactly four chars, including any sign. + EXPECT_TRUE(parse(e4y_fmt, "-9991127", utc, &tp)); + EXPECT_EQ(convert(civil_second(-999, 11, 27, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse(e4y_fmt, "-0991127", utc, &tp)); + EXPECT_EQ(convert(civil_second(-99, 11, 27, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse(e4y_fmt, "-0091127", utc, &tp)); + EXPECT_EQ(convert(civil_second(-9, 11, 27, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse(e4y_fmt, "-0011127", utc, &tp)); + EXPECT_EQ(convert(civil_second(-1, 11, 27, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse(e4y_fmt, "00001127", utc, &tp)); + EXPECT_EQ(convert(civil_second(0, 11, 27, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse(e4y_fmt, "00011127", utc, &tp)); + EXPECT_EQ(convert(civil_second(1, 11, 27, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse(e4y_fmt, "00091127", utc, &tp)); + EXPECT_EQ(convert(civil_second(9, 11, 27, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse(e4y_fmt, "00991127", utc, &tp)); + EXPECT_EQ(convert(civil_second(99, 11, 27, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse(e4y_fmt, "09991127", utc, &tp)); + EXPECT_EQ(convert(civil_second(999, 11, 27, 0, 0, 0), utc), tp); + EXPECT_TRUE(parse(e4y_fmt, "99991127", utc, &tp)); + EXPECT_EQ(convert(civil_second(9999, 11, 27, 0, 0, 0), utc), tp); + + // When the year is outside [-999:9999], the parse fails. + EXPECT_FALSE(parse(e4y_fmt, "-10001127", utc, &tp)); + EXPECT_FALSE(parse(e4y_fmt, "100001127", utc, &tp)); +} + +TEST(Parse, RFC3339Format) { + const time_zone tz = utc_time_zone(); + time_point tp; + EXPECT_TRUE(parse(RFC3339_sec, "2014-02-12T20:21:00+00:00", tz, &tp)); + ExpectTime(tp, tz, 2014, 2, 12, 20, 21, 0, 0, false, "UTC"); + + // Check that %Ez also accepts "Z" as a synonym for "+00:00". + time_point tp2; + EXPECT_TRUE(parse(RFC3339_sec, "2014-02-12T20:21:00Z", tz, &tp2)); + EXPECT_EQ(tp, tp2); +} + +TEST(Parse, MaxRange) { + const time_zone utc = utc_time_zone(); + time_point tp; + + // tests the upper limit using +00:00 offset + EXPECT_TRUE( + parse(RFC3339_sec, "292277026596-12-04T15:30:07+00:00", utc, &tp)); + EXPECT_EQ(tp, time_point::max()); + EXPECT_FALSE( + parse(RFC3339_sec, "292277026596-12-04T15:30:08+00:00", utc, &tp)); + + // tests the upper limit using -01:00 offset + EXPECT_TRUE( + parse(RFC3339_sec, "292277026596-12-04T14:30:07-01:00", utc, &tp)); + EXPECT_EQ(tp, time_point::max()); + EXPECT_FALSE( + parse(RFC3339_sec, "292277026596-12-04T15:30:07-01:00", utc, &tp)); + + // tests the lower limit using +00:00 offset + EXPECT_TRUE( + parse(RFC3339_sec, "-292277022657-01-27T08:29:52+00:00", utc, &tp)); + EXPECT_EQ(tp, time_point::min()); + EXPECT_FALSE( + parse(RFC3339_sec, "-292277022657-01-27T08:29:51+00:00", utc, &tp)); + + // tests the lower limit using +01:00 offset + EXPECT_TRUE( + parse(RFC3339_sec, "-292277022657-01-27T09:29:52+01:00", utc, &tp)); + EXPECT_EQ(tp, time_point::min()); + EXPECT_FALSE( + parse(RFC3339_sec, "-292277022657-01-27T08:29:51+01:00", utc, &tp)); + + // tests max/min civil-second overflow + EXPECT_FALSE(parse(RFC3339_sec, "9223372036854775807-12-31T23:59:59-00:01", + utc, &tp)); + EXPECT_FALSE(parse(RFC3339_sec, "-9223372036854775808-01-01T00:00:00+00:01", + utc, &tp)); + + // TODO: Add tests that parsing times with fractional seconds overflow + // appropriately. This can't be done until cctz::parse() properly detects + // overflow when combining the chrono seconds and femto. +} + +// +// Roundtrip test for format()/parse(). +// + +TEST(FormatParse, RoundTrip) { + time_zone lax; + EXPECT_TRUE(load_time_zone("America/Los_Angeles", &lax)); + const auto in = convert(civil_second(1977, 6, 28, 9, 8, 7), lax); + const auto subseconds = nanoseconds(654321); + + // RFC3339, which renders subseconds. + { + time_point out; + const std::string s = format(RFC3339_full, in + subseconds, lax); + EXPECT_TRUE(parse(RFC3339_full, s, lax, &out)) << s; + EXPECT_EQ(in + subseconds, out); // RFC3339_full includes %Ez + } + + // RFC1123, which only does whole seconds. + { + time_point out; + const std::string s = format(RFC1123_full, in, lax); + EXPECT_TRUE(parse(RFC1123_full, s, lax, &out)) << s; + EXPECT_EQ(in, out); // RFC1123_full includes %z + } + +#if defined(_WIN32) || defined(_WIN64) + // Initial investigations indicate the %c does not roundtrip on Windows. + // TODO: Figure out what is going on here (perhaps a locale problem). +#else + // Even though we don't know what %c will produce, it should roundtrip, + // but only in the 0-offset timezone. + { + time_point out; + time_zone utc = utc_time_zone(); + const std::string s = format("%c", in, utc); + EXPECT_TRUE(parse("%c", s, utc, &out)) << s; + EXPECT_EQ(in, out); + } +#endif +} + +TEST(FormatParse, RoundTripDistantFuture) { + const time_zone utc = utc_time_zone(); + const time_point in = time_point::max(); + const std::string s = format(RFC3339_full, in, utc); + time_point out; + EXPECT_TRUE(parse(RFC3339_full, s, utc, &out)) << s; + EXPECT_EQ(in, out); +} + +TEST(FormatParse, RoundTripDistantPast) { + const time_zone utc = utc_time_zone(); + const time_point in = time_point::min(); + const std::string s = format(RFC3339_full, in, utc); + time_point out; + EXPECT_TRUE(parse(RFC3339_full, s, utc, &out)) << s; + EXPECT_EQ(in, out); +} + +} // namespace cctz +} // namespace time_internal +} // namespace absl diff --git a/absl/time/internal/cctz/src/time_zone_if.cc b/absl/time/internal/cctz/src/time_zone_if.cc new file mode 100644 index 000000000..380834a17 --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_if.cc @@ -0,0 +1,41 @@ +// Copyright 2016 Google Inc. 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. + +#include "time_zone_if.h" +#include "time_zone_info.h" +#include "time_zone_libc.h" + +namespace absl { +namespace time_internal { +namespace cctz { + +std::unique_ptr TimeZoneIf::Load(const std::string& name) { + // Support "libc:localtime" and "libc:*" to access the legacy + // localtime and UTC support respectively from the C library. + if (name.compare(0, 5, "libc:") == 0) { + return std::unique_ptr(new TimeZoneLibC(name.substr(5))); + } + + // Otherwise use the "zoneinfo" implementation by default. + std::unique_ptr tz(new TimeZoneInfo); + if (!tz->Load(name)) tz.reset(); + return std::unique_ptr(tz.release()); +} + +// Defined out-of-line to avoid emitting a weak vtable in all TUs. +TimeZoneIf::~TimeZoneIf() {} + +} // namespace cctz +} // namespace time_internal +} // namespace absl diff --git a/absl/time/internal/cctz/src/time_zone_if.h b/absl/time/internal/cctz/src/time_zone_if.h new file mode 100644 index 000000000..ce4da1b72 --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_if.h @@ -0,0 +1,70 @@ +// Copyright 2016 Google Inc. 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. + +#ifndef ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_IF_H_ +#define ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_IF_H_ + +#include +#include +#include +#include + +#include "absl/time/internal/cctz/include/cctz/civil_time.h" +#include "absl/time/internal/cctz/include/cctz/time_zone.h" + +namespace absl { +namespace time_internal { +namespace cctz { + +// A simple interface used to hide time-zone complexities from time_zone::Impl. +// Subclasses implement the functions for civil-time conversions in the zone. +class TimeZoneIf { + public: + // A factory function for TimeZoneIf implementations. + static std::unique_ptr Load(const std::string& name); + + virtual ~TimeZoneIf(); + + virtual time_zone::absolute_lookup BreakTime( + const time_point& tp) const = 0; + virtual time_zone::civil_lookup MakeTime( + const civil_second& cs) const = 0; + + virtual std::string Description() const = 0; + virtual bool NextTransition(time_point* tp) const = 0; + virtual bool PrevTransition(time_point* tp) const = 0; + + protected: + TimeZoneIf() {} +}; + +// Convert between time_point and a count of seconds since +// the Unix epoch. We assume that the std::chrono::system_clock and the +// Unix clock are second aligned, but not that they share an epoch. +inline std::int_fast64_t ToUnixSeconds(const time_point& tp) { + return (tp - std::chrono::time_point_cast( + std::chrono::system_clock::from_time_t(0))) + .count(); +} +inline time_point FromUnixSeconds(std::int_fast64_t t) { + return std::chrono::time_point_cast( + std::chrono::system_clock::from_time_t(0)) + + sys_seconds(t); +} + +} // namespace cctz +} // namespace time_internal +} // namespace absl + +#endif // ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_IF_H_ diff --git a/absl/time/internal/cctz/src/time_zone_impl.cc b/absl/time/internal/cctz/src/time_zone_impl.cc new file mode 100644 index 000000000..b3f635f78 --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_impl.cc @@ -0,0 +1,117 @@ +// Copyright 2016 Google Inc. 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. + +#include "time_zone_impl.h" + +#include +#include +#include +#include + +#include "time_zone_fixed.h" + +namespace absl { +namespace time_internal { +namespace cctz { + +namespace { + +// time_zone::Impls are linked into a map to support fast lookup by name. +using TimeZoneImplByName = + std::unordered_map; +TimeZoneImplByName* time_zone_map = nullptr; + +// Mutual exclusion for time_zone_map. +std::mutex time_zone_mutex; + +} // namespace + +time_zone time_zone::Impl::UTC() { + return time_zone(UTCImpl()); +} + +bool time_zone::Impl::LoadTimeZone(const std::string& name, time_zone* tz) { + const time_zone::Impl* const utc_impl = UTCImpl(); + + // First check for UTC (which is never a key in time_zone_map). + auto offset = sys_seconds::zero(); + if (FixedOffsetFromName(name, &offset) && offset == sys_seconds::zero()) { + *tz = time_zone(utc_impl); + return true; + } + + // Then check, under a shared lock, whether the time zone has already + // been loaded. This is the common path. TODO: Move to shared_mutex. + { + std::lock_guard lock(time_zone_mutex); + if (time_zone_map != nullptr) { + TimeZoneImplByName::const_iterator itr = time_zone_map->find(name); + if (itr != time_zone_map->end()) { + *tz = time_zone(itr->second); + return itr->second != utc_impl; + } + } + } + + // Now check again, under an exclusive lock. + std::lock_guard lock(time_zone_mutex); + if (time_zone_map == nullptr) time_zone_map = new TimeZoneImplByName; + const Impl*& impl = (*time_zone_map)[name]; + if (impl == nullptr) { + // The first thread in loads the new time zone. + Impl* new_impl = new Impl(name); + new_impl->zone_ = TimeZoneIf::Load(new_impl->name_); + if (new_impl->zone_ == nullptr) { + delete new_impl; // free the nascent Impl + impl = utc_impl; // and fallback to UTC + } else { + impl = new_impl; // install new time zone + } + } + *tz = time_zone(impl); + return impl != utc_impl; +} + +const time_zone::Impl& time_zone::Impl::get(const time_zone& tz) { + if (tz.impl_ == nullptr) { + // Dereferencing an implicit-UTC time_zone is expected to be + // rare, so we don't mind paying a small synchronization cost. + return *UTCImpl(); + } + return *tz.impl_; +} + +void time_zone::Impl::ClearTimeZoneMapTestOnly() { + std::lock_guard lock(time_zone_mutex); + if (time_zone_map != nullptr) { + // Existing time_zone::Impl* entries are in the wild, so we simply + // leak them. Future requests will result in reloading the data. + time_zone_map->clear(); + } +} + +time_zone::Impl::Impl(const std::string& name) : name_(name) {} + +const time_zone::Impl* time_zone::Impl::UTCImpl() { + static Impl* utc_impl = [] { + Impl* impl = new Impl("UTC"); + impl->zone_ = TimeZoneIf::Load(impl->name_); // never fails + return impl; + }(); + return utc_impl; +} + +} // namespace cctz +} // namespace time_internal +} // namespace absl diff --git a/absl/time/internal/cctz/src/time_zone_impl.h b/absl/time/internal/cctz/src/time_zone_impl.h new file mode 100644 index 000000000..2c1c30b69 --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_impl.h @@ -0,0 +1,97 @@ +// Copyright 2016 Google Inc. 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. + +#ifndef ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_IMPL_H_ +#define ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_IMPL_H_ + +#include +#include + +#include "absl/time/internal/cctz/include/cctz/civil_time.h" +#include "absl/time/internal/cctz/include/cctz/time_zone.h" +#include "time_zone_if.h" +#include "time_zone_info.h" + +namespace absl { +namespace time_internal { +namespace cctz { + +// time_zone::Impl is the internal object referenced by a cctz::time_zone. +class time_zone::Impl { + public: + // The UTC time zone. Also used for other time zones that fail to load. + static time_zone UTC(); + + // Load a named time zone. Returns false if the name is invalid, or if + // some other kind of error occurs. Note that loading "UTC" never fails. + static bool LoadTimeZone(const std::string& name, time_zone* tz); + + // Dereferences the time_zone to obtain its Impl. + static const time_zone::Impl& get(const time_zone& tz); + + // Clears the map of cached time zones. Primarily for use in benchmarks + // that gauge the performance of loading/parsing the time-zone data. + static void ClearTimeZoneMapTestOnly(); + + // The primary key is the time-zone ID (e.g., "America/New_York"). + const std::string& name() const { return name_; } + + // Breaks a time_point down to civil-time components in this time zone. + time_zone::absolute_lookup BreakTime( + const time_point& tp) const { + return zone_->BreakTime(tp); + } + + // Converts the civil-time components in this time zone into a time_point. + // That is, the opposite of BreakTime(). The requested civil time may be + // ambiguous or illegal due to a change of UTC offset. + time_zone::civil_lookup MakeTime(const civil_second& cs) const { + return zone_->MakeTime(cs); + } + + // Returns an implementation-specific description of this time zone. + std::string Description() const { return zone_->Description(); } + + // Finds the time of the next/previous offset change in this time zone. + // + // By definition, NextTransition(&tp) returns false when tp has its + // maximum value, and PrevTransition(&tp) returns false when tp has its + // mimimum value. If the zone has no transitions, the result will also + // be false no matter what the argument. + // + // Otherwise, when tp has its mimimum value, NextTransition(&tp) returns + // true and sets tp to the first recorded transition. Chains of calls + // to NextTransition()/PrevTransition() will eventually return false, + // but it is unspecified exactly when NextTransition(&tp) jumps to false, + // or what time is set by PrevTransition(&tp) for a very distant tp. + bool NextTransition(time_point* tp) const { + return zone_->NextTransition(tp); + } + bool PrevTransition(time_point* tp) const { + return zone_->PrevTransition(tp); + } + + private: + explicit Impl(const std::string& name); + static const Impl* UTCImpl(); + + const std::string name_; + std::unique_ptr zone_; +}; + +} // namespace cctz +} // namespace time_internal +} // namespace absl + +#endif // ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_IMPL_H_ diff --git a/absl/time/internal/cctz/src/time_zone_info.cc b/absl/time/internal/cctz/src/time_zone_info.cc new file mode 100644 index 000000000..20bba28b3 --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_info.cc @@ -0,0 +1,956 @@ +// Copyright 2016 Google Inc. 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. + +// This file implements the TimeZoneIf interface using the "zoneinfo" +// data provided by the IANA Time Zone Database (i.e., the only real game +// in town). +// +// TimeZoneInfo represents the history of UTC-offset changes within a time +// zone. Most changes are due to daylight-saving rules, but occasionally +// shifts are made to the time-zone's base offset. The database only attempts +// to be definitive for times since 1970, so be wary of local-time conversions +// before that. Also, rule and zone-boundary changes are made at the whim +// of governments, so the conversion of future times needs to be taken with +// a grain of salt. +// +// For more information see tzfile(5), http://www.iana.org/time-zones, or +// http://en.wikipedia.org/wiki/Zoneinfo. +// +// Note that we assume the proleptic Gregorian calendar and 60-second +// minutes throughout. + +#include "time_zone_info.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "absl/time/internal/cctz/include/cctz/civil_time.h" +#include "time_zone_fixed.h" +#include "time_zone_posix.h" + +namespace absl { +namespace time_internal { +namespace cctz { + +namespace { + +inline bool IsLeap(year_t year) { + return (year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0); +} + +// The number of days in non-leap and leap years respectively. +const std::int_least32_t kDaysPerYear[2] = {365, 366}; + +// The day offsets of the beginning of each (1-based) month in non-leap and +// leap years respectively (e.g., 335 days before December in a leap year). +const std::int_least16_t kMonthOffsets[2][1 + 12 + 1] = { + {-1, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365}, + {-1, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366}, +}; + +// We reject leap-second encoded zoneinfo and so assume 60-second minutes. +const std::int_least32_t kSecsPerDay = 24 * 60 * 60; + +// 400-year chunks always have 146097 days (20871 weeks). +const std::int_least64_t kSecsPer400Years = 146097LL * kSecsPerDay; + +// Like kDaysPerYear[] but scaled up by a factor of kSecsPerDay. +const std::int_least32_t kSecsPerYear[2] = { + 365 * kSecsPerDay, + 366 * kSecsPerDay, +}; + +// Single-byte, unsigned numeric values are encoded directly. +inline std::uint_fast8_t Decode8(const char* cp) { + return static_cast(*cp) & 0xff; +} + +// Multi-byte, numeric values are encoded using a MSB first, +// twos-complement representation. These helpers decode, from +// the given address, 4-byte and 8-byte values respectively. +// Note: If int_fastXX_t == intXX_t and this machine is not +// twos complement, then there will be at least one input value +// we cannot represent. +std::int_fast32_t Decode32(const char* cp) { + std::uint_fast32_t v = 0; + for (int i = 0; i != (32 / 8); ++i) v = (v << 8) | Decode8(cp++); + const std::int_fast32_t s32max = 0x7fffffff; + const auto s32maxU = static_cast(s32max); + if (v <= s32maxU) return static_cast(v); + return static_cast(v - s32maxU - 1) - s32max - 1; +} + +std::int_fast64_t Decode64(const char* cp) { + std::uint_fast64_t v = 0; + for (int i = 0; i != (64 / 8); ++i) v = (v << 8) | Decode8(cp++); + const std::int_fast64_t s64max = 0x7fffffffffffffff; + const auto s64maxU = static_cast(s64max); + if (v <= s64maxU) return static_cast(v); + return static_cast(v - s64maxU - 1) - s64max - 1; +} + +// Generate a year-relative offset for a PosixTransition. +std::int_fast64_t TransOffset(bool leap_year, int jan1_weekday, + const PosixTransition& pt) { + std::int_fast64_t days = 0; + switch (pt.date.fmt) { + case PosixTransition::J: { + days = pt.date.j.day; + if (!leap_year || days < kMonthOffsets[1][3]) days -= 1; + break; + } + case PosixTransition::N: { + days = pt.date.n.day; + break; + } + case PosixTransition::M: { + const bool last_week = (pt.date.m.week == 5); + days = kMonthOffsets[leap_year][pt.date.m.month + last_week]; + const std::int_fast64_t weekday = (jan1_weekday + days) % 7; + if (last_week) { + days -= (weekday + 7 - 1 - pt.date.m.weekday) % 7 + 1; + } else { + days += (pt.date.m.weekday + 7 - weekday) % 7; + days += (pt.date.m.week - 1) * 7; + } + break; + } + } + return (days * kSecsPerDay) + pt.time.offset; +} + +inline time_zone::civil_lookup MakeUnique(const time_point& tp) { + time_zone::civil_lookup cl; + cl.kind = time_zone::civil_lookup::UNIQUE; + cl.pre = cl.trans = cl.post = tp; + return cl; +} + +inline time_zone::civil_lookup MakeUnique(std::int_fast64_t unix_time) { + return MakeUnique(FromUnixSeconds(unix_time)); +} + +inline time_zone::civil_lookup MakeSkipped(const Transition& tr, + const civil_second& cs) { + time_zone::civil_lookup cl; + cl.kind = time_zone::civil_lookup::SKIPPED; + cl.pre = FromUnixSeconds(tr.unix_time - 1 + (cs - tr.prev_civil_sec)); + cl.trans = FromUnixSeconds(tr.unix_time); + cl.post = FromUnixSeconds(tr.unix_time - (tr.civil_sec - cs)); + return cl; +} + +inline time_zone::civil_lookup MakeRepeated(const Transition& tr, + const civil_second& cs) { + time_zone::civil_lookup cl; + cl.kind = time_zone::civil_lookup::REPEATED; + cl.pre = FromUnixSeconds(tr.unix_time - 1 - (tr.prev_civil_sec - cs)); + cl.trans = FromUnixSeconds(tr.unix_time); + cl.post = FromUnixSeconds(tr.unix_time + (cs - tr.civil_sec)); + return cl; +} + +inline civil_second YearShift(const civil_second& cs, year_t shift) { + return civil_second(cs.year() + shift, cs.month(), cs.day(), + cs.hour(), cs.minute(), cs.second()); +} + +} // namespace + +// What (no leap-seconds) UTC+seconds zoneinfo would look like. +bool TimeZoneInfo::ResetToBuiltinUTC(const sys_seconds& offset) { + transition_types_.resize(1); + TransitionType& tt(transition_types_.back()); + tt.utc_offset = static_cast(offset.count()); + tt.is_dst = false; + tt.abbr_index = 0; + + // We temporarily add some redundant, contemporary (2012 through 2021) + // 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 + 1325376000LL, // 2012-01-01T00:00:00+00:00 + 1356998400LL, // 2013-01-01T00:00:00+00:00 + 1388534400LL, // 2014-01-01T00:00:00+00:00 + 1420070400LL, // 2015-01-01T00:00:00+00:00 + 1451606400LL, // 2016-01-01T00:00:00+00:00 + 1483228800LL, // 2017-01-01T00:00:00+00:00 + 1514764800LL, // 2018-01-01T00:00:00+00:00 + 1546300800LL, // 2019-01-01T00:00:00+00:00 + 1577836800LL, // 2020-01-01T00:00:00+00:00 + 1609459200LL, // 2021-01-01T00:00:00+00:00 + 2147483647LL, // 2^31 - 1 + }) { + Transition& tr(*transitions_.emplace(transitions_.end())); + tr.unix_time = unix_time; + tr.type_index = 0; + tr.civil_sec = LocalTime(tr.unix_time, tt).cs; + tr.prev_civil_sec = tr.civil_sec - 1; + } + + default_transition_type_ = 0; + abbreviations_ = FixedOffsetToAbbr(offset); + abbreviations_.append(1, '\0'); // add NUL + future_spec_.clear(); // never needed for a fixed-offset zone + extended_ = false; + + tt.civil_max = LocalTime(sys_seconds::max().count(), tt).cs; + tt.civil_min = LocalTime(sys_seconds::min().count(), tt).cs; + + transitions_.shrink_to_fit(); + return true; +} + +// Builds the in-memory header using the raw bytes from the file. +bool TimeZoneInfo::Header::Build(const tzhead& tzh) { + std::int_fast32_t v; + if ((v = Decode32(tzh.tzh_timecnt)) < 0) return false; + timecnt = static_cast(v); + if ((v = Decode32(tzh.tzh_typecnt)) < 0) return false; + typecnt = static_cast(v); + if ((v = Decode32(tzh.tzh_charcnt)) < 0) return false; + charcnt = static_cast(v); + if ((v = Decode32(tzh.tzh_leapcnt)) < 0) return false; + leapcnt = static_cast(v); + if ((v = Decode32(tzh.tzh_ttisstdcnt)) < 0) return false; + ttisstdcnt = static_cast(v); + if ((v = Decode32(tzh.tzh_ttisgmtcnt)) < 0) return false; + ttisgmtcnt = static_cast(v); + return true; +} + +// How many bytes of data are associated with this header. The result +// depends upon whether this is a section with 4-byte or 8-byte times. +std::size_t TimeZoneInfo::Header::DataLength(std::size_t time_len) const { + std::size_t len = 0; + len += (time_len + 1) * timecnt; // unix_time + type_index + len += (4 + 1 + 1) * typecnt; // utc_offset + is_dst + abbr_index + len += 1 * charcnt; // abbreviations + len += (time_len + 4) * leapcnt; // leap-time + TAI-UTC + len += 1 * ttisstdcnt; // UTC/local indicators + len += 1 * ttisgmtcnt; // standard/wall indicators + 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). +bool TimeZoneInfo::EquivTransitions(std::uint_fast8_t tt1_index, + std::uint_fast8_t tt2_index) const { + 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.abbr_index != tt2.abbr_index) return false; + return true; +} + +// Use the POSIX-TZ-environment-variable-style std::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) { + extended_ = false; + bool extending = !future_spec_.empty(); + + PosixTimeZone posix; + if (extending && !ParsePosixSpec(future_spec_, &posix)) { + std::clog << name << ": Failed to parse '" << future_spec_ << "'\n"; + extending = false; + } + + 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 + } + + // 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); + 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(); + 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 + 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; + } + assert(tr == &transitions_[0] + transitions_.size()); +} + +bool TimeZoneInfo::Load(const std::string& name, ZoneInfoSource* zip) { + // Read and validate the header. + tzhead tzh; + if (zip->Read(&tzh, sizeof(tzh)) != sizeof(tzh)) + return false; + if (strncmp(tzh.tzh_magic, TZ_MAGIC, sizeof(tzh.tzh_magic)) != 0) + return false; + Header hdr; + if (!hdr.Build(tzh)) + return false; + std::size_t time_len = 4; + if (tzh.tzh_version[0] != '\0') { + // Skip the 4-byte data. + if (zip->Skip(hdr.DataLength(time_len)) != 0) + return false; + // Read and validate the header for the 8-byte data. + if (zip->Read(&tzh, sizeof(tzh)) != sizeof(tzh)) + return false; + if (strncmp(tzh.tzh_magic, TZ_MAGIC, sizeof(tzh.tzh_magic)) != 0) + return false; + if (tzh.tzh_version[0] == '\0') + return false; + if (!hdr.Build(tzh)) + return false; + time_len = 8; + } + if (hdr.typecnt == 0) + return false; + if (hdr.leapcnt != 0) { + // This code assumes 60-second minutes so we do not want + // the leap-second encoded zoneinfo. We could reverse the + // compensation, but the "right" encoding is rarely used + // so currently we simply reject such data. + return false; + } + if (hdr.ttisstdcnt != 0 && hdr.ttisstdcnt != hdr.typecnt) + return false; + if (hdr.ttisgmtcnt != 0 && hdr.ttisgmtcnt != hdr.typecnt) + return false; + + // Read the data into a local buffer. + std::size_t len = hdr.DataLength(time_len); + std::vector tbuf(len); + if (zip->Read(tbuf.data(), len) != len) + return false; + const char* bp = tbuf.data(); + + // Decode and validate the transitions. + transitions_.reserve(hdr.timecnt + 2); // We might add a couple. + 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); + bp += time_len; + if (i != 0) { + // Check that the transitions are ordered by time (as zic guarantees). + if (!Transition::ByUnixTime()(transitions_[i - 1], transitions_[i])) + return false; // out of order + } + } + bool seen_type_0 = false; + for (std::size_t i = 0; i != hdr.timecnt; ++i) { + transitions_[i].type_index = Decode8(bp++); + if (transitions_[i].type_index >= hdr.typecnt) + return false; + if (transitions_[i].type_index == 0) + seen_type_0 = true; + } + + // Decode and validate the transition types. + transition_types_.resize(hdr.typecnt); + for (std::size_t i = 0; i != hdr.typecnt; ++i) { + transition_types_[i].utc_offset = + static_cast(Decode32(bp)); + if (transition_types_[i].utc_offset >= kSecsPerDay || + transition_types_[i].utc_offset <= -kSecsPerDay) + return false; + bp += 4; + transition_types_[i].is_dst = (Decode8(bp++) != 0); + transition_types_[i].abbr_index = Decode8(bp++); + if (transition_types_[i].abbr_index >= hdr.charcnt) + return false; + } + + // Determine the before-first-transition type. + default_transition_type_ = 0; + if (seen_type_0 && hdr.timecnt != 0) { + std::uint_fast8_t index = 0; + if (transition_types_[0].is_dst) { + index = transitions_[0].type_index; + while (index != 0 && transition_types_[index].is_dst) + --index; + } + while (index != hdr.typecnt && transition_types_[index].is_dst) + ++index; + if (index != hdr.typecnt) + default_transition_type_ = index; + } + + // Copy all the abbreviations. + abbreviations_.assign(bp, hdr.charcnt); + bp += hdr.charcnt; + + // Skip the unused portions. We've already dispensed with leap-second + // encoded zoneinfo. The ttisstd/ttisgmt indicators only apply when + // interpreting a POSIX spec that does not include start/end rules, and + // that isn't the case here (see "zic -p"). + bp += (8 + 4) * hdr.leapcnt; // leap-time + TAI-UTC + bp += 1 * hdr.ttisstdcnt; // UTC/local indicators + bp += 1 * hdr.ttisgmtcnt; // standard/wall indicators + assert(bp == tbuf.data() + tbuf.size()); + + future_spec_.clear(); + if (tzh.tzh_version[0] != '\0') { + // Snarf up the NL-enclosed future POSIX spec. Note + // that version '3' files utilize an extended format. + auto get_char = [](ZoneInfoSource* zip) -> int { + unsigned char ch; // all non-EOF results are positive + return (zip->Read(&ch, 1) == 1) ? ch : EOF; + }; + if (get_char(zip) != '\n') + return false; + for (int c = get_char(zip); c != '\n'; c = get_char(zip)) { + if (c == EOF) + return false; + future_spec_.push_back(static_cast(c)); + } + } + + // We don't check for EOF so that we're forwards compatible. + + // Trim redundant transitions. zic may have added these to work around + // differences between the glibc and reference implementations (see + // zic.c:dontmerge) and the Qt library (see zic.c:WORK_AROUND_QTBUG_53071). + // For us, they just get in the way when we do future_spec_ extension. + while (hdr.timecnt > 1) { + if (!EquivTransitions(transitions_[hdr.timecnt - 1].type_index, + transitions_[hdr.timecnt - 2].type_index)) { + break; + } + hdr.timecnt -= 1; + } + 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. + 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.type_index = default_transition_type_; + hdr.timecnt += 1; + } + + // Extend the transitions using the future specification. + ExtendTransitions(name, hdr); + + // Compute the local civil time for each transition and the preceding + // second. These will be used for reverse conversions in MakeTime(). + const TransitionType* ttp = &transition_types_[default_transition_type_]; + for (std::size_t i = 0; i != transitions_.size(); ++i) { + Transition& tr(transitions_[i]); + tr.prev_civil_sec = LocalTime(tr.unix_time, *ttp).cs - 1; + ttp = &transition_types_[tr.type_index]; + tr.civil_sec = LocalTime(tr.unix_time, *ttp).cs; + if (i != 0) { + // Check that the transitions are ordered by civil time. Essentially + // this means that an offset change cannot cross another such change. + // No one does this in practice, and we depend on it in MakeTime(). + if (!Transition::ByCivilTime()(transitions_[i - 1], tr)) + return false; // out of order + } + } + + // Compute the maximum/minimum civil times that can be converted to a + // time_point for each of the zone's transition types. + for (auto& tt : transition_types_) { + tt.civil_max = LocalTime(sys_seconds::max().count(), tt).cs; + tt.civil_min = LocalTime(sys_seconds::min().count(), tt).cs; + } + + transitions_.shrink_to_fit(); + return true; +} + +namespace { + +// fopen(3) adaptor. +inline FILE* FOpen(const char* path, const char* mode) { +#if defined(_MSC_VER) + FILE* fp; + if (fopen_s(&fp, path, mode) != 0) fp = nullptr; + return fp; +#else + return fopen(path, mode); // TODO: Enable the close-on-exec flag. +#endif +} + +// A stdio(3)-backed implementation of ZoneInfoSource. +class FileZoneInfoSource : public ZoneInfoSource { + public: + static std::unique_ptr Open(const std::string& name); + + std::size_t Read(void* ptr, std::size_t size) override { + size = std::min(size, len_); + std::size_t nread = fread(ptr, 1, size, fp_.get()); + len_ -= nread; + return nread; + } + int Skip(std::size_t offset) override { + offset = std::min(offset, len_); + int rc = fseek(fp_.get(), static_cast(offset), SEEK_CUR); + if (rc == 0) len_ -= offset; + return rc; + } + + protected: + explicit FileZoneInfoSource( + FILE* fp, std::size_t len = std::numeric_limits::max()) + : fp_(fp, fclose), len_(len) {} + + private: + std::unique_ptr fp_; + std::size_t len_; +}; + +std::unique_ptr FileZoneInfoSource::Open( + const std::string& name) { + // Use of the "file:" prefix is intended for testing purposes only. + if (name.compare(0, 5, "file:") == 0) return Open(name.substr(5)); + + // Map the time-zone name to a path name. + std::string path; + if (name.empty() || name[0] != '/') { + const char* tzdir = "/usr/share/zoneinfo"; + char* tzdir_env = nullptr; +#if defined(_MSC_VER) + _dupenv_s(&tzdir_env, nullptr, "TZDIR"); +#else + tzdir_env = std::getenv("TZDIR"); +#endif + if (tzdir_env && *tzdir_env) tzdir = tzdir_env; + path += tzdir; + path += '/'; +#if defined(_MSC_VER) + free(tzdir_env); +#endif + } + path += name; + + // Open the zoneinfo file. + FILE* fp = FOpen(path.c_str(), "rb"); + if (fp == nullptr) return nullptr; + std::size_t length = 0; + if (fseek(fp, 0, SEEK_END) == 0) { + long pos = ftell(fp); + if (pos >= 0) { + length = static_cast(pos); + } + rewind(fp); + } + return std::unique_ptr(new FileZoneInfoSource(fp, length)); +} + +#if defined(__ANDROID__) +class AndroidZoneInfoSource : public FileZoneInfoSource { + public: + static std::unique_ptr Open(const std::string& name); + + private: + explicit AndroidZoneInfoSource(FILE* fp, std::size_t len) + : FileZoneInfoSource(fp, len) {} +}; + +std::unique_ptr AndroidZoneInfoSource::Open( + const std::string& name) { + // Use of the "file:" prefix is intended for testing purposes only. + if (name.compare(0, 5, "file:") == 0) return Open(name.substr(5)); + + // See Android's libc/tzcode/bionic.cpp for additional information. + for (const char* tzdata : {"/data/misc/zoneinfo/current/tzdata", + "/system/usr/share/zoneinfo/tzdata"}) { + std::unique_ptr fp(FOpen(tzdata, "rb"), fclose); + if (fp.get() == nullptr) continue; + + char hbuf[24]; // covers header.zonetab_offset too + if (fread(hbuf, 1, sizeof(hbuf), fp.get()) != sizeof(hbuf)) continue; + if (strncmp(hbuf, "tzdata", 6) != 0) continue; + const std::int_fast32_t index_offset = Decode32(hbuf + 12); + const std::int_fast32_t data_offset = Decode32(hbuf + 16); + if (index_offset < 0 || data_offset < index_offset) continue; + if (fseek(fp.get(), static_cast(index_offset), SEEK_SET) != 0) + continue; + + char ebuf[52]; // covers entry.unused too + const std::size_t index_size = + static_cast(data_offset - index_offset); + const std::size_t zonecnt = index_size / sizeof(ebuf); + if (zonecnt * sizeof(ebuf) != index_size) continue; + for (std::size_t i = 0; i != zonecnt; ++i) { + if (fread(ebuf, 1, sizeof(ebuf), fp.get()) != sizeof(ebuf)) break; + const std::int_fast32_t start = data_offset + Decode32(ebuf + 40); + const std::int_fast32_t length = Decode32(ebuf + 44); + if (start < 0 || length < 0) break; + ebuf[40] = '\0'; // ensure zone name is NUL terminated + if (strcmp(name.c_str(), ebuf) == 0) { + if (fseek(fp.get(), static_cast(start), SEEK_SET) != 0) break; + return std::unique_ptr(new AndroidZoneInfoSource( + fp.release(), static_cast(length))); + } + } + } + return nullptr; +} +#endif + +} // namespace + +bool TimeZoneInfo::Load(const std::string& name) { + // We can ensure that the loading of UTC or any other fixed-offset + // zone never fails because the simple, fixed-offset state can be + // internally generated. Note that this depends on our choice to not + // accept leap-second encoded ("right") zoneinfo. + auto offset = sys_seconds::zero(); + if (FixedOffsetFromName(name, &offset)) { + return ResetToBuiltinUTC(offset); + } + + // 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 defined(__ANDROID__) + if (auto zip = AndroidZoneInfoSource::Open(name)) return zip; +#endif + return nullptr; + }); + return zip != nullptr && Load(name, zip.get()); +} + +// BreakTime() translation for a particular transition type. +time_zone::absolute_lookup TimeZoneInfo::LocalTime( + std::int_fast64_t unix_time, const TransitionType& tt) const { + // A civil time in "+offset" looks like (time+offset) in UTC. + // Note: We perform two additions in the civil_second domain to + // sidestep the chance of overflow in (unix_time + tt.utc_offset). + return {(civil_second() + unix_time) + tt.utc_offset, + tt.utc_offset, tt.is_dst, &abbreviations_[tt.abbr_index]}; +} + +// BreakTime() translation for a particular transition. +time_zone::absolute_lookup TimeZoneInfo::LocalTime( + std::int_fast64_t unix_time, const Transition& tr) const { + const TransitionType& tt = transition_types_[tr.type_index]; + // Note: (unix_time - tr.unix_time) will never overflow as we + // have ensured that there is always a "nearby" transition. + return {tr.civil_sec + (unix_time - tr.unix_time), // TODO: Optimize. + tt.utc_offset, tt.is_dst, &abbreviations_[tt.abbr_index]}; +} + +// MakeTime() translation with a conversion-preserving +N * 400-year shift. +time_zone::civil_lookup TimeZoneInfo::TimeLocal(const civil_second& cs, + year_t c4_shift) const { + assert(last_year_ - 400 < cs.year() && cs.year() <= last_year_); + time_zone::civil_lookup cl = MakeTime(cs); + if (c4_shift > sys_seconds::max().count() / kSecsPer400Years) { + cl.pre = cl.trans = cl.post = time_point::max(); + } else { + const auto offset = sys_seconds(c4_shift * kSecsPer400Years); + const auto limit = time_point::max() - offset; + for (auto* tp : {&cl.pre, &cl.trans, &cl.post}) { + if (*tp > limit) { + *tp = time_point::max(); + } else { + *tp += offset; + } + } + } + return cl; +} + +time_zone::absolute_lookup TimeZoneInfo::BreakTime( + const time_point& tp) const { + std::int_fast64_t unix_time = ToUnixSeconds(tp); + const std::size_t timecnt = transitions_.size(); + assert(timecnt != 0); // We always add a transition. + + if (unix_time < transitions_[0].unix_time) { + return LocalTime(unix_time, transition_types_[default_transition_type_]); + } + if (unix_time >= transitions_[timecnt - 1].unix_time) { + // After the last transition. If we extended the transitions using + // future_spec_, shift back to a supported year using the 400-year + // cycle of calendaric equivalence and then compensate accordingly. + if (extended_) { + const std::int_fast64_t diff = + unix_time - transitions_[timecnt - 1].unix_time; + const year_t shift = diff / kSecsPer400Years + 1; + const auto d = sys_seconds(shift * kSecsPer400Years); + time_zone::absolute_lookup al = BreakTime(tp - d); + al.cs = YearShift(al.cs, shift * 400); + return al; + } + return LocalTime(unix_time, transitions_[timecnt - 1]); + } + + const std::size_t hint = local_time_hint_.load(std::memory_order_relaxed); + if (0 < hint && hint < timecnt) { + if (transitions_[hint - 1].unix_time <= unix_time) { + if (unix_time < transitions_[hint].unix_time) { + return LocalTime(unix_time, transitions_[hint - 1]); + } + } + } + + const Transition target = {unix_time, 0, civil_second(), civil_second()}; + const Transition* begin = &transitions_[0]; + const Transition* tr = std::upper_bound(begin, begin + timecnt, target, + Transition::ByUnixTime()); + local_time_hint_.store(static_cast(tr - begin), + std::memory_order_relaxed); + return LocalTime(unix_time, *--tr); +} + +time_zone::civil_lookup TimeZoneInfo::MakeTime(const civil_second& cs) const { + const std::size_t timecnt = transitions_.size(); + assert(timecnt != 0); // We always add a transition. + + // Find the first transition after our target civil time. + const Transition* tr = nullptr; + const Transition* begin = &transitions_[0]; + const Transition* end = begin + timecnt; + if (cs < begin->civil_sec) { + tr = begin; + } else if (cs >= transitions_[timecnt - 1].civil_sec) { + tr = end; + } else { + const std::size_t hint = time_local_hint_.load(std::memory_order_relaxed); + if (0 < hint && hint < timecnt) { + if (transitions_[hint - 1].civil_sec <= cs) { + if (cs < transitions_[hint].civil_sec) { + tr = begin + hint; + } + } + } + if (tr == nullptr) { + const Transition target = {0, 0, cs, civil_second()}; + tr = std::upper_bound(begin, end, target, Transition::ByCivilTime()); + time_local_hint_.store(static_cast(tr - begin), + std::memory_order_relaxed); + } + } + + if (tr == begin) { + if (tr->prev_civil_sec >= cs) { + // Before first transition, so use the default offset. + const TransitionType& tt(transition_types_[default_transition_type_]); + if (cs < tt.civil_min) return MakeUnique(time_point::min()); + return MakeUnique(cs - (civil_second() + tt.utc_offset)); + } + // tr->prev_civil_sec < cs < tr->civil_sec + return MakeSkipped(*tr, cs); + } + + if (tr == end) { + if (cs > (--tr)->prev_civil_sec) { + // After the last transition. If we extended the transitions using + // future_spec_, shift back to a supported year using the 400-year + // cycle of calendaric equivalence and then compensate accordingly. + if (extended_ && cs.year() > last_year_) { + const year_t shift = (cs.year() - last_year_ - 1) / 400 + 1; + return TimeLocal(YearShift(cs, shift * -400), shift); + } + const TransitionType& tt(transition_types_[tr->type_index]); + if (cs > tt.civil_max) return MakeUnique(time_point::max()); + return MakeUnique(tr->unix_time + (cs - tr->civil_sec)); + } + // tr->civil_sec <= cs <= tr->prev_civil_sec + return MakeRepeated(*tr, cs); + } + + if (tr->prev_civil_sec < cs) { + // tr->prev_civil_sec < cs < tr->civil_sec + return MakeSkipped(*tr, cs); + } + + if (cs <= (--tr)->prev_civil_sec) { + // tr->civil_sec <= cs <= tr->prev_civil_sec + return MakeRepeated(*tr, cs); + } + + // In between transitions. + return MakeUnique(tr->unix_time + (cs - tr->civil_sec)); +} + +std::string TimeZoneInfo::Description() const { + std::ostringstream oss; + // TODO: It would nice if the zoneinfo data included the zone name. + // TODO: It would nice if the zoneinfo data included the tzdb version. + oss << "#trans=" << transitions_.size(); + oss << " #types=" << transition_types_.size(); + oss << " spec='" << future_spec_ << "'"; + return oss.str(); +} + +bool TimeZoneInfo::NextTransition(time_point* tp) const { + if (transitions_.empty()) return false; + 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. + ++begin; + } + std::int_fast64_t unix_time = ToUnixSeconds(*tp); + const Transition target = { unix_time }; + const Transition* tr = std::upper_bound(begin, end, target, + Transition::ByUnixTime()); + if (tr != begin) { // skip no-op transitions + for (; tr != end; ++tr) { + if (!EquivTransitions(tr[-1].type_index, tr[0].type_index)) break; + } + } + // When tr == end we return false, ignoring future_spec_. + if (tr == end) return false; + *tp = FromUnixSeconds(tr->unix_time); + return true; +} + +bool TimeZoneInfo::PrevTransition(time_point* tp) const { + if (transitions_.empty()) return false; + 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. + ++begin; + } + std::int_fast64_t unix_time = ToUnixSeconds(*tp); + if (FromUnixSeconds(unix_time) != *tp) { + if (unix_time == std::numeric_limits::max()) { + if (end == begin) return false; // Ignore future_spec_. + *tp = FromUnixSeconds((--end)->unix_time); + return true; + } + unix_time += 1; // ceils + } + const Transition target = { unix_time }; + const Transition* tr = std::lower_bound(begin, end, target, + Transition::ByUnixTime()); + if (tr != begin) { // skip no-op transitions + for (; tr - 1 != begin; --tr) { + if (!EquivTransitions(tr[-2].type_index, tr[-1].type_index)) break; + } + } + // When tr == end we return the "last" transition, ignoring future_spec_. + if (tr == begin) return false; + *tp = FromUnixSeconds((--tr)->unix_time); + return true; +} + +} // namespace cctz +} // namespace time_internal +} // namespace absl diff --git a/absl/time/internal/cctz/src/time_zone_info.h b/absl/time/internal/cctz/src/time_zone_info.h new file mode 100644 index 000000000..b4d1696bf --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_info.h @@ -0,0 +1,132 @@ +// Copyright 2016 Google Inc. 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. + +#ifndef ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_INFO_H_ +#define ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_INFO_H_ + +#include +#include +#include +#include +#include + +#include "absl/time/internal/cctz/include/cctz/civil_time.h" +#include "absl/time/internal/cctz/include/cctz/time_zone.h" +#include "absl/time/internal/cctz/include/cctz/zone_info_source.h" +#include "time_zone_if.h" +#include "tzfile.h" + +namespace absl { +namespace time_internal { +namespace cctz { + +// A transition to a new UTC offset. +struct Transition { + std::int_least64_t unix_time; // the instant of this transition + std::uint_least8_t type_index; // index of the transition type + civil_second civil_sec; // local civil time of transition + civil_second prev_civil_sec; // local civil time one second earlier + + struct ByUnixTime { + inline bool operator()(const Transition& lhs, const Transition& rhs) const { + return lhs.unix_time < rhs.unix_time; + } + }; + struct ByCivilTime { + inline bool operator()(const Transition& lhs, const Transition& rhs) const { + return lhs.civil_sec < rhs.civil_sec; + } + }; +}; + +// The characteristics of a particular transition. +struct TransitionType { + std::int_least32_t utc_offset; // the new prevailing UTC offset + civil_second civil_max; // max convertible civil time for offset + civil_second civil_min; // min convertible civil time for offset + bool is_dst; // did we move into daylight-saving time + std::uint_least8_t abbr_index; // index of the new abbreviation +}; + +// A time zone backed by the IANA Time Zone Database (zoneinfo). +class TimeZoneInfo : public TimeZoneIf { + public: + TimeZoneInfo() = default; + TimeZoneInfo(const TimeZoneInfo&) = delete; + TimeZoneInfo& operator=(const TimeZoneInfo&) = delete; + + // Loads the zoneinfo for the given name, returning true if successful. + bool Load(const std::string& name); + + // TimeZoneIf implementations. + time_zone::absolute_lookup BreakTime( + const time_point& tp) const override; + time_zone::civil_lookup MakeTime( + const civil_second& cs) const override; + std::string Description() const override; + bool NextTransition(time_point* tp) const override; + bool PrevTransition(time_point* tp) const override; + + private: + struct Header { // counts of: + std::size_t timecnt; // transition times + std::size_t typecnt; // transition types + std::size_t charcnt; // zone abbreviation characters + std::size_t leapcnt; // leap seconds (we expect none) + std::size_t ttisstdcnt; // UTC/local indicators (unused) + std::size_t ttisgmtcnt; // standard/wall indicators (unused) + + bool Build(const tzhead& tzh); + 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 EquivTransitions(std::uint_fast8_t tt1_index, + std::uint_fast8_t tt2_index) const; + void ExtendTransitions(const std::string& name, const Header& hdr); + + bool ResetToBuiltinUTC(const sys_seconds& offset); + bool Load(const std::string& name, ZoneInfoSource* zip); + + // Helpers for BreakTime() and MakeTime(). + time_zone::absolute_lookup LocalTime(std::int_fast64_t unix_time, + const TransitionType& tt) const; + time_zone::absolute_lookup LocalTime(std::int_fast64_t unix_time, + const Transition& tr) const; + time_zone::civil_lookup TimeLocal(const civil_second& cs, + year_t c4_shift) const; + + std::vector transitions_; // ordered by unix_time and civil_sec + std::vector transition_types_; // distinct transition types + std::uint_fast8_t default_transition_type_; // for before first transition + std::string abbreviations_; // all the NUL-terminated abbreviations + + std::string future_spec_; // for after the last zic transition + bool extended_; // future_spec_ was used to generate transitions + year_t last_year_; // the final year of the generated transitions + + // We remember the transitions found during the last BreakTime() and + // MakeTime() calls. If the next request is for the same transition we + // will avoid re-searching. + mutable std::atomic local_time_hint_ = {}; // BreakTime() hint + mutable std::atomic time_local_hint_ = {}; // MakeTime() hint +}; + +} // namespace cctz +} // namespace time_internal +} // namespace absl + +#endif // ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_INFO_H_ diff --git a/absl/time/internal/cctz/src/time_zone_libc.cc b/absl/time/internal/cctz/src/time_zone_libc.cc new file mode 100644 index 000000000..b0b56a522 --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_libc.cc @@ -0,0 +1,156 @@ +// Copyright 2016 Google Inc. 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. + +#if defined(_WIN32) || defined(_WIN64) +#define _CRT_SECURE_NO_WARNINGS 1 +#endif + +#include "time_zone_libc.h" + +#include +#include +#include +#include + +#include "absl/time/internal/cctz/include/cctz/civil_time.h" +#include "absl/time/internal/cctz/include/cctz/time_zone.h" + +namespace absl { +namespace time_internal { +namespace cctz { + +namespace { + +// .first is seconds east of UTC; .second is the time-zone abbreviation. +using OffsetAbbr = std::pair; + +// Defines a function that can be called as follows: +// +// std::tm tm = ...; +// OffsetAbbr off_abbr = get_offset_abbr(tm); +// +#if defined(_WIN32) || defined(_WIN64) +// Uses the globals: '_timezone', '_dstbias' and '_tzname'. +OffsetAbbr get_offset_abbr(const std::tm& tm) { + const bool is_dst = tm.tm_isdst > 0; + const int off = _timezone + (is_dst ? _dstbias : 0); + const char* abbr = _tzname[is_dst]; + return {off, abbr}; +} +#elif defined(__sun) +// Uses the globals: 'timezone', 'altzone' and 'tzname'. +OffsetAbbr get_offset_abbr(const std::tm& tm) { + const bool is_dst = tm.tm_isdst > 0; + const int off = is_dst ? altzone : timezone; + const char* abbr = tzname[is_dst]; + return {off, abbr}; +} +#elif defined(__native_client__) || defined(__myriad2__) || \ + defined(__EMSCRIPTEN__) +// Uses the globals: 'timezone' and 'tzname'. +OffsetAbbr get_offset_abbr(const std::tm& tm) { + const bool is_dst = tm.tm_isdst > 0; + const int off = _timezone + (is_dst ? 60 * 60 : 0); + const char* abbr = tzname[is_dst]; + return {off, abbr}; +} +#else +// +// Returns an OffsetAbbr using std::tm fields with various spellings. +// +#if !defined(tm_gmtoff) && !defined(tm_zone) +template +OffsetAbbr get_offset_abbr(const T& tm, decltype(&T::tm_gmtoff) = nullptr, + decltype(&T::tm_zone) = nullptr) { + return {tm.tm_gmtoff, tm.tm_zone}; +} +#endif // !defined(tm_gmtoff) && !defined(tm_zone) +#if !defined(__tm_gmtoff) && !defined(__tm_zone) +template +OffsetAbbr get_offset_abbr(const T& tm, decltype(&T::__tm_gmtoff) = nullptr, + decltype(&T::__tm_zone) = nullptr) { + return {tm.__tm_gmtoff, tm.__tm_zone}; +} +#endif // !defined(__tm_gmtoff) && !defined(__tm_zone) +#endif + +} // namespace + +TimeZoneLibC::TimeZoneLibC(const std::string& name) + : local_(name == "localtime") {} + +time_zone::absolute_lookup TimeZoneLibC::BreakTime( + const time_point& tp) const { + time_zone::absolute_lookup al; + std::time_t t = ToUnixSeconds(tp); + std::tm tm; + if (local_) { +#if defined(_WIN32) || defined(_WIN64) + localtime_s(&tm, &t); +#else + localtime_r(&t, &tm); +#endif + std::tie(al.offset, al.abbr) = get_offset_abbr(tm); + } else { +#if defined(_WIN32) || defined(_WIN64) + gmtime_s(&tm, &t); +#else + gmtime_r(&t, &tm); +#endif + al.offset = 0; + al.abbr = "UTC"; + } + al.cs = civil_second(tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, + tm.tm_hour, tm.tm_min, tm.tm_sec); + al.is_dst = tm.tm_isdst > 0; + return al; +} + +time_zone::civil_lookup TimeZoneLibC::MakeTime(const civil_second& cs) const { + time_zone::civil_lookup cl; + std::time_t t; + if (local_) { + // Does not handle SKIPPED/AMBIGUOUS or huge years. + std::tm tm; + tm.tm_year = static_cast(cs.year() - 1900); + tm.tm_mon = cs.month() - 1; + tm.tm_mday = cs.day(); + tm.tm_hour = cs.hour(); + tm.tm_min = cs.minute(); + tm.tm_sec = cs.second(); + tm.tm_isdst = -1; + t = std::mktime(&tm); + } else { + t = cs - civil_second(); + } + cl.kind = time_zone::civil_lookup::UNIQUE; + cl.pre = cl.trans = cl.post = FromUnixSeconds(t); + return cl; +} + +std::string TimeZoneLibC::Description() const { + return local_ ? "localtime" : "UTC"; +} + +bool TimeZoneLibC::NextTransition(time_point* tp) const { + return false; +} + +bool TimeZoneLibC::PrevTransition(time_point* tp) const { + return false; +} + +} // namespace cctz +} // namespace time_internal +} // namespace absl diff --git a/absl/time/internal/cctz/src/time_zone_libc.h b/absl/time/internal/cctz/src/time_zone_libc.h new file mode 100644 index 000000000..41f7dde2b --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_libc.h @@ -0,0 +1,50 @@ +// Copyright 2016 Google Inc. 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. + +#ifndef ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_LIBC_H_ +#define ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_LIBC_H_ + +#include + +#include "time_zone_if.h" + +namespace absl { +namespace time_internal { +namespace cctz { + +// A time zone backed by gmtime_r(3), localtime_r(3), and mktime(3), +// and which therefore only supports UTC and the local time zone. +// TODO: Add support for fixed offsets from UTC. +class TimeZoneLibC : public TimeZoneIf { + public: + explicit TimeZoneLibC(const std::string& name); + + // TimeZoneIf implementations. + time_zone::absolute_lookup BreakTime( + const time_point& tp) const override; + time_zone::civil_lookup MakeTime( + const civil_second& cs) const override; + std::string Description() const override; + bool NextTransition(time_point* tp) const override; + bool PrevTransition(time_point* tp) const override; + + private: + const bool local_; // localtime or UTC +}; + +} // namespace cctz +} // namespace time_internal +} // namespace absl + +#endif // ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_LIBC_H_ diff --git a/absl/time/internal/cctz/src/time_zone_lookup.cc b/absl/time/internal/cctz/src/time_zone_lookup.cc new file mode 100644 index 000000000..fbd86e16b --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_lookup.cc @@ -0,0 +1,142 @@ +// Copyright 2016 Google Inc. 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. + +#include "absl/time/internal/cctz/include/cctz/time_zone.h" + +#if defined(__ANDROID__) +#include +#if __ANDROID_API__ >= 21 +#include +#endif +#endif +#include +#include +#include + +#include "time_zone_fixed.h" +#include "time_zone_impl.h" + +namespace absl { +namespace time_internal { +namespace cctz { + +#if defined(__ANDROID__) && __ANDROID_API__ >= 21 +namespace { +// Android 'L' removes __system_property_get() from the NDK, however +// it is still a hidden symbol in libc so we use dlsym() to access it. +// See Chromium's base/sys_info_android.cc for a similar example. + +using property_get_func = int (*)(const char*, char*); + +property_get_func LoadSystemPropertyGet() { + int flag = RTLD_LAZY | RTLD_GLOBAL; +#if defined(RTLD_NOLOAD) + flag |= RTLD_NOLOAD; // libc.so should already be resident +#endif + if (void* handle = dlopen("libc.so", flag)) { + void* sym = dlsym(handle, "__system_property_get"); + dlclose(handle); + return reinterpret_cast(sym); + } + return nullptr; +} + +int __system_property_get(const char* name, char* value) { + static property_get_func system_property_get = LoadSystemPropertyGet(); + return system_property_get ? system_property_get(name, value) : -1; +} + +} // namespace +#endif + +std::string time_zone::name() const { + return time_zone::Impl::get(*this).name(); +} + +time_zone::absolute_lookup time_zone::lookup( + const time_point& tp) const { + return time_zone::Impl::get(*this).BreakTime(tp); +} + +time_zone::civil_lookup time_zone::lookup(const civil_second& cs) const { + return time_zone::Impl::get(*this).MakeTime(cs); +} + +bool operator==(time_zone lhs, time_zone rhs) { + return &time_zone::Impl::get(lhs) == &time_zone::Impl::get(rhs); +} + +bool load_time_zone(const std::string& name, time_zone* tz) { + return time_zone::Impl::LoadTimeZone(name, tz); +} + +time_zone utc_time_zone() { + return time_zone::Impl::UTC(); // avoid name lookup +} + +time_zone fixed_time_zone(const sys_seconds& offset) { + time_zone tz; + load_time_zone(FixedOffsetToName(offset), &tz); + return tz; +} + +time_zone local_time_zone() { + const char* zone = ":localtime"; + + // Allow ${TZ} to override to default zone. + char* tz_env = nullptr; +#if defined(_MSC_VER) + _dupenv_s(&tz_env, nullptr, "TZ"); +#else + tz_env = std::getenv("TZ"); +#endif +#if defined(__ANDROID__) + char sysprop[PROP_VALUE_MAX]; + if (tz_env == nullptr) + if (__system_property_get("persist.sys.timezone", sysprop) > 0) + tz_env = sysprop; +#endif + if (tz_env) zone = tz_env; + + // We only support the "[:]" form. + if (*zone == ':') ++zone; + + // Map "localtime" to a system-specific name, but + // allow ${LOCALTIME} to override the default name. + char* localtime_env = nullptr; + if (strcmp(zone, "localtime") == 0) { +#if defined(_MSC_VER) + // System-specific default is just "localtime". + _dupenv_s(&localtime_env, nullptr, "LOCALTIME"); +#else + zone = "/etc/localtime"; // System-specific default. + localtime_env = std::getenv("LOCALTIME"); +#endif + if (localtime_env) zone = localtime_env; + } + + const std::string name = zone; +#if defined(_MSC_VER) + free(localtime_env); + free(tz_env); +#endif + + time_zone tz; + load_time_zone(name, &tz); // Falls back to UTC. + return tz; +} + +} // namespace cctz +} // namespace time_internal +} // namespace absl diff --git a/absl/time/internal/cctz/src/time_zone_lookup_test.cc b/absl/time/internal/cctz/src/time_zone_lookup_test.cc new file mode 100644 index 000000000..a5d73d549 --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_lookup_test.cc @@ -0,0 +1,1259 @@ +// Copyright 2016 Google Inc. 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. + +#include "absl/time/internal/cctz/include/cctz/time_zone.h" + +#include +#include +#include +#include +#include +#include + +#include "absl/time/internal/cctz/include/cctz/civil_time.h" +#include "gtest/gtest.h" + +using std::chrono::time_point_cast; +using std::chrono::system_clock; +using std::chrono::nanoseconds; +using std::chrono::microseconds; +using std::chrono::milliseconds; +using std::chrono::seconds; +using std::chrono::minutes; +using std::chrono::hours; + +namespace absl { +namespace time_internal { +namespace cctz { + +namespace { + +// A list of known time-zone names. +const char* const kTimeZoneNames[] = { + "Africa/Abidjan", + "Africa/Accra", + "Africa/Addis_Ababa", + "Africa/Algiers", + "Africa/Asmara", + "Africa/Asmera", + "Africa/Bamako", + "Africa/Bangui", + "Africa/Banjul", + "Africa/Bissau", + "Africa/Blantyre", + "Africa/Brazzaville", + "Africa/Bujumbura", + "Africa/Cairo", + "Africa/Casablanca", + "Africa/Ceuta", + "Africa/Conakry", + "Africa/Dakar", + "Africa/Dar_es_Salaam", + "Africa/Djibouti", + "Africa/Douala", + "Africa/El_Aaiun", + "Africa/Freetown", + "Africa/Gaborone", + "Africa/Harare", + "Africa/Johannesburg", + "Africa/Juba", + "Africa/Kampala", + "Africa/Khartoum", + "Africa/Kigali", + "Africa/Kinshasa", + "Africa/Lagos", + "Africa/Libreville", + "Africa/Lome", + "Africa/Luanda", + "Africa/Lubumbashi", + "Africa/Lusaka", + "Africa/Malabo", + "Africa/Maputo", + "Africa/Maseru", + "Africa/Mbabane", + "Africa/Mogadishu", + "Africa/Monrovia", + "Africa/Nairobi", + "Africa/Ndjamena", + "Africa/Niamey", + "Africa/Nouakchott", + "Africa/Ouagadougou", + "Africa/Porto-Novo", + "Africa/Sao_Tome", + "Africa/Timbuktu", + "Africa/Tripoli", + "Africa/Tunis", + "Africa/Windhoek", + "America/Adak", + "America/Anchorage", + "America/Anguilla", + "America/Antigua", + "America/Araguaina", + "America/Argentina/Buenos_Aires", + "America/Argentina/Catamarca", + "America/Argentina/ComodRivadavia", + "America/Argentina/Cordoba", + "America/Argentina/Jujuy", + "America/Argentina/La_Rioja", + "America/Argentina/Mendoza", + "America/Argentina/Rio_Gallegos", + "America/Argentina/Salta", + "America/Argentina/San_Juan", + "America/Argentina/San_Luis", + "America/Argentina/Tucuman", + "America/Argentina/Ushuaia", + "America/Aruba", + "America/Asuncion", + "America/Atikokan", + "America/Atka", + "America/Bahia", + "America/Bahia_Banderas", + "America/Barbados", + "America/Belem", + "America/Belize", + "America/Blanc-Sablon", + "America/Boa_Vista", + "America/Bogota", + "America/Boise", + "America/Buenos_Aires", + "America/Cambridge_Bay", + "America/Campo_Grande", + "America/Cancun", + "America/Caracas", + "America/Catamarca", + "America/Cayenne", + "America/Cayman", + "America/Chicago", + "America/Chihuahua", + "America/Coral_Harbour", + "America/Cordoba", + "America/Costa_Rica", + "America/Creston", + "America/Cuiaba", + "America/Curacao", + "America/Danmarkshavn", + "America/Dawson", + "America/Dawson_Creek", + "America/Denver", + "America/Detroit", + "America/Dominica", + "America/Edmonton", + "America/Eirunepe", + "America/El_Salvador", + "America/Ensenada", + "America/Fort_Nelson", + "America/Fort_Wayne", + "America/Fortaleza", + "America/Glace_Bay", + "America/Godthab", + "America/Goose_Bay", + "America/Grand_Turk", + "America/Grenada", + "America/Guadeloupe", + "America/Guatemala", + "America/Guayaquil", + "America/Guyana", + "America/Halifax", + "America/Havana", + "America/Hermosillo", + "America/Indiana/Indianapolis", + "America/Indiana/Knox", + "America/Indiana/Marengo", + "America/Indiana/Petersburg", + "America/Indiana/Tell_City", + "America/Indiana/Vevay", + "America/Indiana/Vincennes", + "America/Indiana/Winamac", + "America/Indianapolis", + "America/Inuvik", + "America/Iqaluit", + "America/Jamaica", + "America/Jujuy", + "America/Juneau", + "America/Kentucky/Louisville", + "America/Kentucky/Monticello", + "America/Knox_IN", + "America/Kralendijk", + "America/La_Paz", + "America/Lima", + "America/Los_Angeles", + "America/Louisville", + "America/Lower_Princes", + "America/Maceio", + "America/Managua", + "America/Manaus", + "America/Marigot", + "America/Martinique", + "America/Matamoros", + "America/Mazatlan", + "America/Mendoza", + "America/Menominee", + "America/Merida", + "America/Metlakatla", + "America/Mexico_City", + "America/Miquelon", + "America/Moncton", + "America/Monterrey", + "America/Montevideo", + "America/Montreal", + "America/Montserrat", + "America/Nassau", + "America/New_York", + "America/Nipigon", + "America/Nome", + "America/Noronha", + "America/North_Dakota/Beulah", + "America/North_Dakota/Center", + "America/North_Dakota/New_Salem", + "America/Ojinaga", + "America/Panama", + "America/Pangnirtung", + "America/Paramaribo", + "America/Phoenix", + "America/Port-au-Prince", + "America/Port_of_Spain", + "America/Porto_Acre", + "America/Porto_Velho", + "America/Puerto_Rico", + "America/Punta_Arenas", + "America/Rainy_River", + "America/Rankin_Inlet", + "America/Recife", + "America/Regina", + "America/Resolute", + "America/Rio_Branco", + "America/Rosario", + "America/Santa_Isabel", + "America/Santarem", + "America/Santiago", + "America/Santo_Domingo", + "America/Sao_Paulo", + "America/Scoresbysund", + "America/Shiprock", + "America/Sitka", + "America/St_Barthelemy", + "America/St_Johns", + "America/St_Kitts", + "America/St_Lucia", + "America/St_Thomas", + "America/St_Vincent", + "America/Swift_Current", + "America/Tegucigalpa", + "America/Thule", + "America/Thunder_Bay", + "America/Tijuana", + "America/Toronto", + "America/Tortola", + "America/Vancouver", + "America/Virgin", + "America/Whitehorse", + "America/Winnipeg", + "America/Yakutat", + "America/Yellowknife", + "Antarctica/Casey", + "Antarctica/Davis", + "Antarctica/DumontDUrville", + "Antarctica/Macquarie", + "Antarctica/Mawson", + "Antarctica/McMurdo", + "Antarctica/Palmer", + "Antarctica/Rothera", + "Antarctica/South_Pole", + "Antarctica/Syowa", + "Antarctica/Troll", + "Antarctica/Vostok", + "Arctic/Longyearbyen", + "Asia/Aden", + "Asia/Almaty", + "Asia/Amman", + "Asia/Anadyr", + "Asia/Aqtau", + "Asia/Aqtobe", + "Asia/Ashgabat", + "Asia/Ashkhabad", + "Asia/Atyrau", + "Asia/Baghdad", + "Asia/Bahrain", + "Asia/Baku", + "Asia/Bangkok", + "Asia/Barnaul", + "Asia/Beirut", + "Asia/Bishkek", + "Asia/Brunei", + "Asia/Calcutta", + "Asia/Chita", + "Asia/Choibalsan", + "Asia/Chongqing", + "Asia/Chungking", + "Asia/Colombo", + "Asia/Dacca", + "Asia/Damascus", + "Asia/Dhaka", + "Asia/Dili", + "Asia/Dubai", + "Asia/Dushanbe", + "Asia/Famagusta", + "Asia/Gaza", + "Asia/Harbin", + "Asia/Hebron", + "Asia/Ho_Chi_Minh", + "Asia/Hong_Kong", + "Asia/Hovd", + "Asia/Irkutsk", + "Asia/Istanbul", + "Asia/Jakarta", + "Asia/Jayapura", + "Asia/Jerusalem", + "Asia/Kabul", + "Asia/Kamchatka", + "Asia/Karachi", + "Asia/Kashgar", + "Asia/Kathmandu", + "Asia/Katmandu", + "Asia/Khandyga", + "Asia/Kolkata", + "Asia/Krasnoyarsk", + "Asia/Kuala_Lumpur", + "Asia/Kuching", + "Asia/Kuwait", + "Asia/Macao", + "Asia/Macau", + "Asia/Magadan", + "Asia/Makassar", + "Asia/Manila", + "Asia/Muscat", + "Asia/Nicosia", + "Asia/Novokuznetsk", + "Asia/Novosibirsk", + "Asia/Omsk", + "Asia/Oral", + "Asia/Phnom_Penh", + "Asia/Pontianak", + "Asia/Pyongyang", + "Asia/Qatar", + "Asia/Qyzylorda", + "Asia/Rangoon", + "Asia/Riyadh", + "Asia/Saigon", + "Asia/Sakhalin", + "Asia/Samarkand", + "Asia/Seoul", + "Asia/Shanghai", + "Asia/Singapore", + "Asia/Srednekolymsk", + "Asia/Taipei", + "Asia/Tashkent", + "Asia/Tbilisi", + "Asia/Tehran", + "Asia/Tel_Aviv", + "Asia/Thimbu", + "Asia/Thimphu", + "Asia/Tokyo", + "Asia/Tomsk", + "Asia/Ujung_Pandang", + "Asia/Ulaanbaatar", + "Asia/Ulan_Bator", + "Asia/Urumqi", + "Asia/Ust-Nera", + "Asia/Vientiane", + "Asia/Vladivostok", + "Asia/Yakutsk", + "Asia/Yangon", + "Asia/Yekaterinburg", + "Asia/Yerevan", + "Atlantic/Azores", + "Atlantic/Bermuda", + "Atlantic/Canary", + "Atlantic/Cape_Verde", + "Atlantic/Faeroe", + "Atlantic/Faroe", + "Atlantic/Jan_Mayen", + "Atlantic/Madeira", + "Atlantic/Reykjavik", + "Atlantic/South_Georgia", + "Atlantic/St_Helena", + "Atlantic/Stanley", + "Australia/ACT", + "Australia/Adelaide", + "Australia/Brisbane", + "Australia/Broken_Hill", + "Australia/Canberra", + "Australia/Currie", + "Australia/Darwin", + "Australia/Eucla", + "Australia/Hobart", + "Australia/LHI", + "Australia/Lindeman", + "Australia/Lord_Howe", + "Australia/Melbourne", + "Australia/NSW", + "Australia/North", + "Australia/Perth", + "Australia/Queensland", + "Australia/South", + "Australia/Sydney", + "Australia/Tasmania", + "Australia/Victoria", + "Australia/West", + "Australia/Yancowinna", + "Brazil/Acre", + "Brazil/DeNoronha", + "Brazil/East", + "Brazil/West", + "CET", + "CST6CDT", + "Canada/Atlantic", + "Canada/Central", + "Canada/East-Saskatchewan", + "Canada/Eastern", + "Canada/Mountain", + "Canada/Newfoundland", + "Canada/Pacific", + "Canada/Saskatchewan", + "Canada/Yukon", + "Chile/Continental", + "Chile/EasterIsland", + "Cuba", + "EET", + "EST", + "EST5EDT", + "Egypt", + "Eire", + "Etc/GMT", + "Etc/GMT+0", + "Etc/GMT+1", + "Etc/GMT+10", + "Etc/GMT+11", + "Etc/GMT+12", + "Etc/GMT+2", + "Etc/GMT+3", + "Etc/GMT+4", + "Etc/GMT+5", + "Etc/GMT+6", + "Etc/GMT+7", + "Etc/GMT+8", + "Etc/GMT+9", + "Etc/GMT-0", + "Etc/GMT-1", + "Etc/GMT-10", + "Etc/GMT-11", + "Etc/GMT-12", + "Etc/GMT-13", + "Etc/GMT-14", + "Etc/GMT-2", + "Etc/GMT-3", + "Etc/GMT-4", + "Etc/GMT-5", + "Etc/GMT-6", + "Etc/GMT-7", + "Etc/GMT-8", + "Etc/GMT-9", + "Etc/GMT0", + "Etc/Greenwich", + "Etc/UCT", + "Etc/UTC", + "Etc/Universal", + "Etc/Zulu", + "Europe/Amsterdam", + "Europe/Andorra", + "Europe/Astrakhan", + "Europe/Athens", + "Europe/Belfast", + "Europe/Belgrade", + "Europe/Berlin", + "Europe/Bratislava", + "Europe/Brussels", + "Europe/Bucharest", + "Europe/Budapest", + "Europe/Busingen", + "Europe/Chisinau", + "Europe/Copenhagen", + "Europe/Dublin", + "Europe/Gibraltar", + "Europe/Guernsey", + "Europe/Helsinki", + "Europe/Isle_of_Man", + "Europe/Istanbul", + "Europe/Jersey", + "Europe/Kaliningrad", + "Europe/Kiev", + "Europe/Kirov", + "Europe/Lisbon", + "Europe/Ljubljana", + "Europe/London", + "Europe/Luxembourg", + "Europe/Madrid", + "Europe/Malta", + "Europe/Mariehamn", + "Europe/Minsk", + "Europe/Monaco", + "Europe/Moscow", + "Europe/Nicosia", + "Europe/Oslo", + "Europe/Paris", + "Europe/Podgorica", + "Europe/Prague", + "Europe/Riga", + "Europe/Rome", + "Europe/Samara", + "Europe/San_Marino", + "Europe/Sarajevo", + "Europe/Saratov", + "Europe/Simferopol", + "Europe/Skopje", + "Europe/Sofia", + "Europe/Stockholm", + "Europe/Tallinn", + "Europe/Tirane", + "Europe/Tiraspol", + "Europe/Ulyanovsk", + "Europe/Uzhgorod", + "Europe/Vaduz", + "Europe/Vatican", + "Europe/Vienna", + "Europe/Vilnius", + "Europe/Volgograd", + "Europe/Warsaw", + "Europe/Zagreb", + "Europe/Zaporozhye", + "Europe/Zurich", + "GB", + "GB-Eire", + "GMT", + "GMT+0", + "GMT-0", + "GMT0", + "Greenwich", + "HST", + "Hongkong", + "Iceland", + "Indian/Antananarivo", + "Indian/Chagos", + "Indian/Christmas", + "Indian/Cocos", + "Indian/Comoro", + "Indian/Kerguelen", + "Indian/Mahe", + "Indian/Maldives", + "Indian/Mauritius", + "Indian/Mayotte", + "Indian/Reunion", + "Iran", + "Israel", + "Jamaica", + "Japan", + "Kwajalein", + "Libya", + "MET", + "MST", + "MST7MDT", + "Mexico/BajaNorte", + "Mexico/BajaSur", + "Mexico/General", + "NZ", + "NZ-CHAT", + "Navajo", + "PRC", + "PST8PDT", + "Pacific/Apia", + "Pacific/Auckland", + "Pacific/Bougainville", + "Pacific/Chatham", + "Pacific/Chuuk", + "Pacific/Easter", + "Pacific/Efate", + "Pacific/Enderbury", + "Pacific/Fakaofo", + "Pacific/Fiji", + "Pacific/Funafuti", + "Pacific/Galapagos", + "Pacific/Gambier", + "Pacific/Guadalcanal", + "Pacific/Guam", + "Pacific/Honolulu", + "Pacific/Johnston", + "Pacific/Kiritimati", + "Pacific/Kosrae", + "Pacific/Kwajalein", + "Pacific/Majuro", + "Pacific/Marquesas", + "Pacific/Midway", + "Pacific/Nauru", + "Pacific/Niue", + "Pacific/Norfolk", + "Pacific/Noumea", + "Pacific/Pago_Pago", + "Pacific/Palau", + "Pacific/Pitcairn", + "Pacific/Pohnpei", + "Pacific/Ponape", + "Pacific/Port_Moresby", + "Pacific/Rarotonga", + "Pacific/Saipan", + "Pacific/Samoa", + "Pacific/Tahiti", + "Pacific/Tarawa", + "Pacific/Tongatapu", + "Pacific/Truk", + "Pacific/Wake", + "Pacific/Wallis", + "Pacific/Yap", + "Poland", + "Portugal", + "ROC", + "ROK", + "Singapore", + "Turkey", + "UCT", + "US/Alaska", + "US/Aleutian", + "US/Arizona", + "US/Central", + "US/East-Indiana", + "US/Eastern", + "US/Hawaii", + "US/Indiana-Starke", + "US/Michigan", + "US/Mountain", + "US/Pacific", + "US/Samoa", + "UTC", + "Universal", + "W-SU", + "WET", + "Zulu", + nullptr +}; + +// Helper to return a loaded time zone by value (UTC on error). +time_zone LoadZone(const std::string& name) { + time_zone tz; + load_time_zone(name, &tz); + return tz; +} + +// This helper is a macro so that failed expectations show up with the +// correct line numbers. +#define ExpectTime(tp, tz, y, m, d, hh, mm, ss, off, isdst, zone) \ + do { \ + time_zone::absolute_lookup al = tz.lookup(tp); \ + EXPECT_EQ(y, al.cs.year()); \ + EXPECT_EQ(m, al.cs.month()); \ + EXPECT_EQ(d, al.cs.day()); \ + EXPECT_EQ(hh, al.cs.hour()); \ + EXPECT_EQ(mm, al.cs.minute()); \ + EXPECT_EQ(ss, al.cs.second()); \ + EXPECT_EQ(off, al.offset); \ + EXPECT_TRUE(isdst == al.is_dst); \ + /* EXPECT_STREQ(zone, al.abbr); */ \ + } while (0) + +} // namespace + +TEST(TimeZones, LoadZonesConcurrently) { + std::promise ready_promise; + std::shared_future ready_future(ready_promise.get_future()); + auto load_zones = [ready_future](std::promise* started, + std::set* failures) { + started->set_value(); + ready_future.wait(); + for (const char* const* np = kTimeZoneNames; *np != nullptr; ++np) { + std::string zone = *np; + time_zone tz; + if (load_time_zone(zone, &tz)) { + EXPECT_EQ(zone, tz.name()); + } else { + failures->insert(zone); + } + } + }; + + const std::size_t n_threads = 128; + std::vector threads; + std::vector> thread_failures(n_threads); + for (std::size_t i = 0; i != n_threads; ++i) { + std::promise started; + threads.emplace_back(load_zones, &started, &thread_failures[i]); + started.get_future().wait(); + } + ready_promise.set_value(); + for (auto& thread : threads) { + thread.join(); + } + + // Allow a small number of failures to account for skew between + // the contents of kTimeZoneNames and the zoneinfo data source. + const std::size_t max_failures = 3; + std::set failures; + for (const auto& thread_failure : thread_failures) { + failures.insert(thread_failure.begin(), thread_failure.end()); + } + EXPECT_LE(failures.size(), max_failures) << testing::PrintToString(failures); +} + +TEST(TimeZone, NamedTimeZones) { + const time_zone utc = utc_time_zone(); + EXPECT_EQ("UTC", utc.name()); + const time_zone nyc = LoadZone("America/New_York"); + EXPECT_EQ("America/New_York", nyc.name()); + const time_zone syd = LoadZone("Australia/Sydney"); + EXPECT_EQ("Australia/Sydney", syd.name()); + const time_zone fixed0 = fixed_time_zone(sys_seconds::zero()); + EXPECT_EQ("UTC", fixed0.name()); + const time_zone fixed_pos = + fixed_time_zone(hours(3) + minutes(25) + seconds(45)); + EXPECT_EQ("Fixed/UTC+03:25:45", fixed_pos.name()); + const time_zone fixed_neg = + fixed_time_zone(-(hours(12) + minutes(34) + seconds(56))); + EXPECT_EQ("Fixed/UTC-12:34:56", fixed_neg.name()); +} + +TEST(TimeZone, Failures) { + time_zone tz; + EXPECT_FALSE(load_time_zone(":America/Los_Angeles", &tz)); + + tz = LoadZone("America/Los_Angeles"); + EXPECT_FALSE(load_time_zone("Invalid/TimeZone", &tz)); + EXPECT_EQ(system_clock::from_time_t(0), + convert(civil_second(1970, 1, 1, 0, 0, 0), tz)); // UTC + + // Ensures that the load still fails on a subsequent attempt. + tz = LoadZone("America/Los_Angeles"); + EXPECT_FALSE(load_time_zone("Invalid/TimeZone", &tz)); + EXPECT_EQ(system_clock::from_time_t(0), + convert(civil_second(1970, 1, 1, 0, 0, 0), tz)); // UTC + + // Loading an empty std::string timezone should fail. + tz = LoadZone("America/Los_Angeles"); + EXPECT_FALSE(load_time_zone("", &tz)); + EXPECT_EQ(system_clock::from_time_t(0), + convert(civil_second(1970, 1, 1, 0, 0, 0), tz)); // UTC +} + +TEST(TimeZone, Equality) { + const time_zone a; + const time_zone b; + EXPECT_EQ(a, b); + EXPECT_EQ(a.name(), b.name()); + + const time_zone implicit_utc; + const time_zone explicit_utc = utc_time_zone(); + EXPECT_EQ(implicit_utc, explicit_utc); + EXPECT_EQ(implicit_utc.name(), explicit_utc.name()); + + const time_zone fixed_zero = fixed_time_zone(sys_seconds::zero()); + EXPECT_EQ(fixed_zero, LoadZone(fixed_zero.name())); + EXPECT_EQ(fixed_zero, explicit_utc); + + const time_zone fixed_utc = LoadZone("Fixed/UTC+00:00:00"); + EXPECT_EQ(fixed_utc, LoadZone(fixed_utc.name())); + EXPECT_EQ(fixed_utc, explicit_utc); + + const time_zone fixed_pos = + fixed_time_zone(hours(3) + minutes(25) + seconds(45)); + EXPECT_EQ(fixed_pos, LoadZone(fixed_pos.name())); + EXPECT_NE(fixed_pos, explicit_utc); + const time_zone fixed_neg = + fixed_time_zone(-(hours(12) + minutes(34) + seconds(56))); + EXPECT_EQ(fixed_neg, LoadZone(fixed_neg.name())); + EXPECT_NE(fixed_neg, explicit_utc); + + const time_zone fixed_lim = fixed_time_zone(hours(24)); + EXPECT_EQ(fixed_lim, LoadZone(fixed_lim.name())); + EXPECT_NE(fixed_lim, explicit_utc); + const time_zone fixed_ovfl = fixed_time_zone(hours(24) + seconds(1)); + EXPECT_EQ(fixed_ovfl, LoadZone(fixed_ovfl.name())); + EXPECT_EQ(fixed_ovfl, explicit_utc); + + EXPECT_EQ(fixed_time_zone(seconds(1)), fixed_time_zone(seconds(1))); + + const time_zone local = local_time_zone(); + EXPECT_EQ(local, LoadZone(local.name())); + + time_zone la = LoadZone("America/Los_Angeles"); + time_zone nyc = LoadZone("America/New_York"); + EXPECT_NE(la, nyc); +} + +TEST(StdChronoTimePoint, TimeTAlignment) { + // Ensures that the Unix epoch and the system clock epoch are an integral + // number of seconds apart. This simplifies conversions to/from time_t. + auto diff = system_clock::time_point() - system_clock::from_time_t(0); + EXPECT_EQ(system_clock::time_point::duration::zero(), diff % seconds(1)); +} + +TEST(BreakTime, TimePointResolution) { + const time_zone utc = utc_time_zone(); + const auto t0 = system_clock::from_time_t(0); + + ExpectTime(time_point_cast(t0), utc, + 1970, 1, 1, 0, 0, 0, 0, false, "UTC"); + ExpectTime(time_point_cast(t0), utc, + 1970, 1, 1, 0, 0, 0, 0, false, "UTC"); + ExpectTime(time_point_cast(t0), utc, + 1970, 1, 1, 0, 0, 0, 0, false, "UTC"); + ExpectTime(time_point_cast(t0), utc, + 1970, 1, 1, 0, 0, 0, 0, false, "UTC"); + ExpectTime(time_point_cast(t0), utc, + 1970, 1, 1, 0, 0, 0, 0, false, "UTC"); + ExpectTime(time_point_cast(t0), utc, + 1970, 1, 1, 0, 0, 0, 0, false, "UTC"); + ExpectTime(time_point_cast(t0), utc, + 1970, 1, 1, 0, 0, 0, 0, false, "UTC"); +} + +TEST(BreakTime, LocalTimeInUTC) { + const time_zone tz = utc_time_zone(); + const auto tp = system_clock::from_time_t(0); + ExpectTime(tp, tz, 1970, 1, 1, 0, 0, 0, 0, false, "UTC"); + EXPECT_EQ(weekday::thursday, get_weekday(civil_day(convert(tp, tz)))); +} + +TEST(BreakTime, LocalTimeInUTCUnaligned) { + const time_zone tz = utc_time_zone(); + const auto tp = system_clock::from_time_t(0) - milliseconds(500); + ExpectTime(tp, tz, 1969, 12, 31, 23, 59, 59, 0, false, "UTC"); + EXPECT_EQ(weekday::wednesday, get_weekday(civil_day(convert(tp, tz)))); +} + +TEST(BreakTime, LocalTimePosix) { + // See IEEE Std 1003.1-1988 B.2.3 General Terms, Epoch. + const time_zone tz = utc_time_zone(); + const auto tp = system_clock::from_time_t(536457599); + ExpectTime(tp, tz, 1986, 12, 31, 23, 59, 59, 0, false, "UTC"); + EXPECT_EQ(weekday::wednesday, get_weekday(civil_day(convert(tp, tz)))); +} + +TEST(TimeZoneImpl, LocalTimeInFixed) { + const sys_seconds offset = -(hours(8) + minutes(33) + seconds(47)); + const time_zone tz = fixed_time_zone(offset); + const auto tp = system_clock::from_time_t(0); + ExpectTime(tp, tz, 1969, 12, 31, 15, 26, 13, offset.count(), false, + "UTC-083347"); + EXPECT_EQ(weekday::wednesday, get_weekday(civil_day(convert(tp, tz)))); +} + +TEST(BreakTime, LocalTimeInNewYork) { + const time_zone tz = LoadZone("America/New_York"); + const auto tp = system_clock::from_time_t(45); + ExpectTime(tp, tz, 1969, 12, 31, 19, 0, 45, -5 * 60 * 60, false, "EST"); + EXPECT_EQ(weekday::wednesday, get_weekday(civil_day(convert(tp, tz)))); +} + +TEST(BreakTime, LocalTimeInMTV) { + const time_zone tz = LoadZone("America/Los_Angeles"); + const auto tp = system_clock::from_time_t(1380855729); + ExpectTime(tp, tz, 2013, 10, 3, 20, 2, 9, -7 * 60 * 60, true, "PDT"); + EXPECT_EQ(weekday::thursday, get_weekday(civil_day(convert(tp, tz)))); +} + +TEST(BreakTime, LocalTimeInSydney) { + const time_zone tz = LoadZone("Australia/Sydney"); + const auto tp = system_clock::from_time_t(90); + ExpectTime(tp, tz, 1970, 1, 1, 10, 1, 30, 10 * 60 * 60, false, "AEST"); + EXPECT_EQ(weekday::thursday, get_weekday(civil_day(convert(tp, tz)))); +} + +TEST(MakeTime, TimePointResolution) { + const time_zone utc = utc_time_zone(); + const time_point tp_ns = + convert(civil_second(2015, 1, 2, 3, 4, 5), utc); + EXPECT_EQ("04:05", format("%M:%E*S", tp_ns, utc)); + const time_point tp_us = + convert(civil_second(2015, 1, 2, 3, 4, 5), utc); + EXPECT_EQ("04:05", format("%M:%E*S", tp_us, utc)); + const time_point tp_ms = + convert(civil_second(2015, 1, 2, 3, 4, 5), utc); + EXPECT_EQ("04:05", format("%M:%E*S", tp_ms, utc)); + const time_point tp_s = + convert(civil_second(2015, 1, 2, 3, 4, 5), utc); + EXPECT_EQ("04:05", format("%M:%E*S", tp_s, utc)); + const time_point tp_s64 = + convert(civil_second(2015, 1, 2, 3, 4, 5), utc); + EXPECT_EQ("04:05", format("%M:%E*S", tp_s64, utc)); + + // These next two require time_point_cast because the conversion from a + // resolution of seconds (the return value of convert()) to a coarser + // resolution requires an explicit cast. + const time_point tp_m = + time_point_cast( + convert(civil_second(2015, 1, 2, 3, 4, 5), utc)); + EXPECT_EQ("04:00", format("%M:%E*S", tp_m, utc)); + const time_point tp_h = + time_point_cast( + convert(civil_second(2015, 1, 2, 3, 4, 5), utc)); + EXPECT_EQ("00:00", format("%M:%E*S", tp_h, utc)); +} + +TEST(MakeTime, Normalization) { + const time_zone tz = LoadZone("America/New_York"); + const auto tp = convert(civil_second(2009, 2, 13, 18, 31, 30), tz); + EXPECT_EQ(system_clock::from_time_t(1234567890), tp); + + // Now requests for the same time_point but with out-of-range fields. + EXPECT_EQ(tp, convert(civil_second(2008, 14, 13, 18, 31, 30), tz)); // month + EXPECT_EQ(tp, convert(civil_second(2009, 1, 44, 18, 31, 30), tz)); // day + EXPECT_EQ(tp, convert(civil_second(2009, 2, 12, 42, 31, 30), tz)); // hour + EXPECT_EQ(tp, convert(civil_second(2009, 2, 13, 17, 91, 30), tz)); // minute + EXPECT_EQ(tp, convert(civil_second(2009, 2, 13, 18, 30, 90), tz)); // second +} + +// NOTE: Run this with --copt=-ftrapv to detect overflow problems. +TEST(MakeTime, SysSecondsLimits) { + const char RFC3339[] = "%Y-%m-%dT%H:%M:%S%Ez"; + const time_zone utc = utc_time_zone(); + const time_zone east = fixed_time_zone(hours(14)); + const time_zone west = fixed_time_zone(-hours(14)); + time_point tp; + + // Approach the maximal time_point value from below. + tp = convert(civil_second(292277026596, 12, 4, 15, 30, 6), utc); + EXPECT_EQ("292277026596-12-04T15:30:06+00:00", format(RFC3339, tp, utc)); + tp = convert(civil_second(292277026596, 12, 4, 15, 30, 7), utc); + EXPECT_EQ("292277026596-12-04T15:30:07+00:00", format(RFC3339, tp, utc)); + EXPECT_EQ(time_point::max(), tp); + tp = convert(civil_second(292277026596, 12, 4, 15, 30, 8), utc); + EXPECT_EQ(time_point::max(), tp); + tp = convert(civil_second::max(), utc); + EXPECT_EQ(time_point::max(), tp); + + // Checks that we can also get the maximal value for a far-east zone. + tp = convert(civil_second(292277026596, 12, 5, 5, 30, 7), east); + EXPECT_EQ("292277026596-12-05T05:30:07+14:00", format(RFC3339, tp, east)); + EXPECT_EQ(time_point::max(), tp); + tp = convert(civil_second(292277026596, 12, 5, 5, 30, 8), east); + EXPECT_EQ(time_point::max(), tp); + tp = convert(civil_second::max(), east); + EXPECT_EQ(time_point::max(), tp); + + // Checks that we can also get the maximal value for a far-west zone. + tp = convert(civil_second(292277026596, 12, 4, 1, 30, 7), west); + EXPECT_EQ("292277026596-12-04T01:30:07-14:00", format(RFC3339, tp, west)); + EXPECT_EQ(time_point::max(), tp); + tp = convert(civil_second(292277026596, 12, 4, 7, 30, 8), west); + EXPECT_EQ(time_point::max(), tp); + tp = convert(civil_second::max(), west); + EXPECT_EQ(time_point::max(), tp); + + // Approach the minimal time_point value from above. + tp = convert(civil_second(-292277022657, 1, 27, 8, 29, 53), utc); + EXPECT_EQ("-292277022657-01-27T08:29:53+00:00", format(RFC3339, tp, utc)); + tp = convert(civil_second(-292277022657, 1, 27, 8, 29, 52), utc); + EXPECT_EQ("-292277022657-01-27T08:29:52+00:00", format(RFC3339, tp, utc)); + EXPECT_EQ(time_point::min(), tp); + tp = convert(civil_second(-292277022657, 1, 27, 8, 29, 51), utc); + EXPECT_EQ(time_point::min(), tp); + tp = convert(civil_second::min(), utc); + EXPECT_EQ(time_point::min(), tp); + + // Checks that we can also get the minimal value for a far-east zone. + tp = convert(civil_second(-292277022657, 1, 27, 22, 29, 52), east); + EXPECT_EQ("-292277022657-01-27T22:29:52+14:00", format(RFC3339, tp, east)); + EXPECT_EQ(time_point::min(), tp); + tp = convert(civil_second(-292277022657, 1, 27, 22, 29, 51), east); + EXPECT_EQ(time_point::min(), tp); + tp = convert(civil_second::min(), east); + EXPECT_EQ(time_point::min(), tp); + + // Checks that we can also get the minimal value for a far-west zone. + tp = convert(civil_second(-292277022657, 1, 26, 18, 29, 52), west); + EXPECT_EQ("-292277022657-01-26T18:29:52-14:00", format(RFC3339, tp, west)); + EXPECT_EQ(time_point::min(), tp); + tp = convert(civil_second(-292277022657, 1, 26, 18, 29, 51), west); + EXPECT_EQ(time_point::min(), tp); + tp = convert(civil_second::min(), west); + EXPECT_EQ(time_point::min(), tp); +} + +TEST(TimeZoneEdgeCase, AmericaNewYork) { + const time_zone tz = LoadZone("America/New_York"); + + // Spring 1:59:59 -> 3:00:00 + auto tp = convert(civil_second(2013, 3, 10, 1, 59, 59), tz); + ExpectTime(tp, tz, 2013, 3, 10, 1, 59, 59, -5 * 3600, false, "EST"); + tp += seconds(1); + ExpectTime(tp, tz, 2013, 3, 10, 3, 0, 0, -4 * 3600, true, "EDT"); + + // Fall 1:59:59 -> 1:00:00 + tp = convert(civil_second(2013, 11, 3, 1, 59, 59), tz); + ExpectTime(tp, tz, 2013, 11, 3, 1, 59, 59, -4 * 3600, true, "EDT"); + tp += seconds(1); + ExpectTime(tp, tz, 2013, 11, 3, 1, 0, 0, -5 * 3600, false, "EST"); +} + +TEST(TimeZoneEdgeCase, AmericaLosAngeles) { + const time_zone tz = LoadZone("America/Los_Angeles"); + + // Spring 1:59:59 -> 3:00:00 + auto tp = convert(civil_second(2013, 3, 10, 1, 59, 59), tz); + ExpectTime(tp, tz, 2013, 3, 10, 1, 59, 59, -8 * 3600, false, "PST"); + tp += seconds(1); + ExpectTime(tp, tz, 2013, 3, 10, 3, 0, 0, -7 * 3600, true, "PDT"); + + // Fall 1:59:59 -> 1:00:00 + tp = convert(civil_second(2013, 11, 3, 1, 59, 59), tz); + ExpectTime(tp, tz, 2013, 11, 3, 1, 59, 59, -7 * 3600, true, "PDT"); + tp += seconds(1); + ExpectTime(tp, tz, 2013, 11, 3, 1, 0, 0, -8 * 3600, false, "PST"); +} + +TEST(TimeZoneEdgeCase, ArizonaNoTransition) { + const time_zone tz = LoadZone("America/Phoenix"); + + // No transition in Spring. + auto tp = convert(civil_second(2013, 3, 10, 1, 59, 59), tz); + ExpectTime(tp, tz, 2013, 3, 10, 1, 59, 59, -7 * 3600, false, "MST"); + tp += seconds(1); + ExpectTime(tp, tz, 2013, 3, 10, 2, 0, 0, -7 * 3600, false, "MST"); + + // No transition in Fall. + tp = convert(civil_second(2013, 11, 3, 1, 59, 59), tz); + ExpectTime(tp, tz, 2013, 11, 3, 1, 59, 59, -7 * 3600, false, "MST"); + tp += seconds(1); + ExpectTime(tp, tz, 2013, 11, 3, 2, 0, 0, -7 * 3600, false, "MST"); +} + +TEST(TimeZoneEdgeCase, AsiaKathmandu) { + const time_zone tz = LoadZone("Asia/Kathmandu"); + + // A non-DST offset change from +0530 to +0545 + // + // 504901799 == Tue, 31 Dec 1985 23:59:59 +0530 (+0530) + // 504901800 == Wed, 1 Jan 1986 00:15:00 +0545 (+0545) + auto tp = convert(civil_second(1985, 12, 31, 23, 59, 59), tz); + ExpectTime(tp, tz, 1985, 12, 31, 23, 59, 59, 5.5 * 3600, false, "+0530"); + tp += seconds(1); + ExpectTime(tp, tz, 1986, 1, 1, 0, 15, 0, 5.75 * 3600, false, "+0545"); +} + +TEST(TimeZoneEdgeCase, PacificChatham) { + const time_zone tz = LoadZone("Pacific/Chatham"); + + // One-hour DST offset changes, but at atypical values + // + // 1365256799 == Sun, 7 Apr 2013 03:44:59 +1345 (+1345) + // 1365256800 == Sun, 7 Apr 2013 02:45:00 +1245 (+1245) + auto tp = convert(civil_second(2013, 4, 7, 3, 44, 59), tz); + ExpectTime(tp, tz, 2013, 4, 7, 3, 44, 59, 13.75 * 3600, true, "+1345"); + tp += seconds(1); + ExpectTime(tp, tz, 2013, 4, 7, 2, 45, 0, 12.75 * 3600, false, "+1245"); + + // 1380376799 == Sun, 29 Sep 2013 02:44:59 +1245 (+1245) + // 1380376800 == Sun, 29 Sep 2013 03:45:00 +1345 (+1345) + tp = convert(civil_second(2013, 9, 29, 2, 44, 59), tz); + ExpectTime(tp, tz, 2013, 9, 29, 2, 44, 59, 12.75 * 3600, false, "+1245"); + tp += seconds(1); + ExpectTime(tp, tz, 2013, 9, 29, 3, 45, 0, 13.75 * 3600, true, "+1345"); +} + +TEST(TimeZoneEdgeCase, AustraliaLordHowe) { + const time_zone tz = LoadZone("Australia/Lord_Howe"); + + // Half-hour DST offset changes + // + // 1365260399 == Sun, 7 Apr 2013 01:59:59 +1100 (+11) + // 1365260400 == Sun, 7 Apr 2013 01:30:00 +1030 (+1030) + auto tp = convert(civil_second(2013, 4, 7, 1, 59, 59), tz); + ExpectTime(tp, tz, 2013, 4, 7, 1, 59, 59, 11 * 3600, true, "+11"); + tp += seconds(1); + ExpectTime(tp, tz, 2013, 4, 7, 1, 30, 0, 10.5 * 3600, false, "+1030"); + + // 1380986999 == Sun, 6 Oct 2013 01:59:59 +1030 (+1030) + // 1380987000 == Sun, 6 Oct 2013 02:30:00 +1100 (+11) + tp = convert(civil_second(2013, 10, 6, 1, 59, 59), tz); + ExpectTime(tp, tz, 2013, 10, 6, 1, 59, 59, 10.5 * 3600, false, "+1030"); + tp += seconds(1); + ExpectTime(tp, tz, 2013, 10, 6, 2, 30, 0, 11 * 3600, true, "+11"); +} + +TEST(TimeZoneEdgeCase, PacificApia) { + const time_zone tz = LoadZone("Pacific/Apia"); + + // At the end of December 2011, Samoa jumped forward by one day, + // skipping 30 December from the local calendar, when the nation + // moved to the west of the International Date Line. + // + // A one-day, non-DST offset change + // + // 1325239199 == Thu, 29 Dec 2011 23:59:59 -1000 (-10) + // 1325239200 == Sat, 31 Dec 2011 00:00:00 +1400 (+14) + auto tp = convert(civil_second(2011, 12, 29, 23, 59, 59), tz); + ExpectTime(tp, tz, 2011, 12, 29, 23, 59, 59, -10 * 3600, true, "-10"); + EXPECT_EQ(363, get_yearday(civil_day(convert(tp, tz)))); + tp += seconds(1); + ExpectTime(tp, tz, 2011, 12, 31, 0, 0, 0, 14 * 3600, true, "+14"); + EXPECT_EQ(365, get_yearday(civil_day(convert(tp, tz)))); +} + +TEST(TimeZoneEdgeCase, AfricaCairo) { + const time_zone tz = LoadZone("Africa/Cairo"); + + // An interesting case of midnight not existing. + // + // 1400191199 == Thu, 15 May 2014 23:59:59 +0200 (EET) + // 1400191200 == Fri, 16 May 2014 01:00:00 +0300 (EEST) + auto tp = convert(civil_second(2014, 5, 15, 23, 59, 59), tz); + ExpectTime(tp, tz, 2014, 5, 15, 23, 59, 59, 2 * 3600, false, "EET"); + tp += seconds(1); + ExpectTime(tp, tz, 2014, 5, 16, 1, 0, 0, 3 * 3600, true, "EEST"); +} + +TEST(TimeZoneEdgeCase, AfricaMonrovia) { + const time_zone tz = LoadZone("Africa/Monrovia"); + + // Strange offset change -00:44:30 -> +00:00:00 (non-DST) + // + // 63593069 == Thu, 6 Jan 1972 23:59:59 -0044 (MMT) + // 63593070 == Fri, 7 Jan 1972 00:44:30 +0000 (GMT) + auto tp = convert(civil_second(1972, 1, 6, 23, 59, 59), tz); + ExpectTime(tp, tz, 1972, 1, 6, 23, 59, 59, -44.5 * 60, false, "MMT"); + tp += seconds(1); +#ifndef TZDATA_2017B_IS_UBIQUITOUS + // The 2017b tzdata release moved the shift from -004430 to +00 + // from 1972-05-01 to 1972-01-07, so we temporarily accept both + // outcomes until 2017b is ubiquitous. + if (tz.lookup(tp).offset == -44.5 * 60) { + tp = convert(civil_second(1972, 4, 30, 23, 59, 59), tz); + ExpectTime(tp, tz, 1972, 4, 30, 23, 59, 59, -44.5 * 60, false, "LRT"); + tp += seconds(1); + ExpectTime(tp, tz, 1972, 5, 1, 0, 44, 30, 0 * 60, false, "GMT"); + return; + } +#endif + ExpectTime(tp, tz, 1972, 1, 7, 0, 44, 30, 0 * 60, false, "GMT"); +} + +TEST(TimeZoneEdgeCase, AmericaJamaica) { + // Jamaica discontinued DST transitions in 1983, and is now at a + // constant -0500. This makes it an interesting edge-case target. + // Note that the 32-bit times used in a (tzh_version == 0) zoneinfo + // file cannot represent the abbreviation-only transition of 1890, + // so we ignore the abbreviation by expecting what we received. + const time_zone tz = LoadZone("America/Jamaica"); + + // Before the first transition. + auto tp = convert(civil_second(1889, 12, 31, 0, 0, 0), tz); +#if AMERICA_JAMAICA_PRE_1913_OFFSET_FIX + // Commit 907241e: Fix off-by-1 error for Jamaica and T&C before 1913. + // Until that commit has made its way into a full release we avoid the + // expectations on the -18430 offset below. TODO: Uncomment these. + ExpectTime(tp, tz, 1889, 12, 31, 0, 0, 0, -18430, false, + tz.lookup(tp).abbr); + + // Over the first (abbreviation-change only) transition. + // -2524503170 == Tue, 31 Dec 1889 23:59:59 -0507 (LMT) + // -2524503169 == Wed, 1 Jan 1890 00:00:00 -0507 (KMT) + tp = convert(civil_second(1889, 12, 31, 23, 59, 59), tz); + ExpectTime(tp, tz, 1889, 12, 31, 23, 59, 59, -18430, false, + tz.lookup(tp).abbr); + tp += seconds(1); + ExpectTime(tp, tz, 1890, 1, 1, 0, 0, 0, -18430, false, "KMT"); +#endif + + // Over the last (DST) transition. + // 436341599 == Sun, 30 Oct 1983 01:59:59 -0400 (EDT) + // 436341600 == Sun, 30 Oct 1983 01:00:00 -0500 (EST) + tp = convert(civil_second(1983, 10, 30, 1, 59, 59), tz); + ExpectTime(tp, tz, 1983, 10, 30, 1, 59, 59, -4 * 3600, true, "EDT"); + tp += seconds(1); + ExpectTime(tp, tz, 1983, 10, 30, 1, 0, 0, -5 * 3600, false, "EST"); + + // After the last transition. + tp = convert(civil_second(1983, 12, 31, 23, 59, 59), tz); + ExpectTime(tp, tz, 1983, 12, 31, 23, 59, 59, -5 * 3600, false, "EST"); +} + +TEST(TimeZoneEdgeCase, WET) { + // Cover some non-existent times within forward transitions. + const time_zone tz = LoadZone("WET"); + + // Before the first transition. + auto tp = convert(civil_second(1977, 1, 1, 0, 0, 0), tz); + ExpectTime(tp, tz, 1977, 1, 1, 0, 0, 0, 0, false, "WET"); + + // Over the first transition. + // 228877199 == Sun, 3 Apr 1977 00:59:59 +0000 (WET) + // 228877200 == Sun, 3 Apr 1977 02:00:00 +0100 (WEST) + tp = convert(civil_second(1977, 4, 3, 0, 59, 59), tz); + ExpectTime(tp, tz, 1977, 4, 3, 0, 59, 59, 0, false, "WET"); + tp += seconds(1); + ExpectTime(tp, tz, 1977, 4, 3, 2, 0, 0, 1 * 3600, true, "WEST"); + + // A non-existent time within the first transition. + time_zone::civil_lookup cl1 = tz.lookup(civil_second(1977, 4, 3, 1, 15, 0)); + EXPECT_EQ(time_zone::civil_lookup::SKIPPED, cl1.kind); + ExpectTime(cl1.pre, tz, 1977, 4, 3, 2, 15, 0, 1 * 3600, true, "WEST"); + ExpectTime(cl1.trans, tz, 1977, 4, 3, 2, 0, 0, 1 * 3600, true, "WEST"); + ExpectTime(cl1.post, tz, 1977, 4, 3, 0, 15, 0, 0 * 3600, false, "WET"); + + // A non-existent time within the second forward transition. + time_zone::civil_lookup cl2 = tz.lookup(civil_second(1978, 4, 2, 1, 15, 0)); + EXPECT_EQ(time_zone::civil_lookup::SKIPPED, cl2.kind); + ExpectTime(cl2.pre, tz, 1978, 4, 2, 2, 15, 0, 1 * 3600, true, "WEST"); + ExpectTime(cl2.trans, tz, 1978, 4, 2, 2, 0, 0, 1 * 3600, true, "WEST"); + ExpectTime(cl2.post, tz, 1978, 4, 2, 0, 15, 0, 0 * 3600, false, "WET"); +} + +TEST(TimeZoneEdgeCase, FixedOffsets) { + const time_zone gmtm5 = LoadZone("Etc/GMT+5"); // -0500 + auto tp = convert(civil_second(1970, 1, 1, 0, 0, 0), gmtm5); + ExpectTime(tp, gmtm5, 1970, 1, 1, 0, 0, 0, -5 * 3600, false, "-05"); + EXPECT_EQ(system_clock::from_time_t(5 * 3600), tp); + + const time_zone gmtp5 = LoadZone("Etc/GMT-5"); // +0500 + tp = convert(civil_second(1970, 1, 1, 0, 0, 0), gmtp5); + ExpectTime(tp, gmtp5, 1970, 1, 1, 0, 0, 0, 5 * 3600, false, "+05"); + EXPECT_EQ(system_clock::from_time_t(-5 * 3600), tp); +} + +TEST(TimeZoneEdgeCase, NegativeYear) { + // Tests transition from year 0 (aka 1BCE) to year -1. + const time_zone tz = utc_time_zone(); + auto tp = convert(civil_second(0, 1, 1, 0, 0, 0), tz); + ExpectTime(tp, tz, 0, 1, 1, 0, 0, 0, 0 * 3600, false, "UTC"); + EXPECT_EQ(weekday::saturday, get_weekday(civil_day(convert(tp, tz)))); + tp -= seconds(1); + ExpectTime(tp, tz, -1, 12, 31, 23, 59, 59, 0 * 3600, false, "UTC"); + EXPECT_EQ(weekday::friday, get_weekday(civil_day(convert(tp, tz)))); +} + +TEST(TimeZoneEdgeCase, UTC32bitLimit) { + const time_zone tz = utc_time_zone(); + + // Limits of signed 32-bit time_t + // + // 2147483647 == Tue, 19 Jan 2038 03:14:07 +0000 (UTC) + // 2147483648 == Tue, 19 Jan 2038 03:14:08 +0000 (UTC) + auto tp = convert(civil_second(2038, 1, 19, 3, 14, 7), tz); + ExpectTime(tp, tz, 2038, 1, 19, 3, 14, 7, 0 * 3600, false, "UTC"); + tp += seconds(1); + ExpectTime(tp, tz, 2038, 1, 19, 3, 14, 8, 0 * 3600, false, "UTC"); +} + +TEST(TimeZoneEdgeCase, UTC5DigitYear) { + const time_zone tz = utc_time_zone(); + + // Rollover to 5-digit year + // + // 253402300799 == Fri, 31 Dec 9999 23:59:59 +0000 (UTC) + // 253402300800 == Sat, 1 Jan 1000 00:00:00 +0000 (UTC) + auto tp = convert(civil_second(9999, 12, 31, 23, 59, 59), tz); + ExpectTime(tp, tz, 9999, 12, 31, 23, 59, 59, 0 * 3600, false, "UTC"); + tp += seconds(1); + ExpectTime(tp, tz, 10000, 1, 1, 0, 0, 0, 0 * 3600, false, "UTC"); +} + +} // namespace cctz +} // namespace time_internal +} // namespace absl diff --git a/absl/time/internal/cctz/src/time_zone_posix.cc b/absl/time/internal/cctz/src/time_zone_posix.cc new file mode 100644 index 000000000..75ad8bcba --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_posix.cc @@ -0,0 +1,155 @@ +// Copyright 2016 Google Inc. 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. + +#include "time_zone_posix.h" + +#include +#include +#include +#include + +namespace absl { +namespace time_internal { +namespace cctz { + +namespace { + +const char kDigits[] = "0123456789"; + +const char* ParseInt(const char* p, int min, int max, int* vp) { + int value = 0; + const char* op = p; + const int kMaxInt = std::numeric_limits::max(); + for (; const char* dp = strchr(kDigits, *p); ++p) { + int d = static_cast(dp - kDigits); + if (d >= 10) break; // '\0' + if (value > kMaxInt / 10) return nullptr; + value *= 10; + if (value > kMaxInt - d) return nullptr; + value += d; + } + if (p == op || value < min || value > max) return nullptr; + *vp = value; + return p; +} + +// abbr = <.*?> | [^-+,\d]{3,} +const char* ParseAbbr(const char* p, std::string* abbr) { + const char* op = p; + if (*p == '<') { // special zoneinfo <...> form + while (*++p != '>') { + if (*p == '\0') return nullptr; + } + abbr->assign(op + 1, static_cast(p - op) - 1); + return ++p; + } + while (*p != '\0') { + if (strchr("-+,", *p)) break; + if (strchr(kDigits, *p)) break; + ++p; + } + if (p - op < 3) return nullptr; + abbr->assign(op, static_cast(p - op)); + return p; +} + +// offset = [+|-]hh[:mm[:ss]] (aggregated into single seconds value) +const char* ParseOffset(const char* p, int min_hour, int max_hour, int sign, + std::int_fast32_t* offset) { + if (p == nullptr) return nullptr; + if (*p == '+' || *p == '-') { + if (*p++ == '-') sign = -sign; + } + int hours = 0; + int minutes = 0; + int seconds = 0; + + p = ParseInt(p, min_hour, max_hour, &hours); + if (p == nullptr) return nullptr; + if (*p == ':') { + p = ParseInt(p + 1, 0, 59, &minutes); + if (p == nullptr) return nullptr; + if (*p == ':') { + p = ParseInt(p + 1, 0, 59, &seconds); + if (p == nullptr) return nullptr; + } + } + *offset = sign * ((((hours * 60) + minutes) * 60) + seconds); + return p; +} + +// datetime = ( Jn | n | Mm.w.d ) [ / offset ] +const char* ParseDateTime(const char* p, PosixTransition* res) { + if (p != nullptr && *p == ',') { + if (*++p == 'M') { + int month = 0; + if ((p = ParseInt(p + 1, 1, 12, &month)) != nullptr && *p == '.') { + int week = 0; + if ((p = ParseInt(p + 1, 1, 5, &week)) != nullptr && *p == '.') { + int weekday = 0; + if ((p = ParseInt(p + 1, 0, 6, &weekday)) != nullptr) { + res->date.fmt = PosixTransition::M; + res->date.m.month = static_cast(month); + res->date.m.week = static_cast(week); + res->date.m.weekday = static_cast(weekday); + } + } + } + } else if (*p == 'J') { + int day = 0; + if ((p = ParseInt(p + 1, 1, 365, &day)) != nullptr) { + res->date.fmt = PosixTransition::J; + res->date.j.day = static_cast(day); + } + } else { + int day = 0; + if ((p = ParseInt(p, 0, 365, &day)) != nullptr) { + res->date.fmt = PosixTransition::N; + res->date.j.day = static_cast(day); + } + } + } + if (p != nullptr) { + res->time.offset = 2 * 60 * 60; // default offset is 02:00:00 + if (*p == '/') p = ParseOffset(p + 1, -167, 167, 1, &res->time.offset); + } + return p; +} + +} // namespace + +// spec = std offset [ dst [ offset ] , datetime , datetime ] +bool ParsePosixSpec(const std::string& spec, PosixTimeZone* res) { + const char* p = spec.c_str(); + if (*p == ':') return false; + + p = ParseAbbr(p, &res->std_abbr); + p = ParseOffset(p, 0, 24, -1, &res->std_offset); + if (p == nullptr) return false; + if (*p == '\0') return true; + + p = ParseAbbr(p, &res->dst_abbr); + if (p == nullptr) return false; + res->dst_offset = res->std_offset + (60 * 60); // default + if (*p != ',') p = ParseOffset(p, 0, 24, -1, &res->dst_offset); + + p = ParseDateTime(p, &res->dst_start); + p = ParseDateTime(p, &res->dst_end); + + return p != nullptr && *p == '\0'; +} + +} // namespace cctz +} // namespace time_internal +} // namespace absl diff --git a/absl/time/internal/cctz/src/time_zone_posix.h b/absl/time/internal/cctz/src/time_zone_posix.h new file mode 100644 index 000000000..6619f27ed --- /dev/null +++ b/absl/time/internal/cctz/src/time_zone_posix.h @@ -0,0 +1,118 @@ +// Copyright 2016 Google Inc. 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. + +// Parsing of a POSIX zone spec as described in the TZ part of section 8.3 in +// http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html. +// +// The current POSIX spec for America/Los_Angeles is "PST8PDT,M3.2.0,M11.1.0", +// which would be broken down as ... +// +// PosixTimeZone { +// std_abbr = "PST" +// std_offset = -28800 +// dst_abbr = "PDT" +// dst_offset = -25200 +// dst_start = PosixTransition { +// date { +// m { +// month = 3 +// week = 2 +// weekday = 0 +// } +// } +// time { +// offset = 7200 +// } +// } +// dst_end = PosixTransition { +// date { +// m { +// month = 11 +// week = 1 +// weekday = 0 +// } +// } +// time { +// offset = 7200 +// } +// } +// } + +#ifndef ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_POSIX_H_ +#define ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_POSIX_H_ + +#include +#include + +namespace absl { +namespace time_internal { +namespace cctz { + +// The date/time of the transition. The date is specified as either: +// (J) the Nth day of the year (1 <= N <= 365), excluding leap days, or +// (N) the Nth day of the year (0 <= N <= 365), including leap days, or +// (M) the Nth weekday of a month (e.g., the 2nd Sunday in March). +// The time, specified as a day offset, identifies the particular moment +// of the transition, and may be negative or >= 24h, and in which case +// it would take us to another day, and perhaps week, or even month. +struct PosixTransition { + enum DateFormat { J, N, M }; + struct { + DateFormat fmt; + union { + struct { + std::int_fast16_t day; // day of non-leap year [1:365] + } j; + struct { + std::int_fast16_t day; // day of year [0:365] + } n; + struct { + std::int_fast8_t month; // month of year [1:12] + std::int_fast8_t week; // week of month [1:5] (5==last) + std::int_fast8_t weekday; // 0==Sun, ..., 6=Sat + } m; + }; + } date; + struct { + std::int_fast32_t offset; // seconds before/after 00:00:00 + } time; +}; + +// The entirety of a POSIX-std::string specified time-zone rule. The standard +// abbreviation and offset are always given. If the time zone includes +// daylight saving, then the daylight abbrevation is non-empty and the +// remaining fields are also valid. Note that the start/end transitions +// are not ordered---in the southern hemisphere the transition to end +// daylight time occurs first in any particular year. +struct PosixTimeZone { + std::string std_abbr; + std::int_fast32_t std_offset; + + std::string dst_abbr; + std::int_fast32_t dst_offset; + PosixTransition dst_start; + PosixTransition dst_end; +}; + +// Breaks down a POSIX time-zone specification into its constituent pieces, +// filling in any missing values (DST offset, or start/end transition times) +// with the standard-defined defaults. Returns false if the specification +// could not be parsed (although some fields of *res may have been altered). +bool ParsePosixSpec(const std::string& spec, PosixTimeZone* res); + +} // namespace cctz +} // namespace time_internal +} // namespace absl + +#endif // ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_POSIX_H_ diff --git a/absl/time/internal/cctz/src/tzfile.h b/absl/time/internal/cctz/src/tzfile.h new file mode 100644 index 000000000..90cfc0c42 --- /dev/null +++ b/absl/time/internal/cctz/src/tzfile.h @@ -0,0 +1,117 @@ +#ifndef TZFILE_H + +#define TZFILE_H + +/* +** This file is in the public domain, so clarified as of +** 1996-06-05 by Arthur David Olson. +*/ + +/* +** This header is for use ONLY with the time conversion code. +** There is no guarantee that it will remain unchanged, +** or that it will remain at all. +** Do NOT copy it to any system include directory. +** Thank you! +*/ + +/* +** Information about time zone files. +*/ + +#ifndef TZDIR +#define TZDIR "/usr/share/zoneinfo" /* Time zone object file directory */ +#endif /* !defined TZDIR */ + +#ifndef TZDEFAULT +#define TZDEFAULT "/etc/localtime" +#endif /* !defined TZDEFAULT */ + +#ifndef TZDEFRULES +#define TZDEFRULES "posixrules" +#endif /* !defined TZDEFRULES */ + +/* +** Each file begins with. . . +*/ + +#define TZ_MAGIC "TZif" + +struct tzhead { + char tzh_magic[4]; /* TZ_MAGIC */ + char tzh_version[1]; /* '\0' or '2' or '3' as of 2013 */ + char tzh_reserved[15]; /* reserved; must be zero */ + char tzh_ttisgmtcnt[4]; /* coded number of trans. time flags */ + char tzh_ttisstdcnt[4]; /* coded number of trans. time flags */ + char tzh_leapcnt[4]; /* coded number of leap seconds */ + char tzh_timecnt[4]; /* coded number of transition times */ + char tzh_typecnt[4]; /* coded number of local time types */ + char tzh_charcnt[4]; /* coded number of abbr. chars */ +}; + +/* +** . . .followed by. . . +** +** tzh_timecnt (char [4])s coded transition times a la time(2) +** tzh_timecnt (unsigned char)s types of local time starting at above +** tzh_typecnt repetitions of +** one (char [4]) coded UT offset in seconds +** one (unsigned char) used to set tm_isdst +** one (unsigned char) that's an abbreviation list index +** tzh_charcnt (char)s '\0'-terminated zone abbreviations +** tzh_leapcnt repetitions of +** one (char [4]) coded leap second transition times +** one (char [4]) total correction after above +** tzh_ttisstdcnt (char)s indexed by type; if 1, transition +** time is standard time, if 0, +** transition time is wall clock time +** if absent, transition times are +** assumed to be wall clock time +** tzh_ttisgmtcnt (char)s indexed by type; if 1, transition +** time is UT, if 0, +** transition time is local time +** if absent, transition times are +** assumed to be local time +*/ + +/* +** If tzh_version is '2' or greater, the above is followed by a second instance +** of tzhead and a second instance of the data in which each coded transition +** time uses 8 rather than 4 chars, +** then a POSIX-TZ-environment-variable-style std::string for use in handling +** instants after the last transition time stored in the file +** (with nothing between the newlines if there is no POSIX representation for +** such instants). +** +** If tz_version is '3' or greater, the above is extended as follows. +** First, the POSIX TZ std::string's hour offset may range from -167 +** through 167 as compared to the POSIX-required 0 through 24. +** Second, its DST start time may be January 1 at 00:00 and its stop +** time December 31 at 24:00 plus the difference between DST and +** standard time, indicating DST all year. +*/ + +/* +** In the current implementation, "tzset()" refuses to deal with files that +** exceed any of the limits below. +*/ + +#ifndef TZ_MAX_TIMES +#define TZ_MAX_TIMES 2000 +#endif /* !defined TZ_MAX_TIMES */ + +#ifndef TZ_MAX_TYPES +/* This must be at least 17 for Europe/Samara and Europe/Vilnius. */ +#define TZ_MAX_TYPES 256 /* Limited by what (unsigned char)'s can hold */ +#endif /* !defined TZ_MAX_TYPES */ + +#ifndef TZ_MAX_CHARS +#define TZ_MAX_CHARS 50 /* Maximum number of abbreviation characters */ + /* (limited by what unsigned chars can hold) */ +#endif /* !defined TZ_MAX_CHARS */ + +#ifndef TZ_MAX_LEAPS +#define TZ_MAX_LEAPS 50 /* Maximum number of leap second corrections */ +#endif /* !defined TZ_MAX_LEAPS */ + +#endif /* !defined TZFILE_H */ diff --git a/absl/time/internal/cctz/src/zone_info_source.cc b/absl/time/internal/cctz/src/zone_info_source.cc new file mode 100644 index 000000000..b77c0a585 --- /dev/null +++ b/absl/time/internal/cctz/src/zone_info_source.cc @@ -0,0 +1,70 @@ +// Copyright 2016 Google Inc. 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. + +#include "absl/time/internal/cctz/include/cctz/zone_info_source.h" + +namespace absl { +namespace time_internal { +namespace cctz { + +// Defined out-of-line to avoid emitting a weak vtable in all TUs. +ZoneInfoSource::~ZoneInfoSource() {} + +} // namespace cctz +} // namespace time_internal +} // namespace absl + +namespace absl { +namespace time_internal { +namespace cctz_extension { + +namespace { + +// A default for cctz_extension::zone_info_source_factory, which simply +// defers to the fallback factory. +std::unique_ptr DefaultFactory( + const std::string& name, + const std::function( + const std::string& name)>& fallback_factory) { + return fallback_factory(name); +} + +} // namespace + +// A "weak" definition for cctz_extension::zone_info_source_factory. +// The user may override this with their own "strong" definition (see +// zone_info_source.h). +#if defined(_MSC_VER) +extern ZoneInfoSourceFactory zone_info_source_factory; +extern ZoneInfoSourceFactory default_factory; +ZoneInfoSourceFactory default_factory = DefaultFactory; +#if defined(_M_IX86) +#pragma comment( \ + linker, \ + "/alternatename:?zone_info_source_factory@cctz_extension@time_internal@absl@@3P6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@std@@@std@@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@5@ABV?$function@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@std@@@std@@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z@5@@ZA=?default_factory@cctz_extension@time_internal@absl@@3P6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@std@@@std@@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@5@ABV?$function@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@std@@@std@@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z@5@@ZA") +#elif defined(_M_IA_64) || defined(_M_AMD64) +#pragma comment( \ + linker, \ + "/alternatename:?zone_info_source_factory@cctz_extension@time_internal@absl@@3P6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@std@@@std@@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@5@AEBV?$function@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@std@@@std@@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z@5@@ZEA=?default_factory@cctz_extension@time_internal@absl@@3P6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@std@@@std@@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@5@AEBV?$function@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@std@@@std@@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z@5@@ZEA") +#else +#error Unsupported MSVC platform +#endif +#else +ZoneInfoSourceFactory zone_info_source_factory + __attribute__((weak)) = DefaultFactory; +#endif // _MSC_VER + +} // namespace cctz_extension +} // namespace time_internal +} // namespace absl diff --git a/absl/time/internal/cctz/testdata/README.zoneinfo b/absl/time/internal/cctz/testdata/README.zoneinfo new file mode 100644 index 000000000..95fb4a91d --- /dev/null +++ b/absl/time/internal/cctz/testdata/README.zoneinfo @@ -0,0 +1,37 @@ +testdata/zoneinfo contains time-zone data files that may be used with CCTZ. +Install them in a location referenced by the ${TZDIR} environment variable. +Symbolic and hard links have been eliminated for portability. + +On Linux systems the distribution's versions of these files can probably +already be found in the default ${TZDIR} location, /usr/share/zoneinfo. + +New versions can be generated using the following shell script. + + #!/bin/sh - + set -e + DESTDIR=$(mktemp -d) + trap "rm -fr ${DESTDIR}" 0 2 15 + ( + cd ${DESTDIR} + git clone https://github.com/eggert/tz.git + make --directory=tz \ + install DESTDIR=${DESTDIR} \ + DATAFORM=vanguard \ + TZDIR=/zoneinfo \ + REDO=posix_only \ + LOCALTIME=Factory \ + TZDATA_TEXT= \ + ZONETABLES=zone1970.tab + tar --create --dereference --hard-dereference --file tzfile.tar \ + --directory=tz tzfile.h + tar --create --dereference --hard-dereference --file zoneinfo.tar \ + --exclude=zoneinfo/posixrules zoneinfo \ + --directory=tz version + ) + tar --extract --directory src --file ${DESTDIR}/tzfile.tar + tar --extract --directory testdata --file ${DESTDIR}/zoneinfo.tar + exit 0 + +To run the CCTZ tests using the testdata/zoneinfo files, execute: + + bazel test --test_env=TZDIR=${PWD}/testdata/zoneinfo ... diff --git a/absl/time/internal/cctz/testdata/version b/absl/time/internal/cctz/testdata/version new file mode 100644 index 000000000..05c3ec280 --- /dev/null +++ b/absl/time/internal/cctz/testdata/version @@ -0,0 +1 @@ +2018d-2-g8d1dac0 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Abidjan b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Abidjan new file mode 100644 index 0000000000000000000000000000000000000000..6fd1af32daec193239ab6b472526fd3d6bdb2f76 GIT binary patch literal 170 zcmWHE%1kq2zyM4@5fBCe7@MO3$eHwPk_Q9h|Nnn1KvF=!;^P~_;10wf5JG}!KfpQ| Q82$qRep9)C#v5<}0M)@5+W-In literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Accra b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Accra new file mode 100644 index 0000000000000000000000000000000000000000..8726e80df27f8d6794b295674a18a71c9cab4c85 GIT binary patch literal 842 zcmcK2J!n%=9ES0KK9&Yr7h4crvI#}Kgl5W8rz{Z$>*f9O+;v?Z{#NVLby?p!W$yj_qVE?jsLIC~d2p>@9=40JkvnQOi|=(c zbyn4Ggr$D$rfHl{>c*dzYRsG0x9_=p3i@ir{%@*z`VS4Rll0}p@PgW9eiClrb>?#y}vl5vt7$Nd+ex-4@c!DPSUx@;>^{0 zr+d9Bax-7+-i|b@`@yh!xxACt=_4IVo$CTGugk6;By!lJ%TrV0&P=+M3!bVZWIk3xQL#lLuJ!dVWt@pw>l>^J&ZYM2?$EF= zqh^lxjlrlrwYfq~foB*iDdz~bW@!VvBl0^%}+kYL&m Tunq=>|3HA>R4$ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Banjul b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Banjul new file mode 100644 index 0000000000000000000000000000000000000000..6fd1af32daec193239ab6b472526fd3d6bdb2f76 GIT binary patch literal 170 zcmWHE%1kq2zyM4@5fBCe7@MO3$eHwPk_Q9h|Nnn1KvF=!;^P~_;10wf5JG}!KfpQ| Q82$qRep9)C#v5<}0M)@5+W-In literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Bissau b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Bissau new file mode 100644 index 0000000000000000000000000000000000000000..8e32be3e6e843379e69000273552ab8588c5ca34 GIT binary patch literal 208 zcmWHE%1kq2zyQoZ5fBCe7@Ma7$eHwP&IHc%L;(gyrvLvxrZ6x7$qx)HAax8JKE5Fg lx(0>}?m(J>5rjfWF#ZSF5Ri%g|AVXnaY?X>3uvnW7XTd?B!vI~ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Blantyre b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Blantyre new file mode 100644 index 0000000000000000000000000000000000000000..5b871dbaa7c2969f6b4dfc854184a29010bfb2cc GIT binary patch literal 171 zcmWHE%1kq2zyM4@5fBCe7@MO3$Z2vr`h|g!fkCbZBqgK3z~bW@!r<%}0^%}+kYL&m Tunq=>|3HA>R4$wYfq~foB*iDdz~bW@!VvBl0^%}+kYL&m Tunq=>|3HA>R4$ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Bujumbura b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Bujumbura new file mode 100644 index 0000000000000000000000000000000000000000..5b871dbaa7c2969f6b4dfc854184a29010bfb2cc GIT binary patch literal 171 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 F{{prT0UiJV literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Conakry b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Conakry new file mode 100644 index 0000000000000000000000000000000000000000..6fd1af32daec193239ab6b472526fd3d6bdb2f76 GIT binary patch literal 170 zcmWHE%1kq2zyM4@5fBCe7@MO3$eHwPk_Q9h|Nnn1KvF=!;^P~_;10wf5JG}!KfpQ| Q82$qRep9)C#v5<}0M)@5+W-In literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Dakar b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Dakar new file mode 100644 index 0000000000000000000000000000000000000000..6fd1af32daec193239ab6b472526fd3d6bdb2f76 GIT binary patch literal 170 zcmWHE%1kq2zyM4@5fBCe7@MO3$eHwPk_Q9h|Nnn1KvF=!;^P~_;10wf5JG}!KfpQ| Q82$qRep9)C#v5<}0M)@5+W-In literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Dar_es_Salaam b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Dar_es_Salaam new file mode 100644 index 0000000000000000000000000000000000000000..39631f21486c61a19639d73d7571ef0840176b3e GIT binary patch literal 285 zcmWHE%1kq2zyPd35fBCe7+a(P$l3Vr)}JkhW?eWw(f!6-{fAc=7@3$E85opWKq|Ei z7+4q>lrlrwYfq~foB*iDdz~bW@!VvBl0^%}+kYL&m Tunq=>|3HA>R4$ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/El_Aaiun b/absl/time/internal/cctz/testdata/zoneinfo/Africa/El_Aaiun new file mode 100644 index 0000000000000000000000000000000000000000..f5f8ffbc61716d3a421f555fa962a2b3e488d78e GIT binary patch literal 1473 zcmd7RNl27&7{~EfGYZ!{L{UUfi*(V{HoH`WW#UrmjQif=QdXn3s98=OvO`Hh5T(ci z(E>$C1O<8U6iELTI%c7(xca6l7%vA>7wLgeNIDXxYRA}P>3siIyM}Jb zp@*Z|eSS<2Uuu;joj0|o?WOee^$&RwQzHM#XG%EyNj)zd{t)7g#?OeDZm-ny;_~wS zUP@ZJSGv*Xx0~NR<>vp3Jih(@SJ)1j@RL-WmJ5eukZh22kbIDYkc^y`5|WeCl0vdV z(n9h=5<@aWQgd2vPD>8S&S~i(`8h2?BtxgA=(HS>B#|tgmZsD4L=tscrbwzz%N0r1 zY1ty_IxSzPC5&Y3w3LyYot89`wbRmeTHZ+FNalt|>Q2iYNgm1GY3VyHe`Es443H@x zb3i76%mSH))8>Ip1epmk6=W{RWRTe)(?RBgObD3~G9_eA$fS^2A=7f&ypV}GZDz>S qkhvj~LuQ9e51Ah_LFfN9!)V)N8skjPU%qtZ(zN9K^fXLe9{meZcW0FV literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Freetown b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Freetown new file mode 100644 index 0000000000000000000000000000000000000000..6fd1af32daec193239ab6b472526fd3d6bdb2f76 GIT binary patch literal 170 zcmWHE%1kq2zyM4@5fBCe7@MO3$eHwPk_Q9h|Nnn1KvF=!;^P~_;10wf5JG}!KfpQ| Q82$qRep9)C#v5<}0M)@5+W-In literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Gaborone b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Gaborone new file mode 100644 index 0000000000000000000000000000000000000000..5b871dbaa7c2969f6b4dfc854184a29010bfb2cc GIT binary patch literal 171 zcmWHE%1kq2zyM4@5fBCe7@MO3$Z2vr`h|g!fkCbZBqgK3z~bW@!r<%}0^%}+kYL&m Tunq=>|3HA>R4$|3HA>R4$GwXU9&d$p(IMKUsi;r&zL$G6T2uKbLLI_*Q4pa!X@&{DUe;~-Mc60#IASZxm ckTXCu$SEKi^E$^}Y(gO}5<#I6uUsM?$t1TGg{d5cD0C8+tB{DsAE5C_ zM5WPcM4}t5C`Ls=p`&8H8!Ck;%x31ZyU8Y-@6VrKSsD;OR@A;>v%2i&K3%oP#o^t( zILMgL#*hqezMIHGSw~gH#73TVd`y{|PERJh36m5h?TBvUJZ#Ha6F2UaD^r(GrtWxD z*Pq5z!`8Y??>wr;@`-L*zERE71>G`rrdkV&GSjoC+T4AeO{}Tx%e8EO-8CJ0M&@o; zP5!*1hpR94qp`Q{$BncTD*OI^kG-f zglF3YXoK`Y8X=vKR!A?T8PW}Dhx7}y4UvvWOQa{#6zPhzMfxI*k5jBV a`Ulz>Aag)wfy@J$3I5ky96O}GLFW@PZiCMN literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Kampala b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Kampala new file mode 100644 index 0000000000000000000000000000000000000000..39631f21486c61a19639d73d7571ef0840176b3e GIT binary patch literal 285 zcmWHE%1kq2zyPd35fBCe7+a(P$l3Vr)}JkhW?eWw(f!6-{fAc=7@3$E85opWKq|Ei z7+4q>lrQ$w-A*Rn=mm^)UL=H_kKs#n}~^D#bx61$ut~~ z>c-QsYTDkA$=yfQTsqM$D>tfjI;Y#F&QyDDNv8VtRY&|lr=#mC{cHQNGv265)BE5#6toi5s{Ec%$hbR5)}!H#6|3HA>R4$wYfq~foB*iDdz~bW@!VvBl0^%}+kYL&m Tunq=>|3HA>R4$ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Lagos b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Lagos new file mode 100644 index 0000000000000000000000000000000000000000..b1c97cc5a77eb187cc8ea8a4031a45a9bf153b35 GIT binary patch literal 171 zcmWHE%1kq2zyM4@5fBCe7@MO3$XOWpIe>wYfq~foB*iDdz~bW@!VvBl0^%}+kYL&m Tunq=>|3HA>R4$ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Libreville b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Libreville new file mode 100644 index 0000000000000000000000000000000000000000..b1c97cc5a77eb187cc8ea8a4031a45a9bf153b35 GIT binary patch literal 171 zcmWHE%1kq2zyM4@5fBCe7@MO3$XOWpIe>wYfq~foB*iDdz~bW@!VvBl0^%}+kYL&m Tunq=>|3HA>R4$ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Lome b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Lome new file mode 100644 index 0000000000000000000000000000000000000000..6fd1af32daec193239ab6b472526fd3d6bdb2f76 GIT binary patch literal 170 zcmWHE%1kq2zyM4@5fBCe7@MO3$eHwPk_Q9h|Nnn1KvF=!;^P~_;10wf5JG}!KfpQ| Q82$qRep9)C#v5<}0M)@5+W-In literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Luanda b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Luanda new file mode 100644 index 0000000000000000000000000000000000000000..b1c97cc5a77eb187cc8ea8a4031a45a9bf153b35 GIT binary patch literal 171 zcmWHE%1kq2zyM4@5fBCe7@MO3$XOWpIe>wYfq~foB*iDdz~bW@!VvBl0^%}+kYL&m Tunq=>|3HA>R4$ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Lubumbashi b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Lubumbashi new file mode 100644 index 0000000000000000000000000000000000000000..5b871dbaa7c2969f6b4dfc854184a29010bfb2cc GIT binary patch literal 171 zcmWHE%1kq2zyM4@5fBCe7@MO3$Z2vr`h|g!fkCbZBqgK3z~bW@!r<%}0^%}+kYL&m Tunq=>|3HA>R4$|3HA>R4$wYfq~foB*iDdz~bW@!VvBl0^%}+kYL&m Tunq=>|3HA>R4$ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Maputo b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Maputo new file mode 100644 index 0000000000000000000000000000000000000000..5b871dbaa7c2969f6b4dfc854184a29010bfb2cc GIT binary patch literal 171 zcmWHE%1kq2zyM4@5fBCe7@MO3$Z2vr`h|g!fkCbZBqgK3z~bW@!r<%}0^%}+kYL&m Tunq=>|3HA>R4$GwXU9&d$p(IMKUsi;r&zL$G6T2uKbLLI_*Q4pa!X@&{DUe;~-Mc60#IASZxm ckTXCu$SEKiGwXU9&d$p(IMKUsi;r&zL$G6T2uKbLLI_*Q4pa!X@&{DUe;~-Mc60#IASZxm ckTXCu$SEKilr7i><+{*5JK1*n3X&~pql;zK~&YUIUpKjEl3z-H3Nxua{(PlrwYfq~foB*iDdz~bW@!VvBl0^%}+kYL&m Tunq=>|3HA>R4$ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Nouakchott b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Nouakchott new file mode 100644 index 0000000000000000000000000000000000000000..6fd1af32daec193239ab6b472526fd3d6bdb2f76 GIT binary patch literal 170 zcmWHE%1kq2zyM4@5fBCe7@MO3$eHwPk_Q9h|Nnn1KvF=!;^P~_;10wf5JG}!KfpQ| Q82$qRep9)C#v5<}0M)@5+W-In literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Ouagadougou b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Ouagadougou new file mode 100644 index 0000000000000000000000000000000000000000..6fd1af32daec193239ab6b472526fd3d6bdb2f76 GIT binary patch literal 170 zcmWHE%1kq2zyM4@5fBCe7@MO3$eHwPk_Q9h|Nnn1KvF=!;^P~_;10wf5JG}!KfpQ| Q82$qRep9)C#v5<}0M)@5+W-In literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Porto-Novo b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Porto-Novo new file mode 100644 index 0000000000000000000000000000000000000000..b1c97cc5a77eb187cc8ea8a4031a45a9bf153b35 GIT binary patch literal 171 zcmWHE%1kq2zyM4@5fBCe7@MO3$XOWpIe>wYfq~foB*iDdz~bW@!VvBl0^%}+kYL&m Tunq=>|3HA>R4$ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Sao_Tome b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Sao_Tome new file mode 100644 index 0000000000000000000000000000000000000000..a4ece7ff2b7aba7f8e99fb8ee4ddbe1d439056cf GIT binary patch literal 234 zcmWHE%1kq2zyK^j5fBCeW*`Q!c^ZJkq-T8%QJx(Fj7&gbwg3i(|Np-y1I0lAsEAL1 zfy2i)guxw%!yQ9_f{b7sLf9IZl{`N{W&y!}Ac(X1YXG7_)`G-9Rx^-jHy6+$x`tc; Dq#`8m literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Timbuktu b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Timbuktu new file mode 100644 index 0000000000000000000000000000000000000000..6fd1af32daec193239ab6b472526fd3d6bdb2f76 GIT binary patch literal 170 zcmWHE%1kq2zyM4@5fBCe7@MO3$eHwPk_Q9h|Nnn1KvF=!;^P~_;10wf5JG}!KfpQ| Q82$qRep9)C#v5<}0M)@5+W-In literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Tripoli b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Tripoli new file mode 100644 index 0000000000000000000000000000000000000000..b32e2202f572b8ca6ef3c5cf1d9e787a24f2c328 GIT binary patch literal 655 zcmcK1y)Oe{9Ki9Xt$}*US=39>YHJ`OImJk57onkU5{bt^(oWAP25I~WOa>97K}6ET zAO?%6iNq#Co+cUzi5v^D@O)2ACWBx5Jm0%Z+FU-5vyfZ0#jmL`PgqRUEUudiX4`)~ zkKdjiTX(TTSzf!c$`32LGB~Cx2POTKxo}&yCS<7gO@%)Cb?alF+jg@g+e=4o$JxCM z7uVg+y^!wOu2RCIYm_hc_sEEUl4q~A>>MrH5#iEC$GL$pZ5t=`+di5p70f-VbQ#&2uFP8rJF2K$F*pjo^ixvdY;V@X|sOD`GdfF z^+%s(kf3N#L?|j=jSNM{s}Z6o@i$0Ow7eQIiW)_ZqDK*=C{iRTniNrrDn*u}OA)3h cQ=}={6mg0=MV_M1a02vyP9bQHWWWx70c9krqyPW_ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Africa/Tunis b/absl/time/internal/cctz/testdata/zoneinfo/Africa/Tunis new file mode 100644 index 0000000000000000000000000000000000000000..4bd3885a96f61bbf9c0db6b42956b02d6e2bccc4 GIT binary patch literal 710 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 IJ4?9!1Y+B7Z2$lO literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Anguilla b/absl/time/internal/cctz/testdata/zoneinfo/America/Anguilla new file mode 100644 index 0000000000000000000000000000000000000000..447efbe2c967cc5642b58f51aff86b67073134fb GIT binary patch literal 170 zcmWHE%1kq2zyM4@5fBCe7@MO3$eC)LBM-CDiE~ch;c`0k z^160PpI*(4O5tLEsqpWHUHFlc_r+1Olb@HJuVvY7`0REU?wGx!dMUmwn*F^uQc7a; z>$P{k&)+kLAMVSax+a?rw@bRbWXhQhSALh;qi@yncV@yiuD+0_v2ELIJDiEvY|HeB zT)wbkTW?=-tzVv+wyvM9ZFAYk)VN%29I)A2#>Lf-O)j5EF8ydaO|x{aJ+fVgpIpB1 z+;s0BNYBf5du_$L-Y0eT`r@qg4Su&n&mPFI>9&*J`>3+w)Q?KHm-DH+s*2ks$|l(8#cnfg?i?>fn*#2Q>f^0SSS`K!PAq zkT6IbBoGoQsG*QpK@EmPL&EX%iH8J4A|fG?m`G40YEZ)>af2EdiHw9sVk5zk=s^vS s#1HBMAWMKO0VG}6Wy$pF;`GItV_67C%>V!Z literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Buenos_Aires b/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Buenos_Aires new file mode 100644 index 0000000000000000000000000000000000000000..e4866ce1778fd2678a85dc6791a6c1b3fcaa5d1e GIT binary patch literal 1109 zcmc)IPe{{Y9LMqB($yM5gMuO=7AZ0#c+lCRKlY0qtZ)|_6rKtq2!f(R22ra^r(h5x z2o#rIIs`o(EYX!uEn9k!!Hftx42o_=#Tv`Xr|-54o{C9?rSc|*XXsZx_7?czrTJ~Pi)Nk6AP!+o3%Umv79& zb74I_wazyKS^a2u*nhmUsEQZM=E;V-o;lL&&n$JQ(%ytARqv>0mvjDH>ZYE1f5ptF zteV&FOeNN>7m~+JZFfl3M(XBs@T97DM*RBQ5#3mwG>uY4eW?xliQ=$4{{Nmrs+s2d$lrd!Dt$ve#^F z$#@}apO*tI*1oO=BHX=}zEs*v%Gs*oa=PUFzDfG;EA9EYQbR60^5XW)(5*gXHDozt zJ!Clr@n>kyVjpk#&)Uk(H69k+qSczl_8}ewK=6Yq&laR oht%hk0+9-l5|J8_B9SVcQYKO-QYdER)x7_oX?T~!+tU^P0h%oABme*a literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Catamarca b/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Catamarca new file mode 100644 index 0000000000000000000000000000000000000000..9fe9ad6470939d78d5dfd94276f0ff332f1a91e6 GIT binary patch literal 1109 zcmc)IJ!n%=9ES1RG|^ZK78Dc_sn}8y6%K7<#gBRH9SiHZ<+v&y=&{AhxO#eJNYAHknfZ5D?Lx|_ z1@qRHV+pgEJZ`J|qN+Mtv!5cTRIRf`*WQep`r4$e7t88%bx?mP?=)Wv3HxpOu=;+d zUoQ_Ql)KigSB@Pt(YDjMtwR&0tz{_J-t*D4zdx7j*s?}-l#b?NfzvUwI~T8%)wY{Q zT6=0w%&wWZ(fJQbFRiwHgR4y6%S>y=IoA+s{Kq>I{&|P6F%ptz#JSmY5I9#T1!3ok zHi$a6RBC8;?p39sh4-NOP%0fH1)P)p=RECs>)aI4qkm|fr p9#WrI3PdVIN@xrW literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/ComodRivadavia b/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/ComodRivadavia new file mode 100644 index 0000000000000000000000000000000000000000..9fe9ad6470939d78d5dfd94276f0ff332f1a91e6 GIT binary patch literal 1109 zcmc)IJ!n%=9ES1RG|^ZK78Dc_sn}8y6%K7<#gBRH9SiHZ<+v&y=&{AhxO#eJNYAHknfZ5D?Lx|_ z1@qRHV+pgEJZ`J|qN+Mtv!5cTRIRf`*WQep`r4$e7t88%bx?mP?=)Wv3HxpOu=;+d zUoQ_Ql)KigSB@Pt(YDjMtwR&0tz{_J-t*D4zdx7j*s?}-l#b?NfzvUwI~T8%)wY{Q zT6=0w%&wWZ(fJQbFRiwHgR4y6%S>y=IoA+s{Kq>I{&|P6F%ptz#JSmY5I9#T1!3ok zHi$a6RBC8;?p39sh4-NOP%0fH1)P)p=RECs>)aI4qkm|fr p9#WrI3PdVIN@xrW literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Cordoba b/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Cordoba new file mode 100644 index 0000000000000000000000000000000000000000..8c58f8c23eb0d66d80714a9789b5c20abf043ca2 GIT binary patch literal 1109 zcmc)IKWLLd9Eb5YZKE+13@9if60xNuA{=dF#6R_w3{^2p4Je%yL=XhU!3v_$#YqTA z5QLV-c2zuwYH6cAjWyb#1X2;fA)vS^A~D3OJ%7)MgE;8s8!n$C(@VZjX7I%EZtst0 znf$`x>662K^(FZlyOvY;&JXza*FD#h8*={S!f7?N=7O1;7}wLyyMFQdOZDK@Tl4T- zSkFwa_03>TKN=bFAMYrs(#48-vc92bkF@!-OL0}+lQiYp9rf&T-k(d~)N>!MnEA9- z^ZLE1#u9oVbsz!IjZ@e4T%~dJWELYW+`jEd^-KxKq66Ra+p!$Am zz+W0pD0{WnUp~HHhdNFbHsvRDMt^fE5w*CCHV5_?atu0kN&waO9TQ*+E z+832TyR~m>fe3f6{Xjb7rQ~c;y>fcw{Ju%%?^vMats8r7ol}q%x#5q&BA%hg9d3@{szR lQXo8+7KLGQ$?e72p literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Jujuy b/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Jujuy new file mode 100644 index 0000000000000000000000000000000000000000..a74ba046226060a01c6255b6714a40211f739a24 GIT binary patch literal 1081 zcmc)IPe{{Y9LMqBa@HCi1_eb#2r1?wcu?1(G@jT&h<34o;Hg6dK~QwaAj-OQh+q&S z2ozUdqn-}dP|GKm%{<6pMnoM(MYkkkjrGr`@B4uc(V=eremr~q7(4vf=bafkeyl6_ z<60}r;gfMUqsc$>-KZ=303ck>H7O|)7X%*jZ#H@sSWF|mEGoBF=4;Y99BPW z59rm=gmPDV^ty?ICen5?zdbi;+G4qUd-9WM|9B?f5g)W2Z(f-lD_3-<*_)47D{AMB z!PaE`so66dH~quwP5Z!B^yMXdtMH; zIQO<1it!w@97<<`l$>3vM^3k#-y?vVD7 c{*VTd4v`kU(j$(@s|5c$%4n~oy1zU66E?ExkN^Mx literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/La_Rioja b/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/La_Rioja new file mode 100644 index 0000000000000000000000000000000000000000..cb184d6a80d3c4976cb78d82b37409190edc65f3 GIT binary patch literal 1123 zcmd7QPe{{Y9LMpWx|J=VK|v7_M*hiF@Sv_mf1mImL|$wVcvwUpXN=OD%BIqC#-HMDg)<2)V@269AsAIqJ?DeqIkA2?Bfs=!s!5_~G z`Gv!CP!9KXm*wmB^|ZQwppq`#JTnQw)-{XThA{kYSw zmxtrZUF+5>#}1pumebj-nVe~fX0ok`Pp0+bxorEEHLCqZF1xL*O?L!Ks>AHb#um$J z`^{s`iRx3cdn#sheo5(t)wXwNmFaz*YEC)l>gpT*@e>aH`qX-b|BLs z^C1%=GkRr8WKOS4ip+{ki_D8mjLeKojm(Wqj?9iskIe6t1dt58k^+(gl7v^XK+^C^ z9!MfcCP*q?$puLU$;K<`Ao+MDAtWOtB_t;#DI_cOX>pOf_-{!J$qY#i$qh-)E7>9G tc_lw2K_o-3q=@8*B#C5+q>1F|l|+$Dy^<=X_W<^ z1@pm{I^t%r_pq((imJ+3)qaT#scL7FuD%~LwdP)1E0omN%CKH4Z8P8Uar=E{zxr{r zUoVfumAl-nSB~#B(bnU+P1y<4+LX<;B|e+BPp5M2>$-LO^Ss%-bkug3JtkIuqqkf; z*pjF|G23TjMw@2Sb0BH^hF6)s*XfqDb1qa@|BsJIn1}yxI8q;}lUEVvX3qwJbNONr zcCKK9sB`>8Tk83yML`zlN&Di;qK(f9r;e@ zSPfYYSr1vzD=Q*PdSy*yQDjwQS!7*gVPs`wX=H6=ab$I5d9SRG6yTK#kP?s@yix>G zg;&Zz>OcxXD)CAwNG(V)Ua1Bt$1C+91tAq7B_TB-MWL^X8!3zbmb#F_kjjwKklMUb s98#TE%0ucy3PdVINpF literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Rio_Gallegos b/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Rio_Gallegos new file mode 100644 index 0000000000000000000000000000000000000000..966a529ba9ed8a4fc6385077cf188f95d47665e3 GIT binary patch literal 1109 zcmc)IPe{{Y9LMqB)YV!-gMuO?j1-v>Jou+Yf9#1JglHEV6rMUr5C}zw45F+{r(h5x z2ozUdgPsCQoaIx?Rvu(9C4vq@(XGf>WBv2#`+guOI@GP-k7uvncKWf;JKcZcct`NZ zwMu^BaP`RHdBa8dxOp|B?w#w?_cuQ`lUp)+a^aMk+IZehO^lm-?T((l_Ch^)`Nlpx z8#OceP1^Qn%%jm!{diA76)u$QlcuVfJ=UOSSK3waK*AQ6ZmVaPvU)Cc!_2+EZ0A!> z&6{_&9Pc&@$pKs07g3e5s{IrmRMn1{uD%^Jwe?9`E0)#g%8>q2-f6xTy6v~=!|MC3 zKD{#1t=yF^y?XqhiL{)|ZOcxWmRL5|n)qm1Kb*<6ZC$6@N=I|?U|Ge@?p*s)S#7_5 zq&ZQ2YIe=E8=YTPdU37o9a>|0Ukx`8JLf`m_5XN>8-BU#!*%j4?A%OK5I9#T1r5#> zZ4hy8u@q`_?)6eA#&ghkD3uP9a(1XLIh}HT-z5F_mG=K!sU{Cx^5X9F$lU>CHDozt zJ!Cl{Jw?kyVjpk#&)Uk(H69k+qSOu-bDnm*`YV%5QNOfK* p52?>91tJw9B_cHI@@m2V&osJM;_c~-{s0qJ>%ss4 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Salta b/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Salta new file mode 100644 index 0000000000000000000000000000000000000000..b19aa222f91d07c4fcdc8b50497244c64f2df1a2 GIT binary patch literal 1081 zcmc)IPe{{Y9LMqBbk-U|gMuO=j1<`-cu<#78c*yXM7x+!cnaAEuUPr@*smPBIqzEx)l*?tbaaz-%oUi4t47{p1mG+`mxV@X!zubuHcVn zjr_vl>662K<0bjJbuFvzogdWqw>&d5+p>D5GNNWTU9hv$lV+}QSI=L6p&q<^V;`Q2 znuWQ|+74&Uqw#UQxUZlJ7fbf>*1B0b7S>Cv2~|AMYm3!8>gna2UQXXM%kQt)m9$eU z=AA9alcth7ZfpG!Rhy{WPc5fZy(^~cZzoJ+L&`RaW%ao>s=t(Xo3DkW{WgDCeV-cC zt7A#!uJ-7)lLt+t{d9guZrZfRa`}$lkEY|p*?i~r^{TUUG#?L~j+?#tM76AT-Z;|M zTYqBqEF{dp=sGj-D$|y6&V`zq|MAlj{`qObW;rd+Elvf2bA?h6cCKiHh;z?Np;qT! zS3@!GLF=LPP>_(`ZG~ksEkQThs1JVT21=5CB`al{% zI`K*?NH1P#2I&TA2k8fC2N@qxGUg-^K&MVy^?IHak a4I&*PEqbL#%*d+*|2xWPpQO6KJNg3zGUb2( literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/San_Juan b/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/San_Juan new file mode 100644 index 0000000000000000000000000000000000000000..9e5ade6100bb4a12e62827a596c0fcc29df53915 GIT binary patch literal 1123 zcmd7QJ7`l;9LMpSrqLJ*1{4$#sn~~!2!}q5_&g;;LF`fkLMI0igo5H=1<~l@Bm^V~ zLQA4u1y6@)Nvpk@)@Z>JNJRvPfa0d8#1LOS{=dgb9CY-Clg}a3CBJWKc{P2 zy)xdf?A1QKdh(D7cbv*^%N9&WG@I{Cd@`LM&gQ$fu2tR73i<6_T{`A{R57zBAFox_ zjvGhY6OG4a_gviQV$KW%l^z^hV+LQP+tb$CKuho+KcUuNpB6_jgduC^<~`5aQpIbv zw(NUhYoAvFZPvc71)|)&w!=dyFDYlI>XXwe=l5Y!f1gUrLT;+2TzKTo?V0hZS!6n7 zK4d~yk@=mH0Fr@IQb2M*l5k2ENE%Mb z14#tQ1WCmyxgg0P**GN~Bp;_Fgk*%Igye)Ig=B>;EiRH5|1F6jnIWkmxgp6pB|9WN sr{squh-B!L6p5^gz!Gmrs=-(qdtRyeCLwM>CK@b!jGKjJ+odTgo zC&iU?3w)w1nU;?&TSKI`=-mhV_*}wF zj<46Yr{7Es4(cbn%c^{F&OY5-Gt)<7dU~Z*RXQ@ZvM{2aUoPmGuA64&^A$VW<0IwBle@lD%vHP1fiGwE!Fwsw`TB_NbIwH?qW|~`W4z>-!)VwL#`v=^bZ+Wp5I9$! z3u4YyY!G+u&0J))bMF@-N$!E%dFN19KFG@1p;B_%<@`QR{_m4%S;|jVmkW=40(WL$ zpZ(nRv~N}^uL6iF4y6-gHRr00F@iC?^;`#Asr literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Tucuman b/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Tucuman new file mode 100644 index 0000000000000000000000000000000000000000..bbb03a0c705626dd22776818b61035ff501b7932 GIT binary patch literal 1137 zcmd7QPe{{Y9LMqBrmH1FgMuO=7AfK)c<@h){_%(hEAnDO;i(`3At*Xz5Vg8=3WOLz zpt!VS)YHKdxAMtlD+5`~h`@tTbSo-sEGwVB?*>zxX8QdlJJadZ zjCp5Ejjd+3{it2o6;%sEW&1gDT$P(*y8L#?R93ayN};5_EcEHc(pK{|-)g_*4yf-p zyY$jPt8$lH^zxB?CR%qQvnf4l>SF0kee#p3|8P3fuyLhoC?3i*22MAc?U}@UNo~G% zFrF+wHrpl=MrS`N{p`8!=v!er=2G!Ji^FDb?npf4oC}4k{_&1f|GdLk6$$%q5$7i7 zg21_aF{pN~V1uZ0FN&dB=U&f;Vmt@6`#ZaXb~#&Ai=1XTzpvB%_r2PF?NyNnE_ro# zYT(ulWItp>WJhF6uk49z>XluQZIOMEjgg&^t&zQv&5_-a?UDVF2E5V%(t=ldK$<|h z@Jbs%y7>BTF}Al)GCc%>htA+L0Vw1o78G=+49w1vJe9;7k;TRKBpLwZA+ zL%Q=ydq{s?X%OkqD=i{DB26M)B5fjldZkgMQ?Im&^olf#DS6f4e+ai`r{ui5x#kCJ CU-oM`Mk4D1o$y;1E#U6qOj_SC9YafS@?&<_#ymn=HBHebRmX$J&EG zu4VEKhpSr-_iHZ5+s&(k>dx6-eRuscGr4h4PcEEPQ)|!JsfjT&T^rXk*Pg5UFJ9XR zXJRHdy-wS{LGy5AL_gY@SNZcr`*=gu%pM8r*`>HD>`mB0`L=p`aY)alZkV}um+XAX zsd@9(mfE_^Lh`7s?2f9+Xw`m-99Px$MqPa~YHF*KwpJ*q&y@lFrL@g_&3D;vGY8f8 zTfKT|xJ$V!oqGA$J`-&|k=;BrVVWCTK1H0%)q=ped@%?+ zSFl0Uxy53r!MRuEP$Tz2!~Rq{NXpr&I^}f8`F)f0-&fl6b0zsPf60TpQ^Vtzk=2mp zkoAxSy|N;*q*vBN7DZM?mPOV@7DiS^mPXb_7DrY`miNl~NC94{04V{f!7D`|Rd}Tg zqz!RQW8=VQWW~CxRJ8>bEyj{45h?I!bh!lxb>6J2(I=xaTX5`U=|DS1Wm&DuM5&Hq8dF)dF literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Aruba b/absl/time/internal/cctz/testdata/zoneinfo/America/Aruba new file mode 100644 index 0000000000000000000000000000000000000000..d308336bec9a539742ca3885c44a4d3c5a674463 GIT binary patch literal 212 zcmWHE%1kq2zyQoZ5fBCe7@MyF$eApsr~GZk8xICXrvLx<$1*Vd|9@Zy1Iz#a#}6=Y r`S^w~=o*+98!$Kqhk&#KK?n&J{D5cyn)&}f$RZF;l4V>#dri0im60!* literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Asuncion b/absl/time/internal/cctz/testdata/zoneinfo/America/Asuncion new file mode 100644 index 0000000000000000000000000000000000000000..3c61ddb5a7a9956e2448ec7185edea75df08bd3e GIT binary patch literal 2077 zcmdVaUrd#C9LMn^nI@7RGzC<$KN^W}_#V$0V8`%BYLfEDKcIq@{}qhzpoC(7L~Ghw zONy3x<#2AgY4KH-2AcwRO=&m#v3Azt^*8aKZL` z-sM#_n`Z_7agA_qxViSZo9AG&JHAM{)pGyL%Vy-g0Zr^~u%i!M)TGmY*avqF$(Yt` zGqx(M!G^UqdE-1CSMi}4|LoWLP=1=3ka15YrWM zWdA#6h8AgN_m_6&xlxjJ@}$X*Cu!*2Uu;fUze?RW6V9!cSt~;}GWLu{^MW>dw_9>2 z-mtlSziZy@OE$mjJDvUGS^HF5yT&?u&7AhL@^pQREjakG%&q#wm~FeIu)g0s6FH^x zmiCzW^U4(vCpehO)2PqnG~JgBSBy=9;O=!U*< zc(Z-6@sh4-DzaBLU0Z98pVe!EiZ_O_aB)iI54ZMXGB>AHQ<`*uf$rwy4q>?_Grq%pC=HVzEQ z&Z~KLSI-q`x|n8n>jinWBiFpva!g)tO*L=C_sgE`gJzHCdBYO!OBnuN{tWlLZw3MZ z|8&n^*}wyy_d`!0iF24cc~e|c9w>BownW_>ao_IWSNXqx^>4c0_P_eOfBl*J$Gw^Z z$t}nVc+C=!H6V*XR)H)7SqHKZWF^Q_khLI-K~{q-2U!oYAY?_pZb`_RkVPS@LY9TB z3t1SlGGuAU+K|N|t3#HDtPfcrvO;8uzHW`kB9T=h%S6_REEHKOvQ%WP$YPPzBFjbA zi!9jJtr%IduUj*+Xk^vMvXONo3rALtEFD=pvUp_m$nuf(BLzSzfRw=3)c`4iud4!5 z2BZ#1A&^QSr9f(d6a%RSQVygZNI{T_ASFR+f)vHqRRt*vQWvB!NM(@HAhkh?gH#78 z4^khbKuCp<5+OB0isb96gp|qG)d?vSQYoZVNUe}!A=N_4h13fv7*a8$WJt}Bq9Ij7 z%I53ph7=B|98x-@c1ZD%>LKMr>W382*EJyU|Ic9J92dues5>JCStVf!g+r1fStXHB Il!wGW0YAGNZ2$lO literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Atikokan b/absl/time/internal/cctz/testdata/zoneinfo/America/Atikokan new file mode 100644 index 0000000000000000000000000000000000000000..5708b55ac6bcb7580498bed9721a43fbd5a1773f GIT binary patch literal 345 zcmWHE%1kq2zyNGO5fBCeb|40^B^rRlyd4W0=I{DhaN z#K_FT`v3nb83u;`|95U+WcmMp^#TSCFq;QV3V=uk5g*?W24@!_4hG_IAPxv&a0RkK zfDuZD5Ox*^P$}41KfroGw*LQL^sXfZM1!0OqCrjt(IDr7XpoaZG|1Ut8t8NeD!ZKv I=owQk0JN5Mg#Z8m literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Atka b/absl/time/internal/cctz/testdata/zoneinfo/America/Atka new file mode 100644 index 0000000000000000000000000000000000000000..5696e0f8bedee72515c43f686881a561af339db9 GIT binary patch literal 2365 zcmciCZ%ma{0LSsm-^)cYDj-Bm!Hl7RhrdBt9tc86zkSYhaF=n{(Efu39oj-p=>b){C0&@;rN<&*6@@zpuBZ z`Na&^zmCWJ!pj*jFZYBu%;$W6p>J}&4;$T{s9x$cDDyrdWWIPF_FeM?5@G2f!Er{#So zrku!k$K?I}r=17(ejp!g9&)0#?32+Yy-rMCy?iLS&WTOz(ThC=PF&zN9k)7hdE76K zUUDT<#ZPAFrDvkm!(T?}Wgp&B%R7r@Lf^DXtV)(ET7DOggY)tcV7v>2>a=}n)@j1H+Xiw9&@WunSX z+9h)`gVkehugr~45V_ZKWZry`c>G+feB%47Vy(*3PmY}vPYuNAb?=`LvUN`9A2_QD z$}j1s8$MBmYrfG%h5f4N*Bi1p^g$Qg8g~ zB~`w4P&-FURmIvpdQ)eLs*JDJ-l|2)JD;bkvTv%Yt5tIIvIw#HY_8mL=Z2{HC{8{< zGa!-2eIqS~+F@ZgYYHE@3Ap^9U z5h6oGJ4P-Hl4C{*3=(IUgOn(-n7Mn;Sb85uJ&Xk^sLu#s^i z14l-V3>_IeGI(V4$ncTzBLT3Q2v|)BkQg9AK%#(z0f_?=2qY3nD3Dkn!9b#cgae6( z)dU2Ih}DDyi3t)EBq~T)khma$K_Y{M28j(493(nOc#!xY0YV~VH6cP`gaiqR5)vjP zPDr4TNFkv@Vub_?i53zrBwkh%FeGAD6EY-bRueQNYDn0SxFLZ0&83YEFHW^U_rsvf)RYOMEaTZVC_tV%ELC^8K*KzPWj^F2Up&KP;U~o zOGd9)A1f#Miz&*#Z_!`$o=K2df;tT{4>A!lQ&6Wu<_hX$$ZW`T$b86z$c)I8$ehTe z$gDw~7MVAw6C*PtQ}g$k8<`xL9hn}PA4veoAgC!IIRrHcB#WS?f#ea?M3797RFGVd zWRPr-bdY?IgpiDol#rZ)niP^%P}4&4LJ~tVLsCO>Ly|+XL()U?LlVRxeRlsL!&H|h I*&U~T0UU~E(EtDd literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Bahia_Banderas b/absl/time/internal/cctz/testdata/zoneinfo/America/Bahia_Banderas new file mode 100644 index 0000000000000000000000000000000000000000..21e2b719f33d6195a65cbce81764adc92167b989 GIT binary patch literal 1588 zcmdUuTSyd90EW++VwvDzB~b)XffQzHYIZYiO*7ptx|&(7YuVa%(J@V|yc|e`AaV?X zNQ5A|QKUhcW)HpOOITz?B?LYQMFpJ#Ns5@xH}w)hP;dQ*Gv6?<`}BR@(qJG-{I+oY zh0A>U@;+1Q$Hm?^X7{J6(cVC@|Bidu-xrzc@B7xK9=@&dzv#H7gfL}dWvh`?8zYzI z1dQZ@37HbR-bhUvk;}pt8ELaWi?r8~#`3Q(#ftH0Yh~{fv8pG+T0PJu(%au#YdTv* zM)e~rv$a#M-PB{bE1G21lGE0@tTLG$RcGZa$dow~9Y${Ge3|>A*4Qu>CiD7=jQpW# z%5!$1*m!+hZEBb*HlKX1wv@-pf&=}kFmsCZ=69;1x$k6gT$9==hGfZ%b7skCx7;?~ zXqMjZklUa6%pF&6h@H1HOy3Dhl%1Jp`h$l=d2_njmFpF|eREaC!c?&*Jwyef3uNV- zF;)2~S?>KdsDi^Wa^I^fYX8j%d0_B?d9Y(dR$aPmR@dBB#E{=Rytd8Dwi(`+YRO5v**>vNhYCfJRTTVSy!WH72 zNv_a8oUo98JGR~B6+%BP5o+7l&Wp*m-7ZBW?=Hi(`+Ho|e|*pPc!j6XE8O~S*4LAz z-}U`<-oG$v;^$9oJdH}@eu17 z=0ogf6ac9JQUas~ND+`KAZ0-6fE40TR{|*oQVXOQNHvUdAoVZ`f>gvP2~rcIC`eU| zvLJOq3UjC{gOmoT4N@GWI!Jkt`XB{DDuk2>sgY46q)JAakUANKI@FaiN_D7fWfTjk nmQgOGUP!@^isAoPa)b^&RRO& literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Barbados b/absl/time/internal/cctz/testdata/zoneinfo/America/Barbados new file mode 100644 index 0000000000000000000000000000000000000000..6339936014862e144f8beb04b55b617f9834c3dc GIT binary patch literal 344 zcmWHE%1kq2zyK^j5fBCeZXgD+1sZ_F%1V`|J6e;U@-cjRz&EAm0{?V|2LdH|7X-^5 zJrD{BxF8(=KS9L6E`WiNnF$L2|34wkzyKy${{O#vfsy0?|KkT3czk?A7@UCE(FKTu zLx6@uKnMv=`T^DR9|%BB1JNMofrLR$1k*rgf@qLaK{Uv@AR6Rk5DjuRhz2W829^ z)JZ9bP}&-C)J53zsJZF64Xt<>Few`LR0W4V#sh&2!(T-1d%xpgb@a zl|N@q<#|F^TY;)io#^^wq8mf^VWYC7n(aZ|I&7)C=7ElUPrdBh@U?42y`8S=_x_xT z7sqsbex?$)7A8lrX+L%AkL?XJe7UQ0>$fIvCPU?2nUSrc9__s_C2Osd&HQp@t*z}i zj+YW#gfzGy8YBV(t^=*aj;0whDKq(E|{N)jXs zk_O3xBtkMFsgPVqG9+87q(kzhNy^QY3@k?J-?*277QJ+_nUA=nh;A1r%bm-~ryJ{wN zR?n(v@L+ubDI6!yxuZPjA#;dlA2DK6%3f0heJ4yi>k zA(!^}s@O0fi<{q6sd`+ON=3Eo_v_^-Qtvlz>Xp7F@nQa={@C?QB-+ zZvEHJJH{SvA1Q!TKuRDrkRnJGq>R(nK?*r-C8U(o)p>QTtcW};$!XVwEXw&`SCzCgt55y`P>t&N literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Blanc-Sablon b/absl/time/internal/cctz/testdata/zoneinfo/America/Blanc-Sablon new file mode 100644 index 0000000000000000000000000000000000000000..abcde7d98693a9d583928c6f1acdf46b190a500a GIT binary patch literal 307 zcmWHE%1kq2zyPd35fBCeHXsJEMH+y_ydA9x^LO11INk9m;ga%~f=dZ+FEBAOF|#oJ z|9`54f#LuEs}~qq{{KIIfPn+d<^hueKE5FgjxInP48-9;91sFDje&s?OoR}21v^k7 w*cCrOI)LCm5X9M90?q&bALJ?!4RRTX2DuJIgIoxvfv#kr+?iZJ*PCzw0K7tFCIA2c literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Boa_Vista b/absl/time/internal/cctz/testdata/zoneinfo/America/Boa_Vista new file mode 100644 index 0000000000000000000000000000000000000000..f7769048cb33e11fb0a1486696473e8820666be9 GIT binary patch literal 658 zcmb`^yGz4B9Ki9kJ}C9IxHwd+T@?;n(2B^Zs|rFu@DES~Cl}qSt{nvtbZ}Is8(VS6 zR@?+1L+NXA5DHq*T3Y4&edFjLf)_5I5Xh1Hp1ZoSHtzfwZSsc6h{@!+dsl9U7pY37 zZ{;QPxn#1nIel5$SNX{+ov(&;Vc^*-WY<-(71O2Tswx-Hbj6)juSY%JTgRrVdt3Uw zchoeNr*tECtD518*F5hut!lsiNT*HY`a}=zJer}?c`q6-n&G`|J<|1HChB+IWadC6 z%Qc;RikOtO)(HlFxq{Z_qK;$j{Y{`t6Isz(G9W2@ zB?poO$%3Tul{`oyU&(}|LUJL=kZedgBp;Fx$%v%%m7GXYU&)H3Me_3dBt|kLsgc}B dawI#F9?6d!fv+3`rey7ZI*RbL9Lr21`~|^N5w8FM literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Bogota b/absl/time/internal/cctz/testdata/zoneinfo/America/Bogota new file mode 100644 index 0000000000000000000000000000000000000000..d8934466bb728c88b211dba172369f5105b6300e GIT binary patch literal 271 zcmWHE%1kq2zyK^j5fBCeRv-qk1sZ_FjEK+zE#~3??R~Kh_5c6>XJlq#X8!+w*8~Oz zFv;@&|M3Hi9RL6C+`z!&;~T=@1jM=qCO~Wo)D8h5ge_$Qssvm51F8pT*Z;UVCLcgF e$Ppl6kV8N;$T1+g9w^5^mW#M-fbO$1jDg zOGlJR(37@iD!OK4LtMkPmCaqZrnRu=nq{MhO%@No&inLdfAnu#U-rAN-|k@JpU>O7 z!M`b6{Np0bH$2>n=HWd_nUCJLR`pP#7H|%Nl+iOf^@>;AKJ>ayyU?uCd!N%8 zCo0vF)<&JVZ<)$!Y?s;F=cuK{o8+>}ah2mFN$Upmw zyz}!xvErCZ-!*tptnB((-+f?@C}{db-_w3T-CKT4-&em|6)t%}7Zq+)MZb^8;`A0# zeBqERiLMnTCpzVts|BL;l{a1`)@#~82Wc9#`Qe7DcRcn*dwRhdO z$~zgWt8&h&s_)XIZ~iyJHxeV)PmhQVZ;Z(YM-Pdb_Mm)ds8iI|pOhPWw}^*5=XG62 zhk7J^KtI~(SM|~RbwhEfYPcHEjqY^Sc+RK&5wXgDBwug-{#Ui7yIMYWK1Mtq$dgYT z9TQDeiL$vXD7NNI$!$$1#rC+%az}Z$*fBk!1Gxh#F#3hw8NXlc96GIcjR(}zz5V)` zi$2xT+NO7(%2%zm4SG*ck_rtmKjAaN!e{=cejI0CtPqZKP=|y$PL~q19Os?BkSO~p z`CiPn@9||Guc#f|j>sgDSt8T4nt379`mBr6z!;u^$J4kwv{2&QJGK8cE$q|wyBuhw| zkUSxYLNaAFsX}takt`%z9O**x#gQ;1V;m_%a)u-g$r_S2ByU!eI3#mclR6}KR+Bs= zdmQOQ@`of4$sm$KB!@^6kt`x*9aZb(hKga+CWs&(e(SjLbAoR#rw-54o{C9?rSc|*XXsZx_7?czrTJ~Pi)Nk6AP!+o3%Umv79& zb74I_wazyKS^a2u*nhmUsEQZM=E;V-o;lL&&n$JQ(%ytARqv>0mvjDH>ZYE1f5ptF zteV&FOeNN>7m~+JZFfl3M(XBs@T97DM*RBQ5#3mwG>uY4eW?xliQ=$4{{Nmrs+s2d$lrd!Dt$ve#^F z$#@}apO*tI*1oO=BHX=}zEs*v%Gs*oa=PUFzDfG;EA9EYQbR60^5XW)(5*gXHDozt zJ!Clr@n>kyVjpk#&)Uk(H69k+qSczl_8}ewK=6Yq&laR oht%hk0+9-l5|J8_B9SVcQYKO-QYdER)x7_oX?T~!+tU^P0h%oABme*a literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Cambridge_Bay b/absl/time/internal/cctz/testdata/zoneinfo/America/Cambridge_Bay new file mode 100644 index 0000000000000000000000000000000000000000..d322f01ed1d11856e0f17d1ba5d5f6ca867533c3 GIT binary patch literal 2098 zcmd^)9^3!)Hw1^{_lO@R7+s-==-NdyW5O ztuE+@n81O>x-inIigrxbi-Mcg;@VMN?0rE!U35_|Ny}3uS@)#m>X?+?|8}G-^;%8Y z+1u)wOQ&UNzsEd#`iLyschfv~c#kY^{lTp0Jgiq%_nTGCyLEZNep6AtL09}fsDi$B z37$WyDknEd<;iZf`qpx(`rs4u;*X6w)ZS%Y`eK=`Zj73mp4s~4rB$XjmaNxg`%HN4 zuR8qaR8v=cR@eQOuj*(0BK3n))cUbOY4~_Vy)t}M8aw0a)q!qlYCfel^lp`np>t+a zSC@Xxcf!0LiR$Lb2Te<`O1IpKnTXe?BSZBjnl@EOKPxj^uHMmGd)BFK=cdRTu~PNs zu@Pyl%TjIo;__DUUut{nDcO;6MeVHak)31rO|0aEjtyTnyD|^zT?1d6w?||8o!&n4 z?uB~Y-toTK{biZ%XlgNg4rOaeNlH#hO?hN|KWUGqr;YQY<&i)!4Jfp7L@YVOhnoFDmR2NpgS4 zJ^sChA3}=JzrUZbLk@@_5J?=ZC=gj7!tgbufr!J92OR4W{3@u+tCURk(?nqM0SSo5a}7>L*$1901^R62p}EOL?9u7#Kh4C1rilU8x}}h9Bp7Akzs@e5*tQv zAkkrj2NEAffFKcqga{HNNRS{=a?n|MMiIBilzsW7ZPeIOo=o}VnkR9vPPSK zxS7i|D_U#w$5x-VHo;~4tlAulg_Ts2{Ftk@8e6d?o{)X}JU{)}AN8Nd?jARG{P^Sj zd?l;uwibl`^|--(hbNCV_vHPwR`>GSiI!N`t?Pd8x>jns$Cm2pp}jH?|5yh`r|QMb z-|WTiS{a&Qf<%OC$`;AOwjM$0e>1J|t zrvABapULVusX-hK18CZ}??&AGH&=Eg&I?)iS1Hz!Nyof$K^ zp+IvF9+vxly~EDmrY6sRrukdHmT>2Lx?uT7BCQ=7$y#p;)`e{}y;)-MYK^7(WMOu` zF6?VEi^k8}c-O1)!0?zB?k_YC_Dr{n>+duVeg3u%CvgM`=+KgqBRp=$d;1Zbjw!_ruLr8TKi$r)TMu?bw_r} z(?56XwwATBy|3RsQ+2=W_~4YSFPtUM?mujIW?q$s`dzl+>JQRbw$V0TI3rE*7H#_U zf@!{egEpTWmlsk++Oqdev+Mh8eX)9vd8sQ+cdt4sdk+1mp|mO2_bUi`dqbfh=s!2* z#vnLrLsM5LlA(Nwx@XKCD39cSA9cI?m_O>2{|SC$5OCbcfqUJNBZrP0J96+|cl5~N zd)@IP0U!||As{gzK_F2eVIXlJfp}dcNGM(x3la@gV^s5h5WXF(N@CQ6gb_U7SduUKc46DiSLaED|je zE)p*iFcL8mG7>WqG!iuuw%5gt1nzZ_BcXd;>`3rP^ho$f{KxeQG9<{DAcKO83NkFnxF7@Lbt8iejn|D0 zGB{p0I>_*N-S{8_gp3d}M93H+gM^F{GEB%gAp_-gBZUl=*Nqi2SY9_;$Z&bxcp(FZ zj2JRx$e1C6hKw5eVRN?5|EGtxHrK=TojLyc|Czds#cuYBV(v9sl$VG^!jZ5nki0}e JILe!hzX46hU$6iG literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Cancun b/absl/time/internal/cctz/testdata/zoneinfo/America/Cancun new file mode 100644 index 0000000000000000000000000000000000000000..7e69f73de44698b65b61038ea40972f1e7c7affa GIT binary patch literal 816 zcmchUPe>F|9LIm-j+k3uV0qD_u!M(bZEGv@-|jYS?zZkaCr=ZYiy-XKspEr|PX4(H zUL*(v#X2o5U6v4p&|?%)U4rQNE~04ke4jz^&>_6^9o~Fq2Ilhl_|tQjC_!UjEsH9SiHZ<+v&y=&{AhxO#eJNYAHknfZ5D?Lx|_ z1@qRHV+pgEJZ`J|qN+Mtv!5cTRIRf`*WQep`r4$e7t88%bx?mP?=)Wv3HxpOu=;+d zUoQ_Ql)KigSB@Pt(YDjMtwR&0tz{_J-t*D4zdx7j*s?}-l#b?NfzvUwI~T8%)wY{Q zT6=0w%&wWZ(fJQbFRiwHgR4y6%S>y=IoA+s{Kq>I{&|P6F%ptz#JSmY5I9#T1!3ok zHi$a6RBC8;?p39sh4-NOP%0fH1)P)p=RECs>)aI4qkm|fr p9#WrI3PdVIN@xrW literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Cayenne b/absl/time/internal/cctz/testdata/zoneinfo/America/Cayenne new file mode 100644 index 0000000000000000000000000000000000000000..6db640981f2b845769834e57142817da8bc61c31 GIT binary patch literal 224 zcmWHE%1kq2zyQoZ5fBCe79a+(c^ZJk#4p+tejheHQ2+n`e+EV-rvLxXePCet|Nr;_ z2A2Q-uU=r_@bL{{&^0gtVq>6s5C|c`jvo*$KokG}2iXOpLH2=!>w#=y?c}ln+HYsf F1pxi^IW_;@ zhGvVQk_wrKh~{WcDN2$`xS>(#ZeX~vnF$&Y>LFfYH$oy#!8hx0#iLzBjZ z$lu1(zQe=(Y9C(vX!|X5jlW*@)it$zegnPY{iAB-z7$#Y;_oIa;-FqVy40*0P%0mL zFIH>4LT^kQta9e` z)L%w+Rhx#l(VP8Rsx9HQb?#j*mDl2|&Z{U_TWi;nt-A}=*QYCFTXvbrFWMv97Z#X; zp(V0oeYh&jcujW3W|*QelVw-nII}zERsBuFr_7!X6ZM|zv1+eZAHDZTq}ungOCM}= zMI9Vj*A!2`EQfmhVh#^HEG4b?n;$~A$PvjlrQS=WwEQjeqid5sS}@HVD_g9OfAXd( z%TLoky)spmXAaXRlH%0K^lti8R3~*hp_M)}DBM&;hRfN`zUG{tul(FpOr`y=RbD-5 zeyKPqzm^o4s@+9$e)|b^A-i0gWjocyg@yXk+|}xGa+ba_VuAWCcD}yaJxTo@I9^vj z@{+mMFj`-)lW4A2C(4a;QRe26DEVVgd*jM&FYdKoMwWPq$ASx{#*7P6b4qbJbv_Z6P|rjciZ}gd17Ii?*4%?J(3G_&y3gAld&sxuQAE0 zcVLE&=-p36T;3v)9VVH`;-wPh6>Fk$W=nKcuzC8!#rm0&J}PETn(nhXNW~5xru)9v zSoI6w&!M=yg;9Vj^T$|0%tdlaVY>643Q6$gi z&oT*P*2sv=;pVxRLOpUpni|z1OOH+*rp9>9*JC5Qsj*e#b)sJ@mAF4zCwY3Pq;>v! zLd7Zd{CiO{@jJJfl-gbkf&y-FfRhYPsE?EtfjHmio>+jhyfI-g^I;m^kUx+dc#0B*H$u2HB@?oZW49 zJpLl?-}hpb{j9SWt8e|1{p)UbLQU6lWKSZy64{r?&P4VmvOAIeiR@5hk0QGi*{6|SL5B0Ct_!^kd1_A#=Pk-h9_cQdk|9qo=r z_B67qk$sKqY-DdEyBpcx$PP#LII_!;eU9vOWUo8g-Hz;cN4w*ZJ&){qN4xKlosaB& zWcMTcA87#60i*?vwg*TPkS-u?K>C0*0_gwIHYq(>yX|d&12{u(msa%Aq`~cAkspH z9wJR-=pxcahCVvlMk1X=T8Z=$X(rN5q@4`?L>kJ_QKY2|Jw=+z&{ap@3|&Ur%+O~?+h~SPBduoWHPURP+eo{Sej^P> zI*zm)={eGLr0b5h?F@Z)w2f!zyrXSBL+_F1Bi%>ZkMtk80gyWYxdo7W0J#Z}yTH-j z2FQKjXm13DJHgT33JmuGax*a84an`la6ce71j8MH+!Dw=f!q|xU4h&d$bI2xZw%zl zaJ07ua&I`=n*+H!klTad{y=UJhC2kgMHuc84gWNN6N7u>!2hBeoH1+Jg)5+dF{xKZ`LIQ&PV}gSNf&+r; F{Ry|ZcJBZH literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Chihuahua b/absl/time/internal/cctz/testdata/zoneinfo/America/Chihuahua new file mode 100644 index 0000000000000000000000000000000000000000..e3adbdbfb25b557db2a2edfc721c365d90706233 GIT binary patch literal 1522 zcmdUuYiN#P9EbnoHEXTh773A1qP3Hq%y9>sv3IlW9ka2$W8N8?ZN}Oh@1hkA_mn8d z5@E?wJ2;h3LLt+NNiE5i6isq!J?`t}gYrrF;&*pH*V9wax9jp0R`{ajj|JK>(p2)nmU^D;bDOqs%omqHdk1VQwWRmus(8<|tCZ%kb zPK`KX7N?fzv{744`t&57{-s4_xTfihXLV}n>k)ccSH8-8I91%o<5kubmt;4LSIe8< zNKR?2$*sI6c}e4pC-bu8Px)$Agf+`bd0`61UepDBx6P_g2Xx_`Gp4AgQm?*rORZ_o z(#88vtCFLU+FPMj>29~I%~-3}6-P+f%v800!D#V?dQJJHk5WFEY&Hz_NJaN_v+-r8 zY`PX`D(^nkRV@Q%^M!U@UHib)G#%5mh5c%auTj?}-d9`GiuAS#t*SnvLF&I9R1KpF zrJ=W4HNKxG+i&Ek9gio=&T~~}*Hw|-d$Y}+L$5>vhH-}5;|ln<$8kG3D9z9sqBcWsh~f;*A*wTUhbYg`9-_XVR)0tWkPILxKyrX2 z0m%ZA1|$ziB8*HRsW5VZB*VxCl8&D?A4o!sj36m7a)KlU$qJGdBrix}kjx;dL2`p6 z2gweSo}V^9NP>Ra3?V5pa)czw$P$t!BTx7rBpPh{jkn!~xnshk!Xv}nQIX-X;gP{V E0A>k%D*ylh literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Coral_Harbour b/absl/time/internal/cctz/testdata/zoneinfo/America/Coral_Harbour new file mode 100644 index 0000000000000000000000000000000000000000..5708b55ac6bcb7580498bed9721a43fbd5a1773f GIT binary patch literal 345 zcmWHE%1kq2zyNGO5fBCeb|40^B^rRlyd4W0=I{DhaN z#K_FT`v3nb83u;`|95U+WcmMp^#TSCFq;QV3V=uk5g*?W24@!_4hG_IAPxv&a0RkK zfDuZD5Ox*^P$}41KfroGw*LQL^sXfZM1!0OqCrjt(IDr7XpoaZG|1Ut8t8NeD!ZKv I=owQk0JN5Mg#Z8m literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Cordoba b/absl/time/internal/cctz/testdata/zoneinfo/America/Cordoba new file mode 100644 index 0000000000000000000000000000000000000000..8c58f8c23eb0d66d80714a9789b5c20abf043ca2 GIT binary patch literal 1109 zcmc)IKWLLd9Eb5YZKE+13@9if60xNuA{=dF#6R_w3{^2p4Je%yL=XhU!3v_$#YqTA z5QLV-c2zuwYH6cAjWyb#1X2;fA)vS^A~D3OJ%7)MgE;8s8!n$C(@VZjX7I%EZtst0 znf$`x>662K^(FZlyOvY;&JXza*FD#h8*={S!f7?N=7O1;7}wLyyMFQdOZDK@Tl4T- zSkFwa_03>TKN=bFAMYrs(#48-vc92bkF@!-OL0}+lQiYp9rf&T-k(d~)N>!MnEA9- z^ZLE1#u9oVbsz!IjZ@e4T%~dJWELYW+`jEd^-KxKq66Ra+p!$Am zz+W0pD0{WnUp~HHhdNFbHsvRDMt^fE5w*CCHV5_?atu0kN&waO9TQ*+E z+832TyR~m>fe3f6{Xjb7rQ~c;y>fcw{Ju%%?^vMats8r7ol}q%x#5q&BA%hg9d3@{szR lQXo8+7KLGQ$?e72p literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Costa_Rica b/absl/time/internal/cctz/testdata/zoneinfo/America/Costa_Rica new file mode 100644 index 0000000000000000000000000000000000000000..c247133e334bee3b7802741383bddedb9cdf6cc3 GIT binary patch literal 341 zcmWHE%1kq2zyK^j5fBCeE+7W61sj0G;um7Rf@Yoxg4^=~gvGQIgr^4ts84^8ppm!j zf@b-l1kFP?FEBDQLE-=Z8;uzlz$DB6|2sD@a{m9ndI1Bkk8cP=uosYUb^+qx5TL;j z5JK2F+(4CJ=lp=``40q{?OMJd8st2XFvy8u8t67LHDf literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Creston b/absl/time/internal/cctz/testdata/zoneinfo/America/Creston new file mode 100644 index 0000000000000000000000000000000000000000..798f627a81e25f9657c12909f4b0878f55eea9d2 GIT binary patch literal 233 zcmWHE%1kq2zyK^j5fBCeW*`Q!c^ZJk>}%cy^L|=0FfuXz|3B#n1H=FSb0;vc{QuwI zz`y}v`}l@1_y&hC1OPD%gb=m{W+l%LsHXow5NBJk2SkIc1<@d@Nwu2`=ooV@0J&g0 AN&o-= literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Cuiaba b/absl/time/internal/cctz/testdata/zoneinfo/America/Cuiaba new file mode 100644 index 0000000000000000000000000000000000000000..145c89e0f88a210dd7fa3d953d2f62af803b62b9 GIT binary patch literal 1988 zcmc)Ke@xVM9LMpKiaE-ftIb$p7&9Z`d>==8k+HWjMbiVx3kkIprbLn?F(N1dU8BuE z+=^+M6|K4XW2;YFo8Yp2R&9>i!b&Phe$1s?jjh-cPsqM~o}d2gkNVGJcaIx8e*E!% zz7mzSTk}Hydfeo`!;?pwd-DFacK5RHSZi0$9qWGYxn5#=$Cv8K;axHq`&0+Vrt5|D z-|U6n8X20((&4wqWMt@wjwY7KA8*aDS8l133EQAoZ_hEwvI0$>{!S*-M(yO$R5LYp zm;SkDkICpeq_dkZnftnnY-V)G%;|VZ@4xkXlT|U>W?kGVb7LVp_uPQYo0FmQPK}%F zP@vge2jrn&@3Hf@smZZlXztc;CER^j7cBooq`gxk8S72ny0DF=HcNi2O7oNbvM@7O z7xp)qMHA<2tmjR6WMo_m_7<2&`)1h1_4k^`zI;y$Oa3xTI#YG&tm{%#c2xk3 zX1i>3$`sG+(&7^z$cjm0SMGmJ9v^(eu4;eZtUlRj8bY-`!+5MuHWfq$! zs-M)gp=^^VTBM0zmP>h7x|a7nC>1GFT5&W@p1L@sm9LM<`r++%!?Rz@#?RK+r&kzx z=G{EIDe{%s+*ztsGe0!dH4&|zJR@6*@6;{dG?_Sy+NCg zPsq#3LT%agj%ocdQ(viSGq3if=+0G#q;3Dt8cLaVBfo;+OkF4x1OsQM-5dm`ZD{)H zcp{W5QTNPuXUQY+->2N+KITt3>3@RX7zCU&a@JmV+Q@k$Cyt!C*PS|Y?p}BD$k`*O zkDNb}0FnWc0+Iug1d@f0lM9jzk`0m$k`Iy)l9AV?gyiIPNg-Kz zU0O(9UY8h>8Il^38K*QJf*jU&n#2_={byI`P z4Kg{%>>$&F%nvd_$P6J6_7D!G!FC67f+TR%~S#SUV literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Curacao b/absl/time/internal/cctz/testdata/zoneinfo/America/Curacao new file mode 100644 index 0000000000000000000000000000000000000000..d308336bec9a539742ca3885c44a4d3c5a674463 GIT binary patch literal 212 zcmWHE%1kq2zyQoZ5fBCe7@MyF$eApsr~GZk8xICXrvLx<$1*Vd|9@Zy1Iz#a#}6=Y r`S^w~=o*+98!$Kqhk&#KK?n&J{D5cyn)&}f$RZF;l4V>#dri0im60!* literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Danmarkshavn b/absl/time/internal/cctz/testdata/zoneinfo/America/Danmarkshavn new file mode 100644 index 0000000000000000000000000000000000000000..ad68c722f8f56d14a0a9b3e2e98fe56ee17256e8 GIT binary patch literal 712 zcmci9JxD@P7=Yn(Q!B*bfTdRUYh^!L7mcR2hzK+q?i6iB5Hv-jgF$1%7qk`B(Adw? zXf4qcK@cv{5J*G>EfGk|>AXTy5VZ8kInPBA^!>c~mF0~3G4=Kx4wJBlXI-?{ZgED1 z^M$#l?58v*UL_KKkf`rQqVE?HtDH*9-GQ`TZcAI~T*r@2bo<`E?${FDS=i8Bt82P@ zVNv(wJe`=B(!Hs1-4{>l{!mOO1Cx^c7?XjgJ{c@WWaz3vhR>>!I((7z&b^FmUd!lu zN!+Dlai3>h<@oD-zrF&-yxCuDO!-#%zwgSU(`XF0{Vz&|a(Pds-K;$sHEo}javVP3 z_WqEj%9rdIJ0xPrgrq`pA<2+zHElX1ACeHsh@?bvB1w^~NLnN>k{HR1q(*Wh$&u_x k`kFRBvI1lc$SRO^AS*%Ef~*Ev53-_~|Ffo`-J2Wy0%5kDYXATM literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Dawson b/absl/time/internal/cctz/testdata/zoneinfo/America/Dawson new file mode 100644 index 0000000000000000000000000000000000000000..61c96889b074b751386ba0923b180e4eecbea226 GIT binary patch literal 2093 zcmdtie@xVM9LMp4RFq`FZs_EAg(;rJooDfY{7C&~%Md3k20#*aZNBy?&Co*S!K zE8gkUw(9!G{HL`hj%;ogGq>8Ba~ZVOvN6|IHjOp4Eh@*?&+}9N^+$iU^}T(*kMDg4 z_uuOo+1T1#=KIGr)xP0y?YD>Lc?o+dJE=?ae-ankUaB$JUaPF@i!&}Ss zZ^dyLU(~PCN`96Zt-JKh*m{*&6VbDlEmgDgD|OcV2AMN0OJ}E6NcPQgbI~0AI;FYZQrT|6~E~F)_kNEW`3#j3X&>sV$9^HCsh9E z7pCCaHnn)@lqnqPk)q^b6Byhg#XZlNlEW*dwB?X4>s%m9LS4GNVTx4bMRjG_PqH*E zsDu8=DtI+pFZ=VVTK?H>U3K|$wPGO4+<*2x^+4Yr=D{~#RS&g)XCCf-S60>ynMWF5 zk?LY&R#oqiRkucTsOV)C8ab_NGPbLl!DD*O*gCcLtwB@!b(@6u9Wm=Ztd+V=yG{Mk zfIPY)W*&$oiWSxt(L86<J(-ewH(^#)*$*Yo76GhRC_dEcl2FR&sN^8ceS5aotb00tL}vA@}`-1@SMa)ubVwt z{jz81qS-s%E6*oSnisxlmVG_1o9;8KrDt=e+5bj?q^8))_JM2!*$J{0r`-#(8Duy7EZaf$gKP-d5way@ zPspZ_T_M|Y+I=A#Lw1I24cQyAIb?Up_K^J{8$@=9Y!TTbvPq}iC9+MY-6yh9WT(hh zk-Z|DMRtp97uheeVPwb1mXSRpn?`nxY};w~jcgp*IkI(R@5ttn-6Pva_K!3G=>XCK zqz6b7oVE){8=STeNF$uK6G$tNULegtx`DI<=?Bsfq$5a6ke(n-aoVmRZE@PZAdPX_ z&LFKpdV@3v=?>B!q(4Z5kPaa&LVAQW3F#8jCa3Ka(kQ3x6w)fE?G@52q+3Y4kbWTz zLpp}E4CxutG^A@t+nlyVMP@5(yr^htCY?xlY%JI?M&iBx+MYQS;_k0e+h>PDhe!L@5tNwV_ zxNmrQ>fFnHL$5nV$8Xz<6EX8(XroPTTIfu+ZI&m8XZ2H^lV>{~>nZh6Qn6b)mANL* z3y~D&z=DqGc+bGd$V$jk$Xdu^Ubh;u9I_s=AhIH|q}Q#9 zEQ+j(EQ_p*ER3v-ERC#ERU>@6o6EKl;CwWAVqjx6-XIK9Y`TaB}geqEl4p) zHAp!~JxD=FMMz0VO-NBlRbE#XQWsJfQW^TvxKJC9D-Ng*DG#X+DG;ep{r?QhT$ek` FegO+5`(*$C literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Denver b/absl/time/internal/cctz/testdata/zoneinfo/America/Denver new file mode 100644 index 0000000000000000000000000000000000000000..7fc669171f88e8e1fb0c1483bb83e746e5f1c779 GIT binary patch literal 2453 zcmdtjeN5F=9LMnkqQH%ZQ;8vb8FWLuL3o9$5k`URY6U)Y(?UE3#rVT< zR*YFDf|Ayni4SWwHq3b&mt~`eO%k}b^FAy8>5u+w>&t$;e%!&IpEvGR z-Zfd`A2->2!ozi$hxe(9ANJ?zJ^i7o`=tck^V$z;Z>?YNYndW?3oq&3_WkO^wg^2m z=l6!8>R53#-KR(Ab%;NrJ^EUhPh1;)Mvi^&5##48Hesdb*xmIy=m9w`H%Z)*G*8CPE>zRQ9WpLBQN{f_SI2)D zt`dgA^o&zKs+or`>sx!ys9C-l^0w`V)a(@jIcM!h;`Zz>FGv zB*zAkG<-@YUv`T-2lnZda}6rB>qVV*v`nQp)#;2^7O2d+7MZninwsxiBNvp7s_euE ze9|x>fuGjy37}>mM5fY_lmETdpuf~XP;K(-=s*-%&&xJFiNiU4~kX2Bl3~q z1ER8JNIp8yCaP+V$<*7-ulRIbVydb;yRY*i1vPNW)$SRR#BI`sJimcRXmWr$uS*+Ep7FjN`USz?@imhhJ$eNKwBdbQc zY+hJ5XBG~uoMY+8+L6U0t4EfPtlw%1fKBc$bvVj{)Q6)$NQJDXL`aRS zrbtMYILd_72`Lm(DWp_Lt&n0N)k4aJ)C(yXQZb}tNX@LKXh_vK%7)a9qi{&&I7)}q zj-z-;^^o!*^+O7XRM2Wlh}6((iilLvYRZVzk)x1EC6Q7hwM2@ER1+yDQct9yNJXut zq)1Jzrl?3&t){FVrON6L@X jUtDkg|1SRy^Iu`1`R|b8nxB@HmXYGh%uLHn%W(V&DI1f# literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Detroit b/absl/time/internal/cctz/testdata/zoneinfo/America/Detroit new file mode 100644 index 0000000000000000000000000000000000000000..e3ea5c3ef1219fdc1b6e6663d2bf3a38c27df689 GIT binary patch literal 2188 zcmdtiZ%oxy9LMn=L|_+4C@EB;f{cOux2tHk!hjL#71N6;njQ_jyF&3zjX@dOf=ssN znhtX{mT8S@jnr(pim5qkYh}tR`!hVX#e)`gj2^hy_;ucAJ?l}=TKDdp*WKNIyHD=t z9chehD);{JO0?f_c=g)D=ggh<>iIBd&4JK9@6%_ET*&=HE~p9pb#TC3^bYF8%1e?| zdRiqtH(jntJFEiUAqkjgRI=`oly6?qsVAdy?TKzZ_4TJs+JQ|veRs3DuJb;9eXQ0@ zTV0?t>hjGE^HcPV`N<|TCtppUGG=DPC#xC12V~|CV=C+XFLKkVb1M7D=W_GGBkGoR z&)oXdUX|1EqsiSosBa6NF|!suuW!$I&Eyqq)p?U2Nq(R~=a0N91wYTzvxjy`;c!G1 z^~a?6*j!c8wOC5`W~#Di)Rb@eQ_ZQZGj}ZiUIp`Jo4MsfYF<*RshIh#t{DBz%%Au` zFF1SN-1%L<4h{Y)cfG$;-@WGxx#z`=y0Y!4EbQK)?ycV^RZSaIbxFI_R9C5*@c~m? zv|iT^_nNxYg}Uxot64Obs~5ktTb6uPslwY^Wa+y(s(x))mh~m5`$HwN{IOBBA}d`Y z4WFpU#JH>szM)qBG}WxiKC4%qxolQX4(P_i!)DD$uU^}I+&nncs@FB`H|zVCY88G* zHtcFq8;knnp=ek&rFKYjZHa0gYm{hSx{7`ll33!nioKOBn@7J?Eqx12>$%JN;r1-^ z$l$PUYnU{$=eT|}sLhtP{d#N0X|t`qQ*WERB<&S_s(s{?bYym@j-f-+d8JW3-rpln zTnwr0T~T@Ry=>LBu1FV#rHox8JFVj zGuc`}>aki7sx5?Lm)PN!Wc zvQlKJ$Xb!bBCAD~i>wz}FtTD~$;g_KMI)11Sem52PSSMUavpH9?AkRK;n_g4D%n z3xia~X-k9D1}P3w9i%)+eUJhn6+%jc)CegOQYEJ?6H+IqEfi8Ir!5syE2LORwUBZl z^+F1UR17H@QZuAzNY#+CA$4=w!XcG&+R`DlbK2q|)kDgM)DI~jQbDAINDYx9B2`4n zh}6+(3yDAL!PH}m0X<@jmthlVW GH1HR^1#Eo) literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Dominica b/absl/time/internal/cctz/testdata/zoneinfo/America/Dominica new file mode 100644 index 0000000000000000000000000000000000000000..447efbe2c967cc5642b58f51aff86b67073134fb GIT binary patch literal 170 zcmWHE%1kq2zyM4@5fBCe7@MO3$eCtlrxHU!BP|I6Kk2@lt49^Pju^YP-?iSu291NzOOVAZ|rW!>%DuJ*iiN$+i)DfZQWqI;c3 z)mx<(WnWaU>d*LC_D_8zK5Y-vzJA0`OpA*l>$x9VtYA{Rs`(s5= z^&CB;_^O(jGpU19$5cq%Ssf}5D~A}-j`2O}+Ved+?97M=Kir}tKI{>ZZ+A=idW*QO z{RMgbmRfOxr$)|NoiCya?w7N(62y%Ox5?-Qd1_9mL(UD1S95<|q+`AfRk6MhJ@3em zYX19|^-Vp;Rh)O8y!rV7wV=!|7uJ6!ZgGAiZ(Z@8SQK?s#wThKKXpzgI5vocu_HS1 zvRm9fyjLfkYE;Qx+jYvp61BLwPN%-QM5WcW%Jhx1RYv|gxuj%5IpZIYccg!*mIf!v z%$Pq!=EX3XHF-v4ANyI}`PGnEw%?)e8rm(E@AygI-MLNVG@Q`)w05d{i}vgLYPPD} z#johR+_ft2w^5m&+$8c(^~r+pDp7E-U9Py2BMRT>)hka|DpymRe(;0ks;JVVi#y`f zL(2+vi8oM{#wKfb*>}o)HBy&5kE!zSlVrvG3!-8)Lav?~6>Ij5%ZJDML}jZ_J~G@c zs%j3&wO#AQqpp*>x~)w;mV7`zUguFY;X8G0exa(p;?;HW$*S&nh4utTD$l#wy8ee> z)cTH9@`;lX;z@6od}?4^G?d54#vMNKwDT{yq2Z9&7ozY ze*Zh&0YQHMZY@IWdzk%{D_w5k$~8}^c~+UH*llJbM1cKp|BJaz*uUdH`TfienI1Af zWP(;RLu87`9Fa*PvqYwe%oCZY)yx!`Dl%8AnJh9}WV*gUcX6ne?k;!w+9+^JJ{E-B3WB^G4M-GrAaAW~V14kZ^L?D?!Qeic@K$3xE z14##x4OvUQe!o_L6XCf9V9(Sevkwq8A4KoO!AORY6m#SlNis*4ku-DU8A&up zrjb-zO|Fq-TTQl+bX!fnk%S`|M^cXD97#Hob^ITv-C>Hq)RaHTm64L3lA7d7OG`;h HNp<`UV`q_f literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Eirunepe b/absl/time/internal/cctz/testdata/zoneinfo/America/Eirunepe new file mode 100644 index 0000000000000000000000000000000000000000..41047f290049eed111a7e1c0e6c605666cdea5f1 GIT binary patch literal 690 zcmcK1y-Pw-7=ZDsDTGBW5k&N5YeHW_M8q8(ijHxoXlN4p1A=I|HUvRSQxq+(IW>hg z#Mz{#+bU`XZAlP)i6*D_x!4p04V}yJcetP&pVwL2Oif!qR#@J!S>v)fccenM zdggUKnNan@z1@gBd5yC^-K<5`=fQ~{y3VTM?H4_gNqVC*k9ur(Per>P^n|`uu~gMg zY`ALG4QbaHV+8}hJ{`fJF;{Y9V+uMDGA4g+b#k`a=cQ%GicQYSj?3TrUd|tK)Z1T@ z+ZeJSX?!IQk_gF!r1F(qNHSl^hNMICAqkO;NJ=Cpk`&2`r1h1&NMc{fjHE_#bA6H{ j*^%@}eq;p57?4pQ<3L7&j0Ii!?SC3gWI;x?7>|4blHVW? literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/El_Salvador b/absl/time/internal/cctz/testdata/zoneinfo/America/El_Salvador new file mode 100644 index 0000000000000000000000000000000000000000..9b8bc7a8778a0b8caea494cd5995318ca30d4fa8 GIT binary patch literal 250 zcmWHE%1kq2zyQoZ5fBCeHXsJEc^ZJk;;YLP6lUFdpcpedK&fiq17(}q00t&TApHM- zO#%bM|NlETFtYsrzj^@!hmUUvgR=_|2ZsQ4fCO3@7+TWihn zMJMGdIyrm5S`o9z{xNdPtuBpnx`x`{p1S1UD&OaAm&;|zawQ={Mm_mzZ1FZV9-pMfr_Y3U9X zk>}IP)~!{`6S8#V%3`^3UZjo+&XlO>3=@56xx@@EGqE54E-QLw%uTOe6y3O5-+bsJ zSy>XUSJiy0;xd2Ix8#4QZjJa-$0v5G_}NL55Z0m+hCern6MNO_z8;fw-Y?0W$Bg^* z9$Djm+@u`aD5+IPby|I#q<7!URSrb{bBBS@rb&!_B(S|YnN;+>@%CnpOf4*#%#{rCwDJ8Y&>y=;+c6x z=Y^z7-q0bPe|d>)ed)9*__{{C&Bx6>y#-RZ`+zCxaLcw0rDl7hlH!;g2d;uJeq)QN84bw89TobKFJjcbMvs29dsfw! zB>Tq$)^Rkh&m+K`Mik2B{5F9Hcr(d64=b1wtx>l*rN62q_X$C8SJ9osdEy zl|o8|)CwsUQZ1xhNWGAPAr(VP=4fk%6wT3A4JjK^H>7Y#<&e@LwL^-BR1Ya1Qa_}C zj<$kG2_0<>ks>>WCB)sU%WLq?SlAk!m94MCyqY6saguQb$`;q^ORzsz_NK zZC#PVB9%o-i_{h=E>c~jyhweK0wWbhO6+KBj1<|?Rv9U?qpdSiXr$6esgYVE#YU=) d|NnA_*{o;VtS5QX-D&QWByVb}JJp>M_7|antVjR= literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Fort_Nelson b/absl/time/internal/cctz/testdata/zoneinfo/America/Fort_Nelson new file mode 100644 index 0000000000000000000000000000000000000000..5923cc6888f881c8672d96be9e23fac7166b1c20 GIT binary patch literal 2249 zcmdtiUrg0y9LMn=2m(jQZzf8F^`s_(DTW{@nrS$~KtK)_ty#9B;c99Y*4Bs?t>_;Q zIs3DUzS&KzCNgHTkqmEKt*i;lM2yHv7)mNy0ura^{abfkbldu!JyLG>*}le|`cvgLd#buzf6m`vf7z6yzoul^ z(|LEB{%IvLki6Us3@?$vs3bGk882r}PnfeUmu2X1pZTq!Th29)>-p_%a-qIgho3oQ zFK+G7OZR~J zNnKsrWY-k6>+KJ|Y;)68*XBNI*Iw*0c?(~XysrHwKkgC9Z++9O8(J@SzT2t=$F|tQ zr+4f6PYZ0(y*st|jYYO(MY(RM5?h*-qrtLa8yugd;bGyEBHZ=g_(X<6uZ((LDD<8U ziwK44YrJUxJ=VX4+nZic81#yB-6?hFE_aH9UZH#E3H$pF{`-8a`>8*l5&v)auc6SU zl~pewb3!JC%nF&7ubUS#F=S@Q)R4I$lk;`6L#Bt!51Ak`Lu87`9Fa*PvqYwe%oCX? zGE-!#$Xt=h`nuU7)Ae=pMJ9~Q7@0CMXJpdItdVIW^F}6)%p93IGIwP1$n25nBlGul z2|zM{qyWhQ`bpr0EbzEA0C_+Xfn)+n1(FLS8AvvebRhXa65{JJf}{k=36c~fD@a<9 zyda4|GJ~WB$qkYmBs)lYko+JCLNes*QiS9PNfMGJBuz-3kVGMwLQ;j~3P~1{EhJq? zzINxNFqpM{-+HNxF}}@{sJZt2OIzZ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Fort_Wayne b/absl/time/internal/cctz/testdata/zoneinfo/America/Fort_Wayne new file mode 100644 index 0000000000000000000000000000000000000000..4a92c06593d33d3969756f482e5d3d4b773984ef GIT binary patch literal 1675 zcmdVaT}+K}0LSs?kk@(LFc&RW7jAmD%q$zL)}m8hP9)@yXes=a&Q2uH1yVP-Da?{F zud{4KTr|uuW;Thu)jw}D*7heCne9CO-+%60xN+k-d!Em8&Q9xG{Ju}1pk!mR^T#p5 ze8S1G-kjV=y5`b!I@UdY4Q zNkG1>nd`pGnkC;CPIEtfo1#CP{~m6O)ZQ6SIgMfMtL;_k2|<~Wo+dK-&+5#$H7c{C zUT2M+ud*(e=>>f;YT>aunf+{@@K=}0oU73yca>i*YKRbvQxoKp%8z1cL z#d23$l&C4plDiK(Vu;VahDQ9p8GJi<9X4dx@PF{~yp}nR<9XLF`64{;LbEf{-jA`@ z30$2?o_Fu2Z)&zb;H0ISbE!F(n{!dX$uRdB<}(hTy+Yvcb1O1mwsRX8{44VdJg;zQ zxEYxrGC^d9$P|$|TFoSpSt8T4nt37`W$BdKmtexND5Yy1CoT*WPzk%HF+S3AekVkAh{sP zAlV@4Ao(B(AsHblSxrtzQdW}{l9tuvg(QY#hNOn%h9rk%hopz(ha`w(h@^<*h$Lw> zSt4m#O`b@iR+A}`Dv~RbERrpfE|M>jFp@EnGLkcrwAEydq-`~MBZ*s0=1A&D?nv@T o_DK3j{>UT1`A?q#qs^ls#XK5f{WIf};}c{3NlEcZ@rk2<0ei4Rs=?zwmTquFv{$D$O@soNjaRxqj8WZSBvu z#2QEPvCm-@f9{uu*(H$*9LUsTNv2zG?R0!fWXjDlyPFlc%#O^5ed2Xn+i%q~qHr`T z-y1xtIME}EiDOZ6U)ZI+qAEYt$d8Q`)poimJb2RagfQ}|25)z4t1Vy4EVUf5< zU?egU+R?;Df;*b%NO&YZkIw+e2*?n~7|0;VD9A95W*lT7M>7&K6fzbvn4=jD84ei_ Rqvl!ubwGE>j5*|Ue*r;HC9?nk literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Glace_Bay b/absl/time/internal/cctz/testdata/zoneinfo/America/Glace_Bay new file mode 100644 index 0000000000000000000000000000000000000000..f58522b674c2e06fb5a184130fbc470ae9db72de GIT binary patch literal 2206 zcmdtiUrg0y9LMp4AQ6dCL7AY5R*1oozlEZKg)t1`s~i+m=vzSqRwxNVlG)ONi)LG) zWsc@@Sr=sub7ULC%Dl+x0jt?s_>jYk7E7%)H6ey`uocFwsupLb|& z)1%pee_T`DI~=Z;+~GN4ySr__@J?>uz)pSh=uh%x_s=>q?~jcmI$>;Ip^i1>OO*bm zQ)NV=i-z^8%)=5hr(ds*-z~9$UX4B9A=lU~I_-y7P25n8PXD;wT>EaDjeot`T-US4 zUf;Rc+|abhCe$RG#L^^tWB#PMY5o;EV{Ve%9COCbjJP5*FZ`uRV`n6JcvNQ{J0`O~ z9MW6%za?|pF4~mmcFNqUZ|%J1{pQxZBlflx&zsv5U$dzT8cgcsN17H}V$w$U=z?F; z%pHTBnttj&$>>|B!T$NOaNAPNd?i-08f$EJ>#veiQebmeeJy#Zv+SMOAIM$NVVj?H z(&V2Tvx_djZx(;?nJxJ7WwYdv)uo@bn!9&>s)cWaOi{}LUAAMB+*9#_-dkTO#S0(P z<;8ij{P(@KBx9v1In`xL<8n-Cf1O=1k!bGUw^hr&&zAD8T7BS1f>f+8RO$UwRxU}= zRc)uGGC5L1RYxUsd0bcL?UU8x5w?2vfT{lctgV^cYt|k(Zr6==ne{sk+SQFushv8 z{>@qQMEi96iHGgxiVbG-@VC&v7|JF8IesY|W-!QTkl`TXK?dY?BSMCR zjES#dP{^o|VIku}28N6b8JgFP4H+CVI%Igr_>ci2BSeOXj1d_mGD>8a$T*RKA|pkH zij39k28)aq87?wjWWdOXks%{vMh1}uVBnU_pkT4)|Kmvh80tp2Y3$F_X5)C9ANIZ~$AQ3@Ag2V&~3KA70EJ$3Cz#x(F zy3io8@w(t3(eb+QAn`#0ghU7l5fURLNJx~BFd=b50)<4%>q3RZ%IkuKM9b^Kg~SU9 z7!olgWJt`ApdnF1!iK~R2^pZye@c1^t>*7Nc_AmfJg+95F#-|f`~*B2_q6m zB#=lXkx(MB^txao(e%1-BJuRPfFcn^LW;x`2`Um*B&_(qifgQEZmw%@dU;MTJD8bX Mo|P5M3TDRs4J6`am;e9( literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Godthab b/absl/time/internal/cctz/testdata/zoneinfo/America/Godthab new file mode 100644 index 0000000000000000000000000000000000000000..ea293cc4066c0e01ffafcc98e2db8a710596997e GIT binary patch literal 1892 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 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Grenada b/absl/time/internal/cctz/testdata/zoneinfo/America/Grenada new file mode 100644 index 0000000000000000000000000000000000000000..447efbe2c967cc5642b58f51aff86b67073134fb GIT binary patch literal 170 zcmWHE%1kq2zyM4@5fBCe7@MO3$eC!p0qU>bJ@}KO-{}GxPudTQwLM z{{P>W!NBtW|M3Hi9RL6C+`z!&;~T;d2*kPuCO~Wo)D8h5ge_$Qssvm51F8pT*Z<6R hwFnRmas)^iuK)j!A7J3~@eN_nH83_Y1(85(0yF>uLP)Uo2UHKxw*MgOL0pg% UKs3l1AesWFaM=JIW@o|$04A(H7ytkO literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Halifax b/absl/time/internal/cctz/testdata/zoneinfo/America/Halifax new file mode 100644 index 0000000000000000000000000000000000000000..f86ece4c4032634b3526187c5f86364077b9a9b1 GIT binary patch literal 3438 zcmeI!X;76_9LMpCm=UE?iki4l7HWtOD27Y%SQ?{(oMcf_@MM~SrDWogggR--OsP$o zWk!pJOQn}ELruKyj%FPo4NLK;p=MfQ8*bdr_q^>z<4iBR%yU0?81C@y_x-0nmi=Um z=O3?|%x`#j)tZOTE$5iGIdvbuzwE~v-#dp}I7Mai<$Ifti4Wgx?XGZ2oR!a~yB~#h zbc$2n_Z43o?p@t~tGoJWFYnrR@40Ia_H{nKHrM@R+iT9Jzf`;HUTJXFe>uqY&Q5bm z)-88G8=C7aU0C35=)A@Ge3EoGhWfl;4135e3u^7%)cGghrZbnlTN)qmZK-JGZ1rTi zTi=cLmS5W7Zd?4lOJyZI-dqc)L`+86E?Ymsy z-QP<1_8*bn0}D>d%DaEht&|s3Ro-F!t^18Slvbt>cPdfe#V*s;p4Zip(0qMF=c%JL zv*fWgQ$GXsEhUKSWcHHKqOtr{-XtnT6SqR%>}(K0ol4~` zA#aLc&k`AYafY~6PnWkHc|$ezWyofmrm5y@@^r}CBh~GNBlI0J`>Gb%eRRu=b}Dpm zm~Iud0MZ1a`*?#+W(V@gAJASZ2bjrJ=!{^Qy zccp!+@6P!^b&lPr?-}xwhW+6Btg zw9O**YOPFzEjZqQScC#tCp6>?hK0x_+oRL*FVBW9E@ku&QP z#q&ke<*e!`kzbG@UnmO^1zG*%?4_54r%}KS{scC@!7tqCKltze-tXTfJs!XRkP2w* z_wV(2g6!wp?0ZOJQmSXbK=Y)SXM}k~su?PeC&0d?-oU`s+wbw8{CE7a3h-c#-i%1{fJ(WQdV5Mg|!fWn`F9d zh8h`bWU#Gfw2|RP#v2)MWWL<0#25)Z2h2oez_BuGrq289nqg_j8n z5EmpcNMw-EAhAJ$gG2`j4-y|FKvokWBt%GzkRTyZLc)Z^2?-PuDI`=#tdL+K(L%z7 z#0v=+5;3a@84@!jXh_tMupx0n0*6En2^|tUBzQ>lknkb#vzh=R5ww~RA~8gQh(r+y zBN9g>kVqtvP$IEJf{8>E2`3UyB%nw{ttO;MOp%}>QANUv#1#oF5?Lg)NNkbdBGE;{ zi^SJz0*pl1YC?>}*lL1|L>UP)5@#gPNTiWaBe6z;jYJy>Hxh5F2{;mQs|h(0bE^qD z5_Kf(NZgUYBauf!kHj7cJ`#N-{7C$f0{}S!tmY6vjsdGV2#}+|Y7PVBI6w{r{&j4hH0CKn@4wct8#a@IWUkT135I1V*@!j@c*NO gGvr^6j$m_(^fEU|WKz$lm?$SQDLOhTI?4(D8&gR`p#T5? literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Havana b/absl/time/internal/cctz/testdata/zoneinfo/America/Havana new file mode 100644 index 0000000000000000000000000000000000000000..1a58fcdc988ea6ec1bb660ceabe85ea19e5b0774 GIT binary patch literal 2437 zcmdtjZ%kEn9LMp)-yCXL{y`%Nlf+6;u^XxQwI zbvPPo9rB!}K@Dp->4n#JX~fn+H?s75iSkYHqTLg6)3h9ST*4t4H&XA#I1Li>Q>8op zVo)Z0yVslO<;u;+H+#3Vy)Bb=9dvKa|50x%Z}%prcI%WC2fV38&+D`~^6!^z1v6UYTUUE?j8LxI`c@T8^5DK?rcnO6AFDYt2*4hYgxX|UUkV$oV`%* zPC4bynfkIO#SVH&W34iGq(|==*eCb)9n{rtX>~&akbR{hCJ3#EE|(|$m11DrEKB`*_1s?HeJq?ilhjs_$ony(LYG=gK()F zJ}q1J$Lka4hO}zCqfZ_=snu%+b!%g*KIQAuZPokq>8bB&&FU>$Gj>9@r@tiI2M$Ty z^h&AgY>;QK<;jkgpwwSTk)6A9Wmm@}*&o%ulVG-f~_KXbw%NZ5<-<_dQ+Zo3( zch89og-&~6<3ge1N1X|O-uWcYA8>NawJghA1p%`j#|aCwIDvoO-CO3Hc6ZnQ_=)+q zP$<|iw*%QBvPEQ%$R@33m&i7)W}nDLt!AglR*}6Tn?-huY}ab`i)`3xc8qKp*)y_f zWY=i7%>(=9FdGMUj%*#-JFu$mqqO+dPUv;pY@(g>szNGp(D zAk9F!fwTkZ2htFvBS=fErYA^KkggzYLHdF;2I&ma8l*Q!bCB*J?Lqp3GzjUC)wBrd z5z-{2OGulLJ|T@lI)$_f=@rr}q+3Y4kbWTzLpo+PEkk-{HBCdhhO`ao8`3zWb4cru z-XYCHx@R@*L;7bm4MaL>891R6X~bbG!*Hm z)wC4pDbiG=t4Ldsz9Nl9I*YUx=`GS+q`OFak^WjugOLtfO^cBpTTPRZE+cJ5`iwLh z=`_-6q}NEZk!~aHM*3|v4M#d|H7!SaZZ%Cux{kCR={wSRr1MDYk={H1=itYfH-OK) Z3Fi41rlh4Tn7?42KQ%Qa)jXxf{0?B7_b&hd literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Hermosillo b/absl/time/internal/cctz/testdata/zoneinfo/America/Hermosillo new file mode 100644 index 0000000000000000000000000000000000000000..ec435c23bc47f925bd70754b38bc8b1d2c4d3943 GIT binary patch literal 454 zcmWHE%1kq2zyNGO5fBCe0U!pkMH+y_(rqsa)_=--uq`btVY~CCgdIF)2|NC_eK`H9 zFyY3;Egu*d3K|U4TLg@X#Tty=(*#U{el(b>dkB~r-D+T9WCBBGMiwyq|9|=q28RFt z=T2Z?`Tu|Q0tSx%|N9#lctC7M0f@MdZwP~La0r7l5C;IUuS*Ef6$lVQg8PA%fx&+u z0Qmz%gZu)bLH+^JAU}ack{0yQ&{sz$? Pzk_I6`JW3IIObdcn4XX> literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Indianapolis b/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Indianapolis new file mode 100644 index 0000000000000000000000000000000000000000..4a92c06593d33d3969756f482e5d3d4b773984ef GIT binary patch literal 1675 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 W%_>XYP%*cnsw`PuT~S?8Rq#9Z#I;iZ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Tell_City b/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Tell_City new file mode 100644 index 0000000000000000000000000000000000000000..0250bf90f8fc8716a77163e7c1b92663fc6d96f7 GIT binary patch literal 1735 zcmdtiOGs2v7{Ku}X%8hMq{4;hqJ>10X)jtR1Sz65K5|l1v!|Jrc`Ow*v$F_o*CI%Z zm<-H_=tW@G!opsQ2uUNNAVy6K%{-}rLCo#^4+T++Xxn$W_jkRFyYGLz`K5bSh(9L8 zeBow_&CPqHG7n$7Tb;lARkk+HQy0#@kxx$qRPW*`*}Ee|_f<`b7wbl~-&dgeOTBWS zAyEycu95Fb68%F50ZAa zzwTGM!lyr<>{b)UF3QRBHZ`@aNq)&_RDsS&?ObyFqB)>lP5u6)<<&AdDN80#-WDm# z%5+NK8Ic;6p;K=i5ou%bdc(P9wee-T^wig?^o}^0QCOfdPlwB_ghaKeYD#8DMl0{; zm(u&qrE*qx%ABDnkr(ws=RFc)OQ1vNw+)Dbw=KHx_(QR^t4quR2;nC zugi17ggp5`SF9cvhsrPN!wa8_%8Vvm85mR5YujY?+a6UD(I{)WZmQbpy|T`CN*#HX zChHrj)X`42Y$(cA$6Dse87^}L1zULi{hB$;T)%((*S{U-+GQae=gtjRu;W~56?5$S zT>G5QQ!H?tC-+?uzy4;U$1Bz+nLFFux#rIFie&SiY`!rr`~3Oh{re*BF~7BoIQ`>4 z9WzBifmUQOk>x}d6j@SaQITb}nuSG{7Fk?md65N1mKa%NWSNnLMwS{`Y-G8uX2Fpq zx0*#qmK|AmWa*K`N0uK60Eqwz0f_+#0*L}`7`zY%V*&vpK|(=dv6^5QqOqEA7~-*- zfEXe|LPBCffpv2kuse0*$t HY+UGfYubM# literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Vevay b/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Vevay new file mode 100644 index 0000000000000000000000000000000000000000..e934de61adb342d238789c5dab9155408f8cd778 GIT binary patch literal 1423 zcmdVZOGs2v0Eh8AI`)vPgaQ|Xi(ItP@ex9VfuSOn<8w5dOpm1vrsb(@8p~`JmF1@0 z7!hU^B}F8ZVJ)O0Du@V_A_(jhnI(SFJg``(oxXax*)2_3?K(dTw>>+U1Y(_4!0>I_sO9Zd<9p3~Y@hCVkqy#lVw79#ZQ@1qeN+LM3$A7h_b~oU7pjb%4ddjMcOu1alcz{pU+Y|u3V6n z?~6sCze`p<+#sr(1F|OW6}3gVvhLWNsQ0DIV8bgB{IMt-3vY|YuWNKu<_p#Id_nI@ zjH%F#8NGXUNHw3C(0iu3RZIJ@ZXKyoBJe=A4R(pWIdQo!91!hkQQ1+RD>~*wGQ2Te zgx?g&&Si_D^KPa*F!xS$#kc70w+rfE#HSD4n^8Rt2`w*9sKbRyAL$uZN7p~oz14lH zH}OeEHpfL|_Nk0!L`8J!y6jsDi4!Ad<;f34qJJPPPfccuftCt+`jR7(JmyaJCZ#O< zN4M*a7dwvYJ{tFUUH8tYv%@gM=AjffXQ;xaJ-K_O8g zVIgrLfgzD0p;=9ANN`pY9TJ|^#D@fkM2Lil#E1lmM2Uon#EAroM2duJHL)VWT1~V_ zxK$!kA!bE@goDUnh_vFK*oR!0vQD| z3}hV0K#-9jLqW!Z4903kgAB)N#)AyVYDR<%2^kYIC}dQ~u#j;f19Se1g{7L|6`J8? T2R8W&{CU}d{Ct1DKQHwc0I7wa^g-H5PR76HXv}uY_kMXLigSL}u>G7J>tL_5D#%?Mi zqoN)m4dQK4j|dVG(IP^^smBnMGlrxhnd^MVj)la|o!tAonY2w8|L+7#sw&4ge_TDy zH{4tm=H@-!HIL}gO!wfG@3LuUfA`S-XY%f@q}w*)t881=TeojWI1eX(&?>sv?WhXM zm-Um}S4HFH>(C_iW>lJt75bgGgU9K2BQuiq6*PX`Lg~^aH!)jK`BjU`w@}d11IHE)B?8kyJ6;pCjjNh>5xB zgJf{t9TEJIkn{6Si1}{@=!F@#)WVx_y(oEHl{B~O#n1Ps((UKqWJO_)sOT(_p^<|`=$>Cz^+<@SmJGQv_DEDmChD5|akVO( zu2-LGSGDt!TJAls*5oO@wzg5N8+t>pFW#uuCtt|$gop?~zb@<2>O@`ZVY#uZL~M%g zkei?Q#g_Vz+ZTlS2&1XI-sTN*;|8(zRKITg+@Bi}gyq37*c;4mHzEsaU z+2r)H?|toaAWvtA=iR>MOPdi0I#ct_J=fd|%sngU6qxq{^BtGZJ|Xz`;Z>R+w!`cC z^;_mY@Vv5=WD_z(WQ@olkx?SUM8;_~14TxP3>6tGGFW7^$Z(PIA_GQ7j0_nWv(*e5 z8MW068yPn;aAf4j(2=ntgGWY>3?CUk5&#kb+7Ngl1}+l>5Cswj5{K0U!bK!j6ABWG z)dYh?gM@>`g9L;`goK2|gam~|g@lE~Wi^2zky%Y>NNiRU91_p61&v| zk3?@Z;Un=Q2LN&iAO`_*7$64%aws_V82BGgg+Au6$TNpUW?*dgnC#J+f!y5e-0abP Feggguh2;PM literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Winamac b/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Winamac new file mode 100644 index 0000000000000000000000000000000000000000..b34f7b27eee88867fd131f0e9b87b4c3b4c071c4 GIT binary patch literal 1787 zcmdVaNo-9~7{KxKw8j_{#G-kGg-x|eipY}?ZJOd4UkxpFj7_yTrlvL2U6?o6w1`xN z7()p)MH)nqh=^9HsZI?gr5tKek-Y2tk0pu3&bhhwck}XI@)qC!i)7|59wL4_?d>Pr zoIHE;9_QId*^zkfz?JW+d`nmF;J#<-?zX5`J>Z+Fp4ZXTtZ5MsM}IK28MWe3zkB9! z@3}BA5@|itIE`@4QTB2OkoT+jK_K-RE zLMpdii_AS0R7)CbWnRfhlYjqY$=a-3UaD91x?xsND$=W? zFIB;a5?N4xT^05zl!aA?R8ecDTwAtTt*Z;k^~E`A!=<1s&Q4bw_Xyc0V6T{12d{s= z+P1S-pbgJ|zkL7neIb1R@|i%a@1HCe9o&0o_w3G7^z{AP*8+Vegd<{XioK`VdxpIy zM?|W9Pqm+M0`3WszmH|U{jwX&)?dG}|G@XNW1{8Am?EQ!j4Lv-$k-yI>$KyGj4(3B z$S5P@jEpog*2ri(?RX<2j*K}n>d3ewBae(dGWy8)BMBfGASoa@AW0xuAZa*l9!Mfi zn+cK%k_(ayk`0m$x_o#cA&$)mND0XaNy=%n;*gfp=7l8Yw3#8PA-N&RA=x46A^9N* zA{innA~_;SI&GFnnogT1lBm;WilmCO>izJL>jHHa@j3kX@jil|gc_WEC zZRSYoPMbTDJd!<10<-vRyIp;h_mb5(dYIladmW5(anr2@}h^zW@LL literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Indianapolis b/absl/time/internal/cctz/testdata/zoneinfo/America/Indianapolis new file mode 100644 index 0000000000000000000000000000000000000000..4a92c06593d33d3969756f482e5d3d4b773984ef GIT binary patch literal 1675 zcmdVaT}+K}0LSs?kk@(LFc&RW7jAmD%q$zL)}m8hP9)@yXes=a&Q2uH1yVP-Da?{F zud{4KTr|uuW;Thu)jw}D*7heCne9CO-+%60xN+k-d!Em8&Q9xG{Ju}1pk!mR^T#p5 ze8S1G-kjV=y5`b!I@UdY4Q zNkG1>nd`pGnkC;CPIEtfo1#CP{~m6O)ZQ6SIgMfMtL;_k2|<~Wo+dK-&+5#$H7c{C zUT2M+ud*(e=>>f;YT>aunf+{@@K=}0oU73yca>i*YKRbvQxoKp%8z1cL z#d23$l&C4plDiK(Vu;VahDQ9p8GJi<9X4dx@PF{~yp}nR<9XLF`64{;LbEf{-jA`@ z30$2?o_Fu2Z)&zb;H0ISbE!F(n{!dX$uRdB<}(hTy+Yvcb1O1mwsRX8{44VdJg;zQ zxEYxrGC^d9$P|$|TFoSpSt8T4nt37`W$BdKmtexND5Yy1CoT*WPzk%HF+S3AekVkAh{sP zAlV@4Ao(B(AsHblSxrtzQdW}{l9tuvg(QY#hNOn%h9rk%hopz(ha`w(h@^<*h$Lw> zSt4m#O`b@iR+A}`Dv~RbERrpfE|M>jFp@EnGLkcrwAEydq-`~MBZ*s0=1A&D?nv@T o_DK3j{>UT1`A?q#qs^ls#XK5f{WIf};}c{3NlEcZ@rk2<0ei4m;p&f$QPfUhNVLOMctBs9X8z|+wR-*)B;;@?GM zT=AbV)}}IDH7{Ce>ROu{%{9Er=5TAhEbP6_)M;JFW^sDH&)T}^$}8ue9X@Al+&$l4 zd`)s=srlbcaDU;$?Q$Q!XN&vw{k<#XX7MXBI;YP}>CwCglCAc^)lrjO^NgKZQD7b_ zm}95qSIfhh0Xsb-DAWI#tvNqtO78G|I^*o`GV`O$I_v0p$xF?!kL*7#`K!|Q(M_M5 z$I5=Nk1zkw%+CJI1`E{$$1Z6>V4EozIje=2E)6pS4exek1cI7TWTho2LA?`)$RouTAB-Yj(l6XUxJA0bO+F zuvy%DMVB1hXO^~qp-*)kl&9-X=(5(mQdN9FtE<*Z^`ApF8tO37i^ptDR*R`Q)nk`m zU219%y{FH8*(|Y+Ze8*5VySCRYJGp6JioA38&VmvGB>30RX-NQwW2U)l*uFH_V_I5I+qDCm&AQkHUEkd;8$u`b}T-2Z}o^};0cTB^dne*C&=Z_KeaNk0>>fC(d%kLtj?Oo9? zZ{rn@{`+rfcf4lgMI*18<7FeS8+qXzuN-;l9IqXD@yM%3UcT48exv}T0;B|_2BZk2 z3Zx9A4x|u{N{~`GYC($ex@wSeysjRkAdZTVl8~B^qL8YPvXHuv!jQ_4(vaGa;*jc) z^1QA-q(F`ekrFv-M2h675-F3TPNYzzQlwO*R-{<3s}?EO>*_@c_PUCZk~wNdibkqN z%0}u&3P&nON=Ir(iubzek@CH+eq;f>ZUvAf;8+7>5ja)>Sq6@EKo){yC6J{+)&f}! zWHpfG@VfOt7R2jT1X&WVTN7kakX1pJg=1Zih2dBkWNA3o23Z`A)j^iW>(&QZAg@~? wWQn|PjgUn`RtZ@qWSx+OLRJdz-lYn-@tW_(t0*=%TpErP#Y#%TCE-ZmA5g@Bm3)Lx1Mc4x zeApxkR_es*PP1yPT(5rdS#|$cDXCF(+6%hX_IO0LkF}|EMWLj>s8^Y3I&wxo5z}U8*Kxh8=p(bcd5_+m`(9=1`XoDYR&^J5OZVW*YR^QQ?CpO>?fbf3 z_V=XKQ}2~Z&*p?W@VqD9^?|(W^75zlnKpfD?@j3~`vbFw?|<@PAm8`jf6JTU`!&NzYh4~+nc%6XSMSfv+WC>LB!_1Gq^YZ|(A4&PT@O98u@%OR z;)mIEyg29Nf4QuEb(G4^g0<6URkZePmh+E0k!s5xbY=G=`KPam{x+%0o0-Y{`x`5h z+-+Y#%y^6)#4w{+LQEmH5Mzin#2jJ|DFCSeDFLYgDFUeiDFdkkDFmqmDW(1=l`HLb F-A~yjc0>RG literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Jujuy b/absl/time/internal/cctz/testdata/zoneinfo/America/Jujuy new file mode 100644 index 0000000000000000000000000000000000000000..a74ba046226060a01c6255b6714a40211f739a24 GIT binary patch literal 1081 zcmc)IPe{{Y9LMqBa@HCi1_eb#2r1?wcu?1(G@jT&h<34o;Hg6dK~QwaAj-OQh+q&S z2ozUdqn-}dP|GKm%{<6pMnoM(MYkkkjrGr`@B4uc(V=eremr~q7(4vf=bafkeyl6_ z<60}r;gfMUqsc$>-KZ=303ck>H7O|)7X%*jZ#H@sSWF|mEGoBF=4;Y99BPW z59rm=gmPDV^ty?ICen5?zdbi;+G4qUd-9WM|9B?f5g)W2Z(f-lD_3-<*_)47D{AMB z!PaE`so66dH~quwP5Z!B^yMXdtMH; zIQO<1it!w@97<<`l$>3vM^3k#-y?vVD7 c{*VTd4v`kU(j$(@s|5c$%4n~oy1zU66E?ExkN^Mx literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Juneau b/absl/time/internal/cctz/testdata/zoneinfo/America/Juneau new file mode 100644 index 0000000000000000000000000000000000000000..d00668ad189cc7627b9301e08c00d84f1688ab92 GIT binary patch literal 2362 zcmciCZA{fw0LSrr5xCqd)GZ+qiH=Voj~=e^RFt6@Arct3n-Ezfc88UqFovR}rX#nC zi){{P(Q%Hgw$wA-O4q{DxwcG3u=Ow(rCYO{y4KTdB)9WDwDlt1=Kt>eKZpN#`}_Lq znx6AH{`0ua7YfA@&+ z?(g;9u_q+%+}!G&(X>g#*RB-_<$iHjQGs`6dcH`UTN9e)P83NId7-4tcyH1#OZDta z3smyRe0}$6mr6Mnt?xPblM?Mka?Xx(YHnb*oVWf*F+cC7T(IIZk(%(GOv`vrq)m+L zbkFM|ee7GEaiv9M4xZ9kqpzy${)0N__y)D8>t!w9s8+c_C4H?vwYY4jytgJ^<)t;s zeBU3c!1b^!Or9YMFE5luf!3;DC6j`HC*t^?_Pi z^|@ZwxL=hnI--}CcBMa7$+=#^h~sLHK}^rP?B zsjB+jx_V!+T2&m>kF}?$n&fir4>*+nuS^}tyQBg?JR(=8gvIK!8M1cbqNp2)l~0bH z5%s&S%clkh#G1xo`E-A`c&75IZsGsIX>K?&(!UO zL#lo3Pu-EIRmb23z4^vowWa?f-T8H!+S>KD-gY9Oy4LK_FZC5FXT&sTrW8bm%?d7{O-uzFCBhlWI?S0P5O24DJ#+)b2sWzw7 z@2KUNZzUDxQc_`V=5g}knY{R?9+}7d1Ba*A9PX(%_{%(D^DH@i^9$V8?K_K%4;i4< zj1cV*xiCf^Ge}^R$S{#{A_GN6iVPJQtJMq^8Lia}7a1=yU}VI|kdZMXgGNS;3>z6Y zGH_(%$k36oBZEgqj|?9fztsf5Y9fGy0Eqz-1SASb7?3z1fj}aGgaU~L5)337NI0w} z9!Nl}CL%~kkeDDrL85|$1&Iq17$h=CXpq<-!9k*fga?Ta5+JLI5E3FJMo5s5C?R1& z;)DbWi4+nlBvweUkZ2*{vYL1y0kfKjAtAGxm?1$!qK1SGi5n6)ByvdTkk}!?L!yU- z&uZd_1kh?Ch=kB;Vu%D0i6Rn4B#uZRkw_w;L}G~q6Nx4gP9&a4K&>XCNJyp(MIwuY7KtqqTqL?kc#-%b0k)b5BO$h$7$ZTpnkXY-M&gVF8i_O#Y9!W3 zupOq@kr7c-{-P(py4*3h@aJ%hc9O;aHQfJ}`=6VKq!$tQtjfhXz8slVnVXxFnVwUxvTJ(v;m$ubN&=(eTmKJJj-<7(p4{=C5>X z+H_FXNJ~v?j?`>gjntSqTbVMQh2aAwm5DxPE6cpM=Y1;X)*t=XKb^aCUeC^8@XvjJ z{P~6RGM#^1(e@2D*B*OwP7K;d<@S`|tMC0Pn^$!RZrM~PTZ?{iwsnn{V{zky$If`= zljlOglYM`Zle1#X$+`+vyER5m<(+cs4i=fS^%cRdcCMHD>eAr3HH$@8P7gK|`lYdK zc<}4oLGn#O@8J351ZnbSJKqlWnD3H2&iCCMbHV=g3qLoSADSASi>GT$^N||o(uWOl zxk?9(XTAJ>W|+Bgw3iO;Pc-2-!rG|_nTXX5y491~w3d*HR5zr}M6IGmoRjGE!z%ju z?h?~!kHqZSXkyJO)lRRJ_FufF;|>O-!+{mLnGmA)gZ#@spP1$|eS?Ix*TkxmMIB+0RPI=OzE^t&)v_pe?pDYbqzpt4X> z_YP8NWn(3MLxRc(1We}Q-_$^FuDN^CS(TO4-wevER)eGC%#fa6>LE>+&Cu%~=wU}r zn0x9fb#~Py8UB7y-@EQ}x$ouKdc>kVGIGT-b^nBoGHT8&H9D9*IahZW?|_-w zTf5fe#*Ngudl#B9&3*OQSJue5(<78`=>i%5ZXY#ahEFDzN2&+2(`3>UO=@yty!i8u zD*yGXG9~LxHRXIqGu3lMPp!FPriFIs{H?WSdi`2GW5qu6aP>l6FsH)ItQ@bE?;V-7 zdV!ifpj;ja_|%-Z5}E5wQ*)d1C6E-a0-t6}VboPsxXUB+n@*_(<-^Rv<5%>f#fj#z zs#?7$FJxrhKK*!>Hj5Wk=%Ox%&5{YFdP(S<6b~s^#r21zB%wr=RKG5z*Yed(e^2<@ooj7TZMK^oh9XeDnMN>KqPNZE~D&_`ur{ zk>T)Lo1M1qxxM@B#M9{<4u5|TO zf7t!zU;Fd7?0*mr7qkv-MoNIx04V}e1*8l}9gsq}+Dag$Kx*M?i{Wakfs_NO2T~BE zB1lP)njl3%s)CdSsS8pVq%ufpklG-{L8^n42dR&%Ef7*6q(n%KkRl;fLdt~H2`Lo1 zmEu6DxNNO}Vj;Hhq|ivEky0bIMv9G88!0zZ zZ=~Qz#gURDHAjl>YO9Wv-PP6|DZHz#JW_h3_DJ!O>LcYx>W?e{vI58wAZvguf~#Ex zWEouTIv@+-YF7eT3S=#i#XwdASq@}9kOe_j1X&VfO^`)FRs~rWSGz9A!noR%L6*kV zt_`v{$m$@=gRBp-K*$OqON6WuvPj4(A}IAw3X~;R9j}q4=42gfe{GEYq#I zDWd%u!fcIdPLgO^i?lU!{aGTb*(`dxh&4C#M|5Ff=jr$Ub=gH*>#pzFb6yWlHf}y| zZ++_%dE##us{e(D>(vkMiMIagelB_HVbdMoMLNPo14} zaEZ)q@rk^xVRBh{t+;3H6`7w}DDKVsLM{(Y6a|ZaRs~ajv10BsRd{Y(-FLa)DLQdg z-v5E^Jh1U3zy5^G`_DeEJKQOR>z*DC2zK4K2Sk{8k2K#guKVek zfQ7t^_|+b-C@Iy?I{iGVpDM2?(?6H#pSb|@4c>p=*dhI&&Bm_(^;`NcaNUL={{XT% zWOvB+ko_SWM0RM@TSWGVY!b~bd10HJ-Y3UKk)3jE71=AYS!B1!c8z+!$cBx2#~fQm z_Ka*A*)_6lWZxVcM|RG!b!6`xn@4ufv3+F!91TD^z|jJu?g7#SqzgzJkUk)dKsv$E z3Zxet%|N=r(GH{^91St*jvy^D>YgA?LArvp1?daY7^E{uYmnY>GzaMpM|+U|a5M<% z5J!uQx(mterNCSPNFw$b9?lID2qwX@& zW~1&i(rBd9NUM=vBh5y-jkH^sTK^B?9ie-kue+Y%S(cTTm6PGg&CSZq%8B?BJN%qm literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Knox_IN b/absl/time/internal/cctz/testdata/zoneinfo/America/Knox_IN new file mode 100644 index 0000000000000000000000000000000000000000..cc785da97de0a5614613f9ba6e502d7dc5f525b5 GIT binary patch literal 2437 zcmd_rUrg0y9LMo52q6eaCWd5SS}_9&Y$$E8wFP5`#6Nk!KM+Q0h-E%1kf_n))+8^Q zrA@&a>LQnGhSpSU3r(rDnlm&BQVB4LS;(VtK}zTJydN*KKlgpv@4U_qC|931-bH24 zPm{k~i2a0z+hrf#$7uUfzb{Ge{`7aXXLF?9yX%7b=5?PwJ9$u@EeSQ}^Uq7$#M9>c zw4>54jiw{IPCB~YGC%kZ>kB8=nv0z~^`-r9s?O#r{o|H3s;jSGmp;5`X5Z>v#V+jV%yK@)MJLPs9kW=8MdCQ)_e=I$-!GN!7) z+*4K{V;82IXivI~dpy?MJ0(_PCe2XeM-EGD;CK~#BSzoXeM?Pfy{Yg2{E~`0bWz9e zJ+3BJj+O^D?NyWVugl~WpP2{K&dEc$yUoMVhb7^WO(wzDs;7i4FHdg6bM^e=6qC!1q#~3v?BU3+JF{tKE zh}YiyHsu`-&;@Bts^ChTEQtHgEcilXq3?)U)X*b^owcUuwHA4%dA%uKx=$9@7nx`C zPU@1HD)rpd2EC-TP%Vwvte53vs%8Dlb!kGpDm|U6%R&NF*?}azqW7|TVTVUvJmWVj zD--3V#%{B!AVSpEQ)YGAfUH^dzF8aHD&@0lOu4ULSEe_p%FZ)-UCd^+uKAFz8d|Q_ z*KgMw+H=*$>I(fzQj%7D}XDFjjpq!dUk zkYXU!KvxdlP!G-)grg!zNjPeP6a}dYQWm5xPFonHGEQ3>j@lr_L8^n42dNKIAdU(l zCE}RQI(-x4Uf=*jPjv69GM5>6C5ve0mNTiZTDUn(t#YC#9hsqsHoGHl%u9dQ8}uLl$E2dNMSiDi#dri0im60!* literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/La_Paz b/absl/time/internal/cctz/testdata/zoneinfo/America/La_Paz new file mode 100644 index 0000000000000000000000000000000000000000..bc3df523516d19191aa9d9b88ecc97c3ea1acd4c GIT binary patch literal 257 zcmWHE%1kq2zyK^j5fBCe7+atL$k`z`?a7XJSFhCn|NozniJAHT{{u1%3}BMw|NnD3 zj2!>}A3wmr WKsSJ->wz2wavZ{C19X<12^Rnvh($mE literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Lima b/absl/time/internal/cctz/testdata/zoneinfo/America/Lima new file mode 100644 index 0000000000000000000000000000000000000000..44280a5c13866d06e34821f8d276178b14d97f21 GIT binary patch literal 431 zcmWHE%1kq2zyK^j5fBCeK_CXPc^ZI3Pl>~o!{@yMj<`N{II8b;;h4Pcf#du-7moku zKOiS@BtWh|)^Tng|NsAIWM)Ev%>VyyKf=HO zB-en*;|Ca7{{P>(fq}!vH-tggzyyd*f!0Dm2w}$x0abz>`va;6Xy^aTcI7=F8svBo z4e|hp26+NRgFFJFL7oB8AP<3Qpr=5_fIJ4Kft~}=AP<6QkS9Sj$fF<{cln_na6x9XV9aBu`RjyH8im z5z(r-b%;6_&{dtQ4^ijOTviu$Uso*$>(#}|W9m}%MY+7JMqQ~mEUjzy%hke<<=WhL zb z7rLl+D?97<%La=7{0P%wdXRJ+8)yRJE=a)o@g`7xFM&J1)IpbbN#~|&)8*J96mFCrsRiaT1^ZicTo%FGG@x_0Wut zk{FSthb1)2@PH(p6y8B4oek3?Zk<&l58l?JPJF9I?+P{d*L5+O?pDSwC*Wo(b+n{D| z_v(im_o_MNP5P1A%_?W%0X?^Bm715@;KVp>R zAIdWY0llSQXNp;L#wU+$%GHYxhpQze$@=kXuPV%n)JrRx)Usin_42|4swkvI7pHGm z#lApOl2j)pjpxnE&~37^_K;cCRxVFgRhy@d=E>^PO7rx-6e-OqGHbR(NjpFLY47jg z^}qA+`6>r^JU-uB;^*)4Rg`%;x%V#asivf5dZtaVH^bhC?46crf6*R~pL=BfdkJdn zAG#8>@gMg1?8)&Dt3%3w)B!03QVFCKNG+VU7)Ujcav=3U3W8JwDG5>&q$o&Lkg_0k zK?;LZ1}P0v8>Bc$b)2?5NPV2PKuCp<5+OB0iiA`NDHBpBq)>; zFQi~jTQQ_$NX?LLKNG+WH{{blM6cB}8h76cMQ+ zQbweXNFk9*BBexXi4+s5CQ?qMo=8EFiXtU-+L|IoMXHLF6{#yySfsK@X_49@#YL)% zlozQlQeda8Fj8Wttuaz$q{>K{kvb!VMkY^2&qxsiG!1xG55l-y}+juaiK zI#PC|?nvR0$|I#mYL65jsXkJEr2fbPIPD4`OW?F?fGmR3t^%?Q$T}bkfvg0w6v$d2 zi-D{LvK+{IAPeHOD}pSE)2<1!C{DX7$g&{of-DTOGRV>(YlAEfvO37}AnSuH5VAtZ z5;^S}A&ca+tAs3*)2LlONFczvRKG!A>?)FWsFW65}Obk7o8R#9~&PV7xXtE&6qp@ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Louisville b/absl/time/internal/cctz/testdata/zoneinfo/America/Louisville new file mode 100644 index 0000000000000000000000000000000000000000..fdf2e88b48cecddf4eafa6d8a41ba7363e4874d6 GIT binary patch literal 2781 zcmd_re@sVwUxvTJ(v;m$ubN&=(eTmKJJj-<7(p4{=C5>X z+H_FXNJ~v?j?`>gjntSqTbVMQh2aAwm5DxPE6cpM=Y1;X)*t=XKb^aCUeC^8@XvjJ z{P~6RGM#^1(e@2D*B*OwP7K;d<@S`|tMC0Pn^$!RZrM~PTZ?{iwsnn{V{zky$If`= zljlOglYM`Zle1#X$+`+vyER5m<(+cs4i=fS^%cRdcCMHD>eAr3HH$@8P7gK|`lYdK zc<}4oLGn#O@8J351ZnbSJKqlWnD3H2&iCCMbHV=g3qLoSADSASi>GT$^N||o(uWOl zxk?9(XTAJ>W|+Bgw3iO;Pc-2-!rG|_nTXX5y491~w3d*HR5zr}M6IGmoRjGE!z%ju z?h?~!kHqZSXkyJO)lRRJ_FufF;|>O-!+{mLnGmA)gZ#@spP1$|eS?Ix*TkxmMIB+0RPI=OzE^t&)v_pe?pDYbqzpt4X> z_YP8NWn(3MLxRc(1We}Q-_$^FuDN^CS(TO4-wevER)eGC%#fa6>LE>+&Cu%~=wU}r zn0x9fb#~Py8UB7y-@EQ}x$ouKdc>kVGIGT-b^nBoGHT8&H9D9*IahZW?|_-w zTf5fe#*Ngudl#B9&3*OQSJue5(<78`=>i%5ZXY#ahEFDzN2&+2(`3>UO=@yty!i8u zD*yGXG9~LxHRXIqGu3lMPp!FPriFIs{H?WSdi`2GW5qu6aP>l6FsH)ItQ@bE?;V-7 zdV!ifpj;ja_|%-Z5}E5wQ*)d1C6E-a0-t6}VboPsxXUB+n@*_(<-^Rv<5%>f#fj#z zs#?7$FJxrhKK*!>Hj5Wk=%Ox%&5{YFdP(S<6b~s^#r21zB%wr=RKG5z*Yed(e^2<@ooj7TZMK^oh9XeDnMN>KqPNZE~D&_`ur{ zk>T)Lo1M1qxxM@B#M9{<4u5|TO zf7t!zU;Fd7?0*mr7qkv-MoNIx04V}e1*8l}9gsq}+Dag$Kx*M?i{Wakfs_NO2T~BE zB1lP)njl3%s)CdSsS8pVq%ufpklG-{L8^n42dR&%Ef7*6q(n%KkRl;fLdt~H2`Lo1 zmEu6DxNNO}Vj;Hhq|ivEky0bIMv9G88!0zZ zZ=~Qz#gURDHAjl>YO9Wv-PP6|DZHz#JW_h3_DJ!O>LcYx>W?e{vI58wAZvguf~#Ex zWEouTIv@+-YF7eT3S=#i#XwdASq@}9kOe_j1X&VfO^`)FRs~rWSGz9A!noR%L6*kV zt_`v{$m$@=gRBp-K*$OqON6WuvPj4(A#dri0im60!* literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Maceio b/absl/time/internal/cctz/testdata/zoneinfo/America/Maceio new file mode 100644 index 0000000000000000000000000000000000000000..54442dc737ede2aab1b597ee71a1db3aa8e33aa1 GIT binary patch literal 770 zcmb`^KP&@L0LSt3H&Rj-gF!vSgyd;SH5#!J9V9nkFp22IU?3qSVUie0Sl%cGxv@+Z z)I@|x8me?;A^u!i^1SaEEhJuZ{WMLkx&FTPXnZ1Q{WvA&8!k?(x%gbQXx`R$Cg+pY z{n_MapW1usl>3<(k?!7=>4&_$uDf%t_eR7`p;l(LGUE1TQ)cauc-hd-YuT81I~bSm z{(y3a+N67YDDu8@C%^5g!ehDoSY1%{Cu=e=d!-swmm@-_s&OeUn<`VPdAP=DzMmE? z;b*7i;#kPVIoVMkQ{lHGr#rbKBDXmic^(iwDeXk3{3@Zfwu*~>`6|{rvus&f=dwkm zT3?=76@xL`YL`KCh0I^(*ngPG{l3NgqSnlXOy+53L#9LKLnibzGa^%ZnmLh4ky(*x zk$I7ck(rUHk-3q{J?f+dn7uMNQt`knam56e{Ha literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Managua b/absl/time/internal/cctz/testdata/zoneinfo/America/Managua new file mode 100644 index 0000000000000000000000000000000000000000..c543ffd475e374b39c6800fcc69c3c06b6eb5dd3 GIT binary patch literal 463 zcmWHE%1kq2zyNGO5fBCe0U!pkMH+y_UR{qDY|bSKoJ;Hi1OtCO5WJEfAZ&Q+f$)~V z0L{dS3R(xf1GJs*J}^4@KENsBzyoLd%m9~=yareK$OJ|vW+oOOWQNlJ|F4%}U;vU5 z3@rcuuU^2w@&EtM4GcUWl2HI6;^P~_;0wgg!66K;Kpg%!0$gdz8Y%DyYZ32TyAtEv!r3%7=;17rhRyNv2ZPSaOg{4|enMjHO zi(n^;79ojg>;fuyghUy?cP#}$aF*G3SlD6bS$}msJ?{M&ZSsW4h{MZuzgQP3!G6g&!GP(h?X1{F*SCfADxn)FrA8i0o?5eRR910 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Marigot b/absl/time/internal/cctz/testdata/zoneinfo/America/Marigot new file mode 100644 index 0000000000000000000000000000000000000000..447efbe2c967cc5642b58f51aff86b67073134fb GIT binary patch literal 170 zcmWHE%1kq2zyM4@5fBCe7@MO3$eCW~TrDkL_V#0Fx~L{~tfV z!1@3G)eDTgKE5FgZf-!rF&KzlLO=$AK?q?BS%C^cmJ0rWXaO4k|9@t?$Po|?asWse T=Sv6kviB!Y)!gV2f81L0 z4i6VJ55KQd=Eqp{UEP+7uVQP<6YUN~gr_x5ru%|oSJ`Kok(wnkJ+I{M*d*cI{7HKk zSH+&6FLl=U7_~P#t+OXqRL-0)L%p!d2wSTdsW>ccXBXRkVxUn&o8 zXjHy!>C(4+O%%i=%7VEDQMm9!9=UT%70nh)e|M)Uj;6_ynrd})aHA~E&QWFU-(-1G ziV9TB%D{?4Rc1`e%8$t+nEX};UkGu0HL9ydKZxr2Azjn^T%4Hd(zW&X#L3|rUFV-x zr}{hP=^dl$OsHDcC-kWXUyf{8YEq%p6d8J5sG4IPvU%L8S{4`N*}(#FZpPB*BiqG= ziT65OnIPoAGkr1Ri?|dX)2)ebL|aL}Zd+Ya5$~vs%+IKfO?|Rs>Y?gfZjxQYH`V32 zLfPHZuC7cvWl!xfb#-XH6pl6jc z7t$Eg8PXck8`2!oovmq)qd!~IAV-Hti%5@1lSr3Hn@FEXqe!Pnt4Oc5rdgz0ThlH_ zzqY1fj*gL*IeJE#=I9z}o1<@}ainvkb)~I_t=Ryw16#8NWDm$DICg<- zgJU1aMmTnYY=vVl$YwZpV{5j9?8nw@2-%UX*%GoRWK+nlkZmFRLNIh;V}G;lj~TZAhX0IRZM0$AQ=|xcrbM}x z2uqXfl1q6dmk?UHq$JsrvZiH7$MZRq7hZYch41M(pVO&xUVT2^++u%}{IS9I4Tt5~ z!}ADjZ)e-OD_VNXUbp#I_}Y`7_&S1T`Z~Vv>AC;D()X?YYGDg_t>Qk0t(ckePe^gd{Y6F!PQz$o%q$ zCUN&Mos@CeB(Ja2DdC6Af|Pu{a9FiTosy_i`ufDya8JVOpVDmlrPUr=_S33B$!7;xk3#KS@z< zlG*sZQ;MHVF`Hhs%jPSCP08)2y0od=l$~qU<(2nL#hxR&GPg@@@z?6AxVx%);cC5g zY_r-HUL)JS9#A#Ia;4@)xvKpbFWawWsvVCe$j&pRrmjV#epiNRIQT{+V1RoK3<&%O zm*X6d7jc{uMgkqD`LqmmoJK9dJO`+s@6$bA@nm}?*`8(gcv8I9h2Qi3g+=|pK6C7_ z31Sq)Du`JSyIfksAeOb3-kq|2xWVLZfohWQZt83jNp zV3Yu=m(pAkqZC- literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Mendoza b/absl/time/internal/cctz/testdata/zoneinfo/America/Mendoza new file mode 100644 index 0000000000000000000000000000000000000000..5e8c44c8934960e2010e7b0505966747cb2c6e50 GIT binary patch literal 1109 zcmc)IPe{{Y9LMqBbgLyE1cUw%A*7g#;6Ysrs`ZEmBihBJz*C1P0-@-TL4Q`4PQf5X z5Gby^20aCqsO3}3RzfnE5kZGV(XEJBV_Et1eLv74I@GP-c=q~j3^w+84-6hV(i!}5 zt&n#(TuC|Huf8BpH?CyV-823A-uh=|a$`nME}l?RYtGrJiE%SsyRB!gzEt;Ly|WKa zH<;P!wb~A5%)`-9{b)yC<_W<^ z1@pm{I^t%r_pq((imJ+3)qaT#scL7FuD%~LwdP)1E0omN%CKH4Z8P8Uar=E{zxr{r zUoVfumAl-nSB~#B(bnU+P1y<4+LX<;B|e+BPp5M2>$-LO^Ss%-bkug3JtkIuqqkf; z*pjF|G23TjMw@2Sb0BH^hF6)s*XfqDb1qa@|BsJIn1}yxI8q;}lUEVvX3qwJbNONr zcCKK9sB`>8Tk83yML`zlN&Di;qK(f9r;e@ zSPfYYSr1vzD=Q*PdSy*yQDjwQS!7*gVPs`wX=H6=ab$I5d9SRG6yTK#kP?s@yix>G zg;&Zz>OcxXD)CAwNG(V)Ua1Bt$1C+91tAq7B_TB-MWL^X8!3zbmb#F_kjjwKklMUb s98#TE%0ucy3PdVINpF literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Menominee b/absl/time/internal/cctz/testdata/zoneinfo/America/Menominee new file mode 100644 index 0000000000000000000000000000000000000000..55d6e326692c81a3a526ee65fa5ece091ba5101e GIT binary patch literal 2283 zcmdtiUrg0y9LMnovks8_$)peoN=t?ujt2}ylcIz%P9pv}A_!RshFHe8grlg@CzK^IB4RIw&?gHJ59n{ zJ5}PIW^>bX&1zz6g}J%0LQSg5H%X=W>Xx}F=GM#pn7f<_)X60(;H$r1wrCcIzn*cv*kld9q`kwdCA)j0_VpLZ%(g1+@0u<-4I!1gAzEgYRI0m|o|n9gd1`j< zH!{bQs`97&X7bO4)!eIJnR#EHQTLpB$IL%4rVBoN-rUkw(3QP{Zd|2 ztrzc_C`;xS=%pUht0~~pH=n9Zd23# zxq4`DvsqQYUp?GiV;(8{RM&2AmDSn3x~`#G>f<`}nvw!pGrCqcWTZ>Ow*lSgiIT=X zuU>cV7kO+~se1fa#Hkh^^Zmd5L?V5s zm5M};9E=(tiM+i}MZ514+&huCnsn{w3(JCPL6Loy*=L1)76(Ak3?!WmewJ&LZ*ex3z--)Gh}K`J2zx<$n22mA@f5f$T34?icUL6WRgxh zOO9zG^F$_!%oLd_GFOhtBD3X~E;3(^2_rM+m@+bFj!7f4=9sqA&KsFHGIM0=$lQ_1 zBeUn2J~Drf1RxpUNCA=qjwCp37LYVJZ61(BAelf?f#d>729gaV9Y{Vn5`tueBPB>q zIFf>7g(EFan-`A6AerGv4U!uqIY@Sp^dR{`5`<(3NfDAGBuP%2C5|*XZJsz1<+PdN zNEMPRBw0wdkaQvWLK22#3`rT1GbCwFn>8eDPMbH5#5rx|I8uk?jw5+U_BhgqZG@)$JZg!Rj{}Mzl;t9b zB#5FHh1Md;Y#~7|A_)qqgd!*+YSAf>q^#+Dw_3Go5%dq|d@~pBYQE1Z@%s|QADd;K zaG2K|zRy?Yx-d9V9?>;kzQ~5;~-q&f9!D`LmUA=Z-TCE%I(doxusP%nPXVi_T%+6zSL;gACtgMq+v7IVAt5D{I z`IKu#qI6Alh}__CnftU#Y<%@u=G}4$_t--1ITbB7U7OVT&2vS;(I>jFB1#q24(Z~| zIm&YP>CKVv)s~o6y;Y1UZ}@5HeL0}EO}5CAkzTcZyj1SE(l2)2%#fwsCq&uF<+9x0 zAS&9@^{!k?>@JPemC-4pDt(6bEhtje%UP2J$nnU7i_eIrSif%i(k`0A@^te=g*fzKr9OPy zDULi0(=F%ARBQi7-PVz*+It>r5i}!c=0ErZ0#~PnF!xyz90&|u7a`n1^L{>Ydo1BB zwnVl$&MeFP$G>O&g&R}9UJ97u2tV-z;tIqUhBFXv816v)VK@Zwh~bh=;}gRvh*uD| zAbvp{gLnpU4dNTbIf!=<_aOd39E5lXanYvnk>R9G<0ZpQh@T8cA)Yc^h4{*F7UC_$ zU5LLBhanzAT!#1zaoVQw8sav@Z;0a%&l#>md}lZh@t)y6#D7KukPa9vKze{QVbgR0 zX#>&+q!CCbkX9hQK$?Mc18E1+52GPSM~s#rJu#ZHX}V&xWz+PumYc47bk literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Metlakatla b/absl/time/internal/cctz/testdata/zoneinfo/America/Metlakatla new file mode 100644 index 0000000000000000000000000000000000000000..c0335970448cf4d433b86e08d79ae4b9a167e1f6 GIT binary patch literal 1418 zcmb``Pe>F|0LSrJU0qk#no9G}K^_H~W-=Q7JB1XO*rMXPsg-4Evi=q0@QVU&o_< z;c_a}DA{=@6;0!`_(ez-cL*4+c`b{>8RZFXja?iYVs^zL|inpxh(iYkLWz1^HD3dL7VJqa> zEkjd5>&)kPdGAX_uaO7XM(b?VZgdFUL;)+kuLYTPgL{<9@`$g zt7*19(yzH~`T81-*1r%GME(^mOQ9b27!&wjqb-XS9ui3AD7QN@BzFnkaVM}-5#g9L;`goK2| zgam~|<*33!;&N1hA(0`WA+aIBA<-e>A@LyrA`v1XA~7OCB2gk?B5@*tB9S7YI;vQa zU>#MoNVrJ6NWe(MNXSUcNYF^sNZ3f+NZ?51Na&6#b|iR56+IHZqlzCH05Sq(2*?4k$rTmW${i zLKM9y)E4>377-*Eg<(Wx7z0I!EjkL4^tzqzQma-$oBqSO-(}!3o9}ZKcs)_#k4-ke za9Odryw6hRakXPuwvCnhIy|}V&XfUnS8$xW>-%y2=xw{Z_gqX?-{w(Y-^fr_zkjc< zzcV*$@It8XO?CaV$dYOiRTU_s9r+?AXGF#>P7rZXPvr6`^F;jIVIBYBhgk9Tu}&Bd zP%Aqg>Q!yu)asr_op}1KTGK3bQpE$6+;B>+&AhBqc2&sKWesXwYPMV-;!%!8(b6$d zFVX@+W!kIVV#B-7GQG)V&htye#@pjMvu2veI{8v(7cEvfW!-vH@>J!@Xx5t- zd{nt%bvjQxRr#S8WxlUXZ5gkX1rM6k))$3x+s#(7{ce&hJaIyoh;wdZ@U_72Qedxvi5(mNBXtoM=J*EFcguU(fF z`|m4x{Dj7`Kc{Cn zUBbD^B~rMl=H|JK9>3@M3#}%8ePo%T7eq0LW)RgNy4f_!L9~OY2hq=_Q4pe`O`{@2 zM~IUAEm|_vgy_jo6rw3ZRfw((Wo;U58R|mxg(wWs7@{&nXNb}ets!bd^oA%7(Hx>W zM0betHjVZS^=%sc83{l#V59)afsq6x3q~4{JRpfcGJ&K5$pw-OBpXONHcdW|gdiC~ zQi9~fND7h_BP~c?jKm#6pS!5h5Y1EXmx}-Obv{wo__Sy6wr0IZ8~A@GTvWNkYyELW znSZ#ss?5#%ltbom`jP)uY)z?3s2|ib4(}H;3wrddsjks zn{sZupOvY=sRwe|rIkw5o|nsymWmaj zMwwZbEwWOJWOi1P$R0kSb6lA!r?*D0nlxLjx-a$WZ{t<&Q$qLUPTcXb~#* zNO|sySep?m^Xp%Vb@3xITyRH(fAq`s=_ked!C_rE{kAIX?$aB`PN<@5kM*X38dZF> zLvQYqs-&!0Z|U@^t-*_OTYE@scQwh<3Xdq8R4mJLVnzA4fUKA^A}U@d$jaz`QF%8~ zRt-HBJI_zoyWaGv>IO^K+; z%f_k2qOq%89vBUXrp`*){60anwC2i#Pa;KYiA%O!7!+-`ZCeqMu9P)%0=o$3PvhMN=9l%ibkqN%0}u&3U@S>Bc(f<+L7WNP4!6mNd3qOfSdxz oNr0RN$cfiI}3Ma~?qnGw~>bW}u*EBv)?d`}8ul-u9w%_dK6x&+grQ_xmQ# z$$C4=_K)Lj-f(fwnTzMZ56$hv)&rubbdB6`=!z&CAFImt4{;psAEXX%=;kPIcdH|d zZ#pV2*Quj3e{}p%R-ukXf9*KF?Q>Px`xD2B+%|R6@2un0tF7u(^B%|Pz8UIt&6$cb z1=nTOkO#R{vRPH<)#wY3bLwJBsjeBcPyH0LRoB`+RhI%>`jXC5KX+`Amn&weU+PxM zE4!D7y7F{+wJ=raqBwaiD^^_350Ui=LE=V+muwj77LD-(_03*^>Q<;-|JwJ4y6s)B zZ$CVterv4MO*LPs<`c#G&XG!Sch7OzvZGkEuG=N=ttu4va|+~xc?-qw)3W8mxFqq% zh(y^oG)w*2GeSP{nW`SOP0{VQ!j-!=Og}!=Q+1T~(4OK}W!v1M?Q5%5mt|GjE4M{- zm3L(~Q6+o^mB=UjHwjn?2koIt6K(NyDIvhuanOlJt_w5tB?bC zejx_s-P0i-tr3G$F6bfIJJqu>2lR7OK32~Me5ON(FHoT!-^pRV@oHGzW;y)!F!e%t zx+|=DxHG&c&J|J8-8mvZ#5HpL9cN_b1b5UT<&2IW=pHrWTW3tD-Th+J2Ipw+dUtH_ z-lo{bO81!d^-W_>6uZY=UeYvv&vDm;vec%R*6nh|ZHsMk@zpM!;1{hDN;346<^VNy`%0Nu6D5*d>GHJ$eZ;i6aZ+r2 zD5j4Oku&mY#mxR*GCAdtNN#VCsWIC{YJ*+R9#E=gAFtPG9b46$FDv!ybuKk`b+Jw_ z&rlij3-!DrhmuLVBEjo8yv3f72N-xSOREq=l>m}0`swExg<W*){i0=ZWo?9T<)_IHO8rHC#yGiZ^F3kr>e9)lYqw5bcJ{^p+B=Wu z*d&|H<2kt3*45*=sO&x-&&di~ck9{Ty7x&;O14d&nQWUl$y_+gTq4nMq_Sk-0=B6PZn9I+6KACKQ=bWJ-}awKS88%qlXi$h;yGi_9!CwaDBelZ(tQ zGQG(BA`^_vFfzr+93zu#X=WLjW@Mg`iAHOtd0?tJX0CzBMrIqCZe+fZ2}foenQ~;# zEzP7OvyMzVGVjR5BQuXoJu>&mOg}RJNCJ=yASpm{fF!}vWC2M7k_RLaNG6a} zAh|%2fn)C|TB$G%gkz69lM6!vb6Uir% zP$Z*BN|Br*NwqXtMbc_%@`@zZ(qtA%Es|R#xkz@A^dk915{zURNimXRB*~U0%Sf6n zO`efNTbfKGsYY^*Bpb;#l5Qm5NWyLZH@wq^`Lb-5Xy29 zL=yC%7lqa$$t;i{7m)--R6-FH5w++ulBCz|o@v>tMfAITb7n5w+1ztHrG8(6{IMDK z9S-x_hwpQ={c(P1q9UqfQkK--G0vJ6NoWpLi7u}s6}?x<(P@&B@IWn}xkyqMzB8$B zf69t)_f6VVh+a8#*Q^@+u2+xrn)IVD^_qTVG8#s8X7>@bw&1MJs%lW#aou`dcA?4% z_i5MCMCF?9lH8C8mHVt(*1!Iu@@~2$e|(;CpNNqSSEo!t>ulM0_^BzZjMhc*(~GQ8*x&3Uk&OlQ*Ekrv`=q+Ql_?D9+2%fGE`a5F)2SDr7HYQ zQrVGicI0|wXIZ4Fib;{`^kCzgTcm3izcDqRlJu@0W5)kzzOH?7$<$q+*7ale)b73s zz30M3)zElbt3y4ivGln#`RY`2+KBAUajSg`PDx9g-?V(~l-BS((>hTp`#&x-2X1A_ z!H40d?OeHTADA>9U75PG_py^w@0#y?UU`X-zoF_ zg$L8WAF=<@vhabQIKl7&;s(PHh$9S7Ag(ZcfjGnPCP3RAhCdL8ARa+ng7^e+3gQ*S zEr?$b#~_|TT!Z)qaSq~LfVO)K{{plfWOxX1k>Ml6NrsmYHyM6H9EEraaTVe##94^9 z5O*Q|2537B@fhMV#Ak@p46h+>GyH})&hQ-KI>UE}^9=7H?nC?!&~5;50EAx zT|nA^^Z{uE(g~y$MlX~v$IRF Vvx{{nIh>C8Shq9Yk?e>M`vuR{Xd(ar literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Montevideo b/absl/time/internal/cctz/testdata/zoneinfo/America/Montevideo new file mode 100644 index 0000000000000000000000000000000000000000..f524fd219e753111d18e26ea890a8ea16b5e0566 GIT binary patch literal 1564 zcmdthOGs2v0Eh8AREWsZF)KBZPFgU8>8P3Jqb3{3w6ImuvZ5%crcFrYBElXE z!JBP*!T}2gdQDlTMRCaz%OL525?1t}qSxts$9A=-ZTE7|?=p*7%>2JV{f6~<)^As= z{)C6CPCvZQ-mQ<8`7iQ24mNk5P=mgcZxiIHr>niE@0E%(T`i%rom=IF59dP{ubh{c z?jH$VZa*TgoZB7>2e-?stqq}TjSaGE=Qi*4qDAt?+InwyTAI8$rPkZyE)c!bQ@y<- zsp8iDcJH0kZgJ<(`mE6jd*tZ51zE4kD&?y^{hm+Bo8+f2DV}dX3dQ%2iCNa+Ey5b8 z^+c@NCnLHS+R=woWb~6qN8R1+Suyp?M9ko3PyEy*5g%-}Ck_WiLgNN|(!+j{SX5;v z?#-3S^E&MGu7H@4xy_St?75sdsnwoU*(7HT7kDz$6GWy{XJ^Oe$ZWaLo-@=Zat=(h zi>p71k|lG)r4`4W#mQ~qva~9H+527La(9zc-nTAXF|yQI+F25=?8$Me+8TY;C*qx& z9mT$7&2OCLYchQPjdA`J1(Cj5|7-uslwn^$IR3!bUSCitWx2*hjQ`^u6&V#7t?#kZ zJq92A%^j)K?HbE6XM|EW!0aAid*MJmZ)Kws5Aax*xAe9((DM&3yF-SE? zIY>Q7K}KB>Qj$^EgcN1eRUu^|bs>czl_8}ewIRhBb#+L2MqM9LAW|VxB2pt#BvK_( iCQ>I-C{ig>DpD&_tWj5sLH!^7U**OY=*A24V}Akwd@Wo6 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Montreal b/absl/time/internal/cctz/testdata/zoneinfo/America/Montreal new file mode 100644 index 0000000000000000000000000000000000000000..7b4682a39e2fc97450c99eed4576d2a4614bf294 GIT binary patch literal 3503 zcmd_sX;76_9LMpiA{wHIikTw0q=>RgxKd&+gnGpVOmRCJdIvQ*xgZo`3u-tuOrt@i zgSl@RqGFJSpr$rWiQ=B((UcTH5AL~eJKyJRFB;!9)8jn%bH};7{eAy2aS7AA+y3#? zH~+)SbHluRZ}EZo$SGJZSO0KRe6uw0=$fzdBG#^O)$3xnM66#jQE%vyEH+N>r#HC| zSDOd7*PE+?)mHDH<sWb@>Y$MI~_yBuGCPu zJJMg|Pw^}*;Qbtrza{wZjzI&4psM?CtdqXCoTFP~_6qT@YzLOfAr^RMcY5f{~| z*sZ0f+pQ};6ZUE8S=-{`b6&Gc&xa;OoUh#^FEpPgE|h1;i(5Vt&aT-BA&_mBb0EBxFj0{9}o@O zmB<&Gt`}~$b<#~Q5slPh>3(jlYFzA)O$yVM$Ci(E)32s0&x~ohS<0KLc|xRaF|Mof zit^Jfd%LR_{Tk_39sI;g4XbtQx{XBZJ8rVgb+$rJ68Y`Xo2 z%SDISE4t&1T=h!WA>C=n=c=>UM(x{muJWxtDE-`Gm0$S=*|oB#>Q=N=`j^FsfSd#w zxT}WX!RqIS*FL#jKfp{p|Fu+tI3o;p(w-_t=vPq51oSuSE^c#s@5ze0@m_LMQP zM@7t&yK+p}Rx#$9haT&5SdBeYqsP^5R&ndg^!V~+YC?Lxo>(+XO^VOflXHeEVc#vM zES)K)24u;%9d;4lI9X1M3=-3-f_&pKA4-bwP- zvvbQ-Vr;FJnfdD7Fs0`tW~;eg2lTw?6g98*l1%EAC6dZZWOA!ykzBM+raX!h@8v9( z@1G49sc8zO;$Db)M&6J(uVC^?&NOPG|lKo6YGwQe4Ny=`7q~YiNCU zw?3N=v&Yy54K(j)^S))?5iw@GY_>YqN6f#EUZwe=HF}Tu3-dV5Gv`)v6*7Xz5F%rU z3?ed$$S@+~hzuk$lE_dZV`*sy6B$iQGn~kHA_IzyC^DqTm?DFUj4Cp$$haZ{i;OHX zw8+>ZgNux=r5Rpid@aoYBO{CqF*3%;AS0uU3^Ov$$Uq|_jSMw1*2rKZqm2wVGTxSE zz>yJ0h8!7lWYCdOM}{34cVyr#&B!A|Z)wIJ8GK~)k>N+i9|-^w0VD)S43HooQ9#0g z!~qEe5(!Ha3M3XtFpy{<;XvYn1O$l)5)vdPNKlZdAYnn`f&>PM3=$ek6B{HrNOX|! zpcNm!5Fj2CAs|FZjF2E9Q9{Cm#0d!$5-B89NUSVPu#jjW;X>kt1PqB75;7!aNYId| zAz?$}h6E0Y91=Ptc1Z9nP4tlPA@M^3h(r(xAreC*h)5KXFd}h80*OQt38kfpB@#?a z6HO$XNIa2%A`wMGio_HNDiT#BtVmpuz#@@FLW{%}39hAyE)rfOzDR(P2qPgzVvGbC zi82yqB+f{nkw_zH`aJQ8^%^p+;} zNboI9^pWsen)o9J0CEH%hX8U6AO`_*6d;EIavUHB0&*lEhXQgeAP0k`IU10|!O|QL z$N^z#jtJzCK#mFIpg@iaf*c~q xF@hW<$WekECdhGu94NNuyCVLl7mAxXT*Ax&<8KcQ>>e2GZx0Cx3<(T&`x_HwlD7Z= literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Montserrat b/absl/time/internal/cctz/testdata/zoneinfo/America/Montserrat new file mode 100644 index 0000000000000000000000000000000000000000..447efbe2c967cc5642b58f51aff86b67073134fb GIT binary patch literal 170 zcmWHE%1kq2zyM4@5fBCe7@MO3$eC9?8oq9TdcLHkFkm%@A^Ey{n=mrSD)MG9^c*ez5ia% zK(KjRvFjgan*D{#>9v>Vj^C}#G>NJNbxp2Yqt*1v%QBx&7s1YHrwN?s&RKW!HUc z=4~I)cb1$rcdd9<-<|%N$;sQPbD|$fuDed>j=U;)Ka}eEgI$t898d-Q&Eh$}P6@s3HgpvGtJUHgqH$(e5!77wb@87Zc0_E)-W^k=hZ>O)PNzv=Fx#+-BuSha_EG9 ztVEj~ZGC!Y`WdsUwq5UvUY2lKuL_S0NhBkpB7=veeIlry=szG&UaC-gIzsZ)$t=~e z$tQcCcPUqV+<)*Bi@hIqxni-8Psb(1VyE7AC9d)ZT-8Da035gJrjSwV*fD~ zV@1f4kToHTLRN(=3t5+=T^O=5WNFCS&{-T0td3)s2docSAhJSaiO3p}MIx(2mWiwr zS*W93DY8^#t;k}L)gsG9){86{SuwI?WX;H;kyRthM%Ili99g-eT{^OMWbw%Ak>w-n zM+$&c04V`d1EdH@6_7F@b#SzWKq}#AOM%n^DF#vvq#Q^+kb)o;K}v$u1Stwq6{IXk zU68^cm2tGCL282(2dNHH9;7}V16bY#kQYNHMjWdT@sW4Jvq{c{*@&8?Aw+(cO4RyYMfv4D0nC~wt@)UUr-G2cP_@SKu literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/New_York b/absl/time/internal/cctz/testdata/zoneinfo/America/New_York new file mode 100644 index 0000000000000000000000000000000000000000..7553fee37a5d03e9163ee19b1ced730a02345cfb GIT binary patch literal 3545 zcmd_sSy0tw7{~FW;u1<|in&Fm6{0L|xKd(jgnGmUQpxbGKnAsVN+m4AN|bP>tkJ=? z!Q9a_a=|1E(F`4%HgPS*S5s0GdzBW_I;Z#h-geP=(N%xve?Dg%818=GCn+U!T5r!k zp2qfnczG_{m+x&}v>!$5LS@CrKdJW?d1U3=U#eB{j*B;NN9u6QjyHo{+MdLuyyRuVz=}cJ;}*W9HM6Z*=*-GP8ThR$Z~? z9kVBEnckcCg83{lTklJoYCeyiq$|DiWPk7=eIPPb4%AOn2ZQ3|;PHX#i&u;s>iUZu zQa5zfoO9-I+$nt|xzZf%yjvfODK^JFEA@$x#pZ-wpuh92m+vdm^~vf2Ikn+sRb4(q zP8XypUF4NBnGdS7xzX}NLN|3TwUwNo7^Q3CBh8QfTj~p8!RBJyYx+`?tLD;ghxJc2 zRp#>19lEx%)LhwJrG73sBxXgay1Hb$T${gK)nygRFH`5LUlViWw;_+H-=kBczT30< zkKkCj-fXhIUO&m)xG-4%d3=!h>%bk_x3iP+ulH-ua-V6Ce?~WaR+~oRQvvEPX*^b| zCUK{wY0tf?>8tJKmX>SOEt{8_K(k0S*9)b^iB&qNB13L1%hSOd7MPZAP1CIk(#>si zAJVNe<4v2%-E~MpxM@4Eg}yz!xoOuWT(xgjYdSP+t~y)`l#XX=Ri|$+%N={ZR-s$I zk~>#!QJu3r=B}5PsxHZAP1orq`tF#0=AMyn=zBxfnXvA&beQim2@g!x;ni!U`=$Q6 zM|r+PR3)j%qD+a})=x#}j*^~B+o@g|8K(C$*HxeR1k-o?Nfi^;!}RN2uKG6(G6On( zrw7#hYzE%=L=UR`)(rl>NXM33k^6SNsPA9$jSP9`aUGYnRfguxR}UmElVNF(so~Mt zGGh2JHKMNA#79om@l}gWLeNm1ux+LpS=&{QdbdDEAB|Jqc{60pjxH*3idV)K2B>kd z(K3EcjhfJ@l_Vt}P)RrHf!UjW>RRSp0w|(nd~dpDQl|CBh`!bl)O^&X!%T? znzr0bEgGYhce^~6KSMnpStw6rcvV_Zj->ozrL!U%(GouMi>H9_XT=}`?E+~mJT0XO*zH~R_6OYt*7Fr~ zUy+SPb{5%MWN(qpMRph2USxlf4R+ccMz+{#_ZZn^WS5a`M)n!mXk@36tw#15*=%ID zk?ltI8`*HD-Em~gop#TWO-FX!X}2BOcVy#{okzAF*?VO3k==LN?ML<>X#mmzqyMS(m14ZNb8W^Aedx|s_=_=Azq_0S0ka;NP%(sZZoI?{He??~g3 z&LgcydXF?8=|0kar2ohb;IwxDatk=^J%HQ1axWk^19CSY zw*zuNAU6bZMZQ``|338(#cM5W=AomJ#vmkd1a=UnL`V#q{9xs9Rrirn)O@y~k SRPU&s5#C1GyYGMZ zdWM^$TPnSOTvyv~I9z@9@H}&uy~R)V%c~#!s?JRY8$a7?k$H!Vun zv;1i$C*QAbP8~P1lhf4fKYTLhr*V~g;WxQu_`J$H_J!Q~+A%dZ=9$}e_pAJ-pH0Em zL4AAG8FR<7=k=Z0Z<@lQZMty!6Y=|+w14ysDf(rho;TDd#Uo)=5|2vh@dc`^XStO3 z=ctNE#8h_vrRE2M=B`ygsH(zwW+FP-1qWkUEA@lEa}~;?r(TOmbPqCb!9QBuUo3>Cytmv$wnO**>8dwOLXvf zyID3~pqIb0PgZd7&+IyXzgP3Kg2YC_gjy{*<< znqk)Foz-j4TrumWkLc#ZBj(}J{d#@x3G>KMyWY@p&}@va)GG9zZ0c)Mn@a}d(MU+O zWOPYupiH%nH%p{2OGQ4fk?1uODta_ewvK(J+6ESz_VZWtW3gQG_~3}{Xqq;1;Dmmn zN}JA(gL+%`$7Xv&x86Seqr|EQRBUuux^lWy*U%y9o@`c6#rMe5-_)obJrQ~4WS;8T z5R{!SdMY_7Iq9kt?*Hj0kvLlGd5OfQr;}0=iBs=*sqQ)5-7{B&!d`uyJ*(|`$ezZq z{Y!gZlDmcfeF}T+58V_ddBa`_dv#vkU5iWunFlfvWG2W|oOUj}%Vdz*Ak%T$`5+TQ zW`s-$nG-T8WLC(uka-~!LuQ6d4VfDE?F5k-B2z@>h)fchB{EH9p2$Rz znIcm~=88-fnXS`K7n!fqP8gXnGG%1W$fS{3BhyCajZ7SwIWl!*?#Sek*(1|O=I^u# zKr(=&0LcN81SAVc8jw67i9j-eqyotWk_;ppPMZ!SA5NPPBqL6n5+o-`Qjn}5X+iRW zBnHV0k{Tp8NOF+uIBj~6{5WlbkPJC(ijW*3NkX!OqzTCrk|-ooNUD%rA<06rg`^9~ zm(wN;$(Ylo49S_(CJo6Nk~So7NaB#pA*n-hha?Zl9+EyJe@>e~B!fVrk zd}mVYia=QH@?iM#`GJU%yr3s%O2G5d#$Z(3^+42-D^B$HUj%OZdL$S#@~byCFc`f3 zQzMYWjL7ab{OwT2!f%6uK^u zlo=nF^h2qderb+O9-gi4KIM@qMs z@3+0pS5?W5w`FP7$LgWFeX?xcTWV3+7P;uhi=upPzg>Rrw5W*PY*!o`5R0#^v6mcp zUoHKtQ&w(0td<>LEvwe-RL{RR)yWmg=eMNqk4)vyza;(NJR(-5xb~_K zGDOY9MSJx?jCgGHw7q7>n0S0>z+PJy6zdN5+UqO7Q?dPBs z{k1;TkX9iZK518to=n+z#IH77j+IaEZ4=J~Gwh8WD@Buvv77x1M9c0myR~4Nc(yrc zw@2V~5+vV2o*HqUDzwBPyqqg-I z%8<}WAz|S+dmq%=rvkm4ZKLCS;F2PqIz zA*4h`T_dDONR^N>A$39ug;WYD6;dmtSV*;yav}9X3TD(5LrP}UHA9MK)Kx>uhSUuy z98x)?bV%)x;vv;T%7@esDWFkT5GkQi*AOY9QCATuBT`4CkVqwwQX;iPiiuPcDJN1- zq@YMek&+s9O_8D+bybnF8g*Tf!XlMLN{iGMDK1i7q`XLdkpd$XMoMhdHAaeT)Kx~x zY}9o|3XN16DK%1Sq}WKck#bu)-C?2O5jT50QIWUsv8>}w^znZ!_&*8%`xZ^xi>Q27 TWnOk}w#cf?$;r;i7SVqK2N!kg literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Noronha b/absl/time/internal/cctz/testdata/zoneinfo/America/Noronha new file mode 100644 index 0000000000000000000000000000000000000000..6d91f91452d0c8474f917c41add3395838504ac6 GIT binary patch literal 742 zcmb`^y)T170LSsCMMw#^8gMiv1_?FLRQv--NS=tW2@+FBw${vW69dDI;vdkONF>-K zSj0=cEY#phs7A@T?3mUB-T`Zq3eQ8Ts~H~gy{_&a zd%uJDe~44EaX9u3hDb;#r;UXKL!u$!oHia3&}kzgA(5C!P$Vi67Kw`lMj|7joi;WS z+-ajD;gR^fodJ*$kRgyUkU@}9kYSv59AqG;9SIo<84DTAX-7kbL&n3jeapWN7#Xl* H4#p#2M|K~x literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/North_Dakota/Beulah b/absl/time/internal/cctz/testdata/zoneinfo/America/North_Dakota/Beulah new file mode 100644 index 0000000000000000000000000000000000000000..8174c8828851a7ac72aa65cbd5135664152e3182 GIT binary patch literal 2389 zcmd_qZA_L`9LMo7TBsu@`mIv{CO1w5Ck1LbiQ zcxXTd`Ce1keATOiFT5*4j_=m9j`fOb-|CU_rQPDXj%VcT=2~%meT|&6CQpRs-y`Ry z$BG+bZqR6c-Pkl=-t_cgwP3X? z7jFDm+?;w*-cs<6SQL6v#>8n6Gxep84caVXM^EUu%U-c~_;nqB)=>%F&+5b@C2Gme zI-Rt4nM$r}l_^{1s-=1B<+74-l^S!eT%Pi|x-B41rbYZN(!L9p=@S=3#s@#k+rJnR zEBb?U=Fom|$DW_`o%?o)tcFkYU9J1n-9`O6yJm;VS@OKj%~_{%e>)}f5?Vyw**9c< zNR`Mx(jg1Rvc!F_9MCJzRjR_4W_AD3B&VpdLKSz;b{<%fsY)8JIIAL~m3Q?y$2;j! zrKy8X={HfLJnA!F`6(gROda*D?Ykr@M!S5Kt?!EmhqwExY7UBZ-IczF3g1)J?aj`^ z34Q93x(cTzq)pZ4WjeKE8&q9Pv{QGwK-C9$occrYYU8(GJCAnei^tBmzQ>yuizg0W z^fi=*2xrep-=@@G#O8(rzAd4jimgTMzO7SZswu6{X&ODFwuQAh+lB{J^Y{j5d-q=T z)cFFZWoM(>F&OXctSVExx@I|k9`l*zZ{hVn{>+&EuRgBZ^MVkr`*x4V-*xwEG1I;W z+i&T*$ND{Uco$(S3%#N+$2_adQ)ZrGugEq(XPcinkNpPkKd)^B1^o zm49$QvOZ*i$O@4qB5OnzX*H`vmWiwrStznnv`giMwQ^>$z-l>`i>wz}FtTD~$;g_m zX3@y1t!CNCx{-w=E9Y1`vUZNeBdh0FKC*s}0w5LOC;?Ifjv^pcK+1sB!DeZ~BuGs-ih@+dYRZDt#cB$JREDE8NNtefAk{(2gVYBp5KREwirNWC};hExnG8B#N(Xh_wprff*vtfp{C z<*cT3NbNX^hg1(KA5uT0fJg3U!RgtnHb+wwpB9*n8(jv9Bn&KkWMas)jU!=es6-G+TQDdaY992fj z%u#2nDKt`Pt0^^7YpW?XQf;K%NWGDQBNazVj?`S(e*Z6W9%Kr?+>}1PaA{&nVp4oz La&lsFVp7nb$wqRA literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/North_Dakota/Center b/absl/time/internal/cctz/testdata/zoneinfo/America/North_Dakota/Center new file mode 100644 index 0000000000000000000000000000000000000000..8035b24fafeff6fad833094f814905213b2f3a0b GIT binary patch literal 2389 zcmd_qUrd#C9LMqBL6kp%J((235lRa}0Rh8+q%0r?c?9*yA0Y~Z5X<=a2NX5>l?>*E z`D`x4{t!5FwK8OGhI1p#YOQoGY|hq3YRego^{l*Lf#>P>{&m?!>!Pc^XU};*IN7-Q zy!`7MpUV(`yAb^^JY1K4c=sy()pIn*e&=+E>h18_eQ*4%zTOvMk1o6^M{A?SACt}2 z)Qt);eYxDa^<|C-3}svHdtM>BV=Yf-Km_f$WzEf7s6GG8FDhY-%ukLA?Z{7RK zfLgH5wH9tVC+^Faq6y^6`=*DzC0d<}Ybi1^KIG!S5f7!j#QU z;l;zED6+&UI)&sA%hZ_2gac;#Pr zN&2Tfsw{Izmi-hbD&oF%Dn1vYGH}va-+xV1jdeTK?VpLKhIctNbw|b1J=M-LzE4$c zXRF+h(yyLvsFHP&9jd-CSJqE#R1Jyovf+HOY7Ftn#$(B9)Ab+a^Ib*ag$u5;xn;3< zap0=cR2C`ZfwRt*%wNUUrgxofQQwH|C7sUpz=Uea>X$8J7u3$^4!Lu9P_<5Ol)HKk zs@<21<({@?_0mwXY^y0(FL%$DK_2~?5p2Tizxd3W`Ja7Uw=Yx(*ZrW^6YRQg+alDw zN0@KRbx$4l%;jA~uk`taFJC`v^;52&QoqR4Kj-P6Igj}!{(oNEA^o4t+9v<{E&Ug` zZcT8+amxBA3#6=&vP8-nDT_4KtE4QGvQElEDJ!LBsl2dOPA`_QT8`yX)=OD1WyO>w zQ`T&%7fo5Usa`f^-IRq>R?e|>%Gx;=Pgy<3@+s@*5P+fphXfQ2I7FbRK#_r>gQ*sR zq69?>iWU?xC~8pTpy)vngrW$CBos|JM4_l+s%4?*VycCqD8nHQMH`AZ6m=-_Q1qb) z#Gw#HA`XoxB5|lhk%>bmQ!NySQWU8;w4#VbQHvrMMK6kA6vZf#Q8c57Mp4aF%f_Lb zsTPhyIa4hihjtY4DC$wtDN37asVQ2UYOyJ5Q{<-TO%a@;I7M=b=EC^>zu-Jv3%^WDpX^(jnvt58 N>`PBiO;1e={}b5BehUBq literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/North_Dakota/New_Salem b/absl/time/internal/cctz/testdata/zoneinfo/America/North_Dakota/New_Salem new file mode 100644 index 0000000000000000000000000000000000000000..5b630ee66715d60ee99405709d86e0e6a0c8b29c GIT binary patch literal 2389 zcmd_qUrd#C9LMqBLG;K8?3allAe5E_0s@L5Nm)Pyc?9tYC`3^pVi}KrAW_3#NiZ** z&*p|$Nnqq^&4jrbj*T#@wUu*Wb6Ojvt$!BvtlVOOJpJCkF1zTW?)siR=k?%Z+Sf>5zfLC?3M%&#l{h&VH7itgBzitgzMTkGf8szx* zWn$t|sl4$~rkLzsCfzrph3JTqp0-I5^z02eWlN+Au9{;{Et*i%R*c);lo93KpKgc9 zAr*4GPx_pr>ZY%{?a<5bim;)*_Kefr;^sHIq&&P=+_LWlIkTxo+*(&HXRXT<;rS2A z*~{X^ZSi-@hS3^|v@N|3bnIBb5-!(h7`<%MHajv}M`4ej1 zT362B^oh7L{ffM+;BB!W{H%;iutnVDmv+2wtB4;tV<%h-h=qf%*@+h{mDKs7oqV!b zEo!c{Qw}asskJRKZQE?MIB$boQaq;8;~thv(>_=CcoSqs)bAqWyHL4o{IbaW@Mn4N z7XxB>ug}gJI3n&l@RNQ2%X`F%`XTi|%YN&@!lNp?y57oJ)S_~8R$IBhy(99HHamG2 z4vYM-LMQ*^E>SR=>OAtwA+_@2D$BpSNv%4SVii`DtD^Rq*6QV1s<`30wI(`N1=e1) z0uvrplHPBXd=n$eVm@=qJ`iHv zP1X}hJ?hEYa;rM5Rn_EWSv8{@Rc&0XReP>L)pD#ZZr`q$y)8}1hbK^qs z%!w;beMy+G4xDwir2ite*1zs-3;$GXFKlzRPmZd_j2^3T{Cr+8?Bw4 z2i2}i1=jB72K8KjqSahks`hluu!21LGbPx->%aa?oBAJoT(@gf2-kh9%MAI(TJ+pWh5i9)x;m^^}8vT^&rzjw@_0QS*XU=23A@I*@JEZ@!S=-oOzoq{I z*R2c=?M2pyED%{CvP5K!$Rdq;mB=!Ybs`HzR*Gh+ys%bIFBVuW$8wSNA`3=Vj4T;h zvr#V^S+!9w8(BB9aAf5iOGnnuv3O+l9Lq=6&rtxR0vshkYQRwhqzXtGkUAK3A&^QS zr9f(d6a%RSQVygZNI{T_aFhh82}e%W5mF?iN=TWIIvI7LkV2hZGN~9#TG}enm<)|o9QlzFxQIV=5Wku?0)P+SVYt*GhYHQTRMXHOGm!rN&fjKISl$fK&NRc_J zjFg$9&PH8mq|!!RYNXaiU2LSw#i73`6kleMH(3k&qU_eRcdSSiO3p`P}}bJi|p=?YI|RY*wOe{<#hJRoyEf{ zx28?zZN8#*qm?`5p>)5AH$3ZJ3(rK9ad>G$l--;&%4cqgiq0wH z$oM5uSu<)>4b+Qj=cGE?)g_N5jHu&YpR8HgqiXXDW$mYc^2Q}d?<0@$g+)u>olJG& z?Ppovd&oFB86{2yGK_|yInn5jG5pM zZI5gjf1u9J2jsbd8|wVDN4B52eQR@y--lEnXqP|6~KO_N029OjO zIY5$NWC2Nokq0CZNG6a}Ah|%2v8c0wq+?O%14+oD&IpncBqvBxjI1DOG4g^W#>fnk z8Y4GIau#)Vkn}9-{2&Qh)EPojgyaZG5|Sk(O-P>bKS(q}_nW4>jdv#7lkAD{PKU$p IuqQ_R0G#QIJOBUy literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Panama b/absl/time/internal/cctz/testdata/zoneinfo/America/Panama new file mode 100644 index 0000000000000000000000000000000000000000..5c1c06372c6dc8610ffd14f74e923bdcb9b21d31 GIT binary patch literal 203 zcmWHE%1kq2zyQoZ5fBCeCLji}c^ZI3_m{*Mj7yt(JvbZuu#dpIpmYZGnD z8EsViXMYqrD5PP3j3QPoM-hldtSF+pnGqFwD)NuOIA)Nv_HO5US`-99(4XDMxu460 zry%~miRShPE1bVwOUxS%*8y{QF6lS7;mOASkDmTUoG<)Io)@#;&!KSjLUGI3)$Qxl zHQVyM>{zb4wld{iSA0?B6y&uERd+>}@`KJMnfJ|?a|G3?&3 z|3|g*i6d@7)2FI%&k66w$QiY2Nc+^H6ltfqh86>pjiEViMM97SCmfN z<(3V#h~VjBH`KR5grCh3<;kS3*!zoE8;$9k8^02fqBZ)KicxXv;w)X6`-Q5UNjd8- ze5lu-J*RK`a!6I3`ay1Zr(fNE%#(LKzgtyzy&-E39};&qJSS^gcZs@Cx2&(L74`Ec zb+l}!icTEWv8);uJKd=_&K9b>UwB5|^I5fsAMB8u&J>7-?Q!W2q>Fp2Lb7rHjM$vF zR3@4}5Qz)(a!cf8vE{of_165eYU_J*dRywGYJO=#w@e*X+YgWE`$s#~j@CiFb7+$i z@i*nJr#i&$vH|%(GA>%PdSqKPB-&=1WwL0gNPb);+ZWA?_E+=eo|#F}F|b~Deln*X z>dw;-pPEozO(`vpji^T=O7HC&RF7uAtM@hZs(qdZdC^(Pb70k9-a*&nh&WQWKWkv&??CXroQ%{GyJA{#|^ zifk3xE3#Q+x5##p{URGic8qKp*)y_fWY<=+Z7%kWY#iA+vUOzd$mWsVBil#zk2C=3 z0MY`a2UgPrqzhKl2BZ&G(+H#!NGp(DAk9F!fwTkZ2htFvBS=e-o>)y&kgixwTadn3 zO=FPGAgw`qgER-}4$>Z^KS+a+4k0Z5|p73F(v7Gz#gI)wBxf71AuETS&W* zejyD*I)=0i=^4^Aq-$2wHl%M>(>SDaR?|A9cS!S)?jh|%`iC?S|L-7w1;@!Wv5c5# Umd4ixD}v$DczJoSJQ&XW4V<53a{vGU literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Paramaribo b/absl/time/internal/cctz/testdata/zoneinfo/America/Paramaribo new file mode 100644 index 0000000000000000000000000000000000000000..1b608b3e57479c8ba49789483e4f19e037058d9a GIT binary patch literal 296 zcmWHE%1kq2zyPd35fBCeHXsJEg&KgwMAp6?`?S1|TuRc}BE8RWNB#f*{}~vWm|0l< z|3BlwzyKs|7(i?v5P9wd1IPdWS1&N|`S^w~1OTzFfw8dxhyfQyaoGUfYG=#^0M%qrm;e9( literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Phoenix b/absl/time/internal/cctz/testdata/zoneinfo/America/Phoenix new file mode 100644 index 0000000000000000000000000000000000000000..adf28236a2feb68f177f5b002ea068db59eea997 GIT binary patch literal 353 zcmWHE%1kq2zyK^j5fBCeZXgD+1sZ_Fyk%As=I>^2SkNXjVd1Qo4W~PKCY%?)FLS>C z>6#0TQZm1OlnVTQ5y8O32!zZ)$jJ2n|Fm}u4FCVHUckum|Nq;uKkB@H%gRct^ z2Lo|<2+(i{2qEkw9-vCFlYT(;{0D+K7M=|t8stO}4RR)k200Z(gPaSZK~4tIAZLSV apwmG#$oU`|a&^pVa%I0Hfk;z8T6*#y=P`zyW(Bi zbJ<*W_Lz5h@U>b|KcH3?JW#84^r+Rzeae~Drkt}wA~PYVGADXP*2nc~&2Xp49uJ6| z{z~B*Tqkn7HVgNq6yXV1sJzy%BENW(T3h-~Y$=JDTWgBEzTA*mEl7Zk05%@MO%L{Iaz0ansirJegbYtAAoVcK>&J9`nh8tCNO|P}Tf0q*e z`|?0{gE*KIm50K9QIi;vwZ*xj_ESiPok=46vQXB=Pm8+S>9T(EjcAB&v>IPcsUsa} zR@1<^Y7Wj?^5T$cDNt5xbFXSkermOsbgK5*_p)O{RCG*?$Vf^=M24@+&Y6%n-hW=6 zcv~n=c7^4shv}lLdb>Q`X9&mqdB2Xh1#^$z@BYhOEcV!K82ain;$pGqPaF$lu}61| z#6RzM`U8e(>PwMNpJf642OEaNVPgdTp2i;iNjr_1pI^~G7mL+(XP8JTJSG<;8C#tV zk`9s&k`R&+k`j^=k`$5^k`|H|k{FU1lA5i~4N1;cXNRPR0oJM{-A!N3uuKNAgD| zfXo1yf~}qdG6`Ef3uGF$dLGC`keMJ;LFR%?2AK^q9b`Vpgpe5_Q?k`_LMCOaXN645 vR?iEW7&0?tYRKG>$sw~trf2-8+e^@6EYPFO_UF6uT<&bY$K&$2+zCGbaw3PQ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Port_of_Spain b/absl/time/internal/cctz/testdata/zoneinfo/America/Port_of_Spain new file mode 100644 index 0000000000000000000000000000000000000000..447efbe2c967cc5642b58f51aff86b67073134fb GIT binary patch literal 170 zcmWHE%1kq2zyM4@5fBCe7@MO3$eC`rL~;@FVsm89K3M(jzGfYckbF|W?KCiQF+2-#AUMX&C2a4e~>Hm zXH=oRZi>%ZU)6F>dG1D+>w~&7)b=aIZKv9r(zVm3b6dUCckYVwdOYmEMR%Qdlhq%6 z^QMtb=|<_^X~v%X=J|kW)f4*j@WhN<=k@5$iy1ph`{Of@Ccd|?6Fm!wq zFccgLP*6dlKm`>n3K#{A0!P8408$VskQ7V`Xi!0=zy=ju3NQtk?E_80rhrq>Dex40 W$^lRgfqL?-e>sTQf*j0ZGWG?L1Q>+? literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Porto_Velho b/absl/time/internal/cctz/testdata/zoneinfo/America/Porto_Velho new file mode 100644 index 0000000000000000000000000000000000000000..2423fc19a8a0c15451876f0f8f7c469112c2d078 GIT binary patch literal 602 zcmb`@y-UMD7=ZD#eo*Sy;-G`pk5%EY9YjP{1I+Uh%5gY<4_z_y=e4jW9g5ZVAF9a^+ecaWJwF&3PYLPc=R!TO{ox5_|Kg~T9 zdsd!`pG&6nJg3iUIaQfF*OefltNo8&wY0AM=BTb62I|f~(RFuLy&QCTuWg&^&D+xN z-D4(Pp3-6YS~Ze&uTf|>&7fC*8g&G6o~9_hF>S!=BmkNtAR zt-a`T9BXf`Vy)JeJtwiS=sM#nEjuH>&2s-RYWRIbzGy8YBV$L(=*aj;0whDEq(E{+ zN)jXsk_O3xBtkMFsgPVqG9+81q(kyWNuu>>=gI`BtYOl5L7*zx)Vf$><7^x SH-KrNI~d4u2p7=m*Hvf&?%;m6QX(S4h7%?xXA+fwL7D-4X zNt*xWvQ3tM(uB!5FHWOK$t9A7+%J#+_YrTr@X8y{)AM{zr?c9N|MyqCpln&P^~V)q zzTx58U>-hq+hShTA}{w)=@b9a&5v4+S!=agw6UdbV}`8HvI6Hy%JumHDgFy-C*(!X z@<2m;n{Ie~$lv&_R5x8u^tbj|En8PT3xs@gb*Q37eha3{?=_#5-FjPF>+UPp2ETU8 z0_B;TtiuwMRENx2GTe$*-l)sc`>O`4X=@I?cxaEMfFJj=#$8u1w2V!ulr3ZhyB8I&AsE6J=CWd{u zriWi`RwLR@>ZIdG)yRe_J!;!lHTu9xJ!Z*LCARF8W3zKq^5Qb-%V-lRvQUnTnkvRe zH_8d&A(d)%k*T*LMB4KtJ@NDlG3iFMPT$okGETMY%$2oba#c{vqMIsf#W|hrJENxL z@7Gh~cB`DR^)lyexyp;(C-d6fBL8)TEV#TzObeFC!bVF?ubU`mw0Ol#|294AaINxZ z-_x@Z zyxp?Q`;rxA+fB-fucrb+-l2di=GQl&fE6=+MzK|7o>5|)c~Z>dGe^-}F4u31 z|9+4w%#WRe{PE{sng77H%XTJwMGiJ{xRC>n9CGBKBZnP1@W`P@4nA`DkpPeg98CyF z3`h`26pkhgBo0Rt2oec8q40rNxJ)oWG)Oo|JV-!DL`X1Z0>}^`V}J|-G788rAmiX@1_BugWGIla zKn4RD4P-cw@jwOy84+YikTF391sN4bGc3rsIGTY$Mg|!gWNeVZK}H7|9%Ouw0YXLy k86sqikU>I52^l6wGfv1rVWm0p)_=27k?Cf;GJTOh03OvyAOHXW literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Rainy_River b/absl/time/internal/cctz/testdata/zoneinfo/America/Rainy_River new file mode 100644 index 0000000000000000000000000000000000000000..70dcd2d8014a3dccb9c3cdcd83158af262afe6a2 GIT binary patch literal 2131 zcmds%YfRN;9LIl$Y$A!0Ng)z=DG7xm2Sbl0WeH=Dh?gT5A@hPEmhnr0M2#LdCiWuT zq)b=CXjE&}lvswf$gXQ$#*pS}71LU-xlvE$3rfc6`8;oX(aW~JXV3Hb@9g~FozEw- zzV3k>`Nytx-*8x)J3LP{?&|36G$-EvQ$HOk-}w2#F>`MA6+O3Uf{mTgZzd$Xp>fh} z;_Op;-Gz2D@tadN{%oU}bmoYi{K^qYINo5df1*LAG?&>M>dItlW!NSbh2_S@$@Zp< zWJ#K}NTM?UK7ub1yPn*oa&6?Hms0sGu>-?5VlifZ? zL$ytkvny5?6jsRXYc6YU`Vv`~^Mx)NpCaMuKilx7F~Zuule&^O+o%@E%@UtDa_ho3kQ!&QGBT_>e(yB z!y$X`bI+I+=T~aUzGk!XbhegOSD95ur|9aXd1g)H6W+Lm(Yh*NF%5r z776$(^6x4fbU*YejPQnA)NSW4ZMQ+xfan2H1fmH<6;G!N@1hJu8;CldP9KOu5RD)z zL3DyB#n1|(7DF$HVhqh7sxfqfD96waq8>v(Pp2S6Lx_qH9U)3Ww1lY1&=aC4LsN*V z3|%40GPLz{>O%DObP7W>hNukD8KN{qYlzwqy&;M-G>53p&>f;YLwkt&4E;S_0vH*9 zq=1nFND?4ffTRJE2S_3ynSi7Mk_$*OAldMA>0so;(EAjyGb$J3<;k{?f(AV!8fU5Xevf+UHNB}keWd4eR0kts;3Ai07h3z98J zx*+-TbP0oG%+sX|k~2@2G)UGUX=CIKk~l`@AgN>I4w5`Z_8{qFP35RySpmqJJm xJzWwZS%jn!l1E4)A(@1v5|T^#AM`TLWpts-X=cfSU`{YQvm_J>hJx8~e*r9o^kK+um<<=d$MsazwcTt_j9H%>>a)F#?ZQQd9gBVlZ(Uh(!^Bza#pIO zjF_Oq2KPy7!Z1z!BgG8A`B2k3ADCCZ`dQOY{$w%^e5tR-o|o6QAJ7qV@5$@Szpx|o zy5x2$98;V{9TJQyLF=pv_~|jsnP`ZjM7kT zOmf!^)^SA@^5*P2nwL3A#^+wv34_ukJp8r|-|Cl%55KpQzP%xD{dm+)KHg{Y&wps& zZs|5tK2cF+{m)N3TC*%U@*Y2lw|q$qopE$aG2ij&H0arnarabSgmj9M673tS( z#Wy0A{ip4`wqK;Gd!Mat{#xdDY_bb#4$J$k)plX&Mf1VVMqQNMW)|00X-(1&v!p0r zm-H+%wV4@Od!@wG4f1K-F~3=U>sMW|w^&wQjoVeRv9kL3OxL{V95v*y`7_7OIB>|3GY%bc?2Lnl96jUkJ-XwE2mp})A_7DP zh!7Ad7-B%=U2oqP-dArdk~gvbaH5+Wr;Oo*HiK_QYtM1{x-5!R!VmLaZ3Coe-_k4|ES z$Pk$!LPMm6hz*e&A~-~Hi0Ba6A;Nof(nG}e=;UVvz@v)*BLt8bFoFPy0wWBNI4}YM zi3B7RkXS&10f`1A93EXfAOZ2{A_57CM;8-FP#{rZgar~8MqnV3VT1+}8%A&-(P4zg zql*tDKptI$AR+STVgv~iBubDlLE;1n6eLpcsSj16E7*8fFn{T|KyD!DFAaqPp+GS4 EZ|0Bbod5s; literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Recife b/absl/time/internal/cctz/testdata/zoneinfo/America/Recife new file mode 100644 index 0000000000000000000000000000000000000000..fe55739dd36e6dfea5f340f2d099c30424ba4e62 GIT binary patch literal 742 zcmb`^KP&@L0LSrb{fU&6#bCgrF-S;W94XO=k%U3g0fR|MCkBH>%3zWhNm$+}2D!0J z7FrV#B5C>$ldur#(vs(W&uAg>n(L=&a?SPoi%!SpdaNI(!hFNU=`sHO%*8Y4V zQ9oKpd=9I_=U#b~TN3I11DSp-$xPF&lR2Cc*>a=I?dC*2yCVxxTfA;-=dEf+6pv@+ zd$2{h6J63xo`_Q5(kbn^s{B+fKQ>lW^Vz0sS-w%Ns?QPjxoTUB$@bcm3QaaRp}R%V z5q@zxu96~LJazgL>tY~(F9#m#)nH0Hk%gd&YppH6?^iFs*7*_3()zyOtJM1X!m1e? zk6PWb$6U7gqnzj;;<(?pm|xVINJuD86AKB3L_@-Pns`V+PZJRdiNr*LB2kgBNL(Z^ z5*Z2YX<{S6Jxz2ZJQAPBX8>dbWC&yoWDsN&WEf8~4l zu9t}GFYyQN%A;F)^=5^;R$r{w3k%$h$}06WyIeLe6{*di`Ley?tMAiO@?#{ep>QT XtO!|>)vO6w6tXHj`elX9)XKuUTnF}q literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Resolute b/absl/time/internal/cctz/testdata/zoneinfo/America/Resolute new file mode 100644 index 0000000000000000000000000000000000000000..884b1f6470c78c482f0daa280b85e01312c764da GIT binary patch literal 1930 zcmdUvZ%ov69LGP0E{%;^DTPQ-S`vC3cNlt_^p9f<5=lJ?gv=B}EaOw^32O9VWBRCk z;540%(os*UnPZu)N%nthHODB|Rxz#Rnj7oepDh-Q>-+lE1Gb*n!`|$7uiJ6=?DKjh z*S0-gD*xIw{u3V7;UC^-n}7LgtlR!5S-yVs&Yc%$wAIVZ#<}C;a^1~Exso$y zvCf)4F1Z=AH22pWn|*0a^9KL4Ti*Xp^G|(i1;^jhTT|D|ZQaLp&YE9j?v}Ie_OcSEcEE)UEE&b%8-2Kh#ZrRCkD}VO|chCM| zyZ5NN``XXh{XNg?19c~?qNQCEB|TP|SgDo2y)9M6TV2)A5vk6qbJhL3rDi1N9z6D< zEx)irYxi{8iqlc8Yi_cK4&A6LmzCS99lz`9yaG$ExuD7Mkkyx+(fS|rr6K=I*YL4O zz0GcY?FaVQzE0gx+-DnGo3tfsuWhO-*G(gv zt+lW~TfeBWwrL@4dn0UHF8`oU9IBQl&!^qi)B<_xZ@Dfqt+Ri-c4B44m@?ZQZDBpR-b#Uimt GH1jVLtLuRP literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Rio_Branco b/absl/time/internal/cctz/testdata/zoneinfo/America/Rio_Branco new file mode 100644 index 0000000000000000000000000000000000000000..b612ac23562126db6b0aa3ce26dea6760c15be24 GIT binary patch literal 662 zcmcK1J4nMo9Dwm_Z9%H&B7%sIb{BjVL_{)nP`pYead0ZQxd`HtI_TokNfZ}XJ2^?~ zbX(CWb7`xBn?(>`rL~;@FVsm89K3M(jzGfYckbF|W?KCiQF+2-#AUMX&C2a4e~>Hm zXH=oRZi>%ZU)6F>dG1D+>w~&7)b=aIZKv9r(zVm3b6dUCckYVwdOYmEMR%Qdlhq%6 z^QMtb=|<_^X~v%X=J|kW)f4*j@WhN<=k@5$iy1ph`{Of@Ccd|?6Fm!wq zFccgLP*6dlKm`>n3K#{A0!P8408$VskQ7V`Xi!0=zy=ju3NQtk?E_80rhrq>Dex40 W$^lRgfqL?-e>sTQf*j0ZGWG?L1Q>+? literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Rosario b/absl/time/internal/cctz/testdata/zoneinfo/America/Rosario new file mode 100644 index 0000000000000000000000000000000000000000..8c58f8c23eb0d66d80714a9789b5c20abf043ca2 GIT binary patch literal 1109 zcmc)IKWLLd9Eb5YZKE+13@9if60xNuA{=dF#6R_w3{^2p4Je%yL=XhU!3v_$#YqTA z5QLV-c2zuwYH6cAjWyb#1X2;fA)vS^A~D3OJ%7)MgE;8s8!n$C(@VZjX7I%EZtst0 znf$`x>662K^(FZlyOvY;&JXza*FD#h8*={S!f7?N=7O1;7}wLyyMFQdOZDK@Tl4T- zSkFwa_03>TKN=bFAMYrs(#48-vc92bkF@!-OL0}+lQiYp9rf&T-k(d~)N>!MnEA9- z^ZLE1#u9oVbsz!IjZ@e4T%~dJWELYW+`jEd^-KxKq66Ra+p!$Am zz+W0pD0{WnUp~HHhdNFbHsvRDMt^fE5w*CCHV5_?atu0kN&waO9TQ*+E z+832TyR~m>fe3f6{Xjb7rQ~c;y>fcw{Ju%%?^vMats8r7ol}q%x#5q&BA%hg9d3@{szR lQXo8+7KLGQ$?e72p literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Santa_Isabel b/absl/time/internal/cctz/testdata/zoneinfo/America/Santa_Isabel new file mode 100644 index 0000000000000000000000000000000000000000..29c83e71ffa6b071c52b2360295bf55009c09b76 GIT binary patch literal 2356 zcmdtiZ%oxy9LMnsp(Ki)RFwE*C#4t&SN@A){}j7|+(5aKn2{NO24#>CO3@7+TWihn zMJMGdIyrm5S`o9z{xNdPtuBpnx`x`{p1S1UD&OaAm&;|zawQ={Mm_mzZ1FZV9-pMfr_Y3U9X zk>}IP)~!{`6S8#V%3`^3UZjo+&XlO>3=@56xx@@EGqE54E-QLw%uTOe6y3O5-+bsJ zSy>XUSJiy0;xd2Ix8#4QZjJa-$0v5G_}NL55Z0m+hCern6MNO_z8;fw-Y?0W$Bg^* z9$Djm+@u`aD5+IPby|I#q<7!URSrb{bBBS@rb&!_B(S|YnN;+>@%CnpOf4*#%#{rCwDJ8Y&>y=;+c6x z=Y^z7-q0bPe|d>)ed)9*__{{C&Bx6>y#-RZ`+zCxaLcw0rDl7hlH!;g2d;uJeq)QN84bw89TobKFJjcbMvs29dsfw! zB>Tq$)^Rkh&m+K`Mik2B{5F9Hcr(d64=b1wtx>l*rN62q_X$C8SJ9osdEy zl|o8|)CwsUQZ1xhNWGAPAr(VP=4fk%6wT3A4JjK^H>7Y#<&e@LwL^-BR1Ya1Qa_}C zj<$kG2_0<>ks>>WCB)sU%WLq?SlAk!m94MCyqY6saguQb$`;q^ORzsz_NK zZC#PVB9%o-i_{h=E>c~jyhweK0wWbhO6+KBj1<|?Rv9U?qpdSiXr$6esgYVE#YU=) d|NnA_*{o;VtS5QX-D&QWByVb}JJp>M_7|antVjR= literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Santarem b/absl/time/internal/cctz/testdata/zoneinfo/America/Santarem new file mode 100644 index 0000000000000000000000000000000000000000..d776a43877dc872da5bc370cb2b186f7b0890b47 GIT binary patch literal 632 zcmb`^Pbfq|9Ki8eyR@x;7Z(RCuGC~5Bx!Kj14_M8PEMp;xRA@@x_2oKjyTP6R}SyC zDF-DE+wR(n+ZM{7ZI{OH`?x8k%xm6vdi7p2pXV*CEDfn2BO*_jjJQnJE!%S2JKaiV z+UFlLAG0?5G-=LCyE;E|Zt|6=DRe&gh3v8}*85HAprY@J$ENH}=;!@b|D|zNzxwOu zt!=X-M)+QI%Ov*W@ z8bZHZ;jnX;8Ks=Nxe7&`%lRtGT1BR3JT<5jGKb{^U&H&uxvSsr$QB&urx*kk2Z{y7 zgJKd?Tqrg{#fM@070yZ3YV>|x{0?|TY1 zl$Rzr|F{CpH{4vWo16D(&F0Z6vR51^`p(-#(F(`46jXYkm%D*f)f zMDKekZ_4+5A06xtAJN?x4|scS6zSt9BfJB%E9AiT?+3p)*Q&pqby^K46zbu+HhE(x zRo-m-L%9Q=YNz^~^3-~@kIYrRh4I=iB1%n2UoHKe5ET&ID+4Z!s=%95Vi5kZN+|lTWFh_9@(g;U*4%^ z`ft)RhaOU4mzL@9&SW*~^CCHWZ@8LsG+o|a^{1NK8X+Tg`HDL#edN59>*CJ*i}J3p z^J0Foqvu~cAtHYn(|4aeC>C7(NH6@bPu(-}mX3O(Lq&JD=taAqRx$0{bZp5ZN;L10 zaT!@EzPMZ_q>YF~xl%3;&J;^RdSsISuu66&$>dK0MamCRdgY}~9*p{3t|_Wk1;J=-Qk{QG2>q*2lH0`nO+`4WSLH;n`;S#N~~uvAje!4W+3kb2H^ropaT$g^_ZX z>$)BvkFUqiXZ+*q<2%9J{sI4ykH72oec(9u>F2t~l@sW?C$%$?r^h^p2R)O=pM1Y6 zufSPj?nPp;xf9JjzC@45OwC*#Pr<+M^Pu^m-RGG78~y{=E#EVzAK5FiS!B1!c9H!e z8%B1FY#G@zvT0=3$hNI!-^j+1og-Vfn!O{NM|O{F-)i=cGyrV}c%cPcrUyV1kS-u? zK>C0*0_gr8{vi!SI*7Co=^@fYq>D%!kv<}gL^_GI66qz}x{9?M3=)H4R2OjI>zR9_hW+ zG#}}{)wCb!ztx-p$T?s&X902^AZG${E+A(Eay}qugw>?O`9B^ML8;~lNl!G-g!JgV T!H!G#@4~GBYu=z#%I$>;M1z zDi|1mWC8=r|NqAiFmnF?zjFfv@BjY?b}$NpL>R<p=}EHn&s^C|uhY7I?_UplP|rMe_qws;&x7y# z6R&A%2nYW4xXyitCy#db#2#~ z+EWLX$>}S%X!6aZoH^aCL-B}QtQoDpk6JF5dROY@v6D@zDyXTxk0qUb!lw76%$1+B z^lHZzGpT=vPHy|kOfmObi42&j?M-^;m}4fVdc4g!yI!Wv{>@H1*(bSE$7$}NVUriQ zpn0!%$UQ&ZWT&qQn_%yUI-}vJ|B~&sAA=c0g;kC*{#(t$l1&uRMNu zpckejYmE; zZMRiu+uk2!Q%ZI7i=F1#uW#1pR%|d^_FvTJ7w?c4y1vxF$Pw4}E0Z}{9tdPI!$Tvk z&t$&%Ja9vKEFPGlVfT!<1LYC_@1x%8KIV@)<$r?Tn8|S5$boy^kt2tW96NIGUU&4! z;d|ZjBLN^0AR!A@LyrA`v1XA~7OCB2gk?dR?4Ipk5a#5-Jia5-bue z5-t)i5-<`m5;77q5;PJu61LaHjRfv>kt3mdUF=BkNc2efNc_kEAR~Yb0Wt>2ARwcF z3`3Kj0!R=$haT_<8>p042{=~ z4Kg@hH#*4hc-{CQ1B8qaGDOH2A%ldB5;9E4I3WY&bt8ogmDi0GGFVrvKAJd&2c_ZD)?Z{(q(}d!C!U!iakf7Y1XYP<|+1XKFAO J&X4dW`){q=QK$d_ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Scoresbysund b/absl/time/internal/cctz/testdata/zoneinfo/America/Scoresbysund new file mode 100644 index 0000000000000000000000000000000000000000..8e1366ca39a856d17bf16d5eb331e308890c7ce8 GIT binary patch literal 1930 zcmdVaT};(=9LMoL0m+ziUmp+(kP->VBbAj+9o!@BsfpK-$omEfOWyxq6m9;rz zl3D(aWW^6ic1D|I&j)3FY_G1Lu8|FYw(7=n1@grA73v+T)||18n%kAHdHr#^sUcDG zJ2%MYqHry!i4CCqyb;CJ{w)C+gz!-ZPu+7QAJX5X^C#Xn<6_t{6j0J zB4y{`VyPPaO?CzENOkX|JYPK}H66d`?!1qrwrWD_68fY*XG9w!KF~e!s(Wr6)5iH0 z-Fu;3UziT)i>E8K>HL1#cO*xfhqlT~jS2d4SC;HA^GZuYw7lY3AqNWY$*YSkX-$vP z*4tO5ZPBc@efOob-@2@?zds~zOpfWnzR$H|WI*3+Kc&H*payN*wn82VeK0KiKmH1{ z?Oz)$%eH5Jvdr`Ew?iWSezqday;&g(?|=II0c(vr!@ND#YPXx;m>0h@4_4q`objCV zNBmdY=A8MKlSa-OIc?;;krQ_`XO5gYa_-2m$qz{o z$q-2q$q`8s$r4Eu$rDKw$rMQy$<@&$i)8C)(naz`5=JscQbuw{l18#d(nj(|5=Sye zQb%%kG|3~`JDT*7{E-PjW&oK2WDbx?KxP4%24o(Pi9luonF?eskjX%1!_iC!G9So< zATxqY2{I?hq#(0`ObaqE$iyHsgG>!FH^}55v*T!{2bmv7GeO7b8FWLuL3o9$5k`URY6U)Y(?UE3#rVT< zR*YFDf|Ayni4SWwHq3b&mt~`eO%k}b^FAy8>5u+w>&t$;e%!&IpEvGR z-Zfd`A2->2!ozi$hxe(9ANJ?zJ^i7o`=tck^V$z;Z>?YNYndW?3oq&3_WkO^wg^2m z=l6!8>R53#-KR(Ab%;NrJ^EUhPh1;)Mvi^&5##48Hesdb*xmIy=m9w`H%Z)*G*8CPE>zRQ9WpLBQN{f_SI2)D zt`dgA^o&zKs+or`>sx!ys9C-l^0w`V)a(@jIcM!h;`Zz>FGv zB*zAkG<-@YUv`T-2lnZda}6rB>qVV*v`nQp)#;2^7O2d+7MZninwsxiBNvp7s_euE ze9|x>fuGjy37}>mM5fY_lmETdpuf~XP;K(-=s*-%&&xJFiNiU4~kX2Bl3~q z1ER8JNIp8yCaP+V$<*7-ulRIbVydb;yRY*i1vPNW)$SRR#BI`sJimcRXmWr$uS*+Ep7FjN`USz?@imhhJ$eNKwBdbQc zY+hJ5XBG~uoMY+8+L6U0t4EfPtlw%1fKBc$bvVj{)Q6)$NQJDXL`aRS zrbtMYILd_72`Lm(DWp_Lt&n0N)k4aJ)C(yXQZb}tNX@LKXh_vK%7)a9qi{&&I7)}q zj-z-;^^o!*^+O7XRM2Wlh}6((iilLvYRZVzk)x1EC6Q7hwM2@ER1+yDQct9yNJXut zq)1Jzrl?3&t){FVrON6L@X jUtDkg|1SRy^Iu`1`R|b8nxB@HmXYGh%uLHn%W(V&DI1f# literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Sitka b/absl/time/internal/cctz/testdata/zoneinfo/America/Sitka new file mode 100644 index 0000000000000000000000000000000000000000..662b8b67e581cab42ae250c672580bf224bd17e8 GIT binary patch literal 2350 zcmciCeN2^A0LSrr5x8)LdP+z{q$4UC-KKcdgl3g zDrs!4o^`^bk`G7f+xLC1L}#&_z3r4r3Cxsp)_f=C=3kTZmVPW!azdwh zUlM8KU+MIVZ6ag%xXwKDg321)r?Zc&RSUYG)AHpSmD8+bZhNlEE8i~fsEt$kz9w0a z`>QJS+$W2Yrir2p^JVeGFXGORyz;KIpNkTms_%aHn7Ahxr5EnqEADN*s7rUeqZUW=;6-S2T(#s8^@|6$tvd_9y)#m;Bfw${b zb;C|wv!_HYFKN~fb|$OZqzdg1xRn3*3?0ZnuL9rRFIOgq#L5rTW!>aCQ9l$TA09s` z8g^Wfj|>lqRZXMv(ZL?^Sk)!n*t1_fo;9MMXx^!sVzpjf-mF$%-mRN`6{`7khi>s? zsFni(z2-u!dTLL*e0nrpJkz;CuGKN3HBczqdasCe1vBLO)=|+OKOsA+4~ve_blq7r zqB_Ta(_IN#bq$}@8?NqF8wcOho4)8!o4a4rTaE@)_o{9B+5RHs4x8c*zupt!iM)YN zD74Mza)m;@TV3Iy(5pdrlzqq8w_|>7bH(wiJHdX>T2|$E)zq5%khwMHmib+E=I_!< z^HEx9zRYp+GRNxw_hEU>?_5rwxqPQy zGeTg9$QY49BBMlxiHs8&sMU-V8LHKc6&WltT4cD$c##1kBSwadj2Rg;GHPVl$heV# zBO^zKj*J}{yw!}}YKD)D9|-^w0VD)S43HooQ9#0g!~qEe5(y*}NGz--7)Ug%CLBmS zkboc&K|+GW1PKZf6(lT3T#&#ZkwHR(#0Cit5*@1v4-y|FKuCm;5Fs%_f`mi~2@?`0 zBv44CkWeA9vYKEa(XyIwA@Q=BfFTh>LWaZ)2^tbLBy33Bkia34Lqdnd&T4{(M9*r% zhs4in0*FKq2_X_gB#1~9kuV~0L;{IK5(y;|OC*>`G_59_NIb13ph!fmCZtGAk)R?` zMZ${26$va7StPVbY?0t1(Y2cJBJs7F03#8$nh+x~MuLn)83{8IXC%-_q+O=c;b9Ti zdm^KwZs6l`jlE75|9`AavXgAGXa85S>uj#89ZrJ2Gyfx8HM9?nNnve zyG#aDR*(`ArK`qfH+xddQPYm&Mz@U+Ei@N1B)9WD_Qsl~rkUQg%=&p))Ny?A|Ne5X zEu5X^`qL{$f5MwrtA6v`{{j8W%I*2xo?q3}QRXXotbD_sMHOow4!qzFdtO}8-}};% z4$mt4xc6nN(euj8GXt+?Z1Pl&{UuN}_(jiaXYUKF?y|(Q`q%ovn&50t^%v!V*S9Th zsHravyisj6)V@;YeRJu=hPnqI@V+%Ssp0L}`QEkJu?_1cW_W$W4mPY$NbqhrBgV6_ z$N0d;wgaAbS_cQ}cW?9f%d&6tZ;z~e_wAavO}9wn_g9I1y`tp4ogX=YMq7SSHCHtH^W>M0`j9}&F1Lw=XkCYrM1)c3u6In4>}s`>B{rzJ9=T6XMq4mA1I!P<4s51T90kMH_L zYfZg8R9+ztFE5ur-M?5IDJqqr8!XY5Qy`CCK2iKUB2ykq%6ES0kto}vGo1Eg6V&nM z1gAp{QNKFT&IwyfFd_ri3iPhpzsJENb| zZ&F`%hWlsd%%r0#?)<)@zy5EDk2osg54XtyUn_Cej?d-U?`;t0)UKE3zOYgZoVPu6 zUTMB{{`A_=pj(PR8$9ZX(2&Wqf(iZRg%U3qA51*)xIHv>aByg&ZC}t58NAS+XAj#o z$QoYewv+3+S|dv0?UcvAw^HX^6iU1E6DvI{E;Mr5YHL(Nd+4IHrPjrffslJZRnXn! z4~;(lXmHHtiqIwd<_0gVskg^&%n4q$yxhM0xzymeqEh>cB~z^NIR*9vE5*tfk!fdU z^tLjOEC^){PY!17nh~1Ry=QPz-6f&P2Y(7)xl-DmJw2@KMPuwKYrBgauUk%C(JHRG zG+s`dw?kY#phMwuu#6S4z()pCH$gZb+d+HDW z{dZCS$=`bFzb732^huX191g6C=whCu^|Lb1j_c%eH}gr)aJZ#8qVLI{da`p}Q!@1X zYW<$7-`DWH{=mE*aWq!&mtkZu@tJCJ@DbwiMjAT2?9f;0u`3epy&FGypM z&LFKpdV@3v>5fsi2kDPdHwftv(jufsNRyB*A#FnXgft526w)fBS4gvvZXxYL`h_&i zs5^$V4CxutG&Eh~fwu9|eFGYYbPj19(mSMiNcWKTA^k%dh;-1XTZr@!X(G}^q>V@) zkwzk&L|TdT5@{yVO{ASjKaqwa9YtDd)ICL-igXoeE7Dh_u}Ei;)*`({nu~N7X)n@W zq`^krVWh=I-D9N5NSBc|BYj31jdU7mHPUOO*+{pMb|d{p8jf@vX}MAN9BDezb)@Y` z-;u^6okv=a^d4zG(tV`;NdJ)yVAMMR*#btr2aru*)Vl!L2FN}@HUhE}kgb611!OZI zy8+n_$bLXJgi-GZWJ?(Jo<(mmAo~N^Ajl3u zwun*h5oD7X^)5lSiBazpWTPNE1=%XdUO_esvRjbtg6tP$!yr2b*)m4GXOK-})Vl`R zHb%W~kd1@v9AxVtdk5J($nHV5kLw>ypNLL>SSA0DpT8bIv3ek-k4aC_TWMH!dU9HF P%CPLz)a2CUl-S<@u$syt literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/St_Kitts b/absl/time/internal/cctz/testdata/zoneinfo/America/St_Kitts new file mode 100644 index 0000000000000000000000000000000000000000..447efbe2c967cc5642b58f51aff86b67073134fb GIT binary patch literal 170 zcmWHE%1kq2zyM4@5fBCe7@MO3$eCbxU^AOkY6*VZ&)VM<<vyPpTq@kQO9 zT&Amyy{t{<-nWu+B+Z?`+!i*awf<<@v-fhhcx^gzCEcl0(|xE(KR0ilrYGdNH#9Hp zro7%HX0YFoxB9>ix6dUk&sa$XsgY3Q=QHZuVPC|#vsw^3cVuPU-&voAl*!e6Ecq4P zf^JcFEtX}ynczF)KXm=@-|$!G=nUx%=?>`+ap0*QATA(2AWk4&AZ{RjAdWoM6T}t7 Z7sMIF8^j&NAH*TVBl90FGb(o}^95{L?5h9( literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Tegucigalpa b/absl/time/internal/cctz/testdata/zoneinfo/America/Tegucigalpa new file mode 100644 index 0000000000000000000000000000000000000000..7aea8f9989fbdedf0527a172b41871e70d439060 GIT binary patch literal 278 zcmWHE%1kq2zyQoZ5fBCe4j=}xc^ZJk5+83Dg;{qVD8|eVP^#MZK-s1?z$Lclfy=cM z7Z{ir!SMh8bv6tP|NrmYz{v9d|LO${96r7w49+e<92^2P0|Y`yu=fW<3(&;>|3UVH hxF9!xXplQVG{`L=8sr`j4RRBhCedA7Kqs1U0RT7DJ_!H- literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Thule b/absl/time/internal/cctz/testdata/zoneinfo/America/Thule new file mode 100644 index 0000000000000000000000000000000000000000..deefcc8df5a1111fb1ccacd1d67f44165d9a736c GIT binary patch literal 1528 zcmd7RO-PhM0Eh84LqakwQZJxJdrw&20%>H&4b}#$<{iU_1J&r$4u=#|` zk>>JxV~=?n?rHrQ^{qok2P)Lg`EtE$CROd8ZkNuv!y;z1Ou8ncMQnG9jJpvk+%+ZI z)AUKiXC>)`{MW)8wO#M=+!K34ESsQ3N2tM+B@O0Zh2PJ-*oD;Z0 zs(J0LY)R}BEsK+~ZA+bKn;w+yt2v@$v{iO4xI|ZXiM%`&F1jm|CX$a{EX$k2G zX$t8IX$$EKX$B6Z6W(YHiqmB*&4Dp zWOK;wknJJ+vo#w;c4%w1i0skUY!cZevQ1>4$VQQ!B3s4(Wv`)Tx(Q~&PG7vsU7zP?{nsD;+xp%3Rb81q1{ZSLwb6&?kq|FqGss#0? zOs&-_arUrWo_bjMyhGwMkEcP}#wV$nzxia=`Eiwb_7}Ns_>9Ur`ng>H;!!ob z-7|9@J*cwlel$5-2ld>*DRaZJr}T~KubAAtZ8|slk@$Ue+CTcT=b$iXzQqizURTi~NRb_>$nmA&D z1sip6WWT9SS*oj#wU}k&IePi?`((veOH^oQv#fkKTh*)&No`+(y0g4URy{bTR%fP3 zxb71bo}7?1f!EZUpQf9&S*P{dQy0y;=n-9ic*NX2x?ivFK5p(AYS9}S`pw3Hm0E?~ zkxf0#YI8xK+#3n0hLjFz3>K-z@p_5mrm4th<F=2x!yR+OM~ze`vPXbn5NVAEdpkPqmK@OGieB>KHmCotNs>!vlL| z$Jga*XIDfXc`r+KZK#%A&v+^>eo8|8)c?dQ7JDP?d9m2*FL(*D*on8i#8~X(lX1!J zPIdQ;6``x!5(?aHjObnSBGBu~28!|a$cF6RQ`5_ZTW{6A?nIkeuWR}P@k$EB$ zMP`aj6`8BkP8OLhGF@c8$b^v@BU47^j7%DtH8O2v-pIs}nLF*&k-0nVIc@Tg>^W`vko-Aq0+9?NDMWIJBoWCX zl13ztNFtF;BB?}j>9om2vgx$xMDpph2}LrBq!h_1l2jzCNLrD+djG?|`fPjyHoEzt S`Guv0#rdICO3@7+TWihn zMJMGdIyrm5S`o9z{xNdPtuBpnx`x`{p1S1UD&OaAm&;|zawQ={Mm_mzZ1FZV9-pMfr_Y3U9X zk>}IP)~!{`6S8#V%3`^3UZjo+&XlO>3=@56xx@@EGqE54E-QLw%uTOe6y3O5-+bsJ zSy>XUSJiy0;xd2Ix8#4QZjJa-$0v5G_}NL55Z0m+hCern6MNO_z8;fw-Y?0W$Bg^* z9$Djm+@u`aD5+IPby|I#q<7!URSrb{bBBS@rb&!_B(S|YnN;+>@%CnpOf4*#%#{rCwDJ8Y&>y=;+c6x z=Y^z7-q0bPe|d>)ed)9*__{{C&Bx6>y#-RZ`+zCxaLcw0rDl7hlH!;g2d;uJeq)QN84bw89TobKFJjcbMvs29dsfw! zB>Tq$)^Rkh&m+K`Mik2B{5F9Hcr(d64=b1wtx>l*rN62q_X$C8SJ9osdEy zl|o8|)CwsUQZ1xhNWGAPAr(VP=4fk%6wT3A4JjK^H>7Y#<&e@LwL^-BR1Ya1Qa_}C zj<$kG2_0<>ks>>WCB)sU%WLq?SlAk!m94MCyqY6saguQb$`;q^ORzsz_NK zZC#PVB9%o-i_{h=E>c~jyhweK0wWbhO6+KBj1<|?Rv9U?qpdSiXr$6esgYVE#YU=) d|NnA_*{o;VtS5QX-D&QWByVb}JJp>M_7|antVjR= literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Toronto b/absl/time/internal/cctz/testdata/zoneinfo/America/Toronto new file mode 100644 index 0000000000000000000000000000000000000000..7b4682a39e2fc97450c99eed4576d2a4614bf294 GIT binary patch literal 3503 zcmd_sX;76_9LMpiA{wHIikTw0q=>RgxKd&+gnGpVOmRCJdIvQ*xgZo`3u-tuOrt@i zgSl@RqGFJSpr$rWiQ=B((UcTH5AL~eJKyJRFB;!9)8jn%bH};7{eAy2aS7AA+y3#? zH~+)SbHluRZ}EZo$SGJZSO0KRe6uw0=$fzdBG#^O)$3xnM66#jQE%vyEH+N>r#HC| zSDOd7*PE+?)mHDH<sWb@>Y$MI~_yBuGCPu zJJMg|Pw^}*;Qbtrza{wZjzI&4psM?CtdqXCoTFP~_6qT@YzLOfAr^RMcY5f{~| z*sZ0f+pQ};6ZUE8S=-{`b6&Gc&xa;OoUh#^FEpPgE|h1;i(5Vt&aT-BA&_mBb0EBxFj0{9}o@O zmB<&Gt`}~$b<#~Q5slPh>3(jlYFzA)O$yVM$Ci(E)32s0&x~ohS<0KLc|xRaF|Mof zit^Jfd%LR_{Tk_39sI;g4XbtQx{XBZJ8rVgb+$rJ68Y`Xo2 z%SDISE4t&1T=h!WA>C=n=c=>UM(x{muJWxtDE-`Gm0$S=*|oB#>Q=N=`j^FsfSd#w zxT}WX!RqIS*FL#jKfp{p|Fu+tI3o;p(w-_t=vPq51oSuSE^c#s@5ze0@m_LMQP zM@7t&yK+p}Rx#$9haT&5SdBeYqsP^5R&ndg^!V~+YC?Lxo>(+XO^VOflXHeEVc#vM zES)K)24u;%9d;4lI9X1M3=-3-f_&pKA4-bwP- zvvbQ-Vr;FJnfdD7Fs0`tW~;eg2lTw?6g98*l1%EAC6dZZWOA!ykzBM+raX!h@8v9( z@1G49sc8zO;$Db)M&6J(uVC^?&NOPG|lKo6YGwQe4Ny=`7q~YiNCU zw?3N=v&Yy54K(j)^S))?5iw@GY_>YqN6f#EUZwe=HF}Tu3-dV5Gv`)v6*7Xz5F%rU z3?ed$$S@+~hzuk$lE_dZV`*sy6B$iQGn~kHA_IzyC^DqTm?DFUj4Cp$$haZ{i;OHX zw8+>ZgNux=r5Rpid@aoYBO{CqF*3%;AS0uU3^Ov$$Uq|_jSMw1*2rKZqm2wVGTxSE zz>yJ0h8!7lWYCdOM}{34cVyr#&B!A|Z)wIJ8GK~)k>N+i9|-^w0VD)S43HooQ9#0g z!~qEe5(!Ha3M3XtFpy{<;XvYn1O$l)5)vdPNKlZdAYnn`f&>PM3=$ek6B{HrNOX|! zpcNm!5Fj2CAs|FZjF2E9Q9{Cm#0d!$5-B89NUSVPu#jjW;X>kt1PqB75;7!aNYId| zAz?$}h6E0Y91=Ptc1Z9nP4tlPA@M^3h(r(xAreC*h)5KXFd}h80*OQt38kfpB@#?a z6HO$XNIa2%A`wMGio_HNDiT#BtVmpuz#@@FLW{%}39hAyE)rfOzDR(P2qPgzVvGbC zi82yqB+f{nkw_zH`aJQ8^%^p+;} zNboI9^pWsen)o9J0CEH%hX8U6AO`_*6d;EIavUHB0&*lEhXQgeAP0k`IU10|!O|QL z$N^z#jtJzCK#mFIpg@iaf*c~q xF@hW<$WekECdhGu94NNuyCVLl7mAxXT*Ax&<8KcQ>>e2GZx0Cx3<(T&`x_HwlD7Z= literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Tortola b/absl/time/internal/cctz/testdata/zoneinfo/America/Tortola new file mode 100644 index 0000000000000000000000000000000000000000..447efbe2c967cc5642b58f51aff86b67073134fb GIT binary patch literal 170 zcmWHE%1kq2zyM4@5fBCe7@MO3$eCmnJ5w3NlgS50YOnT({xr$L}ev0!n+jJFzEWqhQ&ivqqmnnp1o21F!!oHpl@V+xnDOm?@_1x$K-UKQD=NL^3(2*jIVZ^{JiBg(_Fb$ekodM&X(rNuNia9 zZ+Yo*E-uBKchA!ode2rZvEy`0`zX~K5~EuiBGtw7etl`*4b^tES^r+qq%K!?%9T|I z)zxyJv~N0Wt`*nG^@Z=7KeDRi&xy~Q8zal4V`!DS*{eWq^(a%fI-b+FTMAU?$$b6S zm(!I0fLjMXh*z$iaXRS5a233+r|z<9sOh>mR=Uj&Gucas{MqemyVm@y$~IxVJ~O1luP$KJl6#vSd{>8HO^PELRydJM{Fn znd;%UYh=cWWhQgOHktX!43o8Bt<2hG%I{Qmb>T#2EZk(Ps z;HsMUMU2k%H>&x&{Q6Pfezl;iSwB|0L**?!q8C=KSBo-zviOBM0`Hihu7N=LW>*jAJ=}S!8JQl}tSR#9-e=%!{_#gP8~Y<3wr|g_0TCFFVv4?3kXyYDIrorq=-lr zkuoB6L<)&i5-FvlttC=Sq?$-Mk$NHpMJkGv6sajvRHUj%S&_OTg+(fhloqM2qb)8{ zU8KB7eUSnq6-G*o)EFr;Qe~vfNS%>FBb9cvrABJ)Xp4^%tOK$T$Vxccr9jrg z(JltE8jf~3ko7effh^!#8gvc5qi-@cuvW&<&y8gfO7-m;9&93M0 U%uxx+35mlqladmW5)#Ay2A}k~%K!iX literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Virgin b/absl/time/internal/cctz/testdata/zoneinfo/America/Virgin new file mode 100644 index 0000000000000000000000000000000000000000..447efbe2c967cc5642b58f51aff86b67073134fb GIT binary patch literal 170 zcmWHE%1kq2zyM4@5fBCe7@MO3$eCsoqcrX+}v(I+~(=*mrc&u&MkLdo|(Ve54N-|w@xjc zCyXK^_AXI_?EERQraTYrnlY&rRA#>cW+Q;}`Rcxi)>^ME`K|${Py@hVy>y9Nt=? ze=AAI_`-g5H?Ubf(6&?0h_6%GwNX8D=@K=opi1Y=Yn0j3a&&HbrR3hJFb{q=OZ>w# zP2l6-WzN}g^U#Uwq7#es+yfuUyjYgbYyU>gue_xnUj3n3ko|?uFHEWYi7``FVpBspSJX=8=o1)uVlXn8)6GOFiE4t$CvNl&q*9GEX+W zDK#a=tgP7~D}Nc$;o^fTJaSIgW^GrsgGcr1u{G+cV}qvdt9FU(J#5yTuao+XyG+B8 zpgg@iZq_E0H2SMebln|^-V2ym<(CrsewkiB=eAn^iC@PjM%0Fr6Z+ZFb82Jn4gK8E zQMIY*vfiB9qqamw&DPfs%eLZ6=K0oL(v;P2n!|Bv9_ux&`PI^TwZ*h$1f=bQRi^z1 zPhL3EthZnDs~w53e(}tN>WCHS&b}M!rKgV($nnczDenm)2C$o2OrNn(B$)Z zUSBe8l0A3&rn>WV_f($uzNF3I?3?Y*fx1Z47q78*qrIQ8cLU$;iw66m!OE59o_`tr z_Z=kdpSvB5|NVcSz4pC!@EEcSWE;pnkc}WaLAK(wdqFmX>;~BmKhJ)U4Iw*1wuI~n z*%Y!XWLr+VFJxoL&XBDkdqXyd><-x;vOi>l$PSS$B6~zO>9o5=@ZHvS(z|$gYuXJMF%ajUzipwvOx_**vm)Wc$eekp>_gKw5zG z0BM5Lb^&RF)Aj*rgwu8cX$8^?q!~yzkai&bKpKK{1ZfG<6Qn6l+ZCiOPTLoxF;3eV zq%}xykmexWLE3}#2Wb$}A*4k}kB}xIT|(OAw0%Mv<+PnbTIIC8LYjqi3uzb9FQj2e z$B>pGJwuv?bPZ{n)AkK%oYQs=X`R#d4rw0JJ*0g||BwbE9Yk8_`@hF9(^fKMD_Im- S94rr(7DdX+f@Q(d%s&C-P%%gV literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Winnipeg b/absl/time/internal/cctz/testdata/zoneinfo/America/Winnipeg new file mode 100644 index 0000000000000000000000000000000000000000..2ffe3d8d8e012445aa961fc53b38934681dd2a2c GIT binary patch literal 2891 zcmeH|YfP1O9LImh8;GK2VuS>y6+;mL#qdH|>KG(~dPEd5H4L$g#~X?l{56@ES8A4* zQKXJqt`$0$;$>uN&aIq7lq8K1m7GdGsavST>HqoH3%A^S)62eR|L61Y49+=k_dv4M>sp);n{V{&OoR@O9HfWpF)^Bt#n76xdGTXgaw?%*6wZW;YEYx4t z&3Eccv-DD)*J&t9)XT|3oGa79^=f3W)0i|ue(gTky%rHB*KYT8ubXdky{g&0(byn2 zYmU23CyvW+8xOm8^2_vY>`eDw*A%_)Um*9JbLGLcOldivEPtLHCao3y#rJur$kssd ztZ9`ti*HHWc_G?vMkj5b-l82wHmP4so%;7atsT1^(E!<_0q#!iRKH0(*M1{`M;2+9 z13RSauJ@(ewpH@Px`oocaF#rommxi-BuP+mg7h33DNjX)NN}Gq`m}$GgtUp!klVr9 ztD&QYR^8WUzP+JgdoF7Dj#JvZpsPIlUb*&}^t<$(^MgDWUoFq4d?hageJv6FHb_Kk zl|}~4m&m%k+V8qo`d5CaQPqwPC|#`4dnf3?qA41)X|TrT7D(KJo;oNgQwC3H*7%5F zG9>ONebFye5__c=wo?leVx8svQkFoAJJEeOZ3&W zojNLKg^t>vUq5n2riljOiOH+kna*q}^&vurUZqjAvQ=H{Ri*!Xrlv6Zqvaa0P#cAWQueR;} zx%vCYM_t=@_-|j2{lG_kiHD#0d}TL9e7*y_J?(tHFSd)nz3*(V-5!2EHq|SmMw>Iy zoXO^-d(FSNh{xlx5b-`<4~NaKT0J!LH)cMwoGZIOfat=~C38E;7 zrXZ@aG`fN)%hG5IqArNOAPR$M45BiK&LB#IXwA~74Wc)Q;vkxXR(0Hlm5 z4E;eA2+<%!g%BM=lnBuxM2(h4j}S#dG|5mUM3)R@GPKE1CqthMg)%hCP$@&F45c!( z3Q;RVua-u!5Y0kV3(+k^xe)C_)XUH>M8OOVGgQpbF+<4=En6BjL-cHE6b;cdL)8#n zLzE5CHbmVJeM1z^&^Scp44p%i&d@qU?F_wJ8pSg-&rm%>_YCDjw9imKME{HgKr#SH z0VD^OCJB%%K+<4o^1w)hrO5;%6_zF!jATHv0Z9iWACQDVG6G2nBqxxhK(Yc!i>1j6 zBr%pIGmO+&n%ppw1IZ2}J&^n`5(LQ*BSnxLL6QW?5+qHKJV6p=X)*;#m8HoQBw3aw zTaa`?^2JCPBx8(}L2|}O8YF9sv_bO5NSvj~93*v?CU=nJS(@xY(g(>OB!Q3&LQ)9H kAtZ_Ne-n*Bjr&Y4hnQ?er4EXYi;js(jg5_tjgATU3t;rI(f|Me literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/America/Yakutat b/absl/time/internal/cctz/testdata/zoneinfo/America/Yakutat new file mode 100644 index 0000000000000000000000000000000000000000..523b0a1081ade2feb2e163279c0b9960f8550099 GIT binary patch literal 2314 zcmciCZA{fw0LStFMc@KKQ9?XOx04Sbj~-B-iZT?UD-sabn-Ezjc88TS5qS9gJFI1@lkQhoA1lm z{lntcJwx)gt$ku{ORtQp-yq_>>*ejmOmJo+IJ<&VxTH(OE3->N~CG`{&68n|=@r^RLQ9t3DB_@!!g{jJHJE?2Jy2 zdRe4Tf1@)lwu#KK6FTeciz<8Qpw2nESuN>#Udz{NRBk}Yy!Je`v|^`RRu`x8)0$;L z-XE&a{eUb=nJbDeESAMHzl*y+j*|CGeIZJ8s=oKV?{il=_?kpNt zozs8nu0*Z6#-{YvD|^+pp;5j4%MP`pXIOV1^Q)e9efqh&ixi#jN`JB>9`!e5}WB$)IeE&VB z2=hCa^QyUg_FUmFbAsk9KY8^t?Cvi-fs70pn$?UA?cn&p=s0G0!1#~>A|phGh>Q^# zBr-~?874ALs~IRVQe>#eSdqaZqeX^`j29U&GGb)N$e58qBcn!!jf@)^I5Kjp8M@Vs z9T_|_dSv*>_>ll05kNwK!~h8b5(Oj-NF0zrSWP65P*_bYkYFIuK*E8<0|^Kc5hNr? zOpu@;Q9;6j#03cq5*Z{kRudZ}I7oDm@F4L)0)#{e2@w(_BuGe*c zkwrplHL*p4Yc-OUp5-NG^c z;=OXL&1AW1{?STO*J^Gw*YKaRxpQm%Sh#*~mJO>-Hj8hc=jY%4>aVum?(X5-ZvOLm zzLIU}9hK%Eccc3kKHPry;qME?eT|hCnvVzbHM{JOp6s?lbFI9sXKKZv$(z!h_U0{d zQ_%3BonKR8ZYfz|3zyc*g4rRvFgGj?~b$_GelA?q$98*m+r!S!8c} z;e;&R6xd}uKQXsgePi!f|BhK+@R1FdstHeD(vr|_Q!;T@OD`wQonx1< z`>Qi%&1gvPIdjyk9r{J@J#x^j>;6>l>pvp*H;w88od=|@{3Wfg+bZ?HkK1^p*TgR# zw+(YTOv9-`yZ*{L)A;I}`tWD%lIR`KN8Vd2P3>vjFuX(_UDK$|nOxae9MR;a?QxI=+(bhdKV|d?)|K+n(~j;=c_7-Z=8kk+<%3?;Uyb$h+rfynW>T zb2NZ-z|jKI1JVT2h1a!#^no;jbb_>k^nx^lbc3{m^uy5*(h)~XNKanZ6w;N~wT1M> z(HPPh(i+km(j3wq(jL+u(jd|y(jw9$(j?NQ*R_fC$x^oul% zbd0o&^z3y_BVBu4+eqJD*ErHSN9#!MNb^YdNc%|t$Oa%gfNTM>2VS=c$S!!@HX!@p zbsK@~1jkk&d%>|8$Zl|K2eKa=8-nZzvL(o#Ae(~hiq~xmvM*k@G04t%-PRy`gKQ46 zI~?1C><`BVAv?seMaUj;Y!b3dUbjuiK6%|nAv@)DTZQZuvRTM(A=`!Q7qVgaf7!8+ ZTe#J3+{zLwqm|KES)!sMS`m$f{sy2q-OvC4 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Casey b/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Casey new file mode 100644 index 0000000000000000000000000000000000000000..d0bbacc8a9647d6d31b36a561c6b5922c71d505c GIT binary patch literal 311 zcmWHE%1kq2zyK^j5fBCeP9O%cc^ZJkKe;mvUbom3y!%gm@LM@Y!Qc7pga|I{hNva{ z0`>p@|7T!iVq{`wVq^rW1%rYHkmgw%7&sUhKx|zD0|spa3kGdNLy$a39b*Uyj`#sK wm4N|h*ME>>KwOZ6Ks3lvAR6Q_5Dju1hz2HJp4%`r)c^ngpMjBqkr5~k20aTH ySab~x7_1*WD$r4Sq74>2eR>6$Ylex+D_NdfC~T|oGK## literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Macquarie b/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Macquarie new file mode 100644 index 0000000000000000000000000000000000000000..aea2be77cccb5187ecacca5673cc5b42543dd3c9 GIT binary patch literal 1543 zcmdUuNk~<37)QUWK1FjV6EmmO2It{fnWjF|oLv+olA;z=ri-9Og+%EGS#Oh@5|Ruw zLtKR>HY@})gH}e1$`%b+i->4ggar<-|GDL=MXMJ59`~Nh<^L9scTR0XTT8b5F+cN$ zi#3{y=TJ4bzGv-vZ6faLfP4JlY+$P_Jm{9iu?|^!R4>b?M%6Q%FH(0&Eq9D~6^)4Z z@jUejiWbM-D0R%|s$b@k`aO?S|ByH8e|u2_zD((={`C_0;=v{ z${N?Cgtm9d+Suz7w!cNfmd{CeZl$dA-Xjt5hc)7zQzET$jT}CtQFBQe?Jm=psQ`^V zny4GDj7eO5hsNt;O(^M;jcp%gQ^Hx$c6obYPNSrXkbpC-94-)i3Q z2i-aGQ1d5Kv|wmX3i|`qb$(ikIzH>JBSTW${6tI2+_Kv>rllD-v@Etq%N;dR;de_a zz7I;}`^!=_+a=YHPD;()7U}eOJeHT`ZTUFmG=^y zo|PrVW&3K)t+ZBBolXu~mbG%e_U{HYnX|S*KYoA7{5a1UN4P+Yf>;GH3t|_!fhi0u&LA=X38XV?!Z08#;?1V#;vA{bRL%CKqb zU=#wWgi#8l7Dh3UY8d4}>R}WFsR&XMqb5jEjH)1I*)(-Q3S(3TDGgE^q&P@*jPfA$ zF$#oK$S4s~Bcn)2m5?$abutRIX)0xu%BYo5ETdZ1X_S=zBi(=kld~(`=?wS@y2w-r literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Mawson b/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Mawson new file mode 100644 index 0000000000000000000000000000000000000000..5197dd97b9f871f533ff418b1870e593530cd501 GIT binary patch literal 225 zcmWHE%1kq2zyQoZ5fBCe79a+(c^ZJkBL$-duUkqE_5c6>XJBMv0t$gaNCHTmTL1%x ru7LrAwt*QCo5JKsu;T|*577AkAiF?ZkbNMU6g#S%pdpkbbb(AGa|~%Z3evp;&y&hz^1>^y&*KR)l{ z$}cI3HU4(pV12@yYnS!rJbt5fYi)0HA6U92udV95d2r!*Y0v93-wExLL-8$U$EX(R z45~9bf9%!6!=>htkDBz|!5s6wb8bEQ_7(TB6CY~Vwn2Ay<32sU?uff*^EN$^z03W6 zVY&7?YuqO@>!r_M-2D+{(towuJoVKp$zDN!sMo$d>V0XC_%!^kzJtfrujY*UcQ$H3 zLAT!ca;=U{+O6ZNigkR*GddwJLnn+BX<&S~242`KK~vKusBg6dJHjNmX_4IYov%#V zGD~jmz9=EZJ~H|B0hy9EBvUuG$t}@d8d~y+P7C-!Z*@9ky2k>Y;df4EoSmjKhk9jJ zkEe!x+$7<9LnY#^trA%`Mx6C)C2GwDi7w5On8hDRY;K9p4%;hp;+E)K?|O*~jMTWF zTXf!)0FD2=P7}VkthXI3)!V!LC2>cN-qG-rB(0CpJ8Mo!^2%(PU(hZK5~F2d(o2#u zX`G~nR7vW!UnFfLUlv`h)$}uol5x6N7at3eB^?=>*V3}_OTly7 z_5QL95wk)c$O)HK>A6}MK$EbgLd5#|QpS}#EanPEBvA^Fj+A!Ye zG`tL>xtsH$0f#?l!#Z=%%yJpo`OCQ3rxX{@84ibyb#wju1YfnjW>0YVuZON%*Zhvm zW@M7cERks<^F$_!%oLd_GFN1>w$^Ns=_2z*CXCD&nKCkGWYWm2k!d6IMkbET9GN;Y zcVzO&>}{>-BlG9yk^oyP14s&x93V+RvVf!k$pexIBojy~kX#_iu(h&*q{G(A2a*t5 zD<%kQ^aNLb8OU3CRk=!H6N3xHk-}s-j-cw9Ir!34%**8E+t%cGmkP(1=CON%OBbU~I+M2Lz{ zN94A_pr{Nr$f^NLZSTvMJ03@i>Y8@Fv$IFl6p!g$$IhwRv`JalcvuBuU&;F1aZ%s< zQ8$#FP_4FYTM@3g(;ew{&5Qcy)9p5YkvVL8NLy~(9(n2V*!J5uuKC_@4E#kO;n{DQU$<>KaWt(Uy*Qd?kZzE6kbaPckdDx4i5t@s zkEbc5E2J%?FGtfD(izek(i_qo(jC$s(jU?w(jn3!(j(F&(xszm6X_Fa6zLRc73mde z7U>pg7wH#i80i>k8R;2m8tEEo8|fQq9O>NAw2t(SG>>$Tw2$oFxDN literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Rothera b/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Rothera new file mode 100644 index 0000000000000000000000000000000000000000..56913f8a10cb61305ddc4025c51f72e56b195781 GIT binary patch literal 186 zcmWHE%1kq2zyM4@5fBCeW*`Q!IU0ZjFOx1q{r~^}85kLXJRtc0|LO$>7F`1a23-SV but*3AM*aZnfDj;~L4bhqTsA<9?2Nepj*AyY literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/South_Pole b/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/South_Pole new file mode 100644 index 0000000000000000000000000000000000000000..a5f5b6d5e60f15ebdbb747228006e8fe06dd4a01 GIT binary patch literal 2460 zcmd_rdrXye9LMqJpwhVKWemws!@O`gTvUW2LIninl6fQ~qi>S%pdpkbbb(AGa|~%Z3evp;&y&hz^1>^y&*KR)l{ z$}cI3HU4(pV12@yYnS!rJbt5fYi)0HA6U92udV95d2r!*Y0v93-wExLL-8$U$EX(R z45~9bf9%!6!=>htkDBz|!5s6wb8bEQ_7(TB6CY~Vwn2Ay<32sU?uff*^EN$^z03W6 zVY&7?YuqO@>!r_M-2D+{(towuJoVKp$zDN!sMo$d>V0XC_%!^kzJtfrujY*UcQ$H3 zLAT!ca;=U{+O6ZNigkR*GddwJLnn+BX<&S~242`KK~vKusBg6dJHjNmX_4IYov%#V zGD~jmz9=EZJ~H|B0hy9EBvUuG$t}@d8d~y+P7C-!Z*@9ky2k>Y;df4EoSmjKhk9jJ zkEe!x+$7<9LnY#^trA%`Mx6C)C2GwDi7w5On8hDRY;K9p4%;hp;+E)K?|O*~jMTWF zTXf!)0FD2=P7}VkthXI3)!V!LC2>cN-qG-rB(0CpJ8Mo!^2%(PU(hZK5~F2d(o2#u zX`G~nR7vW!UnFfLUlv`h)$}uol5x6N7at3eB^?=>*V3}_OTly7 z_5QL95wk)c$O)HK>A6}MK$EbgLd5#|QpS}#EanPEBvA^Fj+A!Ye zG`tL>xtsH$0f#?l!#Z=%%yJpo`OCQ3rxX{@84ibyb#wju1YfnjW>0YVuZON%*Zhvm zW@M7cERks<^F$_!%oLd_GFN1>w$^Ns=_2z*CXCD&nKCkGWYWm2k!d6IMkbET9GN;Y zcVzO&>}{>-BlG9yk^oyP14s&x93V+RvVf!k$pexIBojy~kX#_iu(h&*q{G(A2a*t5 zD<%kQ^aNLb8OU3CRk=!H6N3xHk-}s-j-XJBLm^1wjLfPqEVz<@#9z!=OA cA;HKWP&0rg{s$Qi0tAfbvH@CTr)$gw0Lh>jKL7v# literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Troll b/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Troll new file mode 100644 index 0000000000000000000000000000000000000000..3757faccb282a975e3130e5ed9a84bc0e5881a79 GIT binary patch literal 1176 zcmc)IPe_w-9LMoznlMJi*FZe<#~^~Dsm~_TMGe$#Sk5w+nP&D!r`B4jC9bjsK}3jr z4?%bcib5h{bm-5aLlhAPGP+1~h(MttLV^nGAnW)3)vZ%>=o!D~^=yY7p3ghh-X9M- ze_TtZS`-|)&*DFio(+N zYK89kwn5q-eASK_pX|L>D4q8{$-eX#>AIYi{arJ1VDzIN-11Nkbxvz{$%OP&XEg4; zuf3~Pdp}&!zQsZ9pGxWBH!(eOt3wmd2ju9*YE4eI$g#c>J$|852AZp6FkUP}fi-d> z^g~V-Ix<{dq{E+QWn}q+j=X#(srlD>>h7eR&OXvJ6Hj$Cb5+l#Zfbfwt?67Y=j40x z{`He*-mAS0bNQTk5*bCO2q~>o^{dJ+Z$S?ECNk1%|Vl@sI(L5s@L0F_A&7 zW>jQYs~Hy=7#SHE8W|fI92p%M9vL4A0Eqwz0f_+#!fK*G!mye+kU)?~kWi3VkYJE# zkZ_QAkbsbgkdTm=kf4yLkg%*KE+jA{G9)x4HY7MCIwU+KJ|sXSLL@{aMkGiiN+e9H zi4zIbY9d8KMPfyQMWRK*MdC#Qw*HTZeN`su8rR%|HKjp+w4$uC%qNgNz1o2^i011GLCa*Nh7QJb@Xr literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Arctic/Longyearbyen b/absl/time/internal/cctz/testdata/zoneinfo/Arctic/Longyearbyen new file mode 100644 index 0000000000000000000000000000000000000000..239c0174d361ff520c0c39431f2158837b82c6e0 GIT binary patch literal 2251 zcmdtie@xVM9LMqRfk?4(Z-2m9fRIS1cJdqi5tq^l%)GOd(?~^75wR}H%NV3anRBi& zeCt@|$f@O+HN*a(`~$6(+GyeBFXpUVTdb@!xaOz)E$t_w2gJS9I# zM29j*%24E-jtTFMjP=izak;-}eA-n_82h<8qfe`I;9VWxcSP?vzhCb>u~QR|9haoT z9g_UYKAF(0lCtS}NezbNuH~y`qAwt6g~c+-T_EX6F1h=*@#2c{s%tP$Cx4Z$Q+gA0 z>Zw@0r}L(|4}PoDT0hl{tsiUVhGUvl{ibGDT#}qnr{sFNByZ76lApX+3UV5xV7N(U zB(~~|%PVE(uk||XxL5A|tXvD*E7j9AOYhrOq_f+SbWTm07Hyp=_m{+|w>nYgreD!w z@354_e59pmUr1^H*D^2qeVG^TmIwM?lldKQh_B~8^|v(3g2M;&!MZwmsQCq5`0$Im zD7Z$;rUy0PE7ir$1-isNMVAa^X?c8!lwTa9j|@(hrSII(Wxa8-eE(>v=)5K?ng*n@ zH7r$?y|Qxice-l!QCVHlqtz*UWR0goYi@a4*Cwm3{bsk;4u^DIccVUfIiQanTBgAd z*URJEJzCdZCQsC+=#$&>W&OfJ3Dr2|sq6`|q4;NcdbB0=nekd5`BEB24Qa!flhW9K zNuPPET{echbkm*>baTgEeYWwSHnlWqlq1R!J>nnEsF;!e{b^Zo(qE=^^t&CWy=snIbYrWRl1%k!d3Hv^5ju=P*-bs>ocC z$s)5wrfX~Fi%b}qF*0Rj&d8*ZStHX%=8a4onK?3bWbVl1k=Y~DN9J#95`bg?Ndb}r zBne0skTf89KoWsu0!amu3nUpxHjs26`LHz!K{8@%Qi9|JNeYq`BrQl@ki;OFK~jU{ z21yQ*9V9(Sevkwq8L~AgLULqll7wUlNfVMMBvDAFkW?YLLXw4K3rQD}FC<||#%xW> zkeu0?q#;>D(uU*>NgR?nBy~vckmMoRL(+%j4@n@BK_rDp4sA^mkt`x_MKX(|7RfD=TqL{J|FFApCdJdT UiL%?Dn~|T9<@RT1VPi_@% literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Aden b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Aden new file mode 100644 index 0000000000000000000000000000000000000000..e71bc4e802cbdfd9f90598029e0fda04c4074ab3 GIT binary patch literal 187 zcmWHE%1kq2zyM4@5fBCeW*`Q!IU0b(RcW&=_5c6>XJBMxV9-7T6k*UZU|{j_4PnqW jFa~iMLP#+32UrIK1JK0(AfrKC0>*RM04=i9HRb{Uf07!( literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Almaty b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Almaty new file mode 100644 index 0000000000000000000000000000000000000000..49a4b4de7b31924d138a6e22aa0a16af1868cf1a GIT binary patch literal 1031 zcmd6lPe_wt9Dv{H{KGOBfzEAOX4YKGoYSr4zkXdJ!D`3|iGqkygn|$mL4|^O>ky$A z@h~ttM3+P_;o%o_^iUvOROn!b4kd&K#dN*Tm%`9fx89HUecrv__QAL3N#7Xgi7dKYozN?2MdwH7yO}<8t=dm^2P$Bzm`Bnr^++*x&E}dgra$)j|$h{T0IQmP6bGe*x6&C!x+(mg; zaY^2X{2T1u#$2wm|Ao1fGIoFGp{vxG^lekNx9**|?8*M`bYDrENHlKeIXe?P#<-l} zY@H?j4^lREe`en$ha89?j*$cr1(D^@3WG?4h=a(32!u$4h=j<52!%+6h=s_72!=?8 zh=$092zO|uL&QVmJG22nB7lSdi2)J>Bnn6vkT@WLKq7&J0*M6@3?v$dHXKMi4sAe? lh#(FTfqVAU6BD7Rndg=qMqLZc7s|U6_e6G5$b__&3f1{o|OYAn6drRBeD|Wm6 z;nF^I(C&8VrgY!c+U`;NMS8B&KxF8lM9ppp^vb;;y(d1fql-^Vp8@CXzR4BRFJg}! z6R}uh9#07Le|lD88%yi~r{<`)e!M+!M~3>UkK1wUizPmPpC%Nii$AqN291l6#HhWJ z6z!J5u8oqsY>Onn+@nJtuh5~_&&jZcLLGi|x1`k7%7`sBGP0&pMs3fL(M5TZTK-7dMgazW?q z+br`h*6D)H2eiCygI1Jp(uFmpx@c0lhKe$Eu`i&NStYWhtzWCW9=0jFD4zH0O+*G;-F+X(Q*2oH%mk$f+aej+{Jl_Q>fY=Z_?SWPqfA9LUKZqLb5{Aax{4%i6NOGsUf)`$sySx=^^Q-I6?G6~2mAk%=%gQJ-UWF{QVR3LMKOa?L=$aEm{ zflLT8BL<5pLFNRR6l7MAX+h@2(M$|7Gmd6zkhwu72bmpYdXV`+CJ6tt8FHId8t7-A YyxD_%NxsB5f1)=#A>MpUic4^R11fmc_5c6? literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Anadyr b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Anadyr new file mode 100644 index 0000000000000000000000000000000000000000..0e623cf746b29bf73989ffec96f26c49e737ccc7 GIT binary patch literal 1222 zcmdVZPe_wt9KiACbz6-U6qV^*EB~a+)@++5mO7Vz65BL_oeJScSXcBr5*@Gzo-M28@-f(MeIOYBgP6|Cp`u3*urWAAvL&%1Z;2HWqu)Sg2J zqw252W3I3`I?dvI)u`E~y#9%Yx5s8m1HSO;@?E#e+yj}ih0EdckC)=!xooClwlwaW zu9h|TR*HYZDQho$k#)l#r1HpXsoMKosuPc;rgciz2d_)5Z%pczoRWYutplI0=?(K& zbM+_Vx%yYbdSmve4n7#vo9+zg(3K9|a5k(rpQzH|p%pqZ7?bF6uQaw-O4IJ|vc+E_ z&5?J~{9|5PDi(Ch+h?-%+Z(-YIxVepPj%bftZsjDQ^(Ft>W=Z#I)321-hSqWboLz9 zUHeC+yEdtNy7tKqSA*`Y>6YG43F&jxN#Bc*?0oN*#QkNGoQ>xCFXoSpd{NJl-)9W;rj1$%iJ@bQOgV0 zll>_bj6}_9GON+72p^@C#ZfqAPyNGWzy5lg`Eq$Cj7*u!Od6RsGI3iob!76$^pOIP z3Xl?z8jvE8Dv&aeI*>w;N{~{JT99IpYHUq8NIghFwx%MaB%~&!D5NT+ETk@^Fr+f1 zG^949IHWqHJX=#AQlPD=5GfI<5h)U>5-Ag@6Dbs_6e$&{6)6^}7AY607b)1*RE(5t eYidS{Myf{2M(V~9GyDIea8H~0AH+hDsOKjf4;u^s literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Aqtau b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Aqtau new file mode 100644 index 0000000000000000000000000000000000000000..5803a3d3e3fac98ec8bebf8a7cce414a79e137a4 GIT binary patch literal 1017 zcmd6lPe{{I9Kheq>6jv(+-zyn{w!VUTHBa4ZC#?ngh%`!h=O-0LGvU=9RhIZ zH!Ma*7U$M`vb}Dfaf@@6Vq0`Q6$vfGBRk)pN55{(w{Irm2iI=T$Ck_X(3@MfV|LVb zKDulV-@Rz#6N9$vYOn1s#q5znvpt%u*kiG8_IT50n+P`P#E(6F;>)h-xie>aK77)> zs~bA`?!7+wazXdaywLsSr+Q%OiAi0*Z%$o%>(Y}C-RYsnE_3Oo%XUn^uS k?Lhj0Gz94g(h{U6NK=rmAZ@{Eaq&O)6)s49!+qKCPt^!McW#y&)?TJ*0!+;sitXMfSd(X?gFM+&sN|&zAq}+}X zw;d)UZIk=GcWimt`QXZ%rCMR1f3Lc~W5sKaE_>~NelB)={ZZ{)_q_wFH>-(v6+QTB zR=b|g=%M=)dU)=Fde?^a$Yie`9ZTr3T$>(G*7QW;yPk}HQ9lwF|JPsX-qUzWZ{&*XIFq4eLV$iVch3{EX->iTUxGqRvV<5QaMn$}EeR5P`r zW)qW={nV|)n|V3=KBni^J;}ZBW#nyG@^|;h=#vd8T>d8KD^BO@^|}j%TUuMfc13nI zUAv=AADR!ikJvkTZ12Kl3$E3DMA{8PQA{QbU zA{inYA{!zcA{`<=pvi{>0Er-=g#d{G5(Fd)NEnbfAb~(4frJ8y1riJ-8b~;hcmi5L qkca|WNRXHyK|!K|gawHU5*Q>hNNAAQ;Ji8cuY-%_EXaIcI<^Iu9Nj|z literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ashgabat b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ashgabat new file mode 100644 index 0000000000000000000000000000000000000000..046c472827eb47d46e31cd69611cff04e45400c0 GIT binary patch literal 651 zcmc)Hy-NaN9KiA4rIx8fOQ~Hi_Ii~B5-9}|4iOCo4hKOrI0->(*bvyzR{aMJfm<}V zv21oins5}^hrHP zC@gG4L*bzi`Bf$g6@`mJMq#7SQTQl?6h;aqg_A-`VWrSgcqzmbX1_{J;iiz&n!dw7 Nut)OxIacPgkuUo>fWrU) literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ashkhabad b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ashkhabad new file mode 100644 index 0000000000000000000000000000000000000000..046c472827eb47d46e31cd69611cff04e45400c0 GIT binary patch literal 651 zcmc)Hy-NaN9KiA4rIx8fOQ~Hi_Ii~B5-9}|4iOCo4hKOrI0->(*bvyzR{aMJfm<}V zv21oins5}^hrHP zC@gG4L*bzi`Bf$g6@`mJMq#7SQTQl?6h;aqg_A-`VWrSgcqzmbX1_{J;iiz&n!dw7 Nut)OxIacPgkuUo>fWrU) literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Atyrau b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Atyrau new file mode 100644 index 0000000000000000000000000000000000000000..27072eb51cd838727233db12dee866fae3b81967 GIT binary patch literal 1025 zcmd6lKWI}y9DpxvV?$D;gP7DW&2_^Vvok&d(qHZBD(W!CAPU;Y1>F9j=h_y#9x)=`15ILe>5d0 zmd51dy-`Wr?vqp3Q*yc(motSHIh)>-bMY-XANeB5V8kZB|Fjpr?z)cIC$8h;XPbKa z!KT;W*o&)cw)4Sb+f`n+m+qFWH#u#)CsrhLXHI$s7Nqyugk;+%C6^hJ+}?=fjqx7y1~V$8+y3yhHvb+E9Jx0`C6@J0u7B#4LXB|4$S7z zfge0*4*i+IpfO%WKZ8kmrpcHQYeL49oM~YX=)QkbKL_+_e%Q3u?~7MUChhg;%IeDL z;?wE~FzQG4(my!)@%uIXJ2l)u{BVsUh$o-w3gQdm4B`#q4&o2u5aJQy65BXlu1L?-6 nwgc%0(h#I0NK25OAWcEKg0uzc3(l*H|FyAjK`R{W%!Ypfi5lAf literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Baghdad b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Baghdad new file mode 100644 index 0000000000000000000000000000000000000000..3aacd78b1d503a3adf7fd3a9085d1c1eed94fa16 GIT binary patch literal 1004 zcmc(dKS-2u9EZPWUWkT9i=BTmv$9jKUOn^P@>So|bUEQ2j)oF+s7NXra*&Yxf)EZu zP(wi>f>A>_=pqP0G+0D~Eh6ghTMk{C0;w>r-}AZz4$;)-<#*4^@g5xS^JK0L-E5M5 zJ7~Y*u#`RAA6EM@<#?vlxfPWDEO~cydnt%*bophUpRSZIee^44KLnL8ht09c8>VXX ziaCC#*Hrhr=0rMfYP>RYvZ2VFD&IAyi@uuLXl$@{XGG3yEoyx2m(+dg(E3G38{XcR z#Ea{4cJj5J8-1qE-F0aksL-ZhK$3nS&5cj=eD%1t99foB-h!mQ{ZKdS$%WO2dU5%l zwl2(z_hv@go@cdvVpTgH#KgaSO)vFNNoV@8bhUla?!TqN(n z-jyHyhbvzs{>r`;iBF5YuXCh8#PuVG{=853Wu()ddM9a5GmlFo5<)V6fBmj~GJO5t z_kJSw-{yuM&22(-@HI+8S}hPY5Iqn@5KRzO5M2;u5N!~35PcAZ5RDL(5S@}KLaBZ69a=m08p60!U3dC y%YcEy$2WvQ+rR{fjX@GX5JG|-KOkBdfX4p^*#+W)>;uuH*vVxBwBJtGmwg1>aQ2v<9 z+~Hzv=Hj(mnWvlOV=Zr+2+nutvk}aQ)1S)1OWW7^Y^va2I zx^n!qUNw3|uO8~tYX%c~?SZIXm#ooMu?oH3U#zRWU-gFKciQJHPy0T)(i>kDWon)- zW@;ZUWCE`jvRe+$xr3+fyMvE1*-+yx3HMx-Nabaz4<48LZzm<{9Z}I2z0&aIsM^L4VT^^fL%srIHP5pC_*R z{9ZMj%jLvoU-IMOaQ^ZrSX$t)7Z&Be_m|p5Hcy#1SZV{}FmHO7txzNymy-N*{*KMu z`Tb{-ohhjcgv=E&SC~H|Hfz>P>#Nj1ob>0Pzh?fq94AgWb#8O=l+&jOuxb=gBv3R^ zL{L;vWKeWagiw@Fq)@a_#8A{w33N`gjPTLj}D^4`KEoQc^GVP*D|DtxE|7NRpL=4S8N z9f#SOeWo+XnrGsz2@#MXGs9-q@-f0;hH%(R`B` zXK;1x#$4xLM~r=iC&w%H$#ud`dwMriZ4S5Yk|RrZs-wldI+C7Y-pgpyo%dWdotJxL zD07b)8u!Sh$)BoA14>^W9yY^$VYzZ{vl;2QLq@xgs|?z<1w8$?lm*dzonA~)~nL|Dz2IY&k(erTl84NkYvnrAsW+MZ zlXO;Zzsf#xTs+}!<=y?d%-y0-Q$;7EW#Nl6RPmcX$^)T4)PuVny~uw-l~jMPA4)%^ z{3T!Mhhq<^($t799XV+h$L!UM```#Q7qSgkB;C^52ci7a2G z)MJ}GvZ7#-3YJZil{3;*dDbsd{@X-Vaa)3}_-;r&K0c~f_nlQwe0yH6IrNjM?EOfu zZ98qM!Uwdf`oOH)(Ie}N_nGR-uxyysU_wRBvN7&uRg+vHHAD64$?Nl__VhAUH<%<( zb>^r|Ul;27y|=1{NTPna=2!L1oPMz`x6eZ{o z9i_v9=|Q>_bcuf6A!rX>f(`?+&_NL|8Q~#WYd%X8O9y5oT?{ltZN8{qJ z5mq-WMnWyl`jpz1jS2n5!lrd3I-WaP^<1wEJu@q}*B(}FtmcdrLqGN*n~S`->{Bvtg-dHO^$srrCmJ-54;NN8eiU%vi3a`@YwDWjNnfbIVJ_Q~AVB z#!E$p>{Ox2YcD44j@O61&K1M%T55E=Ul#42S>3%bU$E0RzquEuxAVPypWNQ!BXhD; zDhVx6wmX9dew*dmuNl(*n1O&0eP7iN5tlBDpb*#ZXdxk-5pi&T-@nn+&F(YK2xp!d z%s3)uwW*aVgyosSHw@PgNV7RBryy;=*03#h!*l_$T?; B-P-^F literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Brunei b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Brunei new file mode 100644 index 0000000000000000000000000000000000000000..cad16b0dfea2ec12074c8cb674cffedbac27b0c6 GIT binary patch literal 229 zcmWHE%1kq2zyQoZ5fBCe79a+(`5J)4+Ab!SUFq%}_5c6>XJBMvVqnPL0~BV+tN^Ji zXkg&-@eN_nHZV6f0Fo9UDIf?T!ImEoEet>l{)21-(I6W^!u3El@wRf=09|0GYrzEo DhVUm{ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Calcutta b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Calcutta new file mode 100644 index 0000000000000000000000000000000000000000..b57972dd8ab55785d8cb21b90b5277d8fc850fdc GIT binary patch literal 312 zcmWHE%1kq2zyK^j5fBCeHXsJEg&KfF``kUdPTlU&IKx^fab~K~ic2LzGZ>kefslbA z=mJmygSQ()ONsyh literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Chita b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Chita new file mode 100644 index 0000000000000000000000000000000000000000..95f56456e5264b11295251f941115a9b877a64e8 GIT binary patch literal 1257 zcmdVZPe_wt9Ki8sZMvZnze{N?bEV5{YIBvibXuv2Iw@)tC4tZ%$|6P-6+{aCJxKfx zMGzf~{y|8W{v6C(3Kb$$o~(mlhq{5{zHegpp#u@~ z*T}UioQx)WaxJ}fy7g|h|Hh8i zT`~~U!kd-4w692u&WHw%xO7?P7hT>yrNy=5S`r%3p#Q0^$i1(np0`r^by!w@cpfM_ zbvRHqeos~nUzgD1%Tj*lv{YQ}mdf*;vif*j!uw)UwdbHljy39gb7P-w&e|m{#YeSe`h>Q+w`%LyPHmftX#2yc#z(hE#}&UO+FzO--^KzxsZ`3i z-1B}Po~(=`+nezs^Nl~ReO|ZQnC>q7x0+>L4cg*j4_d)3K40k|bg^6SxO^@L2O-~Ia$@#ntNeA`uur%+ z+U>=Cv9TZT_J7phEI4%Toa~yr2d8f7-k>h~Ql;)~RqEhUK;2L0=@IS8ixKjcRk?tt`rFu@*oZjsf)3>_p^e-ASurTio&P|)4 znJMQ{GHxEnV@|BC*2Jr8oF~DU4FBBpo|k;ejOI@1(X%(1vE!JY&t|jY^9ORSfBJLn z=@&_j+y6qQwFE@8kvx&NjueWdGrl73efFN`BZ;JhqMi2YvRAi+TB5voVAZ0p#Q6&b$@1Vmt@shmEEPQ+dAwxQ={D8*Lz@c0P8P$BDh-yh zJRhox=gVq;O|{%Y*PQ{??_KRC8|0oVI%a(=qV1LMrEqU0h@_&_Xe`L@@k|6ZIO2E7 z93L|!ALb9D7bk4{9*EM0TpUDs5CS+32?Qb_WIzakkOCnFLJol-2uVX01tDw5!t~*5 M#r`q2S-#n^-;pXt<8 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Chungking b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Chungking new file mode 100644 index 0000000000000000000000000000000000000000..dbd132f2b0bcc8beab08e04b182751795c853127 GIT binary patch literal 414 zcma)%y$%6E6ov01AsdnK0RGwCh(;k=S&0xTQ;84_wi_?7<`F!PCs;~}D7?f(B^vIT zl7ch2`)zh+C+8E>VAZ0p#Q6&b$@1Vmt@shmEEPQ+dAwxQ={D8*Lz@c0P8P$BDh-yh zJRhox=gVq;O|{%Y*PQ{??_KRC8|0oVI%a(=qV1LMrEqU0h@_&_Xe`L@@k|6ZIO2E7 z93L|!ALb9D7bk4{9*EM0TpUDs5CS+32?Qb_WIzakkOCnFLJol-2uVX01tDw5!t~*5 M#r`q2S-#n^-;pXt<8 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Colombo b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Colombo new file mode 100644 index 0000000000000000000000000000000000000000..28fe4307d75db1d500d815b4269cfd82de7cbfe7 GIT binary patch literal 413 zcmWHE%1kq2zyKUT5fBCeP9O%cB^rQ4``o=Ur=w&v&P>%_aH+Jx!f+XbhEXAdf{Xnt zjr#xp|1&Z%voNu;F)=YPc-;Z2XYhK$z{0@b8v!yRB!Q8Sfgw7BQ3ymb0LhR92A~K? z*2g!5!54_N4NQ#6%&@8*l*ty`oU( literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Dacca b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Dacca new file mode 100644 index 0000000000000000000000000000000000000000..98881f093ae76753e8757dc3fa50fcf7fd1f8b63 GIT binary patch literal 370 zcmWHE%1kq2zyNGO5fBCe4j=}xWg39QsoQNE&af6roSAC0;_iw|GrX*i2zcAvm{9-! z|9?g%W+oO^78VAEkRw2)3_%wdfb8fDkO{sK417TG1O^cXhNJ>U2_N4O1`i3D)07ULl`2YX_ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Damascus b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Damascus new file mode 100644 index 0000000000000000000000000000000000000000..ac457646bb0205eabde9526bff8ae41d33df550b GIT binary patch literal 2320 zcmdVaeN0t#9LMn=AVP>}q$?i=q$0+{1+IVv2o@4)7yAVl$Aij`C<^-QiAQCDV9JJKko`<^%M8aX9q4b&U6`&WuNeM3f6$$SyL zd(em}*dp%UHOrot-6ZDM9kdsCKQd!u^Nocwmz#0HaYo$L3Tx3%FUor^&QbAaXUc@5 z2`aIxQYUp5Se`v?GP$i)rPRNtQ!9n?$~3(==b}nWeNv`JeX24dJN1&lSFI((=jFYF z(bj$6_+{qlVwH7bhtBTZZY|w^Qs(UZP~~pEte4g0s{7Y8>IZzAth}YYa(PmZ%8$Gu z9}Lg13gUBQ!Dz8sF=eA(ach;biqh=2vok@Fi6<`?#zbJgaJhzRI@PYrK>YcWSq!Ak&z-pMR%+`Fj&qREyr+?@gf68MvM#@88gSAkx{!k!$!vK z>I@tiImghEu_J>=M$a*PWc(ZfKq9~q0we|;K|rFw5e6g<9DzV0frJ8y1riKbCmKjN zka!>gK_Y^L1c?a}6eKE0Sdh3Nfk7gJga(NX5*#Etu1p(MIwuY7KtqqTqL?kc#-%b0d{pFjD*`%s5D a%}(-C@5I8zo^(%oa!O)hYRavru)hIHh^b=$ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Dhaka b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Dhaka new file mode 100644 index 0000000000000000000000000000000000000000..98881f093ae76753e8757dc3fa50fcf7fd1f8b63 GIT binary patch literal 370 zcmWHE%1kq2zyNGO5fBCe4j=}xWg39QsoQNE&af6roSAC0;_iw|GrX*i2zcAvm{9-! z|9?g%W+oO^78VAEkRw2)3_%wdfb8fDkO{sK417TG1O^cXhNJ>U2_N4O1`i3D)07ULl`2YX_ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Dili b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Dili new file mode 100644 index 0000000000000000000000000000000000000000..c94fa610f952981a865abe4a9d9cbdc26946ab3f GIT binary patch literal 253 zcmWHE%1kq2zyQoZ5fBCeHXsJEc^ZJkq-PRGPR}&@!2Qag!1C}+hWh{i|1&T$F)}eR zFqG~ADqtvRU|?ZjsGGpR;o}>^plx6Q#FiilAP6DBwjU5J3_uJ1gKP!SAe%wLAlpGS W$ORx!50oR`6Xe literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Dubai b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Dubai new file mode 100644 index 0000000000000000000000000000000000000000..c12f31a141db7e6e02f7274e114c1cd6be2ff1e6 GIT binary patch literal 187 zcmWHE%1kq2zyM4@5fBCeW*`Q!IU0b(!cQ|-)c^ngpMjB)fx-9&P=vw4fq})xH-tgk jzy!o)2qD49A7C8}3_uhAgNz1o2^i011GLCa*MtiIP}?0H literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Dushanbe b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Dushanbe new file mode 100644 index 0000000000000000000000000000000000000000..67c772b4d9d711dba166b802bfc5e1f64ae004da GIT binary patch literal 621 zcmchUJxc>Y5J30zG$ATnqsb*v5dd@oy2v#=EGV_*U7iQo3tJTdZ^DE-oA&Immd#9o0)ZK4f zo-_-+-d@m`x^R;5^IY=n@hJ855V&`)lfJ12nX6sNo^470@rn!_EXiPPR&v{U8CuKA zaJffD=00RJ-;}Y;y^MF=if6x!!O^TOCU~oGCB+CSNFO&S*|^)mR$QMvMQ4*S~&W(g8y(Kupla2E+)&N<=jS zu>&y#u>>&%u>~;(u?8^*u?H~-u?R5u?jI8QSCwu!@AD?f0h&T`UeY>#l$CU CZF_?N literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Famagusta b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Famagusta new file mode 100644 index 0000000000000000000000000000000000000000..021f8a2dd78a0a493f58af2ae4107dfddb4f2d40 GIT binary patch literal 2042 zcmdtiZ%kEn9LMo< zIp)49n{(-A6IpAHbkllZf2KKSo1?R(4_afLvQ=xs+RWLXvHHD__NWKWr=7cdUT0_b zKKs2t@wJ;0CDwngyUiQETuJlgIemw@9epi3JbvT@FF3r{P5ZOKoABv*dt!f?Gild% z?!Db1N7`4q=^MwK$+ez6B{t2wFM8IVntR5%e@efdk#fYzxYlDoaOEv$+E>l?gP%7! zp^v-W%ws#ftb++RySLHH*|x-;-cs#7v_9XRQIqH8mQQdW4ySoDL!<5^X(QgO)HHk6 z^`JBRhY>sP(p4w_+?V#8lS59p|Abx8cibuL-e(tW-Rnde+U?@HL9ZmX$BkB~H@9Gm zTbkA8%`54Yd1FbLAL`Tj!yBaRuMS=CNu@mY&9hoQP_GrI7wF?Xi*(^TnfgQ`R~L1c z$&-sywXz{3PtE*Et18E2aq1UZo%^j+kNzl2Q_jfJp$oF?$`M&U_`cL!{7hrJdu7G3 zcXefJtJu9eb=8_(`gBX9);`*z@tSIVCS!%J4(I9W8xdXOCf(<*&z7|x{-*0L2W9=? zbg4UeRh~~?lls0Paq2J2hV8%T3kyGzjdd5bA?JWJRt#$5o>SVCrP}oKer+CW(@ht; z^u^)0zVzNYZ8^VLUVghmTL)_8mF66MwWm}zuPT?eM22iB&X%oJe@J_}B^^amwd2?C zrE}5^?R3vc*XY;!`tbpIW9YPQJ8)LF4<6DtyZSY`JE_)Pfjj%8jJy3O_4Yrx^$W|& zxnxeCl^+R=v#iYN*7$$#H{aw(tcf?@)WqUeRaGswxHTsdRkq#vXqq$8vyq$i{) zq${K?q%Wi~q%)*7q&K8Fq&r{J9?~DuAkrbyBGMz$B+@0)CekO;DAFm?D$*;`EYhv7 zX&33&*EEcDjI@mOj5LjOjkJyQjWmvQj*SkF<~U?`t*y*#Td(1;`#Cn}F;B zvJJ>SARB?~1hN&#ULc!+>;|$O$bR^m4MBDU*%D+=kWE2$1=$v4UyzMKb_UrRWN(no zL3Rh(9%O%z4e~WRglrMAN6022yM$~LvQNlHAv=X^6|z^zW+A(UY!|X$$cFiv9YeOv v*X$XxX~?c2+lK5LvT?}H;s0stf@T5>N*Kd%ELvDv7%7T|W5p5wX>RZzDF@N9 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Gaza b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Gaza new file mode 100644 index 0000000000000000000000000000000000000000..60d0de00ad21c8a7260046dc49fdfa9e040838f1 GIT binary patch literal 2295 zcmd7SZA?{l0LSrj1xaDl$ZXCLLL!QC@$z)TBnY~onAj<=Opu2^$%E$8DbYcI+?uhO zE`~kL$-)s{yU+|Pd(?wh;& z`+5tvRwioyx`Na@JX|g6;XK!;UcN8*RGz=`m44y)J?*D&M@@for8GNh&7b!R+4t@b z#>I**-=%HR?00V#{i9BOAmpqVxGc=;gOk=^_YQ5y-)Q~)@l9>G>$G9jF7n-IxoX`k zEYL=F&o@R_9`cQCXfwtm!hE;feb%k1Y;9s*kTLPsIc;)cg>`3fmOiWgpqzEL%bYzv zAc8xR%<#`|%cl<9FeA=Si3Q?_9{Khu5tZ9*K3(#OTo_rbM;E%pA}vFY2^o?xzg#sJ zU-!!;Uk2#0mj=bs&IRVO&njfx0f*^4x=O~EcIwOPVx?>KH>T^_BQl{pMW^V#%bjt#^}7)3wJUSPwvHid``2S)N0Z;$+5W58Re8!X_Ma86=e%#d zQGQhHj@e^Xdm6-^#||5Nok!%};cBBMv`*Ie^Nre}V)^FDRHN=fhOBR%Z#0~UlKX1h zR^vzMVus_vcVNJM?-`Dn+zQk!j`L+x|e^gCtNNkYT3xTk%c2GN0yGP9a%iGdSv;?`jG-46+lXW)WB910jUB~2BZ#1A&^QSr9f(d z6a%RSQVv^H52PSSMUavpH9?AkRK-@61*r>C7+X~tq%=rvkm4ZKLCS;F2PqIzA*4h| zjgTTCRYJ;y)X7#A3aJ!QDx_9Ov5;yZj d(%S(z+j(0Clh|5cG#iwuz{s)+r^!ES& literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Harbin b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Harbin new file mode 100644 index 0000000000000000000000000000000000000000..dbd132f2b0bcc8beab08e04b182751795c853127 GIT binary patch literal 414 zcma)%y$%6E6ov01AsdnK0RGwCh(;k=S&0xTQ;84_wi_?7<`F!PCs;~}D7?f(B^vIT zl7ch2`)zh+C+8E>VAZ0p#Q6&b$@1Vmt@shmEEPQ+dAwxQ={D8*Lz@c0P8P$BDh-yh zJRhox=gVq;O|{%Y*PQ{??_KRC8|0oVI%a(=qV1LMrEqU0h@_&_Xe`L@@k|6ZIO2E7 z93L|!ALb9D7bk4{9*EM0TpUDs5CS+32?Qb_WIzakkOCnFLJol-2uVX01tDw5!t~*5 M#r`q2S-#n^-;pXt<8 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Hebron b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Hebron new file mode 100644 index 0000000000000000000000000000000000000000..a2e1b364f9b50814468b5bf76290bfeec2bac37c GIT binary patch literal 2323 zcmd7SZA?{l0LSrj1xaDl%xvZeArVEn$m0!@An1Z#6FTLU3G(nKdC+`1B{~QYYQ$!` zm}xbq3tuocmQBpD<{Uk+9!aD*&yrB(soHDHHg$>saT(xfG z=V`+`=NTg__BV{KYca+`XEoe(^;kD2Gqv%#0mk@WXSIp(<<{**8TyRceR9T~4s+&M zzX)tgFhf4SC7;}T-3&c9DdvmAde~bhMYyNae5&Xpxge}ikI0V|3$-*oGH6gn{&Lk^ zbj>Fhf9a=3T^tZg+UJ`~&y>mNy$;iPWTlKLZr7L9M9J7y-GIhV5oT)30-4qv zU_MtrU8WbjDKmW$b9sUp7ro=GOKTgv2tLpTy-Wu_xv~^S076eFMNDi zt|{pzTtp;$=fAfb|2H%CbkH#XRE$$PLIru%F%O2 zyRG%J&x-YzTCKd{<08Ma$=Yz?T~YAQBu2IzLM%OHWuiz zG<2y^mJ%<^?gkqbA&<$5KZcA=x5wn>?}DsXugn%(+6JwyUyq7yO+IUT>#t%*`AN%Y zJS|?!I%vIKdPMAu++|g|>%^`{-ZOSP56j&{l}1%?jjZzJ8r6e^@{JS8M$P#&S=&6% zsQV;b?x}KF^&g~)X^#8f{(kqor#Yr`-~aRf;jfw&)~kNu+LBm@zovzRX*2C}uzj92 z_0F1Xua=p)mKU$)ajQq2?aMKR_rZHQr2f<1)2*qGXp`!y>stK;vM*#~$j*?hA$vnM zhwKj79=W52vQuQM$X=1nBD+Pli|iNKFtTG?wPj?_ zwrbPJu90o?b+B(+wQ*$U$kvg)Bb!Hdk8B^=KhglC14s*y9w1FXx?ro?fb;=r1kwql z6-Y0TW+2@_+JW=~X^5@r2+|UyCrDF}t{`ne`eLgZgLDRIjjiep(j25aNPCd}APqt~ zgtQ3h5z-{2OGulLJ|T@lI%TU`h4cz(7Sb)GT}Z!>h9Mn8T4t+yW~-WpbPZ`6(l?}W zNav8&A-zMIXREr0w9i)c4{0FML8OI950NG!T}0Z5^bu(!(n+M1NH39Q+Ny3M?X*?> zL>h{86lp2aQ>3X#SCO_NeMK6JbQWnX(p#jtNOzI;+N%B{4YpMsMp}&Y7-=%nWu(nW rpOHpu4~pnL6Yb~!zm9aEs<$(qjz?!F#3aVJmc>P9$Hm4ZaSHqgVbA@L literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ho_Chi_Minh b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ho_Chi_Minh new file mode 100644 index 0000000000000000000000000000000000000000..92642679c8f9e68c125a8c6fa740ebf61df82417 GIT binary patch literal 389 zcmWHE%1kq2zyNGO5fBCeZXgD+MH_%bM~`#E#KqcNXHB0qT#P(daLL;4!&Rf*0#CL* zX?UwYgMrKTI79va|Nj{nnV4Can1PUqfguH`k%1xk8v_diLs9_)Cj&!40|PGuL)`=h zL5PTtZwNyGh|o4L2Vx5#wghW}5g{bF^9NKD&>8}v g1BeFs14M)T0s0Z0QvW1Z2$lO literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Hong_Kong b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Hong_Kong new file mode 100644 index 0000000000000000000000000000000000000000..dc9058e4b578ca8c9bb954af1bbe26a964eaf408 GIT binary patch literal 1189 zcmd7QOKgl$9ES1JxivGCw22K1;+B(05gVrxw3R5GRu?8|QlVubhN3I1CLe7xGTH`z)iG`KeIFs-DolG*Dd7oHQeCrbR#|gS` zcsQ%w!@V@=UI*h%*{-2R+nrt}H>3NK_v*H^-QRxIJUCt}534Vko>SN4(TXaYS~yoy z`3jq!5|Z@e8TQHW8+mFc?6X_l(tCEg>ASE&Ki@xYUYzLCFB{_K)t>YE^`fZhZ|;!H z)N(VhvRwvpYwh67!!np!V227j<*hBT@A?{K_~eLv-`T21_TIH0WS#!lc*TA?v{-+x zykkbUmFclrmrb^2RDYS5Fu7@)bw1c)@?)#?*Zykrt+!dmZ*Q^_*Q@0F#Y$T^Ge^|X z*|sPV6yL6Z^=}-IKz+srYXUm7)NhLCXLRv_dm@{J?9^mK(O z+ubV4SLE}%=ifd`?TENPSS5}X1(a$_sxWs|^7CF-A5&|h>v_dgt@HPZ{l$d2Uq36j z!<5LJ$fU@u$h643$i&FZ$kfQ($mE`Gc4T@_H$Rd9k^zzek^_#B!*;$q=w{%B!^^&q=)3^=@LXTL{da@ zM3O`=OD?3zad`rXBAFtoBDo^TBH1G8db)g(ggsrxNXkggNYY5w_#dPlakZD5$PYD~ B5Gw!x literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Hovd b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Hovd new file mode 100644 index 0000000000000000000000000000000000000000..f367a550ff9affc140c118081917effaa31d1f13 GIT binary patch literal 921 zcmchVJ1j#{0ESOJ5>etV60cJ4N7b_)LF>JsgXAJ1(ndtQ5(cBk8AK4n8M-mtK`CL6IBF%Tn(K~m>yY$l7pIsNXvxlNk?`_0jrsXFm13Hk|#`1Il0kos%m_A8R+ ze6=!O?p5Z4Q)JzYsqFKB%sKWe*PdJE?&PVw$`UQ(yG-lxng&kVXLbrWOw_zte&Dy zyVn(R52YX3!-)%W_+#51c^;H&(P&gS;^Y4Ki5Ft%P1hjIFr6$)N0JZ|iy~zpXbMkF zqdv|0H1SF-<{$d~{P~UkYf*aUmaZXvLpmq)4(T4!Kg0pV1H=Wy2gC`)3&ah?55y6~ z6U0@F+84wb!5hRK!5_pS!6U>a!6(Ei!7Icq#4p4##52S-#5cq_#5=@2#6M&MkR3p_ j0NDd%6Odg%wgK4(WFs-^oj|q%|7$PFZF)TcZ&UI&a<;sc literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Irkutsk b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Irkutsk new file mode 100644 index 0000000000000000000000000000000000000000..84136366d176279caf6b7a55c0cb1e270b41d334 GIT binary patch literal 1276 zcmdVZPe_wt9Ki8sxz)135t`Q2o-$i&t=24?I{(zPvE~lNh!`1ISqL3QL>NepOu9sL z$PUusN9HX$X@m$Ocqovdj0y?*d+8De5k=X0zV8}H9Xj{EJkR&t^S&GGeLrt9)qOIk z{@PZW6$V?x433L4X1cYiXmV_L)>Y!^%&aaOoG*0_s?u){(`6qXWY*06m|r`S$hap` zQhp~c6*t3DdBrd5dMibrE|T>}lx&E9lB$Ncve7py)$VE8v|>y=_BYz|`H9~A{&B$D zb3WjGI;yu!k7(cM4ZZdDW$nM-qqkk^*4xjfbl^l>@8~!u!7~S>rtz@sJXj;UD(a;+ zSR%CxnC1I!`v4g9$C=eU4K)TGcDjkNpxWI4ZG6U9$gOi^T6nrG2JDC$4%W8Gr8T%Vx8-CH8{c z?pV5LU*=r&VeyGSkC!_fN_9?|JIZWV>R4JimAY`vW^Q#lqg?qpzhW~h`D=I_`E})L zPb5{$3}0Zk8Fgla_*tcFxh?l0Hz)u7xLeJY*5m&A`-|q^W)I!F*i3o+6at)v0fhpE zgH=OVD%A1eF>x4}@+_AJqKI`%DVt8C*I z%*}N3aoJ>}IZ`4=&bD-ITIsP`!!UYMED2aoYqmKz{nnyi%&zbIskWMb)cUvYv*%vN zaq!3OKJWOtEt^WkO=qfpg`3l^Z=Qz|`oY>g(b<)iYj#~cZ6DgW!8yF+1*4}iVZK&# z!tN~$JFkb^?7pHRv+t`L_8UL%a*n>g$QWq5W)7tK?XxQ;%#Vf=#^B&F^W5crD&(`C1TH+PQyYgi_ealJHSN@if(fX3~R~||DC!ZF9 zP;Yl&bg`4E{B~Aw$jlm4S2Le)QM0zKQFk{lSNFv3R|Qo?YWDn) zD$LJRbEZzJurDmb6VqhT<$#livPpFF0M^(j*$5bTm85tR0rYa}b$;I!@Q4fq($*SI3x#XQ0 zvU+EstmzVR=_bE?up?hR6ulyAH~gxW6%NX1t)rryrOtBSS*xz#%V6ELZ-VvS{$Tyk zKyby^hl4AR^#x<+&R7k5$F0VruUZecwg!zo?bah}U$jzo_`}0ckX88Z@<((3^>GJu6$Scy{NRhW$qzf^x#4|;R z{8=Jfh{#gUZM-6K{{H%3-@|WX4RKMg?`U*24{=dkQm*eZ{;NJ7eSUxD{vhK2yp<09 zPIoIm{qcwTqe?ZsJ#Y!x4zeFty&+^r$d-^jA)7*Wg=`Dim#f|wvNL3B$lhG_=8)YX z+e7w;Y!KNYvPEQ%$R?3pBHKjviEI?vsjJ>9vR7oY$ZnDCBKt))jO-ZQE%UkQJp-FY zc8zQs**CIrWar4%UG?5MY~EGx9@##!e^=cAqytC`kRBjSK)QgmfkPjVMj)L)T7mQe zX@;xr2GS0sA4o%xjvy^TdV(|s=?c;oq%TNgkj}X3)*!t>nuBx)X%EsLq(MlBkQO05 zLYjnh32773C!|qGr(AWbkY2g!W+B}|+J*EBX&BNmq-99YkftGBL)wP)4QU+GIal2} zq<2X3Ty^)5_POf*Aq_-2h_n#tA<{&oi%1)hJ|c}oI*GIr=_S%kSKUpdo!F+o>*D_y O(99|w*XjjjnZE%*@2d&` literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Jakarta b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Jakarta new file mode 100644 index 0000000000000000000000000000000000000000..37b4edded8bcd470f1afeab00ad16b6b1090ebd3 GIT binary patch literal 392 zcmWHE%1kq2zyRz(5fBCe4j=}x6&irV%8J$pyTtA#oZjEuaVhLw!F8Ks9Jl_fF?`v& zuY-|^nT45^nT>%VMFFT3M6xh2q$_|-$gE)CV_>M8z#ziFP|(02!N8DIz#!w}8^YiO z#M%btMg}0#7(`kEu?0i8rxVB!BoIQ_t(-vRV7LB&>iZ7__Gz98AR6R$5Djuahz9uq dM1%YRqCtKE(IEeTXpo;6XzeL3pg(oZxd1b?U(^5q literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Jayapura b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Jayapura new file mode 100644 index 0000000000000000000000000000000000000000..39ddc84363768c6b407df1077f69ba9dfca8494c GIT binary patch literal 251 zcmWHE%1kq2zyK^j5fBCe7+a_T$k`=!aK?p*ogcnzU6jGV$i&RR(EI|VsBQvCUF!@6 z4ltX~$2WvQ+rScpjSU#WJwrf>z#xPK8-GCc{09P%%^(_NJBTLV1zbSq=vs0C0F<0E AHvj+t literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Jerusalem b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Jerusalem new file mode 100644 index 0000000000000000000000000000000000000000..df5119935c5b01676e63d1fb1efd7273b8b4b452 GIT binary patch literal 2265 zcmdtie@sLcU*$tru4i|t=jsdKim4U!|Uu0{$YIH zfs*A_DdHa&W5x9x>J#0c#_99=4e@Wf;>!&oI{qxRiqG#enySL_)z8HB@1*eUOV6e~*uWQiZH(Kn`gTGi2 zO(}MC+mN2L`HCIWK4QgM@A~659w)@mlwYIsU0*`t{Urd+lkL zI`zFrNBQHs`mE{AvG$B3l{#T_h&^-10_`bp_9w27*WR3Cc2dsUI(c@rKPBmq<-7By zof^5_O1;wLpA{OeW_5|bKdes8bL*n7}=@THA%PTd|ocTJjn z$iL6Z%x@I)ath`Agw-M|X3)tVTO_jkDx3vbUF5axbRPb2SmbXR?G$W} zQVTcjkcBnZl)o&~c_eT~J-RYi7Ws~-K>iH**o0lGIN?@Ve076b6cz6*>RPH64~%h2 zTIZ=HUH#7EyDU-K+Ub; zvYuY`)Qw`f{MZTg^!aqT;{6ZQ%HsiN)hk<6byJ%2Ol7r_uioLTUf3X>t-S86@vIUx zS>4Wa;|fKsXIR!=P7-U!os(-jZWHS+e-Ss_D4 z-SX#G=wGk@)teBL-GA@6ArUIXbZ9mR-%Bkxe7JMz)RY z8`(Irb7bqt-jU5CyGOQ<>>p`>tLXsJ0;C5>6Ob+-Z9w{fGy>@a(h8&(NHdUbAnic< zfi%R`bOdRMtLX{S6r?LiTadmWjX^qtv3uw9sorcEF2hE7#Qq57&v@< zLm0FTOhDM!03-zjA%rae>IPfF_XDhhfdOd#|ID^o3qUl;LXdDhkj+4}tz0%>H`wW# JSQ#5|0RWOzC!YWS literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kamchatka b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kamchatka new file mode 100644 index 0000000000000000000000000000000000000000..fab27defad0cacc1110a5f513671def88583e0e9 GIT binary patch literal 1198 zcmd7QT}V@57{Ku}owY0|4D&0?k94gy+h&QS&gDm9n?bRwYVgn(^l=fm{Jk6BzV88xT-JFa9N-%d=GyFKA$mGM-CYxhLO>}7xDr%U0g=}fA6vOHXq zZjj{r>tRaOpvl)A%jq<+^+X^1?P#*PQF%6na!YA#6g!js~5Ce{7rny#L? zn)RFrXFacnbxr1oddK6s_Rco-jdg3w8NaSOUa$UrWg3WwBzUY!TD$6G{q`TSp|(ic z0`H~m=Zv&h&uaU-7qapDTiujSO2_nb?Yx`Ou4lJ2boQQhCr)X2|2f@!`lj^sAJX2v zqte$D)&AZ+vZbU&2O9fi;B!O{2VZ3$v45E6x8I*JKPbmkk;$^nbdd=oQ?@meMy8ES9GN;Yd1U%X0Z0W%2}lh{ z5l9tC8Au&SAxI@iDYm8-q!^?cTT>2F4^j|P5mFLT6H*jX6;c*b7g88f8B!Wjo2@Ah zsm|7vht!7@h*XG_h}4J_iByS{iPVV{id2e}iqwh}i&SfC%0=q6H3cITBPAm>BSqtg Snf?D;b!n%mJ>&}nOMd|b>ln%a literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Karachi b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Karachi new file mode 100644 index 0000000000000000000000000000000000000000..b7dcaab8f2068adbf69cae0b1cd80f98e7a2da13 GIT binary patch literal 417 zcmWHE%1kq2zyNGO5fBCe9v}v>WgCD*XWgGAXQmphxKtuE{z?F_yV3@i)`(HV?f3=D1o3<3-c zAqk8kV78=>ZwQ07fvK?pkTe66rVIhz!685*1f&-ZLP&7*52&vHKmc+)hz5B8M1wp5 qqCp-3DFb;1M1wp8qCuVl(IAh3XprZ?G|+<}nx>xQ0{U9llnVgqLRHiN literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kashgar b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kashgar new file mode 100644 index 0000000000000000000000000000000000000000..b44a1e19e9b1212585e55bd65be77665f4ecf6b9 GIT binary patch literal 187 zcmWHE%1kq2zyM4@5fBCeW*`Q!IU0b(hJU+K>i_@$&%nsYzz`$@6k!NSU|{j_4PnqW jFavQJLP#+32UrIK1JK0(AfrKC0>*RM04=i9HRA#R5AqyS literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kathmandu b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kathmandu new file mode 100644 index 0000000000000000000000000000000000000000..0cbd2952bb480dd403bc567bdc412c5d92813af1 GIT binary patch literal 238 zcmWHE%1kq2zyQoZ5fBCe79a+(1sZ_F!cVm=auNnB>i_@$&%nsU#K7SH2Pn+o8v#-m zaEF1*$2WvQ+rZS=07ROYf+T?;gamtjK(sIbt@sbJ55xu838G20m&*q13Oij>D-%;L E05l&Zi_@$&%nsU#K7SH2Pn+o8v#-m zaEF1*$2WvQ+rZS=07ROYf+T?;gamtjK(sIbt@sbJ55xu838G20m&*q13Oij>D-%;L E05l&Ze5opcZSg z$Lt-;+*y5QbkdSMDa@0r$I(e)?(kN;HzE9uEyCZ_Xc{za;>(3)kBNPiJtY1C!1q5d znctlO0tEvD2nq@c47&yg1qcNR1quZV1q=lZ1r7xd1rP-h1rh}l1r!Ap1r`ODT?34Q zi~`NB!A1c`K}Uf{!AAi|K}dl}!AJo~K}ms0!ASvX*C3@pwQI0az*5js;8O5X08kefslbA z=mJmygSQ()ONsyh literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Krasnoyarsk b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Krasnoyarsk new file mode 100644 index 0000000000000000000000000000000000000000..faec35d30403b70fccff6de6a523af81467036b8 GIT binary patch literal 1243 zcmdVZO-R#W9Ki8sIcqo*FQv6sOS7fZ`n76WQ=2U_opy*t*b7B3Vk9KJP=~-lRuB=3 z>JnW-i4GAzsV?EEB05MxL>(kbvYMm_9q0<1 zzlPWDFd1<>Sr@15<@)5zulEMV0<(gL(z8nkO^IiqxMcEGs`TT_^qf(znLDyQ?Hlga zdAB;%f2~dDpO5N-lhqpN@$14JMOv1~XnFLDE((olh3~m8_CD00`?CbUy_F^7Z(@}v z&c-TVJdmnKcO-OoP^t&7NX_Llvb6uWEIZmQvaeH?@9fv`;a$3-p-We8Zqil$jT#A; zYvgB@*7;&m_qtG5|0t6+!xI`EbxZvXuQc5MAdRO#$=a(=B)0#VG@TmPbzo=F)-9kV31&7 zC}?1i@$n5|2nJ$p19K2IG60drAkq?uEkH)0fDpnC=K^W~JNyS!C(wQW>&!w|foPCN tKs3lRAR6Q$5DoGahz5BKM1wpB(hl+hT literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kuching b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kuching new file mode 100644 index 0000000000000000000000000000000000000000..62b5389229af5216670b89966a2ddebe56695154 GIT binary patch literal 521 zcmWHE%1kq2zyNGO5fBCe5g-P!B^rRl+Ag*UyVBh|_E)Pn?Efqsa4>dF!@;Wy0uI|f zU^u+(@`a-c!VO1fum>DxbZ0nTX?5Ym<1-8=qxWApb>x4;X`9ahrzb`*T=K~MQ2+n` ze+EWoCKSlR%*?=$UI4U)A+v&kg@K{efRT%Vp`d|5fPtZI0>~vGwvTTJgSLUWu>p{@ zFanc6mL*6V9E6bIuOCodKqvhN`42>c{0O2!{shxNzk+Cxf59}+&mbD)Z!it?JBSAP zA4~(o07Qer0ZaqK0z`wt14M(u1Vn?v1w@0w222CP2SkIy2;{7KAe)xq#AO2vLpxmy FE&yxUwsimi literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kuwait b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kuwait new file mode 100644 index 0000000000000000000000000000000000000000..e71bc4e802cbdfd9f90598029e0fda04c4074ab3 GIT binary patch literal 187 zcmWHE%1kq2zyM4@5fBCeW*`Q!IU0b(RcW&=_5c6>XJBMxV9-7T6k*UZU|{j_4PnqW jFa~iMLP#+32UrIK1JK0(AfrKC0>*RM04=i9HRb{Uf07!( literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Macao b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Macao new file mode 100644 index 0000000000000000000000000000000000000000..2c20a32651d9da10d1d6f63495c3cf1fd55c7f16 GIT binary patch literal 771 zcmcJMKP&@L9Dv_dTUGV1#HJAvUL;M#;^I$&N-WBti9|vrL@-n*7HMu02@x@1GKn06 zfs&hym?RdXO^u48^{?JnqlLlm^4|AymmA*qg@&dkn#7N>t2ZpBK`qW6Lv3pbpSYX5 zw323@ydONY9u^zrWAnI?n)J%2>I40`CnaCRm`K-eCo_&wJ@XWhuQy%#+jZD{zZkJT zPCCuc{SGU;Rcnfs8cT~gOk2cmXy1%F{ToJpT|DWkjEe&2xh!}-)7^usWR!IvzX^$G7xYqUJvVpQ~3MMa)w``shN^t`&1h^=bs zhEYSfzW3f>NCdjo8VK=OV}<@;D$QSNvT85}u?8^*u?H~-u?R5u?jH@v74hZ z46zI`4Y3U|4s+HyV4hL-0RM<0A SRAeX#sR{qDs9WXr>+UaoVev)) literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Macau b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Macau new file mode 100644 index 0000000000000000000000000000000000000000..2c20a32651d9da10d1d6f63495c3cf1fd55c7f16 GIT binary patch literal 771 zcmcJMKP&@L9Dv_dTUGV1#HJAvUL;M#;^I$&N-WBti9|vrL@-n*7HMu02@x@1GKn06 zfs&hym?RdXO^u48^{?JnqlLlm^4|AymmA*qg@&dkn#7N>t2ZpBK`qW6Lv3pbpSYX5 zw323@ydONY9u^zrWAnI?n)J%2>I40`CnaCRm`K-eCo_&wJ@XWhuQy%#+jZD{zZkJT zPCCuc{SGU;Rcnfs8cT~gOk2cmXy1%F{ToJpT|DWkjEe&2xh!}-)7^usWR!IvzX^$G7xYqUJvVpQ~3MMa)w``shN^t`&1h^=bs zhEYSfzW3f>NCdjo8VK=OV}<@;D$QSNvT85}u?8^*u?H~-u?R5u?jH@v74hZ z46zI`4Y3U|4s+HyV4hL-0RM<0A SRAeX#sR{qDs9WXr>+UaoVev)) literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Magadan b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Magadan new file mode 100644 index 0000000000000000000000000000000000000000..2db063560c48c67f0280212a320b183d49d8cffd GIT binary patch literal 1258 zcmdVZPe_wt9Ki8sZMLNzB*;Ilm1eeVsoSz;Z7xeqY#R+3L{<>=2Wpoe(Lw59P#q$z zOLQ1gLWLG9I+#Rw*dgeUM2K{d4nlR1ARfX)MX;Xly9T399ec*}ex5yhH`t!O$ks?oBSP@$O7k*QRqduCs4zzTfStUAmL3TbRqOoo!6I zXZ*4*+aR8?)v|uXE*mZ`OMUv2G#q&+8)L7eG5lOM`5sD>J0qJbu8Y?(t-Z?=ddtTN z)jV`iHP2tuTVGz#zNxg{cK@huxs}kZSE9P@e4F;4tk;2KaS5LD%J$AyX&+c6J3Lhq z3VfE(&#%(qcIuAz^Rny5lHNTtE#ZaNI`UvncfNS6qgSW&p3F_%b?Ua>dpRrndWUrP zi5t?>G^l&KMfR6PbYJ6u^nE!j{q}b0e-oAiAF3tx#3S+9piYeDB^Apq9&(SV;e0-? zZ1xp}hoh|IvC>)cr1XV9*Dj~Sq15Pc^Rudvab?z%Ih#wV%u`iaycTzCW~X?MGWQhs zRb@PpQoexS%%GV8K1|sP!&(Jhu8_8nzL3U{&XCrS-jL>y z?vVD7{*VTd4lPZKNRO7LNu*1pO{7nxQKVC(Risy>S)^N}U8G;6VWeZEWu#|I(=^hx jrD+@K8)+Qr9BCct9ci91Y+CrAx-XBI|3tJU5Gelz??EM8 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Makassar b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Makassar new file mode 100644 index 0000000000000000000000000000000000000000..3a5dcb27007e1a2ffa67bbf3a30095303b5d67a2 GIT binary patch literal 288 zcmWHE%1kq2zyPd35fBCe7+bUf$XWO)cET>Ps}oLl$TnOGdso1~$i&RTz>xm|q!LI1 z*#!*@91IL~6Bu~FYyltN5C&f$);6#JVoQc_&k#qDYA6UH!395{dj10e$R!{eQ0szU5Jx2fl literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Manila b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Manila new file mode 100644 index 0000000000000000000000000000000000000000..06859a70d9b6a7a10abe85b38775b97319409608 GIT binary patch literal 367 zcmWHE%1kq2zyPd35fBCeE+7W6c^ZJk!8uq%dVEC|`c(>l0@Wn-YVt=tS>A+9! zOP)0;>}G+wCCOq zIP-oUv9rFt>11E{+J559kQ3@ZZRhlza&o(m*m*k+JK_2^JHK|&D~KF&3rp3TpR?U9 zN^A8N6m-afu`XE{?9+wAo22+&yDs{?OrH9oMoR|jwDjyEUEH%wm%Np#OJkY3th-pA zu1L_b`k*{B=T|K+8&%vhwxd*-IR*mX5g`|7o>Cad);|zK;9TStGkY!*WH8f=$_7g?K;?{) zl^u>7XIZJUtnvRm`KBrowaUw@c|`eDT%7-iKEMJ0lmD6PzPUK)ymQ!*1CJbfGtz^ho%=CVpf9kP$$J02u>h5Rg$oh5;D|WFU}{ zK!ySt3uG{S&1fLQ;cLbN84zSdkRd_F1Q`@$RFGjo#swJ|WMq(`LB<9d9AtEm;qf)& zgA5QdLdXyyV}uM6GD^rWA>)J$6f#oCP$6T53>Gq4$Z+|Z@j?d7*Nhl4WXPBygNBS6 kGHl4W;s18v0%q@W3Ru2Sq%gNAH=I`(isXm=xA}p;0b|0?X8-^I literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Novokuznetsk b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Novokuznetsk new file mode 100644 index 0000000000000000000000000000000000000000..ed4b248276dbabd6b9424bd5f7252729419570f0 GIT binary patch literal 1197 zcmd7QPe_wt9Ki8sIm?`cmvXgM%VkTa^=s8!O>Jt+{1+7KV1Fq3BL+g!A1VkOWCani zs4me>iHL|_RG08DDx!lFMASi|BndiX9Xb>d>-oMWEIM`T8Sndf_q^{0+wYs&cAz_A z{#rBb4hO5r9$c5E?dhgBki9=R7MLA6n3>}pGG#@BrDfk=r@bFvW#*20%)F898Q*Y^ z&cD^A{%dWz;Cx&co~+hDuU{AKn5E_IISt0Y=;H90R`_1%63-(Ixj#$j>pNLG{x(s0 z{A{A~_Bg+Pk$?_vTBKx{z#m)hZ9NMKT>$`Q;mPTFe->A_@ zP@_MqH0Dc4>`jTT`B5%whbJ^X>Xy3e9;tuuK^jhfl66;~N@D+WX*@NqP02gby!VN& zuec=1<{P@9@Tjx|&uPoVMQttU)z)W+we9^TZNI%$J4Q|O8gMvOAN{aJQo~Wx^7*N6a3z ze1UPXoGVVLf0*XC-=DHSD92Qh$+FFKkqNVyvZI|eGHqnyET)c39+^H;08#-`0#XA~ z1X2Z322ux72vP}BileOsDF&&=(UybMgA{~Rgp`ETgcOBTg_MQVg%pNVhLncX=4gvU zs&lmEA@v~zA{8PfA~hmKB2^+~B6T8#B9$VgBDEsLBGo$Da*=u+ZNW&zNXbaeNYU7D RXaE0JU0i2tZ>Xs){sqhn1EK%` literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Novosibirsk b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Novosibirsk new file mode 100644 index 0000000000000000000000000000000000000000..a5d39dffc110700f3f423b7ddd2f525dc09b50bc GIT binary patch literal 1255 zcmdVZPe{{I0KoCLoNmkr2}e8j6JQP;zeSand9in6J$NPQX9={E?_gP}^vBN>} z$MBdPCL?Ml>#~%&jpn^I4>D6#i|S6M7guCOxjR!<{`F<5;@w2rn=ciWxqWHh*ip6Q z&K~8z*`=0Vj;Lkl8&uVCzgphAK&^-sRCVN|stHV~THgz`vh=B{bAGVure9mD-oBFc zXD-S5@h8^mXZNhY{j3%E(IXnN8QC~8BG+6TmTL!2OY7hf*|h(v4xT!p*R>Al^*eXy z4gOs^6l~I=?_nMG^~msKrQSGW$xUP5bR@q}w%qp0)<@H_ZFoj*zA+)?p-H)A=#$Nbu#5}3(=Pp^XKk!I}Wom z`%GVwHP3X%6Cz-R%nX~^%*P0a8Ny*N?OWm>4*AQkx0&x&;IJtN&NhcmId}$#Z`S~z zAfP~CfPn&nf`S5rf`bBtf`kHvf`tNxf`$Tzf`uH%WT=QrsXpK^(&pSoFy?L!XUB|p&&w}qOdUEA|ebT zf+j{!5oGB@2>pVdLZU!=5h2JPdPt#sD9qOR-ZdEY)MNK@?&s|6Zm^y2jUDbjS!w<{ zvh50kqtOoLxtHx_=!uMt4$lQw`Y**-<&Wg%c^((%egAkP|IN7FN%MDRyNLjZZA7` ztG#UUjcj`PLIO`mWb^%DDIXk^EmsF*YfrBPk9SGMk(*k1_Ox!R@6qiC_G?wqK@C+_ zXlSuot9|>Vdb&V&E(E1!{D;;~t&qA0Ua5aJFAW0=vg^(}krUIhyZ?*s2|t&{&Pi=5 z9g=Y4m^NqjOH0XZZJE8Nk&Fu(d3{Cqe(2EFN1Ym-I4^D2!y0S-8th9X62_IWBzd|s z)6S*K(q5#$@#oy*b{o_5%KoFKx!u_Lu`@1@F|ng2Cv{D&xa>;m9%JuGt(%-^Tg(K4 zRd(#KBgB^(SMqS?$xG}Xw)orc&)Hv?V5^bsW|=KVwjJ4eN4xz<0!Ri(3P=t}5=a(E z8b}^UB1k4kDo8F!GDtQ^I!Hc_HX$S%@9e^(dLLGiDZeSiR6hSie!qUisXtUi)4$Wi{y(WjAV?Y>}YdFl6JINBWWXf ZBZ(uKBdKGbZQwu3J*&<>3Jv9Z-06*-(Ky?T(56QyiLcW&(iVb@Ang5m+HxdOnU443-#2in%(x~ zyzRa>W4GU!v^y>xwdu3NcIWY|-Bn51-Q^D3lUucWQomep`!|>Il9Krmlf7S7r0?QG z>HGM(ntit@x#u5b-~1ctzf+fi+5_2t?v~`IugHNDPhDa5nj0Ls>4uJ-aenu#D;6eP zaW!zI)M+U#7TxelMGn4BxI+sAQhwyi$jeR{y&9Lpcb8=B2A)+C&A;KZjL#lX)d`JKxH3CQokQg9AK%#(z0f_?=h{6yFBos(2kYFIu vK*9;B@jwC!sS!a!g2V&~3KA70EJ$3Cz#x%9LW6Va#H-UizOaj>;5g*?W2Jhey1}`8+fDjTa{sGnY9|%AW0MQ^vfM}3IK++UBh70IE KT?;E?11@}KLaBZ69a=m08p60!U3dC y%YcEy$2WvQ+rR{fjX@GX5JG|-KOkBdfX4p^*#+W)>;uuH*vVxBwBJtGmH}-Ow|DhMJ@Kxp`(7>R z;FEdXfB&K$xP4B&tCKo3GpYxt6M87uqlc3XJ(BpYN8?}AkHp3Q@mq%1w<;qyAIZok zEslQpD9P6=a_srCj6HlR$Ey$I#PzC-&n?Kw*_x)V-O^L}yE<`UR?~xXnn_J*rcu&t zVn(u`hjntRAgABQ^vs$kxfj0V--e~I6qTvR>r%Y@P0m)GE;gG@7YcWDc7*MUbhTZ( zBGLAbJND72bNPz>7cN_Loz9iSbvswCgnC$=t?efz3EAD&ldZcvIeotDlH(IL(>61F znRB6FwD!ST{s%cfx8Jkh)I<_Q6vxPd2!luqXyPF9AOay0AtE6%AwnTiAz~qNA%Y>2 zA)+C&A;KZjA>sp?d`JM02m)FNkQg9AK%#(z0f_?=2qY3nD3Dkn!9b#cgae5upalep pD4>M|i3t)EBq~T)khma$K_Y{M28j(Wnv?%JxLD3&ER1Dhe*khm-6H@1 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Rangoon b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Rangoon new file mode 100644 index 0000000000000000000000000000000000000000..3cc2aafac4e27bcbb2de4b08c6451c1a56452808 GIT binary patch literal 297 zcmWHE%1kq2zyPd35fBCe7+a_T$XWQQIPmnRKN1&brGKdZ|NlQD6EhPN14EQPNF|VD zVPJ^PVBlb2sGGpR2Vwj8hA;#Hv9^Jku>p{@1Sy4r5W?280hNNBAoK&O2Wad6ux*_e kK{UuYAR6Q(5Djt`NLf9Q%|M~sxNN{Kw$nAUGB)4>0I_91JOBUy literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Riyadh b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Riyadh new file mode 100644 index 0000000000000000000000000000000000000000..e71bc4e802cbdfd9f90598029e0fda04c4074ab3 GIT binary patch literal 187 zcmWHE%1kq2zyM4@5fBCeW*`Q!IU0b(RcW&=_5c6>XJBMxV9-7T6k*UZU|{j_4PnqW jFa~iMLP#+32UrIK1JK0(AfrKC0>*RM04=i9HRb{Uf07!( literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Saigon b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Saigon new file mode 100644 index 0000000000000000000000000000000000000000..92642679c8f9e68c125a8c6fa740ebf61df82417 GIT binary patch literal 389 zcmWHE%1kq2zyNGO5fBCeZXgD+MH_%bM~`#E#KqcNXHB0qT#P(daLL;4!&Rf*0#CL* zX?UwYgMrKTI79va|Nj{nnV4Can1PUqfguH`k%1xk8v_diLs9_)Cj&!40|PGuL)`=h zL5PTtZwNyGh|o4L2Vx5#wghW}5g{bF^9NKD&>8}v g1BeFs14M)T0s0Z0QvW1Z2$lO literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Sakhalin b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Sakhalin new file mode 100644 index 0000000000000000000000000000000000000000..8d6b4dfe21720eb32abd17fcd627ee9567f93836 GIT binary patch literal 1234 zcmd7ROGs2v7{Kvwn(>hpM3h>Srj0h)q|TknG#~j)Y-UJeXwd_LUYMIhw1@&dP!^Fy zi&leJi^PJ6kO+}k3@FsXA|zT!n_i1HaTXF9#B~1Ggd$qB>$}|hzaCJS`F?YODB(qyX7SDWz365||;smQsY+R<30b{;IyyNZf+ zjkBO@zKgE)=S%I|_qy)eyzEI$>H67OX&8AYjT0$p8km&5$zf?eH6ksSCvCKV;|p?egXLd?EwS?bj-Ox5U2RPkVAjl8Y*Bnsj8U9X ztWmsC%u(D??76l6CZ#JCs9n*8NVR{d0rf+}Q^lvR1cYWRr ztWKE0ierX~DKngFni1#Gj3#f57fbry%ey~z_u!9LFY@&;48^h|(TJ@h*7jrAwn*tp zZz6MLiHa=v5*G=oR*F@0{obi81(M58>n!M;;gE=BeO7`$JpJ|SjNUASfWp8w6ci2$ zNvq02p`q|lh$u`HDhd~cjKW5tqwrA(DU1|K3MYk>!rH3RQg|uEw61UX2j)ak`Ad_9 F#0R(bef0nU literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Seoul b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Seoul new file mode 100644 index 0000000000000000000000000000000000000000..312ec40a112d5ab54ea2d92d735735be4b27a44d GIT binary patch literal 531 zcmWHE%1kq2zyNGO5fBCeF(3x91sZ@v_w^4Ilb(tFxa6$<;gP@QhbP(Fe>@eI$at2- zT=87c=fw;Cf{GW2qD2|KcKq)0|Cf~AR6RL5DoGvhz9uR+G$>?1G$?dHG$@2X&H;rIhz5lehz5lg Ph^AeLaRGx;*OChWrb4=L literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Shanghai b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Shanghai new file mode 100644 index 0000000000000000000000000000000000000000..dbd132f2b0bcc8beab08e04b182751795c853127 GIT binary patch literal 414 zcma)%y$%6E6ov01AsdnK0RGwCh(;k=S&0xTQ;84_wi_?7<`F!PCs;~}D7?f(B^vIT zl7ch2`)zh+C+8E>VAZ0p#Q6&b$@1Vmt@shmEEPQ+dAwxQ={D8*Lz@c0P8P$BDh-yh zJRhox=gVq;O|{%Y*PQ{??_KRC8|0oVI%a(=qV1LMrEqU0h@_&_Xe`L@@k|6ZIO2E7 z93L|!ALb9D7bk4{9*EM0TpUDs5CS+32?Qb_WIzakkOCnFLJol-2uVX01tDw5!t~*5 M#r`q2S-#n^-;pXt<8 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Singapore b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Singapore new file mode 100644 index 0000000000000000000000000000000000000000..78583666698a0332b822c0cd15daa58abf60eb27 GIT binary patch literal 424 zcmWHE%1kq2zyKUT5fBCeP9O%c6&iprh`G9q1pkq1OF0Ljb>1|bH9x(N&t3=9Pg z3^G2xAq>GltZiTp!bS!l(ilWq0ew@$_w(%8yTSH+mmWHK zBBcHrm1c*@h?&W{`nCKB{ zs%7|qYMHyNx4b&51CtrO^}%7?dNZlpE=G0xnRXpK)~Kx`2??F{OGi(ebPlePZQg3> zvOY`K&#%($Dc9W}=48i@CB1WcO2YGRbmZZz?s@q{M=wq4UD@lp_xLTn`@)3m=^NIu zqt|3_^N{X~iR>$j=ziaz^nW=h1I|tvcpH}eA8RE3)GLXZkWOCBOFBNWFp|&bmBYEB z@NkutJXV&MJSlzQ&$Zj-QtC#7`9;;}J!RJ8Ifq-R>@!tWycTyHW~X?MGWQhsRaGLH zRskz$X2?v74^xi9u-Ao4`X7$?+wb?8Zh5YBS(%MIeJ@j{73>w21p7>4oDJ6 z7DyUM9!MfcCP*qsE=V#+Hb^>1KDH(yBqIhX*_xb?q>!wTw2-`z#E{I8)R5ee9Y;(9|55H05%X7wwpv!jFFREuFaQ7m literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Taipei b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Taipei new file mode 100644 index 0000000000000000000000000000000000000000..748873bed9a167d0226bad2246556c45432880d6 GIT binary patch literal 790 zcmcK1Jt)L+9LMqRd3J8VWKkFtB{CUAc^K$S{uE`Cvi&@iMEWfTEG7@5Vo^r2=mwM$ z1CBfAJagyy7XyRh_dYfQi{JJCzpj7(8}9RVT01*R<;O|1Pq;V*_TqcGwzt)$I=$nx z=-sgay;rqh{Iz+q@Aa93a-Rf}I#e+GSqCH2=I|q5LK|D^=(I(L=fxa%_sGd&yE+{l zma~aTbKbVBFZwpsWyQT*mE@@F+%Ab^&Z%hJtd70}%*{nWZv7s0x1Of&mnzM}>$^No zt(m7_u{Qm0D*3%xQXWQCYIsDuw^vL?Xhvr`VdaW*#sBFe(iOG;N0gQXk)d%(;qLN$ zJ@Ga;Qr+lCy}hby9A5lB&hLX2+E-(Py?y`Y!=B!4lZ6b3jED@0jEM}2jEW44jEf8$ z(~gV`jf{;9j*N~BkBpB5Kq4R^kQhi1BnlD+iGu`+X(J(_kXT4CBpMP9iH8J4A~Fvl XImASQB2kgBNL=~%x^5f2sLcHdVF6z% literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tashkent b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tashkent new file mode 100644 index 0000000000000000000000000000000000000000..6f7dea4abca3b703de677eba9a88fe02436b1ad5 GIT binary patch literal 635 zcmci9Jxjwt9DwnQMy*w$i?%UU>uZ!C1fdEll1UIMbjTp$P#lzkLnkMtf~$icz#-r! zE(&fU_W@j-T^#D*pj`xY(D;9%1;NS13wKXA61e;ltd=*X)UT0{9VWw;$$e^1mJ@5g z{o=UpbvwIZPv$(8PMqb^Z}*3phgxXeTB+Xaa%f*}>+I>K?mJr1{Rc~WU}sk6wp=~9 zmeoUrE{DXRW4qg9aVpg zl$H+cS30jjG*y?X2B*$+i8{c{@F`jD8**VerJ zyZ7GUi|1zOY2Xb%d|*cI-1iPI*3FUm>qcL>ppRZ&3dY7~{lfW4zt~p|N}~gQ>6aV0 zS)<)XCOE#)uTQLQ1}E2Jy8I|@##cV-iTZ{)wfst(nT9cqm;U5p@3*PbpXV0BFmyU% zTbfVj)<2$Y@s0!!uUhZh_Y(0~OsRY*e+aAW2enElb;fgcDCHWpv%R)Y964#;aSeO! zOrNW$%9JcadQ4_fW`S>1%8}9BwbshNH64?yk)|K5&&V$etIt*(h&G5iUZW495TY@n zsD$W*D1~T+sDBml_(l0rnu0g?nHi-?j2Bo9a;kW3({ zKyra31IY%G4kRB)LXeCgDMgf=AW21(tRQJY@`5A=$qbSjBsWNMknAE#dXW4e3Bm<& QqyB>qlVxdiVx*A#4Y(KMMF0Q* literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tehran b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tehran new file mode 100644 index 0000000000000000000000000000000000000000..3157f806b7d7fe650ec6726f31398824caf82cec GIT binary patch literal 1718 zcmdVaOKeP00EhA02NkKd+7c0ohIsaMJJZKe+Kvj2=~GQx+IqB@K4{Sw>eVg~LKnnB zyInM zyy52Znw#%a+RdYD^B( zQ%CoR)Xyb4?d=OCo*tI-?nQ|7zHmAJ(h0GkD_dtA(JFIStIVqZE?gBodSOAL%FasA zi;}LXrEl&@`J_NByPGfFHwHz{#SWc&GDPJaye{+G=8J-wVO?0>pqA&<>!OU0YDL_6 z>6to96ptI!C03a#c|S&$zU~w&A03se?nH^QtG9J|_Yzfc{F7XLpiQi4nWfiOUsmf% zdv>p{m3yxjxn_HcXDv8$(a3jo+3^@5n<@{qljV87LC9w|u(p%6_%!oKtQ-)+g#a zyt<+3o!U~>CASvGh;56f%Eq*A(KNG2H&1$|T0#!Uman0rb+}J&AIefY?q}+q{dZJb zZ=>9G=8M>Uv|I0Kk5zjcp38leYsEgF&u0Y$1_uQPj{2vcK+Cd)834~<%SsZ~7|U8x z7!YPz!evETR+bEy`15^kp2zZ-JJxnOZSzbqcQUv6_50=di}ii^^{3_^_OU`_iM(cw z$Rd$d`Zdc$)`=_>St+tqWUYS9Vv*G%%SG0UEEriavSeh<$fA)|Bg;nCjVv5lIkI%W zX6?x0k<}y1N7j!NfK-5#fYg8#fmDH%fz*K%f>eT(g4BW(gH(f*gVci*gj9r-gw%u- zg;a%LcU*$tru4i|t=jsdKim4U!|Uu0{$YIH zfs*A_DdHa&W5x9x>J#0c#_99=4e@Wf;>!&oI{qxRiqG#enySL_)z8HB@1*eUOV6e~*uWQiZH(Kn`gTGi2 zO(}MC+mN2L`HCIWK4QgM@A~659w)@mlwYIsU0*`t{Urd+lkL zI`zFrNBQHs`mE{AvG$B3l{#T_h&^-10_`bp_9w27*WR3Cc2dsUI(c@rKPBmq<-7By zof^5_O1;wLpA{OeW_5|bKdes8bL*n7}=@THA%PTd|ocTJjn z$iL6Z%x@I)ath`Agw-M|X3)tVTO_jkDx3vbUF5axbRPb2SmbXR?G$W} zQVTcjkcBnZl)o&~c_eT~J-RYi7Ws~-K>iH**o0lGIN?@Ve076b6cz6*>RPH64~%h2 zTIZ=HUH#7EyDU-K+Ub; zvYuY`)Qw`f{MZTg^!aqT;{6ZQ%HsiN)hk<6byJ%2Ol7r_uioLTUf3X>t-S86@vIUx zS>4Wa;|fKsXIR!=P7-U!os(-jZWHS+e-Ss_D4 z-SX#G=wGk@)teBL-GA@6ArUIXbZ9mR-%Bkxe7JMz)RY z8`(Irb7bqt-jU5CyGOQ<>>p`>tLXsJ0;C5>6Ob+-Z9w{fGy>@a(h8&(NHdUbAnic< zfi%R`bOdRMtLX{S6r?LiTadmWjX^qtvi_@$&%nsU#J~{30~BWPjR2_& zNnqge@eN_nHZV0d0Fq`PDIf?T!ImEoEet>l{)21-aX~hMXwq!uvH`llPS=bJ0M+&( Aa{vGU literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Thimphu b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Thimphu new file mode 100644 index 0000000000000000000000000000000000000000..a8bddb9fa333da5c60c48132507687b2da74470a GIT binary patch literal 229 zcmWHE%1kq2zyQoZ5fBCe79a+(`5J)4)n}q5iiy4}>i_@$&%nsU#J~{30~BWPjR2_& zNnqge@eN_nHZV0d0Fq`PDIf?T!ImEoEet>l{)21-aX~hMXwq!uvH`llPS=bJ0M+&( Aa{vGU literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tokyo b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tokyo new file mode 100644 index 0000000000000000000000000000000000000000..8ad44ba981a2d97d40d3de2c8bf29606be50aa4b GIT binary patch literal 318 zcmWHE%1kq2zyK^j5fBCeP9O%cc^ZJkbvvel>u8|K!<{8kYhnK$iWO`xtI&+d|gW} E0KK7P_y7O^ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tomsk b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tomsk new file mode 100644 index 0000000000000000000000000000000000000000..919b0031d1cc782d9789984e00f074fb6f17c4e1 GIT binary patch literal 1255 zcmdVZT}V?=0KoCHyt=VT_)=Q7GM6o#)@jvTZQ3IO-+hKpzhwbg3T2hY%w~N~#B6EXoH%Vx9jrVboKPoy)oZv$GG_&Tq*>Cwqe8 zui@4^Oh!yk)+K3u8~nWQ-P56|ie>)OndN0!QR*5hDgE&_T{bUbE&FK-?>r~p|5~3?5iWl#T zI}W|G@S3g^YhKgVo)iHY(le}QJs%?+dI*QTv~S6OIOMtCZ`0o`$6-?roNW%Ba_|fe z->wEgK|q1P00RXC1qB5L1qTHP1qlTT1q%fX1q}rb1rG&~U5$tWiGs vDTpbMDVQms?P}B%*mgB;3UCT?3Umr~3U~^7+NVwY7x3Lt{g-I0t9Snb_fHt= literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ujung_Pandang b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ujung_Pandang new file mode 100644 index 0000000000000000000000000000000000000000..3a5dcb27007e1a2ffa67bbf3a30095303b5d67a2 GIT binary patch literal 288 zcmWHE%1kq2zyPd35fBCe7+bUf$XWO)cET>Ps}oLl$TnOGdso1~$i&RTz>xm|q!LI1 z*#!*@91IL~6Bu~FYyltN5C&f$);6#JVoQc_&k#qDYA6UH!395{dj10e$R!{eQ0szU5Jx2fl literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ulaanbaatar b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ulaanbaatar new file mode 100644 index 0000000000000000000000000000000000000000..94ddfea5f2df592be9967734c16563c72e63b021 GIT binary patch literal 921 zcmciAJ1m1y7=YnZDiN2sBoepQT~Vc|dt3L34x~t22GU5x;0z{&Gl&WK2LodG2OAr~ zU^EzPE`t~uEb=Ev43au;V>4Nt=JaWsHfg^13y;mt)Qexou0P>&eERY_UFoOwo7aJ~ z@w8)A-tLI1%SFq5vM8z#CM?hPgs52yTD1#7;f)kpb(3SNJ`|7* z0l)Hj3S^_hshU!4vhC&AY(F_N{0E0-V0+65u5Fqf3)1L}%$r@|A)~u@(CqQ~jNZ}) zv(GV@KAg2@jwDRUk&k6_^tnf_Mx#+-i;w%`BVLFI^AOXLnXDMLL?NUSDFdOfaC@8e zZPmAhuf$IH5A*%}`HlW-QRd8BW{u1nnK?3dWcJAXkp@Tyqy^FgX@Yb?+8}+9Mo1^5 zRZQKBLo=ishjvIm4h@lx99kkhIW$GOB5jerNMock(i-WFG)KB4?UDY-4j_Ag>;ke6 g$W9=8f$RpdAIOfx)O&*L3jWu=B>DCB1U)TD-}#Kg!vFvP literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ulan_Bator b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ulan_Bator new file mode 100644 index 0000000000000000000000000000000000000000..94ddfea5f2df592be9967734c16563c72e63b021 GIT binary patch literal 921 zcmciAJ1m1y7=YnZDiN2sBoepQT~Vc|dt3L34x~t22GU5x;0z{&Gl&WK2LodG2OAr~ zU^EzPE`t~uEb=Ev43au;V>4Nt=JaWsHfg^13y;mt)Qexou0P>&eERY_UFoOwo7aJ~ z@w8)A-tLI1%SFq5vM8z#CM?hPgs52yTD1#7;f)kpb(3SNJ`|7* z0l)Hj3S^_hshU!4vhC&AY(F_N{0E0-V0+65u5Fqf3)1L}%$r@|A)~u@(CqQ~jNZ}) zv(GV@KAg2@jwDRUk&k6_^tnf_Mx#+-i;w%`BVLFI^AOXLnXDMLL?NUSDFdOfaC@8e zZPmAhuf$IH5A*%}`HlW-QRd8BW{u1nnK?3dWcJAXkp@Tyqy^FgX@Yb?+8}+9Mo1^5 zRZQKBLo=ishjvIm4h@lx99kkhIW$GOB5jerNMock(i-WFG)KB4?UDY-4j_Ag>;ke6 g$W9=8f$RpdAIOfx)O&*L3jWu=B>DCB1U)TD-}#Kg!vFvP literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Urumqi b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Urumqi new file mode 100644 index 0000000000000000000000000000000000000000..b44a1e19e9b1212585e55bd65be77665f4ecf6b9 GIT binary patch literal 187 zcmWHE%1kq2zyM4@5fBCeW*`Q!IU0b(hJU+K>i_@$&%nsYzz`$@6k!NSU|{j_4PnqW jFavQJLP#+32UrIK1JK0(AfrKC0>*RM04=i9HRA#R5AqyS literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ust-Nera b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ust-Nera new file mode 100644 index 0000000000000000000000000000000000000000..7431eb97fc4eaae4d8b4bd9449821d4d11a4b183 GIT binary patch literal 1290 zcmdVZJ7`l;9Dwl?li0L66w$UCqph{Z8rvqZmei!N+7~s6mYT(?lMm1!{1JzuU<*D# ztdBt)g7`qC3RN6xkfIWKa>}`EDFSog6)vbH97fO#-?1casB0 z4hPj=W3gFbGCIxVxN6w!?!5bud3yJSTISs?6;-KhrR(UM${)AdtLAR@EuWpvu9&Lr zb5HtZ%BsL2r0|Qv1eJdgHx)y5U+vH=d2^rV~xtf3R8y_Qxf7+$)>f8l}0vR5p9c zr6ur1T7G?#kh?^O-p@$u&pEwiazethuXN=8v~J5h($RC{dTaWMZa;KgZ#y$4+q(vJ z$AQbzSvR1&Iz+mi5#3YUFFjxPNUyzFdS8cS$HxkZJ@!a^DyS2e^0M<-u00vc=%IW* zuWSn(c58DkEZRz3MJL4<<{y_jT`r~0cbnU)WLP(fs8+&!1v|fdh&K ziU+I41jPl#2E_-(2*nA-3dIY>48;w_4#f|}5XBM262%k6lvU%3VvB(s@JP4R8j7^gV5YOGVdQ_NG`Q|wdxQ{DkOWGwv8??G9_yd}|wfWPcF#)vJ@ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Vientiane b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Vientiane new file mode 100644 index 0000000000000000000000000000000000000000..8db5e8a61ee9e63164ce7f07969557fafa982dde GIT binary patch literal 220 zcmWHE%1kq2zyQoZ5fBCe7@Ma7$XS$?ex&~Y|No3kObiThHXwN*$-=;pRKURD;~T=@ z1jO0~<{$|m2qA1dP%qdDo*!Tx3=BZi|A%dBJp!UZ)`5iUfoujM?c}ln+Ha?8&IJIu C{UtE~ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Vladivostok b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Vladivostok new file mode 100644 index 0000000000000000000000000000000000000000..80b170bca4100c8915a0eab6602589e22bce9ee3 GIT binary patch literal 1244 zcmdVZPe_w-9LMqRbk6)*M9ak~J9g5AhZq><{{diU=e+ zbSRMsOzL3KAq~cEStkh(br~J3ymSen4jRPzy`ME0b?Vq>Z12a%Dd_LDmf)FySgAp6yU?!tdP2JYxJTRT>b1jK(~h5_ zo!%Ph{P0P;eyqxY?7Vj8auS;UC_S01gm1i(gA)(r(AjC}y_V6w{+kjxJ*kJAhonC; zsz)l~5^YRt^y_(zmG^1vZA_1TZqoQOzYZ+)O5*kgO~x}TWBGhu9OY$&hqI#Ov2K0I z7p33$^V;Qfid>m8|4|veBj$SIxx*zg{!prmuf;nKbEo(oG4Cnfm+FB;QvAU#@mrR8 z2Ki;;D9pYtyd?kOh*y9AocRm$95v;*xy_MNj-7J!cFplq2v8VMC{Q?1NKjZ%Xi#`i zh)|eNs8G02$WYi&=ur6BHG~+9D3t6PP7G2ERt#DUUJPOkW(;Z!ZWMA9b`*LPeiVXs z4MPe=yM`l$B!eY|CW9w~D1#}3DuXM7EQKwDE`=|HFoiLLvR%WOLfWojO`%QUO(D); WPN7c6jDi1%du7Oc6vC}mu<{o<5B_}s literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Yakutsk b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Yakutsk new file mode 100644 index 0000000000000000000000000000000000000000..220ad3db5fe8c36d1c32b88fd789ff9c71d3e94e GIT binary patch literal 1243 zcmdVZO-R#W9Ki8sIbTqT-=(ycxze?4YIBur>9krVx=B%kC@F$o=#3arln^QOdXV@X ziXb}l9)xu1;Cfvi6DOxLtslGx6B zy4H70+G72>E`N)(R~^#!siWGFw?R8zZr0ApkjC#vG%>nfx-NJ$8Gmki)9JKv<;}<( z?);pipfKk}?i+v3i`;HwdT!W%)TH{1o%dgJ6&Z6^;WblU+BZiLRsx z1j8oK5VS`4GULh&XP&tv|6z;2{r;T&g=w}L*=`0~j%+)!^^SJ?kpz$okQ9&{kR*^S zkTj4ykVKG7kW`RdkYtc-kaUoI9Bo2KMo3DIHYX%0Br7B>BrhZ}Br_y6BsU~EBs(NM zBtIlUN1Gv%qNB|bNfOBtNfXHvNfgNxNfpTzNfyZ#Nf*f%Nf^l(N!iinj3n)7vqsWJ b@p{@1Sy4r5W?280hNNBAoK&O2Wad6ux*_e kK{UuYAR6Q(5Djt`NLf9Q%|M~sxNN{Kw$nAUGB)4>0I_91JOBUy literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Yekaterinburg b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Yekaterinburg new file mode 100644 index 0000000000000000000000000000000000000000..c1abb935c655ad4a8288bc3bd9445847e832f270 GIT binary patch literal 1281 zcmdVZPe_wt9Ki8s>S~)FBr2_Ct<0t_Yprd}nscSjtO*Y_2tsL)2}PG8DJU>vR8SOA zr|MuCp87K(PZb$>wE7*ogj7&oBJfZh3LESBzH2b*)UoH~dB5-byxU;!`*~CQ4h;s> zU!%&bFd3a@a=iGA+1=dl^xj@Ho}U=a#g}+5W|!7ZdTJcc{53zmj?{kol3h0A^(>!0 zk##@G$clSIQg>@mR$kgGt4{9_&yiMH-PbH@l5VMwR>@jlP8!^Evaa&Icgr(S8_qe;E~?znEben)S}T+Qfp!V!5)yIu>B!qgX`PShEl*vtb;hHkV_x0%xJ<{+Id%JuSsg$4S#QfI+1~X+ zcO3X2oed9lSI3kj>{oSn{g`ym-It#73)1uQitPM&Sav-)D#_{dy7%%PNhNLZ;e0-? zY-JVYh0VU8WLxMcIVrvH=dsgnS1R(x+*TEQt}4uNTsf3VrETVZC$y?A?u#onvr_yF z&!o7ns*}AbrOovDgJy=!4Dqu{*$Sg@QrM^d;hBH`{YCS4^E`XX^Jidy%Q&D|pm?xq zOi)}`?qr3{f0WEKxjBOj$LqD7GlRtQun!XB2A`ZxnMB zcNBXRe-wihhZKtxj}(&>msX8UichP?D8(toD#a_sEX6IwF2yg!FvT&&GQ~5+G{rT= oHpRD9W1QmLs%$YYDl20dKP)N&o-= literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Asia/Yerevan b/absl/time/internal/cctz/testdata/zoneinfo/Asia/Yerevan new file mode 100644 index 0000000000000000000000000000000000000000..4c4e045bd3a47ef74883c0ec74261e8c6a41dc1a GIT binary patch literal 1213 zcmd7QPe_wt9Ki8sZ7Z7+UTT|5`(w7|zh34xR!v=+E^7;k(IGlKQ3m}vyo6APU_sU? zqN0MNsDpF}sSX|jGj`}AsE6p(3Vsj~6h#CTkp&Bejc9vf$jIr?>~AZ zs{Xos=7h!7WfuGDv*vL>IK1=S%c}mB;hV)(ff>tRF`f3$x*i4It75Pew`!)&7ei03 z%IeW`QhRGq>Mjn*nlt-k?TL)6JCKz1*@)DqYGgxmr8IeRisZXd7K9T)t%bNGu+4}90#hgL{ePf2$l`YbydCUj5t zbLsWo(V6-&$$T1@KKBjjo4GB!-kg@*4+@fDs?kzr-`nr1P%4>LRrAmJ6PGzz{GMzsubQkjv*KpO z_!{MME@$gJ^8YZ^Z*w0rKdj7jkqL9ml#xjz({?lyN2ZQU9+^H;08#-`0#XA~1X2Z3 z22ux72vP}B3Q`MFjH9UrDF>+sDF~?uDG8|wDGI3yDGR9!DGaF$DGjO3(G-VN=V;19 z>O%@dDnv>|YD9`eszk~}>O=}fDn&{~YDJ1gs&zEwBK10&f{}`ml98H`q8&}uNZD90 Qv;Y6=_N7es9W626Z&TF~XaE2J literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Azores b/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Azores new file mode 100644 index 0000000000000000000000000000000000000000..1895e1b1e19120123e67367e55de3f2a5dac99cb GIT binary patch literal 3493 zcmeI!XKYn<7{~Eb8B&HmjLInEN@Y|Ebg*sVFbX0R1d3FKDAZDhj0%Jywm}?dgO3Jh zfgXlnDwH7zN}&fCQd$avRgq2EAVWYvg4h4|5EBv;<%Pbp&Ap#;b8pg+^!I(@`wvfw zwEpr{!MwtQuS4d+&(+e*)4M0LoQ!TWHRJbUXU^O}otu}b^HOJNX4YPD29MSG>7{i+ z`)j&z^jo?pBvd}>nJZbP%W2lt&tzHN7Rg>>%W`L=u6Vt!tep9VtQy-^KTlbttDp4g z+Q?*G_uz3|=P%MPFK*ME?cd3Ubz5a)=2Xr7aEZ7X6=c(-neuh=6xp0GQns{vShu!{ zlWlE2mv0ib>o@yuXweueAxd^Fonh_nJ>S~>$p-zlZ;*VOo@DKbe8t-HYNqae`lx)@b&nLa{@MOM^pO2S z^2fXX)3+MfXUWF+Py_4U)ZNpRxFmOh3oaDkG|Gv*>m;f$%`~~R;s4@{r-T`_mwDF z>K?!EH}AXqaZjHMyuZxfewQs*{=fPz@Asd&WLbXyiH255zyI>3fHHo6@e#|se)rG3 zV&=yR5MH;;dwAv*s|rtlzTQ19-g?|T8iz-iN2Jv#JlyIR8_!#;0KRzk{$+Ut1jPUI z0v+NY499eNsv*gH{dzwYZLbK|gX4#Q-_cRNSth}dLdSvZA z&Eg}g?`f7FS%0JeNCl7*AT>aW;AyIWlmV#&QV66HNGXt7AjLqcfs_NO2T~BEB1lP) zns}O`AXP!ig46{m3{n}SG)Qfb;vm&Q%7fGgDG*X2q(n%KkRo}SD)Hw*nUFdmg+eNY zlnSX8QY@reNV$-DAqDd^6+=pf)C?&aQZ=M(NZpXaA(cZ)htv)!9#TD|d`SI}0wNXk zG$ll8h!hd2B2q@Ajz}SqN+P91YKasRsU}iRq@GAYk&1enk|H(rG(|+9Jh8s*98tsV`Dsq{2vvks5oNA|qAyG-XEWj1(HFG*W7$)=06DY9r-F>Wvf} zsW?({q~@Nc=t$K)P1%vUBZWsQkCYy%JyLw6`bhba`Xd(ras?ol0CEi=7Xfk=c$&)q zxekyE0l5;8O98nSkc$Di8j#BYxgL-U0=XiPO9Htjkc$GjDm=|)fm|1!=E6X(4CK;4 zt_|ekK&}qt@<6T+PxHrZ{eOboIZF5s`SaBH_fC+q(dJxf8xd`em9}AVQB9gR32z!6 M78eoj{S;C54CG z+X^jnY%Z7UqO4)gYGW9gH$D8!hw0kz=Nw$L+)Ov;rt^|Y;+3a3^p7@sgc5parEM>-k-jTLbf`L8_Uh0%P?M9t=_5+hTl+a1v zbeOw7Yqx11)tb9|pR@OLm6&^*=h?}LOp{)bVecy*H&bTav{Pqh$o(nj?6jntGVQM$ znsNS|WF8;UtRqKc`d35xz}`<}M*C%({q{DQS##1p*s|9=6ggxcUb4kJlK!F1ncZk| z#=q9wVASM}?9$nPU zlVu+Ze<_bo@N99$Po{Y6yq$Ob3sdsrur2-lJv0A+)dkjvvheM7HZ-M`Ri>{EUI-8y+8f4jceR3;6nE!r5(md1;f+LV(lO+SaUdBUhP zf1ai-W5;Ce&OE#B*9+$5j!E{F14m73%_aNlj{RnRt&99H|^B-PhHQ6z}V*N6Png^&<;_tN^kE$QmGvfUE+t49Gel3xTWz zvJ}2P>L6!tr6J$}4RY8^oSr=qskd;A}23Z?qaeUqCAj{+H z)(2T2U$;WY5+Q4ZEE2Lx$TA`8ge(-YQpi#vYlSS9uUjo-xqRJvAq(c~Rt#A(WX+I8 lLsku0He}uK|FdvGH+Xa1;N``NLg7$BUaYV%R2V7<-U7n(2}A$@ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Canary b/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Canary new file mode 100644 index 0000000000000000000000000000000000000000..544f443a096dc1edb447ff85e71d0f17e40a227e GIT binary patch literal 1911 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 UiL%?Dn~|T9<@RT1VPi_@% literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Madeira b/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Madeira new file mode 100644 index 0000000000000000000000000000000000000000..e25f8a599622cb45cd2afd7bf739e4d1ed5ed589 GIT binary patch literal 3484 zcmeI!X;9Tw7{~E*Gt$uXD4HTJ6`5G5e{eU+jKs09MQ@4=nY$U95;`s!r!?D~=8>Vr z(8OG77^A;tE-9M1;(}XLnrLb6+ch;Q#^`)cHDl9@dQ-2uckcb*l{@1bf8QtA=gFb* z>MxI*>?gc)0&Gd2o`+`K4H9%_=jq3ul;jGmV*(w^8NxA86*jR%+hs zbll7vHQCIMj#3LAUaa!MuA00{v(<-%%T)gR@#>@8RO7!?Q!RdFqFOTAGaskFX_h`x z!z_>QV^&oA(yS=oY*wCMVODS1qzYCnS8L{sG;80UsXlwBT&){FNqs&%O|4H!RU0}+ zn2l{as!i<|sLd&#n$7#pn!-SWDZJ3kY&|?iZTn<^+ID7fXuIhh+J0cM+VMuB+OfX( z=%RE#RJ3u2**Uh6+PP?KXjk{F(5?j^nca_7RJ*753hjx{2<>@shS}SDull0v236ed zkoRSiUEWub>%6aTT;hHG(>!nA$!zby%3)r~k}Ut=dsF;FSsDJfFAVX&OYi9)9@xb{ z(!H(!{e4aRqw#h9W4BfIk4LrfPE?NZPLxG@Cr^iar}me5r?;N*&U{+poy{xq&b_nN zJO8Thg(lARE{w?Xei&5XU+j_ZUrL%7_EHgD*{4BMiPs_~_2c&j|9a8(^8mV)nAUASvuGC#WL!wp} z=z5Ftb^Td$bc5-l8$SEIz9lVP-`a1GzAZVZqdRogx5u{Djp{YlcT}mP8;2!I!*vy| z5BrDDiuU)eef^{Fg;%=qnrG!I|KYQ|JQSmpd%xapiwaaKFTW5{Rj&Q{k58)VfL6-B z*W_7T0N47g=6peUSx5Rv1}gWQ~zUMphYFW@Md_g+^8yS!$&r!5Ln6{IXk zU68^cl|f2_)CMUIQXQl`NPUn3Ar(SOgwzNrlG9d+{~nZy2X*2>p^!=;r9x_j6bq>q zQZA%kNWq-8Vo1r5nju9)s)m#esT)!_q;g2WLH-si@PI6sf7x78R)~QdXp{NMVu6BBe!Yixd~B zE>d2kzDR+Q3L_;(YV5Q{Myl+zWk%|Z6dI{CQfj2uNU@P>BjrZwjT9WII8t(?=1yC5 zr0PyvcBJk|;gQNCrAKOy6d$QRQhucV$OV900mvnQTm#5OfLsMmdl?|t0dgTAR|0Y= zAlCwNF(6k1aycN^19CwiR|IlNAlC$PQ6N`^(_R+Hb>XxZ26AN}mj-feAQuO6bs(1q na($@(&yU{^l7H>|2)EaX$C(n_twpm|&AjGuvEAZ4ehU8;Pr47v literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Reykjavik b/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Reykjavik new file mode 100644 index 0000000000000000000000000000000000000000..dc49c32470906fb2ff94fc599c73141597443f98 GIT binary patch literal 1188 zcmd7QPe_w-9LMqBnvSrDL7-$%-zYVZVEsW5ifFMq)DE#h)Ws1MBn2r&w;GlZ{UJTn zY1KFJ6#auhFm?!nL``d%wwBpnb83Gy%Vt^Y_kMQh(5X&64|`q@&$C_jd55>}*}cO2 zad_+#J{$r2;ocjymy?mB8f#o&&L@sHT&Ud=z1ZvaYN*~^YN=>wUR@S#Zav_=8!R?$ zYs#c8Rdl1hbiKCUDV0u7iFRJ`>%IOi={mJUyW`j8{$7thh&4)LQ(7O^U)7%S4t=!i zjP_P0q%TmTkLTT#WJySqQ)eYLXTPML9FnJlMcUuGO`dhHl7Xg!`utj2A%pjB;R_L>i4u;r{e)J zGhDw2?@ahF zM$F`XVzTyNOk_}GRAg9WTx4KmWMpVZJ2o;nGPB>xJbN6z(~Z7He@7bBxodR{BOc8u%-J7 FegQpVSd{<( literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/South_Georgia b/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/South_Georgia new file mode 100644 index 0000000000000000000000000000000000000000..56b383b16db1ec8394d33e31863e468ed4bbc9db GIT binary patch literal 181 zcmWHE%1kq2zyM4@5fBCe7@MO3$f^JT|34$+|NnOnFfjc8|M&p|i;r&zgRTL@j1a=6 jF+)w{_yJ^q0MNkynQea$fY>0@8E_lVWdpRx&WH;D2q-0^ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/St_Helena b/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/St_Helena new file mode 100644 index 0000000000000000000000000000000000000000..6fd1af32daec193239ab6b472526fd3d6bdb2f76 GIT binary patch literal 170 zcmWHE%1kq2zyM4@5fBCe7@MO3$eHwPk_Q9h|Nnn1KvF=!;^P~_;10wf5JG}!KfpQ| Q82$qRep9)C#v5<}0M)@5+W-In literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Stanley b/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Stanley new file mode 100644 index 0000000000000000000000000000000000000000..3649415bd14a3356419efd7340b430e645509e0c GIT binary patch literal 1251 zcmd7RK}ge49KiAa(qUPL1_e%2XQilVKAp~V)1EnWEyGn_v_mr@G>E8Mr&&Qs5MOr2kcZJM@-d)?CJF%M7p3~rnO5wS`5mWcMEFvRk3_LF{Pf| z*K#g!N_ag#r1wQq6@E?mif$ef8=j5(iqCh6k{kO~>5+i+jkc+>Xo1`~RH`;rEy>Lh zmnvWNR#w!Ph>DLBveILT%IEWT)tC38`d-rBl1Yi0OIPe#H7>TE7_sXvjta5&pk06R zx@rg}q`&{HYAhO*O)W#J>3gSa_C{6nn{v7BTa9XYkSAMTS7(A_v)RzY?pWLL+u8Q3 zRk7^@GjVx(b*!WHR(!|c=U8Xqg?PB*X)L^SEZ$XiH`X=3CmzY4%S0xRW_NzNlZjsI z&F-2V%k-S7&nC3iuACLi9(S&JmS6na+3nVPCS_U9J6G$M8P`g!)3&un>xHaqEjO0A z;l5{gpS92ITH!al(d^&H*!TC*Mt+TU(HvOjm+0Yho+L7AWZcNek+CDAN5=1H59azc_qvT`(OA$d8P#E{I8 z)R5eeki{B#&f|q>l+ROY1-EKR;yt8}0u5pBDRd_W%F@ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Australia/ACT b/absl/time/internal/cctz/testdata/zoneinfo/Australia/ACT new file mode 100644 index 0000000000000000000000000000000000000000..aaed12ca284d69e3a8ba25891701790bde7f6743 GIT binary patch literal 2223 zcmds%TTGU99LK+J!U*z^#hcz9juzmF#>=xf&*QB8Tz$G2N;Qq)uamE)Uz1*(Qzdx_b_iJT#7Du6<*L*%s z`Tu<R0gAQ*YybcN literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Australia/Adelaide b/absl/time/internal/cctz/testdata/zoneinfo/Australia/Adelaide new file mode 100644 index 0000000000000000000000000000000000000000..4f331a87df4ed78be0d00b1a82b5c66c773069c9 GIT binary patch literal 2238 zcmd7S|4&tQ9LMo9)5Qhd39IWWYFS5lHIgf{~M(p2z56rtf2P3g-W z?_zUiP4Aprr4iWbhg<`7ZjHI5qGFo%ZEcORjIGVAt*ou+^E|UHSAT%#?A*t>=WciR zhx>X48iFl_)_)F{dBVl9%Us;Y_L`RiE8l$ez=^EOB4K8oZhaK?|DJYGGHY7A^AW{MuB#Gi9zWD719JpD|iI zCq;_Cn$nU#re)!YalPxyNhuxpK^7f9DP`dgWbyt1@osoS%AX$9B^A5Gx9*TG&3j!d zd||!YRV&LfTXorQhh_PN{Zjc^zuYsnT~>^ANY!Ao`1e)I%091DZz+(P&PKg=jbCeP z%5;@CUjv>ry)P|6SI>;n)ziP|{TI(`-Ph-|e&UoiyfdN?9Q{@rht5h<*qDfhGf6AB!slp5!BX84Z3l1g$7TTYTIb8w!f9C55E$x z9nV|(NbeSh}>Zhfv@+a9;GAWz0&&cC9os@3(+tU5}fNYuCE1@s?Wb6AO z={XjZZAV_z?FYm9#GY>5@l>ns?5fi!$Cc9=eGQzJwPUyWBU>*FIn2L09J%_w+_x%V zmHU(yPm#yg+ z(lDfBNXw9(Ax%TNhO`ao8`3zWb4cru-XYCHx`(t6=^xTSThl?Lg-8#PCL&!#+KBWK zX(ZA~q?Jf7k!B*@MB0h;6KSZe=_t}tq^C$zk**?bMf!>~7U?X~TFc>#x^hOlu7T6C zp8V1Njk~RAySZ+=xmVp+`AP1-y8BOftymuCmMkptkmMYHfhVsZ&y(Yy5BWv0e*=T+ B3P1n= literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Australia/Brisbane b/absl/time/internal/cctz/testdata/zoneinfo/Australia/Brisbane new file mode 100644 index 0000000000000000000000000000000000000000..a327d83b7696f39c01a9b5cdff1d4f0fd4b1f94d GIT binary patch literal 452 zcmWHE%1kq2zyPd35fBCeK_CXP`5J)49KU6A=Il}Ua5`i&!|CJU1!uO0HJn{;S#WMa zF~j+G=>p~g%LW!+83t9)vka>5Uoog_u4hm`e}+Mmb0UN0`gIIUj8MqT0)Y$+{S`oS z8D?!@WMN?FS-`-F%=YmOVQ_SH0TIC=AZ3haW(1d-8mr9BP%}jyPXn zQ=SG*kC))mI1T=7iH5j?G~}~b4GsT6L;C_XZ0vo#{^b~%cIkVWzB@o>oEVhwn#(fN ze^erJ&&n*{UYQ-;D|5;lWzOGE%iOFIxnbHqjf`#3$U)V4E|1RZsn_`yk5>wHxv27PMZs}o(ulq%AiQ6LyMHeJtY+MqP`Xq7qQ%MT-OVY7-ESt(e5M3<$$ zriBIVdRK6nERV0%<-Z@56+a%7qR;or-Ge)2Wq+d-_tc2zK#8pC$di(7=~CKMrT47$ zXjy5luFgwSuRBKXjfv1TGXr$Z#IJha*kvvM`l410pVi8D`}O`4-$_;P1*!JGCpFq9 z5BPdy?PkBMD}PEJT+u4)vl?W>tyQuy(j%K9d|K(1q9{XmK~ycw-q zUJ2L6=N)~hZCoF2`c|9jXUHQJ6VhDtvuw>Ckw=rx%VRg5k(SW6rR9%q**3agd|!0P z_78m0da_P-9Dh-F9&XpiJ6m+u6Sca#xm*KW|DJ(CQ#@T$eQ>hp9B0=)^J{iq=yjQ& zcDw)D`}~5{UMIg`nU{}UE?yn)^uV^&}j zG9;@R6EY~P85J@tWL(I=kdg7f85%M+WN=n9I%IfOGd^U1Rx?6mh{za`K_a6>hKY<5 z87MMRWT?nkk-=KcXp!L}<3$E+H6uobY&By>291mw88$L*WZ=lik)b1FM+T3K9vQyX zj2{Vr)kFXZfz`wS2?7!YBn(I#kU$`jKth4U0tp5Z4I~^$Jdl7`O+=88SWQf~wB1_=!k8zeYLbdc~M@j(KFLvA+bY(heQtv9}+(#fJg+95F#-|f`~-X zYQl)b5eXy`NhFj=ERkR$(L}X_iNKBESB2l%Pup)6q0*gcz2`v&^B)CX) zk?8x literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Australia/Canberra b/absl/time/internal/cctz/testdata/zoneinfo/Australia/Canberra new file mode 100644 index 0000000000000000000000000000000000000000..aaed12ca284d69e3a8ba25891701790bde7f6743 GIT binary patch literal 2223 zcmds%TTGU99LK+J!U*z^#hcz9juzmF#>=xf&*QB8Tz$G2N;Qq)uamE)Uz1*(Qzdx_b_iJT#7Du6<*L*%s z`Tu<R0gAQ*YybcN literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Australia/Currie b/absl/time/internal/cctz/testdata/zoneinfo/Australia/Currie new file mode 100644 index 0000000000000000000000000000000000000000..a3f6f29a49617167750848c71e463faf6f3974fc GIT binary patch literal 2223 zcmds%YfP1O9LK*$V8lr!%PAKnw317B058ZXB{e`$NsPlaMMC6anFm27%hPXWo?c{j zag$|Bq%nHqRJv#zi;K@otZtKXZ5NVy={G-J^#-Rg3;O!D3?1Tg>afoA<(?U4JNE<3IgU6GB%s@#Ncztv#n3I=eL~ zZ$LM8?AA?5hc&sXQIr38TvKw3G&N$C;$}2h+&9@u@Dy4??|MrdO|@y^0-HYQwWOvL zyZJz$lB+{D!$xf8(u2CC<$K*abEj@A9@eaJ>y(mqR4Ko{q0}EoE$zcjr4OI7+h5zE zj3YfZd;c2w_J%F9Jx^JiS}c2Qjm@dpqq&O~+Ps`*&7YoRIa8J^=c;VM#SG=1{o4G! zV|GXXJ9g(lx-IM()uKb=E$@j_x-0aPE#AzPQe#ENJ3|P&;F}v^NS*>|xSZh1qQtgvRwXUN}bVntmy>=Fxm>`Cz_n9Gqnj9G_|r9=^^tJ#*O}vhQqj z@CyrWj8<#)C2c7lQ=9*DwWkefYka@9#T?PL%P(pB*gkc9W_tMDR_%DRUXS$cwMV-{ zw)45o7TQ&3k8N3Po^gL&5t09aOWO05^GDWGU5b=mIOd7@`{c>Wl7N;JlyT$-c+KPC zRN&utvd?+V-N_~Q8`3q0c3)&NW;dAaVD{tM*$`$&m@Q%UgxM57$F4Bj0`}$F*%)SL zuAQx6_U78z9Au*eS48V6U#7%>ui1?Q9pb zU(ALvJH~7ovu9w_m|bJG4eT4(IIweI>%iV!JDUe~kJ&!3e@p{_4q#dU^Z?TYpbMBb zVEOk>&?BHpK$n0v0e!+W3ezb}t1!L7Gz-%$*G{`I{lYX1(=klTFg*jB z26PQ*8_+kPaX{yQ)&ac(ng?_bXdkA3uAK&AI*4f@riYj&V!DWFBc_j-Mq)Y%v=Zng z&`hA4Ks$kcx^@~0bQEYQ&{LqPKvyws#q<@^SWIX2e+aFY`p(YIqQ4m>*;&49UsguR JJd`=t`zK#J`gs5V literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Australia/Darwin b/absl/time/internal/cctz/testdata/zoneinfo/Australia/Darwin new file mode 100644 index 0000000000000000000000000000000000000000..c6ae9a7ba253089d4fcdb9668b70aaad20dc94ad GIT binary patch literal 323 zcmWHE%1kq2zyQoZ5fBCeP9O%cxf+1P9KW?o=Il}baXMrd$LZs76=$}`cAQ=AP;qWS z703B@r3xlSC}d!$n*dbLFnI+dD+5F83- FE&u@na1;Ol literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Australia/Hobart b/absl/time/internal/cctz/testdata/zoneinfo/Australia/Hobart new file mode 100644 index 0000000000000000000000000000000000000000..07784ce5d751f040ba7ab43713f32cb92ce9afb1 GIT binary patch literal 2335 zcmds%YfM&k9LK*8ml5P8%PAm`S_v2;ctJ?TOMsw~7>@{~NQhi4^Fa{F^659Vp4MWO zxnS86ZH(SHkS^NhBC?G&0&DA@=BTztH*0IAL!|RLt5?0~ZR>M({-3k6^Spb$A8%=G z)ja)!Q0EOdyx`nCPcY{=@=24ubY}Xm{odEq-?!2C!Koq}=*aL5w$r}8W!$QW#D70Xjgak(?KbD|CM7oqY;HrQQg+l@>gH0LSM-GD zFI{2_(rUCYHqO$ftXA5nY|-T;rJw)CGCGFst~2l1;-1;IqW|~f{r-97eRfc*`*v&1sVc4Q*r@!L zT-_7M(7HXdRp8rT>&tWO-hxF|xIDqUDN(jzdW02C9I>LYpKRl$3s!t_&`QqrSZPm} z-FN!DHoZEa&8=^%?8#1TX=+n>&2zfHc)u!g>$Nq#Qk4lCv@J46Rg>zh+EZcGzZF`| zP?ptxw9vNq&awwiPPGS*-C#SOy=o8H54O|ymHD=ZsjlRTcI6GLKI2O@B=&1})EPB~ zpHSn~m$hg388v-jdiec1?R~34k90TNqsRTW@6b;3?=QELipVwb=+fqh~&3hdOivsKJqT|1k_?AEoj zUCe$l8wPd^Y#G=yuxVh|z_x*X0~-f+?%LTpuy~-1Je+oBbb%|J;5{u=nAGSKwmJ8!E^>_4W>6h zb1>a;?X(BeAD}^)4q;k^=@F($K$kFW0{Vn$6woP5tAJi%nuX~Wrd>e4TssW|ItH{1 z=o!#7pld+efW85Z13HIk9j14f=3%;rX&=p$v=itj&`?ZAT{|ts^c2%nOjj{&#q<@^SWIUzt;O^fXfDuQpuIqUfd&H| zcI~tn=rPb_pvyp;fj(mzjp;O|)tFxE{}k*9Dn2JQg^nlXr=}#QCZ{CjFFwzXdtjr!Tm!19pS#fM?Rz=q)KoL*CX6)$odR*aOX56#8Iz6M!q~Ext zGvfD}jNg9NpY*OV6Iw5-%(931+yAt_P`uHXH2Ecd3i|BeX`#a-m2I0y4IO5&MnkMZSzg>k!)SkgI`E_?7mv~>|d#Pa9LH}=#)i&o=}TBZ<-~i z{?JveXU)<*$MiC3HOnKr^w$+z&5F4zb#-WoSvh{TUX_?B+ zuYS}Gy-h}LZ_r!*j+(9K%k;MP?`8W5rFI;Q$hW&n)y}$kvNINo1>!#Fe-4OyN6!I{ z(=yhck<)z4vG0#}2I3v(&?#rI;~YI5_^7Bj?93=A3p*1$FUz&BuK()sjs8dY?FU0uqC-4FZY6*M@<_fdqm?f`o#^f&_y^gM@>`g9L;`goK2|A@LyrA`v1XA~7OCB2oIp~g%LW!+83t9)vka>5Uoog_u4hm`e}+Mmb0UN0`gIIi0T~apUKTTG&p6ef zbE&^Uw_;5L6C)Hdvp^sdh+<&qUIVm{Vb%slAiHM)11B=u$2Ww*(bWY+1c!i>F*1Tk zh7iL35eF&*`{xH(2Lr=@ASimf=n9Ai`43D3{RpB#{shxNzk+Cxe?c_J&mbD)Zx9Xg zJIFYY|3Ne;3_t)B4qzG>79ao$4=@c36A%D}3z!Cm4G4h32TTLQ2n0ak1foG<1)@RW Q#X!vf;{pYsuAu=J0Hh0uumAu6 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Australia/Lord_Howe b/absl/time/internal/cctz/testdata/zoneinfo/Australia/Lord_Howe new file mode 100644 index 0000000000000000000000000000000000000000..57597b0b9743475c547021ff8cdaa0049729d0e0 GIT binary patch literal 1889 zcmdVaT}ah;9LMqhnRQ_o>wzXdtjr!Tm!19pS#fM?Rz=q)KoL*CX6)$odR*aOX56#8Iz6M!q~Ext zGvfD}jNg9NpY*OV6Iw5-%(931+yAt_P`uHXH2Ecd3i|BeX`#a-m2I0y4IO5&MnkMZSzg>k!)SkgI`E_?7mv~>|d#Pa9LH}=#)i&o=}TBZ<-~i z{?JveXU)<*$MiC3HOnKr^w$+z&5F4zb#-WoSvh{TUX_?B+ zuYS}Gy-h}LZ_r!*j+(9K%k;MP?`8W5rFI;Q$hW&n)y}$kvNINo1>!#Fe-4OyN6!I{ z(=yhck<)z4vG0#}2I3v(&?#rI;~YI5_^7Bj?93=A3p*1$FUz&BuK()sjs8dY?FU0uqC-4FZY6*M@<_fdqm?f`o#^f&_y^gM@>`g9L;`goK2|A@LyrA`v1XA~7OCB2oIzjmwG<3Fs2G%z2S7+Ml$T?v1c+h>UqA&b>6eGmMM_$m z%$Oq0=%T`CO>-<_wXs5Ebj^bSvMs!v;XH=7j0d1+xk3v{-0;>p7*_azaM{j zZOsDxgJAawHym;|&y&p^?Q36eZ|{x!dC>o^1_w$4=g$<|P*+CaLPvv!TVete0~r=H zX}W?7Vl4RAbPGwoVIf~cTWI)Y3w`f*3%lBHx1Na7ZC`z>NzKbt zW}oh8+OIofPiksuji&ywPZ8<4inwyZB4<`xdm<~O}*Nj-IzydzU7M+z-fQc53yR8m;LnQU1|ft!>HB!;SM)5Gb;B6*;!P;65u{7H|HP zC@YE!v*PgUR($g(E4g~fN-tlqvf(}}?>lXeoV}<=-x$({why%Ng>G$X>QKej!+NZA zuPSpJRFz(>>i8mUj?7WblsenutF$e@6x!C&EUW!2&9?Q=vB%$;W>1{F#h!d=+@7)@ zY*>25yE9|-YbvD8G*EKQdKX6Gc-@8Auj-B=eNiTLN^zYAW^8H$#oyAe;=QW>? zQ~rP7NvnI!+sQTW8`4cjL&Skd%x*lp?O^uf*=-23Bg~dCd%|prpJP{;Z2|l8>^6qk znP;~(%-%e^&0%(j*&eVzV1vL8fh_`i1U3om64)lNPtR_nz)n58tz!1-*=-iHThDI0 znEhfljM*_}%a}a_o5t)K*fy|lVB^5ffvp33_v|(g?B286KCpkF0hkV8T7c;RrU^h7 zFm1r}0n-RfCorwR^un`i2BsUHT{|%Sz%&HY5uhbNPk^QXT>;tx^aaxxpfi}(V0wdT z4$vLXu0241fCd2_0$K$02xt<}C7?|}pD>NWbPCfdOs_D_!gR~CYZsUB*HECNKudw10!;#hcz9juzmF#>=xf&*QB8Tz$G2N;Qq)uamE)Uz1*(Qzdx_b_iJT#7Du6<*L*%s z`Tu<R0gAQ*YybcN literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Australia/North b/absl/time/internal/cctz/testdata/zoneinfo/Australia/North new file mode 100644 index 0000000000000000000000000000000000000000..c6ae9a7ba253089d4fcdb9668b70aaad20dc94ad GIT binary patch literal 323 zcmWHE%1kq2zyQoZ5fBCeP9O%cxf+1P9KW?o=Il}baXMrd$LZs76=$}`cAQ=AP;qWS z703B@r3xlSC}d!$n*dbLFnI+dD+5F83w131_w!EjYV8bOI;; z?**LOBo;_9CM}R!UcW$7HD-b4`cn$7h5HrUSko2Um1`EbziVFL$sD)9^IYlzCPpx1 zWl_ zF#HFCl4W8~Ks3lhU>fKt5DoGemp~g%LW!+83t9)vka>5Uoog_u4hm`e}+Mmb0UN0`gIIUj8MqT0)Y$+{S`oS z8D?!@WMN?FS-`-F%=YmOVQ_SH0TIC=AZ3h9)5Qhd39IWWYFS5lHIgf{~M(p2z56rtf2P3g-W z?_zUiP4Aprr4iWbhg<`7ZjHI5qGFo%ZEcORjIGVAt*ou+^E|UHSAT%#?A*t>=WciR zhx>X48iFl_)_)F{dBVl9%Us;Y_L`RiE8l$ez=^EOB4K8oZhaK?|DJYGGHY7A^AW{MuB#Gi9zWD719JpD|iI zCq;_Cn$nU#re)!YalPxyNhuxpK^7f9DP`dgWbyt1@osoS%AX$9B^A5Gx9*TG&3j!d zd||!YRV&LfTXorQhh_PN{Zjc^zuYsnT~>^ANY!Ao`1e)I%091DZz+(P&PKg=jbCeP z%5;@CUjv>ry)P|6SI>;n)ziP|{TI(`-Ph-|e&UoiyfdN?9Q{@rht5h<*qDfhGf6AB!slp5!BX84Z3l1g$7TTYTIb8w!f9C55E$x z9nV|(NbeSh}>Zhfv@+a9;GAWz0&&cC9os@3(+tU5}fNYuCE1@s?Wb6AO z={XjZZAV_z?FYm9#GY>5@l>ns?5fi!$Cc9=eGQzJwPUyWBU>*FIn2L09J%_w+_x%V zmHU(yPm#yg+ z(lDfBNXw9(Ax%TNhO`ao8`3zWb4cru-XYCHx`(t6=^xTSThl?Lg-8#PCL&!#+KBWK zX(ZA~q?Jf7k!B*@MB0h;6KSZe=_t}tq^C$zk**?bMf!>~7U?X~TFc>#x^hOlu7T6C zp8V1Njk~RAySZ+=xmVp+`AP1-y8BOftymuCmMkptkmMYHfhVsZ&y(Yy5BWv0e*=T+ B3P1n= literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Australia/Sydney b/absl/time/internal/cctz/testdata/zoneinfo/Australia/Sydney new file mode 100644 index 0000000000000000000000000000000000000000..aaed12ca284d69e3a8ba25891701790bde7f6743 GIT binary patch literal 2223 zcmds%TTGU99LK+J!U*z^#hcz9juzmF#>=xf&*QB8Tz$G2N;Qq)uamE)Uz1*(Qzdx_b_iJT#7Du6<*L*%s z`Tu<R0gAQ*YybcN literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Australia/Tasmania b/absl/time/internal/cctz/testdata/zoneinfo/Australia/Tasmania new file mode 100644 index 0000000000000000000000000000000000000000..07784ce5d751f040ba7ab43713f32cb92ce9afb1 GIT binary patch literal 2335 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 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Brazil/Acre b/absl/time/internal/cctz/testdata/zoneinfo/Brazil/Acre new file mode 100644 index 0000000000000000000000000000000000000000..b612ac23562126db6b0aa3ce26dea6760c15be24 GIT binary patch literal 662 zcmcK1J4nMo9Dwm_Z9%H&B7%sIb{BjVL_{)nP`pYead0ZQxd`HtI_TokNfZ}XJ2^?~ zbX(CWb7`xBn?(>`rL~;@FVsm89K3M(jzGfYckbF|W?KCiQF+2-#AUMX&C2a4e~>Hm zXH=oRZi>%ZU)6F>dG1D+>w~&7)b=aIZKv9r(zVm3b6dUCckYVwdOYmEMR%Qdlhq%6 z^QMtb=|<_^X~v%X=J|kW)f4*j@WhN<=k@5$iy1ph`{Of@Ccd|?6Fm!wq zFccgLP*6dlKm`>n3K#{A0!P8408$VskQ7V`Xi!0=zy=ju3NQtk?E_80rhrq>Dex40 W$^lRgfqL?-e>sTQf*j0ZGWG?L1Q>+? literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Brazil/DeNoronha b/absl/time/internal/cctz/testdata/zoneinfo/Brazil/DeNoronha new file mode 100644 index 0000000000000000000000000000000000000000..6d91f91452d0c8474f917c41add3395838504ac6 GIT binary patch literal 742 zcmb`^y)T170LSsCMMw#^8gMiv1_?FLRQv--NS=tW2@+FBw${vW69dDI;vdkONF>-K zSj0=cEY#phs7A@T?3mUB-T`Zq3eQ8Ts~H~gy{_&a zd%uJDe~44EaX9u3hDb;#r;UXKL!u$!oHia3&}kzgA(5C!P$Vi67Kw`lMj|7joi;WS z+-ajD;gR^fodJ*$kRgyUkU@}9kYSv59AqG;9SIo<84DTAX-7kbL&n3jeapWN7#Xl* H4#p#2M|K~x literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Brazil/East b/absl/time/internal/cctz/testdata/zoneinfo/Brazil/East new file mode 100644 index 0000000000000000000000000000000000000000..308a545ce5931939fb6353fa4273aedf00b49372 GIT binary patch literal 2016 zcmc)KZ%h<)9LMp~k|maZ+FDstzedK$6Tf#ydYX~S5J(OpZ-!JxA|U<=Wn^esN0zy< z$*hcxw)UG3n&pp=}EHn&s^C|uhY7I?_UplP|rMe_qws;&x7y# z6R&A%2nYW4xXyitCy#db#2#~ z+EWLX$>}S%X!6aZoH^aCL-B}QtQoDpk6JF5dROY@v6D@zDyXTxk0qUb!lw76%$1+B z^lHZzGpT=vPHy|kOfmObi42&j?M-^;m}4fVdc4g!yI!Wv{>@H1*(bSE$7$}NVUriQ zpn0!%$UQ&ZWT&qQn_%yUI-}vJ|B~&sAA=c0g;kC*{#(t$l1&uRMNu zpckejYmE; zZMRiu+uk2!Q%ZI7i=F1#uW#1pR%|d^_FvTJ7w?c4y1vxF$Pw4}E0Z}{9tdPI!$Tvk z&t$&%Ja9vKEFPGlVfT!<1LYC_@1x%8KIV@)<$r?Tn8|S5$boy^kt2tW96NIGUU&4! z;d|ZjBLN^0AR!A@LyrA`v1XA~7OCB2gk?dR?4Ipk5a#5-Jia5-bue z5-t)i5-<`m5;77q5;PJu61LaHjRfv>kt3mdUF=BkNc2efNc_kEAR~Yb0Wt>2ARwcF z3`3Kj0!R=$haT_<8>p042{=~ z4Kg@hH#*4hc-{CQ1B8qaGDOH2A%ldB5;9E4I3WY&bt8ogmDi0GGFVrvKAJd&2c_ZD)?Z{(q(}d!C!U!iakf7Y1XYP<|+1XKFAO J&X4dW`){q=QK$d_ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Brazil/West b/absl/time/internal/cctz/testdata/zoneinfo/Brazil/West new file mode 100644 index 0000000000000000000000000000000000000000..855cb02c4082719f3a51c8401288c013efefe683 GIT binary patch literal 630 zcmb`^IZFdU7=YnTJP7e>Y%DyYZ32TyAtEv!r3%7=;17rhRyNv2ZPSaOg{4|enMjHO zi(n^;79ojg>;fuyghUy?cP#}$aF*G3SlD6bS$}msJ?{M&ZSsW4h{MZuzgQP3!G6g&!GP(h?X1{F*SCfADxn)FrA8i0o?5eRR910 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/CET b/absl/time/internal/cctz/testdata/zoneinfo/CET new file mode 100644 index 0000000000000000000000000000000000000000..4c4f8ef9aed8bf567ce727c33ba1b97da6f6ee7d GIT binary patch literal 2102 zcmdVaUrd#C9LMoP#8PJTMTJ8GViBQre&hSvH!T1Zx74a>FV%Kpu{nX^A*^?N^8ZC!O&zq4nrXXm+jE}qXj zylz`lf$tyZYWEKpXP3LUpV~Lgzp-!p%*Fi^QS}cT*MT>sgWY>IGPPBs=U3XPSNs}# zF=(GWUu37B&azJ<$@W?G5?wpcpoC{<*>&9^SzCz`8?!Y%oT3?3%WP)h?@G%2Ny#(5 zl0Wv8{FmNR%DJPu{_{hc_1<$zJ#o^~jzlee|3RDGBg@$Sl+9_5*bN&R?8eHlWtN8Q zra*~hrDfaA(^4!uE~xCwMVk9y{6$(XB(jDlqVa=J%daPWQ*kZ9Ad7#@Ccz zH(>>lAuB8!wxTsJSaEv4l@xSX$z+!;NbS{vvzu(;AMILnGHADdS*y~)dX)_?(j7aO zYH?qhmNaE*Y4<|Avpi10##CFDbzY(1q?N~gq>9Y1t>VIWwmkM7TRt{oE6%-SE2FPk z<>=e0+S6mzM-J<*mKIyp^Nd#Cvs-JLH>>8hW`!#&bhp1+YXkGN_DY^=lgh33i|M-e z@?2Z@`Y&2P9&Z~CC0gCk&vsweC9CfpvyJuRwrR(Yx_|K-)=)R9#*BToxh$%tDaW-X zUE1>fUTvL>Xxm7q9ylA;gD1`I3R&QB7uYgiG`;N1`-WV7Y-yI zNI;N?AR$3wf&>ML3KAA1E=XXI$RMFXV&mz8gG9&Eg$Icb5+Ec(NQjUaAwfc-goFu+ z6A~ySQb?$fSRuheqUGtrg~SU97!olgWJt`ApdnF1!iK~R2^pZkl-QF^K{`u v;^*lCh(r(xAreC*h)5KXFyj9*j`6OP^YdwDpsFyZI43Vqm7j;Xh4Fs@!4?eK literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/CST6CDT b/absl/time/internal/cctz/testdata/zoneinfo/CST6CDT new file mode 100644 index 0000000000000000000000000000000000000000..5c8a1d9a3ea46457985198597d90f95462a70168 GIT binary patch literal 2294 zcmdtiUrg0y9LMqJAjKa!NEU@iP+BtNfPkTBQWh|FCY1QEJ@bm3u8lI+uGXvZOMWwP*028h zBHaWB(pBhnuTkAz<>?$VVOz%3q)jmrUOQP|SN^M9zj#zfWPK|UyHa&j+}jd$_*E5c zo|nnzyL8O=M~(MnvyMHn$4q%+kBZyhWNvu2Nlk67FgG?-sGF+tOuRo&-Mk>t+>(~4 z5@yVoX^|5uF>IP7{+^(xUl^C9p=swUL=17@aT&eC_c3E;$7pi$VU(5W6B$YS)lF7RmR13zxGz&jJukJqgmRWRULg&B# zoVjQBh`#qFF^d~d>igPv$^B)o=z_XNDV)=;iwc)Y(I4-s;*5=^czD0^d&`W!f4eFf z%{C9b{DOY)%n~Wx(W;jm&yup5YF)l>sw`cUua`Ank>yD#I02#Hzm3u!XpibeR{*ipXITAe)agNklEOhuAVq@!8BHQmF)h+Y|0%| zPd2`0HpdUCrm{}c6dctpd419{a!PMa=#Z_0$8_t}^|Gy}OK(40B0Jie^-}{rX1FB%TeJkxN4=@f7FYqr$6tc&V zkTD^HLPmuQ3mKQw4h$I?GBjjt$l%b8jt_>%+3|4<5E&uI5Row=gG5G&4AW`Hi44?f zN6Il&WURpM@Ekf9~nOq z03-q&AwXil5dz!3}j9!L0)_;Cafi6BP^kr;9W z5s4xaMkJ0%AdyHSp>*0Zs+IS)XMIy=(QY5AvK}Dj<5mqFw9Dzk5%Mn_q zjV%&fr;RQWUZ;&O5@004NQjXbBSA)@jQ^W3N84J@v(@&M&dtop%<`3HXJ=+-W<~!E D%injH literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Canada/Atlantic b/absl/time/internal/cctz/testdata/zoneinfo/Canada/Atlantic new file mode 100644 index 0000000000000000000000000000000000000000..f86ece4c4032634b3526187c5f86364077b9a9b1 GIT binary patch literal 3438 zcmeI!X;76_9LMpCm=UE?iki4l7HWtOD27Y%SQ?{(oMcf_@MM~SrDWogggR--OsP$o zWk!pJOQn}ELruKyj%FPo4NLK;p=MfQ8*bdr_q^>z<4iBR%yU0?81C@y_x-0nmi=Um z=O3?|%x`#j)tZOTE$5iGIdvbuzwE~v-#dp}I7Mai<$Ifti4Wgx?XGZ2oR!a~yB~#h zbc$2n_Z43o?p@t~tGoJWFYnrR@40Ia_H{nKHrM@R+iT9Jzf`;HUTJXFe>uqY&Q5bm z)-88G8=C7aU0C35=)A@Ge3EoGhWfl;4135e3u^7%)cGghrZbnlTN)qmZK-JGZ1rTi zTi=cLmS5W7Zd?4lOJyZI-dqc)L`+86E?Ymsy z-QP<1_8*bn0}D>d%DaEht&|s3Ro-F!t^18Slvbt>cPdfe#V*s;p4Zip(0qMF=c%JL zv*fWgQ$GXsEhUKSWcHHKqOtr{-XtnT6SqR%>}(K0ol4~` zA#aLc&k`AYafY~6PnWkHc|$ezWyofmrm5y@@^r}CBh~GNBlI0J`>Gb%eRRu=b}Dpm zm~Iud0MZ1a`*?#+W(V@gAJASZ2bjrJ=!{^Qy zccp!+@6P!^b&lPr?-}xwhW+6Btg zw9O**YOPFzEjZqQScC#tCp6>?hK0x_+oRL*FVBW9E@ku&QP z#q&ke<*e!`kzbG@UnmO^1zG*%?4_54r%}KS{scC@!7tqCKltze-tXTfJs!XRkP2w* z_wV(2g6!wp?0ZOJQmSXbK=Y)SXM}k~su?PeC&0d?-oU`s+wbw8{CE7a3h-c#-i%1{fJ(WQdV5Mg|!fWn`F9d zh8h`bWU#Gfw2|RP#v2)MWWL<0#25)Z2h2oez_BuGrq289nqg_j8n z5EmpcNMw-EAhAJ$gG2`j4-y|FKvokWBt%GzkRTyZLc)Z^2?-PuDI`=#tdL+K(L%z7 z#0v=+5;3a@84@!jXh_tMupx0n0*6En2^|tUBzQ>lknkb#vzh=R5ww~RA~8gQh(r+y zBN9g>kVqtvP$IEJf{8>E2`3UyB%nw{ttO;MOp%}>QANUv#1#oF5?Lg)NNkbdBGE;{ zi^SJz0*pl1YC?>}*lL1|L>UP)5@#gPNTiWaBe6z;jYJy>Hxh5F2{;mQs|h(0bE^qD z5_Kf(NZgUYBauf!kHj7cJ`#N-{7C$f0{}S!tmY6vjsdGV2#}+|Y7PVBI6w{r{&j4hH0CKn@4wct8#a@IWUkT135I1V*@!j@c*NO gGvr^6j$m_(^fEU|WKz$lm?$SQDLOhTI?4(D8&gR`p#T5? literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Canada/Central b/absl/time/internal/cctz/testdata/zoneinfo/Canada/Central new file mode 100644 index 0000000000000000000000000000000000000000..2ffe3d8d8e012445aa961fc53b38934681dd2a2c GIT binary patch literal 2891 zcmeH|YfP1O9LImh8;GK2VuS>y6+;mL#qdH|>KG(~dPEd5H4L$g#~X?l{56@ES8A4* zQKXJqt`$0$;$>uN&aIq7lq8K1m7GdGsavST>HqoH3%A^S)62eR|L61Y49+=k_dv4M>sp);n{V{&OoR@O9HfWpF)^Bt#n76xdGTXgaw?%*6wZW;YEYx4t z&3Eccv-DD)*J&t9)XT|3oGa79^=f3W)0i|ue(gTky%rHB*KYT8ubXdky{g&0(byn2 zYmU23CyvW+8xOm8^2_vY>`eDw*A%_)Um*9JbLGLcOldivEPtLHCao3y#rJur$kssd ztZ9`ti*HHWc_G?vMkj5b-l82wHmP4so%;7atsT1^(E!<_0q#!iRKH0(*M1{`M;2+9 z13RSauJ@(ewpH@Px`oocaF#rommxi-BuP+mg7h33DNjX)NN}Gq`m}$GgtUp!klVr9 ztD&QYR^8WUzP+JgdoF7Dj#JvZpsPIlUb*&}^t<$(^MgDWUoFq4d?hageJv6FHb_Kk zl|}~4m&m%k+V8qo`d5CaQPqwPC|#`4dnf3?qA41)X|TrT7D(KJo;oNgQwC3H*7%5F zG9>ONebFye5__c=wo?leVx8svQkFoAJJEeOZ3&W zojNLKg^t>vUq5n2riljOiOH+kna*q}^&vurUZqjAvQ=H{Ri*!Xrlv6Zqvaa0P#cAWQueR;} zx%vCYM_t=@_-|j2{lG_kiHD#0d}TL9e7*y_J?(tHFSd)nz3*(V-5!2EHq|SmMw>Iy zoXO^-d(FSNh{xlx5b-`<4~NaKT0J!LH)cMwoGZIOfat=~C38E;7 zrXZ@aG`fN)%hG5IqArNOAPR$M45BiK&LB#IXwA~74Wc)Q;vkxXR(0Hlm5 z4E;eA2+<%!g%BM=lnBuxM2(h4j}S#dG|5mUM3)R@GPKE1CqthMg)%hCP$@&F45c!( z3Q;RVua-u!5Y0kV3(+k^xe)C_)XUH>M8OOVGgQpbF+<4=En6BjL-cHE6b;cdL)8#n zLzE5CHbmVJeM1z^&^Scp44p%i&d@qU?F_wJ8pSg-&rm%>_YCDjw9imKME{HgKr#SH z0VD^OCJB%%K+<4o^1w)hrO5;%6_zF!jATHv0Z9iWACQDVG6G2nBqxxhK(Yc!i>1j6 zBr%pIGmO+&n%ppw1IZ2}J&^n`5(LQ*BSnxLL6QW?5+qHKJV6p=X)*;#m8HoQBw3aw zTaa`?^2JCPBx8(}L2|}O8YF9sv_bO5NSvj~93*v?CU=nJS(@xY(g(>OB!Q3&LQ)9H kAtZ_Ne-n*Bjr&Y4hnQ?er4EXYi;js(jg5_tjgATU3t;rI(f|Me literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Canada/Eastern b/absl/time/internal/cctz/testdata/zoneinfo/Canada/Eastern new file mode 100644 index 0000000000000000000000000000000000000000..7b4682a39e2fc97450c99eed4576d2a4614bf294 GIT binary patch literal 3503 zcmd_sX;76_9LMpiA{wHIikTw0q=>RgxKd&+gnGpVOmRCJdIvQ*xgZo`3u-tuOrt@i zgSl@RqGFJSpr$rWiQ=B((UcTH5AL~eJKyJRFB;!9)8jn%bH};7{eAy2aS7AA+y3#? zH~+)SbHluRZ}EZo$SGJZSO0KRe6uw0=$fzdBG#^O)$3xnM66#jQE%vyEH+N>r#HC| zSDOd7*PE+?)mHDH<sWb@>Y$MI~_yBuGCPu zJJMg|Pw^}*;Qbtrza{wZjzI&4psM?CtdqXCoTFP~_6qT@YzLOfAr^RMcY5f{~| z*sZ0f+pQ};6ZUE8S=-{`b6&Gc&xa;OoUh#^FEpPgE|h1;i(5Vt&aT-BA&_mBb0EBxFj0{9}o@O zmB<&Gt`}~$b<#~Q5slPh>3(jlYFzA)O$yVM$Ci(E)32s0&x~ohS<0KLc|xRaF|Mof zit^Jfd%LR_{Tk_39sI;g4XbtQx{XBZJ8rVgb+$rJ68Y`Xo2 z%SDISE4t&1T=h!WA>C=n=c=>UM(x{muJWxtDE-`Gm0$S=*|oB#>Q=N=`j^FsfSd#w zxT}WX!RqIS*FL#jKfp{p|Fu+tI3o;p(w-_t=vPq51oSuSE^c#s@5ze0@m_LMQP zM@7t&yK+p}Rx#$9haT&5SdBeYqsP^5R&ndg^!V~+YC?Lxo>(+XO^VOflXHeEVc#vM zES)K)24u;%9d;4lI9X1M3=-3-f_&pKA4-bwP- zvvbQ-Vr;FJnfdD7Fs0`tW~;eg2lTw?6g98*l1%EAC6dZZWOA!ykzBM+raX!h@8v9( z@1G49sc8zO;$Db)M&6J(uVC^?&NOPG|lKo6YGwQe4Ny=`7q~YiNCU zw?3N=v&Yy54K(j)^S))?5iw@GY_>YqN6f#EUZwe=HF}Tu3-dV5Gv`)v6*7Xz5F%rU z3?ed$$S@+~hzuk$lE_dZV`*sy6B$iQGn~kHA_IzyC^DqTm?DFUj4Cp$$haZ{i;OHX zw8+>ZgNux=r5Rpid@aoYBO{CqF*3%;AS0uU3^Ov$$Uq|_jSMw1*2rKZqm2wVGTxSE zz>yJ0h8!7lWYCdOM}{34cVyr#&B!A|Z)wIJ8GK~)k>N+i9|-^w0VD)S43HooQ9#0g z!~qEe5(!Ha3M3XtFpy{<;XvYn1O$l)5)vdPNKlZdAYnn`f&>PM3=$ek6B{HrNOX|! zpcNm!5Fj2CAs|FZjF2E9Q9{Cm#0d!$5-B89NUSVPu#jjW;X>kt1PqB75;7!aNYId| zAz?$}h6E0Y91=Ptc1Z9nP4tlPA@M^3h(r(xAreC*h)5KXFd}h80*OQt38kfpB@#?a z6HO$XNIa2%A`wMGio_HNDiT#BtVmpuz#@@FLW{%}39hAyE)rfOzDR(P2qPgzVvGbC zi82yqB+f{nkw_zH`aJQ8^%^p+;} zNboI9^pWsen)o9J0CEH%hX8U6AO`_*6d;EIavUHB0&*lEhXQgeAP0k`IU10|!O|QL z$N^z#jtJzCK#mFIpg@iaf*c~q xF@hW<$WekECdhGu94NNuyCVLl7mAxXT*Ax&<8KcQ>>e2GZx0Cx3<(T&`x_HwlD7Z= literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Canada/Mountain b/absl/time/internal/cctz/testdata/zoneinfo/Canada/Mountain new file mode 100644 index 0000000000000000000000000000000000000000..d02fbcd47f845bd101a7ec97150df7821b826357 GIT binary patch literal 2402 zcmdtiZ%oxy9LMnkp}>tlrxHU!BP|I6Kk2@lt49^Pju^YP-?iSu291NzOOVAZ|rW!>%DuJ*iiN$+i)DfZQWqI;c3 z)mx<(WnWaU>d*LC_D_8zK5Y-vzJA0`OpA*l>$x9VtYA{Rs`(s5= z^&CB;_^O(jGpU19$5cq%Ssf}5D~A}-j`2O}+Ved+?97M=Kir}tKI{>ZZ+A=idW*QO z{RMgbmRfOxr$)|NoiCya?w7N(62y%Ox5?-Qd1_9mL(UD1S95<|q+`AfRk6MhJ@3em zYX19|^-Vp;Rh)O8y!rV7wV=!|7uJ6!ZgGAiZ(Z@8SQK?s#wThKKXpzgI5vocu_HS1 zvRm9fyjLfkYE;Qx+jYvp61BLwPN%-QM5WcW%Jhx1RYv|gxuj%5IpZIYccg!*mIf!v z%$Pq!=EX3XHF-v4ANyI}`PGnEw%?)e8rm(E@AygI-MLNVG@Q`)w05d{i}vgLYPPD} z#johR+_ft2w^5m&+$8c(^~r+pDp7E-U9Py2BMRT>)hka|DpymRe(;0ks;JVVi#y`f zL(2+vi8oM{#wKfb*>}o)HBy&5kE!zSlVrvG3!-8)Lav?~6>Ij5%ZJDML}jZ_J~G@c zs%j3&wO#AQqpp*>x~)w;mV7`zUguFY;X8G0exa(p;?;HW$*S&nh4utTD$l#wy8ee> z)cTH9@`;lX;z@6od}?4^G?d54#vMNKwDT{yq2Z9&7ozY ze*Zh&0YQHMZY@IWdzk%{D_w5k$~8}^c~+UH*llJbM1cKp|BJaz*uUdH`TfienI1Af zWP(;RLu87`9Fa*PvqYwe%oCZY)yx!`Dl%8AnJh9}WV*gUcX6ne?k;!w+9+^JJ{E-B3WB^G4M-GrAaAW~V14kZ^L?D?!Qeic@K$3xE z14##x4OvUQe!o_L6XCf9V9(Sevkwq8A4KoO!AORY6m#SlNis*4ku-DU8A&up zrjb-zO|Fq-TTQl+bX!fnk%S`|M^cXD97#Hob^ITv-C>Hq)RaHTm64L3lA7d7OG`;h HNp<`UV`q_f literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Canada/Newfoundland b/absl/time/internal/cctz/testdata/zoneinfo/Canada/Newfoundland new file mode 100644 index 0000000000000000000000000000000000000000..a1d14854af6b82bfe814f2c64aac01bc053d5fcb GIT binary patch literal 3664 zcmeI!YfzL`9LMp+3%4}yh1kVX0ZWmK)@oU%AV*uo4Cz>#89ZrJ2Gyfx8HM9?nNnve zyG#aDR*(`ArK`qfH+xddQPYm&Mz@U+Ei@N1B)9WD_Qsl~rkUQg%=&p))Ny?A|Ne5X zEu5X^`qL{$f5MwrtA6v`{{j8W%I*2xo?q3}QRXXotbD_sMHOow4!qzFdtO}8-}};% z4$mt4xc6nN(euj8GXt+?Z1Pl&{UuN}_(jiaXYUKF?y|(Q`q%ovn&50t^%v!V*S9Th zsHravyisj6)V@;YeRJu=hPnqI@V+%Ssp0L}`QEkJu?_1cW_W$W4mPY$NbqhrBgV6_ z$N0d;wgaAbS_cQ}cW?9f%d&6tZ;z~e_wAavO}9wn_g9I1y`tp4ogX=YMq7SSHCHtH^W>M0`j9}&F1Lw=XkCYrM1)c3u6In4>}s`>B{rzJ9=T6XMq4mA1I!P<4s51T90kMH_L zYfZg8R9+ztFE5ur-M?5IDJqqr8!XY5Qy`CCK2iKUB2ykq%6ES0kto}vGo1Eg6V&nM z1gAp{QNKFT&IwyfFd_ri3iPhpzsJENb| zZ&F`%hWlsd%%r0#?)<)@zy5EDk2osg54XtyUn_Cej?d-U?`;t0)UKE3zOYgZoVPu6 zUTMB{{`A_=pj(PR8$9ZX(2&Wqf(iZRg%U3qA51*)xIHv>aByg&ZC}t58NAS+XAj#o z$QoYewv+3+S|dv0?UcvAw^HX^6iU1E6DvI{E;Mr5YHL(Nd+4IHrPjrffslJZRnXn! z4~;(lXmHHtiqIwd<_0gVskg^&%n4q$yxhM0xzymeqEh>cB~z^NIR*9vE5*tfk!fdU z^tLjOEC^){PY!17nh~1Ry=QPz-6f&P2Y(7)xl-DmJw2@KMPuwKYrBgauUk%C(JHRG zG+s`dw?kY#phMwuu#6S4z()pCH$gZb+d+HDW z{dZCS$=`bFzb732^huX191g6C=whCu^|Lb1j_c%eH}gr)aJZ#8qVLI{da`p}Q!@1X zYW<$7-`DWH{=mE*aWq!&mtkZu@tJCJ@DbwiMjAT2?9f;0u`3epy&FGypM z&LFKpdV@3v>5fsi2kDPdHwftv(jufsNRyB*A#FnXgft526w)fBS4gvvZXxYL`h_&i zs5^$V4CxutG&Eh~fwu9|eFGYYbPj19(mSMiNcWKTA^k%dh;-1XTZr@!X(G}^q>V@) zkwzk&L|TdT5@{yVO{ASjKaqwa9YtDd)ICL-igXoeE7Dh_u}Ei;)*`({nu~N7X)n@W zq`^krVWh=I-D9N5NSBc|BYj31jdU7mHPUOO*+{pMb|d{p8jf@vX}MAN9BDezb)@Y` z-;u^6okv=a^d4zG(tV`;NdJ)yVAMMR*#btr2aru*)Vl!L2FN}@HUhE}kgb611!OZI zy8+n_$bLXJgi-GZWJ?(Jo<(mmAo~N^Ajl3u zwun*h5oD7X^)5lSiBazpWTPNE1=%XdUO_esvRjbtg6tP$!yr2b*)m4GXOK-})Vl`R zHb%W~kd1@v9AxVtdk5J($nHV5kLw>ypNLL>SSA0DpT8bIv3ek-k4aC_TWMH!dU9HF P%CPLz)a2CUl-S<@u$syt literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Canada/Pacific b/absl/time/internal/cctz/testdata/zoneinfo/Canada/Pacific new file mode 100644 index 0000000000000000000000000000000000000000..9b5d924173e6e71c2c0a73cf2aca368d3af002e6 GIT binary patch literal 2901 zcmd_rT~L%&9LMnmUl4>mnJ5w3NlgS50YOnT({xr$L}ev0!n+jJFzEWqhQ&ivqqmnnp1o21F!!oHpl@V+xnDOm?@_1x$K-UKQD=NL^3(2*jIVZ^{JiBg(_Fb$ekodM&X(rNuNia9 zZ+Yo*E-uBKchA!ode2rZvEy`0`zX~K5~EuiBGtw7etl`*4b^tES^r+qq%K!?%9T|I z)zxyJv~N0Wt`*nG^@Z=7KeDRi&xy~Q8zal4V`!DS*{eWq^(a%fI-b+FTMAU?$$b6S zm(!I0fLjMXh*z$iaXRS5a233+r|z<9sOh>mR=Uj&Gucas{MqemyVm@y$~IxVJ~O1luP$KJl6#vSd{>8HO^PELRydJM{Fn znd;%UYh=cWWhQgOHktX!43o8Bt<2hG%I{Qmb>T#2EZk(Ps z;HsMUMU2k%H>&x&{Q6Pfezl;iSwB|0L**?!q8C=KSBo-zviOBM0`Hihu7N=LW>*jAJ=}S!8JQl}tSR#9-e=%!{_#gP8~Y<3wr|g_0TCFFVv4?3kXyYDIrorq=-lr zkuoB6L<)&i5-FvlttC=Sq?$-Mk$NHpMJkGv6sajvRHUj%S&_OTg+(fhloqM2qb)8{ zU8KB7eUSnq6-G*o)EFr;Qe~vfNS%>FBb9cvrABJ)Xp4^%tOK$T$Vxccr9jrg z(JltE8jf~3ko7effh^!#8gvc5qi-@cuvW&<&y8gfO7-m;9&93M0 U%uxx+35mlqladmW5)#Ay2A}k~%K!iX literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Canada/Saskatchewan b/absl/time/internal/cctz/testdata/zoneinfo/Canada/Saskatchewan new file mode 100644 index 0000000000000000000000000000000000000000..5fe8d6b618e34c4c87a7eac43f7a27af41161d02 GIT binary patch literal 994 zcmc)I%S%*Y9Eb7Wl%-5VyqJMViy|}(1r3t+8kQv%jsz`aOcZA2p+6uFEegTK3$7jA zL`0A)FT<2XUdjsyW0`kP-ZCvYM2iUO_&%@gbmPi1yytT`%rJ}R8@(TIz9RdsljaSF ztIQmpb6s zu9t}GFYyQN%A;F)^=5^;R$r{w3k%$h$}06WyIeLe6{*di`Ley?tMAiO@?#{ep>QT XtO!|>)vO6w6tXHj`elX9)XKuUTnF}q literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Canada/Yukon b/absl/time/internal/cctz/testdata/zoneinfo/Canada/Yukon new file mode 100644 index 0000000000000000000000000000000000000000..6b62e2d3c39a8406cdc087b387fbdac0709f9141 GIT binary patch literal 2093 zcmdtie`wTo9LMq7Qm4zo2XZ>soqcrX+}v(I+~(=*mrc&u&MkLdo|(Ve54N-|w@xjc zCyXK^_AXI_?EERQraTYrnlY&rRA#>cW+Q;}`Rcxi)>^ME`K|${Py@hVy>y9Nt=? ze=AAI_`-g5H?Ubf(6&?0h_6%GwNX8D=@K=opi1Y=Yn0j3a&&HbrR3hJFb{q=OZ>w# zP2l6-WzN}g^U#Uwq7#es+yfuUyjYgbYyU>gue_xnUj3n3ko|?uFHEWYi7``FVpBspSJX=8=o1)uVlXn8)6GOFiE4t$CvNl&q*9GEX+W zDK#a=tgP7~D}Nc$;o^fTJaSIgW^GrsgGcr1u{G+cV}qvdt9FU(J#5yTuao+XyG+B8 zpgg@iZq_E0H2SMebln|^-V2ym<(CrsewkiB=eAn^iC@PjM%0Fr6Z+ZFb82Jn4gK8E zQMIY*vfiB9qqamw&DPfs%eLZ6=K0oL(v;P2n!|Bv9_ux&`PI^TwZ*h$1f=bQRi^z1 zPhL3EthZnDs~w53e(}tN>WCHS&b}M!rKgV($nnczDenm)2C$o2OrNn(B$)Z zUSBe8l0A3&rn>WV_f($uzNF3I?3?Y*fx1Z47q78*qrIQ8cLU$;iw66m!OE59o_`tr z_Z=kdpSvB5|NVcSz4pC!@EEcSWE;pnkc}WaLAK(wdqFmX>;~BmKhJ)U4Iw*1wuI~n z*%Y!XWLr+VFJxoL&XBDkdqXyd><-x;vOi>l$PSS$B6~zO>9o5=@ZHvS(z|$gYuXJMF%ajUzipwvOx_**vm)Wc$eekp>_gKw5zG z0BM5Lb^&RF)Aj*rgwu8cX$8^?q!~yzkai&bKpKK{1ZfG<6Qn6l+ZCiOPTLoxF;3eV zq%}xykmexWLE3}#2Wb$}A*4k}kB}xIT|(OAw0%Mv<+PnbTIIC8LYjqi3uzb9FQj2e z$B>pGJwuv?bPZ{n)AkK%oYQs=X`R#d4rw0JJ*0g||BwbE9Yk8_`@hF9(^fKMD_Im- S94rr(7DdX+f@Q(d%s&C-P%%gV literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Chile/Continental b/absl/time/internal/cctz/testdata/zoneinfo/Chile/Continental new file mode 100644 index 0000000000000000000000000000000000000000..ab766a41bc06db2956154da6e2fb0dfc3e9c1b2a GIT binary patch literal 2538 zcmd_rZ%kHI0LStB00M!esHvbPS&|0A;g13acq9-=!KZ}$hlb<`%m6`P1SR<*skKOE zBWFdn*330MU070yZ3YV>|x{0?|TY1 zl$Rzr|F{CpH{4vWo16D(&F0Z6vR51^`p(-#(F(`46jXYkm%D*f)f zMDKekZ_4+5A06xtAJN?x4|scS6zSt9BfJB%E9AiT?+3p)*Q&pqby^K46zbu+HhE(x zRo-m-L%9Q=YNz^~^3-~@kIYrRh4I=iB1%n2UoHKe5ET&ID+4Z!s=%95Vi5kZN+|lTWFh_9@(g;U*4%^ z`ft)RhaOU4mzL@9&SW*~^CCHWZ@8LsG+o|a^{1NK8X+Tg`HDL#edN59>*CJ*i}J3p z^J0Foqvu~cAtHYn(|4aeC>C7(NH6@bPu(-}mX3O(Lq&JD=taAqRx$0{bZp5ZN;L10 zaT!@EzPMZ_q>YF~xl%3;&J;^RdSsISuu66&$>dK0MamCRdgY}~9*p{3t|_Wk1;J=-Qk{QG2>q*2lH0`nO+`4WSLH;n`;S#N~~uvAje!4W+3kb2H^ropaT$g^_ZX z>$)BvkFUqiXZ+*q<2%9J{sI4ykH72oec(9u>F2t~l@sW?C$%$?r^h^p2R)O=pM1Y6 zufSPj?nPp;xf9JjzC@45OwC*#Pr<+M^Pu^m-RGG78~y{=E#EVzAK5FiS!B1!c9H!e z8%B1FY#G@zvT0=3$hNI!-^j+1og-Vfn!O{NM|O{F-)i=cGyrV}c%cPcrUyV1kS-u? zK>C0*0_gr8{vi!SI*7Co=^@fYq>D%!kv<}gL^_GI66qz}x{9?M3=)H4R2OjI>zR9_hW+ zG#}}{)wCb!ztx-p$T?s&X902^AZG${E+A(Eay}qugw>?O`9B^ML8;~lNl!G-g!JgV T~hrnTmzv7?25pNQ5PMk<=`e z*@!LEx@e?LAM66yU_NWDwCvBhAav#IqPf*tjI6{ge?9M~x@xVvF8ZDG{9eDEjh&61 z&%0_}LtUo#w=2Sa!r|I&56`o^>}~i1>HaO4Cs%uZ(f;X=jo0#}4zyL85GmE6t20bk zVzQoAP$A)7jE;yNk%;pXI`V3qTyr9*qt5*#(f!}6>7(Nk)BTyc_Q0^rs6Vb|J~w7! zOZKZ-b%Q2u;Wjn<-ad0(Y>%Fk)M@5SZq@PO8%%ugL7i}6nVC0`tFQmGT5i}kPv3Z~ zKyGUORnOm(D2Y2l)y+*Ia?6q{>elkF<+g-#YC*1N7F<4|l75&nx1W7oExh!eS@iCx zzGM7Nll;a(oif;M7Vmskr}j3QwAx3t>e?mgg~d9fra?0E$JL#(Lb9TZRCdgey>MFP_fMFD#-nOkchJbH5B1&k@0h~OxAi?GFPoyc zmvnLZaVfsote3~`m*o>7s$_DTl#Vp1`+^V2iXl(099Sx4??@PpY+hJ~8Vq9aig`w5cB7tu|Ejn1=_qs7KPa znws89wK0C5)OKywwNtIKsis_SIwM8zQrv5S2ocM)#qI*!ac%!DZzE8D&b#d-Puqp+k^S~>Cz&3W?;VFu_#G)_`V+q3km(l*R=5e@)hp;eNTFxyNCJykwbw< z-#@U|oBr4R$RW>uGOPnLSC&|FDeuw=QyCGyp=(fZId*ZU20(OOL3)vU4F=S`R){wn9?dFi(A=^XthinkpA+kke zkH{vGT_W2=_K9p1*(tJBWUo%US!B0PyIo|z$cB*}BU?uHjBFa&HL`7F-^j+1og-UE z_U^QsM|O{FAK5?B0Hgy*3y>ZlO+dPUv;pY@(g>szNGp(DAk9F!fwTkZhtoC$=?Kyi zq$fyIkggzYLHdF;2I&ma8l*Q!bCB*hZF`XZIBkQF4k0Z^XxQwI zbvPPo9rB!}K@Dp->4n#JX~fn+H?s75iSkYHqTLg6)3h9ST*4t4H&XA#I1Li>Q>8op zVo)Z0yVslO<;u;+H+#3Vy)Bb=9dvKa|50x%Z}%prcI%WC2fV38&+D`~^6!^z1v6UYTUUE?j8LxI`c@T8^5DK?rcnO6AFDYt2*4hYgxX|UUkV$oV`%* zPC4bynfkIO#SVH&W34iGq(|==*eCb)9n{rtX>~&akbR{hCJ3#EE|(|$m11DrEKB`*_1s?HeJq?ilhjs_$ony(LYG=gK()F zJ}q1J$Lka4hO}zCqfZ_=snu%+b!%g*KIQAuZPokq>8bB&&FU>$Gj>9@r@tiI2M$Ty z^h&AgY>;QK<;jkgpwwSTk)6A9Wmm@}*&o%ulVG-f~_KXbw%NZ5<-<_dQ+Zo3( zch89og-&~6<3ge1N1X|O-uWcYA8>NawJghA1p%`j#|aCwIDvoO-CO3Hc6ZnQ_=)+q zP$<|iw*%QBvPEQ%$R@33m&i7)W}nDLt!AglR*}6Tn?-huY}ab`i)`3xc8qKp*)y_f zWY=i7%>(=9FdGMUj%*#-JFu$mqqO+dPUv;pY@(g>szNGp(D zAk9F!fwTkZ2htFvBS=fErYA^KkggzYLHdF;2I&ma8l*Q!bCB*J?Lqp3GzjUC)wBrd z5z-{2OGulLJ|T@lI)$_f=@rr}q+3Y4kbWTzLpo+PEkk-{HBCdhhO`ao8`3zWb4cru z-XYCHx@R@*L;7bm4MaL>891R6X~bbG!*Hm z)wC4pDbiG=t4Ldsz9Nl9I*YUx=`GS+q`OFak^WjugOLtfO^cBpTTPRZE+cJ5`iwLh z=`_-6q}NEZk!~aHM*3|v4M#d|H7!SaZZ%Cux{kCR={wSRr1MDYk={H1=itYfH-OK) Z3Fi41rlh4Tn7?42KQ%Qa)jXxf{0?B7_b&hd literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/EET b/absl/time/internal/cctz/testdata/zoneinfo/EET new file mode 100644 index 0000000000000000000000000000000000000000..beb273a24838c96e81f0469e3827bea20ff930c3 GIT binary patch literal 1876 zcmd7ST};(=9LMoPj+LzFi-wRqS%fGa;qaIcM1}{Za#Y}Gq#_xJQba+-z$DgU&J}Z? zHdb@x)XA80dh!D60;%~pTgKcRYgW!JSK7l|n>wGy=I{N#?W(K#pPjw_JKMSYzCYo$ ztu1-Je>@MlU-^>999;l&O8B&feUTrnj~iT1QQ(b+#nf+qtRM6})Tj z#QCf{Ctlru|6)C{x7Bn0l=WV}sI5mv?A?hmZQFH1eUaUIuXkAeJNxB}`p-VTtU#1I zwd6Uz=wPre>^BWI4BI&$vF$s=cvoIY~?NCHR(ND4>}ND@dEo-Pd}4COnR~j_k=&8wk?fK5k^GSf zKxP1$0%Q)5NkC=+nFeGYkcmKM!qZI!G8f2XAhUr?2QnYXgdj75ObIe4$fO{%f=mlC zFUZ6oGvn!|2ALaAH#x}cAk%})4>Cc>3?Wm5|I;~&al5oIkA?Dw^0N!G13CHrP;S6` HD~Ndj&PSQE literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/EST b/absl/time/internal/cctz/testdata/zoneinfo/EST new file mode 100644 index 0000000000000000000000000000000000000000..ae346633c1690d49530e760f8506218bfa9feef1 GIT binary patch literal 127 zcmWHE%1kq2zyORu5fFv}5S!)y|D78c7+ixxfSeG*`e0_T{D7H)YycO~98)d;2yPBR literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/EST5EDT b/absl/time/internal/cctz/testdata/zoneinfo/EST5EDT new file mode 100644 index 0000000000000000000000000000000000000000..54541fc271644e44973989a27f3846a16800caf5 GIT binary patch literal 2294 zcmdtiZ%oxy9LMnslIR5zDhd^;pkg5Z?J6P_CXB9jh4f-bre6)bLnuyaHz>oJDCyQ* z)1ZH&EHi6!WMy%7`BeL=@QuFW_VkvO@cuBz2CzT&)!FFGdi&rMbnlXuI+eLIcU zY>@=LStWk+hE6&XQdb}D(v#lVWRhQ6ty8u(nQJ=k(bqOto9mY5>QsM@xqfz{z9A>U zq-EyF>eAug&FryHblHhBX3lqgy1f54b;rj~ z>pQo9sqT7Zm9A)eU(M~>D0kQFRP!2FN@ZbKRaMTDs?oisI)8<(9^7X9NprRTK&zQQ zlBE~Cx>eo#b%g{rw5Ww2W=hSnfU50@ll#gG)uP9SWpR3n3f7&J;Mk~I;(J$?{5Z+f zXPnUW$1j?tk-fTM_n>)TXq#Tvb!a3$+A3P%FDzWL18TdMFf-#-w)D zR9z@dBMmB)og$%A<*Ir7s5I}(P-}+2l9rw_(|Y=%emI2!s9mmjkuf8KMn;Vc8yPn;aAf4j(4BVd$l#IDBg03=j|2dT z01^Tu21pQ)C?H`#;(!FgX(NGz!f9iH1Otf%5)LFDNI;N?AR$3wf&>ML3KAA1E=XXI z$RMF{+Snk$L860%2Z;|7AS6Oah>#c|K|-R0gb9fg5-6vQ6cQ?@jTI6sr;Qd8E+k$^ zz>tU`Awyz@1PzHA5;i1mNZ_0{a!BZ$Hg-txoHlw$_>lM^0YoB*gb;}#5=115NEneg zB7sCAiGh0lNKlceB4I`1iUbykED~C$jV%&fr;RQW uUZ;&O5@004NQjXbBSA)@jQ^W3du^?Kw%U1t83iQ;MR|eZ;)3FWBJbZZQm>H! literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Egypt b/absl/time/internal/cctz/testdata/zoneinfo/Egypt new file mode 100644 index 0000000000000000000000000000000000000000..ba097504459673e254831edea689c2f8143990df GIT binary patch literal 1972 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 KHb4{YjJN=14HeJ; literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+3 b/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+3 new file mode 100644 index 0000000000000000000000000000000000000000..ae06bcb654b641b86c40254dd0adce48af80c5bf GIT binary patch literal 148 zcmWHE%1kq2zyORu5fBCeCLji}SsH*u{r~^}85sWmzj}dzLD#?-C=x<~2|s}9VF1%4 LE*qeUcE(%)S+NzE literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+4 b/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+4 new file mode 100644 index 0000000000000000000000000000000000000000..5a7f878c98d53b58dfa59738c26f0689a1b6c6da GIT binary patch literal 148 zcmWHE%1kq2zyORu5fBCeCLji}SsH*u{r~^}85sWmKYoCLLD#?pC=x<~2|s}9VF1%4 LE*qeUb|zc^O;r_O literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+5 b/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+5 new file mode 100644 index 0000000000000000000000000000000000000000..18cbf1fe2bb028343e36285553af105cd1ed15cf GIT binary patch literal 148 zcmWHE%1kq2zyORu5fBCeCLji}SsH*u{r~^}85sWm-?@Q-LD#?(C=x<~2|s}9VF1%4 LE*qeUcBWhaK=~CY literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+6 b/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+6 new file mode 100644 index 0000000000000000000000000000000000000000..1aa4be88302308a9a764d0dd632b74b3325592f5 GIT binary patch literal 148 zcmWHE%1kq2zyORu5fBCeCLji}SsH*u{r~^}85sWmU%h~VLD#?xC=x<~2|s}9VF1%4 LE*qeUc4k}vG@TUi literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+7 b/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+7 new file mode 100644 index 0000000000000000000000000000000000000000..cd8ed49af3204f76cf25844942015205fe7e360b GIT binary patch literal 148 zcmWHE%1kq2zyORu5fBCeCLji}SsH*u{r~^}85sWmpF4qpLD#?>C=x<~2|s}9VF1%4 LE*qeUcII3FC_xms literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+8 b/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+8 new file mode 100644 index 0000000000000000000000000000000000000000..e0ba6b8897028777fa930ce4a832307f716df241 GIT binary patch literal 148 zcmWHE%1kq2zyORu5fBCeCLji}SsH*u{r~^}85sWm?+0>p4J?2nAtada1E?MbFiqmJ K0h(xM!36*th9I3GB$)66q!kJfv2ni literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Etc/UTC b/absl/time/internal/cctz/testdata/zoneinfo/Etc/UTC new file mode 100644 index 0000000000000000000000000000000000000000..c3b97f1a199421d6d9625b280316d99b85a4a4e8 GIT binary patch literal 127 ucmWHE%1kq2zyORu5fFv}5SsNoez zvCOG?Lr{l^hPMIUZ%rkuQEIw2UD?IR&74|e^?N_nmg|q&`lEk(9-iOpoWssvjQ7Vk zVOCz8=Py@~{e*{Whkbb6^JROiaAK~kX!SZC$8ci~5i*GvX z3L?z<%yUk8Mu6FnQ14VkPBfKK2h7Gvm&~R%>&>R-3C`xri%eD2MW^c64726?Jg2&H zwAtFY+|<0@*KFI?&1^4t#Cd<|IHxwFkF#U$BD2%$IJ9)rvBCjr(t)a*?aDc+4pXZ+24?34wNi42P;pQgXeRy4`me<94|4BPVe5WBD&ueJwQyO}0uZCUPs`q@dMmryRTf5XZNO)DX zbX~bxx*3)3^Iwr3`GwLmdz##v>XV3}DRN(Qf<%T#$^A~4L&r;(-4vpI zjFPX6ON1fOdDA{W|NKWk)nN)gB zCYLqJl*vspb-}m#)UaJLE$5`>c3&>j6RS0^?GByMRdvSK%XDT-q0Tx!PoKWv(`PnL z)cm7!e8b#}#gd2VKREm%BI=8PRGg?XVeH@2G;rQDL|J9wnHeHOsfbwTwieQ92~mM$sPR(`Eo`~SncO~4)Y4s3g;d$+sG`LAw| z$G^<}FM5K@{ruh6ZEt_=U*mD?C;R<^|2Tuh6Xx-R_wWn9{rv57&eSxYCw;unlVt7d z^~QPa8Eenv6rX+UFYM)KFMIIwr^~+c{e4At+HbfOx%vB7f3a7q;Ia8gRa|XZkh&m+ zK`Mik2B{5F9Hcr(d64=b1wtx>lnAL2QY2SfC8SJ9om_39kV+w?LTZH+3#k@TE~H*a z!H|j}B|~b46b-4Gt1TN+H&H4Eg(`sq=ZNfks=~hM9PTN z5h)~6Nu-oWEsMM{d)6e%iFRivy)U6H~fm36hHMQV!_7pX2% zUZlQAfsqO$B}QtD6d9>9Qf8#iNTHERBc*n=wML4KR2wNbQg5W-NX3zoBQ-~gj#M2f zJ5qO~@JQv6(!1K)BgJ>M)kn&Y)E`*@WCf5VK-K_R1Y{MEWkA*eSqNk$kflJ@0$B`K zyBf%HxZ3qV76e%lWJ!=UK^6sB6=YeEbwL&eSs7$$khMV;$JMS5vOKPKeUJr0RtQ-l zWQ~wTLRJY`CS;wEg+f*eSt?|$ki|k)3t28#yI#nGAuEO~8M0=`q9Ln>EE}?J$ig8j zhb$ekcF5u(tA{L~t6e{20bT71B1?#@A+m_bDk95>tRu3Jp8qG(PG``+oyb5tr2S%9 U(&)7Kn1M0g=(Jcb_Ky$z6}+vK{{R30 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Andorra b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Andorra new file mode 100644 index 0000000000000000000000000000000000000000..b06de7a5904dd87bc1c43c023418bf2829c01df0 GIT binary patch literal 1751 zcmdVaT};h!9LMqhQB7-R-)v;l1Cqkgb5TlioLUsBKjk5b9>ftPtvtn;nYH%4Xv{E7 zYi4OS;UZ=XW30K*3^N<^I5Qg-v&QfJcj>~N&A*-VI&0_LecoStd2Mx~^~V!n{=6C#nI`!6Yo!0wJ-JS1rddCxu-FHvp8n0-4QJl99M_>UpH)cOk0wpO>XBJbOEsgbTr>O9b@u*j%{m&YbE+dXdtaK& z%?VIX#&{py#aQ-@m2>?QOEK`;;!K ztCPiTd$q9SpceV6w0MS3?fhI_60%U2x~J&U!FVklog<}>M(MJzF|z#97hN$BBr8t_ zOIhy+S=IVk$~*dHb@_l)?0m0lvM$Tovin*YaYU*zd$c<6qSl0|*1SEe>xLS%_D+kg ze`f23Gb_}0yIwXP$ke*7V%fAVLO1VEk@~_6X{Zj7EeYY$=>0BRgDq)_8?8;BUP$xE zL2Z6;Q(8Vg)@|pzWP5*~?l^KoclI3DT`is3+TNd&%V?1abPvPOy(Xj!4- zT_b*f&M&a760dD}oL8~U*IX{=&HnoUH<~Xx1N_GC%=6PcyHYQ7AcN##l*llVaUugn zMv4p-87neaWVFa|k?|q}b~GbKhK!6E88k9#WZ1~Kk%1#4M~04!9T_|_dSv*>_>lk{ zO$0~?jwS{q2qX$53?vRD5F`>L6eJcT7$h1b93&njAS5CrBu5hy5|pEf3JD8|3keK~ z3<(X14G9j34hav54+#*75DC%I#E1mxXre^IMB+pOMIuE)MPfyQMWRK*MdC#QMj}Q+ zMq);Sb~I5VVIy%Pfg_P4p(C*)!6VTl;Un=Q2LL$&$RR+E0df!=%~3!OgQGbP$bmqP s1ac^lV}TqD2SN07ND(-S=2V%uGi6q^zo?=DD)$GD`RU#;eS#{d8T literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Astrakhan b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Astrakhan new file mode 100644 index 0000000000000000000000000000000000000000..90d7c2a810846febe4c2a6c60e8c0156505d4d91 GIT binary patch literal 1197 zcmd7QJ7`l;7{Kupn>00Xa8MiDq&{jI`iNfBq(n_?Y?_8@3PnPPs!)6s1i=r7zJFol=vYks zaV<9|EUsR&cwRYSwmX4r@kz-)v^sLNye2Sj)z{6X>%Y4m1wN?q+J%JGFnhM#IDN?u z-aBK5t{3g5b4ToTr-$wJ$8z?D{YiUczSV9{HQ1Xv{B}6#(=Gl*9q~jY@+BaxuRo2p z&3u&h$8V&gG$+x^&t>!EL)lWiDc0eOvh~2Uj-9xoJG*b__})`G5t`6lv3qIWE$By~F@-A|jOXDTc^uPI57d1cpRQ1@ovOXko|-4}i(*^I6G zJ@+No{6gnGztjUYB|R{ISMPo|rT08Iuk*9FWbndqUC4(rO!M2)r_2wkFjZu-95Y>H!pM{z&7_fOBNIoaj!YhzK2iWu0a5}|15yN1 z1yTl52T}-92~vuqsRbzpsRk(rsRtnYNR3;pG){}mB=e!PQm+^$p z+qbT+Hr@KiahW$b4 z$3B0lZu@BX>s6!2TqRR3Z>*XceXVNhP{5itaL}6Gy~ZEfS>d12vB)pmev`18o#Qi0 zd&k2Io~^n)<77!h!cQ6*{*6Wj4QbTX_ci*$QN81fLptlD7d7U@fW#gNNZe}&Wp<}Z zeA_cJr@m3*H@a{@tLMHozT>pw>7QeoTNAQNk(qJWR|`xS#bv>JH17+C)#CkOqVV`ze$$- z+N?_lJaX^X<(kt|sk!}2^}gNtnzuhz@2^eJ{Ej8EtiY+BniyH0cu~Ec2`O-%(ZYmL zDZKK%tO)v0Rt%q(2QIuND+9e!H28rQ@9mUTN8Zo}8ycjf^EqAp&>k(V->hYe>eW|N zsB5BD>00-EU3(){%OeV;{L7j8@b!7J?!9Zee#9jk4uwfY-(}g@epM>FhNY@Uq&b^Got*|9oD8f&BEiL}|$1(^H0k?*s>O+IzlWf zc8)dOvO>iQNLx<(tdvE#v01JoaUN`13f-x%Fr{9KL_w(F^9=_Kt4e z`nBK9Y07(bIkGEcTefCj$i|SJAzMTChHMVm9kM-Jvp@a}8$@=M}~ zvQK2A$WD>1B6~$Pi|iKJuC3WGvSDP$$d-{kBb!Ecjcgm)H?nbL=g8KPy(61Pc8_cy z*}tu60MY@Z1xOE&CLmov+JN){X#~;4>dq3DOg!DM(k4 zwjg~$8iRBOX${gFq&Y};koF+`K^lZ~$kwz7>5;8z64E84O-P@RMj@R-T7~oqX%^Bg zq+LkAkcJ^0vo$S4dS+{yhI9>S8`3wVaY*No)*-z^nul}`X&=%*q=85WkrpC7v^7mc zx`?z9=_Areq?1T1kzOLrM7oKz6X_??P^6h%sdF!Yp zo})#oKr`C_xqiB{Lb&^cR0@Re!e`th9*Y2 z?s+_D-{FVH75l^M!1wGg(;6)@)Asu5>D%3A#+-HLtLZb$%#7N`e7IWAO1))f51OvO z9<$NRiC<~HX;Y%-HteV8HO|wSO~Q5NnPM~FwcE@usG%1WUDOLVB!qLWFw2r-&GM9GCcA5d$%*NuzjG_IA}ZCata{n3s^>F6=R@i(EQ)-zEM1 z{+IL*D|hQ3mzJ5IzR1yQrUmP@qcZf*qf7NVZ<=1;ZI1b+WpAC=dad5z-D@@!`kT!` zjbwAi%d%x>J=yy9Q?hNTOY-}9)pj{5JBIg_ohd%wmNFScE z)f`EA-W(k^QXlKy#QfnAb3Ce&IT5``p9~Jur>c9*sgjDisC0xrU3gBPInYC&UAQ1Fzp+dQT#VNh zm(@0vcDQxr$+t|ECDnA*5eJQ$8esyvtufWolzAv}wyEyDY-)s_k)W1&Qqy;v)T)&! zwT>;8hl?jj?RAqS_{cm}XJMAAyY>@RZ=$G>S;Lf0N>TO4#i>VPJu0++Q`I26g=*Nj zi!`cKOEqrtxHP`@goFiDm9T;!X;O4a9?LG4@J+kr@hOE8@okPY9r?YuKgkgH$p)^- zKEJ7`lx)>3I#)f>{d3j4?hMr;YLseGnyy*~Pmz`f`m0tYsnYs~_UftqUU_J<~H`edI~ebcX~gem!|UqXTEKlZe|+Gd3s&}XX* z44JA1MQ2IkgE=y|uE^k188W0aMTTxnlh+P-WLRczNy;0cUjH~+hR^Mx-WU=h$>W== z5#63vDTy`Jo00X@$PPEuTY)Z>+O&qGUOcKsRk<#scC1%v=YNyYOXjLE`ML7W)SqQ+ z)(m+!ZH}Z*N|y(G?)T~IbN9(NeedJ@<;vgtoBhiF)3d@qefVELyM6n1j=f;6D$1uE za@6W*pGv&rvhV!;eLjti^SIje@VGkRbM}SH$H&M1INwFjzu(TQcm5bxVDX)Ax$Ix! zcI`g?Taa7oXzwXZ-+9n`fK-z%x0cix%38WQBFC1+%kZvIDK>C3+ z#L;%d(Y6HXiKA@_(iKPB7NjqZwlPR&kk%l*L7Ibf2Wbz|AEZG@hmaN_JwlpHG@ z8|_2-hcpoBAksod+e4&@j<$C?SSkDWJ4f30@)JCo;f$R=sdm#G**&xUcLAD68N03c|>=I;~Ao~Q_D9BE6v|9z)E68R+ zb_=pyko|&e7-YvFTL#%P$fiMd4YF;JeS>TqWal{At%K|xN4t5D-Ggi&Wd9%=2-!i% u7DD!r>wf1D6X@>q|3PH`740Ajuv5uxCsTM_vxw#q?xvC9aglCb1^fkK<6HXx literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Belgrade b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Belgrade new file mode 100644 index 0000000000000000000000000000000000000000..79c25d70ef09aaeec21f0a10a029650967172a80 GIT binary patch literal 1957 zcmdVaYfQ~?9LMqhL0H4S7)2!{xg6a~D7WL3s9ZY8CAlQGB%zgCF3rrEeOY4-b6vxT z2jM}?T<4O6HN%WC*O}Qcw>5t6|7Np!;F-<;od5sTPMse8-XG7D`8ko+A6EEVo(VE+*5*~(W!yj&Xc zDO!6y57yod9ktKp7TUM^i#iX!)_&y=G_>@FhAlgz;n~MDBJ;jP7F0`ALXAX^-!3r$ zyCpWVNMajHB+jo~;~veF0pAOC;8~XpdYGZ{m06llGf)R_9Hv8d`s>h~ARSgZK!zuJ zsVm!0Mg+f9x2sVSy{>6e&|^t@_d=4Jo|ojht1{}@0U2F&L{e(cY3i0TNjthv$K>V7 z*s={eZqjBQpF2m>`{$}BB}pgvr0GOwZ=Lu#Tr)Z(O2)l*I{8yCnR4o*PHpg(X?xpB zX7yW{Uh+Y*%IjoCR)fr3{YGaEIW4m@Yc)HtLgpk?X->mKC0k0=(X2^R^KzKCSMz`QvaI%T=6qRg z#A^2I>EG4S(z1Sk^4pYDkL7Z6r+ds791h-G4u|LOr+J0>L;Ey;vA<(kKg=~f{{2Yg zbR#DmIpxSnM@~C(;%&{TM@~L+`uVpMU~4KsN|?UAqCo+3Xu|RO^ryANR>#L zNS#QbNTo=rNUcb*NVQ10NWDnGNX1CWwx(vJXj@Y?QZ`aIQaDmMQaVyQQan;UQa(~Y zvH-{mAWL9t)&N-qTeAwtG9c@KECjL=$WkC{fh-2H8pv`W>wzo?vLeWmAZvmwimh1{ zWLc1PK^6vC8DwdYwLumKSsi3~ko7?p2w5RyiI6oy7RlDE60%ITW}T3QLRJb{DrBvY k#X?pKSuX4Uo-S`QY5gMDG-qm5XiR9hGc_U{!=k)@0!L5Jf&c&j literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Berlin b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Berlin new file mode 100644 index 0000000000000000000000000000000000000000..b4f2a2af6de4526f909f743425c0858d32cd14ad GIT binary patch literal 2335 zcmd_qZ%kEn9LMo<`IExPeZ}CKfKWF=>}F`LEmveU$7W8dvHHDFTebC|XFciMd(P|JGk9>f z`+57;Y^q7O{&9qvC!8F6&B=Y_4s+>>aIWtPT%0&C)~DS)$MuzWR1dax>R?!d4viPd z+1H#pe8elC?#q;OFD1%|KUzjkbXcQhr+17VULm8GGAGVg#pq{6E)C?2Bm`>5HE?u` z^?7o?TyW2kFTy%xEa;4mU2T%c;m(O!B}?VDj9)a$^@B#w`cj?2XVrQAw9dZrrrv)3 zkj{C3ug07_C9%i)B<{dLncJokzwJdysPoGm>#F3=VxPEj^W`pgwj{81b*e9Lox1YTmvvR$1}(j}PJP9N`iOJ6u68Hu>YE-diz<+^3z7QRjd`->#80|55H9Nu z&6M)~ALa3u>r&A^EbA)*Qn~$mePZ$3QdK^r)$#jfLtdZOOh2x*ajLc7b?U|`zit|A z)+aCf^r@q3weF(^d3txA*7ugm=8f_C%&shHSeYyS8mDYYn=4!Mf0k!wTGE&rrHvC` zOVf;-+H~#%X}&h5&%M_ocC$s)70HPf{<^F=0%%ov$6GG|*eX}%`2My8F-8<{vVb7bnaX70%3 zk=Y~DN9K>}w!@@s1njAYo>q!`IDl4K;yNScv6BZ)>bZT*ir9c~)FAdQ;4OEOZjQatXG KG!Ld`g#Qj|*MPME literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Bratislava b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Bratislava new file mode 100644 index 0000000000000000000000000000000000000000..4eabe5c81bd1eaf255fe09cfe72f10f61762fd5f GIT binary patch literal 2272 zcmc)Ke@xVM9LMoH&J$tE-e`Cv2UtW%o&1K-AhQz~dgm`LBNfp+QR^ZgV^A8lm~)M> zcaG^C;*Vmino)mXt)aDkjuxV6m!0L>a%EaMH*->r+2{G)T3h7be!u(P<8!e47MLb+Z{f8WnZLUdwP%P{`XW5wC~ZOm_{AGut<)- z?$VK0ymDe!ft;*gqhGe(kW+`2$m#8F{i^bmgnh;Gb>@Ja@yw8KVs=Z!-XM{SEh4`K z8{&f*IyI1})BFqMw){UeA?+8PKJ7boIgYFA>ie2_{w=-z^g*5R@ynWY^q9C0_e=7= z1Cr9AlDhQ;nHg%5J65lkJADC3D=Cw^JVlc3&XBt&CrXCXs~Oh{bk>jQni-z1_k0?y z_YRDzr}v`H?mDYk?O$m2mZO>zd{c94B9hlMAo-<(Qm}lt6ejmbQC^D_jkQT}QkNE= zTPJh=YSy{OymJ4y)mqY5tEGc;^?@DpbzZkyAFNB$`R#M$p>n5sgGsU={eqTx$E4i( zxmKioFBO-6l1j&iQaLgt3(vnQi~8RX-|z?O@9dDphY#tJ`g&Q~@uDt!V$HsJ~LGxy*5i$zVo}T3dhRogYi-`@T;t8yDGI^BeJ$O zEbF#i(#Ph#E9+~9HJG|rHk9^j-J~PBF9>)LYi6KTC1(P!W8 zljlYTb?e@bbX$LqKHu7_ZJlizWsh=97=K4OC*F$N{E&B=AF|Co(>}pwixXSS&CW~x z0h_n1ikASNu$v3bA@KjRnPmRS!=>io96!oCbKNjkO69Im44t@S$((r4q>x!5(?aHj zObnSBGBspw$mEdOA=5+VhfENeAu>f|j>sgDSt8R!=4ojr%6DL<$W)QJB9ldCi%b`p zFEU|EGh<}R$efW$BeO=Pjm#UFI5Kl&>d4%Y$s@BzrjN`YNdS@oOOpa52S^f-EFft> z@_-})$pn%LBo|0BkZd67K=Oek1j&e{NePk@OOq5ND@a<9yda4|GJ~WB$qkYmBs)lY zko+JCLNbJ;2+5J9NfMGJOOqxfPe`JWOd+X4a)l%d$rh3>Bwt9vkc=TILvm(ml7?i> z(xeT^8n}zs~WuV`B8J zxc>>T$*>8q$*`$poYtj>n&ygW379e*0GJ=t!qc8u2aQSSDi^~C|P5S$k!r6 z${bW(Mwzv4E#_VsosBX!k&rRlV$Wv6wlwy8KOz#g#D9LL&+|H`d7A#yzCURrCTGPs zo;Z!nceptF%*FeFx#qT_SKqnCjYD&bYcE-=E|%%)k_!EFuj-nj<+`TkUX*9-25aq{ z%G`Ak&8_t_Q>>EsdDe!}A-ScY@z%z$Vrx?er?t8MY-{taxZEu_##oq_I_)pO7ok=hk)U>wQT2)>KQsYwM+d*%nDT zbx>26ES3RV*XqEW92vCu106j4BOQ`GL5IGYt!XKJ^o_s)IxM`s4!awr>HfVX{X%nn z^G-V%vFlIGsP&bRo@O$t{8t%Wcw5FStC6u|YGvH)pY^S7yJh^SQ<~X!rA$aH)2s#+ zIGm8j5t3zX4imYkG<_73nI{R-~^; zW0B4xtwnl^G#BZvt!XdPU!=iEhmjT|Jw}?0bQx(g(r2X6NT-ojBfUnNjdUAnx2@?n z(r~2XNXwC)BTYxTj2Jd5oAkj&7L5eg6s;iEy%tg8-wf&vNg!wAe)2i z4zfMS{vaD4F**9e4kex%e4%s_o^N`&`wh!4qWCM{MM7Ge@>>;v=wq_TRZAA7F*+^t3 zk*!4b64^|L)62V_w~x!m)v$hpr+)FgPd#ofZ{J4G>h*9n&32mAG{>x_pRikI7v=Hy vPXC9`Jb3caGbv^}|93y17*OWa*UW6k=p-|-;i<6^@extssnJmw8SDEm0cgd8 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Bucharest b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Bucharest new file mode 100644 index 0000000000000000000000000000000000000000..e0eac4ce33159ec614c51379c6c48935a114b470 GIT binary patch literal 2221 zcmdtie@xVM9LMp`1y}6)u@4e~0ivRTcEACmXy7jbvN%OKja1}oA!41BsO(7eZt0v; za_@|3mTtHlvu4B}lo=YSWVE@Hez?{e^Sf--nzJ@?)*P$P^IQKk*ZQZwdf)CIx8uk7 zgV!^#d|gAny5-``Cp@{`=E?i`hT>rdQju|4S6ur}FNis#7eoj3qgP(nk9EJPD=+kme{Z{9c>IVgYHHF|?b~JX zsOM3OzALYq8C-hUb7oGIspLcL*ev2Jci(i`)}=}l$7>CN#D%g^8F&^e|lf(52*R(SyoofOThf7%k}4zU*mEG{(UZc%r`o7 z`IR3r_q(~^MLQ0e4>BP~Gb3b5$efT#A+tiJh0F_?7&0?tYRKG>$sw~triaXrzljMV zGeo9{%n_L+GD~Edj%J?7M3I>yQ$^;=FN%khCCqK@x*x21yN)8%L8IBs-2KJxG3#1R)thQiS9PNfMGJ zBuz-3kVGMwLQ;j~%F!eX$(Ex@7m_a|VMxZ1lp#4ol7?grNgI+kBymXQkklc$Lz0JN z&(Wk0$sdwHB!fr_ksKmPM6!sa5y>NxNFM~Kl{xFK1W@GhxpC_&Lpl3bkoZa&}oO|z+J3eps ziuJ{D)<2FZ<_Ry32J_$UGjBA zyPTf=hI})1hYWZg(}BxXGWb)po*B-Q3;Pd@4`u&ScyY_wvP;ge^TQS2jgR;pE*y3D zS))I9>Wr*J>lWvA^$-0)XU;gQ4zH8ynD|g<4ZW+gPc`eUU9W1uk)slLuuXz?@0B@q zD#4pxl8};exozcYxjoY@p~%96wjjH`zqbrVROwl_Un?E3N5%wkJ0u~fNfP6#ByqAv<_Fa4{Bx@$ z>Gw)qaMUIDp2^kZ)&foGSfKZ9U8D;e1NHvmP+e4;BoCzdsH-SI9t<1NRM(`W`JB-7 z&~GJuY*;e9j!8z(ad~Lyby?i@wq$mHq*>eRWXZvO`fzEfEUnw3*^h41WhHAg=bjRE zXQt~TjwQN0GD4SMjnQ2HG|4@Evp#lZuBe|trx^A*u*B`Ie4d>kYw>jxYl3XdPL}dwhddKIM=DZ(lV|-bsf_m5%JB)@9&kg_iX<2?3&Huj@7~St+tqWUa_zk=5Fod2kzDR+Q3L_;(YK#;asWMV#q|Qj8kxC<_Mrw@|+tySY zDYvbuH&Sq<;z-Gnnj=L=s*aT1vQtjI|Ced^HMO4?OZOwQoKXo;F_BrZF&ORi{S!K& B&MW`` literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Busingen b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Busingen new file mode 100644 index 0000000000000000000000000000000000000000..9c2b600b103dc4d1f49b5f087055e19d3e031129 GIT binary patch literal 1918 zcmciCUrd#C9LMqB0S*~U_N9i$0t7oE{yFj=LW4|?z^DVIoRk#AKL~0>K}Mh$G#PV^ zxvv|mxnj{|%sHYiP%rS$(sHK6+KM$S=cY5wnsZYI)>!@CPdBW(_IY-m*K>diE`IM% zaQ%+zbn~CfZGXat>mB>yeP)||T=eWT7q8WuOA`Sze74j?dw-|-ibY0fu_Dh!hYueWqy@W0Kx5C>eP} zlDXys$%^Zi?DQtdo@$kxm@dt^vRRh?*{I7-`Q_Q4$~3pHQuBtE>2n<`boocI`h2xl zSF|scl?86~SH;Mx#G9J$pOOOiH(KbuDus7`k)qHqrD)`Wym0-nyf|=F0>fvt_&}$W z^na=^)z!(%o%?k4y7zTW?KUlardET2LVd+kqHBE%b?ro|mPHpx*^iIwtK$n~{qg&{ zVKhR@d!nRb@ORnRdQU35Mr2dvsBGSQTemDfAzLekwJQFQY|9(a>KVthCQh~H)`z-% zszG;LXx5!qg8JH#4O)A?US8jyr*(a$^2YXfeX}D=>R0DVL$ycVN}D6Q@*l|CQAQe5 zqP6kvHED{R(5COclIA;Oy8DYh*)uYvEr-tP-hpm?x4Bna5438C%if`35BoMI{11Do zOl*QH%$P_qk4}GISsXO}{8Ao4{>tTY9>M=Vv*Grae7KtJhxe#SzS-+9d(FFhyAA7q z2=747vZFoE$eBjYH5X?aIp4?`ceLjmIqS%IN6tKQ?vb;PoPVSNqywY{qz9x4qzj}C zqz|MKq!UNm3epSG4AKqK4$=?O5YiFS64DdW6w(#a7Sb2e7}A-eZ4K$o(Kd&4hqQS&uqx^=YeBK;x_BON0xBRwNcBV8kHBYh){ zBb_6yBfUG?=8^6lZTm?7$Oa%gfNTM>2goKMyMSy1vJc2cAUlC<1+o{&W+1!aXtx8| z4`f4-9YMAP*%M?_kX=Ex1=$y5W00Lewg%Z7WOI<+akSfm?2n_}AY_M-EkgDP*(79_ zkZnTt$+$v8>>cKQ*tan=_#fCQyHIwg?AJ&!GpD}?>`wiAtNs})`;4&TwIq!h^A%?# PXC8ruiy)E-o{|s+EmRB>@HgieO#>5a zR;*ZSDw{G~j8f33Oj!|7W2=VN*_ve!)3eIyGFQL%Ay%zFT7UFkpSyG4c!y3mzc2FF zY%EQZzs;dP;bD#X;p=Fn-(D_%CE$&YkNr+9_|Z6Zt;IO~#WP0tV4cy^*Jhr1^F{OQ zv3=%ShilBN)y3vJWh=~g3)9VW40$lNL*YHGR>bjV zt;m)=)};O0tjRSc)|84>);()8t*Gp|*3|j2*1gV9Yg&ZA6+Qlz6`hf7#(1ZwnCsCh z_HwYAZd@^@4}WjWI5+5?**Rc1UpwiZb*RIL+uQ7p-+s_YD5-KM7PXs6TXzj5r=5`5 zD;p#wvPtG7ZIU^+DuCyShfLtXQq`<`%2`?0ITcaJnjRhO2@bQK~Q~RSG}xQV(4ZlQmsm zsfUMuk+rR!Qq=jm6z{$)>kjpbvF?IAQhQN7y0A^w7oAllllRGEX|1Z%@2J`kxkqid z^0X?uU7|Mjm8(scGFADp9940Cy=-oXS6hy_WTUosmzU&t)=5+TcSg@yS|eu z#}Be2-dF9ghNU|28&y5jB|EQvpq}bDEV~9ysG1i#Rc(8ds@wUz+TB>GJnr!J^!n?| zXPmE}uitq8(O1BPKVCliJH37W!s`_aG1$y=9;1)_ z1t0u*`Tu;EP5S%oyS(}PZ~RrSpsVjDtZgrra~- zrYUz#xoygQQ*NAc=agHg+&kswDR)n~eaih)44^o`KMM;e9#BlMt6iYjK=FZM1jPx8 z6%;QhW>DOq*g^4wVhF_%iX{|JD5lueu25{Tt9_vuLvhBgwua&j#T<$|6niNCPz<6t zM6rnC5yd2iOAMPBKH1eqF`TlitzvjZF^l0A#V(3p6vHTvQ7of)#xRZI8pAetmMQANGF_yTAT%Fe`~449=Y7xRkgA MXHH@QjZgOf4F;`^qyPW_ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Copenhagen b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Copenhagen new file mode 100644 index 0000000000000000000000000000000000000000..be87cf162e1a1a8470574ae2c62b92f61589b903 GIT binary patch literal 2160 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 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Guernsey b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Guernsey new file mode 100644 index 0000000000000000000000000000000000000000..4527515ca3f249a44599be855b3e12800ebe480d GIT binary patch literal 3687 zcmeI!dvwor9LMqBn$hO=nHU-N(OjC={5BD438AqqmtXotj4)(rmX?v0Q>h%sdF!Yp zo})#oKr`C_xqiB{Lb&^cR0@Re!e`th9*Y2 z?s+_D-{FVH75l^M!1wGg(;6)@)Asu5>D%3A#+-HLtLZb$%#7N`e7IWAO1))f51OvO z9<$NRiC<~HX;Y%-HteV8HO|wSO~Q5NnPM~FwcE@usG%1WUDOLVB!qLWFw2r-&GM9GCcA5d$%*NuzjG_IA}ZCata{n3s^>F6=R@i(EQ)-zEM1 z{+IL*D|hQ3mzJ5IzR1yQrUmP@qcZf*qf7NVZ<=1;ZI1b+WpAC=dad5z-D@@!`kT!` zjbwAi%d%x>J=yy9Q?hNTOY-}9)pj{5JBIg_ohd%wmNFScE z)f`EA-W(k^QXlKy#QfnAb3Ce&IT5``p9~Jur>c9*sgjDisC0xrU3gBPInYC&UAQ1Fzp+dQT#VNh zm(@0vcDQxr$+t|ECDnA*5eJQ$8esyvtufWolzAv}wyEyDY-)s_k)W1&Qqy;v)T)&! zwT>;8hl?jj?RAqS_{cm}XJMAAyY>@RZ=$G>S;Lf0N>TO4#i>VPJu0++Q`I26g=*Nj zi!`cKOEqrtxHP`@goFiDm9T;!X;O4a9?LG4@J+kr@hOE8@okPY9r?YuKgkgH$p)^- zKEJ7`lx)>3I#)f>{d3j4?hMr;YLseGnyy*~Pmz`f`m0tYsnYs~_UftqUU_J<~H`edI~ebcX~gem!|UqXTEKlZe|+Gd3s&}XX* z44JA1MQ2IkgE=y|uE^k188W0aMTTxnlh+P-WLRczNy;0cUjH~+hR^Mx-WU=h$>W== z5#63vDTy`Jo00X@$PPEuTY)Z>+O&qGUOcKsRk<#scC1%v=YNyYOXjLE`ML7W)SqQ+ z)(m+!ZH}Z*N|y(G?)T~IbN9(NeedJ@<;vgtoBhiF)3d@qefVELyM6n1j=f;6D$1uE za@6W*pGv&rvhV!;eLjti^SIje@VGkRbM}SH$H&M1INwFjzu(TQcm5bxVDX)Ax$Ix! zcI`g?Taa7oXzwXZ-+9n`fK-z%x0cix%38WQBFC1+%kZvIDK>C3+ z#L;%d(Y6HXiKA@_(iKPB7NjqZwlPR&kk%l*L7Ibf2Wbz|AEZG@hmaN_JwlpHG@ z8|_2-hcpoBAksod+e4&@j<$C?SSkDWJ4f30@)JCo;f$R=sdm#G**&xUcLAD68N03c|>=I;~Ao~Q_D9BE6v|9z)E68R+ zb_=pyko|&e7-YvFTL#%P$fiMd4YF;JeS>TqWal{At%K|xN4t5D-Ggi&Wd9%=2-!i% u7DD!r>wf1D6X@>q|3PH`740Ajuv5uxCsTM_vxw#q?xvC9aglCb1^fkK<6HXx literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Helsinki b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Helsinki new file mode 100644 index 0000000000000000000000000000000000000000..29b3c817f4637e98623c5f76a6078f18157b5cfe GIT binary patch literal 1909 zcmdVaYfQ~?9LMp064tP9EC-b$$>pfi)vbh_aw(*PTvDjq5<<$YW15*Y``Q{a4AYt! z@gQts?#8q;n>E9ljk(UuhGEwDz5kxrJn+osoSpycteu{H-yhGs{}r#}<5_R-=V!FfgQME_#$FA%bXh`A zHA>i_Bhs%{C49?vi6||X{tK4KfGm$hrnqIGGg+cSqh(On-Vz;c8BK7*{w56 zi#2ydsd}<9b(UkA&UOyb*7Hxg2i_Fj9I`I1pR9L(lMO+ZRKx~r#fN87+5L-F-oGhT?;q)= zvkkJ@*Q{F(T-U9Qhjm+3y;kq3RzLp^_Pb-izkFMkqu3l2&yJQg)aBR3vO*)QZohxe z%Jx{3%*XA{<>BG?mY?6Rr|0jdyV3m8KHabUi+TMpuiT4+4kD+FoHKIL{D!keP8&II zTXW*bnIor;oI7&z$k`*OkDNb}0FnWc0+Iug1d;`k29gJoh^@&4Nd?ITNe0OVNe9UX zNeIaZNeRgbNeamdNejsfNzB${hNNa|azm0svP05C@-$Vw2{1##F5OA)NM`fNb^PVGEiv#Xi)pZk literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Isle_of_Man b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Isle_of_Man new file mode 100644 index 0000000000000000000000000000000000000000..4527515ca3f249a44599be855b3e12800ebe480d GIT binary patch literal 3687 zcmeI!dvwor9LMqBn$hO=nHU-N(OjC={5BD438AqqmtXotj4)(rmX?v0Q>h%sdF!Yp zo})#oKr`C_xqiB{Lb&^cR0@Re!e`th9*Y2 z?s+_D-{FVH75l^M!1wGg(;6)@)Asu5>D%3A#+-HLtLZb$%#7N`e7IWAO1))f51OvO z9<$NRiC<~HX;Y%-HteV8HO|wSO~Q5NnPM~FwcE@usG%1WUDOLVB!qLWFw2r-&GM9GCcA5d$%*NuzjG_IA}ZCata{n3s^>F6=R@i(EQ)-zEM1 z{+IL*D|hQ3mzJ5IzR1yQrUmP@qcZf*qf7NVZ<=1;ZI1b+WpAC=dad5z-D@@!`kT!` zjbwAi%d%x>J=yy9Q?hNTOY-}9)pj{5JBIg_ohd%wmNFScE z)f`EA-W(k^QXlKy#QfnAb3Ce&IT5``p9~Jur>c9*sgjDisC0xrU3gBPInYC&UAQ1Fzp+dQT#VNh zm(@0vcDQxr$+t|ECDnA*5eJQ$8esyvtufWolzAv}wyEyDY-)s_k)W1&Qqy;v)T)&! zwT>;8hl?jj?RAqS_{cm}XJMAAyY>@RZ=$G>S;Lf0N>TO4#i>VPJu0++Q`I26g=*Nj zi!`cKOEqrtxHP`@goFiDm9T;!X;O4a9?LG4@J+kr@hOE8@okPY9r?YuKgkgH$p)^- zKEJ7`lx)>3I#)f>{d3j4?hMr;YLseGnyy*~Pmz`f`m0tYsnYs~_UftqUU_J<~H`edI~ebcX~gem!|UqXTEKlZe|+Gd3s&}XX* z44JA1MQ2IkgE=y|uE^k188W0aMTTxnlh+P-WLRczNy;0cUjH~+hR^Mx-WU=h$>W== z5#63vDTy`Jo00X@$PPEuTY)Z>+O&qGUOcKsRk<#scC1%v=YNyYOXjLE`ML7W)SqQ+ z)(m+!ZH}Z*N|y(G?)T~IbN9(NeedJ@<;vgtoBhiF)3d@qefVELyM6n1j=f;6D$1uE za@6W*pGv&rvhV!;eLjti^SIje@VGkRbM}SH$H&M1INwFjzu(TQcm5bxVDX)Ax$Ix! zcI`g?Taa7oXzwXZ-+9n`fK-z%x0cix%38WQBFC1+%kZvIDK>C3+ z#L;%d(Y6HXiKA@_(iKPB7NjqZwlPR&kk%l*L7Ibf2Wbz|AEZG@hmaN_JwlpHG@ z8|_2-hcpoBAksod+e4&@j<$C?SSkDWJ4f30@)JCo;f$R=sdm#G**&xUcLAD68N03c|>=I;~Ao~Q_D9BE6v|9z)E68R+ zb_=pyko|&e7-YvFTL#%P$fiMd4YF;JeS>TqWal{At%K|xN4t5D-Ggi&Wd9%=2-!i% u7DD!r>wf1D6X@>q|3PH`740Ajuv5uxCsTM_vxw#q?xvC9aglCb1^fkK<6HXx literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Istanbul b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Istanbul new file mode 100644 index 0000000000000000000000000000000000000000..9a53b3a39063e86859b12aa755b78cfb38a26709 GIT binary patch literal 2166 zcmd_qe@v8h0LSs~aUAC%)b)e#2L33-Ls3H@It;4}@+_AJqKI`%DVt8C*I z%*}N3aoJ>}IZ`4=&bD-ITIsP`!!UYMED2aoYqmKz{nnyi%&zbIskWMb)cUvYv*%vN zaq!3OKJWOtEt^WkO=qfpg`3l^Z=Qz|`oY>g(b<)iYj#~cZ6DgW!8yF+1*4}iVZK&# z!tN~$JFkb^?7pHRv+t`L_8UL%a*n>g$QWq5W)7tK?XxQ;%#Vf=#^B&F^W5crD&(`C1TH+PQyYgi_ealJHSN@if(fX3~R~||DC!ZF9 zP;Yl&bg`4E{B~Aw$jlm4S2Le)QM0zKQFk{lSNFv3R|Qo?YWDn) zD$LJRbEZzJurDmb6VqhT<$#livPpFF0M^(j*$5bTm85tR0rYa}b$;I!@Q4fq($*SI3x#XQ0 zvU+EstmzVR=_bE?up?hR6ulyAH~gxW6%NX1t)rryrOtBSS*xz#%V6ELZ-VvS{$Tyk zKyby^hl4AR^#x<+&R7k5$F0VruUZecwg!zo?bah}U$jzo_`}0ckX88Z@<((3^>GJu6$Scy{NRhW$qzf^x#4|;R z{8=Jfh{#gUZM-6K{{H%3-@|WX4RKMg?`U*24{=dkQm*eZ{;NJ7eSUxD{vhK2yp<09 zPIoIm{qcwTqe?ZsJ#Y!x4zeFty&+^r$d-^jA)7*Wg=`Dim#f|wvNL3B$lhG_=8)YX z+e7w;Y!KNYvPEQ%$R?3pBHKjviEI?vsjJ>9vR7oY$ZnDCBKt))jO-ZQE%UkQJp-FY zc8zQs**CIrWar4%UG?5MY~EGx9@##!e^=cAqytC`kRBjSK)QgmfkPjVMj)L)T7mQe zX@;xr2GS0sA4o%xjvy^TdV(|s=?c;oq%TNgkj}X3)*!t>nuBx)X%EsLq(MlBkQO05 zLYjnh32773C!|qGr(AWbkY2g!W+B}|+J*EBX&BNmq-99YkftGBL)wP)4QU+GIal2} zq<2X3Ty^)5_POf*Aq_-2h_n#tA<{&oi%1)hJ|c}oI*GIr=_S%kSKUpdo!F+o>*D_y O(99|w*XjjjnZE%*@2d&` literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Jersey b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Jersey new file mode 100644 index 0000000000000000000000000000000000000000..4527515ca3f249a44599be855b3e12800ebe480d GIT binary patch literal 3687 zcmeI!dvwor9LMqBn$hO=nHU-N(OjC={5BD438AqqmtXotj4)(rmX?v0Q>h%sdF!Yp zo})#oKr`C_xqiB{Lb&^cR0@Re!e`th9*Y2 z?s+_D-{FVH75l^M!1wGg(;6)@)Asu5>D%3A#+-HLtLZb$%#7N`e7IWAO1))f51OvO z9<$NRiC<~HX;Y%-HteV8HO|wSO~Q5NnPM~FwcE@usG%1WUDOLVB!qLWFw2r-&GM9GCcA5d$%*NuzjG_IA}ZCata{n3s^>F6=R@i(EQ)-zEM1 z{+IL*D|hQ3mzJ5IzR1yQrUmP@qcZf*qf7NVZ<=1;ZI1b+WpAC=dad5z-D@@!`kT!` zjbwAi%d%x>J=yy9Q?hNTOY-}9)pj{5JBIg_ohd%wmNFScE z)f`EA-W(k^QXlKy#QfnAb3Ce&IT5``p9~Jur>c9*sgjDisC0xrU3gBPInYC&UAQ1Fzp+dQT#VNh zm(@0vcDQxr$+t|ECDnA*5eJQ$8esyvtufWolzAv}wyEyDY-)s_k)W1&Qqy;v)T)&! zwT>;8hl?jj?RAqS_{cm}XJMAAyY>@RZ=$G>S;Lf0N>TO4#i>VPJu0++Q`I26g=*Nj zi!`cKOEqrtxHP`@goFiDm9T;!X;O4a9?LG4@J+kr@hOE8@okPY9r?YuKgkgH$p)^- zKEJ7`lx)>3I#)f>{d3j4?hMr;YLseGnyy*~Pmz`f`m0tYsnYs~_UftqUU_J<~H`edI~ebcX~gem!|UqXTEKlZe|+Gd3s&}XX* z44JA1MQ2IkgE=y|uE^k188W0aMTTxnlh+P-WLRczNy;0cUjH~+hR^Mx-WU=h$>W== z5#63vDTy`Jo00X@$PPEuTY)Z>+O&qGUOcKsRk<#scC1%v=YNyYOXjLE`ML7W)SqQ+ z)(m+!ZH}Z*N|y(G?)T~IbN9(NeedJ@<;vgtoBhiF)3d@qefVELyM6n1j=f;6D$1uE za@6W*pGv&rvhV!;eLjti^SIje@VGkRbM}SH$H&M1INwFjzu(TQcm5bxVDX)Ax$Ix! zcI`g?Taa7oXzwXZ-+9n`fK-z%x0cix%38WQBFC1+%kZvIDK>C3+ z#L;%d(Y6HXiKA@_(iKPB7NjqZwlPR&kk%l*L7Ibf2Wbz|AEZG@hmaN_JwlpHG@ z8|_2-hcpoBAksod+e4&@j<$C?SSkDWJ4f30@)JCo;f$R=sdm#G**&xUcLAD68N03c|>=I;~Ao~Q_D9BE6v|9z)E68R+ zb_=pyko|&e7-YvFTL#%P$fiMd4YF;JeS>TqWal{At%K|xN4t5D-Ggi&Wd9%=2-!i% u7DD!r>wf1D6X@>q|3PH`740Ajuv5uxCsTM_vxw#q?xvC9aglCb1^fkK<6HXx literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Kaliningrad b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Kaliningrad new file mode 100644 index 0000000000000000000000000000000000000000..37280d05f9a993b27468b028bcd8f0774a3ce017 GIT binary patch literal 1518 zcmd^;OGs2<97q4-E45K4!p3)|`N&62>KFxVfs5_}TZ861D#XnS_k9-J8P*q&c3 zw}ra$Y@s)7F(2A5-ZhLIF**=%_C}lP=lp6N9)5b4_(jQ(o zGHzWkGW)uWth2|Bl_%Sb>?3=ORr_m=9Nz{bx2n)sU6N|#Wu!{JHC_s$D^$U!d{y|) zuGUP)s-nkVRq@?fRWcY>rI*Lm+Q67vcVa|2+WOV{15d?yY)HzghoyY?X{pFOFO|;2 zQu)18T(#l(g@<37T59y&C|(Y{`k>fR#=o^#=ARZl-hP????N@}kDEe$S@^pj zdPfKL?SKeoQcDIA4I&#vIEZu*@gVX+1cXQk5fLJzNi8HqN{E;ywVZq%1cgWn5!IxY z6(TG|T8Ow1c_9KrB!-9#kr^U1L~4lG5V;|OLnLR2&XC=t79Ju!M0|++kN_YNKth1T z00{yT1tbhc9E?C1kuXAG#9~qh!-&SD4u=sBBp^makdPoTL4txr1qllh7b7r8WQ@=t mu`z;!L}yZm$B56Q4v-NcBSc1wkRTaR%70U3ypFfj8UGW?P;_7b literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Kiev b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Kiev new file mode 100644 index 0000000000000000000000000000000000000000..b3e20a7e3946dd522e50db39a81c0e5f4f1bd619 GIT binary patch literal 2097 zcmeIyZ%kEn9LMo<1d6UkUt4s&0YZ|Bc7+RwqCsNU3p2QSl`D}-TbGbY|}X1tvDb-{PuU9&#F8k>FYv&j8}iI~6d?Z}+o zQ?bH5`y)l$&T1fjQj41|N=f^mlvWPO+?B6NS`8qdynO>N7v-nhPFTdw8-m4PKSUx_^}B-h{-OFUY!`SM>2k z@5mEP!y3;$AnPj!v?cwtZpcyH@WX4majac8o$t~oFGcmKqieMFqb>6Ei6SG+ zU`?{D46%ea_Fd!m@+#Xm{^|I$ox>aMe77zfwQ9{33Pr7OeXSKV21E7yu*AGH4;;4b zUhvmp+tGiY#CG%R?j(Ns^LxLWqv6cQabzOMOpvJ{b3rD9%*NGBhd;x7kO?6(ay3&z z=7dZNnH4fEWM0U`keMMyy6vqz?n%pXYrk^v+I zNDf?05|AvonlvDJKoWsu0!amu3nUpxHjs26`9KnaWCTeGk`q^x6eKIICM`%_ki;OF zK~jU{21yQ*9V9(Sevkwq8A4KosX}svBn!zFk}f1)NWzee zAt^(0h9nKinyX10k~deAI3#mO>X6(a$wRV-qz}oT^?(0tkBR1-5+dmjmll>428v4k L;o^Y%G}rS7d^Gc? literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Kirov b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Kirov new file mode 100644 index 0000000000000000000000000000000000000000..40b558f82117925877dc9ad67522db00a7b169d4 GIT binary patch literal 1167 zcmd7QJ7`l;9LMn!n=~bHaM8v#sgIh5KD{PQNj0shX&b636bTMhq4+2Wf`6ogg3y4q zlM0HUqKIN}@j2*Zl^`x++sUm82b_E$XA#7r@qBOXDwSD%-Cq$&CA@Zz^nd41AF6!Jno-`dS9E+6?;c zORn*S$$fcchN?cgR2$2wx7?B{6D3LIcIFUeIZKO!3t~ORASR`5`TqIs3V4Sp@|924w(l+tl_C(+p DaEJ}W literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Lisbon b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Lisbon new file mode 100644 index 0000000000000000000000000000000000000000..a85653044e0094363ea0f30d017a20ccdce2227d GIT binary patch literal 3469 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 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/London b/absl/time/internal/cctz/testdata/zoneinfo/Europe/London new file mode 100644 index 0000000000000000000000000000000000000000..4527515ca3f249a44599be855b3e12800ebe480d GIT binary patch literal 3687 zcmeI!dvwor9LMqBn$hO=nHU-N(OjC={5BD438AqqmtXotj4)(rmX?v0Q>h%sdF!Yp zo})#oKr`C_xqiB{Lb&^cR0@Re!e`th9*Y2 z?s+_D-{FVH75l^M!1wGg(;6)@)Asu5>D%3A#+-HLtLZb$%#7N`e7IWAO1))f51OvO z9<$NRiC<~HX;Y%-HteV8HO|wSO~Q5NnPM~FwcE@usG%1WUDOLVB!qLWFw2r-&GM9GCcA5d$%*NuzjG_IA}ZCata{n3s^>F6=R@i(EQ)-zEM1 z{+IL*D|hQ3mzJ5IzR1yQrUmP@qcZf*qf7NVZ<=1;ZI1b+WpAC=dad5z-D@@!`kT!` zjbwAi%d%x>J=yy9Q?hNTOY-}9)pj{5JBIg_ohd%wmNFScE z)f`EA-W(k^QXlKy#QfnAb3Ce&IT5``p9~Jur>c9*sgjDisC0xrU3gBPInYC&UAQ1Fzp+dQT#VNh zm(@0vcDQxr$+t|ECDnA*5eJQ$8esyvtufWolzAv}wyEyDY-)s_k)W1&Qqy;v)T)&! zwT>;8hl?jj?RAqS_{cm}XJMAAyY>@RZ=$G>S;Lf0N>TO4#i>VPJu0++Q`I26g=*Nj zi!`cKOEqrtxHP`@goFiDm9T;!X;O4a9?LG4@J+kr@hOE8@okPY9r?YuKgkgH$p)^- zKEJ7`lx)>3I#)f>{d3j4?hMr;YLseGnyy*~Pmz`f`m0tYsnYs~_UftqUU_J<~H`edI~ebcX~gem!|UqXTEKlZe|+Gd3s&}XX* z44JA1MQ2IkgE=y|uE^k188W0aMTTxnlh+P-WLRczNy;0cUjH~+hR^Mx-WU=h$>W== z5#63vDTy`Jo00X@$PPEuTY)Z>+O&qGUOcKsRk<#scC1%v=YNyYOXjLE`ML7W)SqQ+ z)(m+!ZH}Z*N|y(G?)T~IbN9(NeedJ@<;vgtoBhiF)3d@qefVELyM6n1j=f;6D$1uE za@6W*pGv&rvhV!;eLjti^SIje@VGkRbM}SH$H&M1INwFjzu(TQcm5bxVDX)Ax$Ix! zcI`g?Taa7oXzwXZ-+9n`fK-z%x0cix%38WQBFC1+%kZvIDK>C3+ z#L;%d(Y6HXiKA@_(iKPB7NjqZwlPR&kk%l*L7Ibf2Wbz|AEZG@hmaN_JwlpHG@ z8|_2-hcpoBAksod+e4&@j<$C?SSkDWJ4f30@)JCo;f$R=sdm#G**&xUcLAD68N03c|>=I;~Ao~Q_D9BE6v|9z)E68R+ zb_=pyko|&e7-YvFTL#%P$fiMd4YF;JeS>TqWal{At%K|xN4t5D-Ggi&Wd9%=2-!i% u7DD!r>wf1D6X@>q|3PH`740Ajuv5uxCsTM_vxw#q?xvC9aglCb1^fkK<6HXx literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Luxembourg b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Luxembourg new file mode 100644 index 0000000000000000000000000000000000000000..6fae86c53176e605311e09823fee55d07d157405 GIT binary patch literal 2974 zcmeIze{{`t9LMo{&0@>uZP;YPt+j?`zqb$#GmdP2-dKLi3|Vt6?QFt0?TG9+ZyhIT zv}^W_{f zBQw_ax5MAO!;52&d2t`O&|C^jx7HMQESgl@aNe`#TE)e+Wvg9p?@=u&T%{!!YhCV1 z8$9b4Tyd9126)!bogrlji#!`9Bx!kAf~O*Uvu$HnyJu6gw`9}xc-Q8u*|vAimb$ha z9cJ5ltin@S5o_D#9_rfuY8%_TOJ{oCb44$FKWB-nYFMOu$DlEeozddn6`Skc-SS8G z?mL&=d%i#I{@~0qNA=ks95r>99D8@4a_lQv>fZn64#$VZ!HxrYs~iWXFL4}7&v(=& zMY#`mAL}^M^MK=M`Wg4p^FHpne$kHOR|m_9O+i{;nk*l`9xo?nZI@4S0_D>oee~3d zK5}|+sQPtnborG{QU7J_rDb7?%A7=Pl@YE1&UV^5t-rL1`$gM^eyf44ztAAB6B=}5 zpSHWaO&>bt*7k>1XmHJ53E5I99oCdc$0C(Z^A?FCD@Pt4H$@&vbxLTj6nQivQNlvP z<*^p+B-}e$!*9lG=PO~_r6Ewe9&Vo4tD$ruLCluzD}OLyj})ZZkE*J z`!#KOkqp_gPKRb^%dnzXbol7kbVSxv9r;9-I#UPgGeJXiR74jYbt_ua+YXTQ&jR$> zo1JCM&YyH_gRhKpx03Ny-^ql68!~Zay-b?eAd}}`)8~?Q$&~TOHKWsNncBNjGn?UR19IIJJX3GmpdTVz1NSQUgle!is$n4?0BquXSUX1A| zb5eemms;5*H>$1XdM-(x|1HfsSu6S1&*|Ll~`lr$jR-y58g2c zSwYfbY4U<32FVPP8YDNCCOJrUkn|w=K@x;y2uTr=BP2;kmXI`Anmi$iLNbM<3dt3c zEF@bC{^=iBKbuUjAR%|F_L2>$w-!wG$VON5{+aUNi~vdB-u!|k#t*{d?N`*GLEDi z$vKjAB3D39?3nDd?fow`YlcVkqNLgGk{D1G6%>cAhUo>12PZDL?APP zOa(F*$Ydb1flLQ7AIOAQni)Z+#L~bA(J1GE2xbA@hVx6f#rDR3USPOcpX*$aEp|g-jSSW5|?QnmI!z4Vg7$ z+K_oeCJvc7Wa^N)LnaTIJ!JZj`9mfUnL%U=WX literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Madrid b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Madrid new file mode 100644 index 0000000000000000000000000000000000000000..9b51a73bd52e9afe7d788f548213ef57415f65ee GIT binary patch literal 2637 zcmeIzYfRO39LMoLDhjCh1x2XCMI%BBf9o6RLwRhV*JL^-ddUbeqZ7iv7^#0M^c)8Tte`>F%X>Wqn zTtCZw;Moz@o6oJW-g3uPzg@P)-7-6{`sk^vo@03h*71kaJjYi$y4q68T_;B8SD)zK z<~iN{rR&U#t2}3q&2Y8Xcep>=JJ7ysnCFlDW~Gd#1a^Gd$Q zXXx23pPMhZeXlil`CTY?4{iKx(BS@OHTcGR8gi*w?>JwtcOH9Q9fyxd=)NWidv<*Q!LU+bE+- z%4GDyC307`Qz9p4$lWo?5)~RP_Y4V zf2QMWPHSxWVT~)=uki()l2FzniK(qJVeU(k6t+W>6DlRSr%EO|w(G=;izMaO3Y~N$ zT^{&6Pbcpw)YR5V`rziNn)XVlPAQJmsWmC`P^P!07dd2F)Md>`?~zRJQ<@d|m1JH2 zR;Ks=K&H2!lt(V@mKjZrl6~fV&DmBfGxzP%S*4{iyLOY#nZH%%mMqoW`%BcBou!Wk z&(wJ_V|CuGIL!;nl)O&^^|9_Tvf!PYn&06k3+n@`EvZ_%Cs&?Y z9-;2dNwR9rWGO2SmZ#&xr99(jc_zS;ir65n@O&+m{4*n-yZ$F`VI8%<1xr*ps(M5@#yXSt=60v%U`?(pyg{>p`*Np z{^fljKedAG&--|vo#V9TXXNt2)7+(Vmu~JX%Zu;vGMD{*f803#{WLe2-?UHj?LYsn z*IXNt4_e6SMou_#%8`?foOWAt;*nF2oP6Z;BLzSzfRq5K0a65{3P>4{I@p>*AeBH$ zVQXrE6a%RSQVygZNI{T_ASFR+f)oX*3Q`tZQy2a%6voz61}P0v8>Bc$b&&EP^+5`R zRLItp2&oZLB&146nUFdmg+eN2Yf6RG3Mm#+Eu>sXy^w+-6+=pf)C?&aQZ=M(NZpXa zA(cZ)XKQMQ6c4E$Qa+@9NCA-wA|*s>h!hd2B2q@Ajz}SqN+PASHMK;FX=|#9loP2Z zQc$F#NJ){JB1J{2ij)+9JiZHPuDRYisI@6d0*6QevdWNRg2$BV|VF zj1(HFG*W7$)=05!O|_A7+nRbK1xG55lpLu!Qgo#1NZFCPBZWsQkCYy%JyLw6`bhb0 zP5qGtKvn=*0%Q%4ML<>oSq5YskcB{20$B=VEs(`PRs&fMTeBX>g4miBL6!tr6J$}4 pRY8^oSr=qstp6vbuZi(9>oYE%9g4|G9G^5kE+!{F4r3Gjeh1W6@Av=! literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Malta b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Malta new file mode 100644 index 0000000000000000000000000000000000000000..c1208e2d2ec5e948a30dc3976edee6921d3d4aa7 GIT binary patch literal 2629 zcmd_rZA_JQ7{~FOCwWNiLIq4gEF^qD1p%KD4GEkHmU1#uR8T}MqFXZ3QaPHrYR+9P z#W^8Cjipm+in>y2nKqk9h+%5EoX)Ilc5i0r6z%`Lo%W&^z3WZ)8Rv66!prOX^Guyz zG{pMH6KKBShi9Al;d3XidD}Sry1lWr@m%HMqfXU6EC2nsZ`+%yBhOXmf8f+C+nK*P zZTOp|W?cUfUEmo>cW4;tZjOe3y-rrj@mqz|2_)*fHJt33}i zNaT(>iK^Try;iG4FIg_Vi%aF(RNJ>~sa zhPIc>@SbaR_}Ky(akETEHl)jA-{fS$eT5E{pRfo#- z`rl+m`Bj;@wn_45wo1X$Uv<`)eKLD`qZUSQkU6P!S`@TL=SHc{{dv94YcJLLM;7bz zXFdADhtst9s|E7nTd7)7n_o+OJDC9Mq+CRl02PRxMvsu6{ng_g{Yg=H=tdyLsL7?!Vms zx&NEK0UiG9m$|1(b5B-eZy$fl>MU09z4yD{{QZ4aw#Q1($l=YyU-*~@%?HoFU+;GF zi|+MacmKw+?wH4JI8lgPv#Ysi5$qX#d9^)L&}HL4=Es0L8OF84Ur-uRYb~&)DbBp zQc0wgNG*|Kx|(Vt<#aXmL<)*j6e%fEQ>3U!RgtnHbwvt`R2C^MQd^|BNOh6&x|;eT z1$H$RMoNs-7%4JRWu(kVosmK#l}1X9)EX%^Qf;K%uBP5d!Cg(ok&+`dM~aSA9Vt6f zcck!0<&n}OwMUANR39lnQh#ItT+Ip~OMt8avIxj3Aj^QP1F{gvN+3&ttOc?d$Z8pfi)vbh_aw(*PTvDjq5<<$YW15*Y``Q{a4AYt! z@gQts?#8q;n>E9ljk(UuhGEwDz5kxrJn+osoSpycteu{H-yhGs{}r#}<5_R-=V!FfgQME_#$FA%bXh`A zHA>i_Bhs%{C49?vi6||X{tK4KfGm$hrnqIGGg+cSqh(On-Vz;c8BK7*{w56 zi#2ydsd}<9b(UkA&UOyb*7Hxg2i_Fj9I`I1pR9L(lMO+ZRKx~r#fN87+5L-F-oGhT?;q)= zvkkJ@*Q{F(T-U9Qhjm+3y;kq3RzLp^_Pb-izkFMkqu3l2&yJQg)aBR3vO*)QZohxe z%Jx{3%*XA{<>BG?mY?6Rr|0jdyV3m8KHabUi+TMpuiT4+4kD+FoHKIL{D!keP8&II zTXW*bnIor;oI7&z$k`*OkDNb}0FnWc0+Iug1d;`k29gJoh^@&4Nd?ITNe0OVNe9UX zNeIaZNeRgbNeamdNejsfNzB${hNNa|azm0svP05C@-$Vw2{1##F5OA)NM`fNb^PVGEiv#Xi)pZk literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Minsk b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Minsk new file mode 100644 index 0000000000000000000000000000000000000000..60041a41890eae1902b2410f1225a38cc7614a13 GIT binary patch literal 1370 zcmds$Pe_wt9LIliT5GB8kj*z;nPx7XwVc|jX{$NKKLbna5EUMVRCKWH82Jz)9iso8 zl8O)`DIxlE$b=3Z!j`Q=V609Nfrol8(LZ86pSKo4hdTFtc%IMmKJVTQ-hIB^JNEY0 z$REkmCrr|;C;JsjFJs17@Xm~^F&-Cq_wD4fkt8mUNlapG*U=>BE1`1)znGknxsa=hPMdN^*D?B8ZC+u3ZEcC0na zLSA#Z&oIl2oo4yP{?3XIg?-*PZng5cLsdTftg3F$D&I&-Ri8_!RfCgi^`UX)k6%)2 zc0HDwgQF5?xFNM$k4c^9q}12!llpH5Bv>@0g0H${-Pb*8{bZeNNVTcZ=oZy5;Zu!6 z0k!c$z6$pis7-@avN`%uMdEqVRQ^ImBk!d-XF|1JtBJ8?t?(&@A<%RVPNCp*VJ_s4L|`!(#&`TsU@b4839{es1KB-tXxCE^gN^ou^v zcZrJ=+rrEm4BL#%-OS$R`R%FFj##(E^o&L|yV@n98Hsjr(WDRcrph1S=fq}X>R4Bq zrTgz*wCK-TUVQrbkbV{E?RTfV5KkbkKzxBX1Mvpp4#XdbLwp?`L0p3PWKlZ>@e1M= z#4m_r5YHg4L41Qa2k{Q#9>hP0gAflPE?U$+LY#zn32_tRC&W>Rrw~^mzCxUZcnfit z;4i^pg2x1x2|ioYP7}PgsNE*`4RM^{ImC5{?-1u9-b37n_)q8nqz8m9K>9%F1f&-h kbvFq8u&6si=n0`KguXyJLk9GJE&pS2oFQGT#_E9cJ1oC86#xJL literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Monaco b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Monaco new file mode 100644 index 0000000000000000000000000000000000000000..0b40f1ec9321e0b521a0d36a8e6ca9a9de08282f GIT binary patch literal 2953 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 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Oslo b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Oslo new file mode 100644 index 0000000000000000000000000000000000000000..239c0174d361ff520c0c39431f2158837b82c6e0 GIT binary patch literal 2251 zcmdtie@xVM9LMqRfk?4(Z-2m9fRIS1cJdqi5tq^l%)GOd(?~^75wR}H%NV3anRBi& zeCt@|$f@O+HN*a(`~$6(+GyeBFXpUVTdb@!xaOz)E$t_w2gJS9I# zM29j*%24E-jtTFMjP=izak;-}eA-n_82h<8qfe`I;9VWxcSP?vzhCb>u~QR|9haoT z9g_UYKAF(0lCtS}NezbNuH~y`qAwt6g~c+-T_EX6F1h=*@#2c{s%tP$Cx4Z$Q+gA0 z>Zw@0r}L(|4}PoDT0hl{tsiUVhGUvl{ibGDT#}qnr{sFNByZ76lApX+3UV5xV7N(U zB(~~|%PVE(uk||XxL5A|tXvD*E7j9AOYhrOq_f+SbWTm07Hyp=_m{+|w>nYgreD!w z@354_e59pmUr1^H*D^2qeVG^TmIwM?lldKQh_B~8^|v(3g2M;&!MZwmsQCq5`0$Im zD7Z$;rUy0PE7ir$1-isNMVAa^X?c8!lwTa9j|@(hrSII(Wxa8-eE(>v=)5K?ng*n@ zH7r$?y|Qxice-l!QCVHlqtz*UWR0goYi@a4*Cwm3{bsk;4u^DIccVUfIiQanTBgAd z*URJEJzCdZCQsC+=#$&>W&OfJ3Dr2|sq6`|q4;NcdbB0=nekd5`BEB24Qa!flhW9K zNuPPET{echbkm*>baTgEeYWwSHnlWqlq1R!J>nnEsF;!e{b^Zo(qE=^^t&CWy=snIbYrWRl1%k!d3Hv^5ju=P*-bs>ocC z$s)5wrfX~Fi%b}qF*0Rj&d8*ZStHX%=8a4onK?3bWbVl1k=Y~DN9J#95`bg?Ndb}r zBne0skTf89KoWsu0!amu3nUpxHjs26`LHz!K{8@%Qi9|JNeYq`BrQl@ki;OFK~jU{ z21yQ*9V9(Sevkwq8L~AgLULqll7wUlNfVMMBvDAFkW?YLLXw4K3rQD}FC<||#%xW> zkeu0?q#;>D(uU*>NgR?nBy~vckmMoRL(+%j4@n@BK_rDp4sA^mkt`x_MKX(|7RfD=TqL{J|FFApCdJdT UiL%?Dn~|T9<@RT1VPi_@% literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Paris b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Paris new file mode 100644 index 0000000000000000000000000000000000000000..cf6e2e2ee95355039a90146a7f77d14224551b65 GIT binary patch literal 2971 zcmeIzeN0t#9LMo{6$BCSi-wq>n1rYy&ybp=hDa(P>P<;SFcCG$j${r^Lzgq3=Ds#( z8JehwPl#5i82J2zOUY_xS}x0_Jd&eK_zCWJP zQwrlqy(PdGVh?UVbkdG=*Re)iI`^b%8cKFV5CzrtF3=uz|9;-9T`<=str{wA}2 zp1;`;-P&xNonb1H=9^99!mY}PB(piP%xuZ&Vr})AYqnlbw6 zP4(t*v$K4twd+N1^ZMec<_)W}^=9!Rt0vpa+C3=7?1{N*?Tyc{YFjl}wRiVf`@Y>~ zz4bx9sr&GRsc+b8_SbGP2iE0T2VYrY4!vs3;gTYAWOA-Knv-RY_4T%n_lz|sdap7k zbE>S97n_$i6h&S>eQk)G*&3{k8&c(+mlEad&`&R)UHqMSx45mmm(@>O)b(=tZx1mo zD<){b()QA7L7K{pWDP8c)YhJM+9q>=+>`L528DmEZQFdT!A;L-@Qnl7?#fQR_x*Bh ze{_Y0)bE$js%q)5W}S3grV=)1zH}-omixv|kj@z%3Gb68_eUj5L};XR@oy)Q-l-aS zGf}&K9--aNwbky&ee{8v+Zt8zrS@2PQKJ{UtuZs|HMU@f#^qj+_~IH#NU4*=;j1L6 z!&*s>FOlRsrP4EGrS`luUV8mBQ+w}Em4`mc(LR-Vno`$WA70pB`<8`jzrt|szo3^q zGSFL73qoW-#5GMzy(0s?PicDiCz5{sstjs+SOzsV$lxm*Wk~fl$vAybGnX%utg7`o zblNn@UiN|x8?{7-7fsX=4;HB>BV8X0&eD-l-E`!wSj`C*F`O%IH1c>zH$X zGPXQWa%;YkaiupTZ)Kz8=be-BbHCCj`tFqpxu>-tY_&{Gsn$Z@-8!j*>ZC7T*2#B@ zbxOl5ee#k=r*0XeMJJ}qQ;Sk`TIC3NdUBXr3zKB}us%{;7%b1kb(9%tKghFzE}0n< zq%+NDQW9`WOU@pXS=TS<>|K@eTw|TiS$#z3R(|2nzk0b`P2%jICRZ<)D?r@7yyG|f=X+P6%N5$m9rTB5dp`5~bM7-TJ+5r~ z9F;bLi^rAfoX#8jvCHLl|9Uz%&R^o^j=% zMe>Uz7|Ae_VkE~%l94PUX-4vlBpS&yl4>N^NV1V^Bk6Xu^Nl1N$vBd7B36jAk4%80Jp;%TAaj6B0x}E8G$8YUOaw9$$W$P6flLN6 z8_0AZ^MOo=qdg5t6|7Np!;F-<;od5sTPMse8-XG7D`8ko+A6EEVo(VE+*5*~(W!yj&Xc zDO!6y57yod9ktKp7TUM^i#iX!)_&y=G_>@FhAlgz;n~MDBJ;jP7F0`ALXAX^-!3r$ zyCpWVNMajHB+jo~;~veF0pAOC;8~XpdYGZ{m06llGf)R_9Hv8d`s>h~ARSgZK!zuJ zsVm!0Mg+f9x2sVSy{>6e&|^t@_d=4Jo|ojht1{}@0U2F&L{e(cY3i0TNjthv$K>V7 z*s={eZqjBQpF2m>`{$}BB}pgvr0GOwZ=Lu#Tr)Z(O2)l*I{8yCnR4o*PHpg(X?xpB zX7yW{Uh+Y*%IjoCR)fr3{YGaEIW4m@Yc)HtLgpk?X->mKC0k0=(X2^R^KzKCSMz`QvaI%T=6qRg z#A^2I>EG4S(z1Sk^4pYDkL7Z6r+ds791h-G4u|LOr+J0>L;Ey;vA<(kKg=~f{{2Yg zbR#DmIpxSnM@~C(;%&{TM@~L+`uVpMU~4KsN|?UAqCo+3Xu|RO^ryANR>#L zNS#QbNTo=rNUcb*NVQ10NWDnGNX1CWwx(vJXj@Y?QZ`aIQaDmMQaVyQQan;UQa(~Y zvH-{mAWL9t)&N-qTeAwtG9c@KECjL=$WkC{fh-2H8pv`W>wzo?vLeWmAZvmwimh1{ zWLc1PK^6vC8DwdYwLumKSsi3~ko7?p2w5RyiI6oy7RlDE60%ITW}T3QLRJb{DrBvY k#X?pKSuX4Uo-S`QY5gMDG-qm5XiR9hGc_U{!=k)@0!L5Jf&c&j literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Prague b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Prague new file mode 100644 index 0000000000000000000000000000000000000000..4eabe5c81bd1eaf255fe09cfe72f10f61762fd5f GIT binary patch literal 2272 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 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Saratov b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Saratov new file mode 100644 index 0000000000000000000000000000000000000000..e8cd6b10efe42e43315c12b28d87cb69bbb0c8aa GIT binary patch literal 1197 zcmd7QPe_wt9Ki8s`L5aQ(50NY*&mxrr}Z{BnKf-WbyzbbMuZhee}o|DAv_cW4l+*_ z6hTB0MWai94|U39M3+cCb+h1wPW>T%mmrc_&-Y!PIz+dgchCEIdA1$4-#0&eY&53+ zSj)@_o7H1B&npV%c3X88o)&9{Rz|LsRt4tl+UnVK?RU@Pz(-Z8n@`xQXU>)Cr!G6e z`)8fdjWMU;{84AknZ3^1<5_3jfuyrO*X%T=Hp+(9Itd5;(p0k`5pP6Cz6Nyjo6jRH zFF)z%lefCHIIG*POzTY(kM!oTTiQNyNpCqgC9#uNrM>H>#P^(*M5rJgvHjBVeD+Wg3{CXL1zyCl-}@b-IsBs z-}^vk8(&EF%PSeED$2mzJ=ytwQg%JOAi0@4dhp^2$>%~N`!c)rc)46wo~k94%ksL{ zQXiL9;cs`#XIV-`-9Np>R_3{X$WyIUGOd;`-WN|i=A`l&-pvi>Rn%@bJ7IQQDUW%v zcyL$#AEx>3_jk+>Dl=7NvK%vAWWvalUCpGCX(JOyrjAS=nLbhgQUOu|QUg*1QUy{5 zQU_89QVCLutEmMk2B`)q2dM`s2&o7u38@Jw3aJVy3#kh!45`f3l!nyiYKlXuL&`(y zLkdJHL`p~gUjyXBc!yy{+TN$N*$ zihVqk@+bInrbKK`$I&vkJ_N>Q9AGl<=uAecMb+#E9C!37SmL10Oy){Nwpw!5& zSZ%Dxa~e764kPDgTWDohfwAVp_h|0WSZM9z(P&=pqfmbL!)X5NH?e|_bKZ5wIzoj_ zhrR3f^~Bsq`-FS=RII3SP!=~{l^a|)WQqHPESWkjJ!##_^XZ^0`+Z!MKljOvxrHK8h$JZ_Pb`aOUOirm zbLP{Tdy9)FyiR}DMlwcHMsh}yMzS{5X(M?fi6faKsUx|Y>g18^ zk@S)LkqMaU86Z$sw~triaWAnV|SjHt5j9%`bBN1rVfCY5)KL literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Skopje b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Skopje new file mode 100644 index 0000000000000000000000000000000000000000..79c25d70ef09aaeec21f0a10a029650967172a80 GIT binary patch literal 1957 zcmdVaYfQ~?9LMqhL0H4S7)2!{xg6a~D7WL3s9ZY8CAlQGB%zgCF3rrEeOY4-b6vxT z2jM}?T<4O6HN%WC*O}Qcw>5t6|7Np!;F-<;od5sTPMse8-XG7D`8ko+A6EEVo(VE+*5*~(W!yj&Xc zDO!6y57yod9ktKp7TUM^i#iX!)_&y=G_>@FhAlgz;n~MDBJ;jP7F0`ALXAX^-!3r$ zyCpWVNMajHB+jo~;~veF0pAOC;8~XpdYGZ{m06llGf)R_9Hv8d`s>h~ARSgZK!zuJ zsVm!0Mg+f9x2sVSy{>6e&|^t@_d=4Jo|ojht1{}@0U2F&L{e(cY3i0TNjthv$K>V7 z*s={eZqjBQpF2m>`{$}BB}pgvr0GOwZ=Lu#Tr)Z(O2)l*I{8yCnR4o*PHpg(X?xpB zX7yW{Uh+Y*%IjoCR)fr3{YGaEIW4m@Yc)HtLgpk?X->mKC0k0=(X2^R^KzKCSMz`QvaI%T=6qRg z#A^2I>EG4S(z1Sk^4pYDkL7Z6r+ds791h-G4u|LOr+J0>L;Ey;vA<(kKg=~f{{2Yg zbR#DmIpxSnM@~C(;%&{TM@~L+`uVpMU~4KsN|?UAqCo+3Xu|RO^ryANR>#L zNS#QbNTo=rNUcb*NVQ10NWDnGNX1CWwx(vJXj@Y?QZ`aIQaDmMQaVyQQan;UQa(~Y zvH-{mAWL9t)&N-qTeAwtG9c@KECjL=$WkC{fh-2H8pv`W>wzo?vLeWmAZvmwimh1{ zWLc1PK^6vC8DwdYwLumKSsi3~ko7?p2w5RyiI6oy7RlDE60%ITW}T3QLRJb{DrBvY k#X?pKSuX4Uo-S`QY5gMDG-qm5XiR9hGc_U{!=k)@0!L5Jf&c&j literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Sofia b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Sofia new file mode 100644 index 0000000000000000000000000000000000000000..763e074795b3c7143984c9b334bd6f2f5a50445d GIT binary patch literal 2130 zcmb`{ZA_JA9LMqNC@3Bo`=cQ$AQ%v6N1pL1h>U=dU`II+sl+i6v4{|rL28H8xz?Eb zN37<`P0O)rj%Xu$L9GW}vyBd?m20hBELygv)@IHg#_Ias?95H;o!7nld~VLYF<$Wd z`Zn%p&NH_hxBZ5j6Re-mTxG9eUB5y}Qq!)3nE%+b}qu*ReO0UpyiO8(xyaq+_x? zuS=Fs24rPIzplKnMOOXYsjELIm3zLe*P?+&Ego5|_a0uOC9fpvea)%5=Flp+zdTY) zn-b)K^ov?nIw|FmpJ_$v_fm1?C#jtNu~Y`n$%7NG%i6)Wq-yj-tv=E#>rS1}huYf2 z+j~&gKm5FIXx*kYD_Yf8RiU-<>$J|ZMC-2SXnkC{)PFrkAGww(8&ChPo6fss^YK_| z7``Nr2ChnDe^C65=ViY6e0rYroyF>2QB zzKls|vHyK0F~vj}6C);yXIFIid1;O-HvD$#`NlVu)jm^J<};85A-qWLS=NT*$zXks(7v#>QcA97e}scpS#ZVSpS)$YF>a#>ioi97f4um>kCG zXb0+OM~Vy;87neaWVFa|k?|q}Mn;Sb85uJ&Xk^sLu#s^i19!9|M~3cb$Bqmh89g$5 zWc)|~kO&|lKw^Ld0f_<<1|$whAdpBPp>VXZK!V|Dqk)72i3bu8BqB&ikeDDrL85|$ z1&Iq17$h=CXdG>9kl;Al=pf-i;)4VTi4YPZBt}S(kSHNxLgIu33W*dFDkN4&upDi) zkZ>XKLIQ?F3<(($GbCt8)R3?taYF)!L=FiZ5<4V#jy8Ho_#AEgkN_ePL_&zf5D6j@ zMI?;ImNCL!k<(^OT{EL@y239UXSr|pWwY=de~b;JO`{E@O=FB0n?@T*2|wE$#)aQb qJ>U4I$_DcPB6&+C?H6ua(`9*7)Ki_GRhX5No$sm6&2gRz-2Vcz8|p{^ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Stockholm b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Stockholm new file mode 100644 index 0000000000000000000000000000000000000000..43c7f2e23f3c37c24d39e78f8822b12c5a74b5eb GIT binary patch literal 1918 zcmciCUrd#C9LMqJ0H+uu_9f+y@y{Yc^2lEyHOTaMU@FId=aC3S=N7B1m}4U*)mZ)BkL#wo_Bnf=*WsLV!Nu?W zu`6~pucpr|)kQy~X+|(spZ)StT|6|ao>M>TlD=`xJot@fwO`ciy0e;7c|&qrha|6P zSe9=2K=PB0NkML>6wLL=vV=ZecDq`Z|Jk7{E_vnoo8?+KP^Cq~EA)j!t8`_5qQ2OW zs;dqzm(|5?_0}cGnzWzP=be*c_t#pIdPhp`{U~cgzmTrPrQhxn$eR*b)RDANA zZVN`p_7l-kIW#FddZwkSZ%lSp1*Ll5FIuzmQ>m>S)w+};QeQNv4dEBGF-f)Y?uXhm z*Q&cly7ZOXw(kCTn>K&7SN6PHq%8vhd9^7;Uptg9dp8$KYeSs0kYPXa#M@;Z0G=2tG4^RWN_%syhirm zkUo$`kWL&;D@ZR$Ge|c`J4ioBLr6zROGr;hQ%F}xTS#9>V@PL?rZuEDN7EeA9nv1s zAJQPwA<`n!Bhn<&CDJC+C(DJM-i}Z^$jC72&jP#5&jdYE)jr5H) zj&zQ+j`Z$mnn${KH0>k(BO8G10I~(h9w3{5>;ke4$UYz&f$Rjb706y7n}O_xquCB* zKadSUb_CfHWKWPyL3Rb%7Gz(LjX`z>*&1YTkj+7M$I)yLvOkVygOD9Uwg}lHWRs9x zLbeInC(9KQ8WQGy_%F+nN&X45Q)Z!}#Cot$kbGr}y`k{quu UV0-*|nfaO79)C_YX5~fv4Z~=$r2qf` literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Tallinn b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Tallinn new file mode 100644 index 0000000000000000000000000000000000000000..18f903fa6fd864237a679dd06c6a55eecce89d98 GIT binary patch literal 2187 zcmeIye@xVM9LMp`fk$-7`Js(Y;t-M)!~>3>T7$$8m~m$)C;5x$2cj0C0y!v%?}|Cs zn7u1D<|=;_qaQQoA8Kp%d(Kf_bpNo{sO4&9W6gcHa%LN=&-0ttKd$vpfA+b3zmG4+ zF`VP|jBMG}UZSo$+PuTX={Fb8i!F0IytyEH_+61BL!)v`E#EWNy*o5{;?#xD&W$!k zFE;4U-}K4Ut2O$I7s_<3=lq4V+}C5bEd09Kmps$x`+dPj3unEt^qHFKTca<=GTu9C z`;R|wXTJQjy=b`G&gyTovpY80w{5Gl7l&5ZIhA?#?SXWAi9cN}o$pb(?s6;l@=`1B z2cNZUI@!uUd(~Qga@Gor%~%B^QLAw1eXFQv!V0z>v5H&HtCFs9Ra*77D%)^Cm1jPu zDv~~EtSIT#6?21nWyXk9j<-tHnLFjK{i|iwOMao5JN*Cu|f*G^69d%k~7H%z>xL(vZ=?d;Tz!_Ub2`<|5z z9owa8MTbN}^|H~oPMQPDr1?rvHl@|+O<&$Dn=j|-EvJ8#tyX}FH6iWEr({Q_$c~>zW#?R%?3(P8N4|;3qi<}L zj&pnUV+X3FbG%9K-kBwP_Lu9u>nn9vyH9r)FVa1=SM}qmO7AO5lYRDgy4QO}dShpG z-=(kQi4)`c$*D8af9Mk#n0Q5=>Kl{6gM;FlmyqakC*6>kkeHB^{MYM7&$ZW0^RIg? zNb$P8DgVt&DPNiSbK^cwDSx&rSt+kpDe=2MTcs+MA5>}a@2;$NrN`fiKf5ydE}x8l zo_F$tuFOz4q9W$1scqsGQMKj@H#L}Rjd?b2D&=zVFEDVN$G>mp>&U+^XTW^kSmb$O0YB3XvruYeW`_ ztP)u!vQA{7$V!o=B5Oq!i>ww|F0x(@3+Aw5N3&#P&B&sWRU^wr){QJ2Svj(FWbMe} zIjo+;@;R)ZLjgEcz|oYz(bNDb0#XH}3`iZ2LLikuN`ce@DF#vvq#Q^+kb*dxiXbI% zG&Mnrf>Z@53sM)PFi2&P(jc`#ii1=KDGyQ~q(F|QLP&`mO^uKuAyq=kgwzQs6jCXq zR7kCmVjV^~!sT@)|q;^R0km@1jL+XbV5UC(i zLPt|Wq==5DibxreIwFNcDv6X5sU=cO^?x$?ulT2AdQ4;sN~mifTv}LO7%VCcgo}gD HQ<>*aTU8Lp literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Tirane b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Tirane new file mode 100644 index 0000000000000000000000000000000000000000..52c16a42bf1ab1b5db5c1e3d4b808ab37384ad18 GIT binary patch literal 2098 zcmdVaZ%kEn9LMoPdKbGPeZlZ*fLKJJUV+QML_yOVpb46CHT**y6A=^XK*XRlYC3F< zx$lEJ%ayB^W95uoBmWGYe`XCAGS|kOI@9S=agOd*PFu42z0aez)`On3b2=#2)XQa2}g|#7AI{WpbBF%9eLzN<*_ev1Xk-Sss$q zq7r$^Um$5o>GE{UL`nAqHT`a$X8e?z#v~M5Q>Am;Wzjs(?gfD95_U|>T<)~)Y zeyM@#3zE~^E4jselDBM^Y zI;V4<&iyb+pRG&PdD{zReyK-;wTbdv+D$D9j!LQLjFzQdk+P8+vT)2vSvc4)&tLyc z7WM3t@`2-8v9n7S@BdVnG&af$UE6f&i|^^OhV@$cOoN8X%XGPKv99n>)fM-$wJM=h zs?Nvj%DWk|>fo=sddMqlK8cg+-aGPA$1hS79u&J~NY-w>tuN0#BU8Ey)6ybouJg%j zfyvTR@|(OKXGv>Tg0@DkNn7kaZ98{b+D9(v8wa}O&A~q1vip>7?b)MmweQuAogHdL zJ@ilKn6dxaX<6|fm=Dy76>F?zB~6Kn{_AsjMaT-4a8-tQD=Nyph5p6of1m%E;}3H% z17r%w9FR%4npyBJ({MHOKqlg9W`axwnF}%*WH!ijkoh1JLS}?a37HczDP&g2v|P=+ zkcqjPnITg{=7vlTnH@4cWPZp5kr^UWMCOQ05}743O=O;~W}?VUk*OkcMJ9{P7MU(G zUu43_jFBlLb4DhO%o>?CGH+Kiab)JMX6ne?k;x;oN2ZU=A4vd`0VD-T4v-`uSwPZ& zB_vHqo{&T#nL<*92 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Tiraspol b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Tiraspol new file mode 100644 index 0000000000000000000000000000000000000000..2109b52a734c1eadbc8ffa4fbdd5e6a53fbbb60c GIT binary patch literal 2445 zcmeIzeN0t#9LMo5@hBo)*NA5|OhCQzD2gRY;>8ruiy)E-o{|s+EmRB>@HgieO#>5a zR;*ZSDw{G~j8f33Oj!|7W2=VN*_ve!)3eIyGFQL%Ay%zFT7UFkpSyG4c!y3mzc2FF zY%EQZzs;dP;bD#X;p=Fn-(D_%CE$&YkNr+9_|Z6Zt;IO~#WP0tV4cy^*Jhr1^F{OQ zv3=%ShilBN)y3vJWh=~g3)9VW40$lNL*YHGR>bjV zt;m)=)};O0tjRSc)|84>);()8t*Gp|*3|j2*1gV9Yg&ZA6+Qlz6`hf7#(1ZwnCsCh z_HwYAZd@^@4}WjWI5+5?**Rc1UpwiZb*RIL+uQ7p-+s_YD5-KM7PXs6TXzj5r=5`5 zD;p#wvPtG7ZIU^+DuCyShfLtXQq`<`%2`?0ITcaJnjRhO2@bQK~Q~RSG}xQV(4ZlQmsm zsfUMuk+rR!Qq=jm6z{$)>kjpbvF?IAQhQN7y0A^w7oAllllRGEX|1Z%@2J`kxkqid z^0X?uU7|Mjm8(scGFADp9940Cy=-oXS6hy_WTUosmzU&t)=5+TcSg@yS|eu z#}Be2-dF9ghNU|28&y5jB|EQvpq}bDEV~9ysG1i#Rc(8ds@wUz+TB>GJnr!J^!n?| zXPmE}uitq8(O1BPKVCliJH37W!s`_aG1$y=9;1)_ z1t0u*`Tu;EP5S%oyS(}PZ~RrSpsVjDtZgrra~- zrYUz#xoygQQ*NAc=agHg+&kswDR)n~eaih)44^o`KMM;e9#BlMt6iYjK=FZM1jPx8 z6%;QhW>DOq*g^4wVhF_%iX{|JD5lueu25{Tt9_vuLvhBgwua&j#T<$|6niNCPz<6t zM6rnC5yd2iOAMPBKH1eqF`TlitzvjZF^l0A#V(3p6vHTvQ7of)#xRZI8pAetmMQANGF_yTAT%Fe`~449=Y7xRkgA MXHH@QjZgOf4F;`^qyPW_ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Ulyanovsk b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Ulyanovsk new file mode 100644 index 0000000000000000000000000000000000000000..c280f430fad27873cf7b20af55bf47c816ea1190 GIT binary patch literal 1281 zcmdVZJ!n%w0KoB!O`4cEI8+ncq*iMhlQ#NHlagv$qe&a8DHI7EszULjAP64Pp@PtW zwUY{pAfkw3aPf1{$*MtI#I}=L6&{F#3UZ4mEgJ9tl1?r*ZSrSuWK&tU9>&&eHP_)3kjof_H4On=91~Z zcg74{A2*xN9W~dV9yVK!=gbWUlIF&I*lbNTnwvU2X3+0eZJs3+a)e~)n@?{3=q-jP zUKGP`7iHwt7uo*!o$M&h$>`%-9+YZjC*vTuZv*(72?>nUufuib) z?N?nt52<9+giOBAs_vx`x&2w2+Od$5sXH0j^R!v^P6y@AYeJ^SoO0KcU+wPuBr}J9 zsci6#?8}&{-*I2&T3@Q%*Vk&GuA~O$@2Wi?rq$jD=T(08wj8{0LKX6X(c$k6aScG-u6k#^)3s9H{^qhf?RFueqx!Xqh#~ZI|B%fkL^93$uHKhdY7QHS?2+?lnFf#!kQOX; z4@eV87f2gOA4nreCrB$uFGw>;H%L23KS)DJM@UOZPnNnVq${K?OWhaJ7}6Qi8qyom z9MT=q9?~DuAkrbyBGMz$q^0f>Y12~oi8P9IinNOKiZqLKi?oaMi!_XMjI@mOj5LjO qjkIm4`$ihK)SV-(BfTTdBi$qIBmLu~ZsC9Z54cnMU(y?myMF_y7abG; literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Uzhgorod b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Uzhgorod new file mode 100644 index 0000000000000000000000000000000000000000..8ddba9097f804a762815a54e47708bf6bfb5814f GIT binary patch literal 2103 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 l^DHw;{~o56Wiof6X03WBv0L%k$q6Y5iSgMoi zb4=$De;{Mk?CKA!HT*HN8Z9K$E<4I$yo{JpOPwt;{O*N>YJa?sMiza(s&1KY6;OM7T8NdXCQiE?HB9F*@ht zN&3LRO?CGDsB^n6Xj=Pcn!f3%X4Ji{nN?$wPdzDsfwdL%EaRq`hMGB2)6 z=UrMO`G2(N{9`UzaIr!Q`m42YaK1jYW05ZGj@O6llXOvgzC2PCp{}|(S)6=D-L45K ziuhEElfIGStKUmW*hwiF8ImQJ56RNNTT(iFLOq=wvh46deYCMr9_x5n%N~DKmp81{ z@&_B#TUx9u9Lsd2GgVjK$k2-DBB?lkmp*ZQwyb*ZH?0gt$?5}BrE1_8dD4GPs=G#{ zraCBVw*90}Eqq^UtA@2MagVGm3~2rBM|53+>bf6x>-q_wZWwCQr!RT+nKvr6;ge>0 z_LV|y>@Sy%>l3wUN3JxN6^O6iAgW`W2GktHH)L>7sx5?Lm)PJRvxMOKO|6~5qWortCRLs_t z45=AXG^A=s*^s&+g+nTbln$vKQaq%3NcoWZAq7M#XlqJ{)DS5mQbnYUNF9+vB9%l+ ziPRD)CQ?nLoJc*9f+7{QH6=xAYHNy$R23;JQdgv~NM(`IBDJ;tf4Pk^1)iHpi=CeA QwA{1|rzbN5)3c-g0&7TFt^fc4 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Vilnius b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Vilnius new file mode 100644 index 0000000000000000000000000000000000000000..da380af0ed2f4f6eb399ab4a3bf3a0d9b6a7ebc0 GIT binary patch literal 2199 zcmeIye@xVM9LMp`1*g|V=Nk+U0z@JK>4f8#+9rw}Kc;}9ocNQZ!V`-~(H!_AzAJOC zG54w1%B9O+qjJRj!|ac2S#yo*!uyA{My*yW8*A>{%9(AfKF=>utNv(h{n_XCy~lUo zJK!H)&+x|Wkz)0?lVqN7arT;v`y9)>9b1*zaPsLDFP{1#XrGRBwG0hh+413q{8;pA zt$h5NUk{%O$(83yB^E6IGCB8^*sPS#D*T?&2LCTJE~Sk5VyUB{iaVpv$I>pIu+s;g zwKI-AY0vK6WoPbhwdb_2wX-%?+jrG1w6hoI*>?w0?YZfxDks6Ka@}QC?)4li?;F20 zZ^UEeU%qMGbAHSUoEf#|_eHIOgKt}fy9cdc>&sSA^GB+uF{;(0@F%g}n;cQ5F+@lL&cs9Qh$d00R4>L%U({!V%H zaJla2Zco-woXryDZ(;KGl2A z^~=8DxAgv_@96`B$MqB4XLQez9__j%E@JW24 z{1-2!{1?qXnVNY{#Va+dO?i~^iAqo^eU1{P@`LJ*Kc2W!c+UHx3RlL|r&IT?tf`-x z_|Bhyk1MOLKCIT6tJYkhs<5guSAAoxxo_mA(mXIX6UXIJ$~Ac=AN~G`%N73T4ec{u zcQ*9%HVzLAY1J4d#T>>b%W zvU?8O=dgbc4RACaKw5zGz|k}T=>pOQN7DzS5lAPHRv^7Vnt^l!X$R5|q#=%`BS=de zO;3=fAYDP)g7gJx4AL2-HArue<{;fc+Jp25X^^Ao5Yi$?(<7uwNSBZ{A$>v`g>(vO z71ArDSxC2#b|L*j8isTXX_=$x8PYVQYe?IWz9Ef6I)}6l=^fHMqlZSC@TmSmIUgHg3ev3 F_cv^;2-^Sv literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Volgograd b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Volgograd new file mode 100644 index 0000000000000000000000000000000000000000..f4cb64f16c730b1da6fe427a786ae939712559d5 GIT binary patch literal 1167 zcmd7QJ7`m37>DsMHZdi2aM89lsh66@^rA6oO4PKbrcJ1(P$W21h2o_k2);-M1)&9N zClwSyL=nZ{;&sr;DnVStwv$^c9B}f2yh}kW8o%e%Ne6NB9M1V24#|-GpW@K5k+}Ke zsJ3soIC|{G^U861ySfMCn(1@phN;U= z@cvmRbYs+MJb%<#duE@r?s(o=e<0;-C`6s6^d{ZdR*~34yH~dEWvX16_ z4L2n~-_Diz~dR<(3`eeSv3&*@#_ zZ+EZXZ%njg|3}jjGhSm-8UEVbpl8MJ&mQ}p&lCoVrZtwZSBJfleARgD;Xc?~@gD~K z`s+*fcT^Y>8I#uxij0a3>uSeE21Z6khDOFl21iCmhDXLn0ze`_LO^0bfvuo*5 zQ&YGh>qP!na`N(I`D{;+HoTD{pO=o5MrTh}WAR~gYHMlU>CN?7XO`T~J3Bc-n-=bu zb3^Ood~~pU(Y;)ny^m{iYk{^l{;;{%T3$icgzoatIgHzTg{JW zGfn&Y=gqacB=b||T+>k&X09iWGdBtoou7k4O^>L~ydKpvoq$*T&3(nA9a%fX3C!;A z^z`^Sy)qI^@Ax*SPsBy1Z?6U?$mf_7)N#P+cWIZ?|4gY9{J}&92$iAH>bjPbE ztmGvVzG00Sn44_|&7WxoT{zc%f4WB^l2YY?=md!j87vR__mjcCDLVMZNFDNBqz-NB zt5F|y)rabCX>@g~4lBE$F~y(i@U=%YHhaIuEohbztLr2_xn4$2FPBlFRgy5GKoUBO zWXymv9dmK9jQurV6OX3IxG(2uQq3Ywu20m5H%-v-l_B~_PJ~V<9xIQg`D#k`0C_C( zvZkhVN}BH{Ix*sFnRxYkndEa^CN-Rp$1lAplWX@%`pILOv86<&?AxVJtXwHmOE&7X z*_(BG?oypGI#)gE6Ln_L6rB}4RA=3c)j56AWX}1XI`_s9$vkvj=Qa7s{GEZapsr08 z7Iny?vIfao)Fg`wujrET@5+-4PHJ{|g)B|3)tqhzby=wDvX*VSymPg#II&Kjy6DlT zchA$@k5|bvFDL8Dni=x!@^H=DG)h)YOOn+&L9!+;OxC9UBF_aH$sgWF^V`3bf`FS^ z(DF)R6zl`a1z&=V`yBHHP(5ss<0b+Xm^*$=rE0AwY-#@Q^{4zbmV`kfTO6m+Q z9+S#Vs=eWO*<&y6{hiOAe}BsN*k8I&`K{mociWy>hZ?6MPd)PFyV|E8DF9Ldqy$I} zkRl*eK+1sB0VxDh38WNAEs$ck+G-%>Kt)D}$5< zsSQ#bS6dyVJV5N zA(2WVr9^6p6cec?Qck3vNI{W`A|*v?iWC*8s;ez4Qdd`7SfsK@X_49@#YL)%lozQl zQedRQNQsdeBSl84jFcIvv#TvMQfXIPYNXakv5{&c5t6|7Np!;F-<;od5sTPMse8-XG7D`8ko+A6EEVo(VE+*5*~(W!yj&Xc zDO!6y57yod9ktKp7TUM^i#iX!)_&y=G_>@FhAlgz;n~MDBJ;jP7F0`ALXAX^-!3r$ zyCpWVNMajHB+jo~;~veF0pAOC;8~XpdYGZ{m06llGf)R_9Hv8d`s>h~ARSgZK!zuJ zsVm!0Mg+f9x2sVSy{>6e&|^t@_d=4Jo|ojht1{}@0U2F&L{e(cY3i0TNjthv$K>V7 z*s={eZqjBQpF2m>`{$}BB}pgvr0GOwZ=Lu#Tr)Z(O2)l*I{8yCnR4o*PHpg(X?xpB zX7yW{Uh+Y*%IjoCR)fr3{YGaEIW4m@Yc)HtLgpk?X->mKC0k0=(X2^R^KzKCSMz`QvaI%T=6qRg z#A^2I>EG4S(z1Sk^4pYDkL7Z6r+ds791h-G4u|LOr+J0>L;Ey;vA<(kKg=~f{{2Yg zbR#DmIpxSnM@~C(;%&{TM@~L+`uVpMU~4KsN|?UAqCo+3Xu|RO^ryANR>#L zNS#QbNTo=rNUcb*NVQ10NWDnGNX1CWwx(vJXj@Y?QZ`aIQaDmMQaVyQQan;UQa(~Y zvH-{mAWL9t)&N-qTeAwtG9c@KECjL=$WkC{fh-2H8pv`W>wzo?vLeWmAZvmwimh1{ zWLc1PK^6vC8DwdYwLumKSsi3~ko7?p2w5RyiI6oy7RlDE60%ITW}T3QLRJb{DrBvY k#X?pKSuX4Uo-S`QY5gMDG-qm5XiR9hGc_U{!=k)@0!L5Jf&c&j literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Zaporozhye b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Zaporozhye new file mode 100644 index 0000000000000000000000000000000000000000..6f148505b239ad9adebfd94606f1e4f311fb354c GIT binary patch literal 2115 zcmeIyZ%kEn9LMqB6)3tEeRabN0YagHig3AzqCsNU3p2p3awSrUYawb8AsPe!L@Vc7 zWA58zIcIK`jEWhv4ebHC{<&t2Zuddf9J#h?(VV%nm9uiJe(&RGZ9V8w&pK!4yv{wq z-~pd^Wc{|*fceL9hke7vvCCdO&w0+?hSHDwPYt9;KOLHgk4@CbXK(p5_IglaXTR)7 z&3hw0EA8t_U-Ed^_xqjir(I5or;i6K?;1N8&p30;$vpA0llAKJ&g{M&PWGM_C#P+l zbN9w7=bqXnPHuU=Gp8WknVac#?wx+a$xF)X$h(%-k^lWq;dx(NiOxUwd3eD{ELt$| zPIzJe$!OuegW;l`XVl;FwiY*CltAZ*lvIq$qP4F`Y1UC$9O#zClf6=w(XVBfHp$W( zUApXSQ0^OV)bhb*tr%UV_wQe!%a3GgWoxdk*tb+3s7lgcONOkRJE5WAq*Nt+qSd+I zNcGhpWL3fkvMP379{ldO)C>(y$5>LGcDnk#H7T8TW_ApxBcz(PP=(dzx}^Bjmi1d{*#%UxJfi7 zGsk$1neR6##-xau$s5nCse4(aCu8cXQ_r4k-f-tgsDu&>9TY z^I@fZX&*Q|9`}O34v#1D@5|V2zujGi`$yXkf7qkp^he3aQjoPEi$PX{EC*SSt6dPk zo)sZWLe}JJ7lo_}Sr)P`WMRn4kfkAOLl%du4p|QWT^rNLgHM zU68`K+R7lML282(2dNHH9;7}V16bY#kQYNHMNTFP9rI1n~wL*%8R0}B= zQZJ-nNX3wnAvHsahExqH8&Wr_-KRy~KLI`|_-OzD literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Europe/Zurich b/absl/time/internal/cctz/testdata/zoneinfo/Europe/Zurich new file mode 100644 index 0000000000000000000000000000000000000000..9c2b600b103dc4d1f49b5f087055e19d3e031129 GIT binary patch literal 1918 zcmciCUrd#C9LMqB0S*~U_N9i$0t7oE{yFj=LW4|?z^DVIoRk#AKL~0>K}Mh$G#PV^ zxvv|mxnj{|%sHYiP%rS$(sHK6+KM$S=cY5wnsZYI)>!@CPdBW(_IY-m*K>diE`IM% zaQ%+zbn~CfZGXat>mB>yeP)||T=eWT7q8WuOA`Sze74j?dw-|-ibY0fu_Dh!hYueWqy@W0Kx5C>eP} zlDXys$%^Zi?DQtdo@$kxm@dt^vRRh?*{I7-`Q_Q4$~3pHQuBtE>2n<`boocI`h2xl zSF|scl?86~SH;Mx#G9J$pOOOiH(KbuDus7`k)qHqrD)`Wym0-nyf|=F0>fvt_&}$W z^na=^)z!(%o%?k4y7zTW?KUlardET2LVd+kqHBE%b?ro|mPHpx*^iIwtK$n~{qg&{ zVKhR@d!nRb@ORnRdQU35Mr2dvsBGSQTemDfAzLekwJQFQY|9(a>KVthCQh~H)`z-% zszG;LXx5!qg8JH#4O)A?US8jyr*(a$^2YXfeX}D=>R0DVL$ycVN}D6Q@*l|CQAQe5 zqP6kvHED{R(5COclIA;Oy8DYh*)uYvEr-tP-hpm?x4Bna5438C%if`35BoMI{11Do zOl*QH%$P_qk4}GISsXO}{8Ao4{>tTY9>M=Vv*Grae7KtJhxe#SzS-+9d(FFhyAA7q z2=747vZFoE$eBjYH5X?aIp4?`ceLjmIqS%IN6tKQ?vb;PoPVSNqywY{qz9x4qzj}C zqz|MKq!UNm3epSG4AKqK4$=?O5YiFS64DdW6w(#a7Sb2e7}A-eZ4K$o(Kd&4hqQS&uqx^=YeBK;x_BON0xBRwNcBV8kHBYh){ zBb_6yBfUG?=8^6lZTm?7$Oa%gfNTM>2goKMyMSy1vJc2cAUlC<1+o{&W+1!aXtx8| z4`f4-9YMAP*%M?_kX=Ex1=$y5W00Lewg%Z7WOI<+akSfm?2n_}AY_M-EkgDP*(79_ zkZnTt$+$v8>>cKQ*tan=_#fCQyHIwg?AJ&!GpD}?>`wiAtNs})`;4&TwIq!h^A%?# PXCh%sdF!Yp zo})#oKr`C_xqiB{Lb&^cR0@Re!e`th9*Y2 z?s+_D-{FVH75l^M!1wGg(;6)@)Asu5>D%3A#+-HLtLZb$%#7N`e7IWAO1))f51OvO z9<$NRiC<~HX;Y%-HteV8HO|wSO~Q5NnPM~FwcE@usG%1WUDOLVB!qLWFw2r-&GM9GCcA5d$%*NuzjG_IA}ZCata{n3s^>F6=R@i(EQ)-zEM1 z{+IL*D|hQ3mzJ5IzR1yQrUmP@qcZf*qf7NVZ<=1;ZI1b+WpAC=dad5z-D@@!`kT!` zjbwAi%d%x>J=yy9Q?hNTOY-}9)pj{5JBIg_ohd%wmNFScE z)f`EA-W(k^QXlKy#QfnAb3Ce&IT5``p9~Jur>c9*sgjDisC0xrU3gBPInYC&UAQ1Fzp+dQT#VNh zm(@0vcDQxr$+t|ECDnA*5eJQ$8esyvtufWolzAv}wyEyDY-)s_k)W1&Qqy;v)T)&! zwT>;8hl?jj?RAqS_{cm}XJMAAyY>@RZ=$G>S;Lf0N>TO4#i>VPJu0++Q`I26g=*Nj zi!`cKOEqrtxHP`@goFiDm9T;!X;O4a9?LG4@J+kr@hOE8@okPY9r?YuKgkgH$p)^- zKEJ7`lx)>3I#)f>{d3j4?hMr;YLseGnyy*~Pmz`f`m0tYsnYs~_UftqUU_J<~H`edI~ebcX~gem!|UqXTEKlZe|+Gd3s&}XX* z44JA1MQ2IkgE=y|uE^k188W0aMTTxnlh+P-WLRczNy;0cUjH~+hR^Mx-WU=h$>W== z5#63vDTy`Jo00X@$PPEuTY)Z>+O&qGUOcKsRk<#scC1%v=YNyYOXjLE`ML7W)SqQ+ z)(m+!ZH}Z*N|y(G?)T~IbN9(NeedJ@<;vgtoBhiF)3d@qefVELyM6n1j=f;6D$1uE za@6W*pGv&rvhV!;eLjti^SIje@VGkRbM}SH$H&M1INwFjzu(TQcm5bxVDX)Ax$Ix! zcI`g?Taa7oXzwXZ-+9n`fK-z%x0cix%38WQBFC1+%kZvIDK>C3+ z#L;%d(Y6HXiKA@_(iKPB7NjqZwlPR&kk%l*L7Ibf2Wbz|AEZG@hmaN_JwlpHG@ z8|_2-hcpoBAksod+e4&@j<$C?SSkDWJ4f30@)JCo;f$R=sdm#G**&xUcLAD68N03c|>=I;~Ao~Q_D9BE6v|9z)E68R+ zb_=pyko|&e7-YvFTL#%P$fiMd4YF;JeS>TqWal{At%K|xN4t5D-Ggi&Wd9%=2-!i% u7DD!r>wf1D6X@>q|3PH`740Ajuv5uxCsTM_vxw#q?xvC9aglCb1^fkK<6HXx literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/GB-Eire b/absl/time/internal/cctz/testdata/zoneinfo/GB-Eire new file mode 100644 index 0000000000000000000000000000000000000000..4527515ca3f249a44599be855b3e12800ebe480d GIT binary patch literal 3687 zcmeI!dvwor9LMqBn$hO=nHU-N(OjC={5BD438AqqmtXotj4)(rmX?v0Q>h%sdF!Yp zo})#oKr`C_xqiB{Lb&^cR0@Re!e`th9*Y2 z?s+_D-{FVH75l^M!1wGg(;6)@)Asu5>D%3A#+-HLtLZb$%#7N`e7IWAO1))f51OvO z9<$NRiC<~HX;Y%-HteV8HO|wSO~Q5NnPM~FwcE@usG%1WUDOLVB!qLWFw2r-&GM9GCcA5d$%*NuzjG_IA}ZCata{n3s^>F6=R@i(EQ)-zEM1 z{+IL*D|hQ3mzJ5IzR1yQrUmP@qcZf*qf7NVZ<=1;ZI1b+WpAC=dad5z-D@@!`kT!` zjbwAi%d%x>J=yy9Q?hNTOY-}9)pj{5JBIg_ohd%wmNFScE z)f`EA-W(k^QXlKy#QfnAb3Ce&IT5``p9~Jur>c9*sgjDisC0xrU3gBPInYC&UAQ1Fzp+dQT#VNh zm(@0vcDQxr$+t|ECDnA*5eJQ$8esyvtufWolzAv}wyEyDY-)s_k)W1&Qqy;v)T)&! zwT>;8hl?jj?RAqS_{cm}XJMAAyY>@RZ=$G>S;Lf0N>TO4#i>VPJu0++Q`I26g=*Nj zi!`cKOEqrtxHP`@goFiDm9T;!X;O4a9?LG4@J+kr@hOE8@okPY9r?YuKgkgH$p)^- zKEJ7`lx)>3I#)f>{d3j4?hMr;YLseGnyy*~Pmz`f`m0tYsnYs~_UftqUU_J<~H`edI~ebcX~gem!|UqXTEKlZe|+Gd3s&}XX* z44JA1MQ2IkgE=y|uE^k188W0aMTTxnlh+P-WLRczNy;0cUjH~+hR^Mx-WU=h$>W== z5#63vDTy`Jo00X@$PPEuTY)Z>+O&qGUOcKsRk<#scC1%v=YNyYOXjLE`ML7W)SqQ+ z)(m+!ZH}Z*N|y(G?)T~IbN9(NeedJ@<;vgtoBhiF)3d@qefVELyM6n1j=f;6D$1uE za@6W*pGv&rvhV!;eLjti^SIje@VGkRbM}SH$H&M1INwFjzu(TQcm5bxVDX)Ax$Ix! zcI`g?Taa7oXzwXZ-+9n`fK-z%x0cix%38WQBFC1+%kZvIDK>C3+ z#L;%d(Y6HXiKA@_(iKPB7NjqZwlPR&kk%l*L7Ibf2Wbz|AEZG@hmaN_JwlpHG@ z8|_2-hcpoBAksod+e4&@j<$C?SSkDWJ4f30@)JCo;f$R=sdm#G**&xUcLAD68N03c|>=I;~Ao~Q_D9BE6v|9z)E68R+ zb_=pyko|&e7-YvFTL#%P$fiMd4YF;JeS>TqWal{At%K|xN4t5D-Ggi&Wd9%=2-!i% u7DD!r>wf1D6X@>q|3PH`740Ajuv5uxCsTM_vxw#q?xvC9aglCb1^fkK<6HXx literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/GMT b/absl/time/internal/cctz/testdata/zoneinfo/GMT new file mode 100644 index 0000000000000000000000000000000000000000..c05e45fddbba6a96807d30915e25a16c100257e5 GIT binary patch literal 127 ucmWHE%1kq2zyORu5fFv}5Sse7xGTH`z)iG`KeIFs-DolG*Dd7oHQeCrbR#|gS` zcsQ%w!@V@=UI*h%*{-2R+nrt}H>3NK_v*H^-QRxIJUCt}534Vko>SN4(TXaYS~yoy z`3jq!5|Z@e8TQHW8+mFc?6X_l(tCEg>ASE&Ki@xYUYzLCFB{_K)t>YE^`fZhZ|;!H z)N(VhvRwvpYwh67!!np!V227j<*hBT@A?{K_~eLv-`T21_TIH0WS#!lc*TA?v{-+x zykkbUmFclrmrb^2RDYS5Fu7@)bw1c)@?)#?*Zykrt+!dmZ*Q^_*Q@0F#Y$T^Ge^|X z*|sPV6yL6Z^=}-IKz+srYXUm7)NhLCXLRv_dm@{J?9^mK(O z+ubV4SLE}%=ifd`?TENPSS5}X1(a$_sxWs|^7CF-A5&|h>v_dgt@HPZ{l$d2Uq36j z!<5LJ$fU@u$h643$i&FZ$kfQ($mE`Gc4T@_H$Rd9k^zzek^_#B!*;$q=w{%B!^^&q=)3^=@LXTL{da@ zM3O`=OD?3zad`rXBAFtoBDo^TBH1G8db)g(ggsrxNXkggNYY5w_#dPlakZD5$PYD~ B5Gw!x literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Iceland b/absl/time/internal/cctz/testdata/zoneinfo/Iceland new file mode 100644 index 0000000000000000000000000000000000000000..dc49c32470906fb2ff94fc599c73141597443f98 GIT binary patch literal 1188 zcmd7QPe_w-9LMqBnvSrDL7-$%-zYVZVEsW5ifFMq)DE#h)Ws1MBn2r&w;GlZ{UJTn zY1KFJ6#auhFm?!nL``d%wwBpnb83Gy%Vt^Y_kMQh(5X&64|`q@&$C_jd55>}*}cO2 zad_+#J{$r2;ocjymy?mB8f#o&&L@sHT&Ud=z1ZvaYN*~^YN=>wUR@S#Zav_=8!R?$ zYs#c8Rdl1hbiKCUDV0u7iFRJ`>%IOi={mJUyW`j8{$7thh&4)LQ(7O^U)7%S4t=!i zjP_P0q%TmTkLTT#WJySqQ)eYLXTPML9FnJlMcUuGO`dhHl7Xg!`utj2A%pjB;R_L>i4u;r{e)J zGhDw2?@ahF zM$F`XVzTyNOk_}GRAg9WTx4KmWMpVZJ2o;nGPB>xJbN6z(~Z7He@7bBxodR{BOc8u%-J7 FegQpVSd{<( literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Indian/Antananarivo b/absl/time/internal/cctz/testdata/zoneinfo/Indian/Antananarivo new file mode 100644 index 0000000000000000000000000000000000000000..39631f21486c61a19639d73d7571ef0840176b3e GIT binary patch literal 285 zcmWHE%1kq2zyPd35fBCe7+a(P$l3Vr)}JkhW?eWw(f!6-{fAc=7@3$E85opWKq|Ei z7+4q>lr@}KLaBZ69a?u6QD4ITL4I1 yNCE?gk8cQrwt*=Sn}H;NAcO=ven7M^0FD0-vJ1oo*$1LYv6IUNXuqAV85aO6nk5+k literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Indian/Christmas b/absl/time/internal/cctz/testdata/zoneinfo/Indian/Christmas new file mode 100644 index 0000000000000000000000000000000000000000..066c1e9fa6e0f6aa4121fe0f2378512523cd5fbd GIT binary patch literal 182 zcmWHE%1kq2zyM4@5fBCe7@MO3$f^JT|34!m14FV5NGhp-fyKu+ghAWD9K>Y^A#55m lP#MTXjvpWmKmauGf3eugCm=S+bOzkUbJ+kbvePx^0swfE88QF> literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Indian/Cocos b/absl/time/internal/cctz/testdata/zoneinfo/Indian/Cocos new file mode 100644 index 0000000000000000000000000000000000000000..34a2457bef2a41129dccb62f4320ad66a52f64da GIT binary patch literal 191 zcmWHE%1kq2zyM4@5fBCe7@MmB$f^JT|34!m14GmukW_RA1B;Ju2!pnPnXv&#fFXpi qdCWj%ATzmsfHVLB(8&Kap=wJ&Y>@d3_$=VE0b6FLYi4C^zy$!wEgQ`M literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Indian/Comoro b/absl/time/internal/cctz/testdata/zoneinfo/Indian/Comoro new file mode 100644 index 0000000000000000000000000000000000000000..39631f21486c61a19639d73d7571ef0840176b3e GIT binary patch literal 285 zcmWHE%1kq2zyPd35fBCe7+a(P$l3Vr)}JkhW?eWw(f!6-{fAc=7@3$E85opWKq|Ei z7+4q>lrFtGUehA?Ow jn1HwpAtV_21FVCA0chfXkkKG60pq!BfEL;5ns5OC3tb#( literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Indian/Maldives b/absl/time/internal/cctz/testdata/zoneinfo/Indian/Maldives new file mode 100644 index 0000000000000000000000000000000000000000..3f1a76e55bc1a7445d9dc2df31be87d6b35b4f74 GIT binary patch literal 220 zcmWHE%1kq2zyQoZ5fBCe7@Ma7$a$-Oct-vI|Nj}8m>3vbUV!9*BntzBTL1%xk8cQr zFA!@Rn1UpLAcU~-K)qlqcz%F&Ffag3{~xw(z66K{SqBoX2eKK6w3EvQXuqAVDHi~T C^d|iP literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Indian/Mauritius b/absl/time/internal/cctz/testdata/zoneinfo/Indian/Mauritius new file mode 100644 index 0000000000000000000000000000000000000000..fd8d911129bc22fe5a1d1ff93e30a070d3452d84 GIT binary patch literal 267 zcmWHE%1kq2zyQoZ5fBCeb|40^c^ZI3XFcl-3D&m`61R&CJej9G@I2Rlq5l8>{|row zK*+?vVEO{6ioq>_k%fW5!hwOq$2WvQ+rSivO+XSr5JG~LKOkBdfHwRGSq>Gr%;^DIl6e=Wy8ooo1(N!UX``@hg=8 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Indian/Mayotte b/absl/time/internal/cctz/testdata/zoneinfo/Indian/Mayotte new file mode 100644 index 0000000000000000000000000000000000000000..39631f21486c61a19639d73d7571ef0840176b3e GIT binary patch literal 285 zcmWHE%1kq2zyPd35fBCe7+a(P$l3Vr)}JkhW?eWw(f!6-{fAc=7@3$E85opWKq|Ei z7+4q>lrXJBMxU@!p+Ffdp+FtGUehA?Ow hK=>gf82JNi0s{lk#Qz|pL0kgHbJ+kbvePx;0suyn8S?-D literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Iran b/absl/time/internal/cctz/testdata/zoneinfo/Iran new file mode 100644 index 0000000000000000000000000000000000000000..3157f806b7d7fe650ec6726f31398824caf82cec GIT binary patch literal 1718 zcmdVaOKeP00EhA02NkKd+7c0ohIsaMJJZKe+Kvj2=~GQx+IqB@K4{Sw>eVg~LKnnB zyInM zyy52Znw#%a+RdYD^B( zQ%CoR)Xyb4?d=OCo*tI-?nQ|7zHmAJ(h0GkD_dtA(JFIStIVqZE?gBodSOAL%FasA zi;}LXrEl&@`J_NByPGfFHwHz{#SWc&GDPJaye{+G=8J-wVO?0>pqA&<>!OU0YDL_6 z>6to96ptI!C03a#c|S&$zU~w&A03se?nH^QtG9J|_Yzfc{F7XLpiQi4nWfiOUsmf% zdv>p{m3yxjxn_HcXDv8$(a3jo+3^@5n<@{qljV87LC9w|u(p%6_%!oKtQ-)+g#a zyt<+3o!U~>CASvGh;56f%Eq*A(KNG2H&1$|T0#!Uman0rb+}J&AIefY?q}+q{dZJb zZ=>9G=8M>Uv|I0Kk5zjcp38leYsEgF&u0Y$1_uQPj{2vcK+Cd)834~<%SsZ~7|U8x z7!YPz!evETR+bEy`15^kp2zZ-JJxnOZSzbqcQUv6_50=di}ii^^{3_^_OU`_iM(cw z$Rd$d`Zdc$)`=_>St+tqWUYS9Vv*G%%SG0UEEriavSeh<$fA)|Bg;nCjVv5lIkI%W zX6?x0k<}y1N7j!NfK-5#fYg8#fmDH%fz*K%f>eT(g4BW(gH(f*gVci*gj9r-gw%u- zg;a%LcU*$tru4i|t=jsdKim4U!|Uu0{$YIH zfs*A_DdHa&W5x9x>J#0c#_99=4e@Wf;>!&oI{qxRiqG#enySL_)z8HB@1*eUOV6e~*uWQiZH(Kn`gTGi2 zO(}MC+mN2L`HCIWK4QgM@A~659w)@mlwYIsU0*`t{Urd+lkL zI`zFrNBQHs`mE{AvG$B3l{#T_h&^-10_`bp_9w27*WR3Cc2dsUI(c@rKPBmq<-7By zof^5_O1;wLpA{OeW_5|bKdes8bL*n7}=@THA%PTd|ocTJjn z$iL6Z%x@I)ath`Agw-M|X3)tVTO_jkDx3vbUF5axbRPb2SmbXR?G$W} zQVTcjkcBnZl)o&~c_eT~J-RYi7Ws~-K>iH**o0lGIN?@Ve076b6cz6*>RPH64~%h2 zTIZ=HUH#7EyDU-K+Ub; zvYuY`)Qw`f{MZTg^!aqT;{6ZQ%HsiN)hk<6byJ%2Ol7r_uioLTUf3X>t-S86@vIUx zS>4Wa;|fKsXIR!=P7-U!os(-jZWHS+e-Ss_D4 z-SX#G=wGk@)teBL-GA@6ArUIXbZ9mR-%Bkxe7JMz)RY z8`(Irb7bqt-jU5CyGOQ<>>p`>tLXsJ0;C5>6Ob+-Z9w{fGy>@a(h8&(NHdUbAnic< zfi%R`bOdRMtLX{S6r?LiTadmWjX^qtv!&NzYh4~+nc%6XSMSfv+WC>LB!_1Gq^YZ|(A4&PT@O98u@%OR z;)mIEyg29Nf4QuEb(G4^g0<6URkZePmh+E0k!s5xbY=G=`KPam{x+%0o0-Y{`x`5h z+-+Y#%y^6)#4w{+LQEmH5Mzin#2jJ|DFCSeDFLYgDFUeiDFdkkDFmqmDW(1=l`HLb F-A~yjc0>RG literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Japan b/absl/time/internal/cctz/testdata/zoneinfo/Japan new file mode 100644 index 0000000000000000000000000000000000000000..8ad44ba981a2d97d40d3de2c8bf29606be50aa4b GIT binary patch literal 318 zcmWHE%1kq2zyK^j5fBCeP9O%cc^ZJkbvvel>u8|K!<{8kYhnK$iWO`xtI&+d|gW} E0KK7P_y7O^ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Kwajalein b/absl/time/internal/cctz/testdata/zoneinfo/Kwajalein new file mode 100644 index 0000000000000000000000000000000000000000..1a27122ee09410095d433adabe6bf2eb772710d0 GIT binary patch literal 259 zcmWHE%1kq2zyK^j5fBCe7+atL$obzU9iUUP=Rp1c|Nj}8n3)+E<~#rjGtAn+!1Dip zxB~+R1H*~~3_L!*Aq?7vh77ufMnD>2LkMB}Sb@fY>=gI`G8hPeR{gItlTZNBAp1dL XAUA;MdY}*kIS%2n0XoYL=sYd}4N5Vv literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Libya b/absl/time/internal/cctz/testdata/zoneinfo/Libya new file mode 100644 index 0000000000000000000000000000000000000000..b32e2202f572b8ca6ef3c5cf1d9e787a24f2c328 GIT binary patch literal 655 zcmcK1y)Oe{9Ki9Xt$}*US=39>YHJ`OImJk57onkU5{bt^(oWAP25I~WOa>97K}6ET zAO?%6iNq#Co+cUzi5v^D@O)2ACWBx5Jm0%Z+FU-5vyfZ0#jmL`PgqRUEUudiX4`)~ zkKdjiTX(TTSzf!c$`32LGB~Cx2POTKxo}&yCS<7gO@%)Cb?alF+jg@g+e=4o$JxCM z7uVg+y^!wOu2RCIYm_hc_sEEUl4q~A>>MrH5#iEC$GL$pZ5t=`+di5p70f-VbQ#&2uFP8rJF2K$F*pjo^ixvdY;V@X|sOD`GdfF z^+%s(kf3N#L?|j=jSNM{s}Z6o@i$0Ow7eQIiW)_ZqDK*=C{iRTniNrrDn*u}OA)3h cQ=}={6mg0=MV_M1a02vyP9bQHWWWx70c9krqyPW_ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/MET b/absl/time/internal/cctz/testdata/zoneinfo/MET new file mode 100644 index 0000000000000000000000000000000000000000..71963d533e444362250dec5465ec58517ab6c09d GIT binary patch literal 2102 zcmdVaUrd#C9LMoP#7buLMT0{EViKZtFV%Kpu{nX^A*^?N^8ZC!O&zq4nrXXm+jE}qXj zvTj>*k?$Ypa`z7xXP3LUpVmL!zp;Pf)cFIGF%1kJ)pKu32YdEubXuFn&aSc(FZnh8 zLeM^Wro>J@nPZ2%?dOLy>%FIye(bnq9En-xfrB=?SC+N?37gXrwd*!C+T7}hWtWHS z`aqfGWaQes>1mdm5LE8P63zcMM++uWb;Ac&=*Hn+6&U^h zpR}UruoYK~Sjn1atu%AM%8ELzY^vK9rT1yk=}oryj}9$49<-aktW)_=gDOUr=$4(! zwX{D&%bK&byl1i9TA83=Q@X9lIjc}`$|@5+QdRcXR(0+>TN(e3tsEb<+s?dbt70!( z_1N1A@9njkBhTyh)>gZt_bIKuYq!?4Y*y_}Es9iE=}v!*)&>@6?WF?MrBqto7c+GC z#rd}G^~ou$^cy4<48etWoZwzY?T zvqzGB){&p0j`QDGXVN8go_ycB&Q0pk*M{t|@eys`|E_k#2K0E>pt|>V%NKW9{D0x+ z^JUD5b02Jy`4awq9}d+}77)UfcT{w_< zAOS%lf`kN#2@(_}Do9w6xFCT+B7=kmiH)ZV4iX(t7ak-&NPv(CAt6FygaiqR5)vjP zPDr4TNFkv@Vub_?iI%4e7ZNWdU`WJ}kRdTcf`&v52^$hOBydRNkkBEqLxP7y&(nnu viJzwnAQC|&gh&jLARnA#=>*{s&7cX4}0QGc-|jv;l>pCYwQs<{zIKioT*il zA9!WzNU@5%nJ%(3O+|H2N%W(WYTEi#9n(0|TvRooFD@B3v3Vmp_L)Kxr;h2ky$6(M z^c8){7Xv2#>`_TL)@c&o8<3>8`jvX2Q!ed!QeC#CSuPJYsVi3cB)R-{HKRCFuFSkn zrOYkUGvhoeH9AA5{x;vFeHEwE!_&>I<3H)y2hN+T22ScZp;_wcC-&*NDKk^sP~gs>gI;#vSU0f=~70*eq3)_NNqmAFqnX&x-fNFY3n624%^9kGW}Z zw=CWMv$=WKHYsWS*xb^!OW#_#-`v);RhKS!)|8d5)@8pBD_>5#_)hOpFL-xXH(4)sVw(_yu`Z=KxdKV=%byY>A!2h9U5LEV(F z!!-LUbn}IfY01dZEhp9_Kq^Y*;VOd`| zsW!A8mW|2h)TYW_*)%n7LPZC4XykLVIc105Jap7-84Kyh`UcG7XXLxzTo4H+D|(ec6XI6FRIfE*)4hKP(286+}FWSCAnPGq1? zJ5pq*$XJoVa*P%kF2{J00dtHP88XM1kwJ5e8W}dnxRHS)BS(hrv|~pGkBlA}J~DnJ z07wLo5Fjx?g1`|4Bn%vJKmy^kkw8M>w6Q>f!4VB497sHnfFKb;LW0Bu2?`PwBrHf= zkia03K|w_ff`mi~2@?`0Bv4KpDI`=*8!IGOP8%&G zTpaO20)|8k2^kVIBxp#~kgy?fLjvctkwZe~w6Q~i=d{s7!p9LmB!CNx0EJtLK&^m2w zk>EOQbdm5nZG4dcBN0YIjKmlTG7@F{--Ov?YrWW3JKMi7w;(q!+n=AGo1dHK`5U$l BL=yl2 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaNorte b/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaNorte new file mode 100644 index 0000000000000000000000000000000000000000..29c83e71ffa6b071c52b2360295bf55009c09b76 GIT binary patch literal 2356 zcmdtiZ%oxy9LMnsp(Ki)RFwE*C#4t&SN@A){}j7|+(5aKn2{NO24#>CO3@7+TWihn zMJMGdIyrm5S`o9z{xNdPtuBpnx`x`{p1S1UD&OaAm&;|zawQ={Mm_mzZ1FZV9-pMfr_Y3U9X zk>}IP)~!{`6S8#V%3`^3UZjo+&XlO>3=@56xx@@EGqE54E-QLw%uTOe6y3O5-+bsJ zSy>XUSJiy0;xd2Ix8#4QZjJa-$0v5G_}NL55Z0m+hCern6MNO_z8;fw-Y?0W$Bg^* z9$Djm+@u`aD5+IPby|I#q<7!URSrb{bBBS@rb&!_B(S|YnN;+>@%CnpOf4*#%#{rCwDJ8Y&>y=;+c6x z=Y^z7-q0bPe|d>)ed)9*__{{C&Bx6>y#-RZ`+zCxaLcw0rDl7hlH!;g2d;uJeq)QN84bw89TobKFJjcbMvs29dsfw! zB>Tq$)^Rkh&m+K`Mik2B{5F9Hcr(d64=b1wtx>l*rN62q_X$C8SJ9osdEy zl|o8|)CwsUQZ1xhNWGAPAr(VP=4fk%6wT3A4JjK^H>7Y#<&e@LwL^-BR1Ya1Qa_}C zj<$kG2_0<>ks>>WCB)sU%WLq?SlAk!m94MCyqY6saguQb$`;q^ORzsz_NK zZC#PVB9%o-i_{h=E>c~jyhweK0wWbhO6+KBj1<|?Rv9U?qpdSiXr$6esgYVE#YU=) d|NnA_*{o;VtS5QX-D&QWByVb}JJp>M_7|antVjR= literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaSur b/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaSur new file mode 100644 index 0000000000000000000000000000000000000000..afa94c2ac5c1679d39143eae062b812070876492 GIT binary patch literal 1564 zcmdUuYiLhl9LIlSF0GZvatV=8qP3gNm>Ih;V}G;lj~TZAhX0IRZM0$AQ=|xcrbM}x z2uqXfl1q6dmk?UHq$JsrvZiH7$MZRq7hZYch41M(pVO&xUVT2^++u%}{IS9I4Tt5~ z!}ADjZ)e-OD_VNXUbp#I_}Y`7_&S1T`Z~Vv>AC;D()X?YYGDg_t>Qk0t(ckePe^gd{Y6F!PQz$o%q$ zCUN&Mos@CeB(Ja2DdC6Af|Pu{a9FiTosy_i`ufDya8JVOpVDmlrPUr=_S33B$!7;xk3#KS@z< zlG*sZQ;MHVF`Hhs%jPSCP08)2y0od=l$~qU<(2nL#hxR&GPg@@@z?6AxVx%);cC5g zY_r-HUL)JS9#A#Ia;4@)xvKpbFWawWsvVCe$j&pRrmjV#epiNRIQT{+V1RoK3<&%O zm*X6d7jc{uMgkqD`LqmmoJK9dJO`+s@6$bA@nm}?*`8(gcv8I9h2Qi3g+=|pK6C7_ z31Sq)Du`JSyIfksAeOb3-kq|2xWVLZfohWQZt83jNp zV3Yu=m(pAkqZC- literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Mexico/General b/absl/time/internal/cctz/testdata/zoneinfo/Mexico/General new file mode 100644 index 0000000000000000000000000000000000000000..f11e3d2d66a2d7c21f498df96c3fd1db3a0d8817 GIT binary patch literal 1618 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 O1arMUd!1vi-G2iks25xS literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Navajo b/absl/time/internal/cctz/testdata/zoneinfo/Navajo new file mode 100644 index 0000000000000000000000000000000000000000..7fc669171f88e8e1fb0c1483bb83e746e5f1c779 GIT binary patch literal 2453 zcmdtjeN5F=9LMnkqQH%ZQ;8vb8FWLuL3o9$5k`URY6U)Y(?UE3#rVT< zR*YFDf|Ayni4SWwHq3b&mt~`eO%k}b^FAy8>5u+w>&t$;e%!&IpEvGR z-Zfd`A2->2!ozi$hxe(9ANJ?zJ^i7o`=tck^V$z;Z>?YNYndW?3oq&3_WkO^wg^2m z=l6!8>R53#-KR(Ab%;NrJ^EUhPh1;)Mvi^&5##48Hesdb*xmIy=m9w`H%Z)*G*8CPE>zRQ9WpLBQN{f_SI2)D zt`dgA^o&zKs+or`>sx!ys9C-l^0w`V)a(@jIcM!h;`Zz>FGv zB*zAkG<-@YUv`T-2lnZda}6rB>qVV*v`nQp)#;2^7O2d+7MZninwsxiBNvp7s_euE ze9|x>fuGjy37}>mM5fY_lmETdpuf~XP;K(-=s*-%&&xJFiNiU4~kX2Bl3~q z1ER8JNIp8yCaP+V$<*7-ulRIbVydb;yRY*i1vPNW)$SRR#BI`sJimcRXmWr$uS*+Ep7FjN`USz?@imhhJ$eNKwBdbQc zY+hJ5XBG~uoMY+8+L6U0t4EfPtlw%1fKBc$bvVj{)Q6)$NQJDXL`aRS zrbtMYILd_72`Lm(DWp_Lt&n0N)k4aJ)C(yXQZb}tNX@LKXh_vK%7)a9qi{&&I7)}q zj-z-;^^o!*^+O7XRM2Wlh}6((iilLvYRZVzk)x1EC6Q7hwM2@ER1+yDQct9yNJXut zq)1Jzrl?3&t){FVrON6L@X jUtDkg|1SRy^Iu`1`R|b8nxB@HmXYGh%uLHn%W(V&DI1f# literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/PRC b/absl/time/internal/cctz/testdata/zoneinfo/PRC new file mode 100644 index 0000000000000000000000000000000000000000..dbd132f2b0bcc8beab08e04b182751795c853127 GIT binary patch literal 414 zcma)%y$%6E6ov01AsdnK0RGwCh(;k=S&0xTQ;84_wi_?7<`F!PCs;~}D7?f(B^vIT zl7ch2`)zh+C+8E>VAZ0p#Q6&b$@1Vmt@shmEEPQ+dAwxQ={D8*Lz@c0P8P$BDh-yh zJRhox=gVq;O|{%Y*PQ{??_KRC8|0oVI%a(=qV1LMrEqU0h@_&_Xe`L@@k|6ZIO2E7 z93L|!ALb9D7bk4{9*EM0TpUDs5CS+32?Qb_WIzakkOCnFLJol-2uVX01tDw5!t~*5 M#r`q2S-#n^-;pXt<8 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/PST8PDT b/absl/time/internal/cctz/testdata/zoneinfo/PST8PDT new file mode 100644 index 0000000000000000000000000000000000000000..6242ac04c09fd4e4952cd16503e954dcbdacec2e GIT binary patch literal 2294 zcmdtieN5F=9LMnsqQq039#A5%lbXa8u7HA9u?H1*!9*~wBxWYY!ypY6xs*V+C5^A4_S zsLS*GA)oF}HG?yM-#S=5TU{P|N?*BHr^e6J z>c2iNRud-!I`W2Bc@AXisAm&ZbZdg1wCy&Dsm?HySI5hgC2=M;=O>BXv&_V)&m`{X z`#S!YW0Ek^V-mj^P)Yq==IVEP)HO%m((1)7b?t7^*R?gP>l?P~8>-f*mv*$IQ(K&x#Js(YHMLp3JCB(lZ;s zRkQMc*0-*BSItiTQfGL>Dq~{QWXA7OnZutO?+=^QoWA2GYp7ka!+VXdccaX0f5hbM zT`IZtFX+7HSu!usqUTpkk^GEGU66NC7R36sKW(z|Ur5ypuUt@zJ{s4BXFpMkkENK~ zPra$`=)7$1e0h($tLZzlq~nMzE$cJOYMz&(xyCFn+9Jz;8`6R7=TulLG`)ZMT2nw4KSO6ksSv+C`YQnr4FDc|Rl)r+glJs~9(X@w@Z=8^=*(@kamS5kRy zkzPCfSGD%TG+i|@q}Cmt(Dx0WQ0qHJ^!*WU6V+Q6a-Z#^tmFLq>)S4H+9UICP`q!SFbCe82#a5h6oG#)u3O86`4IryVCU zP^TR!GE`)&$Y7DtBEv<-iwqbUF*0Oi%*ddTQ6s}f#*GXd896d^ryV;ocx3d*@R9K& z0YD;vgaC;F5(Fd)NEnbfAc1h&NFbqb+E^gLK%#+!1BnL`5F{chNNAikHb`)g=pf-i;)4VTi4YPZBt}S(kSHNxLgIu3%4s8ogvx1Sg#^oKqlJVE zi5C(uBw|R&keDGsL!yR+4T&2PIH!#q5;~`i9TGgJjUEy{Bz{N$kq9CoL}G{p5s4xa zMkJ0%AdyHSp>*0Zs+IS)XMIwrX6p1MkR3xfMSdq9Qfkh&Vgw|O_vVkE{$kdY|k|0c}ww$^@I?X1#yzC2$}R%vdoFV~k7|2MIyR0IG3 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Apia b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Apia new file mode 100644 index 0000000000000000000000000000000000000000..4091a85f388b57df98ff9ab056958e41c7d00fd4 GIT binary patch literal 1134 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 O1arMUd!1vi-G2iks25xS literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Chuuk b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Chuuk new file mode 100644 index 0000000000000000000000000000000000000000..289b795a8a8bcb6632ca97efc363267d2d491c09 GIT binary patch literal 183 zcmWHE%1kq2zyM4@5fBCe7@MO3$f^JT|34!m14Ew=NUCQ61B;Ju2!pnv0f@^GLfABB mpfZq&96vxBfB~hrnTmzv7?25pNQ5PMk<=`e z*@!LEx@e?LAM66yU_NWDwCvBhAav#IqPf*tjI6{ge?9M~x@xVvF8ZDG{9eDEjh&61 z&%0_}LtUo#w=2Sa!r|I&56`o^>}~i1>HaO4Cs%uZ(f;X=jo0#}4zyL85GmE6t20bk zVzQoAP$A)7jE;yNk%;pXI`V3qTyr9*qt5*#(f!}6>7(Nk)BTyc_Q0^rs6Vb|J~w7! zOZKZ-b%Q2u;Wjn<-ad0(Y>%Fk)M@5SZq@PO8%%ugL7i}6nVC0`tFQmGT5i}kPv3Z~ zKyGUORnOm(D2Y2l)y+*Ia?6q{>elkF<+g-#YC*1N7F<4|l75&nx1W7oExh!eS@iCx zzGM7Nll;a(oif;M7Vmskr}j3QwAx3t>e?mgg~d9fra?0E$JL#(Lb9TZRCdgey>MFP_fMFD#-nOkchJbH5B1&k@0h~OxAi?GFPoyc zmvnLZaVfsote3~`m*o>7s$_DTl#Vp1`+^V2iXl(099Sx4??@PpY+hJ~8Vq9aig`w5cB7tu|Ejn1=_qs7KPa znws89wK0C5)OKywwNtIKsis_SIwM8zQrv5S2ocM)#qI*!ac%!DZzE8D&b#d-Puqp+k^S~>Cz&3W?;VFu_#G)_`V+q3km(l*R=5e@)hp;eNTFxyNCJykwbw< z-#@U|oBr4R$RW>uGOPnLSC&|FDeuw=QyCGyp=(fZId*ZU20(OOL3)vU4F=S`R){wn9?dFi(A=^XthinkpA+kke zkH{vGT_W2=_K9p1*(tJBWUo%US!B0PyIo|z$cB*}BU?uHjBFa&HL`7F-^j+1og-UE z_U^QsM|O{FAK5?B0Hgy*3y>ZlO+dPUv;pY@(g>szNGp(DAk9F!fwTkZhtoC$=?Kyi zq$fyIkggzYLHdF;2I&ma8l*Q!bCB*hZF`XZIBkQF4k0ZIq zz4W-CooMV(|NsAg1|~) zKOkBdfHwXIc?HA;c?U#;yab{_-U87euYqWg_dqnriy#{0O%M(8Du@Po7es@+45C5a z2GJm|gJ_WVK{O}`z%(!zKr|>QKr|>gKr|>wKr|>=Kr|?5Ks1HH!({^uDmz_6LoNU- C4QOKk literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Enderbury b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Enderbury new file mode 100644 index 0000000000000000000000000000000000000000..a3f30e5c7b9166d408a0851bfac437293c72b0cf GIT binary patch literal 259 zcmWHE%1kq2zyK^j5fBCe7+atL$Po%-IiSyKxuO35|No3k%*_A)$IoG4`2RoLfq~`! z|I`2m4hDv87Z`Yad_x#?4UK@|JRv^rhvF0 a`$06w4Imoi4hC`@!es+=mYuGlF&6;Tr!c?( literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Fakaofo b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Fakaofo new file mode 100644 index 0000000000000000000000000000000000000000..6e4b8afdbddeb1ff2ba52168af01a9c8a7896208 GIT binary patch literal 221 zcmWHE%1kq2zyQoZ5fBCe7@Ma7$npC-b3^_A|Nj}8nEwBduV7&K|35W=frWu#+XV&= zAKwrLT|+|#Z9`*_Mj!|wY&=je*b1H>U>zV6|NpNu5A6VPLDqq2kd+KX+R0@DwBJtG H(3lGVs@5vF literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Fiji b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Fiji new file mode 100644 index 0000000000000000000000000000000000000000..912db189431adbc130b6397e317dd40733601fae GIT binary patch literal 1104 zcmciAPe_w-9LMp;6%iI_br8bnP;^n3&o)%j1PQv#EwLeU_U9|2qEnM4ruJvip+iEK zh=tH)hyGj!Q7Qz%kRXa6Awh_WFM$Nz3Zal{ec!*1og(Nrp1rnb48}h1L~3Xt?EP^z z*&QxUn_ax#e%YSpc0DLIG*@ZE>V`D!k4V$vTZ!(d)o7tY+Lt~_EYqg({7X5u`>A$Z zDM-i09qmlN(9SnA%ZbECNjx6buE=xgnrqkOo;6L*1hxCeGfkx`wddV^J#nN?PCl8{ zQ~N69^zBiVz-Q^bdQEyiyq3O!5$Ri+m;R%1>Cfk6@Ibu`&OX$kEjwi>eN%_m)+HT1 zrz5W_b+o2i#|mHc%(iA7zrLd5>q*IsEof%tkW9pH>BOUInQWYw$s0dqswyW_XH}-Z zPRq>kB{{#^BNtlU>&3;xa;dtg+1y^qe$Q*RR4RFavVVF6JnwGN{zq?NxoorN-79)q z+hYl@#t+*S;sZO0zZm7)@2`0F+e(bXTLyC4NXSr58w(lCX`>;-A>$zfA|oP0I&Dm3 zP^XQG4C}OUk%65yGBUK&#zqE5Mn{H6#zz7`B0xewVnBj$S``g9L;`goK2|gaqZZsF1Ln78eqj(;`Dcb6RXja88R32@i=62@r`82@#1A m3DRj%I{#Ogl5!>zS3-w*o1dNUXb`Um|;WBD&@X(Pn| literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Funafuti b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Funafuti new file mode 100644 index 0000000000000000000000000000000000000000..3289094a2740500bc374d20904a70d7b307c2264 GIT binary patch literal 183 zcmWHE%1kq2zyM4@5fBCe7@MO3$f^JT|34!m1H%dykkpC;3@kprAq?7v5Hmsuo5l>( k1~QT32gm>*02=te&Wz^|hz&BG0k`p7Hb9H)bPbKT0P#5*egFUf literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Galapagos b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Galapagos new file mode 100644 index 0000000000000000000000000000000000000000..76b2b3a126967bd410e57ce36cccebf7db167f67 GIT binary patch literal 268 zcmWHE%1kq2zyK^j5fBCeHXsJEc^ZJkwk19dauP=Zw8gm|XcvA7sQ>@}KLaB(6EpMw z|7(Eq|NrmYz`z0`8G+>L1q>WMz99^{2Btu429$?@5E5+t0o4Pv=s(DI5EtYE5Djt# Tm4ek%{^Le=`#hp9rfN7`Q+V J(KR&S0sur8B`N>_ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Honolulu b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Honolulu new file mode 100644 index 0000000000000000000000000000000000000000..bd855772054f8d41e0158e71c2bf2c04e50e47cc GIT binary patch literal 276 zcmWHE%1kq2zyK^j5fBCeHXsJEc^ZJkZdPZH-HL?~r#o#=TuSt`xY}Fn!N>%J%>V!A zFflLy$p{9P|NpBp7&-p`FHT@!@$n5|@CXKCmk^+S2nZo;D?3mn*w!CVJ^z8AxBx^rPJ#dc literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Johnston b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Johnston new file mode 100644 index 0000000000000000000000000000000000000000..bd855772054f8d41e0158e71c2bf2c04e50e47cc GIT binary patch literal 276 zcmWHE%1kq2zyK^j5fBCeHXsJEc^ZJkZdPZH-HL?~r#o#=TuSt`xY}Fn!N>%J%>V!A zFflLy$p{9P|NpBp7&-p`FHT@!@$n5|@CXKCmk^+S2nZo;D?3mn*w!CVJ^z8AxBx^rPJ#dc literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kiritimati b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kiritimati new file mode 100644 index 0000000000000000000000000000000000000000..762275d3c1d28a472dda088be5b602336e38e84d GIT binary patch literal 263 zcmWHE%1kq2zyK^j5fBCe7+a_T$Po(t#Gucry`cX8|No3k%*_A)=KzKO|IY%d`~SZ< zfq{#G;m899J|Eu@23RDNfDW_MH8kM@0KKy@zW@LL literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kosrae b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kosrae new file mode 100644 index 0000000000000000000000000000000000000000..f8222e66b554dc2e5e05be129662da3f8902280d GIT binary patch literal 251 zcmWHE%1kq2zyK^j5fBCe7@Ma7$obzU9bnd-?oj{#|9?g%Mn(pP8D~I>W^DkeTXBGa z1H$(44PnqWGz4OV=^=#eVg(unvXAEn$WR~vTJyioOvVI6gX{*0f$Rs-^*|v8QXRo% M19X<1uAw0p0J1?WSO5S3 literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kwajalein b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kwajalein new file mode 100644 index 0000000000000000000000000000000000000000..1a27122ee09410095d433adabe6bf2eb772710d0 GIT binary patch literal 259 zcmWHE%1kq2zyK^j5fBCe7+atL$obzU9iUUP=Rp1c|Nj}8n3)+E<~#rjGtAn+!1Dip zxB~+R1H*~~3_L!*Aq?7vh77ufMnD>2LkMB}Sb@fY>=gI`G8hPeR{gItlTZNBAp1dL XAUA;MdY}*kIS%2n0XoYL=sYd}4N5Vv literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Majuro b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Majuro new file mode 100644 index 0000000000000000000000000000000000000000..b3a8c184432efbe040cd44a386a99c2cb58ddf52 GIT binary patch literal 221 zcmWHE%1kq2zyQoZ5fBCe7@Ma7$obzU9Z>)O|9?g%CI*HDAQ6UH8yHv^7*-r$;PCMc zVbC@-1Y($xA%u+w>IGZD^8;iU5CBd8UuP!L0HQ(GfyC;8Oa>zDMW$#03C& C4<@1j literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Marquesas b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Marquesas new file mode 100644 index 0000000000000000000000000000000000000000..10c5c9bc1dd5807c7bd13e556a4644c5f07ef261 GIT binary patch literal 195 zcmWHE%1kq2zyM4@5fBCeW*`Q!xf+1PlmH)(`v3p`GcYp#|6gmt!0`WnRR#l#k8cQr ou7Rbo0Z<78LkJ0m{s8L$ne+cY$Z!yspaonuV9V?*t&9!00P8;_JOBUy literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Midway b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Midway new file mode 100644 index 0000000000000000000000000000000000000000..3e38e97c97ddf5e054fba822cfce1c5ccd422e3f GIT binary patch literal 196 zcmWHE%1kq2zyQoZ5fBCeCLji}IU0b(MAqLNj6ji%6$}jj|HuCTk*NU;EIz&=48g%6 mKouYmLfBN84IDrtz~Da+x7kP855a3xUy literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Nauru b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Nauru new file mode 100644 index 0000000000000000000000000000000000000000..6092119f66ca00e75e8ead98c286470d7c192fd4 GIT binary patch literal 282 zcmWHE%1kq2zyK^j5fBCeHXsJEg&Kgw;^*2dr?>3)xZo5}AlS`vqW=H?{|t;wjLggo z40CFL3K$md0I9Bpg&fhCZIuq}iHyMKU;1_GdU|3Pj5 g(I9t#Xpmb#av=AB=z5?Sxo+aJ0lLsm*U*Ry0Nn66!2kdN literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Niue b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Niue new file mode 100644 index 0000000000000000000000000000000000000000..df6110dd108e529d2425752744d6d2a4512a84f7 GIT binary patch literal 266 zcmWHE%1kq2zyK^j5fBCe7+a(P$hqTenjlbe%A)@N|No3k%*_A)Cv0J00FnzBSpNTy z^I+im|35W=LBPj1ghAKP(8vHp8iPrYSzr)C*iKfULXf>8KOkCwHvIozXCC4MqCsu| Y34`1LqU(WT4CFe7%LeE`J3~V*06J(pG5`Po literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Norfolk b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Norfolk new file mode 100644 index 0000000000000000000000000000000000000000..d0b9607ed73a9a4bd6ca6b49a2b685609d561f96 GIT binary patch literal 323 zcmWHE%1kq2zyPd35fBCeHXsJEr5b?59mgLHocyOUIJe%62;+a2QUCw{e?}%|CKeV3 zhPf3$1q^c=7=Y}BI~cea7}lR)6kuSOwShs*$2WvQ+tAR^2t*ni07)Y-X$aB+1tEmp z!VXjlcFPZ_9-#IA>&(PEKs3m0AYqXEz%x7kP855a3xUy literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Palau b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Palau new file mode 100644 index 0000000000000000000000000000000000000000..e1bbea561510bf6e8a7465a49647724bc243eb03 GIT binary patch literal 182 zcmWHE%1kq2zyM4@5fBCe7@MO3$f^JT|34!m14Eq%NUClE1B;Ju2!pnPC5X!qLfABB lpfZq&96vxBfBAku-@w4- z;~T=DYhYn)03tzJfgpsi1uQ^iAWQgufHVLB(ER^(=6YX1Y>Y)_~X`(;09Z&t(I&$WGVLkP86$h#GnT literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Ponape b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Ponape new file mode 100644 index 0000000000000000000000000000000000000000..9743bc3c9b8e8d2dc3a66bde761c3ef1917be50a GIT binary patch literal 183 zcmWHE%1kq2zyM4@5fBCe7@MO3$f^JT|34!m1H+UMkkqUV3@kprAq?7vh9E9O2w~Hh mfyzK8a{K^k00N+a|Le>Y)_~X`(;09Z&t(I&$WGVLkP86$h#GnT literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Port_Moresby b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Port_Moresby new file mode 100644 index 0000000000000000000000000000000000000000..3fa1f7fa80a3026d205cd0cb8870a75063ebc80d GIT binary patch literal 206 zcmWHE%1kq2zyM4@5fBCe7@M;J$f^JT|34!m14HKrkW|kC2G#&y-w+0ELjw?>Aq2Z| z%s?p+1_2fz2C;d6fOtRvH1U7fwkQq|UG#Rz1dv!gkj=oz1hl#ntPE%!P#@4bP9LCc SC{{8saM=K@x6?H=-~s?suq6Nh literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Rarotonga b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Rarotonga new file mode 100644 index 0000000000000000000000000000000000000000..ace1ce4b718e928c238f7469561c7ec41c3cd41f GIT binary patch literal 602 zcmb`@F-yZh7{>8yEC?B-YA8pW*s~fcLLt#Xi=u;wP;|>+ofJW8adVJ%P`mjB#2c?$ zhpv8sPNiM^2;x*XM<-w3=g>*S#S3@;OGqI1OODRZR>Y5y<|mjKK2PkuTV67~{L=LH zqnv5B)okHGdbLyKQB!6syDB@r*RptG6=xLqw?w=eNrtYOD)Eba5!sM3=|HC2G}E zQ~L*rD96!igjJNI3h%y0^7mN-e%GG${p%zC4Z2>d4seUJqc}eb0~8J@ENs~Wg^4Y@ zps=xJ9~4Hm?1aJ!g%=7l6mBT&Q23!RMB#|S5``xUQ(JaLVQb62D2&B_BfFanzZFOB ECwcmOIsgCw literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Saipan b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Saipan new file mode 100644 index 0000000000000000000000000000000000000000..4286e6bac870c1ff15c73b8958c15210a3879c58 GIT binary patch literal 225 zcmWHE%1kq2zyQoZ5fBCeCLji}c^iO)m2+GIBT%G$3y{Omvw(pGOmg`6hA_AXhcGy2 z00{^P!EQ8A14t7Xz}UP$paTDaK;+@kGa$OoOxFh_46>4ek%{^Le=`#hp9rfN7`Q+V J(KR&S0sur8B`N>_ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Samoa b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Samoa new file mode 100644 index 0000000000000000000000000000000000000000..3e38e97c97ddf5e054fba822cfce1c5ccd422e3f GIT binary patch literal 196 zcmWHE%1kq2zyQoZ5fBCeCLji}IU0b(MAqLNj6ji%6$}jj|HuCTk*NU;EIz&=48g%6 mKouYmLfBN84IDrtz~Da+x7kP855a3xUy literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Tahiti b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Tahiti new file mode 100644 index 0000000000000000000000000000000000000000..7867d8bd6c27774ad5a3b6f91fdfcec18845b7e1 GIT binary patch literal 187 zcmWHE%1kq2zyM4@5fBCeW*`Q!IU0b(lz`A3_5c6>XJBOf|G)SI0|SsuU|{j_4PnqV jGyp1KU$RA)GAXEPT2N@0G5-^_2256C;p#c{FV<04A literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Tarawa b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Tarawa new file mode 100644 index 0000000000000000000000000000000000000000..334041388cbfac92c738453b5abf364a96cf1af5 GIT binary patch literal 183 zcmWHE%1kq2zyM4@5fBCe7@MO3$f^JT|34!m1H&Q{kkpC;3@kprAq?7v5Hmsuo5l>( k1~QT32gm>*02=te&P?bGhz&BG0k`p7Hb9H)bPbKT00Vd$r~m)} literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Tongatapu b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Tongatapu new file mode 100644 index 0000000000000000000000000000000000000000..b3a5a89b66d2b74971646be2fea8066d4dd91fab GIT binary patch literal 393 zcmWHE%1kq2zyNGO5fBCeZXgD+g&Kgw$zrDo=D*!9SX{2XV8y}_U{$ok!TRy50Gps$ z4iU1~FGN%+T&Vy5|34!WGYcyd2r@A+tn~ouWLR6kz{0?=?E(WA1H+LAjC{y!AKwrL zZ9^j?10ZP(#3mpOjEo=>2to)uk_V^^?8qNr9SjUWH~gCqgB%W`L5>H} sAP<0PpeH~y$Ri*c1I=Qfs?WG=fc~}9H8kb|0NRRA%K!iX literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Truk b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Truk new file mode 100644 index 0000000000000000000000000000000000000000..289b795a8a8bcb6632ca97efc363267d2d491c09 GIT binary patch literal 183 zcmWHE%1kq2zyM4@5fBCe7@MO3$f^JT|34!m14Ew=NUCQ61B;Ju2!pnv0f@^GLfABB mpfZq&96vxBfBkkpC;3@kprAq?7v5Hmsuo5l>( k1~QT32gm>*02=te&P?JAhz&BG0k`p7Hb9H)bPbKT007t;q5uE@ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Wallis b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Wallis new file mode 100644 index 0000000000000000000000000000000000000000..b4f0f9bfb6a6cf6b98b85993dbf1632736e9e19f GIT binary patch literal 183 zcmWHE%1kq2zyM4@5fBCe7@MO3$f^JT|34!m1H+mKkkpC;3@kprAq?7v5Hmsuo5l>( k1~QT32gm>*02=te&WvLPhz&BG0k`p7Hb9H)bPbKT02g!`)&Kwi literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Yap b/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Yap new file mode 100644 index 0000000000000000000000000000000000000000..289b795a8a8bcb6632ca97efc363267d2d491c09 GIT binary patch literal 183 zcmWHE%1kq2zyM4@5fBCe7@MO3$f^JT|34!m14Ew=NUCQ61B;Ju2!pnv0f@^GLfABB mpfZq&96vxBfBvuo*5 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 XImASQB2kgBNL=~%x^5f2sLcHdVF6z% literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/ROK b/absl/time/internal/cctz/testdata/zoneinfo/ROK new file mode 100644 index 0000000000000000000000000000000000000000..312ec40a112d5ab54ea2d92d735735be4b27a44d GIT binary patch literal 531 zcmWHE%1kq2zyNGO5fBCeF(3x91sZ@v_w^4Ilb(tFxa6$<;gP@QhbP(Fe>@eI$at2- zT=87c=fw;Cf{GW2qD2|KcKq)0|Cf~AR6RL5DoGvhz9uR+G$>?1G$?dHG$@2X&H;rIhz5lehz5lg Ph^AeLaRGx;*OChWrb4=L literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Singapore b/absl/time/internal/cctz/testdata/zoneinfo/Singapore new file mode 100644 index 0000000000000000000000000000000000000000..78583666698a0332b822c0cd15daa58abf60eb27 GIT binary patch literal 424 zcmWHE%1kq2zyKUT5fBCeP9O%c6&iprh`G9q1pkq1OF0Ljb>1|bH9x(N&t3=9Pg z3^G2xAq>GltZiTp!bS!l(ilWq04}@+_AJqKI`%DVt8C*I z%*}N3aoJ>}IZ`4=&bD-ITIsP`!!UYMED2aoYqmKz{nnyi%&zbIskWMb)cUvYv*%vN zaq!3OKJWOtEt^WkO=qfpg`3l^Z=Qz|`oY>g(b<)iYj#~cZ6DgW!8yF+1*4}iVZK&# z!tN~$JFkb^?7pHRv+t`L_8UL%a*n>g$QWq5W)7tK?XxQ;%#Vf=#^B&F^W5crD&(`C1TH+PQyYgi_ealJHSN@if(fX3~R~||DC!ZF9 zP;Yl&bg`4E{B~Aw$jlm4S2Le)QM0zKQFk{lSNFv3R|Qo?YWDn) zD$LJRbEZzJurDmb6VqhT<$#livPpFF0M^(j*$5bTm85tR0rYa}b$;I!@Q4fq($*SI3x#XQ0 zvU+EstmzVR=_bE?up?hR6ulyAH~gxW6%NX1t)rryrOtBSS*xz#%V6ELZ-VvS{$Tyk zKyby^hl4AR^#x<+&R7k5$F0VruUZecwg!zo?bah}U$jzo_`}0ckX88Z@<((3^>GJu6$Scy{NRhW$qzf^x#4|;R z{8=Jfh{#gUZM-6K{{H%3-@|WX4RKMg?`U*24{=dkQm*eZ{;NJ7eSUxD{vhK2yp<09 zPIoIm{qcwTqe?ZsJ#Y!x4zeFty&+^r$d-^jA)7*Wg=`Dim#f|wvNL3B$lhG_=8)YX z+e7w;Y!KNYvPEQ%$R?3pBHKjviEI?vsjJ>9vR7oY$ZnDCBKt))jO-ZQE%UkQJp-FY zc8zQs**CIrWar4%UG?5MY~EGx9@##!e^=cAqytC`kRBjSK)QgmfkPjVMj)L)T7mQe zX@;xr2GS0sA4o%xjvy^TdV(|s=?c;oq%TNgkj}X3)*!t>nuBx)X%EsLq(MlBkQO05 zLYjnh32773C!|qGr(AWbkY2g!W+B}|+J*EBX&BNmq-99YkftGBL)wP)4QU+GIal2} zq<2X3Ty^)5_POf*Aq_-2h_n#tA<{&oi%1)hJ|c}oI*GIr=_S%kSKUpdo!F+o>*D_y O(99|w*XjjjnZE%*@2d&` literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/UCT b/absl/time/internal/cctz/testdata/zoneinfo/UCT new file mode 100644 index 0000000000000000000000000000000000000000..40147b9e8349c50b9b5459d34a8bf683c91b182f GIT binary patch literal 127 ucmWHE%1kq2zyORu5fFv}5Ss literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/US/Alaska b/absl/time/internal/cctz/testdata/zoneinfo/US/Alaska new file mode 100644 index 0000000000000000000000000000000000000000..6c8bdf226900d7f4c6a4d47338e6742d4d6747cd GIT binary patch literal 2380 zcmciCeN2^A0LSs?B5>gbMG2`$^d$2B;sFJrC@%;CA^~!{36V--cUTDoWB5j5I&v#< zv^kuOj&p3aNjuZ6bS=7Rtxe1kZoP~}>DEk^uJtyHX&=UZv7eCpXZ-Q__=MOsaX6zQ6^_kZE^?RSS75%Qn%x!6cN;& z?4HwJqJo=N`a^1yRA^D6-xc8|j&H{N5no;vk^T|?ou|jd zU2mRqM;#s!cke&$zGqv%nA>u|9bMlpVk+9)_ZHNNd8upN^B1+M1>wuwu|c&eHa$8j z_Qzti@N%Mzn^>&wJL8n`CqmWzN3Tk|t3W)^J0=%-7m9=}-`R_EZ;Hg#=j^1IuSIg& zaXWc-My0wA*r`)rskG@fJAL$hm2vT9nK^V+Wu4qAm-M`-#H%$j+b2a%M~+-twnr?h zi<2$~iH9aXw+mI0didSb_9F+w)QTfVY~W!cJZvJh}>>hoE#RbuQl40uYI7_eAX?i zb{*E6Or5nG_g)uIjt<-Fo5#h5p+0+K)%U8Y@0ffl^Mcys+b5eNmD*h9lbf#%C|`1g z^nKE)TAb;!WyGttT#1y=9O@9yj;Gnrbv-7wstCK)yIi#OU$@)y7KrCt$L)@o8PQpN z!tM;rQ(gHNWY^Shs(ZeY-J_Fg+l>Laeds;4y%gatnXDX4CYHm&>Tl_ z$gQ5xFz0Q20)dWh%hKPCR&XHD+vW%}-w5+dl)1<7wPFK-{@spvb5B@P<*|zD^!vDe zYxG;rALS(;tDZ}xz7$pJn?4RcoWCxf|K6HQ{{t^)K)>8mZt#~r0ex1Sx%nyX>MJTo zHi+!dsJDph5zQvKuuG2KCa_OrqsUH?ts;9xHjC`msJDyk*Qhs)>=@ZHvS(z|$gYuX zBl|`+j_e%SIvYzmSF*b;ppF8FkN)rWtkDkhURxLmG#44rv|IJEVC? z_mK7>{X-gP)Ez`xXw*GKnrPHrMB0e-5osjSNu-rXFOg;<-9*}n^b=_)(ov+PM%`1S zsYcyZq^(BXSER8>XOY$-y+xXfbQfta(qE*(NQaRY8+DJ7CL48^kv1E3pOHo*okm)X z^crb4(ru*OmX3FDP)O*l9%p#iZG0^2LmkQgz2W~v{O_BKx);#-jH;zsIawm3DmyzX IJ4?9!1Y+B7Z2$lO literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/US/Aleutian b/absl/time/internal/cctz/testdata/zoneinfo/US/Aleutian new file mode 100644 index 0000000000000000000000000000000000000000..5696e0f8bedee72515c43f686881a561af339db9 GIT binary patch literal 2365 zcmciCZ%ma{0LSsm-^)cYDj-Bm!Hl7RhrdBt9tc86zkSYhaF=n{(Efu39oj-p=>b){C0&@;rN<&*6@@zpuBZ z`Na&^zmCWJ!pj*jFZYBu%;$W6p>J}&4;$T{s9x$cDDyrdWWIPF_FeM?5@G2f!Er{#So zrku!k$K?I}r=17(ejp!g9&)0#?32+Yy-rMCy?iLS&WTOz(ThC=PF&zN9k)7hdE76K zUUDT<#ZPAFrDvkm!(T?}Wgp&B%R7r@Lf^DXtV)(ET7DOggY)tcV7v>2>a=}n)@j1H+Xiw9&@WunSX z+9h)`gVkehugr~45V_ZKWZry`c>G+feB%47Vy(*3PmY}vPYuNAb?=`LvUN`9A2_QD z$}j1s8$MBmYrfG%h5f4N*Bi1p^g$Qg8g~ zB~`w4P&-FURmIvpdQ)eLs*JDJ-l|2)JD;bkvTv%Yt5tIIvIw#HY_8mL=Z2{HC{8{< zGa!-2eIqS~+F@ZgYYHE@3Ap^9U z5h6oGJ4P-Hl4C{*3=(IUgOn(-n7Mn;Sb85uJ&Xk^sLu#s^i z14l-V3>_IeGI(V4$ncTzBLT3Q2v|)BkQg9AK%#(z0f_?=2qY3nD3Dkn!9b#cgae6( z)dU2Ih}DDyi3t)EBq~T)khma$K_Y{M28j(493(nOc#!xY0YV~VH6cP`gaiqR5)vjP zPDr4TNFkv@Vub_?i53zrBwkh%FeGAD6EY-bRueQNYDn0SxFLZ^2SkNXjVd1Qo4W~PKCY%?)FLS>C z>6#0TQZm1OlnVTQ5y8O32!zZ)$jJ2n|Fm}u4FCVHUckum|Nq;uKkB@H%gRct^ z2Lo|<2+(i{2qEkw9-vCFlYT(;{0D+K7M=|t8stO}4RR)k200Z(gPaSZK~4tIAZLSV apwmG#$oU`|;@ zhGvVQk_wrKh~{WcDN2$`xS>(#ZeX~vnF$&Y>LFfYH$oy#!8hx0#iLzBjZ z$lu1(zQe=(Y9C(vX!|X5jlW*@)it$zegnPY{iAB-z7$#Y;_oIa;-FqVy40*0P%0mL zFIH>4LT^kQta9e` z)L%w+Rhx#l(VP8Rsx9HQb?#j*mDl2|&Z{U_TWi;nt-A}=*QYCFTXvbrFWMv97Z#X; zp(V0oeYh&jcujW3W|*QelVw-nII}zERsBuFr_7!X6ZM|zv1+eZAHDZTq}ungOCM}= zMI9Vj*A!2`EQfmhVh#^HEG4b?n;$~A$PvjlrQS=WwEQjeqid5sS}@HVD_g9OfAXd( z%TLoky)spmXAaXRlH%0K^lti8R3~*hp_M)}DBM&;hRfN`zUG{tul(FpOr`y=RbD-5 zeyKPqzm^o4s@+9$e)|b^A-i0gWjocyg@yXk+|}xGa+ba_VuAWCcD}yaJxTo@I9^vj z@{+mMFj`-)lW4A2C(4a;QRe26DEVVgd*jM&FYdKoMwWPq$ASx{#*7P6b4qbJbv_Z6P|rjciZ}gd17Ii?*4%?J(3G_&y3gAld&sxuQAE0 zcVLE&=-p36T;3v)9VVH`;-wPh6>Fk$W=nKcuzC8!#rm0&J}PETn(nhXNW~5xru)9v zSoI6w&!M=yg;9Vj^T$|0%tdlaVY>643Q6$gi z&oT*P*2sv=;pVxRLOpUpni|z1OOH+*rp9>9*JC5Qsj*e#b)sJ@mAF4zCwY3Pq;>v! zLd7Zd{CiO{@jJJfl-gbkf&y-FfRhYPsE?EtfjHmio>+jhyfI-g^I;m^kUx+dc#0B*H$u2HB@?oZW49 zJpLl?-}hpb{j9SWt8e|1{p)UbLQU6lWKSZy64{r?&P4VmvOAIeiR@5hk0QGi*{6|SL5B0Ct_!^kd1_A#=Pk-h9_cQdk|9qo=r z_B67qk$sKqY-DdEyBpcx$PP#LII_!;eU9vOWUo8g-Hz;cN4w*ZJ&){qN4xKlosaB& zWcMTcA87#60i*?vwg*TPkS-u?K>C0*0_gwIHYq(>yX|d&12{u(msa%Aq`~cAkspH z9wJR-=pxcahCVvlMk1X=T8Z=$X(rN5q@4`?L>kJ_QKY2|Jw=+z&{ap@3|&Ur%+O~?+h~SPBduoWHPURP+eo{Sej^P> zI*zm)={eGLr0b5h?F@Z)w2f!zyrXSBL+_F1Bi%>ZkMtk80gyWYxdo7W0J#Z}yTH-j z2FQKjXm13DJHgT33JmuGax*a84an`la6ce71j8MH+!Dw=f!q|xU4h&d$bI2xZw%zl zaJ07ua&I`=n*+H!klTad{y=UJhC2kgMHuc84gWNN6N7u>!2hBeoH1+Jg)5+dF{xKZ`LIQ&PV}gSNf&+r; F{Ry|ZcJBZH literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/US/East-Indiana b/absl/time/internal/cctz/testdata/zoneinfo/US/East-Indiana new file mode 100644 index 0000000000000000000000000000000000000000..4a92c06593d33d3969756f482e5d3d4b773984ef GIT binary patch literal 1675 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 SRPU&s5#C%J%>V!A zFflLy$p{9P|NpBp7&-p`FHT@!@$n5|@CXKCmk^+S2nZo;D?3mn*w!CVJ^z8AxBx^rPJ#dc literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/US/Indiana-Starke b/absl/time/internal/cctz/testdata/zoneinfo/US/Indiana-Starke new file mode 100644 index 0000000000000000000000000000000000000000..cc785da97de0a5614613f9ba6e502d7dc5f525b5 GIT binary patch literal 2437 zcmd_rUrg0y9LMo52q6eaCWd5SS}_9&Y$$E8wFP5`#6Nk!KM+Q0h-E%1kf_n))+8^Q zrA@&a>LQnGhSpSU3r(rDnlm&BQVB4LS;(VtK}zTJydN*KKlgpv@4U_qC|931-bH24 zPm{k~i2a0z+hrf#$7uUfzb{Ge{`7aXXLF?9yX%7b=5?PwJ9$u@EeSQ}^Uq7$#M9>c zw4>54jiw{IPCB~YGC%kZ>kB8=nv0z~^`-r9s?O#r{o|H3s;jSGmp;5`X5Z>v#V+jV%yK@)MJLPs9kW=8MdCQ)_e=I$-!GN!7) z+*4K{V;82IXivI~dpy?MJ0(_PCe2XeM-EGD;CK~#BSzoXeM?Pfy{Yg2{E~`0bWz9e zJ+3BJj+O^D?NyWVugl~WpP2{K&dEc$yUoMVhb7^WO(wzDs;7i4FHdg6bM^e=6qC!1q#~3v?BU3+JF{tKE zh}YiyHsu`-&;@Bts^ChTEQtHgEcilXq3?)U)X*b^owcUuwHA4%dA%uKx=$9@7nx`C zPU@1HD)rpd2EC-TP%Vwvte53vs%8Dlb!kGpDm|U6%R&NF*?}azqW7|TVTVUvJmWVj zD--3V#%{B!AVSpEQ)YGAfUH^dzF8aHD&@0lOu4ULSEe_p%FZ)-UCd^+uKAFz8d|Q_ z*KgMw+H=*$>I(fzQj%7D}XDFjjpq!dUk zkYXU!KvxdlP!G-)grg!zNjPeP6a}dYQWm5xPFonHGEQ3>j@lr_L8^n42dNKIAdU(l zCE}RQI(-x4Uf=*jPjv69GM5>6C5ve0mNTiZTDUn(t#YC#9hsqsHoGHl%u9dQ8}uLl$E2dNMSiDiiIBd&4JK9@6%_ET*&=HE~p9pb#TC3^bYF8%1e?| zdRiqtH(jntJFEiUAqkjgRI=`oly6?qsVAdy?TKzZ_4TJs+JQ|veRs3DuJb;9eXQ0@ zTV0?t>hjGE^HcPV`N<|TCtppUGG=DPC#xC12V~|CV=C+XFLKkVb1M7D=W_GGBkGoR z&)oXdUX|1EqsiSosBa6NF|!suuW!$I&Eyqq)p?U2Nq(R~=a0N91wYTzvxjy`;c!G1 z^~a?6*j!c8wOC5`W~#Di)Rb@eQ_ZQZGj}ZiUIp`Jo4MsfYF<*RshIh#t{DBz%%Au` zFF1SN-1%L<4h{Y)cfG$;-@WGxx#z`=y0Y!4EbQK)?ycV^RZSaIbxFI_R9C5*@c~m? zv|iT^_nNxYg}Uxot64Obs~5ktTb6uPslwY^Wa+y(s(x))mh~m5`$HwN{IOBBA}d`Y z4WFpU#JH>szM)qBG}WxiKC4%qxolQX4(P_i!)DD$uU^}I+&nncs@FB`H|zVCY88G* zHtcFq8;knnp=ek&rFKYjZHa0gYm{hSx{7`ll33!nioKOBn@7J?Eqx12>$%JN;r1-^ z$l$PUYnU{$=eT|}sLhtP{d#N0X|t`qQ*WERB<&S_s(s{?bYym@j-f-+d8JW3-rpln zTnwr0T~T@Ry=>LBu1FV#rHox8JFVj zGuc`}>aki7sx5?Lm)PN!Wc zvQlKJ$Xb!bBCAD~i>wz}FtTD~$;g_KMI)11Sem52PSSMUavpH9?AkRK;n_g4D%n z3xia~X-k9D1}P3w9i%)+eUJhn6+%jc)CegOQYEJ?6H+IqEfi8Ir!5syE2LORwUBZl z^+F1UR17H@QZuAzNY#+CA$4=w!XcG&+R`DlbK2q|)kDgM)DI~jQbDAINDYx9B2`4n zh}6+(3yDAL!PH}m0X<@jmthlVW GH1HR^1#Eo) literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/US/Mountain b/absl/time/internal/cctz/testdata/zoneinfo/US/Mountain new file mode 100644 index 0000000000000000000000000000000000000000..7fc669171f88e8e1fb0c1483bb83e746e5f1c779 GIT binary patch literal 2453 zcmdtjeN5F=9LMnkqQH%ZQ;8vb8FWLuL3o9$5k`URY6U)Y(?UE3#rVT< zR*YFDf|Ayni4SWwHq3b&mt~`eO%k}b^FAy8>5u+w>&t$;e%!&IpEvGR z-Zfd`A2->2!ozi$hxe(9ANJ?zJ^i7o`=tck^V$z;Z>?YNYndW?3oq&3_WkO^wg^2m z=l6!8>R53#-KR(Ab%;NrJ^EUhPh1;)Mvi^&5##48Hesdb*xmIy=m9w`H%Z)*G*8CPE>zRQ9WpLBQN{f_SI2)D zt`dgA^o&zKs+or`>sx!ys9C-l^0w`V)a(@jIcM!h;`Zz>FGv zB*zAkG<-@YUv`T-2lnZda}6rB>qVV*v`nQp)#;2^7O2d+7MZninwsxiBNvp7s_euE ze9|x>fuGjy37}>mM5fY_lmETdpuf~XP;K(-=s*-%&&xJFiNiU4~kX2Bl3~q z1ER8JNIp8yCaP+V$<*7-ulRIbVydb;yRY*i1vPNW)$SRR#BI`sJimcRXmWr$uS*+Ep7FjN`USz?@imhhJ$eNKwBdbQc zY+hJ5XBG~uoMY+8+L6U0t4EfPtlw%1fKBc$bvVj{)Q6)$NQJDXL`aRS zrbtMYILd_72`Lm(DWp_Lt&n0N)k4aJ)C(yXQZb}tNX@LKXh_vK%7)a9qi{&&I7)}q zj-z-;^^o!*^+O7XRM2Wlh}6((iilLvYRZVzk)x1EC6Q7hwM2@ER1+yDQct9yNJXut zq)1Jzrl?3&t){FVrON6L@X jUtDkg|1SRy^Iu`1`R|b8nxB@HmXYGh%uLHn%W(V&DI1f# literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/US/Pacific b/absl/time/internal/cctz/testdata/zoneinfo/US/Pacific new file mode 100644 index 0000000000000000000000000000000000000000..c0ce4402f60a135017d49933afdbee55916b9be3 GIT binary patch literal 2845 zcmd_rdra0<9LMnoMG+J|nJ5w3NlgR+0Y&jr=52tAs33_MUJ@9lp+cx-NQ*LS#+S@X zH#(ZNTp60PSrnlyS8J9*bKWAdRHotuE%DOxbl&IR{^;-4d3JuU-=4vr&-;@(yC5&Y z^N-WPe#7N_W-sqO%Iu@+y%h6yO^BH1qs-RVugiDq!c2X?YfJ0r4^T(E#dD69?Udu* zujE9XsFRKF%FjDKl*Zb%^2@rHrKzewel1ukr%ETwZ>cln_na6x9XV9aBu`RjyH8im z5z(r-b%;6_&{dtQ4^ijOTviu$Uso*$>(#}|W9m}%MY+7JMqQ~mEUjzy%hke<<=WhL zb z7rLl+D?97<%La=7{0P%wdXRJ+8)yRJE=a)o@g`7xFM&J1)IpbbN#~|&)8*J96mFCrsRiaT1^ZicTo%FGG@x_0Wut zk{FSthb1)2@PH(p6y8B4oek3?Zk<&l58l?JPJF9I?+P{d*L5+O?pDSwC*Wo(b+n{D| z_v(im_o_MNP5P1A%_?W%0X?^Bm715@;KVp>R zAIdWY0llSQXNp;L#wU+$%GHYxhpQze$@=kXuPV%n)JrRx)Usin_42|4swkvI7pHGm z#lApOl2j)pjpxnE&~37^_K;cCRxVFgRhy@d=E>^PO7rx-6e-OqGHbR(NjpFLY47jg z^}qA+`6>r^JU-uB;^*)4Rg`%;x%V#asivf5dZtaVH^bhC?46crf6*R~pL=BfdkJdn zAG#8>@gMg1?8)&Dt3%3w)B!03QVFCKNG+VU7)Ujcav=3U3W8JwDG5>&q$o&Lkg_0k zK?;LZ1}P0v8>Bc$b)2?5NPV2PKuCp<5+OB0iiA`NDHBpBq)>; zFQi~jTQQ_$NX?LLKNG+WH{{blM6cB}8h76cMQ+ zQbweXNFk9*BBexXi4+s5CQ?qMo=8EFiXtU-+L|IoMXHLF6{#yySfsK@X_49@#YL)% zlozQlQeda8Fj8Wttuaz$q{>K{kvb!VMkY^2&qxsiG!1xG55l-y}+juaiK zI#PC|?nvR0$|I#mYL65jsXkJEr2fbPIPD4`OW?F?fGmR3t^%?Q$T}bkfvg0w6v$d2 zi-D{LvK+{IAPeHOD}pSE)2<1!C{DX7$g&{of-DTOGRV>(YlAEfvO37}AnSuH5VAtZ z5;^S}A&ca+tAs3*)2LlONFczvRKG!A>?)FWsFW65}Obk7o8R#9~&PV7xXtE&6qp@ literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/US/Samoa b/absl/time/internal/cctz/testdata/zoneinfo/US/Samoa new file mode 100644 index 0000000000000000000000000000000000000000..3e38e97c97ddf5e054fba822cfce1c5ccd422e3f GIT binary patch literal 196 zcmWHE%1kq2zyQoZ5fBCeCLji}IU0b(MAqLNj6ji%6$}jj|HuCTk*NU;EIz&=48g%6 mKouYmLfBN84IDrtz~Da+x7kP855a3xUy literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/UTC b/absl/time/internal/cctz/testdata/zoneinfo/UTC new file mode 100644 index 0000000000000000000000000000000000000000..c3b97f1a199421d6d9625b280316d99b85a4a4e8 GIT binary patch literal 127 ucmWHE%1kq2zyORu5fFv}5SsY-mAs!LW&1QJd+t1JZ8SxdGE1@_kF&GmS(5; zYpl{IOvX+<*{A#U(sL+j^lIs+_Fl*IOz)TCmTMjRX8K;YPW6joe}BoKJFxOtFyL|y z55yiF9&nk1LrLDcdjV@>tbJ&Fb^N3|E^?wSZgxd5{zJ^Tb;9FbGj?e_VWdwb-t1Dg zD`!>G`IBnxnI@Iox<{oPs8H)_HmlT<47EPns?riIDm`jW*~9G8{yAP|ypQu|wmtS| zzM7Seryph3-AS1pcp-BxKav|d?#PX&`ebfXm&`jjqMRqXRlciNZQ9+g3T%E==-jUg zza3UZ32n0IO}Q$bYmi$WrmL+JC9-7DBV7-YWNBxbEb9@{-5epebtJ0o-YMxh@?Dju zJ(ph3TU8NuOID^nQI*rrRFyfPs$SkuJKlAw>f0Ao&DeEWd-1sP)z}(M<`8peNN8Ai zL}Wzxvhaxc%M!KZieA3t$I=^r?qe)Mq!#NB!5S(=-Z@jG-k)Y))@_OwqR4I1U(1mz zVi)!mbtbD2iOItD`?(|6l(KMM3h~vTb{66-#9fHL5QiZiLtKXV3~?IbHNl0qC;JXc}v4tWhyHU1gU!H+6IwThI4->nmT?b9VN5cDD2G|NRBF zw>D*Z?s*A|B_4Ro9&PKi$96W@8R_ag5S~VM`r@nYlPmlj8@5rxuX7GEZ^(L{k(A6ln1 z$K$lNDM{=4^X>VP5EVDZ+WO>QJ$pS4{Ff79+YpIAfP6*VRvvpq#)YI^9rn&YMB z8%Nc$*s0d(UcEdY(B6-BsO`%Rd*yJE+DEJG)s{rPb|}X>DhsW%DcWAoNU$#dU-m}0 z$GX!a)qU%l^@J^`=bO*1_vW1Tog20NGZQ*+?2-b<#lcKoUVRK~h0-L6SkTLDE6;K@vhT zLQ+CTSl^j~E| Bn416q literal 0 HcmV?d00001 diff --git a/absl/time/internal/cctz/testdata/zoneinfo/Zulu b/absl/time/internal/cctz/testdata/zoneinfo/Zulu new file mode 100644 index 0000000000000000000000000000000000000000..c3b97f1a199421d6d9625b280316d99b85a4a4e8 GIT binary patch literal 127 ucmWHE%1kq2zyORu5fFv}5Ss #include "absl/base/internal/raw_logging.h" -#include "cctz/zone_info_source.h" +#include "absl/time/internal/cctz/include/cctz/zone_info_source.h" + +namespace cctz = absl::time_internal::cctz; namespace absl { namespace time_internal { @@ -33,6 +35,8 @@ TimeZone LoadTimeZone(const std::string& name) { } // namespace time_internal } // namespace absl +namespace absl { +namespace time_internal { namespace cctz_extension { namespace { @@ -115,3 +119,5 @@ std::unique_ptr TestFactory( ZoneInfoSourceFactory zone_info_source_factory = TestFactory; } // namespace cctz_extension +} // namespace time_internal +} // namespace absl diff --git a/absl/time/time.cc b/absl/time/time.cc index 0fb285a7b..1dde40d7e 100644 --- a/absl/time/time.cc +++ b/absl/time/time.cc @@ -36,8 +36,10 @@ #include #include -#include "cctz/civil_time.h" -#include "cctz/time_zone.h" +#include "absl/time/internal/cctz/include/cctz/civil_time.h" +#include "absl/time/internal/cctz/include/cctz/time_zone.h" + +namespace cctz = absl::time_internal::cctz; namespace absl { namespace { diff --git a/absl/time/time.h b/absl/time/time.h index 30c49d412..c50d69a56 100644 --- a/absl/time/time.h +++ b/absl/time/time.h @@ -64,7 +64,7 @@ #include #include "absl/base/port.h" // Needed for string vs std::string -#include "cctz/time_zone.h" +#include "absl/time/internal/cctz/include/cctz/time_zone.h" namespace absl { @@ -1032,12 +1032,12 @@ std::string UnparseFlag(Time t); // - http://en.wikipedia.org/wiki/Zoneinfo class TimeZone { public: - explicit TimeZone(cctz::time_zone tz) : cz_(tz) {} + explicit TimeZone(time_internal::cctz::time_zone tz) : cz_(tz) {} TimeZone() = default; // UTC, but prefer UTCTimeZone() to be explicit. TimeZone(const TimeZone&) = default; TimeZone& operator=(const TimeZone&) = default; - explicit operator cctz::time_zone() const { return cz_; } + explicit operator time_internal::cctz::time_zone() const { return cz_; } std::string name() const { return cz_.name(); } @@ -1048,7 +1048,7 @@ class TimeZone { return os << tz.name(); } - cctz::time_zone cz_; + time_internal::cctz::time_zone cz_; }; // LoadTimeZone() @@ -1058,11 +1058,11 @@ class TimeZone { // `false` and `*tz` is set to the UTC time zone. inline bool LoadTimeZone(const std::string& name, TimeZone* tz) { if (name == "localtime") { - *tz = TimeZone(cctz::local_time_zone()); + *tz = TimeZone(time_internal::cctz::local_time_zone()); return true; } - cctz::time_zone cz; - const bool b = cctz::load_time_zone(name, &cz); + time_internal::cctz::time_zone cz; + const bool b = time_internal::cctz::load_time_zone(name, &cz); *tz = TimeZone(cz); return b; } @@ -1074,14 +1074,14 @@ inline bool LoadTimeZone(const std::string& name, TimeZone* tz) { // you'll get UTC (i.e., no offset) instead. inline TimeZone FixedTimeZone(int seconds) { return TimeZone( - cctz::fixed_time_zone(std::chrono::seconds(seconds))); + time_internal::cctz::fixed_time_zone(std::chrono::seconds(seconds))); } // UTCTimeZone() // // Convenience method returning the UTC time zone. inline TimeZone UTCTimeZone() { - return TimeZone(cctz::utc_time_zone()); + return TimeZone(time_internal::cctz::utc_time_zone()); } // LocalTimeZone() @@ -1091,7 +1091,7 @@ inline TimeZone UTCTimeZone() { // and particularly so in a server process, as the zone configured for the // local machine should be irrelevant. Prefer an explicit zone name. inline TimeZone LocalTimeZone() { - return TimeZone(cctz::local_time_zone()); + return TimeZone(time_internal::cctz::local_time_zone()); } // ============================================================================ diff --git a/absl/time/time_zone_test.cc b/absl/time/time_zone_test.cc index 299156829..7138560ac 100644 --- a/absl/time/time_zone_test.cc +++ b/absl/time/time_zone_test.cc @@ -12,12 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "cctz/time_zone.h" +#include "absl/time/internal/cctz/include/cctz/time_zone.h" #include "gtest/gtest.h" #include "absl/time/internal/test_util.h" #include "absl/time/time.h" +namespace cctz = absl::time_internal::cctz; + namespace { TEST(TimeZone, ValueSemantics) { diff --git a/absl/types/optional.h b/absl/types/optional.h index 581321dc3..98b29e591 100644 --- a/absl/types/optional.h +++ b/absl/types/optional.h @@ -774,7 +774,9 @@ class optional : private optional_internal::optional_data, // // Accesses the underlying `T` value's member `m` of an `optional`. If the // `optional` is empty, behavior is undefined. - constexpr const T* operator->() const { return this->pointer(); } + // + // If you need myOpt->foo in constexpr, use (*myOpt).foo instead. + const T* operator->() const { return this->pointer(); } T* operator->() { assert(this->engaged_); return this->pointer(); @@ -870,12 +872,12 @@ class optional : private optional_internal::optional_data, private: // Private accessors for internal storage viewed as pointer to T. - constexpr const T* pointer() const { return &this->data_; } - T* pointer() { return &this->data_; } + const T* pointer() const { return std::addressof(this->data_); } + T* pointer() { return std::addressof(this->data_); } // Private accessors for internal storage viewed as reference to T. - constexpr const T& reference() const { return *this->pointer(); } - T& reference() { return *(this->pointer()); } + constexpr const T& reference() const { return this->data_; } + T& reference() { return this->data_; } // T constraint checks. You can't have an optional of nullopt_t, in_place_t // or a reference. diff --git a/absl/types/optional_test.cc b/absl/types/optional_test.cc index 5eedfcfd5..179bfd66d 100644 --- a/absl/types/optional_test.cc +++ b/absl/types/optional_test.cc @@ -263,7 +263,7 @@ TEST(optionalTest, CopyConstructor) { constexpr absl::optional o1(42); constexpr absl::optional o2 = o1; static_assert(o2, ""); - static_assert(o2->x == 42, ""); + static_assert((*o2).x == 42, ""); #ifndef ABSL_GLIBCXX_OPTIONAL_TRIVIALITY_BUG EXPECT_TRUE(absl::is_trivially_copy_constructible< absl::optional>::value); @@ -327,14 +327,14 @@ TEST(optionalTest, Destructor) { TEST(optionalTest, InPlaceConstructor) { constexpr absl::optional opt0{absl::in_place_t()}; static_assert(opt0, ""); - static_assert(opt0->x == ConstexprType::kCtorDefault, ""); + static_assert((*opt0).x == ConstexprType::kCtorDefault, ""); constexpr absl::optional opt1{absl::in_place_t(), 1}; static_assert(opt1, ""); - static_assert(opt1->x == ConstexprType::kCtorInt, ""); + static_assert((*opt1).x == ConstexprType::kCtorInt, ""); #ifndef ABSL_HAVE_NO_CONSTEXPR_INITIALIZER_LIST constexpr absl::optional opt2{absl::in_place_t(), {1, 2}}; static_assert(opt2, ""); - static_assert(opt2->x == ConstexprType::kCtorInitializerList, ""); + static_assert((*opt2).x == ConstexprType::kCtorInitializerList, ""); #endif // TODO(absl-team): uncomment these when std::is_constructible @@ -362,13 +362,13 @@ TEST(optionalTest, ValueConstructor) { // optional via ConstexprType::ConstexprType(const char*). constexpr absl::optional opt1 = {"abc"}; static_assert(opt1, ""); - static_assert(ConstexprType::kCtorConstChar == opt1->x, ""); + static_assert(ConstexprType::kCtorConstChar == (*opt1).x, ""); EXPECT_TRUE( (std::is_convertible>::value)); // direct initialization constexpr absl::optional opt2{2}; static_assert(opt2, ""); - static_assert(ConstexprType::kCtorInt == opt2->x, ""); + static_assert(ConstexprType::kCtorInt == (*opt2).x, ""); EXPECT_FALSE( (std::is_convertible>::value)); @@ -934,6 +934,33 @@ TEST(optionalTest, Swap) { EXPECT_TRUE(noexcept(swap(opt1, opt2))); } +template +struct DeletedOpAddr { + constexpr static const int value = v; + constexpr DeletedOpAddr() = default; + constexpr const DeletedOpAddr* operator&() const = delete; // NOLINT + DeletedOpAddr* operator&() = delete; // NOLINT +}; + +// The static_assert featuring a constexpr call to operator->() is commented out +// to document the fact that the current implementation of absl::optional +// expects such usecases to be malformed and not compile. +TEST(optionalTest, OperatorAddr) { + constexpr const int v = -1; + { // constexpr + constexpr const absl::optional> opt(absl::in_place_t{}); + static_assert(opt.has_value(), ""); + // static_assert(opt->value == v, ""); + static_assert((*opt).value == v, ""); + } + { // non-constexpr + const absl::optional> opt(absl::in_place_t{}); + EXPECT_TRUE(opt.has_value()); + EXPECT_TRUE(opt->value == v); + EXPECT_TRUE((*opt).value == v); + } +} + TEST(optionalTest, PointerStuff) { absl::optional opt(absl::in_place, "foo"); EXPECT_EQ("foo", *opt); @@ -943,7 +970,7 @@ TEST(optionalTest, PointerStuff) { EXPECT_EQ(opt_const->size(), 3); constexpr absl::optional opt1(1); - static_assert(opt1->x == ConstexprType::kCtorInt, ""); + static_assert((*opt1).x == ConstexprType::kCtorInt, ""); } // gcc has a bug pre 4.9.1 where it doesn't do correct overload resolution @@ -1123,13 +1150,13 @@ TEST(optionalTest, make_optional) { constexpr TrivialCopyable v; constexpr absl::optional c_opt0 = absl::make_optional(v); - static_assert(c_opt0->x == 0, ""); + static_assert((*c_opt0).x == 0, ""); constexpr absl::optional c_opt1 = absl::make_optional(); - static_assert(c_opt1->x == 0, ""); + static_assert((*c_opt1).x == 0, ""); constexpr absl::optional c_opt2 = absl::make_optional(42); - static_assert(c_opt2->x == 42, ""); + static_assert((*c_opt2).x == 42, ""); } }