From 54e5bd893bddc19a9ba61a1a6f01a96fc2542f46 Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Thu, 8 Aug 2024 14:25:03 +0100 Subject: [PATCH 1/3] Implement GSLayer.layerKey() method, needed to resolve component references --- Lib/glyphsLib/classes.py | 131 +++++++++++++++++++++++++++++++++------ Lib/glyphsLib/types.py | 10 +++ 2 files changed, 121 insertions(+), 20 deletions(-) diff --git a/Lib/glyphsLib/classes.py b/Lib/glyphsLib/classes.py index 5232bd8c8..fccb13f0f 100755 --- a/Lib/glyphsLib/classes.py +++ b/Lib/glyphsLib/classes.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +from __future__ import annotations import copy import logging @@ -40,6 +41,7 @@ Rect, Transform, UnicodesList, + floatToString2, floatToString5, parse_datetime, parse_float_or_int, @@ -3747,6 +3749,64 @@ def name(self): def name(self, value): self._name = value + def layerKey(self) -> str | None: + """Return a string that identifies a special layer with given attributes. + + In Glyphs.app's Python interface, this is a private method used to match and + look up special layers by their attributes when their layerId isn't enough + (only 'master' layers have the same layerId across all the glyphs, for other + layers it's unique). The layerKey string is used as the first parameter of + the GSGlyph.layerForKey_masterId_ method, e.g. to resolve component references + in the componentLayer property (not implemented yet in glyphsLib): see + https://github.com/googlefonts/glyphsLib/pull/853#issuecomment-1403454327 + """ + parts = [] + # An optional prefix defines whether the layer contains any color information. + # While a layer could in theory contain all four different types of color + # attributes (even though it makes no sense to mix vector & bitmap formats!), + # there seem to be some sort of hierarchy or implicit order between them when + # composing the layerKey: COLRv0 > COLRv1 > SBIX > SVG + if self._is_color_palette_layer() or self._is_color_layer(): + parts.append("Color") + if self._is_color_palette_layer(): + index = self._color_palette_index() + if index == 0xFFFF: + index = "*" + parts.append(str(index)) + elif self._is_sbix_color_layer(): + parts.extend(["iColor", str(self._sbix_strike())]) + elif self._is_svg_layer(): + parts.append("svg") + # The rest of the layerKey optionally defines the associated master name and + # axis range for alternate layers, and/or the intermediate layer coordinates. + # Numbers are normalized and rounded to 2 decimals. + ntos = floatToString2 # for brevity + if self._is_bracket_layer(): + axes = self.parent.parent.axes + master = self.master + if master is None: + # no/invalid associated master id? no layerKey + return None + parts.append(master.name) + bracket_ranges = ",".join( + ( + (f"{ntos(axis_min)}‹{axis.axisTag}‹{ntos(axis_max)}") + if axis_min is not None and axis_max is not None + else ( + f"{ntos(axis_min)}‹{axis.axisTag}" + if axis_min is not None + else f"{axis.axisTag}‹{ntos(axis_max)}" + ) + ) + for axis, (axis_min, axis_max) in zip(axes, self._bracket_axis_rules()) + if axis_min is not None or axis_max is not None + ) + parts.append(f"[{bracket_ranges}]") + if self._is_brace_layer(): + parts.append(f"{{{', '.join(ntos(v) for v in self._brace_coordinates())}}}") + # if neither of the above, the layer's got no layerKey + return " ".join(parts) or None + anchors = property( lambda self: LayerAnchorsProxy(self), lambda self, value: LayerAnchorsProxy(self).setter(value), @@ -3922,40 +3982,42 @@ def _is_bracket_layer(self): return "axisRules" in self.attributes # Glyphs 3 return re.match(self.BRACKET_LAYER_RE, self.name) # Glyphs 2 - def _bracket_info(self, axes): - # Returns a region expressed as a {axis_tag: (min, max)} box - # (dictionary), once the axes have been computed + def _bracket_axis_rules(self): if not self._is_bracket_layer(): - return {} - + return if self.parent.parent.format_version > 2: # Glyphs 3 - info = {} - for axis, rule in zip(axes, self.attributes["axisRules"]): - if "min" not in rule and "max" not in rule: - continue - # Rules are expressed in designspace coordinates, - # so map appropriately. - designspace_min, designspace_max = designspace_min_max(axis) - axis_min = rule.get("min", designspace_min) - axis_max = rule.get("max", designspace_max) + for rule in self.attributes["axisRules"]: + axis_min = rule.get("min") + axis_max = rule.get("max") if isinstance(axis_min, str): axis_min = float(axis_min) if isinstance(axis_max, str): axis_max = float(axis_max) - info[axis.tag] = (axis_min, axis_max) - return info + yield (axis_min, axis_max) + return # Glyphs 2 m = re.match(self.BRACKET_LAYER_RE, self.name) - axis = axes[0] # For glyphs 2 - designspace_min, designspace_max = designspace_min_max(axis) reverse = m.group("first_bracket") == "]" bracket_crossover = int(m.group("value")) if reverse: - return {axis.tag: (designspace_min, bracket_crossover)} + yield (None, bracket_crossover) else: - return {axis.tag: (bracket_crossover, designspace_max)} + yield (bracket_crossover, None) + + def _bracket_info(self, axes): + # Returns a region expressed as a {axis_tag: (min, max)} box + # (dictionary), once the axes have been computed + info = {} + for axis, (axis_min, axis_max) in zip(axes, self._bracket_axis_rules()): + # Rules are expressed in designspace coordinates, + # so map appropriately. + designspace_min, designspace_max = designspace_min_max(axis) + axis_min = axis_min if axis_min is not None else designspace_min + axis_max = axis_max if axis_max is not None else designspace_max + info[axis.tag] = (axis_min, axis_max) + return info def _is_brace_layer(self): if self.parent.parent.format_version > 2: @@ -3990,6 +4052,35 @@ def _brace_layer_name(self): # Glyphs 2 return self.name + ICOLOR_LAYER_RE = re.compile(r"^iColor (?P\d+)$") + + def _is_sbix_color_layer(self): + if self.parent.parent.format_version > 2: + return "sbixStrike" in self.attributes # Glyphs 3 + return re.match(self.ICOLOR_LAYER_RE, self.name.strip()) # Glyphs 2 + + def _sbix_strike(self): + if not self._is_sbix_color_layer(): + return None + + if self.parent.parent.format_version > 2: + # Glyphs 3 + return int(self.attributes["sbixStrike"]) + + # Glyphs 2 + m = re.match(self.ICOLOR_LAYER_RE, self.name) + strike = m.group("strike") + return int(strike) + + def _is_svg_layer(self): + # Glyphs 3 only; not even sure if Glyphs 2 ever supported SVG layers + return bool(self.attributes.get("svg")) + + def _is_color_layer(self): + # COLRv1-style gradients etc. Glyph 3 only, no Glyphs 2 equivalent. + # Not to be confused with so-called "color palette layers" (COLRv0). + return bool(self.attributes.get("color")) + COLOR_PALETTE_LAYER_RE = re.compile(r"^Color (?P\*|\d+)$") def _is_color_palette_layer(self): diff --git a/Lib/glyphsLib/types.py b/Lib/glyphsLib/types.py index 797cddfe7..2674936ee 100755 --- a/Lib/glyphsLib/types.py +++ b/Lib/glyphsLib/types.py @@ -365,6 +365,16 @@ def writeIntlist(val): return _mutate_list(str, val) +def floatToString2(f: float) -> str: + """Return float f as a string with two decimal places without trailing zeros + and dot. + + Intended for ('brace') intermediate layer coordinates and ('bracket') alternate + layer axis ranges. + """ + return f"{f:.2f}".rstrip("0").rstrip(".") + + def floatToString3(f: float) -> str: """Return float f as a string with three decimal places without trailing zeros and dot. From 9cebe81ee3e604980f93f9930a0238ed69127899 Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Mon, 12 Aug 2024 13:01:05 +0100 Subject: [PATCH 2/3] dedup color palette key; use short axis tags for bracket key --- Lib/glyphsLib/classes.py | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/Lib/glyphsLib/classes.py b/Lib/glyphsLib/classes.py index fccb13f0f..b162de664 100755 --- a/Lib/glyphsLib/classes.py +++ b/Lib/glyphsLib/classes.py @@ -1247,6 +1247,17 @@ def __init__(self, name="", tag="", hidden=False): def __eq__(self, other): return self.name == other.name and self.axisTag == other.axisTag + @property + def shortAxisTag(self): + shortAxisTagMapping = { + "ital": "it", + "opsz": "oz", + "slnt": "sl", + "wdth": "wd", + "wght": "wg", + } + return shortAxisTagMapping.get(self.axisTag, self.axisTag) + GSAxis._add_parsers( [ @@ -3772,7 +3783,22 @@ def layerKey(self) -> str | None: index = self._color_palette_index() if index == 0xFFFF: index = "*" - parts.append(str(index)) + color_key = str(index) + # There can be more than one layer with the same palette index that + # are associated with the same master, so we need to add a counter + # suffix to distinguish them. + count = 0 + for layer in self.parent.layers: + if layer is self: + break + if ( + layer.associatedMasterId == self.associatedMasterId + and layer._color_palette_index() == index + ): + count += 1 + if count > 0: + color_key = f"{color_key}_{count}" + parts.append(color_key) elif self._is_sbix_color_layer(): parts.extend(["iColor", str(self._sbix_strike())]) elif self._is_svg_layer(): @@ -3790,12 +3816,12 @@ def layerKey(self) -> str | None: parts.append(master.name) bracket_ranges = ",".join( ( - (f"{ntos(axis_min)}‹{axis.axisTag}‹{ntos(axis_max)}") + (f"{ntos(axis_min)}‹{axis.shortAxisTag}‹{ntos(axis_max)}") if axis_min is not None and axis_max is not None else ( - f"{ntos(axis_min)}‹{axis.axisTag}" + f"{ntos(axis_min)}‹{axis.shortAxisTag}" if axis_min is not None - else f"{axis.axisTag}‹{ntos(axis_max)}" + else f"{axis.shortAxisTag}‹{ntos(axis_max)}" ) ) for axis, (axis_min, axis_max) in zip(axes, self._bracket_axis_rules()) From 9179b14b82f0a49595f14abe7eb3159e78b55349 Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Mon, 12 Aug 2024 13:02:34 +0100 Subject: [PATCH 3/3] add test for layerKey() (copied from Georg's 'Glyphs3-merge' branch at https://github.com/googlefonts/glyphsLib/commit/94cbdff087c18b494cdb2f3f79315306a5eb3059#diff-26bf19f0033af047cb00baaa81072c72d6fdf13a214e396fc0499e97bb102490) --- tests/classes_test.py | 40 + tests/data/LayerKeysTestv3.glyphs | 1771 +++++++++++++++++++++++++++++ 2 files changed, 1811 insertions(+) create mode 100644 tests/data/LayerKeysTestv3.glyphs diff --git a/tests/classes_test.py b/tests/classes_test.py index 22b9492f6..0a1b89e35 100755 --- a/tests/classes_test.py +++ b/tests/classes_test.py @@ -1890,5 +1890,45 @@ def test_indxing_by_name(self): assert self.font.features["aalt"] in self.font.features +def test_GSLayer_layerKey(datadir): + # https://github.com/googlefonts/glyphsLib/issues/1017 + font = GSFont(str(datadir / "LayerKeysTestv3.glyphs")) + + glyph = font.glyphs["grinningFace"] + for i in (0, 1): + # master layers without attributes have no layerKey + layer = glyph.layers[i] + assert layer._is_master_layer + assert not layer.attributes + assert layer.layerKey() is None + assert glyph.layers[2].layerKey() == "Color 1" + assert glyph.layers[3].layerKey() == "Color 0" + assert glyph.layers[4].layerKey() == "Color 2" + # layer with existing palette index (and same associated master) gets de-duped + assert glyph.layers[2].associatedMasterId == glyph.layers[5].associatedMasterId + assert glyph.layers[5].layerKey() == "Color 0_1" + assert glyph.layers[6].layerKey() == "Color" + + glyph = font.glyphs["grinningFaceWithSmilingEyes"] + # layers[2] and [3] have the same palette index but are associated with + # different masters do not get de-duped + assert glyph.layers[2].layerKey() == "Color 1" + assert glyph.layers[2].associatedMasterId != glyph.layers[3].associatedMasterId + assert glyph.layers[3].layerKey() == "Color 1" + # also note how multiple attributes can be combined in a key + # (in this case colorPalettes and brace coordinates} + assert glyph.layers[4].layerKey() == "Color 1_1 {45}" + assert glyph.layers[5].layerKey() == "{45}" + + glyph = font.glyphs["dollar"] + # master layers with bracket axisRules attribute *do* have a layerKey + layer = glyph.layers[1] + assert layer._is_master_layer + assert "axisRules" in layer.attributes + assert layer.layerKey() == "Regular [45‹wg]" + assert glyph.layers[2].layerKey() == "Light [45‹wg]" + assert glyph.layers[3].layerKey() == "Regular []" + + if __name__ == "__main__": unittest.main() diff --git a/tests/data/LayerKeysTestv3.glyphs b/tests/data/LayerKeysTestv3.glyphs new file mode 100644 index 000000000..3c7c4a72f --- /dev/null +++ b/tests/data/LayerKeysTestv3.glyphs @@ -0,0 +1,1771 @@ +{ +.appVersion = "3316"; +.formatVersion = 3; +DisplayStrings = ( +"", +"", +"😀", +"$😁😀" +); +axes = ( +{ +name = Weight; +tag = wght; +} +); +customParameters = ( +{ +name = "Color Palettes"; +value = ( +( +(39,255), +(255,222,0,255), +(227,0,4,255) +) +); +} +); +date = "2015-06-08 08:53:00 +0000"; +familyName = LayerKeysTestv3; +fontMaster = ( +{ +axesValues = ( +17 +); +customParameters = ( +{ +name = TTFStems; +value = ( +{ +horizontal = 1; +name = Thin; +width = 16; +}, +{ +horizontal = 1; +name = Lowercase; +width = 16; +}, +{ +horizontal = 1; +name = Uppercase; +width = 18; +} +); +} +); +guides = ( +{ +pos = (-113,574); +}, +{ +pos = (524,141); +}, +{ +pos = (-113,765); +}, +{ +pos = (524,-122); +} +); +iconName = Light; +id = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; +metricValues = ( +{ +over = 10; +pos = 800; +}, +{ +over = 10; +pos = 700; +}, +{ +over = 10; +pos = 470; +}, +{ +over = -10; +}, +{ +over = -10; +pos = -200; +}, +{ +over = 10; +pos = 520; +}, +{ +} +); +name = Light; +stemValues = ( +16, +16, +18, +17, +19 +); +userData = { +GSOffsetHorizontal = 9; +GSOffsetMakeStroke = 1; +GSOffsetVertical = 9; +GSRoughenHorizontal = 15; +GSRoughenSegmentLength = 15; +GSRoughenVertical = 10; +com.schriftgestaltung.Glyphs.ufoData = { +customBinaryData = <746865206279746573>; +}; +noodleExtremesAndInflections = 1; +noodleRemoveOverlap = 0; +noodleThickness = "106.0"; +}; +}, +{ +axesValues = ( +90 +); +customParameters = ( +{ +name = TTFStems; +value = ( +{ +horizontal = 1; +name = Thin; +width = 80; +}, +{ +horizontal = 1; +name = Lowercase; +width = 88; +}, +{ +horizontal = 1; +name = Uppercase; +width = 91; +} +); +} +); +guides = ( +{ +pos = (-126,593); +}, +{ +locked = 1; +pos = (-126,90); +}, +{ +pos = (-113,773); +}, +{ +pos = (524,-133); +}, +{ +pos = (-126,321); +}, +{ +pos = (-113,959); +} +); +id = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; +metricValues = ( +{ +over = 12; +pos = 800; +}, +{ +over = 12; +pos = 700; +}, +{ +over = 12; +pos = 480; +}, +{ +over = -12; +}, +{ +over = -12; +pos = -200; +}, +{ +over = 12; +pos = 530; +}, +{ +} +); +name = Regular; +stemValues = ( +80, +88, +91, +90, +93 +); +userData = { +GSOffsetHorizontal = 45; +GSOffsetMakeStroke = 1; +GSOffsetVertical = 44; +GSRoughenHorizontal = 15; +GSRoughenSegmentLength = 15; +GSRoughenVertical = 10; +}; +} +); +glyphs = ( +{ +glyphname = grinningFace; +lastChange = "2024-08-10 20:25:52 +0000"; +layers = ( +{ +layerId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; +shapes = ( +{ +closed = 1; +nodes = ( +(725,-114,o), +(921,82,o), +(921,324,cs), +(921,566,o), +(725,762,o), +(483,762,cs), +(241,762,o), +(45,566,o), +(45,324,cs), +(45,82,o), +(241,-114,o), +(483,-114,cs) +); +}, +{ +closed = 1; +nodes = ( +(258,-84,o), +(75,99,o), +(75,324,cs), +(75,549,o), +(258,732,o), +(483,732,cs), +(708,732,o), +(891,549,o), +(891,324,cs), +(891,99,o), +(708,-84,o), +(483,-84,cs) +); +}, +{ +closed = 1; +nodes = ( +(333,409,o), +(351,427,o), +(351,450,cs), +(351,473,o), +(333,491,o), +(310,491,cs), +(287,491,o), +(269,473,o), +(269,450,cs), +(269,427,o), +(287,409,o), +(310,409,cs) +); +}, +{ +closed = 1; +nodes = ( +(713,409,o), +(731,427,o), +(731,450,cs), +(731,473,o), +(713,491,o), +(690,491,cs), +(667,491,o), +(649,473,o), +(649,450,cs), +(649,427,o), +(667,409,o), +(690,409,cs) +); +}, +{ +attr = { +lineCapEnd = 1; +lineCapStart = 1; +strokeWidth = 30; +}; +closed = 0; +nodes = ( +(240,198,l), +(378,60,o), +(588,60,o), +(726,198,c) +); +} +); +width = 966; +}, +{ +layerId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; +shapes = ( +{ +closed = 1; +nodes = ( +(725,-114,o), +(921,82,o), +(921,324,cs), +(921,566,o), +(725,762,o), +(483,762,cs), +(241,762,o), +(45,566,o), +(45,324,cs), +(45,82,o), +(241,-114,o), +(483,-114,cs) +); +}, +{ +closed = 1; +nodes = ( +(286,-34,o), +(125,127,o), +(125,324,cs), +(125,521,o), +(286,682,o), +(483,682,cs), +(680,682,o), +(841,521,o), +(841,324,cs), +(841,127,o), +(680,-34,o), +(483,-34,cs) +); +}, +{ +closed = 1; +nodes = ( +(374,389,o), +(401,416,o), +(401,450,cs), +(401,484,o), +(374,511,o), +(340,511,cs), +(306,511,o), +(279,484,o), +(279,450,cs), +(279,416,o), +(306,389,o), +(340,389,cs) +); +}, +{ +closed = 1; +nodes = ( +(674,389,o), +(701,416,o), +(701,450,cs), +(701,484,o), +(674,511,o), +(640,511,cs), +(606,511,o), +(579,484,o), +(579,450,cs), +(579,416,o), +(606,389,o), +(640,389,cs) +); +}, +{ +attr = { +lineCapEnd = 1; +lineCapStart = 1; +strokeWidth = 80; +}; +closed = 0; +nodes = ( +(240,228,l), +(378,90,o), +(588,90,o), +(726,228,c) +); +} +); +width = 966; +}, +{ +associatedMasterId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; +attr = { +colorPalette = 1; +}; +layerId = "EE1C3952-4381-4B66-8A22-C146DDB76D36"; +name = "10. Aug 24 at 22:21"; +shapes = ( +{ +closed = 1; +nodes = ( +(725,-114,o), +(921,82,o), +(921,324,cs), +(921,566,o), +(725,762,o), +(483,762,cs), +(241,762,o), +(45,566,o), +(45,324,cs), +(45,82,o), +(241,-114,o), +(483,-114,cs) +); +} +); +width = 966; +}, +{ +associatedMasterId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; +attr = { +colorPalette = 0; +}; +layerId = "3AEF17B9-D0FB-49BD-813F-8DBEEF962F6B"; +name = "10. Aug 24 at 22:22"; +shapes = ( +{ +closed = 1; +nodes = ( +(725,-114,o), +(921,82,o), +(921,324,cs), +(921,566,o), +(725,762,o), +(483,762,cs), +(241,762,o), +(45,566,o), +(45,324,cs), +(45,82,o), +(241,-114,o), +(483,-114,cs) +); +}, +{ +closed = 1; +nodes = ( +(258,-84,o), +(75,99,o), +(75,324,cs), +(75,549,o), +(258,732,o), +(483,732,cs), +(708,732,o), +(891,549,o), +(891,324,cs), +(891,99,o), +(708,-84,o), +(483,-84,cs) +); +} +); +width = 966; +}, +{ +associatedMasterId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; +attr = { +colorPalette = 2; +}; +layerId = "11297AE3-BA7F-4BA3-ABA1-6F46391579E0"; +name = "10. Aug 24 at 22:23"; +shapes = ( +{ +attr = { +lineCapEnd = 1; +lineCapStart = 1; +strokeWidth = 30; +}; +closed = 0; +nodes = ( +(240,198,l), +(378,60,o), +(588,60,o), +(726,198,c) +); +} +); +width = 966; +}, +{ +associatedMasterId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; +attr = { +colorPalette = 0; +}; +layerId = "A495203A-72CD-4B17-8155-CDD670BEB755"; +name = "Color 0 10. Aug 24 at 22:23"; +shapes = ( +{ +closed = 1; +nodes = ( +(333,409,o), +(351,427,o), +(351,450,cs), +(351,473,o), +(333,491,o), +(310,491,cs), +(287,491,o), +(269,473,o), +(269,450,cs), +(269,427,o), +(287,409,o), +(310,409,cs) +); +}, +{ +closed = 1; +nodes = ( +(713,409,o), +(731,427,o), +(731,450,cs), +(731,473,o), +(713,491,o), +(690,491,cs), +(667,491,o), +(649,473,o), +(649,450,cs), +(649,427,o), +(667,409,o), +(690,409,cs) +); +} +); +width = 966; +}, +{ +associatedMasterId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; +attr = { +color = 1; +}; +layerId = "800A1ADF-9B59-474E-8745-EDEE046FD5A5"; +name = "10. Aug 24 at 22:24"; +shapes = ( +{ +attr = { +gradient = { +colors = ( +( +(255,252,0,255), +0 +), +( +(255,183,0,255), +1 +) +); +end = (0,0); +start = (0.3978,0.4249); +type = circle; +}; +}; +closed = 1; +nodes = ( +(725,-114,o), +(921,82,o), +(921,324,cs), +(921,566,o), +(725,762,o), +(483,762,cs), +(241,762,o), +(45,566,o), +(45,324,cs), +(45,82,o), +(241,-114,o), +(483,-114,cs) +); +}, +{ +attr = { +fillColor = (2,202,252,255); +strokeColor = (64,255); +strokeWidth = 10; +}; +closed = 1; +nodes = ( +(374,389,o), +(401,416,o), +(401,450,cs), +(401,484,o), +(374,511,o), +(340,511,cs), +(306,511,o), +(279,484,o), +(279,450,cs), +(279,416,o), +(306,389,o), +(340,389,cs) +); +}, +{ +attr = { +fillColor = (2,202,252,255); +strokeColor = (64,255); +strokeWidth = 10; +}; +closed = 1; +nodes = ( +(674,389,o), +(701,416,o), +(701,450,cs), +(701,484,o), +(674,511,o), +(640,511,cs), +(606,511,o), +(579,484,o), +(579,450,cs), +(579,416,o), +(606,389,o), +(640,389,cs) +); +}, +{ +attr = { +lineCapEnd = 1; +lineCapStart = 1; +strokeColor = (195,31,34,255); +strokeWidth = 80; +}; +closed = 0; +nodes = ( +(240,228,l), +(397,85,o), +(588,90,o), +(726,228,c) +); +} +); +width = 966; +} +); +unicode = 128512; +}, +{ +glyphname = grinningFaceWithSmilingEyes; +lastChange = "2024-08-10 22:15:48 +0000"; +layers = ( +{ +layerId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; +shapes = ( +{ +closed = 1; +nodes = ( +(414,-114,o), +(521,82,o), +(521,324,cs), +(521,566,o), +(414,762,o), +(283,762,cs), +(152,762,o), +(45,566,o), +(45,324,cs), +(45,82,o), +(152,-114,o), +(283,-114,cs) +); +} +); +width = 566; +}, +{ +layerId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; +shapes = ( +{ +closed = 1; +nodes = ( +(725,-114,o), +(921,82,o), +(921,324,cs), +(921,566,o), +(725,762,o), +(483,762,cs), +(241,762,o), +(45,566,o), +(45,324,cs), +(45,82,o), +(241,-114,o), +(483,-114,cs) +); +} +); +width = 966; +}, +{ +associatedMasterId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; +attr = { +colorPalette = 1; +}; +layerId = "6BBC8B29-B5B3-49A1-9CFF-3CA19F10C72F"; +name = "11. Aug 24 at 00:08"; +shapes = ( +{ +closed = 1; +nodes = ( +(414,-114,o), +(521,82,o), +(521,324,cs), +(521,566,o), +(414,762,o), +(283,762,cs), +(152,762,o), +(45,566,o), +(45,324,cs), +(45,82,o), +(152,-114,o), +(283,-114,cs) +); +} +); +width = 566; +}, +{ +associatedMasterId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; +attr = { +colorPalette = 1; +}; +layerId = "5BF50499-C406-4FAD-A312-E8CA722ECE26"; +name = "11. Aug 24 at 00:08"; +shapes = ( +{ +closed = 1; +nodes = ( +(725,-114,o), +(921,82,o), +(921,324,cs), +(921,566,o), +(725,762,o), +(483,762,cs), +(241,762,o), +(45,566,o), +(45,324,cs), +(45,82,o), +(241,-114,o), +(483,-114,cs) +); +} +); +width = 966; +}, +{ +associatedMasterId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; +attr = { +colorPalette = 1; +coordinates = ( +45 +); +}; +layerId = "7EF06041-D36F-4796-86E2-1734155B3E6C"; +name = "11. Aug 24 at 00:09"; +shapes = ( +{ +closed = 1; +nodes = ( +(414,86,o), +(521,193,o), +(521,324,cs), +(521,455,o), +(414,562,o), +(283,562,cs), +(152,562,o), +(45,455,o), +(45,324,cs), +(45,193,o), +(152,86,o), +(283,86,cs) +); +} +); +width = 566; +}, +{ +associatedMasterId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; +attr = { +coordinates = ( +45 +); +}; +layerId = "FDAFDB4D-B2F7-4124-9F4D-41693BE050CB"; +name = "{45} 11. Aug 24 at 00:09"; +shapes = ( +{ +closed = 1; +nodes = ( +(414,86,o), +(521,193,o), +(521,324,cs), +(521,455,o), +(414,562,o), +(283,562,cs), +(152,562,o), +(45,455,o), +(45,324,cs), +(45,193,o), +(152,86,o), +(283,86,cs) +); +} +); +width = 566; +} +); +unicode = 128513; +}, +{ +glyphname = dollar; +lastChange = "2024-08-10 22:18:56 +0000"; +layers = ( +{ +layerId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; +shapes = ( +{ +closed = 1; +nodes = ( +(171,-17,o), +(207,150,o), +(207,355,cs), +(207,560,o), +(171,727,o), +(126,727,cs), +(81,727,o), +(45,560,o), +(45,355,cs), +(45,150,o), +(81,-17,o), +(126,-17,cs) +); +}, +{ +closed = 1; +nodes = ( +(462,-17,o), +(504,148,o), +(504,351,cs), +(504,554,o), +(462,719,o), +(411,719,cs), +(360,719,o), +(318,554,o), +(318,351,cs), +(318,148,o), +(360,-17,o), +(411,-17,cs) +); +} +); +width = 549; +}, +{ +attr = { +axisRules = ( +{ +min = 45; +} +); +}; +layerId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; +shapes = ( +{ +closed = 1; +nodes = ( +(421,-16,o), +(530,149,o), +(530,352,cs), +(530,554,o), +(421,719,o), +(288,719,cs), +(154,719,o), +(45,554,o), +(45,352,cs), +(45,149,o), +(154,-16,o), +(288,-16,cs) +); +} +); +width = 575; +}, +{ +associatedMasterId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; +attr = { +axisRules = ( +{ +min = 45; +} +); +}; +layerId = "3CAAB241-6B8F-4B3B-8B0E-F2B1B115B20F"; +name = "11. Aug 24 at 00:16"; +shapes = ( +{ +closed = 1; +nodes = ( +(171,-17,o), +(207,150,o), +(207,355,cs), +(207,560,o), +(171,727,o), +(126,727,cs), +(81,727,o), +(45,560,o), +(45,355,cs), +(45,150,o), +(81,-17,o), +(126,-17,cs) +); +} +); +width = 252; +}, +{ +associatedMasterId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; +attr = { +axisRules = ( +{ +} +); +}; +layerId = "D3B891F0-34CE-46B4-A463-CB22A30974A5"; +name = "11. Aug 24 at 00:17"; +shapes = ( +{ +closed = 1; +nodes = ( +(300,-16,o), +(374,149,o), +(374,352,cs), +(374,554,o), +(300,719,o), +(210,719,cs), +(119,719,o), +(45,554,o), +(45,352,cs), +(45,149,o), +(119,-16,o), +(210,-16,cs) +); +}, +{ +closed = 1; +nodes = ( +(700,-16,o), +(774,149,o), +(774,352,cs), +(774,554,o), +(700,719,o), +(610,719,cs), +(519,719,o), +(445,554,o), +(445,352,cs), +(445,149,o), +(519,-16,o), +(610,-16,cs) +); +} +); +width = 819; +} +); +metricLeft = "=45"; +metricRight = "=45"; +unicode = 36; +} +); +kerningLTR = { +"C4872ECA-A3A9-40AB-960A-1DB2202F16DE" = { +"@MMK_L_A" = { +"@MMK_R_J" = -30; +"@MMK_R_O" = -20; +"@MMK_R_T" = -100; +"@MMK_R_U" = -20; +"@MMK_R_V" = -10; +"@MMK_R_Y" = -40; +"@MMK_R_o" = -10; +"@MMK_R_quote" = -60; +"@MMK_R_quoteright" = -60; +"@MMK_R_t" = -30; +"@MMK_R_u" = -20; +"@MMK_R_v" = -20; +"@MMK_R_w" = -20; +"@MMK_R_y" = -20; +}; +"@MMK_L_B" = { +"@MMK_R_T" = -50; +"@MMK_R_V" = -30; +"@MMK_R_Y" = -40; +"@MMK_R_v" = -10; +}; +"@MMK_L_C" = { +"@MMK_R_O" = -20; +"@MMK_R_o" = -10; +}; +"@MMK_L_E" = { +"@MMK_R_O" = -20; +"@MMK_R_V" = -20; +"@MMK_R_Y" = -20; +}; +"@MMK_L_F" = { +"@MMK_R_A" = -60; +"@MMK_R_O" = -30; +"@MMK_R_a" = -50; +"@MMK_R_o" = -50; +}; +"@MMK_L_K" = { +"@MMK_R_O" = -30; +"@MMK_R_a" = -30; +"@MMK_R_o" = -30; +"@MMK_R_v" = -30; +"@MMK_R_y" = -20; +}; +"@MMK_L_L" = { +"@MMK_R_O" = -70; +"@MMK_R_T" = -110; +"@MMK_R_U" = -20; +"@MMK_R_V" = -90; +"@MMK_R_Y" = -110; +"@MMK_R_a" = -20; +"@MMK_R_o" = -20; +"@MMK_R_quote" = -80; +"@MMK_R_quoteright" = -80; +"@MMK_R_t" = -40; +"@MMK_R_u" = -20; +"@MMK_R_v" = -70; +}; +"@MMK_L_M" = { +"@MMK_R_O" = -20; +"@MMK_R_T" = -40; +"@MMK_R_V" = -20; +"@MMK_R_Y" = -30; +"@MMK_R_o" = -10; +"@MMK_R_v" = -20; +}; +"@MMK_L_O" = { +"@MMK_R_A" = -20; +"@MMK_R_J" = -30; +"@MMK_R_M" = -20; +"@MMK_R_T" = -60; +"@MMK_R_V" = -10; +"@MMK_R_X" = -30; +"@MMK_R_Y" = -20; +"@MMK_R_Z" = -40; +"@MMK_R_quoteright" = -20; +}; +"@MMK_L_P" = { +"@MMK_R_A" = -40; +"@MMK_R_V" = -10; +"@MMK_R_Y" = -20; +"@MMK_R_a" = -20; +"@MMK_R_o" = -20; +"@MMK_R_s" = -10; +}; +"@MMK_L_R" = { +"@MMK_R_O" = -20; +"@MMK_R_T" = -30; +"@MMK_R_V" = -20; +"@MMK_R_Y" = -30; +"@MMK_R_a" = -30; +"@MMK_R_o" = -30; +"@MMK_R_u" = -10; +"@MMK_R_v" = -20; +"@MMK_R_y" = -20; +}; +"@MMK_L_S" = { +"@MMK_R_T" = -20; +"@MMK_R_V" = -20; +}; +"@MMK_L_T" = { +"@MMK_R_A" = -100; +"@MMK_R_M" = -50; +"@MMK_R_O" = -60; +"@MMK_R_S" = -40; +"@MMK_R_a" = -130; +"@MMK_R_h" = -70; +"@MMK_R_n" = -80; +"@MMK_R_o" = -140; +"@MMK_R_s" = -120; +"@MMK_R_v" = -100; +"@MMK_R_w" = -100; +"@MMK_R_y" = -90; +}; +"@MMK_L_U" = { +"@MMK_R_A" = -20; +}; +"@MMK_L_V" = { +"@MMK_R_A" = -10; +"@MMK_R_M" = -20; +"@MMK_R_O" = -10; +"@MMK_R_S" = -20; +"@MMK_R_a" = -60; +"@MMK_R_o" = -60; +}; +"@MMK_L_W" = { +"@MMK_R_o" = -50; +}; +"@MMK_L_X" = { +"@MMK_R_O" = -30; +"@MMK_R_o" = -30; +}; +"@MMK_L_Y" = { +"@MMK_R_A" = -40; +"@MMK_R_M" = -30; +"@MMK_R_O" = -20; +"@MMK_R_a" = -90; +"@MMK_R_o" = -80; +}; +"@MMK_L_Z" = { +"@MMK_R_O" = -30; +"@MMK_R_a" = -50; +"@MMK_R_o" = -50; +"@MMK_R_u" = -30; +}; +"@MMK_L_a" = { +"@MMK_R_T" = -120; +"@MMK_R_V" = -50; +"@MMK_R_Y" = -70; +"@MMK_R_Z" = -20; +}; +"@MMK_L_c" = { +"@MMK_R_o" = -10; +}; +"@MMK_L_comma" = { +"@MMK_R_four" = -70; +"@MMK_R_seven" = -100; +"@MMK_R_six" = -30; +"@MMK_R_space" = -50; +"@MMK_R_y" = 30; +"@MMK_R_zero" = -70; +}; +"@MMK_L_e" = { +"@MMK_R_T" = -140; +"@MMK_R_V" = -60; +"@MMK_R_W" = -50; +"@MMK_R_X" = -10; +"@MMK_R_Y" = -80; +"@MMK_R_Z" = -20; +"@MMK_R_a" = -15; +"@MMK_R_f" = -10; +"@MMK_R_quoteright" = -20; +"@MMK_R_t" = -10; +"@MMK_R_v" = -10; +"@MMK_R_y" = -10; +"@MMK_R_z" = 0; +}; +"@MMK_L_eight" = { +"@MMK_R_quote" = -10; +}; +"@MMK_L_f" = { +"@MMK_R_a" = -30; +"@MMK_R_g" = -40; +"@MMK_R_o" = -30; +"@MMK_R_quote" = 110; +"@MMK_R_quoteright" = 80; +}; +"@MMK_L_five" = { +"@MMK_R_quote" = -20; +"@MMK_R_seven" = -30; +}; +"@MMK_L_four" = { +"@MMK_R_comma" = -60; +"@MMK_R_five" = -20; +"@MMK_R_nine" = -20; +"@MMK_R_one" = -20; +"@MMK_R_quote" = -60; +"@MMK_R_seven" = -50; +"@MMK_R_two" = -20; +}; +"@MMK_L_g" = { +"@MMK_R_quote" = 30; +"@MMK_R_quoteright" = 40; +}; +"@MMK_L_i" = { +"@MMK_R_quoteright" = 30; +}; +"@MMK_L_j" = { +"@MMK_R_quoteright" = 30; +}; +"@MMK_L_k" = { +"@MMK_R_a" = -10; +"@MMK_R_quoteright" = 10; +}; +"@MMK_L_n" = { +"@MMK_R_T" = -90; +"@MMK_R_quote" = -30; +"@MMK_R_v" = -10; +}; +"@MMK_L_nine" = { +"@MMK_R_comma" = -70; +"@MMK_R_two" = -30; +}; +"@MMK_L_o" = { +"@MMK_R_A" = -10; +"@MMK_R_J" = -20; +"@MMK_R_T" = -140; +"@MMK_R_V" = -60; +"@MMK_R_W" = -50; +"@MMK_R_X" = -30; +"@MMK_R_Y" = -80; +"@MMK_R_Z" = -40; +"@MMK_R_f" = -10; +"@MMK_R_j" = -15; +"@MMK_R_quote" = -20; +"@MMK_R_quoteright" = -20; +"@MMK_R_t" = -10; +"@MMK_R_v" = -20; +"@MMK_R_x" = -20; +"@MMK_R_y" = -10; +"@MMK_R_z" = -10; +}; +"@MMK_L_one" = { +"@MMK_R_quote" = -40; +"@MMK_R_seven" = -30; +"@MMK_R_six" = -20; +"@MMK_R_zero" = -20; +}; +"@MMK_L_quote" = { +"@MMK_R_A" = -60; +"@MMK_R_eight" = -20; +"@MMK_R_f" = 60; +"@MMK_R_four" = -80; +"@MMK_R_g" = -60; +"@MMK_R_o" = -20; +"@MMK_R_s" = -40; +"@MMK_R_seven" = 20; +"@MMK_R_six" = -20; +"@MMK_R_t" = 60; +"@MMK_R_zero" = -20; +}; +"@MMK_L_quoteright" = { +"@MMK_R_A" = -60; +"@MMK_R_O" = -30; +"@MMK_R_f" = 20; +"@MMK_R_g" = -60; +"@MMK_R_i" = 30; +"@MMK_R_j" = 30; +"@MMK_R_o" = -40; +"@MMK_R_s" = -70; +"@MMK_R_t" = 40; +}; +"@MMK_L_r" = { +"@MMK_R_a" = -20; +"@MMK_R_g" = -30; +"@MMK_R_o" = -20; +"@MMK_R_quote" = 50; +"@MMK_R_quoteright" = 30; +"@MMK_R_s" = -10; +}; +"@MMK_L_s" = { +"@MMK_R_T" = -120; +"@MMK_R_quoteright" = 0; +"@MMK_R_v" = -10; +}; +"@MMK_L_seven" = { +"@MMK_R_comma" = -90; +"@MMK_R_four" = -30; +"@MMK_R_one" = 30; +"@MMK_R_quote" = 20; +"@MMK_R_six" = -20; +"@MMK_R_zero" = -20; +}; +"@MMK_L_six" = { +"@MMK_R_nine" = -20; +"@MMK_R_quote" = -20; +"@MMK_R_seven" = -20; +}; +"@MMK_L_t" = { +"@MMK_R_a" = -20; +"@MMK_R_o" = -20; +"@MMK_R_quote" = 20; +"@MMK_R_quoteright" = 30; +}; +"@MMK_L_three" = { +"@MMK_R_seven" = -20; +}; +"@MMK_L_two" = { +"@MMK_R_four" = -20; +"@MMK_R_seven" = -10; +}; +"@MMK_L_v" = { +"@MMK_R_A" = -20; +"@MMK_R_T" = -100; +"@MMK_R_a" = -20; +"@MMK_R_g" = -30; +"@MMK_R_o" = -20; +"@MMK_R_s" = -25; +}; +"@MMK_L_w" = { +"@MMK_R_A" = -20; +"@MMK_R_T" = -100; +}; +"@MMK_L_x" = { +"@MMK_R_o" = -20; +}; +"@MMK_L_y" = { +"@MMK_R_A" = -10; +"@MMK_R_T" = -90; +"@MMK_R_a" = -15; +"@MMK_R_comma" = -50; +"@MMK_R_g" = -20; +"@MMK_R_o" = -10; +}; +"@MMK_L_z" = { +"@MMK_R_o" = -10; +}; +"@MMK_L_zero" = { +"@MMK_R_comma" = -60; +"@MMK_R_quote" = -20; +}; +}; +"3E7589AA-8194-470F-8E2F-13C1C581BE24" = { +"@MMK_L_A" = { +"@MMK_R_J" = -20; +"@MMK_R_O" = -30; +"@MMK_R_T" = -80; +"@MMK_R_U" = -20; +"@MMK_R_V" = -50; +"@MMK_R_Y" = -70; +"@MMK_R_o" = -20; +"@MMK_R_quote" = -60; +"@MMK_R_quoteright" = -60; +"@MMK_R_t" = -30; +"@MMK_R_u" = -20; +"@MMK_R_v" = -40; +"@MMK_R_w" = -30; +"@MMK_R_y" = -30; +}; +"@MMK_L_B" = { +"@MMK_R_T" = -30; +"@MMK_R_V" = -20; +"@MMK_R_Y" = -50; +"@MMK_R_v" = -10; +}; +"@MMK_L_C" = { +"@MMK_R_O" = -30; +"@MMK_R_o" = -10; +"@MMK_R_quoteright" = 20; +}; +"@MMK_L_E" = { +"@MMK_R_O" = -10; +"@MMK_R_V" = -20; +"@MMK_R_Y" = -20; +}; +"@MMK_L_F" = { +"@MMK_R_A" = -40; +"@MMK_R_O" = -20; +"@MMK_R_a" = -50; +"@MMK_R_o" = -40; +}; +"@MMK_L_K" = { +"@MMK_R_O" = -40; +"@MMK_R_a" = -40; +"@MMK_R_o" = -45; +"@MMK_R_v" = -40; +"@MMK_R_y" = -30; +}; +"@MMK_L_L" = { +"@MMK_R_O" = -40; +"@MMK_R_T" = -130; +"@MMK_R_U" = -30; +"@MMK_R_V" = -80; +"@MMK_R_Y" = -120; +"@MMK_R_a" = -20; +"@MMK_R_o" = -20; +"@MMK_R_quote" = -100; +"@MMK_R_quoteright" = -120; +"@MMK_R_t" = -30; +"@MMK_R_u" = -20; +"@MMK_R_v" = -60; +}; +"@MMK_L_M" = { +"@MMK_R_O" = -20; +"@MMK_R_T" = -30; +"@MMK_R_V" = -20; +"@MMK_R_Y" = -30; +"@MMK_R_o" = -20; +"@MMK_R_t" = -20; +"@MMK_R_v" = -20; +}; +"@MMK_L_O" = { +"@MMK_R_A" = -40; +"@MMK_R_J" = -20; +"@MMK_R_M" = -20; +"@MMK_R_T" = -50; +"@MMK_R_V" = -20; +"@MMK_R_X" = -40; +"@MMK_R_Y" = -40; +"@MMK_R_Z" = -30; +"@MMK_R_quoteright" = -20; +}; +"@MMK_L_P" = { +"@MMK_R_A" = -50; +"@MMK_R_V" = -10; +"@MMK_R_Y" = -20; +"@MMK_R_a" = -20; +"@MMK_R_o" = -30; +}; +"@MMK_L_R" = { +"@MMK_R_O" = -20; +"@MMK_R_T" = -30; +"@MMK_R_U" = -10; +"@MMK_R_V" = -30; +"@MMK_R_Y" = -40; +"@MMK_R_a" = -30; +"@MMK_R_o" = -30; +"@MMK_R_u" = -10; +"@MMK_R_v" = -20; +"@MMK_R_y" = -20; +}; +"@MMK_L_S" = { +"@MMK_R_V" = -20; +}; +"@MMK_L_T" = { +"@MMK_R_A" = -80; +"@MMK_R_M" = -30; +"@MMK_R_O" = -50; +"@MMK_R_S" = -30; +"@MMK_R_a" = -120; +"@MMK_R_h" = -40; +"@MMK_R_n" = -90; +"@MMK_R_o" = -130; +"@MMK_R_quote" = 40; +"@MMK_R_quoteright" = 40; +"@MMK_R_s" = -130; +"@MMK_R_v" = -70; +"@MMK_R_w" = -70; +"@MMK_R_y" = -70; +}; +"@MMK_L_U" = { +"@MMK_R_A" = -20; +}; +"@MMK_L_V" = { +"@MMK_R_A" = -50; +"@MMK_R_M" = -20; +"@MMK_R_O" = -20; +"@MMK_R_S" = -30; +"@MMK_R_a" = -80; +"@MMK_R_o" = -70; +}; +"@MMK_L_W" = { +"@MMK_R_a" = -30; +"@MMK_R_o" = -50; +}; +"@MMK_L_X" = { +"@MMK_R_O" = -40; +"@MMK_R_a" = -40; +"@MMK_R_o" = -50; +}; +"@MMK_L_Y" = { +"@MMK_R_A" = -70; +"@MMK_R_M" = -30; +"@MMK_R_O" = -40; +"@MMK_R_a" = -100; +"@MMK_R_o" = -110; +}; +"@MMK_L_Z" = { +"@MMK_R_O" = -30; +"@MMK_R_a" = -50; +"@MMK_R_o" = -50; +"@MMK_R_u" = -30; +}; +"@MMK_L_a" = { +"@MMK_R_T" = -120; +"@MMK_R_V" = -70; +"@MMK_R_W" = -30; +"@MMK_R_X" = -20; +"@MMK_R_Y" = -110; +"@MMK_R_Z" = -20; +"@MMK_R_quote" = -30; +}; +"@MMK_L_c" = { +"@MMK_R_o" = -20; +}; +"@MMK_L_comma" = { +"@MMK_R_four" = -20; +"@MMK_R_seven" = -100; +"@MMK_R_space" = -40; +"@MMK_R_y" = 30; +"@MMK_R_zero" = -50; +}; +"@MMK_L_e" = { +"@MMK_R_T" = -130; +"@MMK_R_V" = -70; +"@MMK_R_W" = -40; +"@MMK_R_X" = -50; +"@MMK_R_Y" = -110; +"@MMK_R_Z" = -30; +"@MMK_R_a" = -10; +"@MMK_R_f" = -10; +"@MMK_R_quote" = -30; +"@MMK_R_quoteright" = -30; +"@MMK_R_v" = -10; +"@MMK_R_x" = -20; +"@MMK_R_z" = -6; +}; +"@MMK_L_eight" = { +"@MMK_R_quote" = -20; +"@MMK_R_seven" = -10; +}; +"@MMK_L_f" = { +"@MMK_R_a" = -20; +"@MMK_R_g" = -30; +"@MMK_R_o" = -25; +"@MMK_R_quote" = 70; +"@MMK_R_quoteright" = 70; +}; +"@MMK_L_five" = { +"@MMK_R_quote" = 10; +}; +"@MMK_L_four" = { +"@MMK_R_one" = -10; +"@MMK_R_quote" = -50; +"@MMK_R_seven" = -50; +"@MMK_R_three" = -10; +"@MMK_R_two" = -10; +}; +"@MMK_L_g" = { +"@MMK_R_a" = -20; +"@MMK_R_quoteright" = 30; +"@MMK_R_y" = 20; +}; +"@MMK_L_i" = { +"@MMK_R_quoteright" = 30; +}; +"@MMK_L_j" = { +"@MMK_R_quoteright" = 30; +}; +"@MMK_L_k" = { +"@MMK_R_a" = -20; +"@MMK_R_o" = -10; +"@MMK_R_quote" = 20; +"@MMK_R_quoteright" = 20; +"@MMK_R_v" = -10; +}; +"@MMK_L_l" = { +"@MMK_R_quoteright" = -40; +}; +"@MMK_L_n" = { +"@MMK_R_T" = -80; +"@MMK_R_quote" = -20; +"@MMK_R_v" = -15; +}; +"@MMK_L_nine" = { +"@MMK_R_comma" = -50; +"@MMK_R_two" = -20; +}; +"@MMK_L_o" = { +"@MMK_R_A" = -20; +"@MMK_R_J" = -20; +"@MMK_R_M" = -20; +"@MMK_R_T" = -130; +"@MMK_R_V" = -70; +"@MMK_R_W" = -40; +"@MMK_R_X" = -50; +"@MMK_R_Y" = -110; +"@MMK_R_Z" = -20; +"@MMK_R_f" = -10; +"@MMK_R_j" = -15; +"@MMK_R_quote" = -40; +"@MMK_R_quoteright" = -20; +"@MMK_R_v" = -20; +"@MMK_R_x" = -30; +"@MMK_R_y" = -25; +"@MMK_R_z" = -10; +}; +"@MMK_L_one" = { +"@MMK_R_four" = -20; +"@MMK_R_quote" = -60; +"@MMK_R_seven" = -20; +"@MMK_R_six" = -20; +"@MMK_R_zero" = -20; +}; +"@MMK_L_quote" = { +"@MMK_R_A" = -60; +"@MMK_R_J" = -20; +"@MMK_R_T" = 40; +"@MMK_R_a" = -20; +"@MMK_R_eight" = -20; +"@MMK_R_f" = 30; +"@MMK_R_five" = 20; +"@MMK_R_four" = -80; +"@MMK_R_g" = -60; +"@MMK_R_h" = 20; +"@MMK_R_o" = -40; +"@MMK_R_s" = -40; +"@MMK_R_seven" = 20; +"@MMK_R_t" = 40; +"@MMK_R_v" = 20; +"@MMK_R_w" = 20; +"@MMK_R_y" = 20; +"@MMK_R_zero" = -20; +}; +"@MMK_L_quoteright" = { +"@MMK_R_A" = -60; +"@MMK_R_O" = -20; +"@MMK_R_T" = 40; +"@MMK_R_a" = -10; +"@MMK_R_f" = 20; +"@MMK_R_g" = -50; +"@MMK_R_i" = 30; +"@MMK_R_j" = 30; +"@MMK_R_o" = -40; +"@MMK_R_s" = -40; +"@MMK_R_t" = 50; +}; +"@MMK_L_r" = { +"@MMK_R_a" = -30; +"@MMK_R_g" = -25; +"@MMK_R_o" = -20; +"@MMK_R_quote" = 20; +"@MMK_R_quoteright" = 20; +"@MMK_R_s" = -10; +}; +"@MMK_L_s" = { +"@MMK_R_T" = -110; +"@MMK_R_quoteright" = 0; +"@MMK_R_v" = -10; +}; +"@MMK_L_seven" = { +"@MMK_R_comma" = -80; +"@MMK_R_four" = -40; +"@MMK_R_one" = 20; +"@MMK_R_quote" = 20; +"@MMK_R_three" = 10; +"@MMK_R_zero" = -20; +}; +"@MMK_L_six" = { +"@MMK_R_quote" = -20; +}; +"@MMK_L_t" = { +"@MMK_R_a" = -10; +"@MMK_R_quote" = 40; +"@MMK_R_quoteright" = 30; +}; +"@MMK_L_three" = { +"@MMK_R_seven" = -20; +}; +"@MMK_L_two" = { +"@MMK_R_seven" = -20; +}; +"@MMK_L_v" = { +"@MMK_R_A" = -30; +"@MMK_R_M" = -20; +"@MMK_R_T" = -70; +"@MMK_R_a" = -20; +"@MMK_R_g" = -40; +"@MMK_R_o" = -20; +"@MMK_R_quote" = 20; +"@MMK_R_s" = -20; +}; +"@MMK_L_w" = { +"@MMK_R_A" = -30; +"@MMK_R_T" = -70; +"@MMK_R_quote" = 20; +}; +"@MMK_L_x" = { +"@MMK_R_o" = -30; +}; +"@MMK_L_y" = { +"@MMK_R_A" = -40; +"@MMK_R_T" = -60; +"@MMK_R_a" = -20; +"@MMK_R_comma" = -60; +"@MMK_R_g" = -30; +"@MMK_R_o" = -10; +"@MMK_R_quote" = 20; +}; +"@MMK_L_z" = { +"@MMK_R_o" = -10; +}; +"@MMK_L_zero" = { +"@MMK_R_comma" = -30; +"@MMK_R_quote" = -20; +}; +}; +}; +metrics = ( +{ +type = ascender; +}, +{ +type = "cap height"; +}, +{ +type = "x-height"; +}, +{ +type = baseline; +}, +{ +type = descender; +}, +{ +filter = "case == 3"; +type = "x-height"; +}, +{ +type = "italic angle"; +} +); +stems = ( +{ +horizontal = 1; +name = hStem0; +}, +{ +horizontal = 1; +name = hStem1; +}, +{ +horizontal = 1; +name = hStem2; +}, +{ +name = vStem0; +}, +{ +name = vStem1; +} +); +unitsPerEm = 1000; +userData = { +AsteriskParameters = { +"253E7231-480D-4F8E-8754-50FC8575C08E" = ( +"754", +"30", +7, +51, +"80", +"50" +); +}; +GSDimensionPlugin.Dimensions = { +"3E7589AA-8194-470F-8E2F-13C1C581BE24" = { +HH = 91; +HV = 93; +OH = 91; +OV = 93; +arAlef = 86; +arBar = 92; +nV = 90; +oH = 88; +}; +"BFFFD157-90D3-4B85-B99D-9A2F366F03CA" = { +HH = 215; +HV = 225; +nV = 220; +oH = 210; +}; +"C4872ECA-A3A9-40AB-960A-1DB2202F16DE" = { +HH = 18; +HV = 19; +nV = 17; +oH = 16; +}; +}; +uniTestValue = def; +}; +versionMajor = 1; +versionMinor = 0; +}