From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp10.migadu.com ([2001:41d0:2:bcc0::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms0.migadu.com with LMTPS id EB0GIh5u3GELhAAAgWs5BA (envelope-from ) for ; Mon, 10 Jan 2022 18:34:22 +0100 Received: from aspmx1.migadu.com ([2001:41d0:2:bcc0::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp10.migadu.com with LMTPS id 0C2rGh5u3GFVTwAAG6o9tA (envelope-from ) for ; Mon, 10 Jan 2022 18:34:22 +0100 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id DDF1538A15 for ; Mon, 10 Jan 2022 18:34:21 +0100 (CET) Received: from localhost ([::1]:46704 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n6xtb-00060q-Ox for larch@yhetil.org; Mon, 10 Jan 2022 11:51:47 -0500 Received: from eggs.gnu.org ([209.51.188.92]:33644) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n6xpw-0003VB-Kf for emacs-orgmode@gnu.org; Mon, 10 Jan 2022 11:48:00 -0500 Received: from mout01.posteo.de ([185.67.36.65]:47765) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n6xpu-0004VI-3C for emacs-orgmode@gnu.org; Mon, 10 Jan 2022 11:48:00 -0500 Received: from submission (posteo.de [89.146.220.130]) by mout01.posteo.de (Postfix) with ESMTPS id 0E64B240026 for ; Mon, 10 Jan 2022 17:47:54 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=posteo.net; s=2017; t=1641833275; bh=FmMau09kQAcgl4QT0VCODT2baZ2KDExGb0ZrcKLKlcs=; h=From:To:Subject:Date:From; b=fWQJJT2wPHSwplfR2yQ/BHyHYZtLIL+EltVmUDLtst+zI4J7Dxhm+nGCuR4mFPbYk U8oKiXRwUHHppaJAq0G5VOH54/cSwu+z4ea9eDRbJGlMSrMbCk/xQCL7xIoHYleT75 2yfl4WjqLJKFGQPsD0X8Ng7r+B/abrQQdzL8oh4XFj3WIGWjASS4NCDI3fWQsbo25Q dKJRF0TDIcto5vp+U1M+1jpsr+Lka/wU22GxVmASeuCA/TXfwK1KXQ5gOQjYOIt30p dL6OM1RIMpfLSWxlHE0JdNmk6bNTDVCDtoeJ2dLSA+qWGWeZhWzLROcSKTjXT7XFkn fmL9Dx/+6CaDw== Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 4JXfrp2mGkz6tnr for ; Mon, 10 Jan 2022 17:47:54 +0100 (CET) From: =?utf-8?Q?Juan_Manuel_Mac=C3=ADas?= To: orgmode Subject: Preview fonts from Dired with org-latex-preview (and test opentype features) Date: Mon, 10 Jan 2022 16:47:51 +0000 Message-ID: <87zgo3o7uw.fsf@posteo.net> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Received-SPF: pass client-ip=185.67.36.65; envelope-from=maciaschain@posteo.net; helo=mout01.posteo.de X-Spam_score_int: -43 X-Spam_score: -4.4 X-Spam_bar: ---- X-Spam_report: (-4.4 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-orgmode@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+larch=yhetil.org@gnu.org Sender: "Emacs-orgmode" X-Migadu-Flow: FLOW_IN X-Migadu-Country: US ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1641836062; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type:list-id:list-help:list-unsubscribe: list-subscribe:list-post:dkim-signature; bh=FmMau09kQAcgl4QT0VCODT2baZ2KDExGb0ZrcKLKlcs=; b=SxjYl0bkwzT7hFgid1Rwj3aVFCn3nL8P9Rqy2BTSyJzRkb+33yQ0twNReCGb/9bTDiXQb0 AMLr5CQ1ebTjvDDN1qkcHXj8grJOeI773BErs77WfustNPeGY850cSSKJWOlNpxumla5Wj W2kZH1gX/KhWhnWRlwMEuMYwJMHaoNblgQOgd3cGaa5Fotj8ES0cqalPoKICDijQXMgwJq TRvYA6VokUgb7APV9u7V9z0Q+Ci55PKaB6/IQZwxmuyf22hCk0EWKJordc17rt8EqCQwvg E+yQFYCFZkqzF1rdT0iD7lR3ZI+8DTm3y0l2z8S6IlKDNXClTt9EqCwPh6uA9A== ARC-Seal: i=1; s=key1; d=yhetil.org; t=1641836062; a=rsa-sha256; cv=none; b=jzZhk2FjLnw814P8I/uABeZBLoSv1hlhqiCC4VZ0qrAWNQSJJf7aSOSdHZcXCwBBj++CCq QvXa+OcK6vPOHf74hrGi/dyqMRFPOvKeUatZ5dkfzdrvAHnzThsO0l1eSrSCkhZdkweoan DgHGCDSyWVJjaHzZOmyIfvdSO+GrmyIdP+tkZubcfBW7mpQ8O2oH1Rc8QImB58hA7veM7l 9YUqH/UyM+qyY9dlyv6InRXASy4yTvSMHxQ61QOohL9snJVDXC1zd30j1tT36CY8JjT1Ev HpIVOT4B1ocoW3Z1WMU31Z2E20LWxJtaWndMZVwCC4L6HBD0+PC2PnZjOLt0uw== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=pass header.d=posteo.net header.s=2017 header.b=fWQJJT2w; dmarc=pass (policy=none) header.from=posteo.net; spf=pass (aspmx1.migadu.com: domain of "emacs-orgmode-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="emacs-orgmode-bounces+larch=yhetil.org@gnu.org" X-Migadu-Spam-Score: -4.01 Authentication-Results: aspmx1.migadu.com; dkim=pass header.d=posteo.net header.s=2017 header.b=fWQJJT2w; dmarc=pass (policy=none) header.from=posteo.net; spf=pass (aspmx1.migadu.com: domain of "emacs-orgmode-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="emacs-orgmode-bounces+larch=yhetil.org@gnu.org" X-Migadu-Queue-Id: DDF1538A15 X-Spam-Score: -4.01 X-Migadu-Scanner: scn1.migadu.com X-TUID: Gob0CNqxOGP7 --=-=-= Content-Type: text/plain Hi, I have written for my personal use this code (still quite crude) that allows me to preview with org-latex-preview small text strings in a font marked in dired, and test open type features too. The preview is compiled with LuaLaTeX, since LuaTeX allows to load fonts that are not installed in the system. When a font is selected, the list of opentype features included in the font are extracted (using the otfinfo command), and they are arranged in the preview buffer as buttons. By clicking on each button we can activate in the preview the corresponding opentype feature. For example, if the font includes the 'smcp' feature, clicking on the button 'smcp' the text will be displayed in small caps. We can enter the text strings literally or through Unicode code: each character separated by a space; the separation between words is marked with a vertical bar. For example, this code: 0063 006f 0064 0065 | 0068 0065 0072 0065 returns the string "code here". As a third option, a complete specimen can be displayed from a file. Here is a demo video: https://cloud.disroot.org/s/aHXKiof36fTSZGB As I said, my function is still pretty crude, and while it works well, it's now more of a proof of concept than a finished thing. But if anyone wants to try it, I attach the code here in an org document. Best regards, Juan Manuel --=-=-= Content-Type: application/vnd.lotus-organizer Content-Disposition: attachment; filename=font-preview.org Content-Transfer-Encoding: base64 IytQUk9QRVJUWTogaGVhZGVyLWFyZ3MgOnRhbmdsZSBmb250LXByZXZpZXcuZWwKCjpSRUFETUU6 ClRvIGNvbXBpbGUgY29ycmVjdGx5IHdpdGggTHVhVGVYIChhbmQgbGF0ZXhtaykgZnJvbSBPcmcg SSBoYXZlIGluIG15CmluaXQ6CgojK2JlZ2luX3NyYyBlbWFjcy1saXNwIDp0YW5nbGUgbm8KKHNl dHEgb3JnLWxhdGV4LXBkZi1wcm9jZXNzCiAgICAgICcoImxhdGV4bWsgLWx1YWxhdGV4IC1vdXRw dXQtZGlyZWN0b3J5PSVvIC1lICckbHVhbGF0ZXg9cS9sdWFsYXRleCAlJU8gLXNoZWxsLWVzY2Fw ZSAlJVMvJyAlZiIpKQojK2VuZF9zcmMKCkZvciB0aGUgcHJldmlldyB3aXRoIEx1YVRlWCwgSSB1 c2UgaW1hZ2VtYWdpY2ssIGFuZCBhbHNvIGhhdmUgdGhpcyBjb2RlIGluIG15IGluaXQ6CgojK2Jl Z2luX3NyYyBlbWFjcy1saXNwIDp0YW5nbGUgbm8KICAgIChzZXRxIGx1YW1hZ2ljawoJICAnKGx1 YW1hZ2ljawoJICAgIDpwcm9ncmFtcyAoImx1YWxhdGV4IiAiY29udmVydCIpCgkgICAgOmRlc2Ny aXB0aW9uICJwZGYgPiBwbmciCgkgICAgOm1lc3NhZ2UgInlvdSBuZWVkIHRvIGluc3RhbGwgbHVh bGF0ZXggYW5kIGltYWdlbWFnaWNrLiIKCSAgICA6dXNlLXhjb2xvciB0CgkgICAgOmltYWdlLWlu cHV0LXR5cGUgInBkZiIKCSAgICA6aW1hZ2Utb3V0cHV0LXR5cGUgInBuZyIKCSAgICA6aW1hZ2Ut c2l6ZS1hZGp1c3QgKDEuMCAuIDEuMCkKCSAgICA6bGF0ZXgtY29tcGlsZXIgKCJsdWFsYXRleCAt aW50ZXJhY3Rpb24gbm9uc3RvcG1vZGUgLW91dHB1dC1kaXJlY3RvcnkgJW8gJWYiKQoJICAgIDpp bWFnZS1jb252ZXJ0ZXIgKCJjb252ZXJ0IC1kZW5zaXR5ICVEIC10cmltIC1hbnRpYWxpYXMgJWYg LXF1YWxpdHkgMTAwICVPIikpKQoKICAgIChhZGQtdG8tbGlzdCAnb3JnLXByZXZpZXctbGF0ZXgt cHJvY2Vzcy1hbGlzdCBsdWFtYWdpY2spCgogICAgKHNldHEgb3JnLXByZXZpZXctbGF0ZXgtZGVm YXVsdC1wcm9jZXNzICdsdWFtYWdpY2spCiMrZW5kX3NyYwo6RU5EOgoKIytiZWdpbl9zcmMgZW1h Y3MtbGlzcAo7OzsgLSotIGxleGljYWwtYmluZGluZzogdDsgLSotCiMrZW5kX3NyYwoKIytiZWdp bl9zcmMgZW1hY3MtbGlzcCA6cmVzdWx0cyBzaWxlbnQKICAoc2V0cSBvdGYtZmVhdHVyZXMgKHJl Z2V4cC1vcHQgJyggImFidmYiICAgImFidm0iICAgImFidnMiICAgImFhbHQiICAgImFraG4iCiAg ICAgICAibmFsdCIgICAiaGFsdCIgICAiYWZyYyIgICAidmFsdCIgICAidmhhbCIgICAiYmx3ZiIg ICAiYmx3bSIgICAiYmx3cyIgICAiY3BzcCIgICAiYzJwYyIgICAiYzJzYyIKICAgICAgICJjYXNl IiAgICJjcGN0IiAgICJjdjAxIiAgICJjdjAyIiAgICJjdjAzIiAgICJjdjA0IiAgICJjdjA1IiAg ICJjdjA2IiAgICJjdjA3IiAgICJjdjA4IiAgICJjdjA5IgogICAgICAgImN2MTAiICAgImN2MTEi ICAgImN2MTIiICAgImN2MTMiICAgImN2MTQiICAgImN2MTUiICAgImN2MTYiICAgImN2MTciICAg ImN2MTgiICAgImN2MTkiICAgImN2MjAiCiAgICAgICAiY3YyMSIgICAiY3YyMiIgICAiY3YyMyIg ICAiY3YyNCIgICAiY3YyNSIgICAiY3YyNiIgICAiY3YyNyIgICAiY3YyOCIgICAiY3YyOSIgICAi Y3YzMCIgICAiY3YzMSIKICAgICAgICJjdjMyIiAgICJjdjMzIiAgICJjdjM0IiAgICJjdjM1IiAg ICJjdjM2IiAgICJjdjM3IiAgICJjdjM4IiAgICJjdjM5IiAgICJjdjQwIiAgICJjdjQxIiAgICJj djQyIgogICAgICAgImN2NDMiICAgImN2NDQiICAgImN2NDUiICAgImN2NDYiICAgImN2NDciICAg ImN2NDgiICAgImN2NDkiICAgImN2NTAiICAgImN2NTEiICAgImN2NTIiICAgImN2NTMiCiAgICAg ICAiY3Y1NCIgICAiY3Y1NSIgICAiY3Y1NiIgICAiY3Y1NyIgICAiY3Y1OCIgICAiY3Y1OSIgICAi Y3Y2MCIgICAiY3Y2MSIgICAiY3Y2MiIgICAiY3Y2MyIgICAiY3Y2NCIKICAgICAgICJjdjY1IiAg ICJjdjY2IiAgICJjdjY3IiAgICJjdjY4IiAgICJjdjY5IiAgICJjdjcwIiAgICJjdjcxIiAgICJj djcyIiAgICJjdjczIiAgICJjdjc0IiAgICJjdjc1IgogICAgICAgImN2NzYiICAgImN2NzciICAg ImN2NzgiICAgImN2NzkiICAgImN2ODAiICAgImN2ODEiICAgImN2ODIiICAgImN2ODMiICAgImN2 ODQiICAgImN2ODUiICAgImN2ODYiCiAgICAgICAiY3Y4NyIgICAiY3Y4OCIgICAiY3Y4OSIgICAi Y3Y5MCIgICAiY3Y5MSIgICAiY3Y5MiIgICAiY3Y5MyIgICAiY3Y5NCIgICAiY3Y5NSIgICAiY3Y5 NiIgICAiY3Y5NyIKICAgICAgICJjdjk4IiAgICJjdjk5IiAgICJjamN0IiAgICJjZmFyIiAgICJj YWx0IiAgICJjbGlnIiAgICJjc3doIiAgICJjdXJzIiAgICJkbm9tIiAgICJkbGlnIiAgICJkaXN0 IgogICAgICAgImV4cHQiICAgImZhbHQiICAgImZyYWMiICAgImZ3aWQiICAgImNjbXAiICAgImhh bG4iICAgImhhbGYiICAgImh3aWQiICAgImhuZ2wiICAgImhpc3QiICAgImhsaWciCiAgICAgICAi aGtuYSIgICAiaG9qbyIgICAiaW5pdCIgICAiaXNvbCIgICAiaXRhbCIgICAianAwNCIgICAianA3 OCIgICAianA4MyIgICAianA5MCIgICAiamFsdCIgICAia2VybiIKICAgICAgICJsbnVtIiAgICJs am1vIiAgICJsZmJkIiAgICJsdHJhIiAgICJsdHJtIiAgICJsb2NsIiAgICJtYXJrIiAgICJtc2V0 IiAgICJta21rIiAgICJtZ3JrIiAgICJtZWRpIgogICAgICAgIm1lZDIiICAgIm5sY2siICAgIm51 a3QiICAgIm51bXIiICAgIm9udW0iICAgIm9wYmQiICAgInNpemUiICAgIm9yZG4iICAgIm9ybm0i ICAgInBjYXAiICAgInByZWYiCiAgICAgICAicHJlcyIgICAicHN0cyIgICAicHN0ZiIgICAicGFs dCIgICAidnBhbCIgICAicG51bSIgICAicGtuYSIgICAicHdpZCIgICAicXdpZCIgICAicmFuZCIg ICAicmtyZiIKICAgICAgICJycGhmIiAgICJybGlnIiAgICJydGJkIiAgICJydGxhIiAgICJydGxt IiAgICJydWJ5IiAgICJzaW5mIiAgICJzbXBsIiAgICJ6ZXJvIiAgICJzbWNwIiAgICJsaWdhIgog ICAgICAgInNhbHQiICAgInNzMDEiICAgInNzMDIiICAgInNzMDMiICAgInNzMDQiICAgInNzMDUi ICAgInNzMDYiICAgInNzMDciICAgInNzMDgiICAgInNzMDkiICAgInNzMTAiCiAgICAgICAic3Mx MSIgICAic3MxMiIgICAic3MxMyIgICAic3MxNCIgICAic3MxNSIgICAic3MxNiIgICAic3MxNyIg ICAic3MxOCIgICAic3MxOSIgICAic3MyMCIgICAic3VicyIKICAgICAgICJzdXBzIiAgICJzd3No IiAgICJ0bnVtIiAgICJmaW5hIiAgICJmaW4yIiAgICJmaW4zIiAgICJ0d2lkIiAgICJ0aXRsIiAg ICJ0cmFkIiAgICJ0bmFtIiAgICJ0am1vIgogICAgICAgInVuaWMiICAgInZhdHUiICAgInZlcnQi ICAgInZydDIiICAgInZrbmEiICAgInZrcm4iICAidmptbyIpKSkKIytlbmRfc3JjCgojK2JlZ2lu X3NyYyBlbWFjcy1saXNwCihzZXRxIG15LWRpcmVkLXByZXZpZXctZm9udC1zcGVjaW1lbi1kaXIg Ii9wYXRoL3RvL3RoZS9zcGVjaW1lbi9maWxlLyIpCiMrZW5kX3NyYwoKIytOQU1FOiBzcGVjaW1l bgojK2JlZ2luX3NyYyBsYXRleCA6dGFuZ2xlIHNwZWNpbWVuLnRleApccGFyaW5kZW50PTBlbVxy YWdnZWRyaWdodAoKICAgIEFhQmJDY0RkRWVGZkdnSGhJaUpqS2tMbE1tTm5Pb1BwUXFSclNzVHRV dVZ2V3dYeFl5Wno/IFxwYXIKCiAgICAxMjM0NTY3ODkwXHBhcgoKICAgIHtcYWRkZm9udGZlYXR1 cmV7TnVtYmVycz1Mb3dlcmNhc2V9MTIzNDU2Nzg5MFxwYXJ9IMOFw6Ugw4fDpyDDmMO4XFwg4bq8 4bq9IMSoxKkgxajFqSDhu7jhu7kgXHBhciBJUEE6CiAgypTHncWLybLJvsqnyajJlMmbyoPKpMm4 yaPOssmhyZHJkMmSypnDsMmVypHJu8maXHBhciBncmVlazogzpHOks6TzpTOlc6WzpfOmM6ZzprO m86czp3Ons6fzqDOoc6jzqTOpc6mzqfOqM6pXHBhcgogIM6xzrLOs860zrXOts63zrjOuc66zrvO vM69zr7Ov8+Az4HPg8+Cz4TPhc+Gz4fPiM+JIFxwYXIKCiAgICBMaWdhdHVyZXM6CgogICBmbHVm ZmllciBzb3VmZmzDqSBmaXN0aWN1ZmZzIGZiIGZoIGZmaCBmaiBmZmogZmsgZmZrIGZ0IGZmdCB0 dCBRdSBUaCBjaCBjayBjdCBccGFyCgogICAgXHRleHRzY3tTb21lIHNtYWxsIGNhcHMuLi59XHBh cgoKICAgIFx2c3BhY2V7MWVtfQoKICAgIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25z ZWN0ZXR1ZXIgYWRpcGlzY2luZyBlbGl0LiBEb25lYyBoZW5kcmVyaXQgdGVtcG9yIHRlbGx1cy4K ICBEb25lYyBwcmV0aXVtIHBvc3VlcmUgdGVsbHVzLiBQcm9pbiBxdWFtIG5pc2wsIHRpbmNpZHVu dCBldCwgbWF0dGlzIGVnZXQsIGNvbnZhbGxpcyBuZWMsCiAgcHVydXMuIEN1bSBzb2NpaXMgbmF0 b3F1ZSBwZW5hdGlidXMgZXQgbWFnbmlzIGRpcyBwYXJ0dXJpZW50IG1vbnRlcywgbmFzY2V0dXIg cmlkaWN1bHVzCiAgbXVzLiBOdWxsYSBwb3N1ZXJlLiBEb25lYyB2aXRhZSBkb2xvci4gTnVsbGFt IHRyaXN0aXF1ZSBkaWFtIG5vbiB0dXJwaXMuIENyYXMgcGxhY2VyYXQKICBhY2N1bXNhbiBudWxs YS4gTnVsbGFtIHJ1dHJ1bS4gTmFtIHZlc3RpYnVsdW0gYWNjdW1zYW4gbmlzbC4gTG9yZW0gaXBz dW0gZG9sb3Igc2l0IGFtZXQsCiAgY29uc2VjdGV0dWVyIGFkaXBpc2NpbmcgZWxpdC4gRG9uZWMg aGVuZHJlcml0IHRlbXBvciB0ZWxsdXMuIFxwYXIKCiAgICBcdnNwYWNlezFlbX0KCiAgXGZvcmVp Z25sYW5ndWFnZXtncmVla317JSDOss6/z4XOu861z43Otc+EzrHOuSDhvYXPgM+Jz4IgzrzOrs+A zr/PhM61IOG8lM+Ezrkg4byUz4PPhM6xzrkg4byQz4DhvbYgz4Thv7cg4byAzrTOtc67z4bhv7cs IOG8gM67zrvOrCwg4byizr0KICDOtM+Nzr3Ot8+EzrHOuSwgzrLOsc+DzrnOu861z43Pg861zrkg 4byAzr3PhOG+vSDhvJDOus61zq/Ovc6/z4UuIM6gzrHPgc+Nz4POsc+EzrnPgiDOvOG9ss69IM60 4b20IOG8oSDOvM6uz4TOt8+BIOG9kc+A4b+Gz4HPh861IM+E4b+3IM6az43PgeG/sywgz4bOuc67 zr/hv6bPg86xIM6x4b2Qz4ThvbjOvQogIM684b62zrvOu86/zr0g4byiIM+E4b24zr0gzrLOsc+D zrnOu861z43Ov869z4TOsSDhvIjPgc+EzrHOvs6tz4HOvs63zr0uIOG9hc+Dz4TOuc+CIM604b69 IOG8gM+GzrnOus69zrXhv5bPhM6/IM+E4b+2zr0gz4DOsc+B4b2wIM6yzrHPg865zrvOrc+Jz4Ig z4DPgeG9uM+CIM6x4b2Qz4ThvbjOvQogIM+AzqzOvc+EzrHPgiDOv+G9lc+Ez4kgzrTOuc6xz4TO uc64zrXhvbbPgiDhvIDPgM61z4DOrc68z4DOtc+Ezr8g4b2lz4PPhM61IM6x4b2Qz4Thv7cgzrzh vrbOu867zr/OvSDPhs6vzrvOv8+Fz4IgzrXhvLbOvc6xzrkg4byiIM6yzrHPg865zrvOteG/li4g zrrOseG9tiDPhOG/ts69IM+AzrHPgeG+vQogIOG8kc6xz4XPhOG/tyDOtOG9siDOss6xz4HOss6s z4HPic69IOG8kM+AzrXOvM61zrvOteG/ls+Ezr8g4b2hz4Igz4DOv867zrXOvM614b+Wzr0gz4TO tSDhvLHOus6xzr3Ov+G9tiDOteG8tM63z4POsc69IM66zrHhvbYgzrXhvZDOvc6/z4rOuuG/ts+C IOG8lM+Hzr/Ouc61zr0gzrHhvZDPhOG/ty4gz4ThvbTOvSDOtOG9sgogIOG8mc67zrvOt869zrnO uuG9tM69IM60z43Ovc6xzrzOuc69IOG8pc64z4HOv865zrbOtc69IOG9oc+CIM68zqzOu865z4PP hM6xIOG8kM60z43Ovc6xz4TOvyDhvJDPgM65zrrPgc+Fz4DPhM+MzrzOtc69zr/Pgiwg4b2Fz4DP ic+CIOG9hc+Ezrkg4byAz4DOsc+BzrHPg866zrXPhc+Mz4TOsc+Ezr/OvQogIM67zqzOss6/zrkg zrLOsc+DzrnOu86tzrEuXHBhcgoKICAgIFx2c3BhY2V7MWVtfQoKICBcZm9yZWlnbmxhbmd1YWdl e3J1c3NpYW59eyUK0Jgg0LLRiiAxNTA2INGA0L7QutGDINC/0LXRgNCy0YvQuSDQsdGL0LvRiiDQ s9C10YLQvNCw0L3RiiDQstC+0LnRgdC60Yog0LfQsNC/0L7RgNC+0LbRgdC60LjRhdGKINC40LfR iiDRhNCw0LzQuNC70ZbQuCDRgdC10L3QsNGC0L7RgNGB0LrQvtC5INC40LzQtdC90YPQtdC80YvQ uQrQn9GA0LXRhtGB0LvQsNCy0Yog0JvRj9C90YbQutGA0L7QvdGB0LrRltC5LiDQodC10Lkg0LzQ vdC+0LPQvtC60YDQsNGC0L3QviDQt9C10LzQu9GOINCi0YPRgNC10YbQutGD0Y4g0YHRiiDQutC+ 0LfQsNC60LDQvNC4INGJ0LDRgdGC0LvQuNCy0L4g0LLQvtC10LLQsNC70YouINCX0LAK0YHQtdCz 0L4g0LPQtdGC0LzQsNC90LAg0Lgg0LfQsCDQutC+0YDQvtC70Y8g0L/QvtC70YHQutCw0LPQviDQ ltC40LrQs9C40LzQvtC90YLQsCBJINC60L7Qt9Cw0LrQsNC80Yog0LfQsCDRgdC70YPQttCx0Ysg 0LjRhdGKINC00LDQstCw0L3QviDQstC+0LvQvdC+0YHRgtC4INC4CtC/0YDQuNCy0LXRgNC90LXQ vdC+INC30LXQvNC70Y4sINC60L7RgtC+0YDRg9GOINC60L7RgNC+0LvRjCDQv9C+0LvRgdC60ZbQ uSDQmtCw0LfQuNC80LjRgNGKIEksINCy0Yog0YDQvtC60YMgMTM0MCwg0LfQsNC+0LHQu9Cw0LTQ sNCy0YjQuCwg0LjQt9GKCtC60L3Rj9C20LXQvdGW0Y8g0JrRltC10LLRgdC60LDQs9C+INCy0L7Q tdCy0L7QtNGB0YLQstC+INGD0YfQuNC90LjQu9GKLCDQstGL0YjQtSDQuCDQvdC40LfRiNC1INC/ 0L7RgNC+0LPQvtCy0Yog0L/QviDQvtCx0L7QuNGF0Yog0YHRgtC+0YDQvtC90LDRhdGKINCU0L3R o9C/0YDQsCDQstC+CtCy0LvQsNC00aPQvdGW0LUg0LLRo9GH0L3QvtC1LCDQtNCw0LHRiyDQotGD 0YDQutCw0LzRiiDQuCDQotCw0YLQsNGA0LDQvNGKINC90LAg0KDRg9GB0LrRg9GOINC30LXQvNC7 0Y4g0LrQvtC30LDQutC4INC90LDQv9Cw0LTQsNGC0Ywg0L3QtSDQtNC+0L/Rg9GB0LrQsNC70Lgu fQojK2VuZF9zcmMKCiMrYmVnaW5fc3JjIGVtYWNzLWxpc3AgOnJlc3VsdHMgc2lsZW50CiAgKHNl dHEgIG15LWRpcmVkLXByZXZpZXctZm9udC1vcHRpb25zLWxpc3QgJygoPzEgIkdseXBoKHMpIiAo bGFtYmRhICgpCgkJCQkJCQkgICAgICAgKGludGVyYWN0aXZlKQoJCQkJCQkJICAgICAgIChmb3Jt YXQgIiVzIiAocmVhZC1mcm9tLW1pbmlidWZmZXIgIkluc2VydCBhIHN0cmluZzogIikpKSkKCQkJ CQkgICAgICAoPzIgIkNvZGUiIChsYW1iZGEgKCkKCQkJCQkJCSAgIChpbnRlcmFjdGl2ZSkKCQkJ CQkJCSAgIChsZXQgKChjaGFycyAocmVhZC1mcm9tLW1pbmlidWZmZXIKCQkJCQkJCQkJICJJbnNl cnQgY2hhcmFjdGVyKHMpIGJ5IGNvZGUgKGkuZS4gXCIwMDZmXCIsIDEgc3BhY2UgYmV0d2VlbiBl YWNoIGNvZGU7IFwifFwiID0gd29yZCBzZXAuKTogIikpKQoJCQkJCQkJICAgICAocmVwbGFjZS1y ZWdleHAtaW4tc3RyaW5nCgkJCQkJCQkgICAgICAifCIgIiAiCgkJCQkJCQkgICAgICAocmVwbGFj ZS1yZWdleHAtaW4tc3RyaW5nCgkJCQkJCQkgICAgICAgIlxzKlxcKFtbOmFsbnVtOl1dK1xcKVxz KiIgInteXl5eXFwxfSIKCQkJCQkJCSAgICAgICBjaGFycykpKSkpCgkJCQkJICAgICAgKD8zICJQ cmludCBzcGVjaW1lbiIgKGxhbWJkYSAoKQoJCQkJCQkJCSAgICAgKGludGVyYWN0aXZlKQoJCQkJ CQkJCSAgICAgKHdpdGgtdGVtcC1idWZmZXIKCQkJCQkJCQkgICAgICAgKGluc2VydC1maWxlLWNv bnRlbnRzIChjb25jYXQgbXktZGlyZWQtcHJldmlldy1mb250LXNwZWNpbWVuLWRpciAic3BlY2lt ZW4udGV4IikpCgkJCQkJCQkJICAgICAgIChidWZmZXItc3RyaW5nKSkpKSkpCiMrZW5kX3NyYwoK IytiZWdpbl9zcmMgZW1hY3MtbGlzcCA6cmVzdWx0cyBzaWxlbnQKICAoZGVmdW4gY2hvaWNlLWds eXBocy1vci1jb2RlICgpCiAgICAoaW50ZXJhY3RpdmUpCiAgICAobGV0ICgob3B0IChyZWFkLWNo YXItY2hvaWNlIChjb25jYXQgIlByZXZpZXcgY29kZSBvciBzdHJpbmcgPj5cblxuIgoJCQkJCSAo bWFwY29uY2F0IChsYW1iZGEgKGl0ZW0pCgkJCQkJCSAgICAgIChmb3JtYXQgIiVjOiAlcyIKCQkJ CQkJCSAgICAgIChjYXIgaXRlbSkgKG50aCAxIGl0ZW0pKSkKCQkJCQkJICAgIG15LWRpcmVkLXBy ZXZpZXctZm9udC1vcHRpb25zLWxpc3QgIiAtLS0gIikpCgkJCQkgKG1hcGNhciAjJ2NhciBteS1k aXJlZC1wcmV2aWV3LWZvbnQtb3B0aW9ucy1saXN0KSkpKQogICAgICAoZnVuY2FsbCAobnRoIDIK CQkgICAgKGFzc29jCgkJICAgICBvcHQKCQkgICAgIG15LWRpcmVkLXByZXZpZXctZm9udC1vcHRp b25zLWxpc3QpKSkpKQojK2VuZF9zcmMKCgojK2JlZ2luX3NyYyBlbWFjcy1saXNwIDpyZXN1bHRz IHNpbGVudAogIChyZXF1aXJlICdidXR0b24pCgogIChkZWZ1biBteS1kaXJlZC1wcmV2aWV3LWZv bnQtYXQtcG9pbnQgKCkKICAgICJUT0RPIgogICAgKGludGVyYWN0aXZlKQogICAgKGxldCogKChm b250IChmaWxlLW5hbWUtbm9uZGlyZWN0b3J5IChkaXJlZC1nZXQtZmlsZS1mb3ItdmlzaXQpKSkK CSAgIChwYXRoIChmaWxlLW5hbWUtZGlyZWN0b3J5IChkaXJlZC1nZXQtZmlsZS1mb3ItdmlzaXQp KSkKCSAgIChzcGVjcy1vdGZpbmZvCgkgICAgKHNwbGl0LXN0cmluZwoJICAgICAoc2hlbGwtY29t bWFuZC10by1zdHJpbmcKCSAgICAgIChjb25jYXQgIm90ZmluZm8gLWYgIgoJCSAgICAgIChzaGVs bC1xdW90ZS1hcmd1bWVudCAoZGlyZWQtZ2V0LWZpbGUtZm9yLXZpc2l0KSkpKQoJICAgICAiXG4i KSkKCSAgIChzdHJpbmcgKGNob2ljZS1nbHlwaHMtb3ItY29kZSkpCgkgICAoc2l6ZSAocmVhZC1m cm9tLW1pbmlidWZmZXIgIkZvbnQgc2l6ZSBpbiBwb2ludHMgKGRlZmF1bHQgMThwdCk6ICIgbmls IG5pbCB0IHQgIjE4IikpCgkgICAoaW50ZXJsaW5lIChyZWFkLWZyb20tbWluaWJ1ZmZlciAiSW50 ZXJsaW5lIGluIHBvaW50cyAoZGVmYXVsdCAyMS42cHQpOiAiIG5pbCBuaWwgdCB0ICIyMS42Iikp CgkgICAob3BlbnR5cGUtZmVhdHVyZSAocmVhZC1mcm9tLW1pbmlidWZmZXIgIk9wZW50eXBlIGZl YXR1cmVzIChkZWZhdWx0IG5vbmUpOiAiIG5pbCBuaWwgdCB0ICJbXSIpKQoJICAgKGRvYyAoY29u Y2F0CgkJICJcblxcYmVnaW57bnVsbH1cbiIKCQkgKGZvcm1hdCAiXFxmb250c2l6ZXslc3B0fXsl c3B0fVxcc2VsZWN0Zm9udFxuIiBzaXplIGludGVybGluZSkKCQkgc3RyaW5nCgkJICJcblxcZW5k e251bGx9XG4iKSkpCiAgICAgIChzZXRxIG9yZy1mb3JtYXQtbGF0ZXgtaGVhZGVyIChjb25jYXQg IlxcZG9jdW1lbnRjbGFzc1t2YXJ3aWR0aF17c3RhbmRhbG9uZX1cbiIKCQkJCQkgICAgIlxcdXNl cGFja2FnZXt4Y29sb3J9XG4iCgkJCQkJICAgICJcW1BBQ0tBR0VTXQoJCQkJCSAgICBcW0RFRkFV TFQtUEFDS0FHRVNdIgoJCQkJCSAgICAiXG5cXHBhZ2VzdHlsZXtlbXB0eX0iCgkJCQkJICAgICJc blxcdXNlcGFja2FnZXtmb250c3BlY30iCgkJCQkJICAgICJcblxcdXNlcGFja2FnZVtzcGFuaXNo LGVuZ2xpc2hde2JhYmVsfSIKCQkJCQkgICAgIlxuXFxzZXRtYWluZm9udHsiCgkJCQkJICAgIGZv bnQKCQkJCQkgICAgIn1bUGF0aD0iCgkJCQkJICAgIHBhdGgKCQkJCQkgICAgKGlmIChub3QgKGVx dWFsIG9wZW50eXBlLWZlYXR1cmUgIltdIikpCgkJCQkJCShmb3JtYXQgIixSYXdGZWF0dXJlPXsl c30iIG9wZW50eXBlLWZlYXR1cmUpCgkJCQkJICAgICAgIiIpCgkJCQkJICAgICJdIgoJCQkJCSAg ICAiXFxwYWdlc3R5bGV7ZW1wdHl9IikpCiAgICAgICh3aGVuIChnZXQtYnVmZmVyICIqZm9udC1w cmV2aWV3KiIpCgkoa2lsbC1idWZmZXIgIipmb250LXByZXZpZXcqIikpCiAgICAgIChnZXQtYnVm ZmVyLWNyZWF0ZSAiKmZvbnQtcHJldmlldyoiKQogICAgICAoc2V0LWJ1ZmZlciAiKmZvbnQtcHJl dmlldyoiKQogICAgICAob3JnLW1vZGUpCiAgICAgIChtYXBjIChsYW1iZGEgKGVsKQoJICAgICAg KGxldCAoKHNwZWMgKHdoZW4gKHN0cmluZy1tYXRjaCAoY29uY2F0ICJcXCgiIG90Zi1mZWF0dXJl cyAiXFwpIikgZWwpCgkJCSAgICAobWF0Y2gtc3RyaW5nIDEgZWwpKSkpCgkJKGluc2VydC1idXR0 b24gKGZvcm1hdCAiJXNcbiIgZWwpCgkJCSAgICAgICAnYWN0aW9uIChsYW1iZGEgKHgpCgkJCQkJ IChvcmctY2xlYXItbGF0ZXgtcHJldmlldyAocG9pbnQtbWluKSAocG9pbnQtbWF4KSkKCQkJCQkg KGdvdG8tY2hhciAocG9pbnQtbWluKSkKCQkJCQkgKHJlYWQtb25seS1tb2RlIC0xKQoJCQkJCSAo cmUtc2VhcmNoLWZvcndhcmQgIlxcKFxcXFxiZWdpbntudWxsfVxcKVxcKFxuXFxcXGFkZGZvbnRm ZWF0dXJlLitcXCk/IiBuaWwgdCkKCQkJCQkgKHJlcGxhY2UtbWF0Y2ggKGNvbmNhdCAiXFwxXG5c XFxcYWRkZm9udGZlYXR1cmV7UmF3RmVhdHVyZT0iIHNwZWMgIn0iKSB0IG5pbCkKCQkJCQkgKG9y Zy1sYXRleC1wcmV2aWV3KSkpKSkKCSAgICBzcGVjcy1vdGZpbmZvKQogICAgICAoaW5zZXJ0ICJc blxuIikKICAgICAgKGluc2VydCBkb2MpCiAgICAgIChvcmctbGF0ZXgtcHJldmlldykKICAgICAg KHRlbXAtYnVmZmVyLXdpbmRvdy1zaG93ICIqZm9udC1wcmV2aWV3KiIpKSkKIytlbmRfc3JjCg== --=-=-=--