
    Ng                    $   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
 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T d dlT d dlmZmZ d dlmZ d dlZd dlZd dlZd dlZd dlm Z m!Z! d dl"m#Z# d dl$m%Z% dZ&de&z   dz   Z' ej(        d          Z)ddZ* e%e*e)          e)_+         e ej(        d                    Z,d Z-d Z. eej/                  d             Z0 eej/                  d             Z1 eej/                  d             Z2 eej/                  d             Z3 eej4                  d             Z0 eej4                  d              Z5 eej4                  dd#            Z2 eej4                  d$             Z3 eej6                  d%             Z7 eej6                  d&             Z8 eej9                  d'             Z7 eej9                  d(             Z8 eej:                  d)             Z7 eej:                  d*             Z8 eej;                  d+             Z7 eej;                  d,             Z8 eej<                  d-             Z7 eej<                  d.             Z8 eej=                  d/             Z> eej?                  d0             Z@ eejA                  d1             Z8 eejA                  d2             ZB eejC                  d3             Z8 eejC                  d4             ZB eejD                  d5             Z8 eejE                  d6             Z@ eejD                  d7             ZB eejF                  d8             Z8 eejF                  d9             ZB eejG                  d:             Z8 eejG                  d;             ZB eejH                  d<             Z8 eejH                  d=             ZB eej6        ej9        ej:        ej;        ej<        ejA        ejC        ejD        ejF        ejG        ejH                  d>             ZI eej6        ej9        ej:        ej;        ej<        ejA        ejC        ejD        ejF        ejG        ejH                  d?             ZJ eej6        ej9        ej:        ej;        ej<        ejK        ejL        ejM        ejN        	  	        d@             ZB eej6        ej:        ej<                  dA             ZO eej9        ej;        ejK        ejL                  dB             ZO eejK        ejL        ejM        ejN                  dC             ZP eejK        ejL                  dD             Z7 eejK        ejM        ejL        ejN                  dE             Z8 eejK        ejL        ejM        ejN                  dF             ZI eejK        ejL        ejM        ejN                  dG             ZJ eejQ                  dH             Z7 eejQ                  dI             ZO eejQ        ejR                  dJ             Z8 eejQ        ejR                  dK             ZB eejQ        ejR                  dL             ZI eejQ        ejR                  dM             ZJ eejS                  ddN            Z7 eejS                  dO             Z8 eejS                  dP             ZB eejS                  dQ             ZI eejS                  dR             ZJ eejS                  dS             ZO eejT                  dT             Z8 eejT                  dU             ZB eejT                  dV             ZI eejT                  dW             ZU eejT                  dX             ZV eejW                  dY             ZI eejX                  dZ             ZI eejX                  d[             ZJ eejX                  d\             ZY eejZ                  d]             ZI eej[                  d^             ZI eej[                  d_             ZJ eejZ                  d`             ZY eej[                  da             ZY eej\        ej]                  db             ZY eej\        ej]                  dc             Z^ eej_                  ddd            ZY eej_                  de             Z^ eej`                  df             ZY eej`                  dg             Z^ e eja        dh                    di             Z8 e eja        dj                    dk             Z8 e eja        dl                    dm             Z8 e eja        dn                    do             Z7 e eja        dn           eja        dp                    dq             Z8 e eja        dn           eja        dp                    dr             Zb e eja        dn           eja        dp                    ds             ZI e eja        dn           eja        dp                    dt             ZU e eja        dn           eja        dp                    ddu            Zc e eja        dn           eja        dp                    dv             Zd e eja        dn           eja        dp                    dw             Ze e eja        dn           eja        dp                    dx             Zf e eja        dn           eja        dp                    dy             Zg e eja        dn           eja        dp                    dz             Zh e eja        dn           eja        dp                    d{             ZB e eja        d|                    d}             Z8d~ Zi e eja        d|                    d             ZB e eja        d                    d             Zg e eja        d                    d             Z8 e eja        d                    d             Z8 e eja        d                    d             Z8 e eja        d                    d             Z8 e eja        d                    d             Z8 e eja        d                    d             Z7 e eja        d                    d             Z8 e eja        d                    d             Z8 e eja        d                    d             Zg e eja        d                    d             Z8d Zj e eja        d                    d             Z8 e eja        d                    d             Z8 e eja        d                    d             Z8 e eja        d                    d             Z8 e eja        d                    d             Zg e eja        d                    d             Z8 e eja        d                    d             Z8d Zk e eja        d                    d             Z7 e eja        d                    d             Z8 e eja        d                    d             ZB eejl                  d             Z7 eejm                  d             Z7 e eja        d                    d             Z8 e eja        d                    d             Z7 e eja        d                    d             ZB e eja        d                    d             Z7 eejn                  d             Z8 eejo                  d             Z8 eejp                  d             Z8 eejq                  d             Z8 eejm                  d             Z8 e eja        d                    d             Z8 e ejr        d          js                  d             Zt e eja        d                    d             Z7 e eja        d                    d             Zg e eja        d                    d             Z8 e eja        d                    d             ZB e eja        d                    d             Z7 e eja        d                    d             Zg e eja        d                    d             Z8 e eja        d                    d             Zg e eja        d                    d             Zg e eja        dæ                    dĄ             ZB e eja        dŦ                    dƄ             ZB G dǄ deu          Zv G dɄ deu          Zw e,d˦          dd̄            Zx e,dͦ          d΄             Zydτ ZzdЄ Z{dф Z|d҄ Z} e,dӦ          ddԄ            Z~g dբZdS )    )config)otRound)ttLib)otTables)USE_HARFBUZZ_REPACKER)
maxCtxFont)NullPen)Timer)makeOutputFileName)_add_method
_uniq_sort)*)varStoremultiVarStore)NameRecordVisitorN)Counterdefaultdict)reduce)
MethodTypez3pyftsubset font-file [glyph...] [--option=value]...a  pyftsubset -- OpenType font subsetter and optimizer

pyftsubset is an OpenType font subsetter and optimizer, based on fontTools.
It accepts any TT- or CFF-flavored OpenType (.otf or .ttf) or WOFF (.woff)
font file. The subsetted glyph set is based on the specified glyphs
or characters, and specified OpenType layout features.

The tool also performs some size-reducing optimizations, aimed for using
subset fonts as webfonts.  Individual optimizations can be enabled or
disabled, and are enabled by default when they are safe.

Usage: a9  

At least one glyph or one of --gids, --gids-file, --glyphs, --glyphs-file,
--text, --text-file, --unicodes, or --unicodes-file, must be specified.

Args:

font-file
  The input font file.
glyph
  Specify one or more glyph identifiers to include in the subset. Must be
  PS glyph names, or the special string '*' to keep the entire glyph set.

Initial glyph set specification
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

These options populate the initial glyph set. Same option can appear
multiple times, and the results are accummulated.

--gids=<NNN>[,<NNN>...]
  Specify comma/whitespace-separated list of glyph IDs or ranges as decimal
  numbers.  For example, --gids=10-12,14 adds glyphs with numbers 10, 11,
  12, and 14.

--gids-file=<path>
  Like --gids but reads from a file. Anything after a '#' on any line is
  ignored as comments.

--glyphs=<glyphname>[,<glyphname>...]
  Specify comma/whitespace-separated PS glyph names to add to the subset.
  Note that only PS glyph names are accepted, not gidNNN, U+XXXX, etc
  that are accepted on the command line.  The special string '*' will keep
  the entire glyph set.

--glyphs-file=<path>
  Like --glyphs but reads from a file. Anything after a '#' on any line
  is ignored as comments.

--text=<text>
  Specify characters to include in the subset, as UTF-8 string.

--text-file=<path>
  Like --text but reads from a file. Newline character are not added to
  the subset.

--unicodes=<XXXX>[,<XXXX>...]
  Specify comma/whitespace-separated list of Unicode codepoints or
  ranges as hex numbers, optionally prefixed with 'U+', 'u', etc.
  For example, --unicodes=41-5a,61-7a adds ASCII letters, so does
  the more verbose --unicodes=U+0041-005A,U+0061-007A.
  The special strings '*' will choose all Unicode characters mapped
  by the font.

--unicodes-file=<path>
  Like --unicodes, but reads from a file. Anything after a '#' on any
  line in the file is ignored as comments.

--ignore-missing-glyphs
  Do not fail if some requested glyphs or gids are not available in
  the font.

--no-ignore-missing-glyphs
  Stop and fail if some requested glyphs or gids are not available
  in the font. [default]

--ignore-missing-unicodes [default]
  Do not fail if some requested Unicode characters (including those
  indirectly specified using --text or --text-file) are not available
  in the font.

--no-ignore-missing-unicodes
  Stop and fail if some requested Unicode characters are not available
  in the font.
  Note the default discrepancy between ignoring missing glyphs versus
  unicodes.  This is for historical reasons and in the future
  --no-ignore-missing-unicodes might become default.

Other options
^^^^^^^^^^^^^

For the other options listed below, to see the current value of the option,
pass a value of '?' to it, with or without a '='. In some environments,
you might need to escape the question mark, like this: '--glyph-names\?'.

Examples::

    $ pyftsubset --glyph-names?
    Current setting for 'glyph-names' is: False
    $ pyftsubset --name-IDs=?
    Current setting for 'name-IDs' is: [0, 1, 2, 3, 4, 5, 6]
    $ pyftsubset --hinting? --no-hinting --hinting?
    Current setting for 'hinting' is: True
    Current setting for 'hinting' is: False

Output options
^^^^^^^^^^^^^^

--output-file=<path>
  The output font file. If not specified, the subsetted font
  will be saved in as font-file.subset.

--flavor=<type>
  Specify flavor of output font file. May be 'woff' or 'woff2'.
  Note that WOFF2 requires the Brotli Python extension, available
  at https://github.com/google/brotli

--with-zopfli
  Use the Google Zopfli algorithm to compress WOFF. The output is 3-8 %
  smaller than pure zlib, but the compression speed is much slower.
  The Zopfli Python bindings are available at:
  https://pypi.python.org/pypi/zopfli

--harfbuzz-repacker
  By default, we serialize GPOS/GSUB using the HarfBuzz Repacker when
  uharfbuzz can be imported and is successful, otherwise fall back to
  the pure-python serializer. Set the option to force using the HarfBuzz
  Repacker (raises an error if uharfbuzz can't be found or fails).

--no-harfbuzz-repacker
  Always use the pure-python serializer even if uharfbuzz is available.

Glyph set expansion
^^^^^^^^^^^^^^^^^^^

These options control how additional glyphs are added to the subset.

--retain-gids
  Retain glyph indices; just empty glyphs not needed in-place.

--notdef-glyph
  Add the '.notdef' glyph to the subset (ie, keep it). [default]

--no-notdef-glyph
  Drop the '.notdef' glyph unless specified in the glyph set. This
  saves a few bytes, but is not possible for Postscript-flavored
  fonts, as those require '.notdef'. For TrueType-flavored fonts,
  this works fine as long as no unsupported glyphs are requested
  from the font.

--notdef-outline
  Keep the outline of '.notdef' glyph. The '.notdef' glyph outline is
  used when glyphs not supported by the font are to be shown. It is not
  needed otherwise.

--no-notdef-outline
  When including a '.notdef' glyph, remove its outline. This saves
  a few bytes. [default]

--recommended-glyphs
  Add glyphs 0, 1, 2, and 3 to the subset, as recommended for
  TrueType-flavored fonts: '.notdef', 'NULL' or '.null', 'CR', 'space'.
  Some legacy software might require this, but no modern system does.

--no-recommended-glyphs
  Do not add glyphs 0, 1, 2, and 3 to the subset, unless specified in
  glyph set. [default]

--no-layout-closure
  Do not expand glyph set to add glyphs produced by OpenType layout
  features.  Instead, OpenType layout features will be subset to only
  rules that are relevant to the otherwise-specified glyph set.

--layout-features[+|-]=<feature>[,<feature>...]
  Specify (=), add to (+=) or exclude from (-=) the comma-separated
  set of OpenType layout feature tags that will be preserved.
  Glyph variants used by the preserved features are added to the
  specified subset glyph set. By default, 'calt', 'ccmp', 'clig', 'curs',
  'dnom', 'frac', 'kern', 'liga', 'locl', 'mark', 'mkmk', 'numr', 'rclt',
  'rlig', 'rvrn', and all features required for script shaping are
  preserved. To see the full list, try '--layout-features=?'.
  Use '*' to keep all features.
  Multiple --layout-features options can be provided if necessary.
  Examples:

    --layout-features+=onum,pnum,ss01
        * Keep the default set of features and 'onum', 'pnum', 'ss01'.
    --layout-features-='mark','mkmk'
        * Keep the default set of features but drop 'mark' and 'mkmk'.
    --layout-features='kern'
        * Only keep the 'kern' feature, drop all others.
    --layout-features=''
        * Drop all features.
    --layout-features='*'
        * Keep all features.
    --layout-features+=aalt --layout-features-=vrt2
        * Keep default set of features plus 'aalt', but drop 'vrt2'.

--layout-scripts[+|-]=<script>[,<script>...]
  Specify (=), add to (+=) or exclude from (-=) the comma-separated
  set of OpenType layout script tags that will be preserved. LangSys tags
  can be appended to script tag, separated by '.', for example:
  'arab.dflt,arab.URD,latn.TRK'. By default all scripts are retained ('*').

Hinting options
^^^^^^^^^^^^^^^

--hinting
  Keep hinting [default]

--no-hinting
  Drop glyph-specific hinting and font-wide hinting tables, as well
  as remove hinting-related bits and pieces from other tables (eg. GPOS).
  See --hinting-tables for list of tables that are dropped by default.
  Instructions and hints are stripped from 'glyf' and 'CFF ' tables
  respectively. This produces (sometimes up to 30%) smaller fonts that
  are suitable for extremely high-resolution systems, like high-end
  mobile devices and retina displays.

Optimization options
^^^^^^^^^^^^^^^^^^^^

--desubroutinize
  Remove CFF use of subroutinizes.  Subroutinization is a way to make CFF
  fonts smaller.  For small subsets however, desubroutinizing might make
  the font smaller.  It has even been reported that desubroutinized CFF
  fonts compress better (produce smaller output) WOFF and WOFF2 fonts.
  Also see note under --no-hinting.

--no-desubroutinize [default]
  Leave CFF subroutinizes as is, only throw away unused subroutinizes.

Font table options
^^^^^^^^^^^^^^^^^^

--drop-tables[+|-]=<table>[,<table>...]
  Specify (=), add to (+=) or exclude from (-=) the comma-separated
  set of tables that will be be dropped.
  By default, the following tables are dropped:
  'BASE', 'JSTF', 'DSIG', 'EBDT', 'EBLC', 'EBSC', 'PCLT', 'LTSH'
  and Graphite tables: 'Feat', 'Glat', 'Gloc', 'Silf', 'Sill'.
  The tool will attempt to subset the remaining tables.

  Examples:

  --drop-tables-=BASE
      * Drop the default set of tables but keep 'BASE'.

  --drop-tables+=GSUB
      * Drop the default set of tables and 'GSUB'.

  --drop-tables=DSIG
      * Only drop the 'DSIG' table, keep all others.

  --drop-tables=
      * Keep all tables.

--no-subset-tables+=<table>[,<table>...]
  Add to the set of tables that will not be subsetted.
  By default, the following tables are included in this list, as
  they do not need subsetting (ignore the fact that 'loca' is listed
  here): 'gasp', 'head', 'hhea', 'maxp', 'vhea', 'OS/2', 'loca', 'name',
  'cvt ', 'fpgm', 'prep', 'VMDX', 'DSIG', 'CPAL', 'MVAR', 'cvar', 'STAT'.
  By default, tables that the tool does not know how to subset and are not
  specified here will be dropped from the font, unless --passthrough-tables
  option is passed.

  Example:

   --no-subset-tables+=FFTM
      * Keep 'FFTM' table in the font by preventing subsetting.

--passthrough-tables
  Do not drop tables that the tool does not know how to subset.

--no-passthrough-tables
  Tables that the tool does not know how to subset and are not specified
  in --no-subset-tables will be dropped from the font. [default]

--hinting-tables[-]=<table>[,<table>...]
  Specify (=), add to (+=) or exclude from (-=) the list of font-wide
  hinting tables that will be dropped if --no-hinting is specified.

  Examples:

  --hinting-tables-=VDMX
      * Drop font-wide hinting tables except 'VDMX'.
  --hinting-tables=
      * Keep all font-wide hinting tables (but strip hints from glyphs).

--legacy-kern
  Keep TrueType 'kern' table even when OpenType 'GPOS' is available.

--no-legacy-kern
  Drop TrueType 'kern' table if OpenType 'GPOS' is available. [default]

Font naming options
^^^^^^^^^^^^^^^^^^^

These options control what is retained in the 'name' table. For numerical
codes, see: http://www.microsoft.com/typography/otspec/name.htm

--name-IDs[+|-]=<nameID>[,<nameID>...]
  Specify (=), add to (+=) or exclude from (-=) the set of 'name' table
  entry nameIDs that will be preserved. By default, only nameIDs between 0
  and 6 are preserved, the rest are dropped. Use '*' to keep all entries.

  Examples:

  --name-IDs+=7,8,9
      * Also keep Trademark, Manufacturer and Designer name entries.
  --name-IDs=
      * Drop all 'name' table entries.
  --name-IDs=*
      * keep all 'name' table entries

--name-legacy
  Keep legacy (non-Unicode) 'name' table entries (0.x, 1.x etc.).
  XXX Note: This might be needed for some fonts that have no Unicode name
  entires for English. See: https://github.com/fonttools/fonttools/issues/146

--no-name-legacy
  Drop legacy (non-Unicode) 'name' table entries [default]

--name-languages[+|-]=<langID>[,<langID>]
  Specify (=), add to (+=) or exclude from (-=) the set of 'name' table
  langIDs that will be preserved. By default only records with langID
  0x0409 (English) are preserved. Use '*' to keep all langIDs.

--obfuscate-names
  Make the font unusable as a system font by replacing name IDs 1, 2, 3, 4,
  and 6 with dummy strings (it is still fully functional as webfont).

Glyph naming and encoding options
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

--glyph-names
  Keep PS glyph names in TT-flavored fonts. In general glyph names are
  not needed for correct use of the font. However, some PDF generators
  and PDF viewers might rely on glyph names to extract Unicode text
  from PDF documents.
--no-glyph-names
  Drop PS glyph names in TT-flavored fonts, by using 'post' table
  version 3.0. [default]
--legacy-cmap
  Keep the legacy 'cmap' subtables (0.x, 1.x, 4.x etc.).
--no-legacy-cmap
  Drop the legacy 'cmap' subtables. [default]
--symbol-cmap
  Keep the 3.0 symbol 'cmap'.
--no-symbol-cmap
  Drop the 3.0 symbol 'cmap'. [default]

Other font-specific options
^^^^^^^^^^^^^^^^^^^^^^^^^^^

--recalc-bounds
    Recalculate font bounding boxes.
--no-recalc-bounds
    Keep original font bounding boxes. This is faster and still safe
    for all practical purposes. [default]
--recalc-timestamp
    Set font 'modified' timestamp to current time.
--no-recalc-timestamp
    Do not modify font 'modified' timestamp. [default]
--canonical-order
    Order tables as recommended in the OpenType standard. This is not
    required by the standard, nor by any known implementation.
--no-canonical-order
    Keep original order of font tables. This is faster. [default]
--prune-unicode-ranges
    Update the 'OS/2 ulUnicodeRange*' bits after subsetting. The Unicode
    ranges defined in the OpenType specification v1.7 are intersected with
    the Unicode codepoints specified in the font's Unicode 'cmap' subtables:
    when no overlap is found, the bit will be switched off. However, it will
    *not* be switched on if an intersection is found.  [default]
--no-prune-unicode-ranges
    Don't change the 'OS/2 ulUnicodeRange*' bits.
--prune-codepage-ranges
    Update the 'OS/2 ulCodePageRange*' bits after subsetting.  [default]
--no-prune-codepage-ranges
    Don't change the 'OS/2 ulCodePageRange*' bits.
--recalc-average-width
    Update the 'OS/2 xAvgCharWidth' field after subsetting.
--no-recalc-average-width
    Don't change the 'OS/2 xAvgCharWidth' field. [default]
--recalc-max-context
    Update the 'OS/2 usMaxContext' field after subsetting.
--no-recalc-max-context
    Don't change the 'OS/2 usMaxContext' field. [default]
--font-number=<number>
    Select font number for TrueType Collection (.ttc/.otc), starting from 0.
--pretty-svg
    When subsetting SVG table, use lxml pretty_print=True option to indent
    the XML output (only recommended for debugging purposes).

Application options
^^^^^^^^^^^^^^^^^^^

--verbose
    Display verbose information of the subsetting process.
--timing
    Display detailed timing information of the subsetting process.
--xml
    Display the TTX XML representation of subsetted font.

Example
^^^^^^^

Produce a subset containing the characters ' !"#$%' without performing
size-reducing optimizations::

  $ pyftsubset font.ttf --unicodes="U+0020-0025" \
    --layout-features=* --glyph-names --symbol-cmap --legacy-cmap \
    --notdef-glyph --notdef-outline --recommended-glyphs \
    --name-IDs=* --name-legacy --name-languages=*
zfontTools.subsetc                     |                      dt          |                     |rE|                                |                      dt          fd|D                                  d S d S )NzGlyph names: %szGlyph IDs:   %sc              3   (   K   | ]}|         V  d S N ).0greverseGlyphMaps     U/var/www/html/ai-engine/env/lib/python3.11/site-packages/fontTools/subset/__init__.py	<genexpr>z_log_glyphs.<locals>.<genexpr>  s(      +O+O1OA,>+O+O+O+O+O+O    )infosortedgetReverseGlyphMap)selfglyphsfontr   s      @r   _log_glyphsr&     s|    II000 Q1133		#V+O+O+O+O+O+O+O%O%OPPPPPQ Qr   zfontTools.subset.timer)loggerc                        fd|D             S )Nc                 "    i | ]}||         S r   r   )r   r   ds     r   
<dictcomp>z _dict_subset.<locals>.<dictcomp>  s    $$$Aqt$$$r   r   )r*   r$   s   ` r   _dict_subsetr,     s    $$$$V$$$$r   c                 B     t                      fd|D             S )Nc                 ,    g | ]}|k     |         S r   r   )r   icountls     r   
<listcomp>z _list_subset.<locals>.<listcomp>  s"    ///QQYYAaDYYYr   len)r1   indicesr0   s   ` @r   _list_subsetr6     s,    FFE/////'////r   c                 D    fdt          | j                  D             S )z3Returns ascending list of matching coverage values.c                 "    g | ]\  }}|v 	|S r   r   )r   r/   r   r$   s      r   r2   zintersect.<locals>.<listcomp>  s"    @@@$!QAKKAKKKr   )	enumerater$   r#   r$   s    `r   	intersectr;     s*     A@@@)DK00@@@@r   c                 D    t          fd| j        D                       S )z#Returns set of intersecting glyphs.c              3   $   K   | ]
}|v |V  d S r   r   r   r   r$   s     r   r   z#intersect_glyphs.<locals>.<genexpr>  s'      55Qfq55r   )setr$   r:   s    `r   intersect_glyphsr@     s*     5555$+555555r   c                 b    |                                }fd| j        D             | _        |S )z4Returns ascending list of remaining coverage values.c                     g | ]}|v |	S r   r   r>   s     r   r2   zsubset.<locals>.<listcomp>  s    999Q&[[1[[[r   r;   r$   )r#   r$   r5   s    ` r   subsetrD     s8     nnV$$G9999dk999DKNr   c                 .      fd|D              _         dS )zRemaps coverage.c                 *    g | ]}j         |         S r   r$   r   r/   r#   s     r   r2   zremap.<locals>.<listcomp>  s    888a4;q>888r   NrG   )r#   coverage_maps   ` r   remaprJ     s$     9888<888DKKKr   c                      t          t           fdD                       rdgng fd j                                        D             z             S )z0Returns ascending list of matching class values.c              3   *   K   | ]}|j         vV  d S r   	classDefsr   r   r#   s     r   r   zintersect.<locals>.<genexpr>  s*      <<AT^+<<<<<<r   r   c                 "    g | ]\  }}|v 	|S r   r   r   r   vr$   s      r   r2   zintersect.<locals>.<listcomp>  s"    
?
?
?A1;;1;;;r   )r   anyrN   itemsr:   s   ``r   r;   r;     sn     <<<<V<<<<<	D!"
?
?
?
?--//
?
?
?	@  r   c                      dk    rt           fdD                       S t          fd j                                        D                       S )z%Returns set of glyphs matching class.r   c              3   .   K   | ]}|j         v|V  d S r   rM   rO   s     r   r   z"intersect_class.<locals>.<genexpr>  s/      @@(?(?1(?(?(?(?@@r   c              3   6   K   | ]\  }}|k    |v |V  d S r   r   )r   r   rR   r$   klasss      r   r   z"intersect_class.<locals>.<genexpr>  s3      RRTQqEzza6kkqkkkkRRr   )r?   rN   rT   )r#   r$   rX   s   ```r   intersect_classrY     sg     zz@@@@f@@@@@@RRRRRT^1133RRRRRRr   FTc                 8    fd j                                         D              _         t          |rt           fdD                       rdgng t	           j                                                   z             }|r                     |           |S )z,Returns ascending list of remaining classes.c                 $    i | ]\  }}|v 	||S r   r   rQ   s      r   r+   zsubset.<locals>.<dictcomp>  s$    MMMtq!far   c              3   *   K   | ]}|j         vV  d S r   rM   rO   s     r   r   zsubset.<locals>.<genexpr>  s*      &O&O1q'>&O&O&O&O&O&Or   r   )rN   rT   r   rS   listvaluesrJ   )r#   r$   rJ   	useClass0r5   s   ``   r   rD   rD     s     NMMMt~';';'='=MMMDN  #&&O&O&O&O&O&O&O#O#OQCC
t~$$&&
'
'	( G  

7Nr   c                 \    fd| j                                         D             | _         dS )zRemaps classes.c                 B    i | ]\  }}|                     |          S r   index)r   r   rR   	class_maps      r   r+   zremap.<locals>.<dictcomp>"  s+    OOO1a++OOOr   N)rN   rT   )r#   rd   s    `r   rJ   rJ     s3     POOO8L8L8N8NOOODNNNr   c                     |j                             fd| j                                        D                        d S )Nc              3   *   K   | ]\  }}|v 	|V  d S r   r   )r   r   rR   
cur_glyphss      r   r   z!closure_glyphs.<locals>.<genexpr>'  s+      JJ$!Q!z//A////JJr   )r$   updatemappingrT   r#   srg   s     `r   closure_glyphsrl   %  s@    HOOJJJJ$,"4"4"6"6JJJJJJJJr   c                     fd| j                                         D             | _         t          | j                   S )Nc                 @    i | ]\  }}|j         v |j         v ||S r   rG   r   r   rR   rk   s      r   r+   z!subset_glyphs.<locals>.<dictcomp>,  s7       Aah1==1===r   ri   rT   boolr#   rk   s    `r   subset_glyphsrs   *  sM       ++--  DL r   c                     | j                                         D ]#\  }}||v r|j                            |           $d S r   )ri   rT   r$   rh   )r#   rk   rg   glyphsubsts        r   rl   rl   2  sM    **,, # #uJHOOE"""# #r   c                     fd| j                                         D             | _         t          | j                   S )Nc                 d    i | ],\  }}|j         v t          fd |D                       )||-S )c              3   *   K   | ]}|j         v V  d S r   rG   )r   subrk   s     r   r   z+subset_glyphs.<locals>.<dictcomp>.<genexpr>>  s)       > >S > > > > > >r   )r$   allro   s      r   r+   z!subset_glyphs.<locals>.<dictcomp>;  sS       Aq==S > > > >A > > >>>= 	
1==r   rp   rr   s    `r   rs   rs   9  sM       L&&((  DL
 r   c                 l     |j         j        fd| j                                        D               d S )Nc              3   *   K   | ]\  }}|v 	|V  d S r   r   )r   r   vlistrg   s      r   r   z!closure_glyphs.<locals>.<genexpr>E  s+      WW5qJeWWr   )r$   rh   
alternatesrT   rj   s     `r   rl   rl   C  s=    AHOWWWWDO,A,A,C,CWWWXXXXr   c                     fd| j                                         D             | _         t          | j                   S )Nc                 |    i | ]8\  }}|j         v t          fd |D                       )|fd|D             9S )c              3   *   K   | ]}|j         v V  d S r   rG   r   rR   rk   s     r   r   z+subset_glyphs.<locals>.<dictcomp>.<genexpr>M  s)       > >1ah > > > > > >r   c                 &    g | ]}|j         v |S r   rG   r   s     r   r2   z,subset_glyphs.<locals>.<dictcomp>.<listcomp>K  s     ...!QXAr   )r$   rS   )r   r   r~   rk   s      r   r+   z!subset_glyphs.<locals>.<dictcomp>J  sh       Au==S > > > > > > >>>= 	
....u...==r   )r   rT   rq   rr   s    `r   rs   rs   H  sM       --//  DO
    r   c                 p     j         j        fd| j                                        D               d S )Nc              3   B   K   | ]\  }}|v 	fd |D             V  dS )c                 ^    g | ])}t          fd |j        D                       "|j        *S )c              3   *   K   | ]}|j         v V  d S r   rG   r   crk   s     r   r   z6closure_glyphs.<locals>.<genexpr>.<listcomp>.<genexpr>V  s)      0V0V1ah0V0V0V0V0V0Vr   )r{   	ComponentLigGlyphr   seqrk   s     r   r2   z,closure_glyphs.<locals>.<genexpr>.<listcomp>V  s?    WWWcS0V0V0V0V0V0V0V-V-VWS\WWWr   Nr   )r   r   seqsrg   rk   s      r   r   z!closure_glyphs.<locals>.<genexpr>U  sN       

 

4J XWWWTWWW

 

r   )r$   rh   	ligaturesrT   rj   s    ``r   rl   rl   R  sZ    AHO

 

 

 

 

>//11

 

 

   r   c                 $   fd| j                                         D             | _         fd| j                                         D             | _         d | j                                         D             | _         t          | j                   S )Nc                 .    i | ]\  }}|j         v ||S r   rG   ro   s      r   r+   z!subset_glyphs.<locals>.<dictcomp>_  s&    OOOtq!ahar   c                 4    i | ]\  }}|fd |D             S )c                 p    g | ]2}|j         j        v t          fd |j        D                       0|3S )c              3   *   K   | ]}|j         v V  d S r   rG   r   s     r   r   z6subset_glyphs.<locals>.<dictcomp>.<listcomp>.<genexpr>d  s)      /U/U!QX/U/U/U/U/U/Ur   )r   r$   r{   r   r   s     r   r2   z,subset_glyphs.<locals>.<dictcomp>.<listcomp>a  sV     
 
 
|qx''C/U/U/U/Us}/U/U/U,U,U' '''r   r   )r   r   r   rk   s      r   r+   z!subset_glyphs.<locals>.<dictcomp>`  sU        At 	
 
 
 
 

 
 
  r   c                     i | ]
\  }}|||S r   r   )r   r   rR   s      r   r+   z!subset_glyphs.<locals>.<dictcomp>h  s#    CCCtq!CaCCCr   )r   rT   rq   rr   s    `r   rs   rs   ]  s    OOOOt~';';'='=OOODN    ~++--  DN DCt~';';'='=CCCDNr   c                      j         dk    rn j                            |          }|r(t          fd j         j        z   D                       sd S j                             fd|D                        d S J d j         z              )N   c              3   L   K   | ]}|                     j                  V  d S r   rC   r   s     r   r   z!closure_glyphs.<locals>.<genexpr>p  sE       "
 "
 KK!!"
 "
 "
 "
 "
 "
r   c              3   2   K   | ]}j         |         V  d S r   )
SubstituterH   s     r   r   z!closure_glyphs.<locals>.<genexpr>u  s*      <<q*<<<<<<r   r   unknown format: %s)FormatCoverager;   r{   LookAheadCoverageBacktrackCoverager$   rh   )r#   rk   rg   r5   s   ``  r   rl   rl   l  s    {a-))*55 	c "
 "
 "
 "
+d.DD"
 "
 "
 
 
 	 F	<<<<G<<<<<<<<4&4444r   c                    | j         dk    r| j                            j                  }t	          | j        |          | _        fdt          | j                  D             }t	          | j        |          | _        | j                            |           t          | j                  | _	        t          | j	        o't          fd| j        | j        z   D                                 S J d| j         z              )Nr   c                 ,    g | ]\  }}|j         v |S r   rG   )r   r/   rz   rk   s      r   r2   z!subset_glyphs.<locals>.<listcomp>  s$    QQQC1r   c              3   L   K   | ]}|                     j                  V  d S r   rD   r$   r   s     r   r   z subset_glyphs.<locals>.<genexpr>  sE         ""     r   r   r   )r   r   rD   r$   r6   r   r9   rJ   r4   
GlyphCountrq   r{   r   r   r#   rk   r5   s    ` r   rs   rs   z  s	   {a-&&qx00&t@@QQQQ9T_#=#=QQQ&t@@G$$$do..O     /$2HH    
 
 	
 	5&4444r   c                     | j         dv S )Nr         )DeltaFormatr#   s    r   
is_hintingr     s    y((r   c                 ~    dD ]9}t          | |d           }|$|                                rt          | |           :d S )N)
XPlaDevice
YPlaDevice
XAdvDevice
YAdvDevice)getattrr   delattrr#   namerR   s      r   prune_hintsr     sN    H    D$%%=Q\\^^=D$   r   c                    | j         dk    r,t          | j                            |j                            S | j         dk    rv| j                            |j                  }| j        t                    fd|D             | _        t          | j                  | _        t          | j                  S J d| j         z              )Nr   r   c                 ,    g | ]}|k     |         S r   r   )r   r/   r0   r^   s     r   r2   z!subset_glyphs.<locals>.<listcomp>  s"    >>>AAIIfQiIIIr   r   r   )r   r4   r   rD   r$   Value
ValueCountrq   )r#   rk   r5   r0   r^   s      @@r   rs   rs     s    {a4=''11222			-&&qx00F>>>>>>>>
dj//DO$$$4&4444r   c                      j          j        dk    sJ dS  j        dk    r?|j        s j                                           j                                          _        n j        dk    rd  j         v r. j        dk    sJ t          d  j         D                       sJ nT|j        s j         D ]}|                                 t          t          j	        d  j         D             d           _         j        dk    rHt           fd j         D                       r(d _         j        dk    r j         d         nd  _          `
dS )Nr   Tr   r   c              3      K   | ]}|d u V  	d S r   r   r   rR   s     r   r   z$prune_post_subset.<locals>.<genexpr>  s&      55QqDy555555r   c                 6    g | ]}|                                 S r   )getEffectiveFormatr   s     r   r2   z%prune_post_subset.<locals>.<listcomp>  s$    HHHQ1133HHHr   c              3   :   K   | ]}|j         d          k    V  dS r   N)r   )r   rR   r#   s     r   r   z$prune_post_subset.<locals>.<genexpr>  s.      GGqTZ] 2GGGGGGr   )r   ValueFormatr   hintingr   r   r{   r   int__or__r   )r#   r%   optionsrR   s   `   r   prune_post_subsetr     sx   z1$$$$t {a 	%J""$$$:88::			4:#q((((55$*555555555? $ $ $AMMOOOO%
HHTZHHH!   D
 {aCGGGGDJGGGGG&*&6!&;&;TZ]]
O4r   c                      j         dk    r j                            j                  } j        t                    fd|D              _         j        D ]3}fd|j        D             |_        t          |j                  |_        4d t           j                  D             } j        	                    |           t           j        |           _        t           j                   _        t           j                  S  j         dk    r fd j                            j                             j        j                  d          D             } fd	 j                            j        dd
          D             } fd|D              _         j        D ]fd|D             _        t          |           _        t          |           _        t           j        o) j        dk    o j                            j                            S J d j         z              )Nr   c                 ,    g | ]}|k     |         S r   r   )r   r/   r0   pairss     r   r2   z!subset_glyphs.<locals>.<listcomp>  s"    ???QQYYaYYYr   c                 0    g | ]}|j         j        v |S r   )SecondGlyphr$   )r   rrk   s     r   r2   z!subset_glyphs.<locals>.<listcomp>  s.     ! ! !0I0I0I0I0Ir   c                 &    g | ]\  }}|j         |S r   )PairValueCount)r   r/   ps      r   r2   z!subset_glyphs.<locals>.<listcomp>  s$    MMMAA<LM1MMMr   r   c                 *    g | ]}|j         k     |S r   )Class1Countr   r   r#   s     r   r2   z!subset_glyphs.<locals>.<listcomp>  s5     
 
 
 4###	  $##r   TrJ   c                 *    g | ]}|j         k     |S r   )Class2Countr   s     r   r2   z!subset_glyphs.<locals>.<listcomp>  s1     
 
 
4### ###r   F)rJ   r_   c                 *    g | ]}j         |         S r   )Class1RecordrH   s     r   r2   z!subset_glyphs.<locals>.<listcomp>  s!    FFFaT.q1FFFr   c                 *    g | ]}j         |         S r   )Class2Recordr   r/   r   s     r   r2   z!subset_glyphs.<locals>.<listcomp>  s     DDDAanQ/DDDr   r   r   )r   r   rD   r$   PairSetr4   PairValueRecordr   r9   rJ   r6   PairSetCountrq   	ClassDef1intersection	ClassDef2r   r   r   r   )	r#   rk   r5   r   
class1_map
class2_mapr   r0   r   s	   ``    @@@r   rs   rs     s   {a-&&qx00E

?????'??? 	6 	6A! ! ! !,! ! !A  #1#455AMM4<!8!8MMMG$$$#DL'::--D%&&&			
 
 
 
^**%%dm&:;;4 +  
 
 


 
 
 
^**1845*QQ
 
 


 GFFF:FFF" 	E 	EADDDDDDDANNz??z?? /!A%/$$QX..
 
 	
 	5&4444r   c                    |j         sddd| j                 \  }}dx| _        | _        t	          | |          D ]}t	          ||          D ]}|j        r@|j                                         | xj        |j                                        z  c_        |j        r@|j                                         | xj        |j                                        z  c_        t          | j        | j        z            S )N)r   r   )r   r   r   r   r   )
r   r   ValueFormat1ValueFormat2r   Value1r   r   Value2rq   )r#   r%   r   attr1attr2rowr   s          r   r   r     s   ? G-/
 
 +u
 121D-4'' 	G 	GCS%(( G G8 GH((***%%)D)D)F)FF%%8 GH((***%%)D)D)F)FF%%G !D$55666r   c                 ,   | j         dk    rv| j                            |j                  }| j        t                    fd|D             | _        t          | j                  | _        t          | j                  S J d| j         z              )Nr   c                 ,    g | ]}|k     |         S r   r   )r   r/   r0   recordss     r   r2   z!subset_glyphs.<locals>.<listcomp>  s"    IIIqq5yy
yyyr   r   r   )r   r   rD   r$   EntryExitRecordr4   EntryExitCountrq   )r#   rk   r5   r0   r   s      @@r   rs   rs     s    {a-&&qx00&GIIIIIGIII!$"677D'(((4&4444r   c                     | j         dk    r	d| _         d S | j         dk    rTdD ]:}t          | |d           }|%|                                rt          | |d            ;| j        | j        d| _         d S d S d S d S )Nr   r   r   )XDeviceTableYDeviceTable)r   r   r   setattrr   r   r   s      r   r   r     s    {a			4 	* 	*DdD))A}}dD)))$):)BDKKK 
	
 %$)B)Br   c                     |j         sJ| j        D ]B}|j        r|j                                         |j        r|j                                         CdS NT)r   r   EntryAnchorr   
ExitAnchor)r#   r%   r   recs       r   r   r   (  s`    ? -' 	- 	-C .++---~ -**,,,4r   c                 J   | j         dk    r| j                            |j                  }t	          | j        j        |          | j        _        t          | j        j                  | j        _        | j	                            |j                  }t	          | j
        j        |          | j
        _        t          | j
        j                  | j
        _        t          d | j        j        D                       }t          |          | _        | j        j        D ]!}|                    |j                  |_        "| j
        j        D ]}t	          |j        |          |_        t%          | j        o| j        j        o| j
        j                  S J d| j         z              )Nr   c              3   $   K   | ]}|j         V  d S r   Classr   s     r   r   z subset_glyphs.<locals>.<genexpr>A  $      "N"Nq17"N"N"N"N"N"Nr   r   r   )r   MarkCoveragerD   r$   r6   	MarkArray
MarkRecordr4   	MarkCountBaseCoverage	BaseArray
BaseRecord	BaseCountr   
ClassCountrc   r   
BaseAnchorrq   )r#   rk   mark_indicesbase_indicesclass_indicesmbs          r   rs   rs   3  sx   {a(//99$0N%|%
 %
! $'t~'@#A#A (//99$0N%|%
 %
! $'t~'@#A#A ""N"NDN4M"N"N"NNNm,,* 	3 	3A#))!'22AGG* 	E 	EA'mDDALLOU 8UT^=U
 
 	
 	5&4444r   c                     |j         s^| j        j        D ]"}|j        r|j                                         #| j        j        D ]"}|j        D ]}|r|                                 #dS r   )r   r  r  
MarkAnchorr   r  r  r
  )r#   r%   r   r  r  as         r   r   r   N  s    ? $* 	+ 	+A| +((**** 	$ 	$A\ $ $ $MMOOO$ 4r   c                 d   | j         dk    r| j                            |j                  }t	          | j        j        |          | j        _        t          | j        j                  | j        _        | j	                            |j                  }t	          | j
        j        |          | j
        _        t          | j
        j                  | j
        _        t          d | j        j        D                       }t          |          | _        | j        j        D ]!}|                    |j                  |_        "| j
        j        D ])}||j        D ]}t	          |j        |          |_        *t'          | j        o| j        j        o| j
        j                  S J d| j         z              )Nr   c              3   $   K   | ]}|j         V  d S r   r   r   s     r   r   z subset_glyphs.<locals>.<genexpr>i  r   r   r   r   )r   r  rD   r$   r6   r  r  r4   r  LigatureCoverageLigatureArrayLigatureAttachLigatureCountr   r	  rc   r   ComponentRecordLigatureAnchorrq   )r#   rk   r  ligature_indicesr  r  r1   r   s           r   rs   rs   [  s   {a(//99$0N%|%
 %
! $'t~'@#A#A 077AA,8-/?-
 -
) ,/t/A/P+Q+Q(""N"NDN4M"N"N"NNNm,,* 	3 	3A#))!'22AGG#2 	Q 	QAy& Q Q#/0@-#P#P  QO 1(1"0
 
 	
 	5&4444r   c                     |j         sk| j        j        D ]"}|j        r|j                                         #| j        j        D ]/}||j        D ]"}|j        D ]}|r|                                 #0dS r   )	r   r  r  r  r   r  r  r  r  )r#   r%   r   r  r1   r   r  s          r   r   r   {  s    ? 
(* 	+ 	+A| +((***#2 	( 	(Ay& ( () ( (A ((( 4r   c                 J   | j         dk    r| j                            |j                  }t	          | j        j        |          | j        _        t          | j        j                  | j        _        | j	                            |j                  }t	          | j
        j        |          | j
        _        t          | j
        j                  | j
        _        t          d | j        j        D                       }t          |          | _        | j        j        D ]!}|                    |j                  |_        "| j
        j        D ]}t	          |j        |          |_        t#          | j        o| j        j        o| j
        j                  S J d| j         z              )Nr   c              3   $   K   | ]}|j         V  d S r   r   r   s     r   r   z subset_glyphs.<locals>.<genexpr>  s$      "O"Oq17"O"O"O"O"O"Or   r   r   )r   Mark1CoveragerD   r$   r6   
Mark1Arrayr  r4   r  Mark2Coverage
Mark2ArrayMark2Recordr   r	  rc   r   Mark2Anchorrq   )r#   rk   mark1_indicesmark2_indicesr  r  r  s          r   rs   rs     sx   {a*11!(;;%1O&&
 &
" %((B$C$C!*11!(;;&2O''
 '
# %((C$D$D!""O"ODO4N"O"O"OOOm,,+ 	3 	3A#))!'22AGG, 	G 	GA(FFAMMOW 9Wdo>W
 
 	
 	5&4444r   c                     |j         s^| j        j        D ]"}|j        r|j                                         #| j        j        D ]"}|j        D ]}|r|                                 #dS r   )r   r   r  r  r   r"  r#  r$  )r#   r%   r   r  r  s        r   r   r     s    ? $+ 	+ 	+A| +((***, 	$ 	$A] $ $ $MMOOO$ 4r   c                     d S r   r   r#   lookup_indicess     r   subset_lookupsr+    s	     	Dr   c                     g S r   r   r   s    r   collect_lookupsr-    s	     Ir   c                     dS r   r   r#   r%   r   s      r   r   r     s	     4r   c                     dS )NFr   r   s    r   may_have_non_1to1r1    s	     5r   c                     dS r   r   r   s    r   r1  r1    s	     4r   c                 (    G d dt                     }| j        dvrd S t          | j        d          si | j        _        | j        | j        j        vr* || j        | j                  }|| j        j        | j        <   | j        j        | j                 S )Nc                       e Zd Zd ZdS )0__subset_classify_context.<locals>.ContextHelperc                    |j                             d          rd}d}nd}d}|j                             d          rd}d}d}nd}d}d}||z   }|| _        || _        || _        || _        || _        || _        |d	z   | _	        |dk    rd
 }	d }
d }d }d }d }d }d }d }d }nS|dk    rd }	d }
d }d }d }d }d }d }d }d }n.|dk    rd }	d }
d }d }d }d }d }d  }d! }d" }nJ d#|z              |r$|
| _
        || _        || _        || _        || _        n#|	| _
        || _        || _        || _        || _        |dk    r2|d$z   | _        |d%z   | _        |d&z   | _        |d'z   | _        d( | _        d S |dk    rS|d)z   | _        |d*z   | _        |d+z   | _        |d,z   | _        d- | _        |rd.nd/| _        |rdnd| _        |rd0nd1| _        d S |dk    r|rd2nd3| _        d S d S )4NSubstSubPosChainr   r    r   LookupRecordc                     | j         S r   r   r   s    r   <lambda>zK__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.<lambda>      QZ r   c                     | j         S r   r>  r?  s    r   r@  zK__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.<lambda>      !* r   c                     dS )Nr   r   r?  s    r   r@  zK__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.<lambda>  s     r   c                     dS )N)NNNr   r?  s    r   r@  zK__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.<lambda>  s    -? r   c                     | j         fS r   )Inputr?  s    r   r@  zK__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.<lambda>  
    agZ r   c                 *    | j         | j        | j        fS r   	BacktrackrG  	LookAheadr?  s    r   r@  zK__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.<lambda>      1;*M r   c                 >    |\  | _         d |D             \  | _        d S )Nc              3   :   K   | ]}t          |          d z   V  dS r   Nr3   r   xs     r   r   za__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.SetRuleData.<locals>.<genexpr>#  ,      &=&=as1vvz&=&=&=&=&=&=r   )rG  r   r   r*   s     r   SetRuleDatazN__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.SetRuleData!  &    !"JQW&=&=1&=&=&=OQ\\\r   c                     |\  | _         | _        | _        t          |d                   t          |d                   dz   t          |d                   c| _        | _        | _        d S Nr   r   r   rK  rG  rL  r4   BacktrackGlyphCountInputGlyphCountLookAheadGlyphCountrT  s     r   ChainSetRuleDatazS__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.ChainSetRuleData%  \    :;7Q[!'1;
 QqTC!IIM3qt99	-)---r   r   c                     | j         S r   r>  r?  s    r   r@  zK__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.<lambda>.  rA  r   c                     | j         S r   r>  r?  s    r   r@  zK__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.<lambda>/  rC  r   c                     | j         fS r   ClassDefr?  s    r   r@  zK__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.<lambda>0  s
     r   c                 *    | j         | j        | j        fS r   BacktrackClassDefInputClassDefLookAheadClassDefr?  s    r   r@  zK__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.<lambda>1  s    'O'. r   c                     |\  | _         d S r   rb  rT  s     r   SetContextDatazQ__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.SetContextData7  s    $%MQZZZr   c                 0    |\  | _         | _        | _        d S r   re  rT  s     r   SetChainContextDatazV__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.SetChainContextData:  s    RSOQ(!/1;N;N;Nr   c                     | j         fS r   r   r?  s    r   r@  zK__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.<lambda>=  rH  r   c                 *    | j         | j        | j        fS r   rJ  r?  s    r   r@  zK__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.<lambda>>  rM  r   c                 >    |\  | _         d |D             \  | _        d S )Nc              3   :   K   | ]}t          |          d z   V  dS rP  r3   rQ  s     r   r   za__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.SetRuleData.<locals>.<genexpr>B  rS  r   )r   r   rT  s     r   rU  zN__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.SetRuleData@  rV  r   c                     |\  | _         | _        | _        t          |d                   t          |d                   dz   t          |d                   c| _        | _        | _        d S rX  rY  rT  s     r   r]  zS__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.ChainSetRuleDataD  r^  r   c                     | j         d         S Nr   r>  r?  s    r   r@  zK__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.<lambda>M  s    QZ] r   c                     | j         d         S rs  )InputCoverager?  s    r   r@  zK__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.<lambda>N  s    !/!*< r   c                     | j         S r   r>  r?  s    r   r@  zK__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.<lambda>S  rA  r   c                 0    | j         | j        z   | j        z   S r   )r   ru  r   r?  s    r   r@  zK__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.<lambda>T  s    '!/9A<OO r   c                 >    |\  | _         d |D             \  | _        d S )Nc              3   4   K   | ]}t          |          V  d S r   r3   rQ  s     r   r   za__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.SetRuleData.<locals>.<genexpr>Z  s(      &9&9!s1vv&9&9&9&9&9&9r   )r   r   rT  s     r   rU  zN__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.SetRuleDataX  s&    $%MQZ&9&9q&9&9&9OQ\\\r   c                 n    |\  | _         | _        | _        d |D             \  | _        | _        | _        d S )Nc              3   4   K   | ]}t          |          V  d S r   r3   rQ  s     r   r   zf__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.ChainSetRuleData.<locals>.<genexpr>b  s(      ++AQ++++++r   )r   ru  r   rZ  r[  r\  rT  s     r   r]  zS__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.ChainSetRuleData\  sF    RSOQ(!/1;N
 ,++++	-)---r   r   Rule	RuleCountRuleSetRuleSetCountc                     || v r|gng S r   r   r$   r   r   s      r   r@  zK__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.<lambda>y  s    Q&[[qccb r   	ClassRuleClassRuleCountClassSetClassSetCountc                 x    |r|                     | |          n"|dk    rt          |           nt                      S rs  )rY   r?   r  s      r   r@  zK__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.<lambda>  s=    <A%%fa000)*a#f+++SUU r   rg  rc  rG  r   ru  r   )__name__endswith
startswithTypTyper:  ChainTypInputIdxDataLenr<  r   ContextDatarj  RuleDatarU  r|  r}  r~  r  	Intersectrc  ClassDefIndexrG  )r#   rX   r   r  r  r:  r  r  r  r   ChainCoverager  ChainContextDatarj  rl  r  ChainRuleDatarU  r]  s                      r   __init__z9__subset_classify_context.<locals>.ContextHelper.__init__  sW   ~&&w// ~((11 s{HDHDIDJ$DM$DM"DL $~ 5D{{// 4 4//#?#? !%&*#// M M> > >> > > > 1// 4 455$ $ & & &T T T 0/ M M> > >> > > > 122 < <"#' !%&*#//! !: : :, , , , 8.7777 / -#3 &9# -#3   (#. &4# (#. {{$v-	!)K!7')3$,~$=!!P!P1${2	!),<!<'*4$,$>!" " 49 Hj*/%6QQQ"(-:WW7


105E__:


 r   N)r  
__module____qualname__r  r   r   r   ContextHelperr5    s-        L	F L	F L	F L	F L	Fr   r  r   _subset__ContextHelpers)objectr   hasattr	__class__r  )r#   r  helpers      r   __subset_classify_contextr    s    MF MF MF MF MF MF MF MF^ {)##t4>#<== 413.{$.@@@t~t{;;>D.t{;>1$+>>r   c                    |                                                      |                               |          }|sg S                     |                               |          }| j        dk    r։                    |           }t          | j                  }t          | j                  }|D ]}||k    s||         st          ||         j	                  D ]b}|st          fdt          |                    |                    D                       sDt                      }	t          |j                  D ]}
|
s|
j        }||	v rd }nS|dk    r/t!                              |           j        |         g          }nt!          |j        |dz
           g          }j        j        j        |
j                 }|	                    |           |                                r8|	                    t5          |t7          |j                  dz                        |                    |           dd S | j        dk    r+t          | j                  }|                    |          }                    |           }t          | j                  }t          | j                  }|D ]}||k    s||         st          ||         j	                  D ]}|st          fdt          |                    |                    D                       sDt                      }	t          |j                  D ]$}
|
s|
j        }||	v rd }nn|dk    r$t!          |                    ||                    }nDt!          |                    j        t          |j                  |dz
                               }j        j        j        |
j                 }|	                    |           |                                rF|	                    t5          |t7          t          |j                            dz                        |                    |           &d S | j        dk    rRt          fd                    |           D                       sg S | }t          |j                  }t                      }	t          |j                  D ]}
|
s|
j        }||	v rd }nC|dk    rt!          |          }n-t!          ||                             j                            }j        j        j        |
j                 }|	                    |           |                                r3|	                    t5          |t7          |          dz                        |                    |           d S J d	| j        z              )
Nr   c              3   Z   K   | ]$\  }t          fd |D                       V  %dS )c              3   P   K   | ] }                     j        |          V  !d S r   r  r$   r   kr   cdrk   s     r   r   z+closure_glyphs.<locals>.<genexpr>.<genexpr>  5      DDAHb!44DDDDDDr   Nr{   r   klistr  r   rk   s     @r   r   z!closure_glyphs.<locals>.<genexpr>  _        !E DDDDDDeDDDDD     r   r   r   )rg   c              3   Z   K   | ]$\  }t          fd |D                       V  %dS )c              3   P   K   | ] }                     j        |          V  !d S r   r  r  s     r   r   z+closure_glyphs.<locals>.<genexpr>.<genexpr>  r  r   Nr  r  s     @r   r   z!closure_glyphs.<locals>.<genexpr>  r  r   r   c              3   T   K   | ]"}|d uo|                     j                  V  #d S r   rC   r   rR  rk   s     r   r   z!closure_glyphs.<locals>.<genexpr>  s:      UUq1D=:Q[[%:%:UUUUUUr   r   )r  r   r;   r@   r   r  r   r~  r  r|  r{   zipr  r?   r<  SequenceIndex	frozensetr$   rG  table
LookupListLookupLookupListIndexaddr1  rh   ranger4   rl   rc  rY   )r#   rk   rg   r5   r  rssrssCountr/   r   chaosllseqi
pos_glyphslookuprc  input_coveragesr   s    `              @r   rl   rl     s[   &&((Ajj((44G 	D!!22:>>J{ammD))dAI&&400 	D 	DAH}}CF}SVQV,, D D      %(ajjmm%D%D      !!Q^44 D DB ! +Du}}%)

199)2AJJt4D4D4KA4N3O)P)PJJ)2AGD1H4E3F)G)GJW/6r7IJFIIdOOO//11 DU4QW1A%B%BCCC))!
)CCCC!DD	D 	D: 
		4,,$$Z00mmD))dAI&&400 "	D "	DAH}}CF}SVQV,, D D      %(ajjmm%D%D      !!Q^44 D DB ! +Du}}%)

199)2 ( 8 8Q G G* *JJ *3 ( 8 8$%Hga.A.A$(.K!" !"* *J
 W/6r7IJFIIdOOO//11 PU4WQ5H5H1I1IA1M%N%NOOO))!
)CCCC-DD"	D "	DF 
		UUUUAJJtDTDTUUUUU 	I!!QW--!Q^,, 	< 	<B #Du}}!

199!*:!6!6JJ!*'->>qxHH" "J W'.r/ABFIIdOOO'')) DU4_)=)=)ABBCCC!!!
!;;;;%	< 	<( 	5&4444r   c                 p  	
 |                                  | j        dk    rJ| j                            j                  t          | j                  	t          | j                  
	
fdD             		D ]b}|st          |j                  }fd|D             }t          |j        |           t          |j
        t          |                     cfdt          	          D             | j                                       t          	          	t          | j        	           t          | j        t          	                     t          	          S | j        dk    r| j                            j                  sdS                     |           }fd|D             j                 t          | j                  	t          | j                  
	
fdD             	
t          | j                                      | j        j                  fd	t          	          D             		D ]}|st          |j                  }fd
|D             }t          |j        |           t          |j
        t          |                     |D ]C}                    |d t+                              |                    D                        Dfd	D             		r	d         	d= 	r	d         t          | j        	           t          | j        t          	                     t          	          S | j        dk    r.t/          fd                    |           D                       S J d| j        z              )Nr   c                 ,    g | ]}|k     |         S r   r   r   r/   r  r  s     r   r2   z!subset_glyphs.<locals>.<listcomp>  "    777!!h,,s1v,,,r   c                 t    g | ]4}|t          fd                     |          D                       2|5S )c              3   N   K   | ]}t          fd |D                       V   dS )c              3   *   K   | ]}|j         v V  d S r   rG   r   r   rk   s     r   r   z5subset_glyphs.<locals>.<listcomp>.<genexpr>.<genexpr>  s)      99aAM999999r   Nr  )r   glistrk   s     r   r   z+subset_glyphs.<locals>.<listcomp>.<genexpr>  s@      UUe9999599999UUUUUUr   )r{   r  )r   r   r   rk   s     r   r2   z!subset_glyphs.<locals>.<listcomp>  sa        UUUUqzzRS}}UUUUU	  r   c                 H    g | ]\  }}|t          |j                  |S r   r   r|  )r   r/   rsr   s      r   r2   z!subset_glyphs.<locals>.<listcomp>   s3    OOOBBO72qv;N;NO1OOOr   r   Fc                 P    g | ]"}|r|                     j        d           nd#S )Tr   Nr   r  s     r   r2   z!subset_glyphs.<locals>.<listcomp>*  sB     
 
 
>?a9AHHQXTH***T
 
 
r   c                 ,    g | ]}|k     |         S r   r   r  s     r   r2   z!subset_glyphs.<locals>.<listcomp>2  r  r   c                 &    g | ]\  }}|v r|nd S r   r   )r   r/   r  r5   s      r   r2   z!subset_glyphs.<locals>.<listcomp>6  s)    JJJCa7llssJJJr   c                     g | ]@}|t          d  t                              |                    D                       >|AS )c              3   T   K   | ]"\  }t          fd |D                       V  #dS )c              3       K   | ]}|v V  	d S r   r   r   r  	klass_maps     r   r   z5subset_glyphs.<locals>.<listcomp>.<genexpr>.<genexpr>A  s'      661Y666666r   Nr  r   r  r  s     @r   r   z+subset_glyphs.<locals>.<listcomp>.<genexpr>@  sX        (	5 666666666     r   )r{   r  r  )r   r   r   
klass_mapss     r   r2   z!subset_glyphs.<locals>.<listcomp><  ss          ,/
AJJqMM,J,J    	  r   c                 2    g | ]\  }fd |D             S )c                 :    g | ]}                     |          S r   rb   r  s     r   r2   z,subset_glyphs.<locals>.<listcomp>.<listcomp>M  s%    ;;;++;;;r   r   r  s     @r   r2   z!subset_glyphs.<locals>.<listcomp>L  sA       ,Iu <;;;U;;;  r   c                 F    g | ]}|rt          |j                  r|nd S r   r  )r   r  r   s     r   r2   z!subset_glyphs.<locals>.<listcomp>S  s3    HHHbR9GB//9rrTHHHr   r   c              3   T   K   | ]"}|d uo|                     j                  V  #d S r   r   r  s     r   r   z subset_glyphs.<locals>.<genexpr>`  s:      RRA1D=7QXXah%7%7RRRRRRr   r   r   )r  r   r   rD   r$   r   r~  r  r|  r   r}  r4   r9   rJ   r6   rq   r  r  rc  r;   rU  r  r  r{   )r#   rk   r  ssr  r   r   r5   r  r  r  s    `    @@@@@r   rs   rs     s<    	&&((A{a-&&qx00dAI&&40077777w777 	. 	.B QV$$B      B B###BSWW----OOOO)C..OOOG$$$3((ai%%%anc#hh///Cyy			}##AH-- 	5mmD))
 
 
 
CN
 
 


 Q_-dAI&&40077777w777$
++55dm6JKKJJJJ9S>>JJJ 	 	B QV$$B      B B###BSWW---    03J

10N0N      IHHHCHHH 	c"goB  	c"goai%%%anc#hh/// Cyy			RRRRDAQAQRRRRRR4&4444r   c                    |                                  }| j        dv rt          | |j                  D ]}|st          ||j                  D ]t}|st          ||j        fdt          ||j                  D                        t          ||j                  D ]$}|s                    |j                  |_        %ud S | j        dk    rqt          | |j        fdt          | |j                  D                        t          | |j                  D ]$}|s                    |j                  |_        %d S J d| j        z              )Nr   c                 *    g | ]}|r|j         v |S r   r  r   r  r*  s     r   r2   z"subset_lookups.<locals>.<listcomp>x  s;        #%"4"F"F "F"F"Fr   r   c                 *    g | ]}|r|j         v |S r   r  r  s     r   r2   z"subset_lookups.<locals>.<listcomp>  s;        ,>> >>>r   r   r   )	r  r   r   r~  r|  r   r<  rc   r  )r#   r*  r   r  r   r  s    `    r   r+  r+  e  s    	&&((A{f$	** 	R 	RB R(( R R N   ")!Q^"<"<     "!Q^44 R RB ! )7)=)=b>P)Q)QB&&RR	R 	R& 
		N   !$77  	
 	
 	
 $// 	J 	JB !/!5!5b6H!I!IB	J 	J
 	5&4444r   c                     |                                  | j        dv r!fdt          | j                  D             S | j        dk    rd t          | j                  D             S J d| j        z              )Nr   c                     g | ]?}|t          |j                  D ]%}|t          |j                  D ]}||j        &@S r   )r   r|  r<  r  )r   r  r   r  r   s       r   r2   z#collect_lookups.<locals>.<listcomp>  s     
 
 

 R((	
 
 
 a00
 
 

 
 
 
 
r   r   c                      g | ]}||j         S r   r  )r   r  s     r   r2   z#collect_lookups.<locals>.<listcomp>  s     QQQrbQ"QQQr   r   r   )r  r   r   r~  r<  )r#   r   s    @r   r-  r-    s     	&&((A{f
 
 
 
dAI..
 
 
 	
 
		QQWT1>-J-JQQQQ4&4444r   c                 v    | j         dk    r| j                            ||           d S J d| j         z              Nr   r   r   )r   ExtSubTablerl   rj   s      r   rl   rl     sD    {a'':666664&4444r   c                 n    | j         dk    r| j                                        S J d| j         z              r  )r   r  r1  r   s    r   r1  r1    s:    {a113334&4444r   c                 p    | j         dk    r| j                            |          S J d| j         z              r  )r   r  rs   rr   s     r   rs   rs     s<    {a--a0004&4444r   c                 r    | j         dk    r| j                            ||          S J d| j         z              r  )r   r  r   r/  s      r   r   r     s>    {a11$@@@4&4444r   c                 p    | j         dk    r| j                            |          S J d| j         z              r  )r   r  r+  r)  s     r   r+  r+    s<    {a..~>>>4&4444r   c                 n    | j         dk    r| j                                        S J d| j         z              r  )r   r  r-  r   s    r   r-  r-    s:    {a//1114&4444r   c                    |t          |j                  }t          |           }|j        }|                    |d          \  }}|t          |j                  k    r*t          |j                  t                      fx\  }}||<   |                    |          rd S |                    |           | j	        D ]}|s|
                    ||           d S )Nr   )r  r$   id_doneLookupsgetr4   r?   issubsetrh   SubTablerl   )r#   rk   rg   keydoneLookupsr0   coveredsts           r   rl   rl     s    qx((
 T((C.K __S)44NE7AH-0]]CEE,BBwS)7## NN:m ) ) 	
!Z(((() )r   c                 P   fd| j         D             | _         t          | j                   | _        t          | d          rQ| j        J| j        j        vrd | _        | xj        dz  c_        n$j                            | j                  | _        t          | j                  S )Nc                 B    g | ]}||                               |S r   rs   )r   r  rk   s     r   r2   z!subset_glyphs.<locals>.<listcomp>  s1    NNNB2N":J:J1:M:MNRNNNr   MarkFilteringSeti)	r  r4   SubTableCountr  r  used_mark_sets
LookupFlagrc   rq   rr   s    `r   rs   rs     s    NNNN$-NNNDMT]++Dt'(( RT-B-N (888$(D!OOu$OOO$%$4$:$:4;P$Q$QD!"###r   c                 T    d}| j         D ]}|s|                    ||          rd}|S NFT)r  r   )r#   r%   r   retr  s        r   r   r     sF    
Cm   	g.. 	CJr   c                 D    | j         D ]}|                    |           d S r   )r  r+  )r#   r*  rk   s      r   r+  r+  
  s4    ] ) )	(((() )r   c                 @    t          d | j        D             g           S )Nc              3   B   K   | ]}||                                 V  d S r   )r-  r   r  s     r   r   z"collect_lookups.<locals>.<genexpr>  s3      CCC""$$CCCCCCr   )sumr  r   s    r   r-  r-    s#    CCt}CCCRHHHr   c                 >    t          d | j        D                       S )Nc              3   B   K   | ]}||                                 V  d S r   )r1  r  s     r   r   z$may_have_non_1to1.<locals>.<genexpr>  s3      DD"Dr##%%DDDDDDr   )rS   r  r   s    r   r1  r1    s!    DDDDDDDDr   c                 D    fdt          | j                  D             S )z(Returns the indices of nonempty lookups.c                 H    g | ]\  }}||                               |S r   r  )r   r/   r1   rk   s      r   r2   z!subset_glyphs.<locals>.<listcomp>  s3    MMM$!QAM!//!:L:LMAMMMr   )r9   r  rr   s    `r   rs   rs     s*     NMMM)DK00MMMMr   c                 T    d}| j         D ]}|s|                    ||          rd}|S r  )r  r   )r#   r%   r   r   r1   s        r   r   r      sF    
C[   	tW-- 	CJr   c                                                          fd|D              _        t           j                   _         j        D ]}|                    |           d S )Nc                 @    g | ]}|j         k     j        |         S r   )LookupCountr  rH   s     r   r2   z"subset_lookups.<locals>.<listcomp>.  s,    RRRaQAQ=Q=Q4;q>=Q=Q=Qr   )ensureDecompiledr  r4   r  r+  )r#   r*  r1   s   `  r   r+  r+  +  st    RRRR>RRRDK4;''D[ ) )	(((() )r   c                 z    |                                   fdt          | j                  D             | _        dS )+Sets lookups not in lookup_indices to None.c                 &    g | ]\  }}|v r|nd S r   r   )r   r/   r1   r*  s      r   r2   z"neuter_lookups.<locals>.<listcomp>8  s8       /3q!Q.  d  r   N)r  r9   r  r)  s    `r   neuter_lookupsr  4  sO     	   7@7M7M  DKKKr   c                      t                    }	 t           fd|D             g           } fd|D             }|st                    S t          |          }                    |           |}c)zBReturns sorted index of all lookups reachable from lookup_indices.Tc              3   l   K   | ].}|j         k     j        |                                         V  /d S r   )r  r  r-  rH   s     r   r   z"closure_lookups.<locals>.<genexpr>D  sB      WW!!dFVBVBVT[^++--BVBVBVBVWWr   c                 2    g | ]}|v|j         k     |S r   )r  )r   r1   r*  r#   s     r   r2   z#closure_lookups.<locals>.<listcomp>G  s;     
 
 
&&1t/?+?+? +?+?+?r   )r   r  extend)r#   r*  recurserecurse_lookupss   ``  r   closure_lookupsr  =  s      //NG"WWWWwWWW
 

 
 
 
 
$
 
 

  	.n---$_55o...!"r   c                     fd| j         D             | _         fd| j         D             | _         t          | j                   | _        | j        pt          | j        t
          j                  S )z2 "Returns True if feature is non-empty afterwards.c                     g | ]}|v |	S r   r   r   r1   r*  s     r   r2   z"subset_lookups.<locals>.<listcomp>V  s#    SSS!qN?R?RA?R?R?Rr   c                 :    g | ]}                     |          S r   rb   r  s     r   r2   z"subset_lookups.<locals>.<listcomp>X  s'    RRRN0033RRRr   )r  r4   r  
isinstanceFeatureParamsr   FeatureParamsSizer)  s    `r   r+  r+  S  s     TSSSt';SSSDRRRRT=QRRRD4/00D  zH6    r   c                 D    fdt          | j                  D             S ))Returns the indices of nonempty features.c                 d    g | ],\  }}|j                                       s|j        d k    *|-S )pref)Featurer+  
FeatureTag)r   r/   fr*  s      r   r2   z"subset_lookups.<locals>.<listcomp>i  sN       AqI$$^44 9:8N8N 	
8N8N8Nr   )r9   FeatureRecordr)  s    `r   r+  r+  b  s9       d011   r   c                 <     t           fd|D             g           S )Nc              3   \   K   | ]&}|j         k     j        |         j        j        V  'd S r   )FeatureCountr(  r%  r  rH   s     r   r   z"collect_lookups.<locals>.<genexpr>s  sK       	
 	
4$$$ q!)9$$$$	
 	
r   )r  r#   feature_indicess   ` r   r-  r-  p  s@    	
 	
 	
 	
$	
 	
 	

 	  r   c                     |                                   t          | j        |          | _        t          | j                  | _        t          | j                  S r   )r  r6   r(  r4   r+  rq   r,  s     r   subset_featuresr/  |  sM    %d&8/JJDD.//D!"""r   c                 *    fd| j         D             S )r"  c                 R    g | ]#}|j                                       |j        $S r   )r%  r+  FeatureIndex)r   r   r*  s     r   r2   z"subset_lookups.<locals>.<listcomp>  sA       9##N33	  r   )SubstitutionRecordr)  s    `r   r+  r+    s1       (   r   c                 F    t          fd| j        D             g           S )r"  c              3   L   K   | ]}|j                                       V  d S r   )FeatureTableSubstitutionr+  )r   r'  r*  s     r   r   z!subset_lookups.<locals>.<genexpr>  sH       	
 	
 &55nEE	
 	
 	
 	
 	
 	
r   r  FeatureVariationRecordr)  s    `r   r+  r+    sE     	
 	
 	
 	
0	
 	
 	
 	  r   c                 F    t          fd| j        D             g           S )Nc              3   `   K   | ](}|j         j        D ]}|j        v |j        j        V  )d S r   )r6  r3  r2  r%  r  )r   vrr   r-  s      r   r   z"collect_lookups.<locals>.<genexpr>  s^       	
 	
0C	
 	
 ~00 I% 10000		
 	
r   r7  r,  s    `r   r-  r-    sC    	
 	
 	
 	
1	
 	
 	
 	  r   c                    |                                   fd| j        D             | _        | j        D ]!}                    |j                  |_        "t	          | j                  | _        t          | j                  S )Nc                 &    g | ]}|j         v |S r   )r2  )r   r   r-  s     r   r2   z#subset_features.<locals>.<listcomp>  s,       an.O.O.O.O.Or   )r  r3  rc   r2  r4   SubstitutionCountrq   r#   r-  r   s    ` r   r/  r/    s       *  D $ ? ?(..q~>> !899D&'''r   c                 v   |                                   | j        D ]}|j                            |           | j        rN| j        d         j        j        s7| j                                         | j        r| j        d         j        j        7t          | j                  | _        t          | j                  S )Nr  )	r  r8  r6  r/  r>  popr4   FeatureVariationCountrq   r?  s      r   r/  r/    s    ( D D	"22?CCCC 	#*+

"#4	* 	#''))) 	#*+

"#4	* "%T%@!A!AD*+++r   c                 4   | j         v r                     | j                   | _         nd| _         fd| j        D             | _        fd| j        D             | _        t          | j                  | _        t          | j        p
| j         dk              S )N  c                     g | ]}|v |	S r   r   r   r'  r-  s     r   r2   z#subset_features.<locals>.<listcomp>  s#    NNNqo9M9M9M9M9Mr   c                 B    g | ]}|v                      |          S r   rb   rF  s     r   r2   z#subset_features.<locals>.<listcomp>  s8       %&qO?S?Sa  ?S?S?Sr   )ReqFeatureIndexrc   r2  r4   r+  rq   r,  s    `r   r/  r/    s    ...44T5IJJ$NNNND$5NNND   *.*;  D D-..D!BT%9U%BCCCr   c                     | j         d d          }| j        dk    r|                    | j                   t          |          S NrD  )r2  rH  appendr   r,  s     r   collect_featuresrL    sF    '*Ou$$t3444o&&&r   c                     | j         r#| j                                       s	|sd | _         fd| j        D             | _        t          | j                  | _        t          | j        p| j                   S )Nc                 H    g | ]}|j                                       |S r   )LangSysr/  )r   r1   r-  s     r   r2   z#subset_features.<locals>.<listcomp>  s>       )B)B?)S)S	  r   )DefaultLangSysr/  LangSysRecordr4   LangSysCountrq   )r#   r-  keepEmptyDefaultLangSyss    ` r   r/  r/    s     	##33ODD# (#
 #   %  D D.//D!8T%8999r   c                     d | j         D             }| j        r,|                    | j                                                   t	          t          |g                     S )Nc                 @    g | ]}|j                                         S r   )rO  rL  )r   r1   s     r   r2   z$collect_features.<locals>.<listcomp>  s&    PPPqy1133PPPr   )rQ  rP  rK  rL  r   r  r,  s     r   rL  rL    s_    PPT=OPPPO Gt2CCEEFFFc/2..///r   c                     fd| j         D             | _         t          | j                   | _        t          | j                  S )Nc                 `    g | ]*}|j                             |j        d k              s(|+S )DFLT)Scriptr/  	ScriptTag)r   rk   r-  retain_emptys     r   r2   z#subset_features.<locals>.<listcomp>  sR       8##OQ[F5JKK 		  r   )ScriptRecordr4   ScriptCountrq   )r#   r-  r[  s    ``r   r/  r/    s]        "  D 4,--D !!!r   c                 Z    t          t          d | j        D             g                     S )Nc              3   H   K   | ]}|j                                         V  d S r   )rY  rL  r   rk   s     r   r   z#collect_features.<locals>.<genexpr>  s0      RR1184466RRRRRRr   )r   r  r\  r   s    r   rL  rL    s-    cRR@QRRRTVWWXXXr   EBLCc                     | j         D ]:}|j        D ]}fd|j        D             |_        d |j        D             |_        ;d | j         D             | _         dS )Nc                 &    g | ]}|j         v |S r   rG   )r   nrk   s     r   r2   z!subset_glyphs.<locals>.<listcomp>  s     "S"S"SQ!(]]1]]]r   c                      g | ]}|j         	|S r   )names)r   r/   s     r   r2   z!subset_glyphs.<locals>.<listcomp>  s     M M MqQW M M M Mr   c                      g | ]}|j         	|S r   )indexSubTablesr`  s     r   r2   z!subset_glyphs.<locals>.<listcomp>  s     @@@!q/?@A@@@r   T)strikesrh  rf  )r#   rk   strikeindexSubTables    `  r   rs   rs     s    , N N#2 	T 	TM"S"S"S"Sm.A"S"S"SM M MF,A M M M@@t|@@@DL4r   EBDTc                 P    fd| j         D             }d |D             | _         dS )Nc                 8    g | ]fd j         D             S )c                 *    i | ]}|v ||         S r   r   r   r   rj  s     r   r+   z,subset_glyphs.<locals>.<listcomp>.<dictcomp>  s$    777!1;;F1I;;;r   rG   )r   rj  rk   s    @r   r2   z!subset_glyphs.<locals>.<listcomp>  s>       <B7777qx777  r   c                     g | ]}||S r   r   )r   rj  s     r   r2   z!subset_glyphs.<locals>.<listcomp>  s    AAA&&AvAAAr   T)
strikeData)r#   rk   rr  s    ` r   rs   rs     sJ       FJo  J
 BAJAAADO4r   sbixc                 p    | j                                         D ]fd|j        D             _        dS )Nc                 >    i | ]}|j         v |j         |         S r   rG   rp  s     r   r+   z!subset_glyphs.<locals>.<dictcomp>!  s.    UUU!v}BTBTFM!,BTBTBTr   T)ri  r^   r$   )r#   rk   rj  s     @r   rs   rs     sF    ,%%'' V VUUUUahUUU4r   GSUBc                    | j         |_         | j         j        r| j         j                                        }ng }| j         j        r | j         j                            |          }ng }t          | j         dd           r"|| j         j                            |          z  }t          |          }| j         j        ri |_	        	 t          |j                  }|D ]Z}|| j         j        j        k    r| j         j        j        |         s0| j         j        j        |                             |           [||j        k    rn~|`	|` d S )NFeatureVariations)r  
ScriptListrL  FeatureListr-  r   rx  r   r  r  r  r$   r  r  rl   )r#   rk   r-  r*  orig_glyphsr/   s         r   rl   rl   &  sS   jAGz */@@BBz /??PPtz.55 X$*6FFWWW//Nz 		#AH--K# B B
-999z,3A6 
%,Q/>>qAAAAah&&		 N	r   GPOSc                     |j         |_        | j        j        r | j        j                            |          }ng }|                     |           dS r   )glyphs_gsubedr$   r  r  rs   r+  )r#   rk   r*  s      r   rs   rs   D  sP    AHz .<<Q??'''4r   c                 <    | j         t          j        d          k    S )Nrv  )r  r   getTableClassr   s    r   retain_empty_scriptsr  O  s     >U08888r   c                    | j         j        r| j         j                            |           | j         j        r | j         j                            |          }ng }t	          | j         dd          r"|| j         j                            |          z  }t          |          }| j         j        r| j         j                            |           t	          | j         dd          r| j         j                            |           | j         j        r4| j         j                            || 	                                           dS dS )zZRetains specified lookups, then removes empty features, language
    systems, and scripts.rx  N)
r  r  r+  rz  r   rx  r   r/  ry  r  )r#   r*  r-  s      r   r+  r+  V  s?    z =
,,^<<<z *0??OOtz.55 W4:7FF~VVV 11Oz @
..???tz.55 F
$44_EEEz 

--T6688	
 	
 	
 	
 	

 
r   c                 `    | j         j        r!| j         j                            |           dS dS )r  N)r  r  r  r)  s     r   r  r  m  s:     z =
,,^<<<<<= =r   c                    | j         j        r| j         j                                        }ng }| j         j        r | j         j                            |          }ng }t          | j         dd          r"|| j         j                            |          z  }t          |          }| j         j        r | j         j        	                    |          }ng }|r| 
                    |           dS |                     |           dS )z/Remove (default) or neuter unreferenced lookupsrx  N)r  ry  rL  rz  r-  r   rx  r   r  r  r+  r  )r#   rJ   r-  r*  s       r   prune_lookupsr  t  s    z */@@BBz /??PPtz.55 X$*6FFWWW//Nz .>>~NN ,N+++++N+++++r   c                    | j         j        rfdt          | j         j        j                  D             }| j         j                            |           t          | j         dd           r| j         j                            |           ng }| j         j        r4| j         j                            ||                                            d S d S )Nc                 ,    g | ]\  }}|j         v |S r   )r&  )r   r/   r'  feature_tagss      r   r2   z'subset_feature_tags.<locals>.<listcomp>  s4     
 
 
1||++ +++r   rx  )	r  rz  r9   r(  r/  r   rx  ry  r  )r#   r  r-  s    ` r   subset_feature_tagsr    s    z 

 
 
 
!$*"8"FGG
 
 

 	
..???4:2D99 	JJ(88IIIz 

--T6688	
 	
 	
 	
 	

 
r   c                 >   i t                      |D ]}d|v r|                    d          n|df\  }}                    |                    d                                         |t                                                    |                    d                     | j        j        rfd| j        j        j        D             | j        j        _        t          | j        j        j                  | j        j        _	        | j        j        j        D ]}j
        v rpdj
                 vrafdj        j        D             j        _        t          j        j                  j        _        dj
                 vrd j        _        |d S d S )N.r      c                 &    g | ]}|j         v |S r   )rZ  )r   rk   script_tagss     r   r2   z&subset_script_tags.<locals>.<listcomp>  s,     .
 .
 .
Q[K=W=WA=W=W=Wr   z*   c                 <    g | ]}|j         j                 v |S r   )
LangSysTagrZ  )r   r1   langsysrecords     r   r2   z&subset_script_tags.<locals>.<listcomp>  s8     / / /|wv/?'@@@ @@@r   dflt)r?   splitr  ljust
setdefaultr  ry  r\  r4   r]  rZ  rY  rQ  rR  rP  )r#   tagstag
script_taglang_tagr  r  r  s        @@@r   subset_script_tagsr    s   G%%K E E14syy~~~#s
H
((++,,,:suu--11(..2C2CDDDDz 8.
 .
 .
 .
z,9.
 .
 .

* -0
0E0R,S,S
)j+8 		8 		8F7**vWVEU=V/V/V/ / / / /#]8/ / /+
 .11L-M-M*)9!:::37FM08 8		8 		8r   c                    | j         j        r| j         j                                        }ng }| j         j        r| j         j                            |           t          | j         dd          r| j         j                            |           | j         j        r4| j         j                            ||                                            dS dS )zRemove unreferenced featuresrx  N)r  ry  rL  rz  r/  r   rx  r  r,  s     r   prune_featuresr    s     z */@@BBz @
..???tz.55 F
$44_EEEz 

--T6688	
 	
 	
 	
 	

 
r   c                     d|j         vr|                     |j                    d|j        vr|                     |j                   |                     d           dS )Nr   Fr   T)layout_scriptsr  layout_featuresr  r  r/  s      r   prune_pre_subsetr    sj     '((( 6777
')))  !8999U###4r   c                 z   | j         }|j        r|j        sd S |j        j        }|j        j        D ]	}|j        j        }|s|j        j        d d          D ]}|j        }t          |j
                  t          |j
                  k    r4|j        dk    |j        dk    k    rM|j        dk    r||j                 ||j                 k    rut          t          |j
                            D ],}||j
        |                  ||j
        |                  k    r n -|j        j                            |           d S rJ  )r  ry  rz  r(  r\  rY  rP  rQ  rO  r4   r2  rH  r  remove)r#   r  featuresrk   r*   lrr1   r/   s           r   remove_redundant_langsysr    sb   JE 5#4  .H* 2 2H# 	((+ 	2 	2B
A1>""c!.&9&999!U*0AU0JKK E))A-.(1;L2MMM3q~..// 2 2AN1-.(1>!;L2MMME N &--b111#	2	2 2r   c                    | j         }|                                  |j        r|j                            ||           |j        sd |_        |j        r(|                                  |                                  t          |d          r:|j        r|j        r|j        j	        sd |_        |j        s|j
        dk    rd|_
        dS )Nrx  i     T)r  r  r  r   rz  r  r  r  rx  r8  Versionr#   r%   r   r  s       r   r   r     s    JE :**4999  !  %%''' u)** 	'" 	+	+"'"9"P	+ '+E# & 	'5=J+F+F&EM4r   GDEFc                    |j         | j        j        rfj        j                                      }t          j        j        |          j        _        t          j        j                  j        _        j	        r4fdj	        j
                                        D             j	        _
        j        r4fdj        j
                                        D             j        _
        j        rgj        j                                      }j        j        fd|D             j        _        t          j        j                  j        _        t!          d          rhj        raj        }|j        D ]}|r|                               d t%          |j                  D             |_        d |j        D             |_        dS )Nc                 $    i | ]\  }}|v 	||S r   r   rQ   s      r   r+   z!subset_glyphs.<locals>.<dictcomp>/  s,     .
 .
 .
Q1PV;;Aq;;;r   c                 $    i | ]\  }}|v 	||S r   r   rQ   s      r   r+   z!subset_glyphs.<locals>.<dictcomp>3  s+     )
 )
 )
Qa6kkAqkkkr   c                 @    g | ]}|k     j         j        |         S r   )
AttachListAttachPoint)r   r/   r   r  s     r   r2   z!subset_glyphs.<locals>.<listcomp>9  s0     (
 (
 (
01JE(+r   MarkGlyphSetsDefc                 &    g | ]\  }}|j         |S r   rG   r   s      r   r2   z!subset_glyphs.<locals>.<listcomp>C  s#    XXX$!QqxXAXXXr   c                      g | ]}|j         	|S r   rG   )r   r   s     r   r2   z!subset_glyphs.<locals>.<listcomp>D  s    !P!P!Pqx!P!!P!P!Pr   T)r~  r  LigCaretListr   rD   r6   r   r4   LigGlyphCountMarkAttachClassDefrN   rT   GlyphClassDefr  r   r  r  r  r9   r  )r#   rk   r5   markGlyphSetscoverager   r$   r  s        @@@r   rs   rs   &  s   _FJE L$-44V<<&253E3NPW&X&X#+.u/A/J+K+K( 
.
 .
 .
 .
"5?EEGG.
 .
 .
 *  
)
 )
 )
 )
"0:@@BB)
 )
 )
%  H"+226::%0
(
 (
 (
 (
 (
5<(
 (
 (
$ '*%*:*F&G&G#u()) Qe.D Q.%. 	( 	(H ('''XX)M4J*K*KXXX!P!P]-C!P!P!P4r   c                    d| vrd S | d         }|j         }t          |d          sd S |j        }t                      }|                    |           d| v r | d         j                             |           |                    |          }|                    |           d| v r"| d         j                             |           d S d S )Nr  VarStorer|  )r  r  r  r?   collect_device_varidxessubset_varidxesremap_device_varidxes)r%   gdefr  storeusedVarIdxes
varidx_maps         r   
_pruneGDEFr  I  s    T<DJE5*%% NE55L 
!!,///~~V22<@@@ &&|44J 

+++~~V00<<<<< ~r   c                 t   | j         }|j        r|j        j        sd |_        |j        r|j        j        sd |_        |j        r|j        j        sd |_        |j        r|j        j        sd |_        t          |d          r1t          |           |j
        j        dk    r|j        dk    rd|_        t          |d          r|j        r|j        j        sd |_        |j        dk    rd|_        t          |j        p8|j        p1|j        p*|j        p#|j        dk    o|j        p|j        dk    o|j
                  S )Nr  r   i  i  r  r  )r  r  r  r  rN   r  r  r   r  r  r  VarDataCountr  r  r   rq   r  s       r   r   r   c  s   JE "%"4"B "! ((@(J (#'  #5#6#@ #"   0 ;  uj!! +4>&!++}
** *E-..'%' %.'
 "&=J&&&EM 	<#	<	< 	< MZ'BE,B		<
 MZ':EN  r   kernc                 V    d | j         D             | _         t          | j                   S )Nc                 2    g | ]}t          |d           |S 	kernTable)r  r   ts     r   r2   z$prune_pre_subset.<locals>.<listcomp>  s'    MMMQWQ5L5LMqMMMr   )
kernTablesrq   r/  s      r   r  r    s,     NM$/MMMDO   r   c                     |j         | j        D ],}fd|j                                        D             |_        -d | j        D             | _        t	          | j                  S )Nc                 6    i | ]\  \  }}}|v |v ||f|S r   r   )r   r  r  rR   r$   s       r   r+   z!subset_glyphs.<locals>.<dictcomp>  s@     
 
 
AF{{qF{{ FA*{{r   c                      g | ]}|j         	|S r   r  r  s     r   r2   z!subset_glyphs.<locals>.<listcomp>  s    AAAQQ[AqAAAr   )r~  r  r  rT   rq   )r#   rk   r  r$   s      @r   rs   rs     s    _F_ 
 

 
 
 
[..00
 
 

 BA$/AAADO   r   vmtxc                     t          | j        |j                  | _        |j        D ]}d| j        |<   t	          | j                  S )Nr   r   )r,   metricsr$   glyphs_emptiedrq   r#   rk   r   s      r   rs   rs     sF    ah77DL ! ! Qr   hmtxc                 l    t          | j        |j                  | _        |j        D ]}d| j        |<   dS )Nr  T)r,   r  r$   r  r  s      r   rs   rs     s;    ah77DL ! ! Q4r   hdmxc                     fd| j                                         D             | _         | j         D ]}j        D ]}d| j         |         |<   t          | j                   S )Nc                 B    i | ]\  }}|t          |j                  S r   )r,   r$   )r   szr1   rk   s      r   r+   z!subset_glyphs.<locals>.<dictcomp>  s+    NNN52q\!QX..NNNr   r   )r  rT   r  rq   )r#   rk   r  r   s    `  r   rs   rs     ss    NNNNDIOO<M<MNNNDIi ! !! 	! 	!A DIbM!	!	??r   ankrc                     | j         j        j        dk    sJ dj        z              fd|j        D             _        t          j                  dk    S )Nr   zunknown 'ankr' format %sc                 >    i | ]}|j         v |j         |         S r   )Anchorsr   ru   r  s     r   r+   z!subset_glyphs.<locals>.<dictcomp>  s5       (-Uem=S=Su}U#=S=S=Sr   )r  AnchorPointsr   r$   r  r4   r#   rk   r  s     @r   rs   rs     ss    J#E<185<G   12  EM u}!!r   bslnc                 r    | j         j        }|j        dv r!|j                            |j                   d S d S )N)r   r   )r  Baseliner   r$   r  StandardGlyphr  s      r   rl   rl     s>    JE|v	U())))) r   c                    | j         j        j        dv rfd|j        D             }t	          |          dk    rdt          |                                                              d          d         \  }_        fd|	                                D             }t	          |          dk    r|_
        ndddj                 _        `
dS )N)r   r   c                 R    i | ]#}|j                             |j                  $S r   )BaselineValuesr  DefaultBaseliner  s     r   r+   z!subset_glyphs.<locals>.<dictcomp>  sA     
 
 
 5'++E53HII
 
 
r   r   r   c                 (    i | ]\  }}|k    ||S r   r   )r   ru   r  
mostCommons      r   r+   z!subset_glyphs.<locals>.<dictcomp>  s$    WWWheQqJr   r   T)r  r  r   r$   r4   r   r^   most_commonr  rT   r  )r#   rk   	baselines_cntr  r  s       @@r   rs   rs     s    JE|v
 
 
 

 
 
	 y>>A&y'7'7'9'9::FFqII!LJ$.E!WWWW)//2C2CWWWIy>>A#,E   Q<<5EL$4r   lcarc                     | j         j        j        dv r0fd|j        D             _        t          j                  dk    S J dj        z              )N)r   r   c                 >    i | ]}|j         v |j         |         S r   )Caretsr  s     r   r+   z!subset_glyphs.<locals>.<dictcomp>  s5     
 
 
+0@U@UE5<&@U@U@Ur   r   Fzunknown 'lcar' format %s)r  LigatureCaretsr   r$   r  r4   r  s     @r   rs   rs     ss    J%E|v
 
 
 
45H
 
 
 5<  1$$?05<????r   gvarc                 L    |j         r|j        sg | j        |j        d         <   dS Nr   T)notdef_glyphnotdef_outline
variations
glyphOrderr/  s      r   r  r    s/     1G$: 1.0*+4r   c                     t          | j        |j                  | _        t          | j                  | _        t          | j                  S r   )r,   r  r$   r4   
glyphCountrq   rr   s     r   rs   rs     s8    "4?AH==DO$/**DO   r   c                     fd|j                                         D             }|j         | j                          }| j                                        D ]\  }}|| j        k    r|nd||<   |S )Nc                 (    i | ]\  }}||         S r   r   )r   r  rR   r  s      r   r+   z$_remap_index_map.<locals>.<dictcomp>  s#    CCCAAz!}CCCr   r   )ri   rT   last_retained_glyphreverseEmptiedGlyphMaplast_retained_order)rk   r  	table_mapmap_last_idxr   r/   s    `     r   _remap_index_mapr    s    CCCC):)@)@)B)BCCCD )+A,ABCH(..00 ? ?1!"777((QQKr   HVARc                 T   | j         }t                      }t                      }d}|j        r[t          |j        j        |j                  |j        _        |                    |j        j                                                   nL|                    |j                                                   |	                                }|j
        j        }|j        rZt          |j        j        |j                  |j        _        |                    |j        j                                                   |j        rZt          |j        j        |j                  |j        _        |                    |j        j                                                   |j                            |||          }|j        r t!          |||j                  |j        _        |j        r t!          |||j                  |j        _        |j        r t!          |||j                  |j        _        dS NF)retainFirstMapadvIdxesT)r  r?   AdvWidthMapr,   ri   r$   rh   r^   reverseOrigGlyphMapcopyr   retain_gidsLsbMapRsbMapr  r  r  r#   rk   r  used	advIdxes_retainAdvMapr  s          r   rs   rs     s   JE55DIL -$01B1JAH$U$U!E%-44667777A)0022333IIKK	y,| 3+EL,@!(KKEL(//11222| 3+EL,@!(KKEL(//11222//\I 0  J  W$4Q
EDU$V$V!| M/:u|LL| M/:u|LL 4r   VVARc                 d   | j         }t                      }t                      }d}|j        r[t          |j        j        |j                  |j        _        |                    |j        j                                                   nL|                    |j                                                   |	                                }|j
        j        }|j        rZt          |j        j        |j                  |j        _        |                    |j        j                                                   |j        rZt          |j        j        |j                  |j        _        |                    |j        j                                                   |j        rZt          |j        j        |j                  |j        _        |                    |j        j                                                   |j                            |||          }|j        r t#          |||j                  |j        _        |j        r t#          |||j                  |j        _        |j        r t#          |||j                  |j        _        |j        r t#          |||j                  |j        _        dS r  )r  r?   AdvHeightMapr,   ri   r$   rh   r^   r  r  r   r  TsbMapBsbMapVOrgMapr  r  r  r  s          r   rs   rs   #	  s:   JE55DIL -%1%2D2Lah%W%W"E&.55778888A)0022333IIKK	y,| 3+EL,@!(KKEL(//11222| 3+EL,@!(KKEL(//11222} 4 ,U]-BAH M MEM)0022333//\I 0  J  Y%5aUEW%X%X"| M/:u|LL| M/:u|LL} O 0J N N 4r   VORGc                     fd| j                                         D             | _         t          | j                   | _        dS )Nc                 .    i | ]\  }}|j         v ||S r   rG   ro   s      r   r+   z!subset_glyphs.<locals>.<dictcomp>P	  s-       AQX1r   T)VOriginRecordsrT   r4   numVertOriginYMetricsrr   s    `r   rs   rs   N	  sW       ,2244  D "%T%8!9!9D4r   opbdc                 ,   | j         j        j        dk    r0fd|j        D             _        t          j                  dk    S j        dk    r0fd|j        D             _        t          j                  dk    S J dj        z              )Nr   c                 >    i | ]}|j         v |j         |         S r   )OpticalBoundsDeltasr  s     r   r+   z!subset_glyphs.<locals>.<dictcomp>[	  ;     %
 %
 %
111 5,U3111r   r   c                 >    i | ]}|j         v |j         |         S r   )OpticalBoundsPointsr  s     r   r+   z!subset_glyphs.<locals>.<dictcomp>b	  r'  r   Fzunknown 'opbd' format %s)r  OpticalBoundsr   r$   r&  r4   r)  r  s     @r   rs   rs   W	  s    J$E|q%
 %
 %
 %
%
 %
 %
!
 5,--11			%
 %
 %
 %
%
 %
 %
!
 5,--11?05<????r   postc                 "    |j         sd| _        dS )N      @T)glyph_names
formatTyper/  s      r   r  r  l	  s     4r   c                     g | _         dS r   )
extraNamesrr   s     r   rs   rs   s	  s    DO4r   propc                    | j         j        j        dk    rj        dk    S j        dk    rfd|j        D             _        t          j                                                                      d          d         \  }_        fdj        	                                D             _        t          j                  dk    r`d_        j        dk    S dS J dj        z              )Nr   r   c                 R    i | ]#}|j                             |j                  $S r   )
Propertiesr  DefaultProperties)r   r   r2  s     r   r+   z!subset_glyphs.<locals>.<dictcomp>	  s=     
 
 
BCAt""1d&<==
 
 
r   c                 (    i | ]\  }}|k    ||S r   r   )r   r   r2  r  s      r   r+   z!subset_glyphs.<locals>.<dictcomp>	  s0     
 
 
4dj>P>PAt>P>P>Pr   TFzunknown 'prop' format %s)r  GlyphPropertiesr   r6  r$   r5  r   r^   r  rT   r4   )r#   rk   r  r  r2  s      @@r   rs   rs   y	  s#   :%D{a%**			
 
 
 
GHx
 
 
 #4?#9#9#;#;<<HHKKAN
D!+
 
 
 
#'?#8#8#:#:
 
 
 t1$$DK)Q..t>04;>>>>r   c                 Z    t                      fd}|                     ||           S )Nc                     | j         t          j        j        t          j        j        hv r                    | j                   d S d S r   )r   r   PaintFormat
PaintGlyphPaintColrGlyphr  Glyph)paintresults    r   callbackz$_paint_glyph_names.<locals>.callback	  sO    < + /
 
 
 JJu{#####	
 
r   )r?   traverse)r?  colrrA  r@  s      @r   _paint_glyph_namesrD  	  s@    UUF$ $ $ $ $ 
NN4"""Mr   COLRc                 4   | j         dk    r?|                     | j                  | _        d | j        j        j        D             | _        |j        }|rt                      }|D ]}| j        	                    |g           D ]}|
                    |j                   | j         dk    rD| j        	                    |          }|(|                    t          || j                             ||j        z  }|j                            |           |}|d S d S )Nr   c                 (    i | ]}|j         |j        S r   )	BaseGlyphPaint)r   r   s     r   r+   z"closure_glyphs.<locals>.<dictcomp>	  s.     
 
 
 M39
 
 
r   )version_decompileColorLayersV0r  ColorLayersBaseGlyphListBaseGlyphPaintRecordColorLayersV1r$   r?   r  r  r   rh   rD  )r#   rk   	decomposelayersr   layerr?  s          r   rl   rl   	  sB   |a
  77
CC
 
z/D
 
 

 I
  	I 	IA)--a44 ' '

5:&&&&|a*..q11$MM"4UDJ"G"GHHH!(		      r   c                 h    ddl m} ddlm}m} j        _         fdj        D              _         j        dk    rt           j                  S  | j
        j         j
        j                   |fdD                       \   j
        _         j
        _         ` j
        j        / j
        j        j        fdD              j
        j        _         j         j
        j        j        sd _         `
t                    S  | j
        fdD                         `dS )	Nr   )unbuildColrV1)buildColrV1populateCOLRv0c                 >    i | ]}|j         v |j         |         S r   )rL  rO   s     r   r+   z!subset_glyphs.<locals>.<dictcomp>	  s7       #$A9I4I4I4A4I4I4Ir   c                 4    i | ]}|j         v ||         S r   rG   )r   r   colorGlyphsV1rk   s     r   r+   z!subset_glyphs.<locals>.<dictcomp>	  s'    EEEqAH}}M!}}}r   c                 4    i | ]}|j         v ||         S r   rG   )r   r   clipsrk   s     r   r+   z!subset_glyphs.<locals>.<dictcomp>	  s&    $Q$Q$QQ1==Qa===r   c                 6    i | ]}|d  |         D             S )c                 *    g | ]}|j         |j        fS r   )r   colorID)r   rR  s     r   r2   z,subset_glyphs.<locals>.<dictcomp>.<listcomp>	  s!    BBBUej%-(BBBr   r   )r   r   layersV0s     r   r+   z!subset_glyphs.<locals>.<dictcomp>	  s.    UUUqBBhqkBBBUUUr   T)fontTools.colorLib.unbuilderrT  fontTools.colorLib.builderrU  rV  glyphs_colredr$   rL  rJ  rq   r  	LayerListrM  rO  ClipListr[  rN  )r#   rk   rT  rU  rV  r[  rY  r_  s   ``   @@@r   rs   rs   	  s   ::::::FFFFFFFF AH   ()  D |qD$%%%!M$*"6
8PQQM5@[EEEEEmEEE6 62DJ$*2 	z&
#)$Q$Q$Q$Q$Q%$Q$Q$Q
!H:#8 JH~~N
UUUUHUUU   	 4r   CPALc                    d|v rdS |                     d          }|sdS t          t                    fd}|j        dk    rB|j                                        D ]'}|D ]"}|j                                     |           #(nt|j        j	        r4|j        j	        j
        D ]"}|j                                     |           #|j        j        j        D ]"}|j                            |j        |           #t!                                                    dhz
  | j        D ]D}fdt'          |          D             |d d <   t)          |          t)                    k    sJ Et'          t+                              D ]N\  }	}
|
         D ]@}t-          |d	          r|	|_        t-          |d
          r|	|_        2t/          |          Ot)          | j        d                   | _        | j        dk    r<g }t'          | j                  D ]\  }}|v r|                    |           || _        t5          | j                  S )NzSVG TrE  Fc                     t          | d          r"| j                                     |            d S t          | d          r/| j        j        D ]$}|j                                     |           #d S d S )NPaletteIndex	ColorLine)r  rh  rK  ri  	ColorStop)r?  stopcolors_by_indexs     r   collect_colors_by_indexz2prune_post_subset.<locals>.collect_colors_by_index 
  s    5.)) 	@E./66u=====UK(( 	@1 @ @ 1299$????	@ 	@@ @r   r   rD  c                 "    g | ]\  }}|v 	|S r   r   )r   r/   r   retained_palette_indicess      r   r2   z%prune_post_subset.<locals>.<listcomp>
  s(    XXXDAq!?W:W:Wa:W:W:Wr   r^  rh  r   )r  r   r]   rJ  rL  r^   r^  rK  r  LayerRecordArrayLayerRecordrh  rM  rN  rI  rB  r?   keyspalettesr9   r4   r!   r  AssertionErrornumPaletteEntriespaletteEntryLabelsrq   )r#   r%   r   rC  rm  rQ  rR  r  palette	new_index	old_indexkept_labelsr/   labelrl  ro  s                 @@r   r   r   	  s    ~~t88FD u!$''O@ @ @ @ @ |q&--// 	= 	=F = =.55e<<<<=	= :& 	B4@ B B 23::5AAAAj.C 	G 	GFL!!$*.EFFFF  #?#7#7#9#9::fXE= = =XXXXIg$6$6XXX
7||s#;<<<<<<< )&1I*J*J K K - -	9%i0 	- 	-Fvy)) -!*00 -&/##$V,,,	- !q!122D|q!$"9:: 	* 	*HAu,,,""5)))"-&'''r   c                     t                      }| j        D ]}|                    |j                   | j        r)| j        j        D ]}|                    |j                   |S r   )r?   MathGlyphVariantRecordr  VariantGlyphGlyphAssemblyPartRecordsru   )r#   r$   variantsrR   r   s        r   rl   rl   -
  sp    uuH( % %Q^$$$$ "#/ 	" 	"ALL!!!!Or   c                    t          |j                  }t                      }| j        rR| j                            |          }|D ]5}|                    | j        |                             |                     6| j        rR| j                            |          }|D ]5}|                    | j	        |                             |                     6|j                            |           d S r   )
r  r$   r?   VertGlyphCoverager;   rh   VertGlyphConstructionrl   HorizGlyphCoverageHorizGlyphConstruction)r#   rk   r$   r  r5   r/   s         r   rl   rl   8
  s    qx  FuuH R(226:: 	R 	RAOOD6q9HHPPQQQQ S)33F;; 	S 	SAOOD7:II&QQRRRRHOOHr   VARCc                     | j         j                            |j                  }t	          | j         j        j        |          | j         j        _        t          | j         j        j                  S r   )r  r   rD   r$   r6   VarCompositeGlyphsVarCompositeGlyphrq   r   s      r   rs   rs   J
  sX    j!((22G6B
%77 7DJ!3 
-?@@@r   c                    | j         j        d S d t          | j         j        j                  D             }| j         j        j        }|j        }t                      }t          |          }|r}|}t                      }|D ]f}||v r|                    |          }	|	||	         }
|
j        D ]7}|j	        }|
                    |           ||vr|
                    |           8g|{d S d S )Nc                     i | ]\  }}||	S r   r   )r   r/   	glyphNames      r   r+   z"closure_glyphs.<locals>.<dictcomp>X
  s    WWWI	1WWWr   )r  r  r9   r   r$   r  r?   r  
componentsr  r  )r#   rk   glyphMapglyphRecordsr$   r  newoldNewr  idxru   compr   s                r   rl   rl   S
  s   z$,WW4:;N;U1V1VWWWH:0BLXFeeG
f++C
 "ee 	" 	"IG##,,y))C{ %E( " "~

4   w&&GGDMMM	"  " " " " "r   c                    | j         }|j        }|Mt                      }|                    |           |                    |          }|                    |           |j        j        }|t                      }|j        j	        D ]-}	|	j
        D ]#}
|
j        |                    |
j                   $.t          |          }t          ||          |j        _        d t          |          D             }|j        j	        D ]%}	|	j
        D ]}
|
j        ||
j                 |
_        &|j        }||j        }t                      }|j        j	        D ]-}	|	j
        D ]#}
|
j        |                    |
j                   $.t          |          }t          ||          |_        d t          |          D             }|j        j	        D ]%}	|	j
        D ]}
|
j        ||
j                 |
_        &dS )Nc                     i | ]\  }}||	S r   r   r   r  olds      r   r+   z%prune_post_subset.<locals>.<dictcomp>
      CCCS3CCCr   c                     i | ]\  }}||	S r   r   r  s      r   r+   z%prune_post_subset.<locals>.<dictcomp>
  r  r   T)r  MultiVarStorer?   collect_varidxesr  remap_varidxesAxisIndicesListItemr  r  r  axisIndicesIndexr  r!   r6   r9   ConditionListConditionTableconditionIndex)r#   r%   r   r  r  r  r  axisIndicesListusedIndicesru   r  ri   conditionListconditionTabless                 r   r   r   o
  sD   JEEuu|,,,**<88
Z(((+0O"ee-? 	; 	;E( ; ;(4OOD$9:::; [))%1/;%O%O"CCIk,B,BCCC-? 	K 	KE( K K(4,3D4I,JD)K 'M '6ee-? 	9 	9E( 9 9&2OOD$78889 [))'3O['Q'Q$CCIk,B,BCCC-? 	G 	GE( G G&2*1$2E*FD'G 4r   MATHc                 `    | j         j        r!| j         j                            |           d S d S r   )r  MathVariantsrl   rr   s     r   rl   rl   
  s8    z 2
..q111112 2r   c                     | j                             |j                  }t          | j        |          | _        t          | j                  | _        t          | j                  S r   )r   rD   r$   r6   ItalicsCorrectionr4   ItalicsCorrectionCountrq   r   s      r   rs   rs   
  sR    m""18,,G)$*@'JJD"%d&<"="=D+,,,r   c                     | j                             |j                  }t          | j        |          | _        t          | j                  | _        t          | j                  S r   )TopAccentCoveragerD   r$   r6   TopAccentAttachmentr4   TopAccentAttachmentCountrq   r   s      r   rs   rs   
  sS    $++AH55G+D,DgNND$'(@$A$AD!-...r   c                     | j                             |j                  }t          | j        |          | _        t          | j                  | _        t          | j                  S r   )MathKernCoveragerD   r$   r6   MathKernInfoRecordsr4   MathKernCountrq   r   s      r   rs   rs   
  sS    #**1844G+D,DgNNDT566D"###r   c                    | j         r| j                             |           | j        r| j                            |           | j        r| j                            |           | j        r| j                            |j                   dS r   )MathItalicsCorrectionInfors   MathTopAccentAttachmentMathKernInfoExtendedShapeCoveragerD   r$   rr   s     r   rs   rs   
  s    % 8&44Q777# 6$221555 +''***! 4"))!(3334r   c                 j   | j         rR| j                             |j                  }t          | j        |          | _        t          | j                  | _        | j        rR| j                            |j                  }t          | j        |          | _        t          | j                  | _	        dS r   )
r  rD   r$   r6   r  r4   VertGlyphCountr  r  HorizGlyphCountr   s      r   rs   rs   
  s     >(//99%1$2Lg%V%V"!$"<== @)00::&243NPW&X&X#"4#>??4r   c                     |j         |_        | j        j        r| j        j                            |           | j        j        r| j        j                            |           dS r   )glyphs_mathedr$   r  MathGlyphInfors   r  rr   s     r   rs   rs   
  s\    AHz 2
 ..q111z 1
--a0004r   glyfc                    | j         r,t          j        d| j         d d                   d         dk    rd S t          | j                   x}| _         d}d}|r||         dz  ||dz            z  }||dz            dz  ||dz            z  }||         }|dz	  ||dz   <   |dz  ||dz   <   |d	z  }t	          |          }|dz  r|d	z  }n|dz  }|dz  r|dz  }n|d
z  r|d	z  }n
|dz  r|dz  }|dz  }|d S d S )Nz>hr   r   
   r      r      r  @          )datastructunpack	bytearrayr   )r#   
glyphidmapr  r/   moreflagsglyphIDs          r   remapComponentsFastr  
  sa   9 dDIbqbM::1=BB +++D49
AD
 aAa!e,A;!#tAE{2W%lQUnQU	QE

6> 	FAAFA6> 	FAAV^ 	FAAV^ 	FAv~)      r   c                    | j         }|j         }|rwt                      }|D ]<}||vr||         }|                    |           D ]}|                    |           =||j         z  }|j                             |           |}|ud S d S r   )r$   r?   getComponentNamesr  rh   )r#   rk   glyphSetrP  r  r   glr   s           r   rl   rl   
  s    {HI
 
UU
 	" 	"A  !B))$// " "q!!!!"ah
	
###	  
 
 
 
 
r   c                     |j         r:|j        s3| | j        d                  }|j                                         d|_        dS )Nr   r   T)r  r  r  __dict__clearr  )r#   r%   r   r   s       r   r  r    sH     G$: #$	
4r   c                    t          | j        j                  | _        j        j        szfdt	          | j                  D             }d t	          |          D             }| j                                        D ]'}t          |d          r|                    |           (t          j
        d          j        }j        D ]&} |            | j        |<   d| j        |         _        'fd| j        D             | _        dS )Nc                 ,    g | ]\  }}|j         v |S r   rG   )r   r/   r   rk   s      r   r2   z!subset_glyphs.<locals>.<listcomp>  s$    MMMAqAH}}1}}}r   c                     i | ]\  }}||	S r   r   )r   rd  os      r   r+   z!subset_glyphs.<locals>.<dictcomp>  s    888TQAq888r   r  r  r   c                 8    g | ]}|j         v s	|j        v |S r   )r$   r  r  s     r   r2   z!subset_glyphs.<locals>.<listcomp>&  s7       a18mmqA<L7L7L7L7L7Lr   T)r,   r$   r   r  r9   r  r^   r  r  r   getTableModuler>  r  r  )r#   rk   r5   glyphmaprR   r>  r   s    `     r   rs   rs     s!   t{AH55DK9  0MMMM4?!;!;MMM88Yw%7%7888##%% 	0 	0Aq&!! 0%%h/// ((.E " "A!A   ?  DO 4r   c                 z    |j          }| j                                        D ]}|                    |           dS )N)remove_hintingT)r   r$   r^   trim)r#   r%   r   r  rR   s        r   r   r   -  sE     (N[!! . .	n----4r   cmapc                 X   d | j         D             }|D ]}|j        dk    rk|j                                        D ]P\  }|j        vrfdD             }d |v r|                    d            j                            |           Qx|j        j        	                    
                                          }j                            fd|D                        ҉j                                        _        |D ]!}j                            |j                   "d S )Nc                 :    g | ]}|                                 |S r   	isUnicoder  s     r   r2   z"closure_glyphs.<locals>.<listcomp>7  s%    666A6a666r      c                 ,    h | ]\  }}|j         v |S r   unicodes_requestedr   ur   rk   s      r   	<setcomp>z!closure_glyphs.<locals>.<setcomp>?  s*    JJJ1Q5I0I0I!0I0I0Ir   c              3   (   K   | ]}|         V  d S r   r   )r   r  r  s     r   r   z!closure_glyphs.<locals>.<genexpr>F  s'      ::DG::::::r   )tablesformatuvsDictrT   r  r  r$   rh   r  r   rr  r  unicodes_missingdifference_update)r#   rk   r  r  varSelectorr$   r   r  s    `     @r   rl   rl   5  s[   66666F  ; ;<2%*]%8%8%:%: ( (!Ta&:::JJJJJJJ6>>MM$'''''''( :D/<<TYY[[IILHOO::::\::::::: -2244A 9 9	,,UZ88889 9r   c                     |j         sd | j        D             | _        |j        sd | j        D             | _        d | j        D             | _        t          | j                  | _        dS )Nc                 b    g | ],}|                                 s|                                *|-S r   )r  isSymbolr  s     r   r2   z$prune_pre_subset.<locals>.<listcomp>R  s2    OOOQO!**,,OqOOOr   c                 :    g | ]}|                                 |S r   )r  r  s     r   r2   z$prune_pre_subset.<locals>.<listcomp>T  s%    BBBQQZZ\\BqBBBr   c                 (    g | ]}|j         d k    |S )r   )r  r  s     r   r2   z$prune_pre_subset.<locals>.<listcomp>W  s    ;;;QX]]1]]]r   T)legacy_cmapr  symbol_cmapr4   numSubTablesr/  s      r   r  r  N  sx     POO$+OOO CBB$+BBB <;dk;;;DKDK((D4r   c                    d _         g }i }i }| j        D ]\}|j        dk    r|j        dk    r
|||j        <   |j        dk    r|j        dk    r
|||j        <   |j        dk    rSfd|j                                        D             |_        d |j                                        D             |_        |                                r}fd|j	                                        D             |_	        |j        dk    rF|j	        r?t          |j	                                                  d	k     r|                    |           2fd
|j	                                        D             |_	        ^|D ]}|j        dk    rI|j        dk    r>|j        |v r5||j                 j	        |j	        k    r|j	                                         V|j        dk    rH|j        dk    r=|j        |v r4||j                 j	        |j	        k    r|j	                                         d | j        D             | _        t          | j                  | _        dS )Nr   r   r   r  c                 F    i | ]\  }}|j         v |fd |D             S )c                 B    g | ]\  }}|j         v s	|j        v ||fS r   glyphs_requestedr  r  s      r   r2   z,subset_glyphs.<locals>.<dictcomp>.<listcomp>o  sF       1A...!q7K2K2K F2K2K2Kr   r  )r   rR   r1   rk   s      r   r+   z!subset_glyphs.<locals>.<dictcomp>n  s_        Aq,,,      !   -,,r   c                     i | ]
\  }}|||S r   r   )r   rR   r1   s      r   r+   z!subset_glyphs.<locals>.<dictcomp>w  s#    AAA$!QqAAAAAr   c                 @    i | ]\  }}|j         v s	|j        v ||S r   r  r  s      r   r+   z!subset_glyphs.<locals>.<dictcomp>y  sD       Aq***a13G.G.G 1.G.G.Gr      r  c                 .    i | ]\  }}|j         v ||S r   )r  r  s      r   r+   z!subset_glyphs.<locals>.<dictcomp>  s,    QQQtq!a>P9P9Pa9P9P9Pr   r  r  c                 F    g | ]}|j         d k    r|j        n|j        |S )r  )r  r  r  r  s     r   r2   z!subset_glyphs.<locals>.<listcomp>  s-    WWWBafAI1r   T)r$   r  
platformID	platEncIDlanguager  r  rT   r  r  maxrr  rK  r  r4   r  )r#   rk   tables_format12_bmptable_plat0_enc3table_plat3_enc1r  s    `    r   rs   rs   \  st   AH[ R R<1!1!1+,QZ(<1!1!1+,QZ(8r>>    IOO--  AI BA!)//*;*;AAAAII[[]] 	R   FLLNN  AF x2~~!&~S-?-?'-I-I#**1---QQQQqv||~~QQQAFF !  LAq  
... ,1QV;;FLLNNNNLAr!!
... ,1QV;;FLLNNNWWdkWWWDKDK((D 4r   DSIGc                 "    d| _         g | _        dS r  )	usNumSigssignatureRecordsr/  s      r   r  r    s     DND4r   maxpc                     |j         s<| j        dk    r1d| _        d| _        d| _        d| _        d| _        d| _        d| _        dS )Nr  r   r   T)	r   tableVersionmaxZonesmaxTwilightPoints
maxStoragemaxFunctionDefsmaxInstructionDefsmaxStackElementsmaxSizeOfInstructionsr/  s      r   r  r    sU    ? +
**DM%&D"DO#$D &'D#$%D!)*D&4r   r   c                    t                      }|                    |           t          j                  |j        z  dj        v rd | j        D             z  fd| j        D             | _        j        sd | j        D             | _        dj        vrfd| j        D             | _        j        rg }| j        D ]}|j	        dv r1|
                                rd                    d          nd|_        nW|j	        d	v r1|
                                rd
                    d          nd
|_        n|j	        dk    rd|_        n
|j	        dv r|                    |           || _        dS )Nr   c                 2    h | ]}|j         d k     |j         S )   nameIDr   rd  s     r   r  z$prune_post_subset.<locals>.<setcomp>  s!    CCCAHsNNAHNNNr   c                 &    g | ]}|j         v |S r   r   )r   rd  nameIDss     r   r2   z%prune_post_subset.<locals>.<listcomp>  s%    ???18w+>+>!+>+>+>r   c                 :    g | ]}|                                 |S r   r  r"  s     r   r2   z%prune_post_subset.<locals>.<listcomp>  s%    ===Aq{{}}=a===r   c                 0    g | ]}|j         j        v |S r   )langIDname_languages)r   rd  r   s     r   r2   z%prune_post_subset.<locals>.<listcomp>  s(    RRRAqx7;Q/Q/Qa/Q/Q/Qr   )r   r  z.	utf_16_be)r      r   r;  )         T)r   visitr?   name_IDsseenrf  name_legacyr(  obfuscate_namesr!  r  encodestringrK  )r#   r%   r   visitornamerecsrd  r$  s     `   @r   r   r     s   !!GMM$'"##gl2G
gCCdjCCCC????TZ???DJ > >====

'(((RRRRRRR
  		 		Ax6!!:;++--T7>>+666WV##9:R6==555FQ\))OOA
4r   headc                     dS r   r   r/  s      r   r   r     s	     4r   c                   8   e Zd Z G d de          Z G d de          Zg dZeg dz  Zg dZg dZg d	g d
g dg dddgddgdgdgg dg dg dg dg dg ddZ	 e
 e ee	                                          g                     Zd Zd Zg fdZdS )Optionsc                       e Zd ZdS )Options.OptionErrorNr  r  r  r   r   r   OptionErrorr=            r   r?  c                       e Zd ZdS )Options.UnknownOptionErrorNr>  r   r   r   UnknownOptionErrorrB    r@  r   rC  )BASEJSTFr  rl  ra  EBSCPCLTLTSH)FeatGlatGlocSilfSill)avarfvargaspr8  hhear  vheaOS/2locar   cvtfpgmprepVDMXr  re  MVARcvarSTAT)rU  rZ  rV  rW  r  rX  )rvrnccmpligaloclmarkmkmkrlig)fracnumrdnom)caltcligcursr  rclt)valtvertvkrnvpalvrt2ltraltrmrtlartlmrandjalt)HarfHARFBuzzBUZZ)chwsvchwhaltvhal)
initmedifinaisolmed2fin2fin3cswhmsetstch)ljmovjmotjmo)abvsblwsabvmblwm)nuktakhnrphfrkrfr$  blwfhalfabvfpstfcfarvatucjctr}  presr  r  pstshalndistr  r  )common	fractions
horizontalverticalltrrtlrs  justifyprivateeast_asian_spacingarabichangultibetanindicc                    | j         d d          | _        | j        d d          | _        d| _        | j        d d          | _        d| _        d| _        | j	        d d          | _
        dg| _        d| _        d| _        d| _        d| _        d| _        d| _        g d| _        d| _        dg| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d | _         d | _!        d| _"        d| _#        tH          j%        | _&        d| _'        d| _(        d| _)        d| _*        d| _+        d| _,         | j-        di | d S )NFTr   )r   r   r   r   r     r*  i	  r  r   )._drop_tables_defaultdrop_tables_no_subset_tables_defaultno_subset_tablespassthrough_tables_hinting_tables_defaulthinting_tableslegacy_kernlayout_closure_layout_features_defaultr  r  ignore_missing_glyphsignore_missing_unicodesr   r.  r  r  r0  r2  r(  r3  r  r  r  recommended_glyphsrecalc_boundsrecalc_timestampprune_unicode_rangesprune_codepage_rangesrecalc_average_widthrecalc_max_contextcanonical_orderflavorwith_zopflidesubroutinizer   defaultharfbuzz_repackerverbosetimingxmlfont_number
pretty_svglazyr?   )r#   kwargss     r   r  zOptions.__init__J  s   4QQQ7 $ >qqq A"'":111= "#<QQQ?"e%*"'+$   
 
 
 !%h$  #"'" %$(!%)"$)!"'# #!6!>	6r   c                     |                                 D ]>\  }}t          | |          s|                     d|z            t          | ||           ?d S )NUnknown option '%s')rT   r  rC  r   )r#   r  r  rR   s       r   r?   zOptions.set}  si    LLNN 	  	 DAq4## I--.Ca.GHHHD!Q	  	 r   c                    g }g }|D ]}|}|                     d          s|                    |           0|dd          }|                    d          }d}|dk    rQ|                     d          r|dd          }	|	dk    rd }
nd}
n|}	d	}
|	                    d
          r|	d d         }	d
}
n6|d |         }	|	d         dv r|	d         dz   }|	d d         }	||dz   d          }
|	}|	                    dd          }	t          | |	          s7|d	u s||v r|                    |           %|                     d|z            t          | |	          }|
d
k    rt          d|d|           jt          |t                    rt          |
          }
nt          |t                    rt          |
          }
nt          |t                    rt          |
          }
nt          |t                    rt          |
t                    r|                     d|z            |
                    dd                                          }|dgk    rg }d |D             }|dk    r|}
nG|dk    r|}
|
                    |           n)|dk    r!|}
|D ]}||
v r|
                    |           nJ t%          | |	|
           ||z   S )Nz--r   =r  zno-r   zcanonical-orderFT?z-+r   -_r  zCurrent setting for 'z' is: z5Option '%s' requires values to be specified using '=', r;  c                 d    g | ]-}t          |          r|d          dv rt          |d           n|.S )r   
0123456789)r4   r   rQ  s     r   r2   z&Options.parse_opts.<locals>.<listcomp>  s=    VVVa3q66Iadl.B.Bc!QiiiVVVr   z+=z-=)r  rK  findr  replacer  rC  r   printr  rq   r   strr]   r?  r  r  r  r   )r#   argvignore_unknownposargspassthru_optionsr  orig_ar/   opr  rR   okovvvrR  s                  r   
parse_optszOptions.parse_opts  sG    F	  F	 AF<<%% q!!!!""AsABBww<<&& 
!""A--- !!AA::c?? #2#AAbqbER5D==2B#2#Aa!eggJB		#s##A4## M!T))R>-A-A$++F333112G!2KLLLq!!BCxx222rrBCCC"d## !GGB$$ !FFB$$ !FFB%% !a&& **ORSS   YYsC((..00"::BVVSUVVV99AA4ZZAHHRLLLL4ZZA ( (66HHQKKK( !LD!Q)))r   N)r  r  r  	Exceptionr?  rC  r  r  r  _layout_features_groupsr   r  iterr^   r  r  r?   r  r   r   r   r;  r;    s           i       [   	 	 	 DDDD! ! !* NMM
 KJJ--->>><<<8333>>>
 
 
 +**333
 
 
72 2f  *zDD(//1122B77   1 1 1f      /1 K* K* K* K* K* K*r   r;  c                       e Zd Z G d de          Z G d de          Z G d de          ZddZg g g d	fd
Zd Z	d Z
d Zd Zd Zd ZdS )	Subsetterc                       e Zd ZdS )Subsetter.SubsettingErrorNr>  r   r   r   SubsettingErrorr    r@  r   r  c                       e Zd ZdS )&Subsetter.MissingGlyphsSubsettingErrorNr>  r   r   r   MissingGlyphsSubsettingErrorr    r@  r   r  c                       e Zd ZdS )(Subsetter.MissingUnicodesSubsettingErrorNr>  r   r   r   MissingUnicodesSubsettingErrorr    r@  r   r  Nc                     |st                      }|| _        t                      | _        t                      | _        t                      | _        d S r   )r;  r   r?   r  glyph_names_requestedglyph_ids_requested)r#   r   s     r   r  zSubsetter.__init__  sD     	 iiG"%%%%(UU"#&55   r   r;  c                    | j                             |           t          |t                    r|                    d          }|                    d          }t          |          dz  }t          j        d|z  |          D ]}| j         	                    |           | j
                            |           | j                            |           d S )Nutf_8z	utf-32-ber  z>%dL)r  rh   r  bytesdecoder4  r4   r  r  r  r  r  )r#   r$   gidsunicodestext
text_utf32ncharsr  s           r   populatezSubsetter.populate  s    &&x000dE"" 	(;;w''D[[--
ZA%v
;; 	+ 	+A#''****"))&111 ''-----r   c                    |                      |          D ]\}|                                | j        j        v sB|                                | j        j        v r| j        j        r|dk    r/| j        j        s#d|v rt                              d|           ||= t          j
        |          }t          |d          rt          d|z            5  ||         }d d d            n# 1 swxY w Y   t          d|z            5  |                    || j                  }d d d            n# 1 swxY w Y   |s t                              d|           ||= At                              d|           ^d S )	Nr  r|  z
%s droppedr  z	load '%s'
prune '%s'%s pruned to empty; dropped	%s pruned)_sort_tablesstripr   r  r  r   r  logr    r   r  r  timerr  r#   r%   r  clazzr  retains         r   _prune_pre_subsetzSubsetter._prune_pre_subset  s   $$T** 	/ 	/C		t|777IIKK4<#>>> L0 ? 6MM4<+CMRVs+++I',,Eu011 
/;,-- & & IE& & & & & & & & & & & & & & &<#-.. H H"33D$,GGFH H H H H H H H H H H H H H H /HH:C@@@S	HH[#...3	/ 	/s$   	C%%C)	,C)	D**D.	1D.	c           	      T    t                                                    }                                x _        t                       _         j                             j                    j                            fd j        D                        t                       _         j                             j                            |                      j                            fd j        D                         j        rFt          
                    d j                    j        j        s                      j                   j                                         _        t                       _        dv r\t#          d          5  d                                          j                            |           d d d            n# 1 swxY w Y   t)           j                   _         j        rNd  j        D             }t          
                    d|            j        j        s                     |          ~ j        j        rdv rH j                                                d	                     t          
                    d
           n4 j                            d           t          
                    d            j        j        rdv rt9          t;          dt=                                                                        D ]/} j                                                |                     0t          
                    d           dv rt#          d          5  t          
                    dt=           j                             t                               j                   d                                          j                            |           t          
                    dt=           j                             t                               j                   d d d            n# 1 swxY w Y   t)           j                   _         j        j         rdv rt#          d          5  t          
                    dt=           j                             t                               j                   d                                          j                            |           t          
                    dt=           j                             t                               j                   d d d            n# 1 swxY w Y   t)           j                   _!        dD ]=}|v rt#          d|z            5  t          
                    d|t=           j                             t                               j                   |                                          j                            |           t          
                    d|t=           j                             t                               j                   d d d            n# 1 swxY w Y   tE           d|#                                 dt)           j                             ?dv rt#          d          5  t          
                    d t=           j                             t                               j                   d                                          j                            |           t          
                    d!t=           j                             t                               j                   d d d            n# 1 swxY w Y   t)           j                   _$        dv rt#          d"          5  t          
                    d#t=           j                             t                               j                   d                                          j                            |           t          
                    d$t=           j                             t                               j                   d d d            n# 1 swxY w Y   t)           j                   _$        d%v rt#          d&          5  t          
                    d't=           j                             t                               j                   d%                                          j                            |           t          
                    d(t=           j                             t                               j                   d d d            n# 1 swxY w Y   t)           j                   _%        t)           j                   _&        '                                fd) j&        D              _(        tS           j(        *                                           _+                                         j+                  _,        t)                       _-         j        j.        r fd*| j&        z
  D              _-        fd+ j-        D              _/         j        j.        s fd,D             n fd-D              _0        fd.t9          t=                              D              _1        t          
                    d/t=           j&                              `d S )0Nc              3   N   K   | ]}|t                    k     |         V   d S r   r3   r   r/   glyph_orders     r   r   z,Subsetter._closure_glyphs.<locals>.<genexpr>  sB       %
 %
 CDTDT@T@TKN@T@T@T@T%
 %
r   c              3   B   K   | ]}|t                    k    |V  d S r   r3   r  s     r   r   z,Subsetter._closure_glyphs.<locals>.<genexpr>  s>       #
 #
1K8H8H3H3HA3H3H3H3H#
 #
r   zMissing requested glyphs: %sr  zclose glyph list over 'cmap'c                     g | ]}d |z  S )zU+%04Xr   )r   r  s     r   r2   z-Subsetter._closure_glyphs.<locals>.<listcomp>(  s    CCCx!|CCCr   z)Missing glyphs for requested Unicodes: %sr  r   zAdded gid0 to subsetz.notdefzAdded .notdef to subsetr  z!Added first four glyphs to subsetr  zclose glyph list over 'MATH'z0Closing glyph list over 'MATH': %d glyphs before)r%   z.Closed glyph list over 'MATH': %d glyphs afterrv  zclose glyph list over 'GSUB'z0Closing glyph list over 'GSUB': %d glyphs beforez.Closed glyph list over 'GSUB': %d glyphs after)rE  r  zclose glyph list over '%s'z.Closing glyph list over '%s': %d glyphs beforez,Closed glyph list over '%s': %d glyphs afterglyphs_edr  zclose glyph list over 'VARC'z0Closing glyph list over 'VARC': %d glyphs beforez.Closed glyph list over 'VARC': %d glyphs afterzclose glyph list over 'glyf'z0Closing glyph list over 'glyf': %d glyphs beforez.Closed glyph list over 'glyf': %d glyphs afterzCFF zclose glyph list over 'CFF 'z0Closing glyph list over 'CFF ': %d glyphs beforez.Closed glyph list over 'CFF ': %d glyphs afterc                 "    i | ]}||         S r   r   r   r   orders     r   r+   z-Subsetter._closure_glyphs.<locals>.<dictcomp>  s    #N#N#NAAuQx#N#N#Nr   c                 6    h | ]}|         j         k    |S r   )r  )r   r   r  r#   s     r   r  z,Subsetter._closure_glyphs.<locals>.<setcomp>  s5     # # #8t777 777r   c                 "    i | ]}||         S r   r   r  s     r   r+   z-Subsetter._closure_glyphs.<locals>.<dictcomp>  s    &P&P&Pqq%(&P&P&Pr   c                 &    g | ]}|j         v |S r   )glyphs_retainedrO   s     r   r2   z-Subsetter._closure_glyphs.<locals>.<listcomp>  s&    SSSQd>R9R9Rq9R9R9Rr   c                 P    g | ]"}                     |          j        k     |#S r   )
getGlyphIDr  )r   r   r%   r#   s     r   r2   z-Subsetter._closure_glyphs.<locals>.<listcomp>  s9       $//!*<*<@X*X*X*X*X*Xr   c                 .    i | ]}|                  |S r   r   )r   r/   new_glyph_orderr  s     r   r+   z-Subsetter._closure_glyphs.<locals>.<dictcomp>  s2      
  
  
-.E/!$%q 
  
  
r   zRetaining %d glyphs)2r?   getGlyphOrderorig_glyph_orderr  rh   r  r  glyphs_missing
differencer  r    r   r  r  r  r$   r  r  rl   intersection_updater  glyphs_cmapedr  r  r  r  getGlyphNamer  r  minr4   r  r  r~  r   lowerglyphs_glyfedglyphs_cffedr  r"   r  r  r^   r  r  r  r  r  r  glyph_index_map)	r#   r%   
realGlyphsmissingr/   r  r  r  r  s	   ``    @@@r   _closure_glyphszSubsetter._closure_glyphs  s   ++--..
.2.@.@.B.BB #$$T%?@@@$$ %
 %
 %
 %
$($<%
 %
 %
 	
 	
 	
 "ee""4#8#C#CJ#O#OPPP"" #
 #
 #
 #
/#
 #
 #
 	
 	
 	
  	MHH3T5HIII<5 M778KLLL+0022 #T>>566 < <V++D111//
;;;< < < < < < < < < < < < < < < 't{33  	CCT-BCCCGHH@'JJJ<7 C99'BBB<$ 	4~~ 1 1! 4 4555/0000	***2333<* 	>~~s1c$*<*<*>*>&?&?@@AA : :AKOOD$5$5a$8$89999<===T>>566 
3 
3FDKHXHX   

4;T
222V++D111//
;;;Dc$+FVFV   

4;T
222
3 
3 
3 
3 
3 
3 
3 
3 
3 
3 
3 
3 
3 
3 
3 't{33<& 	36T>>566 
3 
3FDKHXHX   

4;T
222V++D111//
;;;Dc$+FVFV   

4;T
222
3 
3 
3 
3 
3 
3 
3 
3 
3 
3 
3 
3 
3 
3 
3 't{33% 	O 	OE}}7%?@@ 7 7HHHDK((  
 JJt{J666K..t444K33J???HHFDK((  
 JJt{J6667 7 7 7 7 7 7 7 7 7 7 7 7 7 7 D5EKKMM555y7M7MNNNNT>>566 
3 
3FDKHXHX   

4;T
222V++D111//
;;;Dc$+FVFV   

4;T
222
3 
3 
3 
3 
3 
3 
3 
3 
3 
3 
3 
3 
3 
3 
3 't{33T>>566 
3 
3FDKHXHX   

4;T
222V++D111//
;;;Dc$+FVFV   

4;T
222
3 
3 
3 
3 
3 
3 
3 
3 
3 
3 
3 
3 
3 
3 
3 't{33T>>566 
3 
3FDKHXHX   

4;T
222V++D111//
;;;Dc$+FVFV   

4;T
222
3 
3 
3 
3 
3 
3 
3 
3 
3 
3 
3 
3 
3 
3 
3 &dk22(55''))#N#N#N#N9M#N#N#N #&t'?'F'F'H'H#I#I #'#5#5#7#78P#Q 'kk<# 	# # # # ##d&::# # #D 'Q&P&P&PD<O&P&P&P#|' 	SSSS+SSSOO    &  O  / 
  
  
  
  
27O8L8L2M2M 
  
  
 	&D,@(A(ABBBKKKs    6G""G&)G&CQ..Q25Q21CVVVCZ..Z2	5Z2	C_%%_),_)Cc::c>c>1Chhhc                 >   g | _         |                     |          D ]<}t          j        |          }|                                | j        j        v rt                              d|           St          |d          rt          d|z            5  ||         }| j        | _        |                    |           }| `d d d            n# 1 swxY w Y   |st                              d|           ||= t                              d|           | j        j        rt                              d|           t                              d|           ||= >t          d          5  |                    | j                   d d d            d S # 1 swxY w Y   d S )	Nz%s subsetting not neededrs   zsubset '%s'z%s subsetted to empty; droppedz%s subsettedz'%s NOT subset; don't know how to subsetz0%s NOT subset; don't know how to subset; droppedzsubset GlyphOrder)r  r  r   r  r  r   r  r  r    r  r  r  r$   rs   r  warningsetGlyphOrderr  r  s         r   _subset_glyphszSubsetter._subset_glyphs  s    $$T** 	 	C',,Eyy{{dl;;;3S999900 =3.// $ $ IE"&"6DK"0066F	$ $ $ $ $ $ $ $ $ $ $ $ $ $ $
  2HH=sCCCS		HH^S11110 BCHHHHNPSTTTII&'' 	5 	5t3444	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5s$   ,C

C	C	*FFFc                 P   |                                 }d|v r*|                    d           |                    d           |D ]_}|dk    r
|dk    r| j        j        rf||                                         }||                             |d          }||k    r)t                              d|t          |                     | j        j
        rw||         j        dk    rf||                                         }||                             |d          }||k    r)t                              d|t          |                     | j        j        rJ||         j        }||                             |          }	||	k    rt                              d	||	           | j        j        rIt%          |          }
|
||         j        k    r)|
||         _        t                              d
||
           t)          j        |          }t-          |d          rt/          d|z            5  ||         }|                    || j                  }d d d            n# 1 swxY w Y   |s t                              d|           ||= Dt                              d|           ad S )Nr   
GlyphOrderrS  T)	pruneOnlyz%s Unicode ranges pruned: %sr   z%s CodePage ranges pruned: %sz%s xAvgCharWidth updated: %dz%s usMaxContext updated: %dr   r  r  r  )rr  r  rK  r   r  getUnicodeRangesrecalcUnicodeRangesr  r    r!   r  rJ  getCodePageRangesrecalcCodePageRangesr  xAvgCharWidthrecalcAvgCharWidthr  r   usMaxContextr   r  r  r  r   )r#   r%   	tableTagsr  old_unirangesnew_unirangesold_codepagesnew_codepagesold_avg_widthnew_avg_widthmax_contextr	  r  r
  s                 r   _prune_post_subsetzSubsetter._prune_post_subset  s   IIKK	 YV$$$V$$$ )	/ )	/Cl""f}}<4 $(I$>$>$@$@M$(I$A$A$RV$A$W$WM$55:CAVAV   <5 
$s):Kq:P:P %)I$?$?$A$AM$(I$B$B4SW$B$X$XM$55;"=11  
 <4 U$(I$;M$(I$@$@$F$FM$55!?mTTT<2 R",T"2"2K"d3i&<<<1<S	.!>[QQQ',,Eu122 /<#-.. I I IE"44T4<HHFI I I I I I I I I I I I I I I  /HH:C@@@S		HH[#...S)	/ )	/s   ,$II 	#I 	c                     g dd t                    D             t          |                                fd          }d |D             S )N)r  r|  rv  rO  rN  r  r   r  c                      i | ]\  }}||d z   S )r   r   )r   r/   r  s      r   r+   z*Subsetter._sort_tables.<locals>.<dictcomp>	  s"    ===AAq1u===r   c                 0                         | d          S rs  )r  )r  tagOrders    r   r@  z(Subsetter._sort_tables.<locals>.<lambda>
  s    8<<Q3G3G r   )r  c                     g | ]
}|d k    |S )r3  r   r  s     r   r2   z*Subsetter._sort_tables.<locals>.<listcomp>  s"    555a1#4#4#4#4#4r   )r9   r!   rr  )r#   r%   r  rH  s      @r   r  zSubsetter._sort_tables  sa    SSS==8)<)<===diikk'G'G'G'GHHH5545555r   c                     |                      |           |                     |           |                     |           |                     |           d S r   )r  r-  r1  rD  )r#   r%   s     r   rD   zSubsetter.subset  sX    t$$$T"""D!!!%%%%%r   r   )r  r  r  r  r  r  r  r  r  r  r-  r1  rD  r  rD   r   r   r   r  r    s$           )                 ) ) ) ) !rBR 	. 	. 	. 	./ / /8l l l\5 5 561/ 1/ 1/f6 6 6& & & & &r   r  z	load fontc                     t          j        | ||j        |j        ||j                  }|rHt          j        d          }|j        }|j        |_        |d         }|j        dk    rd|_        ||_        |S )N)checkChecksumsrecalcBBoxesrecalcTimestampr  
fontNumberr+  g       @r-  )	r   TTFontr  r  r  r  decode_format_2_0decode_format_3_0r/  )	fontFiler   rL  dontLoadGlyphNamesr  r%   r+  savedr'  s	            r   	load_fontrV    s    <%*0&  D$  '"6**&!%!7L<3AL!&Kr   zcompile and save fontc                     |j         r|j        dk    rddlm} d|_        |j        | _        |j        | j        t          <   |                     ||j	                   d S )Nwoffr   )sfntT)reorderTables)
r  r  fontTools.ttLibrY  
USE_ZOPFLIr  cfgr   saver  )r%   outfiler   rY  s       r   	save_fontr`  4  sj     w~77((((((.DK&-&?DH"#IIgW%<I=====r   c           
         dd l }|                    dd|           } |                    dd|           } g }|                                 D ]}|                    d          }t          |          dk    r$|                    t          |d                     N|\  }}|                    t          t          |d          t          |d          dz                        |S )Nr   z0[xX]r  z[<+>,;&#\\xXuU\n	]r  r   r,  )rerz   r  r4   rK  r   r  r  )rk   rb  r1   itemfieldsstartends          r   parse_unicodesrg  ?  s    III
xa  A
$c1--A
A		 > >Cv;;!HHSr]]####JE3HHU3ub>>3sB<<!+;<<====Hr   c           
         g }|                      dd                                          D ]}|                    d          }t          |          dk    r)|                    t	          |d                              S|                    t          t	          |d                   t	          |d                   dz                        |S )Nr  r  r  r   r   )r  r  r4   rK  r   r  r  )rk   r1   rc  rd  s       r   
parse_gidsri  O  s    
A		#s##))++ @ @Cv;;!HHS^^$$$$HHU3vay>>3vay>>A+=>>????Hr   c                 R    |                      dd                                          S )Nr  r  )r  r  )rk   s    r   parse_glyphsrk  Z  s"    99S#$$&&&r   c                  ~    t          dt          t          j                   t          dt          j                   d S )Nzusage:filez,Try pyftsubset --help for more information.
)r  	__usage__sysstderrr   r   r   usagerr  ^  s5    	(ICJ////	
9
KKKKKKr   z%make one with everything (TOTAL TIME)c           
      "   ddl m} ddlm} | t          j        dd         } d| v rt          t                     dS t                      }	 |	                    | g d          } nB# |j
        $ r5}t                       t          d	|t          j        
           Y d}~dS d}~ww xY wt          |           dk     rt                       dS  ||j        rt          j        nt          j                   |j        r*t&          j                            t          j                   ndt&          j        _        | d         }| dd         } t1          |          }d}g }g }	g }
d}d}d}| D ]}|dk    rd}|                    d          r|dd         },|                    d          r||dd         z  }O|                    d          r]t5          |dd         d          5 }||                                                    dd          z  }ddd           n# 1 swxY w Y   |                    d          r=|dd         dk    rd}n*|
                    t=          |dd                              |                    d          rt5          |dd                   5 }|                                D ]=}|
                    t=          |                     d          d                              >	 ddd           n# 1 swxY w Y   |                    d           r,|	                    tC          |dd                              |                    d!          rt5          |dd                   5 }|                                D ]=}|	                    tC          |                     d          d                              >	 ddd           n# 1 swxY w Y   |                    d"          r=|d#d         dk    rd}n*|                    tE          |d#d                              |                    d$          rt5          |dd                   5 }|                                D ]=}|                    tE          |                     d          d                              >	 ddd           n# 1 swxY w Y   q|#                    |           |j$         o| }|j%        }tM          ||||%          }|8|j'        d&|j'        (                                z   nd}tS          ||dd'(          }t'          d)          5  |r'|                    |*                                           |r|d*         j+        D ]y}|,                                rc|
                    |j-        .                                           |j/        dk    r,|
                    |j0        .                                           zd|vsJ 	 ddd           n# 1 swxY w Y   tb          2                    d+|z             tb          2                    d,|
           tb          2                    d-|           tb          2                    d.|	           |3                    ||	|
|/           |4                    |           tk          |||           |j        rrddl6}tb          2                    d0|j7        8                    |          |fz             tb          2                    d1|j7        8                    |          |fz             |j9        r|:                    t          j;                   |<                                 dS )2z%OpenType font subsetter and optimizerr   )splitext)configLoggerNr   z--help)	r  z	gids-filer$   zglyphs-filer  z	text-filer  zunicodes-filezoutput-file)r  zERROR:rm  r   )levelT)r   Fr;  r   z--output-file=r  z--text=   z--text-file=r  zutf-8)encoding
z--unicodes=   z--unicodes-file=r,  #z--gids=z--gids-file=z	--glyphs=	   z--glyphs-file=)rT  r  r  z.subset)	extension	overWritesuffixzcompile glyph listr  z
Text: '%s'zUnicodes: %sz
Glyphs: %szGids: %s)r$   r  r  r  zInput font:% 7d bytes: %szSubset font:% 7d bytes: %s)=os.pathrt  	fontToolsru  rp  r  r  __doc__r;  r  r?  rr  rq  r4   r  loggingINFOWARNINGr  r  r'   setLevelDEBUGdisabledr  r  openreadr  r  rg  	readlinesr  ri  rk  rK  r.  r  rV  r  r'  r   r  r  r  r  rr  r  r  r  r    r  rD   r`  ospathgetsizer  saveXMLstdoutclose)argsrt  ru  r   efontfile	subsetterr_  r$   r  r  wildcard_glyphswildcard_unicodesr  r   r'  linerT  r  r%   extr  r  s                          r   mainr  c  s    !     &&&&&&|x|4gqiiG!!
 
 
 " 
 
    h
++++qqqqq
 4yy1}}qLwKw||GOLLLL~ %gm,,,, $AwH8D'***IGFDHOD , ,88"O<<()) 	fG<<	"" 	AabbEMD<<'' 	afw/// 31((r2223 3 3 3 3 3 3 3 3 3 3 3 3 3 3<<&& 	v}}$(!!qv 6 6777<<*++ 	af HKKMM H HDOON4::c??13E$F$FGGGGHH H H H H H H H H H H H H H H <<	"" 	KK
1QRR5))***<<'' 	af @KKMM @ @DKK
4::c??1+= > >????@@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ <<$$ 	u||"&l1QRR511222<<()) 	af DKKMM D DDMM,tzz#q/A"B"BCCCCDD D D D D D D D D D D D D D D a$00?Z<D'.@t  D .5n.HcGN((****d$tI
 
 
 
#	$	$ 	  	  	0MM$,,../// 	:&\( : :;;== :OOAFKKMM222x2~~ 	(8(8999	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  HH\D !!!HH^X&&&HH\6"""HHZf4(NNNTdGW%%% U			,0I0I8/TTUUU-1I1I70SSTTT{ !SZ   JJLLLLLsv   A& &
B%0*B  B%%,HH!	$H!	'ALL	L	AO!!O%	(O%	,ASS	S	B9X$$X(+X()r;  r  rV  r`  ri  rk  rg  r  r   )FT)F)T)r   FT)r  r   fontTools.misc.roundToolsr   r   fontTools.ttLib.tablesr   fontTools.ttLib.tables.otBaser   fontTools.otlLib.maxContextCalcr   fontTools.pens.basePenr	   fontTools.misc.loggingToolsr
   fontTools.misc.cliToolsr   fontTools.subset.utilr   r   fontTools.subset.cfffontTools.subset.svgfontTools.varLibr   r   fontTools.ttLib.tables._n_a_m_er   rp  r  arrayr  collectionsr   r   	functoolsr   typesr   ro  r  	getLoggerr  r&   r$   r  r,   r6   r   r;   r@   rD   rJ   rc  rY   SingleSubstrl   rs   MultipleSubstAlternateSubstLigatureSubstReverseChainSingleSubstDevicer   ValueRecordr   	SinglePosr   PairPos
CursivePosAnchorMarkBasePos
MarkLigPosMarkMarkPosr+  r-  ContextSubstChainContextSubst
ContextPosChainContextPosr1  r  ExtensionSubstExtensionPosr  r  r  r  r%  rz  r/  r6  rx  rP  rO  rL  rY  ry  r  r  r  r  r  r  r  r  r  r  rD  MathGlyphConstructionr  r  r  r  r  r  r>  r  r  r;  r  rV  r`  rg  ri  rk  rr  r  __all__r   r   r   <module>r     s9  
       - - - - - -       + + + + + + ? ? ? ? ? ? 6 6 6 6 6 6 * * * * * * - - - - - - 6 6 6 6 6 6 9 9 9 9 9 9 9 9 " " " " " " " " 4 4 4 4 4 4 4 4 = = = = = = 



    , , , , , , , ,            A	 Uc P g*++Q Q Q Q ZS))
 	&W&'?@@AAA% % %0 0 0
 XA A  A
 X6 6  6
 X    X9 9  9
 X    XS S  S X    & XP P  P
 X!""K K #"K X!""  #" X#$$# # %$# X#$$  %$ X$%%Y Y &%Y X$%%! ! &%! X#$$  %$ X#$$    %$  X-..
5 
5 /.
5 X-..5 5 /.5( X_) ) ) X!""    #"  X  5 5 ! 5 X    ! > X*5 *5 *5Z X7 7 7( X !!	5 	5 "!	5 X_	 	 	 X !!  "! X!""5 5 #"54 X!""	 	 #"	 X !!5 5 "!5> X !!  "! X!""5 5 #"54 X!""	 	 #"	 $ 	 	 	 $    $
 
 
 
 (183S    	    	 W? W? W?t X"H$>??l5 l5 @?l5^ 	 W5 W5 W5t 	 &5 &5 &5R 	 5 5 5& X$%%5 5 &%5 X$%%5 5 &%5 X$h&;<<5 5 =<5 X$h&;<<5 5 =<5 X$h&;<<5 5 =<5 X$h&;<<5 5 =<5 X_) ) ) )( X_	$ 	$ 	$ X_   X_) ) )
 X_I I I X_E E E X !!N N "!N
 X !!  "! X !!) ) "!) X !!  "! X !!" " "!"* X   X!""
 
 #"
 X!""  #" X!""# # #"# X.//  0/ X'((  )( X'((	 	 )(	 X.//	( 	( 0/	( X'((, , )(," X$h&677D D 87D X$h&677' ' 87' X_: : : : X_0 0 0 X !!	" 	" "!	" X !!Y Y "!Y
  U (())  *)  U (())  *)  U (())  *)  U (())  *):  U ((*=%*=f*E*EFF  GF  U ((*=%*=f*E*EFF9 9 GF9  U ((*=%*=f*E*EFF
 
 GF
,  U ((*=%*=f*E*EFF= = GF=  U ((*=%*=f*E*EFF, , , GF,.  U ((*=%*=f*E*EFF
 
 GF
$  U ((*=%*=f*E*EFF8 8 GF84  U ((*=%*=f*E*EFF
 
 GF
   U ((*=%*=f*E*EFF  GF  U ((*=%*=f*E*EFF2 2 GF2>  U ((*=%*=f*E*EFF+ + GF+\  U (())  *)D= = =4  U (())  *)D  U (())! ! *)!  U (())	! 	! *)	!  U (())  *)  U (())  *)  U (())  *)  U (())" " *)"  U (())* * *)*  U (())  *)&  U (())@ @ *)@  U (())  *)  U (())! ! *)!    U (())" " *)"J  U (())' ' *)'T  U (())  *)  U (())@ @ *)@(  U (())  *)  U (())  *)
  U (())? ? *)?,    U (())  *):  U (())0 0 *)0f  U (())9( 9( *)9(x X+,,  -, X"##  $#"  U (())A A *)A  U (())" " *)"6  U (())) ) *))X  U (())2 2 *)2
 X/00- - 10- X-../ / /./ X"##$ $ $#$ X#$$	 	 %$	 X"##  $#  U (())  *) !U!&))/00  10:  U (())  *)   U (())  *)  U (())  *)&  U (())  *)  U (())9 9 *)90  U (())
 
 *)
  U (())? ? *)?D  U (())  *)  U (())
 
 *)
  U (())  *)>  U (())  *)$f* f* f* f* f*f f* f* f*R@& @& @& @& @& @& @& @&F
 {   > > >  >     ' ' 'L L L
 .//N N N 0/Nb	 	 	r   