Rewrite and improve formatted output routines.
authorBen Pfaff <blp@gnu.org>
Sun, 5 Nov 2006 05:20:52 +0000 (05:20 +0000)
committerBen Pfaff <blp@gnu.org>
Sun, 5 Nov 2006 05:20:52 +0000 (05:20 +0000)
Add lots of regression tests.
Revise documentation.
Thanks to John Darrington for review--see patch #5522.

48 files changed:
ChangeLog
configure.ac
doc/data-io.texi
doc/language.texi
doc/transformation.texi
doc/utilities.texi
doc/variables.texi
src/data/ChangeLog
src/data/calendar.c
src/data/calendar.h
src/data/data-out.c
src/data/data-out.h [new file with mode: 0644]
src/data/format.c
src/data/format.h
src/data/value-labels.c
src/language/data-io/list.q
src/language/data-io/print.c
src/language/dictionary/ChangeLog
src/language/dictionary/numeric.c
src/language/dictionary/split-file.c
src/language/expressions/helpers.h
src/language/expressions/operations.def
src/language/lexer/format-parser.h
src/language/stats/crosstabs.q
src/language/utilities/ChangeLog
src/language/utilities/set.q
src/libpspp/str.c
src/libpspp/str.h
src/output/table.c
src/ui/gui/helper.c
src/ui/gui/psppire-data-store.c
tests/ChangeLog
tests/automake.mk
tests/command/no_case_size.sh
tests/expressions/expressions.sh
tests/formats/binhex-out.expected.gz [new file with mode: 0644]
tests/formats/binhex-out.sh [new file with mode: 0755]
tests/formats/date-out.sh [new file with mode: 0755]
tests/formats/inexactify.c [new file with mode: 0644]
tests/formats/month-out.sh [new file with mode: 0755]
tests/formats/num-out-cmp.pl [new file with mode: 0644]
tests/formats/num-out-compare.pl [new file with mode: 0644]
tests/formats/num-out-decmp.pl [new file with mode: 0644]
tests/formats/num-out.expected.cmp.gz [new file with mode: 0644]
tests/formats/num-out.pl [new file with mode: 0644]
tests/formats/num-out.sh [new file with mode: 0755]
tests/formats/time-out.sh [new file with mode: 0755]
tests/formats/wkday-out.sh [new file with mode: 0755]

index ddf1d6cf570b16b1f1f3bc64dc667a170a263bc3..e50320c42c20e30e3965462ee5418dd7bf5a0528 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Sat Nov  4 15:59:31 2006  Ben Pfaff  <blp@gnu.org>
+
+       * configure.ac: Check for the "round" function added in C99.
+
 Tue Oct 31 19:55:52 2006  Ben Pfaff  <blp@gnu.org>
 
        * Smake (GNULIB_MODULES): Add `mempcpy' module.
 Tue Oct 31 19:55:52 2006  Ben Pfaff  <blp@gnu.org>
 
        * Smake (GNULIB_MODULES): Add `mempcpy' module.
index dddfc564a5d23b3ac4d14e7e9bcfe57a28ab5418..0295d7faa48fe487a9ada7a46f0049d46e52e7f4 100644 (file)
@@ -73,7 +73,7 @@ AC_DEFINE(FPREP_IEEE754, 1,
 AC_C_BIGENDIAN
 
 AC_FUNC_VPRINTF
 AC_C_BIGENDIAN
 
 AC_FUNC_VPRINTF
-AC_CHECK_FUNCS([__setfpucw isinf isnan finite getpid feholdexcept])
+AC_CHECK_FUNCS([__setfpucw isinf isnan finite getpid feholdexcept round])
 
 AC_PROG_LN_S
 
 
 AC_PROG_LN_S
 
index d7e18ae8dec3109b72a3110099cfd371de0ac047..efff25ea258f266798b6439f8f6ce621973b89e8 100644 (file)
@@ -186,7 +186,7 @@ In columnar style, the starting column and ending column for the field
 are specified after the variable name, separated by a dash (@samp{-}).
 For instance, the third through fifth columns on a line would be
 specified @samp{3-5}.  By default, variables are considered to be in
 are specified after the variable name, separated by a dash (@samp{-}).
 For instance, the third through fifth columns on a line would be
 specified @samp{3-5}.  By default, variables are considered to be in
-@samp{F} format (@pxref{Input/Output Formats}).  (This default can be
+@samp{F} format (@pxref{Input and Output Formats}).  (This default can be
 changed; see @ref{SET} for more information.)
 
 In columnar style, to use a variable format other than the default,
 changed; see @ref{SET} for more information.)
 
 In columnar style, to use a variable format other than the default,
@@ -218,7 +218,7 @@ Implied decimal places also exist in FORTRAN style.  A format
 specification with @var{d} decimal places also has @var{d} implied
 decimal places.
 
 specification with @var{d} decimal places also has @var{d} implied
 decimal places.
 
-In addition to the standard format specifiers (@pxref{Input/Output
+In addition to the standard format specifiers (@pxref{Input and Output
 Formats}), FORTRAN style defines some extensions:
 
 @table @asis
 Formats}), FORTRAN style defines some extensions:
 
 @table @asis
@@ -381,7 +381,7 @@ The FILE and END subcommands are as in @cmd{DATA LIST FIXED} above.
 The variables to be parsed are given as a single list of variable names.
 This list must be introduced by a single slash (@samp{/}).  The set of
 variable names may contain format specifications in parentheses
 The variables to be parsed are given as a single list of variable names.
 This list must be introduced by a single slash (@samp{/}).  The set of
 variable names may contain format specifications in parentheses
-(@pxref{Input/Output Formats}).  Format specifications apply to all
+(@pxref{Input and Output Formats}).  Format specifications apply to all
 variables back to the previous parenthesized format specification.  
 
 In addition, an asterisk may be used to indicate that all variables
 variables back to the previous parenthesized format specification.  
 
 In addition, an asterisk may be used to indicate that all variables
index 66e5ba36383b09cbb0849a78e5537cec1c542786..3b667618df9cede109df34bc6d1da15c08454933 100644 (file)
@@ -383,7 +383,7 @@ Some details of variables are described in the sections below.
 * Attributes::                  Attributes of variables.
 * System Variables::            Variables automatically defined by PSPP.
 * Sets of Variables::           Lists of variable names.
 * Attributes::                  Attributes of variables.
 * System Variables::            Variables automatically defined by PSPP.
 * Sets of Variables::           Lists of variable names.
-* Input/Output Formats::        Input and output formats.
+* Input and Output Formats::    Input and output formats.
 * Scratch Variables::           Variables deleted by procedures.
 @end menu
 
 * Scratch Variables::           Variables deleted by procedures.
 @end menu
 
@@ -470,12 +470,12 @@ string.  @xref{VALUE LABELS}.
 Display width, format, and (for numeric variables) number of decimal
 places.  This attribute does not affect how data are stored, just how
 they are displayed.  Example: a width of 8, with 2 decimal places.
 Display width, format, and (for numeric variables) number of decimal
 places.  This attribute does not affect how data are stored, just how
 they are displayed.  Example: a width of 8, with 2 decimal places.
-@xref{PRINT FORMATS}.
+@xref{Input and Output Formats}.
 
 @cindex write format
 @item Write format
 
 @cindex write format
 @item Write format
-Similar to print format, but used by certain commands that are
-designed to write to binary files.  @xref{WRITE FORMATS}.
+Similar to print format, but used by the @cmd{WRITE} command
+(@pxref{WRITE}).
 @end table
 
 @node System Variables, Sets of Variables, Attributes, Variables
 @end table
 
 @node System Variables, Sets of Variables, Attributes, Variables
@@ -522,7 +522,7 @@ was read, in format F20.
 Page width, in characters, in format F3.
 @end table
 
 Page width, in characters, in format F3.
 @end table
 
-@node Sets of Variables, Input/Output Formats, System Variables, Variables
+@node Sets of Variables, Input and Output Formats, System Variables, Variables
 @subsection Lists of variable names
 @cindex TO convention
 @cindex convention, TO
 @subsection Lists of variable names
 @cindex TO convention
 @cindex convention, TO
@@ -551,326 +551,680 @@ After a set of variables has been defined with @cmd{DATA LIST} or
 another command with this method, the same set can be referenced on
 later commands using the same syntax.
 
 another command with this method, the same set can be referenced on
 later commands using the same syntax.
 
-@node Input/Output Formats, Scratch Variables, Sets of Variables, Variables
+@node Input and Output Formats, Scratch Variables, Sets of Variables, Variables
 @subsection Input and Output Formats
 
 @subsection Input and Output Formats
 
-Data that PSPP inputs and outputs must have one of a number of formats.
-These formats are described, in general, by a format specification of
-the form @code{NAMEw.d}, where @var{name} is the
-format name and @var{w} is a field width.  @var{d} is the optional
-desired number of decimal places, if appropriate.  If @var{d} is not
-included then it is assumed to be 0.  Some formats do not allow @var{d}
-to be specified.
+An @dfn{input format} describes how to interpret the contents of an
+input field as a number or a string.  It might specify that the field
+contains an ordinary decimal number, a time or date, a number in binary
+or hexadecimal notation, or one of several other notations.  Input
+formats are used by commands such as @cmd{DATA LIST} that read data or
+syntax files into the PSPP active file.
+
+Every input format corresponds to a default @dfn{output format} that
+specifies the formatting used when the value is output later.  It is
+always possible to explicitly specify an output format that resembles
+the input format.  Usually, this is the default, but in cases where the
+input format is unfriendly to human readability, such as binary or
+hexadecimal formats, the default output format is an easier-to-read
+decimal format.
+
+Every variable has two output formats, called its @dfn{print format} and
+@dfn{write format}.  Print formats are used in most output contexts;
+write formats are used only by @cmd{WRITE} (@pxref{WRITE}).  Newly
+created variables have identical print and write formats, and
+@cmd{FORMATS}, the most commonly used command for changing formats
+(@pxref{FORMATS}), sets both of them to the same value as well.  Thus,
+most of the time, the distinction between print and write formats is
+unimportant.
+
+Input and output formats are specified to PSPP with a @dfn{format
+specification} of the form @code{TYPEw} or @code{TYPEw.d}, where
+@code{TYPE} is one of the format types described later, @code{w} is a
+field width measured in columns, and @code{d} is an optional number of
+decimal places.  If @code{d} is omitted, a value of 0 is assumed.  Some
+formats do not allow a nonzero @code{d} to be specified.
+
+The following sections describe the input and output formats supported
+by PSPP.
 
 
-When @cmd{DATA LIST} or another command specifies an input format,
-that format is converted to an output format for the purposes of
-@cmd{PRINT} and other data output commands.  For most purposes, input
-and output formats are the same; the salient differences are described
-below.
+@menu
+* Basic Numeric Formats::       
+* Custom Currency Formats::     
+* Legacy Numeric Formats::      
+* Binary and Hexadecimal Numeric Formats::  
+* Time and Date Formats::       
+* Date Component Formats::      
+* String Formats::              
+@end menu
 
 
-Below are listed the input and output formats supported by PSPP.  If an
-input format is mapped to a different output format by default, then
-that mapping is indicated with @result{}.  Each format has the listed
-bounds on input width (iw) and output width (ow).
+@node Basic Numeric Formats
+@subsubsection Basic Numeric Formats
+
+The basic numeric formats are used for input and output of real numbers
+in standard or scientific notation.  The following table shows an
+example of how each format displays positive and negative numbers with
+the default decimal point setting:
+
+@float
+@multitable {DOLLAR10.2} {@code{@tie{}$3,141.59}} {@code{-$3,141.59}}
+@headitem Format @tab @code{@tie{}}3141.59   @tab -3141.59
+@item F8.2       @tab @code{@tie{}3141.59}   @tab @code{-3141.59}
+@item COMMA9.2   @tab @code{@tie{}3,141.59}  @tab @code{-3,141.59}
+@item DOT9.2     @tab @code{@tie{}3.141,59}  @tab @code{-3.141,59}
+@item DOLLAR10.2 @tab @code{@tie{}$3,141.59} @tab @code{-$3,141.59}
+@item PCT9.2     @tab @code{@tie{}3141.59%}  @tab @code{-3141.59%}
+@item E8.1       @tab @code{@tie{}3.1E+003}  @tab @code{-3.1E+003}
+@end multitable
+@end float
+
+On output, numbers in F format are expressed in standard decimal
+notation with the requested number of decimal places.  The other formats
+output some variation on this style:
 
 
-The standard numeric input and output formats are given in the following
-table:
+@itemize @bullet
+@item
+Numbers in COMMA format are additionally grouped every three digits by
+inserting a grouping character.  The grouping character is ordinarily a
+comma, but it can be changed to a period (@pxref{SET DECIMAL}).
 
 
-@table @asis
-@item Fw.d: 1 <= iw,ow <= 40
-Standard decimal format with @var{d} decimal places.  If the number is
-too large to fit within the field width, it is expressed in scientific
-notation (@code{1.2+34}) if w >= 6, with always at least two digits in
-the exponent.  When used as an input format, scientific notation is
-allowed but an E or an F must be used to introduce the exponent.
-
-The default output format is the same as the input format, except if
-@var{d} > 1.  In that case the output @var{w} is always made to be at
-least 2 + @var{d}.
+@item
+DOT format is like COMMA format, but it interchanges the role of the
+decimal point and grouping characters.  That is, the current grouping
+character is used as a decimal point and vice versa.
 
 
-@item Ew.d: 1 <= iw <= 40; 6 <= ow <= 40
-For input this is equivalent to F format except that no E or F is
-require to introduce the exponent.  For output, produces scientific
-notation in the form @code{1.2+34}.  There are always at least two
-digits given in the exponent.
+@item
+DOLLAR format is like COMMA format, but it prefixes the number with
+@samp{$}.
 
 
-The default output @var{w} is the largest of the input @var{w}, the
-input @var{d} + 7, and 10.  The default output @var{d} is the input
-@var{d}, but at least 3.
+@item
+PCT format is like F format, but adds @samp{%} after the number.
 
 
-@item COMMAw.d: 1 <= iw,ow <= 40
-Equivalent to F format, except that groups of three digits are
-comma-separated on output.  If the number is too large to express in the
-field width, then first commas are eliminated, then if there is still
-not enough space the number is expressed in scientific notation given
-that w >= 6.  Commas are allowed and ignored when this is used as an
-input format.  
+@item
+The E format always produces output in scientific notation.
+@end itemize
 
 
-@item DOTw.d: 1 <= iw,ow <= 40
-Equivalent to COMMA format except that the roles of comma and decimal
-point are interchanged.  However: If SET /DECIMAL=DOT is in effect, then
-COMMA uses @samp{,} for a decimal point and DOT uses @samp{.} for a
-decimal point.
+On input, the basic numeric formats accept positive and numbers in
+standard decimal notation or scientific notation.  Leading and trailing
+spaces are allowed.  An empty or all-spaces field, or one that contains
+only a single period, is treated as the system missing value.
 
 
-@item DOLLARw.d: 1 <= iw <= 40; 2 <= ow <= 40
-Equivalent to COMMA format, except that the number is prefixed by a
-dollar sign (@samp{$}) if there is room.  On input the value is allowed
-to be prefixed by a dollar sign, which is ignored.
+In scientific notation, the exponent may be introduced by a sign
+(@samp{+} or @samp{-}), or by one of the letters @samp{e} or @samp{d}
+(in uppercase or lowercase), or by a letter followed by a sign.  A
+single space may follow the letter or the sign or both.
 
 
-The default output @var{w} is the input @var{w}, but at least 2.
+On fixed-format @cmd{DATA LIST} (@pxref{DATA LIST FIXED}) and in a few
+other contexts, decimals are implied when the field does not contain a
+decimal point.  In F6.5 format, for example, the field @code{314159} is
+taken as the value 3.14159 with implied decimals.  Decimals are never
+implied if an explicit decimal point is present or if scientific
+notation is used.
 
 
-@item PCTw.d: 2 <= iw,ow <= 40
-Equivalent to F format, except that the number is suffixed by a percent
-sign (@samp{%}) if there is room.  On input the value is allowed to be
-suffixed by a percent sign, which is ignored.
+E and F formats accept the basic syntax already described.  The other
+formats allow some additional variations:
 
 
-The default output @var{w} is the input @var{w}, but at least 2.
+@itemize @bullet
+@item
+COMMA, DOLLAR, and DOT formats ignore grouping characters within the
+integer part of the input field.  The identity of the grouping
+character depends on the format.
 
 
-@item Nw.d: 1 <= iw,ow <= 40
-Only digits are allowed within the field width.  The decimal point is
-assumed to be @var{d} digits from the right margin.
+@item
+DOLLAR format allows a dollar sign to precede the number.  In a negative
+number, the dollar sign may precede or follow the minus sign.
 
 
-The default output format is F with the same @var{w} and @var{d}, except
-if @var{d} > 1.  In that case the output @var{w} is always made to be at
-least 2 + @var{d}.
+@item
+PCT format allows a percent sign to follow the number.
+@end itemize
 
 
-@item Zw.d @result{} F: 1 <= iw,ow <= 40
-Zoned decimal input.  If you need to use this then you know how.
+All of the basic number formats have a maximum field width of 40 and
+accept no more than 16 decimal places, on both input and output.  Some
+additional restrictions apply:
 
 
-@item IBw.d @result{} F: 1 <= iw,ow <= 8
-Integer binary format.  The field is interpreted as a fixed-point
-positive or negative binary number in two's-complement notation.  The
-location of the decimal point is implied.  Endianness is the same as the
-host machine.
+@itemize @bullet
+@item
+As input formats, the basic numeric formats allow no more decimal places
+than the field width.  As output formats, the field width must be
+greater than the number of decimal places; that is, large enough to
+allow for a decimal point and the number of requested decimal places.
+DOLLAR and PCT formats must allow an additional column for @samp{$} or
+@samp{%}.
 
 
-The default output format is F8.2 if @var{d} is 0.  Otherwise it is F,
-with output @var{w} as 9 + input @var{d} and output @var{d} as input
-@var{d}.
+@item
+The default output format for a given input format increases the field
+width enough to make room for optional input characters.  If an input
+format calls for decimal places, the width is increased by 1 to make
+room for an implied decimal point.  COMMA, DOT, and DOLLAR formats also
+increase the output width to make room for grouping characters.  DOLLAR
+and PCT further increase the output field width by 1 to make room for
+@samp{$} or @samp{%}.  The increased output width is capped at 40, the
+maximum field width.
 
 
-@item PIB @result{} F: 1 <= iw,ow <= 8
-Positive integer binary format.  The field is interpreted as a
-fixed-point positive binary number.  The location of the decimal point
-is implied.  Endianness is the same as the host machine.
+@item
+The E format is exceptional.  For output, E format has a minimum width
+of 7 plus the number of decimal places.  The default output format for
+an E input format is an E format with at least 3 decimal places and
+thus a minimum width of 10.
+@end itemize
 
 
-The default output format follows the rules for IB format.
+More details of basic numeric output formatting are given below:
 
 
-@item Pw.d @result{} F: 1 <= iw,ow <= 16
-Binary coded decimal format.  Each byte from left to right, except the
-rightmost, represents two digits.  The upper nibble of each byte is more
-significant.  The upper nibble of the final byte is the least
-significant digit.  The lower nibble of the final byte is the sign; a
-value of D represents a negative sign and all other values are
-considered positive.  The decimal point is implied.
+@itemize @bullet
+@item
+Output rounds to nearest, with ties rounded away from zero.  Thus, 2.5
+is output as @code{3} in F1.0 format, and -1.125 as @code{-1.13} in F5.1
+format.
 
 
-The default output format follows the rules for IB format.
+@item
+The system-missing value is output as a period in a field of spaces,
+placed in the decimal point's position, or in the rightmost column if no
+decimal places are requested.  A period is used even if the decimal
+point character is a comma.
 
 
-@item PKw.d @result{} F: 1 <= iw,ow <= 16
-Positive binary code decimal format.  Same as P but the last byte is the
-same as the others.
+@item
+A number that does not fill its field is right-justified within the
+field.
 
 
-The default output format follows the rules for IB format.
+@item
+A number is too large for its field causes decimal places to be dropped
+to make room.  If dropping decimals does not make enough room,
+scientific notation is used if the field is wide enough.  If a number
+does not fit in the field, even in scientific notation, the overflow is
+indicated by filling the field with asterisks (@samp{*}).
 
 
-@item RBw @result{} F: 2 <= iw,ow <= 8
+@item
+COMMA, DOT, and DOLLAR formats insert grouping characters only if space
+is available for all of them.  Grouping characters are never inserted
+when all decimal places must be dropped.  Thus, 1234.56 in COMMA5.2
+format is output as @samp{@tie{}1235} without a comma, even though there
+is room for one, because all decimal places were dropped.
 
 
-Binary C architecture-dependent ``double'' format.  For a standard
-IEEE754 implementation @var{w} should be 8.
+@item
+DOLLAR or PCT format drop the @samp{$} or @samp{%} only if the number
+would not fit at all without it.  Scientific notation with @samp{$} or
+@samp{%} is preferred to ordinary decimal notation without it.
 
 
-The default output format follows the rules for IB format.
+@item
+Except in scientific notation, a decimal point is included only when
+it is followed by a digit.  If the integer part of the number being
+output is 0, and a decimal point is included, then the zero before the
+decimal point is dropped.
 
 
-@item PIBHEXw.d @result{} F: 2 <= iw,ow <= 16
-PIB format encoded as textual hex digit pairs.  @var{w} must be even.
+In scientific notation, the number always includes a decimal point,
+even if it is not followed by a digit.
 
 
-The input width is mapped to a default output width as follows:
-2@result{}4, 4@result{}6, 6@result{}9, 8@result{}11, 10@result{}14,
-12@result{}16, 14@result{}18, 16@result{}21.  No allowances are made for
-decimal places.
+@item
+A negative number includes a minus sign only in the presence of a
+nonzero digit: -0.01 is output as @samp{-.01} in F4.2 format but as
+@samp{@tie{}@tie{}.0} in F4.1 format.  Thus, a ``negative zero'' never
+includes a minus sign.
 
 
-@item RBHEXw @result{} F: 4 <= iw,ow <= 16
+@item
+In negative numbers output in DOLLAR format, the dollar sign follows the
+negative sign.  Thus, -9.99 in DOLLAR6.2 format is output as
+@code{-$9.99}.
 
 
-RB format encoded as textual hex digits pairs.  @var{w} must be even.
+@item
+In scientific notation, the exponent is output as @samp{E} followed by
+@samp{+} or @samp{-} and exactly three digits.  Numbers with magnitude
+less than 10**-999 or larger than 10**999 are not supported by most
+computers, but if they are supported then their output is considered
+to overflow the field and will be output as asterisks.
 
 
-The default output format is F8.2.
+@item
+On most computers, no more than 15 decimal digits are significant in
+output, even if more are printed.  In any case, output precision cannot
+be any higher than input precision; few data sets are accurate to 15
+digits of precision.  Unavoidable loss of precision in intermediate
+calculations may also reduce precision of output.
 
 
-@item CCAw.d: 1 <= ow <= 40
-@itemx CCBw.d: 1 <= ow <= 40
-@itemx CCCw.d: 1 <= ow <= 40
-@itemx CCDw.d: 1 <= ow <= 40
-@itemx CCEw.d: 1 <= ow <= 40
+@item
+Special values such as infinities and ``not a number'' values are
+usually converted to the system-missing value before printing.  In a few
+circumstances, these values are output directly.  In fields of width 3
+or greater, special values are output as however many characters will
+fit from @code{+Infinity} or @code{-Infinity} for infinities, from
+@code{NaN} for ``not a number,'' or from @code{Unknown} for other values
+(if any are supported by the system).  In fields under 3 columns wide,
+special values are output as asterisks.
+@end itemize
 
 
-User-defined custom currency formats.  May not be used as an input
-format.  @xref{SET}, for more details.
-@end table
+@node Custom Currency Formats
+@subsubsection Custom Currency Formats
+
+The custom currency formats are closely related to the basic numeric
+formats, but they allow users to customize the output format.  The
+SET command configures custom currency formats, using the syntax
+@display
+SET CC@var{x}=@t{"}@var{string}@t{"}.
+@end display
+@noindent 
+where @var{x} is A, B, C, D, or E, and @var{string} is no more than 16
+characters long.
+
+@var{string} must contain exactly three commas or exactly three periods
+(but not both), except that a single quote character may be used to
+``escape'' a following comma, period, or single quote.  If three commas
+are used, commas will be used for grouping in output, and a period will
+be used as the decimal point.  Uses of periods reverses these roles.
+
+The commas or periods divide @var{string} into four fields, called the
+@dfn{negative prefix}, @dfn{prefix}, @dfn{suffix}, and @dfn{negative
+suffix}, respectively.  The prefix and suffix are added to output
+whenever space is available.  The negative prefix and negative suffix
+are always added to a negative number when the output includes a nonzero
+digit.
+
+The following syntax shows how custom currency formats could be used to
+reproduce basic numeric formats:
 
 
-The date and time numeric input and output formats accept a number of
-possible formats.  Before describing the formats themselves, some
-definitions of the elements that make up their formats will be helpful:
+@example
+@group
+SET CCA="-,,,".  /* Same as COMMA.
+SET CCB="-...".  /* Same as DOT.
+SET CCC="-,$,,". /* Same as DOLLAR.
+SET CCD="-,,%,". /* Like PCT, but groups with commas.
+@end group
+@end example
 
 
-@table @dfn
-@item leader
-All formats accept an optional white space leader.
+Here are some more examples of custom currency formats.  The final
+example shows how to use a single quote to escape a delimiter:
 
 
-@item day
-An integer between 1 and 31 representing the day of month.
+@example
+@group
+SET CCA=",EUR,,-".   /* Euro.
+SET CCB="(,USD ,,)". /* US dollar.
+SET CCC="-.R$..".    /* Brazilian real.
+SET CCD="-,, NIS,".  /* Israel shekel.
+SET CCE="-.Rp'. ..". /* Indonesia Rupiah.
+@end group
+@end example
 
 
-@item day-count
-An integer representing a number of days.
+@noindent These formats would yield the following output:
 
 
-@item date-delimiter
-One or more characters of white space or the following characters:
-@code{- / . ,}
+@float
+@multitable {CCD13.2} {@code{@tie{}@tie{}USD 3,145.59}} {@code{(USD 3,145.59)}}
+@headitem Format @tab @code{@tie{}}3145.59         @tab -3145.59
+@item CCA12.2 @tab @code{@tie{}EUR3,145.59}        @tab @code{EUR3,145.59-}
+@item CCB14.2 @tab @code{@tie{}@tie{}USD 3,145.59} @tab @code{(USD 3,145.59)}
+@item CCC11.2 @tab @code{@tie{}R$3.145,59}         @tab @code{-R$3.145,59}
+@item CCD13.2 @tab @code{@tie{}3,145.59 NIS}       @tab @code{-3,145.59 NIS}
+@item CCE10.0 @tab @code{@tie{}Rp. 3.146}          @tab @code{-Rp. 3.146}
+@end multitable
+@end float
+
+The default for all the custom currency formats is @samp{-,,,},
+equivalent to COMMA format.
+
+@node Legacy Numeric Formats
+@subsubsection Legacy Numeric Formats
+
+The N and Z numeric formats provide compatibility with legacy file
+formats.  They have much in common:
 
 
-@item month
-A month name in one of the following forms:
 @itemize @bullet
 @item
 @itemize @bullet
 @item
-An integer between 1 and 12.
+Output is rounded to the nearest representable value, with ties rounded
+away from zero.
+
+@item
+Numbers too large to display are output as a field filled with asterisks
+(@samp{*}).
+
+@item
+The decimal point is always implicitly the specified number of digits
+from the right edge of the field, except that Z format input allows an
+explicit decimal point.
+
+@item
+Scientific notation may not be used.
+
+@item
+The system-missing value is output as a period in a field of spaces.
+The period is placed just to the right of the implied decimal point in
+Z format, or at the right end in N format or in Z format if no decimal
+places are requested.  A period is used even if the decimal point
+character is a comma.
+
 @item
 @item
-Roman numerals representing an integer between 1 and 12.
+Field width may range from 1 to 40.  Decimal places may range from 0 up
+to the field width, to a maximum of 16.
+
 @item
 @item
-At least the first three characters of an English month name (January,
-February, @dots{}).
+When a legacy numeric format used for input is converted to an output
+format, it is changed into the equivalent F format.  The field width is
+increased by 1 if any decimal places are specified, to make room for a
+decimal point.  For Z format, the field width is increased by 1 more
+column, to make room for a negative sign.  The output field width is
+capped at 40 columns.
 @end itemize
 
 @end itemize
 
-@item year
-An integer year number between 1582 and 19999, or between 1 and 199.
-Years between 1 and 199 will have 1900 added.
+@subsubheading N Format
 
 
-@item julian
-A single number with a year number in the first 2, 3, or 4 digits (as
-above) and the day number within the year in the last 3 digits.
+The N format supports input and output of fields that contain only
+digits.  On input, leading or trailing spaces, a decimal point, or any
+other non-digit character causes the field to be read as the
+system-missing value.  As a special exception, an N format used on
+@cmd{DATA LIST FREE} or @cmd{DATA LIST LIST} is treated as the
+equivalent F format.
 
 
-@item quarter
-An integer between 1 and 4 representing a quarter.
+On output, N pads the field on the left with zeros.  Negative numbers
+are output like the system-missing value.
 
 
-@item q-delimiter
-The letter @samp{Q} or @samp{q}.
+@subsubheading Z Format
 
 
-@item week
-An integer between 1 and 53 representing a week within a year.
+The Z format is a ``zoned decimal'' format used on IBM mainframes.  Z
+format encodes the sign as part of the final digit, which must be one of
+the following:
+@example
+0123456789
+@{ABCDEFGHI
+@}JKLMNOPQR
+@end example
+@noindent
+where the characters in each row represent digits 0 through 9 in order.
+Characters in the first two rows indicate a positive sign; those in the
+third indicate a negative sign.
+
+On output, Z fields are padded on the left with spaces.  On input,
+leading and trailing spaces are ignored.  Any character in an input
+field other than spaces, the digit characters above, and @samp{.} causes
+the field to be read as system-missing.
+
+The decimal point character for input and output is always @samp{.},
+even if the decimal point character is a comma (@pxref{SET DECIMAL}).
+
+Nonzero, negative values output in Z format are marked as negative even
+when no nonzero digits are output.  For example, -0.2 is output in Z1.0
+format as @samp{J}.  The ``negative zero'' value supported by most
+machines is output as positive.
+
+@node Binary and Hexadecimal Numeric Formats
+@subsubsection Binary and Hexadecimal Numeric Formats
+
+The binary and hexadecimal formats are primarily designed for
+compatibility with existing machine formats, not for human readability.
+All of them therefore have a F format as default output format.  Some of
+these formats are only portable between machines with compatible byte
+ordering (endianness) or floating-point format.
+
+Binary formats use byte values that in text files are interpreted as
+special control functions, such as carriage return and line feed.  Thus,
+data in binary formats should not be included in syntax files or read
+from data files with variable-length records, such as ordinary text
+files.  They may be read from or written to data files with fixed-length
+records.  @xref{FILE HANDLE}, for information on working with
+fixed-length records.
+
+@subsubheading P and PK Formats
+
+These are binary-coded decimal formats, in which every byte (except the
+last, in P format) represents two decimal digits.  The most-significant
+4 bits of the first byte is the most-significant decimal digit, the
+least-significant 4 bits of the first byte is the next decimal digit,
+and so on.
+
+In P format, the most-significant 4 bits of the last byte are the
+least-significant decimal digit.  The least-significant 4 bits represent
+the sign: decimal 15 indicates a negative value, decimal 13 indicates a
+positive value.
+
+Numbers are rounded downward on output.  The system-missing value and
+numbers outside representable range are output as zero.
+
+The maximum field width is 16.  Decimal places may range from 0 up to
+the number of decimal digits represented by the field.
+
+The default output format is an F format with twice the input field
+width, plus one column for a decimal point (if decimal places were
+requested).
+
+@subsubheading IB and PIB Formats
+
+These are integer binary formats.  IB reads and writes 2's complement
+binary integers, and PIB reads and writes unsigned binary integers.  The
+byte ordering is by default the host machine's, but SET RIB may be used
+to select a specific byte ordering for reading (@pxref{SET RIB}) and
+SET WIB, similarly, for writing (@pxref{SET WIB}).
+
+The maximum field width is 8.  Decimal places may range from 0 up to the
+number of decimal digits in the largest value representable in the field
+width.
+
+The default output format is an F format whose width is the number of
+decimal digits in the largest value representable in the field width,
+plus 1 if the format has decimal places.
+
+@subsubheading RB Format
+
+This is a binary format for real numbers.  By default it reads and
+writes the host machine's floating-point format, but SET RRB may be
+used to select an alternate floating-point format for reading
+(@pxref{SET RRB}) and SET WRB, similarly, for writing (@pxref{SET
+WRB}).
+
+The recommended field width depends on the floating-point format.
+NATIVE (the default format), IDL, IDB, VD, VG, and ZL formats should use
+a field width of 8.  ISL, ISB, VF, and ZS formats should use a field
+width of 4.  Other field widths will not produce useful results.  The
+maximum field width is 8.  No decimal places may be specified.
 
 
-@item wk-delimiter
-The letters @samp{wk} in any case.
+The default output format is F8.2.
 
 
-@item time-delimiter
-At least one characters of white space or @samp{:} or @samp{.}.
+@subsubheading PIBHEX and RBHEX Formats
+
+These are hexadecimal formats, for reading and writing binary formats
+where each byte has been recoded as a pair of hexadecimal digits.
+
+A hexadecimal field consists solely of hexadecimal digits
+@samp{0}@dots{}@samp{9} and @samp{A}@dots{}@samp{F}.  Uppercase and
+lowercase are accepted on input; output is in uppercase.
+
+Other than the hexadecimal representation, these formats are equivalent
+to PIB and RB formats, respectively.  However, bytes in PIBHEX format
+are always ordered with the most-significant byte first (big-endian
+order), regardless of the host machine's native byte order or PSPP
+settings.
+
+Field widths must be even and between 2 and 16.  RBHEX format allows no
+decimal places; PIBHEX allows as many decimal places as a PIB format
+with half the given width.
+
+@node Time and Date Formats
+@subsubsection Time and Date Formats
+
+In PSPP, a @dfn{time} is an interval.  The time formats translate
+between human-friendly descriptions of time intervals and PSPP's
+internal representation of time intervals, which is simply the number of
+seconds in the interval.  PSPP has two time formats:
+
+@float
+@multitable {Time Format} {@code{dd-mmm-yyyy HH:MM:SS.ss}} {@code{01-OCT-1978 04:31:17.01}}
+@headitem Time Format @tab Template                  @tab Example
+@item TIME     @tab @code{hh:MM:SS.ss}          @tab @code{04:31:17.01}
+@item DTIME    @tab @code{DD HH:MM:SS.ss}       @tab @code{00 04:31:17.01}
+@end multitable
+@end float
+
+A @dfn{date} is a moment in the past or the future.  Internally, PSPP
+represents a date as the number of seconds since the @dfn{epoch},
+midnight, Oct. 14, 1582.  The date formats translate between
+human-readable dates and PSPP's numeric representation of dates and
+times.  PSPP has several date formats:
+
+@float
+@multitable {Date Format} {@code{dd-mmm-yyyy HH:MM:SS.ss}} {@code{01-OCT-1978 04:31:17.01}}
+@headitem Date Format @tab Template                  @tab Example
+@item DATE     @tab @code{dd-mmm-yyyy}          @tab @code{01-OCT-1978}
+@item ADATE    @tab @code{mm/dd/yyyy}           @tab @code{10/01/1978}
+@item EDATE    @tab @code{dd.mm.yyyy}           @tab @code{01.10.1978}
+@item JDATE    @tab @code{yyyyjjj}              @tab @code{1978274}
+@item SDATE    @tab @code{yyyy/mm/dd}           @tab @code{1978/10/01}
+@item QYR      @tab @code{q Q yyyy}             @tab @code{3 Q 1978}
+@item MOYR     @tab @code{mmm yyyy}             @tab @code{OCT 1978}
+@item WKYR     @tab @code{ww WK yyyy}           @tab @code{40 WK 1978}
+@item DATETIME @tab @code{dd-mmm-yyyy HH:MM:SS.ss} @tab @code{01-OCT-1978 04:31:17.01}
+@end multitable
+@end float
+
+The templates in the preceding tables describe how the time and date
+formats are input and output:
 
 
-@item hour
-An integer greater than 0 representing an hour.
+@table @code
+@item dd
+Day of month, from 1 to 31.  Always output as two digits.
+
+@item mm
+@itemx mmm
+Month.  In output, @code{mm} is output as two digits, @code{mmm} as the
+first three letters of an English month name (January, February,
+@dots{}).  In input, both of these formats, plus Roman numerals, are
+accepted.
+
+@item yyyy
+Year.  In output, DATETIME always produces a 4-digit year; other
+formats can produce a 2- or 4-digit year.  The century assumed for
+2-digit years depends on the EPOCH setting (@pxref{SET EPOCH}).  In
+output, a year outside the epoch causes the whole field to be filled
+with asterisks (@samp{*}).
+
+@item jjj
+Day of year (Julian day), from 1 to 366.  This is exactly three digits
+giving the count of days from the start of the year.  January 1 is
+considered day 1.
+
+@item q
+Quarter of year, from 1 to 4.  Quarters start on January 1, April 1,
+July 1, and October 1.
+
+@item ww
+Week of year, from 1 to 53.  Output as exactly two digits.  January 1 is
+the first day of week 1.
+
+@item DD
+Count of days, which may be positive or negative.  Output as at least
+two digits.
+
+@item hh
+Count of hours, which may be positive or negative.  Output as at least
+two digits.
+
+@item HH
+Hour of day, from 0 to 23.  Output as exactly two digits.
+
+@item MM
+Minute of hour, from 0 to 59.  Output as exactly two digits.
+
+@item SS.ss
+Seconds within minute, from 0 to 59.  The integer part is output as
+exactly two digits.  On output, seconds and fractional seconds may or
+may not be included, depending on field width and decimal places.  On
+input, seconds and fractional seconds are optional.  The DECIMAL setting
+controls the character accepted and displayed as the decimal point
+(@pxref{SET DECIMAL}).
+@end table
 
 
-@item minute
-An integer between 0 and 59 representing a minute within an hour.
+For output, the date and time formats use the delimiters indicated in
+the table.  For input, date components may be separated by spaces or by
+one of the characters @samp{-}, @samp{/}, @samp{.}, or @samp{,}, and
+time components may be separated by spaces, @samp{:}, or @samp{.}.  On
+input, the @samp{Q} separating quarter from year and the @samp{WK}
+separating week from year may be uppercase or lowercase, and the spaces
+around them are optional.
+
+On input, all time and date formats accept any amount of leading and
+trailing white space.
+
+The maximum width for time and date formats is 40 columns.  Minimum
+input and output width for each of the time and date formats is shown
+below:
+@float
+@multitable {DATETIME} {Min. Input Width} {Min. Output Width} {4-digit year}
+@headitem Format @tab Min. Input Width @tab Min. Output Width @tab Option 
+@item DATE @tab 8 @tab 9 @tab 4-digit year
+@item ADATE @tab 8 @tab 8 @tab 4-digit year
+@item EDATE @tab 8 @tab 8 @tab 4-digit year
+@item JDATE @tab 5 @tab 5 @tab 4-digit year
+@item SDATE @tab 8 @tab 8 @tab 4-digit year
+@item QYR @tab 4 @tab 6 @tab 4-digit year
+@item MOYR @tab 6 @tab 6 @tab 4-digit year
+@item WKYR @tab 6 @tab 8 @tab 4-digit year
+@item DATETIME @tab 17 @tab 17 @tab seconds
+@item TIME @tab 5 @tab 5 @tab seconds
+@item DTIME @tab 8 @tab 8 @tab seconds
+@end multitable
+@end float
+@noindent 
+In the table, ``Option'' describes what increased output width enables:
 
 
-@item opt-second
-Optionally, a time-delimiter followed by a real number representing a
-number of seconds.
+@table @asis
+@item 4-digit year
+A field 2 columns wider than minimum will include a 4-digit year.
+(DATETIME format always includes a 4-digit year.)
+
+@item seconds
+A field 3 columns wider than minimum will include seconds as well as
+minutes.  A field 5 columns wider than minimum, or more, can also
+include a decimal point and fractional seconds (but no more than allowed
+by the format's decimal places).
+@end table
 
 
-@item hour24
-An integer between 0 and 23 representing an hour within a day.
+For the time and date formats, the default output format is the same as
+the input format, except that PSPP increases the field width, if
+necessary, to the minimum allowed for output.
 
 
-@item weekday
-At least the first two characters of an English day word.
+Time or dates narrower than the field width are right-justified within
+the field.
 
 
-@item spaces
-Any amount or no amount of white space.
+When a time or date exceeds the field width, characters are trimmed from
+the end until it fits.  This can occur in an unusual situation, e.g.@:
+with a year greater than 9999 (which adds an extra digit), or for a
+negative value on TIME or DTIME (which adds a leading minus sign).
 
 
-@item sign
-An optional positive or negative sign.
+@c What about out-of-range values?
 
 
-@item trailer
-All formats accept an optional white space trailer.
-@end table
+The system-missing value is output as a period at the right end of the
+field.  
 
 
-The date input formats are strung together from the above pieces.  On
-output, the date formats are always printed in a single canonical
-manner, based on field width.  The date input and output formats are
-described below:
+@node Date Component Formats
+@subsubsection Date Component Formats
 
 
-@table @asis
-@item DATEw: 9 <= iw,ow <= 40
-Date format. Input format: leader + day + date-delimiter +
-month + date-delimiter + year + trailer.  Output format: DD-MMM-YY for
-@var{w} < 11, DD-MMM-YYYY otherwise.
-
-@item EDATEw: 8 <= iw,ow <= 40
-European date format.  Input format same as DATE.  Output format:
-DD.MM.YY for @var{w} < 10, DD.MM.YYYY otherwise.
-
-@item SDATEw: 8 <= iw,ow <= 40
-Standard date format. Input format: leader + year + date-delimiter +
-month + date-delimiter + day + trailer.  Output format: YY/MM/DD for
-@var{w} < 10, YYYY/MM/DD otherwise.
-
-@item ADATEw: 8 <= iw,ow <= 40
-American date format.  Input format: leader + month + date-delimiter +
-day + date-delimiter + year + trailer.  Output format: MM/DD/YY for
-@var{w} < 10, MM/DD/YYYY otherwise.
-
-@item JDATEw: 5 <= iw,ow <= 40
-Julian date format.  Input format: leader + julian + trailer.  Output
-format: YYDDD for @var{w} < 7, YYYYDDD otherwise.
-
-@item QYRw: 4 <= iw <= 40, 6 <= ow <= 40
-Quarter/year format.  Input format: leader + quarter + q-delimiter +
-year + trailer.  Output format: @samp{Q Q YY}, where the first
-@samp{Q} is one of the digits 1, 2, 3, 4, if @var{w} < 8, @code{Q Q
-YYYY} otherwise.
-
-@item MOYRw: 6 <= iw,ow <= 40
-Month/year format.  Input format: leader + month + date-delimiter + year
-+ trailer.  Output format: @samp{MMM YY} for @var{w} < 8, @samp{MMM
-YYYY} otherwise.
-
-@item WKYRw: 6 <= iw <= 40, 8 <= ow <= 40
-Week/year format.  Input format: leader + week + wk-delimiter + year +
-trailer.  Output format: @samp{WW WK YY} for @var{w} < 10, @samp{WW WK
-YYYY} otherwise.
-
-@item DATETIMEw.d: 17 <= iw,ow <= 40
-Date and time format.  Input format: leader + day + date-delimiter +
-month + date-delimiter + year + time-delimiter + hour24 + time-delimiter
-+ minute + opt-second.  Output format: @samp{DD-MMM-YYYY HH:MM}.  If
-@var{w} > 19 then seconds @samp{:SS} is added.  If @var{w} > 22 and
-@var{d} > 0 then fractional seconds @samp{.SS} are added.
-
-@item TIMEw.d: 5 <= iw,ow <= 40
-Time format.  Input format: leader + sign + spaces + hour +
-time-delimiter + minute + opt-second.  Output format: @samp{HH:MM}.
-Seconds and fractional seconds are available with @var{w} of at least 8
-and 10, respectively.
-
-@item DTIMEw.d: 1 <= iw <= 40, 8 <= ow <= 40
-Time format with day count.  Input format: leader + sign + spaces +
-day-count + time-delimiter + hour + time-delimiter + minute +
-opt-second.  Output format: @samp{DD HH:MM}.  Seconds and fractional
-seconds are available with @var{w} of at least 8 and 10, respectively.
-
-@item WKDAYw: 2 <= iw,ow <= 40
-A weekday as a number between 1 and 7, where 1 is Sunday.  Input format:
-leader + weekday + trailer.  Output format: as many characters, in all
-capital letters, of the English name of the weekday as will fit in the
-field width.
-
-@item MONTHw: 3 <= iw,ow <= 40
-A month as a number between 1 and 12, where 1 is January.  Input format:
-leader + month + trailer.  Output format: as many character, in all
-capital letters, of the English name of the month as will fit in the
-field width.
-@end table
+The WKDAY and MONTH formats provide input and output for the names of
+weekdays and months, respectively.
 
 
-There are only two formats that may be used with string variables:
+On output, these formats convert a number between 1 and 7, for WKDAY, or
+between 1 and 12, for MONTH, into the English name of a day or month,
+respectively.  If the name is longer than the field, it is trimmed to
+fit.  If the name is shorter than the field, it is padded on the right
+with spaces.  Values outside the valid range, and the system-missing
+value, are output as all spaces.
 
 
-@table @asis
-@item Aw: 1 <= iw <= 255, 1 <= ow <= 254
-The entire field is treated as a string value.
+On input, English weekday or month names (in uppercase or lowercase) are
+converted back to their corresponding numbers.  Weekday and month names
+may be abbreviated to their first 2 or 3 letters, respectively.
 
 
-@item AHEXw @result{} A: 2 <= iw <= 254; 2 <= ow <= 510
-The field is composed of characters in a string encoded as textual hex
-digit pairs.
+The field width may range from 2 to 40, for WKDAY, or from 3 to 40, for
+MONTH.  No decimal places are allowed.
 
 
-The default output @var{w} is half the input @var{w}.
-@end table
+The default output format is the same as the input format.
+
+@node String Formats
+@subsubsection String Formats
+
+The A and AHEX formats are the only ones that may be assigned to string
+variables.  Neither format allows any decimal places.
+
+In A format, the entire field is treated as a string value.  The field
+width may range from 1 to 32,767, the maximum string width.  The default
+output format is the same as the input format.
+
+In AHEX format, the field is composed of characters in a string encoded
+as hex digit pairs.  On output, hex digits are output in uppercase; on
+input, uppercase and lowercase are both accepted.  The default output
+format is A format with half the input width.
 
 
-@node Scratch Variables,  , Input/Output Formats, Variables
+@node Scratch Variables,  , Input and Output Formats, Variables
 @subsection Scratch Variables
 
 Most of the time, variables don't retain their values between cases.
 @subsection Scratch Variables
 
 Most of the time, variables don't retain their values between cases.
index 327f67391210f640b810dc798d284cb2fa522e64..d8b08a45c7f99ef5cdbcca584f0e326523d8655a 100644 (file)
@@ -287,7 +287,7 @@ one or more @dfn{test} variables for each case.
 
 The target variable values are always nonnegative integers.  They are
 never missing.  The target variable is assigned an F8.2 output format.
 
 The target variable values are always nonnegative integers.  They are
 never missing.  The target variable is assigned an F8.2 output format.
-@xref{Input/Output Formats}.  Any variables, including long and short
+@xref{Input and Output Formats}.  Any variables, including long and short
 string variables, may be test variables.
 
 User-missing values of test variables are treated just like any other
 string variables, may be test variables.
 
 User-missing values of test variables are treated just like any other
index 54ae7b3b9e5e2e9be189b171c8e4eaac5a63d88a..3196684966eadb474eafe4ca6e0c87baa73ec656 100644 (file)
@@ -88,6 +88,8 @@ DISPLAY FILE LABEL.
 active file,
 if any.  @xref{FILE LABEL}.
 
 active file,
 if any.  @xref{FILE LABEL}.
 
+This command is a PSPP extension.
+
 @node DROP DOCUMENTS, ECHO, DISPLAY FILE LABEL, Utilities
 @section DROP DOCUMENTS
 @vindex DROP DOCUMENTS
 @node DROP DOCUMENTS, ECHO, DISPLAY FILE LABEL, Utilities
 @section DROP DOCUMENTS
 @vindex DROP DOCUMENTS
@@ -232,6 +234,8 @@ SET
         /DECIMAL=@{DOT,COMMA@}
         /FORMAT=fmt_spec
         /EPOCH=@{AUTOMATIC,year@}
         /DECIMAL=@{DOT,COMMA@}
         /FORMAT=fmt_spec
         /EPOCH=@{AUTOMATIC,year@}
+        /RIB=@{NATIVE,MSBFIRST,LSBFIRST,VAX@}
+        /RRB=@{NATIVE,ISL,ISB,IDL,IDB,VF,VD,VG,ZS,ZL@}
 
 (program input)
         /ENDCMD='.'
 
 (program input)
         /ENDCMD='.'
@@ -258,6 +262,8 @@ SET
         /CC@{A,B,C,D,E@}=@{'npre,pre,suf,nsuf','npre.pre.suf.nsuf'@}
         /DECIMAL=@{DOT,COMMA@}
         /FORMAT=fmt_spec
         /CC@{A,B,C,D,E@}=@{'npre,pre,suf,nsuf','npre.pre.suf.nsuf'@}
         /DECIMAL=@{DOT,COMMA@}
         /FORMAT=fmt_spec
+        /WIB=@{NATIVE,MSBFIRST,LSBFIRST,VAX@}
+        /WRB=@{NATIVE,ISL,ISB,IDL,IDB,VF,VD,VG,ZS,ZL@}
 
 (output routing)
         /ECHO=@{ON,OFF@}
 
 (output routing)
         /ECHO=@{ON,OFF@}
@@ -320,22 +326,86 @@ system-missing value to be assigned to null items.  This is the
 default.  Any real value may be assigned.
 
 @item DECIMAL
 default.  Any real value may be assigned.
 
 @item DECIMAL
+@anchor{SET DECIMAL}
 The default DOT setting causes the decimal point character to be
 The default DOT setting causes the decimal point character to be
-@samp{.}.  A setting of COMMA causes the decimal point character to be
-@samp{,}.
+@samp{.} and the grouping character to be @samp{,}.  A setting of COMMA
+causes the decimal point character to be @samp{,} and the grouping
+character to be @samp{.}.
 
 @item FORMAT
 Allows the default numeric input/output format to be specified.  The
 
 @item FORMAT
 Allows the default numeric input/output format to be specified.  The
-default is F8.2.  @xref{Input/Output Formats}.
+default is F8.2.  @xref{Input and Output Formats}.
 
 @item EPOCH
 @anchor{SET EPOCH}
 Specifies the range of years used when a 2-digit year is read from a
 data file or used in a date construction expression (@pxref{Date
 
 @item EPOCH
 @anchor{SET EPOCH}
 Specifies the range of years used when a 2-digit year is read from a
 data file or used in a date construction expression (@pxref{Date
-Construction}).  If a 4-digit year is specified, then 2-digit years
-are interpreted starting from that year, known as the epoch.  If
-AUTOMATIC (the default) is specified, then the epoch begins 69 years
-before the current date.
+Construction}).  If a 4-digit year is specified for the epoch, then
+2-digit years are interpreted starting from that year, known as the
+epoch.  If AUTOMATIC (the default) is specified, then the epoch begins
+69 years before the current date.
+
+@item RIB
+@anchor{SET RIB} 
+
+PSPP extension to set the byte ordering (endianness) used for reading
+data in IB or PIB format (@pxref{Binary and Hexadecimal Numeric
+Formats}).  In MSBFIRST ordering, the most-significant byte appears at
+the left end of a IB or PIB field.  In LSBFIRST ordering, the
+least-significant byte appears at the left end.  VAX ordering is like
+MSBFIRST, except that each pair of bytes is in reverse order.  NATIVE,
+the default, is equivalent to MSBFIRST or LSBFIRST depending on the
+native format of the machine running PSPP.
+
+@item RRB
+@anchor{SET RRB}
+
+PSPP extension to set the floating-point format used for reading data in
+RB format (@pxref{Binary and Hexadecimal Numeric Formats}).  The
+possibilities are:
+
+@table @asis
+@item NATIVE
+The native format of the machine running PSPP.  Equivalent to either IDL
+or IDB.
+
+@item ISL
+32-bit IEEE 754 single-precision floating point, in little-endian byte
+order.
+
+@item ISB
+32-bit IEEE 754 single-precision floating point, in big-endian byte
+order.
+
+@item IDL
+64-bit IEEE 754 double-precision floating point, in little-endian byte
+order.
+
+@item IDB
+64-bit IEEE 754 double-precision floating point, in big-endian byte
+order.
+
+@item VF
+32-bit VAX F format, in VAX-endian byte order.
+
+@item VD
+64-bit VAX D format, in VAX-endian byte order.
+
+@item VG
+64-bit VAX G format, in VAX-endian byte order.
+
+@item ZS
+32-bit IBM Z architecture short format hexadecimal floating point, in
+big-endian byte order.  
+
+@item ZL
+64-bit IBM Z architecture long format hexadecimal floating point, in
+big-endian byte order.
+
+Z architecture also supports IEEE 754 floating point.  The ZS and ZL
+formats are only for use with very old input files.
+@end table
+The default is NATIVE.
 @end table
 
 Program input subcommands affect the way that programs are parsed when
 @end table
 
 Program input subcommands affect the way that programs are parsed when
@@ -408,18 +478,10 @@ subcommands are
 @itemx CCC
 @itemx CCD
 @itemx CCE
 @itemx CCC
 @itemx CCD
 @itemx CCE
-Set up custom currency formats.  The argument is a string which must
-contain exactly three commas or exactly three periods.  If commas, then
-the grouping character for the currency format is @samp{,}, and the
-decimal point character is @samp{.}; if periods, then the situation is
-reversed.  
-
-The commas or periods divide the string into four fields, which are, in
-order, the negative prefix, prefix, suffix, and negative suffix.  When a
-value is formatted using the custom currency format, the prefix precedes
-the value formatted and the suffix follows it.  In addition, if the
-value is negative, the negative prefix precedes the prefix and the
-negative suffix follows the suffix.
+@anchor{CCx Settings}
+
+Set up custom currency formats.  @xref{Custom Currency Formats}, for
+details.
 
 @item DECIMAL
 The default DOT setting causes the decimal point character to be
 
 @item DECIMAL
 The default DOT setting causes the decimal point character to be
@@ -428,7 +490,26 @@ The default DOT setting causes the decimal point character to be
 
 @item FORMAT
 Allows the default numeric input/output format to be specified.  The
 
 @item FORMAT
 Allows the default numeric input/output format to be specified.  The
-default is F8.2.  @xref{Input/Output Formats}.
+default is F8.2.  @xref{Input and Output Formats}.
+
+@item WIB
+@anchor{SET WIB} 
+
+PSPP extension to set the byte ordering (endianness) used for writing
+data in IB or PIB format (@pxref{Binary and Hexadecimal Numeric
+Formats}).  In MSBFIRST ordering, the most-significant byte appears at
+the left end of a IB or PIB field.  In LSBFIRST ordering, the
+least-significant byte appears at the left end.  VAX ordering is like
+MSBFIRST, except that each pair of bytes is in reverse order.  NATIVE,
+the default, is equivalent to MSBFIRST or LSBFIRST depending on the
+native format of the machine running PSPP.
+
+@item WRB
+@anchor{SET WRB}
+
+PSPP extension to set the floating-point format used for writing data in
+RB format (@pxref{Binary and Hexadecimal Numeric Formats}).  The choices
+are the same as SET RIB.  The default is NATIVE.
 @end table
 
 Output routing subcommands affect where the output of transformations
 @end table
 
 Output routing subcommands affect where the output of transformations
index 525c70943c55ac77eb904bfaa85c52c3e06b716e..91b07112fbfa9b463854dd062b3d324c4cd34bdf 100644 (file)
@@ -101,7 +101,7 @@ FORMATS var_list (fmt_spec).
 
 @cmd{FORMATS} set both print and write formats for the specified
 numeric variables to the specified format specification.
 
 @cmd{FORMATS} set both print and write formats for the specified
 numeric variables to the specified format specification.
-@xref{Input/Output Formats}.
+@xref{Input and Output Formats}.
 
 Specify a list of variables followed by a format specification in
 parentheses.  The print and write formats of the specified variables
 
 Specify a list of variables followed by a format specification in
 parentheses.  The print and write formats of the specified variables
@@ -256,7 +256,7 @@ setting their output formats.
 
 Specify a slash (@samp{/}), followed by the names of the new numeric
 variables.  If you wish to set their output formats, follow their names
 
 Specify a slash (@samp{/}), followed by the names of the new numeric
 variables.  If you wish to set their output formats, follow their names
-by an output format specification in parentheses (@pxref{Input/Output
+by an output format specification in parentheses (@pxref{Input and Output
 Formats}); otherwise, the default is F8.2.
 
 Variables created with @cmd{NUMERIC} are initialized to the
 Formats}); otherwise, the default is F8.2.
 
 Variables created with @cmd{NUMERIC} are initialized to the
@@ -333,7 +333,7 @@ transformations.
 
 Specify a slash (@samp{/}), followed by the names of the string
 variables to create and the desired output format specification in
 
 Specify a slash (@samp{/}), followed by the names of the string
 variables to create and the desired output format specification in
-parentheses (@pxref{Input/Output Formats}).  Variable widths are
+parentheses (@pxref{Input and Output Formats}).  Variable widths are
 implicitly derived from the specified output formats.
 
 Created variables are initialized to spaces.
 implicitly derived from the specified output formats.
 
 Created variables are initialized to spaces.
index 60076a0fd41cbbbc8546f44add94dcd49351f48b..4be64ea96654f430c10c3360de8c0fdad05a6d26 100644 (file)
@@ -1,3 +1,27 @@
+Sat Nov  4 15:59:56 2006  Ben Pfaff  <blp@gnu.org>
+
+       * calendar.c (calendar_offset_to_gregorian) Also return the
+       year-of-day.  Change callers to new interface.
+
+       * data-out.c: Completely rewrite internals to conform to SPSS
+       output formats as completely as possible.
+       (data_out) Change interface to put input parameters before output
+       parameters, for consistency with the style I now prefer.  Update
+       all callers.
+       (data_out_get_integer_format) New public function.
+       (data_out_set_integer_format) New public function.
+       (data_out_get_float_format) New public function.
+       (data_out_set_float_format) New public function.
+
+       * data-out.h: New file.  Move prototype for data_out here, from
+       format.h.
+
+       * format.c: (fmt_step_width) Use equality comparison instead of
+       bitwise and, for clarity.
+       (fmt_is_string) Ditto.
+       (fmt_input_to_output) Fix categories that are translated to F
+       format.
+
 Sun Nov  5 08:29:34 WST 2006 John Darrington <john@darrington.wattle.id.au>
 
        * casefilter.c casefilter.h (new files), casefile.c casefile.h 
 Sun Nov  5 08:29:34 WST 2006 John Darrington <john@darrington.wattle.id.au>
 
        * casefilter.c casefilter.h (new files), casefile.c casefile.h 
index 0a6498dd3ad2def303ac79f26b2756cf9e280853..3a38f1265fae0b3013d68840a8ea62aaae609b4d 100644 (file)
@@ -153,14 +153,15 @@ calendar_offset_to_year (int ofs)
 }
 
 /* Takes a count of days from 14 Oct 1582 and translates it into
 }
 
 /* Takes a count of days from 14 Oct 1582 and translates it into
-   a Gregorian calendar date in (*Y,*M,*D).  Dates both before
-   and after the epoch are supported. */
+   a Gregorian calendar date in (*Y,*M,*D).  Also stores the
+   year-relative day number into *YD.  Dates both before and
+   after the epoch are supported. */
 void
 void
-calendar_offset_to_gregorian (int ofs, int *y, int *m, int *d)
+calendar_offset_to_gregorian (int ofs, int *y, int *m, int *d, int *yd)
 {
   int year = *y = calendar_offset_to_year (ofs);
   int january1 = raw_gregorian_to_offset (year, 1, 1);
 {
   int year = *y = calendar_offset_to_year (ofs);
   int january1 = raw_gregorian_to_offset (year, 1, 1);
-  int yday = ofs - january1 + 1;
+  int yday = *yd = ofs - january1 + 1;
   int march1 = january1 + cum_month_days (year, 3);
   int correction = ofs < march1 ? 0 : (is_leap_year (year) ? 1 : 2);
   int month = *m = (12 * (yday - 1 + correction) + 373) / 367;
   int march1 = january1 + cum_month_days (year, 3);
   int correction = ofs < march1 ? 0 : (is_leap_year (year) ? 1 : 2);
   int month = *m = (12 * (yday - 1 + correction) + 373) / 367;
@@ -195,8 +196,8 @@ calendar_offset_to_wday (int ofs)
 int
 calendar_offset_to_month (int ofs) 
 {
 int
 calendar_offset_to_month (int ofs) 
 {
-  int y, m, d;
-  calendar_offset_to_gregorian (ofs, &y, &m, &d);
+  int y, m, d, yd;
+  calendar_offset_to_gregorian (ofs, &y, &m, &d, &yd);
   return m;
 }
 
   return m;
 }
 
@@ -205,7 +206,7 @@ calendar_offset_to_month (int ofs)
 int
 calendar_offset_to_mday (int ofs) 
 {
 int
 calendar_offset_to_mday (int ofs) 
 {
-  int y, m, d;
-  calendar_offset_to_gregorian (ofs, &y, &m, &d);
+  int y, m, d, yd;
+  calendar_offset_to_gregorian (ofs, &y, &m, &d, &yd);
   return d;
 }
   return d;
 }
index 1a70592bcf9e6b64277e1c65db4796c29245219f..f46e71fec0b8c32fb97b763598176a8a63bfe533 100644 (file)
@@ -5,7 +5,7 @@ typedef void calendar_error_func (void *aux, const char *, ...);
 
 double calendar_gregorian_to_offset (int y, int m, int d,
                                      calendar_error_func *, void *aux);
 
 double calendar_gregorian_to_offset (int y, int m, int d,
                                      calendar_error_func *, void *aux);
-void calendar_offset_to_gregorian (int ofs, int *y, int *m, int *d);
+void calendar_offset_to_gregorian (int ofs, int *y, int *m, int *d, int *yd);
 int calendar_offset_to_year (int ofs);
 int calendar_offset_to_month (int ofs);
 int calendar_offset_to_mday (int ofs);
 int calendar_offset_to_year (int ofs);
 int calendar_offset_to_month (int ofs);
 int calendar_offset_to_mday (int ofs);
index 74f97188a66f7da86a50126e729f979c0feb181a..ffc79ecc51be62d9ce9b5e1d317ffc03978b28f2 100644 (file)
    02110-1301, USA. */
 
 #include <config.h>
    02110-1301, USA. */
 
 #include <config.h>
-#include <libpspp/message.h>
+
+#include "data-out.h"
+
 #include <ctype.h>
 #include <ctype.h>
-#include <math.h>
 #include <float.h>
 #include <float.h>
+#include <math.h>
+#include <stdint.h>
 #include <stdlib.h>
 #include <time.h>
 #include <stdlib.h>
 #include <time.h>
+
 #include "calendar.h"
 #include "calendar.h"
-#include <libpspp/assertion.h>
-#include <libpspp/message.h>
 #include "format.h"
 #include "format.h"
+#include "settings.h"
+#include "variable.h"
+
+#include <libpspp/assertion.h>
+#include <libpspp/float-format.h>
+#include <libpspp/integer-format.h>
 #include <libpspp/magic.h>
 #include <libpspp/magic.h>
+#include <libpspp/message.h>
 #include <libpspp/misc.h>
 #include <libpspp/misc.h>
 #include <libpspp/misc.h>
 #include <libpspp/misc.h>
-#include "settings.h"
 #include <libpspp/str.h>
 #include <libpspp/str.h>
-#include "variable.h"
+
+#include "minmax.h"
 
 #include "gettext.h"
 #define _(msgid) gettext (msgid)
 \f
 
 #include "gettext.h"
 #define _(msgid) gettext (msgid)
 \f
-/* Public functions. */
-
-typedef int numeric_converter (char *, const struct fmt_spec *, double);
-static numeric_converter convert_F, convert_N, convert_E, convert_F_plus;
-static numeric_converter convert_Z, convert_IB, convert_P, convert_PIB;
-static numeric_converter convert_PIBHEX, convert_PK, convert_RB;
-static numeric_converter convert_RBHEX, convert_CCx, convert_date;
-static numeric_converter convert_time, convert_WKDAY, convert_MONTH;
-
-static numeric_converter try_F, convert_infinite;
-
-typedef int string_converter (char *, const struct fmt_spec *, const char *);
-static string_converter convert_A, convert_AHEX;
+/* A representation of a number that can be quickly rounded to
+   any desired number of decimal places (up to a specified
+   maximum). */
+struct rounder
+  {
+    char string[64];    /* Magnitude of number with excess precision. */
+    int integer_digits; /* Number of digits before decimal point. */
+    int leading_nines;  /* Number of `9's or `.'s at start of string. */
+    int leading_zeros;  /* Number of `0's or `.'s at start of string. */
+    bool negative;      /* Is the number negative? */
+  };
 
 
-/* Converts binary value V into printable form in the exactly
-   FP->W character in buffer S according to format specification
-   FP.  No null terminator is appended to the buffer.  */
-bool
-data_out (char *s, const struct fmt_spec *fp, const union value *v)
+static void rounder_init (struct rounder *, double number, int max_decimals);
+static int rounder_width (const struct rounder *, int decimals,
+                          int *integer_digits, bool *negative);
+static void rounder_format (const struct rounder *, int decimals,
+                            char *output);
+\f
+/* Format of integers in output (SET WIB). */
+static enum integer_format output_integer_format = INTEGER_NATIVE;
+
+/* Format of reals in output (SET WRB). */
+static enum float_format output_float_format = FLOAT_NATIVE_DOUBLE;
+
+typedef void data_out_converter_func (const union value *,
+                                      const struct fmt_spec *,
+                                      char *);
+#define FMT(NAME, METHOD, IMIN, OMIN, IO, CATEGORY) \
+        static data_out_converter_func output_##METHOD;
+#include "format.def"
+
+static bool output_decimal (const struct rounder *, const struct fmt_spec *,
+                            bool require_affixes, char *);
+static bool output_scientific (double, const struct fmt_spec *,
+                               bool require_affixes, char *);
+
+static double power10 (int) PURE_FUNCTION;
+static double power256 (int) PURE_FUNCTION;
+
+static void output_infinite (double, const struct fmt_spec *, char *);
+static void output_missing (const struct fmt_spec *, char *);
+static void output_overflow (const struct fmt_spec *, char *);
+static bool output_bcd_integer (double, int digits, char *);
+static void output_binary_integer (uint64_t, int bytes, enum integer_format,
+                                   char *);
+static void output_hex (const void *, size_t bytes, char *);
+\f
+/* Converts the INPUT value into printable form in the exactly
+   FORMAT->W characters in OUTPUT according to format
+   specification FORMAT.  No null terminator is appended to the
+   buffer.  */
+void
+data_out (const union value *input, const struct fmt_spec *format,
+          char *output)
 {
 {
-  int ok;
-
-  assert (fmt_check_output (fp));
-  if (fmt_is_numeric (fp->type)) 
+  static data_out_converter_func *const converters[FMT_NUMBER_OF_FORMATS] = 
     {
     {
-      enum fmt_category category = fmt_get_category (fp->type);
-      double number = v->f;
-
-      /* Handle SYSMIS turning into blanks. */
-      if (!(category & (FMT_CAT_CUSTOM | FMT_CAT_BINARY | FMT_CAT_HEXADECIMAL))
-          && number == SYSMIS)
-        {
-          memset (s, ' ', fp->w);
-          s[fp->w - fp->d - 1] = '.';
-          return true;
-        }
-
-      /* Handle decimal shift. */
-      if ((category & (FMT_CAT_LEGACY | FMT_CAT_BINARY))
-          && number != SYSMIS
-          && fp->d)
-        number *= pow (10.0, fp->d);
-
-      switch (fp->type) 
-        {
-        case FMT_F:
-          ok = convert_F (s, fp, number);
-          break;
-
-        case FMT_N:
-          ok = convert_N (s, fp, number);
-          break;
-
-        case FMT_E:
-          ok = convert_E (s, fp, number);
-          break;
-
-        case FMT_COMMA: case FMT_DOT: case FMT_DOLLAR: case FMT_PCT:
-          ok = convert_F_plus (s, fp, number);
-          break;
-
-        case FMT_Z:
-          ok = convert_Z (s, fp, number);
-          break;
-
-        case FMT_A:
-          NOT_REACHED ();
-
-        case FMT_AHEX:
-          NOT_REACHED ();
-
-        case FMT_IB:
-          ok = convert_IB (s, fp, number);
-          break;
-
-        case FMT_P:
-          ok = convert_P (s, fp, number);
-          break;
-
-        case FMT_PIB:
-          ok = convert_PIB (s, fp, number);
-          break;
-
-        case FMT_PIBHEX:
-          ok = convert_PIBHEX (s, fp, number);
-          break;
-
-        case FMT_PK:
-          ok = convert_PK (s, fp, number);
-          break;
+#define FMT(NAME, METHOD, IMIN, OMIN, IO, CATEGORY) output_##METHOD,
+#include "format.def"
+    };
 
 
-        case FMT_RB:
-          ok = convert_RB (s, fp, number);
-          break;
+  assert (fmt_check_output (format));
 
 
-        case FMT_RBHEX:
-          ok = convert_RBHEX (s, fp, number);
-          break;
+  converters[format->type] (input, format, output);
+}
 
 
-        case FMT_CCA: case FMT_CCB: case FMT_CCC: case FMT_CCD: case FMT_CCE:
-          ok = convert_CCx (s, fp, number);
-          break;
+/* Returns the current output integer format. */
+enum integer_format
+data_out_get_integer_format (void) 
+{
+  return output_integer_format;
+}
 
 
-        case FMT_DATE: case FMT_EDATE: case FMT_SDATE: case FMT_ADATE:
-        case FMT_JDATE: case FMT_QYR: case FMT_MOYR: case FMT_WKYR:
-        case FMT_DATETIME: 
-          ok = convert_date (s, fp, number);
-          break;
+/* Sets the output integer format to INTEGER_FORMAT. */
+void
+data_out_set_integer_format (enum integer_format integer_format) 
+{
+  output_integer_format = integer_format;
+}
 
 
-        case FMT_TIME: case FMT_DTIME:
-          ok = convert_time (s, fp, number);
-          break;
+/* Returns the current output float format. */
+enum float_format
+data_out_get_float_format (void) 
+{
+  return output_float_format;
+}
 
 
-        case FMT_WKDAY:
-          ok = convert_WKDAY (s, fp, number);
-          break;
+/* Sets the output float format to FLOAT_FORMAT. */
+void
+data_out_set_float_format (enum float_format float_format) 
+{
+  output_float_format = float_format;
+}
+\f
+/* Main conversion functions. */
 
 
-        case FMT_MONTH:
-          ok = convert_MONTH (s, fp, number);
-          break;
+/* Outputs F, COMMA, DOT, DOLLAR, PCT, E, CCA, CCB, CCC, CCD, and
+   CCE formats. */
+static void
+output_number (const union value *input, const struct fmt_spec *format,
+               char *output)
+{
+  double number = input->f;
 
 
-        default:
-          NOT_REACHED ();
-        }
-    }
+  if (number == SYSMIS)
+    output_missing (format, output);
+  else if (!isfinite (number))
+    output_infinite (number, format, output);
   else 
     {
   else 
     {
-      /* String formatting. */
-      const char *string = v->s;
-
-      switch (fp->type) 
+      if (format->type != FMT_E && fabs (number) < 1.5 * power10 (format->w)) 
         {
         {
-        case FMT_A:
-          ok = convert_A (s, fp, string);
-          break;
-
-        case FMT_AHEX:
-          ok = convert_AHEX (s, fp, string);
-          break;
+          struct rounder r;
+          rounder_init (&r, number, format->d);
 
 
-        default:
-          NOT_REACHED ();
+          if (output_decimal (&r, format, true, output)
+              || output_scientific (number, format, true, output)
+              || output_decimal (&r, format, false, output))
+            return;
         }
         }
-    }
-
-  /* Error handling. */
-  if (!ok)
-    strncpy (s, "ERROR", fp->w);
-  
-  return ok;
-}
-\f
-/* Main conversion functions. */
-
-static void insert_commas (char *dst, const char *src,
-                          const struct fmt_spec *fp);
-static int year4 (int year);
-static int try_CCx (char *s, const struct fmt_spec *fp, double v);
-
-#if FLT_RADIX!=2
-#error Write your own floating-point output routines.
-#endif
-
-/* Converts a number between 0 and 15 inclusive to a `hexit'
-   [0-9A-F]. */
-#define MAKE_HEXIT(X) ("0123456789ABCDEF"[X])
-
-/* Table of powers of 10. */
-static const double power10[] =
-  {
-    0, /* Not used. */
-    1e01, 1e02, 1e03, 1e04, 1e05, 1e06, 1e07, 1e08, 1e09, 1e10,
-    1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 1e20,
-    1e21, 1e22, 1e23, 1e24, 1e25, 1e26, 1e27, 1e28, 1e29, 1e30,
-    1e31, 1e32, 1e33, 1e34, 1e35, 1e36, 1e37, 1e38, 1e39, 1e40,
-  };
 
 
-/* Handles F format. */
-static int
-convert_F (char *dst, const struct fmt_spec *fp, double number)
-{
-  if (!try_F (dst, fp, number))
-    convert_E (dst, fp, number);
-  return 1;
+      if (!output_scientific (number, format, false, output))
+        output_overflow (format, output);
+    }
 }
 
 }
 
-/* Handles N format. */
-static int
-convert_N (char *dst, const struct fmt_spec *fp, double number)
+/* Outputs N format. */
+static void
+output_N (const union value *input, const struct fmt_spec *format,
+          char *output)
 {
 {
-  double d = floor (number);
-
-  if (d < 0 || d == SYSMIS)
-    {
-      msg (ME, _("The N output format cannot be used to output a "
-                "negative number or the system-missing value."));
-      return 0;
-    }
-  
-  if (d < power10[fp->w])
+  double number = input->f * power10 (format->d);
+  if (input->f == SYSMIS || number < 0)
+    output_missing (format, output);
+  else
     {
       char buf[128];
     {
       char buf[128];
-      sprintf (buf, "%0*.0f", fp->w, number);
-      memcpy (dst, buf, fp->w);
+      number = fabs (round (number));
+      if (number < power10 (format->w)
+          && sprintf (buf, "%0*.0f", format->w, number) == format->w)
+        memcpy (output, buf, format->w);
+      else
+        output_overflow (format, output);
     }
     }
-  else
-    memset (dst, '*', fp->w);
-
-  return 1;
 }
 
 }
 
-/* Handles E format.  Also operates as fallback for some other
-   formats. */
-static int
-convert_E (char *dst, const struct fmt_spec *fp, double number)
+/* Outputs Z format. */
+static void
+output_Z (const union value *input, const struct fmt_spec *format,
+          char *output)
 {
 {
-  /* Temporary buffer. */
+  double number = input->f * power10 (format->d);
   char buf[128];
   char buf[128];
-  
-  /* Ranged number of decimal places. */
-  int d;
-
-  if (!finite (number))
-    return convert_infinite (dst, fp, number);
-
-  /* Check that the format is wide enough.
-     Although PSPP generally checks this, convert_E() can be called as
-     a fallback from other formats which do not check. */
-  if (fp->w < 6)
-    {
-      memset (dst, '*', fp->w);
-      return 1;
-    }
-
-  /* Put decimal places in usable range. */
-  d = min (fp->d, fp->w - 6);
-  if (number < 0)
-    d--;
-  if (d < 0)
-    d = 0;
-  sprintf (buf, "%*.*E", fp->w, d, number);
-
-  /* What we do here is force the exponent part to have four
-     characters whenever possible.  That is, 1.00E+99 is okay (`E+99')
-     but 1.00E+100 (`E+100') must be coerced to 1.00+100 (`+100').  On
-     the other hand, 1.00E1000 (`E+100') cannot be canonicalized.
-     Note that ANSI C guarantees at least two digits in the
-     exponent. */
-  if (fabs (number) > 1e99)
-    {
-      /* Pointer to the `E' in buf. */
-      char *cp;
-
-      cp = strchr (buf, 'E');
-      if (cp)
-       {
-         /* Exponent better not be bigger than an int. */
-         int exp = atoi (cp + 1); 
-
-         if (abs (exp) > 99 && abs (exp) < 1000)
-           {
-             /* Shift everything left one place: 1.00e+100 -> 1.00+100. */
-             cp[0] = cp[1];
-             cp[1] = cp[2];
-             cp[2] = cp[3];
-             cp[3] = cp[4];
-           }
-         else if (abs (exp) >= 1000)
-           memset (buf, '*', fp->w);
-       }
-    }
-
-  /* The C locale always uses a period `.' as a decimal point.
-     Translate to comma if necessary. */
-  if (fmt_decimal_char (fp->type) != '.')
+  if (input->f == SYSMIS)
+    output_missing (format, output);
+  else if (fabs (number) >= power10 (format->w)
+           || sprintf (buf, "%0*.0f", format->w,
+                       fabs (round (number))) != format->w)
+    output_overflow (format, output);
+  else
     {
     {
-      char *cp = strchr (buf, '.');
-      if (cp)
-       *cp = fmt_decimal_char (fp->type);
+      if (number < 0 && strspn (buf, "0") < format->w) 
+        {
+          char *p = &buf[format->w - 1];
+          *p = "}JKLMNOPQR"[*p - '0'];
+        }
+      memcpy (output, buf, format->w); 
     }
     }
-
-  memcpy (dst, buf, fp->w);
-  return 1;
 }
 
 }
 
-/* Handles COMMA, DOT, DOLLAR, and PCT formats. */
-static int
-convert_F_plus (char *dst, const struct fmt_spec *fp, double number)
+/* Outputs P format. */
+static void
+output_P (const union value *input, const struct fmt_spec *format,
+          char *output)
 {
 {
-  char buf[40];
-  
-  if (try_F (buf, fp, number))
-    insert_commas (dst, buf, fp);
+  if (output_bcd_integer (fabs (input->f * power10 (format->d)),
+                          format->w * 2 - 1, output)
+      && input->f < 0.0)
+    output[format->w - 1] |= 0xd;
   else
   else
-    convert_E (dst, fp, number);
-
-  return 1;
+    output[format->w - 1] |= 0xf;
 }
 
 }
 
-static int
-convert_Z (char *dst, const struct fmt_spec *fp, double number)
+/* Outputs PK format. */
+static void
+output_PK (const union value *input, const struct fmt_spec *format,
+           char *output)
 {
 {
-  static bool warned = false;
-
-  if (!warned)
-    {
-      msg (MW, 
-       _("Quality of zoned decimal (Z) output format code is "
-          "suspect.  Check your results. Report bugs to %s."),
-       PACKAGE_BUGREPORT);
-      warned = 1;
-    }
+  output_bcd_integer (input->f * power10 (format->d), format->w * 2, output);
+}
 
 
-  if (number == SYSMIS)
+/* Outputs IB format. */
+static void
+output_IB (const union value *input, const struct fmt_spec *format,
+           char *output)
+{
+  double number = round (input->f * power10 (format->d));
+  if (input->f == SYSMIS
+      || number >= power256 (format->w) / 2 - 1
+      || number < -power256 (format->w) / 2)
+    memset (output, 0, format->w);
+  else
     {
     {
-      msg (ME, _("The system-missing value cannot be output as a zoned "
-                "decimal number."));
-      return 0;
+      uint64_t integer = fabs (number);
+      if (number < 0)
+        integer = -integer;
+      output_binary_integer (integer, format->w, output_integer_format,
+                             output);
     }
     }
-  
-  {
-    char buf[41];
-    double d;
-    int i;
-    
-    d = fabs (floor (number));
-    if (d >= power10[fp->w])
-      {
-       msg (ME, _("Number %g too big to fit in field with format Z%d.%d."),
-            number, fp->w, fp->d);
-       return 0;
-      }
-
-    sprintf (buf, "%*.0f", fp->w, number);
-    for (i = 0; i < fp->w; i++)
-      dst[i] = (buf[i] - '0') | 0xf0;
-    if (number < 0)
-      dst[fp->w - 1] &= 0xdf;
-  }
-
-  return 1;
 }
 
 }
 
-static int
-convert_A (char *dst, const struct fmt_spec *fp, const char *string)
+/* Outputs PIB format. */
+static void
+output_PIB (const union value *input, const struct fmt_spec *format,
+            char *output)
 {
 {
-  memcpy(dst, string, fp->w);
-  return 1;
+  double number = round (input->f * power10 (format->d));
+  if (input->f == SYSMIS
+      || number < 0 || number >= power256 (format->w))
+    memset (output, 0, format->w);
+  else
+    output_binary_integer (number, format->w, output_integer_format, output);
 }
 
 }
 
-static int
-convert_AHEX (char *dst, const struct fmt_spec *fp, const char *string)
+/* Outputs PIBHEX format. */
+static void
+output_PIBHEX (const union value *input, const struct fmt_spec *format,
+               char *output)
 {
 {
-  int i;
-
-  for (i = 0; i < fp->w / 2; i++)
+  double number = round (input->f);
+  if (input->f == SYSMIS)
+    output_missing (format, output);
+  else if (input->f < 0 || number >= power256 (format->w / 2))
+    output_overflow (format, output);
+  else
     {
     {
-      *dst++ = MAKE_HEXIT ((string[i]) >> 4);
-      *dst++ = MAKE_HEXIT ((string[i]) & 0xf);
+      char tmp[8];
+      output_binary_integer (number, format->w / 2, INTEGER_MSB_FIRST, tmp);
+      output_hex (tmp, format->w / 2, output);
     }
     }
-
-  return 1;
 }
 
 }
 
-static int
-convert_IB (char *dst, const struct fmt_spec *fp, double number)
+/* Outputs RB format. */
+static void
+output_RB (const union value *input, const struct fmt_spec *format,
+           char *output)
 {
 {
-  /* Strategy: Basically the same as convert_PIBHEX() but with
-     base 256. Then negate the two's-complement result if number
-     is negative. */
-
-  /* Used for constructing the two's-complement result. */
-  unsigned temp[8];
+  double d = input->f;
+  memcpy (output, &d, format->w);
+}
 
 
-  /* Fraction (mantissa). */
-  double frac;
+/* Outputs RBHEX format. */
+static void
+output_RBHEX (const union value *input, const struct fmt_spec *format,
+              char *output)
+{
+  double d = input->f;
+  output_hex (&d, format->w / 2, output);
+}
 
 
-  /* Exponent. */
-  int exp;
+/* Outputs DATE, ADATE, EDATE, JDATE, SDATE, QYR, MOYR, WKYR,
+   DATETIME, TIME, and DTIME formats. */
+static void
+output_date (const union value *input, const struct fmt_spec *format,
+             char *output)
+{
+  double number = input->f;
+  double magnitude = fabs (number);
+  int year, month, day, yday;
 
 
-  /* Difference between exponent and (-8*fp->w-1). */
-  int diff;
+  const char *template = fmt_date_template (format->type);
+  size_t template_width = strlen (template);
+  int excess_width = format->w - template_width;
 
 
-  /* Counter. */
-  int i;
+  char tmp[64];
+  char *p = tmp;
 
 
-  /* Make the exponent (-8*fp->w-1). */
-  frac = frexp (fabs (number), &exp);
-  diff = exp - (-8 * fp->w - 1);
-  exp -= diff;
-  frac *= ldexp (1.0, diff);
+  assert (format->w >= template_width);
+  if (number == SYSMIS)
+    goto missing;
 
 
-  /* Extract each base-256 digit. */
-  for (i = 0; i < fp->w; i++)
+  if (fmt_get_category (format->type) == FMT_CAT_DATE) 
     {
     {
-      modf (frac, &frac);
-      frac *= 256.0;
-      temp[i] = floor (frac);
+      if (number <= 0)
+        goto missing;
+      calendar_offset_to_gregorian (number / 60. / 60. / 24.,
+                                    &year, &month, &day, &yday);
     }
     }
+  else
+    year = month = day = yday = 0;
 
 
-  /* Perform two's-complement negation if number is negative. */
-  if (number < 0)
+  while (*template != '\0')
     {
     {
-      /* Perform NOT operation. */
-      for (i = 0; i < fp->w; i++)
-       temp[i] = ~temp[i];
-      /* Add 1 to the whole number. */
-      for (i = fp->w - 1; i >= 0; i--)
-       {
-         temp[i]++;
-         if (temp[i])
-           break;
-       }
+      int ch = *template;
+      int count = 1;
+      while (template[count] == ch) 
+        count++;
+      template += count;
+      
+      switch (ch)
+        {
+        case 'd':
+          if (count < 3)
+            p += sprintf (p, "%02d", day);
+          else
+            p += sprintf (p, "%03d", yday);
+          break;
+        case 'm':
+          if (count < 3)
+            p += sprintf (p, "%02d", month);
+          else
+            {
+              static const char *months[12] =
+                {
+                  "JAN", "FEB", "MAR", "APR", "MAY", "JUN",
+                  "JUL", "AUG", "SEP", "OCT", "NOV", "DEC",
+                };
+              p = stpcpy (p, months[month - 1]); 
+            }
+          break;
+        case 'y':
+          if (count >= 4 || excess_width >= 2) 
+            {
+              if (year <= 9999)
+                p += sprintf (p, "%04d", year);
+              else if (format->type == FMT_DATETIME)
+                p = stpcpy (p, "****");
+              else
+                goto overflow; 
+            }
+          else 
+            {
+              int offset = year - get_epoch ();
+              if (offset < 0 || offset > 99)
+                goto overflow;
+              p += sprintf (p, "%02d", abs (year) % 100); 
+            }
+          break;
+        case 'q':
+          p += sprintf (p, "%d", (month - 1) / 3 + 1);
+          break;
+        case 'w':
+          p += sprintf (p, "%2d", (yday - 1) / 7 + 1);
+          break;
+        case 'D':
+          if (number < 0)
+            *p++ = '-';
+          p += sprintf (p, "%.0f", floor (magnitude / 60. / 60. / 24.));
+          break;
+        case 'h':
+          if (number < 0)
+            *p++ = '-';
+          p += sprintf (p, "%.0f", floor (magnitude / 60. / 60.));
+          break;
+        case 'H':
+          p += sprintf (p, "%02d",
+                        (int) fmod (floor (magnitude / 60. / 60.), 24.));
+          break;
+        case 'M':
+          p += sprintf (p, "%02d",
+                        (int) fmod (floor (magnitude / 60.), 60.));
+          excess_width = format->w - (p - tmp);
+          if (excess_width < 0) 
+            goto overflow;
+          if (excess_width == 3 || excess_width == 4
+              || (excess_width >= 5 && format->d == 0))
+            p += sprintf (p, ":%02d", (int) fmod (magnitude, 60.));
+          else if (excess_width >= 5)
+            {
+              int d = MIN (format->d, excess_width - 4);
+              int w = d + 3;
+              sprintf (p, ":%0*.*f", w, d, fmod (magnitude, 60.));
+              if (fmt_decimal_char (FMT_F) != '.') 
+                {
+                  char *cp = strchr (p, '.');
+                  if (cp != NULL)
+                    *cp = fmt_decimal_char (FMT_F);
+                }
+              p += strlen (p);
+            }
+          break;
+        default:
+          assert (count == 1);
+          *p++ = ch;
+          break; 
+        }
     }
     }
-  memcpy (dst, temp, fp->w);
-#ifndef WORDS_BIGENDIAN
-  buf_reverse (dst, fp->w);
-#endif
-
-  return 1;
-}
-
-static int
-convert_P (char *dst, const struct fmt_spec *fp, double number)
-{
-  /* Buffer for fp->w*2-1 characters + a decimal point if library is
-     not quite compliant + a null. */
-  char buf[17];
-
-  /* Counter. */
-  int i;
-
-  /* Main extraction. */
-  sprintf (buf, "%0*.0f", fp->w * 2 - 1, floor (fabs (number)));
 
 
-  for (i = 0; i < fp->w; i++)
-    ((unsigned char *) dst)[i]
-      = ((buf[i * 2] - '0') << 4) + buf[i * 2 + 1] - '0';
+  buf_copy_lpad (output, format->w, tmp, p - tmp);
+  return;
 
 
-  /* Set sign. */
-  dst[fp->w - 1] &= 0xf0;
-  if (number >= 0.0)
-    dst[fp->w - 1] |= 0xf;
-  else
-    dst[fp->w - 1] |= 0xd;
+ overflow:
+  output_overflow (format, output);
+  return;
 
 
-  return 1;
+ missing:
+  output_missing (format, output);
+  return;
 }
 
 }
 
-static int
-convert_PIB (char *dst, const struct fmt_spec *fp, double number)
+/* Outputs WKDAY format. */
+static void
+output_WKDAY (const union value *input, const struct fmt_spec *format,
+              char *output)
 {
 {
-  /* Strategy: Basically the same as convert_IB(). */
-
-  /* Fraction (mantissa). */
-  double frac;
-
-  /* Exponent. */
-  int exp;
-
-  /* Difference between exponent and (-8*fp->w). */
-  int diff;
-
-  /* Counter. */
-  int i;
-
-  /* Make the exponent (-8*fp->w). */
-  frac = frexp (fabs (number), &exp);
-  diff = exp - (-8 * fp->w);
-  exp -= diff;
-  frac *= ldexp (1.0, diff);
+  static const char *weekdays[7] =
+    {
+      "SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY",
+      "THURSDAY", "FRIDAY", "SATURDAY",
+    };
 
 
-  /* Extract each base-256 digit. */
-  for (i = 0; i < fp->w; i++)
+  if (input->f >= 1 && input->f < 8)
+    buf_copy_str_rpad (output, format->w, weekdays[(int) input->f - 1]);
+  else
     {
     {
-      modf (frac, &frac);
-      frac *= 256.0;
-      ((unsigned char *) dst)[i] = floor (frac);
+      if (input->f != SYSMIS)
+        msg (ME, _("Weekday number %f is not between 1 and 7."), input->f);
+      output_missing (format, output);
     }
     }
-#ifndef WORDS_BIGENDIAN
-  buf_reverse (dst, fp->w);
-#endif
-
-  return 1;
 }
 
 }
 
-static int
-convert_PIBHEX (char *dst, const struct fmt_spec *fp, double number)
+/* Outputs MONTH format. */
+static void
+output_MONTH (const union value *input, const struct fmt_spec *format,
+              char *output)
 {
 {
-  /* Strategy: Use frexp() to create a normalized result (but mostly
-     to find the base-2 exponent), then change the base-2 exponent to
-     (-4*fp->w) using multiplication and division by powers of two.
-     Extract each hexit by multiplying by 16. */
-
-  /* Fraction (mantissa). */
-  double frac;
-
-  /* Exponent. */
-  int exp;
-
-  /* Difference between exponent and (-4*fp->w). */
-  int diff;
-
-  /* Counter. */
-  int i;
-
-  /* Make the exponent (-4*fp->w). */
-  frac = frexp (fabs (number), &exp);
-  diff = exp - (-4 * fp->w);
-  exp -= diff;
-  frac *= ldexp (1.0, diff);
+  static const char *months[12] =
+    {
+      "JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE",
+      "JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER",
+    };
 
 
-  /* Extract each hexit. */
-  for (i = 0; i < fp->w; i++)
+  if (input->f >= 1 && input->f < 13)
+    buf_copy_str_rpad (output, format->w, months[(int) input->f - 1]);
+  else
     {
     {
-      modf (frac, &frac);
-      frac *= 16.0;
-      *dst++ = MAKE_HEXIT ((int) floor (frac));
+      if (input->f != SYSMIS)
+        msg (ME, _("Month number %f is not between 1 and 12."), input->f);
+      output_missing (format, output);
     }
     }
-
-  return 1;
 }
 
 }
 
-static int
-convert_PK (char *dst, const struct fmt_spec *fp, double number)
+/* Outputs A format. */
+static void
+output_A (const union value *input, const struct fmt_spec *format,
+          char *output)
 {
 {
-  /* Buffer for fp->w*2 characters + a decimal point if library is not
-     quite compliant + a null. */
-  char buf[18];
-
-  /* Counter. */
-  int i;
-
-  /* Main extraction. */
-  sprintf (buf, "%0*.0f", fp->w * 2, floor (fabs (number)));
-
-  for (i = 0; i < fp->w; i++)
-    ((unsigned char *) dst)[i]
-      = ((buf[i * 2] - '0') << 4) + buf[i * 2 + 1] - '0';
-
-  return 1;
+  memcpy (output, input->s, format->w);
 }
 
 }
 
-static int
-convert_RB (char *dst, const struct fmt_spec *fp, double number)
+/* Outputs AHEX format. */
+static void
+output_AHEX (const union value *input, const struct fmt_spec *format,
+             char *output)
 {
 {
-  union
-    {
-      double d;
-      char c[8];
-    }
-  u;
-
-  u.d = number;
-  memcpy (dst, u.c, fp->w);
-
-  return 1;
+  output_hex (input->s, format->w, output);
 }
 }
+\f
+/* Decimal and scientific formatting. */
 
 
-static int
-convert_RBHEX (char *dst, const struct fmt_spec *fp, double number)
+/* If REQUEST plus the current *WIDTH fits within MAX_WIDTH,
+   increments *WIDTH by REQUEST and return true.
+   Otherwise returns false without changing *WIDTH. */
+static bool
+allocate_space (int request, int max_width, int *width)
 {
 {
-  union
-  {
-    double d;
-    char c[8];
-  }
-  u;
-
-  int i;
-
-  u.d = number;
-  for (i = 0; i < fp->w / 2; i++)
+  assert (*width <= max_width);
+  if (request + *width <= max_width) 
     {
     {
-      *dst++ = MAKE_HEXIT (u.c[i] >> 4);
-      *dst++ = MAKE_HEXIT (u.c[i] & 15);
+      *width += request;
+      return true;
     }
     }
-
-  return 1;
-}
-
-static int
-convert_CCx (char *dst, const struct fmt_spec *fp, double number)
-{
-  if (try_CCx (dst, fp, number))
-    return 1;
   else
   else
-    {
-      struct fmt_spec f;
-      
-      f.type = FMT_COMMA;
-      f.w = fp->w;
-      f.d = fp->d;
-  
-      return convert_F_plus (dst, &f, number);
-    }
+    return false;
 }
 
 }
 
-static int
-convert_date (char *dst, const struct fmt_spec *fp, double number)
+/* Tries to compose the number represented by R, in the style of
+   FORMAT, into OUTPUT.  Returns true if successful, false on
+   failure, which occurs if FORMAT's width is too narrow.  If
+   REQUIRE_AFFIXES is true, then the prefix and suffix specified
+   by FORMAT's style must be included; otherwise, they may be
+   omitted to make the number fit. */
+static bool
+output_decimal (const struct rounder *r, const struct fmt_spec *format,
+                bool require_affixes, char *output)
 {
 {
-  static const char *months[12] =
-    {
-      "JAN", "FEB", "MAR", "APR", "MAY", "JUN",
-      "JUL", "AUG", "SEP", "OCT", "NOV", "DEC",
-    };
+  const struct fmt_number_style *style = fmt_get_style (format->type);
+  int decimals;
 
 
-  char buf[64] = {0};
-  int ofs = number / 86400.;
-  int month, day, year;
-
-  if (ofs < 1)
-    return 0;
-
-  calendar_offset_to_gregorian (ofs, &year, &month, &day);
-  switch (fp->type)
+  for (decimals = format->d; decimals >= 0; decimals--) 
     {
     {
-    case FMT_DATE:
-      if (fp->w >= 11)
-       sprintf (buf, "%02d-%s-%04d", day, months[month - 1], year);
-      else
-       sprintf (buf, "%02d-%s-%02d", day, months[month - 1], year % 100);
-      break;
-    case FMT_EDATE:
-      if (fp->w >= 10)
-       sprintf (buf, "%02d.%02d.%04d", day, month, year);
-      else
-       sprintf (buf, "%02d.%02d.%02d", day, month, year % 100);
-      break;
-    case FMT_SDATE:
-      if (fp->w >= 10)
-       sprintf (buf, "%04d/%02d/%02d", year, month, day);
-      else
-       sprintf (buf, "%02d/%02d/%02d", year % 100, month, day);
-      break;
-    case FMT_ADATE:
-      if (fp->w >= 10)
-       sprintf (buf, "%02d/%02d/%04d", month, day, year);
-      else
-       sprintf (buf, "%02d/%02d/%02d", month, day, year % 100);
-      break;
-    case FMT_JDATE:
-      {
-        int yday = calendar_offset_to_yday (ofs);
-       
-        if (fp->w < 7)
-          sprintf (buf, "%02d%03d", year % 100, yday); 
-        else if (year4 (year))
-          sprintf (buf, "%04d%03d", year, yday);
-        else
-       break;
-      }
-    case FMT_QYR:
-      if (fp->w >= 8)
-       sprintf (buf, "%d Q% 04d", (month - 1) / 3 + 1, year);
+      /* Formatted version of magnitude of NUMBER. */
+      char magnitude[64];
+
+      /* Number of digits in MAGNITUDE's integer and fractional parts. */
+      int integer_digits;
+
+      /* Amount of space within the field width already claimed.
+         Initially this is the width of MAGNITUDE, then it is reduced
+         in stages as space is allocated to prefixes and suffixes and
+         grouping characters. */
+      int width;
+
+      /* Include various decorations? */
+      bool add_neg_prefix;
+      bool add_affixes;
+      bool add_grouping;
+
+      /* Position in output. */
+      char *p;
+
+      /* Make sure there's room for the number's magnitude, plus
+         the negative suffix, plus (if negative) the negative
+         prefix. */
+      width = rounder_width (r, decimals, &integer_digits, &add_neg_prefix);
+      width += ss_length (style->neg_suffix);
+      if (add_neg_prefix)
+        width += ss_length (style->neg_prefix);
+      if (width > format->w)
+        continue;
+
+      /* If there's room for the prefix and suffix, allocate
+         space.  If the affixes are required, but there's no
+         space, give up. */
+      add_affixes = allocate_space (fmt_affix_width (style),
+                                    format->w, &width);
+      if (!add_affixes && require_affixes)
+        continue;
+      
+      /* Check whether we should include grouping characters.
+         We need room for a complete set or we don't insert any at all.
+         We don't include grouping characters if decimal places were
+         requested but they were all dropped. */
+      add_grouping = (style->grouping != 0
+                      && integer_digits > 3
+                      && (format->d == 0 || decimals > 0)
+                      && allocate_space ((integer_digits - 1) / 3,
+                                         format->w, &width));
+
+      /* Format the number's magnitude. */
+      rounder_format (r, decimals, magnitude);
+  
+      /* Assemble number. */
+      p = output;
+      if (format->w > width)
+        p = mempset (p, ' ', format->w - width);
+      if (add_neg_prefix)
+        p = mempcpy (p, ss_data (style->neg_prefix),
+                     ss_length (style->neg_prefix));
+      if (add_affixes)
+        p = mempcpy (p, ss_data (style->prefix), ss_length (style->prefix));
+      if (!add_grouping)
+        p = mempcpy (p, magnitude, integer_digits);
       else
       else
-       sprintf (buf, "%d Q% 02d", (month - 1) / 3 + 1, year % 100);
-      break;
-    case FMT_MOYR:
-      if (fp->w >= 8)
-       sprintf (buf, "%s% 04d", months[month - 1], year);
+        {
+          int i;
+          for (i = 0; i < integer_digits; i++)
+            {
+              if (i > 0 && (integer_digits - i) % 3 == 0)
+                *p++ = style->grouping;
+              *p++ = magnitude[i];
+            } 
+        }
+      if (decimals > 0)
+        {
+          *p++ = style->decimal;
+          p = mempcpy (p, &magnitude[integer_digits + 1], decimals);
+        }
+      if (add_affixes)
+        p = mempcpy (p, ss_data (style->suffix), ss_length (style->suffix));
+      if (add_neg_prefix)
+        p = mempcpy (p, ss_data (style->neg_suffix),
+                     ss_length (style->neg_suffix));
       else
       else
-       sprintf (buf, "%s% 02d", months[month - 1], year % 100);
-      break;
-    case FMT_WKYR:
-      {
-       int yday = calendar_offset_to_yday (ofs);
-       
-       if (fp->w >= 10)
-         sprintf (buf, "%02d WK% 04d", (yday - 1) / 7 + 1, year);
-       else
-         sprintf (buf, "%02d WK% 02d", (yday - 1) / 7 + 1, year % 100);
-      }
-      break;
-    case FMT_DATETIME:
-      {
-       char *cp;
-
-       cp = spprintf (buf, "%02d-%s-%04d %02d:%02d",
-                      day, months[month - 1], year,
-                      (int) fmod (floor (number / 60. / 60.), 24.),
-                      (int) fmod (floor (number / 60.), 60.));
-       if (fp->w >= 20)
-         {
-           int w, d;
-
-           if (fp->w >= 22 && fp->d > 0)
-             {
-               d = min (fp->d, fp->w - 21);
-               w = 3 + d;
-             }
-           else
-             {
-               w = 2;
-               d = 0;
-             }
-
-           cp = spprintf (cp, ":%0*.*f", w, d, fmod (number, 60.));
-         }
-      }
-      break;
-    default:
-      NOT_REACHED ();
-    }
+        p = mempset (p, ' ', ss_length (style->neg_suffix));
+      assert (p == output + format->w);
 
 
-  if (buf[0] == 0)
-    return 0;
-  buf_copy_str_rpad (dst, fp->w, buf);
-  return 1;
+      return true;
+    }
+  return false;
 }
 
 }
 
-static int
-convert_time (char *dst, const struct fmt_spec *fp, double number)
+/* Formats NUMBER into OUTPUT in scientific notation according to
+   the style of the format specified in FORMAT. */
+static bool
+output_scientific (double number, const struct fmt_spec *format,
+                   bool require_affixes, char *output)
 {
 {
-  char temp_buf[40];
-  char *cp;
-
-  double time;
+  const struct fmt_number_style *style = fmt_get_style (format->type);
   int width;
   int width;
+  int fraction_width;
+  bool add_affixes;
+  char buf[64], *p;
 
 
-  if (fabs (number) > 1e20)
-    {
-      msg (ME, _("Time value %g too large in magnitude to convert to "
-          "alphanumeric time."), number);
-      return 0;
-    }
+  /* Allocate minimum required space. */
+  width = 6 + ss_length (style->neg_suffix);
+  if (number < 0)
+    width += ss_length (style->neg_prefix);
+  if (width > format->w)
+    return false;
+
+  /* Check for room for prefix and suffix. */
+  add_affixes = allocate_space (fmt_affix_width (style), format->w, &width);
+  if (require_affixes && !add_affixes)
+    return false;
+
+  /* Figure out number of characters we can use for the fraction,
+     if any.  (If that turns out to be 1, then we'll output a
+     decimal point without any digits following; that's what the
+     # flag does in the call to sprintf, below.) */
+  fraction_width = MIN (MIN (format->d + 1, format->w - width), 16);
+  if (format->type != FMT_E
+      && (fraction_width == 1
+          || format->w - width + (style->grouping == 0 && number < 0) <= 2))
+    fraction_width = 0; 
+  width += fraction_width;
+
+  /* Format (except suffix). */
+  p = buf;
+  if (width < format->w)
+    p = mempset (p, ' ', format->w - width);
+  if (number < 0)
+    p = mempcpy (p, ss_data (style->neg_prefix),
+                 ss_length (style->neg_prefix));
+  if (add_affixes)
+    p = mempcpy (p, ss_data (style->prefix), ss_length (style->prefix));
+  if (fraction_width > 0)
+    sprintf (p, "%#.*E", fraction_width - 1, fabs (number));
+  else
+    sprintf (p, "%.0E", fabs (number));
 
 
-  time = number;
-  width = fp->w;
-  cp = temp_buf;
-  if (time < 0)
-    *cp++ = '-', time = -time;
-  if (fp->type == FMT_DTIME)
+  /* The C locale always uses a period `.' as a decimal point.
+     Translate to comma if necessary. */
+  if (style->decimal != '.')
     {
     {
-      double days = floor (time / 60. / 60. / 24.);
-      cp = spprintf (temp_buf, "%02.0f ", days);
-      time = time - days * 60. * 60. * 24.;
-      width -= 3;
+      char *cp = strchr (p, '.');
+      if (cp != NULL)
+        *cp = style->decimal;
     }
     }
-  else
-    cp = temp_buf;
-
-  cp = spprintf (cp, "%02.0f:%02.0f",
-                fmod (floor (time / 60. / 60.), 24.),
-                fmod (floor (time / 60.), 60.));
 
 
-  if (width >= 8)
-    {
-      int w, d;
+  /* Make exponent have exactly three digits, plus sign. */
+  {
+    char *cp = strchr (p, 'E') + 1;
+    long int exponent = strtol (cp, NULL, 10);
+    if (abs (exponent) > 999) 
+      return false;
+    sprintf (cp, "%+04ld", exponent);
+  }
 
 
-      if (width >= 10 && fp->d >= 0 && fp->d != 0)
-       d = min (fp->d, width - 9), w = 3 + d;
-      else
-       w = 2, d = 0;
+  /* Add suffixes. */
+  p = strchr (p, '\0');
+  if (add_affixes)
+    p = mempcpy (p, ss_data (style->suffix), ss_length (style->suffix));
+  if (number < 0)
+    p = mempcpy (p, ss_data (style->neg_suffix),
+                 ss_length (style->neg_suffix));
+  else
+    p = mempset (p, ' ', ss_length (style->neg_suffix));
 
 
-      cp = spprintf (cp, ":%0*.*f", w, d, fmod (time, 60.));
-    }
-  buf_copy_str_rpad (dst, fp->w, temp_buf);
+  assert (p == buf + format->w);
 
 
-  return 1;
+  buf_copy_str_lpad (output, format->w, buf);
+  return true;
 }
 }
-
-static int
-convert_WKDAY (char *dst, const struct fmt_spec *fp, double wkday)
+\f
+#ifndef HAVE_ROUND
+/* Return X rounded to the nearest integer,
+   rounding ties away from zero. */
+static double
+round (double x) 
 {
 {
-  static const char *weekdays[7] =
-    {
-      "SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY",
-      "THURSDAY", "FRIDAY", "SATURDAY",
-    };
-
-  if (wkday < 1 || wkday > 7)
-    {
-      msg (ME, _("Weekday index %f does not lie between 1 and 7."),
-           (double) wkday);
-      return 0;
-    }
-  buf_copy_str_rpad (dst, fp->w, weekdays[(int) wkday - 1]);
-
-  return 1;
+  return x >= 0.0 ? floor (x + .5) : ceil (x - .5);
 }
 }
+#endif /* !HAVE_ROUND */
 
 
-static int
-convert_MONTH (char *dst, const struct fmt_spec *fp, double month)
+/* Returns true if the magnitude represented by R should be
+   rounded up when chopped off at DECIMALS decimal places, false
+   if it should be rounded down. */
+static bool
+should_round_up (const struct rounder *r, int decimals) 
 {
 {
-  static const char *months[12] =
-    {
-      "JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE",
-      "JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER",
-    };
-
-  if (month < 1 || month > 12)
-    {
-      msg (ME, _("Month index %f does not lie between 1 and 12."),
-           month);
-      return 0;
-    }
-  
-  buf_copy_str_rpad (dst, fp->w, months[(int) month - 1]);
-
-  return 1;
+  int digit = r->string[r->integer_digits + decimals + 1];
+  assert (digit >= '0' && digit <= '9');
+  return digit >= '5';
 }
 }
-\f
-/* Helper functions. */
 
 
-/* Copies SRC to DST, inserting commas and dollar signs as appropriate
-   for format spec *FP.  */
+/* Initializes R for formatting the magnitude of NUMBER to no
+   more than MAX_DECIMAL decimal places. */
 static void
 static void
-insert_commas (char *dst, const char *src, const struct fmt_spec *fp)
+rounder_init (struct rounder *r, double number, int max_decimals)
 {
 {
-  /* Number of leading spaces in the number.  This is the amount of
-     room we have for inserting commas and dollar signs. */
-  int n_spaces;
-
-  /* Number of digits before the decimal point.  This is used to
-     determine the Number of commas to insert. */
-  int n_digits;
-
-  /* Number of commas to insert. */
-  int n_commas;
-
-  /* Number of items ,%$ to insert. */
-  int n_items;
-
-  /* Number of n_items items not to use for commas. */
-  int n_reserved;
-
-  /* Digit iterator. */
-  int i;
-
-  /* Source pointer. */
-  const char *sp;
-
-  /* Count spaces and digits. */
-  sp = src;
-  while (sp < src + fp->w && *sp == ' ')
-    sp++;
-  n_spaces = sp - src;
-  sp = src + n_spaces;
-  if (*sp == '-')
-    sp++;
-  n_digits = 0;
-  while (sp + n_digits < src + fp->w && isdigit ((unsigned char) sp[n_digits]))
-    n_digits++;
-  n_commas = (n_digits - 1) / 3;
-  n_items = n_commas + (fp->type == FMT_DOLLAR || fp->type == FMT_PCT);
-
-  /* Check whether we have enough space to do insertions. */
-  if (!n_spaces || !n_items)
+  assert (fabs (number) < 1e41);
+  assert (max_decimals >= 0 && max_decimals <= 16);
+  if (max_decimals == 0) 
     {
     {
-      memcpy (dst, src, fp->w);
-      return;
-    }
-  if (n_items > n_spaces)
-    {
-      n_items -= n_commas;
-      if (!n_items)
-       {
-         memcpy (dst, src, fp->w);
-         return;
-       }
-    }
+      /* Fast path.  No rounding needed.
 
 
-  /* Put spaces at the beginning if there's extra room. */
-  if (n_spaces > n_items)
-    {
-      memset (dst, ' ', n_spaces - n_items);
-      dst += n_spaces - n_items;
-    }
-
-  /* Insert $ and reserve space for %. */
-  n_reserved = 0;
-  if (fp->type == FMT_DOLLAR)
-    {
-      *dst++ = '$';
-      n_items--;
+         We append ".00" to the integer representation because
+         round_up assumes that fractional digits are present.  */
+      sprintf (r->string, "%.0f.00", fabs (round (number)));
     }
     }
-  else if (fp->type == FMT_PCT)
-    n_reserved = 1;
-
-  /* Copy negative sign and digits, inserting commas. */
-  if (sp - src > n_spaces)
-    *dst++ = '-';
-  for (i = n_digits; i; i--)
+  else 
     {
     {
-      if (i % 3 == 0 && n_digits > i && n_items > n_reserved)
-       {
-         n_items--;
-         *dst++ = fmt_grouping_char (fp->type);
-       }
-      *dst++ = *sp++;
+      /* Slow path.
+         
+         This is more difficult than it really should be because
+         we have to make sure that numbers that are exactly
+         halfway between two representations are always rounded
+         away from zero.  This is not what sprintf normally does
+         (usually it rounds to even), so we have to fake it as
+         best we can, by formatting with extra precision and then
+         doing the rounding ourselves.
+     
+         We take up to two rounds to format numbers.  In the
+         first round, we obtain 2 digits of precision beyond
+         those requested by the user.  If those digits are
+         exactly "50", then in a second round we format with as
+         many digits as are significant in a "double".
+     
+         It might be better to directly implement our own
+         floating-point formatting routine instead of relying on
+         the system's sprintf implementation.  But the classic
+         Steele and White paper on printing floating-point
+         numbers does not hint how to do what we want, and it's
+         not obvious how to change their algorithms to do so.  It
+         would also be a lot of work. */
+      sprintf (r->string, "%.*f", max_decimals + 2, fabs (number));
+      if (!strcmp (r->string + strlen (r->string) - 2, "50"))
+        {
+          int binary_exponent, decimal_exponent, format_decimals;
+          frexp (number, &binary_exponent);
+          decimal_exponent = binary_exponent * 3 / 10;
+          format_decimals = (DBL_DIG + 1) - decimal_exponent;
+          if (format_decimals > max_decimals + 2)
+            sprintf (r->string, "%.*f", format_decimals, fabs (number));
+        }
     }
     }
+  
+  if (r->string[0] == '0') 
+    memmove (r->string, &r->string[1], strlen (r->string));
 
 
-  /* Copy decimal places and insert % if necessary. */
-  memcpy (dst, sp, fp->w - (sp - src));
-  if (fp->type == FMT_PCT && n_items > 0)
-    dst[fp->w - (sp - src)] = '%';
+  r->leading_zeros = strspn (r->string, "0.");
+  r->leading_nines = strspn (r->string, "9.");
+  r->integer_digits = strchr (r->string, '.') - r->string;
+  r->negative = number < 0;
 }
 
 }
 
-/* Returns 1 if YEAR (i.e., 1987) can be represented in four digits, 0
-   otherwise. */
-static int
-year4 (int year)
-{
-  if (year >= 1 && year <= 9999)
-    return 1;
-  msg (ME, _("Year %d cannot be represented in four digits for "
-            "output formatting purposes."), year);
-  return 0;
-}
+/* Returns the number of characters required to format the
+   magnitude represented by R to DECIMALS decimal places.
+   The return value includes integer digits and a decimal point
+   and fractional digits, if any, but it does not include any
+   negative prefix or suffix or other affixes.
+
+   *INTEGER_DIGITS is set to the number of digits before the
+   decimal point in the output, between 0 and 40.
 
 
+   If R represents a negative number and its rounded
+   representation would include at least one nonzero digit,
+   *NEGATIVE is set to true; otherwise, it is set to false. */
 static int
 static int
-try_CCx (char *dst, const struct fmt_spec *fp, double number)
+rounder_width (const struct rounder *r, int decimals,
+               int *integer_digits, bool *negative) 
 {
 {
-  const struct fmt_number_style *style = fmt_get_style (fp->type);
-
-  struct fmt_spec f;
-
-  char buf[64];
-  char buf2[64];
-  char *cp;
-
-  /* Determine length available, decimal character for number
-     proper. */
-  f.type = style->decimal == fmt_decimal_char (FMT_COMMA) ? FMT_COMMA : FMT_DOT;
-  f.w = fp->w - fmt_affix_width (style);
-  if (number < 0)
-    f.w -= fmt_neg_affix_width (style) - 1;
-  else
-    /* Convert -0 to +0. */
-    number = fabs (number);
-  f.d = fp->d;
-
-  if (f.w <= 0)
-    return 0;
-
-  /* There's room for all that currency crap.  Let's do the F
-     conversion first. */
-  if (!convert_F (buf, &f, number) || *buf == '*')
-    return 0;
-  insert_commas (buf2, buf, &f);
-
-  /* Postprocess back into buf. */
-  cp = buf;
-  if (number < 0)
-    cp = mempcpy (cp, ss_data (style->neg_prefix),
-                  ss_length (style->neg_prefix));
-  cp = mempcpy (cp, ss_data (style->prefix), ss_length (style->prefix));
-  {
-    char *bp = buf2;
-    while (*bp == ' ')
-      bp++;
-
-    assert ((number >= 0) ^ (*bp == '-'));
-    if (number < 0)
-      bp++;
-
-    memcpy (cp, bp, f.w - (bp - buf2));
-    cp += f.w - (bp - buf2);
-  }
-  cp = mempcpy (cp, ss_data (style->suffix), ss_length (style->suffix));
-  if (number < 0)
-    cp = mempcpy (cp, ss_data (style->neg_suffix),
-                  ss_length (style->neg_suffix));
-
-  /* Copy into dst. */
-  assert (cp - buf <= fp->w);
-  if (cp - buf < fp->w)
+  /* Calculate base measures. */
+  int width = r->integer_digits;
+  if (decimals > 0)
+    width += decimals + 1;
+  *integer_digits = r->integer_digits;
+  *negative = r->negative;
+
+  /* Rounding can cause adjustments. */
+  if (should_round_up (r, decimals))
     {
     {
-      memcpy (&dst[fp->w - (cp - buf)], buf, cp - buf);
-      memset (dst, ' ', fp->w - (cp - buf));
+      /* Rounding up leading 9s adds a new digit (a 1). */
+      if (r->leading_nines >= width) 
+        {
+          width++;
+          ++*integer_digits; 
+        }
     }
   else
     }
   else
-    memcpy (dst, buf, fp->w);
-
-  return 1;
+    {
+      /* Rounding down. */
+      if (r->leading_zeros >= width) 
+        {
+          /* All digits that remain after rounding are zeros.
+             Therefore we drop the negative sign. */
+          *negative = false;
+          if (r->integer_digits == 0 && decimals == 0) 
+            {
+              /* No digits at all are left.  We need to display
+                 at least a single digit (a zero). */
+              assert (width == 0);
+              width++;
+              *integer_digits = 1;
+            } 
+        }
+    }
+  return width;
 }
 
 }
 
-static int
-format_and_round (char *dst, double number, const struct fmt_spec *fp,
-                  int decimals);
-
-/* Tries to format NUMBER into DST as the F format specified in
-   *FP.  Return true if successful, false on failure. */
-static int
-try_F (char *dst, const struct fmt_spec *fp, double number)
+/* Formats the magnitude represented by R into OUTPUT, rounding
+   to DECIMALS decimal places.  Exactly as many characters as
+   indicated by rounder_width are written.  No terminating null
+   is appended. */
+static void
+rounder_format (const struct rounder *r, int decimals, char *output) 
 {
 {
-  assert (fp->w <= 40);
-  if (finite (number)) 
+  int base_width = r->integer_digits + (decimals > 0 ? decimals + 1 : 0);
+  if (should_round_up (r, decimals)) 
     {
     {
-      if (fabs (number) < power10[fp->w])
+      if (r->leading_nines < base_width) 
         {
         {
-          /* The value may fit in the field. */
-          if (fp->d == 0) 
+          /* Rounding up.  This is the common case where rounding
+             up doesn't add an extra digit. */
+          char *p;
+          memcpy (output, r->string, base_width);
+          for (p = output + base_width - 1; ; p--) 
             {
             {
-              /* There are no decimal places, so there's no way
-                 that the value can be shortened.  Either it fits
-                 or it doesn't. */
-              char buf[41];
-              sprintf (buf, "%*.0f", fp->w, number);
-              if (strlen (buf) <= fp->w) 
+              assert (p >= output);
+              if (*p == '9')
+                *p = '0';
+              else if (*p >= '0' && *p <= '8') 
                 {
                 {
-                  buf_copy_str_lpad (dst, fp->w, buf);
-                  return true; 
+                  (*p)++;
+                  break;
                 }
                 }
-              else 
-                return false;
-            }
-          else 
-            {
-              /* First try to format it with 2 extra decimal
-                 places.  This gives us a good chance of not
-                 needing even more decimal places, but it also
-                 avoids wasting too much time formatting more
-                 decimal places on the first try. */
-              int result = format_and_round (dst, number, fp, fp->d + 2);
-
-              if (result >= 0)
-                return result;
-
-              /* 2 extra decimal places weren't enough to
-                 correctly round.  Try again with the maximum
-                 number of places. */
-              return format_and_round (dst, number, fp, LDBL_DIG + 1);
+              else
+                assert (*p == '.');
             }
         }
       else 
         {
             }
         }
       else 
         {
-          /* The value is too big to fit in the field. */
-          return false;
+          /* Rounding up leading 9s causes the result to be a 1
+             followed by a number of 0s, plus a decimal point. */
+          char *p = output;
+          *p++ = '1';
+          p = mempset (p, '0', r->integer_digits);
+          if (decimals > 0) 
+            {
+              *p++ = '.';
+              p = mempset (p, '0', decimals);
+            }
+          assert (p == output + base_width + 1);
         }
     }
         }
     }
-  else
-    return convert_infinite (dst, fp, number);
-}
-
-/* Tries to compose NUMBER into DST in format FP by first
-   formatting it with DECIMALS decimal places, then rounding off
-   to as many decimal places will fit or the number specified in
-   FP, whichever is fewer.
-
-   Returns 1 if conversion succeeds, 0 if this try at conversion
-   failed and so will any other tries (because the integer part
-   of the number is too long), or -1 if this try failed but
-   another with higher DECIMALS might succeed (because we'd be
-   able to properly round). */
-static int
-format_and_round (char *dst, double number, const struct fmt_spec *fp,
-                  int decimals)
-{
-  /* Number of characters before the decimal point,
-     which includes digits and possibly a minus sign. */
-  int predot_chars;
-
-  /* Number of digits in the output fraction,
-     which may be smaller than fp->d if there's not enough room. */
-  int fraction_digits;
-
-  /* Points to last digit that will remain in the fraction after
-     rounding. */
-  char *final_frac_dig;
-
-  /* Round up? */
-  bool round_up;
-  
-  char buf[128];
-  
-  assert (decimals > fp->d);
-  if (decimals > LDBL_DIG)
-    decimals = LDBL_DIG + 1;
-
-  sprintf (buf, "%.*f", decimals, number);
-
-  /* Omit integer part if it's 0. */
-  if (!memcmp (buf, "0.", 2))
-    memmove (buf, buf + 1, strlen (buf));
-  else if (!memcmp (buf, "-0.", 3))
-    memmove (buf + 1, buf + 2, strlen (buf + 1));
-
-  predot_chars = strcspn (buf, ".");
-  if (predot_chars > fp->w) 
-    {
-      /* Can't possibly fit. */
-      return 0; 
-    }
-  else if (predot_chars == fp->w)
-    {
-      /* Exact fit for integer part and sign. */
-      memcpy (dst, buf, fp->w);
-      return 1;
-    }
-  else if (predot_chars + 1 == fp->w) 
-    {
-      /* There's room for the decimal point, but not for any
-         digits of the fraction.
-         Right-justify the integer part and sign. */
-      dst[0] = ' ';
-      memcpy (dst + 1, buf, fp->w - 1);
-      return 1;
-    }
-
-  /* It looks like we have room for at least one digit of the
-     fraction.  Figure out how many. */
-  fraction_digits = fp->w - predot_chars - 1;
-  if (fraction_digits > fp->d)
-    fraction_digits = fp->d;
-  final_frac_dig = buf + predot_chars + fraction_digits;
-
-  /* Decide rounding direction and truncate string. */
-  if (final_frac_dig[1] == '5'
-      && strspn (final_frac_dig + 2, "0") == strlen (final_frac_dig + 2)) 
+  else 
     {
     {
-      /* Exactly 1/2. */
-      if (decimals <= LDBL_DIG)
+      /* Rounding down. */
+      if (r->integer_digits != 0 || decimals != 0) 
         {
         {
-          /* Don't have enough fractional digits to know which way to
-             round.  We can format with more decimal places, so go
-             around again. */
-          return -1;
+          /* Common case: just copy the digits. */
+          memcpy (output, r->string, base_width); 
         }
       else 
         {
         }
       else 
         {
-          /* We used up all our fractional digits and still don't
-             know.  Round to even. */
-          round_up = (final_frac_dig[0] - '0') % 2 != 0;
+          /* No digits remain.  The output is just a zero. */
+          output[0] = '0'; 
         }
     }
         }
     }
-  else
-    round_up = final_frac_dig[1] >= '5';
-  final_frac_dig[1] = '\0';
+}
+\f
+/* Helper functions. */
 
 
-  /* Do rounding. */
-  if (round_up) 
+/* Returns 10**X. */
+static double PURE_FUNCTION
+power10 (int x) 
+{
+  static const double p[] =
     {
     {
-      char *cp = final_frac_dig;
-      for (;;) 
-        {
-          if (*cp >= '0' && *cp <= '8')
-            {
-              (*cp)++;
-              break; 
-            }
-          else if (*cp == '9') 
-            *cp = '0';
-          else
-            assert (*cp == '.');
-
-          if (cp == buf || *--cp == '-')
-            {
-              size_t length;
-              
-              /* Tried to go past the leftmost digit.  Insert a 1. */
-              memmove (cp + 1, cp, strlen (cp) + 1);
-              *cp = '1';
-
-              length = strlen (buf);
-              if (length > fp->w) 
-                {
-                  /* Inserting the `1' overflowed our space.
-                     Drop a decimal place. */
-                  buf[--length] = '\0';
-
-                  /* If that was the last decimal place, drop the
-                     decimal point too. */
-                  if (buf[length - 1] == '.')
-                    buf[length - 1] = '\0';
-                }
-              
-              break;
-            }
-        }
-    }
-
-  /* Omit `-' if value output is zero. */
-  if (buf[0] == '-' && buf[strspn (buf, "-.0")] == '\0')
-    memmove (buf, buf + 1, strlen (buf));
+      1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
+      1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
+      1e20, 1e21, 1e22, 1e23, 1e24, 1e25, 1e26, 1e27, 1e28, 1e29,
+      1e30, 1e31, 1e32, 1e33, 1e34, 1e35, 1e36, 1e37, 1e38, 1e39,
+      1e40,
+    };
+  return x >= 0 && x < sizeof p / sizeof *p ? p[x] : pow (10.0, x);
+}
 
 
-  buf_copy_str_lpad (dst, fp->w, buf);
-  return 1;
+/* Returns 256**X. */
+static double PURE_FUNCTION
+power256 (int x) 
+{
+  static const double p[] = 
+    {
+      1.0,
+      256.0,
+      65536.0,
+      16777216.0,
+      4294967296.0,
+      1099511627776.0,
+      281474976710656.0,
+      72057594037927936.0,
+      18446744073709551616.0
+    };
+  return x >= 0 && x < sizeof p / sizeof *p ? p[x] : pow (256.0, x);
 }
 
 }
 
-/* Formats non-finite NUMBER into DST according to the width
-   given in FP. */
-static int
-convert_infinite (char *dst, const struct fmt_spec *fp, double number)
+/* Formats non-finite NUMBER into OUTPUT according to the width
+   given in FORMAT. */
+static void
+output_infinite (double number, const struct fmt_spec *format, char *output)
 {
 {
-  assert (!finite (number));
+  assert (!isfinite (number));
   
   
-  if (fp->w >= 3)
+  if (format->w >= 3)
     {
       const char *s;
 
     {
       const char *s;
 
@@ -1237,10 +963,95 @@ convert_infinite (char *dst, const struct fmt_spec *fp, double number)
       else
         s = "Unknown";
 
       else
         s = "Unknown";
 
-      buf_copy_str_lpad (dst, fp->w, s);
+      buf_copy_str_lpad (output, format->w, s);
     }
   else 
     }
   else 
-    memset (dst, '*', fp->w);
+    output_overflow (format, output);
+}
 
 
-  return true;
+/* Formats OUTPUT as a missing value for the given FORMAT. */
+static void
+output_missing (const struct fmt_spec *format, char *output)
+{
+  memset (output, ' ', format->w);
+
+  if (format->type != FMT_N) 
+    {
+      int dot_ofs = (format->type == FMT_PCT ? 2
+                     : format->type == FMT_E ? 5
+                     : 1);
+      output[MAX (0, format->w - format->d - dot_ofs)] = '.'; 
+    }
+  else
+    output[format->w - 1] = '.';
+}
+
+/* Formats OUTPUT for overflow given FORMAT. */
+static void
+output_overflow (const struct fmt_spec *format, char *output) 
+{
+  memset (output, '*', format->w);
+}
+
+/* Converts the integer part of NUMBER to a packed BCD number
+   with the given number of DIGITS in OUTPUT.  If DIGITS is odd,
+   the least significant nibble of the final byte in OUTPUT is
+   set to 0.  Returns true if successful, false if NUMBER is not
+   representable.  On failure, OUTPUT is cleared to all zero
+   bytes. */
+static bool
+output_bcd_integer (double number, int digits, char *output) 
+{
+  char decimal[64];
+
+  assert (digits < sizeof decimal);
+  if (number != SYSMIS
+      && number >= 0.
+      && number < power10 (digits)
+      && sprintf (decimal, "%0*.0f", digits, round (number)) == digits)
+    {
+      const char *src = decimal;
+      int i;
+
+      for (i = 0; i < digits / 2; i++) 
+        {
+          int d0 = *src++ - '0';
+          int d1 = *src++ - '0';
+          *output++ = (d0 << 4) + d1; 
+        }
+      if (digits % 2)
+        *output = (*src - '0') << 4;
+      
+      return true;
+    }
+  else 
+    {
+      memset (output, 0, digits);
+      return false; 
+    }
+}
+
+/* Writes VALUE to OUTPUT as a BYTES-byte binary integer of the
+   given INTEGER_FORMAT. */
+static void
+output_binary_integer (uint64_t value, int bytes,
+                       enum integer_format integer_format, char *output) 
+{
+  integer_put (value, integer_format, output, bytes);
+}
+
+/* Converts the BYTES bytes in DATA to twice as many hexadecimal
+   digits in OUTPUT. */
+static void
+output_hex (const void *data_, size_t bytes, char *output) 
+{
+  const uint8_t *data = data_;
+  size_t i;
+
+  for (i = 0; i < bytes; i++)
+    {
+      static const char hex_digits[] = "0123456789ABCDEF";
+      *output++ = hex_digits[data[i] >> 4];
+      *output++ = hex_digits[data[i] & 15];
+    }
 }
 }
diff --git a/src/data/data-out.h b/src/data/data-out.h
new file mode 100644 (file)
index 0000000..bf949c8
--- /dev/null
@@ -0,0 +1,37 @@
+/* PSPP - computes sample statistics.
+   Copyright (C) 1997-9, 2000, 2006 Free Software Foundation, Inc.
+   Written by Ben Pfaff <blp@gnu.org>.
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA. */
+
+#ifndef DATA_OUT_H
+#define DATA_OUT_H 1
+
+#include <stdbool.h>
+#include <libpspp/integer-format.h>
+
+struct fmt_spec;
+union value;
+
+void data_out (const union value *, const struct fmt_spec *, char *);
+
+enum integer_format data_out_get_integer_format (void);
+void data_out_set_integer_format (enum integer_format);
+
+enum float_format data_out_get_float_format (void);
+void data_out_set_float_format (enum float_format);
+
+#endif /* data-out.h */
index 3ce41ee0a3089cd9940b9ed048eed6049c14354b..06042d0e7009d67f9cc1f61d307521b524eb9905 100644 (file)
@@ -456,7 +456,7 @@ fmt_max_output_decimals (enum fmt_type type, int width)
 int
 fmt_step_width (enum fmt_type type)
 {
 int
 fmt_step_width (enum fmt_type type)
 {
-  return fmt_get_category (type) & FMT_CAT_HEXADECIMAL ? 2 : 1;
+  return fmt_get_category (type) == FMT_CAT_HEXADECIMAL ? 2 : 1;
 }
 
 /* Returns true if TYPE is used for string fields,
 }
 
 /* Returns true if TYPE is used for string fields,
@@ -464,7 +464,7 @@ fmt_step_width (enum fmt_type type)
 bool
 fmt_is_string (enum fmt_type type)
 {
 bool
 fmt_is_string (enum fmt_type type)
 {
-  return fmt_get_category (type) & FMT_CAT_STRING;
+  return fmt_get_category (type) == FMT_CAT_STRING;
 }
 
 /* Returns true if TYPE is used for numeric fields,
 }
 
 /* Returns true if TYPE is used for numeric fields,
@@ -491,10 +491,19 @@ fmt_get_category (enum fmt_type type)
 enum fmt_type
 fmt_input_to_output (enum fmt_type type)
 {
 enum fmt_type
 fmt_input_to_output (enum fmt_type type)
 {
-  enum fmt_category category = fmt_get_category (type);
-  return (category & FMT_CAT_STRING ? FMT_A
-          : category & (FMT_CAT_BASIC | FMT_CAT_HEXADECIMAL) ? FMT_F
-          : type);
+  switch (fmt_get_category (type)) 
+    {
+    case FMT_CAT_STRING:
+      return FMT_A;
+
+    case FMT_CAT_LEGACY:
+    case FMT_CAT_BINARY:
+    case FMT_CAT_HEXADECIMAL:
+      return FMT_F;
+
+    default:
+      return type;
+    }
 }
 
 /* Returns the SPSS format type corresponding to the given PSPP
 }
 
 /* Returns the SPSS format type corresponding to the given PSPP
@@ -503,7 +512,7 @@ int
 fmt_to_io (enum fmt_type type)
 {
   return get_fmt_desc (type)->io;
 fmt_to_io (enum fmt_type type)
 {
   return get_fmt_desc (type)->io;
-};
+}
 
 /* Determines the PSPP format corresponding to the given SPSS
    format type.  If successful, sets *FMT_TYPE to the PSPP format
 
 /* Determines the PSPP format corresponding to the given SPSS
    format type.  If successful, sets *FMT_TYPE to the PSPP format
index 3678632ea8029b7a5a7022670a8445746186633a..919f1c69e7382727b7028c83198b5d42a77e7c11 100644 (file)
@@ -163,9 +163,5 @@ enum measure
 
 bool measure_is_valid(enum measure m);
 bool alignment_is_valid(enum alignment a);
 
 bool measure_is_valid(enum measure m);
 bool alignment_is_valid(enum alignment a);
-\f
-#include <libpspp/legacy-encoding.h>
-
-bool data_out (char *s, const struct fmt_spec *fp, const union value *v);
 
 #endif /* format.h */
 
 #endif /* format.h */
index ad7f3b81b42424dc6a21fe5973b931fc7daeceb5..96d3dd754a3fab4369f3734735f329075183022b 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <stdlib.h>
 
 
 #include <stdlib.h>
 
+#include <data/data-out.h>
 #include <data/variable.h>
 #include <libpspp/alloc.h>
 #include <libpspp/compiler.h>
 #include <data/variable.h>
 #include <libpspp/alloc.h>
 #include <libpspp/compiler.h>
@@ -545,7 +546,7 @@ value_to_string (const union value *val, const struct variable *var)
   if (s == NULL) 
     {
       static char buf[MAX_STRING + 1];
   if (s == NULL) 
     {
       static char buf[MAX_STRING + 1];
-      data_out (buf, &var->print, val);
+      data_out (val, &var->print, buf);
       buf[var->print.w] = '\0';
       s = buf;
     }
       buf[var->print.w] = '\0';
       s = buf;
     }
index b099a270b49fc3e8d4c7a2f13b62ea68d52ca920..d8256e32d25c504342262e928035d59bbe0cf4d8 100644 (file)
@@ -26,6 +26,7 @@
 #include "size_max.h"
 #include <data/case.h>
 #include <data/dictionary.h>
 #include "size_max.h"
 #include <data/case.h>
 #include <data/dictionary.h>
+#include <data/data-out.h>
 #include <data/format.h>
 #include <data/procedure.h>
 #include <data/variable.h>
 #include <data/format.h>
 #include <data/procedure.h>
 #include <data/variable.h>
@@ -666,15 +667,15 @@ list_cases (const struct ccase *c, void *aux UNUSED, const struct dataset *ds UN
 
             if (fmt_is_string (v->print.type) || v->fv != -1)
              {
 
             if (fmt_is_string (v->print.type) || v->fv != -1)
              {
-                data_out (ds_put_uninit(&line_buffer, v->print.w),
-                         &v->print, case_data (c, v->fv));
+                data_out (case_data (c, v->fv), &v->print,
+                          ds_put_uninit (&line_buffer, v->print.w));
              }
             else 
               {
                 union value case_idx_value;
                 case_idx_value.f = case_idx;
              }
             else 
               {
                 union value case_idx_value;
                 case_idx_value.f = case_idx;
-                data_out (ds_put_uninit(&line_buffer,v->print.w), 
-                         &v->print,   &case_idx_value); 
+                data_out (&case_idx_value, &v->print,
+                          ds_put_uninit (&line_buffer,v->print.w)); 
               }
 
            ds_put_char(&line_buffer, ' ');
               }
 
            ds_put_char(&line_buffer, ' ');
@@ -702,12 +703,12 @@ list_cases (const struct ccase *c, void *aux UNUSED, const struct dataset *ds UN
            char buf[256];
            
             if (fmt_is_string (v->print.type) || v->fv != -1)
            char buf[256];
            
             if (fmt_is_string (v->print.type) || v->fv != -1)
-             data_out (buf, &v->print, case_data (c, v->fv));
+             data_out (case_data (c, v->fv), &v->print, buf);
             else 
               {
                 union value case_idx_value;
                 case_idx_value.f = case_idx;
             else 
               {
                 union value case_idx_value;
                 case_idx_value.f = case_idx;
-                data_out (buf, &v->print, &case_idx_value); 
+                data_out (&case_idx_value, &v->print, buf);
               }
 
             fputs ("    <TD>", x->file);
               }
 
             fputs ("    <TD>", x->file);
index 2bc28a5d9890e8c306d70a5139f4d0b47f638697..262d5397f460114859ea6f9a48ae3ef7cb165fd8 100644 (file)
@@ -22,7 +22,7 @@
 #include <stdlib.h>
 
 #include <data/case.h>
 #include <stdlib.h>
 
 #include <data/case.h>
-#include <data/format.h>
+#include <data/data-out.h>
 #include <data/procedure.h>
 #include <data/transformations.h>
 #include <data/variable.h>
 #include <data/procedure.h>
 #include <data/transformations.h>
 #include <data/variable.h>
@@ -460,7 +460,7 @@ print_trns_proc (void *trns_, struct ccase *c, casenumber case_num UNUSED)
           const union value *input = case_data (c, spec->var->fv);
           char *output = ds_put_uninit (&trns->line, spec->format.w);
           if (!spec->sysmis_as_spaces || input->f != SYSMIS)
           const union value *input = case_data (c, spec->var->fv);
           char *output = ds_put_uninit (&trns->line, spec->format.w);
           if (!spec->sysmis_as_spaces || input->f != SYSMIS)
-            data_out (output, &spec->format, input);
+            data_out (input, &spec->format, output);
           else
             memset (output, ' ', spec->format.w);
           if (spec->add_space)
           else
             memset (output, ' ', spec->format.w);
           if (spec->add_space)
index 726c654702a77d1097bf6f300bad89bc8148f1c1..c0b714fc8f0bd890632d7d0088195a16c1abf7e7 100644 (file)
@@ -1,3 +1,8 @@
+Sat Nov  4 16:04:19 2006  Ben Pfaff  <blp@gnu.org>
+
+       * numeric.c: (cmd_string) Check that output format is valid.
+       Simplify parsing.
+
 Wed Nov  1 20:50:54 2006  Ben Pfaff  <blp@gnu.org>
 
        * sys-file-info.c: (cmd_display) Use compare_var_ptr_names to
 Wed Nov  1 20:50:54 2006  Ben Pfaff  <blp@gnu.org>
 
        * sys-file-info.c: (cmd_display) Use compare_var_ptr_names to
index b7a2331594918d76b1e6adbf0ed013ef5cc8c28b..ae9619638c060d0259fe14d8a64a849c66e444ad 100644 (file)
@@ -128,7 +128,9 @@ cmd_string (struct dataset *ds)
       if (!parse_DATA_LIST_vars (&v, &nv, PV_NONE))
        return CMD_FAILURE;
 
       if (!parse_DATA_LIST_vars (&v, &nv, PV_NONE))
        return CMD_FAILURE;
 
-      if (!lex_force_match ('(') || !parse_format_specifier (&f))
+      if (!lex_force_match ('(')
+          || !parse_format_specifier (&f)
+          || !lex_force_match (')'))
        goto fail;
       if (!fmt_is_string (f.type))
        {
        goto fail;
       if (!fmt_is_string (f.type))
        {
@@ -137,12 +139,8 @@ cmd_string (struct dataset *ds)
                      "variable."), fmt_to_string (&f, str));
          goto fail;
        }
                      "variable."), fmt_to_string (&f, str));
          goto fail;
        }
-
-      if (!lex_match (')'))
-       {
-         msg (SE, _("`)' expected after output format."));
-         goto fail;
-       }
+      if (!fmt_check_output (&f))
+        goto fail;
 
       width = fmt_var_width (&f);
 
 
       width = fmt_var_width (&f);
 
index ef34d7e92c4e06f77e0b18185135c91a65d7143c..8c5a955571dd0f07ff9b6937eb5daf763c512944 100644 (file)
@@ -22,6 +22,7 @@
 #include <stdlib.h>
 
 #include <data/case.h>
 #include <stdlib.h>
 
 #include <data/case.h>
+#include <data/data-out.h>
 #include <data/dictionary.h>
 #include <data/format.h>
 #include <data/procedure.h>
 #include <data/dictionary.h>
 #include <data/format.h>
 #include <data/procedure.h>
@@ -95,7 +96,7 @@ output_split_file_values (const struct dataset *ds, const struct ccase *c)
       assert (v->type == NUMERIC || v->type == ALPHA);
       tab_text (t, 0, i + 1, TAB_LEFT | TAT_PRINTF, "%s", v->name);
       
       assert (v->type == NUMERIC || v->type == ALPHA);
       tab_text (t, 0, i + 1, TAB_LEFT | TAT_PRINTF, "%s", v->name);
       
-      data_out (temp_buf, &v->print, case_data (c, v->fv));
+      data_out (case_data (c, v->fv), &v->print, temp_buf);
       
       temp_buf[v->print.w] = 0;
       tab_text (t, 1, i + 1, TAT_PRINTF, "%.*s", v->print.w, temp_buf);
       
       temp_buf[v->print.w] = 0;
       tab_text (t, 1, i + 1, TAT_PRINTF, "%.*s", v->print.w, temp_buf);
index 0f44b35ff80b367fff44c3732930dd4cc5e786cb..124868cc6b50d70a65a493331da029692542f554 100644 (file)
@@ -13,6 +13,7 @@
 #include <data/calendar.h>
 #include <data/case.h>
 #include <data/data-in.h>
 #include <data/calendar.h>
 #include <data/case.h>
 #include <data/data-in.h>
+#include <data/data-out.h>
 #include <data/dictionary.h>
 #include <data/procedure.h>
 #include <data/settings.h>
 #include <data/dictionary.h>
 #include <data/procedure.h>
 #include <data/settings.h>
index 303c1d5c9103e50ea2b3397f32e3b25bed431702..6b4d5221eaec08b12873162c60be57bf79ed44be 100644 (file)
@@ -587,7 +587,7 @@ absorb_miss string function STRING (x, no_format f)
   v.f = x;
   dst = alloc_string (e, f->w);
   assert (!fmt_is_string (f->type));
   v.f = x;
   dst = alloc_string (e, f->w);
   assert (!fmt_is_string (f->type));
-  data_out (dst.string, f, &v);
+  data_out (&v, f, dst.string);
   return dst;
 }
 
   return dst;
 }
 
index 046f57abf77cf7bf7c10d643aca45105646517c0..d16b2f5bc5fdc771eb382bb3d72a30cb57241aa8 100644 (file)
@@ -24,8 +24,6 @@
 
 #include <data/format.h>
 
 
 #include <data/format.h>
 
-struct fmt_spec;
-
 bool parse_abstract_format_specifier (char type[FMT_TYPE_LEN_MAX + 1],
                                       int *width, int *decimals);
 bool parse_format_specifier (struct fmt_spec *);
 bool parse_abstract_format_specifier (char type[FMT_TYPE_LEN_MAX + 1],
                                       int *width, int *decimals);
 bool parse_format_specifier (struct fmt_spec *);
index cf76b35b79fc34f201b9c98d21bcfb0610591539..67ee5aabaaf0055c25977673e01774624c2d21fa 100644 (file)
@@ -37,6 +37,7 @@
 #include <stdio.h>
 
 #include <data/case.h>
 #include <stdio.h>
 
 #include <data/case.h>
+#include <data/data-out.h>
 #include <data/dictionary.h>
 #include <data/procedure.h>
 #include <data/value-labels.h>
 #include <data/dictionary.h>
 #include <data/procedure.h>
 #include <data/value-labels.h>
@@ -1718,7 +1719,7 @@ format_cell_entry (struct tab_table *table, int c, int r, double value,
   s.length = 10;
   s.string = tab_alloc (table, 16);
   v.f = value;
   s.length = 10;
   s.string = tab_alloc (table, 16);
   v.f = value;
-  data_out (s.string, &f, &v);
+  data_out (&v, &f, s.string);
   while (*s.string == ' ')
     {
       s.length--;
   while (*s.string == ' ')
     {
       s.length--;
@@ -3200,8 +3201,8 @@ format_short (char *s, const struct fmt_spec *fp, const union value *v)
     }
 
   /* Format. */
     }
 
   /* Format. */
-  data_out (s, fp, v);
-  
+  data_out (v, fp, s);
+    
   /* Null terminate. */
   s[fp->w] = '\0';
 }
   /* Null terminate. */
   s[fp->w] = '\0';
 }
index bcae1ebd9997a92779c0690293583f1aab2bde58..e05deb42970e91ecad79a17dd2e0cf2808f62f93 100644 (file)
@@ -1,3 +1,16 @@
+Sat Nov  4 16:05:47 2006  Ben Pfaff  <blp@gnu.org>
+
+       * set.q: Add WIB, WRB settings to control binary formats used by
+       data_out.
+       (cmd_set) Implement SET WIB, WRB.
+       (stc_to_integer_format) New function.
+       (stc_to_float_format) New function.
+       (show_integer_format) New function.
+       (show_float_format) New function.
+       (show_wib) New function.
+       (show_wrb) New function.
+       (static var show_table[]) Add SHOW WIB, WRB.
+
 Sat Nov  4 11:48:23 2006  Ben Pfaff  <blp@gnu.org>
 
        * set.q: Update ERRORS, MESSAGES, RESULTS command syntax.
 Sat Nov  4 11:48:23 2006  Ben Pfaff  <blp@gnu.org>
 
        * set.q: Update ERRORS, MESSAGES, RESULTS command syntax.
index d55511e00dfb894a64f6810630da46e5876ed2a2..a05878a3abbab4afc0a6722906e7a10991aadb3f 100644 (file)
@@ -24,6 +24,7 @@
 #include <stdlib.h>
 #include <time.h>
 
 #include <stdlib.h>
 #include <time.h>
 
+#include <data/data-out.h>
 #include <data/dictionary.h>
 #include <data/format.h>
 #include <data/procedure.h>
 #include <data/dictionary.h>
 #include <data/format.h>
 #include <data/procedure.h>
@@ -36,6 +37,8 @@
 #include <libpspp/alloc.h>
 #include <libpspp/compiler.h>
 #include <libpspp/copyleft.h>
 #include <libpspp/alloc.h>
 #include <libpspp/compiler.h>
 #include <libpspp/copyleft.h>
+#include <libpspp/float-format.h>
+#include <libpspp/integer-format.h>
 #include <libpspp/magic.h>
 #include <libpspp/message.h>
 #include <math/random.h>
 #include <libpspp/magic.h>
 #include <libpspp/message.h>
 #include <math/random.h>
@@ -106,6 +109,8 @@ int tgetnum (const char *);
      tb1=string "x==3 || x==11" "3 or 11 characters long";
      tbfonts=string;
      undefined=undef:warn/nowarn;
      tb1=string "x==3 || x==11" "3 or 11 characters long";
      tbfonts=string;
      undefined=undef:warn/nowarn;
+     wib=wib:msbfirst/lsbfirst/vax/native;
+     wrb=wrb:native/isl/isb/idl/idb/vf/vd/vg/zs/zl;
      width=custom;
      workspace=integer "x>=1024" "%s must be at least 1 MB";
      xsort=xsort:yes/no.
      width=custom;
      workspace=integer "x>=1024" "%s must be at least 1 MB";
      xsort=xsort:yes/no.
@@ -118,6 +123,8 @@ int tgetnum (const char *);
 /* (functions) */
 
 static bool do_cc (const char *cc_string, enum fmt_type);
 /* (functions) */
 
 static bool do_cc (const char *cc_string, enum fmt_type);
+static enum integer_format stc_to_integer_format (int stc);
+static enum float_format stc_to_float_format (int stc);
 
 int
 cmd_set (struct dataset *ds)
 
 int
 cmd_set (struct dataset *ds)
@@ -173,6 +180,10 @@ cmd_set (struct dataset *ds)
     set_scompression (cmd.scompress == STC_ON);
   if (cmd.sbc_undefined)
     set_undefined (cmd.undef == STC_WARN);
     set_scompression (cmd.scompress == STC_ON);
   if (cmd.sbc_undefined)
     set_undefined (cmd.undef == STC_WARN);
+  if (cmd.sbc_wib)
+    data_out_set_integer_format (stc_to_integer_format (cmd.wib));
+  if (cmd.sbc_wrb)
+    data_out_set_float_format (stc_to_float_format (cmd.wrb));
   if (cmd.sbc_workspace)
     set_workspace (cmd.n_workspace[0] * 1024L);
 
   if (cmd.sbc_workspace)
     set_workspace (cmd.n_workspace[0] * 1024L);
 
@@ -204,6 +215,52 @@ cmd_set (struct dataset *ds)
   return CMD_SUCCESS;
 }
 
   return CMD_SUCCESS;
 }
 
+/* Returns the integer_format value corresponding to STC,
+   which should be the value of cmd.rib or cmd.wib. */
+static enum integer_format
+stc_to_integer_format (int stc) 
+{
+  return (stc == STC_MSBFIRST ? INTEGER_MSB_FIRST
+          : stc == STC_LSBFIRST ? INTEGER_LSB_FIRST
+          : stc == STC_VAX ? INTEGER_VAX
+          : INTEGER_NATIVE);
+}
+
+/* Returns the float_format value corresponding to STC,
+   which should be the value of cmd.rrb or cmd.wrb. */
+static enum float_format
+stc_to_float_format (int stc) 
+{
+  switch (stc) 
+    {
+    case STC_NATIVE:
+      return FLOAT_NATIVE_DOUBLE;
+
+    case STC_ISL:
+      return FLOAT_IEEE_SINGLE_LE;
+    case STC_ISB:
+      return FLOAT_IEEE_SINGLE_BE;
+    case STC_IDL:
+      return FLOAT_IEEE_DOUBLE_LE;
+    case STC_IDB:
+      return FLOAT_IEEE_DOUBLE_BE;
+
+    case STC_VF:
+      return FLOAT_VAX_F;
+    case STC_VD:
+      return FLOAT_VAX_D;
+    case STC_VG:
+      return FLOAT_VAX_G;
+
+    case STC_ZS:
+      return FLOAT_Z_SHORT;
+    case STC_ZL:
+      return FLOAT_Z_LONG;
+    }
+
+  NOT_REACHED ();
+}
+
 /* Find the grouping characters in CC_STRING and set CC's
    grouping and decimal members appropriately.  Returns true if
    successful, false otherwise. */
 /* Find the grouping characters in CC_STRING and set CC's
    grouping and decimal members appropriately.  Returns true if
    successful, false otherwise. */
@@ -604,6 +661,66 @@ show_mxwarns (const struct dataset *ds UNUSED)
   msg (SN, _("MXWARNS is %d."), get_mxwarns ());
 }
 
   msg (SN, _("MXWARNS is %d."), get_mxwarns ());
 }
 
+/* Outputs that SETTING has the given INTEGER_FORMAT value. */
+static void
+show_integer_format (const char *setting, enum integer_format integer_format) 
+{
+  msg (SN, _("%s is %s (%s)."),
+       setting,
+       (integer_format == INTEGER_MSB_FIRST ? "MSBFIRST"
+        : integer_format == INTEGER_LSB_FIRST ? "LSBFIRST"
+        : "VAX"),
+       integer_format == INTEGER_NATIVE ? "NATIVE" : "nonnative");
+}
+
+/* Outputs that SETTING has the given FLOAT_FORMAT value. */
+static void
+show_float_format (const char *setting, enum float_format float_format) 
+{
+  const char *format_name = "";
+  
+  switch (float_format)
+    {
+    case FLOAT_IEEE_SINGLE_LE:
+      format_name = "ISL (32-bit IEEE 754 single, little-endian)";
+      break;
+    case FLOAT_IEEE_SINGLE_BE:
+      format_name = "ISB (32-bit IEEE 754 single, big-endian)";
+      break;
+    case FLOAT_IEEE_DOUBLE_LE:
+      format_name = "IDL (64-bit IEEE 754 double, little-endian)";
+      break;
+    case FLOAT_IEEE_DOUBLE_BE:
+      format_name = "IDB (64-bit IEEE 754 double, big-endian)";
+      break;
+
+    case FLOAT_VAX_F:
+      format_name = "VF (32-bit VAX F, VAX-endian)";
+      break;
+    case FLOAT_VAX_D:
+      format_name = "VD (64-bit VAX D, VAX-endian)";
+      break;
+    case FLOAT_VAX_G:
+      format_name = "VG (64-bit VAX G, VAX-endian)";
+      break;
+
+    case FLOAT_Z_SHORT:
+      format_name = "ZS (32-bit IBM Z hexadecimal short, big-endian)";
+      break;
+    case FLOAT_Z_LONG:
+      format_name = "ZL (64-bit IBM Z hexadecimal long, big-endian)";
+      break;
+
+    case FLOAT_FP:
+    case FLOAT_HEX:
+      NOT_REACHED ();
+    }
+
+  msg (SN, _("%s is %s (%s)."),
+       setting, format_name,
+       float_format == FLOAT_NATIVE_DOUBLE ? "NATIVE" : "nonnative");
+}
+
 static void
 show_scompression (const struct dataset *ds UNUSED) 
 {
 static void
 show_scompression (const struct dataset *ds UNUSED) 
 {
@@ -632,6 +749,18 @@ show_weight (const struct dataset *ds)
     msg (SN, _("WEIGHT is variable %s."), var->name);
 }
 
     msg (SN, _("WEIGHT is variable %s."), var->name);
 }
 
+static void
+show_wib (const struct dataset *ds UNUSED) 
+{
+  show_integer_format ("WIB", data_out_get_integer_format ());
+}
+
+static void
+show_wrb (const struct dataset *ds UNUSED) 
+{
+  show_float_format ("WRB", data_out_get_float_format ());
+}
+
 static void
 show_width (const struct dataset *ds UNUSED) 
 {
 static void
 show_width (const struct dataset *ds UNUSED) 
 {
@@ -663,6 +792,8 @@ const struct show_sbc show_table[] =
     {"SCOMPRESSION", show_scompression},
     {"UNDEFINED", show_undefined},
     {"WEIGHT", show_weight},
     {"SCOMPRESSION", show_scompression},
     {"UNDEFINED", show_undefined},
     {"WEIGHT", show_weight},
+    {"WIB", show_wib},
+    {"WRB", show_wrb},
     {"WIDTH", show_width},
   };
 
     {"WIDTH", show_width},
   };
 
index cf0069dd3d4e46e5ba292cdbb352fd4d4b89e48b..965e3b301b5c67326390383d5e23c66d77c50280 100644 (file)
@@ -158,6 +158,22 @@ buf_copy_str_lpad (char *dst, size_t dst_size, const char *src)
     }
 }
 
     }
 }
 
+/* Copies buffer SRC, of SRC_SIZE bytes, to DST, of DST_SIZE bytes.
+   DST is truncated to DST_SIZE bytes or padded on the left with
+   spaces as needed. */
+void
+buf_copy_lpad (char *dst, size_t dst_size,
+               const char *src, size_t src_size)
+{
+  if (src_size >= dst_size)
+    memmove (dst, src, dst_size);
+  else
+    {
+      memset (dst, ' ', dst_size - src_size);
+      memmove (&dst[dst_size - src_size], src, src_size);
+    }
+}
+
 /* Copies buffer SRC, of SRC_SIZE bytes, to DST, of DST_SIZE bytes.
    DST is truncated to DST_SIZE bytes or padded on the right with
    spaces as needed. */
 /* Copies buffer SRC, of SRC_SIZE bytes, to DST, of DST_SIZE bytes.
    DST is truncated to DST_SIZE bytes or padded on the right with
    spaces as needed. */
@@ -253,6 +269,15 @@ spprintf (char *dst, const char *format, ...)
 
   return dst + count;
 }
 
   return dst + count;
 }
+
+/* Sets the SIZE bytes starting at BLOCK to C,
+   and returns the byte following BLOCK. */
+void *
+mempset (void *block, int c, size_t size) 
+{
+  memset (block, c, size);
+  return (char *) block + size;
+}
 \f
 /* Substrings. */
 
 \f
 /* Substrings. */
 
index d8698ba4383bdc56f16122e4868924d3ae660f85..eaf12c3b2a6a497399ced354e5e19a238d3523d2 100644 (file)
@@ -44,6 +44,7 @@ void buf_reverse (char *, size_t);
 char *buf_find_reverse (const char *, size_t, const char *, size_t);
 int buf_compare_case (const char *, const char *, size_t);
 int buf_compare_rpad (const char *, size_t, const char *, size_t);
 char *buf_find_reverse (const char *, size_t, const char *, size_t);
 int buf_compare_case (const char *, const char *, size_t);
 int buf_compare_rpad (const char *, size_t, const char *, size_t);
+void buf_copy_lpad (char *, size_t, const char *, size_t);
 void buf_copy_rpad (char *, size_t, const char *, size_t);
 void buf_copy_str_lpad (char *, size_t, const char *);
 void buf_copy_str_rpad (char *, size_t, const char *);
 void buf_copy_rpad (char *, size_t, const char *, size_t);
 void buf_copy_str_lpad (char *, size_t, const char *);
 void buf_copy_str_rpad (char *, size_t, const char *);
@@ -56,6 +57,8 @@ void str_uppercase (char *);
 void str_lowercase (char *);
 
 char *spprintf (char *dst, const char *format, ...);
 void str_lowercase (char *);
 
 char *spprintf (char *dst, const char *format, ...);
+
+void *mempset (void *, int, size_t);
 \f
 /* Common character classes for use with substring and string functions. */
 
 \f
 /* Common character classes for use with substring and string functions. */
 
index 029fd5d07ddc57db49395c02717e45664d93ab57..ca3e467cbe31579171ea077460cbf70e86423ae3 100644 (file)
@@ -29,6 +29,7 @@
 #include "output.h"
 #include "manager.h"
 
 #include "output.h"
 #include "manager.h"
 
+#include <data/data-out.h>
 #include <data/format.h>
 #include <data/variable.h>
 #include <libpspp/alloc.h>
 #include <data/format.h>
 #include <data/variable.h>
 #include <libpspp/alloc.h>
@@ -541,7 +542,7 @@ tab_value (struct tab_table *table, int c, int r, unsigned char opt,
   table->cc[c + r * table->cf] = ss_buffer (contents, f->w);
   table->ct[c + r * table->cf] = opt;
   
   table->cc[c + r * table->cf] = ss_buffer (contents, f->w);
   table->ct[c + r * table->cf] = opt;
   
-  data_out (contents, f, v);
+  data_out (v, f, contents);
 }
 
 /* Sets cell (C,R) in TABLE, with options OPT, to have value VAL
 }
 
 /* Sets cell (C,R) in TABLE, with options OPT, to have value VAL
@@ -580,7 +581,7 @@ tab_float (struct tab_table *table, int c, int r, unsigned char opt,
 #endif
 
   double_value.f = val;
 #endif
 
   double_value.f = val;
-  data_out (buf, &f, &double_value);
+  data_out (&double_value, &f, buf);
 
   cp = buf;
   while (isspace ((unsigned char) *cp) && cp < &buf[w])
 
   cp = buf;
   while (isspace ((unsigned char) *cp) && cp < &buf[w])
index 841bda5a96706411ef24198fe25320c87dcc3722..dea14d5434ebd5ea97baa73f0cfa74621fe61c71 100644 (file)
@@ -1,5 +1,6 @@
 #include "helper.h"
 #include <data/data-in.h>
 #include "helper.h"
 #include <data/data-in.h>
+#include <data/data-out.h>
 #include <libpspp/message.h>
 
 #include <libpspp/i18n.h>
 #include <libpspp/message.h>
 
 #include <libpspp/i18n.h>
@@ -16,10 +17,7 @@ value_to_text(union value v, struct fmt_spec format)
   gchar *s = 0;
 
   s = g_new(gchar, format.w + 1);
   gchar *s = 0;
 
   s = g_new(gchar, format.w + 1);
-  if ( ! data_out(s, &format, &v) ) 
-    {
-      g_warning("Can't format missing discrete value \n");
-    }
+  data_out(&v, &format, s);
   s[format.w]='\0';
   g_strchug(s);
 
   s[format.w]='\0';
   g_strchug(s);
 
index eeaf31d660548dd7922295a2dae1f25615babfb9..0cb8ef913b4c7515f47bf5c0715232728c3bbbf8 100644 (file)
@@ -28,6 +28,7 @@
 
 #include <data/casefile.h>
 #include <data/case.h>
 
 #include <data/casefile.h>
 #include <data/case.h>
+#include <data/data-out.h>
 
 #include <gtksheet/gtksheet.h>
 #include <gtksheet/gsheetmodel.h>
 
 #include <gtksheet/gtksheet.h>
 #include <gtksheet/gsheetmodel.h>
@@ -506,7 +507,7 @@ psppire_data_store_get_string (const GSheetModel *model, gint row, gint column)
   /* Converts binary value V into printable form in the exactly
      FP->W character in buffer S according to format specification
      FP.  No null terminator is appended to the buffer.  */
   /* Converts binary value V into printable form in the exactly
      FP->W character in buffer S according to format specification
      FP.  No null terminator is appended to the buffer.  */
-  data_out (s->str, fp, v);
+  data_out (v, fp, s->str);
 
   text = pspp_locale_to_utf8 (s->str, fp->w, 0);
   g_string_free (s, TRUE);
 
   text = pspp_locale_to_utf8 (s->str, fp->w, 0);
   g_string_free (s, TRUE);
index 8cc076d6844a59def2b6d03b592d474d751f8756..790a3316127138de658c68dc2e59881ea3411829 100644 (file)
@@ -1,3 +1,26 @@
+Sat Nov  4 16:08:58 2006  Ben Pfaff  <blp@gnu.org>
+
+       * automake.mk: Add binhex-out.sh, date-out.sh, month-out.sh,
+       num-out.sh, time-out.sh, wkday-out.sh from formats directory.  Add
+       formats/inexactify as a program needed by tests.
+
+       * command/no_case_size.sh: Update output to conform with updated
+       formatted output code.
+
+       * expressions/expressions.sh: Ditto.
+
+       * formats/binhex-out.sh: New test.
+
+       * formats/date-out.sh: New test.
+
+       * formats/month-out.sh: New test.
+
+       * formats/num-out.sh: New test.
+
+       * formats/time-out.sh: New test.
+
+       * formats/wkday-out.sh: New test.
+
 Thu Oct 26 20:20:39 2006  Ben Pfaff  <blp@gnu.org>
 
        * automake.mk: Add tests/formats/float-format.sh.
 Thu Oct 26 20:20:39 2006  Ben Pfaff  <blp@gnu.org>
 
        * automake.mk: Add tests/formats/float-format.sh.
index 2527c836439f6f31ef9a819f57f402b7adb887a9..dde7b09c9cd51733bd909d1fa7966d73ee2e8fc4 100644 (file)
@@ -57,7 +57,13 @@ TESTS = \
        tests/command/use.sh \
        tests/command/very-long-strings.sh \
        tests/command/weight.sh \
        tests/command/use.sh \
        tests/command/very-long-strings.sh \
        tests/command/weight.sh \
+       tests/formats/binhex-out.sh \
+       tests/formats/date-out.sh \
        tests/formats/float-format.sh \
        tests/formats/float-format.sh \
+       tests/formats/month-out.sh \
+       tests/formats/num-out.sh \
+       tests/formats/time-out.sh \
+       tests/formats/wkday-out.sh \
        tests/bugs/agg_crash.sh \
        tests/bugs/agg-crash-2.sh \
        tests/bugs/alpha-freq.sh \
        tests/bugs/agg_crash.sh \
        tests/bugs/agg-crash-2.sh \
        tests/bugs/alpha-freq.sh \
@@ -112,7 +118,8 @@ TESTS = \
        tests/libpspp/ll-test \
        tests/libpspp/llx-test
 
        tests/libpspp/ll-test \
        tests/libpspp/llx-test
 
-check_PROGRAMS += tests/libpspp/ll-test tests/libpspp/llx-test
+check_PROGRAMS += tests/libpspp/ll-test tests/libpspp/llx-test \
+       tests/formats/inexactify
 
 tests_libpspp_ll_test_SOURCES = \
        src/libpspp/ll.c \
 
 tests_libpspp_ll_test_SOURCES = \
        src/libpspp/ll.c \
@@ -126,6 +133,8 @@ tests_libpspp_llx_test_SOURCES = \
        src/libpspp/llx.h \
        tests/libpspp/llx-test.c
 
        src/libpspp/llx.h \
        tests/libpspp/llx-test.c
 
+tests_formats_inexactify_SOURCES = tests/formats/inexactify.c
+
 EXTRA_DIST += $(TESTS) tests/weighting.data tests/data-list.data tests/list.data \
        tests/no_case_size.sav \
        tests/coverage.sh tests/test_template \
 EXTRA_DIST += $(TESTS) tests/weighting.data tests/data-list.data tests/list.data \
        tests/no_case_size.sav \
        tests/coverage.sh tests/test_template \
index 25744bdc743f20201dfa7b7224d00dea19fa2f52..3d6f2867028a18ef8803ea0fa2bf8269adab2948 100755 (executable)
@@ -92,12 +92,12 @@ diff -b -w pspp.list - <<EOF
 +--------+-------------------------------------------+--------+
                             CONT     SIZE      POP    COUNT
 -------------------------------- -------- -------- --------
 +--------+-------------------------------------------+--------+
                             CONT     SIZE      POP    COUNT
 -------------------------------- -------- -------- --------
-Asia                             44579000 3.67E+09    44.00 
-Africa                           30065000 7.78E+08    53.00 
-North America                    24256000 4.83E+08    23.00 
-South America                    17819000 3.42E+08    12.00 
+Asia                             44579000   4E+009    44.00 
+Africa                           30065000   8E+008    53.00 
+North America                    24256000   5E+008    23.00 
+South America                    17819000   3E+008    12.00 
 Antarctica                       13209000      .00      .00 
 Antarctica                       13209000      .00      .00 
-Europe                            9938000 7.32E+08    46.00 
+Europe                            9938000   7E+008    46.00 
 Australia/Oceania                 7687000 31000000    14.00 
 EOF
 if [ $? -ne 0 ] ; then fail ; fi
 Australia/Oceania                 7687000 31000000    14.00 
 EOF
 if [ $? -ne 0 ] ; then fail ; fi
index b80f508084961fb9a970110084873c00d00684e9..70049e13f8900bb2b50e409ec1d0091cd005e662 100755 (executable)
@@ -730,7 +730,7 @@ string(123.56, f5.1) => "123.6"
 string($sysmis, f5.1) => "   . "
 string("abc", A5) => error
 string(123, e1) => error       # E has a minimum width of 6 on output.
 string($sysmis, f5.1) => "   . "
 string("abc", A5) => error
 string(123, e1) => error       # E has a minimum width of 6 on output.
-string(123, e6.0) => " 1E+02"
+string(123, e6.0) => "1E+002"
 
 substr('abcdefgh', -5) => ""
 substr('abcdefgh', 0) => ""
 
 substr('abcdefgh', -5) => ""
 substr('abcdefgh', 0) => ""
diff --git a/tests/formats/binhex-out.expected.gz b/tests/formats/binhex-out.expected.gz
new file mode 100644 (file)
index 0000000..f8fc6e9
Binary files /dev/null and b/tests/formats/binhex-out.expected.gz differ
diff --git a/tests/formats/binhex-out.sh b/tests/formats/binhex-out.sh
new file mode 100755 (executable)
index 0000000..caffb03
--- /dev/null
@@ -0,0 +1,168 @@
+#! /bin/sh
+
+TEMPDIR=/tmp/pspp-tst-$$
+mkdir -p $TEMPDIR
+trap 'cd /; rm -rf $TEMPDIR' 0
+
+# ensure that top_builddir  are absolute
+if [ -z "$top_builddir" ] ; then top_builddir=. ; fi
+if [ -z "$top_srcdir" ] ; then top_srcdir=. ; fi
+top_builddir=`cd $top_builddir; pwd`
+PSPP=$top_builddir/src/ui/terminal/pspp
+
+# ensure that top_srcdir is absolute
+top_srcdir=`cd $top_srcdir; pwd`
+
+STAT_CONFIG_PATH=$top_srcdir/config
+export STAT_CONFIG_PATH
+
+fail()
+{
+    echo $activity
+    echo FAILED
+    exit 1;
+}
+
+
+no_result()
+{
+    echo $activity
+    echo NO RESULT;
+    exit 2;
+}
+
+pass()
+{
+    exit 0;
+}
+
+cd $TEMPDIR
+
+activity="write pspp syntax"
+cat > binhex-out.pspp <<EOF
+set errors=none.
+set mxwarns=10000000.
+set wib=msbfirst.
+data list /x 1-10.
+begin data.
+
+2
+11
+123
+1234
+913
+3.14159
+777
+82
+690
+-2
+-11
+-123
+-1234
+-913
+-3.14159
+-777
+-82
+-690
+-.1
+-.5
+-.9
+9999.1
+9999.5
+9999.9
+10000
+18231237
+-9999.1
+-9999.5
+-9999.9
+-10000
+-8231237
+999.1
+999.5
+999.9
+1000
+8231237
+-999.1
+-999.5
+-999.9
+-1000
+-8231237
+99.1
+99.5
+99.9
+100
+821237
+-99.1
+-99.5
+-99.9
+-100
+-831237
+9.1
+9.5
+9.9
+10
+81237
+-9.1
+-9.5
+-9.9
+-10
+-81237
+1.1
+-1.1
+1.5
+-1.5
+1.9
+-1.9
+end data.
+file handle output/name='binhex.out'/mode=image/lrecl=256.
+write outfile=output/
+       x(p1.0) x(p2.0) x(p3.0) x(p4.0)         /* 000
+       x(p2.1) x(p3.1) x(p4.1)                 /* 00a
+       x(p3.2) x(p4.2)                         /* 013
+       x(p4.3)                                 /* 01a
+       x(pk1.0) x(pk2.0) x(pk3.0) x(pk4.0)     /* 01e
+       x(pk2.1) x(pk3.1) x(pk4.1)              /* 028
+       x(pk3.2) x(pk4.2)                       /* 031
+       x(pk4.3)                                /* 038
+       x(ib1.0) x(ib2.0) x(ib3.0) x(ib4.0)     /* 03c
+       x(ib1.1) x(ib2.1) x(ib3.1) x(ib4.1)     /* 046
+       x(ib1.2) x(ib2.2) x(ib3.2) x(ib4.2)     /* 050
+       x(ib1.3) x(ib2.3) x(ib3.3) x(ib4.3)     /* 05a
+       x(ib2.4) x(ib3.4) x(ib4.4)              /* 064
+       x(ib2.5) x(ib3.5) x(ib4.5)              /* 06d
+       x(ib3.6) x(ib4.6)                       /* 076
+       x(ib3.7) x(ib4.7)                       /* 07d
+       x(ib3.8) x(ib4.8)                       /* 084
+       x(ib4.9)                                /* 08b
+       x(ib4.10)                               /* 08f
+       x(pib1.0) x(pib2.0) x(pib3.0) x(pib4.0) /* 093
+       x(pib1.1) x(pib2.1) x(pib3.1) x(pib4.1) /* 09d
+       x(pib1.2) x(pib2.2) x(pib3.2) x(pib4.2) /* 0a7
+       x(pib1.3) x(pib2.3) x(pib3.3) x(pib4.3) /* 0b1
+       x(pib2.4) x(pib3.4) x(pib4.4)           /* 0bb
+       x(pib2.5) x(pib3.5) x(pib4.5)           /* 0c4
+       x(pib3.6) x(pib4.6)                     /* 0cd
+       x(pib3.7) x(pib4.7)                     /* 0d4
+       x(pib3.8) x(pib4.8)                     /* 0db
+       x(pib4.9)                               /* 0e2
+       x(pib4.10)                              /* 0e6
+       x(pibhex2) x(pibhex4)                   /* 0ea
+        x(pibhex6) x(pibhex8).                 /* 0f0
+                                               /* 0fe
+execute.
+EOF
+if [ $? -ne 0 ] ; then no_result ; fi
+
+activity="run program"
+$SUPERVISOR $PSPP --testing-mode binhex-out.pspp
+if [ $? -ne 0 ] ; then no_result ; fi
+
+activity="gunzip expected results"
+gzip -cd < $top_srcdir/tests/formats/binhex-out.expected.gz > expected.out
+if [ $? -ne 0 ] ; then no_result ; fi
+
+activity="compare output"
+cmp expected.out binhex.out
+if [ $? -ne 0 ] ; then fail ; fi
+
+pass
diff --git a/tests/formats/date-out.sh b/tests/formats/date-out.sh
new file mode 100755 (executable)
index 0000000..6e28083
--- /dev/null
@@ -0,0 +1,578 @@
+#! /bin/sh
+
+TEMPDIR=/tmp/pspp-tst-$$
+mkdir -p $TEMPDIR
+trap 'cd /; rm -rf $TEMPDIR' 0
+
+# ensure that top_builddir  are absolute
+if [ -z "$top_builddir" ] ; then top_builddir=. ; fi
+if [ -z "$top_srcdir" ] ; then top_srcdir=. ; fi
+top_builddir=`cd $top_builddir; pwd`
+PSPP=$top_builddir/src/ui/terminal/pspp
+
+# ensure that top_srcdir is absolute
+top_srcdir=`cd $top_srcdir; pwd`
+
+STAT_CONFIG_PATH=$top_srcdir/config
+export STAT_CONFIG_PATH
+
+fail()
+{
+    echo $activity
+    echo FAILED
+    exit 1;
+}
+
+
+no_result()
+{
+    echo $activity
+    echo NO RESULT;
+    exit 2;
+}
+
+pass()
+{
+    exit 0;
+}
+
+cd $TEMPDIR
+
+activity="write pspp syntax"
+cat > date-out.pspp <<EOF
+set epoch=1930.
+data list /x 1-30 (datetime).
+begin data.
+10-6-1648 0:0:0
+30-6-1680 4:50:38.12301
+24-7-1716 12:31:35.23453
+19-6-1768 12:47:53.34505
+2-8-1819 1:26:0.45615
+27-3-1839 20:58:11.56677
+19-4-1903 7:36:5.18964
+25-8-1929 15:43:49.83132
+29-9-1941 4:25:9.01293
+19-4-1943 6:49:27.52375
+7-10-1943 2:57:52.01565
+17-3-1992 16:45:44.86529
+25-2-1996 21:30:57.82047
+29-9-41 4:25:9.15395
+19-4-43 6:49:27.10533
+7-10-43 2:57:52.48229
+17-3-92 16:45:44.65827
+25-2-96 21:30:57.58219
+10-11-2038 22:30:4.18347
+18-7-2094 1:56:51.59319
+end data.
+print outfile='date-out.out'/x(date9) ' | ' x(date11).
+print outfile='date-out.out'/x(adate8) ' | ' x(adate10).
+print outfile='date-out.out'/x(edate8) ' | ' x(edate10).
+print outfile='date-out.out'/x(jdate5) ' | ' x(jdate7).
+print outfile='date-out.out'/x(sdate8) ' | ' x(sdate10).
+print outfile='date-out.out'/x(qyr6) ' | ' x(qyr8).
+print outfile='date-out.out'/x(moyr6) ' | ' x(moyr8).
+print outfile='date-out.out'/x(wkyr8) ' | ' x(wkyr10).
+print outfile='date-out.out'/x(datetime17).
+print outfile='date-out.out'/x(datetime18).
+print outfile='date-out.out'/x(datetime19).
+print outfile='date-out.out'/x(datetime20).
+print outfile='date-out.out'/x(datetime21).
+print outfile='date-out.out'/x(datetime22).
+print outfile='date-out.out'/x(datetime22.1).
+print outfile='date-out.out'/x(datetime23.2).
+print outfile='date-out.out'/x(datetime24.3).
+print outfile='date-out.out'/x(datetime25.4).
+print outfile='date-out.out'/x(datetime26.5).
+execute.
+EOF
+if [ $? -ne 0 ] ; then no_result ; fi
+
+activity="run program"
+$SUPERVISOR $PSPP --testing-mode date-out.pspp
+if [ $? -ne 0 ] ; then no_result ; fi
+
+activity="compare output"
+diff -u date-out.out - <<EOF 
+ ********* | 10-JUN-1648
+ ******** | 06/10/1648
+ ******** | 10.06.1648
+ ***** | 1648162
+ ******** | 1648/06/10
+ ****** | 2 Q 1648
+ ****** | JUN 1648
+ ******** | 24 WK 1648
+ 10-JUN-1648 00:00
+  10-JUN-1648 00:00
+   10-JUN-1648 00:00
+ 10-JUN-1648 00:00:00
+  10-JUN-1648 00:00:00
+   10-JUN-1648 00:00:00
+ 10-JUN-1648 00:00:00.0
+ 10-JUN-1648 00:00:00.00
+ 10-JUN-1648 00:00:00.000
+ 10-JUN-1648 00:00:00.0000
+ 10-JUN-1648 00:00:00.00000
+ ********* | 30-JUN-1680
+ ******** | 06/30/1680
+ ******** | 30.06.1680
+ ***** | 1680182
+ ******** | 1680/06/30
+ ****** | 2 Q 1680
+ ****** | JUN 1680
+ ******** | 26 WK 1680
+ 30-JUN-1680 04:50
+  30-JUN-1680 04:50
+   30-JUN-1680 04:50
+ 30-JUN-1680 04:50:38
+  30-JUN-1680 04:50:38
+   30-JUN-1680 04:50:38
+ 30-JUN-1680 04:50:38.1
+ 30-JUN-1680 04:50:38.12
+ 30-JUN-1680 04:50:38.123
+ 30-JUN-1680 04:50:38.1230
+ 30-JUN-1680 04:50:38.12301
+ ********* | 24-JUL-1716
+ ******** | 07/24/1716
+ ******** | 24.07.1716
+ ***** | 1716206
+ ******** | 1716/07/24
+ ****** | 3 Q 1716
+ ****** | JUL 1716
+ ******** | 30 WK 1716
+ 24-JUL-1716 12:31
+  24-JUL-1716 12:31
+   24-JUL-1716 12:31
+ 24-JUL-1716 12:31:35
+  24-JUL-1716 12:31:35
+   24-JUL-1716 12:31:35
+ 24-JUL-1716 12:31:35.2
+ 24-JUL-1716 12:31:35.23
+ 24-JUL-1716 12:31:35.235
+ 24-JUL-1716 12:31:35.2345
+ 24-JUL-1716 12:31:35.23453
+ ********* | 19-JUN-1768
+ ******** | 06/19/1768
+ ******** | 19.06.1768
+ ***** | 1768171
+ ******** | 1768/06/19
+ ****** | 2 Q 1768
+ ****** | JUN 1768
+ ******** | 25 WK 1768
+ 19-JUN-1768 12:47
+  19-JUN-1768 12:47
+   19-JUN-1768 12:47
+ 19-JUN-1768 12:47:53
+  19-JUN-1768 12:47:53
+   19-JUN-1768 12:47:53
+ 19-JUN-1768 12:47:53.3
+ 19-JUN-1768 12:47:53.35
+ 19-JUN-1768 12:47:53.345
+ 19-JUN-1768 12:47:53.3450
+ 19-JUN-1768 12:47:53.34505
+ ********* | 02-AUG-1819
+ ******** | 08/02/1819
+ ******** | 02.08.1819
+ ***** | 1819214
+ ******** | 1819/08/02
+ ****** | 3 Q 1819
+ ****** | AUG 1819
+ ******** | 31 WK 1819
+ 02-AUG-1819 01:26
+  02-AUG-1819 01:26
+   02-AUG-1819 01:26
+ 02-AUG-1819 01:26:00
+  02-AUG-1819 01:26:00
+   02-AUG-1819 01:26:00
+ 02-AUG-1819 01:26:00.5
+ 02-AUG-1819 01:26:00.46
+ 02-AUG-1819 01:26:00.456
+ 02-AUG-1819 01:26:00.4562
+ 02-AUG-1819 01:26:00.45615
+ ********* | 27-MAR-1839
+ ******** | 03/27/1839
+ ******** | 27.03.1839
+ ***** | 1839086
+ ******** | 1839/03/27
+ ****** | 1 Q 1839
+ ****** | MAR 1839
+ ******** | 13 WK 1839
+ 27-MAR-1839 20:58
+  27-MAR-1839 20:58
+   27-MAR-1839 20:58
+ 27-MAR-1839 20:58:11
+  27-MAR-1839 20:58:11
+   27-MAR-1839 20:58:11
+ 27-MAR-1839 20:58:11.6
+ 27-MAR-1839 20:58:11.57
+ 27-MAR-1839 20:58:11.567
+ 27-MAR-1839 20:58:11.5668
+ 27-MAR-1839 20:58:11.56677
+ ********* | 19-APR-1903
+ ******** | 04/19/1903
+ ******** | 19.04.1903
+ ***** | 1903109
+ ******** | 1903/04/19
+ ****** | 2 Q 1903
+ ****** | APR 1903
+ ******** | 16 WK 1903
+ 19-APR-1903 07:36
+  19-APR-1903 07:36
+   19-APR-1903 07:36
+ 19-APR-1903 07:36:05
+  19-APR-1903 07:36:05
+   19-APR-1903 07:36:05
+ 19-APR-1903 07:36:05.2
+ 19-APR-1903 07:36:05.19
+ 19-APR-1903 07:36:05.190
+ 19-APR-1903 07:36:05.1896
+ 19-APR-1903 07:36:05.18964
+ ********* | 25-AUG-1929
+ ******** | 08/25/1929
+ ******** | 25.08.1929
+ ***** | 1929237
+ ******** | 1929/08/25
+ ****** | 3 Q 1929
+ ****** | AUG 1929
+ ******** | 34 WK 1929
+ 25-AUG-1929 15:43
+  25-AUG-1929 15:43
+   25-AUG-1929 15:43
+ 25-AUG-1929 15:43:49
+  25-AUG-1929 15:43:49
+   25-AUG-1929 15:43:49
+ 25-AUG-1929 15:43:49.8
+ 25-AUG-1929 15:43:49.83
+ 25-AUG-1929 15:43:49.831
+ 25-AUG-1929 15:43:49.8313
+ 25-AUG-1929 15:43:49.83132
+ 29-SEP-41 | 29-SEP-1941
+ 09/29/41 | 09/29/1941
+ 29.09.41 | 29.09.1941
+ 41272 | 1941272
+ 41/09/29 | 1941/09/29
+ 3 Q 41 | 3 Q 1941
+ SEP 41 | SEP 1941
+ 39 WK 41 | 39 WK 1941
+ 29-SEP-1941 04:25
+  29-SEP-1941 04:25
+   29-SEP-1941 04:25
+ 29-SEP-1941 04:25:09
+  29-SEP-1941 04:25:09
+   29-SEP-1941 04:25:09
+ 29-SEP-1941 04:25:09.0
+ 29-SEP-1941 04:25:09.01
+ 29-SEP-1941 04:25:09.013
+ 29-SEP-1941 04:25:09.0129
+ 29-SEP-1941 04:25:09.01293
+ 19-APR-43 | 19-APR-1943
+ 04/19/43 | 04/19/1943
+ 19.04.43 | 19.04.1943
+ 43109 | 1943109
+ 43/04/19 | 1943/04/19
+ 2 Q 43 | 2 Q 1943
+ APR 43 | APR 1943
+ 16 WK 43 | 16 WK 1943
+ 19-APR-1943 06:49
+  19-APR-1943 06:49
+   19-APR-1943 06:49
+ 19-APR-1943 06:49:27
+  19-APR-1943 06:49:27
+   19-APR-1943 06:49:27
+ 19-APR-1943 06:49:27.5
+ 19-APR-1943 06:49:27.52
+ 19-APR-1943 06:49:27.524
+ 19-APR-1943 06:49:27.5238
+ 19-APR-1943 06:49:27.52375
+ 07-OCT-43 | 07-OCT-1943
+ 10/07/43 | 10/07/1943
+ 07.10.43 | 07.10.1943
+ 43280 | 1943280
+ 43/10/07 | 1943/10/07
+ 4 Q 43 | 4 Q 1943
+ OCT 43 | OCT 1943
+ 40 WK 43 | 40 WK 1943
+ 07-OCT-1943 02:57
+  07-OCT-1943 02:57
+   07-OCT-1943 02:57
+ 07-OCT-1943 02:57:52
+  07-OCT-1943 02:57:52
+   07-OCT-1943 02:57:52
+ 07-OCT-1943 02:57:52.0
+ 07-OCT-1943 02:57:52.02
+ 07-OCT-1943 02:57:52.016
+ 07-OCT-1943 02:57:52.0156
+ 07-OCT-1943 02:57:52.01565
+ 17-MAR-92 | 17-MAR-1992
+ 03/17/92 | 03/17/1992
+ 17.03.92 | 17.03.1992
+ 92077 | 1992077
+ 92/03/17 | 1992/03/17
+ 1 Q 92 | 1 Q 1992
+ MAR 92 | MAR 1992
+ 11 WK 92 | 11 WK 1992
+ 17-MAR-1992 16:45
+  17-MAR-1992 16:45
+   17-MAR-1992 16:45
+ 17-MAR-1992 16:45:44
+  17-MAR-1992 16:45:44
+   17-MAR-1992 16:45:44
+ 17-MAR-1992 16:45:44.9
+ 17-MAR-1992 16:45:44.87
+ 17-MAR-1992 16:45:44.865
+ 17-MAR-1992 16:45:44.8653
+ 17-MAR-1992 16:45:44.86529
+ 25-FEB-96 | 25-FEB-1996
+ 02/25/96 | 02/25/1996
+ 25.02.96 | 25.02.1996
+ 96056 | 1996056
+ 96/02/25 | 1996/02/25
+ 1 Q 96 | 1 Q 1996
+ FEB 96 | FEB 1996
+  8 WK 96 |  8 WK 1996
+ 25-FEB-1996 21:30
+  25-FEB-1996 21:30
+   25-FEB-1996 21:30
+ 25-FEB-1996 21:30:57
+  25-FEB-1996 21:30:57
+   25-FEB-1996 21:30:57
+ 25-FEB-1996 21:30:57.8
+ 25-FEB-1996 21:30:57.82
+ 25-FEB-1996 21:30:57.820
+ 25-FEB-1996 21:30:57.8205
+ 25-FEB-1996 21:30:57.82047
+ 29-SEP-41 | 29-SEP-1941
+ 09/29/41 | 09/29/1941
+ 29.09.41 | 29.09.1941
+ 41272 | 1941272
+ 41/09/29 | 1941/09/29
+ 3 Q 41 | 3 Q 1941
+ SEP 41 | SEP 1941
+ 39 WK 41 | 39 WK 1941
+ 29-SEP-1941 04:25
+  29-SEP-1941 04:25
+   29-SEP-1941 04:25
+ 29-SEP-1941 04:25:09
+  29-SEP-1941 04:25:09
+   29-SEP-1941 04:25:09
+ 29-SEP-1941 04:25:09.2
+ 29-SEP-1941 04:25:09.15
+ 29-SEP-1941 04:25:09.154
+ 29-SEP-1941 04:25:09.1539
+ 29-SEP-1941 04:25:09.15395
+ 19-APR-43 | 19-APR-1943
+ 04/19/43 | 04/19/1943
+ 19.04.43 | 19.04.1943
+ 43109 | 1943109
+ 43/04/19 | 1943/04/19
+ 2 Q 43 | 2 Q 1943
+ APR 43 | APR 1943
+ 16 WK 43 | 16 WK 1943
+ 19-APR-1943 06:49
+  19-APR-1943 06:49
+   19-APR-1943 06:49
+ 19-APR-1943 06:49:27
+  19-APR-1943 06:49:27
+   19-APR-1943 06:49:27
+ 19-APR-1943 06:49:27.1
+ 19-APR-1943 06:49:27.11
+ 19-APR-1943 06:49:27.105
+ 19-APR-1943 06:49:27.1053
+ 19-APR-1943 06:49:27.10533
+ 07-OCT-43 | 07-OCT-1943
+ 10/07/43 | 10/07/1943
+ 07.10.43 | 07.10.1943
+ 43280 | 1943280
+ 43/10/07 | 1943/10/07
+ 4 Q 43 | 4 Q 1943
+ OCT 43 | OCT 1943
+ 40 WK 43 | 40 WK 1943
+ 07-OCT-1943 02:57
+  07-OCT-1943 02:57
+   07-OCT-1943 02:57
+ 07-OCT-1943 02:57:52
+  07-OCT-1943 02:57:52
+   07-OCT-1943 02:57:52
+ 07-OCT-1943 02:57:52.5
+ 07-OCT-1943 02:57:52.48
+ 07-OCT-1943 02:57:52.482
+ 07-OCT-1943 02:57:52.4823
+ 07-OCT-1943 02:57:52.48229
+ 17-MAR-92 | 17-MAR-1992
+ 03/17/92 | 03/17/1992
+ 17.03.92 | 17.03.1992
+ 92077 | 1992077
+ 92/03/17 | 1992/03/17
+ 1 Q 92 | 1 Q 1992
+ MAR 92 | MAR 1992
+ 11 WK 92 | 11 WK 1992
+ 17-MAR-1992 16:45
+  17-MAR-1992 16:45
+   17-MAR-1992 16:45
+ 17-MAR-1992 16:45:44
+  17-MAR-1992 16:45:44
+   17-MAR-1992 16:45:44
+ 17-MAR-1992 16:45:44.7
+ 17-MAR-1992 16:45:44.66
+ 17-MAR-1992 16:45:44.658
+ 17-MAR-1992 16:45:44.6583
+ 17-MAR-1992 16:45:44.65827
+ 25-FEB-96 | 25-FEB-1996
+ 02/25/96 | 02/25/1996
+ 25.02.96 | 25.02.1996
+ 96056 | 1996056
+ 96/02/25 | 1996/02/25
+ 1 Q 96 | 1 Q 1996
+ FEB 96 | FEB 1996
+  8 WK 96 |  8 WK 1996
+ 25-FEB-1996 21:30
+  25-FEB-1996 21:30
+   25-FEB-1996 21:30
+ 25-FEB-1996 21:30:57
+  25-FEB-1996 21:30:57
+   25-FEB-1996 21:30:57
+ 25-FEB-1996 21:30:57.6
+ 25-FEB-1996 21:30:57.58
+ 25-FEB-1996 21:30:57.582
+ 25-FEB-1996 21:30:57.5822
+ 25-FEB-1996 21:30:57.58219
+ ********* | 10-NOV-2038
+ ******** | 11/10/2038
+ ******** | 10.11.2038
+ ***** | 2038314
+ ******** | 2038/11/10
+ ****** | 4 Q 2038
+ ****** | NOV 2038
+ ******** | 45 WK 2038
+ 10-NOV-2038 22:30
+  10-NOV-2038 22:30
+   10-NOV-2038 22:30
+ 10-NOV-2038 22:30:04
+  10-NOV-2038 22:30:04
+   10-NOV-2038 22:30:04
+ 10-NOV-2038 22:30:04.2
+ 10-NOV-2038 22:30:04.18
+ 10-NOV-2038 22:30:04.183
+ 10-NOV-2038 22:30:04.1835
+ 10-NOV-2038 22:30:04.18347
+ ********* | 18-JUL-2094
+ ******** | 07/18/2094
+ ******** | 18.07.2094
+ ***** | 2094199
+ ******** | 2094/07/18
+ ****** | 3 Q 2094
+ ****** | JUL 2094
+ ******** | 29 WK 2094
+ 18-JUL-2094 01:56
+  18-JUL-2094 01:56
+   18-JUL-2094 01:56
+ 18-JUL-2094 01:56:51
+  18-JUL-2094 01:56:51
+   18-JUL-2094 01:56:51
+ 18-JUL-2094 01:56:51.6
+ 18-JUL-2094 01:56:51.59
+ 18-JUL-2094 01:56:51.593
+ 18-JUL-2094 01:56:51.5932
+ 18-JUL-2094 01:56:51.59319
+EOF
+if [ $? -ne 0 ] ; then fail ; fi
+
+activity="write pspp syntax"
+cat > bad-date-out.pspp <<EOF
+set epoch=1930.
+set errors=none.
+data list list /x.
+begin data.
+0
+-1
+3e11
+end data.
+print outfile='bad-date.out'/x(date9) ' | ' x(date11).
+print outfile='bad-date.out'/x(adate8) ' | ' x(adate10).
+print outfile='bad-date.out'/x(edate8) ' | ' x(edate10).
+print outfile='bad-date.out'/x(jdate5) ' | ' x(jdate7).
+print outfile='bad-date.out'/x(sdate8) ' | ' x(sdate10).
+print outfile='bad-date.out'/x(qyr6) ' | ' x(qyr8).
+print outfile='bad-date.out'/x(moyr6) ' | ' x(moyr8).
+print outfile='bad-date.out'/x(wkyr8) ' | ' x(wkyr10).
+print outfile='bad-date.out'/x(datetime17).
+print outfile='bad-date.out'/x(datetime18).
+print outfile='bad-date.out'/x(datetime19).
+print outfile='bad-date.out'/x(datetime20).
+print outfile='bad-date.out'/x(datetime21).
+print outfile='bad-date.out'/x(datetime22).
+print outfile='bad-date.out'/x(datetime22.1).
+print outfile='bad-date.out'/x(datetime23.2).
+print outfile='bad-date.out'/x(datetime24.3).
+print outfile='bad-date.out'/x(datetime25.4).
+print outfile='bad-date.out'/x(datetime26.5).
+execute.
+EOF
+if [ $? -ne 0 ] ; then no_result ; fi
+
+activity="run program"
+$SUPERVISOR $PSPP --testing-mode bad-date-out.pspp
+if [ $? -ne 0 ] ; then no_result ; fi
+
+activity="compare output"
+diff -u bad-date.out - <<EOF 
+         . |           .
+        . |          .
+        . |          .
+     . |       .
+        . |          .
+      . |        .
+      . |        .
+        . |          .
+                 .
+                  .
+                   .
+                    .
+                     .
+                      .
+                     . 
+                     .  
+                     .   
+                     .    
+                     .     
+         . |           .
+        . |          .
+        . |          .
+     . |       .
+        . |          .
+      . |        .
+      . |        .
+        . |          .
+                 .
+                  .
+                   .
+                    .
+                     .
+                      .
+                     . 
+                     .  
+                     .   
+                     .    
+                     .     
+ ********* | ***********
+ ******** | **********
+ ******** | **********
+ ***** | *******
+ ******** | **********
+ ****** | ********
+ ****** | ********
+ ******** | **********
+ 28-MAY-**** 05:20
+  28-MAY-**** 05:20
+   28-MAY-**** 05:20
+ 28-MAY-**** 05:20:00
+  28-MAY-**** 05:20:00
+   28-MAY-**** 05:20:00
+ 28-MAY-**** 05:20:00.0
+ 28-MAY-**** 05:20:00.00
+ 28-MAY-**** 05:20:00.000
+ 28-MAY-**** 05:20:00.0000
+ 28-MAY-**** 05:20:00.00000
+EOF
+if [ $? -ne 0 ] ; then fail ; fi
+
+pass
diff --git a/tests/formats/inexactify.c b/tests/formats/inexactify.c
new file mode 100644 (file)
index 0000000..168251a
--- /dev/null
@@ -0,0 +1,65 @@
+/* inexactify.c - PSPP test program.
+   Copyright (C) 2006 Free Software Foundation, Inc.
+   Written by Ben Pfaff <blp@gnu.org>.
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA. */
+
+#include <ctype.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Replaces insignificant digits by # to facilitate textual
+   comparisons.  Not a perfect solution to the general-purpose
+   comparison problem, because rounding that affects earlier
+   digits can still cause differences. */
+int
+main (void)
+{
+  bool in_quotes = false;
+  bool in_exponent = false;
+  int digits = 0;
+  
+  for (;;) 
+    {
+      int c = getchar ();
+      if (c == EOF)
+        break;
+      else if (c == '\n') 
+        in_quotes = false;
+      else if (c == '"') 
+        {
+          in_quotes = !in_quotes;
+          in_exponent = false;
+          digits = 0;
+        }
+      else if (in_quotes && !in_exponent) 
+        {
+          if (strchr ("+dDeE", c) != NULL || (c == '-' && digits))
+            in_exponent = true;
+          else if (strchr ("0123456789}JKLMNOPQR", c) != NULL)
+            {
+              if (digits || c >= '1')
+                digits++;
+              if (digits > 13)
+                c = isdigit (c) ? '#' : '@';
+            }
+        }
+      putchar (c);
+    }
+  return EXIT_SUCCESS;
+}
diff --git a/tests/formats/month-out.sh b/tests/formats/month-out.sh
new file mode 100755 (executable)
index 0000000..65d0a42
--- /dev/null
@@ -0,0 +1,996 @@
+#! /bin/sh
+
+TEMPDIR=/tmp/pspp-tst-$$
+mkdir -p $TEMPDIR
+trap 'cd /; rm -rf $TEMPDIR' 0
+
+# ensure that top_builddir  are absolute
+if [ -z "$top_builddir" ] ; then top_builddir=. ; fi
+if [ -z "$top_srcdir" ] ; then top_srcdir=. ; fi
+top_builddir=`cd $top_builddir; pwd`
+PSPP=$top_builddir/src/ui/terminal/pspp
+
+# ensure that top_srcdir is absolute
+top_srcdir=`cd $top_srcdir; pwd`
+
+STAT_CONFIG_PATH=$top_srcdir/config
+export STAT_CONFIG_PATH
+
+fail()
+{
+    echo $activity
+    echo FAILED
+    exit 1;
+}
+
+
+no_result()
+{
+    echo $activity
+    echo NO RESULT;
+    exit 2;
+}
+
+pass()
+{
+    exit 0;
+}
+
+cd $TEMPDIR
+
+activity="write pspp syntax"
+cat > month-out.pspp <<EOF
+set errors=none.
+set mxwarns=10000000.
+data list /x 1-10.
+begin data.
+
+0
+0.5
+0.9
+1
+2
+3
+4
+4.1
+4.5
+4.9
+5
+6
+7
+7.1
+7.5
+7.9
+8
+9
+10
+11
+12
+13
+end data.
+print outfile='month-out.out'/x(month3).
+print outfile='month-out.out'/x(month4).
+print outfile='month-out.out'/x(month5).
+print outfile='month-out.out'/x(month6).
+print outfile='month-out.out'/x(month7).
+print outfile='month-out.out'/x(month8).
+print outfile='month-out.out'/x(month9).
+print outfile='month-out.out'/x(month10).
+print outfile='month-out.out'/x(month11).
+print outfile='month-out.out'/x(month12).
+print outfile='month-out.out'/x(month13).
+print outfile='month-out.out'/x(month14).
+print outfile='month-out.out'/x(month15).
+print outfile='month-out.out'/x(month16).
+print outfile='month-out.out'/x(month17).
+print outfile='month-out.out'/x(month18).
+print outfile='month-out.out'/x(month19).
+print outfile='month-out.out'/x(month20).
+print outfile='month-out.out'/x(month21).
+print outfile='month-out.out'/x(month22).
+print outfile='month-out.out'/x(month23).
+print outfile='month-out.out'/x(month24).
+print outfile='month-out.out'/x(month25).
+print outfile='month-out.out'/x(month26).
+print outfile='month-out.out'/x(month27).
+print outfile='month-out.out'/x(month28).
+print outfile='month-out.out'/x(month29).
+print outfile='month-out.out'/x(month30).
+print outfile='month-out.out'/x(month31).
+print outfile='month-out.out'/x(month32).
+print outfile='month-out.out'/x(month33).
+print outfile='month-out.out'/x(month34).
+print outfile='month-out.out'/x(month35).
+print outfile='month-out.out'/x(month36).
+print outfile='month-out.out'/x(month37).
+print outfile='month-out.out'/x(month38).
+print outfile='month-out.out'/x(month39).
+print outfile='month-out.out'/x(month40).
+execute.
+EOF
+if [ $? -ne 0 ] ; then no_result ; fi
+
+activity="run program"
+$SUPERVISOR $PSPP --testing-mode month-out.pspp
+if [ $? -eq 0 ] ; then no_result ; fi
+
+activity="compare output"
+diff -u month-out.out - <<EOF 
+   .
+    .
+     .
+      .
+       .
+        .
+         .
+          .
+           .
+            .
+             .
+              .
+               .
+                .
+                 .
+                  .
+                   .
+                    .
+                     .
+                      .
+                       .
+                        .
+                         .
+                          .
+                           .
+                            .
+                             .
+                              .
+                               .
+                                .
+                                 .
+                                  .
+                                   .
+                                    .
+                                     .
+                                      .
+                                       .
+                                        .
+   .
+    .
+     .
+      .
+       .
+        .
+         .
+          .
+           .
+            .
+             .
+              .
+               .
+                .
+                 .
+                  .
+                   .
+                    .
+                     .
+                      .
+                       .
+                        .
+                         .
+                          .
+                           .
+                            .
+                             .
+                              .
+                               .
+                                .
+                                 .
+                                  .
+                                   .
+                                    .
+                                     .
+                                      .
+                                       .
+                                        .
+   .
+    .
+     .
+      .
+       .
+        .
+         .
+          .
+           .
+            .
+             .
+              .
+               .
+                .
+                 .
+                  .
+                   .
+                    .
+                     .
+                      .
+                       .
+                        .
+                         .
+                          .
+                           .
+                            .
+                             .
+                              .
+                               .
+                                .
+                                 .
+                                  .
+                                   .
+                                    .
+                                     .
+                                      .
+                                       .
+                                        .
+   .
+    .
+     .
+      .
+       .
+        .
+         .
+          .
+           .
+            .
+             .
+              .
+               .
+                .
+                 .
+                  .
+                   .
+                    .
+                     .
+                      .
+                       .
+                        .
+                         .
+                          .
+                           .
+                            .
+                             .
+                              .
+                               .
+                                .
+                                 .
+                                  .
+                                   .
+                                    .
+                                     .
+                                      .
+                                       .
+                                        .
+ JAN
+ JANU
+ JANUA
+ JANUAR
+ JANUARY
+ JANUARY 
+ JANUARY  
+ JANUARY   
+ JANUARY    
+ JANUARY     
+ JANUARY      
+ JANUARY       
+ JANUARY        
+ JANUARY         
+ JANUARY          
+ JANUARY           
+ JANUARY            
+ JANUARY             
+ JANUARY              
+ JANUARY               
+ JANUARY                
+ JANUARY                 
+ JANUARY                  
+ JANUARY                   
+ JANUARY                    
+ JANUARY                     
+ JANUARY                      
+ JANUARY                       
+ JANUARY                        
+ JANUARY                         
+ JANUARY                          
+ JANUARY                           
+ JANUARY                            
+ JANUARY                             
+ JANUARY                              
+ JANUARY                               
+ JANUARY                                
+ JANUARY                                 
+ FEB
+ FEBR
+ FEBRU
+ FEBRUA
+ FEBRUAR
+ FEBRUARY
+ FEBRUARY 
+ FEBRUARY  
+ FEBRUARY   
+ FEBRUARY    
+ FEBRUARY     
+ FEBRUARY      
+ FEBRUARY       
+ FEBRUARY        
+ FEBRUARY         
+ FEBRUARY          
+ FEBRUARY           
+ FEBRUARY            
+ FEBRUARY             
+ FEBRUARY              
+ FEBRUARY               
+ FEBRUARY                
+ FEBRUARY                 
+ FEBRUARY                  
+ FEBRUARY                   
+ FEBRUARY                    
+ FEBRUARY                     
+ FEBRUARY                      
+ FEBRUARY                       
+ FEBRUARY                        
+ FEBRUARY                         
+ FEBRUARY                          
+ FEBRUARY                           
+ FEBRUARY                            
+ FEBRUARY                             
+ FEBRUARY                              
+ FEBRUARY                               
+ FEBRUARY                                
+ MAR
+ MARC
+ MARCH
+ MARCH 
+ MARCH  
+ MARCH   
+ MARCH    
+ MARCH     
+ MARCH      
+ MARCH       
+ MARCH        
+ MARCH         
+ MARCH          
+ MARCH           
+ MARCH            
+ MARCH             
+ MARCH              
+ MARCH               
+ MARCH                
+ MARCH                 
+ MARCH                  
+ MARCH                   
+ MARCH                    
+ MARCH                     
+ MARCH                      
+ MARCH                       
+ MARCH                        
+ MARCH                         
+ MARCH                          
+ MARCH                           
+ MARCH                            
+ MARCH                             
+ MARCH                              
+ MARCH                               
+ MARCH                                
+ MARCH                                 
+ MARCH                                  
+ MARCH                                   
+ APR
+ APRI
+ APRIL
+ APRIL 
+ APRIL  
+ APRIL   
+ APRIL    
+ APRIL     
+ APRIL      
+ APRIL       
+ APRIL        
+ APRIL         
+ APRIL          
+ APRIL           
+ APRIL            
+ APRIL             
+ APRIL              
+ APRIL               
+ APRIL                
+ APRIL                 
+ APRIL                  
+ APRIL                   
+ APRIL                    
+ APRIL                     
+ APRIL                      
+ APRIL                       
+ APRIL                        
+ APRIL                         
+ APRIL                          
+ APRIL                           
+ APRIL                            
+ APRIL                             
+ APRIL                              
+ APRIL                               
+ APRIL                                
+ APRIL                                 
+ APRIL                                  
+ APRIL                                   
+ APR
+ APRI
+ APRIL
+ APRIL 
+ APRIL  
+ APRIL   
+ APRIL    
+ APRIL     
+ APRIL      
+ APRIL       
+ APRIL        
+ APRIL         
+ APRIL          
+ APRIL           
+ APRIL            
+ APRIL             
+ APRIL              
+ APRIL               
+ APRIL                
+ APRIL                 
+ APRIL                  
+ APRIL                   
+ APRIL                    
+ APRIL                     
+ APRIL                      
+ APRIL                       
+ APRIL                        
+ APRIL                         
+ APRIL                          
+ APRIL                           
+ APRIL                            
+ APRIL                             
+ APRIL                              
+ APRIL                               
+ APRIL                                
+ APRIL                                 
+ APRIL                                  
+ APRIL                                   
+ APR
+ APRI
+ APRIL
+ APRIL 
+ APRIL  
+ APRIL   
+ APRIL    
+ APRIL     
+ APRIL      
+ APRIL       
+ APRIL        
+ APRIL         
+ APRIL          
+ APRIL           
+ APRIL            
+ APRIL             
+ APRIL              
+ APRIL               
+ APRIL                
+ APRIL                 
+ APRIL                  
+ APRIL                   
+ APRIL                    
+ APRIL                     
+ APRIL                      
+ APRIL                       
+ APRIL                        
+ APRIL                         
+ APRIL                          
+ APRIL                           
+ APRIL                            
+ APRIL                             
+ APRIL                              
+ APRIL                               
+ APRIL                                
+ APRIL                                 
+ APRIL                                  
+ APRIL                                   
+ APR
+ APRI
+ APRIL
+ APRIL 
+ APRIL  
+ APRIL   
+ APRIL    
+ APRIL     
+ APRIL      
+ APRIL       
+ APRIL        
+ APRIL         
+ APRIL          
+ APRIL           
+ APRIL            
+ APRIL             
+ APRIL              
+ APRIL               
+ APRIL                
+ APRIL                 
+ APRIL                  
+ APRIL                   
+ APRIL                    
+ APRIL                     
+ APRIL                      
+ APRIL                       
+ APRIL                        
+ APRIL                         
+ APRIL                          
+ APRIL                           
+ APRIL                            
+ APRIL                             
+ APRIL                              
+ APRIL                               
+ APRIL                                
+ APRIL                                 
+ APRIL                                  
+ APRIL                                   
+ MAY
+ MAY 
+ MAY  
+ MAY   
+ MAY    
+ MAY     
+ MAY      
+ MAY       
+ MAY        
+ MAY         
+ MAY          
+ MAY           
+ MAY            
+ MAY             
+ MAY              
+ MAY               
+ MAY                
+ MAY                 
+ MAY                  
+ MAY                   
+ MAY                    
+ MAY                     
+ MAY                      
+ MAY                       
+ MAY                        
+ MAY                         
+ MAY                          
+ MAY                           
+ MAY                            
+ MAY                             
+ MAY                              
+ MAY                               
+ MAY                                
+ MAY                                 
+ MAY                                  
+ MAY                                   
+ MAY                                    
+ MAY                                     
+ JUN
+ JUNE
+ JUNE 
+ JUNE  
+ JUNE   
+ JUNE    
+ JUNE     
+ JUNE      
+ JUNE       
+ JUNE        
+ JUNE         
+ JUNE          
+ JUNE           
+ JUNE            
+ JUNE             
+ JUNE              
+ JUNE               
+ JUNE                
+ JUNE                 
+ JUNE                  
+ JUNE                   
+ JUNE                    
+ JUNE                     
+ JUNE                      
+ JUNE                       
+ JUNE                        
+ JUNE                         
+ JUNE                          
+ JUNE                           
+ JUNE                            
+ JUNE                             
+ JUNE                              
+ JUNE                               
+ JUNE                                
+ JUNE                                 
+ JUNE                                  
+ JUNE                                   
+ JUNE                                    
+ JUL
+ JULY
+ JULY 
+ JULY  
+ JULY   
+ JULY    
+ JULY     
+ JULY      
+ JULY       
+ JULY        
+ JULY         
+ JULY          
+ JULY           
+ JULY            
+ JULY             
+ JULY              
+ JULY               
+ JULY                
+ JULY                 
+ JULY                  
+ JULY                   
+ JULY                    
+ JULY                     
+ JULY                      
+ JULY                       
+ JULY                        
+ JULY                         
+ JULY                          
+ JULY                           
+ JULY                            
+ JULY                             
+ JULY                              
+ JULY                               
+ JULY                                
+ JULY                                 
+ JULY                                  
+ JULY                                   
+ JULY                                    
+ JUL
+ JULY
+ JULY 
+ JULY  
+ JULY   
+ JULY    
+ JULY     
+ JULY      
+ JULY       
+ JULY        
+ JULY         
+ JULY          
+ JULY           
+ JULY            
+ JULY             
+ JULY              
+ JULY               
+ JULY                
+ JULY                 
+ JULY                  
+ JULY                   
+ JULY                    
+ JULY                     
+ JULY                      
+ JULY                       
+ JULY                        
+ JULY                         
+ JULY                          
+ JULY                           
+ JULY                            
+ JULY                             
+ JULY                              
+ JULY                               
+ JULY                                
+ JULY                                 
+ JULY                                  
+ JULY                                   
+ JULY                                    
+ JUL
+ JULY
+ JULY 
+ JULY  
+ JULY   
+ JULY    
+ JULY     
+ JULY      
+ JULY       
+ JULY        
+ JULY         
+ JULY          
+ JULY           
+ JULY            
+ JULY             
+ JULY              
+ JULY               
+ JULY                
+ JULY                 
+ JULY                  
+ JULY                   
+ JULY                    
+ JULY                     
+ JULY                      
+ JULY                       
+ JULY                        
+ JULY                         
+ JULY                          
+ JULY                           
+ JULY                            
+ JULY                             
+ JULY                              
+ JULY                               
+ JULY                                
+ JULY                                 
+ JULY                                  
+ JULY                                   
+ JULY                                    
+ JUL
+ JULY
+ JULY 
+ JULY  
+ JULY   
+ JULY    
+ JULY     
+ JULY      
+ JULY       
+ JULY        
+ JULY         
+ JULY          
+ JULY           
+ JULY            
+ JULY             
+ JULY              
+ JULY               
+ JULY                
+ JULY                 
+ JULY                  
+ JULY                   
+ JULY                    
+ JULY                     
+ JULY                      
+ JULY                       
+ JULY                        
+ JULY                         
+ JULY                          
+ JULY                           
+ JULY                            
+ JULY                             
+ JULY                              
+ JULY                               
+ JULY                                
+ JULY                                 
+ JULY                                  
+ JULY                                   
+ JULY                                    
+ AUG
+ AUGU
+ AUGUS
+ AUGUST
+ AUGUST 
+ AUGUST  
+ AUGUST   
+ AUGUST    
+ AUGUST     
+ AUGUST      
+ AUGUST       
+ AUGUST        
+ AUGUST         
+ AUGUST          
+ AUGUST           
+ AUGUST            
+ AUGUST             
+ AUGUST              
+ AUGUST               
+ AUGUST                
+ AUGUST                 
+ AUGUST                  
+ AUGUST                   
+ AUGUST                    
+ AUGUST                     
+ AUGUST                      
+ AUGUST                       
+ AUGUST                        
+ AUGUST                         
+ AUGUST                          
+ AUGUST                           
+ AUGUST                            
+ AUGUST                             
+ AUGUST                              
+ AUGUST                               
+ AUGUST                                
+ AUGUST                                 
+ AUGUST                                  
+ SEP
+ SEPT
+ SEPTE
+ SEPTEM
+ SEPTEMB
+ SEPTEMBE
+ SEPTEMBER
+ SEPTEMBER 
+ SEPTEMBER  
+ SEPTEMBER   
+ SEPTEMBER    
+ SEPTEMBER     
+ SEPTEMBER      
+ SEPTEMBER       
+ SEPTEMBER        
+ SEPTEMBER         
+ SEPTEMBER          
+ SEPTEMBER           
+ SEPTEMBER            
+ SEPTEMBER             
+ SEPTEMBER              
+ SEPTEMBER               
+ SEPTEMBER                
+ SEPTEMBER                 
+ SEPTEMBER                  
+ SEPTEMBER                   
+ SEPTEMBER                    
+ SEPTEMBER                     
+ SEPTEMBER                      
+ SEPTEMBER                       
+ SEPTEMBER                        
+ SEPTEMBER                         
+ SEPTEMBER                          
+ SEPTEMBER                           
+ SEPTEMBER                            
+ SEPTEMBER                             
+ SEPTEMBER                              
+ SEPTEMBER                               
+ OCT
+ OCTO
+ OCTOB
+ OCTOBE
+ OCTOBER
+ OCTOBER 
+ OCTOBER  
+ OCTOBER   
+ OCTOBER    
+ OCTOBER     
+ OCTOBER      
+ OCTOBER       
+ OCTOBER        
+ OCTOBER         
+ OCTOBER          
+ OCTOBER           
+ OCTOBER            
+ OCTOBER             
+ OCTOBER              
+ OCTOBER               
+ OCTOBER                
+ OCTOBER                 
+ OCTOBER                  
+ OCTOBER                   
+ OCTOBER                    
+ OCTOBER                     
+ OCTOBER                      
+ OCTOBER                       
+ OCTOBER                        
+ OCTOBER                         
+ OCTOBER                          
+ OCTOBER                           
+ OCTOBER                            
+ OCTOBER                             
+ OCTOBER                              
+ OCTOBER                               
+ OCTOBER                                
+ OCTOBER                                 
+ NOV
+ NOVE
+ NOVEM
+ NOVEMB
+ NOVEMBE
+ NOVEMBER
+ NOVEMBER 
+ NOVEMBER  
+ NOVEMBER   
+ NOVEMBER    
+ NOVEMBER     
+ NOVEMBER      
+ NOVEMBER       
+ NOVEMBER        
+ NOVEMBER         
+ NOVEMBER          
+ NOVEMBER           
+ NOVEMBER            
+ NOVEMBER             
+ NOVEMBER              
+ NOVEMBER               
+ NOVEMBER                
+ NOVEMBER                 
+ NOVEMBER                  
+ NOVEMBER                   
+ NOVEMBER                    
+ NOVEMBER                     
+ NOVEMBER                      
+ NOVEMBER                       
+ NOVEMBER                        
+ NOVEMBER                         
+ NOVEMBER                          
+ NOVEMBER                           
+ NOVEMBER                            
+ NOVEMBER                             
+ NOVEMBER                              
+ NOVEMBER                               
+ NOVEMBER                                
+ DEC
+ DECE
+ DECEM
+ DECEMB
+ DECEMBE
+ DECEMBER
+ DECEMBER 
+ DECEMBER  
+ DECEMBER   
+ DECEMBER    
+ DECEMBER     
+ DECEMBER      
+ DECEMBER       
+ DECEMBER        
+ DECEMBER         
+ DECEMBER          
+ DECEMBER           
+ DECEMBER            
+ DECEMBER             
+ DECEMBER              
+ DECEMBER               
+ DECEMBER                
+ DECEMBER                 
+ DECEMBER                  
+ DECEMBER                   
+ DECEMBER                    
+ DECEMBER                     
+ DECEMBER                      
+ DECEMBER                       
+ DECEMBER                        
+ DECEMBER                         
+ DECEMBER                          
+ DECEMBER                           
+ DECEMBER                            
+ DECEMBER                             
+ DECEMBER                              
+ DECEMBER                               
+ DECEMBER                                
+   .
+    .
+     .
+      .
+       .
+        .
+         .
+          .
+           .
+            .
+             .
+              .
+               .
+                .
+                 .
+                  .
+                   .
+                    .
+                     .
+                      .
+                       .
+                        .
+                         .
+                          .
+                           .
+                            .
+                             .
+                              .
+                               .
+                                .
+                                 .
+                                  .
+                                   .
+                                    .
+                                     .
+                                      .
+                                       .
+                                        .
+EOF
+if [ $? -ne 0 ] ; then fail ; fi
+
+pass
diff --git a/tests/formats/num-out-cmp.pl b/tests/formats/num-out-cmp.pl
new file mode 100644 (file)
index 0000000..d85b7cb
--- /dev/null
@@ -0,0 +1,74 @@
+use warnings;
+use strict;
+
+my (@prev) = ();
+our ($n) = 0;
+our ($suffix) = '';
+our ($prefix) = '';
+while (<>) {
+    s/^ //;
+    if (scalar (my (@line) = /^([A-Z]+)(\d+)([^"]+")( *)([^%"]*)(%?")$/) == 6) {
+       if (defined ($prev[0])
+           && $line[0] eq $prev[0]
+           && $line[1] == $prev[1] + 1
+           && $line[2] eq $prev[2]
+           && $line[5] eq $prev[5]) {
+           if ($line[3] eq " $prev[3]"
+               && $line[4] eq $prev[4]) {
+               flush_prefix ();
+               flush_suffix ();
+               $n++;
+           } elsif ($line[3] eq $prev[3]
+                    && length ($line[4]) == length ($prev[4]) + 1
+                    && $prev[4] eq substr ($line[4], 0, length ($line[4]) - 1)) {
+               flush_n ();
+               flush_prefix ();
+               $suffix .= substr ($line[4], -1);
+           } elsif ($line[3] eq $prev[3]
+                    && $prev[4] eq substr ($line[4], 1)) {
+               flush_n ();
+               flush_suffix ();
+               $prefix .= substr ($line[4], 0, 1);
+           } else {
+               flush ();
+               print $_;
+           }
+       } else {
+           flush ();
+           print $_;
+       }
+       @prev = @line;
+    } else {
+       flush ();
+       print $_;
+       @prev = ();
+    }
+}
+flush ();
+
+sub flush_suffix {
+    if ($suffix ne '') {
+       print "\$$suffix\n";
+       $suffix = '';
+    }
+}
+
+sub flush_prefix {
+    if ($prefix ne '') {
+       print "^$prefix\n";
+       $prefix = '';
+    }
+}
+
+sub flush_n {
+    if ($n) {
+       print "*$n\n";
+       $n = 0;
+    }
+}
+
+sub flush {
+    flush_prefix ();
+    flush_suffix ();
+    flush_n ();
+}
diff --git a/tests/formats/num-out-compare.pl b/tests/formats/num-out-compare.pl
new file mode 100644 (file)
index 0000000..6bf0cb7
--- /dev/null
@@ -0,0 +1,122 @@
+#! /usr/bin/perl -w
+
+use strict;
+use Getopt::Long;
+
+my $exact = 0;
+my $spss = 0;
+my $verbose = 0;
+Getopt::Long::Configure ("bundling");
+GetOptions ("e|exact!" => \$exact,
+           "s|spss!" => \$spss,
+           "v|verbose+" => \$verbose,
+           "h|help" => sub { usage (0) })
+  or usage (1);
+
+sub usage {
+    print "$0: compare expected and actual numeric formatting output\n";
+    print "usage: $0 [OPTION...] EXPECTED ACTUAL\n";
+    print "where EXPECTED is the file containing expected output\n";
+    print "and ACTUAL is the file containing actual output.\n";
+    print "Options:\n";
+    print "  -e, --exact: Require numbers to be exactly equal.\n";
+    print "               (By default, small differences are permitted.)\n";
+    print "  -s, --spss: Ignore most SPSS formatting bugs in EXPECTED.\n";
+    print "              (A few differences are not compensated)\n";
+    print "  -v, --verbose: Use once to summarize errors and differences.\n";
+    print "                 Use twice for details of differences.\n";
+    exit (@_);
+}
+
+open (EXPECTED, '<', $ARGV[0]) or die "$ARGV[0]: open: $!\n";
+open (ACTUAL, '<', $ARGV[1]) or die "$ARGV[1]: open: $!\n";
+my ($expr);
+my ($bad_round) = 0;
+my ($approximate) = 0;
+my ($spss_wtf1) = 0;
+my ($spss_wtf2) = 0;
+my ($lost_sign) = 0;
+my ($errors) = 0;
+while (defined (my $a = <EXPECTED>) && defined (my $b = <ACTUAL>)) {
+    chomp $a;
+    chomp $b;
+    if ($a eq $b) {
+       if ($a !~ /^\s*$/ && $a !~ /:/) {
+           $expr = $a;
+           $expr =~ s/\s*$//;
+           $expr =~ s/^\s*//;
+       }
+    } else {
+       my ($fmt, $a_out) = $a =~ /^ (.*): "(.*)"$/ or die;
+       my ($b_fmt, $b_out) = $b =~ /^ (.*): "(.*)"$/ or die;
+       die if $fmt ne $b_fmt;
+       die if $a_out eq $b_out;
+
+       if (!$exact) {
+           if (increment ($a_out) eq $b_out || increment ($b_out) eq $a_out) {
+               $approximate++;
+               next;
+           }
+       }
+       if ($spss) {
+           if ($a_out =~ /0.*0/ && $a_out !~ /[1-9]/) {
+               $bad_round++;
+               next;
+           } elsif ($a_out =~ /\*/ && $a_out !~ /^\*+$/) {
+               $spss_wtf1++;
+               next;
+           } elsif ($expr =~ /^-/
+                    && $a_out =~ /^\*+$/
+                    && $b_out =~ /-\d(\.\d*#*)?E[-+]\d\d\d/
+                    && $fmt =~ /^E/) {
+               $spss_wtf2++;
+               next;
+           } elsif ($expr =~ /^-/
+                    && (($a_out !~ /-/ && $a_out =~ /[1-9]/ && $b_out =~ /-/)
+                        || ($a_out =~ /^[0-9]+$/ && $b_out =~ /^\*+$/))) {
+               $lost_sign++;
+               next;
+           }
+       }
+       print "$.: $expr in $fmt: expected \"$a_out\", got \"$b_out\"\n"
+         if $verbose > 1;
+       $errors++;
+    }
+}
+if ($verbose) {
+    print "$errors errors\n";
+    if (!$exact) {
+       print "$approximate approximate matches\n";
+    }
+    if ($spss) {
+       print "$bad_round bad rounds\n";
+       print "$spss_wtf1 SPSS WTF 1\n";
+       print "$spss_wtf2 SPSS WTF 2\n";
+       print "$lost_sign lost signs\n";
+    }
+}
+exit ($errors > 0);
+
+# Returns the argument value incremented by one unit in its final
+# decimal place.
+sub increment {
+    local ($_) = @_;
+    my ($last_digit, $i);
+    for ($i = 0; $i < length $_; $i++) {
+       my ($c) = substr ($_, $i, 1);
+       last if ($c eq 'E');
+       $last_digit = $i if $c =~ /[0-9]/;
+    }
+    return $_ if !defined $last_digit;
+    for ($i = $last_digit; $i >= 0; $i--) {
+       my ($c) = substr ($_, $i, 1);
+       if ($c eq '9') {
+           substr ($_, $i, 1) = '0';
+       } elsif ($c =~ /[0-8]/) {
+           substr ($_, $i, 1) = chr (ord ($c) + 1);
+           last;
+       }
+    }
+    $_ = "1$_" if $i < 0;
+    return $_;
+}
diff --git a/tests/formats/num-out-decmp.pl b/tests/formats/num-out-decmp.pl
new file mode 100644 (file)
index 0000000..3c066fe
--- /dev/null
@@ -0,0 +1,28 @@
+use warnings;
+use strict;
+
+my (@line);
+while (<>) {
+    if (my ($n) = /^\*(\d+)$/) {
+       for (1...$n) {
+           $line[1]++;
+           $line[3] = " $line[3]";
+           print ' ', join ('', @line), "\n";
+       }
+    } elsif (my ($suffix) = /^\$(.*)$/) {
+       for my $c (split ('', $suffix)) {
+           $line[1]++;
+           $line[4] .= $c;
+           print ' ', join ('', @line), "\n";
+       }
+    } elsif (my ($prefix) = /^\^(.*)$/) {
+       for my $c (split ('', $prefix)) {
+           $line[1]++;
+           $line[4] = "$c$line[4]";
+           print ' ', join ('', @line), "\n";
+       }
+    } else {
+       @line = /^([A-Z]+)(\d+)([^"]+")( *)([^%"]*)(%?")$/;
+       print " $_";
+    }
+}
diff --git a/tests/formats/num-out.expected.cmp.gz b/tests/formats/num-out.expected.cmp.gz
new file mode 100644 (file)
index 0000000..f1f55b1
Binary files /dev/null and b/tests/formats/num-out.expected.cmp.gz differ
diff --git a/tests/formats/num-out.pl b/tests/formats/num-out.pl
new file mode 100644 (file)
index 0000000..1bb602b
--- /dev/null
@@ -0,0 +1,41 @@
+use warnings;
+use strict;
+
+my @values = qw(0 2 9.5 27 271 999.95 2718 9999.995 27182 271828
+2718281 2**39 2**333 2**-21 -2 -9.5 -27 -271 -999.95 -2718 -9999.995
+-27182 -271828 -2718281 -2**39 -2**333 -2**-21 -0 3.125 31.25 314.125
+3141.5 31415.875 314159.25 3141592.625 31415926.5 271828182.25
+3214567890.5 31415926535.875 -3.125 -31.375 -314.125 -3141.5
+-31415.875 -314159.25 -3141592.625 -31415926.5 -271828182.25
+-3214567890.5 -31415926535.875);
+
+print "SET CCA=',,,'.\n";
+print "SET CCB='-,[[[,]]],-'.\n";
+print "SET CCC='((,[,],))'.\n";
+print "SET CCD=',XXX,,-'.\n";
+print "SET CCE=',,YYY,-'.\n";
+print "INPUT PROGRAM.\n";
+print "STRING EXPR(A16).\n";
+print map ("COMPUTE NUM=$_.\nCOMPUTE EXPR='$_'.\nEND CASE.\n", @values);
+print "END FILE.\n";
+print "END INPUT PROGRAM.\n";
+
+print "PRINT OUTFILE='output.txt'/EXPR.\n";
+for my $format qw (F COMMA DOT DOLLAR PCT E CCA CCB CCC CCD CCE N Z) {
+    for my $d (0...16) {
+       my ($min_w);
+       if ($format ne 'E') {
+           $min_w = $d + 1;
+           $min_w++ if $format eq 'DOLLAR' || $format eq 'PCT';
+           $min_w = 2 if $min_w == 1 && ($format =~ /^CC/);
+       } else {
+           $min_w = $d + 7;
+       }
+       for my $w ($min_w...40) {
+           my ($f) = "$format$w.$d";
+           print "PRINT OUTFILE='output.txt'/'$f: \"' NUM($f) '\"'.\n";
+       }
+    }
+    print "PRINT SPACE OUTFILE='output.txt'.\n";
+}
+print "EXECUTE.\n";
diff --git a/tests/formats/num-out.sh b/tests/formats/num-out.sh
new file mode 100755 (executable)
index 0000000..37b0d2e
--- /dev/null
@@ -0,0 +1,78 @@
+#! /bin/sh
+
+TEMPDIR=/tmp/pspp-tst-$$
+mkdir -p $TEMPDIR
+trap 'cd /; rm -rf $TEMPDIR' 0
+
+# ensure that top_builddir  are absolute
+if [ -z "$top_builddir" ] ; then top_builddir=. ; fi
+if [ -z "$top_srcdir" ] ; then top_srcdir=. ; fi
+top_builddir=`cd $top_builddir; pwd`
+PSPP=$top_builddir/src/ui/terminal/pspp
+
+# ensure that top_srcdir is absolute
+top_srcdir=`cd $top_srcdir; pwd`
+
+STAT_CONFIG_PATH=$top_srcdir/config
+export STAT_CONFIG_PATH
+
+fail()
+{
+    echo $activity
+    echo FAILED
+    exit 1;
+}
+
+
+no_result()
+{
+    echo $activity
+    echo NO RESULT;
+    exit 2;
+}
+
+pass()
+{
+    exit 0;
+}
+
+cd $TEMPDIR
+
+activity="generate pspp syntax"
+$PERL $top_srcdir/tests/formats/num-out.pl > num-out.pspp
+if [ $? -ne 0 ] ; then no_result ; fi
+echo -n .
+
+activity="run program"
+$SUPERVISOR $PSPP --testing-mode num-out.pspp
+if [ $? -ne 0 ] ; then no_result ; fi
+echo -n .
+
+activity="inexactify results"
+$top_builddir/tests/formats/inexactify < output.txt > output.inexact
+if [ $? -ne 0 ] ; then no_result ; fi
+echo -n .
+
+activity="gunzip expected results"
+gzip -cd < $top_srcdir/tests/formats/num-out.expected.cmp.gz > expected.txt.cmp
+if [ $? -ne 0 ] ; then no_result ; fi
+echo -n .
+
+activity="decompress expected results"
+$PERL $top_srcdir/tests/formats/num-out-decmp.pl < expected.txt.cmp > expected.txt
+if [ $? -ne 0 ] ; then no_result ; fi
+echo -n .
+
+activity="inexactify expected results"
+$top_builddir/tests/formats/inexactify < expected.txt > expected.inexact
+if [ $? -ne 0 ] ; then no_result ; fi
+echo -n .
+
+activity="compare output"
+$PERL $top_srcdir/tests/formats/num-out-compare.pl \
+       $PSPP_NUM_OUT_COMPARE_FLAGS expected.inexact output.inexact
+if [ $? -ne 0 ] ; then fail ; fi
+
+echo .
+
+pass
diff --git a/tests/formats/time-out.sh b/tests/formats/time-out.sh
new file mode 100755 (executable)
index 0000000..c110b96
--- /dev/null
@@ -0,0 +1,13124 @@
+#! /bin/sh
+
+TEMPDIR=/tmp/pspp-tst-$$
+mkdir -p $TEMPDIR
+trap 'cd /; rm -rf $TEMPDIR' 0
+
+# ensure that top_builddir  are absolute
+if [ -z "$top_builddir" ] ; then top_builddir=. ; fi
+if [ -z "$top_srcdir" ] ; then top_srcdir=. ; fi
+top_builddir=`cd $top_builddir; pwd`
+PSPP=$top_builddir/src/ui/terminal/pspp
+
+# ensure that top_srcdir is absolute
+top_srcdir=`cd $top_srcdir; pwd`
+
+STAT_CONFIG_PATH=$top_srcdir/config
+export STAT_CONFIG_PATH
+
+fail()
+{
+    echo $activity
+    echo FAILED
+    exit 1;
+}
+
+
+no_result()
+{
+    echo $activity
+    echo NO RESULT;
+    exit 2;
+}
+
+pass()
+{
+    exit 0;
+}
+
+cd $TEMPDIR
+
+activity="write pspp syntax"
+cat > time-out.pspp <<EOF
+set epoch=1930.
+data list /x 1-30 (dtime).
+begin data.
+0 0:0:0
+0 4:50:38.12301
+0 12:31:35.23453
+0 12:47:53.34505
+0 1:26:0.45615
+0 20:58:11.56677
+0 7:36:5.18964
+0 15:43:49.83132
+0 4:25:9.01293
+0 6:49:27.52375
+0 2:57:52.01565
+0 16:45:44.86529
+0 21:30:57.82047
+0 4:25:9.15395
+0 6:49:27.10533
+0 2:57:52.48229
+0 16:45:44.65827
+0 21:30:57.58219
+0 22:30:4.18347
+0 1:56:51.59319
+1 0:0:0
+1 4:50:38.12301
+1 12:31:35.23453
+1 12:47:53.34505
+1 1:26:0.45615
+1 20:58:11.56677
+1 7:36:5.18964
+1 15:43:49.83132
+1 4:25:9.01293
+1 6:49:27.52375
+1 2:57:52.01565
+1 16:45:44.86529
+1 21:30:57.82047
+1 4:25:9.15395
+1 6:49:27.10533
+1 2:57:52.48229
+1 16:45:44.65827
+1 21:30:57.58219
+1 22:30:4.18347
+1 1:56:51.59319
+2 0:0:0
+2 4:50:38.12301
+2 12:31:35.23453
+2 12:47:53.34505
+2 1:26:0.45615
+2 20:58:11.56677
+2 7:36:5.18964
+2 15:43:49.83132
+2 4:25:9.01293
+2 6:49:27.52375
+2 2:57:52.01565
+2 16:45:44.86529
+2 21:30:57.82047
+2 4:25:9.15395
+2 6:49:27.10533
+2 2:57:52.48229
+2 16:45:44.65827
+2 21:30:57.58219
+2 22:30:4.18347
+2 1:56:51.59319
+54 0:0:0
+54 4:50:38.12301
+54 12:31:35.23453
+54 12:47:53.34505
+54 1:26:0.45615
+54 20:58:11.56677
+54 7:36:5.18964
+54 15:43:49.83132
+54 4:25:9.01293
+54 6:49:27.52375
+54 2:57:52.01565
+54 16:45:44.86529
+54 21:30:57.82047
+54 4:25:9.15395
+54 6:49:27.10533
+54 2:57:52.48229
+54 16:45:44.65827
+54 21:30:57.58219
+54 22:30:4.18347
+54 1:56:51.59319
+681 0:0:0
+681 4:50:38.12301
+681 12:31:35.23453
+681 12:47:53.34505
+681 1:26:0.45615
+681 20:58:11.56677
+681 7:36:5.18964
+681 15:43:49.83132
+681 4:25:9.01293
+681 6:49:27.52375
+681 2:57:52.01565
+681 16:45:44.86529
+681 21:30:57.82047
+681 4:25:9.15395
+681 6:49:27.10533
+681 2:57:52.48229
+681 16:45:44.65827
+681 21:30:57.58219
+681 22:30:4.18347
+681 1:56:51.59319
+-0 0:0:0
+-0 4:50:38.12301
+-0 12:31:35.23453
+-0 12:47:53.34505
+-0 1:26:0.45615
+-0 20:58:11.56677
+-0 7:36:5.18964
+-0 15:43:49.83132
+-0 4:25:9.01293
+-0 6:49:27.52375
+-0 2:57:52.01565
+-0 16:45:44.86529
+-0 21:30:57.82047
+-0 4:25:9.15395
+-0 6:49:27.10533
+-0 2:57:52.48229
+-0 16:45:44.65827
+-0 21:30:57.58219
+-0 22:30:4.18347
+-0 1:56:51.59319
+-1 0:0:0
+-1 4:50:38.12301
+-1 12:31:35.23453
+-1 12:47:53.34505
+-1 1:26:0.45615
+-1 20:58:11.56677
+-1 7:36:5.18964
+-1 15:43:49.83132
+-1 4:25:9.01293
+-1 6:49:27.52375
+-1 2:57:52.01565
+-1 16:45:44.86529
+-1 21:30:57.82047
+-1 4:25:9.15395
+-1 6:49:27.10533
+-1 2:57:52.48229
+-1 16:45:44.65827
+-1 21:30:57.58219
+-1 22:30:4.18347
+-1 1:56:51.59319
+-2 0:0:0
+-2 4:50:38.12301
+-2 12:31:35.23453
+-2 12:47:53.34505
+-2 1:26:0.45615
+-2 20:58:11.56677
+-2 7:36:5.18964
+-2 15:43:49.83132
+-2 4:25:9.01293
+-2 6:49:27.52375
+-2 2:57:52.01565
+-2 16:45:44.86529
+-2 21:30:57.82047
+-2 4:25:9.15395
+-2 6:49:27.10533
+-2 2:57:52.48229
+-2 16:45:44.65827
+-2 21:30:57.58219
+-2 22:30:4.18347
+-2 1:56:51.59319
+-54 0:0:0
+-54 4:50:38.12301
+-54 12:31:35.23453
+-54 12:47:53.34505
+-54 1:26:0.45615
+-54 20:58:11.56677
+-54 7:36:5.18964
+-54 15:43:49.83132
+-54 4:25:9.01293
+-54 6:49:27.52375
+-54 2:57:52.01565
+-54 16:45:44.86529
+-54 21:30:57.82047
+-54 4:25:9.15395
+-54 6:49:27.10533
+-54 2:57:52.48229
+-54 16:45:44.65827
+-54 21:30:57.58219
+-54 22:30:4.18347
+-54 1:56:51.59319
+-681 0:0:0
+-681 4:50:38.12301
+-681 12:31:35.23453
+-681 12:47:53.34505
+-681 1:26:0.45615
+-681 20:58:11.56677
+-681 7:36:5.18964
+-681 15:43:49.83132
+-681 4:25:9.01293
+-681 6:49:27.52375
+-681 2:57:52.01565
+-681 16:45:44.86529
+-681 21:30:57.82047
+-681 4:25:9.15395
+-681 6:49:27.10533
+-681 2:57:52.48229
+-681 16:45:44.65827
+-681 21:30:57.58219
+-681 22:30:4.18347
+-681 1:56:51.59319
+end data.
+print outfile='time-out.out'/x(time5).
+print outfile='time-out.out'/x(time6).
+print outfile='time-out.out'/x(time7).
+print outfile='time-out.out'/x(time8).
+print outfile='time-out.out'/x(time9).
+print outfile='time-out.out'/x(time10).
+print outfile='time-out.out'/x(time10.1).
+print outfile='time-out.out'/x(time11).
+print outfile='time-out.out'/x(time11.1).
+print outfile='time-out.out'/x(time11.2).
+print outfile='time-out.out'/x(time12).
+print outfile='time-out.out'/x(time12.1).
+print outfile='time-out.out'/x(time12.2).
+print outfile='time-out.out'/x(time12.3).
+print outfile='time-out.out'/x(time13).
+print outfile='time-out.out'/x(time13.1).
+print outfile='time-out.out'/x(time13.2).
+print outfile='time-out.out'/x(time13.3).
+print outfile='time-out.out'/x(time13.4).
+print outfile='time-out.out'/x(time14).
+print outfile='time-out.out'/x(time14.1).
+print outfile='time-out.out'/x(time14.2).
+print outfile='time-out.out'/x(time14.3).
+print outfile='time-out.out'/x(time14.4).
+print outfile='time-out.out'/x(time14.5).
+print outfile='time-out.out'/x(time15).
+print outfile='time-out.out'/x(time15.1).
+print outfile='time-out.out'/x(time15.2).
+print outfile='time-out.out'/x(time15.3).
+print outfile='time-out.out'/x(time15.4).
+print outfile='time-out.out'/x(time15.5).
+print outfile='time-out.out'/x(time15.6).
+print outfile='time-out.out'/x(dtime8).
+print outfile='time-out.out'/x(dtime9).
+print outfile='time-out.out'/x(dtime10).
+print outfile='time-out.out'/x(dtime11).
+print outfile='time-out.out'/x(dtime12).
+print outfile='time-out.out'/x(dtime13).
+print outfile='time-out.out'/x(dtime13.1).
+print outfile='time-out.out'/x(dtime14).
+print outfile='time-out.out'/x(dtime14.1).
+print outfile='time-out.out'/x(dtime14.2).
+print outfile='time-out.out'/x(dtime15).
+print outfile='time-out.out'/x(dtime15.1).
+print outfile='time-out.out'/x(dtime15.2).
+print outfile='time-out.out'/x(dtime15.3).
+print outfile='time-out.out'/x(dtime16).
+print outfile='time-out.out'/x(dtime16.1).
+print outfile='time-out.out'/x(dtime16.2).
+print outfile='time-out.out'/x(dtime16.3).
+print outfile='time-out.out'/x(dtime16.4).
+print outfile='time-out.out'/x(dtime17).
+print outfile='time-out.out'/x(dtime17.1).
+print outfile='time-out.out'/x(dtime17.2).
+print outfile='time-out.out'/x(dtime17.3).
+print outfile='time-out.out'/x(dtime17.4).
+print outfile='time-out.out'/x(dtime17.5).
+print outfile='time-out.out'/x(dtime18).
+print outfile='time-out.out'/x(dtime18.1).
+print outfile='time-out.out'/x(dtime18.2).
+print outfile='time-out.out'/x(dtime18.3).
+print outfile='time-out.out'/x(dtime18.4).
+print outfile='time-out.out'/x(dtime18.5).
+print outfile='time-out.out'/x(dtime18.6).
+execute.
+EOF
+if [ $? -ne 0 ] ; then no_result ; fi
+
+activity="run program"
+$SUPERVISOR $PSPP --testing-mode time-out.pspp
+if [ $? -ne 0 ] ; then no_result ; fi
+
+activity="compare output"
+diff -u time-out.out - <<EOF 
+  0:00
+   0:00
+ 0:00:00
+  0:00:00
+   0:00:00
+    0:00:00
+  0:00:00.0
+     0:00:00
+   0:00:00.0
+  0:00:00.00
+      0:00:00
+    0:00:00.0
+   0:00:00.00
+  0:00:00.000
+       0:00:00
+     0:00:00.0
+    0:00:00.00
+   0:00:00.000
+  0:00:00.0000
+        0:00:00
+      0:00:00.0
+     0:00:00.00
+    0:00:00.000
+   0:00:00.0000
+  0:00:00.00000
+         0:00:00
+       0:00:00.0
+      0:00:00.00
+     0:00:00.000
+    0:00:00.0000
+   0:00:00.00000
+  0:00:00.000000
+  0 00:00
+   0 00:00
+ 0 00:00:00
+  0 00:00:00
+   0 00:00:00
+    0 00:00:00
+  0 00:00:00.0
+     0 00:00:00
+   0 00:00:00.0
+  0 00:00:00.00
+      0 00:00:00
+    0 00:00:00.0
+   0 00:00:00.00
+  0 00:00:00.000
+       0 00:00:00
+     0 00:00:00.0
+    0 00:00:00.00
+   0 00:00:00.000
+  0 00:00:00.0000
+        0 00:00:00
+      0 00:00:00.0
+     0 00:00:00.00
+    0 00:00:00.000
+   0 00:00:00.0000
+  0 00:00:00.00000
+         0 00:00:00
+       0 00:00:00.0
+      0 00:00:00.00
+     0 00:00:00.000
+    0 00:00:00.0000
+   0 00:00:00.00000
+  0 00:00:00.000000
+  4:50
+   4:50
+ 4:50:38
+  4:50:38
+   4:50:38
+    4:50:38
+  4:50:38.1
+     4:50:38
+   4:50:38.1
+  4:50:38.12
+      4:50:38
+    4:50:38.1
+   4:50:38.12
+  4:50:38.123
+       4:50:38
+     4:50:38.1
+    4:50:38.12
+   4:50:38.123
+  4:50:38.1230
+        4:50:38
+      4:50:38.1
+     4:50:38.12
+    4:50:38.123
+   4:50:38.1230
+  4:50:38.12301
+         4:50:38
+       4:50:38.1
+      4:50:38.12
+     4:50:38.123
+    4:50:38.1230
+   4:50:38.12301
+  4:50:38.123010
+  0 04:50
+   0 04:50
+ 0 04:50:38
+  0 04:50:38
+   0 04:50:38
+    0 04:50:38
+  0 04:50:38.1
+     0 04:50:38
+   0 04:50:38.1
+  0 04:50:38.12
+      0 04:50:38
+    0 04:50:38.1
+   0 04:50:38.12
+  0 04:50:38.123
+       0 04:50:38
+     0 04:50:38.1
+    0 04:50:38.12
+   0 04:50:38.123
+  0 04:50:38.1230
+        0 04:50:38
+      0 04:50:38.1
+     0 04:50:38.12
+    0 04:50:38.123
+   0 04:50:38.1230
+  0 04:50:38.12301
+         0 04:50:38
+       0 04:50:38.1
+      0 04:50:38.12
+     0 04:50:38.123
+    0 04:50:38.1230
+   0 04:50:38.12301
+  0 04:50:38.123010
+ 12:31
+  12:31
+   12:31
+ 12:31:35
+  12:31:35
+   12:31:35
+ 12:31:35.2
+    12:31:35
+  12:31:35.2
+ 12:31:35.23
+     12:31:35
+   12:31:35.2
+  12:31:35.23
+ 12:31:35.235
+      12:31:35
+    12:31:35.2
+   12:31:35.23
+  12:31:35.235
+ 12:31:35.2345
+       12:31:35
+     12:31:35.2
+    12:31:35.23
+   12:31:35.235
+  12:31:35.2345
+ 12:31:35.23453
+        12:31:35
+      12:31:35.2
+     12:31:35.23
+    12:31:35.235
+   12:31:35.2345
+  12:31:35.23453
+ 12:31:35.234530
+  0 12:31
+   0 12:31
+ 0 12:31:35
+  0 12:31:35
+   0 12:31:35
+    0 12:31:35
+  0 12:31:35.2
+     0 12:31:35
+   0 12:31:35.2
+  0 12:31:35.23
+      0 12:31:35
+    0 12:31:35.2
+   0 12:31:35.23
+  0 12:31:35.235
+       0 12:31:35
+     0 12:31:35.2
+    0 12:31:35.23
+   0 12:31:35.235
+  0 12:31:35.2345
+        0 12:31:35
+      0 12:31:35.2
+     0 12:31:35.23
+    0 12:31:35.235
+   0 12:31:35.2345
+  0 12:31:35.23453
+         0 12:31:35
+       0 12:31:35.2
+      0 12:31:35.23
+     0 12:31:35.235
+    0 12:31:35.2345
+   0 12:31:35.23453
+  0 12:31:35.234530
+ 12:47
+  12:47
+   12:47
+ 12:47:53
+  12:47:53
+   12:47:53
+ 12:47:53.3
+    12:47:53
+  12:47:53.3
+ 12:47:53.35
+     12:47:53
+   12:47:53.3
+  12:47:53.35
+ 12:47:53.345
+      12:47:53
+    12:47:53.3
+   12:47:53.35
+  12:47:53.345
+ 12:47:53.3451
+       12:47:53
+     12:47:53.3
+    12:47:53.35
+   12:47:53.345
+  12:47:53.3451
+ 12:47:53.34505
+        12:47:53
+      12:47:53.3
+     12:47:53.35
+    12:47:53.345
+   12:47:53.3451
+  12:47:53.34505
+ 12:47:53.345050
+  0 12:47
+   0 12:47
+ 0 12:47:53
+  0 12:47:53
+   0 12:47:53
+    0 12:47:53
+  0 12:47:53.3
+     0 12:47:53
+   0 12:47:53.3
+  0 12:47:53.35
+      0 12:47:53
+    0 12:47:53.3
+   0 12:47:53.35
+  0 12:47:53.345
+       0 12:47:53
+     0 12:47:53.3
+    0 12:47:53.35
+   0 12:47:53.345
+  0 12:47:53.3451
+        0 12:47:53
+      0 12:47:53.3
+     0 12:47:53.35
+    0 12:47:53.345
+   0 12:47:53.3451
+  0 12:47:53.34505
+         0 12:47:53
+       0 12:47:53.3
+      0 12:47:53.35
+     0 12:47:53.345
+    0 12:47:53.3451
+   0 12:47:53.34505
+  0 12:47:53.345050
+  1:26
+   1:26
+ 1:26:00
+  1:26:00
+   1:26:00
+    1:26:00
+  1:26:00.5
+     1:26:00
+   1:26:00.5
+  1:26:00.46
+      1:26:00
+    1:26:00.5
+   1:26:00.46
+  1:26:00.456
+       1:26:00
+     1:26:00.5
+    1:26:00.46
+   1:26:00.456
+  1:26:00.4561
+        1:26:00
+      1:26:00.5
+     1:26:00.46
+    1:26:00.456
+   1:26:00.4561
+  1:26:00.45615
+         1:26:00
+       1:26:00.5
+      1:26:00.46
+     1:26:00.456
+    1:26:00.4561
+   1:26:00.45615
+  1:26:00.456150
+  0 01:26
+   0 01:26
+ 0 01:26:00
+  0 01:26:00
+   0 01:26:00
+    0 01:26:00
+  0 01:26:00.5
+     0 01:26:00
+   0 01:26:00.5
+  0 01:26:00.46
+      0 01:26:00
+    0 01:26:00.5
+   0 01:26:00.46
+  0 01:26:00.456
+       0 01:26:00
+     0 01:26:00.5
+    0 01:26:00.46
+   0 01:26:00.456
+  0 01:26:00.4561
+        0 01:26:00
+      0 01:26:00.5
+     0 01:26:00.46
+    0 01:26:00.456
+   0 01:26:00.4561
+  0 01:26:00.45615
+         0 01:26:00
+       0 01:26:00.5
+      0 01:26:00.46
+     0 01:26:00.456
+    0 01:26:00.4561
+   0 01:26:00.45615
+  0 01:26:00.456150
+ 20:58
+  20:58
+   20:58
+ 20:58:11
+  20:58:11
+   20:58:11
+ 20:58:11.6
+    20:58:11
+  20:58:11.6
+ 20:58:11.57
+     20:58:11
+   20:58:11.6
+  20:58:11.57
+ 20:58:11.567
+      20:58:11
+    20:58:11.6
+   20:58:11.57
+  20:58:11.567
+ 20:58:11.5668
+       20:58:11
+     20:58:11.6
+    20:58:11.57
+   20:58:11.567
+  20:58:11.5668
+ 20:58:11.56677
+        20:58:11
+      20:58:11.6
+     20:58:11.57
+    20:58:11.567
+   20:58:11.5668
+  20:58:11.56677
+ 20:58:11.566770
+  0 20:58
+   0 20:58
+ 0 20:58:11
+  0 20:58:11
+   0 20:58:11
+    0 20:58:11
+  0 20:58:11.6
+     0 20:58:11
+   0 20:58:11.6
+  0 20:58:11.57
+      0 20:58:11
+    0 20:58:11.6
+   0 20:58:11.57
+  0 20:58:11.567
+       0 20:58:11
+     0 20:58:11.6
+    0 20:58:11.57
+   0 20:58:11.567
+  0 20:58:11.5668
+        0 20:58:11
+      0 20:58:11.6
+     0 20:58:11.57
+    0 20:58:11.567
+   0 20:58:11.5668
+  0 20:58:11.56677
+         0 20:58:11
+       0 20:58:11.6
+      0 20:58:11.57
+     0 20:58:11.567
+    0 20:58:11.5668
+   0 20:58:11.56677
+  0 20:58:11.566770
+  7:36
+   7:36
+ 7:36:05
+  7:36:05
+   7:36:05
+    7:36:05
+  7:36:05.2
+     7:36:05
+   7:36:05.2
+  7:36:05.19
+      7:36:05
+    7:36:05.2
+   7:36:05.19
+  7:36:05.190
+       7:36:05
+     7:36:05.2
+    7:36:05.19
+   7:36:05.190
+  7:36:05.1896
+        7:36:05
+      7:36:05.2
+     7:36:05.19
+    7:36:05.190
+   7:36:05.1896
+  7:36:05.18964
+         7:36:05
+       7:36:05.2
+      7:36:05.19
+     7:36:05.190
+    7:36:05.1896
+   7:36:05.18964
+  7:36:05.189640
+  0 07:36
+   0 07:36
+ 0 07:36:05
+  0 07:36:05
+   0 07:36:05
+    0 07:36:05
+  0 07:36:05.2
+     0 07:36:05
+   0 07:36:05.2
+  0 07:36:05.19
+      0 07:36:05
+    0 07:36:05.2
+   0 07:36:05.19
+  0 07:36:05.190
+       0 07:36:05
+     0 07:36:05.2
+    0 07:36:05.19
+   0 07:36:05.190
+  0 07:36:05.1896
+        0 07:36:05
+      0 07:36:05.2
+     0 07:36:05.19
+    0 07:36:05.190
+   0 07:36:05.1896
+  0 07:36:05.18964
+         0 07:36:05
+       0 07:36:05.2
+      0 07:36:05.19
+     0 07:36:05.190
+    0 07:36:05.1896
+   0 07:36:05.18964
+  0 07:36:05.189640
+ 15:43
+  15:43
+   15:43
+ 15:43:49
+  15:43:49
+   15:43:49
+ 15:43:49.8
+    15:43:49
+  15:43:49.8
+ 15:43:49.83
+     15:43:49
+   15:43:49.8
+  15:43:49.83
+ 15:43:49.831
+      15:43:49
+    15:43:49.8
+   15:43:49.83
+  15:43:49.831
+ 15:43:49.8313
+       15:43:49
+     15:43:49.8
+    15:43:49.83
+   15:43:49.831
+  15:43:49.8313
+ 15:43:49.83132
+        15:43:49
+      15:43:49.8
+     15:43:49.83
+    15:43:49.831
+   15:43:49.8313
+  15:43:49.83132
+ 15:43:49.831320
+  0 15:43
+   0 15:43
+ 0 15:43:49
+  0 15:43:49
+   0 15:43:49
+    0 15:43:49
+  0 15:43:49.8
+     0 15:43:49
+   0 15:43:49.8
+  0 15:43:49.83
+      0 15:43:49
+    0 15:43:49.8
+   0 15:43:49.83
+  0 15:43:49.831
+       0 15:43:49
+     0 15:43:49.8
+    0 15:43:49.83
+   0 15:43:49.831
+  0 15:43:49.8313
+        0 15:43:49
+      0 15:43:49.8
+     0 15:43:49.83
+    0 15:43:49.831
+   0 15:43:49.8313
+  0 15:43:49.83132
+         0 15:43:49
+       0 15:43:49.8
+      0 15:43:49.83
+     0 15:43:49.831
+    0 15:43:49.8313
+   0 15:43:49.83132
+  0 15:43:49.831320
+  4:25
+   4:25
+ 4:25:09
+  4:25:09
+   4:25:09
+    4:25:09
+  4:25:09.0
+     4:25:09
+   4:25:09.0
+  4:25:09.01
+      4:25:09
+    4:25:09.0
+   4:25:09.01
+  4:25:09.013
+       4:25:09
+     4:25:09.0
+    4:25:09.01
+   4:25:09.013
+  4:25:09.0129
+        4:25:09
+      4:25:09.0
+     4:25:09.01
+    4:25:09.013
+   4:25:09.0129
+  4:25:09.01293
+         4:25:09
+       4:25:09.0
+      4:25:09.01
+     4:25:09.013
+    4:25:09.0129
+   4:25:09.01293
+  4:25:09.012930
+  0 04:25
+   0 04:25
+ 0 04:25:09
+  0 04:25:09
+   0 04:25:09
+    0 04:25:09
+  0 04:25:09.0
+     0 04:25:09
+   0 04:25:09.0
+  0 04:25:09.01
+      0 04:25:09
+    0 04:25:09.0
+   0 04:25:09.01
+  0 04:25:09.013
+       0 04:25:09
+     0 04:25:09.0
+    0 04:25:09.01
+   0 04:25:09.013
+  0 04:25:09.0129
+        0 04:25:09
+      0 04:25:09.0
+     0 04:25:09.01
+    0 04:25:09.013
+   0 04:25:09.0129
+  0 04:25:09.01293
+         0 04:25:09
+       0 04:25:09.0
+      0 04:25:09.01
+     0 04:25:09.013
+    0 04:25:09.0129
+   0 04:25:09.01293
+  0 04:25:09.012930
+  6:49
+   6:49
+ 6:49:27
+  6:49:27
+   6:49:27
+    6:49:27
+  6:49:27.5
+     6:49:27
+   6:49:27.5
+  6:49:27.52
+      6:49:27
+    6:49:27.5
+   6:49:27.52
+  6:49:27.524
+       6:49:27
+     6:49:27.5
+    6:49:27.52
+   6:49:27.524
+  6:49:27.5238
+        6:49:27
+      6:49:27.5
+     6:49:27.52
+    6:49:27.524
+   6:49:27.5238
+  6:49:27.52375
+         6:49:27
+       6:49:27.5
+      6:49:27.52
+     6:49:27.524
+    6:49:27.5238
+   6:49:27.52375
+  6:49:27.523750
+  0 06:49
+   0 06:49
+ 0 06:49:27
+  0 06:49:27
+   0 06:49:27
+    0 06:49:27
+  0 06:49:27.5
+     0 06:49:27
+   0 06:49:27.5
+  0 06:49:27.52
+      0 06:49:27
+    0 06:49:27.5
+   0 06:49:27.52
+  0 06:49:27.524
+       0 06:49:27
+     0 06:49:27.5
+    0 06:49:27.52
+   0 06:49:27.524
+  0 06:49:27.5238
+        0 06:49:27
+      0 06:49:27.5
+     0 06:49:27.52
+    0 06:49:27.524
+   0 06:49:27.5238
+  0 06:49:27.52375
+         0 06:49:27
+       0 06:49:27.5
+      0 06:49:27.52
+     0 06:49:27.524
+    0 06:49:27.5238
+   0 06:49:27.52375
+  0 06:49:27.523750
+  2:57
+   2:57
+ 2:57:52
+  2:57:52
+   2:57:52
+    2:57:52
+  2:57:52.0
+     2:57:52
+   2:57:52.0
+  2:57:52.02
+      2:57:52
+    2:57:52.0
+   2:57:52.02
+  2:57:52.016
+       2:57:52
+     2:57:52.0
+    2:57:52.02
+   2:57:52.016
+  2:57:52.0156
+        2:57:52
+      2:57:52.0
+     2:57:52.02
+    2:57:52.016
+   2:57:52.0156
+  2:57:52.01565
+         2:57:52
+       2:57:52.0
+      2:57:52.02
+     2:57:52.016
+    2:57:52.0156
+   2:57:52.01565
+  2:57:52.015650
+  0 02:57
+   0 02:57
+ 0 02:57:52
+  0 02:57:52
+   0 02:57:52
+    0 02:57:52
+  0 02:57:52.0
+     0 02:57:52
+   0 02:57:52.0
+  0 02:57:52.02
+      0 02:57:52
+    0 02:57:52.0
+   0 02:57:52.02
+  0 02:57:52.016
+       0 02:57:52
+     0 02:57:52.0
+    0 02:57:52.02
+   0 02:57:52.016
+  0 02:57:52.0156
+        0 02:57:52
+      0 02:57:52.0
+     0 02:57:52.02
+    0 02:57:52.016
+   0 02:57:52.0156
+  0 02:57:52.01565
+         0 02:57:52
+       0 02:57:52.0
+      0 02:57:52.02
+     0 02:57:52.016
+    0 02:57:52.0156
+   0 02:57:52.01565
+  0 02:57:52.015650
+ 16:45
+  16:45
+   16:45
+ 16:45:44
+  16:45:44
+   16:45:44
+ 16:45:44.9
+    16:45:44
+  16:45:44.9
+ 16:45:44.87
+     16:45:44
+   16:45:44.9
+  16:45:44.87
+ 16:45:44.865
+      16:45:44
+    16:45:44.9
+   16:45:44.87
+  16:45:44.865
+ 16:45:44.8653
+       16:45:44
+     16:45:44.9
+    16:45:44.87
+   16:45:44.865
+  16:45:44.8653
+ 16:45:44.86529
+        16:45:44
+      16:45:44.9
+     16:45:44.87
+    16:45:44.865
+   16:45:44.8653
+  16:45:44.86529
+ 16:45:44.865290
+  0 16:45
+   0 16:45
+ 0 16:45:44
+  0 16:45:44
+   0 16:45:44
+    0 16:45:44
+  0 16:45:44.9
+     0 16:45:44
+   0 16:45:44.9
+  0 16:45:44.87
+      0 16:45:44
+    0 16:45:44.9
+   0 16:45:44.87
+  0 16:45:44.865
+       0 16:45:44
+     0 16:45:44.9
+    0 16:45:44.87
+   0 16:45:44.865
+  0 16:45:44.8653
+        0 16:45:44
+      0 16:45:44.9
+     0 16:45:44.87
+    0 16:45:44.865
+   0 16:45:44.8653
+  0 16:45:44.86529
+         0 16:45:44
+       0 16:45:44.9
+      0 16:45:44.87
+     0 16:45:44.865
+    0 16:45:44.8653
+   0 16:45:44.86529
+  0 16:45:44.865290
+ 21:30
+  21:30
+   21:30
+ 21:30:57
+  21:30:57
+   21:30:57
+ 21:30:57.8
+    21:30:57
+  21:30:57.8
+ 21:30:57.82
+     21:30:57
+   21:30:57.8
+  21:30:57.82
+ 21:30:57.820
+      21:30:57
+    21:30:57.8
+   21:30:57.82
+  21:30:57.820
+ 21:30:57.8205
+       21:30:57
+     21:30:57.8
+    21:30:57.82
+   21:30:57.820
+  21:30:57.8205
+ 21:30:57.82047
+        21:30:57
+      21:30:57.8
+     21:30:57.82
+    21:30:57.820
+   21:30:57.8205
+  21:30:57.82047
+ 21:30:57.820470
+  0 21:30
+   0 21:30
+ 0 21:30:57
+  0 21:30:57
+   0 21:30:57
+    0 21:30:57
+  0 21:30:57.8
+     0 21:30:57
+   0 21:30:57.8
+  0 21:30:57.82
+      0 21:30:57
+    0 21:30:57.8
+   0 21:30:57.82
+  0 21:30:57.820
+       0 21:30:57
+     0 21:30:57.8
+    0 21:30:57.82
+   0 21:30:57.820
+  0 21:30:57.8205
+        0 21:30:57
+      0 21:30:57.8
+     0 21:30:57.82
+    0 21:30:57.820
+   0 21:30:57.8205
+  0 21:30:57.82047
+         0 21:30:57
+       0 21:30:57.8
+      0 21:30:57.82
+     0 21:30:57.820
+    0 21:30:57.8205
+   0 21:30:57.82047
+  0 21:30:57.820470
+  4:25
+   4:25
+ 4:25:09
+  4:25:09
+   4:25:09
+    4:25:09
+  4:25:09.2
+     4:25:09
+   4:25:09.2
+  4:25:09.15
+      4:25:09
+    4:25:09.2
+   4:25:09.15
+  4:25:09.154
+       4:25:09
+     4:25:09.2
+    4:25:09.15
+   4:25:09.154
+  4:25:09.1539
+        4:25:09
+      4:25:09.2
+     4:25:09.15
+    4:25:09.154
+   4:25:09.1539
+  4:25:09.15395
+         4:25:09
+       4:25:09.2
+      4:25:09.15
+     4:25:09.154
+    4:25:09.1539
+   4:25:09.15395
+  4:25:09.153950
+  0 04:25
+   0 04:25
+ 0 04:25:09
+  0 04:25:09
+   0 04:25:09
+    0 04:25:09
+  0 04:25:09.2
+     0 04:25:09
+   0 04:25:09.2
+  0 04:25:09.15
+      0 04:25:09
+    0 04:25:09.2
+   0 04:25:09.15
+  0 04:25:09.154
+       0 04:25:09
+     0 04:25:09.2
+    0 04:25:09.15
+   0 04:25:09.154
+  0 04:25:09.1539
+        0 04:25:09
+      0 04:25:09.2
+     0 04:25:09.15
+    0 04:25:09.154
+   0 04:25:09.1539
+  0 04:25:09.15395
+         0 04:25:09
+       0 04:25:09.2
+      0 04:25:09.15
+     0 04:25:09.154
+    0 04:25:09.1539
+   0 04:25:09.15395
+  0 04:25:09.153950
+  6:49
+   6:49
+ 6:49:27
+  6:49:27
+   6:49:27
+    6:49:27
+  6:49:27.1
+     6:49:27
+   6:49:27.1
+  6:49:27.11
+      6:49:27
+    6:49:27.1
+   6:49:27.11
+  6:49:27.105
+       6:49:27
+     6:49:27.1
+    6:49:27.11
+   6:49:27.105
+  6:49:27.1053
+        6:49:27
+      6:49:27.1
+     6:49:27.11
+    6:49:27.105
+   6:49:27.1053
+  6:49:27.10533
+         6:49:27
+       6:49:27.1
+      6:49:27.11
+     6:49:27.105
+    6:49:27.1053
+   6:49:27.10533
+  6:49:27.105330
+  0 06:49
+   0 06:49
+ 0 06:49:27
+  0 06:49:27
+   0 06:49:27
+    0 06:49:27
+  0 06:49:27.1
+     0 06:49:27
+   0 06:49:27.1
+  0 06:49:27.11
+      0 06:49:27
+    0 06:49:27.1
+   0 06:49:27.11
+  0 06:49:27.105
+       0 06:49:27
+     0 06:49:27.1
+    0 06:49:27.11
+   0 06:49:27.105
+  0 06:49:27.1053
+        0 06:49:27
+      0 06:49:27.1
+     0 06:49:27.11
+    0 06:49:27.105
+   0 06:49:27.1053
+  0 06:49:27.10533
+         0 06:49:27
+       0 06:49:27.1
+      0 06:49:27.11
+     0 06:49:27.105
+    0 06:49:27.1053
+   0 06:49:27.10533
+  0 06:49:27.105330
+  2:57
+   2:57
+ 2:57:52
+  2:57:52
+   2:57:52
+    2:57:52
+  2:57:52.5
+     2:57:52
+   2:57:52.5
+  2:57:52.48
+      2:57:52
+    2:57:52.5
+   2:57:52.48
+  2:57:52.482
+       2:57:52
+     2:57:52.5
+    2:57:52.48
+   2:57:52.482
+  2:57:52.4823
+        2:57:52
+      2:57:52.5
+     2:57:52.48
+    2:57:52.482
+   2:57:52.4823
+  2:57:52.48229
+         2:57:52
+       2:57:52.5
+      2:57:52.48
+     2:57:52.482
+    2:57:52.4823
+   2:57:52.48229
+  2:57:52.482290
+  0 02:57
+   0 02:57
+ 0 02:57:52
+  0 02:57:52
+   0 02:57:52
+    0 02:57:52
+  0 02:57:52.5
+     0 02:57:52
+   0 02:57:52.5
+  0 02:57:52.48
+      0 02:57:52
+    0 02:57:52.5
+   0 02:57:52.48
+  0 02:57:52.482
+       0 02:57:52
+     0 02:57:52.5
+    0 02:57:52.48
+   0 02:57:52.482
+  0 02:57:52.4823
+        0 02:57:52
+      0 02:57:52.5
+     0 02:57:52.48
+    0 02:57:52.482
+   0 02:57:52.4823
+  0 02:57:52.48229
+         0 02:57:52
+       0 02:57:52.5
+      0 02:57:52.48
+     0 02:57:52.482
+    0 02:57:52.4823
+   0 02:57:52.48229
+  0 02:57:52.482290
+ 16:45
+  16:45
+   16:45
+ 16:45:44
+  16:45:44
+   16:45:44
+ 16:45:44.7
+    16:45:44
+  16:45:44.7
+ 16:45:44.66
+     16:45:44
+   16:45:44.7
+  16:45:44.66
+ 16:45:44.658
+      16:45:44
+    16:45:44.7
+   16:45:44.66
+  16:45:44.658
+ 16:45:44.6583
+       16:45:44
+     16:45:44.7
+    16:45:44.66
+   16:45:44.658
+  16:45:44.6583
+ 16:45:44.65827
+        16:45:44
+      16:45:44.7
+     16:45:44.66
+    16:45:44.658
+   16:45:44.6583
+  16:45:44.65827
+ 16:45:44.658270
+  0 16:45
+   0 16:45
+ 0 16:45:44
+  0 16:45:44
+   0 16:45:44
+    0 16:45:44
+  0 16:45:44.7
+     0 16:45:44
+   0 16:45:44.7
+  0 16:45:44.66
+      0 16:45:44
+    0 16:45:44.7
+   0 16:45:44.66
+  0 16:45:44.658
+       0 16:45:44
+     0 16:45:44.7
+    0 16:45:44.66
+   0 16:45:44.658
+  0 16:45:44.6583
+        0 16:45:44
+      0 16:45:44.7
+     0 16:45:44.66
+    0 16:45:44.658
+   0 16:45:44.6583
+  0 16:45:44.65827
+         0 16:45:44
+       0 16:45:44.7
+      0 16:45:44.66
+     0 16:45:44.658
+    0 16:45:44.6583
+   0 16:45:44.65827
+  0 16:45:44.658270
+ 21:30
+  21:30
+   21:30
+ 21:30:57
+  21:30:57
+   21:30:57
+ 21:30:57.6
+    21:30:57
+  21:30:57.6
+ 21:30:57.58
+     21:30:57
+   21:30:57.6
+  21:30:57.58
+ 21:30:57.582
+      21:30:57
+    21:30:57.6
+   21:30:57.58
+  21:30:57.582
+ 21:30:57.5822
+       21:30:57
+     21:30:57.6
+    21:30:57.58
+   21:30:57.582
+  21:30:57.5822
+ 21:30:57.58219
+        21:30:57
+      21:30:57.6
+     21:30:57.58
+    21:30:57.582
+   21:30:57.5822
+  21:30:57.58219
+ 21:30:57.582190
+  0 21:30
+   0 21:30
+ 0 21:30:57
+  0 21:30:57
+   0 21:30:57
+    0 21:30:57
+  0 21:30:57.6
+     0 21:30:57
+   0 21:30:57.6
+  0 21:30:57.58
+      0 21:30:57
+    0 21:30:57.6
+   0 21:30:57.58
+  0 21:30:57.582
+       0 21:30:57
+     0 21:30:57.6
+    0 21:30:57.58
+   0 21:30:57.582
+  0 21:30:57.5822
+        0 21:30:57
+      0 21:30:57.6
+     0 21:30:57.58
+    0 21:30:57.582
+   0 21:30:57.5822
+  0 21:30:57.58219
+         0 21:30:57
+       0 21:30:57.6
+      0 21:30:57.58
+     0 21:30:57.582
+    0 21:30:57.5822
+   0 21:30:57.58219
+  0 21:30:57.582190
+ 22:30
+  22:30
+   22:30
+ 22:30:04
+  22:30:04
+   22:30:04
+ 22:30:04.2
+    22:30:04
+  22:30:04.2
+ 22:30:04.18
+     22:30:04
+   22:30:04.2
+  22:30:04.18
+ 22:30:04.183
+      22:30:04
+    22:30:04.2
+   22:30:04.18
+  22:30:04.183
+ 22:30:04.1835
+       22:30:04
+     22:30:04.2
+    22:30:04.18
+   22:30:04.183
+  22:30:04.1835
+ 22:30:04.18347
+        22:30:04
+      22:30:04.2
+     22:30:04.18
+    22:30:04.183
+   22:30:04.1835
+  22:30:04.18347
+ 22:30:04.183470
+  0 22:30
+   0 22:30
+ 0 22:30:04
+  0 22:30:04
+   0 22:30:04
+    0 22:30:04
+  0 22:30:04.2
+     0 22:30:04
+   0 22:30:04.2
+  0 22:30:04.18
+      0 22:30:04
+    0 22:30:04.2
+   0 22:30:04.18
+  0 22:30:04.183
+       0 22:30:04
+     0 22:30:04.2
+    0 22:30:04.18
+   0 22:30:04.183
+  0 22:30:04.1835
+        0 22:30:04
+      0 22:30:04.2
+     0 22:30:04.18
+    0 22:30:04.183
+   0 22:30:04.1835
+  0 22:30:04.18347
+         0 22:30:04
+       0 22:30:04.2
+      0 22:30:04.18
+     0 22:30:04.183
+    0 22:30:04.1835
+   0 22:30:04.18347
+  0 22:30:04.183470
+  1:56
+   1:56
+ 1:56:51
+  1:56:51
+   1:56:51
+    1:56:51
+  1:56:51.6
+     1:56:51
+   1:56:51.6
+  1:56:51.59
+      1:56:51
+    1:56:51.6
+   1:56:51.59
+  1:56:51.593
+       1:56:51
+     1:56:51.6
+    1:56:51.59
+   1:56:51.593
+  1:56:51.5932
+        1:56:51
+      1:56:51.6
+     1:56:51.59
+    1:56:51.593
+   1:56:51.5932
+  1:56:51.59319
+         1:56:51
+       1:56:51.6
+      1:56:51.59
+     1:56:51.593
+    1:56:51.5932
+   1:56:51.59319
+  1:56:51.593190
+  0 01:56
+   0 01:56
+ 0 01:56:51
+  0 01:56:51
+   0 01:56:51
+    0 01:56:51
+  0 01:56:51.6
+     0 01:56:51
+   0 01:56:51.6
+  0 01:56:51.59
+      0 01:56:51
+    0 01:56:51.6
+   0 01:56:51.59
+  0 01:56:51.593
+       0 01:56:51
+     0 01:56:51.6
+    0 01:56:51.59
+   0 01:56:51.593
+  0 01:56:51.5932
+        0 01:56:51
+      0 01:56:51.6
+     0 01:56:51.59
+    0 01:56:51.593
+   0 01:56:51.5932
+  0 01:56:51.59319
+         0 01:56:51
+       0 01:56:51.6
+      0 01:56:51.59
+     0 01:56:51.593
+    0 01:56:51.5932
+   0 01:56:51.59319
+  0 01:56:51.593190
+ 24:00
+  24:00
+   24:00
+ 24:00:00
+  24:00:00
+   24:00:00
+ 24:00:00.0
+    24:00:00
+  24:00:00.0
+ 24:00:00.00
+     24:00:00
+   24:00:00.0
+  24:00:00.00
+ 24:00:00.000
+      24:00:00
+    24:00:00.0
+   24:00:00.00
+  24:00:00.000
+ 24:00:00.0000
+       24:00:00
+     24:00:00.0
+    24:00:00.00
+   24:00:00.000
+  24:00:00.0000
+ 24:00:00.00000
+        24:00:00
+      24:00:00.0
+     24:00:00.00
+    24:00:00.000
+   24:00:00.0000
+  24:00:00.00000
+ 24:00:00.000000
+  1 00:00
+   1 00:00
+ 1 00:00:00
+  1 00:00:00
+   1 00:00:00
+    1 00:00:00
+  1 00:00:00.0
+     1 00:00:00
+   1 00:00:00.0
+  1 00:00:00.00
+      1 00:00:00
+    1 00:00:00.0
+   1 00:00:00.00
+  1 00:00:00.000
+       1 00:00:00
+     1 00:00:00.0
+    1 00:00:00.00
+   1 00:00:00.000
+  1 00:00:00.0000
+        1 00:00:00
+      1 00:00:00.0
+     1 00:00:00.00
+    1 00:00:00.000
+   1 00:00:00.0000
+  1 00:00:00.00000
+         1 00:00:00
+       1 00:00:00.0
+      1 00:00:00.00
+     1 00:00:00.000
+    1 00:00:00.0000
+   1 00:00:00.00000
+  1 00:00:00.000000
+ 28:50
+  28:50
+   28:50
+ 28:50:38
+  28:50:38
+   28:50:38
+ 28:50:38.1
+    28:50:38
+  28:50:38.1
+ 28:50:38.12
+     28:50:38
+   28:50:38.1
+  28:50:38.12
+ 28:50:38.123
+      28:50:38
+    28:50:38.1
+   28:50:38.12
+  28:50:38.123
+ 28:50:38.1230
+       28:50:38
+     28:50:38.1
+    28:50:38.12
+   28:50:38.123
+  28:50:38.1230
+ 28:50:38.12301
+        28:50:38
+      28:50:38.1
+     28:50:38.12
+    28:50:38.123
+   28:50:38.1230
+  28:50:38.12301
+ 28:50:38.123010
+  1 04:50
+   1 04:50
+ 1 04:50:38
+  1 04:50:38
+   1 04:50:38
+    1 04:50:38
+  1 04:50:38.1
+     1 04:50:38
+   1 04:50:38.1
+  1 04:50:38.12
+      1 04:50:38
+    1 04:50:38.1
+   1 04:50:38.12
+  1 04:50:38.123
+       1 04:50:38
+     1 04:50:38.1
+    1 04:50:38.12
+   1 04:50:38.123
+  1 04:50:38.1230
+        1 04:50:38
+      1 04:50:38.1
+     1 04:50:38.12
+    1 04:50:38.123
+   1 04:50:38.1230
+  1 04:50:38.12301
+         1 04:50:38
+       1 04:50:38.1
+      1 04:50:38.12
+     1 04:50:38.123
+    1 04:50:38.1230
+   1 04:50:38.12301
+  1 04:50:38.123010
+ 36:31
+  36:31
+   36:31
+ 36:31:35
+  36:31:35
+   36:31:35
+ 36:31:35.2
+    36:31:35
+  36:31:35.2
+ 36:31:35.23
+     36:31:35
+   36:31:35.2
+  36:31:35.23
+ 36:31:35.235
+      36:31:35
+    36:31:35.2
+   36:31:35.23
+  36:31:35.235
+ 36:31:35.2345
+       36:31:35
+     36:31:35.2
+    36:31:35.23
+   36:31:35.235
+  36:31:35.2345
+ 36:31:35.23453
+        36:31:35
+      36:31:35.2
+     36:31:35.23
+    36:31:35.235
+   36:31:35.2345
+  36:31:35.23453
+ 36:31:35.234530
+  1 12:31
+   1 12:31
+ 1 12:31:35
+  1 12:31:35
+   1 12:31:35
+    1 12:31:35
+  1 12:31:35.2
+     1 12:31:35
+   1 12:31:35.2
+  1 12:31:35.23
+      1 12:31:35
+    1 12:31:35.2
+   1 12:31:35.23
+  1 12:31:35.235
+       1 12:31:35
+     1 12:31:35.2
+    1 12:31:35.23
+   1 12:31:35.235
+  1 12:31:35.2345
+        1 12:31:35
+      1 12:31:35.2
+     1 12:31:35.23
+    1 12:31:35.235
+   1 12:31:35.2345
+  1 12:31:35.23453
+         1 12:31:35
+       1 12:31:35.2
+      1 12:31:35.23
+     1 12:31:35.235
+    1 12:31:35.2345
+   1 12:31:35.23453
+  1 12:31:35.234530
+ 36:47
+  36:47
+   36:47
+ 36:47:53
+  36:47:53
+   36:47:53
+ 36:47:53.3
+    36:47:53
+  36:47:53.3
+ 36:47:53.35
+     36:47:53
+   36:47:53.3
+  36:47:53.35
+ 36:47:53.345
+      36:47:53
+    36:47:53.3
+   36:47:53.35
+  36:47:53.345
+ 36:47:53.3451
+       36:47:53
+     36:47:53.3
+    36:47:53.35
+   36:47:53.345
+  36:47:53.3451
+ 36:47:53.34505
+        36:47:53
+      36:47:53.3
+     36:47:53.35
+    36:47:53.345
+   36:47:53.3451
+  36:47:53.34505
+ 36:47:53.345050
+  1 12:47
+   1 12:47
+ 1 12:47:53
+  1 12:47:53
+   1 12:47:53
+    1 12:47:53
+  1 12:47:53.3
+     1 12:47:53
+   1 12:47:53.3
+  1 12:47:53.35
+      1 12:47:53
+    1 12:47:53.3
+   1 12:47:53.35
+  1 12:47:53.345
+       1 12:47:53
+     1 12:47:53.3
+    1 12:47:53.35
+   1 12:47:53.345
+  1 12:47:53.3451
+        1 12:47:53
+      1 12:47:53.3
+     1 12:47:53.35
+    1 12:47:53.345
+   1 12:47:53.3451
+  1 12:47:53.34505
+         1 12:47:53
+       1 12:47:53.3
+      1 12:47:53.35
+     1 12:47:53.345
+    1 12:47:53.3451
+   1 12:47:53.34505
+  1 12:47:53.345050
+ 25:26
+  25:26
+   25:26
+ 25:26:00
+  25:26:00
+   25:26:00
+ 25:26:00.5
+    25:26:00
+  25:26:00.5
+ 25:26:00.46
+     25:26:00
+   25:26:00.5
+  25:26:00.46
+ 25:26:00.456
+      25:26:00
+    25:26:00.5
+   25:26:00.46
+  25:26:00.456
+ 25:26:00.4561
+       25:26:00
+     25:26:00.5
+    25:26:00.46
+   25:26:00.456
+  25:26:00.4561
+ 25:26:00.45615
+        25:26:00
+      25:26:00.5
+     25:26:00.46
+    25:26:00.456
+   25:26:00.4561
+  25:26:00.45615
+ 25:26:00.456150
+  1 01:26
+   1 01:26
+ 1 01:26:00
+  1 01:26:00
+   1 01:26:00
+    1 01:26:00
+  1 01:26:00.5
+     1 01:26:00
+   1 01:26:00.5
+  1 01:26:00.46
+      1 01:26:00
+    1 01:26:00.5
+   1 01:26:00.46
+  1 01:26:00.456
+       1 01:26:00
+     1 01:26:00.5
+    1 01:26:00.46
+   1 01:26:00.456
+  1 01:26:00.4561
+        1 01:26:00
+      1 01:26:00.5
+     1 01:26:00.46
+    1 01:26:00.456
+   1 01:26:00.4561
+  1 01:26:00.45615
+         1 01:26:00
+       1 01:26:00.5
+      1 01:26:00.46
+     1 01:26:00.456
+    1 01:26:00.4561
+   1 01:26:00.45615
+  1 01:26:00.456150
+ 44:58
+  44:58
+   44:58
+ 44:58:11
+  44:58:11
+   44:58:11
+ 44:58:11.6
+    44:58:11
+  44:58:11.6
+ 44:58:11.57
+     44:58:11
+   44:58:11.6
+  44:58:11.57
+ 44:58:11.567
+      44:58:11
+    44:58:11.6
+   44:58:11.57
+  44:58:11.567
+ 44:58:11.5668
+       44:58:11
+     44:58:11.6
+    44:58:11.57
+   44:58:11.567
+  44:58:11.5668
+ 44:58:11.56677
+        44:58:11
+      44:58:11.6
+     44:58:11.57
+    44:58:11.567
+   44:58:11.5668
+  44:58:11.56677
+ 44:58:11.566770
+  1 20:58
+   1 20:58
+ 1 20:58:11
+  1 20:58:11
+   1 20:58:11
+    1 20:58:11
+  1 20:58:11.6
+     1 20:58:11
+   1 20:58:11.6
+  1 20:58:11.57
+      1 20:58:11
+    1 20:58:11.6
+   1 20:58:11.57
+  1 20:58:11.567
+       1 20:58:11
+     1 20:58:11.6
+    1 20:58:11.57
+   1 20:58:11.567
+  1 20:58:11.5668
+        1 20:58:11
+      1 20:58:11.6
+     1 20:58:11.57
+    1 20:58:11.567
+   1 20:58:11.5668
+  1 20:58:11.56677
+         1 20:58:11
+       1 20:58:11.6
+      1 20:58:11.57
+     1 20:58:11.567
+    1 20:58:11.5668
+   1 20:58:11.56677
+  1 20:58:11.566770
+ 31:36
+  31:36
+   31:36
+ 31:36:05
+  31:36:05
+   31:36:05
+ 31:36:05.2
+    31:36:05
+  31:36:05.2
+ 31:36:05.19
+     31:36:05
+   31:36:05.2
+  31:36:05.19
+ 31:36:05.190
+      31:36:05
+    31:36:05.2
+   31:36:05.19
+  31:36:05.190
+ 31:36:05.1896
+       31:36:05
+     31:36:05.2
+    31:36:05.19
+   31:36:05.190
+  31:36:05.1896
+ 31:36:05.18964
+        31:36:05
+      31:36:05.2
+     31:36:05.19
+    31:36:05.190
+   31:36:05.1896
+  31:36:05.18964
+ 31:36:05.189640
+  1 07:36
+   1 07:36
+ 1 07:36:05
+  1 07:36:05
+   1 07:36:05
+    1 07:36:05
+  1 07:36:05.2
+     1 07:36:05
+   1 07:36:05.2
+  1 07:36:05.19
+      1 07:36:05
+    1 07:36:05.2
+   1 07:36:05.19
+  1 07:36:05.190
+       1 07:36:05
+     1 07:36:05.2
+    1 07:36:05.19
+   1 07:36:05.190
+  1 07:36:05.1896
+        1 07:36:05
+      1 07:36:05.2
+     1 07:36:05.19
+    1 07:36:05.190
+   1 07:36:05.1896
+  1 07:36:05.18964
+         1 07:36:05
+       1 07:36:05.2
+      1 07:36:05.19
+     1 07:36:05.190
+    1 07:36:05.1896
+   1 07:36:05.18964
+  1 07:36:05.189640
+ 39:43
+  39:43
+   39:43
+ 39:43:49
+  39:43:49
+   39:43:49
+ 39:43:49.8
+    39:43:49
+  39:43:49.8
+ 39:43:49.83
+     39:43:49
+   39:43:49.8
+  39:43:49.83
+ 39:43:49.831
+      39:43:49
+    39:43:49.8
+   39:43:49.83
+  39:43:49.831
+ 39:43:49.8313
+       39:43:49
+     39:43:49.8
+    39:43:49.83
+   39:43:49.831
+  39:43:49.8313
+ 39:43:49.83132
+        39:43:49
+      39:43:49.8
+     39:43:49.83
+    39:43:49.831
+   39:43:49.8313
+  39:43:49.83132
+ 39:43:49.831320
+  1 15:43
+   1 15:43
+ 1 15:43:49
+  1 15:43:49
+   1 15:43:49
+    1 15:43:49
+  1 15:43:49.8
+     1 15:43:49
+   1 15:43:49.8
+  1 15:43:49.83
+      1 15:43:49
+    1 15:43:49.8
+   1 15:43:49.83
+  1 15:43:49.831
+       1 15:43:49
+     1 15:43:49.8
+    1 15:43:49.83
+   1 15:43:49.831
+  1 15:43:49.8313
+        1 15:43:49
+      1 15:43:49.8
+     1 15:43:49.83
+    1 15:43:49.831
+   1 15:43:49.8313
+  1 15:43:49.83132
+         1 15:43:49
+       1 15:43:49.8
+      1 15:43:49.83
+     1 15:43:49.831
+    1 15:43:49.8313
+   1 15:43:49.83132
+  1 15:43:49.831320
+ 28:25
+  28:25
+   28:25
+ 28:25:09
+  28:25:09
+   28:25:09
+ 28:25:09.0
+    28:25:09
+  28:25:09.0
+ 28:25:09.01
+     28:25:09
+   28:25:09.0
+  28:25:09.01
+ 28:25:09.013
+      28:25:09
+    28:25:09.0
+   28:25:09.01
+  28:25:09.013
+ 28:25:09.0129
+       28:25:09
+     28:25:09.0
+    28:25:09.01
+   28:25:09.013
+  28:25:09.0129
+ 28:25:09.01293
+        28:25:09
+      28:25:09.0
+     28:25:09.01
+    28:25:09.013
+   28:25:09.0129
+  28:25:09.01293
+ 28:25:09.012930
+  1 04:25
+   1 04:25
+ 1 04:25:09
+  1 04:25:09
+   1 04:25:09
+    1 04:25:09
+  1 04:25:09.0
+     1 04:25:09
+   1 04:25:09.0
+  1 04:25:09.01
+      1 04:25:09
+    1 04:25:09.0
+   1 04:25:09.01
+  1 04:25:09.013
+       1 04:25:09
+     1 04:25:09.0
+    1 04:25:09.01
+   1 04:25:09.013
+  1 04:25:09.0129
+        1 04:25:09
+      1 04:25:09.0
+     1 04:25:09.01
+    1 04:25:09.013
+   1 04:25:09.0129
+  1 04:25:09.01293
+         1 04:25:09
+       1 04:25:09.0
+      1 04:25:09.01
+     1 04:25:09.013
+    1 04:25:09.0129
+   1 04:25:09.01293
+  1 04:25:09.012930
+ 30:49
+  30:49
+   30:49
+ 30:49:27
+  30:49:27
+   30:49:27
+ 30:49:27.5
+    30:49:27
+  30:49:27.5
+ 30:49:27.52
+     30:49:27
+   30:49:27.5
+  30:49:27.52
+ 30:49:27.524
+      30:49:27
+    30:49:27.5
+   30:49:27.52
+  30:49:27.524
+ 30:49:27.5237
+       30:49:27
+     30:49:27.5
+    30:49:27.52
+   30:49:27.524
+  30:49:27.5237
+ 30:49:27.52375
+        30:49:27
+      30:49:27.5
+     30:49:27.52
+    30:49:27.524
+   30:49:27.5237
+  30:49:27.52375
+ 30:49:27.523750
+  1 06:49
+   1 06:49
+ 1 06:49:27
+  1 06:49:27
+   1 06:49:27
+    1 06:49:27
+  1 06:49:27.5
+     1 06:49:27
+   1 06:49:27.5
+  1 06:49:27.52
+      1 06:49:27
+    1 06:49:27.5
+   1 06:49:27.52
+  1 06:49:27.524
+       1 06:49:27
+     1 06:49:27.5
+    1 06:49:27.52
+   1 06:49:27.524
+  1 06:49:27.5237
+        1 06:49:27
+      1 06:49:27.5
+     1 06:49:27.52
+    1 06:49:27.524
+   1 06:49:27.5237
+  1 06:49:27.52375
+         1 06:49:27
+       1 06:49:27.5
+      1 06:49:27.52
+     1 06:49:27.524
+    1 06:49:27.5237
+   1 06:49:27.52375
+  1 06:49:27.523750
+ 26:57
+  26:57
+   26:57
+ 26:57:52
+  26:57:52
+   26:57:52
+ 26:57:52.0
+    26:57:52
+  26:57:52.0
+ 26:57:52.02
+     26:57:52
+   26:57:52.0
+  26:57:52.02
+ 26:57:52.016
+      26:57:52
+    26:57:52.0
+   26:57:52.02
+  26:57:52.016
+ 26:57:52.0157
+       26:57:52
+     26:57:52.0
+    26:57:52.02
+   26:57:52.016
+  26:57:52.0157
+ 26:57:52.01565
+        26:57:52
+      26:57:52.0
+     26:57:52.02
+    26:57:52.016
+   26:57:52.0157
+  26:57:52.01565
+ 26:57:52.015650
+  1 02:57
+   1 02:57
+ 1 02:57:52
+  1 02:57:52
+   1 02:57:52
+    1 02:57:52
+  1 02:57:52.0
+     1 02:57:52
+   1 02:57:52.0
+  1 02:57:52.02
+      1 02:57:52
+    1 02:57:52.0
+   1 02:57:52.02
+  1 02:57:52.016
+       1 02:57:52
+     1 02:57:52.0
+    1 02:57:52.02
+   1 02:57:52.016
+  1 02:57:52.0157
+        1 02:57:52
+      1 02:57:52.0
+     1 02:57:52.02
+    1 02:57:52.016
+   1 02:57:52.0157
+  1 02:57:52.01565
+         1 02:57:52
+       1 02:57:52.0
+      1 02:57:52.02
+     1 02:57:52.016
+    1 02:57:52.0157
+   1 02:57:52.01565
+  1 02:57:52.015650
+ 40:45
+  40:45
+   40:45
+ 40:45:44
+  40:45:44
+   40:45:44
+ 40:45:44.9
+    40:45:44
+  40:45:44.9
+ 40:45:44.87
+     40:45:44
+   40:45:44.9
+  40:45:44.87
+ 40:45:44.865
+      40:45:44
+    40:45:44.9
+   40:45:44.87
+  40:45:44.865
+ 40:45:44.8653
+       40:45:44
+     40:45:44.9
+    40:45:44.87
+   40:45:44.865
+  40:45:44.8653
+ 40:45:44.86529
+        40:45:44
+      40:45:44.9
+     40:45:44.87
+    40:45:44.865
+   40:45:44.8653
+  40:45:44.86529
+ 40:45:44.865290
+  1 16:45
+   1 16:45
+ 1 16:45:44
+  1 16:45:44
+   1 16:45:44
+    1 16:45:44
+  1 16:45:44.9
+     1 16:45:44
+   1 16:45:44.9
+  1 16:45:44.87
+      1 16:45:44
+    1 16:45:44.9
+   1 16:45:44.87
+  1 16:45:44.865
+       1 16:45:44
+     1 16:45:44.9
+    1 16:45:44.87
+   1 16:45:44.865
+  1 16:45:44.8653
+        1 16:45:44
+      1 16:45:44.9
+     1 16:45:44.87
+    1 16:45:44.865
+   1 16:45:44.8653
+  1 16:45:44.86529
+         1 16:45:44
+       1 16:45:44.9
+      1 16:45:44.87
+     1 16:45:44.865
+    1 16:45:44.8653
+   1 16:45:44.86529
+  1 16:45:44.865290
+ 45:30
+  45:30
+   45:30
+ 45:30:57
+  45:30:57
+   45:30:57
+ 45:30:57.8
+    45:30:57
+  45:30:57.8
+ 45:30:57.82
+     45:30:57
+   45:30:57.8
+  45:30:57.82
+ 45:30:57.820
+      45:30:57
+    45:30:57.8
+   45:30:57.82
+  45:30:57.820
+ 45:30:57.8205
+       45:30:57
+     45:30:57.8
+    45:30:57.82
+   45:30:57.820
+  45:30:57.8205
+ 45:30:57.82047
+        45:30:57
+      45:30:57.8
+     45:30:57.82
+    45:30:57.820
+   45:30:57.8205
+  45:30:57.82047
+ 45:30:57.820470
+  1 21:30
+   1 21:30
+ 1 21:30:57
+  1 21:30:57
+   1 21:30:57
+    1 21:30:57
+  1 21:30:57.8
+     1 21:30:57
+   1 21:30:57.8
+  1 21:30:57.82
+      1 21:30:57
+    1 21:30:57.8
+   1 21:30:57.82
+  1 21:30:57.820
+       1 21:30:57
+     1 21:30:57.8
+    1 21:30:57.82
+   1 21:30:57.820
+  1 21:30:57.8205
+        1 21:30:57
+      1 21:30:57.8
+     1 21:30:57.82
+    1 21:30:57.820
+   1 21:30:57.8205
+  1 21:30:57.82047
+         1 21:30:57
+       1 21:30:57.8
+      1 21:30:57.82
+     1 21:30:57.820
+    1 21:30:57.8205
+   1 21:30:57.82047
+  1 21:30:57.820470
+ 28:25
+  28:25
+   28:25
+ 28:25:09
+  28:25:09
+   28:25:09
+ 28:25:09.2
+    28:25:09
+  28:25:09.2
+ 28:25:09.15
+     28:25:09
+   28:25:09.2
+  28:25:09.15
+ 28:25:09.154
+      28:25:09
+    28:25:09.2
+   28:25:09.15
+  28:25:09.154
+ 28:25:09.1540
+       28:25:09
+     28:25:09.2
+    28:25:09.15
+   28:25:09.154
+  28:25:09.1540
+ 28:25:09.15395
+        28:25:09
+      28:25:09.2
+     28:25:09.15
+    28:25:09.154
+   28:25:09.1540
+  28:25:09.15395
+ 28:25:09.153950
+  1 04:25
+   1 04:25
+ 1 04:25:09
+  1 04:25:09
+   1 04:25:09
+    1 04:25:09
+  1 04:25:09.2
+     1 04:25:09
+   1 04:25:09.2
+  1 04:25:09.15
+      1 04:25:09
+    1 04:25:09.2
+   1 04:25:09.15
+  1 04:25:09.154
+       1 04:25:09
+     1 04:25:09.2
+    1 04:25:09.15
+   1 04:25:09.154
+  1 04:25:09.1540
+        1 04:25:09
+      1 04:25:09.2
+     1 04:25:09.15
+    1 04:25:09.154
+   1 04:25:09.1540
+  1 04:25:09.15395
+         1 04:25:09
+       1 04:25:09.2
+      1 04:25:09.15
+     1 04:25:09.154
+    1 04:25:09.1540
+   1 04:25:09.15395
+  1 04:25:09.153950
+ 30:49
+  30:49
+   30:49
+ 30:49:27
+  30:49:27
+   30:49:27
+ 30:49:27.1
+    30:49:27
+  30:49:27.1
+ 30:49:27.11
+     30:49:27
+   30:49:27.1
+  30:49:27.11
+ 30:49:27.105
+      30:49:27
+    30:49:27.1
+   30:49:27.11
+  30:49:27.105
+ 30:49:27.1053
+       30:49:27
+     30:49:27.1
+    30:49:27.11
+   30:49:27.105
+  30:49:27.1053
+ 30:49:27.10533
+        30:49:27
+      30:49:27.1
+     30:49:27.11
+    30:49:27.105
+   30:49:27.1053
+  30:49:27.10533
+ 30:49:27.105330
+  1 06:49
+   1 06:49
+ 1 06:49:27
+  1 06:49:27
+   1 06:49:27
+    1 06:49:27
+  1 06:49:27.1
+     1 06:49:27
+   1 06:49:27.1
+  1 06:49:27.11
+      1 06:49:27
+    1 06:49:27.1
+   1 06:49:27.11
+  1 06:49:27.105
+       1 06:49:27
+     1 06:49:27.1
+    1 06:49:27.11
+   1 06:49:27.105
+  1 06:49:27.1053
+        1 06:49:27
+      1 06:49:27.1
+     1 06:49:27.11
+    1 06:49:27.105
+   1 06:49:27.1053
+  1 06:49:27.10533
+         1 06:49:27
+       1 06:49:27.1
+      1 06:49:27.11
+     1 06:49:27.105
+    1 06:49:27.1053
+   1 06:49:27.10533
+  1 06:49:27.105330
+ 26:57
+  26:57
+   26:57
+ 26:57:52
+  26:57:52
+   26:57:52
+ 26:57:52.5
+    26:57:52
+  26:57:52.5
+ 26:57:52.48
+     26:57:52
+   26:57:52.5
+  26:57:52.48
+ 26:57:52.482
+      26:57:52
+    26:57:52.5
+   26:57:52.48
+  26:57:52.482
+ 26:57:52.4823
+       26:57:52
+     26:57:52.5
+    26:57:52.48
+   26:57:52.482
+  26:57:52.4823
+ 26:57:52.48229
+        26:57:52
+      26:57:52.5
+     26:57:52.48
+    26:57:52.482
+   26:57:52.4823
+  26:57:52.48229
+ 26:57:52.482290
+  1 02:57
+   1 02:57
+ 1 02:57:52
+  1 02:57:52
+   1 02:57:52
+    1 02:57:52
+  1 02:57:52.5
+     1 02:57:52
+   1 02:57:52.5
+  1 02:57:52.48
+      1 02:57:52
+    1 02:57:52.5
+   1 02:57:52.48
+  1 02:57:52.482
+       1 02:57:52
+     1 02:57:52.5
+    1 02:57:52.48
+   1 02:57:52.482
+  1 02:57:52.4823
+        1 02:57:52
+      1 02:57:52.5
+     1 02:57:52.48
+    1 02:57:52.482
+   1 02:57:52.4823
+  1 02:57:52.48229
+         1 02:57:52
+       1 02:57:52.5
+      1 02:57:52.48
+     1 02:57:52.482
+    1 02:57:52.4823
+   1 02:57:52.48229
+  1 02:57:52.482290
+ 40:45
+  40:45
+   40:45
+ 40:45:44
+  40:45:44
+   40:45:44
+ 40:45:44.7
+    40:45:44
+  40:45:44.7
+ 40:45:44.66
+     40:45:44
+   40:45:44.7
+  40:45:44.66
+ 40:45:44.658
+      40:45:44
+    40:45:44.7
+   40:45:44.66
+  40:45:44.658
+ 40:45:44.6583
+       40:45:44
+     40:45:44.7
+    40:45:44.66
+   40:45:44.658
+  40:45:44.6583
+ 40:45:44.65827
+        40:45:44
+      40:45:44.7
+     40:45:44.66
+    40:45:44.658
+   40:45:44.6583
+  40:45:44.65827
+ 40:45:44.658270
+  1 16:45
+   1 16:45
+ 1 16:45:44
+  1 16:45:44
+   1 16:45:44
+    1 16:45:44
+  1 16:45:44.7
+     1 16:45:44
+   1 16:45:44.7
+  1 16:45:44.66
+      1 16:45:44
+    1 16:45:44.7
+   1 16:45:44.66
+  1 16:45:44.658
+       1 16:45:44
+     1 16:45:44.7
+    1 16:45:44.66
+   1 16:45:44.658
+  1 16:45:44.6583
+        1 16:45:44
+      1 16:45:44.7
+     1 16:45:44.66
+    1 16:45:44.658
+   1 16:45:44.6583
+  1 16:45:44.65827
+         1 16:45:44
+       1 16:45:44.7
+      1 16:45:44.66
+     1 16:45:44.658
+    1 16:45:44.6583
+   1 16:45:44.65827
+  1 16:45:44.658270
+ 45:30
+  45:30
+   45:30
+ 45:30:57
+  45:30:57
+   45:30:57
+ 45:30:57.6
+    45:30:57
+  45:30:57.6
+ 45:30:57.58
+     45:30:57
+   45:30:57.6
+  45:30:57.58
+ 45:30:57.582
+      45:30:57
+    45:30:57.6
+   45:30:57.58
+  45:30:57.582
+ 45:30:57.5822
+       45:30:57
+     45:30:57.6
+    45:30:57.58
+   45:30:57.582
+  45:30:57.5822
+ 45:30:57.58219
+        45:30:57
+      45:30:57.6
+     45:30:57.58
+    45:30:57.582
+   45:30:57.5822
+  45:30:57.58219
+ 45:30:57.582190
+  1 21:30
+   1 21:30
+ 1 21:30:57
+  1 21:30:57
+   1 21:30:57
+    1 21:30:57
+  1 21:30:57.6
+     1 21:30:57
+   1 21:30:57.6
+  1 21:30:57.58
+      1 21:30:57
+    1 21:30:57.6
+   1 21:30:57.58
+  1 21:30:57.582
+       1 21:30:57
+     1 21:30:57.6
+    1 21:30:57.58
+   1 21:30:57.582
+  1 21:30:57.5822
+        1 21:30:57
+      1 21:30:57.6
+     1 21:30:57.58
+    1 21:30:57.582
+   1 21:30:57.5822
+  1 21:30:57.58219
+         1 21:30:57
+       1 21:30:57.6
+      1 21:30:57.58
+     1 21:30:57.582
+    1 21:30:57.5822
+   1 21:30:57.58219
+  1 21:30:57.582190
+ 46:30
+  46:30
+   46:30
+ 46:30:04
+  46:30:04
+   46:30:04
+ 46:30:04.2
+    46:30:04
+  46:30:04.2
+ 46:30:04.18
+     46:30:04
+   46:30:04.2
+  46:30:04.18
+ 46:30:04.183
+      46:30:04
+    46:30:04.2
+   46:30:04.18
+  46:30:04.183
+ 46:30:04.1835
+       46:30:04
+     46:30:04.2
+    46:30:04.18
+   46:30:04.183
+  46:30:04.1835
+ 46:30:04.18347
+        46:30:04
+      46:30:04.2
+     46:30:04.18
+    46:30:04.183
+   46:30:04.1835
+  46:30:04.18347
+ 46:30:04.183470
+  1 22:30
+   1 22:30
+ 1 22:30:04
+  1 22:30:04
+   1 22:30:04
+    1 22:30:04
+  1 22:30:04.2
+     1 22:30:04
+   1 22:30:04.2
+  1 22:30:04.18
+      1 22:30:04
+    1 22:30:04.2
+   1 22:30:04.18
+  1 22:30:04.183
+       1 22:30:04
+     1 22:30:04.2
+    1 22:30:04.18
+   1 22:30:04.183
+  1 22:30:04.1835
+        1 22:30:04
+      1 22:30:04.2
+     1 22:30:04.18
+    1 22:30:04.183
+   1 22:30:04.1835
+  1 22:30:04.18347
+         1 22:30:04
+       1 22:30:04.2
+      1 22:30:04.18
+     1 22:30:04.183
+    1 22:30:04.1835
+   1 22:30:04.18347
+  1 22:30:04.183470
+ 25:56
+  25:56
+   25:56
+ 25:56:51
+  25:56:51
+   25:56:51
+ 25:56:51.6
+    25:56:51
+  25:56:51.6
+ 25:56:51.59
+     25:56:51
+   25:56:51.6
+  25:56:51.59
+ 25:56:51.593
+      25:56:51
+    25:56:51.6
+   25:56:51.59
+  25:56:51.593
+ 25:56:51.5932
+       25:56:51
+     25:56:51.6
+    25:56:51.59
+   25:56:51.593
+  25:56:51.5932
+ 25:56:51.59319
+        25:56:51
+      25:56:51.6
+     25:56:51.59
+    25:56:51.593
+   25:56:51.5932
+  25:56:51.59319
+ 25:56:51.593190
+  1 01:56
+   1 01:56
+ 1 01:56:51
+  1 01:56:51
+   1 01:56:51
+    1 01:56:51
+  1 01:56:51.6
+     1 01:56:51
+   1 01:56:51.6
+  1 01:56:51.59
+      1 01:56:51
+    1 01:56:51.6
+   1 01:56:51.59
+  1 01:56:51.593
+       1 01:56:51
+     1 01:56:51.6
+    1 01:56:51.59
+   1 01:56:51.593
+  1 01:56:51.5932
+        1 01:56:51
+      1 01:56:51.6
+     1 01:56:51.59
+    1 01:56:51.593
+   1 01:56:51.5932
+  1 01:56:51.59319
+         1 01:56:51
+       1 01:56:51.6
+      1 01:56:51.59
+     1 01:56:51.593
+    1 01:56:51.5932
+   1 01:56:51.59319
+  1 01:56:51.593190
+ 48:00
+  48:00
+   48:00
+ 48:00:00
+  48:00:00
+   48:00:00
+ 48:00:00.0
+    48:00:00
+  48:00:00.0
+ 48:00:00.00
+     48:00:00
+   48:00:00.0
+  48:00:00.00
+ 48:00:00.000
+      48:00:00
+    48:00:00.0
+   48:00:00.00
+  48:00:00.000
+ 48:00:00.0000
+       48:00:00
+     48:00:00.0
+    48:00:00.00
+   48:00:00.000
+  48:00:00.0000
+ 48:00:00.00000
+        48:00:00
+      48:00:00.0
+     48:00:00.00
+    48:00:00.000
+   48:00:00.0000
+  48:00:00.00000
+ 48:00:00.000000
+  2 00:00
+   2 00:00
+ 2 00:00:00
+  2 00:00:00
+   2 00:00:00
+    2 00:00:00
+  2 00:00:00.0
+     2 00:00:00
+   2 00:00:00.0
+  2 00:00:00.00
+      2 00:00:00
+    2 00:00:00.0
+   2 00:00:00.00
+  2 00:00:00.000
+       2 00:00:00
+     2 00:00:00.0
+    2 00:00:00.00
+   2 00:00:00.000
+  2 00:00:00.0000
+        2 00:00:00
+      2 00:00:00.0
+     2 00:00:00.00
+    2 00:00:00.000
+   2 00:00:00.0000
+  2 00:00:00.00000
+         2 00:00:00
+       2 00:00:00.0
+      2 00:00:00.00
+     2 00:00:00.000
+    2 00:00:00.0000
+   2 00:00:00.00000
+  2 00:00:00.000000
+ 52:50
+  52:50
+   52:50
+ 52:50:38
+  52:50:38
+   52:50:38
+ 52:50:38.1
+    52:50:38
+  52:50:38.1
+ 52:50:38.12
+     52:50:38
+   52:50:38.1
+  52:50:38.12
+ 52:50:38.123
+      52:50:38
+    52:50:38.1
+   52:50:38.12
+  52:50:38.123
+ 52:50:38.1230
+       52:50:38
+     52:50:38.1
+    52:50:38.12
+   52:50:38.123
+  52:50:38.1230
+ 52:50:38.12301
+        52:50:38
+      52:50:38.1
+     52:50:38.12
+    52:50:38.123
+   52:50:38.1230
+  52:50:38.12301
+ 52:50:38.123010
+  2 04:50
+   2 04:50
+ 2 04:50:38
+  2 04:50:38
+   2 04:50:38
+    2 04:50:38
+  2 04:50:38.1
+     2 04:50:38
+   2 04:50:38.1
+  2 04:50:38.12
+      2 04:50:38
+    2 04:50:38.1
+   2 04:50:38.12
+  2 04:50:38.123
+       2 04:50:38
+     2 04:50:38.1
+    2 04:50:38.12
+   2 04:50:38.123
+  2 04:50:38.1230
+        2 04:50:38
+      2 04:50:38.1
+     2 04:50:38.12
+    2 04:50:38.123
+   2 04:50:38.1230
+  2 04:50:38.12301
+         2 04:50:38
+       2 04:50:38.1
+      2 04:50:38.12
+     2 04:50:38.123
+    2 04:50:38.1230
+   2 04:50:38.12301
+  2 04:50:38.123010
+ 60:31
+  60:31
+   60:31
+ 60:31:35
+  60:31:35
+   60:31:35
+ 60:31:35.2
+    60:31:35
+  60:31:35.2
+ 60:31:35.23
+     60:31:35
+   60:31:35.2
+  60:31:35.23
+ 60:31:35.235
+      60:31:35
+    60:31:35.2
+   60:31:35.23
+  60:31:35.235
+ 60:31:35.2345
+       60:31:35
+     60:31:35.2
+    60:31:35.23
+   60:31:35.235
+  60:31:35.2345
+ 60:31:35.23453
+        60:31:35
+      60:31:35.2
+     60:31:35.23
+    60:31:35.235
+   60:31:35.2345
+  60:31:35.23453
+ 60:31:35.234530
+  2 12:31
+   2 12:31
+ 2 12:31:35
+  2 12:31:35
+   2 12:31:35
+    2 12:31:35
+  2 12:31:35.2
+     2 12:31:35
+   2 12:31:35.2
+  2 12:31:35.23
+      2 12:31:35
+    2 12:31:35.2
+   2 12:31:35.23
+  2 12:31:35.235
+       2 12:31:35
+     2 12:31:35.2
+    2 12:31:35.23
+   2 12:31:35.235
+  2 12:31:35.2345
+        2 12:31:35
+      2 12:31:35.2
+     2 12:31:35.23
+    2 12:31:35.235
+   2 12:31:35.2345
+  2 12:31:35.23453
+         2 12:31:35
+       2 12:31:35.2
+      2 12:31:35.23
+     2 12:31:35.235
+    2 12:31:35.2345
+   2 12:31:35.23453
+  2 12:31:35.234530
+ 60:47
+  60:47
+   60:47
+ 60:47:53
+  60:47:53
+   60:47:53
+ 60:47:53.3
+    60:47:53
+  60:47:53.3
+ 60:47:53.35
+     60:47:53
+   60:47:53.3
+  60:47:53.35
+ 60:47:53.345
+      60:47:53
+    60:47:53.3
+   60:47:53.35
+  60:47:53.345
+ 60:47:53.3451
+       60:47:53
+     60:47:53.3
+    60:47:53.35
+   60:47:53.345
+  60:47:53.3451
+ 60:47:53.34505
+        60:47:53
+      60:47:53.3
+     60:47:53.35
+    60:47:53.345
+   60:47:53.3451
+  60:47:53.34505
+ 60:47:53.345050
+  2 12:47
+   2 12:47
+ 2 12:47:53
+  2 12:47:53
+   2 12:47:53
+    2 12:47:53
+  2 12:47:53.3
+     2 12:47:53
+   2 12:47:53.3
+  2 12:47:53.35
+      2 12:47:53
+    2 12:47:53.3
+   2 12:47:53.35
+  2 12:47:53.345
+       2 12:47:53
+     2 12:47:53.3
+    2 12:47:53.35
+   2 12:47:53.345
+  2 12:47:53.3451
+        2 12:47:53
+      2 12:47:53.3
+     2 12:47:53.35
+    2 12:47:53.345
+   2 12:47:53.3451
+  2 12:47:53.34505
+         2 12:47:53
+       2 12:47:53.3
+      2 12:47:53.35
+     2 12:47:53.345
+    2 12:47:53.3451
+   2 12:47:53.34505
+  2 12:47:53.345050
+ 49:26
+  49:26
+   49:26
+ 49:26:00
+  49:26:00
+   49:26:00
+ 49:26:00.5
+    49:26:00
+  49:26:00.5
+ 49:26:00.46
+     49:26:00
+   49:26:00.5
+  49:26:00.46
+ 49:26:00.456
+      49:26:00
+    49:26:00.5
+   49:26:00.46
+  49:26:00.456
+ 49:26:00.4562
+       49:26:00
+     49:26:00.5
+    49:26:00.46
+   49:26:00.456
+  49:26:00.4562
+ 49:26:00.45615
+        49:26:00
+      49:26:00.5
+     49:26:00.46
+    49:26:00.456
+   49:26:00.4562
+  49:26:00.45615
+ 49:26:00.456150
+  2 01:26
+   2 01:26
+ 2 01:26:00
+  2 01:26:00
+   2 01:26:00
+    2 01:26:00
+  2 01:26:00.5
+     2 01:26:00
+   2 01:26:00.5
+  2 01:26:00.46
+      2 01:26:00
+    2 01:26:00.5
+   2 01:26:00.46
+  2 01:26:00.456
+       2 01:26:00
+     2 01:26:00.5
+    2 01:26:00.46
+   2 01:26:00.456
+  2 01:26:00.4562
+        2 01:26:00
+      2 01:26:00.5
+     2 01:26:00.46
+    2 01:26:00.456
+   2 01:26:00.4562
+  2 01:26:00.45615
+         2 01:26:00
+       2 01:26:00.5
+      2 01:26:00.46
+     2 01:26:00.456
+    2 01:26:00.4562
+   2 01:26:00.45615
+  2 01:26:00.456150
+ 68:58
+  68:58
+   68:58
+ 68:58:11
+  68:58:11
+   68:58:11
+ 68:58:11.6
+    68:58:11
+  68:58:11.6
+ 68:58:11.57
+     68:58:11
+   68:58:11.6
+  68:58:11.57
+ 68:58:11.567
+      68:58:11
+    68:58:11.6
+   68:58:11.57
+  68:58:11.567
+ 68:58:11.5668
+       68:58:11
+     68:58:11.6
+    68:58:11.57
+   68:58:11.567
+  68:58:11.5668
+ 68:58:11.56677
+        68:58:11
+      68:58:11.6
+     68:58:11.57
+    68:58:11.567
+   68:58:11.5668
+  68:58:11.56677
+ 68:58:11.566770
+  2 20:58
+   2 20:58
+ 2 20:58:11
+  2 20:58:11
+   2 20:58:11
+    2 20:58:11
+  2 20:58:11.6
+     2 20:58:11
+   2 20:58:11.6
+  2 20:58:11.57
+      2 20:58:11
+    2 20:58:11.6
+   2 20:58:11.57
+  2 20:58:11.567
+       2 20:58:11
+     2 20:58:11.6
+    2 20:58:11.57
+   2 20:58:11.567
+  2 20:58:11.5668
+        2 20:58:11
+      2 20:58:11.6
+     2 20:58:11.57
+    2 20:58:11.567
+   2 20:58:11.5668
+  2 20:58:11.56677
+         2 20:58:11
+       2 20:58:11.6
+      2 20:58:11.57
+     2 20:58:11.567
+    2 20:58:11.5668
+   2 20:58:11.56677
+  2 20:58:11.566770
+ 55:36
+  55:36
+   55:36
+ 55:36:05
+  55:36:05
+   55:36:05
+ 55:36:05.2
+    55:36:05
+  55:36:05.2
+ 55:36:05.19
+     55:36:05
+   55:36:05.2
+  55:36:05.19
+ 55:36:05.190
+      55:36:05
+    55:36:05.2
+   55:36:05.19
+  55:36:05.190
+ 55:36:05.1896
+       55:36:05
+     55:36:05.2
+    55:36:05.19
+   55:36:05.190
+  55:36:05.1896
+ 55:36:05.18964
+        55:36:05
+      55:36:05.2
+     55:36:05.19
+    55:36:05.190
+   55:36:05.1896
+  55:36:05.18964
+ 55:36:05.189640
+  2 07:36
+   2 07:36
+ 2 07:36:05
+  2 07:36:05
+   2 07:36:05
+    2 07:36:05
+  2 07:36:05.2
+     2 07:36:05
+   2 07:36:05.2
+  2 07:36:05.19
+      2 07:36:05
+    2 07:36:05.2
+   2 07:36:05.19
+  2 07:36:05.190
+       2 07:36:05
+     2 07:36:05.2
+    2 07:36:05.19
+   2 07:36:05.190
+  2 07:36:05.1896
+        2 07:36:05
+      2 07:36:05.2
+     2 07:36:05.19
+    2 07:36:05.190
+   2 07:36:05.1896
+  2 07:36:05.18964
+         2 07:36:05
+       2 07:36:05.2
+      2 07:36:05.19
+     2 07:36:05.190
+    2 07:36:05.1896
+   2 07:36:05.18964
+  2 07:36:05.189640
+ 63:43
+  63:43
+   63:43
+ 63:43:49
+  63:43:49
+   63:43:49
+ 63:43:49.8
+    63:43:49
+  63:43:49.8
+ 63:43:49.83
+     63:43:49
+   63:43:49.8
+  63:43:49.83
+ 63:43:49.831
+      63:43:49
+    63:43:49.8
+   63:43:49.83
+  63:43:49.831
+ 63:43:49.8313
+       63:43:49
+     63:43:49.8
+    63:43:49.83
+   63:43:49.831
+  63:43:49.8313
+ 63:43:49.83132
+        63:43:49
+      63:43:49.8
+     63:43:49.83
+    63:43:49.831
+   63:43:49.8313
+  63:43:49.83132
+ 63:43:49.831320
+  2 15:43
+   2 15:43
+ 2 15:43:49
+  2 15:43:49
+   2 15:43:49
+    2 15:43:49
+  2 15:43:49.8
+     2 15:43:49
+   2 15:43:49.8
+  2 15:43:49.83
+      2 15:43:49
+    2 15:43:49.8
+   2 15:43:49.83
+  2 15:43:49.831
+       2 15:43:49
+     2 15:43:49.8
+    2 15:43:49.83
+   2 15:43:49.831
+  2 15:43:49.8313
+        2 15:43:49
+      2 15:43:49.8
+     2 15:43:49.83
+    2 15:43:49.831
+   2 15:43:49.8313
+  2 15:43:49.83132
+         2 15:43:49
+       2 15:43:49.8
+      2 15:43:49.83
+     2 15:43:49.831
+    2 15:43:49.8313
+   2 15:43:49.83132
+  2 15:43:49.831320
+ 52:25
+  52:25
+   52:25
+ 52:25:09
+  52:25:09
+   52:25:09
+ 52:25:09.0
+    52:25:09
+  52:25:09.0
+ 52:25:09.01
+     52:25:09
+   52:25:09.0
+  52:25:09.01
+ 52:25:09.013
+      52:25:09
+    52:25:09.0
+   52:25:09.01
+  52:25:09.013
+ 52:25:09.0129
+       52:25:09
+     52:25:09.0
+    52:25:09.01
+   52:25:09.013
+  52:25:09.0129
+ 52:25:09.01293
+        52:25:09
+      52:25:09.0
+     52:25:09.01
+    52:25:09.013
+   52:25:09.0129
+  52:25:09.01293
+ 52:25:09.012930
+  2 04:25
+   2 04:25
+ 2 04:25:09
+  2 04:25:09
+   2 04:25:09
+    2 04:25:09
+  2 04:25:09.0
+     2 04:25:09
+   2 04:25:09.0
+  2 04:25:09.01
+      2 04:25:09
+    2 04:25:09.0
+   2 04:25:09.01
+  2 04:25:09.013
+       2 04:25:09
+     2 04:25:09.0
+    2 04:25:09.01
+   2 04:25:09.013
+  2 04:25:09.0129
+        2 04:25:09
+      2 04:25:09.0
+     2 04:25:09.01
+    2 04:25:09.013
+   2 04:25:09.0129
+  2 04:25:09.01293
+         2 04:25:09
+       2 04:25:09.0
+      2 04:25:09.01
+     2 04:25:09.013
+    2 04:25:09.0129
+   2 04:25:09.01293
+  2 04:25:09.012930
+ 54:49
+  54:49
+   54:49
+ 54:49:27
+  54:49:27
+   54:49:27
+ 54:49:27.5
+    54:49:27
+  54:49:27.5
+ 54:49:27.52
+     54:49:27
+   54:49:27.5
+  54:49:27.52
+ 54:49:27.524
+      54:49:27
+    54:49:27.5
+   54:49:27.52
+  54:49:27.524
+ 54:49:27.5237
+       54:49:27
+     54:49:27.5
+    54:49:27.52
+   54:49:27.524
+  54:49:27.5237
+ 54:49:27.52375
+        54:49:27
+      54:49:27.5
+     54:49:27.52
+    54:49:27.524
+   54:49:27.5237
+  54:49:27.52375
+ 54:49:27.523750
+  2 06:49
+   2 06:49
+ 2 06:49:27
+  2 06:49:27
+   2 06:49:27
+    2 06:49:27
+  2 06:49:27.5
+     2 06:49:27
+   2 06:49:27.5
+  2 06:49:27.52
+      2 06:49:27
+    2 06:49:27.5
+   2 06:49:27.52
+  2 06:49:27.524
+       2 06:49:27
+     2 06:49:27.5
+    2 06:49:27.52
+   2 06:49:27.524
+  2 06:49:27.5237
+        2 06:49:27
+      2 06:49:27.5
+     2 06:49:27.52
+    2 06:49:27.524
+   2 06:49:27.5237
+  2 06:49:27.52375
+         2 06:49:27
+       2 06:49:27.5
+      2 06:49:27.52
+     2 06:49:27.524
+    2 06:49:27.5237
+   2 06:49:27.52375
+  2 06:49:27.523750
+ 50:57
+  50:57
+   50:57
+ 50:57:52
+  50:57:52
+   50:57:52
+ 50:57:52.0
+    50:57:52
+  50:57:52.0
+ 50:57:52.02
+     50:57:52
+   50:57:52.0
+  50:57:52.02
+ 50:57:52.016
+      50:57:52
+    50:57:52.0
+   50:57:52.02
+  50:57:52.016
+ 50:57:52.0156
+       50:57:52
+     50:57:52.0
+    50:57:52.02
+   50:57:52.016
+  50:57:52.0156
+ 50:57:52.01565
+        50:57:52
+      50:57:52.0
+     50:57:52.02
+    50:57:52.016
+   50:57:52.0156
+  50:57:52.01565
+ 50:57:52.015650
+  2 02:57
+   2 02:57
+ 2 02:57:52
+  2 02:57:52
+   2 02:57:52
+    2 02:57:52
+  2 02:57:52.0
+     2 02:57:52
+   2 02:57:52.0
+  2 02:57:52.02
+      2 02:57:52
+    2 02:57:52.0
+   2 02:57:52.02
+  2 02:57:52.016
+       2 02:57:52
+     2 02:57:52.0
+    2 02:57:52.02
+   2 02:57:52.016
+  2 02:57:52.0156
+        2 02:57:52
+      2 02:57:52.0
+     2 02:57:52.02
+    2 02:57:52.016
+   2 02:57:52.0156
+  2 02:57:52.01565
+         2 02:57:52
+       2 02:57:52.0
+      2 02:57:52.02
+     2 02:57:52.016
+    2 02:57:52.0156
+   2 02:57:52.01565
+  2 02:57:52.015650
+ 64:45
+  64:45
+   64:45
+ 64:45:44
+  64:45:44
+   64:45:44
+ 64:45:44.9
+    64:45:44
+  64:45:44.9
+ 64:45:44.87
+     64:45:44
+   64:45:44.9
+  64:45:44.87
+ 64:45:44.865
+      64:45:44
+    64:45:44.9
+   64:45:44.87
+  64:45:44.865
+ 64:45:44.8653
+       64:45:44
+     64:45:44.9
+    64:45:44.87
+   64:45:44.865
+  64:45:44.8653
+ 64:45:44.86529
+        64:45:44
+      64:45:44.9
+     64:45:44.87
+    64:45:44.865
+   64:45:44.8653
+  64:45:44.86529
+ 64:45:44.865290
+  2 16:45
+   2 16:45
+ 2 16:45:44
+  2 16:45:44
+   2 16:45:44
+    2 16:45:44
+  2 16:45:44.9
+     2 16:45:44
+   2 16:45:44.9
+  2 16:45:44.87
+      2 16:45:44
+    2 16:45:44.9
+   2 16:45:44.87
+  2 16:45:44.865
+       2 16:45:44
+     2 16:45:44.9
+    2 16:45:44.87
+   2 16:45:44.865
+  2 16:45:44.8653
+        2 16:45:44
+      2 16:45:44.9
+     2 16:45:44.87
+    2 16:45:44.865
+   2 16:45:44.8653
+  2 16:45:44.86529
+         2 16:45:44
+       2 16:45:44.9
+      2 16:45:44.87
+     2 16:45:44.865
+    2 16:45:44.8653
+   2 16:45:44.86529
+  2 16:45:44.865290
+ 69:30
+  69:30
+   69:30
+ 69:30:57
+  69:30:57
+   69:30:57
+ 69:30:57.8
+    69:30:57
+  69:30:57.8
+ 69:30:57.82
+     69:30:57
+   69:30:57.8
+  69:30:57.82
+ 69:30:57.820
+      69:30:57
+    69:30:57.8
+   69:30:57.82
+  69:30:57.820
+ 69:30:57.8205
+       69:30:57
+     69:30:57.8
+    69:30:57.82
+   69:30:57.820
+  69:30:57.8205
+ 69:30:57.82047
+        69:30:57
+      69:30:57.8
+     69:30:57.82
+    69:30:57.820
+   69:30:57.8205
+  69:30:57.82047
+ 69:30:57.820470
+  2 21:30
+   2 21:30
+ 2 21:30:57
+  2 21:30:57
+   2 21:30:57
+    2 21:30:57
+  2 21:30:57.8
+     2 21:30:57
+   2 21:30:57.8
+  2 21:30:57.82
+      2 21:30:57
+    2 21:30:57.8
+   2 21:30:57.82
+  2 21:30:57.820
+       2 21:30:57
+     2 21:30:57.8
+    2 21:30:57.82
+   2 21:30:57.820
+  2 21:30:57.8205
+        2 21:30:57
+      2 21:30:57.8
+     2 21:30:57.82
+    2 21:30:57.820
+   2 21:30:57.8205
+  2 21:30:57.82047
+         2 21:30:57
+       2 21:30:57.8
+      2 21:30:57.82
+     2 21:30:57.820
+    2 21:30:57.8205
+   2 21:30:57.82047
+  2 21:30:57.820470
+ 52:25
+  52:25
+   52:25
+ 52:25:09
+  52:25:09
+   52:25:09
+ 52:25:09.2
+    52:25:09
+  52:25:09.2
+ 52:25:09.15
+     52:25:09
+   52:25:09.2
+  52:25:09.15
+ 52:25:09.154
+      52:25:09
+    52:25:09.2
+   52:25:09.15
+  52:25:09.154
+ 52:25:09.1540
+       52:25:09
+     52:25:09.2
+    52:25:09.15
+   52:25:09.154
+  52:25:09.1540
+ 52:25:09.15395
+        52:25:09
+      52:25:09.2
+     52:25:09.15
+    52:25:09.154
+   52:25:09.1540
+  52:25:09.15395
+ 52:25:09.153950
+  2 04:25
+   2 04:25
+ 2 04:25:09
+  2 04:25:09
+   2 04:25:09
+    2 04:25:09
+  2 04:25:09.2
+     2 04:25:09
+   2 04:25:09.2
+  2 04:25:09.15
+      2 04:25:09
+    2 04:25:09.2
+   2 04:25:09.15
+  2 04:25:09.154
+       2 04:25:09
+     2 04:25:09.2
+    2 04:25:09.15
+   2 04:25:09.154
+  2 04:25:09.1540
+        2 04:25:09
+      2 04:25:09.2
+     2 04:25:09.15
+    2 04:25:09.154
+   2 04:25:09.1540
+  2 04:25:09.15395
+         2 04:25:09
+       2 04:25:09.2
+      2 04:25:09.15
+     2 04:25:09.154
+    2 04:25:09.1540
+   2 04:25:09.15395
+  2 04:25:09.153950
+ 54:49
+  54:49
+   54:49
+ 54:49:27
+  54:49:27
+   54:49:27
+ 54:49:27.1
+    54:49:27
+  54:49:27.1
+ 54:49:27.11
+     54:49:27
+   54:49:27.1
+  54:49:27.11
+ 54:49:27.105
+      54:49:27
+    54:49:27.1
+   54:49:27.11
+  54:49:27.105
+ 54:49:27.1053
+       54:49:27
+     54:49:27.1
+    54:49:27.11
+   54:49:27.105
+  54:49:27.1053
+ 54:49:27.10533
+        54:49:27
+      54:49:27.1
+     54:49:27.11
+    54:49:27.105
+   54:49:27.1053
+  54:49:27.10533
+ 54:49:27.105330
+  2 06:49
+   2 06:49
+ 2 06:49:27
+  2 06:49:27
+   2 06:49:27
+    2 06:49:27
+  2 06:49:27.1
+     2 06:49:27
+   2 06:49:27.1
+  2 06:49:27.11
+      2 06:49:27
+    2 06:49:27.1
+   2 06:49:27.11
+  2 06:49:27.105
+       2 06:49:27
+     2 06:49:27.1
+    2 06:49:27.11
+   2 06:49:27.105
+  2 06:49:27.1053
+        2 06:49:27
+      2 06:49:27.1
+     2 06:49:27.11
+    2 06:49:27.105
+   2 06:49:27.1053
+  2 06:49:27.10533
+         2 06:49:27
+       2 06:49:27.1
+      2 06:49:27.11
+     2 06:49:27.105
+    2 06:49:27.1053
+   2 06:49:27.10533
+  2 06:49:27.105330
+ 50:57
+  50:57
+   50:57
+ 50:57:52
+  50:57:52
+   50:57:52
+ 50:57:52.5
+    50:57:52
+  50:57:52.5
+ 50:57:52.48
+     50:57:52
+   50:57:52.5
+  50:57:52.48
+ 50:57:52.482
+      50:57:52
+    50:57:52.5
+   50:57:52.48
+  50:57:52.482
+ 50:57:52.4823
+       50:57:52
+     50:57:52.5
+    50:57:52.48
+   50:57:52.482
+  50:57:52.4823
+ 50:57:52.48229
+        50:57:52
+      50:57:52.5
+     50:57:52.48
+    50:57:52.482
+   50:57:52.4823
+  50:57:52.48229
+ 50:57:52.482290
+  2 02:57
+   2 02:57
+ 2 02:57:52
+  2 02:57:52
+   2 02:57:52
+    2 02:57:52
+  2 02:57:52.5
+     2 02:57:52
+   2 02:57:52.5
+  2 02:57:52.48
+      2 02:57:52
+    2 02:57:52.5
+   2 02:57:52.48
+  2 02:57:52.482
+       2 02:57:52
+     2 02:57:52.5
+    2 02:57:52.48
+   2 02:57:52.482
+  2 02:57:52.4823
+        2 02:57:52
+      2 02:57:52.5
+     2 02:57:52.48
+    2 02:57:52.482
+   2 02:57:52.4823
+  2 02:57:52.48229
+         2 02:57:52
+       2 02:57:52.5
+      2 02:57:52.48
+     2 02:57:52.482
+    2 02:57:52.4823
+   2 02:57:52.48229
+  2 02:57:52.482290
+ 64:45
+  64:45
+   64:45
+ 64:45:44
+  64:45:44
+   64:45:44
+ 64:45:44.7
+    64:45:44
+  64:45:44.7
+ 64:45:44.66
+     64:45:44
+   64:45:44.7
+  64:45:44.66
+ 64:45:44.658
+      64:45:44
+    64:45:44.7
+   64:45:44.66
+  64:45:44.658
+ 64:45:44.6583
+       64:45:44
+     64:45:44.7
+    64:45:44.66
+   64:45:44.658
+  64:45:44.6583
+ 64:45:44.65827
+        64:45:44
+      64:45:44.7
+     64:45:44.66
+    64:45:44.658
+   64:45:44.6583
+  64:45:44.65827
+ 64:45:44.658270
+  2 16:45
+   2 16:45
+ 2 16:45:44
+  2 16:45:44
+   2 16:45:44
+    2 16:45:44
+  2 16:45:44.7
+     2 16:45:44
+   2 16:45:44.7
+  2 16:45:44.66
+      2 16:45:44
+    2 16:45:44.7
+   2 16:45:44.66
+  2 16:45:44.658
+       2 16:45:44
+     2 16:45:44.7
+    2 16:45:44.66
+   2 16:45:44.658
+  2 16:45:44.6583
+        2 16:45:44
+      2 16:45:44.7
+     2 16:45:44.66
+    2 16:45:44.658
+   2 16:45:44.6583
+  2 16:45:44.65827
+         2 16:45:44
+       2 16:45:44.7
+      2 16:45:44.66
+     2 16:45:44.658
+    2 16:45:44.6583
+   2 16:45:44.65827
+  2 16:45:44.658270
+ 69:30
+  69:30
+   69:30
+ 69:30:57
+  69:30:57
+   69:30:57
+ 69:30:57.6
+    69:30:57
+  69:30:57.6
+ 69:30:57.58
+     69:30:57
+   69:30:57.6
+  69:30:57.58
+ 69:30:57.582
+      69:30:57
+    69:30:57.6
+   69:30:57.58
+  69:30:57.582
+ 69:30:57.5822
+       69:30:57
+     69:30:57.6
+    69:30:57.58
+   69:30:57.582
+  69:30:57.5822
+ 69:30:57.58219
+        69:30:57
+      69:30:57.6
+     69:30:57.58
+    69:30:57.582
+   69:30:57.5822
+  69:30:57.58219
+ 69:30:57.582190
+  2 21:30
+   2 21:30
+ 2 21:30:57
+  2 21:30:57
+   2 21:30:57
+    2 21:30:57
+  2 21:30:57.6
+     2 21:30:57
+   2 21:30:57.6
+  2 21:30:57.58
+      2 21:30:57
+    2 21:30:57.6
+   2 21:30:57.58
+  2 21:30:57.582
+       2 21:30:57
+     2 21:30:57.6
+    2 21:30:57.58
+   2 21:30:57.582
+  2 21:30:57.5822
+        2 21:30:57
+      2 21:30:57.6
+     2 21:30:57.58
+    2 21:30:57.582
+   2 21:30:57.5822
+  2 21:30:57.58219
+         2 21:30:57
+       2 21:30:57.6
+      2 21:30:57.58
+     2 21:30:57.582
+    2 21:30:57.5822
+   2 21:30:57.58219
+  2 21:30:57.582190
+ 70:30
+  70:30
+   70:30
+ 70:30:04
+  70:30:04
+   70:30:04
+ 70:30:04.2
+    70:30:04
+  70:30:04.2
+ 70:30:04.18
+     70:30:04
+   70:30:04.2
+  70:30:04.18
+ 70:30:04.183
+      70:30:04
+    70:30:04.2
+   70:30:04.18
+  70:30:04.183
+ 70:30:04.1835
+       70:30:04
+     70:30:04.2
+    70:30:04.18
+   70:30:04.183
+  70:30:04.1835
+ 70:30:04.18347
+        70:30:04
+      70:30:04.2
+     70:30:04.18
+    70:30:04.183
+   70:30:04.1835
+  70:30:04.18347
+ 70:30:04.183470
+  2 22:30
+   2 22:30
+ 2 22:30:04
+  2 22:30:04
+   2 22:30:04
+    2 22:30:04
+  2 22:30:04.2
+     2 22:30:04
+   2 22:30:04.2
+  2 22:30:04.18
+      2 22:30:04
+    2 22:30:04.2
+   2 22:30:04.18
+  2 22:30:04.183
+       2 22:30:04
+     2 22:30:04.2
+    2 22:30:04.18
+   2 22:30:04.183
+  2 22:30:04.1835
+        2 22:30:04
+      2 22:30:04.2
+     2 22:30:04.18
+    2 22:30:04.183
+   2 22:30:04.1835
+  2 22:30:04.18347
+         2 22:30:04
+       2 22:30:04.2
+      2 22:30:04.18
+     2 22:30:04.183
+    2 22:30:04.1835
+   2 22:30:04.18347
+  2 22:30:04.183470
+ 49:56
+  49:56
+   49:56
+ 49:56:51
+  49:56:51
+   49:56:51
+ 49:56:51.6
+    49:56:51
+  49:56:51.6
+ 49:56:51.59
+     49:56:51
+   49:56:51.6
+  49:56:51.59
+ 49:56:51.593
+      49:56:51
+    49:56:51.6
+   49:56:51.59
+  49:56:51.593
+ 49:56:51.5932
+       49:56:51
+     49:56:51.6
+    49:56:51.59
+   49:56:51.593
+  49:56:51.5932
+ 49:56:51.59319
+        49:56:51
+      49:56:51.6
+     49:56:51.59
+    49:56:51.593
+   49:56:51.5932
+  49:56:51.59319
+ 49:56:51.593190
+  2 01:56
+   2 01:56
+ 2 01:56:51
+  2 01:56:51
+   2 01:56:51
+    2 01:56:51
+  2 01:56:51.6
+     2 01:56:51
+   2 01:56:51.6
+  2 01:56:51.59
+      2 01:56:51
+    2 01:56:51.6
+   2 01:56:51.59
+  2 01:56:51.593
+       2 01:56:51
+     2 01:56:51.6
+    2 01:56:51.59
+   2 01:56:51.593
+  2 01:56:51.5932
+        2 01:56:51
+      2 01:56:51.6
+     2 01:56:51.59
+    2 01:56:51.593
+   2 01:56:51.5932
+  2 01:56:51.59319
+         2 01:56:51
+       2 01:56:51.6
+      2 01:56:51.59
+     2 01:56:51.593
+    2 01:56:51.5932
+   2 01:56:51.59319
+  2 01:56:51.593190
+ *****
+ ******
+ 1296:00
+  1296:00
+   1296:00
+ 1296:00:00
+ 1296:00:00
+  1296:00:00
+  1296:00:00
+  1296:00:00
+   1296:00:00
+ 1296:00:00.0
+ 1296:00:00.0
+ 1296:00:00.0
+    1296:00:00
+  1296:00:00.0
+ 1296:00:00.00
+ 1296:00:00.00
+ 1296:00:00.00
+     1296:00:00
+   1296:00:00.0
+  1296:00:00.00
+ 1296:00:00.000
+ 1296:00:00.000
+ 1296:00:00.000
+      1296:00:00
+    1296:00:00.0
+   1296:00:00.00
+  1296:00:00.000
+ 1296:00:00.0000
+ 1296:00:00.0000
+ 1296:00:00.0000
+ 54 00:00
+  54 00:00
+   54 00:00
+ 54 00:00:00
+  54 00:00:00
+   54 00:00:00
+ 54 00:00:00.0
+    54 00:00:00
+  54 00:00:00.0
+ 54 00:00:00.00
+     54 00:00:00
+   54 00:00:00.0
+  54 00:00:00.00
+ 54 00:00:00.000
+      54 00:00:00
+    54 00:00:00.0
+   54 00:00:00.00
+  54 00:00:00.000
+ 54 00:00:00.0000
+       54 00:00:00
+     54 00:00:00.0
+    54 00:00:00.00
+   54 00:00:00.000
+  54 00:00:00.0000
+ 54 00:00:00.00000
+        54 00:00:00
+      54 00:00:00.0
+     54 00:00:00.00
+    54 00:00:00.000
+   54 00:00:00.0000
+  54 00:00:00.00000
+ 54 00:00:00.000000
+ *****
+ ******
+ 1300:50
+  1300:50
+   1300:50
+ 1300:50:38
+ 1300:50:38
+  1300:50:38
+  1300:50:38
+  1300:50:38
+   1300:50:38
+ 1300:50:38.1
+ 1300:50:38.1
+ 1300:50:38.1
+    1300:50:38
+  1300:50:38.1
+ 1300:50:38.12
+ 1300:50:38.12
+ 1300:50:38.12
+     1300:50:38
+   1300:50:38.1
+  1300:50:38.12
+ 1300:50:38.123
+ 1300:50:38.123
+ 1300:50:38.123
+      1300:50:38
+    1300:50:38.1
+   1300:50:38.12
+  1300:50:38.123
+ 1300:50:38.1230
+ 1300:50:38.1230
+ 1300:50:38.1230
+ 54 04:50
+  54 04:50
+   54 04:50
+ 54 04:50:38
+  54 04:50:38
+   54 04:50:38
+ 54 04:50:38.1
+    54 04:50:38
+  54 04:50:38.1
+ 54 04:50:38.12
+     54 04:50:38
+   54 04:50:38.1
+  54 04:50:38.12
+ 54 04:50:38.123
+      54 04:50:38
+    54 04:50:38.1
+   54 04:50:38.12
+  54 04:50:38.123
+ 54 04:50:38.1230
+       54 04:50:38
+     54 04:50:38.1
+    54 04:50:38.12
+   54 04:50:38.123
+  54 04:50:38.1230
+ 54 04:50:38.12301
+        54 04:50:38
+      54 04:50:38.1
+     54 04:50:38.12
+    54 04:50:38.123
+   54 04:50:38.1230
+  54 04:50:38.12301
+ 54 04:50:38.123010
+ *****
+ ******
+ 1308:31
+  1308:31
+   1308:31
+ 1308:31:35
+ 1308:31:35
+  1308:31:35
+  1308:31:35
+  1308:31:35
+   1308:31:35
+ 1308:31:35.2
+ 1308:31:35.2
+ 1308:31:35.2
+    1308:31:35
+  1308:31:35.2
+ 1308:31:35.23
+ 1308:31:35.23
+ 1308:31:35.23
+     1308:31:35
+   1308:31:35.2
+  1308:31:35.23
+ 1308:31:35.235
+ 1308:31:35.235
+ 1308:31:35.235
+      1308:31:35
+    1308:31:35.2
+   1308:31:35.23
+  1308:31:35.235
+ 1308:31:35.2345
+ 1308:31:35.2345
+ 1308:31:35.2345
+ 54 12:31
+  54 12:31
+   54 12:31
+ 54 12:31:35
+  54 12:31:35
+   54 12:31:35
+ 54 12:31:35.2
+    54 12:31:35
+  54 12:31:35.2
+ 54 12:31:35.23
+     54 12:31:35
+   54 12:31:35.2
+  54 12:31:35.23
+ 54 12:31:35.235
+      54 12:31:35
+    54 12:31:35.2
+   54 12:31:35.23
+  54 12:31:35.235
+ 54 12:31:35.2345
+       54 12:31:35
+     54 12:31:35.2
+    54 12:31:35.23
+   54 12:31:35.235
+  54 12:31:35.2345
+ 54 12:31:35.23453
+        54 12:31:35
+      54 12:31:35.2
+     54 12:31:35.23
+    54 12:31:35.235
+   54 12:31:35.2345
+  54 12:31:35.23453
+ 54 12:31:35.234530
+ *****
+ ******
+ 1308:47
+  1308:47
+   1308:47
+ 1308:47:53
+ 1308:47:53
+  1308:47:53
+  1308:47:53
+  1308:47:53
+   1308:47:53
+ 1308:47:53.3
+ 1308:47:53.3
+ 1308:47:53.3
+    1308:47:53
+  1308:47:53.3
+ 1308:47:53.35
+ 1308:47:53.35
+ 1308:47:53.35
+     1308:47:53
+   1308:47:53.3
+  1308:47:53.35
+ 1308:47:53.345
+ 1308:47:53.345
+ 1308:47:53.345
+      1308:47:53
+    1308:47:53.3
+   1308:47:53.35
+  1308:47:53.345
+ 1308:47:53.3450
+ 1308:47:53.3450
+ 1308:47:53.3450
+ 54 12:47
+  54 12:47
+   54 12:47
+ 54 12:47:53
+  54 12:47:53
+   54 12:47:53
+ 54 12:47:53.3
+    54 12:47:53
+  54 12:47:53.3
+ 54 12:47:53.35
+     54 12:47:53
+   54 12:47:53.3
+  54 12:47:53.35
+ 54 12:47:53.345
+      54 12:47:53
+    54 12:47:53.3
+   54 12:47:53.35
+  54 12:47:53.345
+ 54 12:47:53.3450
+       54 12:47:53
+     54 12:47:53.3
+    54 12:47:53.35
+   54 12:47:53.345
+  54 12:47:53.3450
+ 54 12:47:53.34505
+        54 12:47:53
+      54 12:47:53.3
+     54 12:47:53.35
+    54 12:47:53.345
+   54 12:47:53.3450
+  54 12:47:53.34505
+ 54 12:47:53.345050
+ *****
+ ******
+ 1297:26
+  1297:26
+   1297:26
+ 1297:26:00
+ 1297:26:00
+  1297:26:00
+  1297:26:00
+  1297:26:00
+   1297:26:00
+ 1297:26:00.5
+ 1297:26:00.5
+ 1297:26:00.5
+    1297:26:00
+  1297:26:00.5
+ 1297:26:00.46
+ 1297:26:00.46
+ 1297:26:00.46
+     1297:26:00
+   1297:26:00.5
+  1297:26:00.46
+ 1297:26:00.456
+ 1297:26:00.456
+ 1297:26:00.456
+      1297:26:00
+    1297:26:00.5
+   1297:26:00.46
+  1297:26:00.456
+ 1297:26:00.4561
+ 1297:26:00.4561
+ 1297:26:00.4561
+ 54 01:26
+  54 01:26
+   54 01:26
+ 54 01:26:00
+  54 01:26:00
+   54 01:26:00
+ 54 01:26:00.5
+    54 01:26:00
+  54 01:26:00.5
+ 54 01:26:00.46
+     54 01:26:00
+   54 01:26:00.5
+  54 01:26:00.46
+ 54 01:26:00.456
+      54 01:26:00
+    54 01:26:00.5
+   54 01:26:00.46
+  54 01:26:00.456
+ 54 01:26:00.4561
+       54 01:26:00
+     54 01:26:00.5
+    54 01:26:00.46
+   54 01:26:00.456
+  54 01:26:00.4561
+ 54 01:26:00.45615
+        54 01:26:00
+      54 01:26:00.5
+     54 01:26:00.46
+    54 01:26:00.456
+   54 01:26:00.4561
+  54 01:26:00.45615
+ 54 01:26:00.456150
+ *****
+ ******
+ 1316:58
+  1316:58
+   1316:58
+ 1316:58:11
+ 1316:58:11
+  1316:58:11
+  1316:58:11
+  1316:58:11
+   1316:58:11
+ 1316:58:11.6
+ 1316:58:11.6
+ 1316:58:11.6
+    1316:58:11
+  1316:58:11.6
+ 1316:58:11.57
+ 1316:58:11.57
+ 1316:58:11.57
+     1316:58:11
+   1316:58:11.6
+  1316:58:11.57
+ 1316:58:11.567
+ 1316:58:11.567
+ 1316:58:11.567
+      1316:58:11
+    1316:58:11.6
+   1316:58:11.57
+  1316:58:11.567
+ 1316:58:11.5668
+ 1316:58:11.5668
+ 1316:58:11.5668
+ 54 20:58
+  54 20:58
+   54 20:58
+ 54 20:58:11
+  54 20:58:11
+   54 20:58:11
+ 54 20:58:11.6
+    54 20:58:11
+  54 20:58:11.6
+ 54 20:58:11.57
+     54 20:58:11
+   54 20:58:11.6
+  54 20:58:11.57
+ 54 20:58:11.567
+      54 20:58:11
+    54 20:58:11.6
+   54 20:58:11.57
+  54 20:58:11.567
+ 54 20:58:11.5668
+       54 20:58:11
+     54 20:58:11.6
+    54 20:58:11.57
+   54 20:58:11.567
+  54 20:58:11.5668
+ 54 20:58:11.56677
+        54 20:58:11
+      54 20:58:11.6
+     54 20:58:11.57
+    54 20:58:11.567
+   54 20:58:11.5668
+  54 20:58:11.56677
+ 54 20:58:11.566770
+ *****
+ ******
+ 1303:36
+  1303:36
+   1303:36
+ 1303:36:05
+ 1303:36:05
+  1303:36:05
+  1303:36:05
+  1303:36:05
+   1303:36:05
+ 1303:36:05.2
+ 1303:36:05.2
+ 1303:36:05.2
+    1303:36:05
+  1303:36:05.2
+ 1303:36:05.19
+ 1303:36:05.19
+ 1303:36:05.19
+     1303:36:05
+   1303:36:05.2
+  1303:36:05.19
+ 1303:36:05.190
+ 1303:36:05.190
+ 1303:36:05.190
+      1303:36:05
+    1303:36:05.2
+   1303:36:05.19
+  1303:36:05.190
+ 1303:36:05.1896
+ 1303:36:05.1896
+ 1303:36:05.1896
+ 54 07:36
+  54 07:36
+   54 07:36
+ 54 07:36:05
+  54 07:36:05
+   54 07:36:05
+ 54 07:36:05.2
+    54 07:36:05
+  54 07:36:05.2
+ 54 07:36:05.19
+     54 07:36:05
+   54 07:36:05.2
+  54 07:36:05.19
+ 54 07:36:05.190
+      54 07:36:05
+    54 07:36:05.2
+   54 07:36:05.19
+  54 07:36:05.190
+ 54 07:36:05.1896
+       54 07:36:05
+     54 07:36:05.2
+    54 07:36:05.19
+   54 07:36:05.190
+  54 07:36:05.1896
+ 54 07:36:05.18964
+        54 07:36:05
+      54 07:36:05.2
+     54 07:36:05.19
+    54 07:36:05.190
+   54 07:36:05.1896
+  54 07:36:05.18964
+ 54 07:36:05.189640
+ *****
+ ******
+ 1311:43
+  1311:43
+   1311:43
+ 1311:43:49
+ 1311:43:49
+  1311:43:49
+  1311:43:49
+  1311:43:49
+   1311:43:49
+ 1311:43:49.8
+ 1311:43:49.8
+ 1311:43:49.8
+    1311:43:49
+  1311:43:49.8
+ 1311:43:49.83
+ 1311:43:49.83
+ 1311:43:49.83
+     1311:43:49
+   1311:43:49.8
+  1311:43:49.83
+ 1311:43:49.831
+ 1311:43:49.831
+ 1311:43:49.831
+      1311:43:49
+    1311:43:49.8
+   1311:43:49.83
+  1311:43:49.831
+ 1311:43:49.8313
+ 1311:43:49.8313
+ 1311:43:49.8313
+ 54 15:43
+  54 15:43
+   54 15:43
+ 54 15:43:49
+  54 15:43:49
+   54 15:43:49
+ 54 15:43:49.8
+    54 15:43:49
+  54 15:43:49.8
+ 54 15:43:49.83
+     54 15:43:49
+   54 15:43:49.8
+  54 15:43:49.83
+ 54 15:43:49.831
+      54 15:43:49
+    54 15:43:49.8
+   54 15:43:49.83
+  54 15:43:49.831
+ 54 15:43:49.8313
+       54 15:43:49
+     54 15:43:49.8
+    54 15:43:49.83
+   54 15:43:49.831
+  54 15:43:49.8313
+ 54 15:43:49.83132
+        54 15:43:49
+      54 15:43:49.8
+     54 15:43:49.83
+    54 15:43:49.831
+   54 15:43:49.8313
+  54 15:43:49.83132
+ 54 15:43:49.831320
+ *****
+ ******
+ 1300:25
+  1300:25
+   1300:25
+ 1300:25:09
+ 1300:25:09
+  1300:25:09
+  1300:25:09
+  1300:25:09
+   1300:25:09
+ 1300:25:09.0
+ 1300:25:09.0
+ 1300:25:09.0
+    1300:25:09
+  1300:25:09.0
+ 1300:25:09.01
+ 1300:25:09.01
+ 1300:25:09.01
+     1300:25:09
+   1300:25:09.0
+  1300:25:09.01
+ 1300:25:09.013
+ 1300:25:09.013
+ 1300:25:09.013
+      1300:25:09
+    1300:25:09.0
+   1300:25:09.01
+  1300:25:09.013
+ 1300:25:09.0129
+ 1300:25:09.0129
+ 1300:25:09.0129
+ 54 04:25
+  54 04:25
+   54 04:25
+ 54 04:25:09
+  54 04:25:09
+   54 04:25:09
+ 54 04:25:09.0
+    54 04:25:09
+  54 04:25:09.0
+ 54 04:25:09.01
+     54 04:25:09
+   54 04:25:09.0
+  54 04:25:09.01
+ 54 04:25:09.013
+      54 04:25:09
+    54 04:25:09.0
+   54 04:25:09.01
+  54 04:25:09.013
+ 54 04:25:09.0129
+       54 04:25:09
+     54 04:25:09.0
+    54 04:25:09.01
+   54 04:25:09.013
+  54 04:25:09.0129
+ 54 04:25:09.01293
+        54 04:25:09
+      54 04:25:09.0
+     54 04:25:09.01
+    54 04:25:09.013
+   54 04:25:09.0129
+  54 04:25:09.01293
+ 54 04:25:09.012930
+ *****
+ ******
+ 1302:49
+  1302:49
+   1302:49
+ 1302:49:27
+ 1302:49:27
+  1302:49:27
+  1302:49:27
+  1302:49:27
+   1302:49:27
+ 1302:49:27.5
+ 1302:49:27.5
+ 1302:49:27.5
+    1302:49:27
+  1302:49:27.5
+ 1302:49:27.52
+ 1302:49:27.52
+ 1302:49:27.52
+     1302:49:27
+   1302:49:27.5
+  1302:49:27.52
+ 1302:49:27.524
+ 1302:49:27.524
+ 1302:49:27.524
+      1302:49:27
+    1302:49:27.5
+   1302:49:27.52
+  1302:49:27.524
+ 1302:49:27.5237
+ 1302:49:27.5237
+ 1302:49:27.5237
+ 54 06:49
+  54 06:49
+   54 06:49
+ 54 06:49:27
+  54 06:49:27
+   54 06:49:27
+ 54 06:49:27.5
+    54 06:49:27
+  54 06:49:27.5
+ 54 06:49:27.52
+     54 06:49:27
+   54 06:49:27.5
+  54 06:49:27.52
+ 54 06:49:27.524
+      54 06:49:27
+    54 06:49:27.5
+   54 06:49:27.52
+  54 06:49:27.524
+ 54 06:49:27.5237
+       54 06:49:27
+     54 06:49:27.5
+    54 06:49:27.52
+   54 06:49:27.524
+  54 06:49:27.5237
+ 54 06:49:27.52375
+        54 06:49:27
+      54 06:49:27.5
+     54 06:49:27.52
+    54 06:49:27.524
+   54 06:49:27.5237
+  54 06:49:27.52375
+ 54 06:49:27.523750
+ *****
+ ******
+ 1298:57
+  1298:57
+   1298:57
+ 1298:57:52
+ 1298:57:52
+  1298:57:52
+  1298:57:52
+  1298:57:52
+   1298:57:52
+ 1298:57:52.0
+ 1298:57:52.0
+ 1298:57:52.0
+    1298:57:52
+  1298:57:52.0
+ 1298:57:52.02
+ 1298:57:52.02
+ 1298:57:52.02
+     1298:57:52
+   1298:57:52.0
+  1298:57:52.02
+ 1298:57:52.016
+ 1298:57:52.016
+ 1298:57:52.016
+      1298:57:52
+    1298:57:52.0
+   1298:57:52.02
+  1298:57:52.016
+ 1298:57:52.0157
+ 1298:57:52.0157
+ 1298:57:52.0157
+ 54 02:57
+  54 02:57
+   54 02:57
+ 54 02:57:52
+  54 02:57:52
+   54 02:57:52
+ 54 02:57:52.0
+    54 02:57:52
+  54 02:57:52.0
+ 54 02:57:52.02
+     54 02:57:52
+   54 02:57:52.0
+  54 02:57:52.02
+ 54 02:57:52.016
+      54 02:57:52
+    54 02:57:52.0
+   54 02:57:52.02
+  54 02:57:52.016
+ 54 02:57:52.0157
+       54 02:57:52
+     54 02:57:52.0
+    54 02:57:52.02
+   54 02:57:52.016
+  54 02:57:52.0157
+ 54 02:57:52.01565
+        54 02:57:52
+      54 02:57:52.0
+     54 02:57:52.02
+    54 02:57:52.016
+   54 02:57:52.0157
+  54 02:57:52.01565
+ 54 02:57:52.015650
+ *****
+ ******
+ 1312:45
+  1312:45
+   1312:45
+ 1312:45:44
+ 1312:45:44
+  1312:45:44
+  1312:45:44
+  1312:45:44
+   1312:45:44
+ 1312:45:44.9
+ 1312:45:44.9
+ 1312:45:44.9
+    1312:45:44
+  1312:45:44.9
+ 1312:45:44.87
+ 1312:45:44.87
+ 1312:45:44.87
+     1312:45:44
+   1312:45:44.9
+  1312:45:44.87
+ 1312:45:44.865
+ 1312:45:44.865
+ 1312:45:44.865
+      1312:45:44
+    1312:45:44.9
+   1312:45:44.87
+  1312:45:44.865
+ 1312:45:44.8653
+ 1312:45:44.8653
+ 1312:45:44.8653
+ 54 16:45
+  54 16:45
+   54 16:45
+ 54 16:45:44
+  54 16:45:44
+   54 16:45:44
+ 54 16:45:44.9
+    54 16:45:44
+  54 16:45:44.9
+ 54 16:45:44.87
+     54 16:45:44
+   54 16:45:44.9
+  54 16:45:44.87
+ 54 16:45:44.865
+      54 16:45:44
+    54 16:45:44.9
+   54 16:45:44.87
+  54 16:45:44.865
+ 54 16:45:44.8653
+       54 16:45:44
+     54 16:45:44.9
+    54 16:45:44.87
+   54 16:45:44.865
+  54 16:45:44.8653
+ 54 16:45:44.86529
+        54 16:45:44
+      54 16:45:44.9
+     54 16:45:44.87
+    54 16:45:44.865
+   54 16:45:44.8653
+  54 16:45:44.86529
+ 54 16:45:44.865290
+ *****
+ ******
+ 1317:30
+  1317:30
+   1317:30
+ 1317:30:57
+ 1317:30:57
+  1317:30:57
+  1317:30:57
+  1317:30:57
+   1317:30:57
+ 1317:30:57.8
+ 1317:30:57.8
+ 1317:30:57.8
+    1317:30:57
+  1317:30:57.8
+ 1317:30:57.82
+ 1317:30:57.82
+ 1317:30:57.82
+     1317:30:57
+   1317:30:57.8
+  1317:30:57.82
+ 1317:30:57.820
+ 1317:30:57.820
+ 1317:30:57.820
+      1317:30:57
+    1317:30:57.8
+   1317:30:57.82
+  1317:30:57.820
+ 1317:30:57.8205
+ 1317:30:57.8205
+ 1317:30:57.8205
+ 54 21:30
+  54 21:30
+   54 21:30
+ 54 21:30:57
+  54 21:30:57
+   54 21:30:57
+ 54 21:30:57.8
+    54 21:30:57
+  54 21:30:57.8
+ 54 21:30:57.82
+     54 21:30:57
+   54 21:30:57.8
+  54 21:30:57.82
+ 54 21:30:57.820
+      54 21:30:57
+    54 21:30:57.8
+   54 21:30:57.82
+  54 21:30:57.820
+ 54 21:30:57.8205
+       54 21:30:57
+     54 21:30:57.8
+    54 21:30:57.82
+   54 21:30:57.820
+  54 21:30:57.8205
+ 54 21:30:57.82047
+        54 21:30:57
+      54 21:30:57.8
+     54 21:30:57.82
+    54 21:30:57.820
+   54 21:30:57.8205
+  54 21:30:57.82047
+ 54 21:30:57.820470
+ *****
+ ******
+ 1300:25
+  1300:25
+   1300:25
+ 1300:25:09
+ 1300:25:09
+  1300:25:09
+  1300:25:09
+  1300:25:09
+   1300:25:09
+ 1300:25:09.2
+ 1300:25:09.2
+ 1300:25:09.2
+    1300:25:09
+  1300:25:09.2
+ 1300:25:09.15
+ 1300:25:09.15
+ 1300:25:09.15
+     1300:25:09
+   1300:25:09.2
+  1300:25:09.15
+ 1300:25:09.154
+ 1300:25:09.154
+ 1300:25:09.154
+      1300:25:09
+    1300:25:09.2
+   1300:25:09.15
+  1300:25:09.154
+ 1300:25:09.1540
+ 1300:25:09.1540
+ 1300:25:09.1540
+ 54 04:25
+  54 04:25
+   54 04:25
+ 54 04:25:09
+  54 04:25:09
+   54 04:25:09
+ 54 04:25:09.2
+    54 04:25:09
+  54 04:25:09.2
+ 54 04:25:09.15
+     54 04:25:09
+   54 04:25:09.2
+  54 04:25:09.15
+ 54 04:25:09.154
+      54 04:25:09
+    54 04:25:09.2
+   54 04:25:09.15
+  54 04:25:09.154
+ 54 04:25:09.1540
+       54 04:25:09
+     54 04:25:09.2
+    54 04:25:09.15
+   54 04:25:09.154
+  54 04:25:09.1540
+ 54 04:25:09.15395
+        54 04:25:09
+      54 04:25:09.2
+     54 04:25:09.15
+    54 04:25:09.154
+   54 04:25:09.1540
+  54 04:25:09.15395
+ 54 04:25:09.153950
+ *****
+ ******
+ 1302:49
+  1302:49
+   1302:49
+ 1302:49:27
+ 1302:49:27
+  1302:49:27
+  1302:49:27
+  1302:49:27
+   1302:49:27
+ 1302:49:27.1
+ 1302:49:27.1
+ 1302:49:27.1
+    1302:49:27
+  1302:49:27.1
+ 1302:49:27.11
+ 1302:49:27.11
+ 1302:49:27.11
+     1302:49:27
+   1302:49:27.1
+  1302:49:27.11
+ 1302:49:27.105
+ 1302:49:27.105
+ 1302:49:27.105
+      1302:49:27
+    1302:49:27.1
+   1302:49:27.11
+  1302:49:27.105
+ 1302:49:27.1053
+ 1302:49:27.1053
+ 1302:49:27.1053
+ 54 06:49
+  54 06:49
+   54 06:49
+ 54 06:49:27
+  54 06:49:27
+   54 06:49:27
+ 54 06:49:27.1
+    54 06:49:27
+  54 06:49:27.1
+ 54 06:49:27.11
+     54 06:49:27
+   54 06:49:27.1
+  54 06:49:27.11
+ 54 06:49:27.105
+      54 06:49:27
+    54 06:49:27.1
+   54 06:49:27.11
+  54 06:49:27.105
+ 54 06:49:27.1053
+       54 06:49:27
+     54 06:49:27.1
+    54 06:49:27.11
+   54 06:49:27.105
+  54 06:49:27.1053
+ 54 06:49:27.10533
+        54 06:49:27
+      54 06:49:27.1
+     54 06:49:27.11
+    54 06:49:27.105
+   54 06:49:27.1053
+  54 06:49:27.10533
+ 54 06:49:27.105330
+ *****
+ ******
+ 1298:57
+  1298:57
+   1298:57
+ 1298:57:52
+ 1298:57:52
+  1298:57:52
+  1298:57:52
+  1298:57:52
+   1298:57:52
+ 1298:57:52.5
+ 1298:57:52.5
+ 1298:57:52.5
+    1298:57:52
+  1298:57:52.5
+ 1298:57:52.48
+ 1298:57:52.48
+ 1298:57:52.48
+     1298:57:52
+   1298:57:52.5
+  1298:57:52.48
+ 1298:57:52.482
+ 1298:57:52.482
+ 1298:57:52.482
+      1298:57:52
+    1298:57:52.5
+   1298:57:52.48
+  1298:57:52.482
+ 1298:57:52.4823
+ 1298:57:52.4823
+ 1298:57:52.4823
+ 54 02:57
+  54 02:57
+   54 02:57
+ 54 02:57:52
+  54 02:57:52
+   54 02:57:52
+ 54 02:57:52.5
+    54 02:57:52
+  54 02:57:52.5
+ 54 02:57:52.48
+     54 02:57:52
+   54 02:57:52.5
+  54 02:57:52.48
+ 54 02:57:52.482
+      54 02:57:52
+    54 02:57:52.5
+   54 02:57:52.48
+  54 02:57:52.482
+ 54 02:57:52.4823
+       54 02:57:52
+     54 02:57:52.5
+    54 02:57:52.48
+   54 02:57:52.482
+  54 02:57:52.4823
+ 54 02:57:52.48229
+        54 02:57:52
+      54 02:57:52.5
+     54 02:57:52.48
+    54 02:57:52.482
+   54 02:57:52.4823
+  54 02:57:52.48229
+ 54 02:57:52.482290
+ *****
+ ******
+ 1312:45
+  1312:45
+   1312:45
+ 1312:45:44
+ 1312:45:44
+  1312:45:44
+  1312:45:44
+  1312:45:44
+   1312:45:44
+ 1312:45:44.7
+ 1312:45:44.7
+ 1312:45:44.7
+    1312:45:44
+  1312:45:44.7
+ 1312:45:44.66
+ 1312:45:44.66
+ 1312:45:44.66
+     1312:45:44
+   1312:45:44.7
+  1312:45:44.66
+ 1312:45:44.658
+ 1312:45:44.658
+ 1312:45:44.658
+      1312:45:44
+    1312:45:44.7
+   1312:45:44.66
+  1312:45:44.658
+ 1312:45:44.6583
+ 1312:45:44.6583
+ 1312:45:44.6583
+ 54 16:45
+  54 16:45
+   54 16:45
+ 54 16:45:44
+  54 16:45:44
+   54 16:45:44
+ 54 16:45:44.7
+    54 16:45:44
+  54 16:45:44.7
+ 54 16:45:44.66
+     54 16:45:44
+   54 16:45:44.7
+  54 16:45:44.66
+ 54 16:45:44.658
+      54 16:45:44
+    54 16:45:44.7
+   54 16:45:44.66
+  54 16:45:44.658
+ 54 16:45:44.6583
+       54 16:45:44
+     54 16:45:44.7
+    54 16:45:44.66
+   54 16:45:44.658
+  54 16:45:44.6583
+ 54 16:45:44.65827
+        54 16:45:44
+      54 16:45:44.7
+     54 16:45:44.66
+    54 16:45:44.658
+   54 16:45:44.6583
+  54 16:45:44.65827
+ 54 16:45:44.658270
+ *****
+ ******
+ 1317:30
+  1317:30
+   1317:30
+ 1317:30:57
+ 1317:30:57
+  1317:30:57
+  1317:30:57
+  1317:30:57
+   1317:30:57
+ 1317:30:57.6
+ 1317:30:57.6
+ 1317:30:57.6
+    1317:30:57
+  1317:30:57.6
+ 1317:30:57.58
+ 1317:30:57.58
+ 1317:30:57.58
+     1317:30:57
+   1317:30:57.6
+  1317:30:57.58
+ 1317:30:57.582
+ 1317:30:57.582
+ 1317:30:57.582
+      1317:30:57
+    1317:30:57.6
+   1317:30:57.58
+  1317:30:57.582
+ 1317:30:57.5822
+ 1317:30:57.5822
+ 1317:30:57.5822
+ 54 21:30
+  54 21:30
+   54 21:30
+ 54 21:30:57
+  54 21:30:57
+   54 21:30:57
+ 54 21:30:57.6
+    54 21:30:57
+  54 21:30:57.6
+ 54 21:30:57.58
+     54 21:30:57
+   54 21:30:57.6
+  54 21:30:57.58
+ 54 21:30:57.582
+      54 21:30:57
+    54 21:30:57.6
+   54 21:30:57.58
+  54 21:30:57.582
+ 54 21:30:57.5822
+       54 21:30:57
+     54 21:30:57.6
+    54 21:30:57.58
+   54 21:30:57.582
+  54 21:30:57.5822
+ 54 21:30:57.58219
+        54 21:30:57
+      54 21:30:57.6
+     54 21:30:57.58
+    54 21:30:57.582
+   54 21:30:57.5822
+  54 21:30:57.58219
+ 54 21:30:57.582190
+ *****
+ ******
+ 1318:30
+  1318:30
+   1318:30
+ 1318:30:04
+ 1318:30:04
+  1318:30:04
+  1318:30:04
+  1318:30:04
+   1318:30:04
+ 1318:30:04.2
+ 1318:30:04.2
+ 1318:30:04.2
+    1318:30:04
+  1318:30:04.2
+ 1318:30:04.18
+ 1318:30:04.18
+ 1318:30:04.18
+     1318:30:04
+   1318:30:04.2
+  1318:30:04.18
+ 1318:30:04.183
+ 1318:30:04.183
+ 1318:30:04.183
+      1318:30:04
+    1318:30:04.2
+   1318:30:04.18
+  1318:30:04.183
+ 1318:30:04.1835
+ 1318:30:04.1835
+ 1318:30:04.1835
+ 54 22:30
+  54 22:30
+   54 22:30
+ 54 22:30:04
+  54 22:30:04
+   54 22:30:04
+ 54 22:30:04.2
+    54 22:30:04
+  54 22:30:04.2
+ 54 22:30:04.18
+     54 22:30:04
+   54 22:30:04.2
+  54 22:30:04.18
+ 54 22:30:04.183
+      54 22:30:04
+    54 22:30:04.2
+   54 22:30:04.18
+  54 22:30:04.183
+ 54 22:30:04.1835
+       54 22:30:04
+     54 22:30:04.2
+    54 22:30:04.18
+   54 22:30:04.183
+  54 22:30:04.1835
+ 54 22:30:04.18347
+        54 22:30:04
+      54 22:30:04.2
+     54 22:30:04.18
+    54 22:30:04.183
+   54 22:30:04.1835
+  54 22:30:04.18347
+ 54 22:30:04.183470
+ *****
+ ******
+ 1297:56
+  1297:56
+   1297:56
+ 1297:56:51
+ 1297:56:51
+  1297:56:51
+  1297:56:51
+  1297:56:51
+   1297:56:51
+ 1297:56:51.6
+ 1297:56:51.6
+ 1297:56:51.6
+    1297:56:51
+  1297:56:51.6
+ 1297:56:51.59
+ 1297:56:51.59
+ 1297:56:51.59
+     1297:56:51
+   1297:56:51.6
+  1297:56:51.59
+ 1297:56:51.593
+ 1297:56:51.593
+ 1297:56:51.593
+      1297:56:51
+    1297:56:51.6
+   1297:56:51.59
+  1297:56:51.593
+ 1297:56:51.5932
+ 1297:56:51.5932
+ 1297:56:51.5932
+ 54 01:56
+  54 01:56
+   54 01:56
+ 54 01:56:51
+  54 01:56:51
+   54 01:56:51
+ 54 01:56:51.6
+    54 01:56:51
+  54 01:56:51.6
+ 54 01:56:51.59
+     54 01:56:51
+   54 01:56:51.6
+  54 01:56:51.59
+ 54 01:56:51.593
+      54 01:56:51
+    54 01:56:51.6
+   54 01:56:51.59
+  54 01:56:51.593
+ 54 01:56:51.5932
+       54 01:56:51
+     54 01:56:51.6
+    54 01:56:51.59
+   54 01:56:51.593
+  54 01:56:51.5932
+ 54 01:56:51.59319
+        54 01:56:51
+      54 01:56:51.6
+     54 01:56:51.59
+    54 01:56:51.593
+   54 01:56:51.5932
+  54 01:56:51.59319
+ 54 01:56:51.593190
+ *****
+ ******
+ *******
+ 16344:00
+  16344:00
+   16344:00
+   16344:00
+ 16344:00:00
+ 16344:00:00
+ 16344:00:00
+  16344:00:00
+  16344:00:00
+  16344:00:00
+  16344:00:00
+   16344:00:00
+ 16344:00:00.0
+ 16344:00:00.0
+ 16344:00:00.0
+ 16344:00:00.0
+    16344:00:00
+  16344:00:00.0
+ 16344:00:00.00
+ 16344:00:00.00
+ 16344:00:00.00
+ 16344:00:00.00
+     16344:00:00
+   16344:00:00.0
+  16344:00:00.00
+ 16344:00:00.000
+ 16344:00:00.000
+ 16344:00:00.000
+ 16344:00:00.000
+ ********
+ 681 00:00
+  681 00:00
+   681 00:00
+ 681 00:00:00
+  681 00:00:00
+  681 00:00:00
+   681 00:00:00
+ 681 00:00:00.0
+ 681 00:00:00.0
+    681 00:00:00
+  681 00:00:00.0
+ 681 00:00:00.00
+ 681 00:00:00.00
+     681 00:00:00
+   681 00:00:00.0
+  681 00:00:00.00
+ 681 00:00:00.000
+ 681 00:00:00.000
+      681 00:00:00
+    681 00:00:00.0
+   681 00:00:00.00
+  681 00:00:00.000
+ 681 00:00:00.0000
+ 681 00:00:00.0000
+       681 00:00:00
+     681 00:00:00.0
+    681 00:00:00.00
+   681 00:00:00.000
+  681 00:00:00.0000
+ 681 00:00:00.00000
+ 681 00:00:00.00000
+ *****
+ ******
+ *******
+ 16348:50
+  16348:50
+   16348:50
+   16348:50
+ 16348:50:38
+ 16348:50:38
+ 16348:50:38
+  16348:50:38
+  16348:50:38
+  16348:50:38
+  16348:50:38
+   16348:50:38
+ 16348:50:38.1
+ 16348:50:38.1
+ 16348:50:38.1
+ 16348:50:38.1
+    16348:50:38
+  16348:50:38.1
+ 16348:50:38.12
+ 16348:50:38.12
+ 16348:50:38.12
+ 16348:50:38.12
+     16348:50:38
+   16348:50:38.1
+  16348:50:38.12
+ 16348:50:38.123
+ 16348:50:38.123
+ 16348:50:38.123
+ 16348:50:38.123
+ ********
+ 681 04:50
+  681 04:50
+   681 04:50
+ 681 04:50:38
+  681 04:50:38
+  681 04:50:38
+   681 04:50:38
+ 681 04:50:38.1
+ 681 04:50:38.1
+    681 04:50:38
+  681 04:50:38.1
+ 681 04:50:38.12
+ 681 04:50:38.12
+     681 04:50:38
+   681 04:50:38.1
+  681 04:50:38.12
+ 681 04:50:38.123
+ 681 04:50:38.123
+      681 04:50:38
+    681 04:50:38.1
+   681 04:50:38.12
+  681 04:50:38.123
+ 681 04:50:38.1230
+ 681 04:50:38.1230
+       681 04:50:38
+     681 04:50:38.1
+    681 04:50:38.12
+   681 04:50:38.123
+  681 04:50:38.1230
+ 681 04:50:38.12301
+ 681 04:50:38.12301
+ *****
+ ******
+ *******
+ 16356:31
+  16356:31
+   16356:31
+   16356:31
+ 16356:31:35
+ 16356:31:35
+ 16356:31:35
+  16356:31:35
+  16356:31:35
+  16356:31:35
+  16356:31:35
+   16356:31:35
+ 16356:31:35.2
+ 16356:31:35.2
+ 16356:31:35.2
+ 16356:31:35.2
+    16356:31:35
+  16356:31:35.2
+ 16356:31:35.23
+ 16356:31:35.23
+ 16356:31:35.23
+ 16356:31:35.23
+     16356:31:35
+   16356:31:35.2
+  16356:31:35.23
+ 16356:31:35.235
+ 16356:31:35.235
+ 16356:31:35.235
+ 16356:31:35.235
+ ********
+ 681 12:31
+  681 12:31
+   681 12:31
+ 681 12:31:35
+  681 12:31:35
+  681 12:31:35
+   681 12:31:35
+ 681 12:31:35.2
+ 681 12:31:35.2
+    681 12:31:35
+  681 12:31:35.2
+ 681 12:31:35.23
+ 681 12:31:35.23
+     681 12:31:35
+   681 12:31:35.2
+  681 12:31:35.23
+ 681 12:31:35.235
+ 681 12:31:35.235
+      681 12:31:35
+    681 12:31:35.2
+   681 12:31:35.23
+  681 12:31:35.235
+ 681 12:31:35.2345
+ 681 12:31:35.2345
+       681 12:31:35
+     681 12:31:35.2
+    681 12:31:35.23
+   681 12:31:35.235
+  681 12:31:35.2345
+ 681 12:31:35.23453
+ 681 12:31:35.23453
+ *****
+ ******
+ *******
+ 16356:47
+  16356:47
+   16356:47
+   16356:47
+ 16356:47:53
+ 16356:47:53
+ 16356:47:53
+  16356:47:53
+  16356:47:53
+  16356:47:53
+  16356:47:53
+   16356:47:53
+ 16356:47:53.3
+ 16356:47:53.3
+ 16356:47:53.3
+ 16356:47:53.3
+    16356:47:53
+  16356:47:53.3
+ 16356:47:53.35
+ 16356:47:53.35
+ 16356:47:53.35
+ 16356:47:53.35
+     16356:47:53
+   16356:47:53.3
+  16356:47:53.35
+ 16356:47:53.345
+ 16356:47:53.345
+ 16356:47:53.345
+ 16356:47:53.345
+ ********
+ 681 12:47
+  681 12:47
+   681 12:47
+ 681 12:47:53
+  681 12:47:53
+  681 12:47:53
+   681 12:47:53
+ 681 12:47:53.3
+ 681 12:47:53.3
+    681 12:47:53
+  681 12:47:53.3
+ 681 12:47:53.35
+ 681 12:47:53.35
+     681 12:47:53
+   681 12:47:53.3
+  681 12:47:53.35
+ 681 12:47:53.345
+ 681 12:47:53.345
+      681 12:47:53
+    681 12:47:53.3
+   681 12:47:53.35
+  681 12:47:53.345
+ 681 12:47:53.3450
+ 681 12:47:53.3450
+       681 12:47:53
+     681 12:47:53.3
+    681 12:47:53.35
+   681 12:47:53.345
+  681 12:47:53.3450
+ 681 12:47:53.34505
+ 681 12:47:53.34505
+ *****
+ ******
+ *******
+ 16345:26
+  16345:26
+   16345:26
+   16345:26
+ 16345:26:00
+ 16345:26:00
+ 16345:26:00
+  16345:26:00
+  16345:26:00
+  16345:26:00
+  16345:26:00
+   16345:26:00
+ 16345:26:00.5
+ 16345:26:00.5
+ 16345:26:00.5
+ 16345:26:00.5
+    16345:26:00
+  16345:26:00.5
+ 16345:26:00.46
+ 16345:26:00.46
+ 16345:26:00.46
+ 16345:26:00.46
+     16345:26:00
+   16345:26:00.5
+  16345:26:00.46
+ 16345:26:00.456
+ 16345:26:00.456
+ 16345:26:00.456
+ 16345:26:00.456
+ ********
+ 681 01:26
+  681 01:26
+   681 01:26
+ 681 01:26:00
+  681 01:26:00
+  681 01:26:00
+   681 01:26:00
+ 681 01:26:00.5
+ 681 01:26:00.5
+    681 01:26:00
+  681 01:26:00.5
+ 681 01:26:00.46
+ 681 01:26:00.46
+     681 01:26:00
+   681 01:26:00.5
+  681 01:26:00.46
+ 681 01:26:00.456
+ 681 01:26:00.456
+      681 01:26:00
+    681 01:26:00.5
+   681 01:26:00.46
+  681 01:26:00.456
+ 681 01:26:00.4562
+ 681 01:26:00.4562
+       681 01:26:00
+     681 01:26:00.5
+    681 01:26:00.46
+   681 01:26:00.456
+  681 01:26:00.4562
+ 681 01:26:00.45615
+ 681 01:26:00.45615
+ *****
+ ******
+ *******
+ 16364:58
+  16364:58
+   16364:58
+   16364:58
+ 16364:58:11
+ 16364:58:11
+ 16364:58:11
+  16364:58:11
+  16364:58:11
+  16364:58:11
+  16364:58:11
+   16364:58:11
+ 16364:58:11.6
+ 16364:58:11.6
+ 16364:58:11.6
+ 16364:58:11.6
+    16364:58:11
+  16364:58:11.6
+ 16364:58:11.57
+ 16364:58:11.57
+ 16364:58:11.57
+ 16364:58:11.57
+     16364:58:11
+   16364:58:11.6
+  16364:58:11.57
+ 16364:58:11.567
+ 16364:58:11.567
+ 16364:58:11.567
+ 16364:58:11.567
+ ********
+ 681 20:58
+  681 20:58
+   681 20:58
+ 681 20:58:11
+  681 20:58:11
+  681 20:58:11
+   681 20:58:11
+ 681 20:58:11.6
+ 681 20:58:11.6
+    681 20:58:11
+  681 20:58:11.6
+ 681 20:58:11.57
+ 681 20:58:11.57
+     681 20:58:11
+   681 20:58:11.6
+  681 20:58:11.57
+ 681 20:58:11.567
+ 681 20:58:11.567
+      681 20:58:11
+    681 20:58:11.6
+   681 20:58:11.57
+  681 20:58:11.567
+ 681 20:58:11.5668
+ 681 20:58:11.5668
+       681 20:58:11
+     681 20:58:11.6
+    681 20:58:11.57
+   681 20:58:11.567
+  681 20:58:11.5668
+ 681 20:58:11.56677
+ 681 20:58:11.56677
+ *****
+ ******
+ *******
+ 16351:36
+  16351:36
+   16351:36
+   16351:36
+ 16351:36:05
+ 16351:36:05
+ 16351:36:05
+  16351:36:05
+  16351:36:05
+  16351:36:05
+  16351:36:05
+   16351:36:05
+ 16351:36:05.2
+ 16351:36:05.2
+ 16351:36:05.2
+ 16351:36:05.2
+    16351:36:05
+  16351:36:05.2
+ 16351:36:05.19
+ 16351:36:05.19
+ 16351:36:05.19
+ 16351:36:05.19
+     16351:36:05
+   16351:36:05.2
+  16351:36:05.19
+ 16351:36:05.190
+ 16351:36:05.190
+ 16351:36:05.190
+ 16351:36:05.190
+ ********
+ 681 07:36
+  681 07:36
+   681 07:36
+ 681 07:36:05
+  681 07:36:05
+  681 07:36:05
+   681 07:36:05
+ 681 07:36:05.2
+ 681 07:36:05.2
+    681 07:36:05
+  681 07:36:05.2
+ 681 07:36:05.19
+ 681 07:36:05.19
+     681 07:36:05
+   681 07:36:05.2
+  681 07:36:05.19
+ 681 07:36:05.190
+ 681 07:36:05.190
+      681 07:36:05
+    681 07:36:05.2
+   681 07:36:05.19
+  681 07:36:05.190
+ 681 07:36:05.1896
+ 681 07:36:05.1896
+       681 07:36:05
+     681 07:36:05.2
+    681 07:36:05.19
+   681 07:36:05.190
+  681 07:36:05.1896
+ 681 07:36:05.18964
+ 681 07:36:05.18964
+ *****
+ ******
+ *******
+ 16359:43
+  16359:43
+   16359:43
+   16359:43
+ 16359:43:49
+ 16359:43:49
+ 16359:43:49
+  16359:43:49
+  16359:43:49
+  16359:43:49
+  16359:43:49
+   16359:43:49
+ 16359:43:49.8
+ 16359:43:49.8
+ 16359:43:49.8
+ 16359:43:49.8
+    16359:43:49
+  16359:43:49.8
+ 16359:43:49.83
+ 16359:43:49.83
+ 16359:43:49.83
+ 16359:43:49.83
+     16359:43:49
+   16359:43:49.8
+  16359:43:49.83
+ 16359:43:49.831
+ 16359:43:49.831
+ 16359:43:49.831
+ 16359:43:49.831
+ ********
+ 681 15:43
+  681 15:43
+   681 15:43
+ 681 15:43:49
+  681 15:43:49
+  681 15:43:49
+   681 15:43:49
+ 681 15:43:49.8
+ 681 15:43:49.8
+    681 15:43:49
+  681 15:43:49.8
+ 681 15:43:49.83
+ 681 15:43:49.83
+     681 15:43:49
+   681 15:43:49.8
+  681 15:43:49.83
+ 681 15:43:49.831
+ 681 15:43:49.831
+      681 15:43:49
+    681 15:43:49.8
+   681 15:43:49.83
+  681 15:43:49.831
+ 681 15:43:49.8313
+ 681 15:43:49.8313
+       681 15:43:49
+     681 15:43:49.8
+    681 15:43:49.83
+   681 15:43:49.831
+  681 15:43:49.8313
+ 681 15:43:49.83132
+ 681 15:43:49.83132
+ *****
+ ******
+ *******
+ 16348:25
+  16348:25
+   16348:25
+   16348:25
+ 16348:25:09
+ 16348:25:09
+ 16348:25:09
+  16348:25:09
+  16348:25:09
+  16348:25:09
+  16348:25:09
+   16348:25:09
+ 16348:25:09.0
+ 16348:25:09.0
+ 16348:25:09.0
+ 16348:25:09.0
+    16348:25:09
+  16348:25:09.0
+ 16348:25:09.01
+ 16348:25:09.01
+ 16348:25:09.01
+ 16348:25:09.01
+     16348:25:09
+   16348:25:09.0
+  16348:25:09.01
+ 16348:25:09.013
+ 16348:25:09.013
+ 16348:25:09.013
+ 16348:25:09.013
+ ********
+ 681 04:25
+  681 04:25
+   681 04:25
+ 681 04:25:09
+  681 04:25:09
+  681 04:25:09
+   681 04:25:09
+ 681 04:25:09.0
+ 681 04:25:09.0
+    681 04:25:09
+  681 04:25:09.0
+ 681 04:25:09.01
+ 681 04:25:09.01
+     681 04:25:09
+   681 04:25:09.0
+  681 04:25:09.01
+ 681 04:25:09.013
+ 681 04:25:09.013
+      681 04:25:09
+    681 04:25:09.0
+   681 04:25:09.01
+  681 04:25:09.013
+ 681 04:25:09.0129
+ 681 04:25:09.0129
+       681 04:25:09
+     681 04:25:09.0
+    681 04:25:09.01
+   681 04:25:09.013
+  681 04:25:09.0129
+ 681 04:25:09.01293
+ 681 04:25:09.01293
+ *****
+ ******
+ *******
+ 16350:49
+  16350:49
+   16350:49
+   16350:49
+ 16350:49:27
+ 16350:49:27
+ 16350:49:27
+  16350:49:27
+  16350:49:27
+  16350:49:27
+  16350:49:27
+   16350:49:27
+ 16350:49:27.5
+ 16350:49:27.5
+ 16350:49:27.5
+ 16350:49:27.5
+    16350:49:27
+  16350:49:27.5
+ 16350:49:27.52
+ 16350:49:27.52
+ 16350:49:27.52
+ 16350:49:27.52
+     16350:49:27
+   16350:49:27.5
+  16350:49:27.52
+ 16350:49:27.524
+ 16350:49:27.524
+ 16350:49:27.524
+ 16350:49:27.524
+ ********
+ 681 06:49
+  681 06:49
+   681 06:49
+ 681 06:49:27
+  681 06:49:27
+  681 06:49:27
+   681 06:49:27
+ 681 06:49:27.5
+ 681 06:49:27.5
+    681 06:49:27
+  681 06:49:27.5
+ 681 06:49:27.52
+ 681 06:49:27.52
+     681 06:49:27
+   681 06:49:27.5
+  681 06:49:27.52
+ 681 06:49:27.524
+ 681 06:49:27.524
+      681 06:49:27
+    681 06:49:27.5
+   681 06:49:27.52
+  681 06:49:27.524
+ 681 06:49:27.5237
+ 681 06:49:27.5237
+       681 06:49:27
+     681 06:49:27.5
+    681 06:49:27.52
+   681 06:49:27.524
+  681 06:49:27.5237
+ 681 06:49:27.52375
+ 681 06:49:27.52375
+ *****
+ ******
+ *******
+ 16346:57
+  16346:57
+   16346:57
+   16346:57
+ 16346:57:52
+ 16346:57:52
+ 16346:57:52
+  16346:57:52
+  16346:57:52
+  16346:57:52
+  16346:57:52
+   16346:57:52
+ 16346:57:52.0
+ 16346:57:52.0
+ 16346:57:52.0
+ 16346:57:52.0
+    16346:57:52
+  16346:57:52.0
+ 16346:57:52.02
+ 16346:57:52.02
+ 16346:57:52.02
+ 16346:57:52.02
+     16346:57:52
+   16346:57:52.0
+  16346:57:52.02
+ 16346:57:52.016
+ 16346:57:52.016
+ 16346:57:52.016
+ 16346:57:52.016
+ ********
+ 681 02:57
+  681 02:57
+   681 02:57
+ 681 02:57:52
+  681 02:57:52
+  681 02:57:52
+   681 02:57:52
+ 681 02:57:52.0
+ 681 02:57:52.0
+    681 02:57:52
+  681 02:57:52.0
+ 681 02:57:52.02
+ 681 02:57:52.02
+     681 02:57:52
+   681 02:57:52.0
+  681 02:57:52.02
+ 681 02:57:52.016
+ 681 02:57:52.016
+      681 02:57:52
+    681 02:57:52.0
+   681 02:57:52.02
+  681 02:57:52.016
+ 681 02:57:52.0156
+ 681 02:57:52.0156
+       681 02:57:52
+     681 02:57:52.0
+    681 02:57:52.02
+   681 02:57:52.016
+  681 02:57:52.0156
+ 681 02:57:52.01565
+ 681 02:57:52.01565
+ *****
+ ******
+ *******
+ 16360:45
+  16360:45
+   16360:45
+   16360:45
+ 16360:45:44
+ 16360:45:44
+ 16360:45:44
+  16360:45:44
+  16360:45:44
+  16360:45:44
+  16360:45:44
+   16360:45:44
+ 16360:45:44.9
+ 16360:45:44.9
+ 16360:45:44.9
+ 16360:45:44.9
+    16360:45:44
+  16360:45:44.9
+ 16360:45:44.87
+ 16360:45:44.87
+ 16360:45:44.87
+ 16360:45:44.87
+     16360:45:44
+   16360:45:44.9
+  16360:45:44.87
+ 16360:45:44.865
+ 16360:45:44.865
+ 16360:45:44.865
+ 16360:45:44.865
+ ********
+ 681 16:45
+  681 16:45
+   681 16:45
+ 681 16:45:44
+  681 16:45:44
+  681 16:45:44
+   681 16:45:44
+ 681 16:45:44.9
+ 681 16:45:44.9
+    681 16:45:44
+  681 16:45:44.9
+ 681 16:45:44.87
+ 681 16:45:44.87
+     681 16:45:44
+   681 16:45:44.9
+  681 16:45:44.87
+ 681 16:45:44.865
+ 681 16:45:44.865
+      681 16:45:44
+    681 16:45:44.9
+   681 16:45:44.87
+  681 16:45:44.865
+ 681 16:45:44.8653
+ 681 16:45:44.8653
+       681 16:45:44
+     681 16:45:44.9
+    681 16:45:44.87
+   681 16:45:44.865
+  681 16:45:44.8653
+ 681 16:45:44.86529
+ 681 16:45:44.86529
+ *****
+ ******
+ *******
+ 16365:30
+  16365:30
+   16365:30
+   16365:30
+ 16365:30:57
+ 16365:30:57
+ 16365:30:57
+  16365:30:57
+  16365:30:57
+  16365:30:57
+  16365:30:57
+   16365:30:57
+ 16365:30:57.8
+ 16365:30:57.8
+ 16365:30:57.8
+ 16365:30:57.8
+    16365:30:57
+  16365:30:57.8
+ 16365:30:57.82
+ 16365:30:57.82
+ 16365:30:57.82
+ 16365:30:57.82
+     16365:30:57
+   16365:30:57.8
+  16365:30:57.82
+ 16365:30:57.820
+ 16365:30:57.820
+ 16365:30:57.820
+ 16365:30:57.820
+ ********
+ 681 21:30
+  681 21:30
+   681 21:30
+ 681 21:30:57
+  681 21:30:57
+  681 21:30:57
+   681 21:30:57
+ 681 21:30:57.8
+ 681 21:30:57.8
+    681 21:30:57
+  681 21:30:57.8
+ 681 21:30:57.82
+ 681 21:30:57.82
+     681 21:30:57
+   681 21:30:57.8
+  681 21:30:57.82
+ 681 21:30:57.820
+ 681 21:30:57.820
+      681 21:30:57
+    681 21:30:57.8
+   681 21:30:57.82
+  681 21:30:57.820
+ 681 21:30:57.8205
+ 681 21:30:57.8205
+       681 21:30:57
+     681 21:30:57.8
+    681 21:30:57.82
+   681 21:30:57.820
+  681 21:30:57.8205
+ 681 21:30:57.82047
+ 681 21:30:57.82047
+ *****
+ ******
+ *******
+ 16348:25
+  16348:25
+   16348:25
+   16348:25
+ 16348:25:09
+ 16348:25:09
+ 16348:25:09
+  16348:25:09
+  16348:25:09
+  16348:25:09
+  16348:25:09
+   16348:25:09
+ 16348:25:09.2
+ 16348:25:09.2
+ 16348:25:09.2
+ 16348:25:09.2
+    16348:25:09
+  16348:25:09.2
+ 16348:25:09.15
+ 16348:25:09.15
+ 16348:25:09.15
+ 16348:25:09.15
+     16348:25:09
+   16348:25:09.2
+  16348:25:09.15
+ 16348:25:09.154
+ 16348:25:09.154
+ 16348:25:09.154
+ 16348:25:09.154
+ ********
+ 681 04:25
+  681 04:25
+   681 04:25
+ 681 04:25:09
+  681 04:25:09
+  681 04:25:09
+   681 04:25:09
+ 681 04:25:09.2
+ 681 04:25:09.2
+    681 04:25:09
+  681 04:25:09.2
+ 681 04:25:09.15
+ 681 04:25:09.15
+     681 04:25:09
+   681 04:25:09.2
+  681 04:25:09.15
+ 681 04:25:09.154
+ 681 04:25:09.154
+      681 04:25:09
+    681 04:25:09.2
+   681 04:25:09.15
+  681 04:25:09.154
+ 681 04:25:09.1539
+ 681 04:25:09.1539
+       681 04:25:09
+     681 04:25:09.2
+    681 04:25:09.15
+   681 04:25:09.154
+  681 04:25:09.1539
+ 681 04:25:09.15395
+ 681 04:25:09.15395
+ *****
+ ******
+ *******
+ 16350:49
+  16350:49
+   16350:49
+   16350:49
+ 16350:49:27
+ 16350:49:27
+ 16350:49:27
+  16350:49:27
+  16350:49:27
+  16350:49:27
+  16350:49:27
+   16350:49:27
+ 16350:49:27.1
+ 16350:49:27.1
+ 16350:49:27.1
+ 16350:49:27.1
+    16350:49:27
+  16350:49:27.1
+ 16350:49:27.11
+ 16350:49:27.11
+ 16350:49:27.11
+ 16350:49:27.11
+     16350:49:27
+   16350:49:27.1
+  16350:49:27.11
+ 16350:49:27.105
+ 16350:49:27.105
+ 16350:49:27.105
+ 16350:49:27.105
+ ********
+ 681 06:49
+  681 06:49
+   681 06:49
+ 681 06:49:27
+  681 06:49:27
+  681 06:49:27
+   681 06:49:27
+ 681 06:49:27.1
+ 681 06:49:27.1
+    681 06:49:27
+  681 06:49:27.1
+ 681 06:49:27.11
+ 681 06:49:27.11
+     681 06:49:27
+   681 06:49:27.1
+  681 06:49:27.11
+ 681 06:49:27.105
+ 681 06:49:27.105
+      681 06:49:27
+    681 06:49:27.1
+   681 06:49:27.11
+  681 06:49:27.105
+ 681 06:49:27.1053
+ 681 06:49:27.1053
+       681 06:49:27
+     681 06:49:27.1
+    681 06:49:27.11
+   681 06:49:27.105
+  681 06:49:27.1053
+ 681 06:49:27.10533
+ 681 06:49:27.10533
+ *****
+ ******
+ *******
+ 16346:57
+  16346:57
+   16346:57
+   16346:57
+ 16346:57:52
+ 16346:57:52
+ 16346:57:52
+  16346:57:52
+  16346:57:52
+  16346:57:52
+  16346:57:52
+   16346:57:52
+ 16346:57:52.5
+ 16346:57:52.5
+ 16346:57:52.5
+ 16346:57:52.5
+    16346:57:52
+  16346:57:52.5
+ 16346:57:52.48
+ 16346:57:52.48
+ 16346:57:52.48
+ 16346:57:52.48
+     16346:57:52
+   16346:57:52.5
+  16346:57:52.48
+ 16346:57:52.482
+ 16346:57:52.482
+ 16346:57:52.482
+ 16346:57:52.482
+ ********
+ 681 02:57
+  681 02:57
+   681 02:57
+ 681 02:57:52
+  681 02:57:52
+  681 02:57:52
+   681 02:57:52
+ 681 02:57:52.5
+ 681 02:57:52.5
+    681 02:57:52
+  681 02:57:52.5
+ 681 02:57:52.48
+ 681 02:57:52.48
+     681 02:57:52
+   681 02:57:52.5
+  681 02:57:52.48
+ 681 02:57:52.482
+ 681 02:57:52.482
+      681 02:57:52
+    681 02:57:52.5
+   681 02:57:52.48
+  681 02:57:52.482
+ 681 02:57:52.4823
+ 681 02:57:52.4823
+       681 02:57:52
+     681 02:57:52.5
+    681 02:57:52.48
+   681 02:57:52.482
+  681 02:57:52.4823
+ 681 02:57:52.48229
+ 681 02:57:52.48229
+ *****
+ ******
+ *******
+ 16360:45
+  16360:45
+   16360:45
+   16360:45
+ 16360:45:44
+ 16360:45:44
+ 16360:45:44
+  16360:45:44
+  16360:45:44
+  16360:45:44
+  16360:45:44
+   16360:45:44
+ 16360:45:44.7
+ 16360:45:44.7
+ 16360:45:44.7
+ 16360:45:44.7
+    16360:45:44
+  16360:45:44.7
+ 16360:45:44.66
+ 16360:45:44.66
+ 16360:45:44.66
+ 16360:45:44.66
+     16360:45:44
+   16360:45:44.7
+  16360:45:44.66
+ 16360:45:44.658
+ 16360:45:44.658
+ 16360:45:44.658
+ 16360:45:44.658
+ ********
+ 681 16:45
+  681 16:45
+   681 16:45
+ 681 16:45:44
+  681 16:45:44
+  681 16:45:44
+   681 16:45:44
+ 681 16:45:44.7
+ 681 16:45:44.7
+    681 16:45:44
+  681 16:45:44.7
+ 681 16:45:44.66
+ 681 16:45:44.66
+     681 16:45:44
+   681 16:45:44.7
+  681 16:45:44.66
+ 681 16:45:44.658
+ 681 16:45:44.658
+      681 16:45:44
+    681 16:45:44.7
+   681 16:45:44.66
+  681 16:45:44.658
+ 681 16:45:44.6583
+ 681 16:45:44.6583
+       681 16:45:44
+     681 16:45:44.7
+    681 16:45:44.66
+   681 16:45:44.658
+  681 16:45:44.6583
+ 681 16:45:44.65827
+ 681 16:45:44.65827
+ *****
+ ******
+ *******
+ 16365:30
+  16365:30
+   16365:30
+   16365:30
+ 16365:30:57
+ 16365:30:57
+ 16365:30:57
+  16365:30:57
+  16365:30:57
+  16365:30:57
+  16365:30:57
+   16365:30:57
+ 16365:30:57.6
+ 16365:30:57.6
+ 16365:30:57.6
+ 16365:30:57.6
+    16365:30:57
+  16365:30:57.6
+ 16365:30:57.58
+ 16365:30:57.58
+ 16365:30:57.58
+ 16365:30:57.58
+     16365:30:57
+   16365:30:57.6
+  16365:30:57.58
+ 16365:30:57.582
+ 16365:30:57.582
+ 16365:30:57.582
+ 16365:30:57.582
+ ********
+ 681 21:30
+  681 21:30
+   681 21:30
+ 681 21:30:57
+  681 21:30:57
+  681 21:30:57
+   681 21:30:57
+ 681 21:30:57.6
+ 681 21:30:57.6
+    681 21:30:57
+  681 21:30:57.6
+ 681 21:30:57.58
+ 681 21:30:57.58
+     681 21:30:57
+   681 21:30:57.6
+  681 21:30:57.58
+ 681 21:30:57.582
+ 681 21:30:57.582
+      681 21:30:57
+    681 21:30:57.6
+   681 21:30:57.58
+  681 21:30:57.582
+ 681 21:30:57.5822
+ 681 21:30:57.5822
+       681 21:30:57
+     681 21:30:57.6
+    681 21:30:57.58
+   681 21:30:57.582
+  681 21:30:57.5822
+ 681 21:30:57.58219
+ 681 21:30:57.58219
+ *****
+ ******
+ *******
+ 16366:30
+  16366:30
+   16366:30
+   16366:30
+ 16366:30:04
+ 16366:30:04
+ 16366:30:04
+  16366:30:04
+  16366:30:04
+  16366:30:04
+  16366:30:04
+   16366:30:04
+ 16366:30:04.2
+ 16366:30:04.2
+ 16366:30:04.2
+ 16366:30:04.2
+    16366:30:04
+  16366:30:04.2
+ 16366:30:04.18
+ 16366:30:04.18
+ 16366:30:04.18
+ 16366:30:04.18
+     16366:30:04
+   16366:30:04.2
+  16366:30:04.18
+ 16366:30:04.183
+ 16366:30:04.183
+ 16366:30:04.183
+ 16366:30:04.183
+ ********
+ 681 22:30
+  681 22:30
+   681 22:30
+ 681 22:30:04
+  681 22:30:04
+  681 22:30:04
+   681 22:30:04
+ 681 22:30:04.2
+ 681 22:30:04.2
+    681 22:30:04
+  681 22:30:04.2
+ 681 22:30:04.18
+ 681 22:30:04.18
+     681 22:30:04
+   681 22:30:04.2
+  681 22:30:04.18
+ 681 22:30:04.183
+ 681 22:30:04.183
+      681 22:30:04
+    681 22:30:04.2
+   681 22:30:04.18
+  681 22:30:04.183
+ 681 22:30:04.1835
+ 681 22:30:04.1835
+       681 22:30:04
+     681 22:30:04.2
+    681 22:30:04.18
+   681 22:30:04.183
+  681 22:30:04.1835
+ 681 22:30:04.18347
+ 681 22:30:04.18347
+ *****
+ ******
+ *******
+ 16345:56
+  16345:56
+   16345:56
+   16345:56
+ 16345:56:51
+ 16345:56:51
+ 16345:56:51
+  16345:56:51
+  16345:56:51
+  16345:56:51
+  16345:56:51
+   16345:56:51
+ 16345:56:51.6
+ 16345:56:51.6
+ 16345:56:51.6
+ 16345:56:51.6
+    16345:56:51
+  16345:56:51.6
+ 16345:56:51.59
+ 16345:56:51.59
+ 16345:56:51.59
+ 16345:56:51.59
+     16345:56:51
+   16345:56:51.6
+  16345:56:51.59
+ 16345:56:51.593
+ 16345:56:51.593
+ 16345:56:51.593
+ 16345:56:51.593
+ ********
+ 681 01:56
+  681 01:56
+   681 01:56
+ 681 01:56:51
+  681 01:56:51
+  681 01:56:51
+   681 01:56:51
+ 681 01:56:51.6
+ 681 01:56:51.6
+    681 01:56:51
+  681 01:56:51.6
+ 681 01:56:51.59
+ 681 01:56:51.59
+     681 01:56:51
+   681 01:56:51.6
+  681 01:56:51.59
+ 681 01:56:51.593
+ 681 01:56:51.593
+      681 01:56:51
+    681 01:56:51.6
+   681 01:56:51.59
+  681 01:56:51.593
+ 681 01:56:51.5932
+ 681 01:56:51.5932
+       681 01:56:51
+     681 01:56:51.6
+    681 01:56:51.59
+   681 01:56:51.593
+  681 01:56:51.5932
+ 681 01:56:51.59319
+ 681 01:56:51.59319
+  0:00
+   0:00
+ 0:00:00
+  0:00:00
+   0:00:00
+    0:00:00
+  0:00:00.0
+     0:00:00
+   0:00:00.0
+  0:00:00.00
+      0:00:00
+    0:00:00.0
+   0:00:00.00
+  0:00:00.000
+       0:00:00
+     0:00:00.0
+    0:00:00.00
+   0:00:00.000
+  0:00:00.0000
+        0:00:00
+      0:00:00.0
+     0:00:00.00
+    0:00:00.000
+   0:00:00.0000
+  0:00:00.00000
+         0:00:00
+       0:00:00.0
+      0:00:00.00
+     0:00:00.000
+    0:00:00.0000
+   0:00:00.00000
+  0:00:00.000000
+  0 00:00
+   0 00:00
+ 0 00:00:00
+  0 00:00:00
+   0 00:00:00
+    0 00:00:00
+  0 00:00:00.0
+     0 00:00:00
+   0 00:00:00.0
+  0 00:00:00.00
+      0 00:00:00
+    0 00:00:00.0
+   0 00:00:00.00
+  0 00:00:00.000
+       0 00:00:00
+     0 00:00:00.0
+    0 00:00:00.00
+   0 00:00:00.000
+  0 00:00:00.0000
+        0 00:00:00
+      0 00:00:00.0
+     0 00:00:00.00
+    0 00:00:00.000
+   0 00:00:00.0000
+  0 00:00:00.00000
+         0 00:00:00
+       0 00:00:00.0
+      0 00:00:00.00
+     0 00:00:00.000
+    0 00:00:00.0000
+   0 00:00:00.00000
+  0 00:00:00.000000
+ -4:50
+  -4:50
+   -4:50
+ -4:50:38
+  -4:50:38
+   -4:50:38
+ -4:50:38.1
+    -4:50:38
+  -4:50:38.1
+ -4:50:38.12
+     -4:50:38
+   -4:50:38.1
+  -4:50:38.12
+ -4:50:38.123
+      -4:50:38
+    -4:50:38.1
+   -4:50:38.12
+  -4:50:38.123
+ -4:50:38.1230
+       -4:50:38
+     -4:50:38.1
+    -4:50:38.12
+   -4:50:38.123
+  -4:50:38.1230
+ -4:50:38.12301
+        -4:50:38
+      -4:50:38.1
+     -4:50:38.12
+    -4:50:38.123
+   -4:50:38.1230
+  -4:50:38.12301
+ -4:50:38.123010
+ -0 04:50
+  -0 04:50
+   -0 04:50
+ -0 04:50:38
+  -0 04:50:38
+   -0 04:50:38
+ -0 04:50:38.1
+    -0 04:50:38
+  -0 04:50:38.1
+ -0 04:50:38.12
+     -0 04:50:38
+   -0 04:50:38.1
+  -0 04:50:38.12
+ -0 04:50:38.123
+      -0 04:50:38
+    -0 04:50:38.1
+   -0 04:50:38.12
+  -0 04:50:38.123
+ -0 04:50:38.1230
+       -0 04:50:38
+     -0 04:50:38.1
+    -0 04:50:38.12
+   -0 04:50:38.123
+  -0 04:50:38.1230
+ -0 04:50:38.12301
+        -0 04:50:38
+      -0 04:50:38.1
+     -0 04:50:38.12
+    -0 04:50:38.123
+   -0 04:50:38.1230
+  -0 04:50:38.12301
+ -0 04:50:38.123010
+ *****
+ -12:31
+  -12:31
+   -12:31
+ -12:31:35
+  -12:31:35
+  -12:31:35
+   -12:31:35
+ -12:31:35.2
+ -12:31:35.2
+    -12:31:35
+  -12:31:35.2
+ -12:31:35.23
+ -12:31:35.23
+     -12:31:35
+   -12:31:35.2
+  -12:31:35.23
+ -12:31:35.235
+ -12:31:35.235
+      -12:31:35
+    -12:31:35.2
+   -12:31:35.23
+  -12:31:35.235
+ -12:31:35.2345
+ -12:31:35.2345
+       -12:31:35
+     -12:31:35.2
+    -12:31:35.23
+   -12:31:35.235
+  -12:31:35.2345
+ -12:31:35.23453
+ -12:31:35.23453
+ -0 12:31
+  -0 12:31
+   -0 12:31
+ -0 12:31:35
+  -0 12:31:35
+   -0 12:31:35
+ -0 12:31:35.2
+    -0 12:31:35
+  -0 12:31:35.2
+ -0 12:31:35.23
+     -0 12:31:35
+   -0 12:31:35.2
+  -0 12:31:35.23
+ -0 12:31:35.235
+      -0 12:31:35
+    -0 12:31:35.2
+   -0 12:31:35.23
+  -0 12:31:35.235
+ -0 12:31:35.2345
+       -0 12:31:35
+     -0 12:31:35.2
+    -0 12:31:35.23
+   -0 12:31:35.235
+  -0 12:31:35.2345
+ -0 12:31:35.23453
+        -0 12:31:35
+      -0 12:31:35.2
+     -0 12:31:35.23
+    -0 12:31:35.235
+   -0 12:31:35.2345
+  -0 12:31:35.23453
+ -0 12:31:35.234530
+ *****
+ -12:47
+  -12:47
+   -12:47
+ -12:47:53
+  -12:47:53
+  -12:47:53
+   -12:47:53
+ -12:47:53.3
+ -12:47:53.3
+    -12:47:53
+  -12:47:53.3
+ -12:47:53.35
+ -12:47:53.35
+     -12:47:53
+   -12:47:53.3
+  -12:47:53.35
+ -12:47:53.345
+ -12:47:53.345
+      -12:47:53
+    -12:47:53.3
+   -12:47:53.35
+  -12:47:53.345
+ -12:47:53.3451
+ -12:47:53.3451
+       -12:47:53
+     -12:47:53.3
+    -12:47:53.35
+   -12:47:53.345
+  -12:47:53.3451
+ -12:47:53.34505
+ -12:47:53.34505
+ -0 12:47
+  -0 12:47
+   -0 12:47
+ -0 12:47:53
+  -0 12:47:53
+   -0 12:47:53
+ -0 12:47:53.3
+    -0 12:47:53
+  -0 12:47:53.3
+ -0 12:47:53.35
+     -0 12:47:53
+   -0 12:47:53.3
+  -0 12:47:53.35
+ -0 12:47:53.345
+      -0 12:47:53
+    -0 12:47:53.3
+   -0 12:47:53.35
+  -0 12:47:53.345
+ -0 12:47:53.3451
+       -0 12:47:53
+     -0 12:47:53.3
+    -0 12:47:53.35
+   -0 12:47:53.345
+  -0 12:47:53.3451
+ -0 12:47:53.34505
+        -0 12:47:53
+      -0 12:47:53.3
+     -0 12:47:53.35
+    -0 12:47:53.345
+   -0 12:47:53.3451
+  -0 12:47:53.34505
+ -0 12:47:53.345050
+ -1:26
+  -1:26
+   -1:26
+ -1:26:00
+  -1:26:00
+   -1:26:00
+ -1:26:00.5
+    -1:26:00
+  -1:26:00.5
+ -1:26:00.46
+     -1:26:00
+   -1:26:00.5
+  -1:26:00.46
+ -1:26:00.456
+      -1:26:00
+    -1:26:00.5
+   -1:26:00.46
+  -1:26:00.456
+ -1:26:00.4561
+       -1:26:00
+     -1:26:00.5
+    -1:26:00.46
+   -1:26:00.456
+  -1:26:00.4561
+ -1:26:00.45615
+        -1:26:00
+      -1:26:00.5
+     -1:26:00.46
+    -1:26:00.456
+   -1:26:00.4561
+  -1:26:00.45615
+ -1:26:00.456150
+ -0 01:26
+  -0 01:26
+   -0 01:26
+ -0 01:26:00
+  -0 01:26:00
+   -0 01:26:00
+ -0 01:26:00.5
+    -0 01:26:00
+  -0 01:26:00.5
+ -0 01:26:00.46
+     -0 01:26:00
+   -0 01:26:00.5
+  -0 01:26:00.46
+ -0 01:26:00.456
+      -0 01:26:00
+    -0 01:26:00.5
+   -0 01:26:00.46
+  -0 01:26:00.456
+ -0 01:26:00.4561
+       -0 01:26:00
+     -0 01:26:00.5
+    -0 01:26:00.46
+   -0 01:26:00.456
+  -0 01:26:00.4561
+ -0 01:26:00.45615
+        -0 01:26:00
+      -0 01:26:00.5
+     -0 01:26:00.46
+    -0 01:26:00.456
+   -0 01:26:00.4561
+  -0 01:26:00.45615
+ -0 01:26:00.456150
+ *****
+ -20:58
+  -20:58
+   -20:58
+ -20:58:11
+  -20:58:11
+  -20:58:11
+   -20:58:11
+ -20:58:11.6
+ -20:58:11.6
+    -20:58:11
+  -20:58:11.6
+ -20:58:11.57
+ -20:58:11.57
+     -20:58:11
+   -20:58:11.6
+  -20:58:11.57
+ -20:58:11.567
+ -20:58:11.567
+      -20:58:11
+    -20:58:11.6
+   -20:58:11.57
+  -20:58:11.567
+ -20:58:11.5668
+ -20:58:11.5668
+       -20:58:11
+     -20:58:11.6
+    -20:58:11.57
+   -20:58:11.567
+  -20:58:11.5668
+ -20:58:11.56677
+ -20:58:11.56677
+ -0 20:58
+  -0 20:58
+   -0 20:58
+ -0 20:58:11
+  -0 20:58:11
+   -0 20:58:11
+ -0 20:58:11.6
+    -0 20:58:11
+  -0 20:58:11.6
+ -0 20:58:11.57
+     -0 20:58:11
+   -0 20:58:11.6
+  -0 20:58:11.57
+ -0 20:58:11.567
+      -0 20:58:11
+    -0 20:58:11.6
+   -0 20:58:11.57
+  -0 20:58:11.567
+ -0 20:58:11.5668
+       -0 20:58:11
+     -0 20:58:11.6
+    -0 20:58:11.57
+   -0 20:58:11.567
+  -0 20:58:11.5668
+ -0 20:58:11.56677
+        -0 20:58:11
+      -0 20:58:11.6
+     -0 20:58:11.57
+    -0 20:58:11.567
+   -0 20:58:11.5668
+  -0 20:58:11.56677
+ -0 20:58:11.566770
+ -7:36
+  -7:36
+   -7:36
+ -7:36:05
+  -7:36:05
+   -7:36:05
+ -7:36:05.2
+    -7:36:05
+  -7:36:05.2
+ -7:36:05.19
+     -7:36:05
+   -7:36:05.2
+  -7:36:05.19
+ -7:36:05.190
+      -7:36:05
+    -7:36:05.2
+   -7:36:05.19
+  -7:36:05.190
+ -7:36:05.1896
+       -7:36:05
+     -7:36:05.2
+    -7:36:05.19
+   -7:36:05.190
+  -7:36:05.1896
+ -7:36:05.18964
+        -7:36:05
+      -7:36:05.2
+     -7:36:05.19
+    -7:36:05.190
+   -7:36:05.1896
+  -7:36:05.18964
+ -7:36:05.189640
+ -0 07:36
+  -0 07:36
+   -0 07:36
+ -0 07:36:05
+  -0 07:36:05
+   -0 07:36:05
+ -0 07:36:05.2
+    -0 07:36:05
+  -0 07:36:05.2
+ -0 07:36:05.19
+     -0 07:36:05
+   -0 07:36:05.2
+  -0 07:36:05.19
+ -0 07:36:05.190
+      -0 07:36:05
+    -0 07:36:05.2
+   -0 07:36:05.19
+  -0 07:36:05.190
+ -0 07:36:05.1896
+       -0 07:36:05
+     -0 07:36:05.2
+    -0 07:36:05.19
+   -0 07:36:05.190
+  -0 07:36:05.1896
+ -0 07:36:05.18964
+        -0 07:36:05
+      -0 07:36:05.2
+     -0 07:36:05.19
+    -0 07:36:05.190
+   -0 07:36:05.1896
+  -0 07:36:05.18964
+ -0 07:36:05.189640
+ *****
+ -15:43
+  -15:43
+   -15:43
+ -15:43:49
+  -15:43:49
+  -15:43:49
+   -15:43:49
+ -15:43:49.8
+ -15:43:49.8
+    -15:43:49
+  -15:43:49.8
+ -15:43:49.83
+ -15:43:49.83
+     -15:43:49
+   -15:43:49.8
+  -15:43:49.83
+ -15:43:49.831
+ -15:43:49.831
+      -15:43:49
+    -15:43:49.8
+   -15:43:49.83
+  -15:43:49.831
+ -15:43:49.8313
+ -15:43:49.8313
+       -15:43:49
+     -15:43:49.8
+    -15:43:49.83
+   -15:43:49.831
+  -15:43:49.8313
+ -15:43:49.83132
+ -15:43:49.83132
+ -0 15:43
+  -0 15:43
+   -0 15:43
+ -0 15:43:49
+  -0 15:43:49
+   -0 15:43:49
+ -0 15:43:49.8
+    -0 15:43:49
+  -0 15:43:49.8
+ -0 15:43:49.83
+     -0 15:43:49
+   -0 15:43:49.8
+  -0 15:43:49.83
+ -0 15:43:49.831
+      -0 15:43:49
+    -0 15:43:49.8
+   -0 15:43:49.83
+  -0 15:43:49.831
+ -0 15:43:49.8313
+       -0 15:43:49
+     -0 15:43:49.8
+    -0 15:43:49.83
+   -0 15:43:49.831
+  -0 15:43:49.8313
+ -0 15:43:49.83132
+        -0 15:43:49
+      -0 15:43:49.8
+     -0 15:43:49.83
+    -0 15:43:49.831
+   -0 15:43:49.8313
+  -0 15:43:49.83132
+ -0 15:43:49.831320
+ -4:25
+  -4:25
+   -4:25
+ -4:25:09
+  -4:25:09
+   -4:25:09
+ -4:25:09.0
+    -4:25:09
+  -4:25:09.0
+ -4:25:09.01
+     -4:25:09
+   -4:25:09.0
+  -4:25:09.01
+ -4:25:09.013
+      -4:25:09
+    -4:25:09.0
+   -4:25:09.01
+  -4:25:09.013
+ -4:25:09.0129
+       -4:25:09
+     -4:25:09.0
+    -4:25:09.01
+   -4:25:09.013
+  -4:25:09.0129
+ -4:25:09.01293
+        -4:25:09
+      -4:25:09.0
+     -4:25:09.01
+    -4:25:09.013
+   -4:25:09.0129
+  -4:25:09.01293
+ -4:25:09.012930
+ -0 04:25
+  -0 04:25
+   -0 04:25
+ -0 04:25:09
+  -0 04:25:09
+   -0 04:25:09
+ -0 04:25:09.0
+    -0 04:25:09
+  -0 04:25:09.0
+ -0 04:25:09.01
+     -0 04:25:09
+   -0 04:25:09.0
+  -0 04:25:09.01
+ -0 04:25:09.013
+      -0 04:25:09
+    -0 04:25:09.0
+   -0 04:25:09.01
+  -0 04:25:09.013
+ -0 04:25:09.0129
+       -0 04:25:09
+     -0 04:25:09.0
+    -0 04:25:09.01
+   -0 04:25:09.013
+  -0 04:25:09.0129
+ -0 04:25:09.01293
+        -0 04:25:09
+      -0 04:25:09.0
+     -0 04:25:09.01
+    -0 04:25:09.013
+   -0 04:25:09.0129
+  -0 04:25:09.01293
+ -0 04:25:09.012930
+ -6:49
+  -6:49
+   -6:49
+ -6:49:27
+  -6:49:27
+   -6:49:27
+ -6:49:27.5
+    -6:49:27
+  -6:49:27.5
+ -6:49:27.52
+     -6:49:27
+   -6:49:27.5
+  -6:49:27.52
+ -6:49:27.524
+      -6:49:27
+    -6:49:27.5
+   -6:49:27.52
+  -6:49:27.524
+ -6:49:27.5238
+       -6:49:27
+     -6:49:27.5
+    -6:49:27.52
+   -6:49:27.524
+  -6:49:27.5238
+ -6:49:27.52375
+        -6:49:27
+      -6:49:27.5
+     -6:49:27.52
+    -6:49:27.524
+   -6:49:27.5238
+  -6:49:27.52375
+ -6:49:27.523750
+ -0 06:49
+  -0 06:49
+   -0 06:49
+ -0 06:49:27
+  -0 06:49:27
+   -0 06:49:27
+ -0 06:49:27.5
+    -0 06:49:27
+  -0 06:49:27.5
+ -0 06:49:27.52
+     -0 06:49:27
+   -0 06:49:27.5
+  -0 06:49:27.52
+ -0 06:49:27.524
+      -0 06:49:27
+    -0 06:49:27.5
+   -0 06:49:27.52
+  -0 06:49:27.524
+ -0 06:49:27.5238
+       -0 06:49:27
+     -0 06:49:27.5
+    -0 06:49:27.52
+   -0 06:49:27.524
+  -0 06:49:27.5238
+ -0 06:49:27.52375
+        -0 06:49:27
+      -0 06:49:27.5
+     -0 06:49:27.52
+    -0 06:49:27.524
+   -0 06:49:27.5238
+  -0 06:49:27.52375
+ -0 06:49:27.523750
+ -2:57
+  -2:57
+   -2:57
+ -2:57:52
+  -2:57:52
+   -2:57:52
+ -2:57:52.0
+    -2:57:52
+  -2:57:52.0
+ -2:57:52.02
+     -2:57:52
+   -2:57:52.0
+  -2:57:52.02
+ -2:57:52.016
+      -2:57:52
+    -2:57:52.0
+   -2:57:52.02
+  -2:57:52.016
+ -2:57:52.0156
+       -2:57:52
+     -2:57:52.0
+    -2:57:52.02
+   -2:57:52.016
+  -2:57:52.0156
+ -2:57:52.01565
+        -2:57:52
+      -2:57:52.0
+     -2:57:52.02
+    -2:57:52.016
+   -2:57:52.0156
+  -2:57:52.01565
+ -2:57:52.015650
+ -0 02:57
+  -0 02:57
+   -0 02:57
+ -0 02:57:52
+  -0 02:57:52
+   -0 02:57:52
+ -0 02:57:52.0
+    -0 02:57:52
+  -0 02:57:52.0
+ -0 02:57:52.02
+     -0 02:57:52
+   -0 02:57:52.0
+  -0 02:57:52.02
+ -0 02:57:52.016
+      -0 02:57:52
+    -0 02:57:52.0
+   -0 02:57:52.02
+  -0 02:57:52.016
+ -0 02:57:52.0156
+       -0 02:57:52
+     -0 02:57:52.0
+    -0 02:57:52.02
+   -0 02:57:52.016
+  -0 02:57:52.0156
+ -0 02:57:52.01565
+        -0 02:57:52
+      -0 02:57:52.0
+     -0 02:57:52.02
+    -0 02:57:52.016
+   -0 02:57:52.0156
+  -0 02:57:52.01565
+ -0 02:57:52.015650
+ *****
+ -16:45
+  -16:45
+   -16:45
+ -16:45:44
+  -16:45:44
+  -16:45:44
+   -16:45:44
+ -16:45:44.9
+ -16:45:44.9
+    -16:45:44
+  -16:45:44.9
+ -16:45:44.87
+ -16:45:44.87
+     -16:45:44
+   -16:45:44.9
+  -16:45:44.87
+ -16:45:44.865
+ -16:45:44.865
+      -16:45:44
+    -16:45:44.9
+   -16:45:44.87
+  -16:45:44.865
+ -16:45:44.8653
+ -16:45:44.8653
+       -16:45:44
+     -16:45:44.9
+    -16:45:44.87
+   -16:45:44.865
+  -16:45:44.8653
+ -16:45:44.86529
+ -16:45:44.86529
+ -0 16:45
+  -0 16:45
+   -0 16:45
+ -0 16:45:44
+  -0 16:45:44
+   -0 16:45:44
+ -0 16:45:44.9
+    -0 16:45:44
+  -0 16:45:44.9
+ -0 16:45:44.87
+     -0 16:45:44
+   -0 16:45:44.9
+  -0 16:45:44.87
+ -0 16:45:44.865
+      -0 16:45:44
+    -0 16:45:44.9
+   -0 16:45:44.87
+  -0 16:45:44.865
+ -0 16:45:44.8653
+       -0 16:45:44
+     -0 16:45:44.9
+    -0 16:45:44.87
+   -0 16:45:44.865
+  -0 16:45:44.8653
+ -0 16:45:44.86529
+        -0 16:45:44
+      -0 16:45:44.9
+     -0 16:45:44.87
+    -0 16:45:44.865
+   -0 16:45:44.8653
+  -0 16:45:44.86529
+ -0 16:45:44.865290
+ *****
+ -21:30
+  -21:30
+   -21:30
+ -21:30:57
+  -21:30:57
+  -21:30:57
+   -21:30:57
+ -21:30:57.8
+ -21:30:57.8
+    -21:30:57
+  -21:30:57.8
+ -21:30:57.82
+ -21:30:57.82
+     -21:30:57
+   -21:30:57.8
+  -21:30:57.82
+ -21:30:57.820
+ -21:30:57.820
+      -21:30:57
+    -21:30:57.8
+   -21:30:57.82
+  -21:30:57.820
+ -21:30:57.8205
+ -21:30:57.8205
+       -21:30:57
+     -21:30:57.8
+    -21:30:57.82
+   -21:30:57.820
+  -21:30:57.8205
+ -21:30:57.82047
+ -21:30:57.82047
+ -0 21:30
+  -0 21:30
+   -0 21:30
+ -0 21:30:57
+  -0 21:30:57
+   -0 21:30:57
+ -0 21:30:57.8
+    -0 21:30:57
+  -0 21:30:57.8
+ -0 21:30:57.82
+     -0 21:30:57
+   -0 21:30:57.8
+  -0 21:30:57.82
+ -0 21:30:57.820
+      -0 21:30:57
+    -0 21:30:57.8
+   -0 21:30:57.82
+  -0 21:30:57.820
+ -0 21:30:57.8205
+       -0 21:30:57
+     -0 21:30:57.8
+    -0 21:30:57.82
+   -0 21:30:57.820
+  -0 21:30:57.8205
+ -0 21:30:57.82047
+        -0 21:30:57
+      -0 21:30:57.8
+     -0 21:30:57.82
+    -0 21:30:57.820
+   -0 21:30:57.8205
+  -0 21:30:57.82047
+ -0 21:30:57.820470
+ -4:25
+  -4:25
+   -4:25
+ -4:25:09
+  -4:25:09
+   -4:25:09
+ -4:25:09.2
+    -4:25:09
+  -4:25:09.2
+ -4:25:09.15
+     -4:25:09
+   -4:25:09.2
+  -4:25:09.15
+ -4:25:09.154
+      -4:25:09
+    -4:25:09.2
+   -4:25:09.15
+  -4:25:09.154
+ -4:25:09.1539
+       -4:25:09
+     -4:25:09.2
+    -4:25:09.15
+   -4:25:09.154
+  -4:25:09.1539
+ -4:25:09.15395
+        -4:25:09
+      -4:25:09.2
+     -4:25:09.15
+    -4:25:09.154
+   -4:25:09.1539
+  -4:25:09.15395
+ -4:25:09.153950
+ -0 04:25
+  -0 04:25
+   -0 04:25
+ -0 04:25:09
+  -0 04:25:09
+   -0 04:25:09
+ -0 04:25:09.2
+    -0 04:25:09
+  -0 04:25:09.2
+ -0 04:25:09.15
+     -0 04:25:09
+   -0 04:25:09.2
+  -0 04:25:09.15
+ -0 04:25:09.154
+      -0 04:25:09
+    -0 04:25:09.2
+   -0 04:25:09.15
+  -0 04:25:09.154
+ -0 04:25:09.1539
+       -0 04:25:09
+     -0 04:25:09.2
+    -0 04:25:09.15
+   -0 04:25:09.154
+  -0 04:25:09.1539
+ -0 04:25:09.15395
+        -0 04:25:09
+      -0 04:25:09.2
+     -0 04:25:09.15
+    -0 04:25:09.154
+   -0 04:25:09.1539
+  -0 04:25:09.15395
+ -0 04:25:09.153950
+ -6:49
+  -6:49
+   -6:49
+ -6:49:27
+  -6:49:27
+   -6:49:27
+ -6:49:27.1
+    -6:49:27
+  -6:49:27.1
+ -6:49:27.11
+     -6:49:27
+   -6:49:27.1
+  -6:49:27.11
+ -6:49:27.105
+      -6:49:27
+    -6:49:27.1
+   -6:49:27.11
+  -6:49:27.105
+ -6:49:27.1053
+       -6:49:27
+     -6:49:27.1
+    -6:49:27.11
+   -6:49:27.105
+  -6:49:27.1053
+ -6:49:27.10533
+        -6:49:27
+      -6:49:27.1
+     -6:49:27.11
+    -6:49:27.105
+   -6:49:27.1053
+  -6:49:27.10533
+ -6:49:27.105330
+ -0 06:49
+  -0 06:49
+   -0 06:49
+ -0 06:49:27
+  -0 06:49:27
+   -0 06:49:27
+ -0 06:49:27.1
+    -0 06:49:27
+  -0 06:49:27.1
+ -0 06:49:27.11
+     -0 06:49:27
+   -0 06:49:27.1
+  -0 06:49:27.11
+ -0 06:49:27.105
+      -0 06:49:27
+    -0 06:49:27.1
+   -0 06:49:27.11
+  -0 06:49:27.105
+ -0 06:49:27.1053
+       -0 06:49:27
+     -0 06:49:27.1
+    -0 06:49:27.11
+   -0 06:49:27.105
+  -0 06:49:27.1053
+ -0 06:49:27.10533
+        -0 06:49:27
+      -0 06:49:27.1
+     -0 06:49:27.11
+    -0 06:49:27.105
+   -0 06:49:27.1053
+  -0 06:49:27.10533
+ -0 06:49:27.105330
+ -2:57
+  -2:57
+   -2:57
+ -2:57:52
+  -2:57:52
+   -2:57:52
+ -2:57:52.5
+    -2:57:52
+  -2:57:52.5
+ -2:57:52.48
+     -2:57:52
+   -2:57:52.5
+  -2:57:52.48
+ -2:57:52.482
+      -2:57:52
+    -2:57:52.5
+   -2:57:52.48
+  -2:57:52.482
+ -2:57:52.4823
+       -2:57:52
+     -2:57:52.5
+    -2:57:52.48
+   -2:57:52.482
+  -2:57:52.4823
+ -2:57:52.48229
+        -2:57:52
+      -2:57:52.5
+     -2:57:52.48
+    -2:57:52.482
+   -2:57:52.4823
+  -2:57:52.48229
+ -2:57:52.482290
+ -0 02:57
+  -0 02:57
+   -0 02:57
+ -0 02:57:52
+  -0 02:57:52
+   -0 02:57:52
+ -0 02:57:52.5
+    -0 02:57:52
+  -0 02:57:52.5
+ -0 02:57:52.48
+     -0 02:57:52
+   -0 02:57:52.5
+  -0 02:57:52.48
+ -0 02:57:52.482
+      -0 02:57:52
+    -0 02:57:52.5
+   -0 02:57:52.48
+  -0 02:57:52.482
+ -0 02:57:52.4823
+       -0 02:57:52
+     -0 02:57:52.5
+    -0 02:57:52.48
+   -0 02:57:52.482
+  -0 02:57:52.4823
+ -0 02:57:52.48229
+        -0 02:57:52
+      -0 02:57:52.5
+     -0 02:57:52.48
+    -0 02:57:52.482
+   -0 02:57:52.4823
+  -0 02:57:52.48229
+ -0 02:57:52.482290
+ *****
+ -16:45
+  -16:45
+   -16:45
+ -16:45:44
+  -16:45:44
+  -16:45:44
+   -16:45:44
+ -16:45:44.7
+ -16:45:44.7
+    -16:45:44
+  -16:45:44.7
+ -16:45:44.66
+ -16:45:44.66
+     -16:45:44
+   -16:45:44.7
+  -16:45:44.66
+ -16:45:44.658
+ -16:45:44.658
+      -16:45:44
+    -16:45:44.7
+   -16:45:44.66
+  -16:45:44.658
+ -16:45:44.6583
+ -16:45:44.6583
+       -16:45:44
+     -16:45:44.7
+    -16:45:44.66
+   -16:45:44.658
+  -16:45:44.6583
+ -16:45:44.65827
+ -16:45:44.65827
+ -0 16:45
+  -0 16:45
+   -0 16:45
+ -0 16:45:44
+  -0 16:45:44
+   -0 16:45:44
+ -0 16:45:44.7
+    -0 16:45:44
+  -0 16:45:44.7
+ -0 16:45:44.66
+     -0 16:45:44
+   -0 16:45:44.7
+  -0 16:45:44.66
+ -0 16:45:44.658
+      -0 16:45:44
+    -0 16:45:44.7
+   -0 16:45:44.66
+  -0 16:45:44.658
+ -0 16:45:44.6583
+       -0 16:45:44
+     -0 16:45:44.7
+    -0 16:45:44.66
+   -0 16:45:44.658
+  -0 16:45:44.6583
+ -0 16:45:44.65827
+        -0 16:45:44
+      -0 16:45:44.7
+     -0 16:45:44.66
+    -0 16:45:44.658
+   -0 16:45:44.6583
+  -0 16:45:44.65827
+ -0 16:45:44.658270
+ *****
+ -21:30
+  -21:30
+   -21:30
+ -21:30:57
+  -21:30:57
+  -21:30:57
+   -21:30:57
+ -21:30:57.6
+ -21:30:57.6
+    -21:30:57
+  -21:30:57.6
+ -21:30:57.58
+ -21:30:57.58
+     -21:30:57
+   -21:30:57.6
+  -21:30:57.58
+ -21:30:57.582
+ -21:30:57.582
+      -21:30:57
+    -21:30:57.6
+   -21:30:57.58
+  -21:30:57.582
+ -21:30:57.5822
+ -21:30:57.5822
+       -21:30:57
+     -21:30:57.6
+    -21:30:57.58
+   -21:30:57.582
+  -21:30:57.5822
+ -21:30:57.58219
+ -21:30:57.58219
+ -0 21:30
+  -0 21:30
+   -0 21:30
+ -0 21:30:57
+  -0 21:30:57
+   -0 21:30:57
+ -0 21:30:57.6
+    -0 21:30:57
+  -0 21:30:57.6
+ -0 21:30:57.58
+     -0 21:30:57
+   -0 21:30:57.6
+  -0 21:30:57.58
+ -0 21:30:57.582
+      -0 21:30:57
+    -0 21:30:57.6
+   -0 21:30:57.58
+  -0 21:30:57.582
+ -0 21:30:57.5822
+       -0 21:30:57
+     -0 21:30:57.6
+    -0 21:30:57.58
+   -0 21:30:57.582
+  -0 21:30:57.5822
+ -0 21:30:57.58219
+        -0 21:30:57
+      -0 21:30:57.6
+     -0 21:30:57.58
+    -0 21:30:57.582
+   -0 21:30:57.5822
+  -0 21:30:57.58219
+ -0 21:30:57.582190
+ *****
+ -22:30
+  -22:30
+   -22:30
+ -22:30:04
+  -22:30:04
+  -22:30:04
+   -22:30:04
+ -22:30:04.2
+ -22:30:04.2
+    -22:30:04
+  -22:30:04.2
+ -22:30:04.18
+ -22:30:04.18
+     -22:30:04
+   -22:30:04.2
+  -22:30:04.18
+ -22:30:04.183
+ -22:30:04.183
+      -22:30:04
+    -22:30:04.2
+   -22:30:04.18
+  -22:30:04.183
+ -22:30:04.1835
+ -22:30:04.1835
+       -22:30:04
+     -22:30:04.2
+    -22:30:04.18
+   -22:30:04.183
+  -22:30:04.1835
+ -22:30:04.18347
+ -22:30:04.18347
+ -0 22:30
+  -0 22:30
+   -0 22:30
+ -0 22:30:04
+  -0 22:30:04
+   -0 22:30:04
+ -0 22:30:04.2
+    -0 22:30:04
+  -0 22:30:04.2
+ -0 22:30:04.18
+     -0 22:30:04
+   -0 22:30:04.2
+  -0 22:30:04.18
+ -0 22:30:04.183
+      -0 22:30:04
+    -0 22:30:04.2
+   -0 22:30:04.18
+  -0 22:30:04.183
+ -0 22:30:04.1835
+       -0 22:30:04
+     -0 22:30:04.2
+    -0 22:30:04.18
+   -0 22:30:04.183
+  -0 22:30:04.1835
+ -0 22:30:04.18347
+        -0 22:30:04
+      -0 22:30:04.2
+     -0 22:30:04.18
+    -0 22:30:04.183
+   -0 22:30:04.1835
+  -0 22:30:04.18347
+ -0 22:30:04.183470
+ -1:56
+  -1:56
+   -1:56
+ -1:56:51
+  -1:56:51
+   -1:56:51
+ -1:56:51.6
+    -1:56:51
+  -1:56:51.6
+ -1:56:51.59
+     -1:56:51
+   -1:56:51.6
+  -1:56:51.59
+ -1:56:51.593
+      -1:56:51
+    -1:56:51.6
+   -1:56:51.59
+  -1:56:51.593
+ -1:56:51.5932
+       -1:56:51
+     -1:56:51.6
+    -1:56:51.59
+   -1:56:51.593
+  -1:56:51.5932
+ -1:56:51.59319
+        -1:56:51
+      -1:56:51.6
+     -1:56:51.59
+    -1:56:51.593
+   -1:56:51.5932
+  -1:56:51.59319
+ -1:56:51.593190
+ -0 01:56
+  -0 01:56
+   -0 01:56
+ -0 01:56:51
+  -0 01:56:51
+   -0 01:56:51
+ -0 01:56:51.6
+    -0 01:56:51
+  -0 01:56:51.6
+ -0 01:56:51.59
+     -0 01:56:51
+   -0 01:56:51.6
+  -0 01:56:51.59
+ -0 01:56:51.593
+      -0 01:56:51
+    -0 01:56:51.6
+   -0 01:56:51.59
+  -0 01:56:51.593
+ -0 01:56:51.5932
+       -0 01:56:51
+     -0 01:56:51.6
+    -0 01:56:51.59
+   -0 01:56:51.593
+  -0 01:56:51.5932
+ -0 01:56:51.59319
+        -0 01:56:51
+      -0 01:56:51.6
+     -0 01:56:51.59
+    -0 01:56:51.593
+   -0 01:56:51.5932
+  -0 01:56:51.59319
+ -0 01:56:51.593190
+ *****
+ -24:00
+  -24:00
+   -24:00
+ -24:00:00
+  -24:00:00
+  -24:00:00
+   -24:00:00
+ -24:00:00.0
+ -24:00:00.0
+    -24:00:00
+  -24:00:00.0
+ -24:00:00.00
+ -24:00:00.00
+     -24:00:00
+   -24:00:00.0
+  -24:00:00.00
+ -24:00:00.000
+ -24:00:00.000
+      -24:00:00
+    -24:00:00.0
+   -24:00:00.00
+  -24:00:00.000
+ -24:00:00.0000
+ -24:00:00.0000
+       -24:00:00
+     -24:00:00.0
+    -24:00:00.00
+   -24:00:00.000
+  -24:00:00.0000
+ -24:00:00.00000
+ -24:00:00.00000
+ -1 00:00
+  -1 00:00
+   -1 00:00
+ -1 00:00:00
+  -1 00:00:00
+   -1 00:00:00
+ -1 00:00:00.0
+    -1 00:00:00
+  -1 00:00:00.0
+ -1 00:00:00.00
+     -1 00:00:00
+   -1 00:00:00.0
+  -1 00:00:00.00
+ -1 00:00:00.000
+      -1 00:00:00
+    -1 00:00:00.0
+   -1 00:00:00.00
+  -1 00:00:00.000
+ -1 00:00:00.0000
+       -1 00:00:00
+     -1 00:00:00.0
+    -1 00:00:00.00
+   -1 00:00:00.000
+  -1 00:00:00.0000
+ -1 00:00:00.00000
+        -1 00:00:00
+      -1 00:00:00.0
+     -1 00:00:00.00
+    -1 00:00:00.000
+   -1 00:00:00.0000
+  -1 00:00:00.00000
+ -1 00:00:00.000000
+ *****
+ -28:50
+  -28:50
+   -28:50
+ -28:50:38
+  -28:50:38
+  -28:50:38
+   -28:50:38
+ -28:50:38.1
+ -28:50:38.1
+    -28:50:38
+  -28:50:38.1
+ -28:50:38.12
+ -28:50:38.12
+     -28:50:38
+   -28:50:38.1
+  -28:50:38.12
+ -28:50:38.123
+ -28:50:38.123
+      -28:50:38
+    -28:50:38.1
+   -28:50:38.12
+  -28:50:38.123
+ -28:50:38.1230
+ -28:50:38.1230
+       -28:50:38
+     -28:50:38.1
+    -28:50:38.12
+   -28:50:38.123
+  -28:50:38.1230
+ -28:50:38.12301
+ -28:50:38.12301
+ -1 04:50
+  -1 04:50
+   -1 04:50
+ -1 04:50:38
+  -1 04:50:38
+   -1 04:50:38
+ -1 04:50:38.1
+    -1 04:50:38
+  -1 04:50:38.1
+ -1 04:50:38.12
+     -1 04:50:38
+   -1 04:50:38.1
+  -1 04:50:38.12
+ -1 04:50:38.123
+      -1 04:50:38
+    -1 04:50:38.1
+   -1 04:50:38.12
+  -1 04:50:38.123
+ -1 04:50:38.1230
+       -1 04:50:38
+     -1 04:50:38.1
+    -1 04:50:38.12
+   -1 04:50:38.123
+  -1 04:50:38.1230
+ -1 04:50:38.12301
+        -1 04:50:38
+      -1 04:50:38.1
+     -1 04:50:38.12
+    -1 04:50:38.123
+   -1 04:50:38.1230
+  -1 04:50:38.12301
+ -1 04:50:38.123010
+ *****
+ -36:31
+  -36:31
+   -36:31
+ -36:31:35
+  -36:31:35
+  -36:31:35
+   -36:31:35
+ -36:31:35.2
+ -36:31:35.2
+    -36:31:35
+  -36:31:35.2
+ -36:31:35.23
+ -36:31:35.23
+     -36:31:35
+   -36:31:35.2
+  -36:31:35.23
+ -36:31:35.235
+ -36:31:35.235
+      -36:31:35
+    -36:31:35.2
+   -36:31:35.23
+  -36:31:35.235
+ -36:31:35.2345
+ -36:31:35.2345
+       -36:31:35
+     -36:31:35.2
+    -36:31:35.23
+   -36:31:35.235
+  -36:31:35.2345
+ -36:31:35.23453
+ -36:31:35.23453
+ -1 12:31
+  -1 12:31
+   -1 12:31
+ -1 12:31:35
+  -1 12:31:35
+   -1 12:31:35
+ -1 12:31:35.2
+    -1 12:31:35
+  -1 12:31:35.2
+ -1 12:31:35.23
+     -1 12:31:35
+   -1 12:31:35.2
+  -1 12:31:35.23
+ -1 12:31:35.235
+      -1 12:31:35
+    -1 12:31:35.2
+   -1 12:31:35.23
+  -1 12:31:35.235
+ -1 12:31:35.2345
+       -1 12:31:35
+     -1 12:31:35.2
+    -1 12:31:35.23
+   -1 12:31:35.235
+  -1 12:31:35.2345
+ -1 12:31:35.23453
+        -1 12:31:35
+      -1 12:31:35.2
+     -1 12:31:35.23
+    -1 12:31:35.235
+   -1 12:31:35.2345
+  -1 12:31:35.23453
+ -1 12:31:35.234530
+ *****
+ -36:47
+  -36:47
+   -36:47
+ -36:47:53
+  -36:47:53
+  -36:47:53
+   -36:47:53
+ -36:47:53.3
+ -36:47:53.3
+    -36:47:53
+  -36:47:53.3
+ -36:47:53.35
+ -36:47:53.35
+     -36:47:53
+   -36:47:53.3
+  -36:47:53.35
+ -36:47:53.345
+ -36:47:53.345
+      -36:47:53
+    -36:47:53.3
+   -36:47:53.35
+  -36:47:53.345
+ -36:47:53.3451
+ -36:47:53.3451
+       -36:47:53
+     -36:47:53.3
+    -36:47:53.35
+   -36:47:53.345
+  -36:47:53.3451
+ -36:47:53.34505
+ -36:47:53.34505
+ -1 12:47
+  -1 12:47
+   -1 12:47
+ -1 12:47:53
+  -1 12:47:53
+   -1 12:47:53
+ -1 12:47:53.3
+    -1 12:47:53
+  -1 12:47:53.3
+ -1 12:47:53.35
+     -1 12:47:53
+   -1 12:47:53.3
+  -1 12:47:53.35
+ -1 12:47:53.345
+      -1 12:47:53
+    -1 12:47:53.3
+   -1 12:47:53.35
+  -1 12:47:53.345
+ -1 12:47:53.3451
+       -1 12:47:53
+     -1 12:47:53.3
+    -1 12:47:53.35
+   -1 12:47:53.345
+  -1 12:47:53.3451
+ -1 12:47:53.34505
+        -1 12:47:53
+      -1 12:47:53.3
+     -1 12:47:53.35
+    -1 12:47:53.345
+   -1 12:47:53.3451
+  -1 12:47:53.34505
+ -1 12:47:53.345050
+ *****
+ -25:26
+  -25:26
+   -25:26
+ -25:26:00
+  -25:26:00
+  -25:26:00
+   -25:26:00
+ -25:26:00.5
+ -25:26:00.5
+    -25:26:00
+  -25:26:00.5
+ -25:26:00.46
+ -25:26:00.46
+     -25:26:00
+   -25:26:00.5
+  -25:26:00.46
+ -25:26:00.456
+ -25:26:00.456
+      -25:26:00
+    -25:26:00.5
+   -25:26:00.46
+  -25:26:00.456
+ -25:26:00.4561
+ -25:26:00.4561
+       -25:26:00
+     -25:26:00.5
+    -25:26:00.46
+   -25:26:00.456
+  -25:26:00.4561
+ -25:26:00.45615
+ -25:26:00.45615
+ -1 01:26
+  -1 01:26
+   -1 01:26
+ -1 01:26:00
+  -1 01:26:00
+   -1 01:26:00
+ -1 01:26:00.5
+    -1 01:26:00
+  -1 01:26:00.5
+ -1 01:26:00.46
+     -1 01:26:00
+   -1 01:26:00.5
+  -1 01:26:00.46
+ -1 01:26:00.456
+      -1 01:26:00
+    -1 01:26:00.5
+   -1 01:26:00.46
+  -1 01:26:00.456
+ -1 01:26:00.4561
+       -1 01:26:00
+     -1 01:26:00.5
+    -1 01:26:00.46
+   -1 01:26:00.456
+  -1 01:26:00.4561
+ -1 01:26:00.45615
+        -1 01:26:00
+      -1 01:26:00.5
+     -1 01:26:00.46
+    -1 01:26:00.456
+   -1 01:26:00.4561
+  -1 01:26:00.45615
+ -1 01:26:00.456150
+ *****
+ -44:58
+  -44:58
+   -44:58
+ -44:58:11
+  -44:58:11
+  -44:58:11
+   -44:58:11
+ -44:58:11.6
+ -44:58:11.6
+    -44:58:11
+  -44:58:11.6
+ -44:58:11.57
+ -44:58:11.57
+     -44:58:11
+   -44:58:11.6
+  -44:58:11.57
+ -44:58:11.567
+ -44:58:11.567
+      -44:58:11
+    -44:58:11.6
+   -44:58:11.57
+  -44:58:11.567
+ -44:58:11.5668
+ -44:58:11.5668
+       -44:58:11
+     -44:58:11.6
+    -44:58:11.57
+   -44:58:11.567
+  -44:58:11.5668
+ -44:58:11.56677
+ -44:58:11.56677
+ -1 20:58
+  -1 20:58
+   -1 20:58
+ -1 20:58:11
+  -1 20:58:11
+   -1 20:58:11
+ -1 20:58:11.6
+    -1 20:58:11
+  -1 20:58:11.6
+ -1 20:58:11.57
+     -1 20:58:11
+   -1 20:58:11.6
+  -1 20:58:11.57
+ -1 20:58:11.567
+      -1 20:58:11
+    -1 20:58:11.6
+   -1 20:58:11.57
+  -1 20:58:11.567
+ -1 20:58:11.5668
+       -1 20:58:11
+     -1 20:58:11.6
+    -1 20:58:11.57
+   -1 20:58:11.567
+  -1 20:58:11.5668
+ -1 20:58:11.56677
+        -1 20:58:11
+      -1 20:58:11.6
+     -1 20:58:11.57
+    -1 20:58:11.567
+   -1 20:58:11.5668
+  -1 20:58:11.56677
+ -1 20:58:11.566770
+ *****
+ -31:36
+  -31:36
+   -31:36
+ -31:36:05
+  -31:36:05
+  -31:36:05
+   -31:36:05
+ -31:36:05.2
+ -31:36:05.2
+    -31:36:05
+  -31:36:05.2
+ -31:36:05.19
+ -31:36:05.19
+     -31:36:05
+   -31:36:05.2
+  -31:36:05.19
+ -31:36:05.190
+ -31:36:05.190
+      -31:36:05
+    -31:36:05.2
+   -31:36:05.19
+  -31:36:05.190
+ -31:36:05.1896
+ -31:36:05.1896
+       -31:36:05
+     -31:36:05.2
+    -31:36:05.19
+   -31:36:05.190
+  -31:36:05.1896
+ -31:36:05.18964
+ -31:36:05.18964
+ -1 07:36
+  -1 07:36
+   -1 07:36
+ -1 07:36:05
+  -1 07:36:05
+   -1 07:36:05
+ -1 07:36:05.2
+    -1 07:36:05
+  -1 07:36:05.2
+ -1 07:36:05.19
+     -1 07:36:05
+   -1 07:36:05.2
+  -1 07:36:05.19
+ -1 07:36:05.190
+      -1 07:36:05
+    -1 07:36:05.2
+   -1 07:36:05.19
+  -1 07:36:05.190
+ -1 07:36:05.1896
+       -1 07:36:05
+     -1 07:36:05.2
+    -1 07:36:05.19
+   -1 07:36:05.190
+  -1 07:36:05.1896
+ -1 07:36:05.18964
+        -1 07:36:05
+      -1 07:36:05.2
+     -1 07:36:05.19
+    -1 07:36:05.190
+   -1 07:36:05.1896
+  -1 07:36:05.18964
+ -1 07:36:05.189640
+ *****
+ -39:43
+  -39:43
+   -39:43
+ -39:43:49
+  -39:43:49
+  -39:43:49
+   -39:43:49
+ -39:43:49.8
+ -39:43:49.8
+    -39:43:49
+  -39:43:49.8
+ -39:43:49.83
+ -39:43:49.83
+     -39:43:49
+   -39:43:49.8
+  -39:43:49.83
+ -39:43:49.831
+ -39:43:49.831
+      -39:43:49
+    -39:43:49.8
+   -39:43:49.83
+  -39:43:49.831
+ -39:43:49.8313
+ -39:43:49.8313
+       -39:43:49
+     -39:43:49.8
+    -39:43:49.83
+   -39:43:49.831
+  -39:43:49.8313
+ -39:43:49.83132
+ -39:43:49.83132
+ -1 15:43
+  -1 15:43
+   -1 15:43
+ -1 15:43:49
+  -1 15:43:49
+   -1 15:43:49
+ -1 15:43:49.8
+    -1 15:43:49
+  -1 15:43:49.8
+ -1 15:43:49.83
+     -1 15:43:49
+   -1 15:43:49.8
+  -1 15:43:49.83
+ -1 15:43:49.831
+      -1 15:43:49
+    -1 15:43:49.8
+   -1 15:43:49.83
+  -1 15:43:49.831
+ -1 15:43:49.8313
+       -1 15:43:49
+     -1 15:43:49.8
+    -1 15:43:49.83
+   -1 15:43:49.831
+  -1 15:43:49.8313
+ -1 15:43:49.83132
+        -1 15:43:49
+      -1 15:43:49.8
+     -1 15:43:49.83
+    -1 15:43:49.831
+   -1 15:43:49.8313
+  -1 15:43:49.83132
+ -1 15:43:49.831320
+ *****
+ -28:25
+  -28:25
+   -28:25
+ -28:25:09
+  -28:25:09
+  -28:25:09
+   -28:25:09
+ -28:25:09.0
+ -28:25:09.0
+    -28:25:09
+  -28:25:09.0
+ -28:25:09.01
+ -28:25:09.01
+     -28:25:09
+   -28:25:09.0
+  -28:25:09.01
+ -28:25:09.013
+ -28:25:09.013
+      -28:25:09
+    -28:25:09.0
+   -28:25:09.01
+  -28:25:09.013
+ -28:25:09.0129
+ -28:25:09.0129
+       -28:25:09
+     -28:25:09.0
+    -28:25:09.01
+   -28:25:09.013
+  -28:25:09.0129
+ -28:25:09.01293
+ -28:25:09.01293
+ -1 04:25
+  -1 04:25
+   -1 04:25
+ -1 04:25:09
+  -1 04:25:09
+   -1 04:25:09
+ -1 04:25:09.0
+    -1 04:25:09
+  -1 04:25:09.0
+ -1 04:25:09.01
+     -1 04:25:09
+   -1 04:25:09.0
+  -1 04:25:09.01
+ -1 04:25:09.013
+      -1 04:25:09
+    -1 04:25:09.0
+   -1 04:25:09.01
+  -1 04:25:09.013
+ -1 04:25:09.0129
+       -1 04:25:09
+     -1 04:25:09.0
+    -1 04:25:09.01
+   -1 04:25:09.013
+  -1 04:25:09.0129
+ -1 04:25:09.01293
+        -1 04:25:09
+      -1 04:25:09.0
+     -1 04:25:09.01
+    -1 04:25:09.013
+   -1 04:25:09.0129
+  -1 04:25:09.01293
+ -1 04:25:09.012930
+ *****
+ -30:49
+  -30:49
+   -30:49
+ -30:49:27
+  -30:49:27
+  -30:49:27
+   -30:49:27
+ -30:49:27.5
+ -30:49:27.5
+    -30:49:27
+  -30:49:27.5
+ -30:49:27.52
+ -30:49:27.52
+     -30:49:27
+   -30:49:27.5
+  -30:49:27.52
+ -30:49:27.524
+ -30:49:27.524
+      -30:49:27
+    -30:49:27.5
+   -30:49:27.52
+  -30:49:27.524
+ -30:49:27.5237
+ -30:49:27.5237
+       -30:49:27
+     -30:49:27.5
+    -30:49:27.52
+   -30:49:27.524
+  -30:49:27.5237
+ -30:49:27.52375
+ -30:49:27.52375
+ -1 06:49
+  -1 06:49
+   -1 06:49
+ -1 06:49:27
+  -1 06:49:27
+   -1 06:49:27
+ -1 06:49:27.5
+    -1 06:49:27
+  -1 06:49:27.5
+ -1 06:49:27.52
+     -1 06:49:27
+   -1 06:49:27.5
+  -1 06:49:27.52
+ -1 06:49:27.524
+      -1 06:49:27
+    -1 06:49:27.5
+   -1 06:49:27.52
+  -1 06:49:27.524
+ -1 06:49:27.5237
+       -1 06:49:27
+     -1 06:49:27.5
+    -1 06:49:27.52
+   -1 06:49:27.524
+  -1 06:49:27.5237
+ -1 06:49:27.52375
+        -1 06:49:27
+      -1 06:49:27.5
+     -1 06:49:27.52
+    -1 06:49:27.524
+   -1 06:49:27.5237
+  -1 06:49:27.52375
+ -1 06:49:27.523750
+ *****
+ -26:57
+  -26:57
+   -26:57
+ -26:57:52
+  -26:57:52
+  -26:57:52
+   -26:57:52
+ -26:57:52.0
+ -26:57:52.0
+    -26:57:52
+  -26:57:52.0
+ -26:57:52.02
+ -26:57:52.02
+     -26:57:52
+   -26:57:52.0
+  -26:57:52.02
+ -26:57:52.016
+ -26:57:52.016
+      -26:57:52
+    -26:57:52.0
+   -26:57:52.02
+  -26:57:52.016
+ -26:57:52.0157
+ -26:57:52.0157
+       -26:57:52
+     -26:57:52.0
+    -26:57:52.02
+   -26:57:52.016
+  -26:57:52.0157
+ -26:57:52.01565
+ -26:57:52.01565
+ -1 02:57
+  -1 02:57
+   -1 02:57
+ -1 02:57:52
+  -1 02:57:52
+   -1 02:57:52
+ -1 02:57:52.0
+    -1 02:57:52
+  -1 02:57:52.0
+ -1 02:57:52.02
+     -1 02:57:52
+   -1 02:57:52.0
+  -1 02:57:52.02
+ -1 02:57:52.016
+      -1 02:57:52
+    -1 02:57:52.0
+   -1 02:57:52.02
+  -1 02:57:52.016
+ -1 02:57:52.0157
+       -1 02:57:52
+     -1 02:57:52.0
+    -1 02:57:52.02
+   -1 02:57:52.016
+  -1 02:57:52.0157
+ -1 02:57:52.01565
+        -1 02:57:52
+      -1 02:57:52.0
+     -1 02:57:52.02
+    -1 02:57:52.016
+   -1 02:57:52.0157
+  -1 02:57:52.01565
+ -1 02:57:52.015650
+ *****
+ -40:45
+  -40:45
+   -40:45
+ -40:45:44
+  -40:45:44
+  -40:45:44
+   -40:45:44
+ -40:45:44.9
+ -40:45:44.9
+    -40:45:44
+  -40:45:44.9
+ -40:45:44.87
+ -40:45:44.87
+     -40:45:44
+   -40:45:44.9
+  -40:45:44.87
+ -40:45:44.865
+ -40:45:44.865
+      -40:45:44
+    -40:45:44.9
+   -40:45:44.87
+  -40:45:44.865
+ -40:45:44.8653
+ -40:45:44.8653
+       -40:45:44
+     -40:45:44.9
+    -40:45:44.87
+   -40:45:44.865
+  -40:45:44.8653
+ -40:45:44.86529
+ -40:45:44.86529
+ -1 16:45
+  -1 16:45
+   -1 16:45
+ -1 16:45:44
+  -1 16:45:44
+   -1 16:45:44
+ -1 16:45:44.9
+    -1 16:45:44
+  -1 16:45:44.9
+ -1 16:45:44.87
+     -1 16:45:44
+   -1 16:45:44.9
+  -1 16:45:44.87
+ -1 16:45:44.865
+      -1 16:45:44
+    -1 16:45:44.9
+   -1 16:45:44.87
+  -1 16:45:44.865
+ -1 16:45:44.8653
+       -1 16:45:44
+     -1 16:45:44.9
+    -1 16:45:44.87
+   -1 16:45:44.865
+  -1 16:45:44.8653
+ -1 16:45:44.86529
+        -1 16:45:44
+      -1 16:45:44.9
+     -1 16:45:44.87
+    -1 16:45:44.865
+   -1 16:45:44.8653
+  -1 16:45:44.86529
+ -1 16:45:44.865290
+ *****
+ -45:30
+  -45:30
+   -45:30
+ -45:30:57
+  -45:30:57
+  -45:30:57
+   -45:30:57
+ -45:30:57.8
+ -45:30:57.8
+    -45:30:57
+  -45:30:57.8
+ -45:30:57.82
+ -45:30:57.82
+     -45:30:57
+   -45:30:57.8
+  -45:30:57.82
+ -45:30:57.820
+ -45:30:57.820
+      -45:30:57
+    -45:30:57.8
+   -45:30:57.82
+  -45:30:57.820
+ -45:30:57.8205
+ -45:30:57.8205
+       -45:30:57
+     -45:30:57.8
+    -45:30:57.82
+   -45:30:57.820
+  -45:30:57.8205
+ -45:30:57.82047
+ -45:30:57.82047
+ -1 21:30
+  -1 21:30
+   -1 21:30
+ -1 21:30:57
+  -1 21:30:57
+   -1 21:30:57
+ -1 21:30:57.8
+    -1 21:30:57
+  -1 21:30:57.8
+ -1 21:30:57.82
+     -1 21:30:57
+   -1 21:30:57.8
+  -1 21:30:57.82
+ -1 21:30:57.820
+      -1 21:30:57
+    -1 21:30:57.8
+   -1 21:30:57.82
+  -1 21:30:57.820
+ -1 21:30:57.8205
+       -1 21:30:57
+     -1 21:30:57.8
+    -1 21:30:57.82
+   -1 21:30:57.820
+  -1 21:30:57.8205
+ -1 21:30:57.82047
+        -1 21:30:57
+      -1 21:30:57.8
+     -1 21:30:57.82
+    -1 21:30:57.820
+   -1 21:30:57.8205
+  -1 21:30:57.82047
+ -1 21:30:57.820470
+ *****
+ -28:25
+  -28:25
+   -28:25
+ -28:25:09
+  -28:25:09
+  -28:25:09
+   -28:25:09
+ -28:25:09.2
+ -28:25:09.2
+    -28:25:09
+  -28:25:09.2
+ -28:25:09.15
+ -28:25:09.15
+     -28:25:09
+   -28:25:09.2
+  -28:25:09.15
+ -28:25:09.154
+ -28:25:09.154
+      -28:25:09
+    -28:25:09.2
+   -28:25:09.15
+  -28:25:09.154
+ -28:25:09.1540
+ -28:25:09.1540
+       -28:25:09
+     -28:25:09.2
+    -28:25:09.15
+   -28:25:09.154
+  -28:25:09.1540
+ -28:25:09.15395
+ -28:25:09.15395
+ -1 04:25
+  -1 04:25
+   -1 04:25
+ -1 04:25:09
+  -1 04:25:09
+   -1 04:25:09
+ -1 04:25:09.2
+    -1 04:25:09
+  -1 04:25:09.2
+ -1 04:25:09.15
+     -1 04:25:09
+   -1 04:25:09.2
+  -1 04:25:09.15
+ -1 04:25:09.154
+      -1 04:25:09
+    -1 04:25:09.2
+   -1 04:25:09.15
+  -1 04:25:09.154
+ -1 04:25:09.1540
+       -1 04:25:09
+     -1 04:25:09.2
+    -1 04:25:09.15
+   -1 04:25:09.154
+  -1 04:25:09.1540
+ -1 04:25:09.15395
+        -1 04:25:09
+      -1 04:25:09.2
+     -1 04:25:09.15
+    -1 04:25:09.154
+   -1 04:25:09.1540
+  -1 04:25:09.15395
+ -1 04:25:09.153950
+ *****
+ -30:49
+  -30:49
+   -30:49
+ -30:49:27
+  -30:49:27
+  -30:49:27
+   -30:49:27
+ -30:49:27.1
+ -30:49:27.1
+    -30:49:27
+  -30:49:27.1
+ -30:49:27.11
+ -30:49:27.11
+     -30:49:27
+   -30:49:27.1
+  -30:49:27.11
+ -30:49:27.105
+ -30:49:27.105
+      -30:49:27
+    -30:49:27.1
+   -30:49:27.11
+  -30:49:27.105
+ -30:49:27.1053
+ -30:49:27.1053
+       -30:49:27
+     -30:49:27.1
+    -30:49:27.11
+   -30:49:27.105
+  -30:49:27.1053
+ -30:49:27.10533
+ -30:49:27.10533
+ -1 06:49
+  -1 06:49
+   -1 06:49
+ -1 06:49:27
+  -1 06:49:27
+   -1 06:49:27
+ -1 06:49:27.1
+    -1 06:49:27
+  -1 06:49:27.1
+ -1 06:49:27.11
+     -1 06:49:27
+   -1 06:49:27.1
+  -1 06:49:27.11
+ -1 06:49:27.105
+      -1 06:49:27
+    -1 06:49:27.1
+   -1 06:49:27.11
+  -1 06:49:27.105
+ -1 06:49:27.1053
+       -1 06:49:27
+     -1 06:49:27.1
+    -1 06:49:27.11
+   -1 06:49:27.105
+  -1 06:49:27.1053
+ -1 06:49:27.10533
+        -1 06:49:27
+      -1 06:49:27.1
+     -1 06:49:27.11
+    -1 06:49:27.105
+   -1 06:49:27.1053
+  -1 06:49:27.10533
+ -1 06:49:27.105330
+ *****
+ -26:57
+  -26:57
+   -26:57
+ -26:57:52
+  -26:57:52
+  -26:57:52
+   -26:57:52
+ -26:57:52.5
+ -26:57:52.5
+    -26:57:52
+  -26:57:52.5
+ -26:57:52.48
+ -26:57:52.48
+     -26:57:52
+   -26:57:52.5
+  -26:57:52.48
+ -26:57:52.482
+ -26:57:52.482
+      -26:57:52
+    -26:57:52.5
+   -26:57:52.48
+  -26:57:52.482
+ -26:57:52.4823
+ -26:57:52.4823
+       -26:57:52
+     -26:57:52.5
+    -26:57:52.48
+   -26:57:52.482
+  -26:57:52.4823
+ -26:57:52.48229
+ -26:57:52.48229
+ -1 02:57
+  -1 02:57
+   -1 02:57
+ -1 02:57:52
+  -1 02:57:52
+   -1 02:57:52
+ -1 02:57:52.5
+    -1 02:57:52
+  -1 02:57:52.5
+ -1 02:57:52.48
+     -1 02:57:52
+   -1 02:57:52.5
+  -1 02:57:52.48
+ -1 02:57:52.482
+      -1 02:57:52
+    -1 02:57:52.5
+   -1 02:57:52.48
+  -1 02:57:52.482
+ -1 02:57:52.4823
+       -1 02:57:52
+     -1 02:57:52.5
+    -1 02:57:52.48
+   -1 02:57:52.482
+  -1 02:57:52.4823
+ -1 02:57:52.48229
+        -1 02:57:52
+      -1 02:57:52.5
+     -1 02:57:52.48
+    -1 02:57:52.482
+   -1 02:57:52.4823
+  -1 02:57:52.48229
+ -1 02:57:52.482290
+ *****
+ -40:45
+  -40:45
+   -40:45
+ -40:45:44
+  -40:45:44
+  -40:45:44
+   -40:45:44
+ -40:45:44.7
+ -40:45:44.7
+    -40:45:44
+  -40:45:44.7
+ -40:45:44.66
+ -40:45:44.66
+     -40:45:44
+   -40:45:44.7
+  -40:45:44.66
+ -40:45:44.658
+ -40:45:44.658
+      -40:45:44
+    -40:45:44.7
+   -40:45:44.66
+  -40:45:44.658
+ -40:45:44.6583
+ -40:45:44.6583
+       -40:45:44
+     -40:45:44.7
+    -40:45:44.66
+   -40:45:44.658
+  -40:45:44.6583
+ -40:45:44.65827
+ -40:45:44.65827
+ -1 16:45
+  -1 16:45
+   -1 16:45
+ -1 16:45:44
+  -1 16:45:44
+   -1 16:45:44
+ -1 16:45:44.7
+    -1 16:45:44
+  -1 16:45:44.7
+ -1 16:45:44.66
+     -1 16:45:44
+   -1 16:45:44.7
+  -1 16:45:44.66
+ -1 16:45:44.658
+      -1 16:45:44
+    -1 16:45:44.7
+   -1 16:45:44.66
+  -1 16:45:44.658
+ -1 16:45:44.6583
+       -1 16:45:44
+     -1 16:45:44.7
+    -1 16:45:44.66
+   -1 16:45:44.658
+  -1 16:45:44.6583
+ -1 16:45:44.65827
+        -1 16:45:44
+      -1 16:45:44.7
+     -1 16:45:44.66
+    -1 16:45:44.658
+   -1 16:45:44.6583
+  -1 16:45:44.65827
+ -1 16:45:44.658270
+ *****
+ -45:30
+  -45:30
+   -45:30
+ -45:30:57
+  -45:30:57
+  -45:30:57
+   -45:30:57
+ -45:30:57.6
+ -45:30:57.6
+    -45:30:57
+  -45:30:57.6
+ -45:30:57.58
+ -45:30:57.58
+     -45:30:57
+   -45:30:57.6
+  -45:30:57.58
+ -45:30:57.582
+ -45:30:57.582
+      -45:30:57
+    -45:30:57.6
+   -45:30:57.58
+  -45:30:57.582
+ -45:30:57.5822
+ -45:30:57.5822
+       -45:30:57
+     -45:30:57.6
+    -45:30:57.58
+   -45:30:57.582
+  -45:30:57.5822
+ -45:30:57.58219
+ -45:30:57.58219
+ -1 21:30
+  -1 21:30
+   -1 21:30
+ -1 21:30:57
+  -1 21:30:57
+   -1 21:30:57
+ -1 21:30:57.6
+    -1 21:30:57
+  -1 21:30:57.6
+ -1 21:30:57.58
+     -1 21:30:57
+   -1 21:30:57.6
+  -1 21:30:57.58
+ -1 21:30:57.582
+      -1 21:30:57
+    -1 21:30:57.6
+   -1 21:30:57.58
+  -1 21:30:57.582
+ -1 21:30:57.5822
+       -1 21:30:57
+     -1 21:30:57.6
+    -1 21:30:57.58
+   -1 21:30:57.582
+  -1 21:30:57.5822
+ -1 21:30:57.58219
+        -1 21:30:57
+      -1 21:30:57.6
+     -1 21:30:57.58
+    -1 21:30:57.582
+   -1 21:30:57.5822
+  -1 21:30:57.58219
+ -1 21:30:57.582190
+ *****
+ -46:30
+  -46:30
+   -46:30
+ -46:30:04
+  -46:30:04
+  -46:30:04
+   -46:30:04
+ -46:30:04.2
+ -46:30:04.2
+    -46:30:04
+  -46:30:04.2
+ -46:30:04.18
+ -46:30:04.18
+     -46:30:04
+   -46:30:04.2
+  -46:30:04.18
+ -46:30:04.183
+ -46:30:04.183
+      -46:30:04
+    -46:30:04.2
+   -46:30:04.18
+  -46:30:04.183
+ -46:30:04.1835
+ -46:30:04.1835
+       -46:30:04
+     -46:30:04.2
+    -46:30:04.18
+   -46:30:04.183
+  -46:30:04.1835
+ -46:30:04.18347
+ -46:30:04.18347
+ -1 22:30
+  -1 22:30
+   -1 22:30
+ -1 22:30:04
+  -1 22:30:04
+   -1 22:30:04
+ -1 22:30:04.2
+    -1 22:30:04
+  -1 22:30:04.2
+ -1 22:30:04.18
+     -1 22:30:04
+   -1 22:30:04.2
+  -1 22:30:04.18
+ -1 22:30:04.183
+      -1 22:30:04
+    -1 22:30:04.2
+   -1 22:30:04.18
+  -1 22:30:04.183
+ -1 22:30:04.1835
+       -1 22:30:04
+     -1 22:30:04.2
+    -1 22:30:04.18
+   -1 22:30:04.183
+  -1 22:30:04.1835
+ -1 22:30:04.18347
+        -1 22:30:04
+      -1 22:30:04.2
+     -1 22:30:04.18
+    -1 22:30:04.183
+   -1 22:30:04.1835
+  -1 22:30:04.18347
+ -1 22:30:04.183470
+ *****
+ -25:56
+  -25:56
+   -25:56
+ -25:56:51
+  -25:56:51
+  -25:56:51
+   -25:56:51
+ -25:56:51.6
+ -25:56:51.6
+    -25:56:51
+  -25:56:51.6
+ -25:56:51.59
+ -25:56:51.59
+     -25:56:51
+   -25:56:51.6
+  -25:56:51.59
+ -25:56:51.593
+ -25:56:51.593
+      -25:56:51
+    -25:56:51.6
+   -25:56:51.59
+  -25:56:51.593
+ -25:56:51.5932
+ -25:56:51.5932
+       -25:56:51
+     -25:56:51.6
+    -25:56:51.59
+   -25:56:51.593
+  -25:56:51.5932
+ -25:56:51.59319
+ -25:56:51.59319
+ -1 01:56
+  -1 01:56
+   -1 01:56
+ -1 01:56:51
+  -1 01:56:51
+   -1 01:56:51
+ -1 01:56:51.6
+    -1 01:56:51
+  -1 01:56:51.6
+ -1 01:56:51.59
+     -1 01:56:51
+   -1 01:56:51.6
+  -1 01:56:51.59
+ -1 01:56:51.593
+      -1 01:56:51
+    -1 01:56:51.6
+   -1 01:56:51.59
+  -1 01:56:51.593
+ -1 01:56:51.5932
+       -1 01:56:51
+     -1 01:56:51.6
+    -1 01:56:51.59
+   -1 01:56:51.593
+  -1 01:56:51.5932
+ -1 01:56:51.59319
+        -1 01:56:51
+      -1 01:56:51.6
+     -1 01:56:51.59
+    -1 01:56:51.593
+   -1 01:56:51.5932
+  -1 01:56:51.59319
+ -1 01:56:51.593190
+ *****
+ -48:00
+  -48:00
+   -48:00
+ -48:00:00
+  -48:00:00
+  -48:00:00
+   -48:00:00
+ -48:00:00.0
+ -48:00:00.0
+    -48:00:00
+  -48:00:00.0
+ -48:00:00.00
+ -48:00:00.00
+     -48:00:00
+   -48:00:00.0
+  -48:00:00.00
+ -48:00:00.000
+ -48:00:00.000
+      -48:00:00
+    -48:00:00.0
+   -48:00:00.00
+  -48:00:00.000
+ -48:00:00.0000
+ -48:00:00.0000
+       -48:00:00
+     -48:00:00.0
+    -48:00:00.00
+   -48:00:00.000
+  -48:00:00.0000
+ -48:00:00.00000
+ -48:00:00.00000
+ -2 00:00
+  -2 00:00
+   -2 00:00
+ -2 00:00:00
+  -2 00:00:00
+   -2 00:00:00
+ -2 00:00:00.0
+    -2 00:00:00
+  -2 00:00:00.0
+ -2 00:00:00.00
+     -2 00:00:00
+   -2 00:00:00.0
+  -2 00:00:00.00
+ -2 00:00:00.000
+      -2 00:00:00
+    -2 00:00:00.0
+   -2 00:00:00.00
+  -2 00:00:00.000
+ -2 00:00:00.0000
+       -2 00:00:00
+     -2 00:00:00.0
+    -2 00:00:00.00
+   -2 00:00:00.000
+  -2 00:00:00.0000
+ -2 00:00:00.00000
+        -2 00:00:00
+      -2 00:00:00.0
+     -2 00:00:00.00
+    -2 00:00:00.000
+   -2 00:00:00.0000
+  -2 00:00:00.00000
+ -2 00:00:00.000000
+ *****
+ -52:50
+  -52:50
+   -52:50
+ -52:50:38
+  -52:50:38
+  -52:50:38
+   -52:50:38
+ -52:50:38.1
+ -52:50:38.1
+    -52:50:38
+  -52:50:38.1
+ -52:50:38.12
+ -52:50:38.12
+     -52:50:38
+   -52:50:38.1
+  -52:50:38.12
+ -52:50:38.123
+ -52:50:38.123
+      -52:50:38
+    -52:50:38.1
+   -52:50:38.12
+  -52:50:38.123
+ -52:50:38.1230
+ -52:50:38.1230
+       -52:50:38
+     -52:50:38.1
+    -52:50:38.12
+   -52:50:38.123
+  -52:50:38.1230
+ -52:50:38.12301
+ -52:50:38.12301
+ -2 04:50
+  -2 04:50
+   -2 04:50
+ -2 04:50:38
+  -2 04:50:38
+   -2 04:50:38
+ -2 04:50:38.1
+    -2 04:50:38
+  -2 04:50:38.1
+ -2 04:50:38.12
+     -2 04:50:38
+   -2 04:50:38.1
+  -2 04:50:38.12
+ -2 04:50:38.123
+      -2 04:50:38
+    -2 04:50:38.1
+   -2 04:50:38.12
+  -2 04:50:38.123
+ -2 04:50:38.1230
+       -2 04:50:38
+     -2 04:50:38.1
+    -2 04:50:38.12
+   -2 04:50:38.123
+  -2 04:50:38.1230
+ -2 04:50:38.12301
+        -2 04:50:38
+      -2 04:50:38.1
+     -2 04:50:38.12
+    -2 04:50:38.123
+   -2 04:50:38.1230
+  -2 04:50:38.12301
+ -2 04:50:38.123010
+ *****
+ -60:31
+  -60:31
+   -60:31
+ -60:31:35
+  -60:31:35
+  -60:31:35
+   -60:31:35
+ -60:31:35.2
+ -60:31:35.2
+    -60:31:35
+  -60:31:35.2
+ -60:31:35.23
+ -60:31:35.23
+     -60:31:35
+   -60:31:35.2
+  -60:31:35.23
+ -60:31:35.235
+ -60:31:35.235
+      -60:31:35
+    -60:31:35.2
+   -60:31:35.23
+  -60:31:35.235
+ -60:31:35.2345
+ -60:31:35.2345
+       -60:31:35
+     -60:31:35.2
+    -60:31:35.23
+   -60:31:35.235
+  -60:31:35.2345
+ -60:31:35.23453
+ -60:31:35.23453
+ -2 12:31
+  -2 12:31
+   -2 12:31
+ -2 12:31:35
+  -2 12:31:35
+   -2 12:31:35
+ -2 12:31:35.2
+    -2 12:31:35
+  -2 12:31:35.2
+ -2 12:31:35.23
+     -2 12:31:35
+   -2 12:31:35.2
+  -2 12:31:35.23
+ -2 12:31:35.235
+      -2 12:31:35
+    -2 12:31:35.2
+   -2 12:31:35.23
+  -2 12:31:35.235
+ -2 12:31:35.2345
+       -2 12:31:35
+     -2 12:31:35.2
+    -2 12:31:35.23
+   -2 12:31:35.235
+  -2 12:31:35.2345
+ -2 12:31:35.23453
+        -2 12:31:35
+      -2 12:31:35.2
+     -2 12:31:35.23
+    -2 12:31:35.235
+   -2 12:31:35.2345
+  -2 12:31:35.23453
+ -2 12:31:35.234530
+ *****
+ -60:47
+  -60:47
+   -60:47
+ -60:47:53
+  -60:47:53
+  -60:47:53
+   -60:47:53
+ -60:47:53.3
+ -60:47:53.3
+    -60:47:53
+  -60:47:53.3
+ -60:47:53.35
+ -60:47:53.35
+     -60:47:53
+   -60:47:53.3
+  -60:47:53.35
+ -60:47:53.345
+ -60:47:53.345
+      -60:47:53
+    -60:47:53.3
+   -60:47:53.35
+  -60:47:53.345
+ -60:47:53.3451
+ -60:47:53.3451
+       -60:47:53
+     -60:47:53.3
+    -60:47:53.35
+   -60:47:53.345
+  -60:47:53.3451
+ -60:47:53.34505
+ -60:47:53.34505
+ -2 12:47
+  -2 12:47
+   -2 12:47
+ -2 12:47:53
+  -2 12:47:53
+   -2 12:47:53
+ -2 12:47:53.3
+    -2 12:47:53
+  -2 12:47:53.3
+ -2 12:47:53.35
+     -2 12:47:53
+   -2 12:47:53.3
+  -2 12:47:53.35
+ -2 12:47:53.345
+      -2 12:47:53
+    -2 12:47:53.3
+   -2 12:47:53.35
+  -2 12:47:53.345
+ -2 12:47:53.3451
+       -2 12:47:53
+     -2 12:47:53.3
+    -2 12:47:53.35
+   -2 12:47:53.345
+  -2 12:47:53.3451
+ -2 12:47:53.34505
+        -2 12:47:53
+      -2 12:47:53.3
+     -2 12:47:53.35
+    -2 12:47:53.345
+   -2 12:47:53.3451
+  -2 12:47:53.34505
+ -2 12:47:53.345050
+ *****
+ -49:26
+  -49:26
+   -49:26
+ -49:26:00
+  -49:26:00
+  -49:26:00
+   -49:26:00
+ -49:26:00.5
+ -49:26:00.5
+    -49:26:00
+  -49:26:00.5
+ -49:26:00.46
+ -49:26:00.46
+     -49:26:00
+   -49:26:00.5
+  -49:26:00.46
+ -49:26:00.456
+ -49:26:00.456
+      -49:26:00
+    -49:26:00.5
+   -49:26:00.46
+  -49:26:00.456
+ -49:26:00.4562
+ -49:26:00.4562
+       -49:26:00
+     -49:26:00.5
+    -49:26:00.46
+   -49:26:00.456
+  -49:26:00.4562
+ -49:26:00.45615
+ -49:26:00.45615
+ -2 01:26
+  -2 01:26
+   -2 01:26
+ -2 01:26:00
+  -2 01:26:00
+   -2 01:26:00
+ -2 01:26:00.5
+    -2 01:26:00
+  -2 01:26:00.5
+ -2 01:26:00.46
+     -2 01:26:00
+   -2 01:26:00.5
+  -2 01:26:00.46
+ -2 01:26:00.456
+      -2 01:26:00
+    -2 01:26:00.5
+   -2 01:26:00.46
+  -2 01:26:00.456
+ -2 01:26:00.4562
+       -2 01:26:00
+     -2 01:26:00.5
+    -2 01:26:00.46
+   -2 01:26:00.456
+  -2 01:26:00.4562
+ -2 01:26:00.45615
+        -2 01:26:00
+      -2 01:26:00.5
+     -2 01:26:00.46
+    -2 01:26:00.456
+   -2 01:26:00.4562
+  -2 01:26:00.45615
+ -2 01:26:00.456150
+ *****
+ -68:58
+  -68:58
+   -68:58
+ -68:58:11
+  -68:58:11
+  -68:58:11
+   -68:58:11
+ -68:58:11.6
+ -68:58:11.6
+    -68:58:11
+  -68:58:11.6
+ -68:58:11.57
+ -68:58:11.57
+     -68:58:11
+   -68:58:11.6
+  -68:58:11.57
+ -68:58:11.567
+ -68:58:11.567
+      -68:58:11
+    -68:58:11.6
+   -68:58:11.57
+  -68:58:11.567
+ -68:58:11.5668
+ -68:58:11.5668
+       -68:58:11
+     -68:58:11.6
+    -68:58:11.57
+   -68:58:11.567
+  -68:58:11.5668
+ -68:58:11.56677
+ -68:58:11.56677
+ -2 20:58
+  -2 20:58
+   -2 20:58
+ -2 20:58:11
+  -2 20:58:11
+   -2 20:58:11
+ -2 20:58:11.6
+    -2 20:58:11
+  -2 20:58:11.6
+ -2 20:58:11.57
+     -2 20:58:11
+   -2 20:58:11.6
+  -2 20:58:11.57
+ -2 20:58:11.567
+      -2 20:58:11
+    -2 20:58:11.6
+   -2 20:58:11.57
+  -2 20:58:11.567
+ -2 20:58:11.5668
+       -2 20:58:11
+     -2 20:58:11.6
+    -2 20:58:11.57
+   -2 20:58:11.567
+  -2 20:58:11.5668
+ -2 20:58:11.56677
+        -2 20:58:11
+      -2 20:58:11.6
+     -2 20:58:11.57
+    -2 20:58:11.567
+   -2 20:58:11.5668
+  -2 20:58:11.56677
+ -2 20:58:11.566770
+ *****
+ -55:36
+  -55:36
+   -55:36
+ -55:36:05
+  -55:36:05
+  -55:36:05
+   -55:36:05
+ -55:36:05.2
+ -55:36:05.2
+    -55:36:05
+  -55:36:05.2
+ -55:36:05.19
+ -55:36:05.19
+     -55:36:05
+   -55:36:05.2
+  -55:36:05.19
+ -55:36:05.190
+ -55:36:05.190
+      -55:36:05
+    -55:36:05.2
+   -55:36:05.19
+  -55:36:05.190
+ -55:36:05.1896
+ -55:36:05.1896
+       -55:36:05
+     -55:36:05.2
+    -55:36:05.19
+   -55:36:05.190
+  -55:36:05.1896
+ -55:36:05.18964
+ -55:36:05.18964
+ -2 07:36
+  -2 07:36
+   -2 07:36
+ -2 07:36:05
+  -2 07:36:05
+   -2 07:36:05
+ -2 07:36:05.2
+    -2 07:36:05
+  -2 07:36:05.2
+ -2 07:36:05.19
+     -2 07:36:05
+   -2 07:36:05.2
+  -2 07:36:05.19
+ -2 07:36:05.190
+      -2 07:36:05
+    -2 07:36:05.2
+   -2 07:36:05.19
+  -2 07:36:05.190
+ -2 07:36:05.1896
+       -2 07:36:05
+     -2 07:36:05.2
+    -2 07:36:05.19
+   -2 07:36:05.190
+  -2 07:36:05.1896
+ -2 07:36:05.18964
+        -2 07:36:05
+      -2 07:36:05.2
+     -2 07:36:05.19
+    -2 07:36:05.190
+   -2 07:36:05.1896
+  -2 07:36:05.18964
+ -2 07:36:05.189640
+ *****
+ -63:43
+  -63:43
+   -63:43
+ -63:43:49
+  -63:43:49
+  -63:43:49
+   -63:43:49
+ -63:43:49.8
+ -63:43:49.8
+    -63:43:49
+  -63:43:49.8
+ -63:43:49.83
+ -63:43:49.83
+     -63:43:49
+   -63:43:49.8
+  -63:43:49.83
+ -63:43:49.831
+ -63:43:49.831
+      -63:43:49
+    -63:43:49.8
+   -63:43:49.83
+  -63:43:49.831
+ -63:43:49.8313
+ -63:43:49.8313
+       -63:43:49
+     -63:43:49.8
+    -63:43:49.83
+   -63:43:49.831
+  -63:43:49.8313
+ -63:43:49.83132
+ -63:43:49.83132
+ -2 15:43
+  -2 15:43
+   -2 15:43
+ -2 15:43:49
+  -2 15:43:49
+   -2 15:43:49
+ -2 15:43:49.8
+    -2 15:43:49
+  -2 15:43:49.8
+ -2 15:43:49.83
+     -2 15:43:49
+   -2 15:43:49.8
+  -2 15:43:49.83
+ -2 15:43:49.831
+      -2 15:43:49
+    -2 15:43:49.8
+   -2 15:43:49.83
+  -2 15:43:49.831
+ -2 15:43:49.8313
+       -2 15:43:49
+     -2 15:43:49.8
+    -2 15:43:49.83
+   -2 15:43:49.831
+  -2 15:43:49.8313
+ -2 15:43:49.83132
+        -2 15:43:49
+      -2 15:43:49.8
+     -2 15:43:49.83
+    -2 15:43:49.831
+   -2 15:43:49.8313
+  -2 15:43:49.83132
+ -2 15:43:49.831320
+ *****
+ -52:25
+  -52:25
+   -52:25
+ -52:25:09
+  -52:25:09
+  -52:25:09
+   -52:25:09
+ -52:25:09.0
+ -52:25:09.0
+    -52:25:09
+  -52:25:09.0
+ -52:25:09.01
+ -52:25:09.01
+     -52:25:09
+   -52:25:09.0
+  -52:25:09.01
+ -52:25:09.013
+ -52:25:09.013
+      -52:25:09
+    -52:25:09.0
+   -52:25:09.01
+  -52:25:09.013
+ -52:25:09.0129
+ -52:25:09.0129
+       -52:25:09
+     -52:25:09.0
+    -52:25:09.01
+   -52:25:09.013
+  -52:25:09.0129
+ -52:25:09.01293
+ -52:25:09.01293
+ -2 04:25
+  -2 04:25
+   -2 04:25
+ -2 04:25:09
+  -2 04:25:09
+   -2 04:25:09
+ -2 04:25:09.0
+    -2 04:25:09
+  -2 04:25:09.0
+ -2 04:25:09.01
+     -2 04:25:09
+   -2 04:25:09.0
+  -2 04:25:09.01
+ -2 04:25:09.013
+      -2 04:25:09
+    -2 04:25:09.0
+   -2 04:25:09.01
+  -2 04:25:09.013
+ -2 04:25:09.0129
+       -2 04:25:09
+     -2 04:25:09.0
+    -2 04:25:09.01
+   -2 04:25:09.013
+  -2 04:25:09.0129
+ -2 04:25:09.01293
+        -2 04:25:09
+      -2 04:25:09.0
+     -2 04:25:09.01
+    -2 04:25:09.013
+   -2 04:25:09.0129
+  -2 04:25:09.01293
+ -2 04:25:09.012930
+ *****
+ -54:49
+  -54:49
+   -54:49
+ -54:49:27
+  -54:49:27
+  -54:49:27
+   -54:49:27
+ -54:49:27.5
+ -54:49:27.5
+    -54:49:27
+  -54:49:27.5
+ -54:49:27.52
+ -54:49:27.52
+     -54:49:27
+   -54:49:27.5
+  -54:49:27.52
+ -54:49:27.524
+ -54:49:27.524
+      -54:49:27
+    -54:49:27.5
+   -54:49:27.52
+  -54:49:27.524
+ -54:49:27.5237
+ -54:49:27.5237
+       -54:49:27
+     -54:49:27.5
+    -54:49:27.52
+   -54:49:27.524
+  -54:49:27.5237
+ -54:49:27.52375
+ -54:49:27.52375
+ -2 06:49
+  -2 06:49
+   -2 06:49
+ -2 06:49:27
+  -2 06:49:27
+   -2 06:49:27
+ -2 06:49:27.5
+    -2 06:49:27
+  -2 06:49:27.5
+ -2 06:49:27.52
+     -2 06:49:27
+   -2 06:49:27.5
+  -2 06:49:27.52
+ -2 06:49:27.524
+      -2 06:49:27
+    -2 06:49:27.5
+   -2 06:49:27.52
+  -2 06:49:27.524
+ -2 06:49:27.5237
+       -2 06:49:27
+     -2 06:49:27.5
+    -2 06:49:27.52
+   -2 06:49:27.524
+  -2 06:49:27.5237
+ -2 06:49:27.52375
+        -2 06:49:27
+      -2 06:49:27.5
+     -2 06:49:27.52
+    -2 06:49:27.524
+   -2 06:49:27.5237
+  -2 06:49:27.52375
+ -2 06:49:27.523750
+ *****
+ -50:57
+  -50:57
+   -50:57
+ -50:57:52
+  -50:57:52
+  -50:57:52
+   -50:57:52
+ -50:57:52.0
+ -50:57:52.0
+    -50:57:52
+  -50:57:52.0
+ -50:57:52.02
+ -50:57:52.02
+     -50:57:52
+   -50:57:52.0
+  -50:57:52.02
+ -50:57:52.016
+ -50:57:52.016
+      -50:57:52
+    -50:57:52.0
+   -50:57:52.02
+  -50:57:52.016
+ -50:57:52.0156
+ -50:57:52.0156
+       -50:57:52
+     -50:57:52.0
+    -50:57:52.02
+   -50:57:52.016
+  -50:57:52.0156
+ -50:57:52.01565
+ -50:57:52.01565
+ -2 02:57
+  -2 02:57
+   -2 02:57
+ -2 02:57:52
+  -2 02:57:52
+   -2 02:57:52
+ -2 02:57:52.0
+    -2 02:57:52
+  -2 02:57:52.0
+ -2 02:57:52.02
+     -2 02:57:52
+   -2 02:57:52.0
+  -2 02:57:52.02
+ -2 02:57:52.016
+      -2 02:57:52
+    -2 02:57:52.0
+   -2 02:57:52.02
+  -2 02:57:52.016
+ -2 02:57:52.0156
+       -2 02:57:52
+     -2 02:57:52.0
+    -2 02:57:52.02
+   -2 02:57:52.016
+  -2 02:57:52.0156
+ -2 02:57:52.01565
+        -2 02:57:52
+      -2 02:57:52.0
+     -2 02:57:52.02
+    -2 02:57:52.016
+   -2 02:57:52.0156
+  -2 02:57:52.01565
+ -2 02:57:52.015650
+ *****
+ -64:45
+  -64:45
+   -64:45
+ -64:45:44
+  -64:45:44
+  -64:45:44
+   -64:45:44
+ -64:45:44.9
+ -64:45:44.9
+    -64:45:44
+  -64:45:44.9
+ -64:45:44.87
+ -64:45:44.87
+     -64:45:44
+   -64:45:44.9
+  -64:45:44.87
+ -64:45:44.865
+ -64:45:44.865
+      -64:45:44
+    -64:45:44.9
+   -64:45:44.87
+  -64:45:44.865
+ -64:45:44.8653
+ -64:45:44.8653
+       -64:45:44
+     -64:45:44.9
+    -64:45:44.87
+   -64:45:44.865
+  -64:45:44.8653
+ -64:45:44.86529
+ -64:45:44.86529
+ -2 16:45
+  -2 16:45
+   -2 16:45
+ -2 16:45:44
+  -2 16:45:44
+   -2 16:45:44
+ -2 16:45:44.9
+    -2 16:45:44
+  -2 16:45:44.9
+ -2 16:45:44.87
+     -2 16:45:44
+   -2 16:45:44.9
+  -2 16:45:44.87
+ -2 16:45:44.865
+      -2 16:45:44
+    -2 16:45:44.9
+   -2 16:45:44.87
+  -2 16:45:44.865
+ -2 16:45:44.8653
+       -2 16:45:44
+     -2 16:45:44.9
+    -2 16:45:44.87
+   -2 16:45:44.865
+  -2 16:45:44.8653
+ -2 16:45:44.86529
+        -2 16:45:44
+      -2 16:45:44.9
+     -2 16:45:44.87
+    -2 16:45:44.865
+   -2 16:45:44.8653
+  -2 16:45:44.86529
+ -2 16:45:44.865290
+ *****
+ -69:30
+  -69:30
+   -69:30
+ -69:30:57
+  -69:30:57
+  -69:30:57
+   -69:30:57
+ -69:30:57.8
+ -69:30:57.8
+    -69:30:57
+  -69:30:57.8
+ -69:30:57.82
+ -69:30:57.82
+     -69:30:57
+   -69:30:57.8
+  -69:30:57.82
+ -69:30:57.820
+ -69:30:57.820
+      -69:30:57
+    -69:30:57.8
+   -69:30:57.82
+  -69:30:57.820
+ -69:30:57.8205
+ -69:30:57.8205
+       -69:30:57
+     -69:30:57.8
+    -69:30:57.82
+   -69:30:57.820
+  -69:30:57.8205
+ -69:30:57.82047
+ -69:30:57.82047
+ -2 21:30
+  -2 21:30
+   -2 21:30
+ -2 21:30:57
+  -2 21:30:57
+   -2 21:30:57
+ -2 21:30:57.8
+    -2 21:30:57
+  -2 21:30:57.8
+ -2 21:30:57.82
+     -2 21:30:57
+   -2 21:30:57.8
+  -2 21:30:57.82
+ -2 21:30:57.820
+      -2 21:30:57
+    -2 21:30:57.8
+   -2 21:30:57.82
+  -2 21:30:57.820
+ -2 21:30:57.8205
+       -2 21:30:57
+     -2 21:30:57.8
+    -2 21:30:57.82
+   -2 21:30:57.820
+  -2 21:30:57.8205
+ -2 21:30:57.82047
+        -2 21:30:57
+      -2 21:30:57.8
+     -2 21:30:57.82
+    -2 21:30:57.820
+   -2 21:30:57.8205
+  -2 21:30:57.82047
+ -2 21:30:57.820470
+ *****
+ -52:25
+  -52:25
+   -52:25
+ -52:25:09
+  -52:25:09
+  -52:25:09
+   -52:25:09
+ -52:25:09.2
+ -52:25:09.2
+    -52:25:09
+  -52:25:09.2
+ -52:25:09.15
+ -52:25:09.15
+     -52:25:09
+   -52:25:09.2
+  -52:25:09.15
+ -52:25:09.154
+ -52:25:09.154
+      -52:25:09
+    -52:25:09.2
+   -52:25:09.15
+  -52:25:09.154
+ -52:25:09.1540
+ -52:25:09.1540
+       -52:25:09
+     -52:25:09.2
+    -52:25:09.15
+   -52:25:09.154
+  -52:25:09.1540
+ -52:25:09.15395
+ -52:25:09.15395
+ -2 04:25
+  -2 04:25
+   -2 04:25
+ -2 04:25:09
+  -2 04:25:09
+   -2 04:25:09
+ -2 04:25:09.2
+    -2 04:25:09
+  -2 04:25:09.2
+ -2 04:25:09.15
+     -2 04:25:09
+   -2 04:25:09.2
+  -2 04:25:09.15
+ -2 04:25:09.154
+      -2 04:25:09
+    -2 04:25:09.2
+   -2 04:25:09.15
+  -2 04:25:09.154
+ -2 04:25:09.1540
+       -2 04:25:09
+     -2 04:25:09.2
+    -2 04:25:09.15
+   -2 04:25:09.154
+  -2 04:25:09.1540
+ -2 04:25:09.15395
+        -2 04:25:09
+      -2 04:25:09.2
+     -2 04:25:09.15
+    -2 04:25:09.154
+   -2 04:25:09.1540
+  -2 04:25:09.15395
+ -2 04:25:09.153950
+ *****
+ -54:49
+  -54:49
+   -54:49
+ -54:49:27
+  -54:49:27
+  -54:49:27
+   -54:49:27
+ -54:49:27.1
+ -54:49:27.1
+    -54:49:27
+  -54:49:27.1
+ -54:49:27.11
+ -54:49:27.11
+     -54:49:27
+   -54:49:27.1
+  -54:49:27.11
+ -54:49:27.105
+ -54:49:27.105
+      -54:49:27
+    -54:49:27.1
+   -54:49:27.11
+  -54:49:27.105
+ -54:49:27.1053
+ -54:49:27.1053
+       -54:49:27
+     -54:49:27.1
+    -54:49:27.11
+   -54:49:27.105
+  -54:49:27.1053
+ -54:49:27.10533
+ -54:49:27.10533
+ -2 06:49
+  -2 06:49
+   -2 06:49
+ -2 06:49:27
+  -2 06:49:27
+   -2 06:49:27
+ -2 06:49:27.1
+    -2 06:49:27
+  -2 06:49:27.1
+ -2 06:49:27.11
+     -2 06:49:27
+   -2 06:49:27.1
+  -2 06:49:27.11
+ -2 06:49:27.105
+      -2 06:49:27
+    -2 06:49:27.1
+   -2 06:49:27.11
+  -2 06:49:27.105
+ -2 06:49:27.1053
+       -2 06:49:27
+     -2 06:49:27.1
+    -2 06:49:27.11
+   -2 06:49:27.105
+  -2 06:49:27.1053
+ -2 06:49:27.10533
+        -2 06:49:27
+      -2 06:49:27.1
+     -2 06:49:27.11
+    -2 06:49:27.105
+   -2 06:49:27.1053
+  -2 06:49:27.10533
+ -2 06:49:27.105330
+ *****
+ -50:57
+  -50:57
+   -50:57
+ -50:57:52
+  -50:57:52
+  -50:57:52
+   -50:57:52
+ -50:57:52.5
+ -50:57:52.5
+    -50:57:52
+  -50:57:52.5
+ -50:57:52.48
+ -50:57:52.48
+     -50:57:52
+   -50:57:52.5
+  -50:57:52.48
+ -50:57:52.482
+ -50:57:52.482
+      -50:57:52
+    -50:57:52.5
+   -50:57:52.48
+  -50:57:52.482
+ -50:57:52.4823
+ -50:57:52.4823
+       -50:57:52
+     -50:57:52.5
+    -50:57:52.48
+   -50:57:52.482
+  -50:57:52.4823
+ -50:57:52.48229
+ -50:57:52.48229
+ -2 02:57
+  -2 02:57
+   -2 02:57
+ -2 02:57:52
+  -2 02:57:52
+   -2 02:57:52
+ -2 02:57:52.5
+    -2 02:57:52
+  -2 02:57:52.5
+ -2 02:57:52.48
+     -2 02:57:52
+   -2 02:57:52.5
+  -2 02:57:52.48
+ -2 02:57:52.482
+      -2 02:57:52
+    -2 02:57:52.5
+   -2 02:57:52.48
+  -2 02:57:52.482
+ -2 02:57:52.4823
+       -2 02:57:52
+     -2 02:57:52.5
+    -2 02:57:52.48
+   -2 02:57:52.482
+  -2 02:57:52.4823
+ -2 02:57:52.48229
+        -2 02:57:52
+      -2 02:57:52.5
+     -2 02:57:52.48
+    -2 02:57:52.482
+   -2 02:57:52.4823
+  -2 02:57:52.48229
+ -2 02:57:52.482290
+ *****
+ -64:45
+  -64:45
+   -64:45
+ -64:45:44
+  -64:45:44
+  -64:45:44
+   -64:45:44
+ -64:45:44.7
+ -64:45:44.7
+    -64:45:44
+  -64:45:44.7
+ -64:45:44.66
+ -64:45:44.66
+     -64:45:44
+   -64:45:44.7
+  -64:45:44.66
+ -64:45:44.658
+ -64:45:44.658
+      -64:45:44
+    -64:45:44.7
+   -64:45:44.66
+  -64:45:44.658
+ -64:45:44.6583
+ -64:45:44.6583
+       -64:45:44
+     -64:45:44.7
+    -64:45:44.66
+   -64:45:44.658
+  -64:45:44.6583
+ -64:45:44.65827
+ -64:45:44.65827
+ -2 16:45
+  -2 16:45
+   -2 16:45
+ -2 16:45:44
+  -2 16:45:44
+   -2 16:45:44
+ -2 16:45:44.7
+    -2 16:45:44
+  -2 16:45:44.7
+ -2 16:45:44.66
+     -2 16:45:44
+   -2 16:45:44.7
+  -2 16:45:44.66
+ -2 16:45:44.658
+      -2 16:45:44
+    -2 16:45:44.7
+   -2 16:45:44.66
+  -2 16:45:44.658
+ -2 16:45:44.6583
+       -2 16:45:44
+     -2 16:45:44.7
+    -2 16:45:44.66
+   -2 16:45:44.658
+  -2 16:45:44.6583
+ -2 16:45:44.65827
+        -2 16:45:44
+      -2 16:45:44.7
+     -2 16:45:44.66
+    -2 16:45:44.658
+   -2 16:45:44.6583
+  -2 16:45:44.65827
+ -2 16:45:44.658270
+ *****
+ -69:30
+  -69:30
+   -69:30
+ -69:30:57
+  -69:30:57
+  -69:30:57
+   -69:30:57
+ -69:30:57.6
+ -69:30:57.6
+    -69:30:57
+  -69:30:57.6
+ -69:30:57.58
+ -69:30:57.58
+     -69:30:57
+   -69:30:57.6
+  -69:30:57.58
+ -69:30:57.582
+ -69:30:57.582
+      -69:30:57
+    -69:30:57.6
+   -69:30:57.58
+  -69:30:57.582
+ -69:30:57.5822
+ -69:30:57.5822
+       -69:30:57
+     -69:30:57.6
+    -69:30:57.58
+   -69:30:57.582
+  -69:30:57.5822
+ -69:30:57.58219
+ -69:30:57.58219
+ -2 21:30
+  -2 21:30
+   -2 21:30
+ -2 21:30:57
+  -2 21:30:57
+   -2 21:30:57
+ -2 21:30:57.6
+    -2 21:30:57
+  -2 21:30:57.6
+ -2 21:30:57.58
+     -2 21:30:57
+   -2 21:30:57.6
+  -2 21:30:57.58
+ -2 21:30:57.582
+      -2 21:30:57
+    -2 21:30:57.6
+   -2 21:30:57.58
+  -2 21:30:57.582
+ -2 21:30:57.5822
+       -2 21:30:57
+     -2 21:30:57.6
+    -2 21:30:57.58
+   -2 21:30:57.582
+  -2 21:30:57.5822
+ -2 21:30:57.58219
+        -2 21:30:57
+      -2 21:30:57.6
+     -2 21:30:57.58
+    -2 21:30:57.582
+   -2 21:30:57.5822
+  -2 21:30:57.58219
+ -2 21:30:57.582190
+ *****
+ -70:30
+  -70:30
+   -70:30
+ -70:30:04
+  -70:30:04
+  -70:30:04
+   -70:30:04
+ -70:30:04.2
+ -70:30:04.2
+    -70:30:04
+  -70:30:04.2
+ -70:30:04.18
+ -70:30:04.18
+     -70:30:04
+   -70:30:04.2
+  -70:30:04.18
+ -70:30:04.183
+ -70:30:04.183
+      -70:30:04
+    -70:30:04.2
+   -70:30:04.18
+  -70:30:04.183
+ -70:30:04.1835
+ -70:30:04.1835
+       -70:30:04
+     -70:30:04.2
+    -70:30:04.18
+   -70:30:04.183
+  -70:30:04.1835
+ -70:30:04.18347
+ -70:30:04.18347
+ -2 22:30
+  -2 22:30
+   -2 22:30
+ -2 22:30:04
+  -2 22:30:04
+   -2 22:30:04
+ -2 22:30:04.2
+    -2 22:30:04
+  -2 22:30:04.2
+ -2 22:30:04.18
+     -2 22:30:04
+   -2 22:30:04.2
+  -2 22:30:04.18
+ -2 22:30:04.183
+      -2 22:30:04
+    -2 22:30:04.2
+   -2 22:30:04.18
+  -2 22:30:04.183
+ -2 22:30:04.1835
+       -2 22:30:04
+     -2 22:30:04.2
+    -2 22:30:04.18
+   -2 22:30:04.183
+  -2 22:30:04.1835
+ -2 22:30:04.18347
+        -2 22:30:04
+      -2 22:30:04.2
+     -2 22:30:04.18
+    -2 22:30:04.183
+   -2 22:30:04.1835
+  -2 22:30:04.18347
+ -2 22:30:04.183470
+ *****
+ -49:56
+  -49:56
+   -49:56
+ -49:56:51
+  -49:56:51
+  -49:56:51
+   -49:56:51
+ -49:56:51.6
+ -49:56:51.6
+    -49:56:51
+  -49:56:51.6
+ -49:56:51.59
+ -49:56:51.59
+     -49:56:51
+   -49:56:51.6
+  -49:56:51.59
+ -49:56:51.593
+ -49:56:51.593
+      -49:56:51
+    -49:56:51.6
+   -49:56:51.59
+  -49:56:51.593
+ -49:56:51.5932
+ -49:56:51.5932
+       -49:56:51
+     -49:56:51.6
+    -49:56:51.59
+   -49:56:51.593
+  -49:56:51.5932
+ -49:56:51.59319
+ -49:56:51.59319
+ -2 01:56
+  -2 01:56
+   -2 01:56
+ -2 01:56:51
+  -2 01:56:51
+   -2 01:56:51
+ -2 01:56:51.6
+    -2 01:56:51
+  -2 01:56:51.6
+ -2 01:56:51.59
+     -2 01:56:51
+   -2 01:56:51.6
+  -2 01:56:51.59
+ -2 01:56:51.593
+      -2 01:56:51
+    -2 01:56:51.6
+   -2 01:56:51.59
+  -2 01:56:51.593
+ -2 01:56:51.5932
+       -2 01:56:51
+     -2 01:56:51.6
+    -2 01:56:51.59
+   -2 01:56:51.593
+  -2 01:56:51.5932
+ -2 01:56:51.59319
+        -2 01:56:51
+      -2 01:56:51.6
+     -2 01:56:51.59
+    -2 01:56:51.593
+   -2 01:56:51.5932
+  -2 01:56:51.59319
+ -2 01:56:51.593190
+ *****
+ ******
+ *******
+ -1296:00
+  -1296:00
+   -1296:00
+   -1296:00
+ -1296:00:00
+ -1296:00:00
+ -1296:00:00
+  -1296:00:00
+  -1296:00:00
+  -1296:00:00
+  -1296:00:00
+   -1296:00:00
+ -1296:00:00.0
+ -1296:00:00.0
+ -1296:00:00.0
+ -1296:00:00.0
+    -1296:00:00
+  -1296:00:00.0
+ -1296:00:00.00
+ -1296:00:00.00
+ -1296:00:00.00
+ -1296:00:00.00
+     -1296:00:00
+   -1296:00:00.0
+  -1296:00:00.00
+ -1296:00:00.000
+ -1296:00:00.000
+ -1296:00:00.000
+ -1296:00:00.000
+ ********
+ -54 00:00
+  -54 00:00
+   -54 00:00
+ -54 00:00:00
+  -54 00:00:00
+  -54 00:00:00
+   -54 00:00:00
+ -54 00:00:00.0
+ -54 00:00:00.0
+    -54 00:00:00
+  -54 00:00:00.0
+ -54 00:00:00.00
+ -54 00:00:00.00
+     -54 00:00:00
+   -54 00:00:00.0
+  -54 00:00:00.00
+ -54 00:00:00.000
+ -54 00:00:00.000
+      -54 00:00:00
+    -54 00:00:00.0
+   -54 00:00:00.00
+  -54 00:00:00.000
+ -54 00:00:00.0000
+ -54 00:00:00.0000
+       -54 00:00:00
+     -54 00:00:00.0
+    -54 00:00:00.00
+   -54 00:00:00.000
+  -54 00:00:00.0000
+ -54 00:00:00.00000
+ -54 00:00:00.00000
+ *****
+ ******
+ *******
+ -1300:50
+  -1300:50
+   -1300:50
+   -1300:50
+ -1300:50:38
+ -1300:50:38
+ -1300:50:38
+  -1300:50:38
+  -1300:50:38
+  -1300:50:38
+  -1300:50:38
+   -1300:50:38
+ -1300:50:38.1
+ -1300:50:38.1
+ -1300:50:38.1
+ -1300:50:38.1
+    -1300:50:38
+  -1300:50:38.1
+ -1300:50:38.12
+ -1300:50:38.12
+ -1300:50:38.12
+ -1300:50:38.12
+     -1300:50:38
+   -1300:50:38.1
+  -1300:50:38.12
+ -1300:50:38.123
+ -1300:50:38.123
+ -1300:50:38.123
+ -1300:50:38.123
+ ********
+ -54 04:50
+  -54 04:50
+   -54 04:50
+ -54 04:50:38
+  -54 04:50:38
+  -54 04:50:38
+   -54 04:50:38
+ -54 04:50:38.1
+ -54 04:50:38.1
+    -54 04:50:38
+  -54 04:50:38.1
+ -54 04:50:38.12
+ -54 04:50:38.12
+     -54 04:50:38
+   -54 04:50:38.1
+  -54 04:50:38.12
+ -54 04:50:38.123
+ -54 04:50:38.123
+      -54 04:50:38
+    -54 04:50:38.1
+   -54 04:50:38.12
+  -54 04:50:38.123
+ -54 04:50:38.1230
+ -54 04:50:38.1230
+       -54 04:50:38
+     -54 04:50:38.1
+    -54 04:50:38.12
+   -54 04:50:38.123
+  -54 04:50:38.1230
+ -54 04:50:38.12301
+ -54 04:50:38.12301
+ *****
+ ******
+ *******
+ -1308:31
+  -1308:31
+   -1308:31
+   -1308:31
+ -1308:31:35
+ -1308:31:35
+ -1308:31:35
+  -1308:31:35
+  -1308:31:35
+  -1308:31:35
+  -1308:31:35
+   -1308:31:35
+ -1308:31:35.2
+ -1308:31:35.2
+ -1308:31:35.2
+ -1308:31:35.2
+    -1308:31:35
+  -1308:31:35.2
+ -1308:31:35.23
+ -1308:31:35.23
+ -1308:31:35.23
+ -1308:31:35.23
+     -1308:31:35
+   -1308:31:35.2
+  -1308:31:35.23
+ -1308:31:35.235
+ -1308:31:35.235
+ -1308:31:35.235
+ -1308:31:35.235
+ ********
+ -54 12:31
+  -54 12:31
+   -54 12:31
+ -54 12:31:35
+  -54 12:31:35
+  -54 12:31:35
+   -54 12:31:35
+ -54 12:31:35.2
+ -54 12:31:35.2
+    -54 12:31:35
+  -54 12:31:35.2
+ -54 12:31:35.23
+ -54 12:31:35.23
+     -54 12:31:35
+   -54 12:31:35.2
+  -54 12:31:35.23
+ -54 12:31:35.235
+ -54 12:31:35.235
+      -54 12:31:35
+    -54 12:31:35.2
+   -54 12:31:35.23
+  -54 12:31:35.235
+ -54 12:31:35.2345
+ -54 12:31:35.2345
+       -54 12:31:35
+     -54 12:31:35.2
+    -54 12:31:35.23
+   -54 12:31:35.235
+  -54 12:31:35.2345
+ -54 12:31:35.23453
+ -54 12:31:35.23453
+ *****
+ ******
+ *******
+ -1308:47
+  -1308:47
+   -1308:47
+   -1308:47
+ -1308:47:53
+ -1308:47:53
+ -1308:47:53
+  -1308:47:53
+  -1308:47:53
+  -1308:47:53
+  -1308:47:53
+   -1308:47:53
+ -1308:47:53.3
+ -1308:47:53.3
+ -1308:47:53.3
+ -1308:47:53.3
+    -1308:47:53
+  -1308:47:53.3
+ -1308:47:53.35
+ -1308:47:53.35
+ -1308:47:53.35
+ -1308:47:53.35
+     -1308:47:53
+   -1308:47:53.3
+  -1308:47:53.35
+ -1308:47:53.345
+ -1308:47:53.345
+ -1308:47:53.345
+ -1308:47:53.345
+ ********
+ -54 12:47
+  -54 12:47
+   -54 12:47
+ -54 12:47:53
+  -54 12:47:53
+  -54 12:47:53
+   -54 12:47:53
+ -54 12:47:53.3
+ -54 12:47:53.3
+    -54 12:47:53
+  -54 12:47:53.3
+ -54 12:47:53.35
+ -54 12:47:53.35
+     -54 12:47:53
+   -54 12:47:53.3
+  -54 12:47:53.35
+ -54 12:47:53.345
+ -54 12:47:53.345
+      -54 12:47:53
+    -54 12:47:53.3
+   -54 12:47:53.35
+  -54 12:47:53.345
+ -54 12:47:53.3450
+ -54 12:47:53.3450
+       -54 12:47:53
+     -54 12:47:53.3
+    -54 12:47:53.35
+   -54 12:47:53.345
+  -54 12:47:53.3450
+ -54 12:47:53.34505
+ -54 12:47:53.34505
+ *****
+ ******
+ *******
+ -1297:26
+  -1297:26
+   -1297:26
+   -1297:26
+ -1297:26:00
+ -1297:26:00
+ -1297:26:00
+  -1297:26:00
+  -1297:26:00
+  -1297:26:00
+  -1297:26:00
+   -1297:26:00
+ -1297:26:00.5
+ -1297:26:00.5
+ -1297:26:00.5
+ -1297:26:00.5
+    -1297:26:00
+  -1297:26:00.5
+ -1297:26:00.46
+ -1297:26:00.46
+ -1297:26:00.46
+ -1297:26:00.46
+     -1297:26:00
+   -1297:26:00.5
+  -1297:26:00.46
+ -1297:26:00.456
+ -1297:26:00.456
+ -1297:26:00.456
+ -1297:26:00.456
+ ********
+ -54 01:26
+  -54 01:26
+   -54 01:26
+ -54 01:26:00
+  -54 01:26:00
+  -54 01:26:00
+   -54 01:26:00
+ -54 01:26:00.5
+ -54 01:26:00.5
+    -54 01:26:00
+  -54 01:26:00.5
+ -54 01:26:00.46
+ -54 01:26:00.46
+     -54 01:26:00
+   -54 01:26:00.5
+  -54 01:26:00.46
+ -54 01:26:00.456
+ -54 01:26:00.456
+      -54 01:26:00
+    -54 01:26:00.5
+   -54 01:26:00.46
+  -54 01:26:00.456
+ -54 01:26:00.4561
+ -54 01:26:00.4561
+       -54 01:26:00
+     -54 01:26:00.5
+    -54 01:26:00.46
+   -54 01:26:00.456
+  -54 01:26:00.4561
+ -54 01:26:00.45615
+ -54 01:26:00.45615
+ *****
+ ******
+ *******
+ -1316:58
+  -1316:58
+   -1316:58
+   -1316:58
+ -1316:58:11
+ -1316:58:11
+ -1316:58:11
+  -1316:58:11
+  -1316:58:11
+  -1316:58:11
+  -1316:58:11
+   -1316:58:11
+ -1316:58:11.6
+ -1316:58:11.6
+ -1316:58:11.6
+ -1316:58:11.6
+    -1316:58:11
+  -1316:58:11.6
+ -1316:58:11.57
+ -1316:58:11.57
+ -1316:58:11.57
+ -1316:58:11.57
+     -1316:58:11
+   -1316:58:11.6
+  -1316:58:11.57
+ -1316:58:11.567
+ -1316:58:11.567
+ -1316:58:11.567
+ -1316:58:11.567
+ ********
+ -54 20:58
+  -54 20:58
+   -54 20:58
+ -54 20:58:11
+  -54 20:58:11
+  -54 20:58:11
+   -54 20:58:11
+ -54 20:58:11.6
+ -54 20:58:11.6
+    -54 20:58:11
+  -54 20:58:11.6
+ -54 20:58:11.57
+ -54 20:58:11.57
+     -54 20:58:11
+   -54 20:58:11.6
+  -54 20:58:11.57
+ -54 20:58:11.567
+ -54 20:58:11.567
+      -54 20:58:11
+    -54 20:58:11.6
+   -54 20:58:11.57
+  -54 20:58:11.567
+ -54 20:58:11.5668
+ -54 20:58:11.5668
+       -54 20:58:11
+     -54 20:58:11.6
+    -54 20:58:11.57
+   -54 20:58:11.567
+  -54 20:58:11.5668
+ -54 20:58:11.56677
+ -54 20:58:11.56677
+ *****
+ ******
+ *******
+ -1303:36
+  -1303:36
+   -1303:36
+   -1303:36
+ -1303:36:05
+ -1303:36:05
+ -1303:36:05
+  -1303:36:05
+  -1303:36:05
+  -1303:36:05
+  -1303:36:05
+   -1303:36:05
+ -1303:36:05.2
+ -1303:36:05.2
+ -1303:36:05.2
+ -1303:36:05.2
+    -1303:36:05
+  -1303:36:05.2
+ -1303:36:05.19
+ -1303:36:05.19
+ -1303:36:05.19
+ -1303:36:05.19
+     -1303:36:05
+   -1303:36:05.2
+  -1303:36:05.19
+ -1303:36:05.190
+ -1303:36:05.190
+ -1303:36:05.190
+ -1303:36:05.190
+ ********
+ -54 07:36
+  -54 07:36
+   -54 07:36
+ -54 07:36:05
+  -54 07:36:05
+  -54 07:36:05
+   -54 07:36:05
+ -54 07:36:05.2
+ -54 07:36:05.2
+    -54 07:36:05
+  -54 07:36:05.2
+ -54 07:36:05.19
+ -54 07:36:05.19
+     -54 07:36:05
+   -54 07:36:05.2
+  -54 07:36:05.19
+ -54 07:36:05.190
+ -54 07:36:05.190
+      -54 07:36:05
+    -54 07:36:05.2
+   -54 07:36:05.19
+  -54 07:36:05.190
+ -54 07:36:05.1896
+ -54 07:36:05.1896
+       -54 07:36:05
+     -54 07:36:05.2
+    -54 07:36:05.19
+   -54 07:36:05.190
+  -54 07:36:05.1896
+ -54 07:36:05.18964
+ -54 07:36:05.18964
+ *****
+ ******
+ *******
+ -1311:43
+  -1311:43
+   -1311:43
+   -1311:43
+ -1311:43:49
+ -1311:43:49
+ -1311:43:49
+  -1311:43:49
+  -1311:43:49
+  -1311:43:49
+  -1311:43:49
+   -1311:43:49
+ -1311:43:49.8
+ -1311:43:49.8
+ -1311:43:49.8
+ -1311:43:49.8
+    -1311:43:49
+  -1311:43:49.8
+ -1311:43:49.83
+ -1311:43:49.83
+ -1311:43:49.83
+ -1311:43:49.83
+     -1311:43:49
+   -1311:43:49.8
+  -1311:43:49.83
+ -1311:43:49.831
+ -1311:43:49.831
+ -1311:43:49.831
+ -1311:43:49.831
+ ********
+ -54 15:43
+  -54 15:43
+   -54 15:43
+ -54 15:43:49
+  -54 15:43:49
+  -54 15:43:49
+   -54 15:43:49
+ -54 15:43:49.8
+ -54 15:43:49.8
+    -54 15:43:49
+  -54 15:43:49.8
+ -54 15:43:49.83
+ -54 15:43:49.83
+     -54 15:43:49
+   -54 15:43:49.8
+  -54 15:43:49.83
+ -54 15:43:49.831
+ -54 15:43:49.831
+      -54 15:43:49
+    -54 15:43:49.8
+   -54 15:43:49.83
+  -54 15:43:49.831
+ -54 15:43:49.8313
+ -54 15:43:49.8313
+       -54 15:43:49
+     -54 15:43:49.8
+    -54 15:43:49.83
+   -54 15:43:49.831
+  -54 15:43:49.8313
+ -54 15:43:49.83132
+ -54 15:43:49.83132
+ *****
+ ******
+ *******
+ -1300:25
+  -1300:25
+   -1300:25
+   -1300:25
+ -1300:25:09
+ -1300:25:09
+ -1300:25:09
+  -1300:25:09
+  -1300:25:09
+  -1300:25:09
+  -1300:25:09
+   -1300:25:09
+ -1300:25:09.0
+ -1300:25:09.0
+ -1300:25:09.0
+ -1300:25:09.0
+    -1300:25:09
+  -1300:25:09.0
+ -1300:25:09.01
+ -1300:25:09.01
+ -1300:25:09.01
+ -1300:25:09.01
+     -1300:25:09
+   -1300:25:09.0
+  -1300:25:09.01
+ -1300:25:09.013
+ -1300:25:09.013
+ -1300:25:09.013
+ -1300:25:09.013
+ ********
+ -54 04:25
+  -54 04:25
+   -54 04:25
+ -54 04:25:09
+  -54 04:25:09
+  -54 04:25:09
+   -54 04:25:09
+ -54 04:25:09.0
+ -54 04:25:09.0
+    -54 04:25:09
+  -54 04:25:09.0
+ -54 04:25:09.01
+ -54 04:25:09.01
+     -54 04:25:09
+   -54 04:25:09.0
+  -54 04:25:09.01
+ -54 04:25:09.013
+ -54 04:25:09.013
+      -54 04:25:09
+    -54 04:25:09.0
+   -54 04:25:09.01
+  -54 04:25:09.013
+ -54 04:25:09.0129
+ -54 04:25:09.0129
+       -54 04:25:09
+     -54 04:25:09.0
+    -54 04:25:09.01
+   -54 04:25:09.013
+  -54 04:25:09.0129
+ -54 04:25:09.01293
+ -54 04:25:09.01293
+ *****
+ ******
+ *******
+ -1302:49
+  -1302:49
+   -1302:49
+   -1302:49
+ -1302:49:27
+ -1302:49:27
+ -1302:49:27
+  -1302:49:27
+  -1302:49:27
+  -1302:49:27
+  -1302:49:27
+   -1302:49:27
+ -1302:49:27.5
+ -1302:49:27.5
+ -1302:49:27.5
+ -1302:49:27.5
+    -1302:49:27
+  -1302:49:27.5
+ -1302:49:27.52
+ -1302:49:27.52
+ -1302:49:27.52
+ -1302:49:27.52
+     -1302:49:27
+   -1302:49:27.5
+  -1302:49:27.52
+ -1302:49:27.524
+ -1302:49:27.524
+ -1302:49:27.524
+ -1302:49:27.524
+ ********
+ -54 06:49
+  -54 06:49
+   -54 06:49
+ -54 06:49:27
+  -54 06:49:27
+  -54 06:49:27
+   -54 06:49:27
+ -54 06:49:27.5
+ -54 06:49:27.5
+    -54 06:49:27
+  -54 06:49:27.5
+ -54 06:49:27.52
+ -54 06:49:27.52
+     -54 06:49:27
+   -54 06:49:27.5
+  -54 06:49:27.52
+ -54 06:49:27.524
+ -54 06:49:27.524
+      -54 06:49:27
+    -54 06:49:27.5
+   -54 06:49:27.52
+  -54 06:49:27.524
+ -54 06:49:27.5237
+ -54 06:49:27.5237
+       -54 06:49:27
+     -54 06:49:27.5
+    -54 06:49:27.52
+   -54 06:49:27.524
+  -54 06:49:27.5237
+ -54 06:49:27.52375
+ -54 06:49:27.52375
+ *****
+ ******
+ *******
+ -1298:57
+  -1298:57
+   -1298:57
+   -1298:57
+ -1298:57:52
+ -1298:57:52
+ -1298:57:52
+  -1298:57:52
+  -1298:57:52
+  -1298:57:52
+  -1298:57:52
+   -1298:57:52
+ -1298:57:52.0
+ -1298:57:52.0
+ -1298:57:52.0
+ -1298:57:52.0
+    -1298:57:52
+  -1298:57:52.0
+ -1298:57:52.02
+ -1298:57:52.02
+ -1298:57:52.02
+ -1298:57:52.02
+     -1298:57:52
+   -1298:57:52.0
+  -1298:57:52.02
+ -1298:57:52.016
+ -1298:57:52.016
+ -1298:57:52.016
+ -1298:57:52.016
+ ********
+ -54 02:57
+  -54 02:57
+   -54 02:57
+ -54 02:57:52
+  -54 02:57:52
+  -54 02:57:52
+   -54 02:57:52
+ -54 02:57:52.0
+ -54 02:57:52.0
+    -54 02:57:52
+  -54 02:57:52.0
+ -54 02:57:52.02
+ -54 02:57:52.02
+     -54 02:57:52
+   -54 02:57:52.0
+  -54 02:57:52.02
+ -54 02:57:52.016
+ -54 02:57:52.016
+      -54 02:57:52
+    -54 02:57:52.0
+   -54 02:57:52.02
+  -54 02:57:52.016
+ -54 02:57:52.0157
+ -54 02:57:52.0157
+       -54 02:57:52
+     -54 02:57:52.0
+    -54 02:57:52.02
+   -54 02:57:52.016
+  -54 02:57:52.0157
+ -54 02:57:52.01565
+ -54 02:57:52.01565
+ *****
+ ******
+ *******
+ -1312:45
+  -1312:45
+   -1312:45
+   -1312:45
+ -1312:45:44
+ -1312:45:44
+ -1312:45:44
+  -1312:45:44
+  -1312:45:44
+  -1312:45:44
+  -1312:45:44
+   -1312:45:44
+ -1312:45:44.9
+ -1312:45:44.9
+ -1312:45:44.9
+ -1312:45:44.9
+    -1312:45:44
+  -1312:45:44.9
+ -1312:45:44.87
+ -1312:45:44.87
+ -1312:45:44.87
+ -1312:45:44.87
+     -1312:45:44
+   -1312:45:44.9
+  -1312:45:44.87
+ -1312:45:44.865
+ -1312:45:44.865
+ -1312:45:44.865
+ -1312:45:44.865
+ ********
+ -54 16:45
+  -54 16:45
+   -54 16:45
+ -54 16:45:44
+  -54 16:45:44
+  -54 16:45:44
+   -54 16:45:44
+ -54 16:45:44.9
+ -54 16:45:44.9
+    -54 16:45:44
+  -54 16:45:44.9
+ -54 16:45:44.87
+ -54 16:45:44.87
+     -54 16:45:44
+   -54 16:45:44.9
+  -54 16:45:44.87
+ -54 16:45:44.865
+ -54 16:45:44.865
+      -54 16:45:44
+    -54 16:45:44.9
+   -54 16:45:44.87
+  -54 16:45:44.865
+ -54 16:45:44.8653
+ -54 16:45:44.8653
+       -54 16:45:44
+     -54 16:45:44.9
+    -54 16:45:44.87
+   -54 16:45:44.865
+  -54 16:45:44.8653
+ -54 16:45:44.86529
+ -54 16:45:44.86529
+ *****
+ ******
+ *******
+ -1317:30
+  -1317:30
+   -1317:30
+   -1317:30
+ -1317:30:57
+ -1317:30:57
+ -1317:30:57
+  -1317:30:57
+  -1317:30:57
+  -1317:30:57
+  -1317:30:57
+   -1317:30:57
+ -1317:30:57.8
+ -1317:30:57.8
+ -1317:30:57.8
+ -1317:30:57.8
+    -1317:30:57
+  -1317:30:57.8
+ -1317:30:57.82
+ -1317:30:57.82
+ -1317:30:57.82
+ -1317:30:57.82
+     -1317:30:57
+   -1317:30:57.8
+  -1317:30:57.82
+ -1317:30:57.820
+ -1317:30:57.820
+ -1317:30:57.820
+ -1317:30:57.820
+ ********
+ -54 21:30
+  -54 21:30
+   -54 21:30
+ -54 21:30:57
+  -54 21:30:57
+  -54 21:30:57
+   -54 21:30:57
+ -54 21:30:57.8
+ -54 21:30:57.8
+    -54 21:30:57
+  -54 21:30:57.8
+ -54 21:30:57.82
+ -54 21:30:57.82
+     -54 21:30:57
+   -54 21:30:57.8
+  -54 21:30:57.82
+ -54 21:30:57.820
+ -54 21:30:57.820
+      -54 21:30:57
+    -54 21:30:57.8
+   -54 21:30:57.82
+  -54 21:30:57.820
+ -54 21:30:57.8205
+ -54 21:30:57.8205
+       -54 21:30:57
+     -54 21:30:57.8
+    -54 21:30:57.82
+   -54 21:30:57.820
+  -54 21:30:57.8205
+ -54 21:30:57.82047
+ -54 21:30:57.82047
+ *****
+ ******
+ *******
+ -1300:25
+  -1300:25
+   -1300:25
+   -1300:25
+ -1300:25:09
+ -1300:25:09
+ -1300:25:09
+  -1300:25:09
+  -1300:25:09
+  -1300:25:09
+  -1300:25:09
+   -1300:25:09
+ -1300:25:09.2
+ -1300:25:09.2
+ -1300:25:09.2
+ -1300:25:09.2
+    -1300:25:09
+  -1300:25:09.2
+ -1300:25:09.15
+ -1300:25:09.15
+ -1300:25:09.15
+ -1300:25:09.15
+     -1300:25:09
+   -1300:25:09.2
+  -1300:25:09.15
+ -1300:25:09.154
+ -1300:25:09.154
+ -1300:25:09.154
+ -1300:25:09.154
+ ********
+ -54 04:25
+  -54 04:25
+   -54 04:25
+ -54 04:25:09
+  -54 04:25:09
+  -54 04:25:09
+   -54 04:25:09
+ -54 04:25:09.2
+ -54 04:25:09.2
+    -54 04:25:09
+  -54 04:25:09.2
+ -54 04:25:09.15
+ -54 04:25:09.15
+     -54 04:25:09
+   -54 04:25:09.2
+  -54 04:25:09.15
+ -54 04:25:09.154
+ -54 04:25:09.154
+      -54 04:25:09
+    -54 04:25:09.2
+   -54 04:25:09.15
+  -54 04:25:09.154
+ -54 04:25:09.1540
+ -54 04:25:09.1540
+       -54 04:25:09
+     -54 04:25:09.2
+    -54 04:25:09.15
+   -54 04:25:09.154
+  -54 04:25:09.1540
+ -54 04:25:09.15395
+ -54 04:25:09.15395
+ *****
+ ******
+ *******
+ -1302:49
+  -1302:49
+   -1302:49
+   -1302:49
+ -1302:49:27
+ -1302:49:27
+ -1302:49:27
+  -1302:49:27
+  -1302:49:27
+  -1302:49:27
+  -1302:49:27
+   -1302:49:27
+ -1302:49:27.1
+ -1302:49:27.1
+ -1302:49:27.1
+ -1302:49:27.1
+    -1302:49:27
+  -1302:49:27.1
+ -1302:49:27.11
+ -1302:49:27.11
+ -1302:49:27.11
+ -1302:49:27.11
+     -1302:49:27
+   -1302:49:27.1
+  -1302:49:27.11
+ -1302:49:27.105
+ -1302:49:27.105
+ -1302:49:27.105
+ -1302:49:27.105
+ ********
+ -54 06:49
+  -54 06:49
+   -54 06:49
+ -54 06:49:27
+  -54 06:49:27
+  -54 06:49:27
+   -54 06:49:27
+ -54 06:49:27.1
+ -54 06:49:27.1
+    -54 06:49:27
+  -54 06:49:27.1
+ -54 06:49:27.11
+ -54 06:49:27.11
+     -54 06:49:27
+   -54 06:49:27.1
+  -54 06:49:27.11
+ -54 06:49:27.105
+ -54 06:49:27.105
+      -54 06:49:27
+    -54 06:49:27.1
+   -54 06:49:27.11
+  -54 06:49:27.105
+ -54 06:49:27.1053
+ -54 06:49:27.1053
+       -54 06:49:27
+     -54 06:49:27.1
+    -54 06:49:27.11
+   -54 06:49:27.105
+  -54 06:49:27.1053
+ -54 06:49:27.10533
+ -54 06:49:27.10533
+ *****
+ ******
+ *******
+ -1298:57
+  -1298:57
+   -1298:57
+   -1298:57
+ -1298:57:52
+ -1298:57:52
+ -1298:57:52
+  -1298:57:52
+  -1298:57:52
+  -1298:57:52
+  -1298:57:52
+   -1298:57:52
+ -1298:57:52.5
+ -1298:57:52.5
+ -1298:57:52.5
+ -1298:57:52.5
+    -1298:57:52
+  -1298:57:52.5
+ -1298:57:52.48
+ -1298:57:52.48
+ -1298:57:52.48
+ -1298:57:52.48
+     -1298:57:52
+   -1298:57:52.5
+  -1298:57:52.48
+ -1298:57:52.482
+ -1298:57:52.482
+ -1298:57:52.482
+ -1298:57:52.482
+ ********
+ -54 02:57
+  -54 02:57
+   -54 02:57
+ -54 02:57:52
+  -54 02:57:52
+  -54 02:57:52
+   -54 02:57:52
+ -54 02:57:52.5
+ -54 02:57:52.5
+    -54 02:57:52
+  -54 02:57:52.5
+ -54 02:57:52.48
+ -54 02:57:52.48
+     -54 02:57:52
+   -54 02:57:52.5
+  -54 02:57:52.48
+ -54 02:57:52.482
+ -54 02:57:52.482
+      -54 02:57:52
+    -54 02:57:52.5
+   -54 02:57:52.48
+  -54 02:57:52.482
+ -54 02:57:52.4823
+ -54 02:57:52.4823
+       -54 02:57:52
+     -54 02:57:52.5
+    -54 02:57:52.48
+   -54 02:57:52.482
+  -54 02:57:52.4823
+ -54 02:57:52.48229
+ -54 02:57:52.48229
+ *****
+ ******
+ *******
+ -1312:45
+  -1312:45
+   -1312:45
+   -1312:45
+ -1312:45:44
+ -1312:45:44
+ -1312:45:44
+  -1312:45:44
+  -1312:45:44
+  -1312:45:44
+  -1312:45:44
+   -1312:45:44
+ -1312:45:44.7
+ -1312:45:44.7
+ -1312:45:44.7
+ -1312:45:44.7
+    -1312:45:44
+  -1312:45:44.7
+ -1312:45:44.66
+ -1312:45:44.66
+ -1312:45:44.66
+ -1312:45:44.66
+     -1312:45:44
+   -1312:45:44.7
+  -1312:45:44.66
+ -1312:45:44.658
+ -1312:45:44.658
+ -1312:45:44.658
+ -1312:45:44.658
+ ********
+ -54 16:45
+  -54 16:45
+   -54 16:45
+ -54 16:45:44
+  -54 16:45:44
+  -54 16:45:44
+   -54 16:45:44
+ -54 16:45:44.7
+ -54 16:45:44.7
+    -54 16:45:44
+  -54 16:45:44.7
+ -54 16:45:44.66
+ -54 16:45:44.66
+     -54 16:45:44
+   -54 16:45:44.7
+  -54 16:45:44.66
+ -54 16:45:44.658
+ -54 16:45:44.658
+      -54 16:45:44
+    -54 16:45:44.7
+   -54 16:45:44.66
+  -54 16:45:44.658
+ -54 16:45:44.6583
+ -54 16:45:44.6583
+       -54 16:45:44
+     -54 16:45:44.7
+    -54 16:45:44.66
+   -54 16:45:44.658
+  -54 16:45:44.6583
+ -54 16:45:44.65827
+ -54 16:45:44.65827
+ *****
+ ******
+ *******
+ -1317:30
+  -1317:30
+   -1317:30
+   -1317:30
+ -1317:30:57
+ -1317:30:57
+ -1317:30:57
+  -1317:30:57
+  -1317:30:57
+  -1317:30:57
+  -1317:30:57
+   -1317:30:57
+ -1317:30:57.6
+ -1317:30:57.6
+ -1317:30:57.6
+ -1317:30:57.6
+    -1317:30:57
+  -1317:30:57.6
+ -1317:30:57.58
+ -1317:30:57.58
+ -1317:30:57.58
+ -1317:30:57.58
+     -1317:30:57
+   -1317:30:57.6
+  -1317:30:57.58
+ -1317:30:57.582
+ -1317:30:57.582
+ -1317:30:57.582
+ -1317:30:57.582
+ ********
+ -54 21:30
+  -54 21:30
+   -54 21:30
+ -54 21:30:57
+  -54 21:30:57
+  -54 21:30:57
+   -54 21:30:57
+ -54 21:30:57.6
+ -54 21:30:57.6
+    -54 21:30:57
+  -54 21:30:57.6
+ -54 21:30:57.58
+ -54 21:30:57.58
+     -54 21:30:57
+   -54 21:30:57.6
+  -54 21:30:57.58
+ -54 21:30:57.582
+ -54 21:30:57.582
+      -54 21:30:57
+    -54 21:30:57.6
+   -54 21:30:57.58
+  -54 21:30:57.582
+ -54 21:30:57.5822
+ -54 21:30:57.5822
+       -54 21:30:57
+     -54 21:30:57.6
+    -54 21:30:57.58
+   -54 21:30:57.582
+  -54 21:30:57.5822
+ -54 21:30:57.58219
+ -54 21:30:57.58219
+ *****
+ ******
+ *******
+ -1318:30
+  -1318:30
+   -1318:30
+   -1318:30
+ -1318:30:04
+ -1318:30:04
+ -1318:30:04
+  -1318:30:04
+  -1318:30:04
+  -1318:30:04
+  -1318:30:04
+   -1318:30:04
+ -1318:30:04.2
+ -1318:30:04.2
+ -1318:30:04.2
+ -1318:30:04.2
+    -1318:30:04
+  -1318:30:04.2
+ -1318:30:04.18
+ -1318:30:04.18
+ -1318:30:04.18
+ -1318:30:04.18
+     -1318:30:04
+   -1318:30:04.2
+  -1318:30:04.18
+ -1318:30:04.183
+ -1318:30:04.183
+ -1318:30:04.183
+ -1318:30:04.183
+ ********
+ -54 22:30
+  -54 22:30
+   -54 22:30
+ -54 22:30:04
+  -54 22:30:04
+  -54 22:30:04
+   -54 22:30:04
+ -54 22:30:04.2
+ -54 22:30:04.2
+    -54 22:30:04
+  -54 22:30:04.2
+ -54 22:30:04.18
+ -54 22:30:04.18
+     -54 22:30:04
+   -54 22:30:04.2
+  -54 22:30:04.18
+ -54 22:30:04.183
+ -54 22:30:04.183
+      -54 22:30:04
+    -54 22:30:04.2
+   -54 22:30:04.18
+  -54 22:30:04.183
+ -54 22:30:04.1835
+ -54 22:30:04.1835
+       -54 22:30:04
+     -54 22:30:04.2
+    -54 22:30:04.18
+   -54 22:30:04.183
+  -54 22:30:04.1835
+ -54 22:30:04.18347
+ -54 22:30:04.18347
+ *****
+ ******
+ *******
+ -1297:56
+  -1297:56
+   -1297:56
+   -1297:56
+ -1297:56:51
+ -1297:56:51
+ -1297:56:51
+  -1297:56:51
+  -1297:56:51
+  -1297:56:51
+  -1297:56:51
+   -1297:56:51
+ -1297:56:51.6
+ -1297:56:51.6
+ -1297:56:51.6
+ -1297:56:51.6
+    -1297:56:51
+  -1297:56:51.6
+ -1297:56:51.59
+ -1297:56:51.59
+ -1297:56:51.59
+ -1297:56:51.59
+     -1297:56:51
+   -1297:56:51.6
+  -1297:56:51.59
+ -1297:56:51.593
+ -1297:56:51.593
+ -1297:56:51.593
+ -1297:56:51.593
+ ********
+ -54 01:56
+  -54 01:56
+   -54 01:56
+ -54 01:56:51
+  -54 01:56:51
+  -54 01:56:51
+   -54 01:56:51
+ -54 01:56:51.6
+ -54 01:56:51.6
+    -54 01:56:51
+  -54 01:56:51.6
+ -54 01:56:51.59
+ -54 01:56:51.59
+     -54 01:56:51
+   -54 01:56:51.6
+  -54 01:56:51.59
+ -54 01:56:51.593
+ -54 01:56:51.593
+      -54 01:56:51
+    -54 01:56:51.6
+   -54 01:56:51.59
+  -54 01:56:51.593
+ -54 01:56:51.5932
+ -54 01:56:51.5932
+       -54 01:56:51
+     -54 01:56:51.6
+    -54 01:56:51.59
+   -54 01:56:51.593
+  -54 01:56:51.5932
+ -54 01:56:51.59319
+ -54 01:56:51.59319
+ *****
+ ******
+ *******
+ ********
+ -16344:00
+  -16344:00
+  -16344:00
+   -16344:00
+   -16344:00
+   -16344:00
+ -16344:00:00
+ -16344:00:00
+ -16344:00:00
+ -16344:00:00
+  -16344:00:00
+  -16344:00:00
+  -16344:00:00
+  -16344:00:00
+  -16344:00:00
+   -16344:00:00
+ -16344:00:00.0
+ -16344:00:00.0
+ -16344:00:00.0
+ -16344:00:00.0
+ -16344:00:00.0
+    -16344:00:00
+  -16344:00:00.0
+ -16344:00:00.00
+ -16344:00:00.00
+ -16344:00:00.00
+ -16344:00:00.00
+ -16344:00:00.00
+ ********
+ *********
+ -681 00:00
+  -681 00:00
+   -681 00:00
+ -681 00:00:00
+ -681 00:00:00
+  -681 00:00:00
+  -681 00:00:00
+  -681 00:00:00
+   -681 00:00:00
+ -681 00:00:00.0
+ -681 00:00:00.0
+ -681 00:00:00.0
+    -681 00:00:00
+  -681 00:00:00.0
+ -681 00:00:00.00
+ -681 00:00:00.00
+ -681 00:00:00.00
+     -681 00:00:00
+   -681 00:00:00.0
+  -681 00:00:00.00
+ -681 00:00:00.000
+ -681 00:00:00.000
+ -681 00:00:00.000
+      -681 00:00:00
+    -681 00:00:00.0
+   -681 00:00:00.00
+  -681 00:00:00.000
+ -681 00:00:00.0000
+ -681 00:00:00.0000
+ -681 00:00:00.0000
+ *****
+ ******
+ *******
+ ********
+ -16348:50
+  -16348:50
+  -16348:50
+   -16348:50
+   -16348:50
+   -16348:50
+ -16348:50:38
+ -16348:50:38
+ -16348:50:38
+ -16348:50:38
+  -16348:50:38
+  -16348:50:38
+  -16348:50:38
+  -16348:50:38
+  -16348:50:38
+   -16348:50:38
+ -16348:50:38.1
+ -16348:50:38.1
+ -16348:50:38.1
+ -16348:50:38.1
+ -16348:50:38.1
+    -16348:50:38
+  -16348:50:38.1
+ -16348:50:38.12
+ -16348:50:38.12
+ -16348:50:38.12
+ -16348:50:38.12
+ -16348:50:38.12
+ ********
+ *********
+ -681 04:50
+  -681 04:50
+   -681 04:50
+ -681 04:50:38
+ -681 04:50:38
+  -681 04:50:38
+  -681 04:50:38
+  -681 04:50:38
+   -681 04:50:38
+ -681 04:50:38.1
+ -681 04:50:38.1
+ -681 04:50:38.1
+    -681 04:50:38
+  -681 04:50:38.1
+ -681 04:50:38.12
+ -681 04:50:38.12
+ -681 04:50:38.12
+     -681 04:50:38
+   -681 04:50:38.1
+  -681 04:50:38.12
+ -681 04:50:38.123
+ -681 04:50:38.123
+ -681 04:50:38.123
+      -681 04:50:38
+    -681 04:50:38.1
+   -681 04:50:38.12
+  -681 04:50:38.123
+ -681 04:50:38.1230
+ -681 04:50:38.1230
+ -681 04:50:38.1230
+ *****
+ ******
+ *******
+ ********
+ -16356:31
+  -16356:31
+  -16356:31
+   -16356:31
+   -16356:31
+   -16356:31
+ -16356:31:35
+ -16356:31:35
+ -16356:31:35
+ -16356:31:35
+  -16356:31:35
+  -16356:31:35
+  -16356:31:35
+  -16356:31:35
+  -16356:31:35
+   -16356:31:35
+ -16356:31:35.2
+ -16356:31:35.2
+ -16356:31:35.2
+ -16356:31:35.2
+ -16356:31:35.2
+    -16356:31:35
+  -16356:31:35.2
+ -16356:31:35.23
+ -16356:31:35.23
+ -16356:31:35.23
+ -16356:31:35.23
+ -16356:31:35.23
+ ********
+ *********
+ -681 12:31
+  -681 12:31
+   -681 12:31
+ -681 12:31:35
+ -681 12:31:35
+  -681 12:31:35
+  -681 12:31:35
+  -681 12:31:35
+   -681 12:31:35
+ -681 12:31:35.2
+ -681 12:31:35.2
+ -681 12:31:35.2
+    -681 12:31:35
+  -681 12:31:35.2
+ -681 12:31:35.23
+ -681 12:31:35.23
+ -681 12:31:35.23
+     -681 12:31:35
+   -681 12:31:35.2
+  -681 12:31:35.23
+ -681 12:31:35.235
+ -681 12:31:35.235
+ -681 12:31:35.235
+      -681 12:31:35
+    -681 12:31:35.2
+   -681 12:31:35.23
+  -681 12:31:35.235
+ -681 12:31:35.2345
+ -681 12:31:35.2345
+ -681 12:31:35.2345
+ *****
+ ******
+ *******
+ ********
+ -16356:47
+  -16356:47
+  -16356:47
+   -16356:47
+   -16356:47
+   -16356:47
+ -16356:47:53
+ -16356:47:53
+ -16356:47:53
+ -16356:47:53
+  -16356:47:53
+  -16356:47:53
+  -16356:47:53
+  -16356:47:53
+  -16356:47:53
+   -16356:47:53
+ -16356:47:53.3
+ -16356:47:53.3
+ -16356:47:53.3
+ -16356:47:53.3
+ -16356:47:53.3
+    -16356:47:53
+  -16356:47:53.3
+ -16356:47:53.35
+ -16356:47:53.35
+ -16356:47:53.35
+ -16356:47:53.35
+ -16356:47:53.35
+ ********
+ *********
+ -681 12:47
+  -681 12:47
+   -681 12:47
+ -681 12:47:53
+ -681 12:47:53
+  -681 12:47:53
+  -681 12:47:53
+  -681 12:47:53
+   -681 12:47:53
+ -681 12:47:53.3
+ -681 12:47:53.3
+ -681 12:47:53.3
+    -681 12:47:53
+  -681 12:47:53.3
+ -681 12:47:53.35
+ -681 12:47:53.35
+ -681 12:47:53.35
+     -681 12:47:53
+   -681 12:47:53.3
+  -681 12:47:53.35
+ -681 12:47:53.345
+ -681 12:47:53.345
+ -681 12:47:53.345
+      -681 12:47:53
+    -681 12:47:53.3
+   -681 12:47:53.35
+  -681 12:47:53.345
+ -681 12:47:53.3450
+ -681 12:47:53.3450
+ -681 12:47:53.3450
+ *****
+ ******
+ *******
+ ********
+ -16345:26
+  -16345:26
+  -16345:26
+   -16345:26
+   -16345:26
+   -16345:26
+ -16345:26:00
+ -16345:26:00
+ -16345:26:00
+ -16345:26:00
+  -16345:26:00
+  -16345:26:00
+  -16345:26:00
+  -16345:26:00
+  -16345:26:00
+   -16345:26:00
+ -16345:26:00.5
+ -16345:26:00.5
+ -16345:26:00.5
+ -16345:26:00.5
+ -16345:26:00.5
+    -16345:26:00
+  -16345:26:00.5
+ -16345:26:00.46
+ -16345:26:00.46
+ -16345:26:00.46
+ -16345:26:00.46
+ -16345:26:00.46
+ ********
+ *********
+ -681 01:26
+  -681 01:26
+   -681 01:26
+ -681 01:26:00
+ -681 01:26:00
+  -681 01:26:00
+  -681 01:26:00
+  -681 01:26:00
+   -681 01:26:00
+ -681 01:26:00.5
+ -681 01:26:00.5
+ -681 01:26:00.5
+    -681 01:26:00
+  -681 01:26:00.5
+ -681 01:26:00.46
+ -681 01:26:00.46
+ -681 01:26:00.46
+     -681 01:26:00
+   -681 01:26:00.5
+  -681 01:26:00.46
+ -681 01:26:00.456
+ -681 01:26:00.456
+ -681 01:26:00.456
+      -681 01:26:00
+    -681 01:26:00.5
+   -681 01:26:00.46
+  -681 01:26:00.456
+ -681 01:26:00.4562
+ -681 01:26:00.4562
+ -681 01:26:00.4562
+ *****
+ ******
+ *******
+ ********
+ -16364:58
+  -16364:58
+  -16364:58
+   -16364:58
+   -16364:58
+   -16364:58
+ -16364:58:11
+ -16364:58:11
+ -16364:58:11
+ -16364:58:11
+  -16364:58:11
+  -16364:58:11
+  -16364:58:11
+  -16364:58:11
+  -16364:58:11
+   -16364:58:11
+ -16364:58:11.6
+ -16364:58:11.6
+ -16364:58:11.6
+ -16364:58:11.6
+ -16364:58:11.6
+    -16364:58:11
+  -16364:58:11.6
+ -16364:58:11.57
+ -16364:58:11.57
+ -16364:58:11.57
+ -16364:58:11.57
+ -16364:58:11.57
+ ********
+ *********
+ -681 20:58
+  -681 20:58
+   -681 20:58
+ -681 20:58:11
+ -681 20:58:11
+  -681 20:58:11
+  -681 20:58:11
+  -681 20:58:11
+   -681 20:58:11
+ -681 20:58:11.6
+ -681 20:58:11.6
+ -681 20:58:11.6
+    -681 20:58:11
+  -681 20:58:11.6
+ -681 20:58:11.57
+ -681 20:58:11.57
+ -681 20:58:11.57
+     -681 20:58:11
+   -681 20:58:11.6
+  -681 20:58:11.57
+ -681 20:58:11.567
+ -681 20:58:11.567
+ -681 20:58:11.567
+      -681 20:58:11
+    -681 20:58:11.6
+   -681 20:58:11.57
+  -681 20:58:11.567
+ -681 20:58:11.5668
+ -681 20:58:11.5668
+ -681 20:58:11.5668
+ *****
+ ******
+ *******
+ ********
+ -16351:36
+  -16351:36
+  -16351:36
+   -16351:36
+   -16351:36
+   -16351:36
+ -16351:36:05
+ -16351:36:05
+ -16351:36:05
+ -16351:36:05
+  -16351:36:05
+  -16351:36:05
+  -16351:36:05
+  -16351:36:05
+  -16351:36:05
+   -16351:36:05
+ -16351:36:05.2
+ -16351:36:05.2
+ -16351:36:05.2
+ -16351:36:05.2
+ -16351:36:05.2
+    -16351:36:05
+  -16351:36:05.2
+ -16351:36:05.19
+ -16351:36:05.19
+ -16351:36:05.19
+ -16351:36:05.19
+ -16351:36:05.19
+ ********
+ *********
+ -681 07:36
+  -681 07:36
+   -681 07:36
+ -681 07:36:05
+ -681 07:36:05
+  -681 07:36:05
+  -681 07:36:05
+  -681 07:36:05
+   -681 07:36:05
+ -681 07:36:05.2
+ -681 07:36:05.2
+ -681 07:36:05.2
+    -681 07:36:05
+  -681 07:36:05.2
+ -681 07:36:05.19
+ -681 07:36:05.19
+ -681 07:36:05.19
+     -681 07:36:05
+   -681 07:36:05.2
+  -681 07:36:05.19
+ -681 07:36:05.190
+ -681 07:36:05.190
+ -681 07:36:05.190
+      -681 07:36:05
+    -681 07:36:05.2
+   -681 07:36:05.19
+  -681 07:36:05.190
+ -681 07:36:05.1896
+ -681 07:36:05.1896
+ -681 07:36:05.1896
+ *****
+ ******
+ *******
+ ********
+ -16359:43
+  -16359:43
+  -16359:43
+   -16359:43
+   -16359:43
+   -16359:43
+ -16359:43:49
+ -16359:43:49
+ -16359:43:49
+ -16359:43:49
+  -16359:43:49
+  -16359:43:49
+  -16359:43:49
+  -16359:43:49
+  -16359:43:49
+   -16359:43:49
+ -16359:43:49.8
+ -16359:43:49.8
+ -16359:43:49.8
+ -16359:43:49.8
+ -16359:43:49.8
+    -16359:43:49
+  -16359:43:49.8
+ -16359:43:49.83
+ -16359:43:49.83
+ -16359:43:49.83
+ -16359:43:49.83
+ -16359:43:49.83
+ ********
+ *********
+ -681 15:43
+  -681 15:43
+   -681 15:43
+ -681 15:43:49
+ -681 15:43:49
+  -681 15:43:49
+  -681 15:43:49
+  -681 15:43:49
+   -681 15:43:49
+ -681 15:43:49.8
+ -681 15:43:49.8
+ -681 15:43:49.8
+    -681 15:43:49
+  -681 15:43:49.8
+ -681 15:43:49.83
+ -681 15:43:49.83
+ -681 15:43:49.83
+     -681 15:43:49
+   -681 15:43:49.8
+  -681 15:43:49.83
+ -681 15:43:49.831
+ -681 15:43:49.831
+ -681 15:43:49.831
+      -681 15:43:49
+    -681 15:43:49.8
+   -681 15:43:49.83
+  -681 15:43:49.831
+ -681 15:43:49.8313
+ -681 15:43:49.8313
+ -681 15:43:49.8313
+ *****
+ ******
+ *******
+ ********
+ -16348:25
+  -16348:25
+  -16348:25
+   -16348:25
+   -16348:25
+   -16348:25
+ -16348:25:09
+ -16348:25:09
+ -16348:25:09
+ -16348:25:09
+  -16348:25:09
+  -16348:25:09
+  -16348:25:09
+  -16348:25:09
+  -16348:25:09
+   -16348:25:09
+ -16348:25:09.0
+ -16348:25:09.0
+ -16348:25:09.0
+ -16348:25:09.0
+ -16348:25:09.0
+    -16348:25:09
+  -16348:25:09.0
+ -16348:25:09.01
+ -16348:25:09.01
+ -16348:25:09.01
+ -16348:25:09.01
+ -16348:25:09.01
+ ********
+ *********
+ -681 04:25
+  -681 04:25
+   -681 04:25
+ -681 04:25:09
+ -681 04:25:09
+  -681 04:25:09
+  -681 04:25:09
+  -681 04:25:09
+   -681 04:25:09
+ -681 04:25:09.0
+ -681 04:25:09.0
+ -681 04:25:09.0
+    -681 04:25:09
+  -681 04:25:09.0
+ -681 04:25:09.01
+ -681 04:25:09.01
+ -681 04:25:09.01
+     -681 04:25:09
+   -681 04:25:09.0
+  -681 04:25:09.01
+ -681 04:25:09.013
+ -681 04:25:09.013
+ -681 04:25:09.013
+      -681 04:25:09
+    -681 04:25:09.0
+   -681 04:25:09.01
+  -681 04:25:09.013
+ -681 04:25:09.0129
+ -681 04:25:09.0129
+ -681 04:25:09.0129
+ *****
+ ******
+ *******
+ ********
+ -16350:49
+  -16350:49
+  -16350:49
+   -16350:49
+   -16350:49
+   -16350:49
+ -16350:49:27
+ -16350:49:27
+ -16350:49:27
+ -16350:49:27
+  -16350:49:27
+  -16350:49:27
+  -16350:49:27
+  -16350:49:27
+  -16350:49:27
+   -16350:49:27
+ -16350:49:27.5
+ -16350:49:27.5
+ -16350:49:27.5
+ -16350:49:27.5
+ -16350:49:27.5
+    -16350:49:27
+  -16350:49:27.5
+ -16350:49:27.52
+ -16350:49:27.52
+ -16350:49:27.52
+ -16350:49:27.52
+ -16350:49:27.52
+ ********
+ *********
+ -681 06:49
+  -681 06:49
+   -681 06:49
+ -681 06:49:27
+ -681 06:49:27
+  -681 06:49:27
+  -681 06:49:27
+  -681 06:49:27
+   -681 06:49:27
+ -681 06:49:27.5
+ -681 06:49:27.5
+ -681 06:49:27.5
+    -681 06:49:27
+  -681 06:49:27.5
+ -681 06:49:27.52
+ -681 06:49:27.52
+ -681 06:49:27.52
+     -681 06:49:27
+   -681 06:49:27.5
+  -681 06:49:27.52
+ -681 06:49:27.524
+ -681 06:49:27.524
+ -681 06:49:27.524
+      -681 06:49:27
+    -681 06:49:27.5
+   -681 06:49:27.52
+  -681 06:49:27.524
+ -681 06:49:27.5237
+ -681 06:49:27.5237
+ -681 06:49:27.5237
+ *****
+ ******
+ *******
+ ********
+ -16346:57
+  -16346:57
+  -16346:57
+   -16346:57
+   -16346:57
+   -16346:57
+ -16346:57:52
+ -16346:57:52
+ -16346:57:52
+ -16346:57:52
+  -16346:57:52
+  -16346:57:52
+  -16346:57:52
+  -16346:57:52
+  -16346:57:52
+   -16346:57:52
+ -16346:57:52.0
+ -16346:57:52.0
+ -16346:57:52.0
+ -16346:57:52.0
+ -16346:57:52.0
+    -16346:57:52
+  -16346:57:52.0
+ -16346:57:52.02
+ -16346:57:52.02
+ -16346:57:52.02
+ -16346:57:52.02
+ -16346:57:52.02
+ ********
+ *********
+ -681 02:57
+  -681 02:57
+   -681 02:57
+ -681 02:57:52
+ -681 02:57:52
+  -681 02:57:52
+  -681 02:57:52
+  -681 02:57:52
+   -681 02:57:52
+ -681 02:57:52.0
+ -681 02:57:52.0
+ -681 02:57:52.0
+    -681 02:57:52
+  -681 02:57:52.0
+ -681 02:57:52.02
+ -681 02:57:52.02
+ -681 02:57:52.02
+     -681 02:57:52
+   -681 02:57:52.0
+  -681 02:57:52.02
+ -681 02:57:52.016
+ -681 02:57:52.016
+ -681 02:57:52.016
+      -681 02:57:52
+    -681 02:57:52.0
+   -681 02:57:52.02
+  -681 02:57:52.016
+ -681 02:57:52.0156
+ -681 02:57:52.0156
+ -681 02:57:52.0156
+ *****
+ ******
+ *******
+ ********
+ -16360:45
+  -16360:45
+  -16360:45
+   -16360:45
+   -16360:45
+   -16360:45
+ -16360:45:44
+ -16360:45:44
+ -16360:45:44
+ -16360:45:44
+  -16360:45:44
+  -16360:45:44
+  -16360:45:44
+  -16360:45:44
+  -16360:45:44
+   -16360:45:44
+ -16360:45:44.9
+ -16360:45:44.9
+ -16360:45:44.9
+ -16360:45:44.9
+ -16360:45:44.9
+    -16360:45:44
+  -16360:45:44.9
+ -16360:45:44.87
+ -16360:45:44.87
+ -16360:45:44.87
+ -16360:45:44.87
+ -16360:45:44.87
+ ********
+ *********
+ -681 16:45
+  -681 16:45
+   -681 16:45
+ -681 16:45:44
+ -681 16:45:44
+  -681 16:45:44
+  -681 16:45:44
+  -681 16:45:44
+   -681 16:45:44
+ -681 16:45:44.9
+ -681 16:45:44.9
+ -681 16:45:44.9
+    -681 16:45:44
+  -681 16:45:44.9
+ -681 16:45:44.87
+ -681 16:45:44.87
+ -681 16:45:44.87
+     -681 16:45:44
+   -681 16:45:44.9
+  -681 16:45:44.87
+ -681 16:45:44.865
+ -681 16:45:44.865
+ -681 16:45:44.865
+      -681 16:45:44
+    -681 16:45:44.9
+   -681 16:45:44.87
+  -681 16:45:44.865
+ -681 16:45:44.8653
+ -681 16:45:44.8653
+ -681 16:45:44.8653
+ *****
+ ******
+ *******
+ ********
+ -16365:30
+  -16365:30
+  -16365:30
+   -16365:30
+   -16365:30
+   -16365:30
+ -16365:30:57
+ -16365:30:57
+ -16365:30:57
+ -16365:30:57
+  -16365:30:57
+  -16365:30:57
+  -16365:30:57
+  -16365:30:57
+  -16365:30:57
+   -16365:30:57
+ -16365:30:57.8
+ -16365:30:57.8
+ -16365:30:57.8
+ -16365:30:57.8
+ -16365:30:57.8
+    -16365:30:57
+  -16365:30:57.8
+ -16365:30:57.82
+ -16365:30:57.82
+ -16365:30:57.82
+ -16365:30:57.82
+ -16365:30:57.82
+ ********
+ *********
+ -681 21:30
+  -681 21:30
+   -681 21:30
+ -681 21:30:57
+ -681 21:30:57
+  -681 21:30:57
+  -681 21:30:57
+  -681 21:30:57
+   -681 21:30:57
+ -681 21:30:57.8
+ -681 21:30:57.8
+ -681 21:30:57.8
+    -681 21:30:57
+  -681 21:30:57.8
+ -681 21:30:57.82
+ -681 21:30:57.82
+ -681 21:30:57.82
+     -681 21:30:57
+   -681 21:30:57.8
+  -681 21:30:57.82
+ -681 21:30:57.820
+ -681 21:30:57.820
+ -681 21:30:57.820
+      -681 21:30:57
+    -681 21:30:57.8
+   -681 21:30:57.82
+  -681 21:30:57.820
+ -681 21:30:57.8205
+ -681 21:30:57.8205
+ -681 21:30:57.8205
+ *****
+ ******
+ *******
+ ********
+ -16348:25
+  -16348:25
+  -16348:25
+   -16348:25
+   -16348:25
+   -16348:25
+ -16348:25:09
+ -16348:25:09
+ -16348:25:09
+ -16348:25:09
+  -16348:25:09
+  -16348:25:09
+  -16348:25:09
+  -16348:25:09
+  -16348:25:09
+   -16348:25:09
+ -16348:25:09.2
+ -16348:25:09.2
+ -16348:25:09.2
+ -16348:25:09.2
+ -16348:25:09.2
+    -16348:25:09
+  -16348:25:09.2
+ -16348:25:09.15
+ -16348:25:09.15
+ -16348:25:09.15
+ -16348:25:09.15
+ -16348:25:09.15
+ ********
+ *********
+ -681 04:25
+  -681 04:25
+   -681 04:25
+ -681 04:25:09
+ -681 04:25:09
+  -681 04:25:09
+  -681 04:25:09
+  -681 04:25:09
+   -681 04:25:09
+ -681 04:25:09.2
+ -681 04:25:09.2
+ -681 04:25:09.2
+    -681 04:25:09
+  -681 04:25:09.2
+ -681 04:25:09.15
+ -681 04:25:09.15
+ -681 04:25:09.15
+     -681 04:25:09
+   -681 04:25:09.2
+  -681 04:25:09.15
+ -681 04:25:09.154
+ -681 04:25:09.154
+ -681 04:25:09.154
+      -681 04:25:09
+    -681 04:25:09.2
+   -681 04:25:09.15
+  -681 04:25:09.154
+ -681 04:25:09.1539
+ -681 04:25:09.1539
+ -681 04:25:09.1539
+ *****
+ ******
+ *******
+ ********
+ -16350:49
+  -16350:49
+  -16350:49
+   -16350:49
+   -16350:49
+   -16350:49
+ -16350:49:27
+ -16350:49:27
+ -16350:49:27
+ -16350:49:27
+  -16350:49:27
+  -16350:49:27
+  -16350:49:27
+  -16350:49:27
+  -16350:49:27
+   -16350:49:27
+ -16350:49:27.1
+ -16350:49:27.1
+ -16350:49:27.1
+ -16350:49:27.1
+ -16350:49:27.1
+    -16350:49:27
+  -16350:49:27.1
+ -16350:49:27.11
+ -16350:49:27.11
+ -16350:49:27.11
+ -16350:49:27.11
+ -16350:49:27.11
+ ********
+ *********
+ -681 06:49
+  -681 06:49
+   -681 06:49
+ -681 06:49:27
+ -681 06:49:27
+  -681 06:49:27
+  -681 06:49:27
+  -681 06:49:27
+   -681 06:49:27
+ -681 06:49:27.1
+ -681 06:49:27.1
+ -681 06:49:27.1
+    -681 06:49:27
+  -681 06:49:27.1
+ -681 06:49:27.11
+ -681 06:49:27.11
+ -681 06:49:27.11
+     -681 06:49:27
+   -681 06:49:27.1
+  -681 06:49:27.11
+ -681 06:49:27.105
+ -681 06:49:27.105
+ -681 06:49:27.105
+      -681 06:49:27
+    -681 06:49:27.1
+   -681 06:49:27.11
+  -681 06:49:27.105
+ -681 06:49:27.1053
+ -681 06:49:27.1053
+ -681 06:49:27.1053
+ *****
+ ******
+ *******
+ ********
+ -16346:57
+  -16346:57
+  -16346:57
+   -16346:57
+   -16346:57
+   -16346:57
+ -16346:57:52
+ -16346:57:52
+ -16346:57:52
+ -16346:57:52
+  -16346:57:52
+  -16346:57:52
+  -16346:57:52
+  -16346:57:52
+  -16346:57:52
+   -16346:57:52
+ -16346:57:52.5
+ -16346:57:52.5
+ -16346:57:52.5
+ -16346:57:52.5
+ -16346:57:52.5
+    -16346:57:52
+  -16346:57:52.5
+ -16346:57:52.48
+ -16346:57:52.48
+ -16346:57:52.48
+ -16346:57:52.48
+ -16346:57:52.48
+ ********
+ *********
+ -681 02:57
+  -681 02:57
+   -681 02:57
+ -681 02:57:52
+ -681 02:57:52
+  -681 02:57:52
+  -681 02:57:52
+  -681 02:57:52
+   -681 02:57:52
+ -681 02:57:52.5
+ -681 02:57:52.5
+ -681 02:57:52.5
+    -681 02:57:52
+  -681 02:57:52.5
+ -681 02:57:52.48
+ -681 02:57:52.48
+ -681 02:57:52.48
+     -681 02:57:52
+   -681 02:57:52.5
+  -681 02:57:52.48
+ -681 02:57:52.482
+ -681 02:57:52.482
+ -681 02:57:52.482
+      -681 02:57:52
+    -681 02:57:52.5
+   -681 02:57:52.48
+  -681 02:57:52.482
+ -681 02:57:52.4823
+ -681 02:57:52.4823
+ -681 02:57:52.4823
+ *****
+ ******
+ *******
+ ********
+ -16360:45
+  -16360:45
+  -16360:45
+   -16360:45
+   -16360:45
+   -16360:45
+ -16360:45:44
+ -16360:45:44
+ -16360:45:44
+ -16360:45:44
+  -16360:45:44
+  -16360:45:44
+  -16360:45:44
+  -16360:45:44
+  -16360:45:44
+   -16360:45:44
+ -16360:45:44.7
+ -16360:45:44.7
+ -16360:45:44.7
+ -16360:45:44.7
+ -16360:45:44.7
+    -16360:45:44
+  -16360:45:44.7
+ -16360:45:44.66
+ -16360:45:44.66
+ -16360:45:44.66
+ -16360:45:44.66
+ -16360:45:44.66
+ ********
+ *********
+ -681 16:45
+  -681 16:45
+   -681 16:45
+ -681 16:45:44
+ -681 16:45:44
+  -681 16:45:44
+  -681 16:45:44
+  -681 16:45:44
+   -681 16:45:44
+ -681 16:45:44.7
+ -681 16:45:44.7
+ -681 16:45:44.7
+    -681 16:45:44
+  -681 16:45:44.7
+ -681 16:45:44.66
+ -681 16:45:44.66
+ -681 16:45:44.66
+     -681 16:45:44
+   -681 16:45:44.7
+  -681 16:45:44.66
+ -681 16:45:44.658
+ -681 16:45:44.658
+ -681 16:45:44.658
+      -681 16:45:44
+    -681 16:45:44.7
+   -681 16:45:44.66
+  -681 16:45:44.658
+ -681 16:45:44.6583
+ -681 16:45:44.6583
+ -681 16:45:44.6583
+ *****
+ ******
+ *******
+ ********
+ -16365:30
+  -16365:30
+  -16365:30
+   -16365:30
+   -16365:30
+   -16365:30
+ -16365:30:57
+ -16365:30:57
+ -16365:30:57
+ -16365:30:57
+  -16365:30:57
+  -16365:30:57
+  -16365:30:57
+  -16365:30:57
+  -16365:30:57
+   -16365:30:57
+ -16365:30:57.6
+ -16365:30:57.6
+ -16365:30:57.6
+ -16365:30:57.6
+ -16365:30:57.6
+    -16365:30:57
+  -16365:30:57.6
+ -16365:30:57.58
+ -16365:30:57.58
+ -16365:30:57.58
+ -16365:30:57.58
+ -16365:30:57.58
+ ********
+ *********
+ -681 21:30
+  -681 21:30
+   -681 21:30
+ -681 21:30:57
+ -681 21:30:57
+  -681 21:30:57
+  -681 21:30:57
+  -681 21:30:57
+   -681 21:30:57
+ -681 21:30:57.6
+ -681 21:30:57.6
+ -681 21:30:57.6
+    -681 21:30:57
+  -681 21:30:57.6
+ -681 21:30:57.58
+ -681 21:30:57.58
+ -681 21:30:57.58
+     -681 21:30:57
+   -681 21:30:57.6
+  -681 21:30:57.58
+ -681 21:30:57.582
+ -681 21:30:57.582
+ -681 21:30:57.582
+      -681 21:30:57
+    -681 21:30:57.6
+   -681 21:30:57.58
+  -681 21:30:57.582
+ -681 21:30:57.5822
+ -681 21:30:57.5822
+ -681 21:30:57.5822
+ *****
+ ******
+ *******
+ ********
+ -16366:30
+  -16366:30
+  -16366:30
+   -16366:30
+   -16366:30
+   -16366:30
+ -16366:30:04
+ -16366:30:04
+ -16366:30:04
+ -16366:30:04
+  -16366:30:04
+  -16366:30:04
+  -16366:30:04
+  -16366:30:04
+  -16366:30:04
+   -16366:30:04
+ -16366:30:04.2
+ -16366:30:04.2
+ -16366:30:04.2
+ -16366:30:04.2
+ -16366:30:04.2
+    -16366:30:04
+  -16366:30:04.2
+ -16366:30:04.18
+ -16366:30:04.18
+ -16366:30:04.18
+ -16366:30:04.18
+ -16366:30:04.18
+ ********
+ *********
+ -681 22:30
+  -681 22:30
+   -681 22:30
+ -681 22:30:04
+ -681 22:30:04
+  -681 22:30:04
+  -681 22:30:04
+  -681 22:30:04
+   -681 22:30:04
+ -681 22:30:04.2
+ -681 22:30:04.2
+ -681 22:30:04.2
+    -681 22:30:04
+  -681 22:30:04.2
+ -681 22:30:04.18
+ -681 22:30:04.18
+ -681 22:30:04.18
+     -681 22:30:04
+   -681 22:30:04.2
+  -681 22:30:04.18
+ -681 22:30:04.183
+ -681 22:30:04.183
+ -681 22:30:04.183
+      -681 22:30:04
+    -681 22:30:04.2
+   -681 22:30:04.18
+  -681 22:30:04.183
+ -681 22:30:04.1835
+ -681 22:30:04.1835
+ -681 22:30:04.1835
+ *****
+ ******
+ *******
+ ********
+ -16345:56
+  -16345:56
+  -16345:56
+   -16345:56
+   -16345:56
+   -16345:56
+ -16345:56:51
+ -16345:56:51
+ -16345:56:51
+ -16345:56:51
+  -16345:56:51
+  -16345:56:51
+  -16345:56:51
+  -16345:56:51
+  -16345:56:51
+   -16345:56:51
+ -16345:56:51.6
+ -16345:56:51.6
+ -16345:56:51.6
+ -16345:56:51.6
+ -16345:56:51.6
+    -16345:56:51
+  -16345:56:51.6
+ -16345:56:51.59
+ -16345:56:51.59
+ -16345:56:51.59
+ -16345:56:51.59
+ -16345:56:51.59
+ ********
+ *********
+ -681 01:56
+  -681 01:56
+   -681 01:56
+ -681 01:56:51
+ -681 01:56:51
+  -681 01:56:51
+  -681 01:56:51
+  -681 01:56:51
+   -681 01:56:51
+ -681 01:56:51.6
+ -681 01:56:51.6
+ -681 01:56:51.6
+    -681 01:56:51
+  -681 01:56:51.6
+ -681 01:56:51.59
+ -681 01:56:51.59
+ -681 01:56:51.59
+     -681 01:56:51
+   -681 01:56:51.6
+  -681 01:56:51.59
+ -681 01:56:51.593
+ -681 01:56:51.593
+ -681 01:56:51.593
+      -681 01:56:51
+    -681 01:56:51.6
+   -681 01:56:51.59
+  -681 01:56:51.593
+ -681 01:56:51.5932
+ -681 01:56:51.5932
+ -681 01:56:51.5932
+EOF
+if [ $? -ne 0 ] ; then fail ; fi
+
+pass
diff --git a/tests/formats/wkday-out.sh b/tests/formats/wkday-out.sh
new file mode 100755 (executable)
index 0000000..3fbe3be
--- /dev/null
@@ -0,0 +1,821 @@
+#! /bin/sh
+
+TEMPDIR=/tmp/pspp-tst-$$
+mkdir -p $TEMPDIR
+trap 'cd /; rm -rf $TEMPDIR' 0
+
+# ensure that top_builddir  are absolute
+if [ -z "$top_builddir" ] ; then top_builddir=. ; fi
+if [ -z "$top_srcdir" ] ; then top_srcdir=. ; fi
+top_builddir=`cd $top_builddir; pwd`
+PSPP=$top_builddir/src/ui/terminal/pspp
+
+# ensure that top_srcdir is absolute
+top_srcdir=`cd $top_srcdir; pwd`
+
+STAT_CONFIG_PATH=$top_srcdir/config
+export STAT_CONFIG_PATH
+
+fail()
+{
+    echo $activity
+    echo FAILED
+    exit 1;
+}
+
+
+no_result()
+{
+    echo $activity
+    echo NO RESULT;
+    exit 2;
+}
+
+pass()
+{
+    exit 0;
+}
+
+cd $TEMPDIR
+
+activity="write pspp syntax"
+cat > wkday-out.pspp <<EOF
+set errors=none.
+set mxwarns=10000000.
+set mxerrs=10000000.
+data list /x 1-10.
+begin data.
+
+0
+0.5
+0.9
+1
+2
+3
+4
+4.1
+4.5
+4.9
+5
+6
+7
+7.1
+7.5
+7.9
+8
+end data.
+print outfile='wkday-out.out'/x(wkday2).
+print outfile='wkday-out.out'/x(wkday3).
+print outfile='wkday-out.out'/x(wkday4).
+print outfile='wkday-out.out'/x(wkday5).
+print outfile='wkday-out.out'/x(wkday6).
+print outfile='wkday-out.out'/x(wkday7).
+print outfile='wkday-out.out'/x(wkday8).
+print outfile='wkday-out.out'/x(wkday9).
+print outfile='wkday-out.out'/x(wkday10).
+print outfile='wkday-out.out'/x(wkday11).
+print outfile='wkday-out.out'/x(wkday12).
+print outfile='wkday-out.out'/x(wkday13).
+print outfile='wkday-out.out'/x(wkday14).
+print outfile='wkday-out.out'/x(wkday15).
+print outfile='wkday-out.out'/x(wkday16).
+print outfile='wkday-out.out'/x(wkday17).
+print outfile='wkday-out.out'/x(wkday18).
+print outfile='wkday-out.out'/x(wkday19).
+print outfile='wkday-out.out'/x(wkday20).
+print outfile='wkday-out.out'/x(wkday21).
+print outfile='wkday-out.out'/x(wkday22).
+print outfile='wkday-out.out'/x(wkday23).
+print outfile='wkday-out.out'/x(wkday24).
+print outfile='wkday-out.out'/x(wkday25).
+print outfile='wkday-out.out'/x(wkday26).
+print outfile='wkday-out.out'/x(wkday27).
+print outfile='wkday-out.out'/x(wkday28).
+print outfile='wkday-out.out'/x(wkday29).
+print outfile='wkday-out.out'/x(wkday30).
+print outfile='wkday-out.out'/x(wkday31).
+print outfile='wkday-out.out'/x(wkday32).
+print outfile='wkday-out.out'/x(wkday33).
+print outfile='wkday-out.out'/x(wkday34).
+print outfile='wkday-out.out'/x(wkday35).
+print outfile='wkday-out.out'/x(wkday36).
+print outfile='wkday-out.out'/x(wkday37).
+print outfile='wkday-out.out'/x(wkday38).
+print outfile='wkday-out.out'/x(wkday39).
+print outfile='wkday-out.out'/x(wkday40).
+execute.
+EOF
+if [ $? -ne 0 ] ; then no_result ; fi
+
+activity="run program"
+$SUPERVISOR $PSPP --testing-mode wkday-out.pspp
+if [ $? -eq 0 ] ; then no_result ; fi
+
+activity="compare output"
+diff -u wkday-out.out - <<EOF 
+  .
+   .
+    .
+     .
+      .
+       .
+        .
+         .
+          .
+           .
+            .
+             .
+              .
+               .
+                .
+                 .
+                  .
+                   .
+                    .
+                     .
+                      .
+                       .
+                        .
+                         .
+                          .
+                           .
+                            .
+                             .
+                              .
+                               .
+                                .
+                                 .
+                                  .
+                                   .
+                                    .
+                                     .
+                                      .
+                                       .
+                                        .
+  .
+   .
+    .
+     .
+      .
+       .
+        .
+         .
+          .
+           .
+            .
+             .
+              .
+               .
+                .
+                 .
+                  .
+                   .
+                    .
+                     .
+                      .
+                       .
+                        .
+                         .
+                          .
+                           .
+                            .
+                             .
+                              .
+                               .
+                                .
+                                 .
+                                  .
+                                   .
+                                    .
+                                     .
+                                      .
+                                       .
+                                        .
+  .
+   .
+    .
+     .
+      .
+       .
+        .
+         .
+          .
+           .
+            .
+             .
+              .
+               .
+                .
+                 .
+                  .
+                   .
+                    .
+                     .
+                      .
+                       .
+                        .
+                         .
+                          .
+                           .
+                            .
+                             .
+                              .
+                               .
+                                .
+                                 .
+                                  .
+                                   .
+                                    .
+                                     .
+                                      .
+                                       .
+                                        .
+  .
+   .
+    .
+     .
+      .
+       .
+        .
+         .
+          .
+           .
+            .
+             .
+              .
+               .
+                .
+                 .
+                  .
+                   .
+                    .
+                     .
+                      .
+                       .
+                        .
+                         .
+                          .
+                           .
+                            .
+                             .
+                              .
+                               .
+                                .
+                                 .
+                                  .
+                                   .
+                                    .
+                                     .
+                                      .
+                                       .
+                                        .
+ SU
+ SUN
+ SUND
+ SUNDA
+ SUNDAY
+ SUNDAY 
+ SUNDAY  
+ SUNDAY   
+ SUNDAY    
+ SUNDAY     
+ SUNDAY      
+ SUNDAY       
+ SUNDAY        
+ SUNDAY         
+ SUNDAY          
+ SUNDAY           
+ SUNDAY            
+ SUNDAY             
+ SUNDAY              
+ SUNDAY               
+ SUNDAY                
+ SUNDAY                 
+ SUNDAY                  
+ SUNDAY                   
+ SUNDAY                    
+ SUNDAY                     
+ SUNDAY                      
+ SUNDAY                       
+ SUNDAY                        
+ SUNDAY                         
+ SUNDAY                          
+ SUNDAY                           
+ SUNDAY                            
+ SUNDAY                             
+ SUNDAY                              
+ SUNDAY                               
+ SUNDAY                                
+ SUNDAY                                 
+ SUNDAY                                  
+ MO
+ MON
+ MOND
+ MONDA
+ MONDAY
+ MONDAY 
+ MONDAY  
+ MONDAY   
+ MONDAY    
+ MONDAY     
+ MONDAY      
+ MONDAY       
+ MONDAY        
+ MONDAY         
+ MONDAY          
+ MONDAY           
+ MONDAY            
+ MONDAY             
+ MONDAY              
+ MONDAY               
+ MONDAY                
+ MONDAY                 
+ MONDAY                  
+ MONDAY                   
+ MONDAY                    
+ MONDAY                     
+ MONDAY                      
+ MONDAY                       
+ MONDAY                        
+ MONDAY                         
+ MONDAY                          
+ MONDAY                           
+ MONDAY                            
+ MONDAY                             
+ MONDAY                              
+ MONDAY                               
+ MONDAY                                
+ MONDAY                                 
+ MONDAY                                  
+ TU
+ TUE
+ TUES
+ TUESD
+ TUESDA
+ TUESDAY
+ TUESDAY 
+ TUESDAY  
+ TUESDAY   
+ TUESDAY    
+ TUESDAY     
+ TUESDAY      
+ TUESDAY       
+ TUESDAY        
+ TUESDAY         
+ TUESDAY          
+ TUESDAY           
+ TUESDAY            
+ TUESDAY             
+ TUESDAY              
+ TUESDAY               
+ TUESDAY                
+ TUESDAY                 
+ TUESDAY                  
+ TUESDAY                   
+ TUESDAY                    
+ TUESDAY                     
+ TUESDAY                      
+ TUESDAY                       
+ TUESDAY                        
+ TUESDAY                         
+ TUESDAY                          
+ TUESDAY                           
+ TUESDAY                            
+ TUESDAY                             
+ TUESDAY                              
+ TUESDAY                               
+ TUESDAY                                
+ TUESDAY                                 
+ WE
+ WED
+ WEDN
+ WEDNE
+ WEDNES
+ WEDNESD
+ WEDNESDA
+ WEDNESDAY
+ WEDNESDAY 
+ WEDNESDAY  
+ WEDNESDAY   
+ WEDNESDAY    
+ WEDNESDAY     
+ WEDNESDAY      
+ WEDNESDAY       
+ WEDNESDAY        
+ WEDNESDAY         
+ WEDNESDAY          
+ WEDNESDAY           
+ WEDNESDAY            
+ WEDNESDAY             
+ WEDNESDAY              
+ WEDNESDAY               
+ WEDNESDAY                
+ WEDNESDAY                 
+ WEDNESDAY                  
+ WEDNESDAY                   
+ WEDNESDAY                    
+ WEDNESDAY                     
+ WEDNESDAY                      
+ WEDNESDAY                       
+ WEDNESDAY                        
+ WEDNESDAY                         
+ WEDNESDAY                          
+ WEDNESDAY                           
+ WEDNESDAY                            
+ WEDNESDAY                             
+ WEDNESDAY                              
+ WEDNESDAY                               
+ WE
+ WED
+ WEDN
+ WEDNE
+ WEDNES
+ WEDNESD
+ WEDNESDA
+ WEDNESDAY
+ WEDNESDAY 
+ WEDNESDAY  
+ WEDNESDAY   
+ WEDNESDAY    
+ WEDNESDAY     
+ WEDNESDAY      
+ WEDNESDAY       
+ WEDNESDAY        
+ WEDNESDAY         
+ WEDNESDAY          
+ WEDNESDAY           
+ WEDNESDAY            
+ WEDNESDAY             
+ WEDNESDAY              
+ WEDNESDAY               
+ WEDNESDAY                
+ WEDNESDAY                 
+ WEDNESDAY                  
+ WEDNESDAY                   
+ WEDNESDAY                    
+ WEDNESDAY                     
+ WEDNESDAY                      
+ WEDNESDAY                       
+ WEDNESDAY                        
+ WEDNESDAY                         
+ WEDNESDAY                          
+ WEDNESDAY                           
+ WEDNESDAY                            
+ WEDNESDAY                             
+ WEDNESDAY                              
+ WEDNESDAY                               
+ WE
+ WED
+ WEDN
+ WEDNE
+ WEDNES
+ WEDNESD
+ WEDNESDA
+ WEDNESDAY
+ WEDNESDAY 
+ WEDNESDAY  
+ WEDNESDAY   
+ WEDNESDAY    
+ WEDNESDAY     
+ WEDNESDAY      
+ WEDNESDAY       
+ WEDNESDAY        
+ WEDNESDAY         
+ WEDNESDAY          
+ WEDNESDAY           
+ WEDNESDAY            
+ WEDNESDAY             
+ WEDNESDAY              
+ WEDNESDAY               
+ WEDNESDAY                
+ WEDNESDAY                 
+ WEDNESDAY                  
+ WEDNESDAY                   
+ WEDNESDAY                    
+ WEDNESDAY                     
+ WEDNESDAY                      
+ WEDNESDAY                       
+ WEDNESDAY                        
+ WEDNESDAY                         
+ WEDNESDAY                          
+ WEDNESDAY                           
+ WEDNESDAY                            
+ WEDNESDAY                             
+ WEDNESDAY                              
+ WEDNESDAY                               
+ WE
+ WED
+ WEDN
+ WEDNE
+ WEDNES
+ WEDNESD
+ WEDNESDA
+ WEDNESDAY
+ WEDNESDAY 
+ WEDNESDAY  
+ WEDNESDAY   
+ WEDNESDAY    
+ WEDNESDAY     
+ WEDNESDAY      
+ WEDNESDAY       
+ WEDNESDAY        
+ WEDNESDAY         
+ WEDNESDAY          
+ WEDNESDAY           
+ WEDNESDAY            
+ WEDNESDAY             
+ WEDNESDAY              
+ WEDNESDAY               
+ WEDNESDAY                
+ WEDNESDAY                 
+ WEDNESDAY                  
+ WEDNESDAY                   
+ WEDNESDAY                    
+ WEDNESDAY                     
+ WEDNESDAY                      
+ WEDNESDAY                       
+ WEDNESDAY                        
+ WEDNESDAY                         
+ WEDNESDAY                          
+ WEDNESDAY                           
+ WEDNESDAY                            
+ WEDNESDAY                             
+ WEDNESDAY                              
+ WEDNESDAY                               
+ TH
+ THU
+ THUR
+ THURS
+ THURSD
+ THURSDA
+ THURSDAY
+ THURSDAY 
+ THURSDAY  
+ THURSDAY   
+ THURSDAY    
+ THURSDAY     
+ THURSDAY      
+ THURSDAY       
+ THURSDAY        
+ THURSDAY         
+ THURSDAY          
+ THURSDAY           
+ THURSDAY            
+ THURSDAY             
+ THURSDAY              
+ THURSDAY               
+ THURSDAY                
+ THURSDAY                 
+ THURSDAY                  
+ THURSDAY                   
+ THURSDAY                    
+ THURSDAY                     
+ THURSDAY                      
+ THURSDAY                       
+ THURSDAY                        
+ THURSDAY                         
+ THURSDAY                          
+ THURSDAY                           
+ THURSDAY                            
+ THURSDAY                             
+ THURSDAY                              
+ THURSDAY                               
+ THURSDAY                                
+ FR
+ FRI
+ FRID
+ FRIDA
+ FRIDAY
+ FRIDAY 
+ FRIDAY  
+ FRIDAY   
+ FRIDAY    
+ FRIDAY     
+ FRIDAY      
+ FRIDAY       
+ FRIDAY        
+ FRIDAY         
+ FRIDAY          
+ FRIDAY           
+ FRIDAY            
+ FRIDAY             
+ FRIDAY              
+ FRIDAY               
+ FRIDAY                
+ FRIDAY                 
+ FRIDAY                  
+ FRIDAY                   
+ FRIDAY                    
+ FRIDAY                     
+ FRIDAY                      
+ FRIDAY                       
+ FRIDAY                        
+ FRIDAY                         
+ FRIDAY                          
+ FRIDAY                           
+ FRIDAY                            
+ FRIDAY                             
+ FRIDAY                              
+ FRIDAY                               
+ FRIDAY                                
+ FRIDAY                                 
+ FRIDAY                                  
+ SA
+ SAT
+ SATU
+ SATUR
+ SATURD
+ SATURDA
+ SATURDAY
+ SATURDAY 
+ SATURDAY  
+ SATURDAY   
+ SATURDAY    
+ SATURDAY     
+ SATURDAY      
+ SATURDAY       
+ SATURDAY        
+ SATURDAY         
+ SATURDAY          
+ SATURDAY           
+ SATURDAY            
+ SATURDAY             
+ SATURDAY              
+ SATURDAY               
+ SATURDAY                
+ SATURDAY                 
+ SATURDAY                  
+ SATURDAY                   
+ SATURDAY                    
+ SATURDAY                     
+ SATURDAY                      
+ SATURDAY                       
+ SATURDAY                        
+ SATURDAY                         
+ SATURDAY                          
+ SATURDAY                           
+ SATURDAY                            
+ SATURDAY                             
+ SATURDAY                              
+ SATURDAY                               
+ SATURDAY                                
+ SA
+ SAT
+ SATU
+ SATUR
+ SATURD
+ SATURDA
+ SATURDAY
+ SATURDAY 
+ SATURDAY  
+ SATURDAY   
+ SATURDAY    
+ SATURDAY     
+ SATURDAY      
+ SATURDAY       
+ SATURDAY        
+ SATURDAY         
+ SATURDAY          
+ SATURDAY           
+ SATURDAY            
+ SATURDAY             
+ SATURDAY              
+ SATURDAY               
+ SATURDAY                
+ SATURDAY                 
+ SATURDAY                  
+ SATURDAY                   
+ SATURDAY                    
+ SATURDAY                     
+ SATURDAY                      
+ SATURDAY                       
+ SATURDAY                        
+ SATURDAY                         
+ SATURDAY                          
+ SATURDAY                           
+ SATURDAY                            
+ SATURDAY                             
+ SATURDAY                              
+ SATURDAY                               
+ SATURDAY                                
+ SA
+ SAT
+ SATU
+ SATUR
+ SATURD
+ SATURDA
+ SATURDAY
+ SATURDAY 
+ SATURDAY  
+ SATURDAY   
+ SATURDAY    
+ SATURDAY     
+ SATURDAY      
+ SATURDAY       
+ SATURDAY        
+ SATURDAY         
+ SATURDAY          
+ SATURDAY           
+ SATURDAY            
+ SATURDAY             
+ SATURDAY              
+ SATURDAY               
+ SATURDAY                
+ SATURDAY                 
+ SATURDAY                  
+ SATURDAY                   
+ SATURDAY                    
+ SATURDAY                     
+ SATURDAY                      
+ SATURDAY                       
+ SATURDAY                        
+ SATURDAY                         
+ SATURDAY                          
+ SATURDAY                           
+ SATURDAY                            
+ SATURDAY                             
+ SATURDAY                              
+ SATURDAY                               
+ SATURDAY                                
+ SA
+ SAT
+ SATU
+ SATUR
+ SATURD
+ SATURDA
+ SATURDAY
+ SATURDAY 
+ SATURDAY  
+ SATURDAY   
+ SATURDAY    
+ SATURDAY     
+ SATURDAY      
+ SATURDAY       
+ SATURDAY        
+ SATURDAY         
+ SATURDAY          
+ SATURDAY           
+ SATURDAY            
+ SATURDAY             
+ SATURDAY              
+ SATURDAY               
+ SATURDAY                
+ SATURDAY                 
+ SATURDAY                  
+ SATURDAY                   
+ SATURDAY                    
+ SATURDAY                     
+ SATURDAY                      
+ SATURDAY                       
+ SATURDAY                        
+ SATURDAY                         
+ SATURDAY                          
+ SATURDAY                           
+ SATURDAY                            
+ SATURDAY                             
+ SATURDAY                              
+ SATURDAY                               
+ SATURDAY                                
+  .
+   .
+    .
+     .
+      .
+       .
+        .
+         .
+          .
+           .
+            .
+             .
+              .
+               .
+                .
+                 .
+                  .
+                   .
+                    .
+                     .
+                      .
+                       .
+                        .
+                         .
+                          .
+                           .
+                            .
+                             .
+                              .
+                               .
+                                .
+                                 .
+                                  .
+                                   .
+                                    .
+                                     .
+                                      .
+                                       .
+                                        .
+EOF
+if [ $? -ne 0 ] ; then fail ; fi
+
+pass