PK `ZZZ��~� � pytz/__init__.py'''
datetime.tzinfo timezone definitions generated from the
Olson timezone database:
ftp://elsie.nci.nih.gov/pub/tz*.tar.gz
See the datetime section of the Python Library Reference for information
on how to use these modules.
'''
import sys
import datetime
import os.path
from pytz.exceptions import AmbiguousTimeError
from pytz.exceptions import InvalidTimeError
from pytz.exceptions import NonExistentTimeError
from pytz.exceptions import UnknownTimeZoneError
from pytz.lazy import LazyDict, LazyList, LazySet # noqa
from pytz.tzinfo import unpickler, BaseTzInfo
from pytz.tzfile import build_tzinfo
# The IANA (nee Olson) database is updated several times a year.
OLSON_VERSION = '2024a'
VERSION = '2024.1' # pip compatible version number.
__version__ = VERSION
OLSEN_VERSION = OLSON_VERSION # Old releases had this misspelling
__all__ = [
'timezone', 'utc', 'country_timezones', 'country_names',
'AmbiguousTimeError', 'InvalidTimeError',
'NonExistentTimeError', 'UnknownTimeZoneError',
'all_timezones', 'all_timezones_set',
'common_timezones', 'common_timezones_set',
'BaseTzInfo', 'FixedOffset',
]
if sys.version_info[0] > 2: # Python 3.x
# Python 3.x doesn't have unicode(), making writing code
# for Python 2.3 and Python 3.x a pain.
unicode = str
def ascii(s):
r"""
>>> ascii('Hello')
'Hello'
>>> ascii('\N{TRADE MARK SIGN}') #doctest: +IGNORE_EXCEPTION_DETAIL
Traceback (most recent call last):
...
UnicodeEncodeError: ...
"""
if type(s) == bytes:
s = s.decode('ASCII')
else:
s.encode('ASCII') # Raise an exception if not ASCII
return s # But the string - not a byte string.
else: # Python 2.x
def ascii(s):
r"""
>>> ascii('Hello')
'Hello'
>>> ascii(u'Hello')
'Hello'
>>> ascii(u'\N{TRADE MARK SIGN}') #doctest: +IGNORE_EXCEPTION_DETAIL
Traceback (most recent call last):
...
UnicodeEncodeError: ...
"""
return s.encode('ASCII')
def open_resource(name):
"""Open a resource from the zoneinfo subdir for reading.
Uses the pkg_resources module if available and no standard file
found at the calculated location.
It is possible to specify different location for zoneinfo
subdir by using the PYTZ_TZDATADIR environment variable.
"""
name_parts = name.lstrip('/').split('/')
for part in name_parts:
if part == os.path.pardir or os.sep in part:
raise ValueError('Bad path segment: %r' % part)
zoneinfo_dir = os.environ.get('PYTZ_TZDATADIR', None)
if zoneinfo_dir is not None:
filename = os.path.join(zoneinfo_dir, *name_parts)
else:
filename = os.path.join(os.path.dirname(__file__),
'zoneinfo', *name_parts)
if not os.path.exists(filename):
# http://bugs.launchpad.net/bugs/383171 - we avoid using this
# unless absolutely necessary to help when a broken version of
# pkg_resources is installed.
try:
from pkg_resources import resource_stream
except ImportError:
resource_stream = None
if resource_stream is not None:
return resource_stream(__name__, 'zoneinfo/' + name)
return open(filename, 'rb')
def resource_exists(name):
"""Return true if the given resource exists"""
try:
if os.environ.get('PYTZ_SKIPEXISTSCHECK', ''):
# In "standard" distributions, we can assume that
# all the listed timezones are present. As an
# import-speed optimization, you can set the
# PYTZ_SKIPEXISTSCHECK flag to skip checking
# for the presence of the resource file on disk.
return True
open_resource(name).close()
return True
except IOError:
return False
_tzinfo_cache = {}
def timezone(zone):
r''' Return a datetime.tzinfo implementation for the given timezone
>>> from datetime import datetime, timedelta
>>> utc = timezone('UTC')
>>> eastern = timezone('US/Eastern')
>>> eastern.zone
'US/Eastern'
>>> timezone(unicode('US/Eastern')) is eastern
True
>>> utc_dt = datetime(2002, 10, 27, 6, 0, 0, tzinfo=utc)
>>> loc_dt = utc_dt.astimezone(eastern)
>>> fmt = '%Y-%m-%d %H:%M:%S %Z (%z)'
>>> loc_dt.strftime(fmt)
'2002-10-27 01:00:00 EST (-0500)'
>>> (loc_dt - timedelta(minutes=10)).strftime(fmt)
'2002-10-27 00:50:00 EST (-0500)'
>>> eastern.normalize(loc_dt - timedelta(minutes=10)).strftime(fmt)
'2002-10-27 01:50:00 EDT (-0400)'
>>> (loc_dt + timedelta(minutes=10)).strftime(fmt)
'2002-10-27 01:10:00 EST (-0500)'
Raises UnknownTimeZoneError if passed an unknown zone.
>>> try:
... timezone('Asia/Shangri-La')
... except UnknownTimeZoneError:
... print('Unknown')
Unknown
>>> try:
... timezone(unicode('\N{TRADE MARK SIGN}'))
... except UnknownTimeZoneError:
... print('Unknown')
Unknown
'''
if zone is None:
raise UnknownTimeZoneError(None)
if zone.upper() == 'UTC':
return utc
try:
zone = ascii(zone)
except UnicodeEncodeError:
# All valid timezones are ASCII
raise UnknownTimeZoneError(zone)
zone = _case_insensitive_zone_lookup(_unmunge_zone(zone))
if zone not in _tzinfo_cache:
if zone in all_timezones_set: # noqa
fp = open_resource(zone)
try:
_tzinfo_cache[zone] = build_tzinfo(zone, fp)
finally:
fp.close()
else:
raise UnknownTimeZoneError(zone)
return _tzinfo_cache[zone]
def _unmunge_zone(zone):
"""Undo the time zone name munging done by older versions of pytz."""
return zone.replace('_plus_', '+').replace('_minus_', '-')
_all_timezones_lower_to_standard = None
def _case_insensitive_zone_lookup(zone):
"""case-insensitively matching timezone, else return zone unchanged"""
global _all_timezones_lower_to_standard
if _all_timezones_lower_to_standard is None:
_all_timezones_lower_to_standard = dict((tz.lower(), tz) for tz in _all_timezones_unchecked) # noqa
return _all_timezones_lower_to_standard.get(zone.lower()) or zone # noqa
ZERO = datetime.timedelta(0)
HOUR = datetime.timedelta(hours=1)
class UTC(BaseTzInfo):
"""UTC
Optimized UTC implementation. It unpickles using the single module global
instance defined beneath this class declaration.
"""
zone = "UTC"
_utcoffset = ZERO
_dst = ZERO
_tzname = zone
def fromutc(self, dt):
if dt.tzinfo is None:
return self.localize(dt)
return super(utc.__class__, self).fromutc(dt)
def utcoffset(self, dt):
return ZERO
def tzname(self, dt):
return "UTC"
def dst(self, dt):
return ZERO
def __reduce__(self):
return _UTC, ()
def localize(self, dt, is_dst=False):
'''Convert naive time to local time'''
if dt.tzinfo is not None:
raise ValueError('Not naive datetime (tzinfo is already set)')
return dt.replace(tzinfo=self)
def normalize(self, dt, is_dst=False):
'''Correct the timezone information on the given datetime'''
if dt.tzinfo is self:
return dt
if dt.tzinfo is None:
raise ValueError('Naive time - no tzinfo set')
return dt.astimezone(self)
def __repr__(self):
return "<UTC>"
def __str__(self):
return "UTC"
UTC = utc = UTC() # UTC is a singleton
def _UTC():
"""Factory function for utc unpickling.
Makes sure that unpickling a utc instance always returns the same
module global.
These examples belong in the UTC class above, but it is obscured; or in
the README.rst, but we are not depending on Python 2.4 so integrating
the README.rst examples with the unit tests is not trivial.
>>> import datetime, pickle
>>> dt = datetime.datetime(2005, 3, 1, 14, 13, 21, tzinfo=utc)
>>> naive = dt.replace(tzinfo=None)
>>> p = pickle.dumps(dt, 1)
>>> naive_p = pickle.dumps(naive, 1)
>>> len(p) - len(naive_p)
17
>>> new = pickle.loads(p)
>>> new == dt
True
>>> new is dt
False
>>> new.tzinfo is dt.tzinfo
True
>>> utc is UTC is timezone('UTC')
True
>>> utc is timezone('GMT')
False
"""
return utc
_UTC.__safe_for_unpickling__ = True
def _p(*args):
"""Factory function for unpickling pytz tzinfo instances.
Just a wrapper around tzinfo.unpickler to save a few bytes in each pickle
by shortening the path.
"""
return unpickler(*args)
_p.__safe_for_unpickling__ = True
class _CountryTimezoneDict(LazyDict):
"""Map ISO 3166 country code to a list of timezone names commonly used
in that country.
iso3166_code is the two letter code used to identify the country.
>>> def print_list(list_of_strings):
... 'We use a helper so doctests work under Python 2.3 -> 3.x'
... for s in list_of_strings:
... print(s)
>>> print_list(country_timezones['nz'])
Pacific/Auckland
Pacific/Chatham
>>> print_list(country_timezones['ch'])
Europe/Zurich
>>> print_list(country_timezones['CH'])
Europe/Zurich
>>> print_list(country_timezones[unicode('ch')])
Europe/Zurich
>>> print_list(country_timezones['XXX'])
Traceback (most recent call last):
...
KeyError: 'XXX'
Previously, this information was exposed as a function rather than a
dictionary. This is still supported::
>>> print_list(country_timezones('nz'))
Pacific/Auckland
Pacific/Chatham
"""
def __call__(self, iso3166_code):
"""Backwards compatibility."""
return self[iso3166_code]
def _fill(self):
data = {}
zone_tab = open_resource('zone.tab')
try:
for line in zone_tab:
line = line.decode('UTF-8')
if line.startswith('#'):
continue
code, coordinates, zone = line.split(None, 4)[:3]
if zone not in all_timezones_set: # noqa
continue
try:
data[code].append(zone)
except KeyError:
data[code] = [zone]
self.data = data
finally:
zone_tab.close()
country_timezones = _CountryTimezoneDict()
class _CountryNameDict(LazyDict):
'''Dictionary proving ISO3166 code -> English name.
>>> print(country_names['au'])
Australia
'''
def _fill(self):
data = {}
zone_tab = open_resource('iso3166.tab')
try:
for line in zone_tab.readlines():
line = line.decode('UTF-8')
if line.startswith('#'):
continue
code, name = line.split(None, 1)
data[code] = name.strip()
self.data = data
finally:
zone_tab.close()
country_names = _CountryNameDict()
# Time-zone info based solely on fixed offsets
class _FixedOffset(datetime.tzinfo):
zone = None # to match the standard pytz API
def __init__(self, minutes):
if abs(minutes) >= 1440:
raise ValueError("absolute offset is too large", minutes)
self._minutes = minutes
self._offset = datetime.timedelta(minutes=minutes)
def utcoffset(self, dt):
return self._offset
def __reduce__(self):
return FixedOffset, (self._minutes, )
def dst(self, dt):
return ZERO
def tzname(self, dt):
return None
def __repr__(self):
return 'pytz.FixedOffset(%d)' % self._minutes
def localize(self, dt, is_dst=False):
'''Convert naive time to local time'''
if dt.tzinfo is not None:
raise ValueError('Not naive datetime (tzinfo is already set)')
return dt.replace(tzinfo=self)
def normalize(self, dt, is_dst=False):
'''Correct the timezone information on the given datetime'''
if dt.tzinfo is self:
return dt
if dt.tzinfo is None:
raise ValueError('Naive time - no tzinfo set')
return dt.astimezone(self)
def FixedOffset(offset, _tzinfos={}):
"""return a fixed-offset timezone based off a number of minutes.
>>> one = FixedOffset(-330)
>>> one
pytz.FixedOffset(-330)
>>> str(one.utcoffset(datetime.datetime.now()))
'-1 day, 18:30:00'
>>> str(one.dst(datetime.datetime.now()))
'0:00:00'
>>> two = FixedOffset(1380)
>>> two
pytz.FixedOffset(1380)
>>> str(two.utcoffset(datetime.datetime.now()))
'23:00:00'
>>> str(two.dst(datetime.datetime.now()))
'0:00:00'
The datetime.timedelta must be between the range of -1 and 1 day,
non-inclusive.
>>> FixedOffset(1440)
Traceback (most recent call last):
...
ValueError: ('absolute offset is too large', 1440)
>>> FixedOffset(-1440)
Traceback (most recent call last):
...
ValueError: ('absolute offset is too large', -1440)
An offset of 0 is special-cased to return UTC.
>>> FixedOffset(0) is UTC
True
There should always be only one instance of a FixedOffset per timedelta.
This should be true for multiple creation calls.
>>> FixedOffset(-330) is one
True
>>> FixedOffset(1380) is two
True
It should also be true for pickling.
>>> import pickle
>>> pickle.loads(pickle.dumps(one)) is one
True
>>> pickle.loads(pickle.dumps(two)) is two
True
"""
if offset == 0:
return UTC
info = _tzinfos.get(offset)
if info is None:
# We haven't seen this one before. we need to save it.
# Use setdefault to avoid a race condition and make sure we have
# only one
info = _tzinfos.setdefault(offset, _FixedOffset(offset))
return info
FixedOffset.__safe_for_unpickling__ = True
def _test():
import doctest
sys.path.insert(0, os.pardir)
import pytz
return doctest.testmod(pytz)
if __name__ == '__main__':
_test()
_all_timezones_unchecked = \
['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/Ciudad_Juarez',
'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/Nuuk',
'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/Qostanay',
'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/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/Kyiv',
'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/Kanton',
'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']
all_timezones = LazyList(
tz for tz in _all_timezones_unchecked if resource_exists(tz))
all_timezones_set = LazySet(all_timezones)
common_timezones = \
['Africa/Abidjan',
'Africa/Accra',
'Africa/Addis_Ababa',
'Africa/Algiers',
'Africa/Asmara',
'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/Tripoli',
'Africa/Tunis',
'Africa/Windhoek',
'America/Adak',
'America/Anchorage',
'America/Anguilla',
'America/Antigua',
'America/Araguaina',
'America/Argentina/Buenos_Aires',
'America/Argentina/Catamarca',
'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/Bahia',
'America/Bahia_Banderas',
'America/Barbados',
'America/Belem',
'America/Belize',
'America/Blanc-Sablon',
'America/Boa_Vista',
'America/Bogota',
'America/Boise',
'America/Cambridge_Bay',
'America/Campo_Grande',
'America/Cancun',
'America/Caracas',
'America/Cayenne',
'America/Cayman',
'America/Chicago',
'America/Chihuahua',
'America/Ciudad_Juarez',
'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/Fort_Nelson',
'America/Fortaleza',
'America/Glace_Bay',
'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/Inuvik',
'America/Iqaluit',
'America/Jamaica',
'America/Juneau',
'America/Kentucky/Louisville',
'America/Kentucky/Monticello',
'America/Kralendijk',
'America/La_Paz',
'America/Lima',
'America/Los_Angeles',
'America/Lower_Princes',
'America/Maceio',
'America/Managua',
'America/Manaus',
'America/Marigot',
'America/Martinique',
'America/Matamoros',
'America/Mazatlan',
'America/Menominee',
'America/Merida',
'America/Metlakatla',
'America/Mexico_City',
'America/Miquelon',
'America/Moncton',
'America/Monterrey',
'America/Montevideo',
'America/Montserrat',
'America/Nassau',
'America/New_York',
'America/Nome',
'America/Noronha',
'America/North_Dakota/Beulah',
'America/North_Dakota/Center',
'America/North_Dakota/New_Salem',
'America/Nuuk',
'America/Ojinaga',
'America/Panama',
'America/Paramaribo',
'America/Phoenix',
'America/Port-au-Prince',
'America/Port_of_Spain',
'America/Porto_Velho',
'America/Puerto_Rico',
'America/Punta_Arenas',
'America/Rankin_Inlet',
'America/Recife',
'America/Regina',
'America/Resolute',
'America/Rio_Branco',
'America/Santarem',
'America/Santiago',
'America/Santo_Domingo',
'America/Sao_Paulo',
'America/Scoresbysund',
'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/Tijuana',
'America/Toronto',
'America/Tortola',
'America/Vancouver',
'America/Whitehorse',
'America/Winnipeg',
'America/Yakutat',
'Antarctica/Casey',
'Antarctica/Davis',
'Antarctica/DumontDUrville',
'Antarctica/Macquarie',
'Antarctica/Mawson',
'Antarctica/McMurdo',
'Antarctica/Palmer',
'Antarctica/Rothera',
'Antarctica/Syowa',
'Antarctica/Troll',
'Antarctica/Vostok',
'Arctic/Longyearbyen',
'Asia/Aden',
'Asia/Almaty',
'Asia/Amman',
'Asia/Anadyr',
'Asia/Aqtau',
'Asia/Aqtobe',
'Asia/Ashgabat',
'Asia/Atyrau',
'Asia/Baghdad',
'Asia/Bahrain',
'Asia/Baku',
'Asia/Bangkok',
'Asia/Barnaul',
'Asia/Beirut',
'Asia/Bishkek',
'Asia/Brunei',
'Asia/Chita',
'Asia/Choibalsan',
'Asia/Colombo',
'Asia/Damascus',
'Asia/Dhaka',
'Asia/Dili',
'Asia/Dubai',
'Asia/Dushanbe',
'Asia/Famagusta',
'Asia/Gaza',
'Asia/Hebron',
'Asia/Ho_Chi_Minh',
'Asia/Hong_Kong',
'Asia/Hovd',
'Asia/Irkutsk',
'Asia/Jakarta',
'Asia/Jayapura',
'Asia/Jerusalem',
'Asia/Kabul',
'Asia/Kamchatka',
'Asia/Karachi',
'Asia/Kathmandu',
'Asia/Khandyga',
'Asia/Kolkata',
'Asia/Krasnoyarsk',
'Asia/Kuala_Lumpur',
'Asia/Kuching',
'Asia/Kuwait',
'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/Qostanay',
'Asia/Qyzylorda',
'Asia/Riyadh',
'Asia/Sakhalin',
'Asia/Samarkand',
'Asia/Seoul',
'Asia/Shanghai',
'Asia/Singapore',
'Asia/Srednekolymsk',
'Asia/Taipei',
'Asia/Tashkent',
'Asia/Tbilisi',
'Asia/Tehran',
'Asia/Thimphu',
'Asia/Tokyo',
'Asia/Tomsk',
'Asia/Ulaanbaatar',
'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/Faroe',
'Atlantic/Madeira',
'Atlantic/Reykjavik',
'Atlantic/South_Georgia',
'Atlantic/St_Helena',
'Atlantic/Stanley',
'Australia/Adelaide',
'Australia/Brisbane',
'Australia/Broken_Hill',
'Australia/Darwin',
'Australia/Eucla',
'Australia/Hobart',
'Australia/Lindeman',
'Australia/Lord_Howe',
'Australia/Melbourne',
'Australia/Perth',
'Australia/Sydney',
'Canada/Atlantic',
'Canada/Central',
'Canada/Eastern',
'Canada/Mountain',
'Canada/Newfoundland',
'Canada/Pacific',
'Europe/Amsterdam',
'Europe/Andorra',
'Europe/Astrakhan',
'Europe/Athens',
'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/Kirov',
'Europe/Kyiv',
'Europe/Lisbon',
'Europe/Ljubljana',
'Europe/London',
'Europe/Luxembourg',
'Europe/Madrid',
'Europe/Malta',
'Europe/Mariehamn',
'Europe/Minsk',
'Europe/Monaco',
'Europe/Moscow',
'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/Ulyanovsk',
'Europe/Vaduz',
'Europe/Vatican',
'Europe/Vienna',
'Europe/Vilnius',
'Europe/Volgograd',
'Europe/Warsaw',
'Europe/Zagreb',
'Europe/Zurich',
'GMT',
'Indian/Antananarivo',
'Indian/Chagos',
'Indian/Christmas',
'Indian/Cocos',
'Indian/Comoro',
'Indian/Kerguelen',
'Indian/Mahe',
'Indian/Maldives',
'Indian/Mauritius',
'Indian/Mayotte',
'Indian/Reunion',
'Pacific/Apia',
'Pacific/Auckland',
'Pacific/Bougainville',
'Pacific/Chatham',
'Pacific/Chuuk',
'Pacific/Easter',
'Pacific/Efate',
'Pacific/Fakaofo',
'Pacific/Fiji',
'Pacific/Funafuti',
'Pacific/Galapagos',
'Pacific/Gambier',
'Pacific/Guadalcanal',
'Pacific/Guam',
'Pacific/Honolulu',
'Pacific/Kanton',
'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/Port_Moresby',
'Pacific/Rarotonga',
'Pacific/Saipan',
'Pacific/Tahiti',
'Pacific/Tarawa',
'Pacific/Tongatapu',
'Pacific/Wake',
'Pacific/Wallis',
'US/Alaska',
'US/Arizona',
'US/Central',
'US/Eastern',
'US/Hawaii',
'US/Mountain',
'US/Pacific',
'UTC']
common_timezones = LazyList(
tz for tz in common_timezones if tz in all_timezones)
common_timezones_set = LazySet(common_timezones)
PK `ZZZ6�F# # pytz/exceptions.py'''
Custom exceptions raised by pytz.
'''
__all__ = [
'UnknownTimeZoneError', 'InvalidTimeError', 'AmbiguousTimeError',
'NonExistentTimeError',
]
class Error(Exception):
'''Base class for all exceptions raised by the pytz library'''
class UnknownTimeZoneError(KeyError, Error):
'''Exception raised when pytz is passed an unknown timezone.
>>> isinstance(UnknownTimeZoneError(), LookupError)
True
This class is actually a subclass of KeyError to provide backwards
compatibility with code relying on the undocumented behavior of earlier
pytz releases.
>>> isinstance(UnknownTimeZoneError(), KeyError)
True
And also a subclass of pytz.exceptions.Error, as are other pytz
exceptions.
>>> isinstance(UnknownTimeZoneError(), Error)
True
'''
pass
class InvalidTimeError(Error):
'''Base class for invalid time exceptions.'''
class AmbiguousTimeError(InvalidTimeError):
'''Exception raised when attempting to create an ambiguous wallclock time.
At the end of a DST transition period, a particular wallclock time will
occur twice (once before the clocks are set back, once after). Both
possibilities may be correct, unless further information is supplied.
See DstTzInfo.normalize() for more info
'''
class NonExistentTimeError(InvalidTimeError):
'''Exception raised when attempting to create a wallclock time that
cannot exist.
At the start of a DST transition period, the wallclock time jumps forward.
The instants jumped over never occur.
'''
PK `ZZZ�(c pytz/lazy.pyfrom threading import RLock
try:
from collections.abc import Mapping as DictMixin
except ImportError: # Python < 3.3
try:
from UserDict import DictMixin # Python 2
except ImportError: # Python 3.0-3.3
from collections import Mapping as DictMixin
# With lazy loading, we might end up with multiple threads triggering
# it at the same time. We need a lock.
_fill_lock = RLock()
class LazyDict(DictMixin):
"""Dictionary populated on first use."""
data = None
def __getitem__(self, key):
if self.data is None:
_fill_lock.acquire()
try:
if self.data is None:
self._fill()
finally:
_fill_lock.release()
return self.data[key.upper()]
def __contains__(self, key):
if self.data is None:
_fill_lock.acquire()
try:
if self.data is None:
self._fill()
finally:
_fill_lock.release()
return key in self.data
def __iter__(self):
if self.data is None:
_fill_lock.acquire()
try:
if self.data is None:
self._fill()
finally:
_fill_lock.release()
return iter(self.data)
def __len__(self):
if self.data is None:
_fill_lock.acquire()
try:
if self.data is None:
self._fill()
finally:
_fill_lock.release()
return len(self.data)
def keys(self):
if self.data is None:
_fill_lock.acquire()
try:
if self.data is None:
self._fill()
finally:
_fill_lock.release()
return self.data.keys()
class LazyList(list):
"""List populated on first use."""
_props = [
'__str__', '__repr__', '__unicode__',
'__hash__', '__sizeof__', '__cmp__',
'__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__',
'append', 'count', 'index', 'extend', 'insert', 'pop', 'remove',
'reverse', 'sort', '__add__', '__radd__', '__iadd__', '__mul__',
'__rmul__', '__imul__', '__contains__', '__len__', '__nonzero__',
'__getitem__', '__setitem__', '__delitem__', '__iter__',
'__reversed__', '__getslice__', '__setslice__', '__delslice__']
def __new__(cls, fill_iter=None):
if fill_iter is None:
return list()
# We need a new class as we will be dynamically messing with its
# methods.
class LazyList(list):
pass
fill_iter = [fill_iter]
def lazy(name):
def _lazy(self, *args, **kw):
_fill_lock.acquire()
try:
if len(fill_iter) > 0:
list.extend(self, fill_iter.pop())
for method_name in cls._props:
delattr(LazyList, method_name)
finally:
_fill_lock.release()
return getattr(list, name)(self, *args, **kw)
return _lazy
for name in cls._props:
setattr(LazyList, name, lazy(name))
new_list = LazyList()
return new_list
# Not all versions of Python declare the same magic methods.
# Filter out properties that don't exist in this version of Python
# from the list.
LazyList._props = [prop for prop in LazyList._props if hasattr(list, prop)]
class LazySet(set):
"""Set populated on first use."""
_props = (
'__str__', '__repr__', '__unicode__',
'__hash__', '__sizeof__', '__cmp__',
'__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__',
'__contains__', '__len__', '__nonzero__',
'__getitem__', '__setitem__', '__delitem__', '__iter__',
'__sub__', '__and__', '__xor__', '__or__',
'__rsub__', '__rand__', '__rxor__', '__ror__',
'__isub__', '__iand__', '__ixor__', '__ior__',
'add', 'clear', 'copy', 'difference', 'difference_update',
'discard', 'intersection', 'intersection_update', 'isdisjoint',
'issubset', 'issuperset', 'pop', 'remove',
'symmetric_difference', 'symmetric_difference_update',
'union', 'update')
def __new__(cls, fill_iter=None):
if fill_iter is None:
return set()
class LazySet(set):
pass
fill_iter = [fill_iter]
def lazy(name):
def _lazy(self, *args, **kw):
_fill_lock.acquire()
try:
if len(fill_iter) > 0:
for i in fill_iter.pop():
set.add(self, i)
for method_name in cls._props:
delattr(LazySet, method_name)
finally:
_fill_lock.release()
return getattr(set, name)(self, *args, **kw)
return _lazy
for name in cls._props:
setattr(LazySet, name, lazy(name))
new_set = LazySet()
return new_set
# Not all versions of Python declare the same magic methods.
# Filter out properties that don't exist in this version of Python
# from the list.
LazySet._props = [prop for prop in LazySet._props if hasattr(set, prop)]
PK `ZZZ���� � pytz/reference.py'''
Reference tzinfo implementations from the Python docs.
Used for testing against as they are only correct for the years
1987 to 2006. Do not use these for real code.
'''
from datetime import tzinfo, timedelta, datetime
from pytz import HOUR, ZERO, UTC
__all__ = [
'FixedOffset',
'LocalTimezone',
'USTimeZone',
'Eastern',
'Central',
'Mountain',
'Pacific',
'UTC'
]
# A class building tzinfo objects for fixed-offset time zones.
# Note that FixedOffset(0, "UTC") is a different way to build a
# UTC tzinfo object.
class FixedOffset(tzinfo):
"""Fixed offset in minutes east from UTC."""
def __init__(self, offset, name):
self.__offset = timedelta(minutes=offset)
self.__name = name
def utcoffset(self, dt):
return self.__offset
def tzname(self, dt):
return self.__name
def dst(self, dt):
return ZERO
import time as _time
STDOFFSET = timedelta(seconds=-_time.timezone)
if _time.daylight:
DSTOFFSET = timedelta(seconds=-_time.altzone)
else:
DSTOFFSET = STDOFFSET
DSTDIFF = DSTOFFSET - STDOFFSET
# A class capturing the platform's idea of local time.
class LocalTimezone(tzinfo):
def utcoffset(self, dt):
if self._isdst(dt):
return DSTOFFSET
else:
return STDOFFSET
def dst(self, dt):
if self._isdst(dt):
return DSTDIFF
else:
return ZERO
def tzname(self, dt):
return _time.tzname[self._isdst(dt)]
def _isdst(self, dt):
tt = (dt.year, dt.month, dt.day,
dt.hour, dt.minute, dt.second,
dt.weekday(), 0, -1)
stamp = _time.mktime(tt)
tt = _time.localtime(stamp)
return tt.tm_isdst > 0
Local = LocalTimezone()
def first_sunday_on_or_after(dt):
days_to_go = 6 - dt.weekday()
if days_to_go:
dt += timedelta(days_to_go)
return dt
# In the US, DST starts at 2am (standard time) on the first Sunday in April.
DSTSTART = datetime(1, 4, 1, 2)
# and ends at 2am (DST time; 1am standard time) on the last Sunday of Oct.
# which is the first Sunday on or after Oct 25.
DSTEND = datetime(1, 10, 25, 1)
# A complete implementation of current DST rules for major US time zones.
class USTimeZone(tzinfo):
def __init__(self, hours, reprname, stdname, dstname):
self.stdoffset = timedelta(hours=hours)
self.reprname = reprname
self.stdname = stdname
self.dstname = dstname
def __repr__(self):
return self.reprname
def tzname(self, dt):
if self.dst(dt):
return self.dstname
else:
return self.stdname
def utcoffset(self, dt):
return self.stdoffset + self.dst(dt)
def dst(self, dt):
if dt is None or dt.tzinfo is None:
# An exception may be sensible here, in one or both cases.
# It depends on how you want to treat them. The default
# fromutc() implementation (called by the default astimezone()
# implementation) passes a datetime with dt.tzinfo is self.
return ZERO
assert dt.tzinfo is self
# Find first Sunday in April & the last in October.
start = first_sunday_on_or_after(DSTSTART.replace(year=dt.year))
end = first_sunday_on_or_after(DSTEND.replace(year=dt.year))
# Can't compare naive to aware objects, so strip the timezone from
# dt first.
if start <= dt.replace(tzinfo=None) < end:
return HOUR
else:
return ZERO
Eastern = USTimeZone(-5, "Eastern", "EST", "EDT")
Central = USTimeZone(-6, "Central", "CST", "CDT")
Mountain = USTimeZone(-7, "Mountain", "MST", "MDT")
Pacific = USTimeZone(-8, "Pacific", "PST", "PDT")
PK `ZZZ6�z@s s pytz/tzfile.py'''
$Id: tzfile.py,v 1.8 2004/06/03 00:15:24 zenzen Exp $
'''
from datetime import datetime
from struct import unpack, calcsize
from pytz.tzinfo import StaticTzInfo, DstTzInfo, memorized_ttinfo
from pytz.tzinfo import memorized_datetime, memorized_timedelta
def _byte_string(s):
"""Cast a string or byte string to an ASCII byte string."""
return s.encode('ASCII')
_NULL = _byte_string('\0')
def _std_string(s):
"""Cast a string or byte string to an ASCII string."""
return str(s.decode('ASCII'))
def build_tzinfo(zone, fp):
head_fmt = '>4s c 15x 6l'
head_size = calcsize(head_fmt)
(magic, format, ttisgmtcnt, ttisstdcnt, leapcnt, timecnt,
typecnt, charcnt) = unpack(head_fmt, fp.read(head_size))
# Make sure it is a tzfile(5) file
assert magic == _byte_string('TZif'), 'Got magic %s' % repr(magic)
# Read out the transition times, localtime indices and ttinfo structures.
data_fmt = '>%(timecnt)dl %(timecnt)dB %(ttinfo)s %(charcnt)ds' % dict(
timecnt=timecnt, ttinfo='lBB' * typecnt, charcnt=charcnt)
data_size = calcsize(data_fmt)
data = unpack(data_fmt, fp.read(data_size))
# make sure we unpacked the right number of values
assert len(data) == 2 * timecnt + 3 * typecnt + 1
transitions = [memorized_datetime(trans)
for trans in data[:timecnt]]
lindexes = list(data[timecnt:2 * timecnt])
ttinfo_raw = data[2 * timecnt:-1]
tznames_raw = data[-1]
del data
# Process ttinfo into separate structs
ttinfo = []
tznames = {}
i = 0
while i < len(ttinfo_raw):
# have we looked up this timezone name yet?
tzname_offset = ttinfo_raw[i + 2]
if tzname_offset not in tznames:
nul = tznames_raw.find(_NULL, tzname_offset)
if nul < 0:
nul = len(tznames_raw)
tznames[tzname_offset] = _std_string(
tznames_raw[tzname_offset:nul])
ttinfo.append((ttinfo_raw[i],
bool(ttinfo_raw[i + 1]),
tznames[tzname_offset]))
i += 3
# Now build the timezone object
if len(ttinfo) == 1 or len(transitions) == 0:
ttinfo[0][0], ttinfo[0][2]
cls = type(zone, (StaticTzInfo,), dict(
zone=zone,
_utcoffset=memorized_timedelta(ttinfo[0][0]),
_tzname=ttinfo[0][2]))
else:
# Early dates use the first standard time ttinfo
i = 0
while ttinfo[i][1]:
i += 1
if ttinfo[i] == ttinfo[lindexes[0]]:
transitions[0] = datetime.min
else:
transitions.insert(0, datetime.min)
lindexes.insert(0, i)
# calculate transition info
transition_info = []
for i in range(len(transitions)):
inf = ttinfo[lindexes[i]]
utcoffset = inf[0]
if not inf[1]:
dst = 0
else:
for j in range(i - 1, -1, -1):
prev_inf = ttinfo[lindexes[j]]
if not prev_inf[1]:
break
dst = inf[0] - prev_inf[0] # dst offset
# Bad dst? Look further. DST > 24 hours happens when
# a timzone has moved across the international dateline.
if dst <= 0 or dst > 3600 * 3:
for j in range(i + 1, len(transitions)):
stdinf = ttinfo[lindexes[j]]
if not stdinf[1]:
dst = inf[0] - stdinf[0]
if dst > 0:
break # Found a useful std time.
tzname = inf[2]
# Round utcoffset and dst to the nearest minute or the
# datetime library will complain. Conversions to these timezones
# might be up to plus or minus 30 seconds out, but it is
# the best we can do.
utcoffset = int((utcoffset + 30) // 60) * 60
dst = int((dst + 30) // 60) * 60
transition_info.append(memorized_ttinfo(utcoffset, dst, tzname))
cls = type(zone, (DstTzInfo,), dict(
zone=zone,
_utc_transition_times=transitions,
_transition_info=transition_info))
return cls()
if __name__ == '__main__':
import os.path
from pprint import pprint
base = os.path.join(os.path.dirname(__file__), 'zoneinfo')
tz = build_tzinfo('Australia/Melbourne',
open(os.path.join(base, 'Australia', 'Melbourne'), 'rb'))
tz = build_tzinfo('US/Eastern',
open(os.path.join(base, 'US', 'Eastern'), 'rb'))
pprint(tz._utc_transition_times)
PK `ZZZ�)LތK �K pytz/tzinfo.py'''Base classes and helpers for building zone specific tzinfo classes'''
from datetime import datetime, timedelta, tzinfo
from bisect import bisect_right
try:
set
except NameError:
from sets import Set as set
import pytz
from pytz.exceptions import AmbiguousTimeError, NonExistentTimeError
__all__ = []
_timedelta_cache = {}
def memorized_timedelta(seconds):
'''Create only one instance of each distinct timedelta'''
try:
return _timedelta_cache[seconds]
except KeyError:
delta = timedelta(seconds=seconds)
_timedelta_cache[seconds] = delta
return delta
_epoch = datetime(1970, 1, 1, 0, 0) # datetime.utcfromtimestamp(0)
_datetime_cache = {0: _epoch}
def memorized_datetime(seconds):
'''Create only one instance of each distinct datetime'''
try:
return _datetime_cache[seconds]
except KeyError:
# NB. We can't just do datetime.fromtimestamp(seconds, tz=timezone.utc).replace(tzinfo=None)
# as this fails with negative values under Windows (Bug #90096)
dt = _epoch + timedelta(seconds=seconds)
_datetime_cache[seconds] = dt
return dt
_ttinfo_cache = {}
def memorized_ttinfo(*args):
'''Create only one instance of each distinct tuple'''
try:
return _ttinfo_cache[args]
except KeyError:
ttinfo = (
memorized_timedelta(args[0]),
memorized_timedelta(args[1]),
args[2]
)
_ttinfo_cache[args] = ttinfo
return ttinfo
_notime = memorized_timedelta(0)
def _to_seconds(td):
'''Convert a timedelta to seconds'''
return td.seconds + td.days * 24 * 60 * 60
class BaseTzInfo(tzinfo):
# Overridden in subclass
_utcoffset = None
_tzname = None
zone = None
def __str__(self):
return self.zone
class StaticTzInfo(BaseTzInfo):
'''A timezone that has a constant offset from UTC
These timezones are rare, as most locations have changed their
offset at some point in their history
'''
def fromutc(self, dt):
'''See datetime.tzinfo.fromutc'''
if dt.tzinfo is not None and dt.tzinfo is not self:
raise ValueError('fromutc: dt.tzinfo is not self')
return (dt + self._utcoffset).replace(tzinfo=self)
def utcoffset(self, dt, is_dst=None):
'''See datetime.tzinfo.utcoffset
is_dst is ignored for StaticTzInfo, and exists only to
retain compatibility with DstTzInfo.
'''
return self._utcoffset
def dst(self, dt, is_dst=None):
'''See datetime.tzinfo.dst
is_dst is ignored for StaticTzInfo, and exists only to
retain compatibility with DstTzInfo.
'''
return _notime
def tzname(self, dt, is_dst=None):
'''See datetime.tzinfo.tzname
is_dst is ignored for StaticTzInfo, and exists only to
retain compatibility with DstTzInfo.
'''
return self._tzname
def localize(self, dt, is_dst=False):
'''Convert naive time to local time'''
if dt.tzinfo is not None:
raise ValueError('Not naive datetime (tzinfo is already set)')
return dt.replace(tzinfo=self)
def normalize(self, dt, is_dst=False):
'''Correct the timezone information on the given datetime.
This is normally a no-op, as StaticTzInfo timezones never have
ambiguous cases to correct:
>>> from pytz import timezone
>>> gmt = timezone('GMT')
>>> isinstance(gmt, StaticTzInfo)
True
>>> dt = datetime(2011, 5, 8, 1, 2, 3, tzinfo=gmt)
>>> gmt.normalize(dt) is dt
True
The supported method of converting between timezones is to use
datetime.astimezone(). Currently normalize() also works:
>>> la = timezone('America/Los_Angeles')
>>> dt = la.localize(datetime(2011, 5, 7, 1, 2, 3))
>>> fmt = '%Y-%m-%d %H:%M:%S %Z (%z)'
>>> gmt.normalize(dt).strftime(fmt)
'2011-05-07 08:02:03 GMT (+0000)'
'''
if dt.tzinfo is self:
return dt
if dt.tzinfo is None:
raise ValueError('Naive time - no tzinfo set')
return dt.astimezone(self)
def __repr__(self):
return '<StaticTzInfo %r>' % (self.zone,)
def __reduce__(self):
# Special pickle to zone remains a singleton and to cope with
# database changes.
return pytz._p, (self.zone,)
class DstTzInfo(BaseTzInfo):
'''A timezone that has a variable offset from UTC
The offset might change if daylight saving time comes into effect,
or at a point in history when the region decides to change their
timezone definition.
'''
# Overridden in subclass
# Sorted list of DST transition times, UTC
_utc_transition_times = None
# [(utcoffset, dstoffset, tzname)] corresponding to
# _utc_transition_times entries
_transition_info = None
zone = None
# Set in __init__
_tzinfos = None
_dst = None # DST offset
def __init__(self, _inf=None, _tzinfos=None):
if _inf:
self._tzinfos = _tzinfos
self._utcoffset, self._dst, self._tzname = _inf
else:
_tzinfos = {}
self._tzinfos = _tzinfos
self._utcoffset, self._dst, self._tzname = (
self._transition_info[0])
_tzinfos[self._transition_info[0]] = self
for inf in self._transition_info[1:]:
if inf not in _tzinfos:
_tzinfos[inf] = self.__class__(inf, _tzinfos)
def fromutc(self, dt):
'''See datetime.tzinfo.fromutc'''
if (dt.tzinfo is not None and
getattr(dt.tzinfo, '_tzinfos', None) is not self._tzinfos):
raise ValueError('fromutc: dt.tzinfo is not self')
dt = dt.replace(tzinfo=None)
idx = max(0, bisect_right(self._utc_transition_times, dt) - 1)
inf = self._transition_info[idx]
return (dt + inf[0]).replace(tzinfo=self._tzinfos[inf])
def normalize(self, dt):
'''Correct the timezone information on the given datetime
If date arithmetic crosses DST boundaries, the tzinfo
is not magically adjusted. This method normalizes the
tzinfo to the correct one.
To test, first we need to do some setup
>>> from pytz import timezone
>>> utc = timezone('UTC')
>>> eastern = timezone('US/Eastern')
>>> fmt = '%Y-%m-%d %H:%M:%S %Z (%z)'
We next create a datetime right on an end-of-DST transition point,
the instant when the wallclocks are wound back one hour.
>>> utc_dt = datetime(2002, 10, 27, 6, 0, 0, tzinfo=utc)
>>> loc_dt = utc_dt.astimezone(eastern)
>>> loc_dt.strftime(fmt)
'2002-10-27 01:00:00 EST (-0500)'
Now, if we subtract a few minutes from it, note that the timezone
information has not changed.
>>> before = loc_dt - timedelta(minutes=10)
>>> before.strftime(fmt)
'2002-10-27 00:50:00 EST (-0500)'
But we can fix that by calling the normalize method
>>> before = eastern.normalize(before)
>>> before.strftime(fmt)
'2002-10-27 01:50:00 EDT (-0400)'
The supported method of converting between timezones is to use
datetime.astimezone(). Currently, normalize() also works:
>>> th = timezone('Asia/Bangkok')
>>> am = timezone('Europe/Amsterdam')
>>> dt = th.localize(datetime(2011, 5, 7, 1, 2, 3))
>>> fmt = '%Y-%m-%d %H:%M:%S %Z (%z)'
>>> am.normalize(dt).strftime(fmt)
'2011-05-06 20:02:03 CEST (+0200)'
'''
if dt.tzinfo is None:
raise ValueError('Naive time - no tzinfo set')
# Convert dt in localtime to UTC
offset = dt.tzinfo._utcoffset
dt = dt.replace(tzinfo=None)
dt = dt - offset
# convert it back, and return it
return self.fromutc(dt)
def localize(self, dt, is_dst=False):
'''Convert naive time to local time.
This method should be used to construct localtimes, rather
than passing a tzinfo argument to a datetime constructor.
is_dst is used to determine the correct timezone in the ambigous
period at the end of daylight saving time.
>>> from pytz import timezone
>>> fmt = '%Y-%m-%d %H:%M:%S %Z (%z)'
>>> amdam = timezone('Europe/Amsterdam')
>>> dt = datetime(2004, 10, 31, 2, 0, 0)
>>> loc_dt1 = amdam.localize(dt, is_dst=True)
>>> loc_dt2 = amdam.localize(dt, is_dst=False)
>>> loc_dt1.strftime(fmt)
'2004-10-31 02:00:00 CEST (+0200)'
>>> loc_dt2.strftime(fmt)
'2004-10-31 02:00:00 CET (+0100)'
>>> str(loc_dt2 - loc_dt1)
'1:00:00'
Use is_dst=None to raise an AmbiguousTimeError for ambiguous
times at the end of daylight saving time
>>> try:
... loc_dt1 = amdam.localize(dt, is_dst=None)
... except AmbiguousTimeError:
... print('Ambiguous')
Ambiguous
is_dst defaults to False
>>> amdam.localize(dt) == amdam.localize(dt, False)
True
is_dst is also used to determine the correct timezone in the
wallclock times jumped over at the start of daylight saving time.
>>> pacific = timezone('US/Pacific')
>>> dt = datetime(2008, 3, 9, 2, 0, 0)
>>> ploc_dt1 = pacific.localize(dt, is_dst=True)
>>> ploc_dt2 = pacific.localize(dt, is_dst=False)
>>> ploc_dt1.strftime(fmt)
'2008-03-09 02:00:00 PDT (-0700)'
>>> ploc_dt2.strftime(fmt)
'2008-03-09 02:00:00 PST (-0800)'
>>> str(ploc_dt2 - ploc_dt1)
'1:00:00'
Use is_dst=None to raise a NonExistentTimeError for these skipped
times.
>>> try:
... loc_dt1 = pacific.localize(dt, is_dst=None)
... except NonExistentTimeError:
... print('Non-existent')
Non-existent
'''
if dt.tzinfo is not None:
raise ValueError('Not naive datetime (tzinfo is already set)')
# Find the two best possibilities.
possible_loc_dt = set()
for delta in [timedelta(days=-1), timedelta(days=1)]:
loc_dt = dt + delta
idx = max(0, bisect_right(
self._utc_transition_times, loc_dt) - 1)
inf = self._transition_info[idx]
tzinfo = self._tzinfos[inf]
loc_dt = tzinfo.normalize(dt.replace(tzinfo=tzinfo))
if loc_dt.replace(tzinfo=None) == dt:
possible_loc_dt.add(loc_dt)
if len(possible_loc_dt) == 1:
return possible_loc_dt.pop()
# If there are no possibly correct timezones, we are attempting
# to convert a time that never happened - the time period jumped
# during the start-of-DST transition period.
if len(possible_loc_dt) == 0:
# If we refuse to guess, raise an exception.
if is_dst is None:
raise NonExistentTimeError(dt)
# If we are forcing the pre-DST side of the DST transition, we
# obtain the correct timezone by winding the clock forward a few
# hours.
elif is_dst:
return self.localize(
dt + timedelta(hours=6), is_dst=True) - timedelta(hours=6)
# If we are forcing the post-DST side of the DST transition, we
# obtain the correct timezone by winding the clock back.
else:
return self.localize(
dt - timedelta(hours=6),
is_dst=False) + timedelta(hours=6)
# If we get this far, we have multiple possible timezones - this
# is an ambiguous case occurring during the end-of-DST transition.
# If told to be strict, raise an exception since we have an
# ambiguous case
if is_dst is None:
raise AmbiguousTimeError(dt)
# Filter out the possiblilities that don't match the requested
# is_dst
filtered_possible_loc_dt = [
p for p in possible_loc_dt if bool(p.tzinfo._dst) == is_dst
]
# Hopefully we only have one possibility left. Return it.
if len(filtered_possible_loc_dt) == 1:
return filtered_possible_loc_dt[0]
if len(filtered_possible_loc_dt) == 0:
filtered_possible_loc_dt = list(possible_loc_dt)
# If we get this far, we have in a wierd timezone transition
# where the clocks have been wound back but is_dst is the same
# in both (eg. Europe/Warsaw 1915 when they switched to CET).
# At this point, we just have to guess unless we allow more
# hints to be passed in (such as the UTC offset or abbreviation),
# but that is just getting silly.
#
# Choose the earliest (by UTC) applicable timezone if is_dst=True
# Choose the latest (by UTC) applicable timezone if is_dst=False
# i.e., behave like end-of-DST transition
dates = {} # utc -> local
for local_dt in filtered_possible_loc_dt:
utc_time = (
local_dt.replace(tzinfo=None) - local_dt.tzinfo._utcoffset)
assert utc_time not in dates
dates[utc_time] = local_dt
return dates[[min, max][not is_dst](dates)]
def utcoffset(self, dt, is_dst=None):
'''See datetime.tzinfo.utcoffset
The is_dst parameter may be used to remove ambiguity during DST
transitions.
>>> from pytz import timezone
>>> tz = timezone('America/St_Johns')
>>> ambiguous = datetime(2009, 10, 31, 23, 30)
>>> str(tz.utcoffset(ambiguous, is_dst=False))
'-1 day, 20:30:00'
>>> str(tz.utcoffset(ambiguous, is_dst=True))
'-1 day, 21:30:00'
>>> try:
... tz.utcoffset(ambiguous)
... except AmbiguousTimeError:
... print('Ambiguous')
Ambiguous
'''
if dt is None:
return None
elif dt.tzinfo is not self:
dt = self.localize(dt, is_dst)
return dt.tzinfo._utcoffset
else:
return self._utcoffset
def dst(self, dt, is_dst=None):
'''See datetime.tzinfo.dst
The is_dst parameter may be used to remove ambiguity during DST
transitions.
>>> from pytz import timezone
>>> tz = timezone('America/St_Johns')
>>> normal = datetime(2009, 9, 1)
>>> str(tz.dst(normal))
'1:00:00'
>>> str(tz.dst(normal, is_dst=False))
'1:00:00'
>>> str(tz.dst(normal, is_dst=True))
'1:00:00'
>>> ambiguous = datetime(2009, 10, 31, 23, 30)
>>> str(tz.dst(ambiguous, is_dst=False))
'0:00:00'
>>> str(tz.dst(ambiguous, is_dst=True))
'1:00:00'
>>> try:
... tz.dst(ambiguous)
... except AmbiguousTimeError:
... print('Ambiguous')
Ambiguous
'''
if dt is None:
return None
elif dt.tzinfo is not self:
dt = self.localize(dt, is_dst)
return dt.tzinfo._dst
else:
return self._dst
def tzname(self, dt, is_dst=None):
'''See datetime.tzinfo.tzname
The is_dst parameter may be used to remove ambiguity during DST
transitions.
>>> from pytz import timezone
>>> tz = timezone('America/St_Johns')
>>> normal = datetime(2009, 9, 1)
>>> tz.tzname(normal)
'NDT'
>>> tz.tzname(normal, is_dst=False)
'NDT'
>>> tz.tzname(normal, is_dst=True)
'NDT'
>>> ambiguous = datetime(2009, 10, 31, 23, 30)
>>> tz.tzname(ambiguous, is_dst=False)
'NST'
>>> tz.tzname(ambiguous, is_dst=True)
'NDT'
>>> try:
... tz.tzname(ambiguous)
... except AmbiguousTimeError:
... print('Ambiguous')
Ambiguous
'''
if dt is None:
return self.zone
elif dt.tzinfo is not self:
dt = self.localize(dt, is_dst)
return dt.tzinfo._tzname
else:
return self._tzname
def __repr__(self):
if self._dst:
dst = 'DST'
else:
dst = 'STD'
if self._utcoffset > _notime:
return '<DstTzInfo %r %s+%s %s>' % (
self.zone, self._tzname, self._utcoffset, dst
)
else:
return '<DstTzInfo %r %s%s %s>' % (
self.zone, self._tzname, self._utcoffset, dst
)
def __reduce__(self):
# Special pickle to zone remains a singleton and to cope with
# database changes.
return pytz._p, (
self.zone,
_to_seconds(self._utcoffset),
_to_seconds(self._dst),
self._tzname
)
def unpickler(zone, utcoffset=None, dstoffset=None, tzname=None):
"""Factory function for unpickling pytz tzinfo instances.
This is shared for both StaticTzInfo and DstTzInfo instances, because
database changes could cause a zones implementation to switch between
these two base classes and we can't break pickles on a pytz version
upgrade.
"""
# Raises a KeyError if zone no longer exists, which should never happen
# and would be a bug.
tz = pytz.timezone(zone)
# A StaticTzInfo - just return it
if utcoffset is None:
return tz
# This pickle was created from a DstTzInfo. We need to
# determine which of the list of tzinfo instances for this zone
# to use in order to restore the state of any datetime instances using
# it correctly.
utcoffset = memorized_timedelta(utcoffset)
dstoffset = memorized_timedelta(dstoffset)
try:
return tz._tzinfos[(utcoffset, dstoffset, tzname)]
except KeyError:
# The particular state requested in this timezone no longer exists.
# This indicates a corrupt pickle, or the timezone database has been
# corrected violently enough to make this particular
# (utcoffset,dstoffset) no longer exist in the zone, or the
# abbreviation has been changed.
pass
# See if we can find an entry differing only by tzname. Abbreviations
# get changed from the initial guess by the database maintainers to
# match reality when this information is discovered.
for localized_tz in tz._tzinfos.values():
if (localized_tz._utcoffset == utcoffset and
localized_tz._dst == dstoffset):
return localized_tz
# This (utcoffset, dstoffset) information has been removed from the
# zone. Add it back. This might occur when the database maintainers have
# corrected incorrect information. datetime instances using this
# incorrect information will continue to do so, exactly as they were
# before being pickled. This is purely an overly paranoid safety net - I
# doubt this will ever been needed in real life.
inf = (utcoffset, dstoffset, tzname)
tz._tzinfos[inf] = tz.__class__(inf, tz._tzinfos)
return tz._tzinfos[inf]
PK `ZZZ3���. . pytz/zoneinfo/CETTZif2 � �`����ٮ�������������� q���Kͩ�Cϒ4Ђ%�r�N@�
�c���E�t6�d'�T�MD3��#�ܐ͐�㯐Ӡ�Ñ���������|� lr!\c"LT#<E$,6%'&'C�'�4�(�%�)��*��+���,��-�ڐ.�ː/t��0d��1]�2r�3=�4R�5�62x6�8��8�a9�v�:�C;�X�<�_�=�:�>�A�?��@f#�A�9BF�CdD%�EC�FɐG#�G��I�I��J�K��L̿�M��N���OnnP���QW��Rle�S7l�TLG�UN�V,)�V�0�XFX��Y�(Z���[�
\�]��^�_��`_�a}�b?�c]̐d�e=��f��g��g藐h�r�i�y�j�T�k�[�l�qm�=�n�Soh�p�5qQ<rfs1tE�u v/�v��x��x��y�ِz��{λ�|�}���~y���� CEST CET TZif2 � �����`�������������ٮ������������������������������ q�������K����ͩ�����C����ϒ4����Ђ%�����r�����N@�
�c� � �E� t6� d'� T� MD 3�� #� ܐ ͐ � 㯐 Ӡ� Ñ� �� �� �� �� |� lr !\c "LT #<E $,6 %' & 'C� '�4� (�%� )�� *�� +��� ,�� -�ڐ .�ː /t�� 0d�� 1]� 2r� 3=� 4R� 5� 62x 6� 8�� 8�a 9�v� :�C ;�X� <�_� =�:� >�A� ?�� @f#� A�9 BF� Cd D%� EC� Fɐ G#� G�� I� I�� J� K�� L̿� M�� N��� Onn P��� QW�� Rle� S7l� TLG� UN� V,)� V�0� XF X�� Y�( Z��� [�
\� ]�� ^� _�� `_� a}� b?� c]̐ d� e=�� f�� g�� g藐 h�r� i�y� j�T� k�[� l�q m�=� n�S oh� p�5 qQ< rf s1 tE� u v/� v�� x�� x�� y�ِ z�� {λ� |� }��� ~y�� �� CEST CET
CET-1CEST,M3.5.0,M10.5.0/3
PK `ZZZdO0� pytz/zoneinfo/CST6CDTTZif2 � ��,����p������pˈ���#�p�a ���g ��I���I ��+���+ ��
� �
���w� qpa�P�p@�0�p�'� �p ��
�p���ٰ�
�u������ �t��t yV�iV Y8�I8 9�) "7p� p����p�����p�܀��p v !��p"U� #j��$5� %J��&� '*��'�р)
c�)�*�E�+���,�bp-�w�.�Dp/~Y�0�&p1gv 2sp3GX 4R�p5': 62�p7 8��8�� 9���:�� ;۬�<���=���>�ހ?�p�@o��A��pBO��CdopD/��EDQpE� G-m�Gә I
O�I�{ J�1�K���L�NpM|y�N�0pO\[�P�pQ<=�Ru�pS�TU�pT��V5�pV� X��X� Y���Z�� [ޘ�\�� ]�z�^d� _�\�`Ma�ypb-��cg[pd
��eG=pe�h�g'pg�J�ipi�,�j��pk�I l���mv+ n���oV
p���q5� ro��s� tO��t��v8�pv�πx�px���y�hpz���{�Jp|~u�}�,p~^W��p ���� ���� ������������ CDT CST CWT CPT TZif2 � ������,��������p��������������p����ˈ�������#�p�����a �������g ������I�������I ������+�������+ ������
� �
��� w� qp a� P�p @� 0�p �'� �p ��
�p ��� ٰ�
�u� ��� �� �t� �t yV� iV Y8� I8 9� ) "7p � p �� ��p ��� ��p �܀ ��p v !��p "U� #j�� $5� %J�� &� '*�� '�р )
c� )� *�E� +��� ,�bp -�w� .�Dp /~Y� 0�&p 1gv 2sp 3GX 4R�p 5': 62�p 7 8�� 8�� 9��� :�� ;۬� <��� =��� >�ހ ?�p� @o�� A��p BO�� Cdop D/�� EDQp E� G-m� Gә I
O� I�{ J�1� K��� L�Np M|y� N�0p O\[� P�p Q<=� Ru�p S� TU�p T�� V5�p V� X�� X� Y��� Z�� [ޘ� \�� ]�z� ^d� _�\� `M a�yp b-�� cg[p d
�� eG=p e�h� g'p g�J� ip i�,� j��p k�I l��� mv+ n��� oV
p��� q5� ro�� s� tO�� t�� v8�p v�π x�p x��� y�hp z��� {�Jp |~u� }�,p ~^W� �p ���� ���� ������������ CDT CST CWT CPT
CST6CDT,M3.2.0,M11.1.0
PK `ZZZAkx�p p pytz/zoneinfo/CubaTZif2 � � �b�ӔP�t]@�[f���Q@�;H�ʼm��$eP̜O���P�;��ӣ�P����`���}@�=D���S���;����@�ũ���h@�� ����� ������w��p�@`�P5�@�PH@ �P�{�
�P
�j@�iPن�
�KP�h���P}�@Q��f��1��F��[��&{�;d�]�F��?��(��\@�
��>@zSP� @ Z5P!o@"CQ�#N�@$#3�%.�@&��'��'��P(���)މP*״�+�kP,���-�MP.�x�/~/P0wZ�1gK�2W<�3G-�4@YP5�P62�P6��P8��8���9���:Ƶ�;ې�<��P=�r�>��P?�T�@f[�ED5PE��G$PGܩPI�PI�P�J��PK�mPL���M���N�N�Ow��P��PQ<PRu�PS�PTU�PT��PV5�PV���X��X���Y���Z���[�|�\���]�^�^d{�_�@�`M�Pa�]Pb-zPcg?Pd
\PeG!Pe�>Pg'Pg� Pi�Pi�Pj��Pk��l���mv �n���oU��p���q5��ro��s��tOk�t��Pv8�PvޥPxjPx��Py�LPz�iP{�.P|~KP}�P~^-P��P���� ���� �������� ���� ����LMT HMT CDT CST TZif2 � ����i�(������b�����ӔP�����t]@�����[f�������Q@�����;H�����ʼm������$eP����̜O�������P�����;������ӣ�P������������`�������}@�����=D�������S�������;��������@�����ũ�������h@������ ��������� ��� ��� w�� p�@ `�P 5� @�P H@ �P �{�
�P
�j@ �iP ن�
�KP �h� ��P }�@ Q�� f�� 1�� F�� [�� &{� ;d� ]� F� �?� �(� �\@ �
� �>@ zSP � @ Z5P !o@ "CQ� #N�@ $#3� %.�@ &�� '�� '��P (��� )މP *״� +�kP ,��� -�MP .�x� /~/P 0wZ� 1gK� 2W<� 3G-� 4@YP 5�P 62�P 6��P 8�� 8��� 9��� :Ƶ� ;ې� <��P =�r� >��P ?�T� @f[� ED5P E�� G$P GܩP I�P I�P� J��P K�mP L��� M��� N�N� Ow�� P��P Q<P Ru�P S�P TU�P T��P V5�P V��� X�� X��� Y��� Z��� [�|� \��� ]�^� ^d{� _�@� `M�P a�]P b-zP cg?P d
\P eG!P e�>P g'P g� P i�P i�P j��P k�� l��� mv � n��� oU�� p��� q5�� ro�� s�� tOk� t��P v8�P vޥP xjP x��P y�LP z�iP {�.P |~KP }�P ~^-P ��P���� ���� �������� ���� ����LMT HMT CDT CST
CST5CDT,M3.2.0/0,M11.1.0/1
PK `ZZZ[
t t pytz/zoneinfo/EETTZif2 z
�c���E�t6�d'�T�MD3��#�ܐ͐�㯐Ӡ�Ñ���������|� lr!\c"LT#<E$,6%'&'C�'�4�(�%�)��*��+���,��-�ڐ.�ː/t��0d��1]�2r�3=�4R�5�62x6�8��8�a9�v�:�C;�X�<�_�=�:�>�A�?��@f#�A�9BF�CdD%�EC�FɐG#�G��I�I��J�K��L̿�M��N���OnnP���QW��Rle�S7l�TLG�UN�V,)�V�0�XFX��Y�(Z���[�
\�]��^�_��`_�a}�b?�c]̐d�e=��f��g��g藐h�r�i�y�j�T�k�[�l�qm�=�n�Soh�p�5qQ<rfs1tE�u v/�v��x��x��y�ِz��{λ�|�}���~y���� *0 *0 EEST EET TZif2 z
�c� � �E� t6� d'� T� MD 3�� #� ܐ ͐ � 㯐 Ӡ� Ñ� �� �� �� �� |� lr !\c "LT #<E $,6 %' & 'C� '�4� (�%� )�� *�� +��� ,�� -�ڐ .�ː /t�� 0d�� 1]� 2r� 3=� 4R� 5� 62x 6� 8�� 8�a 9�v� :�C ;�X� <�_� =�:� >�A� ?�� @f#� A�9 BF� Cd D%� EC� Fɐ G#� G�� I� I�� J� K�� L̿� M�� N��� Onn P��� QW�� Rle� S7l� TLG� UN� V,)� V�0� XF X�� Y�( Z��� [�
\� ]�� ^� _�� `_� a}� b?� c]̐ d� e=�� f�� g�� g藐 h�r� i�y� j�T� k�[� l�q m�=� n�S oh� p�5 qQ< rf s1 tE� u v/� v�� x�� x�� y�ِ z�� {λ� |� }��� ~y�� �� *0 *0 EEST EET
EET-2EEST,M3.5.0/3,M10.5.0/4
PK `ZZZH��r r pytz/zoneinfo/ESTTZif2 ���� EST TZif2 ���� EST
EST5
PK `ZZZ$'� pytz/zoneinfo/EST5EDTTZif2 � ��p���`�� p���`ˈ�p�#�p�`����X���;���:����������� ������w��p�``�pP�`@�p0�`�p �` ���
��`��p٢�
�gp�������f��e�yH�iG�Y*�I)�9�)�")`��`�
p��`��p��`��p��` v �!��`"U��#j��$5��%J��&��'*s�'��p)
U�)ޥp*�7�+��p,�T`-�ip.�6`/~Kp0�`1gg�2r�`3GI�4R�`5'+�62�`7
�8��8���9���:���;۞�<��p=���>��p?�b�@o�pA�`BO�pCda`D/vpEDC`E��G-_�Gӊ�I
A�I�l�J�#�K��pL�@`M|kpN�"`O\MpP�`Q</pRu�`SpTU�`T��pV5�`V��X��X���Y���Z���[ފ�\���]�l�^d��_�N�`M�pa�k`b-�pcgM`d
xpeG/`e�Zpg'`g�<pi�`i�pj��`k�:�l���mv�n���oU��p���q5��ro��s��tOy�t��pv8�`v��pxx`x��py�Z`z��p{�<`|~gp}�`~^Ip� ` ���� ���� ������������ EDT EST EWT EPT TZif2 � ������p�������`������ p�������`����ˈ�p�����#�p�����`��������X�������;�������:����������������������� ��� ��� w�� p�` `�p P�` @�p 0�` �p �` ���
��` ��p ٢�
�gp ��� ��� �f� �e� yH� iG� Y*� I)� 9� )� ")` �� ` �
p ��` ��p ��` ��p ��` v � !��` "U�� #j�� $5�� %J�� &�� '*s� '��p )
U� )ޥp *�7� +��p ,�T` -�ip .�6` /~Kp 0�` 1gg� 2r�` 3GI� 4R�` 5'+� 62�` 7
� 8�� 8��� 9��� :��� ;۞� <��p =��� >��p ?�b� @o�p A�` BO�p Cda` D/vp EDC` E�� G-_� Gӊ� I
A� I�l� J�#� K��p L�@` M|kp N�"` O\Mp P�` Q</p Ru�` Sp TU�` T��p V5�` V�� X�� X��� Y��� Z��� [ފ� \��� ]�l� ^d�� _�N� `M�p a�k` b-�p cgM` d
xp eG/` e�Zp g'` g�<p i�` i�p j��` k�:� l��� mv� n��� oU�� p��� q5�� ro�� s�� tOy� t��p v8�` v��p xx` x��p y�Z` z��p {�<` |~gp }�` ~^Ip � ` ���� ���� ������������ EDT EST EWT EPT
EST5EDT,M3.2.0,M11.1.0
PK `ZZZ�cD_ _ pytz/zoneinfo/EgyptTZif2 �
� ȓ����{����������ˮ`��)�ͬ������Ϗf�Щy�ф`�Ҋ�P�6c`��-P��`��`������m ����� ﰳp�y%�����ZY �sp�;���U�p���6����E �p��� ��9������۾��������p��� �%�g�YpI a�p+� C�Հ$Ep�
x�
�<�������
�1p�� �d�t(���pU\ np7� OP������H p���{��<�� ��pp�4 ����g� ��p!a� "z\p#D $b'p%%S�&<�p'� (��(纀* {�*�?�+�p,�s -���.���/��0k�1��2J��3_��4*��5?��6
��7(�`7��P9�`9ӱP:�`;��P<�|`=�uP>�^`?sWP@�z�A\s�Bq\�C<U�DQ>�E�PF1 �F�jPH�H��I���J��PK�`La��L�X�L��PSu8�S���Sڼ`T$�PdJ�`e:�Pf*�`g#��h
�`i��i�`j��kӲ�lÕ�m���n�w�o�v�p�Y�qsX�rlvPsS:�tLXPu<W`v,:Pw9`xPx�`y��Pz��`{��P|��`}���~��`��� U *0 *0LMT EEST EET TZif2 �
����}�M�����ȓ��������{����������������������ˮ`������)�����ͬ��������������Ϗf�����Щy�����ф`�����Ҋ�P�����6c`������-P������`������`��������������m ������������� ����ﰳp�����y%�������������ZY �����sp�����;�������U�p�����������6��������E �����p������� ������9��������������۾����������������p������� �%� g� Yp I a�p +� C� Հ $Ep �
x�
�<� ��� ���
�1p �� �d� t(� ��p U\ np 7� OP� � ��� �H p�� �{� �<� � � �pp �4 ��� �g� ��p !a� "z\p #D $b'p %%S� &<�p '� (�� (纀 * {� *�?� +�p ,�s -��� .��� /�� 0k� 1�� 2J�� 3_�� 4*�� 5?�� 6
�� 7(�` 7��P 9�` 9ӱP :�` ;��P <�|` =�uP >�^` ?sWP @�z� A\s� Bq\� C<U� DQ>� E�P F1 � F�jP H� H�� I��� J��P K�` La�� L�X� L��P Su8� S��� Sڼ` T$�P dJ�` e:�P f*�` g#�� h
�` i�� i�` j�� kӲ� lÕ� m��� n�w� o�v� p�Y� qsX� rlvP sS:� tLXP u<W` v,:P w9` xP x�` y��P z��` {��P |��` }��� ~��` ��� U *0 *0LMT EEST EET
EET-2EEST,M4.5.5/0,M10.5.4/24
PK `ZZZ����
�
pytz/zoneinfo/EireTZif2 � � �&������0���à���������� �v���e� �{Ƞ�N���?� �%` �'� �*, ����� Ӡ�� ��� ��l ��� ��N ��y���0 ��Р�pL��r���P.��IZ �0��2v���X���Ԡ�� ��� ��W ��� ������� �� �x� �z� �Xy �Q���8[ �:� �X֠�� ��I� �!��N� �,( �.� ��� �p ��� ������ �����߮ ��̠�rH��kt �R*��T���2��=� �) �T��� ��q ��� ��S �� ���� �g��} �aI��_ �Jf �_A �!
��?# � �� ��Ѡ��� ��������{���ǻpp� )X P� : 0� � l ��
�N ���0
���� qޠ�.�Q��y�1��X�#�8Ɛ͐��㯐���Ñ���������k lr!�M"LT#a/$,6%JK�&'*-�'�4�)
�)��*��+���,�Ӑ-�ڐ.���/t��0���1]�2r�3=�4R�5�62x6�8��8�a9�v�:�C;�X�<�_�=�:�>�A�?��@f#�A�9BF�CdD%�EC�FɐG#�G��I�I��J�K��L̿�M��N���OnnP���QW��Rle�S7l�TLG�UN�V,)�V�0�XFX��Y�(Z���[�
\�]��^�_��`_�a}�b?�c]̐d�e=��f��g��g藐h�r�i�y�j�T�k�[�l�qm�=�n�Soh�p�5qQ<rfs1tE�u v/�v��x��x��y�ِz��{λ�|�}���~y������� ��� LMT DMT IST BST GMT TZif2 � ����W�
������&��������������0�������à���������������������� �����v�������e� �����{Ƞ�����N�������?� �����%` �����'� �����*, ������������� Ӡ������ ������� ������l ������� ������N ������y�������0 ������Р�����pL������r�������P.������IZ �����0������2v������������X�������Ԡ������ ������� ������W ������� ��������������� ������ �����x� �����z� �����Xy �����Q�������8[ �����:� �����X֠������ ������I� �����!������N� �����,( �����.� ������� �����p ������� �������������� �����������������߮ ������̠�����rH������kt �����R*������T�������2������=� �����) �����T������� ������q ������� ������S ������ ������������ �����g������} �����aI������_ �����Jf �����_A �����!
������?# ����� ������ ������Ѡ������� ��������������������{�������ǻp p� )X P� : 0� � l ��
�N �� �0
��� � qޠ �.� Q�� y� 1�� X� #� 8Ɛ ͐ �� 㯐 ��� Ñ� � �� �� �� �k lr !�M "LT #a/ $,6 %JK� & '*-� '�4� )
� )�� *�� +��� ,�Ӑ -�ڐ .��� /t�� 0��� 1]� 2r� 3=� 4R� 5� 62x 6� 8�� 8�a 9�v� :�C ;�X� <�_� =�:� >�A� ?�� @f#� A�9 BF� Cd D%� EC� Fɐ G#� G�� I� I�� J� K�� L̿� M�� N��� Onn P��� QW�� Rle� S7l� TLG� UN� V,)� V�0� XF X�� Y�( Z��� [�
\� ]�� ^� _�� `_� a}� b?� c]̐ d� e=�� f�� g�� g藐 h�r� i�y� j�T� k�[� l�q m�=� n�S oh� p�5 qQ< rf s1 tE� u v/� v�� x�� x�� y�ِ z�� {λ� |� }��� ~y�� ����� ��� LMT DMT IST BST GMT
IST-1GMT0,M10.5.0,M3.5.0/1
PK `ZZZ��t t pytz/zoneinfo/FactoryTZif2 -00 TZif2 -00
<-00>0
PK `ZZZ ��P P pytz/zoneinfo/GBTZif2 � � �&���� ��0���à���������� �v���e� �{Ƞ�N���?� �%` �'� �*, ����� Ӡ�� ��� ��l ��� ��N ��y���0 ��Р�pL��r���P.��IZ �0��2v���X���Ԡ�� ��� ��W ��� ������� �� �x� �z� �Xy �Q���8[ �:� �X֠�� ��&�ʗY�����w;�ͱ ��`Xϐ��n^��r��2�i� �c)��I� �!��B������N� ����.� ��� �p ��� ������ �����߮ ��̠�rH��kt �R*��T���2��=� �) �T��� ��q ��� ��S �� ���� �g��} �aI��_ �Jf �_A �!
��?# � �� ��Ѡ��� ��������{���ǻpp� )X P� : 0� � l ��
�N ���0
���� qޠ�.�Q��y�1��X�#�8Ɛ͐��㯐���Ñ���������k lr!�M"LT#a/$,6%JK�&'*-�'�4�)
�)��*��+���,�Ӑ-�ڐ.���/t��0���1]�2r�3=�4R�5�62x6�8��8�a9�v�:�C;�X�<�_�=�:�>�A�?��@f#�A�9BF�CdD%�EC�FɐG#�G��I�I��J�K��L̿�M��N���OnnP���QW��Rle�S7l�TLG�UN�V,)�V�0�XFX��Y�(Z���[�
\�]��^�_��`_�a}�b?�c]̐d�e=��f��g��g藐h�r�i�y�j�T�k�[�l�qm�=�n�Soh�p�5qQ<rfs1tE�u v/�v��x��x��y�ِz��{λ�|�}���~y�������� LMT BST GMT BDST TZif2 � ����] ������&�������� ������0�������à���������������������� �����v�������e� �����{Ƞ�����N�������?� �����%` �����'� �����*, ������������� Ӡ������ ������� ������l ������� ������N ������y�������0 ������Р�����pL������r�������P.������IZ �����0������2v������������X�������Ԡ������ ������� ������W ������� ��������������� ������ �����x� �����z� �����Xy �����Q�������8[ �����:� �����X֠������ ������&�����ʗY�������������w;�����ͱ ������`X����ϐ������n^������r������2�����i� �����c)������I� �����!������B��������������N� ������������.� ������� �����p ������� �������������� �����������������߮ ������̠�����rH������kt �����R*������T�������2������=� �����) �����T������� ������q ������� ������S ������ ������������ �����g������} �����aI������_ �����Jf �����_A �����!
������?# ����� ������ ������Ѡ������� ��������������������{�������ǻp p� )X P� : 0� � l ��
�N �� �0
��� � qޠ �.� Q�� y� 1�� X� #� 8Ɛ ͐ �� 㯐 ��� Ñ� � �� �� �� �k lr !�M "LT #a/ $,6 %JK� & '*-� '�4� )
� )�� *�� +��� ,�Ӑ -�ڐ .��� /t�� 0��� 1]� 2r� 3=� 4R� 5� 62x 6� 8�� 8�a 9�v� :�C ;�X� <�_� =�:� >�A� ?�� @f#� A�9 BF� Cd D%� EC� Fɐ G#� G�� I� I�� J� K�� L̿� M�� N��� Onn P��� QW�� Rle� S7l� TLG� UN� V,)� V�0� XF X�� Y�( Z��� [�
\� ]�� ^� _�� `_� a}� b?� c]̐ d� e=�� f�� g�� g藐 h�r� i�y� j�T� k�[� l�q m�=� n�S oh� p�5 qQ< rf s1 tE� u v/� v�� x�� x�� y�ِ z�� {λ� |� }��� ~y�� ������ LMT BST GMT BDST
GMT0BST,M3.5.0/1,M10.5.0
PK `ZZZ ��P P pytz/zoneinfo/GB-EireTZif2 � � �&���� ��0���à���������� �v���e� �{Ƞ�N���?� �%` �'� �*, ����� Ӡ�� ��� ��l ��� ��N ��y���0 ��Р�pL��r���P.��IZ �0��2v���X���Ԡ�� ��� ��W ��� ������� �� �x� �z� �Xy �Q���8[ �:� �X֠�� ��&�ʗY�����w;�ͱ ��`Xϐ��n^��r��2�i� �c)��I� �!��B������N� ����.� ��� �p ��� ������ �����߮ ��̠�rH��kt �R*��T���2��=� �) �T��� ��q ��� ��S �� ���� �g��} �aI��_ �Jf �_A �!
��?# � �� ��Ѡ��� ��������{���ǻpp� )X P� : 0� � l ��
�N ���0
���� qޠ�.�Q��y�1��X�#�8Ɛ͐��㯐���Ñ���������k lr!�M"LT#a/$,6%JK�&'*-�'�4�)
�)��*��+���,�Ӑ-�ڐ.���/t��0���1]�2r�3=�4R�5�62x6�8��8�a9�v�:�C;�X�<�_�=�:�>�A�?��@f#�A�9BF�CdD%�EC�FɐG#�G��I�I��J�K��L̿�M��N���OnnP���QW��Rle�S7l�TLG�UN�V,)�V�0�XFX��Y�(Z���[�
\�]��^�_��`_�a}�b?�c]̐d�e=��f��g��g藐h�r�i�y�j�T�k�[�l�qm�=�n�Soh�p�5qQ<rfs1tE�u v/�v��x��x��y�ِz��{λ�|�}���~y�������� LMT BST GMT BDST TZif2 � ����] ������&�������� ������0�������à���������������������� �����v�������e� �����{Ƞ�����N�������?� �����%` �����'� �����*, ������������� Ӡ������ ������� ������l ������� ������N ������y�������0 ������Р�����pL������r�������P.������IZ �����0������2v������������X�������Ԡ������ ������� ������W ������� ��������������� ������ �����x� �����z� �����Xy �����Q�������8[ �����:� �����X֠������ ������&�����ʗY�������������w;�����ͱ ������`X����ϐ������n^������r������2�����i� �����c)������I� �����!������B��������������N� ������������.� ������� �����p ������� �������������� �����������������߮ ������̠�����rH������kt �����R*������T�������2������=� �����) �����T������� ������q ������� ������S ������ ������������ �����g������} �����aI������_ �����Jf �����_A �����!
������?# ����� ������ ������Ѡ������� ��������������������{�������ǻp p� )X P� : 0� � l ��
�N �� �0
��� � qޠ �.� Q�� y� 1�� X� #� 8Ɛ ͐ �� 㯐 ��� Ñ� � �� �� �� �k lr !�M "LT #a/ $,6 %JK� & '*-� '�4� )
� )�� *�� +��� ,�Ӑ -�ڐ .��� /t�� 0��� 1]� 2r� 3=� 4R� 5� 62x 6� 8�� 8�a 9�v� :�C ;�X� <�_� =�:� >�A� ?�� @f#� A�9 BF� Cd D%� EC� Fɐ G#� G�� I� I�� J� K�� L̿� M�� N��� Onn P��� QW�� Rle� S7l� TLG� UN� V,)� V�0� XF X�� Y�( Z��� [�
\� ]�� ^� _�� `_� a}� b?� c]̐ d� e=�� f�� g�� g藐 h�r� i�y� j�T� k�[� l�q m�=� n�S oh� p�5 qQ< rf s1 tE� u v/� v�� x�� x�� y�ِ z�� {λ� |� }��� ~y�� ������ LMT BST GMT BDST
GMT0BST,M3.5.0/1,M10.5.0
PK `ZZZ�4^�r r pytz/zoneinfo/GMTTZif2 GMT TZif2 GMT
GMT0
PK `ZZZ�4^�r r pytz/zoneinfo/GMT+0TZif2 GMT TZif2 GMT
GMT0
PK `ZZZ�4^�r r pytz/zoneinfo/GMT-0TZif2 GMT TZif2 GMT
GMT0
PK `ZZZ�4^�r r pytz/zoneinfo/GMT0TZif2 GMT TZif2 GMT
GMT0
PK `ZZZ�4^�r r pytz/zoneinfo/GreenwichTZif2 GMT TZif2 GMT
GMT0
PK `ZZZ�Cs s pytz/zoneinfo/HSTTZif2 ��s` HST TZif2 ��s` HST
HST10
PK `ZZZY?�� � pytz/zoneinfo/HongkongTZif2 E �ic��M10�ۓ0�KqxҠސ�k׀ԓX��B�8�s:��>A��.2���9����������ܸ����ظޢ8߶�8���8��(�Oi8�v�(�/K8�_Ǩ�-8�?����I������+���m��
���O�����l(�wѸ�N(�W���0(�@�8�h(� �8�G�(�%~8�a(�`8��C(��B8��_���^���A���@���#� �"�~�n�]�M�G(78&�(�=8 �( ��8
�(֩8ƌ(�98ol� k
p� ~� w�
~� p� ~� p� LMT HKT HKST HKWT JST TZif2 E �����ic������M10�����ۓ0�����Kqx����Ҡސ�����k׀����ԓX������B�8�����s:������>A������.2�������9��������������������������ܸ��������ظ����ޢ8����߶�8�������8������(�����Oi8�����v�(�����/K8�����_Ǩ�����-8�����?��������I��������������+�������m������
�������O�������������l(�����wѸ�����N(�����W�������0(�����@�8�����h(����� �8�����G�(�����%~8�����a(�����`8������C(������B8������_�������^�������A�������@�������#� �"� ~� n� ]� M� G( 78 &�( �=8 �( ��8
�( ֩8 ƌ( �98 ol� k
p� ~� w�
~� p� ~� p� LMT HKT HKST HKWT JST
HKT-8
PK `ZZZm��� � pytz/zoneinfo/IcelandTZif2 ��H���8 LMT GMT TZif2 ������H���8 LMT GMT
GMT0
PK `ZZZ`EG�� � pytz/zoneinfo/IranTZif2 G �l}ȿ �H
�D8��ys@(���:@��HEJ�7��-�( v�(�)˜�*�"�+��H,�V8-��.���/o7H0a�81Pj�2B�32��4%u�5#H6�86�V�7�ܸ8֊H9�8:�H;��8<�B�=�ȸ>{vH?m�8@\��AO/�B?.�C1��G��HH�O8I�NHJ��8K���L��M��HNz;8Oh��P[n�QKm�R=�S,�HT'8U
��V Z�V�HW�8XэHY�8Z���[�F�\��H]�z8^u'�_g��`W��aJ2�b8�Hc+f8 08 08 ?H 18 FP 8@ ?H 18 LMT TMT +0430 +0330 +05 +04 TZif2 G �����l}������ �H
�D8 �� ys@ (�� �:@ ��H EJ� 7�� -� ( v� (� )˜� *�"� +��H ,�V8 -�� .��� /o7H 0a�8 1Pj� 2B� 32�� 4%u� 5#H 6�8 6�V� 7�ܸ 8֊H 9�8 :�H ;��8 <�B� =�ȸ >{vH ?m�8 @\�� AO/� B?.� C1�� G��H H�O8 I�NH J��8 K��� L�� M��H Nz;8 Oh�� P[n� QKm� R=� S,�H T'8 U
�� V Z� V�H W�8 XэH Y�8 Z��� [�F� \��H ]�z8 ^u'� _g�� `W�� aJ2� b8�H c+f8 08 08 ?H 18 FP 8@ ?H 18 LMT TMT +0430 +0330 +05 +04
<+0330>-3:30
PK `ZZZ���3T T pytz/zoneinfo/IsraelTZif3 � � �0E��Y� ��� �8�����ͬ� �� Ϗ� Щ� ф} Ҋ׀�e���l �Z0���X �/À�c �� ��� ۴4 ܹ= ��� ߤ����v �V} �f��6_ �H��A �t� �Ҁ�&����z |����� ��`
�3���`![`��`�n`���w|���``�P ��`!I��"^��# ]P$Z0`% ?P&��&���'���(�P)��`*��+�e�,��-�G�._�P/{)�0H��1H��2<nP31�`4��5�`5�P7�7�p8�_�9���:��p;�[`<��p=��`>��p?|��@s6pAP�`BL� CHOpD,q E��FS F�c�G�5 H��pI� J���K�� L� �M��N��pOt��P^B�QTـRlIpS4��TL+pU��V,
pV��X)�X�a�Y��Z�C�[���\�` ]���^}B _���`]$ a}�pb= c]�pd� e=�pf�gtpg��h�Vpi�Ȁj�8pk���l�T�m���n�6�oen�p��qN� re��s.m tE��uO v.�pv�1 x�px� y�pz�� {Οp|��}��p~v��cp ! � *0 8@ *0 *0 LMT JMT IDT IST IDDT TZif3 � ����V��������0E������Y� ������� �����8�������������ͬ� ������ ����Ϗ� ����Щ� ����ф} ����Ҋ׀�����e�������l �����Z0�������X �����/À�����c ������ ������� ����۴4 ����ܹ= ������� ��������ߤ��������v �����V} �����f������6_ �����H������A �����t� �����Ҁ�����&��������z |�� ��� ��`
�3� ��` ![` ��` �n` ��� w|� ��` `�P ��` !I�� "^�� # ]P $Z0` % ?P &�� &��� '��� (�P )��` *�� +�e� ,�� -�G� ._�P /{)� 0H�� 1H�� 2<nP 31�` 4�� 5�` 5�P 7� 7�p 8�_� 9��� :��p ;�[` <��p =��` >��p ?|�� @s6p AP�` BL� CHOp D,q E�� FS F�c� G�5 H��p I� J��� K�� L� � M�� N��p Ot�� P^B� QTـ RlIp S4�� TL+p U�� V,
p V�� X)� X�a� Y�� Z�C� [��� \�` ]��� ^}B _��� `]$ a}�p b= c]�p d� e=�p f� gtp g�� h�Vp i�Ȁ j�8p k��� l�T� m��� n�6� oen� p�� qN� re�� s.m tE�� uO v.�p v�1 x�p x� y�p z�� {Οp |�� }��p ~v� �cp ! � *0 8@ *0 *0 LMT JMT IDT IST IDDT
IST-2IDT,M3.4.4/26,M10.5.0
PK `ZZZ�,�G� � pytz/zoneinfo/JamaicaTZif2 � ����p �` ���
��`��p٢�
�gp�������f��e�yH�iG�Y*�I)�9�)�")`��`��� ��� ���� ����LMT KMT EST EDT TZif2 ����i�#~������� �p �` ���
��` ��p ٢�
�gp ��� ��� �f� �e� yH� iG� Y*� I)� 9� )� ")` �� `��� ��� ���� ����LMT KMT EST EDT
EST5
PK `ZZZH�
5 5 pytz/zoneinfo/JapanTZif2 � �>p��Y����p��;�� �ۭ������� � �� ~� ~� LMT JDT JST TZif2 ����e¤p�����>p������Y��������p������;������ �����ۭ��������������� � �� ~� ~� LMT JDT JST
JST-9
PK `ZZZ�y�. . pytz/zoneinfo/KwajaleinTZif2 � ��5���
`�F����P,v@ �� �� �� ~� ��W@ �� LMT +11 +10 +09 -12 +12 TZif2 ����~6 ������5�������
`�����F��������P ,v@ �� �� �� ~� ��W@ �� LMT +11 +10 +09 -12 +12
<+12>-12
PK `ZZZ�ɵ,q q pytz/zoneinfo/LibyaTZif2 ���$ݻ��#�`�x���e��/?p����N���B`�p�+��*��_`̯���`�z����p��` pJp!a~�"R�p#D�$4�%%7`&@��2N�`3D6p45j�P�� QTـRi�� \
LMT CEST CET EET TZif2 �������$����ݻ������#�`�����x�������e������/?p������������N�� �B` �p �+� �*� �_` ̯� ��` �z� �� �p ��` pJp !a~� "R�p #D� $4� %%7` &@�� 2N�` 3D6p 45j� P�� QTـ Ri�� \
LMT CEST CET EET
EET-2
PK `ZZZ��:�. . pytz/zoneinfo/METTZif2 � �`����ٮ�������������� q���Kͩ�Cϒ4Ђ%�r�N@�
�c���E�t6�d'�T�MD3��#�ܐ͐�㯐Ӡ�Ñ���������|� lr!\c"LT#<E$,6%'&'C�'�4�(�%�)��*��+���,��-�ڐ.�ː/t��0d��1]�2r�3=�4R�5�62x6�8��8�a9�v�:�C;�X�<�_�=�:�>�A�?��@f#�A�9BF�CdD%�EC�FɐG#�G��I�I��J�K��L̿�M��N���OnnP���QW��Rle�S7l�TLG�UN�V,)�V�0�XFX��Y�(Z���[�
\�]��^�_��`_�a}�b?�c]̐d�e=��f��g��g藐h�r�i�y�j�T�k�[�l�qm�=�n�Soh�p�5qQ<rfs1tE�u v/�v��x��x��y�ِz��{λ�|�}���~y���� MEST MET TZif2 � �����`�������������ٮ������������������������������ q�������K����ͩ�����C����ϒ4����Ђ%�����r�����N@�
�c� � �E� t6� d'� T� MD 3�� #� ܐ ͐ � 㯐 Ӡ� Ñ� �� �� �� �� |� lr !\c "LT #<E $,6 %' & 'C� '�4� (�%� )�� *�� +��� ,�� -�ڐ .�ː /t�� 0d�� 1]� 2r� 3=� 4R� 5� 62x 6� 8�� 8�a 9�v� :�C ;�X� <�_� =�:� >�A� ?�� @f#� A�9 BF� Cd D%� EC� Fɐ G#� G�� I� I�� J� K�� L̿� M�� N��� Onn P��� QW�� Rle� S7l� TLG� UN� V,)� V�0� XF X�� Y�( Z��� [�
\� ]�� ^� _�� `_� a}� b?� c]̐ d� e=�� f�� g�� g藐 h�r� i�y� j�T� k�[� l�q m�=� n�S oh� p�5 qQ< rf s1 tE� u v/� v�� x�� x�� y�ِ z�� {λ� |� }��� ~y�� �� MEST MET
MET-1MEST,M3.5.0,M10.5.0/3
PK `ZZZ~#;�r r pytz/zoneinfo/MSTTZif2 ���� MST TZif2 ���� MST
MST7
PK `ZZZwt pytz/zoneinfo/MST7MDTTZif2 � ��:����������ˉ��#�p�a ��u��X ��W��: ��9�� ��� w�q�a�P��@��0ހ�5� �� ��
�ࡐٿ
����� ���� ��ye idYG IF9) )("E�
'��&�� ��������̀ v!���"U�#j� $5�%J� &�'*� '�ߐ)
r )���*�T +���,�p�-���.�R�/~g�0�4�1g�2s�3Gf4R��5'H62ڀ7*8� 8�9�� :��;ۻ <�
�=�� >��?� @oΐA���BO��Cd}�D/��ED_�E��G-| GӧI
^ I��J�@ K���L�\�M|��N�>�O\i�P� �Q<K�Rv�S-�TU�T��V5ƀV�,X� X�Y�� Z��[ާ \��]�� ^d�_�k `MАa���b-��cgi�d
��eGK�e�v�g'-�g�X�i�i�:�j��k�Wl� mv9n�� oVp�� q5�ro� s�tO� t���v8��v�ݐx��x���y�v�z���{�X�|~��}�:�~^e��� ���� ���� ������������ MDT MST MWT MPT TZif2 � ������:��������������������������ˉ������#�p�����a ������u������X ������W������: ������9������ � �� w� q� a� P�� @�� 0ހ �5� �� ��
� ࡐ ٿ
��� �� �� �� �� ye id YG IF 9) )( "E�
'� �&� � � �� �� �� �̀ v !��� "U� #j� $5� %J� &� '*� '�ߐ )
r )��� *�T +��� ,�p� -��� .�R� /~g� 0�4� 1g� 2s� 3Gf 4R�� 5'H 62ڀ 7* 8� 8� 9�� :�� ;ۻ <�
� =�� >�� ?� @oΐ A��� BO�� Cd}� D/�� ED_� E�� G-| Gӧ I
^ I�� J�@ K��� L�\� M|�� N�>� O\i� P� � Q<K� Rv� S-� TU� T�� V5ƀ V�, X� X� Y�� Z�� [ާ \�� ]�� ^d� _�k `MА a��� b-�� cgi� d
�� eGK� e�v� g'-� g�X� i� i�:� j�� k�W l� mv9 n�� oV p�� q5� ro� s� tO� t��� v8�� v�ݐ x�� x��� y�v� z��� {�X� |~�� }�:� ~^e� �� ���� ���� ������������ MDT MST MWT MPT
MST7MDT,M3.2.0,M11.1.0
PK `ZZZ0>8�� � pytz/zoneinfo/NZTZif2 � � ����Q�X�x�h�C�`�X�h�#�`�8�h��`��h�����mh�̧��Oh�������࿎�������n�����N���cp��.~��L�`�`��,o`��}h�ښ@ �� ���
�`������
~�����^�����>��xg���XI��f�8+��`!H`�e`*`�G`�`�)`��`g`��` F�`!��`"0 �#i��$��%.`&B�'
�`'�$�(��`)��*ͧ`+�#`,��`-�`.�k`/j�`0mM`1J�`2Vi�3*�`46K�5
�`6-�6��7��8Ӌ�9���:�m�;�`<�O�=��`>s1�?~�`@\N`A^�`B<0`C>�`D`Ex`E��`F�Z`G���H�<`I�g�J�`K�I�L� `M�+�N}�`Ow
�Pf��Q`*`RF��S@`T&��U�`V��V��`W��X߲`Y�h�Z��`[��`\���]�g`^���_oI``ht�aO+`bHV�c/
`d(8�e�`fU`f��g�7`h���i�`j���k��`l���m��`nw��op�`p`�`qY��r@�`s9��t t`u��v V`v���w�8`x�c�y�`z�E�{�6�|�b`}��~�D`h�� �� �� �� �� �� �� �� LMT NZST NZMT NZDT TZif2 � ����A�L��������������Q�X�����x�h�����C�`�����X�h�����#�`�����8�h������`������h��������������mh�����̧�������Oh���������������������������������������������n�������������N�������cp������.~������L�`�����`������,o`������}h�����ښ@ �� ���
�` ��� ���
~�� ��� ^�� ��� >�� xg� �� XI� �f� 8+� �` !H` �e` *` �G` �` �)` ��` g` ��` F�` !��` "0 � #i�� $�� %.` &B� '
�` '�$� (��` )�� *ͧ` +�#` ,��` -�` .�k` /j�` 0mM` 1J�` 2Vi� 3*�` 46K� 5
�` 6-� 6�� 7�� 8Ӌ� 9��� :�m� ;�` <�O� =��` >s1� ?~�` @\N` A^�` B<0` C>�` D` Ex` E��` F�Z` G��� H�<` I�g� J�` K�I� L� ` M�+� N}�` Ow
� Pf�� Q`*` RF�� S@` T&�� U�` V�� V��` W�� X߲` Y�h� Z��` [��` \��� ]�g` ^��� _oI` `ht� aO+` bHV� c/
` d(8� e�` fU` f�� g�7` h��� i�` j��� k��` l��� m��` nw�� op�` p`�` qY�� r@�` s9�� t t` u�� v V` v��� w�8` x�c� y�` z�E� {�6� |�b` }�� ~�D` h�� �� �� �� �� �� �� �� LMT NZST NZMT NZDT
NZST-12NZDT,M9.5.0,M4.1.0/3
PK `ZZZ��7� pytz/zoneinfo/NZ-CHATTZif2 � � �ږ� �� ���
�`������
~�����^�����>��xg���XI��f�8+��`!H`�e`*`�G`�`�)`��`g`��` F�`!��`"0 �#i��$��%.`&B�'
�`'�$�(��`)��*ͧ`+�#`,��`-�`.�k`/j�`0mM`1J�`2Vi�3*�`46K�5
�`6-�6��7��8Ӌ�9���:�m�;�`<�O�=��`>s1�?~�`@\N`A^�`B<0`C>�`D`Ex`E��`F�Z`G���H�<`I�g�J�`K�I�L� `M�+�N}�`Ow
�Pf��Q`*`RF��S@`T&��U�`V��V��`W��X߲`Y�h�Z��`[��`\���]�g`^���_oI``ht�aO+`bHV�c/
`d(8�e�`fU`f��g�7`h���i�`j���k��`l���m��`nw��op�`p`�`qY��r@�`s9��t t`u��v V`v���w�8`x�c�y�`z�E�{�6�|�b`}��~�D`h�� �� �D �\
�L �L LMT +1215 +1345 +1245 TZif2 � ����A�D������ږ� �� ���
�` ��� ���
~�� ��� ^�� ��� >�� xg� �� XI� �f� 8+� �` !H` �e` *` �G` �` �)` ��` g` ��` F�` !��` "0 � #i�� $�� %.` &B� '
�` '�$� (��` )�� *ͧ` +�#` ,��` -�` .�k` /j�` 0mM` 1J�` 2Vi� 3*�` 46K� 5
�` 6-� 6�� 7�� 8Ӌ� 9��� :�m� ;�` <�O� =��` >s1� ?~�` @\N` A^�` B<0` C>�` D` Ex` E��` F�Z` G��� H�<` I�g� J�` K�I� L� ` M�+� N}�` Ow
� Pf�� Q`*` RF�� S@` T&�� U�` V�� V��` W�� X߲` Y�h� Z��` [��` \��� ]�g` ^��� _oI` `ht� aO+` bHV� c/
` d(8� e�` fU` f�� g�7` h��� i�` j��� k��` l��� m��` nw�� op�` p`�` qY�� r@�` s9�� t t` u�� v V` v��� w�8` x�c� y�` z�E� {�6� |�b` }�� ~�D` h�� �� �D �\
�L �L LMT +1215 +1345 +1245
<+1245>-12:45<+1345>,M9.5.0/2:45,M4.1.0/3:45
PK `ZZZ��|� � pytz/zoneinfo/NavajoTZif2 � � ��:���������逢e���� �E������ˉ��#�p�a �/v��(� �X��v ��u��X ��W��: ��9�� ��� w�q�a�P��@��0ހ�5� �� ��
�ࡐٿ
����� ���� ��ye idYG IF9) )("E�
'��&�� ��������̀ v!���"U�#j� $5�%J� &�'*� '�ߐ)
r )���*�T +���,�p�-���.�R�/~g�0�4�1g�2s�3Gf4R��5'H62ڀ7*8� 8�9�� :��;ۻ <�
�=�� >��?� @oΐA���BO��Cd}�D/��ED_�E��G-| GӧI
^ I��J�@ K���L�\�M|��N�>�O\i�P� �Q<K�Rv�S-�TU�T��V5ƀV�,X� X�Y�� Z��[ާ \��]�� ^d�_�k `MАa���b-��cgi�d
��eGK�e�v�g'-�g�X�i�i�:�j��k�Wl� mv9n�� oVp�� q5�ro� s�tO� t���v8��v�ݐx��x���y�v�z���{�X�|~��}�:�~^e������� �������� ���� ��������LMT MDT MST MWT MPT TZif2 � ����^�������:���������������������������e�������� �����E��������������ˉ������#�p�����a �����/v������(� �����X������v ������u������X ������W������: ������9������ � �� w� q� a� P�� @�� 0ހ �5� �� ��
� ࡐ ٿ
��� �� �� �� �� ye id YG IF 9) )( "E�
'� �&� � � �� �� �� �̀ v !��� "U� #j� $5� %J� &� '*� '�ߐ )
r )��� *�T +��� ,�p� -��� .�R� /~g� 0�4� 1g� 2s� 3Gf 4R�� 5'H 62ڀ 7* 8� 8� 9�� :�� ;ۻ <�
� =�� >�� ?� @oΐ A��� BO�� Cd}� D/�� ED_� E�� G-| Gӧ I
^ I�� J�@ K��� L�\� M|�� N�>� O\i� P� � Q<K� Rv� S-� TU� T�� V5ƀ V�, X� X� Y�� Z�� [ާ \�� ]�� ^d� _�k `MА a��� b-�� cgi� d
�� eGK� e�v� g'-� g�X� i� i�:� j�� k�W l� mv9 n�� oV p�� q5� ro� s� tO� t��� v8�� v�ݐ x�� x��� y�v� z��� {�X� |~�� }�:� ~^e� ������ �������� ���� ��������LMT MDT MST MWT MPT
MST7MDT,M3.2.0,M11.1.0
PK `ZZZy��i1 1 pytz/zoneinfo/PRCTZif2 � �����y��Y^�� �p�ӽ ����|@ �;>�Ӌ{��B���E"