18e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels% -*- mode: latex; TeX-master: "Vorbis_I_spec"; -*- 28e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels%!TEX root = Vorbis_I_spec.tex 38e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels% $Id$ 48e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\section{Floor type 0 setup and decode} \label{vorbis:spec:floor0} 58e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 68e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\subsection{Overview} 78e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 88e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsVorbis floor type zero uses Line Spectral Pair (LSP, also alternately 98e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsknown as Line Spectral Frequency or LSF) representation to encode a 108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelssmooth spectral envelope curve as the frequency response of the LSP 118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsfilter. This representation is equivalent to a traditional all-pole 128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsinfinite impulse response filter as would be used in linear predictive 138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscoding; LSP representation may be converted to LPC representation and 148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsvice-versa. 158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\subsection{Floor 0 format} 198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsFloor zero configuration consists of six integer fields and a list of 218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsVQ codebooks for use in coding/decoding the LSP filter coefficient 228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsvalues used by each frame. 238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\subsubsection{header decode} 258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsConfiguration information for instances of floor zero decodes from the 278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscodec setup header (third packet). configuration decode proceeds as 288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsfollows: 298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{Verbatim}[commandchars=\\\{\}] 318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1) [floor0_order] = read an unsigned integer of 8 bits 328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2) [floor0_rate] = read an unsigned integer of 16 bits 338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3) [floor0_bark_map_size] = read an unsigned integer of 16 bits 348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4) [floor0_amplitude_bits] = read an unsigned integer of six bits 358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 5) [floor0_amplitude_offset] = read an unsigned integer of eight bits 368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 6) [floor0_number_of_books] = read an unsigned integer of four bits and add 1 378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 7) array [floor0_book_list] = read a list of [floor0_number_of_books] unsigned integers of eight bits each; 388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{Verbatim} 398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsAn end-of-packet condition during any of these bitstream reads renders 418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsthis stream undecodable. In addition, any element of the array 428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\varname{[floor0_book_list]} that is greater than the maximum codebook 438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsnumber for this bitstream is an error condition that also renders the 448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstream undecodable. 458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\subsubsection{packet decode} \label{vorbis:spec:floor0-decode} 498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsExtracting a floor0 curve from an audio packet consists of first 518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdecoding the curve amplitude and \varname{[floor0_order]} LSP 528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscoefficient values from the bitstream, and then computing the floor 538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscurve, which is defined as the frequency response of the decoded LSP 548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsfilter. 558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsPacket decode proceeds as follows: 578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{Verbatim}[commandchars=\\\{\}] 588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1) [amplitude] = read an unsigned integer of [floor0_amplitude_bits] bits 598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2) if ( [amplitude] is greater than zero ) \{ 608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3) [coefficients] is an empty, zero length vector 618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4) [booknumber] = read an unsigned integer of \link{vorbis:spec:ilog}{ilog}( [floor0_number_of_books] ) bits 628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 5) if ( [booknumber] is greater than the highest number decode codebook ) then packet is undecodable 638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 6) [last] = zero; 648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 7) vector [temp_vector] = read vector from bitstream using codebook number [floor0_book_list] element [booknumber] in VQ context. 658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 8) add the scalar value [last] to each scalar in vector [temp_vector] 668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 9) [last] = the value of the last scalar in vector [temp_vector] 678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 10) concatenate [temp_vector] onto the end of the [coefficients] vector 688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 11) if (length of vector [coefficients] is less than [floor0_order], continue at step 6 698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \} 718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 12) done. 738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{Verbatim} 758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsTake note of the following properties of decode: 778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{itemize} 788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item An \varname{[amplitude]} value of zero must result in a return code that indicates this channel is unused in this frame (the output of the channel will be all-zeroes in synthesis). Several later stages of decode don't occur for an unused channel. 798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item An end-of-packet condition during decode should be considered a 808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsnominal occruence; if end-of-packet is reached during any read 818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsoperation above, floor decode is to return 'unused' status as if the 828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\varname{[amplitude]} value had read zero at the beginning of decode. 838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item The book number used for decode 858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscan, in fact, be stored in the bitstream in \link{vorbis:spec:ilog}{ilog}( \varname{[floor0_number_of_books]} - 868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels1 ) bits. Nevertheless, the above specification is correct and values 878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsgreater than the maximum possible book value are reserved. 888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item The number of scalars read into the vector \varname{[coefficients]} 908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsmay be greater than \varname{[floor0_order]}, the number actually 918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsrequired for curve computation. For example, if the VQ codebook used 928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsfor the floor currently being decoded has a 938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\varname{[codebook_dimensions]} value of three and 948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\varname{[floor0_order]} is ten, the only way to fill all the needed 958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsscalars in \varname{[coefficients]} is to to read a total of twelve 968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsscalars as four vectors of three scalars each. This is not an error 978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscondition, and care must be taken not to allow a buffer overflow in 988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdecode. The extra values are not used and may be ignored or discarded. 998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{itemize} 1008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\subsubsection{curve computation} \label{vorbis:spec:floor0-synth} 1058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsGiven an \varname{[amplitude]} integer and \varname{[coefficients]} 1078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsvector from packet decode as well as the [floor0_order], 1088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels[floor0_rate], [floor0_bark_map_size], [floor0_amplitude_bits] and 1098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels[floor0_amplitude_offset] values from floor setup, and an output 1108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsvector size \varname{[n]} specified by the decode process, we compute a 1118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsfloor output vector. 1128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsIf the value \varname{[amplitude]} is zero, the return value is a 1148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelslength \varname{[n]} vector with all-zero scalars. Otherwise, begin by 1158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsassuming the following definitions for the given vector to be 1168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelssynthesized: 1178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \begin{displaymath} 1198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \mathrm{map}_i = \left\{ 1208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \begin{array}{ll} 1218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \min ( 1228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \mathtt{floor0\_bark\_map\_size} - 1, 1238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels foobar 1248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ) & \textrm{for } i \in [0,n-1] \\ 1258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels -1 & \textrm{for } i = n 1268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \end{array} 1278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \right. 1288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \end{displaymath} 1298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels where 1318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \begin{displaymath} 1338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels foobar = 1348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \left\lfloor 1358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \mathrm{bark}\left(\frac{\mathtt{floor0\_rate} \cdot i}{2n}\right) \cdot \frac{\mathtt{floor0\_bark\_map\_size}} {\mathrm{bark}(.5 \cdot \mathtt{floor0\_rate})} 1368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \right\rfloor 1378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \end{displaymath} 1388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels and 1408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \begin{displaymath} 1428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \mathrm{bark}(x) = 13.1 \arctan (.00074x) + 2.24 \arctan (.0000000185x^2 + .0001x) 1438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \end{displaymath} 1448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsThe above is used to synthesize the LSP curve on a Bark-scale frequency 1468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsaxis, then map the result to a linear-scale frequency axis. 1478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsSimilarly, the below calculation synthesizes the output LSP curve \varname{[output]} on a log 1488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels(dB) amplitude scale, mapping it to linear amplitude in the last step: 1498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{enumerate} 1518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item \varname{[i]} = 0 1528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item \varname{[$\omega$]} = $\pi$ * map element \varname{[i]} / \varname{[floor0_bark_map_size]} 1538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item if ( \varname{[floor0_order]} is odd ) { 1548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \begin{enumerate} 1558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item calculate \varname{[p]} and \varname{[q]} according to: 1568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \begin{eqnarray*} 1578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels p & = & (1 - \cos^2\omega)\prod_{j=0}^{\frac{\mathtt{floor0\_order}-3}{2}} 4 (\cos([\mathtt{coefficients}]_{2j+1}) - \cos \omega)^2 \\ 1588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels q & = & \frac{1}{4} \prod_{j=0}^{\frac{\mathtt{floor0\_order}-1}{2}} 4 (\cos([\mathtt{coefficients}]_{2j}) - \cos \omega)^2 1598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \end{eqnarray*} 1608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \end{enumerate} 1628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } else \varname{[floor0_order]} is even { 1638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \begin{enumerate} 1648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item calculate \varname{[p]} and \varname{[q]} according to: 1658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \begin{eqnarray*} 1668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels p & = & \frac{(1 - \cos^2\omega)}{2} \prod_{j=0}^{\frac{\mathtt{floor0\_order}-2}{2}} 4 (\cos([\mathtt{coefficients}]_{2j+1}) - \cos \omega)^2 \\ 1678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels q & = & \frac{(1 + \cos^2\omega)}{2} \prod_{j=0}^{\frac{\mathtt{floor0\_order}-2}{2}} 4 (\cos([\mathtt{coefficients}]_{2j}) - \cos \omega)^2 1688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \end{eqnarray*} 1698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \end{enumerate} 1718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 1728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item calculate \varname{[linear_floor_value]} according to: 1748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \begin{displaymath} 1758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \exp \left( .11512925 \left(\frac{\mathtt{amplitude} \cdot \mathtt{floor0\_amplitute\_offset}}{(2^{\mathtt{floor0\_amplitude\_bits}}-1)\sqrt{p+q}} 1768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels - \mathtt{floor0\_amplitude\_offset} \right) \right) 1778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \end{displaymath} 1788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item \varname{[iteration_condition]} = map element \varname{[i]} 1808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item \varname{[output]} element \varname{[i]} = \varname{[linear_floor_value]} 1818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item increment \varname{[i]} 1828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item if ( map element \varname{[i]} is equal to \varname{[iteration_condition]} ) continue at step 5 1838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item if ( \varname{[i]} is less than \varname{[n]} ) continue at step 2 1848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item done 1858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{enumerate} 1868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 193