| 15337 |      1 | %%
 | 
|  |      2 | %% This is the original source file mathpar.sty
 | 
|  |      3 | %%
 | 
|  |      4 | %% Package `mathpar' to use with LaTeX 2e
 | 
|  |      5 | %% Copyright Didier Remy, all rights reserved.
 | 
|  |      6 | \NeedsTeXFormat{LaTeX2e}
 | 
|  |      7 | \ProvidesPackage{mathpartir}
 | 
|  |      8 |          [2001/23/02 v0.92 Math Paragraph for Type Inference Rules]
 | 
|  |      9 | 
 | 
|  |     10 | %%
 | 
|  |     11 | 
 | 
|  |     12 | %% Identification
 | 
|  |     13 | %% Preliminary declarations
 | 
|  |     14 | 
 | 
|  |     15 | \RequirePackage {keyval}
 | 
|  |     16 | 
 | 
|  |     17 | %% Options
 | 
|  |     18 | %% More declarations
 | 
|  |     19 | 
 | 
|  |     20 | %% PART I: Typesetting maths in paragraphe mode
 | 
|  |     21 | 
 | 
|  |     22 | \newdimen \mpr@tmpdim
 | 
|  |     23 | 
 | 
|  |     24 | % To ensure hevea \hva compatibility, \hva should expands to nothing 
 | 
|  |     25 | % in mathpar or in mathrule
 | 
|  |     26 | \let \mpr@hva \empty
 | 
|  |     27 | 
 | 
|  |     28 | %% normal paragraph parametters, should rather be taken dynamically
 | 
|  |     29 | \def \mpr@savepar {%
 | 
|  |     30 |   \edef \MathparNormalpar
 | 
|  |     31 |      {\noexpand \lineskiplimit \the\lineskiplimit
 | 
|  |     32 |       \noexpand \lineski \the\lineskip}%
 | 
|  |     33 |   }
 | 
|  |     34 | 
 | 
|  |     35 | \def \mpr@rulelineskip {\lineskiplimit=0.3em\lineskip=0.2em plus 0.1em}
 | 
|  |     36 | \def \mpr@lesslineskip {\lineskiplimit=0.6em\lineskip=0.5em plus 0.2em}
 | 
|  |     37 | \def \mpr@lineskip  {\lineskiplimit=1.2em\lineskip=1.2em plus 0.2em}
 | 
|  |     38 | \let \MathparLineskip \mpr@lineskip
 | 
|  |     39 | \def \mpr@paroptions {\MathparLineskip}
 | 
|  |     40 | \let \mpr@prebindings \relax
 | 
|  |     41 | 
 | 
|  |     42 | \newskip \mpr@andskip \mpr@andskip 2em plus 0.5fil minus 0.5em
 | 
|  |     43 | 
 | 
|  |     44 | \def \mpr@goodbreakand
 | 
|  |     45 |    {\hskip -\mpr@andskip  \penalty -1000\hskip \mpr@andskip}
 | 
|  |     46 | \def \mpr@and {\hskip \mpr@andskip}
 | 
|  |     47 | \def \mpr@andcr {\penalty 50\mpr@and}
 | 
|  |     48 | \def \mpr@cr {\penalty -10000\mpr@and}
 | 
|  |     49 | \def \mpr@eqno #1{\mpr@andcr #1\hskip 0em plus -1fil \penalty 10}
 | 
|  |     50 | 
 | 
|  |     51 | \def \mpr@bindings {%
 | 
|  |     52 |   \let \and \mpr@andcr
 | 
|  |     53 |   \let \par \mpr@andcr
 | 
|  |     54 |   \let \\\mpr@cr
 | 
|  |     55 |   \let \eqno \mpr@eqno
 | 
|  |     56 |   \let \hva \mpr@hva
 | 
|  |     57 |   } 
 | 
|  |     58 | \let \MathparBindings \mpr@bindings
 | 
|  |     59 | 
 | 
|  |     60 | \newenvironment{mathpar}[1][]
 | 
|  |     61 |   {$$\mpr@savepar \parskip 0em \hsize \linewidth \centering
 | 
|  |     62 |      \vbox \bgroup \mpr@prebindings \mpr@paroptions #1\ifmmode $\else
 | 
|  |     63 |      \noindent $\displaystyle\fi
 | 
|  |     64 |      \MathparBindings}
 | 
|  |     65 |   {\unskip \ifmmode $\fi\egroup $$\ignorespacesafterend}
 | 
|  |     66 | 
 | 
|  |     67 | % \def \math@mathpar #1{\setbox0 \hbox {$\displaystyle #1$}\ifnum
 | 
|  |     68 | %     \wd0 < \hsize  $$\box0$$\else \bmathpar #1\emathpar \fi}
 | 
|  |     69 | 
 | 
|  |     70 | %%% HOV BOXES
 | 
|  |     71 | 
 | 
|  |     72 | \def \mathvbox@ #1{\hbox \bgroup \mpr@normallineskip 
 | 
|  |     73 |   \vbox \bgroup \tabskip 0em \let \\ \cr
 | 
|  |     74 |   \halign \bgroup \hfil $##$\hfil\cr #1\crcr \egroup \egroup
 | 
|  |     75 |   \egroup}
 | 
|  |     76 | 
 | 
|  |     77 | \def \mathhvbox@ #1{\setbox0 \hbox {\let \\\qquad $#1$}\ifnum \wd0 < \hsize
 | 
|  |     78 |       \box0\else \mathvbox {#1}\fi}
 | 
|  |     79 | 
 | 
|  |     80 | 
 | 
|  |     81 | %% Part II -- operations on lists
 | 
|  |     82 | 
 | 
|  |     83 | \newtoks \mpr@lista
 | 
|  |     84 | \newtoks \mpr@listb
 | 
|  |     85 | 
 | 
|  |     86 | \long \def\mpr@cons #1\to#2{\mpr@lista {\\{#1}}\mpr@listb \expandafter
 | 
|  |     87 | {#2}\edef #2{\the \mpr@lista \the \mpr@listb}}
 | 
|  |     88 | 
 | 
|  |     89 | \long \def\mpr@snoc #1\to#2{\mpr@lista {\\{#1}}\mpr@listb \expandafter
 | 
|  |     90 | {#2}\edef #2{\the \mpr@listb\the\mpr@lista}}
 | 
|  |     91 | 
 | 
|  |     92 | \long \def \mpr@concat#1=#2\to#3{\mpr@lista \expandafter {#2}\mpr@listb
 | 
|  |     93 | \expandafter {#3}\edef #1{\the \mpr@listb\the\mpr@lista}}
 | 
|  |     94 | 
 | 
|  |     95 | \def \mpr@head #1\to #2{\expandafter \mpr@head@ #1\mpr@head@ #1#2}
 | 
|  |     96 | \long \def \mpr@head@ #1#2\mpr@head@ #3#4{\def #4{#1}\def#3{#2}}
 | 
|  |     97 | 
 | 
|  |     98 | \def \mpr@flatten #1\to #2{\expandafter \mpr@flatten@ #1\mpr@flatten@ #1#2}
 | 
|  |     99 | \long \def \mpr@flatten@ \\#1\\#2\mpr@flatten@ #3#4{\def #4{#1}\def #3{\\#2}}
 | 
|  |    100 | 
 | 
|  |    101 | \def \mpr@makelist #1\to #2{\def \mpr@all {#1}%
 | 
|  |    102 |    \mpr@lista {\\}\mpr@listb \expandafter {\mpr@all}\edef \mpr@all {\the
 | 
|  |    103 |    \mpr@lista \the \mpr@listb \the \mpr@lista}\let #2\empty 
 | 
|  |    104 |    \def \mpr@stripof ##1##2\mpr@stripend{\def \mpr@stripped{##2}}\loop
 | 
|  |    105 |      \mpr@flatten \mpr@all \to \mpr@one
 | 
|  |    106 |      \expandafter \mpr@snoc \mpr@one \to #2\expandafter \mpr@stripof
 | 
|  |    107 |      \mpr@all \mpr@stripend  
 | 
|  |    108 |      \ifx \mpr@stripped \empty \let \mpr@isempty 0\else \let \mpr@isempty 1\fi
 | 
|  |    109 |      \ifx 1\mpr@isempty
 | 
|  |    110 |    \repeat
 | 
|  |    111 | }
 | 
|  |    112 | 
 | 
|  |    113 | %% Part III -- Type inference rules
 | 
|  |    114 | 
 | 
|  |    115 | \def \mpr@rev #1\to #2{\let \mpr@tmp \empty
 | 
|  |    116 |    \def \\##1{\mpr@cons ##1\to \mpr@tmp}#1\let #2\mpr@tmp}
 | 
|  |    117 | 
 | 
|  |    118 | \newif \if@premisse
 | 
|  |    119 | \newbox \mpr@hlist
 | 
|  |    120 | \newbox \mpr@vlist
 | 
|  |    121 | \newif \ifmpr@center \mpr@centertrue
 | 
|  |    122 | \def \mpr@htovlist {%
 | 
|  |    123 |    \setbox \mpr@hlist
 | 
|  |    124 |       \hbox {\strut
 | 
|  |    125 |              \ifmpr@center \hskip -0.5\wd\mpr@hlist\fi
 | 
|  |    126 |              \unhbox \mpr@hlist}%
 | 
|  |    127 |    \setbox \mpr@vlist
 | 
|  |    128 |       \vbox {\if@premisse  \box \mpr@hlist \unvbox \mpr@vlist
 | 
|  |    129 |              \else \unvbox \mpr@vlist \box \mpr@hlist
 | 
|  |    130 |              \fi}%
 | 
|  |    131 | }
 | 
|  |    132 | % OLD version
 | 
|  |    133 | % \def \mpr@htovlist {%
 | 
|  |    134 | %    \setbox \mpr@hlist
 | 
|  |    135 | %       \hbox {\strut \hskip -0.5\wd\mpr@hlist \unhbox \mpr@hlist}%
 | 
|  |    136 | %    \setbox \mpr@vlist
 | 
|  |    137 | %       \vbox {\if@premisse  \box \mpr@hlist \unvbox \mpr@vlist
 | 
|  |    138 | %              \else \unvbox \mpr@vlist \box \mpr@hlist
 | 
|  |    139 | %              \fi}%
 | 
|  |    140 | % }
 | 
|  |    141 | 
 | 
|  |    142 | 
 | 
|  |    143 | 
 | 
|  |    144 | 
 | 
|  |    145 | \def \mpr@blank { }
 | 
|  |    146 | \def \mpr@hovbox #1#2{\hbox
 | 
|  |    147 |   \bgroup
 | 
|  |    148 |   \ifx #1T\@premissetrue
 | 
|  |    149 |   \else \ifx #1B\@premissefalse
 | 
|  |    150 |   \else
 | 
|  |    151 |      \PackageError{mathpartir}
 | 
|  |    152 |        {Premisse orientation should either be P or B}
 | 
|  |    153 |        {Fatal error in Package}%
 | 
|  |    154 |   \fi \fi
 | 
|  |    155 |   \def \@test {#2}\ifx \@test \mpr@blank\else
 | 
|  |    156 |   \setbox \mpr@hlist \hbox {}%
 | 
|  |    157 |   \setbox \mpr@vlist \vbox {}%
 | 
|  |    158 |   \if@premisse \let \snoc \mpr@cons \else \let \snoc \mpr@snoc \fi
 | 
|  |    159 |   \let \@hvlist \empty \let \@rev \empty
 | 
|  |    160 |   \mpr@tmpdim 0em
 | 
|  |    161 |   \expandafter \mpr@makelist #2\to \mpr@flat
 | 
|  |    162 |   \if@premisse \mpr@rev \mpr@flat \to \@rev \else \let \@rev \mpr@flat \fi
 | 
|  |    163 |   \def \\##1{%
 | 
|  |    164 |      \def \@test {##1}\ifx \@test \empty
 | 
|  |    165 |         \mpr@htovlist
 | 
|  |    166 |         \mpr@tmpdim 0em %%% last bug fix not extensively checked
 | 
|  |    167 |      \else
 | 
|  |    168 |       \setbox0 \hbox{$\displaystyle {##1}$}\relax
 | 
|  |    169 |       \advance \mpr@tmpdim by \wd0
 | 
|  |    170 |       %\mpr@tmpdim 1.02\mpr@tmpdim
 | 
|  |    171 |       \ifnum \mpr@tmpdim < \hsize
 | 
|  |    172 |          \ifnum \wd\mpr@hlist > 0
 | 
|  |    173 |            \if@premisse
 | 
|  |    174 |              \setbox \mpr@hlist \hbox {\unhbox0 \qquad \unhbox \mpr@hlist}%
 | 
|  |    175 |            \else
 | 
|  |    176 |              \setbox \mpr@hlist \hbox {\unhbox \mpr@hlist \qquad \unhbox0}%
 | 
|  |    177 |            \fi
 | 
|  |    178 |          \else 
 | 
|  |    179 |          \setbox \mpr@hlist \hbox {\unhbox0}%
 | 
|  |    180 |          \fi
 | 
|  |    181 |       \else
 | 
|  |    182 |          \ifnum \wd \mpr@hlist > 0
 | 
|  |    183 |             \mpr@htovlist 
 | 
|  |    184 |             \mpr@tmpdim \wd0
 | 
|  |    185 |          \fi
 | 
|  |    186 |          \setbox \mpr@hlist \hbox {\unhbox0}%
 | 
|  |    187 |       \fi
 | 
|  |    188 |       \advance \mpr@tmpdim by 2em
 | 
|  |    189 |    \fi
 | 
|  |    190 |    }%
 | 
|  |    191 |    \@rev
 | 
|  |    192 |    \mpr@htovlist
 | 
|  |    193 |    \ifmpr@center \hskip \wd\mpr@vlist\fi \box \mpr@vlist
 | 
|  |    194 |    \fi
 | 
|  |    195 |    \egroup
 | 
|  |    196 | }
 | 
|  |    197 | 
 | 
|  |    198 | %%% INFERENCE RULES
 | 
|  |    199 | 
 | 
|  |    200 | \@ifundefined{@@over}{%
 | 
|  |    201 |     \let\@@over\over % fallback if amsmath is not loaded
 | 
|  |    202 |     \let\@@overwithdelims\overwithdelims
 | 
|  |    203 |     \let\@@atop\atop \let\@@atopwithdelims\atopwithdelims
 | 
|  |    204 |     \let\@@above\above \let\@@abovewithdelims\abovewithdelims
 | 
|  |    205 |   }{}
 | 
|  |    206 | 
 | 
|  |    207 | 
 | 
|  |    208 | \def \mpr@@fraction #1#2{\hbox {\advance \hsize by -0.5em
 | 
|  |    209 |     $\displaystyle {#1\@@over #2}$}}
 | 
|  |    210 | \let \mpr@fraction \mpr@@fraction
 | 
|  |    211 | \def \mpr@@reduce #1#2{\hbox
 | 
|  |    212 |     {$\lower 0.01pt \mpr@@fraction {#1}{#2}\mkern -15mu\rightarrow$}}
 | 
|  |    213 | \def \mpr@infercenter #1{\vcenter {\mpr@hovbox{T}{#1}}}
 | 
|  |    214 | 
 | 
|  |    215 | \def \mpr@empty {}
 | 
|  |    216 | \def \mpr@inferrule
 | 
|  |    217 |   {\bgroup
 | 
|  |    218 |      \mpr@rulelineskip
 | 
|  |    219 |      \let \and \qquad
 | 
|  |    220 |      \let \hva \mpr@hva
 | 
|  |    221 |      \let \@rulename \mpr@empty
 | 
|  |    222 |      \let \@rule@options \mpr@empty
 | 
|  |    223 |      \mpr@inferrule@}
 | 
|  |    224 | \newcommand {\mpr@inferrule@}[3][]
 | 
|  |    225 |   {\everymath={\displaystyle}%       
 | 
|  |    226 |    \def \@test {#2}\ifx \empty \@test
 | 
|  |    227 |       \setbox0 \hbox {$\vcenter {\mpr@hovbox{B}{#3}}$}%
 | 
|  |    228 |    \else 
 | 
|  |    229 |    \def \@test {#3}\ifx \empty \@test
 | 
|  |    230 |       \setbox0 \hbox {$\vcenter {\mpr@hovbox{T}{#2}}$}%
 | 
|  |    231 |    \else
 | 
|  |    232 |    \setbox0 \mpr@fraction {\mpr@hovbox{T}{#2}}{\mpr@hovbox{B}{#3}}%
 | 
|  |    233 |    \fi \fi
 | 
|  |    234 |    \def \@test {#1}\ifx \@test\empty \box0
 | 
|  |    235 |    \else \vbox 
 | 
|  |    236 | %%% Suggestion de Francois pour les etiquettes longues
 | 
|  |    237 | %%%   {\hbox to \wd0 {\TirName {#1}\hfil}\box0}\fi
 | 
|  |    238 |       {\hbox {\TirName {#1}}\box0}\fi
 | 
|  |    239 |    \egroup}
 | 
|  |    240 | 
 | 
|  |    241 | \def \mpr@vdotfil #1{\vbox to #1{\leaders \hbox{$\cdot$} \vfil}}
 | 
|  |    242 | 
 | 
|  |    243 | % They are two forms
 | 
|  |    244 | % \mathrule [label]{[premisses}{conclusions}
 | 
|  |    245 | % or
 | 
|  |    246 | % \mathrule* [options]{[premisses}{conclusions}
 | 
|  |    247 | %
 | 
|  |    248 | % Premisses and conclusions are lists of elements separated by \\
 | 
|  |    249 | % Each \\ produces a break, attempting horizontal breaks if possible, 
 | 
|  |    250 | % and  vertical breaks if needed. 
 | 
|  |    251 | % 
 | 
|  |    252 | % An empty element obtained by \\\\ produces a vertical break in all cases. 
 | 
|  |    253 | %
 | 
|  |    254 | % The former rule is aligned on the fraction bar. 
 | 
|  |    255 | % The optional label appears on top of the rule
 | 
|  |    256 | % The second form to be used in a derivation tree is aligned on the last
 | 
|  |    257 | % line of its conclusion
 | 
|  |    258 | % 
 | 
|  |    259 | % The second form can be parameterized, using the key=val interface. The
 | 
|  |    260 | % folloiwng keys are recognized:
 | 
|  |    261 | %       
 | 
|  |    262 | %  width                set the width of the rule to val
 | 
|  |    263 | %  narrower             set the width of the rule to val\hsize
 | 
|  |    264 | %  before               execute val at the beginning/left
 | 
|  |    265 | %  lab                  put a label [Val] on top of the rule
 | 
|  |    266 | %  lskip                add negative skip on the right
 | 
|  |    267 | %  llab                 put a left label [Val],  ignoring its width 
 | 
|  |    268 | %  left                 put a left label [Val]
 | 
|  |    269 | %  right                put a right label [Val]
 | 
|  |    270 | %  rlab                 put a right label [Val], ignoring its width
 | 
|  |    271 | %  rskip                add negative skip on the left
 | 
|  |    272 | %  vdots                lift the rule by val and fill vertical space with dots
 | 
|  |    273 | %  after                execute val at the end/right
 | 
|  |    274 | %  
 | 
|  |    275 | %  Note that most options must come in this order to avoid strange
 | 
|  |    276 | %  typesetting (in particular  lskip must preceed left and llab and
 | 
|  |    277 | %  rskip must follow rlab or right; vdots must come last or be followed by
 | 
|  |    278 | %  rskip. 
 | 
|  |    279 | %  
 | 
|  |    280 | 
 | 
|  |    281 | \define@key {mprset}{flushleft}[]{\mpr@centerfalse}
 | 
|  |    282 | \define@key {mprset}{center}[]{\mpr@centertrue}
 | 
|  |    283 | \def \mprset #1{\setkeys{mprset}{#1}}
 | 
|  |    284 | 
 | 
|  |    285 | \newbox \mpr@right
 | 
|  |    286 | \define@key {mpr}{flushleft}[]{\mpr@centerfalse}
 | 
|  |    287 | \define@key {mpr}{center}[]{\mpr@centertrue}
 | 
|  |    288 | \define@key {mpr}{left}{\setbox0 \hbox {$\TirName {#1}\;$}\relax
 | 
|  |    289 |      \advance \hsize by -\wd0\box0}
 | 
|  |    290 | \define@key {mpr}{width}{\hsize #1}
 | 
|  |    291 | \define@key {mpr}{before}{#1}
 | 
|  |    292 | \define@key {mpr}{lab}{\def \mpr@rulename {[#1]}}
 | 
|  |    293 | \define@key {mpr}{Lab}{\def \mpr@rulename {#1}}
 | 
|  |    294 | \define@key {mpr}{narrower}{\hsize #1\hsize}
 | 
|  |    295 | \define@key {mpr}{leftskip}{\hskip -#1}
 | 
|  |    296 | \define@key {mpr}{reduce}[]{\let \mpr@fraction \mpr@@reduce}
 | 
|  |    297 | \define@key {mpr}{rightskip}
 | 
|  |    298 |   {\setbox \mpr@right \hbox {\unhbox \mpr@right \hskip -#1}}
 | 
|  |    299 | \define@key {mpr}{left}{\setbox0 \hbox {$\TirName {#1}\;$}\relax
 | 
|  |    300 |      \advance \hsize by -\wd0\box0}
 | 
|  |    301 | \define@key {mpr}{Left}{\llap{$\TirName {#1}\;$}}
 | 
|  |    302 | \define@key {mpr}{right}
 | 
|  |    303 |   {\setbox0 \hbox {$\;\TirName {#1}$}\relax \advance \hsize by -\wd0
 | 
|  |    304 |    \setbox \mpr@right \hbox {\unhbox \mpr@right \unhbox0}}
 | 
|  |    305 | \define@key {mpr}{Right}
 | 
|  |    306 |   {\setbox \mpr@right \hbox {\unhbox \mpr@right \rlap {$\;\TirName {#1}$}}}
 | 
|  |    307 | \define@key {mpr}{vdots}{\def \mpr@vdots {\@@atop \mpr@vdotfil{#1}}}
 | 
|  |    308 | \define@key {mpr}{after}{\edef \mpr@after {\mpr@after #1}}
 | 
|  |    309 | 
 | 
|  |    310 | \newdimen \rule@dimen
 | 
|  |    311 | \newcommand \mpr@inferstar@ [3][]{\setbox0
 | 
|  |    312 |   \hbox {\let \mpr@rulename \mpr@empty \let \mpr@vdots \relax
 | 
|  |    313 |          \setbox \mpr@right \hbox{}%
 | 
|  |    314 |          $\setkeys{mpr}{#1}%
 | 
|  |    315 |           \ifx \mpr@rulename \mpr@empty \mpr@inferrule {#2}{#3}\else
 | 
|  |    316 |           \mpr@inferrule [{\mpr@rulename}]{#2}{#3}\fi
 | 
|  |    317 |           \box \mpr@right \mpr@vdots$}
 | 
|  |    318 |   \setbox1 \hbox {\strut}
 | 
|  |    319 |   \rule@dimen \dp0 \advance \rule@dimen by -\dp1
 | 
|  |    320 |   \raise \rule@dimen \box0}
 | 
|  |    321 | 
 | 
|  |    322 | \def \mpr@infer {\@ifnextchar *{\mpr@inferstar}{\mpr@inferrule}}
 | 
|  |    323 | \newcommand \mpr@err@skipargs[3][]{}
 | 
|  |    324 | \def \mpr@inferstar*{\ifmmode 
 | 
|  |    325 |     \let \@do \mpr@inferstar@
 | 
|  |    326 |   \else 
 | 
|  |    327 |     \let \@do \mpr@err@skipargs
 | 
|  |    328 |     \PackageError {mathpartir}
 | 
|  |    329 |       {\string\inferrule* can only be used in math mode}{}%
 | 
|  |    330 |   \fi \@do}
 | 
|  |    331 | 
 | 
|  |    332 | 
 | 
|  |    333 | %%% Exports
 | 
|  |    334 | 
 | 
|  |    335 | % Envirnonment mathpar
 | 
|  |    336 | 
 | 
|  |    337 | \let \inferrule \mpr@infer
 | 
|  |    338 | 
 | 
|  |    339 | % make a short name \infer is not already defined
 | 
|  |    340 | \@ifundefined {infer}{\let \infer \mpr@infer}{}
 | 
|  |    341 | 
 | 
|  |    342 | \def \tir@name #1{\hbox {\small \sc #1}}
 | 
|  |    343 | \let \TirName \tir@name
 | 
|  |    344 | 
 | 
|  |    345 | %%% Other Exports
 | 
|  |    346 | 
 | 
|  |    347 | % \let \listcons \mpr@cons
 | 
|  |    348 | % \let \listsnoc \mpr@snoc
 | 
|  |    349 | % \let \listhead \mpr@head
 | 
|  |    350 | % \let \listmake \mpr@makelist
 | 
|  |    351 | 
 | 
|  |    352 | 
 | 
|  |    353 | \endinput
 | 
|  |    354 | 
 |