
    ]Mhj                        d dl mZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZmZ d dlmZ d dlZd dlZd d	lmZ g d
Z ej        d          Zg dZg dZ ed  edd          D                       Zg dZdZd Zd Zd Z d Z!d Z"d)dZ#d)dZ$d)dZ%d Z&d Z'd Z(	 	 	 	 	 d*dZ)	 	 	 	 	 	 d+d Z*	 	 	 	 	 	 d+d!Z+	 	 	 	 	 	 d+d"Z,	 	 	 	 	 	 d+d#Z-d$ Z.d% Z/	 	 	 	 	 	 d,d&Z0d)d'Z1e2d(k    rd dl3Z3 e3j4         e1                       dS dS )-    )newTable)Axis)AreaPen)NullPen)StatisticsPen)piecewiseLinearMapnormalizeValue)makeOutputFileNameN)pformat)planWeightAxisplanWidthAxisplanSlantAxisplanOpticalSizeAxisplanAxissanitizeWeightsanitizeWidthsanitizeSlantmeasureWeightmeasureWidthmeasureSlantnormalizeLinearnormalizeLognormalizeDegreesinterpolateLinearinterpolateLogprocessAxismakeDesignspaceSnippetaddEmptyAvarmainzfontTools.varLib.avarPlanner)2   d            i,  i^  i  i  i  i&  iX  i  i  i  i   iR  i  i  )g      9@g     B@g      I@g     @O@g     R@g     U@g      Y@g      \@g     @_@g     0a@g     b@g     Pd@g     e@g     pg@g      i@c              #   h   K   | ]-}t          j        t          j        |d z                      V  .dS )g      4@N)mathdegreesatan.0ds     \/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/fontTools/varLib/avarPlanner.py	<genexpr>r-   M   s:      HHAdl49QX..//HHHHHH    i   )            	   
                     $   0   <   H   `   x            i   r3   c                     | |z
  ||z
  z  S )zOLinearly normalize value in [rangeMin, rangeMax] to [0, 1], with extrapolation. )valuerangeMinrangeMaxs      r,   r   r   l   s    HH!455r.   c                     || ||z
  z  z   S )zALinear interpolation between a and b, with t typically in [0, 1].rF   )tabs      r,   r   r   q   s    qAE{?r.   c                     t          j        |          }t          j        |          }t          j        |           |z
  ||z
  z  S )zVLogarithmically normalize value in [rangeMin, rangeMax] to [0, 1], with extrapolation.)r&   log)rG   rH   rI   logMinlogMaxs        r,   r   r   v   s<    XhFXhFHUOOf$&99r.   c                     t          j        |          }t          j        |          }t          j        || ||z
  z  z             S )zFLogarithmic interpolation between a and b, with t typically in [0, 1].)r&   rO   exp)rK   rL   rM   logAlogBs        r,   r   r   }   s:    8A;;D8A;;D8D1t,,---r.   c                     t          j        t          j        |                    }t          j        t          j        |                    }t          j        t          j        |                     |z
  ||z
  z  S )zPAngularly normalize value in [rangeMin, rangeMax] to [0, 1], with extrapolation.)r&   tanradians)rG   rH   rI   tanMintanMaxs        r,   r   r      s\    Xdl8,,--FXdl8,,--FHT\%(())F2vGGr.   c                 V   t          |t                    r|}nd |D             }dx}}|D ]z}||                    |d          }|dk    r!nd}| |         }t          |           }|                    |           |j        |z  }	||	t          |j                  z  z  }||	z  }{||z  S )z:Measure the perceptual average weight of the given glyphs.c                     i | ]}|d S    rF   r*   gs     r,   
<dictcomp>z!measureWeight.<locals>.<dictcomp>       ,,,q!,,,r.   r   Nr^   glyphset)
isinstancedictgetr   drawwidthabsrG   )
rd   glyphsfrequencieswght_sumwdth_sum
glyph_name	frequencyglyphpenmults
             r,   r   r      s    &$ -,,V,,,Hx  
"#
A66IA~~  I$x(((

3{Y&D3sy>>))Dhr.   c                 $   t          |t                    r|}nd |D             }d}d}|D ]a}||                    |d          }|dk    r!nd}| |         }t                      }|                    |           ||j        |z  z  }||z  }b||z  S )z.Measure the average width of the given glyphs.c                     i | ]}|d S r]   rF   r_   s     r,   ra   z measureWidth.<locals>.<dictcomp>   rb   r.   r   Nr^   )re   rf   rg   r   rh   ri   )	rd   rk   rl   rn   freq_sumro   rp   rq   rr   s	            r,   r   r      s    &$ -,,V,,,HH  
"#
A66IA~~  I$ii

3EK)++Ihr.   c                    t          |t                    r|}nd |D             }d}d}|D ]m}||                    |d          }|dk    r!nd}| |         }t          |           }|                    |           |j        |z  }	||	|j        z  z  }||	z  }nt          j        t          j	        ||z                       S )z?Measure the perceptual average slant angle of the given glyphs.c                     i | ]}|d S r]   rF   r_   s     r,   ra   z measureSlant.<locals>.<dictcomp>   rb   r.   r   Nr^   rc   )
re   rf   rg   r   rh   ri   slantr&   r'   r(   )
rd   rk   rl   slnt_sumrv   ro   rp   rq   rr   rs   s
             r,   r   r      s    &$ -,,V,,,HH  
"#
A66IA~~  I$X...

3{Y&D39$$DL8h#6778888r.   c                 2   ||d                  ||d                  ||d                  }}}| d         ||z  z  }| d         ||z  z  }t          j        dg| R   t                               d|| d         |           t          || d         z
            | d         z  dk    s%t          || d         z
            | d         z  dk    rQt                               d           t          j        dg| R   t                               d	|| d         |           d
S dS )zSanitize the width axis limits.r   r^      z$Original width axis limits: %g:%g:%gz&Calculated width axis limits: %g:%g:%g皙?z6Calculated width axis min/max do not match user input.z%  Current width axis limits: %g:%g:%gz'  Suggested width axis limits: %g:%g:%gFTrO   inforj   warning)	
userTripledesignTriplepinsmeasurementsminVal
defaultValmaxValcalculatedMinValcalculatedMaxVals	            r,   r   r      sS    	\!_%\!_%\!_% JF "!}(;<!!}(;<H3AjAAAAHH01	   	z!},--
1=DD*Q-/00:a=@4GGLMMM3	
	
 	
 	
 	
 	5qM		
 	
 	
 u4r.   c                    t          t          |                     dk     rdS ||d                  ||d                  ||d                  }}}t          j        |          }t          j        |          }t          j        |          }	| d         | d         z
  | d         | d         z
  z  }
t          j        ||
|	|z
  z  z             }||z
  ||z
  z  }
| d         |
| d         | d         z
  z  z   }t          j        dg| R   t                              d| d         || d                    t          || d         z
            | d         z  dk    ryt                              d	           t          j        d
g| R   t                              d| d         || d                    | d         | d         z
  | d         | d         z
  z  }
t          j        ||
||z
  z  z             }||z
  ||z
  z  }
| d         |
| d         | d         z
  z  z   }t                              d| d         | d         |           | d         | d         z
  | d         | d         z
  z  }
t          j        |	|
||	z
  z  z             }||z
  ||z
  z  }
| d         |
| d         | d         z
  z  z   }t                              d|| d         | d                    dS dS )z Sanitize the weight axis limits.   Tr   r^   r|   z%Original weight axis limits: %g:%g:%gz'Calculated weight axis limits: %g:%g:%gr}   z9Calculated weight axis default does not match user input.z&  Current weight axis limits: %g:%g:%gz:  Suggested weight axis limits, changing default: %g:%g:%gz:  Suggested weight axis limits, changing maximum: %g:%g:%gz:  Suggested weight axis limits, changing minimum: %g:%g:%gF)lensetr&   rO   rS   r   rj   r   )r   r   r   r   r   r   r   rP   
logDefaultrQ   rK   ycalculatedDefaultValr   r   s                  r,   r   r   	  s    3z??at 	\!_%\!_%\!_% JF XfF*%%JXfF	AA	&:a=:a=+HIA!v//00A	
V(A%a=1
1
10M+NNH4BzBBBBHH111	   *Q-/00:a=@4GGOPPP4	
	
 	
 	
 	

 	HqM qM		
 	
 	
 ]Z]*z!}z!}/LMHVa:#67788ZJ/0%a=1
1
10M+NNHqMqM		
 	
 	
 ]Z]*z!}z!}/LMHVa:#67788ZJ/0%a=1
1
10M+NNHqMqM		
 	
 	
 u4r.   c                 z   t          j        dg| R   t                               d||d                  ||d                  ||d                             t          ||d                  | d         z
            dk    sPt          ||d                  | d         z
            dk    s(t          ||d                  | d         z
            dk    rot                               d           t          j        dg| R   t                               d||d                  ||d                  ||d                             d	S d
S )zSanitize the slant axis limits.z$Original slant axis limits: %g:%g:%gz&Calculated slant axis limits: %g:%g:%gr   r^   r|   z>Calculated slant axis min/default/max do not match user input.z%  Current slant axis limits: %g:%g:%gz'  Suggested slant axis limits: %g:%g:%gFTr~   )r   r   r   r   s       r,   r   r   P  sM    H3AjAAAAHH0\!_%\!_%\!_%	   	La)JqM9::Q>>|LO,z!}<==AA|LO,z!}<==AATUUU3	
	
 	
 	
 	
 	5a)a)a)		
 	
 	
 u4r.   c           	      	  $% t          |t                    r|j        |j        |j        f}|\  }}}|t
          }| |i                                           }|
i }
n|
                                }
t          	                    d|||           |||f}|	t          j	        dg|	R   n|}	|
r:t          	                    dt          |
                                                     |
                    ||	d         ||	d         ||	d         i           i }i }i }t          |||ht          |
                                          z            D ]'} |||i          }|
|         } | ||          ||<   (|)t          	                    d	|            |||	|
|           t                              d
t          |                     t!          t#          t          |
                                                    dd         t#          t          |
                                                    dd                   D ]\  \  %}\  $}$%fd|D             }|st%          %|          }t%          $|          }t%          ||	          }t%          ||	          }t          	                    dt          |                     t          	                    d|%$           |                                }t'          d|dz             D ][}%$%z
  |z  |dz   z  z   }t                              d|            |||i          }t)          ||
          } | ||          ||<   \t                              dt          |                     i }t          |          D ]}||||         <   ||%<   |||<   t          |          D ]} ||%$          }  || ||         ||                   }!t)          |!|          }"t                              d||"fz             |"||<   ||%z
  $%z
  z  ||z
  z  z   }#||"|z
  ||z
  z  ||z
  z  z   ||#<   ||$<   |||<   t          	                    d|t          |                     t          	                    d|t          |                     t+          d |                                D                       rt          	                    d|           i }i }||fS )a@  Plan an axis.

    measureFunc: callable that takes a glyphset and an optional
    list of glyphnames, and returns the glyphset-wide measurement
    to be used for the axis.

    normalizeFunc: callable that takes a measurement and a minimum
    and maximum, and normalizes the measurement into the range 0..1,
    possibly extrapolating too.

    interpolateFunc: callable that takes a normalized t value, and a
    minimum and maximum, and returns the interpolated value,
    possibly extrapolating too.

    glyphSetFunc: callable that takes a variations "location" dictionary,
    and returns a glyphset.

    axisTag: the axis tag string.

    axisLimits: a triple of minimum, default, and maximum values for
    the axis. Or an `fvar` Axis object.

    values: a list of output values to map for this axis.

    samples: the number of samples to use when sampling. Default 8.

    glyphs: a list of glyph names to use when sampling. Defaults to None,
    which will process all glyphs.

    designLimits: an optional triple of minimum, default, and maximum values
    represenging the "design" limits for the axis. If not provided, the
    axisLimits will be used.

    pins: an optional dictionary of before/after mapping entries to pin in
    the output.

    sanitizeFunc: an optional callable to call to sanitize the axis limits.
    Nz(Axis limits min %g / default %g / max %gz/Axis design-limits min %g / default %g / max %gzPins %sr   r^   r|   )locationz/Sanitizing axis limit values for the `%s` axis.zCalculated average value:
%sc                 4    h | ]}|cxk     rk     n n|S rF   rF   )r*   wrI   rH   s     r,   	<setcomp>zplanAxis.<locals>.<setcomp>  s:    EEEaX-D-D-D-DH-D-D-D-D-D-D-D-Dr.   zPlanning target values %s.z"Sampling %u points in range %g,%g.zSampling value %g.zSampled average value:
%szPlanned mapping value %g to %g.z%Planned mapping for the `%s` axis:
%sz0Planned normalized mapping for the `%s` axis:
%sc              3   H   K   | ]\  }}t          ||z
            d k     V  dS )g{Gz?N)rj   )r*   kvs      r,   r-   zplanAxis.<locals>.<genexpr>  s5      
?
?A3q1u::
?
?
?
?
?
?r.   z6Detected identity mapping for the `%s` axis. Dropping.)re   fvarAxisminValuedefaultValuemaxValueSAMPLESkeyscopyrO   r   sorteditemsupdater   debugr   ziplistr	   ranger   all)&measureFuncnormalizeFuncinterpolateFuncglyphSetFuncaxisTag
axisLimitsvaluessamplesrk   designLimitsr   sanitizeFuncr   r   r   tripleoutoutNormalizedaxisMeasurementsrG   rd   designValue	targetMin	targetMaxtargetValuesnormalizedMinnormalizedMaxnormalizedTargetMinnormalizedTargetMaxvalueMeasurementssamplemeasurementValuerK   targetMeasurementtargetValuevalueNormalizedrI   rH   s&                                       @@r,   r   r   q  s   j *h'' Y ):+BJDWX
'1$HlH~b!!&&((|yy{{HH2HlH   h/FBR\RRRRR 2F4::<<00111KKl1o,q/l1o	
   CM<:S=M=MMNN F F<'5)9:::5k(3Hf(E(E%%BGLLLV\41ABBBII-w7G/H/HIII8;VDJJLL!!""3B3'VDJJLL!!""122&9 9 -; -;494) FEEEE6EEE 	&x88&x88,YEE,YEE-vl/C/CDDD5w(SSS,1133Aw{++ 	K 	KF8 3v=1MMEII*E222#|gu-=>>>H,UD99K-8[6-J-Jk**		.8I0J0JKKK-.. 	? 	?E9>.u566!H':m$L)) 	V 	VEeXx88A /$Y/1B91M! ! -->@PQQKII75+:NNOOO$CJ+ux/?8#/./0 0O .Ai'Y&D(+>AT+TDV .VM/** "H':m$$HH5wMMMHH;   
?
?)<)<)>)>
?
?
??? I7SSSr.   Fc                 z    |t           }t          t          t          t          | d|||||||rt
          nd          S )a  Plan a weight (`wght`) axis.

    weights: A list of weight values to plan for. If None, the default
    values are used.

    This function simply calls planAxis with values=weights, and the appropriate
    arguments. See documenation for planAxis for more information.
    Nwghtr   r   rk   r   r   r   )WEIGHTSr   r   r   r   r   )r   r   weightsr   rk   r   r   sanitizes           r,   r   r     sR    & !'/9^^T   r.   c                 z    |t           }t          t          t          t          | d|||||||rt
          nd          S )a  Plan a width (`wdth`) axis.

    widths: A list of width values (percentages) to plan for. If None, the default
    values are used.

    This function simply calls planAxis with values=widths, and the appropriate
    arguments. See documenation for planAxis for more information.
    Nwdthr   )WIDTHSr   r   r   r   r   )r   r   widthsr   rk   r   r   r   s           r,   r   r   :  sR    & ~!&.8]]D   r.   c                 z    |t           }t          t          t          t          | d|||||||rt
          nd          S )a  Plan a slant (`slnt`) axis.

    slants: A list slant angles to plan for. If None, the default
    values are used.

    This function simply calls planAxis with values=slants, and the appropriate
    arguments. See documenation for planAxis for more information.
    Nslntr   )SLANTSr   r   r   r   r   )r   r   slantsr   rk   r   r   r   s           r,   r   r   `  sR    & ~!&.8]]D   r.   c                 f    |t           }t          t          t          t          | d||||||          S )a  Plan a optical-size (`opsz`) axis.

    sizes: A list of optical size values to plan for. If None, the default
    values are used.

    This function simply calls planAxis with values=sizes, and the appropriate
    arguments. See documenation for planAxis for more information.
    Nopsz)r   r   rk   r   r   )SIZESr   r   r   r   )r   r   sizesr   rk   r   r   r   s           r,   r   r     sF    & }!   r.   c                     d| |f|z   z  }|r|dz  }n|dz  }|                                 D ]\  }}|d||fz  z  }|r|dz  }|S )z-Make a designspace snippet for a single axis.zC    <axis tag="%s" name="%s" minimum="%g" default="%g" maximum="%g"z>
z/>z$      <map input="%g" output="%g"/>
z    </axis>)r   )r   axisName	axisLimitmappingdesignspaceSnippetkeyrG   s          r,   r   r     s     	NX*	,   #e#d"mmoo U U
UEeTT ,m+r.   c                 j    t          d          x| d<   }t          j        D ]}i |j        |j        <   dS )z&Add an empty `avar` table to the font.avarN)r   fvaraxessegmentsr   )fontr   axiss      r,   r   r     sD    "6***DL4	 ) )&(dl##) )r.   c           
         d}| d         j         D ]}|j        |k    r|} n|dS |j        |j        |j        f}t
                              d|           d| v r$| d         j        |         }i | d         j        |<   nd}|3t          |t                    rd |
                                D             }|ut          |t                    r`d t          j        
                    d          D             }t          |          d	k    r!|d
         |d         cxk    r|d         k    sn J nd}|ht          |t                    rSi }|
                                D ]9}|
                    d          \  }}t          |          |t          |          <   :|}~ || j        |||||||	          \  }|
rVd
dlm} |                    t'                    fdt'                    D                        |                                 |)t
                              d|t+          |                     |r$d| vrt-          |            | d         j        |<   nd| v ri | d         j        |<   t/          ||||          }|S )zProcess a single axis.Nr    zPlanning %s axis.r   c                 ,    g | ]}t          |          S rF   float)r*   r   s     r,   
<listcomp>zprocessAxis.<locals>.<listcomp>  s    333q%((333r.   c                 ,    g | ]}t          |          S rF   r   r)   s     r,   r   zprocessAxis.<locals>.<listcomp>  s    JJJQaJJJr.   :r   r   r^   r|   )r   rk   r   r   r   )pyplotc                      g | ]
}|         S rF   rF   )r*   r   mappingNormalizeds     r,   r   zprocessAxis.<locals>.<listcomp>  s    EEEaq!EEEr.   zExisting %s mapping:
%s)r   r   r   r   r   rO   r   r   re   strsplitoptionsr   r   r   getGlyphSet
matplotlibr   plotr   showr   r   r   )r   planFuncr   r   r   r   rk   r   r   r   r   r   r   existingMappingnewPinspinbeforeafterr   r   r   r   s                        @r,   r   r     s    JV!  <7""JE # r%z'>
@STJHH (+++~~v,/8)+Vg&&j5533FLLNN333J|S$A$AJJ'*>*D*DS*I*IJJJ""Q<?EEEEl1oEEEEEEE JtS11::<< 	2 	2CIIcNNMFE%*5\\GE&MM""!)!	" 	" 	"G  %%%%%%$%%EEEE62C+D+DEEE	
 	
 	
 	"+Xw7O7OPPP 0):Vg&&T>>-/DL!'*/	  r.   c                 f
   | ddl }|j        dd         } ddlm} ddlm} ddl}|                    dd          }|                    d	d
d           |                    ddt          d           |                    dt          d           |                    dt          d           |                    dt          d           |                    dt          d           |                    dt          d           |                    dddd           |                    d d!t          d"           |                    d#t          d$           |                    d%t          d&           |                    d't          d(           |                    d)t          d*           |                    d+t          d,           |                    d-t          d.           |                    d/t          d0           |                    d1t          d2           |                    d3d4dd5           |                    d67          }|                    d8d9dd:           |                    d;d<dd=           |                    |           } ||j        rd>n
|j        rd?nd@A            ||j                  }dB|vrt                               dC           dS |j        u|j                                        }	dD|j        v rRi }	|j                                        D ]6}
dD|
v r+|
                    dD          \  }}t)          |          |	|<   1dE|	|
<   7nd}	g }|                    t-          |t.          dFdG|j        |j        |	|j        |j        |j        |j        H                     |                    t-          |t<          dIdJ|j        |j        |	|j         |j!        |j        |j        H                     |                    t-          |tD          dKdL|j#        |j        |	|j$        |j%        |j        |j        H                     |                    t-          |tL          dMdN|j'        |j        |	|j(        |j)        |j        |j        H                     t           *                    dO           |D ]}|rtW          |           |j,        t[          |j        dPdQR          }n|j,        }|r2t           *                    dS|           |.                    |           dS dS )Tz3Plan the standard axis mappings for a variable fontNr   r^   )configLogger)TTFontzfonttools varLib.avarPlannerz#Plan `avar` table for variable font)descriptionr   zvarfont.ttfzVariable-font file.)metavarhelpz-oz--output-filezOutput font file name.)typer  z	--weightsz+Space-separate list of weights to generate.z--widthsz*Space-separate list of widths to generate.z--slantsz*Space-separate list of slants to generate.z--sizesz1Space-separate list of optical-sizes to generate.z	--sampleszNumber of samples.z-sz
--sanitize
store_truezSanitize axis limits)actionr  z-gz--glyphsz2Space-separate list of glyphs to use for sampling.z--weight-design-limitsz4min:default:max in design units for the `wght` axis.z--width-design-limitsz4min:default:max in design units for the `wdth` axis.z--slant-design-limitsz4min:default:max in design units for the `slnt` axis.z--optical-size-design-limitsz4min:default:max in design units for the `opsz` axis.z--weight-pinsz=Space-separate list of before:after pins for the `wght` axis.z--width-pinsz=Space-separate list of before:after pins for the `wdth` axis.z--slant-pinsz=Space-separate list of before:after pins for the `slnt` axis.z--optical-size-pinsz=Space-separate list of before:after pins for the `opsz` axis.z-pz--plotzPlot the resulting mapping.F)requiredz-vz	--verbosezRun more verbosely.z-qz--quietzTurn verbosity off.DEBUGWARNINGINFO)levelr   zNot a variable font.r   g      ?r   Weight)r   r   rk   r   r   r   r   r   Widthr   Slantr   OpticalSizezDesignspace snippet:Tz.avar)	overWritesuffixz	Saving %s)/sysargv	fontToolsr   fontTools.ttLibr   argparseArgumentParseradd_argumentr   intadd_mutually_exclusive_group
parse_argsverbosequietr   rO   errorrk   r   r   appendr   r   r   r   weight_design_limitsweight_pinsr   r   r   r   width_design_limits
width_pinsr   r   slant_design_limits
slant_pinsr   r   optical_size_design_limitsoptical_size_pinsr   printoutput_filer
   save)argsr  r   r   r  parserlogging_groupr   r   rk   r`   rq   rp   designspaceSnippetssnippetoutfiles                   r,   r   r   #  s    |


x|&&&&&&&&&&&&OOO$$&9 %  F <QRRR
%	     #$Q     #O     #O     "U     #4HIII
l<6L     A	      C    
 C    
 C    
 &C    
 L    
 L    
 L    
 L    
 h|2O     777GGMk,5J     i3H     %%GL!/UwwGM/Uyyv    6',DT>>		()))q~!%%'''.  F^))++ $ $!88'(wws||$E9$))$4$4F5MM #F1II?O 5$%	
 	
 	
   >O 4#%	
 	
 	
   >O 4#%	
 	
 	
   =O ;*%	
 	
 	
    HH#$$$&   	'NNN"$W\T'RRR% g&&&		' r.   __main__)N)NNNNN)NNNNNF)NNNNFF)5r  r   fontTools.ttLib.tables._f_v_a_rr   r   fontTools.pens.areaPenr   fontTools.pens.basePenr   fontTools.pens.statisticsPenr   fontTools.varLib.modelsr   r	   fontTools.misc.cliToolsr
   r&   loggingpprintr   __all__	getLoggerrO   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __name__r  exitrF   r.   r,   <module>r=     sb   $ $ $ $ $ $ < < < < < < * * * * * * * * * * * * 6 6 6 6 6 6 F F F F F F F F 6 6 6 6 6 6          . g677  ,
 
 
$ 
HHsBHHH	H	H	 	 	4 6 6 6
  
: : :. . .H H H   8   89 9 9 9:& & &RD D DN  R 	` ` ` `L 	# # # #R 	# # # #R 	# # # #R 	" " " "J  *) ) ) 		Y Y Y YxC C C CL zJJJCHTTVV r.   