Ë
    £ehÞj  ã                   ó   — 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 e3jh                   e1«       «       yy),é    )Ú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              #   ór   K  — | ]/  }t        j                  t        j                  |d z  «      «      –— Œ1 y­w)g      4@N)ÚmathÚdegreesÚatan)Ú.0Úds     úZ/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/fontTools/varLib/avarPlanner.pyú	<genexpr>r,   M   s&   è ø€ ÒH°AŒd�l‰lœ4Ÿ9™9 Q¨¡XÓ.×/ÑHùs   ‚57iìÿÿÿé   )é   é   é   é   é	   é
   é   é   é   é   é   é   é$   é0   é<   éH   é`   éx   é�   éÀ   éð   i   r1   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Ð5ó    c                 ó   — || ||z
  z  z   S )zALinear interpolation between a and b, with t typically in [0, 1].rD   )ÚtÚaÚbs      r+   r   r   q   s   € àˆq�A˜‘E‰{‰?ÐrH   c                 ó’   — t        j                  |«      }t        j                  |«      }t        j                  | «      |z
  ||z
  z  S )zVLogarithmically normalize value in [rangeMin, rangeMax] to [0, 1], with extrapolation.)r&   Úlog)rE   rF   rG   ÚlogMinÚlogMaxs        r+   r   r   v   s:   € ä�X‰X�hÓ€FÜ�X‰X�hÓ€FÜ�H‰H�U‹O˜fÑ$¨°&©Ñ9Ð9rH   c                 ó’   — t        j                  |«      }t        j                  |«      }t        j                  || ||z
  z  z   «      S )zFLogarithmic interpolation between a and b, with t typically in [0, 1].)r&   rN   Úexp)rJ   rK   rL   ÚlogAÚlogBs        r+   r   r   }   s9   € ä�8‰8�A‹;€DÜ�8‰8�A‹;€DÜ�8‰8�D˜1  t¡Ñ,Ñ,Ó-Ð-rH   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)rE   rF   rG   ÚtanMinÚtanMaxs        r+   r   r   „   sV   € ä�X‰X”d—l‘l 8Ó,Ó-€FÜ�X‰X”d—l‘l 8Ó,Ó-€FÜ�H‰H”T—\‘\ %Ó(Ó)¨FÑ2°vÀ±ÑGÐGrH   c                 óL  — t        |t        «      r|}n|D �ci c]  }|d“Œ }}dx}}|D ]o  }|�|j                  |d«      }|dk(  rŒd}| |   }t        | ¬«      }	|j	                  |	«       |j
                  |z  }
||
t        |	j                  «      z  z  }||
z  }Œq ||z  S c c}w )z:Measure the perceptual average weight of the given glyphs.é   r   ©Úglyphset)Ú
isinstanceÚdictÚgetr   ÚdrawÚwidthÚabsrE   )r]   ÚglyphsÚfrequenciesÚgÚwght_sumÚwdth_sumÚ
glyph_nameÚ	frequencyÚglyphÚpenÚmults              r+   r   r   ‹   sÆ   € ä�&œ$ÔØ‰à%+Ö, �q˜!‘tÐ,ˆÐ,àÐ€HˆxØò ˆ
ØÐ"Ø#Ÿ™¨
°AÓ6ˆIØ˜AŠ~ØàˆIà˜Ñ$ˆä˜xÔ(ˆØ�
‰
�3Œà�{‰{˜YÑ&ˆØ�Dœ3˜sŸy™y›>Ñ)Ñ)ˆØ�DÑ‰ðð" �hÑÐùò) -s   ˜
B!c                 ó  — t        |t        «      r|}n|D �ci c]  }|d“Œ }}d}d}|D ]U  }|�|j                  |d«      }|dk(  rŒd}| |   }t        «       }	|j	                  |	«       ||j
                  |z  z  }||z  }ŒW ||z  S c c}w )z.Measure the average width of the given glyphs.r[   r   )r^   r_   r`   r   ra   rb   )
r]   rd   re   rf   rh   Úfreq_sumri   rj   rk   rl   s
             r+   r   r   §   s±   € ä�&œ$ÔØ‰à%+Ö, �q˜!‘tÐ,ˆÐ,à€HØ€HØò ˆ
ØÐ"Ø#Ÿ™¨
°AÓ6ˆIØ˜AŠ~ØàˆIà˜Ñ$ˆä‹iˆØ�
‰
�3Œà�E—K‘K )Ñ+Ñ+ˆØ�IÑ‰ðð  �hÑÐùò) -s   ˜
Bc                 óˆ  — t        |t        «      r|}n|D �ci c]  }|d“Œ }}d}d}|D ]f  }|�|j                  |d«      }|dk(  rŒd}| |   }t        | ¬«      }	|j	                  |	«       |j
                  |z  }
||
|	j                  z  z  }||
z  }Œh t        j                  t        j                  ||z  «      «       S c c}w )z?Measure the perceptual average slant angle of the given glyphs.r[   r   r\   )
r^   r_   r`   r   ra   rb   Úslantr&   r'   r(   )r]   rd   re   rf   Úslnt_sumro   ri   rj   rk   rl   rm   s              r+   r   r   Ã   s×   € ä�&œ$ÔØ‰à%+Ö, �q˜!‘tÐ,ˆÐ,à€HØ€HØò ˆ
ØÐ"Ø#Ÿ™¨
°AÓ6ˆIØ˜AŠ~ØàˆIà˜Ñ$ˆä XÔ.ˆØ�
‰
�3Œà�{‰{˜YÑ&ˆØ�D˜3Ÿ9™9Ñ$Ñ$ˆØ�DÑ‰ðô" �L‰LœŸ™ 8¨hÑ#6Ó7Ó8Ð8Ð8ùò+ -s   ˜
B?c                 ó¸  — ||d      ||d      ||d      }}}| d   ||z  z  }| d   ||z  z  }t        j                  dg| ¢­Ž  t         j                  d|| d   |«       t        || d   z
  «      | d   z  dkD  st        || d   z
  «      | d   z  dkD  rGt         j                  d«       t        j                  dg| ¢­Ž  t         j                  d	|| d   |«       y
y)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©rN   Úinforc   Úwarning)	Ú
userTripleÚdesignTripleÚpinsÚmeasurementsÚminValÚ
defaultValÚmaxValÚcalculatedMinValÚcalculatedMaxVals	            r+   r   r   à   s  € ð 	�\ !‘_Ñ%Ø�\ !‘_Ñ%Ø�\ !‘_Ñ%ð ˆJ€Fð " !‘}¨°Ñ(;Ñ<ÐØ! !‘}¨°Ñ(;Ñ<Ðä‡H�HÐ3ÐA°jÓAÜ‡H�HØ0ØØ�1‰Øô	ô 	Ð˜z¨!™}Ñ,Ó-°
¸1±Ñ=ÀÒDÜÐ *¨Q¡-Ñ/Ó0°:¸a±=Ñ@À4ÒGä�‰ÐLÔMÜ�‰Ø3ð	
àó	
ô 	�‰Ø5ØØ�q‰MØô		
ð àrH   c                 ó„  — t        t        | «      «      dk  ry||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| ¢­Ž  t        j                  d| d   || d   «       t        || d   z
  «      | d   z  dkD  �r.t        j                  d	«       t        j                  d
g| ¢­Ž  t        j                  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        j                  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        j                  d|| d   | d   «       yy)z Sanitize the weight axis limits.é   Tr   r[   rt   z%Original weight axis limits: %g:%g:%gz'Calculated weight axis limits: %g:%g:%gru   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&   rN   rR   rw   rc   rx   )ry   rz   r{   r|   r}   r~   r   rO   Ú
logDefaultrP   rJ   ÚyÚcalculatedDefaultValr�   r€   s                  r+   r   r   	  s¶  € ô Œ3ˆz‹?Ó˜aÒØð 	�\ !‘_Ñ%Ø�\ !‘_Ñ%Ø�\ !‘_Ñ%ð ˆJ€Fô �X‰X�fÓ€FÜ—‘˜*Ó%€JÜ�X‰X�fÓ€Fà	�A‰˜ A™Ñ	&¨:°a©=¸:Àa¹=Ñ+HÑI€AÜ�‰�˜!˜v¨™Ñ/Ñ/Ó0€AØ	
ˆV‰˜ ™Ñ(€AØ% a™=¨1°
¸1±À
È1ÁÑ0MÑ+NÑNÐä‡H�HÐ4ÐB°zÓBÜ‡H�HØ1Ø�1‰ØØ�1‰ô	ô Ð *¨Q¡-Ñ/Ó0°:¸a±=Ñ@À4ÓGÜ�‰ÐOÔPä�‰Ø4ð	
àó	
ô
 	�‰ØHØ�q‰MØ Ø�q‰Mô		
ð ˜‰]˜Z¨™]Ñ*¨z¸!©}¸zÈ!¹}Ñ/LÑMˆÜ�H‰H�V˜a :°Ñ#6Ñ7Ñ7Ó8ˆØ�‰Z˜J¨Ñ/Ñ0ˆØ% a™=¨1°
¸1±À
È1ÁÑ0MÑ+NÑNÐÜ�‰ØHØ�q‰MØ�q‰MØô		
ð ˜‰]˜Z¨™]Ñ*¨z¸!©}¸zÈ!¹}Ñ/LÑMˆÜ�H‰H�V˜a :°Ñ#6Ñ7Ñ7Ó8ˆØ�‰Z˜J¨Ñ/Ñ0ˆØ% a™=¨1°
¸1±À
È1ÁÑ0MÑ+NÑNÐÜ�‰ØHØØ�q‰MØ�q‰Mô		
ð àrH   c                 óÌ  — t        j                  dg| ¢­Ž  t         j                  d||d      ||d      ||d      «       t        ||d      | d   z
  «      dkD  s4t        ||d      | d   z
  «      dkD  st        ||d      | d   z
  «      dkD  rVt         j                  d«       t        j                  dg| ¢­Ž  t         j                  d||d      ||d      ||d      «       y	y
)zSanitize the slant axis limits.z$Original slant axis limits: %g:%g:%gz&Calculated slant axis limits: %g:%g:%gr   r[   rt   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:%gFTrv   )ry   rz   r{   r|   s       r+   r   r   P  s	  € ô ‡H�HÐ3ÐA°jÓAÜ‡H�HØ0Ø�\ !‘_Ñ%Ø�\ !‘_Ñ%Ø�\ !‘_Ñ%ô	ô 	ˆL˜ a™Ñ)¨J°q©MÑ9Ó:¸QÒ>Üˆ|˜L¨™OÑ,¨z¸!©}Ñ<Ó=ÀÒAÜˆ|˜L¨™OÑ,¨z¸!©}Ñ<Ó=ÀÒAä�‰ÐTÔUÜ�‰Ø3ð	
àó	
ô 	�‰Ø5Ø˜ a™Ñ)Ø˜ a™Ñ)Ø˜ a™Ñ)ô		
ð àrH   c           	      ó^  — t        |t        «      r#|j                  |j                  |j                  f}|\  }}}|€t
        }|€ |i «      j                  «       }|
€i }
n|
j                  «       }
t        j                  d|||«       |||f}|	�t        j                  dg|	¢­Ž  n|}	|
r-t        j                  dt        |
j                  «       «      «       |
j                  ||	d   ||	d   ||	d   i«       i }i }i }t        |||ht        |
j                  «       «      z  «      D ]  } |||i¬«      }|
|   } | ||«      ||<   Œ  |�!t        j                  d	|«        |||	|
|«       t        j                  d
t        |«      «       t!        t#        t        |
j                  «       «      «      dd t#        t        |
j                  «       «      «      dd «      D �]Ï  \  \  }}\  }}|D �ch c]  }||cxk  r|k  sŒn n|’Œ }}|sŒ.t%        ||«      }t%        ||«      }t%        ||	«      }t%        ||	«      }t        j                  dt        |«      «       t        j                  d|||«       |j                  «       } t'        d|dz   «      D ]L  }!|||z
  |!z  |dz   z  z   }t        j                  d|«        |||i¬«      }t)        ||
«      } | ||«      | |<   ŒN t        j                  dt        | «      «       i }"t        | «      D ]
  }||"| |   <   Œ |||<   |||<   t        |«      D ]r  } ||||«      }# ||#| |   | |   «      }$t)        |$|"«      }%t        j                  d||%fz  «       |%||<   |||z
  ||z
  z  ||z
  z  z   }&||%|z
  ||z
  z  ||z
  z  z   ||&<   Œt |||<   |||<   �ŒÒ t        j                  d|t        |«      «       t        j                  d|t        |«      «       t+        d„ |j                  «       D «       «      rt        j                  d|«       i }i }||fS c c}w )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[   rt   )Úlocationz/Sanitizing axis limit values for the `%s` axis.zCalculated average value:
%séÿÿÿÿ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   óD   K  — | ]  \  }}t        ||z
  «      d k  –— Œ y­w)g{®Gáz„?N)rc   )r)   ÚkÚvs      r+   r,   zplanAxis.<locals>.<genexpr>  s!   è ø€ Ò
?¡  AŒ3ˆq�1‰u‹:˜ÕÑ
?ùs   ‚ z6Detected identity mapping for the `%s` axis. Dropping.)r^   ÚfvarAxisÚminValueÚdefaultValueÚmaxValueÚSAMPLESÚkeysÚcopyrN   rw   ÚsortedÚitemsÚupdater…   Údebugr   ÚzipÚlistr	   Úranger   Úall)'ÚmeasureFuncÚnormalizeFuncÚinterpolateFuncÚglyphSetFuncÚaxisTagÚ
axisLimitsÚvaluesÚsamplesrd   ÚdesignLimitsr{   ÚsanitizeFuncr‘   r’   r“   ÚtripleÚoutÚoutNormalizedÚaxisMeasurementsrE   r]   ÚdesignValuerF   Ú	targetMinrG   Ú	targetMaxÚwÚtargetValuesÚnormalizedMinÚnormalizedMaxÚnormalizedTargetMinÚnormalizedTargetMaxÚvalueMeasurementsÚsampleÚmeasurementValuerJ   ÚtargetMeasurementÚtargetValueÚvalueNormalizeds'                                          r+   r   r   q  s±  € ôj �*œhÔ'Ø ×)Ñ)¨:×+BÑ+BÀJ×DWÑDWÐXˆ
Ø'1Ñ$€Hˆl˜Hà€ÜˆØ€~Ù˜bÓ!×&Ñ&Ó(ˆØ€|Ø‰à�y‰y‹{ˆä‡H�HØ2°H¸lÈHôð ˜ hÐ/€FàÐÜ�‰ÐBÐRÀ\ÔRàˆáÜ�‰�œF 4§:¡:£<Ó0Ô1Ø‡K�Kà�l 1‘oØ˜, q™/Ø�l 1‘oð	
ôð €CØ€MàÐÜ˜ <°Ð:¼SÀÇÁÃÓ=MÑMÓNò FˆÙ¨'°5Ð)9Ô:ˆØ˜5‘kˆÙ(3°H¸fÓ(EÐ˜Ò%ðFð
 ÐÜ�‰ÐBÀGÔLÙ�V˜\¨4Ð1AÔBä‡I�IÐ-¬wÐ7GÓ/HÔIä8;ÜŒV�D—J‘J“LÓ!Ó" 3 BÐ'ÜŒV�D—J‘J“LÓ!Ó" 1 2Ð&ó9ó -;Ñ4Ñˆ�9Ñ4 ¨)ð $*ÖE˜a¨X¸Ô-D¸HÖ-DšÐEˆÐEÙØä& x°Ó8ˆÜ& x°Ó8ˆÜ,¨Y¸ÓEÐÜ,¨Y¸ÓEÐä�‰Ð-¬v°lÓ/CÔDÜ�‰Ð5°wÀÈ(ÔSØ,×1Ñ1Ó3ÐÜ˜A˜w¨™{Ó+ò 	KˆFØ ¨8Ñ 3°vÑ=ÀÈ1ÁÑMÑMˆEÜ�I‰IÐ*¨EÔ2Ù#¨g°uÐ-=Ô>ˆHÜ,¨U°DÓ9ˆKÙ-8¸À6Ó-JÐ˜kÒ*ð	Kô 	�	‰	Ð.´Ð8IÓ0JÔKàÐÜÐ-Ó.ò 	?ˆEØ9>ÐÐ.¨uÑ5Ò6ð	?ð "ˆˆH‰Ø':ˆ�mÑ$Ü˜LÓ)ò 	VˆEÙ˜e X¨xÓ8ˆAÙ /ØÐ$ YÑ/Ð1BÀ9Ñ1Mó!Ðô -Ð->Ð@PÓQˆKÜ�I‰IÐ7¸5À+Ð:NÑNÔOØ$ˆC�‰JØ+¨u°xÑ/?Ø˜8Ñ#ñ/à Ñ.ñ/0ñ 0ˆOð .AØ˜iÑ'Ø˜YÑ&ñD(à+>ÐATÑ+TñDVñ .VˆM˜/Ò*ð	Vð "ˆˆH‰Ø':ˆ�mÓ$ð[-;ô^ ‡H�HÐ5°wÄÈÃÔMÜ‡H�HØ;ØÜ�Óôô Ñ
?¨×)<Ñ)<Ó)>Ô
?Ô?Ü�‰ÐIÈ7ÔSØˆØˆà�ÐÐùòo Fs   Ç*P*Ç;P*c                 ór   — |€t         }t        t        t        t        | d|||||||rt
        ¬«      S 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¦   rd   r§   r{   r¨   )ÚWEIGHTSr   r   r   r   r   )r¢   r¤   Úweightsr¦   rd   r§   r{   Úsanitizes           r+   r   r     sP   € ð& €ÜˆäÜÜÜØØØØØØØ!ØÙ'/”^ôð ð 6:ôð rH   c                 ór   — |€t         }t        t        t        t        | d|||||||rt
        ¬«      S 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¦   rd   r§   r{   rÁ   s           r+   r   r   :  sP   € ð& €~ÜˆäÜÜÜØØØØØØØ!ØÙ&.”]ôð ð 59ôð rH   c                 ór   — |€t         }t        t        t        t        | d|||||||rt
        ¬«      S 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¦   rd   r§   r{   rÁ   s           r+   r   r   `  sP   € ð& €~ÜˆäÜÜÜØØØØØØØ!ØÙ&.”]ôð ð 59ôð rH   c                 óV   — |€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.
    Úopsz)r¥   r¦   rd   r§   r{   )ÚSIZESr   r   r   r   )r¢   r¤   Úsizesr¦   rd   r§   r{   rÁ   s           r+   r   r   †  s<   € ð& €}ÜˆäÜÜÜØØØØØØØ!Øôð rH   c                 ó†   — d| |f|z   z  }|r|dz  }n|dz  }|j                  «       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ÚkeyrE   s          r+   r   r   «  s€   € ð 	NØ�XÐ Ñ*ñ	,ð ñ Ø˜eÑ#Ñà˜dÑ"Ðà—m‘m“oò U‰
ˆˆUØÐEÈÈeÈÑTÑTÑðUñ Ø˜mÑ+ÐàÐrH   c                 ó€   — t        d«      x| d<   }t        j                  D ]  }i |j                  |j                  <   Œ y)z&Add an empty `avar` table to the font.ÚavarN)r   ÚfvarÚaxesÚsegmentsr£   )ÚfontrÕ   Úaxiss      r+   r   r   À  s:   € ä" 6Ó*Ð*€Dˆ�L�4Ü—	‘	ò )ˆØ&(ˆ�‰�d—l‘lÒ#ñ)rH   c           
      óê  — d}| d   j                   D ]  }|j                  |k(  sŒ|} n |€y|j                  |j                  |j                  f}t
        j                  d|«       d| v r%| d   j                  |   }i | d   j                  |<   nd}|�6t        |t        «      r&|j                  «       D �cg c]  }t        |«      ‘Œ }}|�lt        |t        «      r\t        j                  j                  d«      D �cg c]  }t        |«      ‘Œ }}t        |«      dk(  r|d   |d	   cxk  r	|d
   k  sJ ‚ J ‚d}|�Ut        |t        «      rEi }|j                  «       D ]-  }|j                  d«      \  }}t        |«      |t        |«      <   Œ/ |}~ || j                  |||||||	¬«      \  }}|
rKddlm} |j%                  t'        |«      t'        |«      D �cg c]  }||   ‘Œ	 c}«       |j)                  «        |� t
        j                  d|t+        |«      «       |r"d| vrt-        | «       || d   j                  |<   nd| v ri | d   j                  |<   t/        ||||«      }|S c c}w c c}w c c}w )zProcess a single axis.NrÖ   Ú zPlanning %s axis.rÕ   ú:rƒ   r   r[   rt   )r¦   rd   r§   r{   rÁ   )ÚpyplotzExisting %s mapping:
%s)r×   r£   r‘   r’   r“   rN   rw   rØ   r^   ÚstrÚsplitÚfloatÚoptionsr§   r„   ÚgetGlyphSetÚ
matplotlibrÞ   Úplotr—   Úshowr   r   r   )rÙ   ÚplanFuncr£   rÏ   r¥   r¦   rd   r§   r{   rÁ   rå   r¤   rÚ   ÚexistingMappingr°   r*   ÚnewPinsÚpinÚbeforeÚafterrÑ   ÚmappingNormalizedrÞ   rŽ   rÒ   s                            r+   r   r   Ç  s¡  € ð €JØ�V‘×!Ñ!ò ˆØ�<‰<˜7Ó"ØˆJÙðð ÐØØ×%Ñ% z×'>Ñ'>À
×@SÑ@SÐT€Jä‡H�HÐ  (Ô+à��~Ø˜v™,×/Ñ/°Ñ8ˆØ)+ˆˆV‰×Ñ˜gÒ&àˆàÐœj¨´Ô5Ø$*§L¡L£NÖ3˜q”%˜•(Ð3ˆÐ3àÐ¤J¨|¼SÔ$AÜ*1×*>Ñ*>×*DÑ*DÀSÓ*IÖJ Qœ˜a�ÐJˆÐJä�Ó Ò"Ø˜Q‘ <°¡?ÔE°lÀ1±oÒEð	
ðFØEð	
ðFð ˆàÐœJ t¬SÔ1ØˆØ—:‘:“<ò 	2ˆCØŸI™I c›N‰MˆF�EÜ%*¨5£\ˆG”E˜&“MÒ"ð	2ð ˆØá!)Ø×ÑØØØØØ!ØØô	"Ñ€GÐñ Ý%à�‰ÜÐ$Ó%Ü+1Ð2CÓ+DÖE aÐ˜qÓ!ÒEô	
ð 	�‰ŒàÐ"Ü�‰Ð+¨X´w¸Ó7OÔPáØ˜ÑÜ˜ÔØ):ˆˆV‰×Ñ˜gÒ&à�T‰>Ø-/ˆD�‰L×!Ñ! 'Ñ*ä/ØØØØó	Ðð Ðùòq 4ùò Kùò@ Fs   Â5I&Ã<I+ÇI0
c                 ó>
  — | €ddl }|j                  dd } ddlm} ddlm} ddl}|j                  dd¬«      }|j                  d	d
d¬«       |j                  ddt        d¬«       |j                  dt        d¬«       |j                  dt        d¬«       |j                  dt        d¬«       |j                  dt        d¬«       |j                  dt        d¬«       |j                  dddd¬«       |j                  d d!t        d"¬«       |j                  d#t        d$¬«       |j                  d%t        d&¬«       |j                  d't        d(¬«       |j                  d)t        d*¬«       |j                  d+t        d,¬«       |j                  d-t        d.¬«       |j                  d/t        d0¬«       |j                  d1t        d2¬«       |j                  d3d4dd5¬«       |j                  d6¬7«      }|j                  d8d9dd:¬«       |j                  d;d<dd=¬«       |j                  | «      } ||j                  rd>n|j                  rd?nd@¬A«        ||j                  «      }dB|vrt         j#                  dC«       y|j$                  �v|j$                  j'                  «       }	dD|j$                  v rPi }	|j$                  j'                  «       D ].  }
dD|
v r#|
j'                  dD«      \  }}t)        |«      |	|<   Œ*dE|	|
<   Œ0 nd}	g }|j+                  t-        |t.        dFdG|j0                  |j2                  |	|j4                  |j6                  |j8                  |j:                  ¬H«      «       |j+                  t-        |t<        dIdJ|j>                  |j2                  |	|j@                  |jB                  |j8                  |j:                  ¬H«      «       |j+                  t-        |tD        dKdL|jF                  |j2                  |	|jH                  |jJ                  |j8                  |j:                  ¬H«      «       |j+                  t-        |tL        dMdN|jN                  |j2                  |	|jP                  |jR                  |j8                  |j:                  ¬H«      «       t         jU                  dO«       |D ]  }|sŒtW        |«       Œ |jX                  €t[        |j                  dPdQ¬R«      }n|jX                  }|r(t         jU                  dS|«       |j]                  |«       yy)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¦   rd   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Ù   rN   Úerrorrd   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_pinsrw   ÚprintÚoutput_filer
   Úsave)Úargsr  rï   rð   r  ÚparserÚlogging_grouprâ   rÙ   rd   rf   rk   rj   ÚdesignspaceSnippetsÚsnippetÚoutfiles                   r+   r   r   #  sI  € ð €|Ûà�x‰x˜˜ˆ|ˆå&Ý&Ûà×$Ñ$Ø&Ø9ð %ó €Fð ×Ñ˜¨Ð<QÐÔRØ
×ÑØØÜØ%ð	 ô ð ×ÑØœ#Ð$Qð ô ð ×ÑØœÐ#Oð ô ð ×ÑØœÐ#Oð ô ð ×ÑØœÐ"Uð ô ð ×Ñ˜¬#Ð4HÐÔIØ
×ÑØˆl <Ð6Lð ô ð ×ÑØØÜØAð	 ô ð ×ÑØ ÜØCð ô ð
 ×ÑØÜØCð ô ð
 ×ÑØÜØCð ô ð
 ×ÑØ&ÜØCð ô ð
 ×ÑØÜØLð ô ð
 ×ÑØÜØLð ô ð
 ×ÑØÜØLð ô ð
 ×ÑØÜØLð ô ð
 ×ÑØˆh˜|Ð2Oð ô ð ×7Ñ7ÀÐ7ÓG€MØ×ÑØˆk ,Ð5Jð ô ð ×ÑØˆi Ð3Hð ô ð ×Ñ Ó%€GáØ!Ÿ/š/‰w¸G¿MºM©yÈvõñ �'—,‘,Ó€DØ�T‰>Ü�	‰	Ð(Ô)Øà‡~�~Ð!Ø—‘×%Ñ%Ó'ˆØ�'—.‘.Ñ ØˆFØ—^‘^×)Ñ)Ó+ò $�Ø˜!‘8Ø'(§w¡w¨s£|Ñ$�E˜9Ü$)¨)Ó$4�F˜5’Mà #�F˜1’Iñ$ð ˆàÐà×ÑÜØÜØØØ—?‘?Ø—O‘OØØ ×5Ñ5Ø×$Ñ$Ø×%Ñ%Ø—‘ô	
ôð ×ÑÜØÜØØØ—>‘>Ø—O‘OØØ ×4Ñ4Ø×#Ñ#Ø×%Ñ%Ø—‘ô	
ôð ×ÑÜØÜØØØ—>‘>Ø—O‘OØØ ×4Ñ4Ø×#Ñ#Ø×%Ñ%Ø—‘ô	
ôð ×ÑÜØÜØØØ—=‘=Ø—O‘OØØ ×;Ñ;Ø×*Ñ*Ø×%Ñ%Ø—‘ô	
ôô  ‡H�HÐ#Ô$Ø&ò ˆÚÜ�'�Nðð ×ÑÐ"Ü$ W§\¡\¸TÈ'ÔR‰à×%Ñ%ˆÙÜ�‰�˜gÔ&Ø�	‰	�'Õð rH   Ú__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__Ú	getLoggerrN   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  ÚexitrD   rH   r+   ú<module>r.     s}  ðÝ $Ý <Ý *Ý *Ý 6ß FÝ 6Û Û Ý ò€ð. €g×ÑÐ6Ó7€ò€ò,
€ñ$ 
ÑH¹¸sÀB»ÔHÓ	H€ò	€ð4 €ò6ò
ò
:ò.òHóó8ó89ò:&òRDòNðR ØØØ	Øó`ðL ØØØØ	Øó#ðR ØØØØ	Øó#ðR ØØØØ	Øó#ðR ØØØØ	Øó"òJò*)ð ØØØ	ØØ	óYóxCðL ˆzÒÛà€C‡H�H‰T‹VÕð rH   