blib/lib/Time/OlsonTZ/Download.pm | |||
---|---|---|---|
Criterion | Covered | Total | % |
statement | 38 | 385 | 9.8 |
branch | 0 | 202 | 0.0 |
condition | 0 | 30 | 0.0 |
subroutine | 13 | 52 | 25.0 |
pod | 19 | 19 | 100.0 |
total | 70 | 688 | 10.1 |
line | stmt | bran | cond | sub | pod | time | code |
---|---|---|---|---|---|---|---|
1 | =head1 NAME | ||||||
2 | |||||||
3 | Time::OlsonTZ::Download - Olson timezone database from source | ||||||
4 | |||||||
5 | =head1 SYNOPSIS | ||||||
6 | |||||||
7 | use Time::OlsonTZ::Download; | ||||||
8 | |||||||
9 | $version = Time::OlsonTZ::Download->latest_version; | ||||||
10 | |||||||
11 | $download = Time::OlsonTZ::Download->new; | ||||||
12 | |||||||
13 | $version = $download->version; | ||||||
14 | $version = $download->code_version; | ||||||
15 | $version = $download->data_version; | ||||||
16 | $dir = $download->dir; | ||||||
17 | $dir = $download->unpacked_dir; | ||||||
18 | |||||||
19 | $names = $download->canonical_names; | ||||||
20 | $names = $download->link_names; | ||||||
21 | $names = $download->all_names; | ||||||
22 | $links = $download->raw_links; | ||||||
23 | $links = $download->threaded_links; | ||||||
24 | $countries = $download->country_selection; | ||||||
25 | |||||||
26 | $files = $download->source_data_files; | ||||||
27 | $files = $download->zic_input_files; | ||||||
28 | $zic = $download->zic_exe; | ||||||
29 | $dir = $download->zoneinfo_dir; | ||||||
30 | |||||||
31 | =head1 DESCRIPTION | ||||||
32 | |||||||
33 | An object of this class represents a local copy of the source of | ||||||
34 | the Olson timezone database, possibly used to build binary tzfiles. | ||||||
35 | The source copy always begins by being downloaded from the canonical | ||||||
36 | repository of the Olson database. This class provides methods to help | ||||||
37 | with extracting useful information from the source. | ||||||
38 | |||||||
39 | =cut | ||||||
40 | |||||||
41 | package Time::OlsonTZ::Download; | ||||||
42 | |||||||
43 | 1 | 1 | 749 | { use 5.008; } | |||
1 | 4 | ||||||
44 | 1 | 1 | 7 | use warnings; | |||
1 | 1 | ||||||
1 | 35 | ||||||
45 | 1 | 1 | 4 | use strict; | |||
1 | 2 | ||||||
1 | 18 | ||||||
46 | |||||||
47 | 1 | 1 | 4 | use Carp qw(croak); | |||
1 | 2 | ||||||
1 | 54 | ||||||
48 | 1 | 1 | 474 | use Encode 1.75 qw(decode FB_CROAK); | |||
1 | 8131 | ||||||
1 | 60 | ||||||
49 | 1 | 1 | 6 | use File::Path 2.07 qw(rmtree); | |||
1 | 16 | ||||||
1 | 44 | ||||||
50 | 1 | 1 | 561 | use File::Temp 0.22 qw(tempdir); | |||
1 | 13636 | ||||||
1 | 50 | ||||||
51 | 1 | 1 | 358 | use IO::Dir 1.03 (); | |||
1 | 9355 | ||||||
1 | 25 | ||||||
52 | 1 | 1 | 6 | use IO::File 1.03 (); | |||
1 | 13 | ||||||
1 | 22 | ||||||
53 | 1 | 1 | 393 | use IPC::Filter 0.002 qw(filter); | |||
1 | 11039 | ||||||
1 | 49 | ||||||
54 | 1 | 1 | 592 | use Net::FTP 3.07 (); | |||
1 | 72012 | ||||||
1 | 33 | ||||||
55 | 1 | 1 | 440 | use Params::Classify 0.000 qw(is_undef is_string); | |||
1 | 1830 | ||||||
1 | 61 | ||||||
56 | 1 | 1 | 505 | use utf8 (); | |||
1 | 20 | ||||||
1 | 4896 | ||||||
57 | |||||||
58 | our $VERSION = "0.009"; | ||||||
59 | |||||||
60 | my $keyring = unpack("u", <<'KEYRING'); | ||||||
61 | MF0(-!$R` | ||||||
62 | M:3J?AIQQ=&`])CYT4)W/#X;24$@-\M+9TL:GX[EY73`%+BVXYZ | ||||||
63 | M'E&=M]7F``MF7J>95(87_4%2]Z?#S?XQA$FF_R[+;8$/0=4=QNX[Q`Y*A38I | ||||||
64 | MY;EM%W68#SU8@=[@QT[`NPI[BP[>-OGH#3`E*`E\*8#9S;#-"0&$;I8W>?9( | ||||||
65 | MO/=>(^%60-X6^D@AR^/Z:NZ/K((A8K:>N:[7#=;V+2U>GW2LF$W0CJ?1J(_` | ||||||
66 | MVN>\),PLO7>_6*W\$SLZQ[XB3:J(W`%'ZBE`A#JI,G=_FL2$2-%M[Z#B.U9* | ||||||
67 | M0,K]:F5/DGC?/F)(2J=A@!U#E$=PWXL1.?Z5\F9PTQ?J3Z/*$XZ+<%>?SLTD | ||||||
68 | M;@X&.1?\OC&V2?UMDY>4\,!BR-_;9TW;*-C-8,I.##00PN/\XD8+D7VP!QQ, | ||||||
69 | M`A!QP;#59N=SQ#9)U"V57NC".)5QJVDEC!,]$38N4&J=[Y`6V+7K+PZ^,N(L | ||||||
70 | M'%`8`@1K[^* "+%Y9(VO*FW'$>"3ME. |
||||||
71 | M@[Q9$.-@PS+^?=*H^#Z2H"\11Q)*L\:WL5?(XMZ"GK0SO);!GZ@Q=@"NYBV] | ||||||
72 | M)U0"8K"8OJEV4R%/`*^=H]]_UC.73XFV\WZCUP`1`0`!M"!0875L($5G9V5R | ||||||
73 | M="`\96=G97)T0&-S+G5C;&$N961U/HD"/@03`0(`*`4"3(!R9`(;`P4)$LP# | ||||||
74 | M``8+"0@'`P(&%0@""0H+!!8"`P$"'@$"%X``"@D0[9?I#F*J?C11&P_^(CTW | ||||||
75 | M=A8?8E_@751BNS5U@&K;'D^MG?K(_"[?`>H%S0YM5@5BG2A:/D9HT'3/?U\Q | ||||||
76 | MZ(#$=`B.\,JHURIT"M'FS&,")YTHX&K@?CEKZ@_^OM$.*;AE>LS-V7I)OIP, | ||||||
77 | MV0@&OG_E:3+4N\/']:163L[J))9***`;XLQ8<]V%>A/NZ%.#T=#BRAE#`JXE | ||||||
78 | M.5VF=!IS0;BHCH9S0+,0PCI@"3*VY[V>*]$.$0R243A7K2(SZ`2>GIX-83%' | ||||||
79 | ML]MN)0O7D]@9#=/2EW;I^X[=&QEQ$6+I!(,[S(.-PXDLX:S@3\GO#9Q`Y(9' | ||||||
80 | MMOJ!E)+!.;88T+>ZU6ITRW3E!#AVJ=*\>8+XVZ6XL<$,2NB@Y@;\.`M0B!6Z | ||||||
81 | MDVL&4QQ>BO\HO6N\8`9@*)?NH6(^N1G,$==KN8\)LH,YX*:*O9BDD*LV;@UG | ||||||
82 | M=M+5S'I)ZJ%9"[05C>'4AZ_!F@O=C6/98%3M-^*`]"67W&0**@-WNN]\\RSG | ||||||
83 | M#[+G!]\3X$4'U'`_&G?!J,5U@IS3O/ | ||||||
84 | MOS"G8HX*A*+I%4F][HD3*1V+6WQ9S$6X<+26.W\[,3*W"S#.QYJ>ZLX:]U9N | ||||||
85 | M9,_C_30=3+#:J-G\WD`X'JX\4'78Q<(A^-=\D_WPZE%NH*TPK.%BRPC+Q^TN | ||||||
86 | .KYCFF;> | ||||||
87 | KEYRING | ||||||
88 | |||||||
89 | sub _verify_signature($$) { | ||||||
90 | 0 | 0 | my($self, $localname) = @_; | ||||
91 | 0 | my $krfile = $self->{top_dir}."/kr.gpg"; | |||||
92 | 0 | 0 | unless($self->{have_keyring}) { | ||||
93 | 0 | filter($keyring, "tee", $krfile); | |||||
94 | 0 | $self->{have_keyring} = 1; | |||||
95 | } | ||||||
96 | 0 | my $subjfile = $self->{top_dir}."/".$localname; | |||||
97 | 0 | filter("", "gpgv", "--keyring", $krfile, "$subjfile.asc", $subjfile); | |||||
98 | } | ||||||
99 | |||||||
100 | my $archive_hash = <<'HASHES'; | ||||||
101 | P$`IAK1/'QW'S,*892Y(QHOJBH5H}S8Y%YO)[;GZKP$ | ||||||
102 | ^+'@Q[[<#EOR3!YLOVNPT049W7$>C:B+`U'(QD"0>&8 tz32code2006b.tar.gz | ||||||
103 | VKM[][KTE |
||||||
104 | W4VW8\YND-$}}SJ>K:&1PQ]"&I2'B'WA@>J8U])7D"0 tz64code2006b.tar.gz | ||||||
105 | MNA!Y(:V"8<)JH;*GH\8."0W"SK"^AGOF"`U%P<$0!X | ||||||
106 | R(Y3G'R:4?_W0]Z[L\4H1;A*`1/ZY(FON0&9_>]U8#\ tzcode1996m.tar.gz | ||||||
107 | ]A@KB.+SZ%WC[W%D740$5'WZ8*P(7.K46497CNJX7OD | ||||||
108 | P\0,)Z7_3B:1`#%JX63KZO2AP6CVCHJQ4JKT#"TX.HT tzcode1996n.tar.gz | ||||||
109 | >$LQ?T8},4/8PYSXAC%T | ||||||
110 | ]KY>N'1E-HL@;('"0AHGC8'-BT/"@\J(Q!!#](PR$\L tzcode1996o.tar.gz | ||||||
111 | (@:9K9#^4'YP@O`[1L*"L/S]TZVG,)?_;/MA- | ||||||
112 | 8%!.RF90V24VGA>FC8 |
||||||
113 | K,ZBCE^VW6*_AKQPGJ'5&1A>`K!?ES.(+R&G!GNSF2@ | ||||||
114 | "?G4I0H3[78@"K2`YX)>(J#!JYV(3Q4/4;$'VQYA_VD tzcode1997b.tar.gz | ||||||
115 | /*LHT0+AE;#6'ZCVZ6S@VP0$#G@?4Z/:ELZ%`ML^JPP | ||||||
116 | _O147ENUT'-}4F.NKO}LS'I:N),^H`) | ||||||
117 | 09S8MCYT"Z}'8X**'W5G&B*MK\:#7?$)K75S6K'%MY, | ||||||
118 | #`2^59N!B6(9\$5:XDIZKB*P@<'JLV6%4UK2@:-SF3P tzcode1997d.tar.gz | ||||||
119 | $HQI06E:FD2S;'-AO/U08IXL:GYKV,2LF'%S\ | ||||||
120 | Z&DDN6JC6`.D']B,:205L%LE0CIA!G42P*O1)H">J?H tzcode1997e.tar.gz | ||||||
121 | QKZ[["IJ6[7VWJ)!-S("[_M02XCM:E8CGI-&!GW4;AX | ||||||
122 | A]9CKZY}%ZW&_? |
||||||
123 | #FPZ-(Q?,Z7^}^4 |
||||||
124 | D[JK;$_XM)V_K+Z33J)>AEO9TM^G0D@YGI63&2F(CY0 tzcode1997g.tar.gz | ||||||
125 | ;>XM4,W*LTZ9B+JI./#Z7X'?8F[$GYH`:1Q1LR%/&D\ | ||||||
126 | JH+4K2EZ1XM%6$R^`NU4Z[*,BC2@P6F"5KM[}[`2+M\ tzcode1997h.tar.gz | ||||||
127 | #":0$VMCE7ZE@Q,Z!P"1@"*/N^2:T"@!JIMXDJ5;!E( | ||||||
128 | @9QB]GO&%(18/1T4SCM)QE0'B[!9/'X>}>9OL+35*SH tzcode1997i.tar.gz | ||||||
129 | [X%-#X4H;7[LUBSM`/ | ||||||
130 | M4\7'_UDFM!.Q1]'-T}B:VBKD?9\A0^&A'7)G`+I"K( tzcode1998a.tar.gz | ||||||
131 | 1':-`"GE233?Z+^#23T72*U1B7})_?P#,?FR0%[<4,< | ||||||
132 | _-$XL/Q$5INX@7T'N:D@)LV:RXYWCD9}U\?E:U&RR:4 tzcode1998b.tar.gz | ||||||
133 | F6@N8$>[<+#8`:L`"%I-L:)4ZQO)Q0J"MG8EHL}UQ6L | ||||||
134 | "%;]G2:!.*Q`^+"3HE\9UTIX-"O6]%U"+'$,7?H0;$< tzcode1998c.tar.gz | ||||||
135 | OGT#:)(S_L`'6`%96EGNJ[D'OK3-LZD-H&2S8MD!@ | ||||||
136 | 1.1L+NNJR&2E2,0PPMN!:S)TMUK&'\V(G$8AI,N"W!P tzcode1998d.tar.gz | ||||||
137 | J$>9-;<)+Z,U2-F\KECK;>@L4U!C%MG)B7H6H>6SJ80 | ||||||
138 | A;/YMV00%LL`^L0%QBC;E | ||||||
139 | 3;!<]_[C8UTV6NO`1&8[)[FZF4$BKK7@9^_6J/\VNEL | ||||||
140 | 25#9+JU6@MJQ@(OG[H>N41Q;#Z$8.D].311#CF+C#@4 tzcode1998f.tar.gz | ||||||
141 | ,%7V%)L1<.UQD}6:AI%FJEW4G-T;L91JPA+T`C!#&HT | ||||||
142 | V28})%G&$\/BPP+9D!8,A?1>O2ABCKW@JHD"4_SL`X( tzcode1998g.tar.gz | ||||||
143 | UUSM!AZ#D);N[IXQ9U6ZZ)GYN`I;+T?01#P>/SD:/Q@ | ||||||
144 | HTSY\4#- |
||||||
145 | B8X9%$4VK"1:?$&9;)H3!_-F5X*L`5>J*YD1W*OUE$8 | ||||||
146 | _`YLN'QT:E\J}YBN*)Z1$>K_^A$F8WY7%#J3"*Z#!ZL tzcode1999a.tar.gz | ||||||
147 | 0M7Z,7(`*KF1"SGY%V0;#}+U`HY,__@S3%+F_Q#}<+, | ||||||
148 | (W%J0QU9OZ.UFJM_Z<1OHA(_OU[(N5-SDJP}P0SROGP tzcode1999b.tar.gz | ||||||
149 | C}T642QR'*@$DP5P]AM)]1,*H;LD^Q(X-`3^K-;EI60 | ||||||
150 | BJR`4,G@Z<9+E1M>ZEZC6<8O;JELN-)3IG@VZ:,`8^, tzcode1999c.tar.gz | ||||||
151 | $&N/VK]JF)"D"OUAU7U4I^N`.]@!0)3@UJ2K]N#;]$8 | ||||||
152 | #0M&UN-:"]\]&9/P8POORT@I**@
| ||||||
153 | Y4IXT]3HZBWYI*[EZ09%34OX}3D]2S#J%QN$Q#*VY&, | ||||||
154 | 50:56X>(&I'!Z8 |
||||||
155 | 'I%Q%3}}1T!+RBD4YRHC+>ZO+1&8};MH3O}_9MW}K>( | ||||||
156 | D%J)Q[R0!]6H184H-T"K%V;!@M>^VS?05W1+GVM@LV\ tzcode1999f.tar.gz | ||||||
157 | V*L0,}B.+3MP419UKZN$A_D6L].#:MC3PI?;8O43:CD | ||||||
158 | 1A}`Z"S/%U'@YJRRE9SN?BOY)3"047+"7IW%W}U88 tzcode1999g.tar.gz | ||||||
159 | IPA/8;KIQLJBG&:]B!J:LE}`/*AY,CB><'>("ATUII4 | ||||||
160 | Z@2W8@66O+V6@0GU,49S:7U)DS^.^;+S?(PK@(<]0*P tzcode1999h.tar.gz | ||||||
161 | AK_%4;>J&XQ,NL[XLUO?T\T^@N._KXKOX)L59:)/?K$ | ||||||
162 | 2?%P.Q];2-W%UQI_2%\[!1U4OXY]EG]V(_\1J$&Q0 tzcode1999i.tar.gz | ||||||
163 | 1"}X)FO | ||||||
164 | 6` | ||||||
165 | RC/M"+CQOOS+%U#BL6&Y\ | ||||||
166 | DJ(8Z}J).%@E_#F?7N'/V}RKCK5[NWV)+KDV&VGY*ML tzcode2000b.tar.gz | ||||||
167 | ,#`3><[;_M`"4^,5XKQHX&5,C[3_(J%HM?P'UH[585( | ||||||
168 | S:/:T"]P%M4E%]!,:ZO!URXU_:,Q!Y\_S9ZXEHJC*2L tzcode2000c.tar.gz | ||||||
169 | (<\&.}-1)HEVTL0A^>MC^9[OTA_F | ||||||
170 | F/@1W";,1P%#BU%^8VSY_NQ**\'H_C0-9.KA2S%A4L\ tzcode2000d.tar.gz | ||||||
171 | +I<;KTO/A5^*45]&(4KP9RJ/UI>Y.+" | ||||||
172 | $MPO9HF_E*&%R'\V4FV>VQ}ZT7MWI"5(UEWOW?['<]P tzcode2000e.tar.gz | ||||||
173 | 2&}YVT"CI\+K*\0?N>,GC"?ZU0Z&(RYEP | ||||||
174 | BS}Y6*&G2+/M9VONR%0"6'A#MR7C??`]Z+2W.\BQPAX tzcode2000f.tar.gz | ||||||
175 | 7#P3%J2%7A#YSM.FY2#XG'I$O6<1M`VE(IB';(0[*3D | ||||||
176 | 6A.L+/TX(K8%M:8? | ||||||
177 | +*"8*,CII+E`H9A?AQ0LH#*-9YE1&]4;8D]+&RNGKWX | ||||||
178 | *3GE?JMMDF7N |
||||||
179 | TC7WXM34$`?6H8*)2\FY!\F&}:Q:98PL$%/G3YY$Z$` | ||||||
180 | }) | ||||||
181 | **DQ2N>YE-HJJ;0\[:)!9J+/<`4<_F8+N61^8441A,$ | ||||||
182 | ^A90}%',RV/]O1UMEJV3C5C3NRU`W*S:DQ@ZAVI#<#8 tzcode2001b.tar.gz | ||||||
183 | MV/V,C9&LLT@.5M#:>B/`T.D)N<4^?%I?F*!4#O | ||||||
184 | 6@#J6GD*6*G$&00J<:Z:Z}F$P+>VX1)T--`})[1)AX` tzcode2001c.tar.gz | ||||||
185 | 3QU-.}YK84}19:9G)5]@M2$%A7M@49 | ||||||
186 | )X6#$TJ`RUQBBKF;B%P9@Y`'8I}C"%UK?+HT`8B+6`P tzcode2001d.tar.gz | ||||||
187 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
188 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzcode2002a.tar.gz | ||||||
189 | T.%Z>O^9.S8JS?`/23&@2M&%PJ\K-1:+_N3R;0Z;J1@ | ||||||
190 | ;}L$L$_ILD*@"WY<_*O:F4ZG]X[&}L*F@/]801!"C^( tzcode2002b.tar.gz | ||||||
191 | 1/6}?:Q[*'ESZ4W4ZPLB,UGJDE.C'JP3HJ+/")+WH&L | ||||||
192 | 5/86VN'P(?}^+-RQ?MO\?`}9@I^R$_'NJTC,)X1_2ZD tzcode2002c.tar.gz | ||||||
193 | JR,QLT`-V>MKT3<-\@6Q3(<}/;1*$*LXD2L%J$L%F:< | ||||||
194 | `WN7U1E-81^7>KJDWY1%#205QE_P`N07MQ\DSI3?0ML tzcode2002d.tar.gz | ||||||
195 | ?UK(}H/#"%PORWZ0^$ | ||||||
196 | -YX7B$L]M[K"8!,E[G.} | ||||||
197 | N/G+J1V(.++FW9+IA$.(WU4M[#./>%@[9AX,EVGCT | ||||||
198 | ._F/:VBL%G_T!U/8)K}Y1MZ^\`^: | ||||||
199 | #3^/+OXE@&_V/DJ\_3D&P`GS2ZV`6ZN##4"S@+%C#Y( | ||||||
200 | #?'KUM:?&NQ.BMY9I\U_MTY}V1RHDSO7%$M0}7M9&+< tzcode2003c.tar.gz | ||||||
201 | !CBY7S<9&:Q#*,!ZOVX;'I&9 |
||||||
202 | MVF8;A6X_,>!%<<^L^8]34L\`9M}27K$EUQP,$)2'(X tzcode2003d.tar.gz | ||||||
203 | S9W}"ZQ@.+];?HJKMR6,3-7%K7>H6`Z([O9JZ.)A:O$ | ||||||
204 | F,KUSRP?)RO$0ZD*B]ZJQ`L6;%2C0+D#J@V7AORX76L tzcode2003e.tar.gz | ||||||
205 | `+0}U\YKO7D8TGDOW3VQU#WDMH@.D&6>'!,+V@KN*RP | ||||||
206 | ?[9E)T;IQEF`RMGQTG.4+?U;83H`<8-'Z7]>UM+J3Q8 tzcode2004a.tar.gz | ||||||
207 | 6+Z;]QTTA!ER6/Y8QT4?DZ'1X1F-W]-^&3^W^&[>4:8 | ||||||
208 | :AD\%WF#/`}]WIGU20*X[K83+B#JGPW#8F}-U!!"478 tzcode2004b.tar.gz | ||||||
209 | P-,&A>PX)7WP6A&IE>+]WX*5L3?Y,}(3\*O8^>E*`30 | ||||||
210 | NH`MY*`7A[W/DI^\&?XT*O__I<%@GP+9LM,H3/YO&_4 tzcode2004c.tar.gz | ||||||
211 | ["LMMYE#'#@HF@W3WKMMZSGMA_6Y"A6}@/R]A0*LC3\ | ||||||
212 | :HJ28L+C8S3G5 | ||||||
213 | _+'A`<`;^H'F&U:[,&^Q'7;&: | ||||||
214 | @,EDOQ5,9X\F}U+"@7P@.YA(Q3$D!?)4>#%J[2 | ||||||
215 | -X]#/^GF-;R5O;OPL;)!PRKM,AVZ"ZG"-2\0)]5S?J, | ||||||
216 | NEU>F?]}K!7!A9DW/B1*]TMNBA8BY:H:;.K039)8A`4 tzcode2004f.tar.gz | ||||||
217 | %$&HJA/+)M/#>B/4_'&ZG8XDG!<;S8\&;2-D.8W.$ | ||||||
218 | 5TC}&[-3V*Y[QF!}L]E".>T_SGI:"(_%FGE^NG3W0UT tzcode2004g.tar.gz | ||||||
219 | *L}R5"A1]0M6,0`8X\R$LKPWZ&U/05PATMRL+3P!8A$ | ||||||
220 | M+?V@C,>N)XG1XOW1HM`@H)!A*)14??,8LN-7]X*}EH tzcode2004h.tar.gz | ||||||
221 | /DA%)8']P1H0$F0&C,`AL<6^R[DY!*RF3H.BI,U_[ZT | ||||||
222 | *Q5X]:E`[5*V9<`7&"5O]$PIEOR<347DQB1]YA("`L4 tzcode2004i.tar.gz | ||||||
223 | `(WD0#KWDTL8NX;-U+";PR(`M@^)_NBVR,4ZI(EJ+#$ | ||||||
224 | 1!E#SX}_-56)++GFJS)G(4]/0\/9Z'N"_6-$RC!>}K` tzcode2005a.tar.gz | ||||||
225 | 4(!D94,CPK]]!O4]\R\UWL!!GLO#E#?I!`FSBMOIONH | ||||||
226 | I(B<]#W}4BS2;A<}0`O9L@:)92O#3M"\+*KX5#>6474 tzcode2005b.tar.gz | ||||||
227 | CQCMWN> |
||||||
228 | I^Z$TX}].:FK*KF$"*:;)>D"/@?1"4Y^@"?,+>,1RTD tzcode2005c.tar.gz | ||||||
229 | ^T76E[M;_9.N'.}1+KPP,CE[;DZHGC1$+]NZV[H%.ZT | ||||||
230 | '+HY]/EHH"!,U#4/?&BX^&9T/XNK1`7GH>X]@0M}E6( tzcode2005d.tar.gz | ||||||
231 | M]1HTD2U/\ZA_WGM2M6)?RF,:BYRZKPJCD2BJ!L!N[< | ||||||
232 | QWJ5.N`E<8#&Z}O27}>[H5&?]3$M?6G(9>%NH11X;"\ tzcode2005e.tar.gz | ||||||
233 | 04RHVS!UC[$ | ||||||
234 | $:H$^4K/K[9BM'>6JJ%9%9^]HX\UBCWG["LXAP?R+RD tzcode2005f.tar.gz | ||||||
235 | #")G:1:>2+?\9L(S:_@Y%C([NC?Z1M]JZG?C%#;UP(L | ||||||
236 | OL^>8SJVSR2B?>5A>+6-!2**4:;>9:+VE! | ||||||
237 | [};+`0M2"]\'DI!'F&@O_&P:}!N<\_6@,XA9"#K_1V( | ||||||
238 | B[ZV,F^;8,[105J_Z7G | ||||||
239 | 7VX/+BVEU!M^[-)H&'US-NTIARYZ`IK-^2}T#48TZ#H | ||||||
240 | AGJS#D4$0[?0<35*!N>ZH7#?#PX3K8SZ?&,[_H.X6IL tzcode2005j.tar.gz | ||||||
241 | KU&312RMUH%H.[KEP4*]^7GPIVJK[SNO[A?D0DT/9,P | ||||||
242 | ;0#'LBR$M0#&KH1G&9-@4;?Q&)']MCV5T?IK$J&4QL, tzcode2005k.tar.gz | ||||||
243 | 8[9+^VIG+D9J7+:AD6072WD,\9PS*YK-1/7P6DI}&\4 | ||||||
244 | C1$P^RGJV4I8LYOLV]Q600D>?N*ZT&1E>$A}W#IU+(` tzcode2005l.tar.gz | ||||||
245 | W@+W#1`4?(R^)$4^N7[9DX+/T?J0LYM8N4WQR-#34!D | ||||||
246 | [LN98?,_W,`Y}[5;R"I#I?7_XH_83^*+^$B5W7*S]NH tzcode2005m.tar.gz | ||||||
247 | 1K0M)`5<.A[VA3(Z)B!%VF4MG$J_Q-};2)7___3D0 | ||||||
248 | *G\Y}!A?HJN@!/EQ2&0:#SH |
||||||
249 | E#4.YX^HQQ)A}N.:}?MW+W+;EXC_I(Y%[D]7I5JCX'P | ||||||
250 | ]ZNVA1-?(TBVI'E@VQ7\ZI^HWE^H(?%/Z9PKV"Z#('X tzcode2005o.tar.gz | ||||||
251 | R91\O!/V+* |
||||||
252 | E`H"$IH)%7]/9$QZA\-DE1S?F)@SC9I88-%}W;^?26L tzcode2005p.tar.gz | ||||||
253 | ZC(%^8I,2}R$XU&^+KPN#F\K$,QDK&Z*^'"!?XN)YF$ | ||||||
254 | @8Q1T5W!IG._S)W;;QWT9+8W07[9,EU?R6VP[JN(S]0 tzcode2005q.tar.gz | ||||||
255 | 3@;MB | ||||||
256 | O$;Z+}[ML/^LWR5S}TE | ||||||
257 | W}XN&$-]L\D"'!IU9.C`QTD;]0BUQ5YQK7P3!N]MP`L | ||||||
258 | ]SU(?0#Q0HN5@O!I217?UMJX+3VI^C%OSCS#N6NU+^X tzcode2006a.tar.gz | ||||||
259 | ]VZ+6E4Z)\)"^V,0"89WBZ0EY,AH>8V-B1XV!&[Z\%\ | ||||||
260 | XOUW'?I7&"KRV}0V"<;*ONG[UY[,)"T*?R&/1'X8}7@ tzcode2006c.tar.gz | ||||||
261 | B}8VJ8@$W._U)3KK*K2/LKE!LHM4^H_}U | ||||||
262 | LE$%A'/>*`'Y!-?./7(XD[G/KBX>`%W'KQE>1V?YT-\ tzcode2006d.tar.gz | ||||||
263 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
264 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzcode2006e.tar.gz | ||||||
265 | Z.[$%PGQJJ)).]X;N/%#T`IBGY;8}'E(AWP&<-5HA_D | ||||||
266 | 7GJB!Q6?'5*.WWO1_,R+.L3#34I_B5D@]W;-?D6:5K` tzcode2006f.tar.gz | ||||||
267 | 1R[3I66V8Y)QI.*466A^W/..6A#}9%V) | ||||||
268 | 01BME5QF*S/#*OK?5?C7(6, tzcode2006g.tar.gz | ||||||
269 | 0F4"C%,LLNEMD2:()!;-9PLX5Y8J0J+K`"\3BQ\C.UP | ||||||
270 | 7+560Y^#7A3:/#&K!()Z:E_LRML?VZ;HFI6DE%#;YB4 tzcode2006h.tar.gz | ||||||
271 | ZBQD>[}0}5D]V0B>9"6?DUUL8/XDY:9RH"<-@C5-#+8 | ||||||
272 | "}'O2FOX]UR9RR'!GP#?WN&82Y | ||||||
273 | CELV`-F$?+?U1:A3'1TKB??H#B;`!AS#Q;0_KK]Z/TX | ||||||
274 | )L`T#FB6-YAUJ(;3A?$*(74$A5'S/ | ||||||
275 | M9L,63Z$Y![++\QR@H-NNEHH&[*'H6$R!6_CNR6-?)8 | ||||||
276 | }T!(I:ZE(].H5^5F(JX**Y#8P>8-3#'/C&5A9!}NPQ< tzcode2006k.tar.gz | ||||||
277 | ,@%IK`@E32)LAY_`5:,)%7Q$1VQ`W3/CC*'QE*U!}L4 | ||||||
278 | B([2E@K?C)[OST4N,-#K@A*$%^QJL7&)$;:$OZ6IL"( tzcode2006m.tar.gz | ||||||
279 | ^C]TE)CXC9CS.`:,D"/EI6O#9+7:!,C[_"IJFSJ+*(H | ||||||
280 | /L6'R7?".GAJ6+QL":L'OF[.\Y}3?B7+KBB!ISFI:LD tzcode2006n.tar.gz | ||||||
281 | KO[C!UHRFP$3/.*_LKBN1BBV[C*`MJE}A]VYA30IT', | ||||||
282 | :S?CSBSI$NC+U7W<2'F0(}'R[+2I7TWZAPXGWAI?BWX tzcode2006o.tar.gz | ||||||
283 | @M4"3/@RZLNR^F@_CKQXE\+`B.@@G>SA!TOXLC}[[PD | ||||||
284 | QF}_:;,Z/- | ||||||
285 | \G+SJ4<#052;^V4%W1KDX,*DY}111\C:BF@NG/P+>%0 | ||||||
286 | 0%T7`I/M<_54QY\/LH)#"X"&Z5,*;&^(\]RR*EQ*L tzcode2007a.tar.gz | ||||||
287 | FF0!Y}I4:8W_\E!KYD_#T&7}&4I%G%20CMMQ\1/V^?` | ||||||
288 | H59(IH()IJVF!;L+A.+X/G?#?83:B9+]^ZCE}3QBPP0 tzcode2007b.tar.gz | ||||||
289 | (&9OZNGI-MWQAKGK_8Y]JS`&KP-}?E/.!H'MOVT(1V( | ||||||
290 | Z-AS^*UXV5BM7(5P0Y<*'@X@#;T4\Z^E5-*!E:I[N3H tzcode2007c.tar.gz | ||||||
291 | /,V'0JX:9/V9RI?]7X5L576T8.#&_5Y\1ZCF>CE1)Y$ | ||||||
292 | 8'7G.R)CLF8}V4Z0\_WQ-[F^OEH' |
||||||
293 | Q(.3RJ3L`J9"I+BO^NA/O2X+&?S&}Y>DJTS5_C8]R0@ | ||||||
294 | T76<+I)`/.U2.$:I,&-R_0?U5S(;VM:EN/OJ) | ||||||
295 | E/68(PB*:V;W"S8'$\'7O@5>("YA;>8UF'[M/*A\HP( | ||||||
296 | 9:$?X`R2Q4T<."-.\L24!M[U\SYY1G,.KQ\DO*0S'$0 tzcode2007f.tar.gz | ||||||
297 | GZ_/G!0"\@HI?D(9*;.G;\M;'Y[@'_M4Q44]>IB*MQT | ||||||
298 | &U.L_@`$.H6}9%S]ZY]M(,[L8S]A%X!DM&]YJ"R-01L tzcode2007g.tar.gz | ||||||
299 | !DLU(10X_Q%5:2I:4CV&*B+WOV#+^}DU5});+E>..;( | ||||||
300 | @S5EVJ&(:`!7#L)`>4NK6R$W>3>4EZ6Z:`6OQG/_0Z, tzcode2007h.tar.gz | ||||||
301 | :LRJXSUR@B9RF&Z&J}>+<#HD#\+K--'M_MO | ||||||
302 | Q'*FY@&Z0`C'L,%/CXWZ6)QN8?D(]^+]>& | ||||||
303 | 5;C5L)V82N2!9\F)?;LT\'?:GT?`9U+TJS6:F`+\@8$ | ||||||
304 | Q3Y/5>"JN4BAM^?'4S}:]V6#D/`GW$,+(.Y`@RC3M)T tzcode2007k.tar.gz | ||||||
305 | LBV/*G*8^!)1VZP.2X*/A,-?R19X!>]_/^&/<,T?X?` | ||||||
306 | 6X:\AOD7?/`QE-}^AU)Y>K`(A?K+W#UGN687<[WOQ)L tzcode2008a.tar.gz | ||||||
307 | \?K\-4HMR'!L/0!T]%HY,?.Q\;>;>IQ.R90,[`G--F< | ||||||
308 | 7N`"DJ5AJ]>>!\>T]*4@ tzcode2008e.tar.gz | ||||||
309 | KSA;C__8G-Z([[:IF:6DG%(BZS;>*NP]$+A./\N-\SP | ||||||
310 | | ||||||
311 | /R95)8>6T0NK92!;+HH@(,P/%DX!E8W'OGP:4R/+OK, | ||||||
312 | }1]V}:J-\-!1*@RVD$W?[:HAVL(IPX9.;_[[P/YL%R, tzcode2008h.tar.gz | ||||||
313 | %#&NNJP&>RM#6#ZSXQN}6NH"MKL.L-5R199@}\-(>6@ | ||||||
314 | 5&:2_?&0EV-H`D#C>RK:.<7M2:6CVW`[&1^T51<9>/< tzcode2009a.tar.gz | ||||||
315 | -PUP%I)[1I0W'HN.Y"*5S2)'2MP3}O&+V4QG`}FFN)D | ||||||
316 | ]TN\#,![&-3D\X1B5!ES$PJ1N\/Q`}SH?C4-8)VW56< tzcode2009b.tar.gz | ||||||
317 | *Z}0Y;V6J"40BXFN+}0.5DRP%0:V5'?-5_A]7//&6#D | ||||||
318 | ,12VK4$LWWI#WOC0Z7I0_I>8BG;$V[XTLU:?%W;6EFD tzcode2009d.tar.gz | ||||||
319 | .K)*P'^+'^&;.U}-#G61@$EZ6:B;^0J,"''VXY!Y^C( | ||||||
320 | D#$/8@9;E1S-XP*P9[[5F>AG_$':83/%IB@979.0*B, tzcode2009e.tar.gz | ||||||
321 | QF5:9)&KZ4*T":]1Z(;/#4FZLW.X^$I}MVV7H*`Q_)< | ||||||
322 | U6'YM$J\NMH_8\S^ | ||||||
323 | ;69$E8O$#3;K^V*T8$Q+>\)^)P\"R-]?BF8RKLQJCJ0 | ||||||
324 | )16*ZL48A&R?9&5'XZRB%T95>_+E*\77'E?8+ | ||||||
325 | 1W@/D4]7DAQ50#"P},W])S5(,AX-&H0EU1NQR^IS&U8 | ||||||
326 | )62'!9;5N@S18-%5CP>%9V)'?$8[^S}7*G`7UDZT14( tzcode2009k.tar.gz | ||||||
327 | PRM0FP,`] |
||||||
328 | $!`UJWO9Q'8Y8.91/G(%UM$"R%-BW?3%*4.M[3G}M., tzcode2009q.tar.gz | ||||||
329 | @W-!V<)4;]K#V\<''LC3]OZ>#G`"J-8F5F]TW15IEMX | ||||||
330 | G1P"X-!@>VD&D'69_X3MH2+0$@>;A8+SG\'\D_8[PI$ tzcode2009r.tar.gz | ||||||
331 | *_G1P(#L[^*@59%V-E]FKW9]A1!!Z>N.V\}T)ZH7X`P | ||||||
332 | @W_U5PX!J'G-0*^HV.C)!I1<@ | ||||||
333 | GM]HD2'[NY0AC}^?EZ6N%>DJI'$ZJC1[J+S`41,4+H( | ||||||
334 | *3&4!:)"F8>?1,@;&7\EQN8*-ZXI._<}F`Z"!);^M`8 tzcode2010a.tar.gz | ||||||
335 | 0_*2/IJR*_@HUB7!/(C`G.D"_M.Q]G:%49K@;"EF7O$ | ||||||
336 | W6"('R;'*49%WL\4)}VBM#PKB>1/-,D!QT5<]R_46P$ tzcode2010c.tar.gz | ||||||
337 | O:Z-IZBEO.<,P<]4Z#X\%A>}2-7**5^33>>?.5O}`\$ | ||||||
338 | FA2ZX79K"8BU<([.0<>X*\:?1}6"2&_,N1Q_/I2E+ST tzcode2010f.tar.gz | ||||||
339 | |
||||||
340 | $-\.J"D\:#`[T;4G#K+,/H#}D+F;Z&:AM2UP,%*IXP, tzcode2010j.tar.gz | ||||||
341 | 37Q]>ZF"HK>^$^MF1Y2`!OAAGN\_L;:8*/4;J@@E[_( | ||||||
342 | ,9$]Y-'!55L]C>?M+$D"Q"YR:B^D$(FZ+Y/**J8PXP( tzcode2010k.tar.gz | ||||||
343 | -!OW8RU0"0NX[2M-WB]&Z3}>QT61ZT`TG2+UJ2'+R8@ | ||||||
344 | 6}S]4VB_&TD:*776%3:+(M}:12@FSRBO7MC#8\ZZ4L` tzcode2010l.tar.gz | ||||||
345 | ,Y}B8)?@L(3S+*- |
||||||
346 | 7XFW5J*`P%B3A&KT).G51FL2$ESC-I$,LK7?T?,T[XP tzcode2010m.tar.gz | ||||||
347 | 26}UZNT | ||||||
348 | W&[KR/<@'2LQ_8E]N.;D#BL48W889 4*, tzcode2010n.tar.gz |
||||||
349 | "Q:Z7?C;[HQ[,SZ)(>*>K(4J:EHCJH"DUB.]X]AX]S$ | ||||||
350 | }J#+>XW8F0IG/}%IF*+)7:SE>']PFGCZYV/!^D,>298 tzcode2011a.tar.gz | ||||||
351 | ?#>.,@!UM+EL'N-1!CDDC}.$*-?C8M2/>O0MF1&]M[0 | ||||||
352 | J)IO5FK/BM24VNX>1[J&P[6B*&8W0CA}P!+XSFLXS3, tzcode2011b.tar.gz | ||||||
353 | 92GZP1+">/G1$%5Z0_E.0G1(LWR?/&AHKRYC&,,0YH8 | ||||||
354 | S8)K/A:XV%)E7-Y:PRLWV@8)_)!$E)PJE4^-FT97WN0 tzcode2011c.tar.gz | ||||||
355 | OT5'Q8BZCY;'MOS?%_QOV^OED@]H@DIY6PSUPR%VD>@ | ||||||
356 | ;4'WS-'T!S`<@2,CZ@X2_+ | ||||||
357 | CS'^:RQA,QX#E$K.)*9_]EP"M#_SCTPZA8:5/T(JC2< | ||||||
358 | V*S33`};*1[/?M>2$LU&V7/8[@>;]@1ZV[E[$4,R&)X tzcode2011e.tar.gz | ||||||
359 | |
||||||
360 | O#.*US:8E&0\ACJ?0/A2+ | ||||||
361 | 3^NQ6-EYG+FG`7)9UVMTU4T*CYW[1D0_IY | ||||||
362 | L}9-@>[#C!'\N%KL\Q]"OT)#?7}753?%F,-Z96EV5I8 tzcode2011i.tar.gz | ||||||
363 | PWV5"!H0E[I&T8A^\3OQ$B%KQ%\A5"OU671/,I8"X0D | ||||||
364 | PZFGIW!>U!0R!)K3D%^'IT?}O&]\$4, tzcode2012a.tar.gz | ||||||
365 | $K8+:P#;464:A>1$C(>5R/#0^^[L9K[$Z&$]_T'^PS( | ||||||
366 | 2@L@]]9A@U0:.)[_#2J3LS1J!%I8H-EW | ||||||
367 | IUWJ3H4(1UVN[^]?"GIA^;1$0;TNI(5O8*T7TL)H!98 | ||||||
368 | ^T6>N0"R\<:CG]RS]I^&?4>]RYMV1LDHD5I5)N(MRT< tzcode2012c.tar.gz | ||||||
369 | :-,C4\CDMQQ_;RHI4.:CY&}2WG?C;YCKV_)SV__3X:8 | ||||||
370 | RJ'VHW0E.OF86MCE*;KFA9#PN9%)T2R$LTQZKW5:Z"T tzcode2012e.tar.gz | ||||||
371 | 9>Z"?D3]+KAR-]GX/F:EZP}}2O-C4!)U/_Z5+5+Z-DP | ||||||
372 | ,G0^1Y&GDY3`B]-Z%6'90VL]GVRS%J3YF.>J^[3_\&H tzcode2012f.tar.gz | ||||||
373 | (M;V!@S((UG0#@33(@2}*&UM>.)OPB:7WIK[C9619ML | ||||||
374 | M#--09N*J0L`J71,""!H8LU)K+Z70M+SLUJ$B2[`$.$ tzcode2012g.tar.gz | ||||||
375 | \+}G;?[6}SPI9@&!6[K)\-&PFJ?9}UMG?5%(9GA8RHD | ||||||
376 | V>3H[Q8*&T&)`IB!K^KW+/N\W+^][SV%H28\^:EKN>< tzcode2012h.tar.gz | ||||||
377 | ?%\ZDR>KQB]6';YKUN3HJ,.5S_WE';0:5KZ0CB>BFEX | ||||||
378 | 57KX7*+.)9*J&%B%``#(4,W/#B78.2@TF&A^AG\9*\` tzcode2012i.tar.gz | ||||||
379 | H!@D./[;'85;4L!S3U*_U-TW!]9<;S1X,]6FBJL3*F@ | ||||||
380 | \K}Z#A@M?L_GQ8&%)%UQ@:L!VI"<+]R$MQ%0PPD#@L( tzcode2012j.tar.gz | ||||||
381 | SP+B+,7}>H]V%/?_RX44BK](&J)X]8XF]*$>&OG9\D< | ||||||
382 | F:IH]KBGMJ()U7T[$@YW_ | ||||||
383 | VM\19NOZKI4?9QZ*ZA.(QQ_5`.[5LWZSC^2K_:-T^,\ | ||||||
384 | 8`)"#]}I2TY.^Z}8$+J5D?*089^%IZM*VCT"1>ST\?\ tzcode2013b.tar.gz | ||||||
385 | #7JTII71T^2?'1>(5*[2I&WWJI%GXB"54HRN4(!2(L, | ||||||
386 | Q?\+I`T-0&(G7,0KJ:NZ\S'AA&BAF22(N1U.>47L_Z\ tzcode2013c.tar.gz | ||||||
387 | (H9(HK?}?QY#3'GCIMG/??!-_B)6:D+'JX8SIDE3EQT | ||||||
388 | \PR>,.LHA"[2+A"OF}`]N;Y9YY5_'^X',Z2)%F]WB)H tzcode2013d.tar.gz | ||||||
389 | GU%<;GC7(<)_#DU2X(8^VV#I<@8.7[2%2278}VB`G<` | ||||||
390 | MZK!GW>-2TA |
||||||
391 | @`%30 |
||||||
392 | ;3WHF`:A%KI^0^#RR,#RCI'+[B`BN?D16GG?)M!&O68 tzcode2013f.tar.gz | ||||||
393 | W41UD6_C9@D577+/Y#2SAT5;J.X5^[NURO-\QW}7T | ||||||
394 | 1GQ*Z`Z!.6*`Z-/[:.$Q-S%1Z-#NZ;OX9TN6^9X*G+T tzcode2013g.tar.gz | ||||||
395 | R%<#EK7WCXAKV&6"!ONX8T*-_AW+U1)BT23QH;UE#E< | ||||||
396 | OTQ5CN"#J,TD1>(Y0K*8(2&ECCPDD}9WHH->I;FBZ/$ tzcode2013h.tar.gz | ||||||
397 | ACT8$SG8M$KIAVH"Y#;:,[ | ||||||
398 | P8[4(KAC'B<#)VEB`R/)3(2/.KR2;8O"@'33U+2[BB@ tzcode2013i.tar.gz | ||||||
399 | O4C.BPOJ(^>K}FK.Y\KW*\U16M/@.:M]`U;-X]*5T&H | ||||||
400 | E$E^1`"R | ||||||
401 | #'*N420//5U6RO[7:7?@#_:H\BB@?Q>@_-HM&H:R4U$ | ||||||
402 | $4JO>>C*C7"B-+P/")UIG^!2@*(H7$ZCG@9_Y}RR!<4 tzcode2014b.tar.gz | ||||||
403 | ^62VJ.F^0([6J5`2%FGMRK@>}>[6FH#X!0Z'KQN-V'H | ||||||
404 | P'AKW>XB>[9.K/T;JF]M"%)5\JJDZ6>_@D8R9\*1YH( tzcode2014c.tar.gz | ||||||
405 | A$C-`C,BL+'}H(&A`C!<2P9M(7}1;BD@N\KM4**-\TH | ||||||
406 | | ||||||
407 | \;XMR*$!>\P/^<$/1G!]T"SZR9)<6S0'K*C%&Y#X%[@ | ||||||
408 | 2M?_@?1*]*536#C9EG\K\8G8`V-'XJ | ||||||
409 | MNWL!B$}ASSD/"\`895)`2DZZN3 |
||||||
410 | -'R@75PH#HC+P-SF]`(BL],S,9PKN689@]TE1TS59,L tzcode2014f.tar.gz | ||||||
411 | ?# | ||||||
412 | 7<3B/>>M[MH_%`+7@S['A7G&W\MI[8>#`XG3J(N$$B` tzcode2014g.tar.gz | ||||||
413 | ]3O'83Y%5[]3}$/U06&P9**)KABE7/,JY;%H.6SV`!< | ||||||
414 | E#_%6&<@B]MW1P*5`%I-$^WUD9S(>N:LK7DZA&YQLQ( tzcode2014h.tar.gz | ||||||
415 | [7@(%:'B"6%L>1F7\4VE;+DQ'&6%MPQ0.S*A'H[!7@T | ||||||
416 | P$PWO>JEH:$WBMIQ236BV3%GG0JDJT*`C1A;8`Y}!8( tzcode2014i.tar.gz | ||||||
417 | $@}G#!:*@/Z}N&,'`H[Z.OC*,$@7Z^-M];7"TK9]ZZ0 | ||||||
418 | *4\%]-:OH$(@P[)5K1D#XH4+^P9)LNW[+75#1:2R20H tzcode2014j.tar.gz | ||||||
419 | @-.].NMPXA52I9G&(#9P_G0LJ-)PP_Q#"C!%V.BF80X | ||||||
420 | O^})05,L!Y'5J9UN2_7[WV*1C>5]-WT_TFY_?WAL9J0 tzcode2015a.tar.gz | ||||||
421 | V;5LCLF-D5C1#/@-\!@89,1GI#A[C.U7`?1FQ`B%ZE( | ||||||
422 | 2\'4FPX7P*&-@`:D(]H<&YI^}&)L2I%MTWR[A>!+*PH tzcode2015b.tar.gz | ||||||
423 | `?5^)\$#%#3GVHAV\P"$W^^}OC:8A3G(5_ | ||||||
424 | ^"R?Y}K3+>T2&%Q30SM_&@53V(2*+9}2F8$"'_UPW[$ tzcode2015c.tar.gz | ||||||
425 | ++3ZSM@YT"YC$Z>JS*32W^9%08;9AD[DJ@-/ | ||||||
426 | }1SL(H6]XM5Q*6*W,^$'I&\B@D:?91"T+9.7+6PT0DH tzcode2015d.tar.gz | ||||||
427 | _<5HIH](}KEGLYXA^E/P8]Q75NB&XJ)SS`1M6@%.M1< | ||||||
428 | Z |
||||||
429 | 7/OKWHH+Y7Z#B*>VTUKKJ9$PIRP:0?F[U}6&11&D | ||||||
430 | 7I,@JR$%6T.#YDL[G7:"P-,#}\Z$!V&9A[YG)#8!1Q` tzcode2015f.tar.gz | ||||||
431 | 1-J#/:.OVX)C:I4WA3 | ||||||
432 | WDU(#A"X?+LVQ%ZJ_\JFN8E#}>+U4[?19E7<%GS4H1\ tzcode2015g.tar.gz | ||||||
433 | ,Z$'BZ%J[QD$BJE\X8%OQ3:`8;_D#MW`Y^)&RE?$I34 | ||||||
434 | ZO+P.$<2CI<:;96?-.IW(DOS/]4]QJ#`!D4-WC4B(B, tzcode2016a.tar.gz | ||||||
435 | 4_}`7]!&;UK,71W5D%1JNVX_0D#6IXSGZ660C9,0Z+@ | ||||||
436 | :&R/OHAY1\43I-YEX^/\`XUD(5HS`F | ||||||
437 | @3,)M&Y"%,OGTBN94;K153;UTY32]E&V"N9L%-V,(RT | ||||||
438 | 49D:V`]_`L,D^);F@,?OL#(:GD>9R6 | ||||||
439 | QO8EFGCZVJLI.^"D$CPB;1HR}8ACG/J-K;6G2]6%4HD | ||||||
440 | *@R'S].C.(CXAO4:_S1&7(E07PB2YKR^)"1ZD6#G,HP tzcode2016d.tar.gz | ||||||
441 | W*]A6MJ6D@Y@_[,V)3]35!AA%3WLP5;4%F'T/@O[$HP | ||||||
442 | ;",;"W}KOC\A}E231B}?Q:AY!T])}]44$BCEC+,Z0<8 tzcode2016e.tar.gz | ||||||
443 | E]"$]+"FB/[PE]RB5@@\J92#DX2-}\CN8WO})OA9%0P | ||||||
444 | SGTK)OP19:.T2RC,')!UX0&2,R)A[6B9"TLAJ%0XL", tzcode2016f.tar.gz | ||||||
445 | @X.^UM`:`DKTC9OS-72BVP1]PAUULT`0%*M?7)SABCP | ||||||
446 | T>#9$ROJ:,#E |
||||||
447 | V0#I+Y | ||||||
448 | 7&VY>X'M[]!SV",E}7*+PNP`1L'5T_%}(O0F8H5`O/8 tzcode93c.tar.Z | ||||||
449 | $#P9]X&N*+)O4}S+[\2[@E#<;4743)
| ||||||
450 | `]WQCNO2:V`:X&S?>]%E355U5/DVLM[N6/9#!}79+]T tzcode93d.tar.Z | ||||||
451 | G%>'44/-V(*7_!GZ}OJY9P'P,5 | ||||||
452 | ,N??4)N$YU&TD/:]VSEY9"0H8?#--NR4T/*R0X[.8 tzcode93e.tar.Z | ||||||
453 | 8C/Z_(/K8KZAL-K^\-QY0O60<%2I1)C`N?XXDFDK,I$ | ||||||
454 | 5(*N^X%*V)2PDHBM,<-}],@DB_;4>"1TWA?2'FI6< tzcode93f.tar.Z | ||||||
455 | _>['WQ9$AX,M]L"_6.ARH).&5J<_PLOFIC&}U24G:}( | ||||||
456 | 35_W,VHAB&Z?6$NK>&,}#"MDVRZWDB?E>)NCO;}"Z`` tzcode93g.tar.gz | ||||||
457 | UHSP"W@@&3-.V!`P,WFQ82S}S2[6M;6B!$ | ||||||
458 | _*1#?Z.U.+HQ,!}[H(___`$2[:P(%:Z\JX/Z'L/J.QX tzcode94b.tar.gz | ||||||
459 | Z@H]7[O0$1D(FE0'T6COG#W"T]B',RRL<3HW:LQ:@U@ | ||||||
460 | &"YS^X-0&5PXC&2#LKFV<<*"(}MA4\A",;7']/<]C70 tzcode94c.tar.gz | ||||||
461 | CI]EX%GS46?,.Z;!JE+U,\N}:TPW,W?!'D141$@B28X | ||||||
462 | [U;F)'V*"$5J?@`/IEOR_EF9I-SNKV>HN89N%0%+:Y4 tzcode94d.tar.gz | ||||||
463 | C | ||||||
464 | +;-&YM!F?'Z%;B>}4#4JZQ7KB^(:!X+J#/$H}05@2)H tzcode94e.tar.gz | ||||||
465 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
466 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzcode94f.tar.gz | ||||||
467 | C601R.Q+I2LKZ%.X`):%S85HPA8C`1]32:W0T!,% | ||||||
468 | %?X>Z;P9*L3H:-]661E@H`@]4CMOXWATG*[\HT]3F)H tzcode94g.tar.gz | ||||||
469 | 3H]S/<4?5\$!]9`RS$M"$69+*Z%^QR@\.<%N($1W,9, | ||||||
470 | >OW7;@)Q[U4\]VMG%Y?4C\'XDB | ||||||
471 | $K$*^`1JPQ.C;_*C:L4VPX"^,5S.^/-"AD}$6+5*U&, | ||||||
472 | `CP8;[+7}HZ&AT_KF\HSN)UL%W(W514O5C$`+4L1)/H tzcode95b.tar.gz | ||||||
473 | M!1BT7ZMVBJ;V6D8F#*WS.I+&E,HK]?G;N[U9H2]NX, | ||||||
474 | 0'',HHJ9"DHP0^)6HBPG;Z>%(V_\7"8J4\EH?"TBR'X tzcode95c.tar.gz | ||||||
475 | ^18`.?/@J:8,+Z0M&P6*U8M[U[LW#I:H:M9!H@A&G,4 | ||||||
476 | :&I,GDPN3,;)4#J8'>D7GU(LR$45^C_8*D3C53W86Q< tzcode95d.tar.gz | ||||||
477 | :JV/F-C<-V}N`LA]Q\64$G;$;8!C_J>+HWZ2?^V0W6$ | ||||||
478 | UKESK8* |
||||||
479 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
480 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzcode95f.tar.gz | ||||||
481 | LIKL}.(61$@8(4E[&4X&X?M+,K#.<5A%[%"[V)M??Q< | ||||||
482 | 0<03E<(T8#H6'KB1P[PS,C2*DFKH`AHJ!<7-*.J:SC\ tzcode95g.tar.gz | ||||||
483 | 1#7!LTVEP;0FYMP15(2<-`5YT>YBQ<]DB10&PAW'"L( | ||||||
484 | P/MBQFM'}$H%,NTX7'D%5DQ*:>L8D_']L,R3)[ | ||||||
485 | \TFH^'Z"SN>!A+44DB.>0B@!K4M'L3B)$1I:-D,TSM( | ||||||
486 | NZ/!%L&!YKS#Y`V1".$Q}.J&Y3L#K:PO}TE3>:&UA?X tzcode95i.tar.gz | ||||||
487 | HQ_C*X'3$'*L3#MUMI):5EZR | ||||||
488 | PNR^RQ*H>9A#TXK#"(4@\@-9 | ||||||
489 | DK;*H#9MB^MAK1L*<8B&;$R%J#142^+R'P;T_7C'R30 | ||||||
490 | P5.,30) | ||||||
491 | RU(]55WM[MS#Y6+$6@'<[ | ||||||
492 | 7X;M13S0T`B]7J0?18G)B0AN5K;R?LG8S0G5}&\]G:@ tzcode96c.tar.gz | ||||||
493 | %B(J?MW:0Q%ON]!(7GV(*#P/'26H]'QA>PGCW-;3$U$ | ||||||
494 | _&EB6G8W+#'$.SR0;( | ||||||
495 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
496 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzcode96e.tar.gz | ||||||
497 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
498 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzcode96f.tar.gz | ||||||
499 | W5_\LD9F@_F9GC1TWW*TBA*GI#:K2# | ||||||
500 | *DF">7IJK<^G};KT3Z8_Y<#'C_EMS*S`,`/7C\#%_+@ tzcode96g.tar.gz | ||||||
501 | _NC+93_%GSW;S\$]G9IQ1FBX\)Y,^P/\B/-]_&]?M1, | ||||||
502 | &%@7I9&GS76SZ&CB;(}7`/MUT0$FD25P8HG;Y^]8@;\ tzcode96h.tar.gz | ||||||
503 | 3D1WX#T-E*6970%:Y`9//<$>/?S&G4&Y<2GX7IH[]'H | ||||||
504 | L:R/3XZA2KF`?2V_LIJ488G4F]/K8^09\W]6KXBH!.D tzcode96i.tar.gz | ||||||
505 | J\U)4A\T>OFX$YC)0F;FU)U%F7GK72;MI`P9Y*&QWOL | ||||||
506 | :O;VH'V}(VP,1[>9K\;K\A>#MO^.6[:#\,YSEDL*QXP tzcode96j.tar.gz | ||||||
507 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
508 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzcode96k.tar.gz | ||||||
509 | R/1+A,DR4),)DH/["Y*',/YD9!`@/YJ1Y"K`472P7+P | ||||||
510 | HL^O6\ZYTHRM,45-JCT1Z;PA[X#&G"F>`SW!26BW]%@ tzcode96l.tar.gz | ||||||
511 | ,FX+>DZN1`#WZA_R6B>-YX2X&$F2+AWNQPIQJ%$`,\H | ||||||
512 | FG5VE<*AV%LC}]%8Z?>S2W-SYJU[S9)VH$F:+[P:D4P tzdata1996l.tar.gz | ||||||
513 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
514 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzdata1996m.tar.gz | ||||||
515 | EH1!U*N648,0\DN:ZLF04Y]%"J,6_D$4K1EI\}\G$P0 | ||||||
516 | DC#*;W^907TS.NJ_YVS^Y*!%VA7V>QW&6Z2J0O- | ||||||
517 | VNM<-^9.5M.UICPV5:;UV);$*(L9!3(*'28LOR*)?N$ | ||||||
518 | \M9A3^Y%8$]I;@P%#1>,6L$[S9XKA,04}"-HNGT_+*< tzdata1997a.tar.gz | ||||||
519 | -2F$!<%`TLV8RI)C+[NNG,*)}Z"G;L}]#7SZ+>_4Q+X | ||||||
520 | )FQM(G`Q(J7_&VM-G5 | ||||||
521 | `.*%![}<(CG-%'9};:/&5^<2P*HR3P/P7-2_RRS1(R$ | ||||||
522 | ]/.U}EC!_^;5B#;:$X$%,#+L'A)#"LM2&9+'%155$6X tzdata1997c.tar.gz | ||||||
523 | S2[ |
||||||
524 | G(%Z1TS8#6%NS6Z?R)?O91+}P;/MX4!##[C!E]CS$&< tzdata1997d.tar.gz | ||||||
525 | "HA$YIA'OO0[&^N0K0F1O'#5?T%MOM};;#<[Y"@;Q8` | ||||||
526 | 6R!UU2W.TVH2-[1UK0[6@%@^HD^[9#J!O>/A$R$9A}4 tzdata1997e.tar.gz | ||||||
527 | -\Z<[5H;(K`I9/0UC40N$%8FCE_C?PA'!X.\*/#A>'X | ||||||
528 | U0PA9L<(/OU^QS9Y29-1.6}^!>*)UO5IL1!WT>;*8]( tzdata1997f.tar.gz | ||||||
529 | N?>$G,1)%Q(8YD7*L-ZX$&*Z8:4N<@8D[ZO7MO,VD7D | ||||||
530 | VYJ.\-Y'*}&![O2'U\$9"1"<<,`,V6/>S%T46K/&.J4 tzdata1997g.tar.gz | ||||||
531 | A9%`&65UI%/3#-$M;`X+!EJ'I+\[/&A)25!P-9?V/`\ | ||||||
532 | +%@@43C"5R9UV_"5^8WH3}H"N"R1"`ZYZ10"5M5` tzdata1997h.tar.gz | ||||||
533 | %UE;&/:"J-8#J@],ECT)@}UPFAXBGX}YKUVJPT(Z3,P | ||||||
534 | .+D'`Q?P\X021ABI+U^BQ/9A6'S>].L1'D1A8WUV6:D tzdata1997i.tar.gz | ||||||
535 | )%(/R#7$(V^(<_%>_/-O-O@R:].57,#P'^G0"``]!#4 | ||||||
536 | WC'N#8)H6O,K%UO2QNV#BA(P9;L@E2C*6NX"3;:?-K, tzdata1997j.tar.gz | ||||||
537 | 8Q+HC%KI[QUX*#,/F;"J\C_,A7GW;"ZX}FB@E3#BJBD | ||||||
538 | |
||||||
539 | P!A+ |
||||||
540 | >K$,-Z-X[C]*TM&98HS;(&*^*7}?7`[;UK2R}E_(W'X tzdata1998a.tar.gz | ||||||
541 | O'H$^0.*'C3!W]U_TF`2+0*61%+$&YZG30&C`]BX4 | ||||||
542 | SY3&)`[B?`YC?8B-BW"(H(5&X`P19L2`HT%?*Y9NY"H tzdata1998b.tar.gz | ||||||
543 | -L)')/BY4RP&1M51*38QB;YGULZ*]:%FO}B:J`1BMF4 | ||||||
544 | ]M0?P_7O3+D>^2K#H?}3G-,4H$B+"-^PF:B0P985#]H tzdata1998c.tar.gz | ||||||
545 | _U937D;GD,RHR>@;"?GZL0').T2<(FM-?T#K7(D[,%P | ||||||
546 | >L!20&\FO; | ||||||
547 | Z9I*7`-GAHTPM`1#06>'*\\:1_<$&@P#@PQ$DH%7&$T | ||||||
548 | W.R8OWRZ!S];}"YX>%JE[X904.17T0X994'/}Y6^FP@ tzdata1998e.tar.gz | ||||||
549 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
550 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzdata1998f.tar.gz | ||||||
551 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
552 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzdata1998g.tar.gz | ||||||
553 | 0I"M | ||||||
554 | (15Q("K7}Y<}`/6}.Z-U!G;E;+WRG\>>6':0F-."C6, tzdata1998h.tar.gz | ||||||
555 | T@C4[YQJ>A+O$AL$ | ||||||
556 | +WSM9Y,0}O+;D:&`Z^,I[CD*7BP^S3[74;*U)!(K;%L tzdata1998i.tar.gz | ||||||
557 | R-T3W14O0<8^#S | ||||||
558 | I\S^L(K, | ||||||
559 | ,WC#S,0O`E;+ | ||||||
560 | |
||||||
561 | %:?JRV;Y#S1\V8M(A$ELG@V'P%A\P\_#L"E7[B:WN/( | ||||||
562 | 5'8$G!W12!5A;\?I#Z2,OH11M0)!1CHZ[VI2@+'}JBD tzdata1999c.tar.gz | ||||||
563 | CHQO;?K+#EG8!@+K-Z5G>O%'5C8+)6X@'8C!}ISX_KX | ||||||
564 | `*1;Q]WY3`5GY}$*CKVV.0!BB`GG^F".SWXWSA!N^@\ tzdata1999d.tar.gz | ||||||
565 | C`YJ53,E^X`2!(T:PI*!<4C^&5R2NC6Y>.!CDHQQ0RH | ||||||
566 | U2_}PPA><*#&YGQ\Z})E]\QTY**@A;U0KS}[}QJ-S)H tzdata1999e.tar.gz | ||||||
567 | 0Y | ||||||
568 | 5BC\T%K'7K3I4A?Y6D<}%RD.ULQXLVT?/XD5!VHM+O` tzdata1999f.tar.gz | ||||||
569 | 1"Y@ZIN1L-.?'P-5.OY:(2P-4,Z,1?4O5)XX1M6I*I( | ||||||
570 | S;]IB3:D^MQ&1"&6XPO?}1}?4<$Y6@-2V3ZLM[AL-V\ tzdata1999g.tar.gz | ||||||
571 | /P29#6V2Y0VJ! |
||||||
572 | J#E&JQ$ICO^RN_P/I"\*G!.L7WZT)0B^(ZRSI2.Z%*4 tzdata1999h.tar.gz | ||||||
573 | N.[5"H(5K&U#`'D^N^HWM_"$O\EH*.5C]80;?)-?2V4 | ||||||
574 | | ||||||
575 | |
||||||
576 | 8["(&T?^M+$F]/'M.)H[W)/C9E/%QO$@EV-}]}^+7Q( tzdata1999j.tar.gz | ||||||
577 | _JR*R]:37,/DDB)6)%<<>S#@ZINCIK+X@"AM>K<-+GL | ||||||
578 | E[/.;1]ZYC"C}}FP%]AP.SR2WT?8I;ZH(`UL*0A#J(\ tzdata2000a.tar.gz | ||||||
579 | L6$2NW\KJ)YVNBDTV9.2WS5T#R:Q?>KSWL_E}>0YJR< | ||||||
580 | 8&_UY*+I%$C5UB-5Z%J9:8"0#NN$J1[?2_MYX!E'IEP tzdata2000b.tar.gz | ||||||
581 | G*F}(Z_ES1XG,#-&13B'`7T}`+N,94FNREV+9X_]F%` | ||||||
582 | 2Z>,5VQ@ZE9$86D60V&V_R\O8CSUK#\+%^7*S(/%WJH tzdata2000c.tar.gz | ||||||
583 | )F9O-TJ".F;KPT^7&5C:G-,]*4?X,AIT68!}[PZNTMH | ||||||
584 | F$?0Z9/P%WU&MF'C([@X;1P]S]?EH!M6LOM')W'&A^, tzdata2000d.tar.gz | ||||||
585 | 56UF8TB#P]FPNZ3BVP#I\M@CJ\L+2P`/T9;/%Y9__B@ | ||||||
586 | WJ@O^:996D6?7OM25>E+$%$.KS;"6ZJ):4[Q/OG[#C, tzdata2000e.tar.gz | ||||||
587 | YM%:>0QR-2IG-U.,__4E^FFPYG7FT&+DS'}B$ZI0?!0 | ||||||
588 | G7Q)5],._6T%"3D.S+Z9>`5^RX&@:D"CN`UD@79WF,@ tzdata2000f.tar.gz | ||||||
589 | )-]G`$W | ||||||
590 | F9D4.>+XD-&3@A<0[IT+Z5<3!#'G7KF"/MY>]5U;J?` tzdata2000g.tar.gz | ||||||
591 | A | ||||||
592 | XB7Q1BYV!!D&XTO;B2L?U)[JNN_(/)"OGH.NMIMPZFT tzdata2000h.tar.gz | ||||||
593 | <^-:IAH`@8V60GLL?@_8M\)EQSI!?G;U'4[* | ||||||
594 | *$0GQ-A:3\>8X135/)/RO^RDH6/_R_AX;6?[]\UD tzdata2001a.tar.gz | ||||||
595 | ,C+2}E_'*1I[WF96HX?%HN962+!7.)F,.)5S][?3M1D | ||||||
596 | 5 | ||||||
597 | "2)`IF)WK)QM-.F3B0LC'"5J&O}W7TY$7MDBW2.N??4 | ||||||
598 | }[PV#XJ^,]$0!'*]^";^S.4`E%M2)[Z5@,`%^K.`DAD tzdata2001c.tar.gz | ||||||
599 | :,GWLT*Y-2$5>(NX>D}X561`YMN(^I.J;^$V4,JEP*H | ||||||
600 | V,ZZE@DLB#.ZW,,8#@D_K[*0I;U]E@G;@ZI0O8M@$+H tzdata2001d.tar.gz | ||||||
601 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
602 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzdata2002a.tar.gz | ||||||
603 | *!&'%Y | ||||||
604 | \TO_Y^$'G%B)-}$0(QX8W$B#(KYBPX8C1E61,B'O5\T tzdata2002b.tar.gz | ||||||
605 | 6G@?R$W3VCOX5\}DY87,@B!X@,"4[GD9J*<3?$G_]#D | ||||||
606 | P(T@!A1:Z`VL;&<\'A/DU9'D#J"X51#,?,}IMU0,/WX tzdata2002c.tar.gz | ||||||
607 | P809;Q2G!%G |
||||||
608 | H%JAKHMJ(07G\/_*G7G_6RHL@#5YH"S.A[*I_2<`V>4 tzdata2002d.tar.gz | ||||||
609 | G^)?2OG*:}AA'&?GU[!35MM_*]-_I@2VTZGV'EE09/< | ||||||
610 | )}6O$:<'O+'GZM/7D2HQ.2Q%-:M+_OI;[H)'8!??"F, tzdata2003a.tar.gz | ||||||
611 | KJY4Q_:(%011`,^(TF*QSO]6KQ7N#}*FO.'0I; | ||||||
612 | @+C[G%UI>/?LL-,[IU0M8_/I7CNV?EI;1`5MS!!J&"( tzdata2003b.tar.gz | ||||||
613 | E8*K>ZZ3['JP%(B0/\D_`O(PQE,\#*OL;5K#`W1NT | ||||||
614 | -Q:^}TSJ\MT(.E&[P5B9K>8?30_H`/-G!]J#1:8":V8 tzdata2003c.tar.gz | ||||||
615 | 3*-1#/W/OC_YE$+]FM6M0WQD\0(G5_,'M)*,$F0&7_P | ||||||
616 | /S^BK_W4HKXW^}HF+IJ"::R)P".IQ*)((VMU#A@M-_4 tzdata2003d.tar.gz | ||||||
617 | G\37!6&/HW$G(:D5`%Z@OW60;3?RII`%L+Q@AAYTOZH | ||||||
618 | }ZD^9E74"-:>53>#W('K*A/"6QU>Y896MK.`\[>8F,$ tzdata2003e.tar.gz | ||||||
619 | JXL*2@+S$9^X%$]#2,V}H>M4,*IV | ||||||
620 | ,+0+\MPWAEE@&$RUV3!!U4F}Q43:!FJ;/}>1\#"/:3X tzdata2004a.tar.gz | ||||||
621 | _O[+P853D*ZU@<5E16N@LE/Q2R@VK_5;22(&L7X#X*@ | ||||||
622 | TN(P6(UA2H$6'"3^Q#M5PIJ6)>H"G.F"/B5}>\5)>}X tzdata2004b.tar.gz | ||||||
623 | `,%G^A7`%F?ODM-B`B6&5N&!A62;@?VA-VKEK7A9E&P | ||||||
624 | D"!WC,>HNA:-5<2RI@}W54})>S66,0LU+B%DMJ/<^%` tzdata2004d.tar.gz | ||||||
625 | O*CVSS/3+2_4%\H<&E(7L;*3$LX&E(10_I"!0?$,/)D | ||||||
626 | ^J}AR>P:L/SU,V@X1U\D["X;0\2K0$Y56FZ';)D^";H tzdata2004e.tar.gz | ||||||
627 | .V"?>"^?!N/7NE2O>\TJTXS;IC7}8_A<_P78'_Z,I+H | ||||||
628 | )9DQNHLL$4B%]W($M@]`?%-(.>}^;)%"5>T5^/JF,I$ tzdata2004g.tar.gz | ||||||
629 | 2>OXZ]877,Y3.H/9&4Q,?^4*2RU(F1:^2[DH9G43*'8 | ||||||
630 | [\1JJUWRLEM*LFOCFM,B4BX)TOQQ%/(LR!L}6OC)@6D tzdata2005a.tar.gz | ||||||
631 | @MVM("T}#E8F).X@1!@'>>-MI$),Z.G01^&LD#T3Q+L | ||||||
632 | }/!;IP@BIFPB1I:P0NP8(SC}._9*FP2?)910^[02U}D tzdata2005b.tar.gz | ||||||
633 | GR^[YL6T/#J^]R&$U/%R?S$NVT!N*O>227++_(700 | ||||||
634 | S88TM@098U.T(&G4ON;; | ||||||
635 | -S$-%D | ||||||
636 | L6PFP1\(:HK]9R?-"6BL&*BK>(9!U^#H7*O,0*-CEMH tzdata2005e.tar.gz | ||||||
637 | :,F92[)JZX4F)_WO1.Y@:!L3GC[Y&T)%*.T,^SP6NT@ | ||||||
638 | T7,'^9G*EILZ5ICBC[>6OA[AY2\6+R%Q`G#*B$2}%+\ tzdata2005f.tar.gz | ||||||
639 | -9<#**-X5G%H$B7BL8L:?4;KF/.S+X$)8$M5`WIQ2D< | ||||||
640 | *P]%.W)S@&)^&G8P`IPWI(Z8W+}FULY%C^U;P.K/-}` tzdata2005g.tar.gz | ||||||
641 | >_4'\9RP[&H8#Z+/<[^^TJ4)3R-(-^83.1L/5}P#>)4 | ||||||
642 | QYUVFD@Z}M-:'FM`\ZN(7119?!LF24+Q[GN<>A0*KN\ tzdata2005h.tar.gz | ||||||
643 | 0L_<}.?5:)RAVLOU[W"1I6""&BF\&V@EY<'4'SJ%3]< | ||||||
644 | 234)%[]K.8^#CAFB3B!NOGWQ7A8H%Z_$D6S_+.W(UE$ tzdata2005i.tar.gz | ||||||
645 | +#.RI\+OJ2]M.K}\J,7*B;)(#?+9},O-9*,L1Y+ | ||||||
646 | 1PCK>DN9JZ3\Q02"\/LTV>4RQKO4',<}7N+9K!+,75< tzdata2005j.tar.gz | ||||||
647 | :`(:.6(VL;:*#$V!@H./0`DY#:@.:A?@A1%USAC#!7\ | ||||||
648 | _T]2G}9UXV3W?<'655[,[W)#-?^3>M1X<`.%NSR>`<4 tzdata2005k.tar.gz | ||||||
649 | $\`;5HH(N4D+[-)0-T"L)U6%_:GS\ | ||||||
650 | `D:ZV(:1E}&;?YF?`:]`&I"}DU:GR?+"1^G!@TF9,^< tzdata2005l.tar.gz | ||||||
651 | ]XP?Y/R@:#/$-"?7Y_:@TB)E,F,\/>7R";@2+DG<\CP | ||||||
652 | 8`H:XMG>ZT89&XP4BG&'AI:MT]M<'?)<\L5QYUZ(2T0 tzdata2005m.tar.gz | ||||||
653 | M'-/T;7BH#DSE.GYS$%58N/N*X??`>I`}(^RXY0U@(@ | ||||||
654 | D@.Q"57'&0@C01W)5._E5+0'2V21}]53$^8$75((5I4 tzdata2005n.tar.gz | ||||||
655 | )1CF2?*H:3>1$E1%5OTBE@<8>JW'^P(NQ8U8S3\V)-< | ||||||
656 | $+HT2$W6:N)>WLK?<58H@$Y@>F9%"+GX)CT45/$ | ||||||
657 | L.?)VFJXZBON09#Q$?.MXL;SA/3M[`U,43C5'A_KB[T | ||||||
658 | QS#^9DYGX:<>.Z9H"T14OT<;A)[MF!;Z[T>I*Y8$-.$ tzdata2005p.tar.gz | ||||||
659 | H$))'Y\8_V8'U]A'55[*'#[ | ||||||
660 | +MZ}G^}?O}'F.)*@6J"_^Y;+_$\N!'GR?`TVS)6]B.P tzdata2005q.tar.gz | ||||||
661 | VT[/$2K2&Q])-Z}+.2;Q&VVK.'4[05HU'Q7TC'(1X0@ | ||||||
662 | M%`@#^^E_\""HK0L-RO10AX<*'@@\:NI1XCP@20)CD\ tzdata2005r.tar.gz | ||||||
663 | ^/E".Y()9@FALYIV!J5&E(@7<.IU5J6L*YRR>?!+01( | ||||||
664 | 0T?K+11S483Y`';FL(VD@)NG(/}%0>]@<8??E">1P%$ tzdata2006a.tar.gz | ||||||
665 | XMH%#7P:N67@G9N4E5"[KI;8__,:H2?)B(B$EBCGDA@ | ||||||
666 | UT!&0XRJW(?\WK\QE/ZQ4L]%P#[GQ.*J | ||||||
667 | :S7+"D)F2T@Y`\ZU%DS*\-1I5:H41GU$EO:XZ4I6Q9( | ||||||
668 | E+'71)J#,.OA^R141TM>%E_0V]PX*I3\A%RW0/$6XD, tzdata2006c.tar.gz | ||||||
669 | WPZTL%>)HNF | ||||||
670 | Q%6_ZILW*>!JC(YQTNY9J,X_U'?IC`47S!FY*K;Z` tzdata2006d.tar.gz | ||||||
671 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
672 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzdata2006e.tar.gz | ||||||
673 | ,^YGL#VHJZ!$$A2J4S8N\U[MR[?^(2,NB10;+LXJT[L | ||||||
674 | );VKQ_}!DU\0RJ}-)2C`#SP-6B0[K_#JP_/!8H+1'', tzdata2006f.tar.gz | ||||||
675 | 1COG_P,W,-L)>^5XZ-,)R79S;?2C"8I8*I3-R8&JF34 | ||||||
676 | 2K?\*317-RALJHHQ.Q4R3XN3B5!&;%`O*')#!XMW.D0 tzdata2006g.tar.gz | ||||||
677 | Y:G!6]O8YJ*%7OXBB23AS"B'8#-H[4<[NB@`GX)(?JL | ||||||
678 | OD>0<>,+YM#GO5IALO"#(83.\YM1?NR#E8+WCZ}.9$D tzdata2006j.tar.gz | ||||||
679 | $F7_E9WUU9\]_6F"RL>N]>!'$NSBF*$52J1H}Y1WAJ( | ||||||
680 | 2#_+@K[?&/4CQ!.T7/#H^G/JP}[)/6H1ZF,-M`@;X,, tzdata2006k.tar.gz | ||||||
681 | /+C_7^QJ}EOCHL-$O2_^-FNX1/4.L[?V_ARE_*9&`]L | ||||||
682 | 8/$'B*]R199V^*RW!F}&80>S+^WV./%RI"7$-$X/\Q\ tzdata2006l.tar.gz | ||||||
683 | ))BX4%ZAH48%]J@YE"MBU(*FR0_@WKE$PRVQ5D'IYDL | ||||||
684 | TXR0-(,"B21"*>2?K;%)/\L?0%0NC)CVQ>S_^4`&@0$ tzdata2006m.tar.gz | ||||||
685 | `'23S4..:P#XN`.NP`&;J*MWI9?#@ZL7X"+\2`%$< | ||||||
686 | N?4]H.GN8GSX}'"$}I:^%_IPB))NBY>'(8&`Z5)%4:H tzdata2006n.tar.gz | ||||||
687 | K+<3?XER_(}[>]6#526UK6}_WN>&L1Q | ||||||
688 | R];IVH,&&;[2)^I0-X4B4G>*[8KE&UXQM+TX[1&H^-X tzdata2006o.tar.gz | ||||||
689 | I%D+W.22&\0QIG".@FHF<.D?<;>+7J>#6XBD#O+;}7D | ||||||
690 | GLW:T.")MMDP#2(7+FXZ`$NZ+YMF,/(NUZ&Q<7@\J^8 tzdata2006p.tar.gz | ||||||
691 | VM(A'&GIQ11&/R8U^K\72K.[U+_;6*"ETFC_$"(^DK< | ||||||
692 | U12QXAJ'R_(+'A87O1/M(!+-X9YS119.KP?:-5H1\-, tzdata2007a.tar.gz | ||||||
693 | M/R"1ZYKQQV4HPU&$'Q;>NR/%DEJ8U("5[;(X%3XS?H | ||||||
694 | [K)H0,N0_YU@2O,E/O!;%R!ADZT<4#[.[:-JV18N4'\ tzdata2007b.tar.gz | ||||||
695 | K!W@Q6:5?201L)>^&3BRIO1:/E]0.-X[E.Y%\:B!<44 | ||||||
696 | YZ*Y\L_AL*P0LP5]L2&O&M&X3DHC]!8W9D#1[QF,L#$ tzdata2007c.tar.gz | ||||||
697 | J3.L]CD4/E+RQ6J98F)FG((T;TX,CR,/M^!O_Q^^DY8 | ||||||
698 | }-P$>19#@2"GF?VH#):^EH2"IQ'\?*C}R'+8M$Q"P%D tzdata2007d.tar.gz | ||||||
699 | 5H/->R!8(ITT7_3I@W?)OD2}5U/D"Y2?@)HAC.'ZG:H | ||||||
700 | F*+]3$2.5_%BO\X&AOD6$A_C"+:[0}7\,.L_^&D#\XH tzdata2007e.tar.gz | ||||||
701 | $K"R<20)>9BS$,9,2CR1Q4]\0(HU"@DD8:R.NXJ8;04 | ||||||
702 | 1VT2$+1.@NV,2##L8+O!!&A',T)64U_!\Y3&O"]/NA0 tzdata2007f.tar.gz | ||||||
703 | ($AGR}!34DV1ZX8B$}5E*\A]N`Q9&]8ZZ%QIEB$GT7@ | ||||||
704 | &,VAF'F2GD_]Y0X,Z: |
||||||
705 | -U..)K#H805PX_QP'K+]30<'MVFV<)YO^-1M}!903'X | ||||||
706 | LFWCC/"#2V`*4I9BIU#>:!Z?Q\%[3']KVG24E!UWWS< tzdata2007h.tar.gz | ||||||
707 | | ||||||
708 | K?6SOQV^F#}[GDL"PZ"F_WN4SXO[?`5D"1,Z+X7XUS$ tzdata2007i.tar.gz | ||||||
709 | .PF] | ||||||
710 | QWK.T8^(DUZMN+FW?K}8VB-12(MWA_?Q.QP_4C%@.VP tzdata2007j.tar.gz | ||||||
711 | ?;1\RH&;](C#R5_K]25^N+]}K#%`-'ZCAFY,09_1J/4 | ||||||
712 | D@4I;_%FZ/6-U2`;^:[9]Z:` |
||||||
713 | V,`!(`:RFB#Z_%/}:R>`P$ZJDA,,$MLB/ZP.#%39/.< | ||||||
714 | ,-VZLY`#F1TP?E.`K%<+Q3UVP(5LN4?:I4.;56*.Y0X tzdata2008a.tar.gz | ||||||
715 | 6F9W_15TBSC | ||||||
716 | MQ\L*+&O,J,AV\L`7`]]+EEDRH:F_R}1+ZR7PZZW(OL tzdata2008b.tar.gz | ||||||
717 | TW5^5CWB.3^;HPT<*R_8B??COH:<@CT-?G*D# | ||||||
718 | \_6A*GQ3CP"!:S)+MH3(22#1>P}+J106%AP1JD.HI@, tzdata2008c.tar.gz | ||||||
719 | #0S*GF+-B;66>."J%7*27?2*!(X7VXA$)6VQ]&$X_-T | ||||||
720 | 8Z4KHNK9G+"E5J;/<2D}?FZ2AU^]*.5@;8[-;]R*UW< tzdata2008d.tar.gz | ||||||
721 | BK"`9R/&?M[X | ||||||
722 | ]1(:HM17MJ%F.:P1(!]U@W)HT#CY3YJ'2-4W6'T7'K4 tzdata2008e.tar.gz | ||||||
723 | %PW]-WOQ0N:F`[2J>D%Z!\)[D>#M`G7A4QQ1FH%)\0$ | ||||||
724 | M,'BEY5(&(E(%`H'%@+"JEWS@1V'1[94<8C94/<}RK, tzdata2008f.tar.gz | ||||||
725 | 3_FR*4O9H?F$_Q$'#_LAX0N'OX/WX22#V&):>$/6QOX | ||||||
726 | W6>A)NY\.,_]L- |
||||||
727 | XD*$C0^8.Y:$'4CVJ21IN*)QN"L10U;_R35HZZ9PH6H | ||||||
728 | >19LX@MU7HT:341).X<_3L,I4 tzdata2008h.tar.gz | ||||||
729 | 3.;-)")%M7LOOMM_%382EGGF$SJ@0$H@LIJ#*:P.VT, | ||||||
730 | >U<[MXBA_W(``9T>D%2H#1$T27X6GX'+G1H+D@T#A:L tzdata2008i.tar.gz | ||||||
731 | L[*C4^I$_$\B1N`Q?1Q')JB"G+LJ<-_WU#/4IG[M:Y` | ||||||
732 | [X`L&)P0[;Q | ||||||
733 | R\F5HE-G7@6IP<3Y(%?U#_`;NC | ||||||
734 | "NF\86`/N!1/$.\0:S@S@?TL_I7TL<-$[E8?.")9IV$ tzdata2009b.tar.gz | ||||||
735 | 3.(#+U3]Y:`/L_[)S-J"O)U3IL4QTQ:E)5DX`P;]?2H | ||||||
736 | _A$"8W)'#>Q+F87C:C$B82&;F-&3QAS`4\^%?#MWR^P tzdata2009c.tar.gz | ||||||
737 | /X?YT@VB];Y&+A$[BK^;^}2_<`NX9ORUS/4IWF.NI10 | ||||||
738 | *%Y?"N<@#ML2A#*D'R[^U[*(85[S0J@;PY?@''+]6(( tzdata2009d.tar.gz | ||||||
739 | \;OV^R[LDT*[G2+0/.W7P)@TZ11!4J'F*+'FA%RSK9T | ||||||
740 | VU]2V#X"9JZX`86*W;<(_LO}\AG0>-}<)PQ:(T7NO28 tzdata2009e.tar.gz | ||||||
741 | DV:XP0J_L6X4X.<*O!L+XJTA)Y2EEB;P6Y26;&BP([4 | ||||||
742 | N1J+L8}.6(1F |
||||||
743 | _W92&R5J-VW2PY8?SA_02'NR0$!5C:I#0W&T_YFPM5P | ||||||
744 | M\_3)W][;5BP%)F?<@VSMB1EJ[_*Q9%D;FI&9`,EW?\ tzdata2009g.tar.gz | ||||||
745 | T$F#G6L1I[_*&,"[K,UB0XXM_>U8]TS%X,VT9`0CI^0 | ||||||
746 | :YP&64E4@(JSDN8MK+GY6I:$Y<01D64W56&HS`[26[0 tzdata2009h.tar.gz | ||||||
747 | KMTWX9>_(O+$2'A/!;78] | ||||||
748 | -$]:$AN`'4:DNK}6T"-XY:*&N%0%O:]NY[R`4UXJS,P tzdata2009i.tar.gz | ||||||
749 | >YE)J*HBK}?$`\\F48Y%@6&ATF5$8-LU&;N8;`\#0SL | ||||||
750 | CTEVCPH&:8&V>]ZWKY.H6D!_Z&:[3%B3O;I/KHQ^9X4 tzdata2009j.tar.gz | ||||||
751 | \%IK&EO}6:'*Z*BG\9^L",DG(;36}Z_#QE0-V`-4"9X | ||||||
752 | PA>,4U`+FMP?GD |
||||||
753 | )04'3-X\W5}NB[Z9(1UQ;<^@$%/;>YIC}48&5OR_^#T | ||||||
754 | A*"@Z,1VG5#%S;H | ||||||
755 | [''#H!7O'OER;7DP*;IUHW | ||||||
756 | H[K"*}D"*P,DQ))C,F\^$ZK,(AI8T_0@K0"$92T!_K( tzdata2009m.tar.gz | ||||||
757 | /WB&"WM\8`@-)C6?@&M+SNZ(8[\/ZB)>OLB8\_&^3%0 | ||||||
758 | 08W!\N,3STG[F$OP)WKUE]/EXA*)_M7]^/;/DXQ`!3\ tzdata2009n.tar.gz | ||||||
759 | $^YYF/`,PM40'2#Z9RAE6N<#Y1%Z&%OJAF13E%_-._\ | ||||||
760 | @OP0B)LT*M3_1#+6$#XDNF.H"I`B8XJ:M;Q(4BR%4#` tzdata2009o.tar.gz | ||||||
761 | Q6Z%Y,[L3OEK9-#}.DFWXPS92RD69L)F}0\}S$5C/L\ | ||||||
762 | ^/G9$!_/^L8V#,#$$4CC@*@F5^6JM0[,E}AV"[^T&NP tzdata2009p.tar.gz | ||||||
763 | C4D% |
||||||
764 | +AO;>S)3G3`>?X:)8M9SA.9S)JDWT-JKPD9>K40MA"$ tzdata2009q.tar.gz | ||||||
765 | I@!#C04A`'+9J0GNR.}M`FGM]^#5$02YO#9*!V-J.T` | ||||||
766 | '21_WK$R:&Z7;K'A; | ||||||
767 | /^!.[I,"Z`EE%9)S6.T:?1V4->L;J;+@L'A'S6KH_%T | ||||||
768 | _FJ5_/HR:@-L;}6*JF8B<}!?MDF5[>[E5O6*S"U5&"0 tzdata2009s.tar.gz | ||||||
769 | ?UW)-YCO0#RTO3G;)-X'NBW'4A`+DV | ||||||
770 | !,KZS9<@)HQ*5!ZKA:J(H-5((C)07GH | ||||||
771 | WTDT-TU`,W\+(>J1M<'`V}`)}`:EV,/}N9^[:Q)HE/8 | ||||||
772 | LR()WC//2]^-D[/\CHY%4@+F2?:Y!V7K*3FP0@+C5HL tzdata2009u.tar.gz | ||||||
773 | @K*:(ZZ;XMZ^F:6.'#HH`C]#,*U | ||||||
774 | SC!5JB-/B\539RIIE.H'M$WLC%S}}}+[:PF^JY9M1S8 tzdata2010a.tar.gz | ||||||
775 | ^U}H@R(/G9WNOI?KD#D}^N&]IM:$'G>(V*HB_(PQD:< | ||||||
776 | \%%`2}1RZ$F`*6@WDO&\[1B6^LZ] | ||||||
777 | '[`\)#1HWDF[5#41G?,KIF)}1E:9]Q}N#X&0:X!XYE4 | ||||||
778 | X7W;/SDX?QIZ72WN}?LQ45'B2(*R;KMXSZMK"3K3E,L tzdata2010c.tar.gz | ||||||
779 | ')J.M``AE98./-?0BV-}S-(D5P1/#BI"5BM0?\*RXI4 | ||||||
780 | AN2^OF/V?^"L1JT4F!JI`;,?UV6L-7*)UDR:LRS3J#0 tzdata2010d.tar.gz | ||||||
781 | `FZS)XR%Z4Q4^?I]@Z.<4X[#`&]?[G3FPHZ3,[YU0 | ||||||
782 | #-N]RGDEJQ^4GCOM)_&YB$.SS?[]IYPN:ZXIF&9VNU` tzdata2010e.tar.gz | ||||||
783 | A\0QA`R<4U<66A@S7#>;:2VUSSW,3F_NRZ]UXNF7-7( | ||||||
784 | 0E/<0\^[#5%>G8>:A3 | ||||||
785 | J`8`S(U/P.>6)?#2Z:FG4'\9.%7U0_GUTEM+5!'@UTD | ||||||
786 | 3"B@O | ||||||
787 | ]6E:V`GM3`I1MI7.Z3W9C)4X;]AN!S(ZE(\;FQ_-B%T | ||||||
788 | 1GY5+RZFUXA-E\>5ZEME[R | ||||||
789 | VQ(D85;` | ||||||
790 | 50^28+YLV8Z#5S?K^B601P-"`5XL.!,];@5U0K#[B@\ tzdata2010i.tar.gz | ||||||
791 | H`K_CX_%MXTZNSF(H^.SM,'%"'\(TWDD9)15' | ||||||
792 | $}[5_H/01&BS"A+G,DZ-:*PI_#Z0(Y33(U0V+3>*)_( tzdata2010j.tar.gz | ||||||
793 | #QP7FZPF@O\,!,:-$^>(6JP+B3Y'_VF# | ||||||
794 | !;E/\'JY>P@!E?%W%1TQ*_;ZA+(PCEJ)-/.6G}^Y:J( tzdata2010k.tar.gz | ||||||
795 | (-P#&S5%1?*UHY}D4S5]D-@>N^!$@,D?)#'O}EB?$Z( | ||||||
796 | .TE/F(_5UHO(G&OQ4*?@MS;O+-7F":)ADZE]0+8WV(0 tzdata2010l.tar.gz | ||||||
797 | %EF^`-J3:,DWYM,C9WAG"@A",.8_[-VU',3*:C+J(Q, | ||||||
798 | ZRTEO&!(-B5[7Y9I]9H7&}VBES0<&'2'?'62@.98MG< tzdata2010m.tar.gz | ||||||
799 | NOR_E@$3-^K/]KI8I}SR*5S;\^T&Z^7%(YI4%RV@5CP | ||||||
800 | KOHD'7VY0_,ME%QYX]\%0;??^GHW,`0WD6(L;>7@KC4 tzdata2010n.tar.gz | ||||||
801 | *FC%\!_?:J;%]#$4?*ROIF/+3,[4Z,TW#O9^/*E2ZS4 | ||||||
802 | XIR$!#A4REBY"^N)JI7X9,K]8;N.V/!!+AE]W";BT_0 tzdata2010o.tar.gz | ||||||
803 | P0^N}X:_[,G}A1M#(17TTAT}UD*RHDU9J8BTX8-8",D | ||||||
804 | FH&%S,/KWKZL$2!T-``RZ]J9B*9(2 | ||||||
805 | | ||||||
806 | S}Z?5-5.S'%X2+5[V4G<:J49D*:P9\YW_)@NX52USFD tzdata2011b.tar.gz | ||||||
807 | \EE5?&}^"]R55-(Z^N'UMVV^&M3N`>6 | ||||||
808 | ?1L17[Q.O!9F]SZLE,X*3R^--<.QRT6%}FD1^!`47(( tzdata2011c.tar.gz | ||||||
809 | LL7. |
||||||
810 | +:Z}GT&7"N^?JKYG5[]09`BAQ[M\,Q$?N?GVD>*FG | ||||||
811 | 09KW77(UL,X`TIH!-3)*._3PZ.#XZA5599`ZER | ||||||
812 | @OJ^90PI:"-)!IN^\N3OP_W#GFDLERD%QTU/ID0$"OT tzdata2011e.tar.gz | ||||||
813 | .U_`:AE'1VB3BY2&)9M\6 | ||||||
814 | | ||||||
815 | Z[7JB).D[/[;2RH,%'O>EJ8'N724Z:)N>OPK0$}#A$$ | ||||||
816 | OAGQ;O"S3R9&N);*#-0V5&:V<\SJ?!B/IIAK_Y<5KNX tzdata2011g.tar.gz | ||||||
817 | `!@WF*M3/#C1G^8-/L5D"E*WG+R)O8+J:6?9)\@.*C4 | ||||||
818 | ]1>W6J}N$>X,D)2Y>W\}0:$D`83?B0!&WH&"W.'K[\$ tzdata2011h.tar.gz | ||||||
819 | N._[>U]@<"K#&ZM9N-G.'(2X(NVG7)5D#&8B4I7'$7X | ||||||
820 | !JO,PD(^3GRA8K6UP][CRK5&*G2U/]/$,SXMUX2X(_` tzdata2011i.tar.gz | ||||||
821 | SALXB\R7^73<)"1'4,O%-Y_EB-YMI$"[%*0-5N90"0( | ||||||
822 | 3WC"E)BG}M#7?KOTNP:8YZ<\@@;^%-"[STFSL#+C!$0 tzdata2011j.tar.gz | ||||||
823 | <7T^0V1O"_PX;9A3OH>EM;6J%U.;@;ZXQOETND7RL\` | ||||||
824 | GX>Z5\H"9VEF(E | ||||||
825 | H}+}:-W3@B^4S8%Z/G`G?FZ>-'P2JGB%,]-JT*T#\.P | ||||||
826 | .}DE,!UDQJLG@E(2W_T.P#PY1`EN]'DQB!6HX?-BR$$ tzdata2011l.tar.gz | ||||||
827 | 33>M+T\MB??:W'"EJ[B\E&_T9H4! | ||||||
828 | ^0}U.N`J&XU5Z`T#STPB_*K%Y`.IH[A3440Q(31!Z6, tzdata2011m.tar.gz | ||||||
829 | (('Z1/`*SF4Y[,$I;T5/N6NTKZ81%/^\6/1O@N^+HL\ | ||||||
830 | HBU^2$5J*34"0SW,RFV2';CW#6QN&*!TF6S^MT4TTM\ tzdata2011n.tar.gz | ||||||
831 | W_&7MZYZ($^BQQ;2>M@\#RG[H[WMX`6}!0>M/T$7A)P | ||||||
832 | D.5XWUNZ8L.7X7";SAPF."IAL.J |
||||||
833 | "//P?@J_}})X(0_)(W-$MF$[:P5;[?ETMU0WOZ%3O:\ | ||||||
834 | (X$U2'K-XX\U+E6`6UO)L]N3V<"/VSS[IHLV" | ||||||
835 | Q#8P\+\9<[-H(IQXC:D)9}?(L-; | ||||||
836 | X>LARN!2@M\NNF[)ID?%/`+]DOZI']7+DX58"#A^4KD tzdata2012c.tar.gz | ||||||
837 | `O2N7#IH76B+[<#!<_3NU1?/^`&.'\E.[J__-5R0M`T | ||||||
838 | L_FE*)&V:6#.*-XR.NTJ2QENDS\@K[^_/<]X>K#A8?8 tzdata2012d.tar.gz | ||||||
839 | 9JM[SW!PH*;9NBQ>^}7`\)DD8OI#H)F8HVR:9`2;$!8 | ||||||
840 | 3[:_<]9JM}+[N0X'JEY.8V(A)FIIMUD.S/S6L:S_O9@ tzdata2012e.tar.gz | ||||||
841 | N-M3^"EG1RPZH9&@3PJ71SU#,< | ||||||
842 | $H61?C];;\>A9J.3<9$V4%`?ZXCK_$"\:F3C.3T.K5T tzdata2012f.tar.gz | ||||||
843 | 'Q.A`DU.C+WP8X>M%1X7G+[+"Y7WWW[;P`_47BMV)WH | ||||||
844 | I-R0?U"@H;}3@M\&7(I,`"C]LGC2^.O%3O\)XBC->I0 tzdata2012g.tar.gz | ||||||
845 | DO'>5<6/;CPQHT/J.9079.PW?6+(?_T_M\*IO\*>:34 | ||||||
846 | >Z_)RV-;?(-J_?0H/!$1_Q5#I)RD1$Y?.ZEKH?QPC}< tzdata2012h.tar.gz | ||||||
847 | X@^Y"3PCXJ0.L1$+.BGZ);R'"U3.KEO"4]G]&P_H1&L | ||||||
848 | WGTHO##WZF^:/\7HZMR>^[MX4<+W#B)J\HTY-)(/?[< tzdata2012i.tar.gz | ||||||
849 | F%%;DB:*+N23AO:54A'!2Y_D}&"Z'#[%U@:!L:DT:(P | ||||||
850 | />1%+X]U?*.FDDX5>$6%EGQVCGR&OG,#>-`S+"25A/X tzdata2012j.tar.gz | ||||||
851 | Q;!R1B&/7#QU&WW<7$[A)T,OP9&'`9,AON_UB5EJZ1P | ||||||
852 | 361`"F.VXS7/:C!D.HV | ||||||
853 | $C},NF^7[>3`!:ZH$8^N0R6,5,NV_)M:DU | ||||||
854 | 74AV&A}HX1)>)_4WOPL3KG#]7)$'W+RPKY)I7Y4][JT tzdata2013b.tar.gz | ||||||
855 | GZ_':K,7}G(SF@Z4\`@_`?B571;TF/S3T5Q^+T-O?YT | ||||||
856 | FXTC3C6YK/V>I8Y;^NS,HFI8#P28X'1T55R6.S'/;>D tzdata2013c.tar.gz | ||||||
857 | W$(@R,(1/8F;B0%6&A,UZTWC&(%B+]>/)'#&)6B>_@@ | ||||||
858 | U05UKKDGUHC]721SGQUD(BU`(A"1_R7YK6&F7PR@.}` tzdata2013d.tar.gz | ||||||
859 | S;HAB^/6;&6B}T}($JN$J#,'5O84N!9:RS)@$W'H\2@ | ||||||
860 | ):IFLK%R;TH;HDL&&+I-8MJ:#'E1249OO563L]*F3(T tzdata2013e.tar.gz | ||||||
861 | 2)QCAK.2:\U<)7[[_?Y/QBOO][T##BQH;'WDA7V+BZ$ | ||||||
862 | /0E2(UBNW&PR2@W%U$G@V_2.PHFEZ1L | ||||||
863 | A!!]INN+O)!CL&Y"+K;O2EE2`YN0M,AO;,;,[+-PT4@ | ||||||
864 | +}WXOD |
||||||
865 | 3UA.2G%R88+IS"\3NNHO`K%?3%8#65]DDS&*.2"0,'0 | ||||||
866 | K0L'.TQOB(NJ,_9(0BH"8`IOV-,T42#T7:#UU44_N-@ tzdata2013h.tar.gz | ||||||
867 | 9Y9%@WN4#`U,8\L'#B;`0D8:4@RJ7[X>T2B7IK^UQ$` | ||||||
868 | -2U4J>'_N+<)BA#}GB\SSTQOG+"V_(3`W\.)A0'.0(( tzdata2013i.tar.gz | ||||||
869 | D4DZ7JA;XMMC-,<}}"Y)#A"8EMXHL(]J}OILTPP#[;@ | ||||||
870 | M%PNU,JR5$9/'E6:KR*Q4S]K-8)QCU84(107B$;-6I8 tzdata2014a.tar.gz | ||||||
871 | CTB$PE}JN1W@8NUB}X&+(@[D/ZR^5R'U'3.IG]Y;/BD | ||||||
872 | F3;I35>68MV!,'89GOHTC8\F__'`:Y(%6P[[J8P.TB8 tzdata2014b.tar.gz | ||||||
873 | IO2M/Y48J.0*HQF2:NE!3,RDQ`C81N/0`"2#E9RU#}8 | ||||||
874 | XS8Z>HPY\^<&WVSD1D^*9NYK36\X?L`+!JLU1QP$V[< tzdata2014c.tar.gz | ||||||
875 | 47E*HK`/$27UHF?[C?[]!}^26B.+\Q}#`"S'-GH]*[( | ||||||
876 | P |
||||||
877 | H`<;@0%/2H(RDU0A,.VW | ||||||
878 | ?%#D^CGON/!*BOC<5"?VRB"XHNE.4E(]P2A49@KP:+` tzdata2014e.tar.gz | ||||||
879 | J',G03SUWN4;1SEJ2)2WTO#EX!2CW_3W&ZJJ\.QG'NL | ||||||
880 | _KIF2Q"-(<^Y}U3ZQC`;@G1-E5$CS?D"%GA[W)L11CH tzdata2014f.tar.gz | ||||||
881 | \!GWNBM5C2ZDA7IJGX:A:Z[W)>/PN#U3[`W#,"TM'HX | ||||||
882 | IVE7UO$*5&/4O0.OW.LH2!'4X96#L,+_@3PC;P}?)8X tzdata2014g.tar.gz | ||||||
883 | MT&!*_IV9H5`<_FN[Z1V3@EQI | ||||||
884 | _^:"BX,'F6:3]U4>->X_Q#-,-A'K?^R;4I"K[<@W@]` tzdata2014h.tar.gz | ||||||
885 | V(DW`\Z_HS | ||||||
886 | V#Y.$UGNPZ}RBTZ__23I$A%ZP?}"6A4,K4TSX@`SQ`X tzdata2014i.tar.gz | ||||||
887 | 3"EYOCJ6^1^%}C!.R075<;<]\(0L@P#!US%X&;1:L^( | ||||||
888 | F4CMD1JB9;$J2M6'U | ||||||
889 | _S;^M# |
||||||
890 | BT$QKW7D0+1&<0G)[;H3XEW:]P'R_.NRHEBTK)M7*3P tzdata2015a.tar.gz | ||||||
891 | }G>"N'YBJ/>DV\KEE}%J5!E\G@3*ETUP%M$?D.NO)3< | ||||||
892 | N`31$?($KY!2QHU&<*_@KPKYY;%0AGHU?\&9NU03:-` tzdata2015b.tar.gz | ||||||
893 | RHG"!!R$(.>Q5&8.(G(1M@NB#HUPMH<+7`H4F#C%B-$ | ||||||
894 | ,&4@*Q)FQ9RO(JF}\CA]J5K`0$FY[+>3G-0&Q_`'ISX tzdata2015c.tar.gz | ||||||
895 | -[6J/%X-8!R+(/K`C7)GPYBH-N09#OA6)}7H:H!KH;H | ||||||
896 | SK(Q6Z@:FFR%3JY/SD#IR/D,]:VMX_2*U$/W?"(}B8, tzdata2015d.tar.gz | ||||||
897 | ADF!D*(,7&>">J}??IQJIL&}6*B*<$) | ||||||
898 | .&ZRAG^D5?S\WMQJ$%K7#[O"?'I8I1O2'7:A-9@\X tzdata2015e.tar.gz | ||||||
899 | V&YLGDQMG-7>,'8G(]>I"L:7_NMMT?!&2?:C7DX}QC@ | ||||||
900 | )APR!FVTKJ^G9ZPSG,T0##C}X$3.K}8>E | ||||||
901 | K7W@X^AU.&'28/#\O+RC)U%J3<@F]V63<*?[EYYA5/$ | ||||||
902 | HFLCTF":SVX7D,C%G:"W;$+TJ4OS84"<%VJ/^F^'D tzdata2015g.tar.gz | ||||||
903 | FJ7V&G.OI0<-^QT9@I1})HZH(59CT,U90A90"O\4>7X | ||||||
904 | I5D | ||||||
905 | ;3`A6Z,HFEN%IC+6-;}J5,/`C9?D)M:]B?@\3OTE+D, | ||||||
906 | E963LAS*G2L87SA%-8D(E&S#"#9:S+[I3Q)JTP5\^#@ tzdata2016b.tar.gz | ||||||
907 | `^JW?(LQ}MH}T7T}D&*Q40-K`}(D\>2V#S2BVVB9%00 | ||||||
908 | ,?-/39\Y929(JN.E4R;];X76WN_C\GLVZNV>\Y[3]3P tzdata2016c.tar.gz | ||||||
909 | \;ZQ>3Q,?1CRVMKTJ2BQ1V]FM`"]H,A[!A5<#}'$M*( | ||||||
910 | :[+S?<%Z-G:BN^G!YQI}BR>A<<>7J&1DL+P-$ZO[+YD tzdata2016d.tar.gz | ||||||
911 | VLX/;\AZ | ||||||
912 | ]W9G;%1\0O%-[G\>CBA | ||||||
913 | !'+Y46ML/8/`I}"5.E4U],2-FY%QX27U*!B-K%$O-58 | ||||||
914 | O!@%MP*<3T9Z$BR\X;ZTZ`3}2N8[)9E2WCNR%_CHE!T tzdata2016f.tar.gz | ||||||
915 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
916 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzdata93.tar.Z | ||||||
917 | B_U+6HPPV]^'/H7%1Y#W+[(}KPGP'Q |
||||||
918 | 61A5*V'*IGK<6CP}T2["&>62E?G'%IUXHG;C39(_:$\ tzdata93b.tar.Z | ||||||
919 | $^<@A"D*D:!U".7!7?Z1K. | ||||||
920 | K2E>KRL!V.9]N3WP$M>`*0:V'X<[)\(:L?4]L]6"4YD tzdata93c.tar.Z | ||||||
921 | F!]4&XCG:R-_O+ZK$MR?28(NFZ0Q.J6[1*A8>,}D\#\ | ||||||
922 | G}?XMB,""B8"7.$MC3Q_D1X8&OXI]DNMTI@(`C5$':$ tzdata93d.tar.Z | ||||||
923 | L4AXY>[::W7`
| ||||||
924 | *3`>N%_X8'>@?6}L13GJ/NB50G"0FS} | ||||||
925 | T.LMG-V:2Y"G??QG72'P5>%G@-XUJ?.]F8>}!IG[V)< | ||||||
926 | -V/('@H\4`DWY;UM"&}$J,SDDHS@DD_-Y\!!,$WP";< tzdata93f.tar.Z | ||||||
927 | V/,C#A;3+F%HL-$&KF0W$K^`B+LK6/"XWQ8YJR]!>AD | ||||||
928 | _[WT"BS['40P#PD>P3ZM"'$\+WF-?6[*U'\N;9B1H2$ tzdata93g.tar.gz | ||||||
929 | TWT\F"YH+HL1\6L%(.\)2XAPG#J0W5EPD1W>TTQ@&64 | ||||||
930 | Q#I"WP\@Z48F5`:#C9ZB |
||||||
931 | V3X"B/MQ>V+Z^P]\LRGIZ0@AZSG&8HBIR@$K6"RT7F8 | ||||||
932 | H?:Y(+Z!6_-MZ!_MY@%0O6W,A-R>$/PYP}\*'2WQ>U0 tzdata94b.tar.gz | ||||||
933 | 4Q5*'`0U7[8T'PB!ZK0TLQF |
||||||
934 | HJI9PL[@OZ(PACO-DE%D9+P>IP27ZT[ADI^A*&.`[;$ tzdata94d.tar.gz | ||||||
935 | !&26XQE}R73F;Z+N^EZ6[ | ||||||
936 | %JRW?E*V"8ZL?">,+<9-46(2(O]QPH}2\7O1_B0CZH8 tzdata94e.tar.gz | ||||||
937 | N@[B'6*E*#`_S?V\9H'@KCL/-"X2@-_T4BB_$ZF92LD | ||||||
938 | &E_U6&'R'G;/96WT<%@}>B>}9P)E-$WF2Q$U*^NV^W0 tzdata94f.tar.gz | ||||||
939 | \S"*"*"]S*(4J*?0`!?JK*J3VB$K>:H'*3I+B2,/,/< | ||||||
940 | \HFZD[/9S\^0"^>;YX:}VM'@6V'<+G'?3T7B@8"GI>, tzdata94h.tar.gz | ||||||
941 | Q%}QNT@"/22*!A*Q_N8:89!B2}R | ||||||
942 | :P0'8'B\L@YW5TA?5N&;&5/`2G)D\YU:#4&VFSNG0I$ tzdata95b.tar.gz | ||||||
943 | 58M_*[QVF[$TIHIH]T&/II@8'3,X;8**ZGC;C}V5ZB\ | ||||||
944 | ?D))*MLAA1MG/.YBV8\:4GE'D/\[NY9]L<9}<9'NE3H tzdata95c.tar.gz | ||||||
945 | KQ<*10('\BR:?)GP?@4JIXCD:I8('8Y2^&84UZ&7FY, | ||||||
946 | >N_$OG\/G)DD.[J#[^0[C*%&LV5,(`R^-[?M;@JCS\( tzdata95d.tar.gz | ||||||
947 | /6U6ZXX(+>?\U03Z9}:-7"!L^>MEIK7)'9C5HH(WSW` | ||||||
948 | UK10ZN/RN8-;Y,;"E1"1#PGX&0HM]PDH | ||||||
949 | H"&BY$<4KZ7!71S&04)J#\'6]&82]AQKAB68P6\*0*P | ||||||
950 | <[D\C}_8PJ&_MSU"^[@H?-52}C5V]TDBRLH7X>J/U#, tzdata95f.tar.gz | ||||||
951 | G/2,5}W49@O:M}9(A#N3FT6-<**<")+G.<9@Y!;V!B\ | ||||||
952 | -ENM9%.#MB3?+1&68?/K//E7ZH^CUN<4B45(LNG5;?\ tzdata95g.tar.gz | ||||||
953 | L9}F1W`&)"$P@T&SBE2T*DFK.;&8>,M/"-BS:YD:#`0 | ||||||
954 | E@B_'/TXJ);[-4/'>CZG&EM;@$M_E2>'CHQC:?/QMWX tzdata95h.tar.gz | ||||||
955 | /U5IZ<;%-%/U0<3P^3(5M2BVT7\ | ||||||
956 | S(-M | ||||||
957 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
958 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzdata95j.tar.gz | ||||||
959 | R$]+?^89IS3!}FN8+,S!&,H8(S>I#C45MES$S#KX^%\ | ||||||
960 | :Y/7DH,A]95[+ZA9O#]&Y&BMV]"37)%(N/Y9G%0EV}L tzdata95k.tar.gz | ||||||
961 | G8T8F^UF`0M!R6LW3KR;}+^&G^KKZI4P,.]#D$5]6X@ | ||||||
962 | 2%^`'Y'VSV0/<<&?3W9074X%$*9:<^(#2*]S8UI>&7X tzdata95l.tar.gz | ||||||
963 | 'F$H':/>%]H>`OD"!3N.:6\\,V}IO.@&`3:I!2N:H`D | ||||||
964 | '7_ |
||||||
965 | &.W1T1O<\(IUQ$;3%]#N5OR4%2CBS((Q+%2W9WBA)RT | ||||||
966 | H2",;_G2S,IK6S/:9Z@5SQOC>35#};%\H0\(QZX3E7X tzdata96a.tar.gz | ||||||
967 | ;[5--'"@UVZ<6_7R2'69K9]LI^_NKK$Z7'?[?D)J"0\ | ||||||
968 | IYG-A$2V]JTJ4^.199<0M86/'#2_%F.1!&%}4A"?2Z$ tzdata96b.tar.gz | ||||||
969 | OH08*[]G6C7"1+()`Y$>W6}4}_>*A^}:;F]>^R!9^I( | ||||||
970 | $A'.>.)S}"N^:S}Z:/00BM8'90_MHJ*D^QIAYVV_;3\ tzdata96c.tar.gz | ||||||
971 | QB,?UNF6I/Y3#3+;P6.>6-@H_"Y*]/#4`;>CW_I<:SH | ||||||
972 | %M}$M):,^\^?Z[4,;_JH>SN+#H_<5,}^*!"H+XEEA`D tzdata96d.tar.gz | ||||||
973 | #O,UW,"*#<15#()N,GQC_/Y9O/L` | ||||||
974 | :2-JT#KZI0FJP-.LLXC#CW\!%L-U*C?>J*:@8K,)V>@ tzdata96e.tar.gz | ||||||
975 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
976 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzdata96f.tar.gz | ||||||
977 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
978 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzdata96g.tar.gz | ||||||
979 | ._'Q1`S6W[R?9_ZX1*JPC\TW,O5CW^DE"%YZ`6,:]/T | ||||||
980 | "+M_K7?DY5;W//<.`D}"/V;Z7_.??E\559ME4;1+(WH tzdata96h.tar.gz | ||||||
981 | ^5CS5<:'C?A'@"FA&EC'UJUN.,MD?Z5WP;A@ZA(/RG4 | ||||||
982 | FW'}]S6G:+FDJ"QZJ<}/0FC[RY^?ZQGKXY8OWE&P3%T tzdata96i.tar.gz | ||||||
983 | FD'\3M:VB7HFI+JI;(LKG^FYW6@W)IW'1+S-I-E)944 | ||||||
984 | '99V)&RW@>Z!4WB6N[`2!I64*`#DIN.?VO9P!2JAG>$ tzdata96k.tar.gz | ||||||
985 | ?&*!2]H`X6N>54;SG#YC#IF&4**`'5NIX4EV*%E>(2` | ||||||
986 | 6:CTF"UF/}I<`(QMUXUB | ||||||
987 | HASHES | ||||||
988 | |||||||
989 | sub _verify_sha512($$$) { | ||||||
990 | 0 | 0 | my($self, $localname, $canonname) = @_; | ||||
991 | 0 | 0 | unless(ref $archive_hash) { | ||||
992 | 0 | pos($archive_hash) = 0; | |||||
993 | 0 | my %ah; | |||||
994 | 0 | until($archive_hash =~ /\G\z/gc) { | |||||
995 | 0 | 0 | if($archive_hash =~ /\G([!-`\}]{43})\n([!-`\}]{43}) | ||||
0 | |||||||
996 | \ ([!-~]+)\n/xgc) { | ||||||
997 | 0 | my($h0, $h1, $name) = ($1, $2, $3); | |||||
998 | 0 | tr/}/=/ foreach $h0, $h1; | |||||
999 | 0 | $ah{$name} = unpack("u", "\@$h0`\n"). | |||||
1000 | unpack("u", "\@$h1`\n"); | ||||||
1001 | } elsif($archive_hash =~ /\G\~{43}\n\~{43} | ||||||
1002 | \ ([!-~]+)\n/xgc) { | ||||||
1003 | 0 | $ah{$1} = ""; | |||||
1004 | 0 | } else { die } | |||||
1005 | } | ||||||
1006 | 0 | $archive_hash = \%ah; | |||||
1007 | } | ||||||
1008 | 0 | my $rh = $archive_hash->{$canonname}; | |||||
1009 | 0 | 0 | defined $rh or die "attempt to check SHA-512 of unknown file\n"; | ||||
1010 | 0 | 0 | if($rh ne "") { | ||||
1011 | my $ch = filter("", "sha512sum", | ||||||
1012 | 0 | $self->{top_dir}."/".$localname); | |||||
1013 | 0 | 0 | $ch =~ /\A([0-9a-f]{128})\ +[!-~]+\n\z/ | ||||
1014 | or die "bizarre output from sha512sum\n"; | ||||||
1015 | 0 | 0 | pack("H*", $1) eq $rh or die "SHA-512 hash mismatch\n"; | ||||
1016 | } | ||||||
1017 | } | ||||||
1018 | |||||||
1019 | sub _init_ftp($$) { | ||||||
1020 | 0 | 0 | my($self, $hostname) = @_; | ||||
1021 | 0 | $self->{ftp_hostname} = $hostname; | |||||
1022 | 0 | 0 | $self->{ftp} = Net::FTP->new($hostname) | ||||
1023 | or die "FTP error on $hostname: $@\n"; | ||||||
1024 | } | ||||||
1025 | |||||||
1026 | sub _ftp_op($$@) { | ||||||
1027 | 0 | 0 | my($self, $method, @args) = @_; | ||||
1028 | $self->{ftp}->$method(@args) | ||||||
1029 | 0 | or die "FTP error on @{[$self->{ftp_hostname}]}: ". | |||||
1030 | 0 | 0 | $self->{ftp}->message; | ||||
1031 | } | ||||||
1032 | |||||||
1033 | sub _ftp_login($$$) { | ||||||
1034 | 0 | 0 | my($self, $hostname, $dirarray) = @_; | ||||
1035 | 0 | _init_ftp($self, $hostname); | |||||
1036 | 0 | _ftp_op($self, "login", "anonymous","-anonymous\@"); | |||||
1037 | 0 | _ftp_op($self, "binary"); | |||||
1038 | 0 | _ftp_op($self, "cwd", $_) foreach @$dirarray; | |||||
1039 | } | ||||||
1040 | |||||||
1041 | sub _ensure_ftp($) { | ||||||
1042 | 0 | 0 | my($self) = @_; | ||||
1043 | 0 | 0 | unless($self->{ftp}) { | ||||
1044 | # Always use IANA master. Could possibly look at mirrors, | ||||||
1045 | # but the IANA site is probably reliable enough. | ||||||
1046 | 0 | _ftp_login($self, "ftp.iana.org", ["tz", "releases"]); | |||||
1047 | } | ||||||
1048 | } | ||||||
1049 | |||||||
1050 | sub _cmp_version($$) { | ||||||
1051 | 0 | 0 | my($a, $b) = @_; | ||||
1052 | 0 | 0 | $a = "19".$a if $a =~ /\A[0-9]{2}(?:[a-z][23]?)?\z/; | ||||
1053 | 0 | 0 | $b = "19".$b if $b =~ /\A[0-9]{2}(?:[a-z][23]?)?\z/; | ||||
1054 | 0 | return $a cmp $b; | |||||
1055 | } | ||||||
1056 | |||||||
1057 | 0 | 0 | sub _ge_version($$) { _cmp_version($_[0], $_[1]) >= 0 } | ||||
1058 | |||||||
1059 | my $split_rels = q( | ||||||
1060 | 93 AA -b cc dd ee ff gg | ||||||
1061 | 94 -a bb c- dd e- f- g- -e -f hh | ||||||
1062 | 95 bb c- -c -d -e -f -g d- -h -i e- fj gk hl im | ||||||
1063 | 96 aa b- c- -b dc e- -d -e -f fg -h g- h- -i i- j- kk l- | ||||||
1064 | 1996 ml -m n- on | ||||||
1065 | 1997 aa bb -c cd de ef fg gh -i hj ik | ||||||
1066 | 1998 aa bb cc dd ee f- -f -g gh hi | ||||||
1067 | 1999 aa bb cc dd ee ff gg -h hi ij | ||||||
1068 | 2000 aa bb cc -d d- ee ff gg hh | ||||||
1069 | 2001 aa bb cc dd | ||||||
1070 | 2002 aa bb cc dd | ||||||
1071 | 2003 aa bb cc dd ee | ||||||
1072 | 2004 aa bb c- -d d- ee f- gg h- i- | ||||||
1073 | 2005 aa bb cc d- ee ff gg hh -i jj kk ll mm nn oo pp qq rr | ||||||
1074 | 2006 aa bb cc dd ee ff gg h- i- jj kk -l mm nn oo pp | ||||||
1075 | 2007 aa bb cc dd ee ff gg hh -i jj kk | ||||||
1076 | 2008 aa -b -c -d ee -f gg hh -i | ||||||
1077 | 2009 aa bb -c dd ee -f -g hh ii -j kk -l -m -n -o -p qq rr -s tt -u | ||||||
1078 | 2010 -a -b a- cc -d -e ff -g -h -i jj kk ll mm nn -o | ||||||
1079 | 2011 aa bb cc dd ee -f gg -h ii -j -k -l -m -n | ||||||
1080 | 2012 aa bb -c cd ee ff gg hh ii jj | ||||||
1081 | 2013 aa bb cc dd ee ff gg hh ii | ||||||
1082 | 2014 aa bb cc dd ee ff gg hh ii jj | ||||||
1083 | 2015 aa bb cc dd ee ff gg | ||||||
1084 | 2016 aa bb cc dd ee ff | ||||||
1085 | ); | ||||||
1086 | sub _split_rel_versions($) { | ||||||
1087 | 0 | 0 | my($version) = @_; | ||||
1088 | 0 | 0 | unless(ref $split_rels) { | ||||
1089 | 0 | my(%sr, $year, $cver, $dver, $lastver, $lastnum); | |||||
1090 | 0 | $lastver = ""; | |||||
1091 | 0 | foreach(split(" ", $split_rels)) { | |||||
1092 | 0 | 0 | if(/\A[0-9]/) { | ||||
1093 | 0 | $year = $_; | |||||
1094 | } else { | ||||||
1095 | 0 | my($cl, $dl) = (/\A(.)(.)\z/s); | |||||
1096 | 0 | 0 | $cver = $year.($cl eq "A" ? "" : $cl) | ||||
0 | |||||||
1097 | unless $cl eq "-"; | ||||||
1098 | 0 | 0 | $dver = $year.($dl eq "A" ? "" : $dl) | ||||
0 | |||||||
1099 | unless $dl eq "-"; | ||||||
1100 | 0 | 0 | my $ver = _ge_version($cver, $dver) ? | ||||
1101 | $cver : $dver; | ||||||
1102 | 0 | 0 | if($ver eq $lastver) { | ||||
1103 | 0 | $lastnum++; | |||||
1104 | 0 | $ver .= $lastnum; | |||||
1105 | } else { | ||||||
1106 | 0 | $lastver = $ver; | |||||
1107 | 0 | $lastnum = 1; | |||||
1108 | } | ||||||
1109 | 0 | $sr{$ver} = [ $cver, $dver ]; | |||||
1110 | } | ||||||
1111 | } | ||||||
1112 | 0 | $split_rels = \%sr; | |||||
1113 | } | ||||||
1114 | 0 | my $cdv = $split_rels->{$version}; | |||||
1115 | 0 | 0 | defined $cdv or die "no such Olson DB version `$version'\n"; | ||||
1116 | 0 | return $cdv; | |||||
1117 | } | ||||||
1118 | |||||||
1119 | sub _latest_version($) { | ||||||
1120 | 0 | 0 | my($self) = @_; | ||||
1121 | 0 | my $latest; | |||||
1122 | 0 | _ensure_ftp($self); | |||||
1123 | 0 | foreach(@{ | |||||
1124 | 0 | _ftp_op($self, "ls", "tzdb-[0-9][0-9][0-9][0-9][a-z].tar.lz") | |||||
1125 | }) { | ||||||
1126 | 0 | 0 | if(m#(?:\A|/)tzdb-([0-9]{4}[a-z])\.tar\.lz\z#) { | ||||
1127 | 0 | 0 | next unless _ge_version($1, "2016g"); | ||||
1128 | 0 | 0 | 0 | $latest = $1 | |||
1129 | if !defined($latest) || | ||||||
1130 | _ge_version($1, $latest); | ||||||
1131 | } | ||||||
1132 | } | ||||||
1133 | 0 | 0 | unless(defined $latest) { | ||||
1134 | 0 | die "no current timezone database found on ". | |||||
1135 | 0 | "@{[$self->{ftp_hostname}]}\n"; | |||||
1136 | } | ||||||
1137 | 0 | return $latest; | |||||
1138 | } | ||||||
1139 | |||||||
1140 | =head1 CLASS METHODS | ||||||
1141 | |||||||
1142 | =over | ||||||
1143 | |||||||
1144 | =item Time::OlsonTZ::Download->latest_version | ||||||
1145 | |||||||
1146 | Returns the version number of the latest available version of the Olson | ||||||
1147 | timezone database. This requires consulting the repository, but is much | ||||||
1148 | cheaper than actually downloading the database. | ||||||
1149 | |||||||
1150 | =cut | ||||||
1151 | |||||||
1152 | sub latest_version { | ||||||
1153 | 0 | 0 | 1 | my($class) = @_; | |||
1154 | 0 | 0 | croak "@{[__PACKAGE__]}->latest_version not called as a class method" | ||||
0 | |||||||
1155 | unless is_string($class); | ||||||
1156 | 0 | return _latest_version({}); | |||||
1157 | } | ||||||
1158 | |||||||
1159 | =back | ||||||
1160 | |||||||
1161 | =cut | ||||||
1162 | |||||||
1163 | sub DESTROY { | ||||||
1164 | 0 | 0 | my($self) = @_; | ||||
1165 | 0 | local($., $@, $!, $^E, $?); | |||||
1166 | 0 | 0 | rmtree($self->{top_dir}, 0, 0) if exists $self->{top_dir}; | ||||
1167 | } | ||||||
1168 | |||||||
1169 | =head1 CONSTRUCTORS | ||||||
1170 | |||||||
1171 | =over | ||||||
1172 | |||||||
1173 | =item Time::OlsonTZ::Download->new([VERSION]) | ||||||
1174 | |||||||
1175 | Downloads a copy of the source of the Olson database, and returns an | ||||||
1176 | object representing that copy. | ||||||
1177 | |||||||
1178 | I |
||||||
1179 | the database is to be downloaded. If not supplied, the latest available | ||||||
1180 | version will be downloaded. Version numbers for the Olson database | ||||||
1181 | currently consist of a year number and a lowercase letter, such as | ||||||
1182 | "C<2010k>". The letter advances with each release in a year. | ||||||
1183 | |||||||
1184 | Historical vesrions make the version numbers a bit more complicated. | ||||||
1185 | Prior to late 1996 the century portion of the year number was omitted, | ||||||
1186 | giving version numbers such as "C<96g>". Prior to 1994 the first release | ||||||
1187 | of each year omitted the letter "C", giving version numbers such as | ||||||
1188 | "C<93>" (with the second release of the year being "C<93b>"). | ||||||
1189 | |||||||
1190 | From 1993 to to late 2012 the database was split into `code' and `data' | ||||||
1191 | parts that could each be released without releasing a new version of the | ||||||
1192 | other part. Each part had its own version number, sometimes advancing | ||||||
1193 | independently of each other, and sometimes skipping sequence letters | ||||||
1194 | in order to catch up with the other part. Where the two parts of some | ||||||
1195 | version of the database have different version numbers, the version | ||||||
1196 | number of the database as a whole is whichever part's version number | ||||||
1197 | is higher. If this would give two database versions the same number, | ||||||
1198 | due to multiple releases of one part happening while the other part has | ||||||
1199 | a higher version number, a digit "C<2>" or "C<3>" is appended after the | ||||||
1200 | letter to distinguish the second and third such versions. | ||||||
1201 | |||||||
1202 | This module does not currently support downloading database versions | ||||||
1203 | earlier than version 93. One can expect to successfully download most | ||||||
1204 | versions from then on, but a handful are missing from the public archive. | ||||||
1205 | The public archive is complete from version 2006f onwards. Details of | ||||||
1206 | historical version availability may change in future. | ||||||
1207 | |||||||
1208 | =cut | ||||||
1209 | |||||||
1210 | sub _download_file($$$$$) { | ||||||
1211 | 0 | 0 | my($self, $remote_name, $local_name, $with_sig, $enoent) = @_; | ||||
1212 | 0 | my $tdir = $self->{top_dir}; | |||||
1213 | 0 | _ensure_ftp($self); | |||||
1214 | 0 | 0 | @{$self->_ftp_op("ls", $remote_name)} or $enoent->(); | ||||
0 | |||||||
1215 | 0 | $self->_ftp_op("get", $remote_name, "$tdir/$local_name"); | |||||
1216 | 0 | 0 | if($with_sig) { | ||||
1217 | 0 | $self->_ftp_op("get", "$remote_name.asc", | |||||
1218 | "$tdir/$local_name.asc"); | ||||||
1219 | } | ||||||
1220 | } | ||||||
1221 | |||||||
1222 | sub new { | ||||||
1223 | 0 | 0 | 1 | my($class, $version) = @_; | |||
1224 | 0 | 0 | 0 | die "malformed Olson version number `$version'\n" | |||
0 | |||||||
1225 | unless is_undef($version) || | ||||||
1226 | (is_string($version) && | ||||||
1227 | $version =~ /\A[0-9]{2}(?:[0-9]{2})? | ||||||
1228 | (?:[a-z][23]?)?\z/x); | ||||||
1229 | 0 | my $self = bless({}, $class); | |||||
1230 | 0 | 0 | $version ||= $self->_latest_version; | ||||
1231 | 0 | $self->{version} = $version; | |||||
1232 | 0 | my $tdir = tempdir(); | |||||
1233 | 0 | $self->{top_dir} = $tdir; | |||||
1234 | 0 | $self->{olson_dir} = "$tdir/c"; | |||||
1235 | 0 | filter("", "mkdir", $self->{olson_dir}); | |||||
1236 | 0 | 0 | if(_ge_version($version, "2016g")) { | ||||
0 | |||||||
1237 | 0 | $self->{code_version} = $version; | |||||
1238 | 0 | $self->{data_version} = $version; | |||||
1239 | _download_file($self, "tzdb-$version.tar.lz", "tzdb.tar.lz", 1, | ||||||
1240 | 0 | 0 | sub () { die "no such Olson DB version `$version'\n" }); | ||||
0 | |||||||
1241 | 0 | _verify_signature($self, "tzdb.tar.lz"); | |||||
1242 | filter("", "tar", "-xO", "--lzip", | ||||||
1243 | 0 | 0 | "-f", $self->{top_dir}."/tzdb.tar.lz", | ||||
1244 | "tzdb-$version/version") eq "$version\n" | ||||||
1245 | or die "tzdb.tar.lz is not the expected version\n"; | ||||||
1246 | } elsif(_ge_version($version, "93")) { | ||||||
1247 | 0 | my($cver, $dver) = @{_split_rel_versions($version)}; | |||||
0 | |||||||
1248 | 0 | foreach(["code", $cver], ["data", $dver]) { | |||||
1249 | 0 | my($part, $pver) = @$_; | |||||
1250 | 0 | $self->{"${part}_version"} = $pver; | |||||
1251 | 0 | 0 | my $zext = _ge_version($pver, "93g") ? "gz" : "Z"; | ||||
1252 | 0 | my $rname = "tz$part$pver.tar.$zext"; | |||||
1253 | 0 | $rname =~ s/\Atz(?=code2006b.tar.gz\z)/tz64/; | |||||
1254 | _download_file($self, $rname, "tz$part.tar.gz", 0, | ||||||
1255 | sub () { | ||||||
1256 | 0 | 0 | die "file $rname is not available on ". | ||||
1257 | 0 | "@{[$self->{ftp_hostname}]}\n"; | |||||
1258 | 0 | }); | |||||
1259 | 0 | _verify_sha512($self, "tz$part.tar.gz", $rname); | |||||
1260 | } | ||||||
1261 | } else { | ||||||
1262 | 0 | die "Olson DB version $version is too early for this module\n"; | |||||
1263 | } | ||||||
1264 | 0 | delete $self->{ftp}; | |||||
1265 | 0 | delete $self->{ftp_hostname}; | |||||
1266 | 0 | $self->{downloaded} = 1; | |||||
1267 | 0 | return $self; | |||||
1268 | } | ||||||
1269 | |||||||
1270 | =item Time::OlsonTZ::Download->new_from_local_source(ATTR => VALUE, ...) | ||||||
1271 | |||||||
1272 | Acquires Olson database source locally, without downloading, and returns | ||||||
1273 | an object representing a copy of it ready to use like a download. | ||||||
1274 | This can be used to work with locally-modified versions of the database. | ||||||
1275 | The following attributes may be given: | ||||||
1276 | |||||||
1277 | =over | ||||||
1278 | |||||||
1279 | =item B |
||||||
1280 | |||||||
1281 | Local directory containing Olson source files. Must be supplied. | ||||||
1282 | The entire directory will be copied into a temporary location to be | ||||||
1283 | worked on. | ||||||
1284 | |||||||
1285 | =item B |
||||||
1286 | |||||||
1287 | Olson version number to attribute to the source files. Must be supplied. | ||||||
1288 | |||||||
1289 | =item B |
||||||
1290 | |||||||
1291 | =item B |
||||||
1292 | |||||||
1293 | Olson version number to attribute to the code and data parts of the | ||||||
1294 | source files. Both default to the main version number. | ||||||
1295 | |||||||
1296 | =back | ||||||
1297 | |||||||
1298 | =cut | ||||||
1299 | |||||||
1300 | sub new_from_local_source { | ||||||
1301 | 0 | 0 | 1 | my $class = shift; | |||
1302 | 0 | my $self = bless({}, $class); | |||||
1303 | 0 | my $srcdir; | |||||
1304 | 0 | while(@_) { | |||||
1305 | 0 | my $attr = shift; | |||||
1306 | 0 | my $value = shift; | |||||
1307 | 0 | 0 | if($attr eq "source_dir") { | ||||
0 | |||||||
0 | |||||||
1308 | 0 | 0 | croak "source directory specified redundantly" | ||||
1309 | if defined $srcdir; | ||||||
1310 | 0 | 0 | croak "source directory must be a string" | ||||
1311 | unless is_string($value); | ||||||
1312 | 0 | $srcdir = $value; | |||||
1313 | } elsif($attr eq "version") { | ||||||
1314 | croak "version specified redundantly" | ||||||
1315 | 0 | 0 | if exists $self->{version}; | ||||
1316 | 0 | 0 | 0 | die "malformed Olson version number `$value'\n" | |||
1317 | unless is_string($value) && | ||||||
1318 | $value =~ /\A[0-9]{2}(?:[0-9]{2})? | ||||||
1319 | (?:[a-z][23]?)?\z/x; | ||||||
1320 | 0 | $self->{version} = $value; | |||||
1321 | } elsif($attr =~ /\A(?:code|data)_version\z/) { | ||||||
1322 | croak "$attr specified redundantly" | ||||||
1323 | 0 | 0 | if exists $self->{$attr}; | ||||
1324 | 0 | 0 | 0 | die "malformed Olson part version number `$value'\n" | |||
1325 | unless is_string($value) && | ||||||
1326 | $value =~ /\A[0-9]{2}(?:[0-9]{2})? | ||||||
1327 | [a-z]?\z/x; | ||||||
1328 | 0 | $self->{$attr} = $value; | |||||
1329 | } else { | ||||||
1330 | 0 | croak "unrecognised attribute `$attr'"; | |||||
1331 | } | ||||||
1332 | } | ||||||
1333 | 0 | 0 | croak "source directory not specified" unless defined $srcdir; | ||||
1334 | 0 | 0 | croak "version number not specified" unless exists $self->{version}; | ||||
1335 | 0 | foreach(qw(code_version data_version)) { | |||||
1336 | 0 | 0 | $self->{$_} = $self->{version} unless exists $self->{$_}; | ||||
1337 | } | ||||||
1338 | 0 | my $tdir = tempdir(); | |||||
1339 | 0 | $self->{top_dir} = $tdir; | |||||
1340 | 0 | $self->{olson_dir} = "$tdir/c"; | |||||
1341 | 0 | 0 | $srcdir = "./$srcdir" unless $srcdir =~ m#\A\.?/#; | ||||
1342 | 0 | filter("", "cp", "-pr", $srcdir, $self->{olson_dir}); | |||||
1343 | 0 | $self->{downloaded} = 1; | |||||
1344 | 0 | $self->{unpacked} = 1; | |||||
1345 | 0 | return $self; | |||||
1346 | } | ||||||
1347 | |||||||
1348 | =back | ||||||
1349 | |||||||
1350 | =head1 METHODS | ||||||
1351 | |||||||
1352 | =head2 Basic information | ||||||
1353 | |||||||
1354 | =over | ||||||
1355 | |||||||
1356 | =item $download->version | ||||||
1357 | |||||||
1358 | Returns the version number of the database of which a copy is represented | ||||||
1359 | by this object. | ||||||
1360 | |||||||
1361 | The database consists of code and data parts which are updated | ||||||
1362 | semi-independently. The latest version of the database as a whole | ||||||
1363 | consists of the latest version of the code and the latest version of | ||||||
1364 | the data. If both parts are updated at once then they will both get the | ||||||
1365 | same version number, and that will be the version number of the database | ||||||
1366 | as a whole. However, in general they may be updated at different times, | ||||||
1367 | and a single version of the database may be made up of code and data | ||||||
1368 | parts that have different version numbers. The version number of the | ||||||
1369 | database as a whole will then be the version number of the most recently | ||||||
1370 | updated part. | ||||||
1371 | |||||||
1372 | =cut | ||||||
1373 | |||||||
1374 | sub version { | ||||||
1375 | 0 | 0 | 1 | my($self) = @_; | |||
1376 | die "Olson database version not determined\n" | ||||||
1377 | 0 | 0 | unless exists $self->{version}; | ||||
1378 | 0 | return $self->{version}; | |||||
1379 | } | ||||||
1380 | |||||||
1381 | =item $download->code_version | ||||||
1382 | |||||||
1383 | Returns the version number of the code part of the database of which a | ||||||
1384 | copy is represented by this object. | ||||||
1385 | |||||||
1386 | =cut | ||||||
1387 | |||||||
1388 | sub code_version { | ||||||
1389 | 0 | 0 | 1 | my($self) = @_; | |||
1390 | die "Olson database code version not determined\n" | ||||||
1391 | 0 | 0 | unless exists $self->{code_version}; | ||||
1392 | 0 | return $self->{code_version}; | |||||
1393 | } | ||||||
1394 | |||||||
1395 | =item $download->data_version | ||||||
1396 | |||||||
1397 | Returns the version number of the data part of the database of which a | ||||||
1398 | copy is represented by this object. | ||||||
1399 | |||||||
1400 | =cut | ||||||
1401 | |||||||
1402 | sub data_version { | ||||||
1403 | 0 | 0 | 1 | my($self) = @_; | |||
1404 | die "Olson database data version not determined\n" | ||||||
1405 | 0 | 0 | unless exists $self->{data_version}; | ||||
1406 | 0 | return $self->{data_version}; | |||||
1407 | } | ||||||
1408 | |||||||
1409 | =item $download->dir | ||||||
1410 | |||||||
1411 | Returns the pathname of the directory in which the files of this download | ||||||
1412 | are located. With this method, there is no guarantee of particular | ||||||
1413 | files being available in the directory; see other directory-related | ||||||
1414 | methods below that establish particular directory contents. | ||||||
1415 | |||||||
1416 | The directory does not move during the lifetime of the download object: | ||||||
1417 | this method will always return the same pathname. The directory and | ||||||
1418 | all of its contents, including subdirectories, will be automatically | ||||||
1419 | deleted when this object is destroyed. This will be when the main | ||||||
1420 | program terminates, if it is not otherwise destroyed. Any files that | ||||||
1421 | it is desired to keep must be copied to a permanent location. | ||||||
1422 | |||||||
1423 | =cut | ||||||
1424 | |||||||
1425 | sub dir { | ||||||
1426 | 0 | 0 | 1 | my($self) = @_; | |||
1427 | die "download directory not created\n" | ||||||
1428 | 0 | 0 | unless exists $self->{olson_dir}; | ||||
1429 | 0 | return $self->{olson_dir}; | |||||
1430 | } | ||||||
1431 | |||||||
1432 | sub _ensure_downloaded { | ||||||
1433 | 0 | 0 | my($self) = @_; | ||||
1434 | die "can't use download because downloading failed\n" | ||||||
1435 | 0 | 0 | unless $self->{downloaded}; | ||||
1436 | } | ||||||
1437 | |||||||
1438 | sub _ensure_unpacked { | ||||||
1439 | 0 | 0 | my($self) = @_; | ||||
1440 | 0 | 0 | unless($self->{unpacked}) { | ||||
1441 | 0 | $self->_ensure_downloaded; | |||||
1442 | 0 | 0 | if(_ge_version($self->{version}, "2016g")) { | ||||
1443 | filter("", "tar", "-C", $self->dir, | ||||||
1444 | "-x", "--strip-components=1", "--lzip", | ||||||
1445 | 0 | "-f", $self->{top_dir}."/tzdb.tar.lz"); | |||||
1446 | } else { | ||||||
1447 | 0 | foreach my $part (qw(tzcode tzdata)) { | |||||
1448 | filter("", "tar", "-C", $self->dir, | ||||||
1449 | "-x", "--gzip", | ||||||
1450 | 0 | "-f", $self->{top_dir}."/$part.tar.gz"); | |||||
1451 | } | ||||||
1452 | } | ||||||
1453 | 0 | $self->{unpacked} = 1; | |||||
1454 | } | ||||||
1455 | } | ||||||
1456 | |||||||
1457 | =item $download->unpacked_dir | ||||||
1458 | |||||||
1459 | Returns the pathname of the directory in which the downloaded source | ||||||
1460 | files have been unpacked. This is the local temporary directory used | ||||||
1461 | by this download. This method will unpack the files there if they have | ||||||
1462 | not already been unpacked. | ||||||
1463 | |||||||
1464 | =cut | ||||||
1465 | |||||||
1466 | sub unpacked_dir { | ||||||
1467 | 0 | 0 | 1 | my($self) = @_; | |||
1468 | 0 | $self->_ensure_unpacked; | |||||
1469 | 0 | return $self->dir; | |||||
1470 | } | ||||||
1471 | |||||||
1472 | =back | ||||||
1473 | |||||||
1474 | =head2 Zone metadata | ||||||
1475 | |||||||
1476 | =over | ||||||
1477 | |||||||
1478 | =cut | ||||||
1479 | |||||||
1480 | sub _ensure_canonnames_and_rawlinks { | ||||||
1481 | 0 | 0 | my($self) = @_; | ||||
1482 | 0 | 0 | unless(exists $self->{canonical_names}) { | ||||
1483 | 0 | my %seen; | |||||
1484 | my %canonnames; | ||||||
1485 | 0 | my %rawlinks; | |||||
1486 | 0 | foreach(@{$self->zic_input_files}) { | |||||
0 | |||||||
1487 | 0 | 0 | my $fh = IO::File->new($_, "r") | ||||
1488 | or die "data file $_ unreadable: $!\n"; | ||||||
1489 | 0 | local $/ = "\n"; | |||||
1490 | 0 | while(defined(my $line = $fh->getline)) { | |||||
1491 | 0 | 0 | if($line =~ /\A[Zz](?:[Oo](?:[Nn][Ee]?)?)? | ||||
0 | |||||||
1492 | [ \t]+([!-~]+)[ \t\n]/x) { | ||||||
1493 | 0 | my $name = $1; | |||||
1494 | die "zone $name multiply defined\n" | ||||||
1495 | 0 | 0 | if exists $seen{$name}; | ||||
1496 | 0 | $seen{$name} = undef; | |||||
1497 | 0 | $canonnames{$name} = undef; | |||||
1498 | } elsif($line =~ /\A[Ll](?:[Ii](?:[Nn][Kk]?)?)? | ||||||
1499 | [\ \t]+([!-~]+)[\ \t]+ | ||||||
1500 | ([!-~]+)[\ \t\n]/x) { | ||||||
1501 | 0 | my($target, $name) = ($1, $2); | |||||
1502 | die "zone $name multiply defined\n" | ||||||
1503 | 0 | 0 | if exists $seen{$name}; | ||||
1504 | 0 | $seen{$name} = undef; | |||||
1505 | 0 | $rawlinks{$name} = $target; | |||||
1506 | } | ||||||
1507 | } | ||||||
1508 | } | ||||||
1509 | 0 | $self->{raw_links} = \%rawlinks; | |||||
1510 | 0 | $self->{canonical_names} = \%canonnames; | |||||
1511 | } | ||||||
1512 | } | ||||||
1513 | |||||||
1514 | =item $download->canonical_names | ||||||
1515 | |||||||
1516 | Returns the set of timezone names that this version of the database | ||||||
1517 | defines as canonical. These are the timezone names that are directly | ||||||
1518 | associated with a set of observance data. The return value is a reference | ||||||
1519 | to a hash, in which the keys are the canonical timezone names and the | ||||||
1520 | values are all C |
||||||
1521 | |||||||
1522 | =cut | ||||||
1523 | |||||||
1524 | sub canonical_names { | ||||||
1525 | 0 | 0 | 1 | my($self) = @_; | |||
1526 | 0 | $self->_ensure_canonnames_and_rawlinks; | |||||
1527 | 0 | return $self->{canonical_names}; | |||||
1528 | } | ||||||
1529 | |||||||
1530 | =item $download->link_names | ||||||
1531 | |||||||
1532 | Returns the set of timezone names that this version of the database | ||||||
1533 | defines as links. These are the timezone names that are aliases for | ||||||
1534 | other names. The return value is a reference to a hash, in which the | ||||||
1535 | keys are the link timezone names and the values are all C |
||||||
1536 | |||||||
1537 | =cut | ||||||
1538 | |||||||
1539 | sub link_names { | ||||||
1540 | 0 | 0 | 1 | my($self) = @_; | |||
1541 | 0 | 0 | unless(exists $self->{link_names}) { | ||||
1542 | $self->{link_names} = | ||||||
1543 | 0 | { map { ($_ => undef) } keys %{$self->raw_links} }; | |||||
0 | |||||||
0 | |||||||
1544 | } | ||||||
1545 | 0 | return $self->{link_names}; | |||||
1546 | } | ||||||
1547 | |||||||
1548 | =item $download->all_names | ||||||
1549 | |||||||
1550 | Returns the set of timezone names that this version of the database | ||||||
1551 | defines. These are the L and the L. | ||||||
1552 | The return value is a reference to a hash, in which the keys are the | ||||||
1553 | timezone names and the values are all C |
||||||
1554 | |||||||
1555 | =cut | ||||||
1556 | |||||||
1557 | sub all_names { | ||||||
1558 | 0 | 0 | 1 | my($self) = @_; | |||
1559 | 0 | 0 | unless(exists $self->{all_names}) { | ||||
1560 | $self->{all_names} = { | ||||||
1561 | 0 | %{$self->canonical_names}, | |||||
1562 | 0 | %{$self->link_names}, | |||||
0 | |||||||
1563 | }; | ||||||
1564 | } | ||||||
1565 | 0 | return $self->{all_names}; | |||||
1566 | } | ||||||
1567 | |||||||
1568 | =item $download->raw_links | ||||||
1569 | |||||||
1570 | Returns details of the timezone name links in this version of the | ||||||
1571 | database. Each link defines one timezone name as an alias for some | ||||||
1572 | other timezone name. The return value is a reference to a hash, in | ||||||
1573 | which the keys are the aliases and each value is the preferred timezone | ||||||
1574 | name to which that alias directly refers. It is possible for an alias | ||||||
1575 | to point to another alias, or to point to a non-existent name. For a | ||||||
1576 | more processed view of links, see L. | ||||||
1577 | |||||||
1578 | =cut | ||||||
1579 | |||||||
1580 | sub raw_links { | ||||||
1581 | 0 | 0 | 1 | my($self) = @_; | |||
1582 | 0 | $self->_ensure_canonnames_and_rawlinks; | |||||
1583 | 0 | return $self->{raw_links}; | |||||
1584 | } | ||||||
1585 | |||||||
1586 | =item $download->threaded_links | ||||||
1587 | |||||||
1588 | Returns details of the timezone name links in this version of the | ||||||
1589 | database. Each link defines one timezone name as an alias for some | ||||||
1590 | other timezone name. The return value is a reference to a hash, in | ||||||
1591 | which the keys are the aliases and each value is the canonical name of | ||||||
1592 | the timezone to which that alias refers. All such canonical names can | ||||||
1593 | be found in the L hash. | ||||||
1594 | |||||||
1595 | =cut | ||||||
1596 | |||||||
1597 | sub threaded_links { | ||||||
1598 | 0 | 0 | 1 | my($self) = @_; | |||
1599 | 0 | 0 | unless(exists $self->{threaded_links}) { | ||||
1600 | 0 | my $raw_links = $self->raw_links; | |||||
1601 | 0 | my %links = %$raw_links; | |||||
1602 | 0 | while(1) { | |||||
1603 | 0 | my $done_any; | |||||
1604 | 0 | foreach(keys %links) { | |||||
1605 | 0 | 0 | next unless exists $raw_links->{$links{$_}}; | ||||
1606 | 0 | $links{$_} = $raw_links->{$links{$_}}; | |||||
1607 | 0 | 0 | die "circular link at $_\n" if $links{$_} eq $_; | ||||
1608 | 0 | $done_any = 1; | |||||
1609 | } | ||||||
1610 | 0 | 0 | last unless $done_any; | ||||
1611 | } | ||||||
1612 | 0 | my $canonical_names = $self->canonical_names; | |||||
1613 | 0 | foreach(keys %links) { | |||||
1614 | die "link from $_ to non-existent zone $links{$_}\n" | ||||||
1615 | 0 | 0 | unless exists $canonical_names->{$links{$_}}; | ||||
1616 | } | ||||||
1617 | 0 | $self->{threaded_links} = \%links; | |||||
1618 | } | ||||||
1619 | 0 | return $self->{threaded_links}; | |||||
1620 | } | ||||||
1621 | |||||||
1622 | =item $download->country_selection | ||||||
1623 | |||||||
1624 | Returns information about how timezones relate to countries, intended | ||||||
1625 | to aid humans in selecting a geographical timezone. This information | ||||||
1626 | is derived from the C |
||||||
1627 | source. | ||||||
1628 | |||||||
1629 | The return value is a reference to a hash, keyed by (ISO 3166 alpha-2 | ||||||
1630 | uppercase) country code. The value for each country is a hash containing | ||||||
1631 | these values: | ||||||
1632 | |||||||
1633 | =over | ||||||
1634 | |||||||
1635 | =item B |
||||||
1636 | |||||||
1637 | The ISO 3166 alpha-2 uppercase country code. | ||||||
1638 | |||||||
1639 | =item B |
||||||
1640 | |||||||
1641 | An English name for the country, possibly in a modified form, optimised | ||||||
1642 | to help humans find the right entry in alphabetical lists. This is | ||||||
1643 | not necessarily identical to the country's standard short or long name. | ||||||
1644 | (For other forms of the name, consult a database of countries, keying | ||||||
1645 | by the country code.) | ||||||
1646 | |||||||
1647 | =item B |
||||||
1648 | |||||||
1649 | Information about the regions of the country that use distinct | ||||||
1650 | timezones. This is a hash, keyed by English description of the region. | ||||||
1651 | The description is empty if there is only one region. The value for | ||||||
1652 | each region is a hash containing these values: | ||||||
1653 | |||||||
1654 | =over | ||||||
1655 | |||||||
1656 | =item B |
||||||
1657 | |||||||
1658 | Brief English description of the region, used to distinguish between | ||||||
1659 | the regions of a single country. Empty string if the country has only | ||||||
1660 | one region for timezone purposes. (This is the same string used as the | ||||||
1661 | key in the B |
||||||
1662 | |||||||
1663 | =item B |
||||||
1664 | |||||||
1665 | Name of the Olson timezone used in this region. This is not necessarily | ||||||
1666 | a canonical name (it may be a link). Typically, where there are aliases | ||||||
1667 | or identical canonical zones, a name is chosen that refers to a location | ||||||
1668 | in the country of interest. It is not guaranteed that the named timezone | ||||||
1669 | exists in the database (though it always should). | ||||||
1670 | |||||||
1671 | =item B |
||||||
1672 | |||||||
1673 | Geographical coordinates of some point within the location referred to in | ||||||
1674 | the timezone name. This is a latitude and longitude, in ISO 6709 format. | ||||||
1675 | |||||||
1676 | =back | ||||||
1677 | |||||||
1678 | =back | ||||||
1679 | |||||||
1680 | This data structure is intended to help a human select the appropriate | ||||||
1681 | timezone based on political geography, specifically working from a | ||||||
1682 | selection of country. It is of essentially no use for any other purpose. | ||||||
1683 | It is not strictly guaranteed that every geographical timezone in the | ||||||
1684 | database is listed somewhere in this structure, so it is of limited use | ||||||
1685 | in providing information about an already-selected timezone. It does | ||||||
1686 | not include non-geographic timezones at all. It also does not claim | ||||||
1687 | to be a comprehensive list of countries, and does not make any claims | ||||||
1688 | regarding the political status of any entity listed: the "country" | ||||||
1689 | classification is loose, and used only for identification purposes. | ||||||
1690 | |||||||
1691 | =cut | ||||||
1692 | |||||||
1693 | sub country_selection { | ||||||
1694 | 0 | 0 | 1 | my($self) = @_; | |||
1695 | 0 | 0 | unless(exists $self->{country_selection}) { | ||||
1696 | 0 | my $itabname = $self->unpacked_dir."/iso3166.tab"; | |||||
1697 | 0 | my $ztabname = $self->unpacked_dir."/zone.tab"; | |||||
1698 | 0 | local $/ = "\n"; | |||||
1699 | 0 | my %itab; | |||||
1700 | 0 | 0 | my $itabfh = IO::File->new($itabname, "r") | ||||
1701 | or die "data file $itabname unreadable: $!\n"; | ||||||
1702 | 0 | while(defined(my $line = $itabfh->getline)) { | |||||
1703 | 0 | $line = decode("UTF-8", $line, FB_CROAK); | |||||
1704 | 0 | utf8::upgrade($line); | |||||
1705 | 0 | 0 | if($line =~ /\A([A-Z]{2})\t(\S[^\t\n]*\S)\n\z/) { | ||||
0 | |||||||
1706 | die "duplicate $itabname entry for $1\n" | ||||||
1707 | 0 | 0 | if exists $itab{$1}; | ||||
1708 | 0 | $itab{$1} = $2; | |||||
1709 | } elsif($line !~ /\A#[^\n]*\n\z/) { | ||||||
1710 | 0 | die "bad line in $itabname\n"; | |||||
1711 | } | ||||||
1712 | } | ||||||
1713 | 0 | my %sel; | |||||
1714 | 0 | 0 | my $ztabfh = IO::File->new($ztabname, "r") | ||||
1715 | or die "data file $ztabname unreadable: $!\n"; | ||||||
1716 | 0 | while(defined(my $line = $ztabfh->getline)) { | |||||
1717 | 0 | 0 | if($line =~ /\A([A-Z]{2}) | ||||
0 | |||||||
1718 | \t([-+][0-9]{4}(?:[0-9]{2})? | ||||||
1719 | [-+][0-9]{5}(?:[0-9]{2})?) | ||||||
1720 | \t([!-~]+) | ||||||
1721 | (?:\t([!-~][ -~]*[!-~]))? | ||||||
1722 | \n\z/x) { | ||||||
1723 | 0 | my($cc, $coord, $zn, $reg) = ($1, $2, $3, $4); | |||||
1724 | 0 | 0 | $reg = "" unless defined $reg; | ||||
1725 | 0 | 0 | $sel{$cc} ||= { regions => {} }; | ||||
1726 | die "duplicate $ztabname entry for $cc\n" | ||||||
1727 | 0 | 0 | if exists $sel{$cc}->{regions}->{$reg}; | ||||
1728 | 0 | $sel{$cc}->{regions}->{$reg} = { | |||||
1729 | olson_description => $reg, | ||||||
1730 | timezone_name => $zn, | ||||||
1731 | location_coords => $coord, | ||||||
1732 | }; | ||||||
1733 | } elsif($line !~ /\A#[^\n]*\n\z/) { | ||||||
1734 | 0 | die "bad line in $ztabname\n"; | |||||
1735 | } | ||||||
1736 | } | ||||||
1737 | 0 | foreach(keys %sel) { | |||||
1738 | 0 | 0 | die "unknown country $_\n" unless exists $itab{$_}; | ||||
1739 | 0 | $sel{$_}->{alpha2_code} = $_; | |||||
1740 | 0 | $sel{$_}->{olson_name} = $itab{$_}; | |||||
1741 | die "bad region description in $_\n" | ||||||
1742 | 0 | if keys(%{$sel{$_}->{regions}}) == 1 xor | |||||
1743 | 0 | 0 | 0 | exists($sel{$_}->{regions}->{""}); | |||
1744 | } | ||||||
1745 | 0 | $self->{country_selection} = \%sel; | |||||
1746 | } | ||||||
1747 | 0 | return $self->{country_selection}; | |||||
1748 | } | ||||||
1749 | |||||||
1750 | =back | ||||||
1751 | |||||||
1752 | =head2 Compiling zone data | ||||||
1753 | |||||||
1754 | =over | ||||||
1755 | |||||||
1756 | =item $download->source_data_files | ||||||
1757 | |||||||
1758 | Returns a reference to an array containing the pathnames of all the source | ||||||
1759 | data files. These express the database's data (i.e., a description | ||||||
1760 | of known civil timezones) in a textual format, and are intended for | ||||||
1761 | human editing. They are located in the local temporary directory used | ||||||
1762 | by this download. | ||||||
1763 | |||||||
1764 | There is normally approximately one source data file per continent, | ||||||
1765 | though this arrangement could change in the future. The textual format | ||||||
1766 | is machine parseable, the same format intended for input to C |
||||||
1767 | when interpreted this way the files do not necessarily correspond to the | ||||||
1768 | the official content of the database. There may be transformations that | ||||||
1769 | the database code would normally apply between the source data files | ||||||
1770 | and the actual input to C |
||||||
1771 | |||||||
1772 | If you intend to parse the source, taking the place of C |
||||||
1773 | should prefer to use the L method, which provides the | ||||||
1774 | input that C |
||||||
1775 | |||||||
1776 | =cut | ||||||
1777 | |||||||
1778 | sub source_data_files { | ||||||
1779 | 0 | 0 | 1 | my($self) = @_; | |||
1780 | 0 | 0 | unless(exists $self->{source_data_files}) { | ||||
1781 | 0 | my $list; | |||||
1782 | 0 | $self->_ensure_unpacked; | |||||
1783 | 0 | my $mf = IO::File->new($self->dir."/Makefile", "r"); | |||||
1784 | 0 | 0 | my $mfc = $mf ? do { local $/ = undef; $mf->getline } : ""; | ||||
0 | |||||||
0 | |||||||
1785 | 0 | my $datavars = "\$(TDATA)"; | |||||
1786 | 0 | 0 | 0 | if($mfc =~ m# | |||
0 | |||||||
1787 | \nfulldata\.zi(?:[\ \t]+[0-9A-Z_a-z]+\.zi)*[\ \t]*: | ||||||
1788 | [\ \t]+\$\(DSTDATA_ZI_DEPS\)[\ \t]*\n | ||||||
1789 | \t[\ \t]*\$\(AWK\)\ -v\ outfile\=\'\$\@\' | ||||||
1790 | \ -f\ zidst\.awk | ||||||
1791 | \ \$\(TDATA\)\ \$\(PACKRATDATA\) | ||||||
1792 | \ (?:\\\n\t[\ \t]*)?\>\$\@.out\n | ||||||
1793 | \t[\ \t]*mv\ \$\@\.out\ \$\@\n[^\t] | ||||||
1794 | #x || $mfc =~ m# | ||||||
1795 | \ntzdata\.zi:[\ \t]+\$\(TZDATA_ZI_DEPS\)[\ \t]*\n | ||||||
1796 | (?:\t[\ \t]*version=\`sed\ 1q\ version\`\ \&\&\ \\\n)? | ||||||
1797 | \t[\ \t]*LC_ALL=C\ \$\(AWK\) | ||||||
1798 | (?:\ -v\ version="\$\$version")? | ||||||
1799 | \ -f\ zishrink\.awk | ||||||
1800 | \ (?:\\\n\t[\ \t]*)? | ||||||
1801 | \$\(TDATA\)\ \$\(PACKRATDATA\)\ \>\$\@.out\n | ||||||
1802 | \t[\ \t]*mv\ \$\@\.out\ \$\@\n\n | ||||||
1803 | #x) { | ||||||
1804 | 0 | $datavars .= " \$(PACKRATDATA)"; | |||||
1805 | } elsif($mfc =~ m#\ntzdata\.zi:#) { | ||||||
1806 | 0 | die "don't know how to extract source data file names ". | |||||
1807 | "from this form of Olson distribution\n"; | ||||||
1808 | } | ||||||
1809 | 0 | $list = filter("", "make", "--no-print-directory", | |||||
1810 | "-C", $self->dir, "names", | ||||||
1811 | "ENCHILADA=$datavars", "VERSION_DEPS="); | ||||||
1812 | 0 | $list =~ s#\n\z##; | |||||
1813 | $self->{source_data_files} = | ||||||
1814 | 0 | [ map { $self->dir."/".$_ } split(/ /, $list) ]; | |||||
0 | |||||||
1815 | } | ||||||
1816 | 0 | return $self->{source_data_files}; | |||||
1817 | } | ||||||
1818 | |||||||
1819 | =item $download->zic_input_files | ||||||
1820 | |||||||
1821 | Returns a reference to an array containing the pathnames of all the | ||||||
1822 | data files that would normally be fed to C |
||||||
1823 | database's data (i.e., a description of known civil timezones) in | ||||||
1824 | the format expected by C |
||||||
1825 | They are located in the local temporary directory used by this download. | ||||||
1826 | This method will build the files if they didn't already exist. | ||||||
1827 | |||||||
1828 | The C |
||||||
1829 | editing. In older versions of the database they are such source files, | ||||||
1830 | but from database version C<2017c> onwards there is a single C |
||||||
1831 | file, which is generated from the source files and omits the niceties of | ||||||
1832 | the source files. From database version C<2018d> onwards there is some | ||||||
1833 | transformation between the source files and the C |
||||||
1834 | they do not necessarily express the same data when parsed by C |
||||||
1835 | These arrangements could change again in the future. | ||||||
1836 | |||||||
1837 | The textual format of C |
||||||
1838 | to the Olson database. Parsing it directly is in principle a dubious | ||||||
1839 | proposition, but in practice it is very stable. | ||||||
1840 | |||||||
1841 | If you want the human-editable source form of the data, use the | ||||||
1842 | L method instead. | ||||||
1843 | |||||||
1844 | =cut | ||||||
1845 | |||||||
1846 | sub zic_input_files { | ||||||
1847 | 0 | 0 | 1 | my($self) = @_; | |||
1848 | 0 | 0 | unless(exists $self->{zic_input_files}) { | ||||
1849 | 0 | $self->_ensure_unpacked; | |||||
1850 | 0 | my $mf = IO::File->new($self->dir."/Makefile", "r"); | |||||
1851 | 0 | 0 | my $mfc = $mf ? do { local $/ = undef; $mf->getline } : ""; | ||||
0 | |||||||
0 | |||||||
1852 | 0 | 0 | if($mfc =~ m#\ntzdata\.zi:#) { | ||||
1853 | 0 | filter("", "make", "-C", $self->dir, "tzdata.zi", | |||||
1854 | "VERSION_DEPS="); | ||||||
1855 | 0 | $self->{zic_input_files} = [ $self->dir."/tzdata.zi" ]; | |||||
1856 | } else { | ||||||
1857 | 0 | $self->{zic_input_files} = $self->source_data_files; | |||||
1858 | } | ||||||
1859 | } | ||||||
1860 | 0 | return $self->{zic_input_files}; | |||||
1861 | } | ||||||
1862 | |||||||
1863 | =item $download->data_files | ||||||
1864 | |||||||
1865 | Returns a reference to an array containing the pathnames of all the | ||||||
1866 | source data files, provided that the database code would feed the | ||||||
1867 | same data to C |
||||||
1868 | L or L depending on which aspect of | ||||||
1869 | the data files you are interested in. In older versions of the database | ||||||
1870 | the same files were both human-editable and used as C |
||||||
1871 | this single method served both roles. From database version C<2018d> | ||||||
1872 | onwards there is some transformation between the source files and the | ||||||
1873 | C |
||||||
1874 | |||||||
1875 | =cut | ||||||
1876 | |||||||
1877 | sub data_files { | ||||||
1878 | 0 | 0 | 1 | my($self) = @_; | |||
1879 | 0 | 0 | unless(exists $self->{data_files_dual_role}) { | ||||
1880 | 0 | my $list; | |||||
1881 | 0 | $self->_ensure_unpacked; | |||||
1882 | 0 | my $mf = IO::File->new($self->dir."/Makefile", "r"); | |||||
1883 | 0 | 0 | my $mfc = $mf ? do { local $/ = undef; $mf->getline } : ""; | ||||
0 | |||||||
0 | |||||||
1884 | 0 | 0 | 0 | if($mfc !~ m#\ntzdata\.zi:# || $mfc =~ m# | |||
1885 | \ntzdata\.zi:[\ \t]+\$\(TZDATA_ZI_DEPS\)[\ \t]*\n | ||||||
1886 | (?:\t[\ \t]*version=\`sed\ 1q\ version\`\ \&\&\ \\\n)? | ||||||
1887 | \t[\ \t]*LC_ALL=C\ \$\(AWK\) | ||||||
1888 | (?:\ -v\ version="\$\$version")? | ||||||
1889 | \ -f\ zishrink\.awk | ||||||
1890 | \ (?:\\\n\t[\ \t]*)? | ||||||
1891 | \$\(TDATA\)\ \$\(PACKRATDATA\)\ \>\$\@.out\n | ||||||
1892 | \t[\ \t]*mv\ \$\@\.out\ \$\@\n\n | ||||||
1893 | #x) { | ||||||
1894 | 0 | $self->{data_files_dual_role} = 1; | |||||
1895 | } else { | ||||||
1896 | 0 | $self->{data_files_dual_role} = 0; | |||||
1897 | } | ||||||
1898 | } | ||||||
1899 | 0 | 0 | if($self->{data_files_dual_role}) { | ||||
1900 | 0 | return $self->source_data_files; | |||||
1901 | } else { | ||||||
1902 | 0 | die "source data files and zic input are distinct in ". | |||||
1903 | "this form of Olson distribution\n"; | ||||||
1904 | } | ||||||
1905 | } | ||||||
1906 | |||||||
1907 | sub _ensure_zic_built { | ||||||
1908 | 0 | 0 | my($self) = @_; | ||||
1909 | 0 | 0 | unless($self->{zic_built}) { | ||||
1910 | 0 | $self->_ensure_unpacked; | |||||
1911 | 0 | filter("", "make", "-C", $self->dir, "zic", "VERSION_DEPS="); | |||||
1912 | 0 | $self->{zic_built} = 1; | |||||
1913 | } | ||||||
1914 | } | ||||||
1915 | |||||||
1916 | =item $download->zic_exe | ||||||
1917 | |||||||
1918 | Returns the pathname of the C |
||||||
1919 | the downloaded source. This is located in the local temporary directory | ||||||
1920 | used by this download. This method will build C |
||||||
1921 | already been built. | ||||||
1922 | |||||||
1923 | =cut | ||||||
1924 | |||||||
1925 | sub zic_exe { | ||||||
1926 | 0 | 0 | 1 | my($self) = @_; | |||
1927 | 0 | $self->_ensure_zic_built; | |||||
1928 | 0 | return $self->dir."/zic"; | |||||
1929 | } | ||||||
1930 | |||||||
1931 | =item $download->zoneinfo_dir([OPTIONS]) | ||||||
1932 | |||||||
1933 | Returns the pathname of the directory containing binary tzfiles (in | ||||||
1934 | L |
||||||
1935 | This is located in the local temporary directory used by this download, | ||||||
1936 | and the files within it have names that match the timezone names (as | ||||||
1937 | returned by L). This method will generate the tzfiles if | ||||||
1938 | they have not already been generated. | ||||||
1939 | |||||||
1940 | The optional parameter I |
||||||
1941 | desired. If supplied, it must be a reference to a hash, in which these | ||||||
1942 | keys are permitted: | ||||||
1943 | |||||||
1944 | =over | ||||||
1945 | |||||||
1946 | =item B |
||||||
1947 | |||||||
1948 | Truth value, controls whether the tzfiles incorporate information about | ||||||
1949 | known leap seconds offsets that account for the known leap seconds. | ||||||
1950 | If false (which is the default), the tzfiles have no knowledge of leap | ||||||
1951 | seconds, and are intended to be used on a system where C |
||||||
1952 | flavour of UT (as is conventional on Unix and is the POSIX standard). | ||||||
1953 | If true, the tzfiles know about leap seconds that have occurred between | ||||||
1954 | 1972 and the date of the database, and are intended to be used on a | ||||||
1955 | system where C |
||||||
1956 | seconds (which is a non-standard arrangement). | ||||||
1957 | |||||||
1958 | =back | ||||||
1959 | |||||||
1960 | =cut | ||||||
1961 | |||||||
1962 | sub _foreach_nondir_under($$); | ||||||
1963 | sub _foreach_nondir_under($$) { | ||||||
1964 | 0 | 0 | my($dir, $callback) = @_; | ||||
1965 | 0 | 0 | my $dh = IO::Dir->new($dir) or die "can't examine $dir: $!\n"; | ||||
1966 | 0 | while(defined(my $ent = $dh->read)) { | |||||
1967 | 0 | 0 | next if $ent =~ /\A\.\.?\z/; | ||||
1968 | 0 | my $entpath = $dir."/".$ent; | |||||
1969 | 0 | 0 | if(-d $entpath) { | ||||
1970 | 0 | _foreach_nondir_under($entpath, $callback); | |||||
1971 | } else { | ||||||
1972 | 0 | $callback->($entpath); | |||||
1973 | } | ||||||
1974 | } | ||||||
1975 | } | ||||||
1976 | |||||||
1977 | sub zoneinfo_dir { | ||||||
1978 | 0 | 0 | 1 | my($self, $options) = @_; | |||
1979 | 0 | 0 | $options = {} if is_undef($options); | ||||
1980 | 0 | foreach(keys %$options) { | |||||
1981 | 0 | 0 | die "bad option `$_'\n" unless /\Aleaps\z/; | ||||
1982 | } | ||||||
1983 | 0 | 0 | my $type = $options->{leaps} ? "right" : "posix"; | ||||
1984 | 0 | my $zidir = $self->dir."/zoneinfo_$type"; | |||||
1985 | 0 | 0 | unless($self->{"zoneinfo_built_$type"}) { | ||||
1986 | 0 | filter("", "make", "-C", $self->unpacked_dir, | |||||
1987 | "${type}_only", "TZDIR=$zidir", "VERSION_DEPS="); | ||||||
1988 | 0 | my %expect_names = %{$self->all_names}; | |||||
0 | |||||||
1989 | 0 | my $skiplen = length($zidir) + 1; | |||||
1990 | _foreach_nondir_under($zidir, sub { | ||||||
1991 | 0 | 0 | my($fname) = @_; | ||||
1992 | 0 | my $lname = substr($fname, $skiplen); | |||||
1993 | 0 | 0 | unless(exists $expect_names{$lname}) { | ||||
1994 | 0 | die "unexpected file $lname\n"; | |||||
1995 | } | ||||||
1996 | 0 | delete $expect_names{$lname}; | |||||
1997 | 0 | }); | |||||
1998 | 0 | 0 | if(keys %expect_names) { | ||||
1999 | 0 | die "missing file @{[(sort keys %expect_names)[0]]}\n"; | |||||
0 | |||||||
2000 | } | ||||||
2001 | 0 | $self->{"zoneinfo_built_$type"} = 1; | |||||
2002 | } | ||||||
2003 | 0 | return $zidir; | |||||
2004 | } | ||||||
2005 | |||||||
2006 | =back | ||||||
2007 | |||||||
2008 | =head1 BUGS | ||||||
2009 | |||||||
2010 | Most of what this class does will only work on Unix platforms. This is | ||||||
2011 | largely because the Olson database source is heavily Unix-oriented. | ||||||
2012 | |||||||
2013 | This class also depends on the availability of some tools beyond | ||||||
2014 | baseline Unix. Specifically, it requires GNU C |
||||||
2015 | C |
||||||
2016 | |||||||
2017 | It also won't be much good if you're not connected to the Internet. | ||||||
2018 | |||||||
2019 | This class is liable to break if the format of the Olson database source | ||||||
2020 | ever changes substantially. If that happens, an update of this class | ||||||
2021 | will be required. It should at least recognise that it can't perform, | ||||||
2022 | rather than do the wrong thing. | ||||||
2023 | |||||||
2024 | =head1 SEE ALSO | ||||||
2025 | |||||||
2026 | L |
||||||
2027 | L |
||||||
2028 | L |
||||||
2029 | |||||||
2030 | =head1 AUTHOR | ||||||
2031 | |||||||
2032 | Andrew Main (Zefram) |
||||||
2033 | |||||||
2034 | =head1 COPYRIGHT | ||||||
2035 | |||||||
2036 | Copyright (C) 2010, 2011, 2012, 2017, 2018 | ||||||
2037 | Andrew Main (Zefram) |
||||||
2038 | |||||||
2039 | =head1 LICENSE | ||||||
2040 | |||||||
2041 | This module is free software; you can redistribute it and/or modify it | ||||||
2042 | under the same terms as Perl itself. | ||||||
2043 | |||||||
2044 | =cut | ||||||
2045 | |||||||
2046 | 1; |