+
    K<iE                     P   ^ RI t ^ RIt^ RIHtHt ^ RIHt ^ RIHtH	t	 ^ RI
Ht ^ RIHt ^ RIHtHtHtHtHtHt ^ RIHt ^ R	IHtHt ^ R
IHt ^ RIHtHt ] P>                  ! ] 4      t!]]  R2,          t"Rt#]$! ]"PJ                  4      t&R R lt'R R lt(R R lt)R R lt*R R lt+R R lt,R R lt-]]]]$R3,          ]]$R3,          3,          ]]P\                  ]P\                  3,          3,          t/R R lt0R&R R  llt1]! R!. R'O4      t2] ! R" R#4      4       t3R(R$ R% llt4R# ))    N)defaultdict
namedtuple)	dataclass)cached_propertyreduce)chain)log2)DefaultDictDictIterableListSequenceTuple)OPTIONS)	bit_countbit_indices)TTFont)otBaseotTablesz:COMPRESSION_LEVELFONTTOOLS_GPOS_COMPACT_MODEc                $    V ^8  d   QhR\         /# )   return)int)formats   "@/usr/lib/python3/dist-packages/fontTools/otlLib/optimize/gpos.py__annotate__r      s     E ES E    c                  (   \         p \        \        P                  9   d>   ^ RIpVP                  R\         R2\        4       \        P                  \        ,          p \        V 4      ^8X  d   V R9   d   \        V 4      # \        R\         RV  24      h)r   N'z}' environment variable is deprecated. Please set the 'fontTools.otlLib.optimize.gpos:COMPRESSION_LEVEL' option in TTFont.cfg.
0123456789zBad =)
GPOS_COMPACT_MODE_DEFAULTGPOS_COMPACT_MODE_ENV_KEYosenvironwarningswarnDeprecationWarninglenr   
ValueError)	env_levelr'   s     r   _compression_level_from_envr-      s    )I BJJ.)* +  		
 JJ89	
9~yL89~
t56a	{C
DDr   c                <    V ^8  d   QhR\         R\        R\         /# )r   fontlevelr   )r   r   )r   s   "r   r   r   +   s!      &   r   c                 F   V P                  R 4      pVf   V # VP                  P                  P                   Fe  pVP                  ^8X  d   \        WV4       K"  VP                  ^	8X  g   K5  VP                  ^ ,          P                  ^8X  g   KY  \        WV4       Kg  	  V # )GPOS)	gettable
LookupListLookup
LookupTypecompact_lookupSubTableExtensionLookupTypecompact_ext_lookup)r/   r0   gposlookups   &&  r   compactr>   +   s     88FD |**''..!4/!#(:(N(NRS(StF3	 / Kr   c                T    V ^8  d   QhR\         R\        R\        P                  RR/# r   r/   r0   r=   r   Nr   r   r   r6   )r   s   "r   r   r   H   s,     . . . .X__ . .r   c                 ^    \        WVP                  4      pW2n        \        V4      Vn        R # N)compact_pair_posr9   r*   SubTableCount)r/   r0   r=   new_subtabless   &&& r   r8   r8   H   s$    $T&//BM#O}-Fr   c                T    V ^8  d   QhR\         R\        R\        P                  RR/# r@   rA   )r   s   "r   r   r   N   s,     2 2V 2C 2 2T 2r   c                    \        YVP                   Uu. uF  q3P                  NK  	  up4      p. pV F6  p\        P                  ! 4       p^Vn        Wcn        VP                  V4       K8  	  WRn        \        V4      Vn        R# u upi    N)	rD   r9   ExtSubTabler   ExtensionPosFormatappendr*   rE   )r/   r0   r=   ext_subtablerF   new_ext_subtablessubtables   &&&    r   r;   r;   N   s    $6??S?<..?SM !,,.#+   .	 "
 (O01F Ts   Bc          	          V ^8  d   QhR\         R\        R\        \        P                  ,          R\        \        P                  ,          /# )r   r/   r0   	subtablesr   )r   r   r   r   PairPos)r   s   "r   r   r   \   sB     
 



)1(2B2B)C
h
r   c                     . pV FU  pVP                   ^8X  d   VP                  V4       K'  VP                   ^8X  g   K:  VP                  \        WV4      4       KW  	  V# rJ   )rM   rN   extendcompact_class_pairs)r/   r0   rS   rF   rQ   s   &&&  r   rD   rD   \   sW     M??a  *__!  !4T(!KL  r   c          	          V ^8  d   QhR\         R\        R\        P                  R\        \        P                  ,          /# )r   r/   r0   rQ   r   )r   r   r   rT   r   )r   s   "r   r   r   i   s=      
(0(8(8	(

r   c                 >   ^ RI Hp . p\        \        4      pVP                  P
                   F>  pWRP                  P                  P                  V^ 4      ,          P                  V4       K@  	  \        \        4      pVP                  P                  P                  4        F  w  rhWx,          P                  V4       K  	  / p	\        VP                  4       F  w  r\        V
P                  4       Fg  w  r\        V4      '       d   K  \!        VRR4      \!        VRR4      3V	\#        \%        WX,          4      4      \#        \%        W{,          4      4      3&   Ki  	  K  	  \'        W	V4      pV F(  pVP                  V! WP)                  4       4      4       K*  	  V# )r   )buildPairPosClassesSubtableValue1NValue2)fontTools.otlLib.builderr[   r   listCoverageglyphs	ClassDef1	classDefsr3   rN   	ClassDef2items	enumerateClass1RecordClass2Recordis_really_zerogetattrtuplesorted,cluster_pairs_by_class2_coverage_custom_costgetReverseGlyphMap)r/   r0   rQ   r[   rS   classes1gclasses2i	all_pairsclass1jclass2grouped_pairspairss   &&&            r   rX   rX   i   sR    EI,7,=H%%##--11!Q78??B &,7,=H"",,2241 5Ix445	"6#6#67IAf%%$/$/SIuVHK0159L3MNO 8 6 ARWXM4U<S<S<UVW r   c                D    V ^8  d   QhR\         P                  R\        /# )r   rv   r   )r   rh   bool)r   s   "r   r   r      s       800 T r   c                     \        V R R4      p\        V RR4      pVRJ ;'       g    VP                  4       ^ 8H  ;'       d     VRJ ;'       g    VP                  4       ^ 8H  # )r\   Nr]   )rj   getEffectiveFormat)rv   v1v2s   &  r   ri   ri      sg    	4	(B	4	(B$J66"//1Q6  
d
22b++-2r   .c                :    V ^8  d   QhR\         \        ,          /# )r   glyphIDs)r   r   )r   s   "r   r   r      s     
- 
-hsm 
-r   c                    \        V 4      p V ^ ,          pV..pV R,           F<  pW1^,           8w  d+   VR,          P                  V4       VP                  V.4       TpK>  	  VR,          P                  V4       W ^ ,          V R,          3# )r   rJ   NN)rl   rN   )r   lastrangesglyphIDs   &   r   _getClassRangesr      s    hHA;DfXFB<<Qh2Jd#MM7)$	  
 2JdA;,,r   c                    V ^8  d   QhR\         \        \         \        \        \        3,          ,          \        \        3,          ,          R\         \        ,          /# )r   
class_data	class_ids)r   r   r   )r   s   "r   r   r      s>     - -U4c3h0#s:;<-Cy-r   c                 n   V'       g   ^ # W^ ,          ,          w  r4p\        V4      pVR,           FH  pW,          pV\        V^ ,          4      ,          p\        WH^,          4      p\        WX^,          4      pKJ  	  WT,
          ^,           p	^V	^,          ,           p
^V^,          ,           p\        W4      # )r   r   )r*   minmax)r   r   coveragefirst_rangesmin_glyph_idmax_glyph_idrange_countrr   data
glyphCountformat1_bytesformat2_bytess   &&&         r   _classDef_bytesr      s    
 /9A,/G,Ll#Kr]]}s47|#<a1<a1	 
 ,q0J
Q&Ma'M},,r   ClusteringContextc                      a  ] tR t^t o ]R 4       t]R 4       t]R 4       t]R 4       t	]R 4       t
]R 4       t]R 4       tV 3R ltR	tV tR
# )Clusterc                ,    \        V P                  4      # rC   )r   indices_bitmaskselfs   &r   indicesCluster.indices   s    4//00r   c                v   a  \        \        P                  V 3R  lS P                   4       4      p\	        V4      # )c              3   ^   <"   T F"  pSP                   P                  V,          x  K$  	  R # 5irC   )ctxlines.0rr   r   s   & r   	<genexpr>)Cluster.column_indices.<locals>.<genexpr>   s!     %NAdhhnnQ&7&7s   *-)r   r   __or__r   r   )r   bitmasks   f r   column_indicesCluster.column_indices   s*     %N%NO7##r   c                :    \        V P                  4      ^,           # rV   )r*   r   r   s   &r   widthCluster.width   s     4&&'!++r   c                   ^V P                   ,           ^,           ^,           ^,           V P                  ,           ^,           V P                  ,           ^,           ^,           V P                  P                  V P                  P
                  ,           \        V P                  4      ,          V P                  ,          ,           # )r   )	coverage_bytesclassDef1_bytesclassDef2_bytesr   valueFormat1_bytesvalueFormat2_bytesr*   r   r   r   s   &r   costCluster.cost   s     !!" 	   ""#  !" ""##& '* +. xx**TXX-H-HH$,, jj/	
r   c                P  a  ^\        V 3R lS P                   4       4      ^,          ,           p\        \        P                  ! V 3R lS P                   4       4      4      p^ pRpV F!  w  rVVe   WT^,           8w  d
   V^,          pTpK#  	  ^V^,          ,           p\        W4      # )   c              3   p   <"   T F+  p\        SP                  P                  V,          4      x  K-  	  R # 5irC   r*   r   
all_class1r   s   & r   r   )Cluster.coverage_bytes.<locals>.<genexpr>  s(     D|!#dhh))!,--|s   36c              3   l   <"   T F)  pSP                   P                  V,          ^ ,          x  K+  	  R# 5ir   N)r   all_class1_datar   s   & r   r   r     s(     U1 8 8 ;A > >s   14N)sumr   rl   r   from_iterabler   )r   r   r   merged_range_countr   startendr   s   f       r   r   Cluster.coverage_bytes   s     Dt||DDqHI	 	 UUU
  JEEAX$5"a'"D ! 
 !1$%	 	 =00r   c                   a  \        S P                  V 3R  lR7      p\        S P                  P                  S P                   Uu. uF  q"V8w  g   K  VNK  	  up4      # u upi )c                 P   < \        SP                  P                  V ,          4      # rC   r   )rr   r   s   &r   <lambda>)Cluster.classDef1_bytes.<locals>.<lambda>   s    DHH<O<OPQ<R8Sr   )key)r   r   r   r   r   )r   biggest_indexrr   s   f  r   r   Cluster.classDef1_bytes  sO     DLL.STHH$$$,,&U,Q}BTqq,&U
 	
&Us   A
A
c                V    \        V P                  P                  V P                  4      # rC   )r   r   all_class2_datar   r   s   &r   r   Cluster.classDef2_bytes%  s!     txx779L9LMMr   c                2   < V ^8  d   Qh/ S[ ;R&   S[;R&   # )r   r   r   )r   r   )r   __classdict__s   "r   r   Cluster.__annotate__   s     	   r    N)__name__
__module____qualname____firstlineno__r   r   r   propertyr   r   r   r   r   __annotate_func____static_attributes____classdictcell__)r   s   @r   r   r      s     
 1 1 $ $ , , 
 
> 1 1> 	
 	
 N NE  r   r   c          	      ^    V ^8  d   QhR\         R\        R\        R\        \        ,          /# )r   r/   rx   compressionr   )r   Pairsr   r   )r   s   "r   r   r   +  s:     L L
LL L 
%[	Lr   c           	      .  aaa$a%a&a' S'       g   S.# \        \        R  S 4       4      4      p\        \        R S 4       4      4      pV Uau. uF"  o\        VV3R l\        V4       4       4      NK$  	  ppV P	                  4       o'V Uu. uF  p\        V'3R lV 4       4      NK  	  ppV Uu. uF  p\        V'3R lV 4       4      NK  	  p	p^ p
^ pSP                  4        Fa  w  rY^ ,          '       d   V^ ,          P                  4       M^ ,          p
Y^,          '       d   V^,          P                  4       M^ ,          pKc  	  \        V
4      ^,          p\        V4      ^,          p\        VVVV	VV4      o%/ o$R V$V%3R llo&R V&3R llp\        \        V4      4       Uu. uF  pS&! ^V,          4      NK  	  ppS&! ^\        V4      ,          ^,
          4      P                  p\        P                  R	\        V4       24       \        V4      ^8  EdP   R
pR
pR
pR
p\        V4       F  w  pp\        VV^,           R
 4       F`  w  ppV! VV4      pVP                  VP                  ,
          VP                  ,
          pVe
   VV8  g   KJ  TpTpV^,           V,           pTpKb  	  K  	  Vf   Q hVf   Q hVf   Q hVf   Q hV^ 8  d   \        R V 4       4      p^VV,          ,
          p\        ^V,
          4      ) V,          p\        P                  R\        V4      R RVR RV 24       V^	8X  d   \        V4      p\        V4      V^,           8:  d   MVV VVV&   EK`  \!        \"        4      p SP                  4        F  w  pp!V!V V^ ,          ,          V&   K  	  . p"V FR  p\#        4       p#VP$                   F$  pVV,          oV#P'                  V S,          4       K&  	  V"P)                  V#4       KT  	  V"# u upi u upi u upi u upi )c              3   2   "   T F  q^ ,          x  K  	  R# 5ir   r   r   pairs   & r   r   ?cluster_pairs_by_class2_coverage_custom_cost.<locals>.<genexpr>5       6GG   c              3   2   "   T F  q^,          x  K  	  R# 5irI   r   r   s   & r   r   r   6  r   r   c              3   P   <"   T F  w  rSV3S9   d
   ^V,          M^ x  K  	  R# 5irI   r   )r   rr   rv   rt   rx   s   &  r   r   r   :  s/      
2	 v&%/AFQ62s   #&c              3   6   <"   T F  pSV,          x  K  	  R # 5irC   r   r   name
name_to_ids   & r   r   r   E       9ST
4((S   c              3   6   <"   T F  pSV,          x  K  	  R # 5irC   r   r   s   & r   r   r   H  r   r   c                0    V ^8  d   QhR\         R\        /# )r   r   r   )r   r   )r   s   "r   r   Bcluster_pairs_by_class2_coverage_custom_cost.<locals>.__annotate__^  s      c g r   c                 Z   < SP                  V R 4      pVe   V# \        SV 4      pVSV &   V# rC   )r3   r   )r   clustercluster_cacher   s   & r   make_clusterBcluster_pairs_by_class2_coverage_custom_cost.<locals>.make_cluster^  s;    ##GT2N#w'!(gr   c                <    V ^8  d   QhR\         R\         R\         /# )r   r   otherr   )r   )r   s   "r   r   r   f  s&     M Mw Mw M7 Mr   c                 J   < S! V P                   VP                   ,          4      # rC   )r   )r   r   r   s   &&r   merge;cluster_pairs_by_class2_coverage_custom_cost.<locals>.mergef  s    G33e6K6KKLLr   z        len(clusters) = Nc              3   8   "   T F  qP                   x  K  	  R # 5irC   )r   )r   cs   & r   r   r     s     &@x!vvxs   z            len(clusters) = 3dz    size_reduction=z5.2fz    max_new_subtables=)rl   setr   rf   rn   r   re   r|   r   r   ranger*   r   logdebugr	   r   dictr   updaterN   )(r/   rx   r   r   
all_class2rt   r   clsr   r   format1format2r   valuer   r   r   rr   clusterscost_before_splittinglowest_cost_changebest_cluster_indexbest_other_indexbest_mergedr   ru   r   mergedcost_changecost_after_splittingsize_reductionmax_new_subtablespairs_by_class1valuespairs_groupspairs_groupr   r   r   r   s(   &f&  `                              @@@@r   rm   rm   +  s<   
 w 6667J6667J !
 !F	 	 
&z2
 	
 ! 
  ((*J FPEOc9S99Z   FPEOc9S99Z   GG{{}!HH58..0!C!HH58..0!C % #7+a/"7+a/
C )+M M M /4CJ.?@.?Q!V$.?H@ )!s5z/Q)>?DDII(X89
h-!
!!#H-JAw%hq1uw&785w.$kkGLL85::E%-?Q1Q)4&)*&'(1uqy$"(K 9 . "---!---+++&&& ! $'&@x&@#@  !58M!MMN "&a.&8!9 9K GII.s8}R.@@STbcgShh~  @Q  R  S a$'M! 8} 1A 55 %&'2#$ 5@4EOf)/Q & & "L!VA]Fv67 ! 	K(  }L As   (PP/P'P)F)r   r   r   r   r   r   )   )5loggingr%   collectionsr   r   dataclassesr   	functoolsr   r   	itertoolsr   mathr	   typingr
   r   r   r   r   r   fontTools.configr   fontTools.misc.intToolsr   r   fontTools.ttLibr   fontTools.ttLib.tablesr   r   	getLoggerr   r  COMPRESSION_LEVELr$   strdefaultr#   r-   r>   r8   r;   rD   rX   ri   ValueRecordr   r   r   r   r   rm   r   r   r   <module>r*     s    	 / ! -   E E $ : " 3!xj(:;<  :  1 9 9: E$:.2
6 		%S/5c?
*+	&

f00
013	
--, 
  cN cN cNLL Lr   