From unknown Thu Jun 19 14:05:58 2025 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.509 (Entity 5.509) Content-Type: text/plain; charset=utf-8 From: bug#73730 <73730@debbugs.gnu.org> To: bug#73730 <73730@debbugs.gnu.org> Subject: Status: 31.0.50; Support for color fonts on MS-Windows Reply-To: bug#73730 <73730@debbugs.gnu.org> Date: Thu, 19 Jun 2025 21:05:58 +0000 retitle 73730 31.0.50; Support for color fonts on MS-Windows reassign 73730 emacs submitter 73730 Cecilio Pardo severity 73730 wishlist thanks From debbugs-submit-bounces@debbugs.gnu.org Thu Oct 10 07:16:46 2024 Received: (at submit) by debbugs.gnu.org; 10 Oct 2024 11:16:46 +0000 Received: from localhost ([127.0.0.1]:58857 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1syr9x-0003Ck-B3 for submit@debbugs.gnu.org; Thu, 10 Oct 2024 07:16:46 -0400 Received: from lists.gnu.org ([209.51.188.17]:50574) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1syr9u-0003Cb-Ts for submit@debbugs.gnu.org; Thu, 10 Oct 2024 07:16:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1syr9j-000874-CN for bug-gnu-emacs@gnu.org; Thu, 10 Oct 2024 07:16:31 -0400 Received: from mail.imayhem.com ([82.223.54.191] helo=zealous-pike.82-223-54-191.plesk.page) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1syr9e-0004aX-K1 for bug-gnu-emacs@gnu.org; Thu, 10 Oct 2024 07:16:30 -0400 Received: from [10.0.12.77] (66.red-2-136-43.staticip.rima-tde.net [2.136.43.66]) by zealous-pike.82-223-54-191.plesk.page (Postfix) with ESMTPSA id 3516F80166 for ; Thu, 10 Oct 2024 11:16:24 +0000 (UTC) Authentication-Results: zealous-pike.82-223-54-191.plesk.page; spf=pass (sender IP is 2.136.43.66) smtp.mailfrom=cpardo@imayhem.com smtp.helo=[10.0.12.77] Received-SPF: pass (zealous-pike.82-223-54-191.plesk.page: connection is authenticated) Content-Type: multipart/mixed; boundary="------------8Mh0xe004XZIEm0ikrrcylOz" Message-ID: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> Date: Thu, 10 Oct 2024 13:16:23 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird From: Cecilio Pardo To: bug-gnu-emacs@gnu.org Subject: 31.0.50; Support for color fonts on MS-Windows Content-Language: es-ES Received-SPF: pass client-ip=82.223.54.191; envelope-from=cpardo@imayhem.com; helo=zealous-pike.82-223-54-191.plesk.page X-Spam_score_int: 1 X-Spam_score: 0.1 X-Spam_bar: / X-Spam_report: (0.1 / 5.0 requ) BAYES_00=-1.9, DC_PNG_UNO_LARGO=0.001, PDS_OTHER_BAD_TLD=1.999, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-Spam-Score: 0.7 (/) X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.3 (/) This is a multi-part message in MIME format. --------------8Mh0xe004XZIEm0ikrrcylOz Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit The attached patch is a preliminar implementation of a DirectWrite font driver that allows for color fonts, tested only on Windows 11. There is much to be refined about quality, performance (caching), OS version conditionals, etc. Before doing all that, I need to know that this is the right (or at least good enough) way to do it. The DirectWrite font driver mounts on top of a copy of the harfbuzz one, and then replaces some of the functions, but some of the hb functions include eassert to check that the driver for a font is harfbuzz. I don't know how to deal with that. I suppose that if we skip harfbuzz completely, then we would have to reimplement a lot of stuff with DirectWrite? Also uniscribe_open has been modified to change the driver assigned to the font unconditionally to dwrite. -- Cecilio Pardo --------------8Mh0xe004XZIEm0ikrrcylOz Content-Type: text/plain; charset=UTF-8; name="0001-Font-driver-for-DirectWrite-MS-Windows-supporting-co.patch" Content-Disposition: attachment; filename*0="0001-Font-driver-for-DirectWrite-MS-Windows-supporting-co.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSBkMDA0ODQ1ZmU2YTk0OTVhZjdjMDNkZGQ5ZDMwZDNiYTcxZmMzZTVkIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBDZWNpbGlvIFBhcmRvIDxjcGFyZG9AaW1heWhlbS5j b20+CkRhdGU6IFdlZCwgOSBPY3QgMjAyNCAxMTo0MDoyOCArMDIwMApTdWJqZWN0OiBbUEFU Q0hdIEZvbnQgZHJpdmVyIGZvciBEaXJlY3RXcml0ZSAoTVMtV2luZG93cykgc3VwcG9ydGlu ZyBjb2xvcgogZm9udHMuCgotLS0KIGNvbmZpZ3VyZS5hYyAgICAgICB8ICAgNCArLQogc3Jj L2ZvbnQuaCAgICAgICAgIHwgICAxICsKIHNyYy93MzJkd3JpdGUuYyAgICB8IDQ3MCArKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIHNyYy93MzJmbnMu YyAgICAgICB8ICAgNyArCiBzcmMvdzMydW5pc2NyaWJlLmMgfCAgIDIgKwogNSBmaWxlcyBj aGFuZ2VkLCA0ODIgaW5zZXJ0aW9ucygrKSwgMiBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2Rl IDEwMDY0NCBzcmMvdzMyZHdyaXRlLmMKCmRpZmYgLS1naXQgYS9jb25maWd1cmUuYWMgYi9j b25maWd1cmUuYWMKaW5kZXggOGE1YmE3ZGIzZDEuLjhhMDZkOWQ1MDI3IDEwMDY0NAotLS0g YS9jb25maWd1cmUuYWMKKysrIGIvY29uZmlndXJlLmFjCkBAIC0zMTcyLDcgKzMxNzIsNyBA QCBBQ19ERUZVTgogICBBQ19DSEVDS19UT09MKFtXSU5EUkVTXSwgW3dpbmRyZXNdLAogICAg ICAgICAgICAgICAgIFtBQ19NU0dfRVJST1IoW05vIHJlc291cmNlIGNvbXBpbGVyIGZvdW5k Ll0pXSkKICAgVzMyX09CSj0idzMyZm5zLm8gdzMybWVudS5vIHczMnJlZy5vIHczMmZvbnQu byB3MzJ0ZXJtLm8iCi0gIFczMl9PQko9IiRXMzJfT0JKIHczMnhmbnMubyB3MzJzZWxlY3Qu byB3MzJ1bmlzY3JpYmUubyB3MzJjeWd3aW54Lm8iCisgIFczMl9PQko9IiRXMzJfT0JKIHcz MnhmbnMubyB3MzJzZWxlY3QubyB3MzJ1bmlzY3JpYmUubyB3MzJkd3JpdGUubyB3MzJjeWd3 aW54Lm8iCiAgIEVNQUNTUkVTPSJlbWFjcy5yZXMiCiAgIGNhc2UgIiRjYW5vbmljYWwiIGlu CiAgICAgeDg2XzY0LSotKikgRU1BQ1NfTUFOSUZFU1Q9ImVtYWNzLXg2NC5tYW5pZmVzdCIg OzsKQEAgLTMyMDIsNyArMzIwMiw3IEBAIEFDX0RFRlVOCiAgICAgICBXMzJfT0JKPSIkVzMy X09CSiB3MzJpbWFnZS5vIgogICAgIGZpCiAgICAgVzMyX0xJQlM9IiRXMzJfTElCUyAtbHdp bm1tIC1sZ2RpMzIgLWxjb21kbGczMiIKLSAgICBXMzJfTElCUz0iJFczMl9MSUJTIC1sbXBy IC1sd2luc3Bvb2wgLWxvbGUzMiAtbGNvbWN0bDMyIgorICAgIFczMl9MSUJTPSIkVzMyX0xJ QlMgLWxtcHIgLWx3aW5zcG9vbCAtbG9sZTMyIC1sY29tY3RsMzIgLWxkd3JpdGUiCiAgICAg VzMyX1JFU19MSU5LPSJcJChFTUFDU1JFUykiCiAgICAgQ0xJRU5UUkVTPSJlbWFjc2NsaWVu dC5yZXMiCiAgICAgQ0xJRU5UVz0iZW1hY3NjbGllbnR3XCQoRVhFRVhUKSIKZGlmZiAtLWdp dCBhL3NyYy9mb250LmggYi9zcmMvZm9udC5oCmluZGV4IDhlZTE5NDBiZTBhLi43ZTBlOTZk OWJmYSAxMDA2NDQKLS0tIGEvc3JjL2ZvbnQuaAorKysgYi9zcmMvZm9udC5oCkBAIC05Nzgs NiArOTc4LDcgQEAgdmFsaWRfZm9udF9kcml2ZXIgKHN0cnVjdCBmb250X2RyaXZlciBjb25z dCAqZCkKIGV4dGVybiBzdHJ1Y3QgZm9udF9kcml2ZXIgdW5pc2NyaWJlX2ZvbnRfZHJpdmVy OwogI2lmZGVmIEhBVkVfSEFSRkJVWloKIGV4dGVybiBzdHJ1Y3QgZm9udF9kcml2ZXIgaGFy ZmJ1enpfZm9udF9kcml2ZXI7CitleHRlcm4gc3RydWN0IGZvbnRfZHJpdmVyIGR3cml0ZV9m b250X2RyaXZlcjsKICNlbmRpZgogZXh0ZXJuIHZvaWQgc3ltc19vZl93MzJmb250ICh2b2lk KTsKICNlbmRpZgkvKiBIQVZFX05UR1VJICovCmRpZmYgLS1naXQgYS9zcmMvdzMyZHdyaXRl LmMgYi9zcmMvdzMyZHdyaXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw MDAwMDAuLjMyYzljMTc5Nzc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3czMmR3cml0ZS5j CkBAIC0wLDAgKzEsNDcwIEBACisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8bWF0 aC5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2luY2x1ZGUgImxpc3AuaCIKKyNpbmNs dWRlICJjb2RpbmcuaCIKKyNpbmNsdWRlICJ3MzJ0ZXJtLmgiCisjaW5jbHVkZSAiZnJhbWUu aCIKKyNpbmNsdWRlICJjb21wb3NpdGUuaCIKKyNpbmNsdWRlICJmb250LmgiCisjaW5jbHVk ZSAidzMyZm9udC5oIgorI2luY2x1ZGUgInBkdW1wZXIuaCIKKyNpbmNsdWRlICJ3MzJjb21t b24uaCIKKworI2luY2x1ZGUgImluaXRndWlkLmgiCisjaW5jbHVkZSA8ZHdyaXRlXzMuaD4K Kwordm9pZCBzeW1zX29mX3czMmR3cml0ZSAodm9pZCk7CisKK3N0cnVjdCBmb250X2RyaXZl ciBkd3JpdGVfZm9udF9kcml2ZXI7CisKKy8qIEluaXRpYWxpemVkIG9uIHN5bXNfb2ZfdzMy ZHdyaXRlX2Zvcl9wZHVtcGVyICAqLworSURXcml0ZUZhY3RvcnkgKmR3cml0ZV9mYWN0b3J5 ID0gTlVMTDsKK0lEV3JpdGVGYWN0b3J5MiAqZHdyaXRlX2ZhY3RvcnkyID0gTlVMTDsKK0lE V3JpdGVHZGlJbnRlcm9wICpnZGlfaW50ZXJvcCA9IE5VTEw7CitJRFdyaXRlUmVuZGVyaW5n UGFyYW1zICpyZW5kZXJpbmdfcGFyYW1zID0gTlVMTDsKKworc3RhdGljIHZvaWQKK3Zlcmlm eV9ociAoSFJFU1VMVCBociwgY29uc3QgY2hhciAqbXNnKQoreworICBpZiAoRkFJTEVEICho cikpCisgICAgeworICAgICAgcHJpbnRmICgiRXJyb3I6ICVzXG4iLCBtc2cpOworICAgICAg YWJvcnQgKCk7CisgICAgfQorfQorCitzdGF0aWMgZmxvYXQKK2dldF9mb250X2FuZF9mYWNl IChIRk9OVCBoZm9udCwgTE9HRk9OVFcgKmxvZ2ZvbnRfb3V0LAorCQkgICBJRFdyaXRlRm9u dCAqKmZvbnQsIElEV3JpdGVGb250RmFjZSAqKmZhY2UpCit7CisgIEhSRVNVTFQgaHI7Cisg IExPR0ZPTlRXIGxvZ2ZvbnQ7CisKKyAgR2V0T2JqZWN0VyAoaGZvbnQsIHNpemVvZiAoTE9H Rk9OVFcpLCAmbG9nZm9udCk7CisgIGhyID0gZ2RpX2ludGVyb3AtPmxwVnRibC0+CisgICAg Q3JlYXRlRm9udEZyb21MT0dGT05UIChnZGlfaW50ZXJvcCwgKGNvbnN0IExPR0ZPTlRXICop ICZsb2dmb250LCBmb250KTsKKyAgdmVyaWZ5X2hyIChociwgIkZhaWxlZCB0byBjcmVhdGUg RFdyaXRlRm9udCIpOworICBociA9ICgqZm9udCktPmxwVnRibC0+CisgICAgQ3JlYXRlRm9u dEZhY2UgKCpmb250LCBmYWNlKTsKKyAgdmVyaWZ5X2hyIChociwgIkZhaWxlZCB0byBjcmVh dGUgRFdyaXRlRm9udEZhY2UiKTsKKworICBpZiAobG9nZm9udF9vdXQpCisgICAgKmxvZ2Zv bnRfb3V0ID0gbG9nZm9udDsKKworICByZXR1cm4gYWJzIChsb2dmb250LmxmSGVpZ2h0KTsK K30KKworc3RhdGljIElEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQgKgorZ2V0X2JpdG1hcF9y ZW5kZXJfdGFyZ2V0IChIREMgaGRjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgIEhS RVNVTFQgaHI7CisgIElEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQgKmJydDsKKyAgaHIgPSBn ZGlfaW50ZXJvcC0+bHBWdGJsLT4KKyAgICBDcmVhdGVCaXRtYXBSZW5kZXJUYXJnZXQgKGdk aV9pbnRlcm9wLCBoZGMsIHdpZHRoLCBoZWlnaHQsICZicnQpOworICB2ZXJpZnlfaHIgKGhy LCAiRmFpbGVkIHRvIGNyZWF0ZSBEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQiKTsKKworICBJ RFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0MSAqYnJ0MTsKKyAgaHIgPSBicnQtPmxwVnRibC0+ CisgICAgUXVlcnlJbnRlcmZhY2UgKGJydCwgJklJRF9JRFdyaXRlQml0bWFwUmVuZGVyVGFy Z2V0MSwgKHZvaWQgKiopJmJydDEpOworICB2ZXJpZnlfaHIgKGhyLCAiRmFpbGVkIHRvIGNy ZWF0ZSBEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQxIik7CisgIGJydDEtPmxwVnRibC0+Cisg ICAgU2V0VGV4dEFudGlhbGlhc01vZGUgKCBicnQxLCBEV1JJVEVfVEVYVF9BTlRJQUxJQVNf TU9ERV9DTEVBUlRZUEUgKTsKKyAgYnJ0MS0+bHBWdGJsLT5SZWxlYXNlKGJydDEpOworCisg IHJldHVybiBicnQ7Cit9CisKKworLyogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBmaWxsIGlu IHRoZSBhc2NlbnQgYW5kIGRlc2NlbnQgZmllbGRzIG9mCisgICBtZXRyaWNzLiAgKi8KK3N0 YXRpYyB2b2lkIHRleHRfZXh0ZW50c19pbnRlcm5hbChJRFdyaXRlRm9udCAqZHdyaXRlX2Zv bnQsCisJCQkJICBJRFdyaXRlRm9udEZhY2UgKmR3cml0ZV9mb250X2ZhY2UsCisJCQkJICBm bG9hdCBmb250X3NpemUsCisJCQkJICBjb25zdCB1bnNpZ25lZCAqY29kZSwKKwkJCQkgIGlu dCBuZ2x5cGhzLCBzdHJ1Y3QgZm9udF9tZXRyaWNzICptZXRyaWNzKQoreworICBIUkVTVUxU IGhyOworCisgIERXUklURV9GT05UX01FVFJJQ1MgZHdyaXRlX2ZvbnRfbWV0cmljczsKKyAg ZHdyaXRlX2ZvbnQtPmxwVnRibC0+CisgICAgR2V0TWV0cmljcyAoZHdyaXRlX2ZvbnQsICZk d3JpdGVfZm9udF9tZXRyaWNzKTsKKworICBVSU5UMTYgKmluZGljZXMgPSBhbGxvY2EgKG5n bHlwaHMgKiBzaXplb2YgKFVJTlQxNikpOworICBmb3IgKGludCBpID0gMDsgaSA8IG5nbHlw aHM7IGkrKykKKyAgICBpbmRpY2VzW2ldID0gY29kZVtpXTsKKworICBEV1JJVEVfR0xZUEhf TUVUUklDUyogZ21ldHJpY3MgPQorICAgIGFsbG9jYSAobmdseXBocyAqIHNpemVvZiAoRFdS SVRFX0dMWVBIX01FVFJJQ1MpKTsKKworICBociA9IGR3cml0ZV9mb250X2ZhY2UtPmxwVnRi bC0+CisgICAgR2V0R2RpQ29tcGF0aWJsZUdseXBoTWV0cmljcyAoZHdyaXRlX2ZvbnRfZmFj ZSwgZm9udF9zaXplLCAxLjAsIE5VTEwsCisJCQkJICBUUlVFLCBpbmRpY2VzLCBuZ2x5cGhz LCBnbWV0cmljcywgZmFsc2UgKTsKKyAgdmVyaWZ5X2hyIChociwgIkZhaWxlZCB0byBHZXRH ZGlDb21wYXRpYmxlR2x5cGhNZXRyaWNzIik7CisKKyAgZmxvYXQgd2lkdGggPSAwOworICBp bnQgdW5pdHNfcGVyX2VtID0gZHdyaXRlX2ZvbnRfbWV0cmljcy5kZXNpZ25Vbml0c1BlckVt OworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbmdseXBoczsgaSsrKQorICAgIHsKKyAgICAg IHdpZHRoICs9IChmbG9hdClnbWV0cmljc1tpXS5hZHZhbmNlV2lkdGggKiBmb250X3NpemUg LyB1bml0c19wZXJfZW07CisgICAgICBmbG9hdCBsYmVhcmluZyA9IHJvdW5kICgoZmxvYXQp IGdtZXRyaWNzW2ldLmxlZnRTaWRlQmVhcmluZyAqIGZvbnRfc2l6ZQorCQkJICAgICAvIHVu aXRzX3Blcl9lbSk7CisgICAgICBmbG9hdCByYmVhcmluZyA9IHJvdW5kICgoZmxvYXQpIGdt ZXRyaWNzW2ldLnJpZ2h0U2lkZUJlYXJpbmcgKiBmb250X3NpemUKKwkJCSAgICAgIC8gdW5p dHNfcGVyX2VtKTsKKyAgICAgIGlmIChpPT0wKQorCXsKKwkgIG1ldHJpY3MtPmxiZWFyaW5n ID0gbGJlYXJpbmc7CisJICBtZXRyaWNzLT5yYmVhcmluZyA9IHJiZWFyaW5nOworCX0KKyAg ICAgIGlmIChtZXRyaWNzLT5sYmVhcmluZyA+IGxiZWFyaW5nKQorCW1ldHJpY3MtPmxiZWFy aW5nID0gbGJlYXJpbmc7CisgICAgICBpZiAobWV0cmljcy0+cmJlYXJpbmcgPCByYmVhcmlu ZykKKwltZXRyaWNzLT5yYmVhcmluZyA9IHJiZWFyaW5nOworICAgIH0KKyAgbWV0cmljcy0+ d2lkdGggPSByb3VuZCh3aWR0aCk7Cit9CisKK3N0YXRpYyBMaXNwX09iamVjdAorZHdyaXRl X2xpc3QgKHN0cnVjdCBmcmFtZSAqZiwgTGlzcF9PYmplY3QgZm9udF9zcGVjKQoreworICBM aXNwX09iamVjdCBmb250cyA9IHczMmZvbnRfbGlzdF9pbnRlcm5hbCAoZiwgZm9udF9zcGVj LCB0cnVlKTsKKyAgZm9yIChMaXNwX09iamVjdCB0YWlsID0gZm9udHM7IENPTlNQICh0YWls KTsgdGFpbCA9IFhDRFIgKHRhaWwpKQorICAgIEFTRVQgKFhDQVIgKHRhaWwpLCBGT05UX1RZ UEVfSU5ERVgsIFFkd3JpdGUpOworCisgIEZPTlRfQUREX0xPRyAoImR3cml0ZS1saXN0Iiwg Zm9udF9zcGVjLCBmb250cyk7CisgIHJldHVybiBmb250czsKK30KKworc3RhdGljIExpc3Bf T2JqZWN0Citkd3JpdGVfbWF0Y2ggKHN0cnVjdCBmcmFtZSAqZiwgTGlzcF9PYmplY3QgZm9u dF9zcGVjKQoreworICBMaXNwX09iamVjdCBlbnRpdHkgPSB3MzJmb250X21hdGNoX2ludGVy bmFsIChmLCBmb250X3NwZWMsIHRydWUpOworICBGT05UX0FERF9MT0cgKCJkd3JpdGUtbWF0 Y2giLCBmb250X3NwZWMsIGVudGl0eSk7CisKKyAgaWYgKCEgTklMUCAoZW50aXR5KSkKKyAg ICBBU0VUIChlbnRpdHksIEZPTlRfVFlQRV9JTkRFWCwgUWR3cml0ZSk7CisgIHJldHVybiBl bnRpdHk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZAorZHdyaXRlX2VuY29kZV9jaGFyIChzdHJ1 Y3QgZm9udCAqZm9udCwgaW50IGMpCit7CisgIEhSRVNVTFQgaHI7CisgIElEV3JpdGVGb250 ICpkd3JpdGVfZm9udDsKKyAgSURXcml0ZUZvbnRGYWNlICpkd3JpdGVfZm9udF9mYWNlOwor CisgIGdldF9mb250X2FuZF9mYWNlICgoKHN0cnVjdCB3MzJmb250X2luZm8gKikgZm9udCkt Pmhmb250LAorCQkgICAgIE5VTEwsICZkd3JpdGVfZm9udCwgJmR3cml0ZV9mb250X2ZhY2Ug KTsKKyAgVUlOVDE2IGluZGV4OworCisgIGhyID0gZHdyaXRlX2ZvbnRfZmFjZS0+bHBWdGJs LT4KKyAgICBHZXRHbHlwaEluZGljZXMgKGR3cml0ZV9mb250X2ZhY2UsICZjLCAxLCAmaW5k ZXgpOworICB2ZXJpZnlfaHIgKGhyLCAiRmFpbGVkIHRvIEdldEdseXBoSW5kaWNlcyIpOwor CisgIGR3cml0ZV9mb250LT5scFZ0YmwtPlJlbGVhc2UgKGR3cml0ZV9mb250KTsKKyAgZHdy aXRlX2ZvbnRfZmFjZS0+bHBWdGJsLT5SZWxlYXNlIChkd3JpdGVfZm9udF9mYWNlKTsKKwor ICBpZiAoaW5kZXggPT0gMCkKKyAgICByZXR1cm4gRk9OVF9JTlZBTElEX0NPREU7CisKKyAg cmV0dXJuIGluZGV4OworfQorCitzdGF0aWMgdm9pZAorZHdyaXRlX3RleHRfZXh0ZW50cyAo c3RydWN0IGZvbnQgKmZvbnQsIGNvbnN0IHVuc2lnbmVkICpjb2RlLAorCQkgICAgIGludCBu Z2x5cGhzLCBzdHJ1Y3QgZm9udF9tZXRyaWNzICptZXRyaWNzKQoreworICBJRFdyaXRlRm9u dCAqZHdyaXRlX2ZvbnQ7CisgIElEV3JpdGVGb250RmFjZSAqZHdyaXRlX2ZvbnRfZmFjZTsK KworICBIRk9OVCBoZm9udCA9ICgoc3RydWN0IHczMmZvbnRfaW5mbyAqKSBmb250KS0+aGZv bnQ7CisgIGZsb2F0IGZvbnRfc2l6ZSA9IGdldF9mb250X2FuZF9mYWNlIChoZm9udCwKKwkJ CQkgICAgICAgTlVMTCwgJmR3cml0ZV9mb250LAorCQkJCSAgICAgICAmZHdyaXRlX2ZvbnRf ZmFjZSApOworCisgIHRleHRfZXh0ZW50c19pbnRlcm5hbCAoZHdyaXRlX2ZvbnQsIGR3cml0 ZV9mb250X2ZhY2UsIGZvbnRfc2l6ZSwgY29kZSwKKwkJCSBuZ2x5cGhzLCBtZXRyaWNzKTsK KworICBkd3JpdGVfZm9udC0+bHBWdGJsLT5SZWxlYXNlIChkd3JpdGVfZm9udCk7CisgIGR3 cml0ZV9mb250X2ZhY2UtPmxwVnRibC0+UmVsZWFzZSAoZHdyaXRlX2ZvbnRfZmFjZSk7CisK KyAgbWV0cmljcy0+YXNjZW50ID0gZm9udC0+YXNjZW50OworICBtZXRyaWNzLT5kZXNjZW50 ID0gZm9udC0+ZGVzY2VudDsKK30KKworc3RhdGljCit2b2lkIGR3cml0ZV9kcmF3X2ludGVy bmFsIChIREMgaGRjLCBpbnQgeCwgaW50IHksIHVuc2lnbmVkICpnbHlwaHMsIGludCBsZW4s CisJCQkgICBpbnQgYmFzZWxpbmVfeSwgQ09MT1JSRUYgY29sb3IsIHN0cnVjdCBmb250ICpm b250ICkKK3sKKyAgSFJFU1VMVCBocjsKKyAgTE9HRk9OVFcgbG9nZm9udDsKKyAgSURXcml0 ZUZvbnQgKmR3cml0ZV9mb250OworICBJRFdyaXRlRm9udEZhY2UgKmR3cml0ZV9mb250X2Zh Y2U7CisKKyAgZmxvYXQgZm9udF9zaXplID0gZ2V0X2ZvbnRfYW5kX2ZhY2UgKEdldEN1cnJl bnRPYmplY3QgKGhkYywgT0JKX0ZPTlQpLAorCQkJCSAgICAgICAmbG9nZm9udCwgJmR3cml0 ZV9mb250LAorCQkJCSAgICAgICAmZHdyaXRlX2ZvbnRfZmFjZSApOworCisgIElEV3JpdGVU ZXh0Rm9ybWF0ICp0ZXh0X2Zvcm1hdDsKKyAgaHIgPSBkd3JpdGVfZmFjdG9yeS0+bHBWdGJs LT4KKyAgICBDcmVhdGVUZXh0Rm9ybWF0IChkd3JpdGVfZmFjdG9yeSwKKwkJICAgICAgbG9n Zm9udC5sZkZhY2VOYW1lLAorCQkgICAgICBOVUxMLAorCQkgICAgICBEV1JJVEVfRk9OVF9X RUlHSFRfTk9STUFMLAorCQkgICAgICBEV1JJVEVfRk9OVF9TVFlMRV9OT1JNQUwsCisJCSAg ICAgIERXUklURV9GT05UX1NUUkVUQ0hfTk9STUFMLAorCQkgICAgICBmb250X3NpemUsIEwi IiwKKwkJICAgICAgJnRleHRfZm9ybWF0KTsKKyAgdmVyaWZ5X2hyIChociwgIkZhaWxlZCB0 byBjcmVhdGUgRFdyaXRlVGV4dEZvcm1hdCIpOworCisgIHN0cnVjdCBmb250X21ldHJpY3Mg bWV0cmljczsKKyAgdGV4dF9leHRlbnRzX2ludGVybmFsIChkd3JpdGVfZm9udCwgZHdyaXRl X2ZvbnRfZmFjZSwKKwkJCSBmb250X3NpemUsIGdseXBocywgbGVuLCAmbWV0cmljcyk7CisK KyAgaW50IGJpdG1hcF93aWR0aCA9IG1ldHJpY3Mud2lkdGg7CisgIGludCBiaXRtYXBfaGVp Z2h0ID0gZm9udC0+YXNjZW50ICsgZm9udC0+ZGVzY2VudDsKKworICBJRFdyaXRlQml0bWFw UmVuZGVyVGFyZ2V0ICpiaXRtYXBfcmVuZGVyX3RhcmdldCA9CisgICAgZ2V0X2JpdG1hcF9y ZW5kZXJfdGFyZ2V0IChoZGMsIGJpdG1hcF93aWR0aCwgYml0bWFwX2hlaWdodCk7CisKKyAg SERDIHRleHRfZGMgPSBiaXRtYXBfcmVuZGVyX3RhcmdldC0+bHBWdGJsLT4KKyAgICBHZXRN ZW1vcnlEQyAoYml0bWFwX3JlbmRlcl90YXJnZXQpOworCisgIEJpdEJsdCAodGV4dF9kYywg MCwgMCwgYml0bWFwX3dpZHRoLCBiaXRtYXBfaGVpZ2h0LCBoZGMsIHgsIHksIFNSQ0NPUFkp OworCisgIERXUklURV9HTFlQSF9SVU4gZ2x5cGhfcnVuOworCisgIFVJTlQxNiAqaW5kaWNl cyA9IGFsbG9jYSAobGVuICogc2l6ZW9mIChVSU5UMTYpKTsKKworICBmb3IgKGludCBpID0g MDsgaSA8IGxlbjsgaSsrKQorICAgIGluZGljZXNbaV0gPSBnbHlwaHNbaV07CisKKyAgRkxP QVQgKmFkdmFuY2VzID0gYWxsb2NhIChsZW4gKiBzaXplb2YgKEZMT0FUKSk7CisKKyAgZm9y IChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICB7CisgICAgICB0ZXh0X2V4dGVudHNf aW50ZXJuYWwgKGR3cml0ZV9mb250LCBkd3JpdGVfZm9udF9mYWNlLAorCQkJICAgICBmb250 X3NpemUsIGdseXBocyArIGksIDEsICZtZXRyaWNzKTsKKyAgICAgIGFkdmFuY2VzW2ldID0g bWV0cmljcy53aWR0aDsKKyAgICB9CisKKyAgZ2x5cGhfcnVuLmZvbnRGYWNlID0gZHdyaXRl X2ZvbnRfZmFjZTsKKyAgZ2x5cGhfcnVuLmZvbnRFbVNpemUgPSBmb250X3NpemU7CisgIGds eXBoX3J1bi5nbHlwaEluZGljZXMgPSBpbmRpY2VzOworICBnbHlwaF9ydW4uZ2x5cGhDb3Vu dCA9IGxlbjsKKyAgZ2x5cGhfcnVuLmlzU2lkZXdheXMgPSBmYWxzZTsKKyAgZ2x5cGhfcnVu LmJpZGlMZXZlbCA9IDA7CisgIGdseXBoX3J1bi5nbHlwaE9mZnNldHMgPSBOVUxMOworICBn bHlwaF9ydW4uZ2x5cGhBZHZhbmNlcyA9IGFkdmFuY2VzOworCisgIElEV3JpdGVDb2xvckds eXBoUnVuRW51bWVyYXRvciAqbGF5ZXJzOworCisgIGhyID0gZHdyaXRlX2ZhY3RvcnkyLT5s cFZ0YmwtPgorICAgIFRyYW5zbGF0ZUNvbG9yR2x5cGhSdW4gKGR3cml0ZV9mYWN0b3J5MiwK KwkJCSAgICAwLCBiYXNlbGluZV95LAorCQkJICAgICZnbHlwaF9ydW4sCisJCQkgICAgTlVM TCwKKwkJCSAgICBEV1JJVEVfTUVBU1VSSU5HX01PREVfR0RJX0NMQVNTSUMsCisJCQkgICAg TlVMTCwKKwkJCSAgICAwLAorCQkJICAgICZsYXllcnMgKTsKKyAgaWYgKGhyID09IERXUklU RV9FX05PQ09MT1IpCisgICAgeworICAgICAgYml0bWFwX3JlbmRlcl90YXJnZXQtPmxwVnRi bC0+CisJRHJhd0dseXBoUnVuIChiaXRtYXBfcmVuZGVyX3RhcmdldCwKKwkJICAgICAgMCwg YmFzZWxpbmVfeSwKKwkJICAgICAgRFdSSVRFX01FQVNVUklOR19NT0RFX0dESV9DTEFTU0lD LAorCQkgICAgICAmZ2x5cGhfcnVuLAorCQkgICAgICByZW5kZXJpbmdfcGFyYW1zLAorCQkg ICAgICBjb2xvciwKKwkJICAgICAgTlVMTCk7CisgICAgfQorICBlbHNlCisgICAgeworICAg ICAgdmVyaWZ5X2hyIChociwgIkZhaWxlZCBhdCBUcmFuc2xhdGVDb2xvckdseXBoUnVuIik7 CisgICAgICBmb3IgKDs7KSB7CisJSFJFU1VMVCBocjsKKwlCT09MIG1vcmVfbGF5ZXJzOwor CWNvbnN0IERXUklURV9DT0xPUl9HTFlQSF9SVU4gKmxheWVyOworCisJaHIgPSBsYXllcnMt PmxwVnRibC0+TW92ZU5leHQgKGxheWVycywgJm1vcmVfbGF5ZXJzKTsKKwl2ZXJpZnlfaHIg KGhyLCAiRmFpbGVkIGF0IE1vdmVOZXh0Iik7CisJaWYgKCFtb3JlX2xheWVycykKKwkgIGJy ZWFrOworCWhyID0gbGF5ZXJzLT5scFZ0YmwtPkdldEN1cnJlbnRSdW4gKGxheWVycywgJmxh eWVyKTsKKwl2ZXJpZnlfaHIgKGhyLCAiRmFpbGVkIGF0IEdldEN1cnJlbnRSdW4iKTsKKwli aXRtYXBfcmVuZGVyX3RhcmdldC0+bHBWdGJsLT4KKwkgIERyYXdHbHlwaFJ1biAoYml0bWFw X3JlbmRlcl90YXJnZXQsCisJCQlsYXllci0+YmFzZWxpbmVPcmlnaW5YLCBsYXllci0+YmFz ZWxpbmVPcmlnaW5ZLAorCQkJRFdSSVRFX01FQVNVUklOR19NT0RFX0dESV9DTEFTU0lDLAor CQkJJmxheWVyLT5nbHlwaFJ1biwKKwkJCXJlbmRlcmluZ19wYXJhbXMsCisJCQlSR0IoIGxh eWVyLT5ydW5Db2xvci5yICogMjU1LAorCQkJICAgICBsYXllci0+cnVuQ29sb3IuZyAqIDI1 NSwKKwkJCSAgICAgbGF5ZXItPnJ1bkNvbG9yLmIgKiAyNTUgKSwKKwkJCU5VTEwpOworICAg ICAgfQorCisgICAgICBsYXllcnMtPmxwVnRibC0+UmVsZWFzZSAobGF5ZXJzKTsKKyAgICB9 CisgIEJpdEJsdCAoaGRjLCB4LCB5LCBiaXRtYXBfd2lkdGgsIGJpdG1hcF9oZWlnaHQsIHRl eHRfZGMsIDAsIDAsIFNSQ0NPUFkpOworCisgIHRleHRfZm9ybWF0LT5scFZ0YmwtPlJlbGVh c2UgKHRleHRfZm9ybWF0KTsKKyAgZHdyaXRlX2ZvbnQtPmxwVnRibC0+UmVsZWFzZSAoZHdy aXRlX2ZvbnQpOworICBiaXRtYXBfcmVuZGVyX3RhcmdldC0+bHBWdGJsLT5SZWxlYXNlIChi aXRtYXBfcmVuZGVyX3RhcmdldCk7CisgIGR3cml0ZV9mb250X2ZhY2UtPmxwVnRibC0+UmVs ZWFzZSAoZHdyaXRlX2ZvbnRfZmFjZSk7Cit9CisKK3N0YXRpYyBpbnQKK2R3cml0ZV9kcmF3 IChzdHJ1Y3QgZ2x5cGhfc3RyaW5nICpzLCBpbnQgZnJvbSwgaW50IHRvLAorCSAgICAgaW50 IHgsIGludCB5LCBib29sIHdpdGhfYmFja2dyb3VuZCkKK3sKKyAgSFJHTiBvcmlnX2NsaXAg PSBOVUxMOworICBpbnQgbGVuID0gdG8gLSBmcm9tOworCisgIGlmIChzLT5udW1fY2xpcHMg PiAwKQorICAgIHsKKyAgICAgIEhSR04gbmV3X2NsaXAgPSBDcmVhdGVSZWN0UmduSW5kaXJl Y3QgKHMtPmNsaXApOworCisgICAgICAvKiBTYXZlIGNsaXAgcmVnaW9uIGZvciBsYXRlciBy ZXN0b3JhdGlvbi4gICovCisgICAgICBvcmlnX2NsaXAgPSBDcmVhdGVSZWN0UmduICgwLCAw LCAwLCAwKTsKKyAgICAgIGlmICghR2V0Q2xpcFJnbiAocy0+aGRjLCBvcmlnX2NsaXApKQor CXsKKwkgIERlbGV0ZU9iamVjdCAob3JpZ19jbGlwKTsKKwkgIG9yaWdfY2xpcCA9IE5VTEw7 CisJfQorCisgICAgICBpZiAocy0+bnVtX2NsaXBzID4gMSkKKyAgICAgICAgeworICAgICAg ICAgIEhSR04gY2xpcDIgPSBDcmVhdGVSZWN0UmduSW5kaXJlY3QgKHMtPmNsaXAgKyAxKTsK KworICAgICAgICAgIENvbWJpbmVSZ24gKG5ld19jbGlwLCBuZXdfY2xpcCwgY2xpcDIsIFJH Tl9PUik7CisgICAgICAgICAgRGVsZXRlT2JqZWN0IChjbGlwMik7CisgICAgICAgIH0KKwor ICAgICAgU2VsZWN0Q2xpcFJnbiAocy0+aGRjLCBuZXdfY2xpcCk7CisgICAgICBEZWxldGVP YmplY3QgKG5ld19jbGlwKTsKKyAgICB9CisKKyAgLyogVXNpbmcgT1BBUVVFIGJhY2tncm91 bmQgbW9kZSBjYW4gY2xlYXIgbW9yZSBiYWNrZ3JvdW5kIHRoYW4gZXhwZWN0ZWQKKyAgICAg d2hlbiBDbGVhcnR5cGUgaXMgdXNlZC4gIERyYXcgdGhlIGJhY2tncm91bmQgbWFudWFsbHkg dG8gYXZvaWQgdGhpcy4gICovCisgIFNldEJrTW9kZSAocy0+aGRjLCBUUkFOU1BBUkVOVCk7 CisgIGlmICh3aXRoX2JhY2tncm91bmQpCisgICAgeworICAgICAgSEJSVVNIIGJydXNoOwor ICAgICAgUkVDVCByZWN0OworICAgICAgc3RydWN0IGZvbnQgKmZvbnQgPSBzLT5mb250Owor ICAgICAgaW50IGFzY2VudCA9IGZvbnQtPmFzY2VudCwgZGVzY2VudCA9IGZvbnQtPmRlc2Nl bnQ7CisKKyAgICAgIC8qIEZvbnQncyBnbG9iYWwgYXNjZW50IGFuZCBkZXNjZW50IHZhbHVl cyBtaWdodCBiZQorCSBwcmVwb3N0ZXJvdXNseSBsYXJnZSBmb3Igc29tZSBmb250cy4gIFdl IGZpeCBoZXJlIHRoZSBjYXNlCisJIHdoZW4gdGhvc2UgZm9udHMgYXJlIHVzZWQgZm9yIGRp c3BsYXkgb2YgZ2x5cGhsZXNzCisJIGNoYXJhY3RlcnMsIGJlY2F1c2UgZHJhd2luZyBiYWNr Z3JvdW5kIHdpdGggZm9udCBkaW1lbnNpb25zCisJIGluIHRob3NlIGNhc2VzIG1ha2VzIHRo ZSBkaXNwbGF5IGlsbGVnaWJsZS4gIFRoZXJlJ3Mgb25seSBvbmUKKwkgbW9yZSBjYWxsIHRv IHRoZSBkcmF3IG1ldGhvZCB3aXRoIHdpdGhfYmFja2dyb3VuZCBzZXQgdG8KKwkgdHJ1ZSwg YW5kIHRoYXQncyBpbiB3MzJfZHJhd19nbHlwaF9zdHJpbmdfZm9yZWdyb3VuZCwgd2hlbgor CSBkcmF3aW5nIHRoZSBjdXJzb3IsIHdoZXJlIHdlIGhhdmUgbm8gc3VjaCBoZXVyaXN0aWNz CisJIGF2YWlsYWJsZS4gIEZJWE1FLiAgKi8KKyAgICAgIGlmIChzLT5maXJzdF9nbHlwaC0+ dHlwZSA9PSBHTFlQSExFU1NfR0xZUEgKKwkgICYmIChzLT5maXJzdF9nbHlwaC0+dS5nbHlw aGxlc3MubWV0aG9kID09IEdMWVBITEVTU19ESVNQTEFZX0hFWF9DT0RFCisJICAgICAgfHwg cy0+Zmlyc3RfZ2x5cGgtPnUuZ2x5cGhsZXNzLm1ldGhvZCA9PSBHTFlQSExFU1NfRElTUExB WV9BQ1JPTllNKSkKKwl7CisJICBhc2NlbnQgPQorCSAgICBzLT5maXJzdF9nbHlwaC0+c2xp Y2UuZ2x5cGhsZXNzLmxvd2VyX3lvZmYKKwkgICAgLSBzLT5maXJzdF9nbHlwaC0+c2xpY2Uu Z2x5cGhsZXNzLnVwcGVyX3lvZmY7CisJICBkZXNjZW50ID0gMDsKKwl9CisgICAgICBicnVz aCA9IENyZWF0ZVNvbGlkQnJ1c2ggKHMtPmdjLT5iYWNrZ3JvdW5kKTsKKyAgICAgIHJlY3Qu bGVmdCA9IHg7CisgICAgICByZWN0LnRvcCA9IHkgLSBhc2NlbnQ7CisgICAgICByZWN0LnJp Z2h0ID0geCArIHMtPndpZHRoOworICAgICAgcmVjdC5ib3R0b20gPSB5ICsgZGVzY2VudDsK KyAgICAgIEZpbGxSZWN0IChzLT5oZGMsICZyZWN0LCBicnVzaCk7CisgICAgICBEZWxldGVP YmplY3QgKGJydXNoKTsKKyAgICB9CisKKyAgaWYgKHMtPnBhZGRpbmdfcCkKKyAgICB7Cisg ICAgICBpbnQgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkgIGR3cml0 ZV9kcmF3X2ludGVybmFsIChzLT5oZGMsIHgsIHkgLSBzLT5mb250LT5hc2NlbnQsCisJCQkJ cy0+Y2hhcjJiICsgZnJvbSwgMSwgcy0+Zm9udC0+YXNjZW50LAorCQkJCUdldFRleHRDb2xv cihzLT5oZGMpLCBzLT5mb250KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkd3Jp dGVfZHJhd19pbnRlcm5hbCggcy0+aGRjLCB4LCB5IC0gcy0+Zm9udC0+YXNjZW50LAorCQkJ ICAgIHMtPmNoYXIyYiArIGZyb20sIGxlbiwgcy0+Zm9udC0+YXNjZW50LAorCQkJICAgIEdl dFRleHRDb2xvcihzLT5oZGMpLCBzLT5mb250ICk7CisKKyAgICB9CisKKyAgLyogUmVzdG9y ZSBjbGlwIHJlZ2lvbi4gICovCisgIGlmIChzLT5udW1fY2xpcHMgPiAwKQorICAgIFNlbGVj dENsaXBSZ24gKHMtPmhkYywgb3JpZ19jbGlwKTsKKworICBpZiAob3JpZ19jbGlwKQorICAg IERlbGV0ZU9iamVjdCAob3JpZ19jbGlwKTsKKworICByZXR1cm4gbGVuOworfQorCitzdGF0 aWMgdm9pZAorc3ltc19vZl93MzJkd3JpdGVfZm9yX3BkdW1wZXIgKHZvaWQpCit7CisgIEhS RVNVTFQgaHI7CisKKyAgaWYgKCFpbml0aWFsaXplZCkKKyAgICByZXR1cm47CisKKyAgREVG U1lNIChRZHdyaXRlLCAiZHdyaXRlIik7CisKKyAgZHdyaXRlX2ZvbnRfZHJpdmVyID0gaGFy ZmJ1enpfZm9udF9kcml2ZXI7CisgIGR3cml0ZV9mb250X2RyaXZlci50eXBlID0gUWR3cml0 ZTsKKyAgZHdyaXRlX2ZvbnRfZHJpdmVyLmRyYXcgPSBkd3JpdGVfZHJhdzsKKyAgZHdyaXRl X2ZvbnRfZHJpdmVyLmxpc3QgPSBkd3JpdGVfbGlzdDsKKyAgZHdyaXRlX2ZvbnRfZHJpdmVy Lm1hdGNoID0gZHdyaXRlX21hdGNoOworICBkd3JpdGVfZm9udF9kcml2ZXIuZW5jb2RlX2No YXIgPSBkd3JpdGVfZW5jb2RlX2NoYXI7CisgIGR3cml0ZV9mb250X2RyaXZlci50ZXh0X2V4 dGVudHMgPSBkd3JpdGVfdGV4dF9leHRlbnRzOworICByZWdpc3Rlcl9mb250X2RyaXZlciAo JmR3cml0ZV9mb250X2RyaXZlciwgTlVMTCk7CisKKyAgaHIgPSBEV3JpdGVDcmVhdGVGYWN0 b3J5IChEV1JJVEVfRkFDVE9SWV9UWVBFX1NIQVJFRCwKKwkJCSAgICAmSUlEX0lEV3JpdGVG YWN0b3J5LAorCQkJICAgIChJVW5rbm93bioqKSZkd3JpdGVfZmFjdG9yeSk7CisgIHZlcmlm eV9ociAoaHIsICJGYWlsZWQgdG8gY3JlYXRlIERXcml0ZUZhY3RvcnkiKTsKKworICBociA9 IGR3cml0ZV9mYWN0b3J5LT5scFZ0YmwtPgorICAgIFF1ZXJ5SW50ZXJmYWNlIChkd3JpdGVf ZmFjdG9yeSwgJklJRF9JRFdyaXRlRmFjdG9yeTIsCisJCSAgICAodm9pZCAqKikmZHdyaXRl X2ZhY3RvcnkyKTsKKyAgdmVyaWZ5X2hyIChociwgIkZhaWxlZCB0byBjcmVhdGUgRFdyaXRl RmFjdG9yeTIiKTsKKworICBociA9IGR3cml0ZV9mYWN0b3J5LT5scFZ0YmwtPgorICAgIEdl dEdkaUludGVyb3AgKGR3cml0ZV9mYWN0b3J5LCAmZ2RpX2ludGVyb3ApOworICB2ZXJpZnlf aHIgKGhyLCAiRmFpbGVkIHRvIGdldCBEV3JpdGVHZ2lJbnRlcm9wIik7CisKKyAgSURXcml0 ZVJlbmRlcmluZ1BhcmFtcyAqZGVmOworCisgIGhyID0gZHdyaXRlX2ZhY3RvcnktPmxwVnRi bC0+CisgICAgQ3JlYXRlUmVuZGVyaW5nUGFyYW1zIChkd3JpdGVfZmFjdG9yeSwgJmRlZik7 CisgIHZlcmlmeV9ociAoaHIsICJGYWlsZWQgdG8gY3JlYXRlIERXcml0ZVJlbmRlcmluZ1Bh cmFtcyIpOworCisgIGhyID0gZHdyaXRlX2ZhY3RvcnktPmxwVnRibC0+CisgICAgQ3JlYXRl Q3VzdG9tUmVuZGVyaW5nUGFyYW1zIChkd3JpdGVfZmFjdG9yeSwKKwkJCQkgZGVmLT5scFZ0 YmwtPkdldEdhbW1hKGRlZiksCisJCQkJIGRlZi0+bHBWdGJsLT5HZXRFbmhhbmNlZENvbnRy YXN0KGRlZiksCisJCQkJIGRlZi0+bHBWdGJsLT5HZXRDbGVhclR5cGVMZXZlbChkZWYpLAor CQkJCSBkZWYtPmxwVnRibC0+R2V0UGl4ZWxHZW9tZXRyeShkZWYpLAorCQkJCSBEV1JJVEVf UkVOREVSSU5HX01PREVfR0RJX0NMQVNTSUMsCisJCQkJICZyZW5kZXJpbmdfcGFyYW1zKTsK KyAgdmVyaWZ5X2hyIChociwgIkZhaWxlZCB0byBjcmVhdGUgRFdyaXRlUmVuZGVyaW5nUGFy YW1zIik7CisKKyAgZGVmLT5scFZ0YmwtPlJlbGVhc2UgKGRlZik7Cit9CisKK3ZvaWQKK3N5 bXNfb2ZfdzMyZHdyaXRlICh2b2lkKQoreworICBwZHVtcGVyX2RvX25vd19hbmRfYWZ0ZXJf bG9hZCAoc3ltc19vZl93MzJkd3JpdGVfZm9yX3BkdW1wZXIpOworfQpkaWZmIC0tZ2l0IGEv c3JjL3czMmZucy5jIGIvc3JjL3czMmZucy5jCmluZGV4IDNlZTEzZGNiYmRkLi5hYmE5MWMx ZDQxYyAxMDA2NDQKLS0tIGEvc3JjL3czMmZucy5jCisrKyBiL3NyYy93MzJmbnMuYwpAQCAt MjkzLDYgKzI5MywxMCBAQCAjZGVmaW5lIE1FTlVfRlJFRV9ERUxBWSAxMDAwCiBleHRlcm4g aW50IHVuaXNjcmliZV9hdmFpbGFibGU7CiBleHRlcm4gaW50IGhhcmZidXp6X2F2YWlsYWJs ZTsKIAorLyogRnJvbSB3MzJkd3JpdGUuYyAgKi8KK2V4dGVybiB2b2lkIHN5bXNfb2ZfdzMy ZHdyaXRlICh2b2lkKTsKKworCiAjaWZkZWYgV0lORE9XU05UCiAvKiBGcm9tIHczMmluZXZ0 LmMgKi8KIGV4dGVybiBpbnQgZmFrZWRfa2V5OwpAQCAtNjM1Niw2ICs2MzYwLDggQEAgREVG VU4gKCJ4LWNyZWF0ZS1mcmFtZSIsIEZ4X2NyZWF0ZV9mcmFtZSwgU3hfY3JlYXRlX2ZyYW1l LAogICAgICAgc3BlY2JpbmQgKFF4X3Jlc291cmNlX25hbWUsIG5hbWUpOwogICAgIH0KIAor ICByZWdpc3Rlcl9mb250X2RyaXZlciAoJmR3cml0ZV9mb250X2RyaXZlciwgZik7CisKICNp ZmRlZiBIQVZFX0hBUkZCVVpaCiAgIGlmIChoYXJmYnV6el9hdmFpbGFibGUpCiAgICAgcmVn aXN0ZXJfZm9udF9kcml2ZXIgKCZoYXJmYnV6el9mb250X2RyaXZlciwgZik7CkBAIC0xMTgx MSw2ICsxMTgxNyw3IEBAIGdsb2JhbHNfb2ZfdzMyZm5zICh2b2lkKQogICBJbml0Q29tbW9u Q29udHJvbHMgKCk7CiAKICAgc3ltc19vZl93MzJ1bmlzY3JpYmUgKCk7CisgIHN5bXNfb2Zf dzMyZHdyaXRlICgpOwogfQogCiAjaWZkZWYgV0lORE9XU05UCmRpZmYgLS1naXQgYS9zcmMv dzMydW5pc2NyaWJlLmMgYi9zcmMvdzMydW5pc2NyaWJlLmMKaW5kZXggYjc3YmY1NmI4Y2Yu LmNiZTU3ZDg0OTBhIDEwMDY0NAotLS0gYS9zcmMvdzMydW5pc2NyaWJlLmMKKysrIGIvc3Jj L3czMnVuaXNjcmliZS5jCkBAIC0yMTEsNiArMjExLDggQEAgdW5pc2NyaWJlX29wZW4gKHN0 cnVjdCBmcmFtZSAqZiwgTGlzcF9PYmplY3QgZm9udF9lbnRpdHksIGludCBwaXhlbF9zaXpl KQogI2VuZGlmICAvKiBIQVZFX0hBUkZCVVpaICovCiAgICAgdW5pc2NyaWJlX2ZvbnQtPncz Ml9mb250LmZvbnQuZHJpdmVyID0gJnVuaXNjcmliZV9mb250X2RyaXZlcjsKIAorICB1bmlz Y3JpYmVfZm9udC0+dzMyX2ZvbnQuZm9udC5kcml2ZXIgPSAmZHdyaXRlX2ZvbnRfZHJpdmVy OworCiAgIHJldHVybiBmb250X29iamVjdDsKIH0KIAotLSAKMi4zNS4xLndpbmRvd3MuMgoK --------------8Mh0xe004XZIEm0ikrrcylOz Content-Type: image/png; name="emacs_3xjaQ7etE9.png" Content-Disposition: attachment; filename="emacs_3xjaQ7etE9.png" Content-Transfer-Encoding: base64 iVBORw0KGgoAAAANSUhEUgAAAsUAAAIkCAYAAAD201Y/AAAAAXNSR0IArs4c6QAAAARnQU1B AACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAHiqSURBVHhe7b0J2CVVee/75d6Tk5jh 3nNy70me59zEAfXE2GoGMFGD0aCC4BBbjUpOokYRSJyZupGxu6EbGpqmmewGmmYWiMg8NpMI KNragAOzDNrOiCEOMXrOuvVW1drfu2u/VbWq9tp71/727/c8//5675rWWrX2qt9eX+39zX3u c59zd955p/vsZz/rbr/9dnfzzTe7K664wl144YXurLPOcps2bTJzxhlnuI0bN/Zy+umnN4ps I/vw+znttNNax9p/MaeeeupArPV0ZN+h28nzGzZsGEixrH6f1rpWZF1rH9a6TeLromOtVxXZ 5pxzzklz9tlnDxXpa7Gy5rjj3fIjVrnjjl83sEyeLz4nOXbNWrfsiJXu+HUnuDPPPHOssfrT uGP1MUJmKdbrYpair+eTiPeBScXynCaxxvZxxrqujTPWdb1JvEu0zbnnnluZ8847z51//vnu oosucpdffrm7/vrrnfjvl770JXfXXXe5e+65x33lK19xc3fccYeTiBBfddVVaeO++x//0e38 2l3cC170Ivf0Zz2TEEIIIYSQqc4L//iP3Wt329W9d489UlG+8cYb+8R4TmT41ltvdRdffLE7 6OCD3J9uv725I0IIIYQQQhZC/myH7d3hyw53V155pfviF7+YivGcCLHcLnHQwQebGxFCCCGE ELIQI2J8ww03pGI8t3nz5vR+GGaICSGEEELILEVmjOVWCrmVeO7SSy9173r3u80VCSGEEEII Wch5z3vf66699lo3d8EFF6QfqrNWIoQQQgghZCFnl11f62SSeE6+SiP0Wyae8axnuWds96z0 /895+gvcy/7ob9wuO+zhdtn+ve6lf/SG5Lnnz6+XRG9LCCGEEEJI1/KsZz/bvXLvE92c3E9s rVCMl9xnP/157o0v3cft+96L3aH73+AOW3qz+9hHb3D77nGle//fnuNeu/2e7plPf07fNoQQ QgghhHQ16zee5ebkS7OthTrP2G679OcfPWMH989v2eiOWHa7W3XUnW5F8vPoI+5wZ6zf6q6+ 7AF3+ol3uYP/6Xr3ntescc95+qJsW8SYEEIIIYR0OPJHRObkL/lYC4t59u8/z+29+NREhj/v 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 t759lym8oZl2MRbpiBVr/3XZtGmTu/32281lXU6scoe0W9u27XJkLPnJT74zkLe9bXE67px5 5pnuxBNPdAcffHD63O23b+5bb+sdZ0YZj9qeR8ZQQgjpbnpSvOdee6UDsbWSjwzMIYO557Of /ay7++673de+9rWog7rsqyzW+rHjZ4l1bvr0GbW58tqTe/nERUdNrRSLbF177bXuiiuucKee eqq75pprernqqqvSXH311elPWaeYK6+80m3YsCH9eckll7SSt1FJ8aj70LRKseyraaz9DBs5 PyK3937pol4uPv9o97rXZl8p+cEPftB94AMfcBdeeKF7+cv+xH183VL36WvX99ZdfeDLo5zj YaS4C2MoIYSQwfSkOOSPd8igXIX86tL//F//63+5W265xT322GPptulBIgzqv5KI5FXXnue+ +e17BrJq9QFu+x0WmdvFjMisFtyqiPxameaZYhEekd4LLrggnZUTATn//PPTnHvuub2f5513 Xvrz7LPP7uWMM85Ic9JJJ6XrffzjH28lUKOQYumfoxaPGOWW9pI3F1XtJstuuOGGVm1rRfZz 8cUXu8985jO1ufXWW93ll18e7dg6cn5Eij+z+dQ0l3xitXv1Tn/u/uM//sM9+eSTqUTed999 7p577nEHHXSQ+5MX/Q939BEfSNe77YZT3RH7vDjKOR5GiqsYxxhKCCHEThQp9gP4L3/5i97P X/ziF+6SSz7lvvvd76brPPLII27t2rVDD+q/+Zu/6R7fttVt/colvXzpy59Kc/nVp7gXvvC5 5nYxIzIrYiuzv21mi9//wd0XhBR/4hOfcKecckoqvpJzzjknjX8s4iCP5ac89kIsj2U7kWb5 2UaeYsiljvTLJ7ddP3LpiFFuaS+RpWOOOcZcLlm/fn10KRbhvemmm4IT69g6cn70TLHMEEt7 Sl+UiLjLby9kUFu5cqXbaaed0nVkNlnWP+Ij20c5x23PoxzbYpxjKCGEEDs9Kd6w4dR04LVW 8ikO6HoglwH8P/7j572fP//5vycidE66nfDjH//Ybd26NZ0tbDuoP/s5f+A2bjo+leI7Pn++ u+3O89wdX/iE++yWC9ydX7owzd++Yxf33/+//2ZuHyteikWE9exvXUSEJbu98ZVRpbiqPUdx ARXZkVsjZKZYboMQOWga2U6k+OSTT24lTzGlWNroyW9/2v3wa4en/9ex1h8mMaVY/hSl1XZ+ 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 gg== --------------8Mh0xe004XZIEm0ikrrcylOz-- From debbugs-submit-bounces@debbugs.gnu.org Thu Oct 10 09:09:03 2024 Received: (at 73730) by debbugs.gnu.org; 10 Oct 2024 13:09:03 +0000 Received: from localhost ([127.0.0.1]:59011 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1sysuc-0000Y1-8R for submit@debbugs.gnu.org; Thu, 10 Oct 2024 09:09:03 -0400 Received: from eggs.gnu.org ([209.51.188.92]:43290) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1sysuZ-0000XW-4d for 73730@debbugs.gnu.org; Thu, 10 Oct 2024 09:09:00 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1sysuH-0007Qy-SL; Thu, 10 Oct 2024 09:08:41 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=/tzh8UwW1yb1oy9AryFFO8qXqx5lSOJ0b0sRwkwXPk0=; b=jiWRJsaGcD4h lWWMA2PU50OymmZ0Yu4KAAkWZiMrh4YiIMC6urCiv5wbvhm++4uDMw0n8VkKLx5SI7HnM2LIV/N/K nIK2FeBMRCwPnrmWf6YXvNh2rtI64D9VlmujBaeri+peXnc/DTEqN4qdcuhyb5O+9IdC/by3Mg37o 3Gmv7l2SMrrpSFVjRgyZXwFa9F/qnbqjL7fSDtgGSX0NAX823Oxum04xGj2SQi0SVU4aFq5sGS/9R 7kyAmK36bwXfuJnlZNgypsvCI4ua1zK9fPcIEdKEExK57fYwj6WuHiTsIcAZkWVRbdJGaXIRoFgsd sx7cYOFa/fT5JP9l831PAA==; Date: Thu, 10 Oct 2024 16:08:38 +0300 Message-Id: <86o73s14x5.fsf@gnu.org> From: Eli Zaretskii To: Cecilio Pardo In-Reply-To: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> (message from Cecilio Pardo on Thu, 10 Oct 2024 13:16:23 +0200) Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> X-Spam-Score: -0.3 (/) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.3 (-) > Date: Thu, 10 Oct 2024 13:16:23 +0200 > From: Cecilio Pardo > > The attached patch is a preliminar implementation of a DirectWrite font > driver that allows for color fonts, tested only on Windows 11. Thanks! > There is much to be refined about quality, performance (caching), OS > version conditionals, etc. > > Before doing all that, I need to know that this is the right (or at > least good enough) way to do it. > > The DirectWrite font driver mounts on top of a copy of the harfbuzz one, > and then replaces some of the functions, but some of the hb functions > include eassert to check that the driver for a font is harfbuzz. I don't > know how to deal with that. If we use a (slightly modified) HarfBuzz font driver (see below), this won't be a problem, right? > I suppose that if we skip harfbuzz completely, then we would have to > reimplement a lot of stuff with DirectWrite? Yes, I don't want to skip HarfBuzz, since we want HarfBuzz to be our primary text-shaping engine. We don't want to rely on Windows-specific shapers because MS has a habit of deprecating them at will (which happened with Uniscribe). The experts on text shaping are hard to get on board, so we don't want to have to rewrite our display routines when MS decide to come up with a shining new shaper. > Also uniscribe_open has been modified to change the driver assigned to > the font unconditionally to dwrite. That's temporary, I presume? Some comments about significant issues below. > @@ -3202,7 +3202,7 @@ AC_DEFUN > W32_OBJ="$W32_OBJ w32image.o" > fi > W32_LIBS="$W32_LIBS -lwinmm -lgdi32 -lcomdlg32" > - W32_LIBS="$W32_LIBS -lmpr -lwinspool -lole32 -lcomctl32" > + W32_LIBS="$W32_LIBS -lmpr -lwinspool -lole32 -lcomctl32 -ldwrite" This we cannot do, for two reasons: (1) mingw.org's MinGW doesn't have the libdwrite.dll.a import library, and (2) linking against -ldwrite will make Emacs refuse to start on systems without DWrite.dll. Instead, we need to use LoadLibrary at startup time to load the DLL, like we do with HarfBuzz, and if the load succeeds, use get_proc_addr to assign the addresses of APIs we need to use to function pointers; then we call the functions through those pointers. See w32image.c for how we do that with GdiPlus.dll and w32uniscribe.c for how we do that with libharfbuzz-0.dll. > --- a/src/font.h > +++ b/src/font.h > @@ -978,6 +978,7 @@ valid_font_driver (struct font_driver const *d) > extern struct font_driver uniscribe_font_driver; > #ifdef HAVE_HARFBUZZ > extern struct font_driver harfbuzz_font_driver; > +extern struct font_driver dwrite_font_driver; Do we really need a whole new font driver? I hoped that we'd only need to replace the functions we call to actually draw the font glyphs in w32font_draw (ExtTextOutW etc.) with the appropriate replacements from Direct2D. You see, HarfBuzz already does the job of finding the appropriate font glyphs when we need some non-trivial font processing (like character compositions), so I thought all we needed was to be able to actually draw the font glyphs of color fonts. IOW, how about just modifying the few methods of the HarfBuzz font driver when DirectWrite is available, and otherwise leaving the HarfBuzz font driver be the one which supports this? With Uniscribe we had legacy support issues (Windows 9X etc.), but there's no such problem with HarfBuzz vs DirectWrite, so adding yet another font driver which needs to coexist with the others is a complexity I'd like to avoid. In my mental model, we just use DirectWrite for low-level drawing of font glyphs, and otherwise we still keep the HarfBuzz font driver. Does that make sense? > +/* Initialized on syms_of_w32dwrite_for_pdumper */ > +IDWriteFactory *dwrite_factory = NULL; > +IDWriteFactory2 *dwrite_factory2 = NULL; > +IDWriteGdiInterop *gdi_interop = NULL; > +IDWriteRenderingParams *rendering_params = NULL; These should probably be static, if they are only used in this one file. > +static void > +verify_hr (HRESULT hr, const char *msg) > +{ > + if (FAILED (hr)) > + { > + printf ("Error: %s\n", msg); > + abort (); > + } > +} This will need to be replaced with something more suitable. > +static Lisp_Object > +dwrite_list (struct frame *f, Lisp_Object font_spec) > +{ > + Lisp_Object fonts = w32font_list_internal (f, font_spec, true); > + for (Lisp_Object tail = fonts; CONSP (tail); tail = XCDR (tail)) > + ASET (XCAR (tail), FONT_TYPE_INDEX, Qdwrite); > + > + FONT_ADD_LOG ("dwrite-list", font_spec, fonts); > + return fonts; > +} > + > +static Lisp_Object > +dwrite_match (struct frame *f, Lisp_Object font_spec) > +{ > + Lisp_Object entity = w32font_match_internal (f, font_spec, true); > + FONT_ADD_LOG ("dwrite-match", font_spec, entity); > + > + if (! NILP (entity)) > + ASET (entity, FONT_TYPE_INDEX, Qdwrite); > + return entity; > +} If we avoid defining a new font driver, the above two methods are not needed, as they do the same as the HarfBuzz driver does. > +static int > +dwrite_draw (struct glyph_string *s, int from, int to, > + int x, int y, bool with_background) > +{ > + HRGN orig_clip = NULL; > + int len = to - from; > + > + if (s->num_clips > 0) > + { > + HRGN new_clip = CreateRectRgnIndirect (s->clip); > + > + /* Save clip region for later restoration. */ > + orig_clip = CreateRectRgn (0, 0, 0, 0); > + if (!GetClipRgn (s->hdc, orig_clip)) > + { > + DeleteObject (orig_clip); > + orig_clip = NULL; > + } > + > + if (s->num_clips > 1) > + { > + HRGN clip2 = CreateRectRgnIndirect (s->clip + 1); > + > + CombineRgn (new_clip, new_clip, clip2, RGN_OR); > + DeleteObject (clip2); > + } > + > + SelectClipRgn (s->hdc, new_clip); > + DeleteObject (new_clip); > + } > + > + /* Using OPAQUE background mode can clear more background than expected > + when Cleartype is used. Draw the background manually to avoid this. */ > + SetBkMode (s->hdc, TRANSPARENT); > + if (with_background) > + { > + HBRUSH brush; > + RECT rect; > + struct font *font = s->font; > + int ascent = font->ascent, descent = font->descent; > + > + /* Font's global ascent and descent values might be > + preposterously large for some fonts. We fix here the case > + when those fonts are used for display of glyphless > + characters, because drawing background with font dimensions > + in those cases makes the display illegible. There's only one > + more call to the draw method with with_background set to > + true, and that's in w32_draw_glyph_string_foreground, when > + drawing the cursor, where we have no such heuristics > + available. FIXME. */ > + if (s->first_glyph->type == GLYPHLESS_GLYPH > + && (s->first_glyph->u.glyphless.method == GLYPHLESS_DISPLAY_HEX_CODE > + || s->first_glyph->u.glyphless.method == GLYPHLESS_DISPLAY_ACRONYM)) > + { > + ascent = > + s->first_glyph->slice.glyphless.lower_yoff > + - s->first_glyph->slice.glyphless.upper_yoff; > + descent = 0; > + } > + brush = CreateSolidBrush (s->gc->background); > + rect.left = x; > + rect.top = y - ascent; > + rect.right = x + s->width; > + rect.bottom = y + descent; > + FillRect (s->hdc, &rect, brush); > + DeleteObject (brush); > + } > + > + if (s->padding_p) > + { > + int i; > + for (i = 0; i < len; i++) > + dwrite_draw_internal (s->hdc, x, y - s->font->ascent, > + s->char2b + from, 1, s->font->ascent, > + GetTextColor(s->hdc), s->font); > + } > + else > + { > + dwrite_draw_internal( s->hdc, x, y - s->font->ascent, > + s->char2b + from, len, s->font->ascent, > + GetTextColor(s->hdc), s->font ); > + > + } > + > + /* Restore clip region. */ > + if (s->num_clips > 0) > + SelectClipRgn (s->hdc, orig_clip); > + > + if (orig_clip) > + DeleteObject (orig_clip); > + > + return len; > +} This method looks almost identical to w32font_draw, except that it calls DirectWrite specific functions instead of ExtTextOutW. It would be better to reuse the code in w32font.c instead of copying it; a single test for DirectWrite's availability should not be an issue, I think (if you are worried about performance). > + hr = dwrite_factory->lpVtbl-> > + CreateCustomRenderingParams (dwrite_factory, > + def->lpVtbl->GetGamma(def), > + def->lpVtbl->GetEnhancedContrast(def), > + def->lpVtbl->GetClearTypeLevel(def), > + def->lpVtbl->GetPixelGeometry(def), > + DWRITE_RENDERING_MODE_GDI_CLASSIC, > + &rendering_params); Are there some options for the rendering here that we perhaps need to discuss? E.g., is DWRITE_RENDERING_MODE_GDI_CLASSIC the only reasonable choice? Thanks again for working on this. From debbugs-submit-bounces@debbugs.gnu.org Thu Oct 10 11:14:58 2024 Received: (at 73730) by debbugs.gnu.org; 10 Oct 2024 15:14:58 +0000 Received: from localhost ([127.0.0.1]:60218 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1syusT-0007dT-Ls for submit@debbugs.gnu.org; Thu, 10 Oct 2024 11:14:57 -0400 Received: from mail.imayhem.com ([82.223.54.191]:60099 helo=zealous-pike.82-223-54-191.plesk.page) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1syusQ-0007dD-DO for 73730@debbugs.gnu.org; Thu, 10 Oct 2024 11:14:56 -0400 Received: from [192.168.68.105] (111.red-88-21-7.staticip.rima-tde.net [88.21.7.111]) by zealous-pike.82-223-54-191.plesk.page (Postfix) with ESMTPSA id 6738B80166; Thu, 10 Oct 2024 15:14:35 +0000 (UTC) Authentication-Results: zealous-pike.82-223-54-191.plesk.page; spf=pass (sender IP is 88.21.7.111) smtp.mailfrom=cpardo@imayhem.com smtp.helo=[192.168.68.105] Received-SPF: pass (zealous-pike.82-223-54-191.plesk.page: connection is authenticated) Message-ID: Date: Thu, 10 Oct 2024 17:14:34 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows To: Eli Zaretskii References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> Content-Language: es-ES From: Cecilio Pardo In-Reply-To: <86o73s14x5.fsf@gnu.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) On 10/10/2024 15:08, Eli Zaretskii wrote: > IOW, how about just modifying the few methods of the HarfBuzz font > driver when DirectWrite is available, and otherwise leaving the > HarfBuzz font driver be the one which supports this? With Uniscribe > we had legacy support issues (Windows 9X etc.), but there's no such > problem with HarfBuzz vs DirectWrite, so adding yet another font > driver which needs to coexist with the others is a complexity I'd like > to avoid. In my mental model, we just use DirectWrite for low-level > drawing of font glyphs, and otherwise we still keep the HarfBuzz font > driver. Does that make sense? Yes. I'll rewrite it like that. >> + hr = dwrite_factory->lpVtbl-> >> + CreateCustomRenderingParams (dwrite_factory, >> + def->lpVtbl->GetGamma(def), >> + def->lpVtbl->GetEnhancedContrast(def), >> + def->lpVtbl->GetClearTypeLevel(def), >> + def->lpVtbl->GetPixelGeometry(def), >> + DWRITE_RENDERING_MODE_GDI_CLASSIC, >> + &rendering_params); > > Are there some options for the rendering here that we perhaps need to > discuss? E.g., is DWRITE_RENDERING_MODE_GDI_CLASSIC the only > reasonable choice? This gives poor quality, we will definitely use something else. But in my tests other methods gave fractional widths for glyphs, so I took this one for the first version. From debbugs-submit-bounces@debbugs.gnu.org Thu Oct 10 12:34:09 2024 Received: (at 73730) by debbugs.gnu.org; 10 Oct 2024 16:34:09 +0000 Received: from localhost ([127.0.0.1]:60321 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1syw77-0003Oc-0X for submit@debbugs.gnu.org; Thu, 10 Oct 2024 12:34:09 -0400 Received: from eggs.gnu.org ([209.51.188.92]:35484) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1syw74-0003O9-Qg for 73730@debbugs.gnu.org; Thu, 10 Oct 2024 12:34:07 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1syw6n-00064h-Nk; Thu, 10 Oct 2024 12:33:49 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=WyOzVDfHClaBGQdiHHf2rR1q8UTPI7YCDn632/mgoS4=; b=dELq7pq+YuLM Ij6PEUKD1jXSpoh73rN9a83wzsoaLgLhK2MeXtCkIFU+QFSqwaKiSVCMzdC2qNg7g7Z/ITQbm7J9Z z7DYc9yLiCSo6w/aQI6kMIJXQmu+QfC6GVOTv+fUvG+XdzPijSrEweYpANF2kRdixyPY8CWycF5ke lHTIY8Hn4pedN0BwTICn/v1tzSTaJUxkCSjmQhQami2g5EcnNcMHzWXezlK/SNqa8paH8rLxR1HUg 238HLokmGNlzEceKS8wZ5b4eh7bjYe/Zb+WH+AfjSGBTxEAQJPHFaWcWBmEwjBSFf0SHiUVOkTL16 zz1c6gCizRNQ7aVhfJepxg==; Date: Thu, 10 Oct 2024 19:33:44 +0300 Message-Id: <86ed4n29zr.fsf@gnu.org> From: Eli Zaretskii To: Cecilio Pardo In-Reply-To: (message from Cecilio Pardo on Thu, 10 Oct 2024 17:14:34 +0200) Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > Date: Thu, 10 Oct 2024 17:14:34 +0200 > Cc: 73730@debbugs.gnu.org > From: Cecilio Pardo > > On 10/10/2024 15:08, Eli Zaretskii wrote: > > > IOW, how about just modifying the few methods of the HarfBuzz font > > driver when DirectWrite is available, and otherwise leaving the > > HarfBuzz font driver be the one which supports this? With Uniscribe > > we had legacy support issues (Windows 9X etc.), but there's no such > > problem with HarfBuzz vs DirectWrite, so adding yet another font > > driver which needs to coexist with the others is a complexity I'd like > > to avoid. In my mental model, we just use DirectWrite for low-level > > drawing of font glyphs, and otherwise we still keep the HarfBuzz font > > driver. Does that make sense? > > Yes. I'll rewrite it like that. Thanks, SGTM. > >> + hr = dwrite_factory->lpVtbl-> > >> + CreateCustomRenderingParams (dwrite_factory, > >> + def->lpVtbl->GetGamma(def), > >> + def->lpVtbl->GetEnhancedContrast(def), > >> + def->lpVtbl->GetClearTypeLevel(def), > >> + def->lpVtbl->GetPixelGeometry(def), > >> + DWRITE_RENDERING_MODE_GDI_CLASSIC, > >> + &rendering_params); > > > > Are there some options for the rendering here that we perhaps need to > > discuss? E.g., is DWRITE_RENDERING_MODE_GDI_CLASSIC the only > > reasonable choice? > > This gives poor quality, we will definitely use something else. But in > my tests other methods gave fractional widths for glyphs, so I took this > one for the first version. I'd guess DWRITE_RENDERING_MODE_DEFAULT should be the first choice? And if it gets you corrupted glyphs on display, this is something that needs debugging, I think. Maybe the code which processes the glyphs, which you basically copied from w32font.c, needs some adjustment for DirectWrite or something? From debbugs-submit-bounces@debbugs.gnu.org Thu Oct 10 12:46:48 2024 Received: (at 73730) by debbugs.gnu.org; 10 Oct 2024 16:46:48 +0000 Received: from localhost ([127.0.0.1]:60380 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1sywJL-000499-Q8 for submit@debbugs.gnu.org; Thu, 10 Oct 2024 12:46:48 -0400 Received: from mail.imayhem.com ([82.223.54.191]:52457 helo=zealous-pike.82-223-54-191.plesk.page) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1sywJJ-00048s-Sf for 73730@debbugs.gnu.org; Thu, 10 Oct 2024 12:46:46 -0400 Received: from [192.168.68.105] (111.red-88-21-7.staticip.rima-tde.net [88.21.7.111]) by zealous-pike.82-223-54-191.plesk.page (Postfix) with ESMTPSA id 7BBDB80166; Thu, 10 Oct 2024 16:46:25 +0000 (UTC) Authentication-Results: zealous-pike.82-223-54-191.plesk.page; spf=pass (sender IP is 88.21.7.111) smtp.mailfrom=cpardo@imayhem.com smtp.helo=[192.168.68.105] Received-SPF: pass (zealous-pike.82-223-54-191.plesk.page: connection is authenticated) Message-ID: Date: Thu, 10 Oct 2024 18:46:24 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows To: Eli Zaretskii References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <86ed4n29zr.fsf@gnu.org> Content-Language: es-ES From: Cecilio Pardo In-Reply-To: <86ed4n29zr.fsf@gnu.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) > I'd guess DWRITE_RENDERING_MODE_DEFAULT should be the first choice? > And if it gets you corrupted glyphs on display, this is something that > needs debugging, I think. Maybe the code which processes the glyphs, > which you basically copied from w32font.c, needs some adjustment for > DirectWrite or something? It draws well, but when measuring character sizes it gives fractional values, not integers. Anyway, I will investigate it throroughly. From debbugs-submit-bounces@debbugs.gnu.org Thu Oct 10 17:50:22 2024 Received: (at submit) by debbugs.gnu.org; 10 Oct 2024 21:50:22 +0000 Received: from localhost ([127.0.0.1]:60757 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1sz138-0003E4-9r for submit@debbugs.gnu.org; Thu, 10 Oct 2024 17:50:22 -0400 Received: from lists.gnu.org ([209.51.188.17]:42840) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1sz135-0003Aj-OX for submit@debbugs.gnu.org; Thu, 10 Oct 2024 17:50:21 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1sz12r-000781-RG for bug-gnu-emacs@gnu.org; Thu, 10 Oct 2024 17:50:06 -0400 Received: from mail.imayhem.com ([82.223.54.191] helo=zealous-pike.82-223-54-191.plesk.page) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1sz12p-0004P9-Kn for bug-gnu-emacs@gnu.org; Thu, 10 Oct 2024 17:50:05 -0400 Received: from [192.168.68.105] (111.red-88-21-7.staticip.rima-tde.net [88.21.7.111]) by zealous-pike.82-223-54-191.plesk.page (Postfix) with ESMTPSA id 0322680166 for ; Thu, 10 Oct 2024 21:50:00 +0000 (UTC) Authentication-Results: zealous-pike.82-223-54-191.plesk.page; spf=pass (sender IP is 88.21.7.111) smtp.mailfrom=cpardo@imayhem.com smtp.helo=[192.168.68.105] Received-SPF: pass (zealous-pike.82-223-54-191.plesk.page: connection is authenticated) Message-ID: <4564ae61-9f78-4a59-92fa-b1f60bf0516b@imayhem.com> Date: Thu, 10 Oct 2024 23:50:00 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows To: bug-gnu-emacs@gnu.org References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> Content-Language: es-ES From: Cecilio Pardo In-Reply-To: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Received-SPF: pass client-ip=82.223.54.191; envelope-from=cpardo@imayhem.com; helo=zealous-pike.82-223-54-191.plesk.page X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Score: -1.3 (-) X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.3 (--) It looks like DirectWrite can't handle .FON files. When I build emacs, the fixed-pitch face, which uses the Monospace family, gets the "Courier" font which we can't use. I'd say that this wasn't failing before today's windows update, but who knows... Any pointers? From debbugs-submit-bounces@debbugs.gnu.org Thu Oct 10 23:39:37 2024 Received: (at 73730) by debbugs.gnu.org; 11 Oct 2024 03:39:37 +0000 Received: from localhost ([127.0.0.1]:32916 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1sz6V7-0004Rz-8y for submit@debbugs.gnu.org; Thu, 10 Oct 2024 23:39:37 -0400 Received: from eggs.gnu.org ([209.51.188.92]:48318) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1sz6V5-0004Rj-2C for 73730@debbugs.gnu.org; Thu, 10 Oct 2024 23:39:35 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1sz6Sf-0004am-Vo; Thu, 10 Oct 2024 23:37:05 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=0X2LUhpJ2S10KpKs6bADu8tqdycVZmP2XasyzE30c5o=; b=fTBV6ygyx94I S3tR0vfwebwHGFxUO80JC/GBeEzgoNvSYKSBwqLM0HIGtsa7+iR/wwMuyHK8huxNRmjEIkTjl+2fX nw5usjsys+lmpIaUAsp2Gk7Hzvlo9KH3pcrAhDradU+bG+5zaNWLSWnS38sYcHt+UrKAQELKH+Ur7 MhlEKLFojTFHYLnJMSOqMikQxcRuxavuCHQx2IyVXAICNBm5sbsplHuKnw5aygc3suXKsN1Y0bme/ Ls2+3C3UtNDhyfo3LwxlVGj+zzRQVvpTIy82/J+t0xMSvL1yNCd+O/BGsAnvbr0JDkGNeeXB9s2Ng 3ffQTkwwIOCVWotgiPVLMw==; Date: Fri, 11 Oct 2024 06:36:55 +0300 Message-Id: <865xpz1fag.fsf@gnu.org> From: Eli Zaretskii To: Cecilio Pardo In-Reply-To: <4564ae61-9f78-4a59-92fa-b1f60bf0516b@imayhem.com> (message from Cecilio Pardo on Thu, 10 Oct 2024 23:50:00 +0200) Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <4564ae61-9f78-4a59-92fa-b1f60bf0516b@imayhem.com> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > Date: Thu, 10 Oct 2024 23:50:00 +0200 > From: Cecilio Pardo > > It looks like DirectWrite can't handle .FON files. When I build emacs, > the fixed-pitch face, which uses the Monospace family, gets the > "Courier" font which we can't use. > > I'd say that this wasn't failing before today's windows update, but who > knows... > > Any pointers? What happens if you revert commit 7eba90c12227 ? If this fixes the problem, please look at the rationale described in the commit log message and see if you get back the problem described there, and in particular what happens with the faces requested by info.el. It is possible that the problem described there only happens on XP, where there's no DirectWrite, in which case we could condition Qascii_0 so that it doesn't get in the way. But it is somewhat bothersome that .fon fonts are not supported. Are you sure this is true? What does Internet search bring? There are example programs on MSDN which use DirectWrite, can you try them with Courier and see if they also fail? From debbugs-submit-bounces@debbugs.gnu.org Fri Oct 11 02:28:36 2024 Received: (at 73730) by debbugs.gnu.org; 11 Oct 2024 06:28:36 +0000 Received: from localhost ([127.0.0.1]:33195 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1sz98d-0005D9-IX for submit@debbugs.gnu.org; Fri, 11 Oct 2024 02:28:36 -0400 Received: from eggs.gnu.org ([209.51.188.92]:53740) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1sz98Y-0005Cu-VG for 73730@debbugs.gnu.org; Fri, 11 Oct 2024 02:28:34 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1sz98G-0007gk-KZ; Fri, 11 Oct 2024 02:28:12 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=MuiJ3x+S+YiAqqWNhv+m+BMG5DQA8Sn8OhbGNjXim/k=; b=QcII1Zm4lr6B nW40uhZ06NtT0O0DH3oMhP2zTT2gKXuzAiDg7gdoQkbmN71YG1fmLliUgsmQu7ZiR69Cs7nXclu1s QrhUYMhqG2IxzeSgUtqcYadtcBlkC7Xq7Oh/BL2FeVXCL6RUx9MLJGHemL7HJMGxmMCig2tUcM10e gaZAzEKohHK1jUBEROWdJuycNq1C9DANYOOAXDyYy+51/BP+hOr8q5V8TM/4jwMVtXWo7Se/bO78f MBMafB8FExsIjdxJuw+F3/Rejumj0yMqFMGB/5FX6YphY6oc1YkDyWl8ib/KEdYb7LpsJCKChrz2F K67tHyrCMH91TgjXvkRS/w==; Date: Fri, 11 Oct 2024 09:28:08 +0300 Message-Id: <86set3ywzr.fsf@gnu.org> From: Eli Zaretskii To: cpardo@imayhem.com In-Reply-To: <865xpz1fag.fsf@gnu.org> (message from Eli Zaretskii on Fri, 11 Oct 2024 06:36:55 +0300) Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <4564ae61-9f78-4a59-92fa-b1f60bf0516b@imayhem.com> <865xpz1fag.fsf@gnu.org> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > Cc: 73730@debbugs.gnu.org > Date: Fri, 11 Oct 2024 06:36:55 +0300 > From: Eli Zaretskii > > > Date: Thu, 10 Oct 2024 23:50:00 +0200 > > From: Cecilio Pardo > > > > It looks like DirectWrite can't handle .FON files. When I build emacs, > > the fixed-pitch face, which uses the Monospace family, gets the > > "Courier" font which we can't use. > > > > I'd say that this wasn't failing before today's windows update, but who > > knows... > > > > Any pointers? > > What happens if you revert commit 7eba90c12227 ? > > If this fixes the problem, please look at the rationale described in > the commit log message and see if you get back the problem described > there, and in particular what happens with the faces requested by > info.el. It is possible that the problem described there only happens > on XP, where there's no DirectWrite, in which case we could condition > Qascii_0 so that it doesn't get in the way. > > But it is somewhat bothersome that .fon fonts are not supported. Are > you sure this is true? What does Internet search bring? There are > example programs on MSDN which use DirectWrite, can you try them with > Courier and see if they also fail? After some more thinking: I think something is amiss in your code, because AFAICT the existing code draws .fon fonts using the 'gdi' font driver. Here's how to see that: emacs -Q M-x font-lock-mode M-x load-library RET facemenu RET Now mark some text in *scratch* and type: M-x facemenu-set-face RET fixed-pitch RET Then go to some character displayed with fixed-pitch face and type "C-u C-x =". When I do that in the current Emacs, I see: position: 78 of 147 (52%), column: 6 character: c (displayed as c) (codepoint 99, #o143, #x63) charset: ascii (ASCII (ISO646 IRV)) code point in charset: 0x63 script: latin syntax: w which means: word category: .:Base, L:Strong L2R, a:ASCII, l:Latin, r:Roman to input: type "C-x 8 RET 63" or "C-x 8 RET LATIN SMALL LETTER C" buffer code: #x63 file code: #x63 (encoded by coding system iso-latin-1-dos) display: by this font (glyph code): gdi:-raster-Courier-regular-normal-normal-mono-13-*-*-*-c-*-iso8859-1 (#x63) Note the last line: we already detect that this font should use the 'gdi' font backend. So either your new code somehow bypassed this detection, or the fallback on old glyph-drawing APIs which are used on the current master branch by the 'gdi' font driver is missing something. AFAIR (and my memory is not reliable in this matter, so please check with the code), we decide that this font needs to be drawn by the 'gdi' font driver when we look for fonts for the "Monospace" family: I think the 'harfbuzz' font backend rejects it for some reason (I don't remember which), whereas 'gdi' accepts it. Bottom line: we should use the 'gdi' font backend for these fonts, like we do with the current code. The 'harfbuzz' font driver, with or without the new DirectWrite methods, should not be used for them, presumably for reasons similar to those which determined how the current code works. If the above doesn't help, please tell more details about how DirectWrite "cannot handle .FON fonts", and let's take it from there. From debbugs-submit-bounces@debbugs.gnu.org Fri Oct 11 03:20:21 2024 Received: (at 73730) by debbugs.gnu.org; 11 Oct 2024 07:20:21 +0000 Received: from localhost ([127.0.0.1]:33273 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1sz9wj-00086H-53 for submit@debbugs.gnu.org; Fri, 11 Oct 2024 03:20:21 -0400 Received: from mail.imayhem.com ([82.223.54.191]:50067 helo=zealous-pike.82-223-54-191.plesk.page) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1sz9wg-0007za-N4 for 73730@debbugs.gnu.org; Fri, 11 Oct 2024 03:20:19 -0400 Received: from [10.0.12.77] (66.red-2-136-43.staticip.rima-tde.net [2.136.43.66]) by zealous-pike.82-223-54-191.plesk.page (Postfix) with ESMTPSA id F0A9D800F0; Fri, 11 Oct 2024 07:19:59 +0000 (UTC) Authentication-Results: zealous-pike.82-223-54-191.plesk.page; spf=pass (sender IP is 2.136.43.66) smtp.mailfrom=cpardo@imayhem.com smtp.helo=[10.0.12.77] Received-SPF: pass (zealous-pike.82-223-54-191.plesk.page: connection is authenticated) Message-ID: Date: Fri, 11 Oct 2024 09:19:58 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows To: Eli Zaretskii References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <4564ae61-9f78-4a59-92fa-b1f60bf0516b@imayhem.com> <865xpz1fag.fsf@gnu.org> <86set3ywzr.fsf@gnu.org> Content-Language: es-ES From: Cecilio Pardo In-Reply-To: <86set3ywzr.fsf@gnu.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) On 11/10/2024 8:28, Eli Zaretskii wrote: > Bottom line: we should use the 'gdi' font backend for these fonts, > like we do with the current code. The 'harfbuzz' font driver, with or > without the new DirectWrite methods, should not be used for them, > presumably for reasons similar to those which determined how the > current code works. Ok. Thanks a lot. From debbugs-submit-bounces@debbugs.gnu.org Sat Oct 12 09:34:15 2024 Received: (at control) by debbugs.gnu.org; 12 Oct 2024 13:34:15 +0000 Received: from localhost ([127.0.0.1]:43830 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1szcG6-0007Ut-Uj for submit@debbugs.gnu.org; Sat, 12 Oct 2024 09:34:15 -0400 Received: from mail-ed1-f47.google.com ([209.85.208.47]:59471) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1szcG5-0007Ui-Cn for control@debbugs.gnu.org; Sat, 12 Oct 2024 09:34:13 -0400 Received: by mail-ed1-f47.google.com with SMTP id 4fb4d7f45d1cf-5c96b2a10e1so207769a12.2 for ; Sat, 12 Oct 2024 06:33:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1728739978; x=1729344778; darn=debbugs.gnu.org; h=to:subject:message-id:date:mime-version:from:from:to:cc:subject :date:message-id:reply-to; bh=ubCXyWZX1AnmboILv4dZbevuYEadnZy2kMWd8qwLFgg=; b=as4BYIbnQ20OM1JGXk4NVdBQqIpgrUAmWkGq/wPVIeycxNo7FAr3KC0zE3MyCJIXAU Cs2wqowQoD1DcnStpwtVUCDpIjLHjx/IYv4aMYqYY25F5GBxzydqPg1n+XpxSj0c/rgs hDMfUVsvZaIvqMPrnFB9EEhvnGnYEfH7+r9Ut6IXqwDhvbg27F+nyhHSERMSKnxYyAp7 acIOrbS+PLU4CA4tfH4Ikzj9N1vw/QsOeF8lA8AYSz615vzXUf1BpmU6bAJV6yNkNqsC 8e1GVffKveU+sikTeeWrGDoa4Yai4I1db4s6df5L0hLYA0Ati6sMyI5fJo7j8qQOhroK BLzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1728739978; x=1729344778; h=to:subject:message-id:date:mime-version:from:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=ubCXyWZX1AnmboILv4dZbevuYEadnZy2kMWd8qwLFgg=; b=tWqBxZsKmFvY17CY0cBK2AkVJpHyiUuv+kwHQ/lSK0Ywlizrx9rAfIpi2snt+IkeZN 7YS/E2AObUtZWgSapvpqE5amv9GO2VqoIO2bbl8zpOtoEidNix74ms66YuFbhCVDgXf7 5sXY/ay8rfpLkmbUoYdr8ASGMOotjcDrhNckDViNbDq1t1ukYlG2cGbw2Hk2bBeNFaVA gZodCZv/9DxGDbu1MKiDygzGCfzoOtCr6qhK9a0icIh86M9IQ6Fkp1y30zds6zU/EHQW Q7AW1dtNJX4SxScS8iFy8sL15R34PzWrWCB4mt+dPnGqQxpiJX12/hmdhWV0WG6JPuTb HhNg== X-Gm-Message-State: AOJu0Yzak1P/TeC+KgiQ9bTZADohzEytr7ngkGq9XCkUYlZt3094d9+0 sCeZGcRtroozxlGg7GkzJRptGM30dmSFsVohVQW4kfrLEPBdlib2vWraWIUcwNIoOXMZkHDdXuL toajXApVjisZx5XaBVzRH/izJfUbzAA== X-Google-Smtp-Source: AGHT+IEeXcyUa5f3r5nSVWbDFOsFuLWOJ059HFk+ydnUQqI5TEPNEqmv22wQarwsRaRdIwNyJ9/SifEIKUGm/dCiOTc= X-Received: by 2002:a05:6402:270c:b0:5c9:6ab1:bde0 with SMTP id 4fb4d7f45d1cf-5c96ab1c6f4mr544669a12.14.1728739978419; Sat, 12 Oct 2024 06:32:58 -0700 (PDT) Received: from 753933720722 named unknown by gmailapi.google.com with HTTPREST; Sat, 12 Oct 2024 08:32:58 -0500 From: Stefan Kangas MIME-Version: 1.0 Date: Sat, 12 Oct 2024 08:32:58 -0500 Message-ID: Subject: control message for bug #73730 To: control@debbugs.gnu.org Content-Type: text/plain; charset="UTF-8" X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: control X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) severity 73730 wishlist quit From debbugs-submit-bounces@debbugs.gnu.org Tue Oct 15 18:18:51 2024 Received: (at 73730) by debbugs.gnu.org; 15 Oct 2024 22:18:51 +0000 Received: from localhost ([127.0.0.1]:57753 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t0psP-0007Gm-AS for submit@debbugs.gnu.org; Tue, 15 Oct 2024 18:18:51 -0400 Received: from mail.imayhem.com ([82.223.54.191]:46375 helo=zealous-pike.82-223-54-191.plesk.page) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t0psL-0007GH-G2 for 73730@debbugs.gnu.org; Tue, 15 Oct 2024 18:18:47 -0400 Received: from [192.168.68.105] (111.red-88-21-7.staticip.rima-tde.net [88.21.7.111]) by zealous-pike.82-223-54-191.plesk.page (Postfix) with ESMTPSA id C94EB801FC; Tue, 15 Oct 2024 22:18:20 +0000 (UTC) Authentication-Results: zealous-pike.82-223-54-191.plesk.page; spf=pass (sender IP is 88.21.7.111) smtp.mailfrom=cpardo@imayhem.com smtp.helo=[192.168.68.105] Received-SPF: pass (zealous-pike.82-223-54-191.plesk.page: connection is authenticated) Content-Type: multipart/mixed; boundary="------------9JltLzaS03WOBeF5GImMdZjU" Message-ID: <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> Date: Wed, 16 Oct 2024 00:18:20 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows To: Eli Zaretskii References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> Content-Language: es-ES From: Cecilio Pardo In-Reply-To: <86o73s14x5.fsf@gnu.org> X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) This is a multi-part message in MIME format. --------------9JltLzaS03WOBeF5GImMdZjU Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit The attached patch works without a new font driver. This requires the harfbuzz font backend to be available. It works by modifying the harfbuzz backend to use DirectWrite at some points, if it is available: - When encoding characters: w32hb_encode_char - When measuring text: w32font_text_extents - When drawing text: w32font_draw DirectWrite is setup by calling w32_initialize_direct_write. From that point, the function w32_use_direct_write will return true if DirectWrite is to be used. The lisp variable w32-inhibit-direct-write can switches it on and off. It builds with Mingw64 and Mingw. As mingw doesn't have the DirectWrite includes, I had to declare a lot of things at the start of the file. This line marks the end of that: /* End of dwrite_3.h definitions. */ I have tested this only on Windows 11. --------------9JltLzaS03WOBeF5GImMdZjU Content-Type: text/plain; charset=UTF-8; name="0001-Implement-drawing-text-with-DirectWrite-on-MS-Window.patch" Content-Disposition: attachment; filename*0="0001-Implement-drawing-text-with-DirectWrite-on-MS-Window.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSA2MDhmODE0MjE1NTNiMDg3Y2E3ZWI4MjJjMTRiNmQ4ODk3ODc3MTliIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBDZWNpbGlvIFBhcmRvIDxjcGFyZG9AaW1heWhlbS5j b20+CkRhdGU6IFdlZCwgOSBPY3QgMjAyNCAxMTo0MDoyOCArMDIwMApTdWJqZWN0OiBbUEFU Q0hdIEltcGxlbWVudCBkcmF3aW5nIHRleHQgd2l0aCBEaXJlY3RXcml0ZSBvbiBNUy1XaW5k b3dzLgoKVGhpcyBhZGRzIHN1cHBvcnQgZm9yIGNvbG9yIGZvbnRzLgoKKiBjb25maWd1cmUu YWM6IEFkZCBzcmMvdzMyZHJpdGUgdG8gVzMyX09CSgoqIHNyYy93MzJkd3JpdGUuYzogVGhp cyBpcyBhIG5ldyBmaWxlLgoodzMyLWluaXRpYWxpemUtZGlyZWN0LXdyaXRlKTogSW5pdGlh bGl6ZXMgdGhlIERpcmVjdFdyaXRlIGxpYnJhcnkgaWYKaXQgaXMgYXZhaWxhYmxlLCBhbmQg cmVxdWlyZWQgZ2xvYmFsIHZhcmlhYmxlcy4KKHczMl91c2VfZGlyZWN0X3dyaXRlKTogQWxs b3dzIHRvIGNoZWNrIGlmIERpcmVjdFdyaXRlIGlzIGF2YWlsYWJsZQphbmQgYWN0aXZhdGVk IGJ5IHRoZSB1c2VyLgoodzMyX2R3cml0ZV9lbmNvZGVfY2hhcik6IFJlcGxhY2VtZW50IGZv ciBoYXJmYnV6eidzIGVuY29kZV9jaGFyLgoodzMyX2R3cml0ZV90ZXh0X2V4dGVudHMpOiBS ZXBsYWNlbWVudCBmb3IgdzMyZm9udCB0ZXh0X2V4dGVudHMuCih3MzJfZHdyaXRlX2RyYXcp OiBSZXBsYWNlbWVudCBmb3IgdzMyZm9udCBkcmF3LgoodzMyX2R3cml0ZV9mcmVlX2NhY2hl ZF9mYWNlKTogVXNlZCBvbiB0aGUgZm9udCBkZWxldGlvbiBwcm9jZXNzIHRvCmFsc28gZGVs ZXRlIERpcmVjdFdyaXRlIGRhdGEuCih2ZXJpZnlfaHIpOiBWZXJpZnkgQ09NIG1ldGhvZCBy ZXN1bHRzLgoqIHNyYy93MzJmb250LmM6Cih3MzJmb250X3RleHRfZXh0ZW50cyk6IElmIERp cmVjdFdyaXRlIGlzIGVuYWJsZWQsIGNhbGwKdzMyX2R3cml0ZV90ZXh0X2V4dGVudHMuCih3 MzJmb250X2RyYXcpOiBJZiBEaXJlY3RXcml0ZSBpcyBlbmFibGVkLCBjYWxsIHczMl9kd3Jp dGVfZHJhdy4KKiBzcmMvdzMydW5pc2NyaWJlLmM6Cih3MzJoYl9lbmNvZGVfY2hhcik6IElm IERpcmVjdFdyaXRlIGlzIGVuYWJsZWQsIGNhbGwKdzMyX2R3cml0ZV9lbmNvZGVfY2hhci4K KHN5bXNfb2ZfdzMydW5pc2NyaWJlX2Zvcl9wZHVtcGVyKTogSW5pdGlhbGl6ZSBEaXJlY3RX cml0ZS4KKHVuaXNjcmliZV9jbG9zZSk6IEZyZWUgRGlyZWN0V3JpdGUgZGF0YSBmb3IgdGhl IGZvbnQuCi0tLQogY29uZmlndXJlLmFjICAgICAgIHwgICAyICstCiBzcmMvdzMyZHdyaXRl LmMgICAgfCA5MzAgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrCiBzcmMvdzMyZm9udC5jICAgICAgfCAgNTMgKystCiBzcmMvdzMydW5pc2NyaWJlLmMg fCAgMzkgKysKIDQgZmlsZXMgY2hhbmdlZCwgMTAxMCBpbnNlcnRpb25zKCspLCAxNCBkZWxl dGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdzMyZHdyaXRlLmMKCmRpZmYgLS1n aXQgYS9jb25maWd1cmUuYWMgYi9jb25maWd1cmUuYWMKaW5kZXggOGE1YmE3ZGIzZDEuLmJh OWNkOGYwY2Q1IDEwMDY0NAotLS0gYS9jb25maWd1cmUuYWMKKysrIGIvY29uZmlndXJlLmFj CkBAIC0zMTcyLDcgKzMxNzIsNyBAQCBBQ19ERUZVTgogICBBQ19DSEVDS19UT09MKFtXSU5E UkVTXSwgW3dpbmRyZXNdLAogICAgICAgICAgICAgICAgIFtBQ19NU0dfRVJST1IoW05vIHJl c291cmNlIGNvbXBpbGVyIGZvdW5kLl0pXSkKICAgVzMyX09CSj0idzMyZm5zLm8gdzMybWVu dS5vIHczMnJlZy5vIHczMmZvbnQubyB3MzJ0ZXJtLm8iCi0gIFczMl9PQko9IiRXMzJfT0JK IHczMnhmbnMubyB3MzJzZWxlY3QubyB3MzJ1bmlzY3JpYmUubyB3MzJjeWd3aW54Lm8iCisg IFczMl9PQko9IiRXMzJfT0JKIHczMnhmbnMubyB3MzJzZWxlY3QubyB3MzJ1bmlzY3JpYmUu byB3MzJkd3JpdGUubyB3MzJjeWd3aW54Lm8iCiAgIEVNQUNTUkVTPSJlbWFjcy5yZXMiCiAg IGNhc2UgIiRjYW5vbmljYWwiIGluCiAgICAgeDg2XzY0LSotKikgRU1BQ1NfTUFOSUZFU1Q9 ImVtYWNzLXg2NC5tYW5pZmVzdCIgOzsKZGlmZiAtLWdpdCBhL3NyYy93MzJkd3JpdGUuYyBi L3NyYy93MzJkd3JpdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw MC4uY2RiNjFkZDcxNzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdzMyZHdyaXRlLmMKQEAg LTAsMCArMSw5MzAgQEAKKy8qIFN1cHBvcnQgZm9yIHVzaW5nIERpcmVjdFdyaXRlIG9uIE1T LVdpbmRvd3MgdG8gZHJhdyB0ZXh0LiBUaGlzIGFsbG93cworICAgZm9yIGNvbG9yIGZvbnRz LgorICAgQ29weXJpZ2h0IChDKSAyMDI0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgRW1hY3MuCisKK0dOVSBFbWFjcyBpcyBm cmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Citp dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFz IHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZl cnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Cit5b3VyIG9wdGlvbikgYW55IGxhdGVy IHZlcnNpb24uCisKK0dOVSBFbWFjcyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0 IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0 IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRO RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNl aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3 aXRoIEdOVSBFbWFjcy4gIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vu c2VzLz4uICAqLworCisvKgorICBUaGlzIHJlcXVpcmVzIHRoZSBoYXJmYnV6eiBmb250IGJh Y2tlbmQgdG8gYmUgYXZhaWxhYmxlLgorCisgIEl0IHdvcmtzIGJ5IG1vZGlmeWluZyB0aGUg aGFyZmJ1enogYmFja2VuZCB0byB1c2UgRGlyZWN0V3JpdGUgYXQKKyAgc29tZSBwb2ludHMs IGlmIGl0IGlzIGF2YWlsYWJsZToKKworICAtIFdoZW4gZW5jb2RpbmcgY2hhcmFjdGVyczog dzMyaGJfZW5jb2RlX2NoYXIKKyAgLSBXaGVuIG1lYXN1cmluZyB0ZXh0OiB3MzJmb250X3Rl eHRfZXh0ZW50cworICAtIFdoZW4gZHJhd2luZyB0ZXh0OiB3MzJmb250X2RyYXcKKworICBE aXJlY3RXcml0ZSBpcyBzZXR1cCBieSBjYWxsaW5nIHczMl9pbml0aWFsaXplX2RpcmVjdF93 cml0ZS4gIEZyb20KKyAgdGhhdCBwb2ludCwgdGhlIGZ1bmN0aW9uIHczMl91c2VfZGlyZWN0 X3dyaXRlIHdpbGwgcmV0dXJuIHRydWUgaWYKKyAgRGlyZWN0V3JpdGUgaXMgdG8gYmUgdXNl ZC4gICovCisKKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNp bmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgIncz MmZvbnQuaCIKKyNpbmNsdWRlICJ3MzJjb21tb24uaCIKKyNpbmNsdWRlICJ3MzJ0ZXJtLmgi CisKKyNpbmNsdWRlICJpbml0Z3VpZC5oIgorI2luY2x1ZGUgPG9sZTIuaD4KKyNpbmNsdWRl IDx1bmtud24uaD4KKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyB3b3VsZCBiZSBp bmNsdWRlZCBmcm9tIGR3cml0ZV8zLmgsIGJ1dCBpdAorICAgaXMgbm90IGF2YWlsYWJsZSB3 aGVuIGJ1aWxkaW5nIHdpdGggTWluR1cuICBNZXRob2RzIHRoYXQgd2UgZG9uJ3QgdXNlCisg ICBhcmUgZGVjbGFyZWQgd2l0aCB0aGUgVU5VU0VEIG1hY3JvLCB0byBhdm9pZCBicmluZ2lu ZyBpbiBtb3JlIHR5cGVzCisgICB0aGF0IHdvdWxkIG5lZWQgdG8gYmUgZGVjbGFyZWQuCisq LworCisjZGVmaW5lIFVOVVNFRChuYW1lKSB2b2lkIChTVERNRVRIT0RDQUxMVFlQRSAqbmFt ZSkodm9pZCkKKworI2RlZmluZSBEV1JJVEVfRV9OT0NPTE9SIF9IUkVTVUxUX1RZUEVERUZf KDB4ODg5ODUwMENMKQorCit0eXBlZGVmIGVudW0gRFdSSVRFX1BJWEVMX0dFT01FVFJZIHsK KyAgICBEV1JJVEVfUElYRUxfR0VPTUVUUllfRkxBVCA9IDAsCisgICAgRFdSSVRFX1BJWEVM X0dFT01FVFJZX1JHQiA9IDEsCisgICAgRFdSSVRFX1BJWEVMX0dFT01FVFJZX0JHUiA9IDIK K30gRFdSSVRFX1BJWEVMX0dFT01FVFJZOworCit0eXBlZGVmIGVudW0gRFdSSVRFX1JFTkRF UklOR19NT0RFIHsKKyAgICBEV1JJVEVfUkVOREVSSU5HX01PREVfREVGQVVMVCA9IDAsCisg ICAgRFdSSVRFX1JFTkRFUklOR19NT0RFX0FMSUFTRUQgPSAxLAorICAgIERXUklURV9SRU5E RVJJTkdfTU9ERV9HRElfQ0xBU1NJQyA9IDIsCisgICAgRFdSSVRFX1JFTkRFUklOR19NT0RF X0dESV9OQVRVUkFMID0gMywKKyAgICBEV1JJVEVfUkVOREVSSU5HX01PREVfTkFUVVJBTCA9 IDQsCisgICAgRFdSSVRFX1JFTkRFUklOR19NT0RFX05BVFVSQUxfU1lNTUVUUklDID0gNSwK KyAgICBEV1JJVEVfUkVOREVSSU5HX01PREVfT1VUTElORSA9IDYKK30gRFdSSVRFX1JFTkRF UklOR19NT0RFOworCit0eXBlZGVmIGVudW0gRFdSSVRFX01FQVNVUklOR19NT0RFIHsKKyAg ICBEV1JJVEVfTUVBU1VSSU5HX01PREVfTkFUVVJBTCA9IDAsCisgICAgRFdSSVRFX01FQVNV UklOR19NT0RFX0dESV9DTEFTU0lDID0gMSwKKyAgICBEV1JJVEVfTUVBU1VSSU5HX01PREVf R0RJX05BVFVSQUwgPSAyCit9IERXUklURV9NRUFTVVJJTkdfTU9ERTsKKwordHlwZWRlZiBl bnVtIERXUklURV9URVhUX0FOVElBTElBU19NT0RFIHsKKyAgICBEV1JJVEVfVEVYVF9BTlRJ QUxJQVNfTU9ERV9DTEVBUlRZUEUgPSAwLAorICAgIERXUklURV9URVhUX0FOVElBTElBU19N T0RFX0dSQVlTQ0FMRSA9IDEKK30gRFdSSVRFX1RFWFRfQU5USUFMSUFTX01PREU7CisKK3R5 cGVkZWYgZW51bSBEV1JJVEVfRkFDVE9SWV9UWVBFIHsKKyAgICBEV1JJVEVfRkFDVE9SWV9U WVBFX1NIQVJFRCA9IDAsCisgICAgRFdSSVRFX0ZBQ1RPUllfVFlQRV9JU09MQVRFRCA9IDEK K30gRFdSSVRFX0ZBQ1RPUllfVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgRFdSSVRFX0ZPTlRf TUVUUklDUyB7CisgICAgVUlOVDE2IGRlc2lnblVuaXRzUGVyRW07CisgICAgVUlOVDE2IGFz Y2VudDsKKyAgICBVSU5UMTYgZGVzY2VudDsKKyAgICBJTlQxNiBsaW5lR2FwOworICAgIFVJ TlQxNiBjYXBIZWlnaHQ7CisgICAgVUlOVDE2IHhIZWlnaHQ7CisgICAgSU5UMTYgdW5kZXJs aW5lUG9zaXRpb247CisgICAgVUlOVDE2IHVuZGVybGluZVRoaWNrbmVzczsKKyAgICBJTlQx NiBzdHJpa2V0aHJvdWdoUG9zaXRpb247CisgICAgVUlOVDE2IHN0cmlrZXRocm91Z2hUaGlj a25lc3M7Cit9IERXUklURV9GT05UX01FVFJJQ1M7CisKK3R5cGVkZWYgc3RydWN0IERXUklU RV9HTFlQSF9NRVRSSUNTIHsKKyAgICBJTlQzMiBsZWZ0U2lkZUJlYXJpbmc7CisgICAgVUlO VDMyIGFkdmFuY2VXaWR0aDsKKyAgICBJTlQzMiByaWdodFNpZGVCZWFyaW5nOworICAgIElO VDMyIHRvcFNpZGVCZWFyaW5nOworICAgIFVJTlQzMiBhZHZhbmNlSGVpZ2h0OworICAgIElO VDMyIGJvdHRvbVNpZGVCZWFyaW5nOworICAgIElOVDMyIHZlcnRpY2FsT3JpZ2luWTsKK30g RFdSSVRFX0dMWVBIX01FVFJJQ1M7CisKK3R5cGVkZWYgaW50ZXJmYWNlIElEV3JpdGVSZW5k ZXJpbmdQYXJhbXMgSURXcml0ZVJlbmRlcmluZ1BhcmFtczsKK3R5cGVkZWYgaW50ZXJmYWNl IElEV3JpdGVGb250IElEV3JpdGVGb250OwordHlwZWRlZiBpbnRlcmZhY2UgSURXcml0ZUdk aUludGVyb3AgSURXcml0ZUdkaUludGVyb3A7Cit0eXBlZGVmIGludGVyZmFjZSBJRFdyaXRl RmFjdG9yeSBJRFdyaXRlRmFjdG9yeTsKK3R5cGVkZWYgaW50ZXJmYWNlIElEV3JpdGVGYWN0 b3J5MiBJRFdyaXRlRmFjdG9yeTI7Cit0eXBlZGVmIGludGVyZmFjZSBJRFdyaXRlRm9udEZh Y2UgSURXcml0ZUZvbnRGYWNlOwordHlwZWRlZiBpbnRlcmZhY2UgSURXcml0ZUJpdG1hcFJl bmRlclRhcmdldCBJRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0OwordHlwZWRlZiBpbnRlcmZh Y2UgSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldDEgSURXcml0ZUJpdG1hcFJlbmRlclRhcmdl dDE7Cit0eXBlZGVmIGludGVyZmFjZSBJRFdyaXRlQ29sb3JHbHlwaFJ1bkVudW1lcmF0b3Ig SURXcml0ZUNvbG9yR2x5cGhSdW5FbnVtZXJhdG9yOworCitERUZJTkVfR1VJRChJSURfSURX cml0ZUJpdG1hcFJlbmRlclRhcmdldDEsIDB4NzkxZTgyOTgsIDB4M2VmMywgMHg0MjMwLCAw eDk4LDB4ODAsIDB4YzksMHhiZCwweGVjLDB4YzQsMHgyMCwweDY0KTsKK0RFRklORV9HVUlE KElJRF9JRFdyaXRlRmFjdG9yeTIsIDB4MDQzOWZjNjAsIDB4Y2E0NCwgMHg0OTk0LCAweDhk LDB4ZWUsIDB4M2EsMHg5YSwweGY3LDB4YjcsMHgzMiwweGVjKTsKK0RFRklORV9HVUlEKElJ RF9JRFdyaXRlRmFjdG9yeSwgMHhiODU5ZWU1YSwgMHhkODM4LCAweDRiNWIsIDB4YTIsMHhl OCwgMHgxYSwweGRjLDB4N2QsMHg5MywweGRiLDB4NDgpOworCit0eXBlZGVmIHN0cnVjdCBE V1JJVEVfR0xZUEhfT0ZGU0VUIHsKKyAgICBGTE9BVCBhZHZhbmNlT2Zmc2V0OworICAgIEZM T0FUIGFzY2VuZGVyT2Zmc2V0OworfSBEV1JJVEVfR0xZUEhfT0ZGU0VUOworCit0eXBlZGVm IHN0cnVjdCBEV1JJVEVfR0xZUEhfUlVOIHsKKyAgICBJRFdyaXRlRm9udEZhY2UgKmZvbnRG YWNlOworICAgIEZMT0FUIGZvbnRFbVNpemU7CisgICAgVUlOVDMyIGdseXBoQ291bnQ7Cisg ICAgY29uc3QgVUlOVDE2ICpnbHlwaEluZGljZXM7CisgICAgY29uc3QgRkxPQVQgKmdseXBo QWR2YW5jZXM7CisgICAgY29uc3QgRFdSSVRFX0dMWVBIX09GRlNFVCAqZ2x5cGhPZmZzZXRz OworICAgIFdJTkJPT0wgaXNTaWRld2F5czsKKyAgICBVSU5UMzIgYmlkaUxldmVsOworfSAg RFdSSVRFX0dMWVBIX1JVTjsKKwordHlwZWRlZiBzdHJ1Y3QgX0QzRENPTE9SVkFMVUUgewor ICBmbG9hdCByOworICBmbG9hdCBnOworICBmbG9hdCBiOworICBmbG9hdCBhOworfSBEM0RD T0xPUlZBTFVFOworCit0eXBlZGVmIEQzRENPTE9SVkFMVUUgRFdSSVRFX0NPTE9SX0Y7CisK K3R5cGVkZWYgc3RydWN0IERXUklURV9DT0xPUl9HTFlQSF9SVU4geworICAgIERXUklURV9H TFlQSF9SVU4gZ2x5cGhSdW47CisgICAgdm9pZCAqZ2x5cGhSdW5EZXNjcmlwdGlvbjsKKyAg ICBGTE9BVCBiYXNlbGluZU9yaWdpblg7CisgICAgRkxPQVQgYmFzZWxpbmVPcmlnaW5ZOwor ICAgIERXUklURV9DT0xPUl9GIHJ1bkNvbG9yOworICAgIFVJTlQxNiBwYWxldHRlSW5kZXg7 Cit9IERXUklURV9DT0xPUl9HTFlQSF9SVU47CisKKwordHlwZWRlZiBzdHJ1Y3QgSURXcml0 ZUZvbnRGYWNlVnRibCB7CisgIEJFR0lOX0lOVEVSRkFDRQorCisgIEhSRVNVTFQgKFNURE1F VEhPRENBTExUWVBFICpRdWVyeUludGVyZmFjZSkKKyAgICAoSURXcml0ZUZvbnRGYWNlICpU aGlzLCBSRUZJSUQgcmlpZCwgdm9pZCAqKnBwdk9iamVjdCk7CisgIFVMT05HIChTVERNRVRI T0RDQUxMVFlQRSAqQWRkUmVmKShJRFdyaXRlRm9udEZhY2UgKlRoaXMpOworICBVTE9ORyAo U1RETUVUSE9EQ0FMTFRZUEUgKlJlbGVhc2UpKElEV3JpdGVGb250RmFjZSAqVGhpcyk7CisK KyAgVU5VU0VEKEdldFR5cGUpOworICBVTlVTRUQoR2V0RmlsZXMpOworICBVTlVTRUQoR2V0 SW5kZXgpOworICBVTlVTRUQoR2V0U2ltdWxhdGlvbnMpOworICBVTlVTRUQoSXNTeW1ib2xG b250KTsKKworICB2b2lkIChTVERNRVRIT0RDQUxMVFlQRSAqR2V0TWV0cmljcykKKyAgICAo SURXcml0ZUZvbnRGYWNlICpUaGlzLCBEV1JJVEVfRk9OVF9NRVRSSUNTICptZXRyaWNzKTsK KworICBVTlVTRUQgKEdldEdseXBoQ291bnQpOworICBVTlVTRUQgKEdldERlc2lnbkdseXBo TWV0cmljcyk7CisKKyAgSFJFU1VMVCAoU1RETUVUSE9EQ0FMTFRZUEUgKkdldEdseXBoSW5k aWNlcykKKyAgICAoSURXcml0ZUZvbnRGYWNlICpUaGlzLCBjb25zdCBVSU5UMzIgKmNvZGVw b2ludHMsIFVJTlQzMiBjb3VudCwKKyAgICAgVUlOVDE2ICpnbHlwaF9pbmRpY2VzKTsKKwor ICBVTlVTRUQgKFRyeUdldEZvbnRUYWJsZSk7CisgIFVOVVNFRCAoUmVsZWFzZUZvbnRUYWJs ZSk7CisgIFVOVVNFRCAoR2V0R2x5cGhSdW5PdXRsaW5lKTsKKyAgVU5VU0VEIChHZXRSZWNv bW1lbmRlZFJlbmRlcmluZ01vZGUpOworICBVTlVTRUQgKEdldEdkaUNvbXBhdGlibGVNZXRy aWNzKTsKKworICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAqR2V0R2RpQ29tcGF0aWJs ZUdseXBoTWV0cmljcykKKyAgICAoSURXcml0ZUZvbnRGYWNlICpUaGlzLAorICAgICBGTE9B VCBlbVNpemUsCisgICAgIEZMT0FUIHBpeGVsc19wZXJfZGlwLAorICAgICB2b2lkICp0cmFu c2Zvcm0sCisgICAgIFdJTkJPT0wgdXNlX2dkaV9uYXR1cmFsLAorICAgICBjb25zdCBVSU5U MTYgKmdseXBoX2luZGljZXMsCisgICAgIFVJTlQzMiBnbHlwaF9jb3VudCwKKyAgICAgRFdS SVRFX0dMWVBIX01FVFJJQ1MgKm1ldHJpY3MsCisgICAgIFdJTkJPT0wgaXNfc2lkZXdheXMp OworICBFTkRfSU5URVJGQUNFCit9IElEV3JpdGVGb250RmFjZVZ0Ymw7CisKK2ludGVyZmFj ZSBJRFdyaXRlRm9udEZhY2UgeworICAgIENPTlNUX1ZUQkwgSURXcml0ZUZvbnRGYWNlVnRi bCogbHBWdGJsOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgSURXcml0ZVJlbmRlcmluZ1BhcmFt c1Z0YmwgeworICBCRUdJTl9JTlRFUkZBQ0UKKworICBIUkVTVUxUIChTVERNRVRIT0RDQUxM VFlQRSAqUXVlcnlJbnRlcmZhY2UpCisgICAgKElEV3JpdGVSZW5kZXJpbmdQYXJhbXMgKlRo aXMsIFJFRklJRCByaWlkLCB2b2lkICoqcHB2T2JqZWN0KTsKKyAgVUxPTkcgKFNURE1FVEhP RENBTExUWVBFICpBZGRSZWYpKElEV3JpdGVSZW5kZXJpbmdQYXJhbXMgKlRoaXMpOworICBV TE9ORyAoU1RETUVUSE9EQ0FMTFRZUEUgKlJlbGVhc2UpKElEV3JpdGVSZW5kZXJpbmdQYXJh bXMgKlRoaXMpOworCisgIEZMT0FUIChTVERNRVRIT0RDQUxMVFlQRSAqR2V0R2FtbWEpCisg ICAgKElEV3JpdGVSZW5kZXJpbmdQYXJhbXMgKlRoaXMpOworICBGTE9BVCAoU1RETUVUSE9E Q0FMTFRZUEUgKkdldEVuaGFuY2VkQ29udHJhc3QpCisgICAgKElEV3JpdGVSZW5kZXJpbmdQ YXJhbXMgKlRoaXMpOworICBGTE9BVCAoU1RETUVUSE9EQ0FMTFRZUEUgKkdldENsZWFyVHlw ZUxldmVsKQorICAgIChJRFdyaXRlUmVuZGVyaW5nUGFyYW1zICpUaGlzKTsKKyAgaW50IChT VERNRVRIT0RDQUxMVFlQRSAqR2V0UGl4ZWxHZW9tZXRyeSkKKyAgICAoSURXcml0ZVJlbmRl cmluZ1BhcmFtcyAqVGhpcyk7CisgIEVORF9JTlRFUkZBQ0UKK30gSURXcml0ZVJlbmRlcmlu Z1BhcmFtc1Z0Ymw7CisKK2ludGVyZmFjZSBJRFdyaXRlUmVuZGVyaW5nUGFyYW1zIHsKKyAg ICBDT05TVF9WVEJMIElEV3JpdGVSZW5kZXJpbmdQYXJhbXNWdGJsKiBscFZ0Ymw7Cit9Owor Cit0eXBlZGVmIHN0cnVjdCBJRFdyaXRlRm9udFZ0YmwgeworICBCRUdJTl9JTlRFUkZBQ0UK KworICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAqUXVlcnlJbnRlcmZhY2UpCisgICAg KElEV3JpdGVGb250ICpUaGlzLCBSRUZJSUQgcmlpZCwgdm9pZCAqKnBwdk9iamVjdCk7Cisg IFVMT05HIChTVERNRVRIT0RDQUxMVFlQRSAqQWRkUmVmKShJRFdyaXRlRm9udCAqVGhpcyk7 CisgIFVMT05HIChTVERNRVRIT0RDQUxMVFlQRSAqUmVsZWFzZSkoSURXcml0ZUZvbnQgKlRo aXMpOworCisgIFVOVVNFRCAoR2V0Rm9udEZhbWlseSk7CisgIFVOVVNFRCAoR2V0V2VpZ2h0 KTsKKyAgVU5VU0VEIChHZXRTdHJldGNoKTsKKyAgVU5VU0VEIChHZXRTdHlsZSk7CisgIFVO VVNFRCAoSXNTeW1ib2xGb250KTsKKyAgVU5VU0VEIChHZXRGYWNlTmFtZXMpOworICBVTlVT RUQgKEdldEluZm9ybWF0aW9uYWxTdHJpbmdzKTsKKyAgVU5VU0VEIChHZXRTaW11bGF0aW9u cyk7CisKKyAgdm9pZCAoU1RETUVUSE9EQ0FMTFRZUEUgKkdldE1ldHJpY3MpCisgICAgKElE V3JpdGVGb250ICpUaGlzLCBEV1JJVEVfRk9OVF9NRVRSSUNTICptZXRyaWNzKTsKKworICBV TlVTRUQoSGFzQ2hhcmFjdGVyKTsKKworICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAq Q3JlYXRlRm9udEZhY2UpCisgICAgKElEV3JpdGVGb250ICpUaGlzLCBJRFdyaXRlRm9udEZh Y2UgKipmYWNlKTsKKworICBFTkRfSU5URVJGQUNFCit9IElEV3JpdGVGb250VnRibDsKKwor aW50ZXJmYWNlIElEV3JpdGVGb250IHsKKyAgICBDT05TVF9WVEJMIElEV3JpdGVGb250VnRi bCogbHBWdGJsOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgSURXcml0ZUJpdG1hcFJlbmRlclRh cmdldFZ0YmwgeworICBCRUdJTl9JTlRFUkZBQ0UKKworICBIUkVTVUxUIChTVERNRVRIT0RD QUxMVFlQRSAqUXVlcnlJbnRlcmZhY2UpCisgICAgKElEV3JpdGVCaXRtYXBSZW5kZXJUYXJn ZXQgKlRoaXMsIFJFRklJRCByaWlkLCB2b2lkICoqcHB2T2JqZWN0KTsKKyAgVUxPTkcgKFNU RE1FVEhPRENBTExUWVBFICpBZGRSZWYpKElEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQgKlRo aXMpOworICBVTE9ORyAoU1RETUVUSE9EQ0FMTFRZUEUgKlJlbGVhc2UpKElEV3JpdGVCaXRt YXBSZW5kZXJUYXJnZXQgKlRoaXMpOworCisgIEhSRVNVTFQgKFNURE1FVEhPRENBTExUWVBF ICpEcmF3R2x5cGhSdW4pCisgICAgKElEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQgKlRoaXMs CisgICAgIEZMT0FUIGJhc2VsaW5lT3JpZ2luWCwKKyAgICAgRkxPQVQgYmFzZWxpbmVPcmln aW5ZLAorICAgICBEV1JJVEVfTUVBU1VSSU5HX01PREUgbWVhc3VyaW5nX21vZGUsCisgICAg IGNvbnN0IERXUklURV9HTFlQSF9SVU4gKmdseXBoX3J1biwKKyAgICAgSURXcml0ZVJlbmRl cmluZ1BhcmFtcyAqcGFyYW1zLAorICAgICBDT0xPUlJFRiB0ZXh0Q29sb3IsCisgICAgIFJF Q1QgKmJsYWNrYm94X3JlY3QpOworCisgIEhEQyAoU1RETUVUSE9EQ0FMTFRZUEUgKkdldE1l bW9yeURDKShJRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0ICpUaGlzKTsKKworICBVTlVTRUQg KEdldFBpeGVsc1BlckRpcCk7CisKKyAgSFJFU1VMVCAoU1RETUVUSE9EQ0FMTFRZUEUgKlNl dFBpeGVsc1BlckRpcCkKKyAgICAoSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldCAqVGhpcywg RkxPQVQgcGl4ZWxzX3Blcl9kaXApOworCisgIFVOVVNFRCAoR2V0Q3VycmVudFRyYW5zZm9y bSk7CisgIFVOVVNFRCAoU2V0Q3VycmVudFRyYW5zZm9ybSk7CisgIFVOVVNFRCAoR2V0U2l6 ZSk7CisgIFVOVVNFRCAoUmVzaXplKTsKKyAgRU5EX0lOVEVSRkFDRQorfSBJRFdyaXRlQml0 bWFwUmVuZGVyVGFyZ2V0VnRibDsKKworaW50ZXJmYWNlIElEV3JpdGVCaXRtYXBSZW5kZXJU YXJnZXQgeworICAgIENPTlNUX1ZUQkwgSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldFZ0Ymwq IGxwVnRibDsKK307CisKK3R5cGVkZWYgc3RydWN0IElEV3JpdGVCaXRtYXBSZW5kZXJUYXJn ZXQxVnRibCB7CisgIEJFR0lOX0lOVEVSRkFDRQorCisgIEhSRVNVTFQgKFNURE1FVEhPRENB TExUWVBFICpRdWVyeUludGVyZmFjZSkKKyAgICAoSURXcml0ZUJpdG1hcFJlbmRlclRhcmdl dDEgKlRoaXMsIFJFRklJRCByaWlkLCB2b2lkICoqcHB2T2JqZWN0KTsKKyAgVUxPTkcgKFNU RE1FVEhPRENBTExUWVBFICpBZGRSZWYpIChJRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0MSAq VGhpcyk7CisgIFVMT05HIChTVERNRVRIT0RDQUxMVFlQRSAqUmVsZWFzZSkgKElEV3JpdGVC aXRtYXBSZW5kZXJUYXJnZXQxICpUaGlzKTsKKworICBVTlVTRUQgKERyYXdHbHlwaFJ1bik7 CisgIFVOVVNFRCAoR2V0TWVtb3J5REMpOworICBVTlVTRUQgKEdldFBpeGVsc1BlckRpcCk7 CisgIFVOVVNFRCAoU2V0UGl4ZWxzUGVyRGlwKTsKKyAgVU5VU0VEIChHZXRDdXJyZW50VHJh bnNmb3JtKTsKKyAgVU5VU0VEIChTZXRDdXJyZW50VHJhbnNmb3JtKTsKKyAgVU5VU0VEIChH ZXRTaXplKTsKKyAgVU5VU0VEIChSZXNpemUpOworICBVTlVTRUQgKEdldFRleHRBbnRpYWxp YXNNb2RlKTsKKworICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAqU2V0VGV4dEFudGlh bGlhc01vZGUpCisgICAgKElEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQxICpUaGlzLCBEV1JJ VEVfVEVYVF9BTlRJQUxJQVNfTU9ERSBtb2RlKTsKKworICBFTkRfSU5URVJGQUNFCit9IElE V3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQxVnRibDsKKworaW50ZXJmYWNlIElEV3JpdGVCaXRt YXBSZW5kZXJUYXJnZXQxIHsKKyAgICBDT05TVF9WVEJMIElEV3JpdGVCaXRtYXBSZW5kZXJU YXJnZXQxVnRibCogbHBWdGJsOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgSURXcml0ZUdkaUlu dGVyb3BWdGJsIHsKKyAgQkVHSU5fSU5URVJGQUNFCisKKyAgSFJFU1VMVCAoU1RETUVUSE9E Q0FMTFRZUEUgKlF1ZXJ5SW50ZXJmYWNlKQorICAgIChJRFdyaXRlR2RpSW50ZXJvcCAqVGhp cywgUkVGSUlEIHJpaWQsIHZvaWQgKipwcHZPYmplY3QpOworICBVTE9ORyAoU1RETUVUSE9E Q0FMTFRZUEUgKkFkZFJlZikoSURXcml0ZUdkaUludGVyb3AgKlRoaXMpOworICBVTE9ORyAo U1RETUVUSE9EQ0FMTFRZUEUgKlJlbGVhc2UpKElEV3JpdGVHZGlJbnRlcm9wICpUaGlzKTsK KworICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAqQ3JlYXRlRm9udEZyb21MT0dGT05U KQorICAgIChJRFdyaXRlR2RpSW50ZXJvcCAqVGhpcywgY29uc3QgTE9HRk9OVFcgKmxvZ2Zv bnQsCisgICAgIElEV3JpdGVGb250ICoqZm9udCk7CisKKyAgVU5VU0VEIChDb252ZXJ0Rm9u dFRvTE9HRk9OVCk7CisgIFVOVVNFRCAoQ29udmVydEZvbnRGYWNlVG9MT0dGT05UKTsKKyAg VU5VU0VEIChDcmVhdGVGb250RmFjZUZyb21IZGMpOworCisgIEhSRVNVTFQgKFNURE1FVEhP RENBTExUWVBFICpDcmVhdGVCaXRtYXBSZW5kZXJUYXJnZXQpCisgICAgKElEV3JpdGVHZGlJ bnRlcm9wICpUaGlzLCBIREMgaGRjLCBVSU5UMzIgd2lkdGgsIFVJTlQzMiBoZWlnaHQsCisg ICAgIElEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQgKip0YXJnZXQpOworICBFTkRfSU5URVJG QUNFCit9IElEV3JpdGVHZGlJbnRlcm9wVnRibDsKKworaW50ZXJmYWNlIElEV3JpdGVHZGlJ bnRlcm9wIHsKKyAgICBDT05TVF9WVEJMIElEV3JpdGVHZGlJbnRlcm9wVnRibCogbHBWdGJs OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgSURXcml0ZUZhY3RvcnlWdGJsIHsKKyAgQkVHSU5f SU5URVJGQUNFCisKKyAgSFJFU1VMVCAoU1RETUVUSE9EQ0FMTFRZUEUgKlF1ZXJ5SW50ZXJm YWNlKQorICAgIChJRFdyaXRlRmFjdG9yeSAqVGhpcywgUkVGSUlEIHJpaWQsIHZvaWQgKipw cHZPYmplY3QpOworICBVTE9ORyAoU1RETUVUSE9EQ0FMTFRZUEUgKkFkZFJlZikoSURXcml0 ZUZhY3RvcnkgKlRoaXMpOworICBVTE9ORyAoU1RETUVUSE9EQ0FMTFRZUEUgKlJlbGVhc2Up KElEV3JpdGVGYWN0b3J5ICpUaGlzKTsKKworICBVTlVTRUQgKEdldFN5c3RlbUZvbnRDb2xs ZWN0aW9uKTsKKyAgVU5VU0VEIChDcmVhdGVDdXN0b21Gb250Q29sbGVjdGlvbik7CisgIFVO VVNFRCAoUmVnaXN0ZXJGb250Q29sbGVjdGlvbkxvYWRlcik7CisgIFVOVVNFRCAoVW5yZWdp c3RlckZvbnRDb2xsZWN0aW9uTG9hZGVyKTsKKyAgVU5VU0VEIChDcmVhdGVGb250RmlsZVJl ZmVyZW5jZSk7CisgIFVOVVNFRCAoQ3JlYXRlQ3VzdG9tRm9udEZpbGVSZWZlcmVuY2UpOwor ICBVTlVTRUQgKENyZWF0ZUZvbnRGYWNlKTsKKyAgSFJFU1VMVCAoU1RETUVUSE9EQ0FMTFRZ UEUgKkNyZWF0ZVJlbmRlcmluZ1BhcmFtcykKKyAgICAoSURXcml0ZUZhY3RvcnkgKlRoaXMs IElEV3JpdGVSZW5kZXJpbmdQYXJhbXMgKipwYXJhbXMpOworICBVTlVTRUQgKENyZWF0ZU1v bml0b3JSZW5kZXJpbmdQYXJhbXMpOworICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAq Q3JlYXRlQ3VzdG9tUmVuZGVyaW5nUGFyYW1zKQorICAgIChJRFdyaXRlRmFjdG9yeSAqVGhp cywgRkxPQVQgZ2FtbWEsIEZMT0FUIGVuaGFuY2VkQ29udHJhc3QsCisgICAgIEZMT0FUIGNs ZWFydHlwZV9sZXZlbCwgRFdSSVRFX1BJWEVMX0dFT01FVFJZIGdlb21ldHJ5LAorICAgICBE V1JJVEVfUkVOREVSSU5HX01PREUgbW9kZSwgSURXcml0ZVJlbmRlcmluZ1BhcmFtcyAqKnBh cmFtcyk7CisgIFVOVVNFRCAoUmVnaXN0ZXJGb250RmlsZUxvYWRlcik7CisgIFVOVVNFRCAo VW5yZWdpc3RlckZvbnRGaWxlTG9hZGVyKTsKKyAgVU5VU0VEIChDcmVhdGVUZXh0Rm9ybWF0 KTsKKyAgVU5VU0VEIChDcmVhdGVUeXBvZ3JhcGh5KTsKKyAgSFJFU1VMVCAoU1RETUVUSE9E Q0FMTFRZUEUgKkdldEdkaUludGVyb3ApCisgICAgKElEV3JpdGVGYWN0b3J5ICpUaGlzLCBJ RFdyaXRlR2RpSW50ZXJvcCAqKmdkaV9pbnRlcm9wKTsKKyAgVU5VU0VEIChDcmVhdGVUZXh0 TGF5b3V0KTsKKyAgVU5VU0VEIChDcmVhdGVHZGlDb21wYXRpYmxlVGV4dExheW91dCk7Cisg IFVOVVNFRCAoQ3JlYXRlRWxsaXBzaXNUcmltbWluZ1NpZ24pOworICBVTlVTRUQgKENyZWF0 ZVRleHRBbmFseXplcik7CisgIFVOVVNFRCAoQ3JlYXRlTnVtYmVyU3Vic3RpdHV0aW9uKTsK KyAgVU5VU0VEIChDcmVhdGVHbHlwaFJ1bkFuYWx5c2lzKTsKKyAgRU5EX0lOVEVSRkFDRQor fSBJRFdyaXRlRmFjdG9yeVZ0Ymw7CisKK2ludGVyZmFjZSBJRFdyaXRlRmFjdG9yeSB7IENP TlNUX1ZUQkwgSURXcml0ZUZhY3RvcnlWdGJsKiBscFZ0Ymw7IH07CisKK3R5cGVkZWYgc3Ry dWN0IElEV3JpdGVDb2xvckdseXBoUnVuRW51bWVyYXRvclZ0YmwgeworICAgIEJFR0lOX0lO VEVSRkFDRQorCisgICAgSFJFU1VMVCAoU1RETUVUSE9EQ0FMTFRZUEUgKlF1ZXJ5SW50ZXJm YWNlKQorICAgICAgKElEV3JpdGVDb2xvckdseXBoUnVuRW51bWVyYXRvciAqVGhpcywgUkVG SUlEIHJpaWQsIHZvaWQgKipwcHZPYmplY3QpOworICAgIFVMT05HIChTVERNRVRIT0RDQUxM VFlQRSAqQWRkUmVmKShJRFdyaXRlQ29sb3JHbHlwaFJ1bkVudW1lcmF0b3IgKlRoaXMpOwor ICAgIFVMT05HIChTVERNRVRIT0RDQUxMVFlQRSAqUmVsZWFzZSkoSURXcml0ZUNvbG9yR2x5 cGhSdW5FbnVtZXJhdG9yICpUaGlzKTsKKworICAgIEhSRVNVTFQgKFNURE1FVEhPRENBTExU WVBFICpNb3ZlTmV4dCkoCisgICAgICAgIElEV3JpdGVDb2xvckdseXBoUnVuRW51bWVyYXRv ciAqVGhpcywKKyAgICAgICAgV0lOQk9PTCAqaGFzUnVuKTsKKworICAgIEhSRVNVTFQgKFNU RE1FVEhPRENBTExUWVBFICpHZXRDdXJyZW50UnVuKSgKKyAgICAgICAgSURXcml0ZUNvbG9y R2x5cGhSdW5FbnVtZXJhdG9yICpUaGlzLAorICAgICAgICBjb25zdCBEV1JJVEVfQ09MT1Jf R0xZUEhfUlVOICoqcnVuKTsKKworICAgIEVORF9JTlRFUkZBQ0UKK30gSURXcml0ZUNvbG9y R2x5cGhSdW5FbnVtZXJhdG9yVnRibDsKKworaW50ZXJmYWNlIElEV3JpdGVDb2xvckdseXBo UnVuRW51bWVyYXRvciB7CisgICAgQ09OU1RfVlRCTCBJRFdyaXRlQ29sb3JHbHlwaFJ1bkVu dW1lcmF0b3JWdGJsKiBscFZ0Ymw7Cit9OworCit0eXBlZGVmIHN0cnVjdCBJRFdyaXRlRmFj dG9yeTJWdGJsIHsKKyAgQkVHSU5fSU5URVJGQUNFCisgIEhSRVNVTFQgKFNURE1FVEhPRENB TExUWVBFICpRdWVyeUludGVyZmFjZSkKKyAgICAgIChJRFdyaXRlRmFjdG9yeTIgKlRoaXMs IFJFRklJRCByaWlkLCB2b2lkICoqcHB2T2JqZWN0KTsKKyAgVUxPTkcgKFNURE1FVEhPRENB TExUWVBFICpBZGRSZWYpKElEV3JpdGVGYWN0b3J5MiAqVGhpcyk7CisgIFVMT05HIChTVERN RVRIT0RDQUxMVFlQRSAqUmVsZWFzZSkoSURXcml0ZUZhY3RvcnkyICpUaGlzKTsKKyAgVU5V U0VEIChHZXRTeXN0ZW1Gb250Q29sbGVjdGlvbik7CisgIFVOVVNFRCAoQ3JlYXRlQ3VzdG9t Rm9udENvbGxlY3Rpb24pOworICBVTlVTRUQgKFJlZ2lzdGVyRm9udENvbGxlY3Rpb25Mb2Fk ZXIpOworICBVTlVTRUQgKFVucmVnaXN0ZXJGb250Q29sbGVjdGlvbkxvYWRlcik7CisgIFVO VVNFRCAoQ3JlYXRlRm9udEZpbGVSZWZlcmVuY2UpOworICBVTlVTRUQgKENyZWF0ZUN1c3Rv bUZvbnRGaWxlUmVmZXJlbmNlKTsKKyAgVU5VU0VEIChDcmVhdGVGb250RmFjZSk7CisgIFVO VVNFRCAoQ3JlYXRlUmVuZGVyaW5nUGFyYW1zKTsKKyAgVU5VU0VEIChDcmVhdGVNb25pdG9y UmVuZGVyaW5nUGFyYW1zKTsKKyAgVU5VU0VEIChDcmVhdGVDdXN0b21SZW5kZXJpbmdQYXJh bXMpOworICBVTlVTRUQgKFJlZ2lzdGVyRm9udEZpbGVMb2FkZXIpOworICBVTlVTRUQgKFVu cmVnaXN0ZXJGb250RmlsZUxvYWRlcik7CisgIFVOVVNFRCAoQ3JlYXRlVGV4dEZvcm1hdCk7 CisgIFVOVVNFRCAoQ3JlYXRlVHlwb2dyYXBoeSk7CisgIFVOVVNFRCAoR2V0R2RpSW50ZXJv cCk7CisgIFVOVVNFRCAoQ3JlYXRlVGV4dExheW91dCk7CisgIFVOVVNFRCAoQ3JlYXRlR2Rp Q29tcGF0aWJsZVRleHRMYXlvdXQpOworICBVTlVTRUQgKENyZWF0ZUVsbGlwc2lzVHJpbW1p bmdTaWduKTsKKyAgVU5VU0VEIChDcmVhdGVUZXh0QW5hbHl6ZXIpOworICBVTlVTRUQgKENy ZWF0ZU51bWJlclN1YnN0aXR1dGlvbik7CisgIFVOVVNFRCAoQ3JlYXRlR2x5cGhSdW5BbmFs eXNpcyk7CisKKyAgVU5VU0VEIChHZXRFdWRjRm9udENvbGxlY3Rpb24pOworICBVTlVTRUQg KElEV3JpdGVGYWN0b3J5MV9DcmVhdGVDdXN0b21SZW5kZXJpbmdQYXJhbXMpOworCisgIFVO VVNFRCAoR2V0U3lzdGVtRm9udEZhbGxiYWNrKTsKKyAgVU5VU0VEIChDcmVhdGVGb250RmFs bGJhY2tCdWlsZGVyKTsKKyAgSFJFU1VMVCAoU1RETUVUSE9EQ0FMTFRZUEUgKlRyYW5zbGF0 ZUNvbG9yR2x5cGhSdW4pCisgICAgKElEV3JpdGVGYWN0b3J5MiAqVGhpcywKKyAgICAgRkxP QVQgb3JpZ2luWCwKKyAgICAgRkxPQVQgb3JpZ2luWSwKKyAgICAgY29uc3QgRFdSSVRFX0dM WVBIX1JVTiAqcnVuLAorICAgICB2b2lkICpydW5kZXNjciwKKyAgICAgRFdSSVRFX01FQVNV UklOR19NT0RFIG1vZGUsCisgICAgIHZvaWQgKnRyYW5zZm9ybSwKKyAgICAgVUlOVDMyIHBh bGV0dGVfaW5kZXgsCisgICAgIElEV3JpdGVDb2xvckdseXBoUnVuRW51bWVyYXRvciAqKmNv bG9ybGF5ZXJzKTsKKworICBVTlVTRUQgKElEV3JpdGVGYWN0b3J5Ml9DcmVhdGVDdXN0b21S ZW5kZXJpbmdQYXJhbXMpOworICBVTlVTRUQgKElEV3JpdGVGYWN0b3J5Ml9DcmVhdGVHbHlw aFJ1bkFuYWx5c2lzKTsKKyAgRU5EX0lOVEVSRkFDRQorfSBJRFdyaXRlRmFjdG9yeTJWdGJs OworCitpbnRlcmZhY2UgSURXcml0ZUZhY3RvcnkyIHsKKyAgICBDT05TVF9WVEJMIElEV3Jp dGVGYWN0b3J5MlZ0YmwqIGxwVnRibDsKK307CisKKy8qIEVuZCBvZiBkd3JpdGVfMy5oIGRl ZmluaXRpb25zLiAgKi8KKworLyogVmFsdWVzIHRvIHVzZSBmb3IgRGlyZWN0V3JpdGUgcmVu ZGVyaW5nLiAgKi8KKyNkZWZpbmUgTUVBU1VSSU5HX01PREUgRFdSSVRFX01FQVNVUklOR19N T0RFX05BVFVSQUwKKyNkZWZpbmUgUkVOREVSSU5HX01PREUgRFdSSVRFX1JFTkRFUklOR19N T0RFX05BVFVSQUxfU1lNTUVUUklDCisjZGVmaW5lIEFOVElBTElBU19NT0RFIERXUklURV9U RVhUX0FOVElBTElBU19NT0RFX0NMRUFSVFlQRQorCisjZGVmaW5lIFJFTEVBU0VfQ09NKGkp IChpKS0+bHBWdGJsLT5SZWxlYXNlIChpKQorCisvKiBHbG9iYWwgdmFyaWFibGVzIGZvciBE aXJlY3RXcml0ZS4gICovCitzdGF0aWMgYm9vbCBkaXJlY3Rfd3JpdGVfYXZhaWxhYmxlID0g ZmFsc2U7CitzdGF0aWMgSURXcml0ZUZhY3RvcnkgKmR3cml0ZV9mYWN0b3J5Oworc3RhdGlj IElEV3JpdGVGYWN0b3J5MiAqZHdyaXRlX2ZhY3RvcnkyOworc3RhdGljIElEV3JpdGVHZGlJ bnRlcm9wICpnZGlfaW50ZXJvcDsKK3N0YXRpYyBJRFdyaXRlUmVuZGVyaW5nUGFyYW1zICpy ZW5kZXJpbmdfcGFyYW1zOworCisvKiBGdW5jdGlvbiBwcm90b3R5cGVzLiAgKi8KK3ZvaWQg dzMyX2luaXRpYWxpemVfZGlyZWN0X3dyaXRlICh2b2lkKTsKK2Jvb2wgdzMyX3VzZV9kaXJl Y3Rfd3JpdGUgKHN0cnVjdCB3MzJmb250X2luZm8gKnczMmZvbnQpOwordm9pZCB3MzJfZHdy aXRlX2RyYXcgKEhEQyBoZGMsIGludCB4LCBpbnQgeSwgdW5zaWduZWQgKmdseXBocywgaW50 IGxlbiwKKwkJICAgICAgQ09MT1JSRUYgY29sb3IsIHN0cnVjdCBmb250ICpmb250ICk7Cit2 b2lkIHczMl9kd3JpdGVfdGV4dF9leHRlbnRzIChzdHJ1Y3QgZm9udCAqZm9udCwgY29uc3Qg dW5zaWduZWQgKmNvZGUsCisJCQkgICAgICBpbnQgbmdseXBocywgc3RydWN0IGZvbnRfbWV0 cmljcyAqbWV0cmljcyk7Cit1bnNpZ25lZCB3MzJfZHdyaXRlX2VuY29kZV9jaGFyIChzdHJ1 Y3QgZm9udCAqZm9udCwgaW50IGMpOwordm9pZCB3MzJfZHdyaXRlX2ZyZWVfY2FjaGVkX2Zh Y2Uodm9pZCAqY2FjaGUpOworCisvKiBUaGlzIHR3byBmdW5jdGlvbnMgYXJlIG9uIHczMnVu aW5zY3JpYmUuYyAgKi8KK3ZvaWQgKnczMl9mb250X2dldF9kd3JpdGVfY2FjaGUgKHN0cnVj dCBmb250ICpmb250LCBmbG9hdCAqZm9udF9zaXplKTsKK3ZvaWQgdzMyX2ZvbnRfc2V0X2R3 cml0ZV9jYWNoZSAoc3RydWN0IGZvbnQgKmZvbnQsIHZvaWQgKmNhY2hlLAorCQkJCWZsb2F0 IGZvbnRfc2l6ZSk7CisKK3N0YXRpYyB2b2lkCit2ZXJpZnlfaHIgKEhSRVNVTFQgaHIsIGNv bnN0IGNoYXIgKm1zZykKK3sKKyAgaWYgKEZBSUxFRCAoaHIpKQorICAgIGVtYWNzX2Fib3J0 ICgpOworfQorCisvKiBHZXRzIGEgSURXcml0ZUZvbnRGYWNlIGZyb20gYSBzdHJ1Y3QgZm9u dCAoaXRzIEhGT05UKS4gUmV0dXJucyB0aGUKKyAgIGZvbnQgc2l6ZSBpbiBwb2ludHMuICBJ dCBtYXkgZmFpbCB0byBnZXQgYSBEaXJlY3RXcml0ZSBmb250LCBhbmQgZmFjZQorICAgd2ls bCBiZSBOVUxMIG9uIHJldHVybi4gIFRoaXMgaGFwcGVucyBmb3Igc29tZSBmb250cyBsaWtl IENvdXJpZXIuCisKKyAgIE5ldmVyIGNhbGwgUmVsZWFzZSBvbiB0aGUgcmVzdWx0LCBhcyBp dCBpcyBjYWNoZWQgZm9yIHJldXNlIG9uIHRoZQorICAgc3RydWN0IGZvbnQuICAqLworc3Rh dGljIGZsb2F0CitnZXRfZm9udF9mYWNlIChzdHJ1Y3QgZm9udCAqaW5mb250LCBJRFdyaXRl Rm9udEZhY2UgKipmYWNlKQoreworICBIUkVTVUxUIGhyOworICBMT0dGT05UVyBsb2dmb250 OworICBJRFdyaXRlRm9udCAqZm9udDsKKyAgZmxvYXQgZm9udF9zaXplOworCisgIC8qIENo ZWNrIHRoZSBjYWNoZS4gICovCisgICpmYWNlID0gdzMyX2ZvbnRfZ2V0X2R3cml0ZV9jYWNo ZSAoaW5mb250LCAmZm9udF9zaXplKTsKKyAgaWYgKCpmYWNlKQorICAgIHJldHVybiBmb250 X3NpemU7CisKKyAgR2V0T2JqZWN0VyAoRk9OVF9IQU5ETEUoaW5mb250KSwgc2l6ZW9mIChM T0dGT05UVyksICZsb2dmb250KTsKKworICBociA9IGdkaV9pbnRlcm9wLT5scFZ0YmwtPgor ICAgIENyZWF0ZUZvbnRGcm9tTE9HRk9OVCAoZ2RpX2ludGVyb3AsIChjb25zdCBMT0dGT05U VyAqKSAmbG9nZm9udCwgJmZvbnQpOworCisgIGlmIChGQUlMRUQgKGhyKSkKKyAgICB7Cisg ICAgICAqZmFjZSA9IE5VTEw7CisgICAgICByZXR1cm4gMC4wOworICAgIH0KKworICBociA9 IGZvbnQtPmxwVnRibC0+Q3JlYXRlRm9udEZhY2UgKGZvbnQsIGZhY2UpOworICBSRUxFQVNF X0NPTSAoZm9udCk7CisgIHZlcmlmeV9ociAoaHIsICJGYWlsZWQgdG8gY3JlYXRlIERXcml0 ZUZvbnRGYWNlIik7CisgIHczMl9mb250X3NldF9kd3JpdGVfY2FjaGUgKGluZm9udCwgKmZh Y2UsIGFicyhsb2dmb250LmxmSGVpZ2h0KSk7CisKKyAgcmV0dXJuIGFicyhsb2dmb250Lmxm SGVpZ2h0KTsKK30KKwordm9pZAordzMyX2R3cml0ZV9mcmVlX2NhY2hlZF9mYWNlKHZvaWQg KmNhY2hlKQoreworICBpZiAoY2FjaGUpCisgICAgUkVMRUFTRV9DT00gKChJRFdyaXRlRm9u dEZhY2UgKikgY2FjaGUpOworfQorCitzdGF0aWMgZmxvYXQKK2NvbnZlcnRfbWV0cmljc19z eiggaW50IHN6LCBmbG9hdCBmb250X3NpemUsIGludCB1bml0c19wZXJfZW0gKQoreworICBy ZXR1cm4gKGZsb2F0KXN6ICogZm9udF9zaXplIC8gdW5pdHNfcGVyX2VtOworfQorCisKKy8q IERvZXMgbm90IGZpbGwgaW4gdGhlIGFzY2VudCBhbmQgZGVzY2VudCBmaWVsZHMgb2YgbWV0 cmljcy4gICovCitzdGF0aWMgdm9pZAordGV4dF9leHRlbnRzX2ludGVybmFsIChJRFdyaXRl Rm9udEZhY2UgKmR3cml0ZV9mb250X2ZhY2UsCisJCSAgICAgICBmbG9hdCBmb250X3NpemUs IGNvbnN0IHVuc2lnbmVkICpjb2RlLAorCQkgICAgICAgaW50IG5nbHlwaHMsIHN0cnVjdCBm b250X21ldHJpY3MgKm1ldHJpY3MpCit7CisgIEhSRVNVTFQgaHI7CisKKyAgRFdSSVRFX0ZP TlRfTUVUUklDUyBkd3JpdGVfZm9udF9tZXRyaWNzOworICBkd3JpdGVfZm9udF9mYWNlLT5s cFZ0YmwtPgorICAgIEdldE1ldHJpY3MgKGR3cml0ZV9mb250X2ZhY2UsICZkd3JpdGVfZm9u dF9tZXRyaWNzKTsKKworICBVSU5UMTYgKmluZGljZXMgPSBhbGxvY2EgKG5nbHlwaHMgKiBz aXplb2YgKFVJTlQxNikpOworICBmb3IgKGludCBpID0gMDsgaSA8IG5nbHlwaHM7IGkrKykK KyAgICBpbmRpY2VzW2ldID0gY29kZVtpXTsKKworICBEV1JJVEVfR0xZUEhfTUVUUklDUyog Z21ldHJpY3MgPQorICAgIGFsbG9jYSAobmdseXBocyAqIHNpemVvZiAoRFdSSVRFX0dMWVBI X01FVFJJQ1MpKTsKKworICBociA9IGR3cml0ZV9mb250X2ZhY2UtPmxwVnRibC0+CisgICAg R2V0R2RpQ29tcGF0aWJsZUdseXBoTWV0cmljcyAoZHdyaXRlX2ZvbnRfZmFjZSwKKwkJCQkg IGZvbnRfc2l6ZSwKKwkJCQkgIDEuMCwKKwkJCQkgIE5VTEwsCisJCQkJICBUUlVFLAorCQkJ CSAgaW5kaWNlcywKKwkJCQkgIG5nbHlwaHMsCisJCQkJICBnbWV0cmljcywKKwkJCQkgIGZh bHNlKTsKKyAgdmVyaWZ5X2hyIChociwgIkZhaWxlZCB0byBHZXRHZGlDb21wYXRpYmxlR2x5 cGhNZXRyaWNzIik7CisKKyAgZmxvYXQgd2lkdGggPSAwOworICBpbnQgZHVfcGVyX2VtID0g ZHdyaXRlX2ZvbnRfbWV0cmljcy5kZXNpZ25Vbml0c1BlckVtOworCisgIGZvciAoaW50IGkg PSAwOyBpIDwgbmdseXBoczsgaSsrKQorICAgIHsKKyAgICAgIGZsb2F0IGFkdmFuY2UgPQor CWNvbnZlcnRfbWV0cmljc19zeiAoZ21ldHJpY3NbaV0uYWR2YW5jZVdpZHRoLCBmb250X3Np emUsIGR1X3Blcl9lbSk7CisKKyAgICAgIHdpZHRoICs9IGFkdmFuY2U7CisKKyAgICAgIGZs b2F0IGxiZWFyaW5nID0KKwlyb3VuZCAoY29udmVydF9tZXRyaWNzX3N6IChnbWV0cmljc1tp XS5sZWZ0U2lkZUJlYXJpbmcsIGZvbnRfc2l6ZSwKKwkJCQkgICBkdV9wZXJfZW0pKTsKKyAg ICAgIGZsb2F0IHJiZWFyaW5nID0KKwlyb3VuZCAoYWR2YW5jZSAtCisJICAgICAgIGNvbnZl cnRfbWV0cmljc19zeiAoZ21ldHJpY3NbaV0ucmlnaHRTaWRlQmVhcmluZywKKwkJCQkgICBm b250X3NpemUsIGR1X3Blcl9lbSkpOworICAgICAgaWYgKGkgPT0gMCkKKwl7CisJICBtZXRy aWNzLT5sYmVhcmluZyA9IGxiZWFyaW5nOworCSAgbWV0cmljcy0+cmJlYXJpbmcgPSByYmVh cmluZzsKKwl9CisgICAgICBpZiAobWV0cmljcy0+bGJlYXJpbmcgPiBsYmVhcmluZykKKwlt ZXRyaWNzLT5sYmVhcmluZyA9IGxiZWFyaW5nOworICAgICAgaWYgKG1ldHJpY3MtPnJiZWFy aW5nIDwgcmJlYXJpbmcpCisJbWV0cmljcy0+cmJlYXJpbmcgPSByYmVhcmluZzsKKyAgICB9 CisgIG1ldHJpY3MtPndpZHRoID0gcm91bmQod2lkdGgpOworfQorCit1bnNpZ25lZAordzMy X2R3cml0ZV9lbmNvZGVfY2hhciAoc3RydWN0IGZvbnQgKmZvbnQsIGludCBjKQoreworICBI UkVTVUxUIGhyOworICBJRFdyaXRlRm9udEZhY2UgKmR3cml0ZV9mb250X2ZhY2U7CisgIFVJ TlQxNiBpbmRleDsKKworICBnZXRfZm9udF9mYWNlIChmb250LCAmZHdyaXRlX2ZvbnRfZmFj ZSk7CisgIGhyID0gZHdyaXRlX2ZvbnRfZmFjZS0+bHBWdGJsLT4KKyAgICBHZXRHbHlwaElu ZGljZXMgKGR3cml0ZV9mb250X2ZhY2UsICZjLCAxLCAmaW5kZXgpOworICB2ZXJpZnlfaHIg KGhyLCAiRmFpbGVkIHRvIEdldEdseXBoSW5kaWNlcyIpOworCisgIGlmIChpbmRleCA9PSAw KQorICAgIHJldHVybiBGT05UX0lOVkFMSURfQ09ERTsKKworICByZXR1cm4gaW5kZXg7Cit9 CisKK3ZvaWQKK3czMl9kd3JpdGVfdGV4dF9leHRlbnRzIChzdHJ1Y3QgZm9udCAqZm9udCwg Y29uc3QgdW5zaWduZWQgKmNvZGUsIGludCBuZ2x5cGhzLAorCQkJIHN0cnVjdCBmb250X21l dHJpY3MgKm1ldHJpY3MpCit7CisgIElEV3JpdGVGb250RmFjZSAqZHdyaXRlX2ZvbnRfZmFj ZTsKKworICBmbG9hdCBmb250X3NpemUgPSBnZXRfZm9udF9mYWNlIChmb250LCAmZHdyaXRl X2ZvbnRfZmFjZSk7CisKKyAgaWYgKGR3cml0ZV9mb250X2ZhY2UgPT0gTlVMTCkKKyAgICB7 CisgICAgICBtZXRyaWNzLT53aWR0aCA9IDA7CisgICAgICBtZXRyaWNzLT5sYmVhcmluZyA9 IDA7CisgICAgICBtZXRyaWNzLT5yYmVhcmluZyA9IDA7CisgICAgICByZXR1cm47CisgICAg fQorCisgIHRleHRfZXh0ZW50c19pbnRlcm5hbCAoZHdyaXRlX2ZvbnRfZmFjZSwgZm9udF9z aXplLCBjb2RlLCBuZ2x5cGhzLCBtZXRyaWNzKTsKKworICBtZXRyaWNzLT5hc2NlbnQgPSBm b250LT5hc2NlbnQ7CisgIG1ldHJpY3MtPmRlc2NlbnQgPSBmb250LT5kZXNjZW50OworfQor CisvKiBOZXZlciBjYWxsIFJlbGVhc2Ugb24gdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoaXMg ZnVuY3Rpb24sIGFzIGl0IGlzCisgICByZXVzZWQuICAqLworc3RhdGljIElEV3JpdGVCaXRt YXBSZW5kZXJUYXJnZXQgKgorZ2V0X2JpdG1hcF9yZW5kZXJfdGFyZ2V0IChIREMgaGRjLCBp bnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgIEhSRVNVTFQgaHI7CisgIHN0YXRpYyBJRFdy aXRlQml0bWFwUmVuZGVyVGFyZ2V0ICpicnQgPSBOVUxMOworICBzdGF0aWMgU0laRSBzaXpl ID0gezAsIDB9OworCisgIGlmIChicnQpCisgICAgeworICAgICAgLyogQ2hlY2sgaWYgd2Ug bmVlZCB0byBtYWtlIGEgYmlnZ2VyIG9uZS4gICovCisgICAgICBpZiAod2lkdGggPD0gc2l6 ZS5jeCAmJiBoZWlnaHQgPD0gc2l6ZS5jeSkKKwlyZXR1cm4gYnJ0OworICAgICAgUkVMRUFT RV9DT00gKGJydCk7CisgICAgfQorCisgIGlmICh3aWR0aCA+IHNpemUuY3gpCisgICAgc2l6 ZS5jeCA9IHdpZHRoOworICBpZiAoaGVpZ2h0ID4gc2l6ZS5jeSkKKyAgICBzaXplLmN5ID0g aGVpZ2h0OworCisgIGhyID0gZ2RpX2ludGVyb3AtPmxwVnRibC0+CisgICAgQ3JlYXRlQml0 bWFwUmVuZGVyVGFyZ2V0IChnZGlfaW50ZXJvcCwgaGRjLCBzaXplLmN4LCBzaXplLmN5LCAm YnJ0KTsKKyAgdmVyaWZ5X2hyIChociwgIkZhaWxlZCB0byBjcmVhdGUgRFdyaXRlQml0bWFw UmVuZGVyVGFyZ2V0Iik7CisKKyAgLyogV2UgaGFuZGxlIGhpZ2ggZHBpIGRpc3BsYXlzIGJ5 IGluY3Jlc2luZyBmb250IHNpemUsIHNvIG92ZXJyaWRlCisgICAgIFBpeGVsc1BlckRpcC4g ICovCisgIGJydC0+bHBWdGJsLT5TZXRQaXhlbHNQZXJEaXAgKGJydCwgMS4wKTsKKworICAv KiBUaGUgU2V0VGV4dEFudGlhbGlhc01vZGUgbWV0aG9kIGlzIG9ubHkgYXZhaWxhYmxlIGlu CisgICAgIElEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQxLiAgKi8KKyAgSURXcml0ZUJpdG1h cFJlbmRlclRhcmdldDEgKmJydDE7CisgIGhyID0gYnJ0LT5scFZ0YmwtPgorICAgIFF1ZXJ5 SW50ZXJmYWNlIChicnQsICZJSURfSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldDEsICh2b2lk ICoqKSAmYnJ0MSk7CisgIGlmIChTVUNDRUVERUQgKGhyKSkKKyAgICB7CisgICAgICBicnQx LT5scFZ0YmwtPgorCVNldFRleHRBbnRpYWxpYXNNb2RlIChicnQxLCBBTlRJQUxJQVNfTU9E RSk7CisgICAgICBSRUxFQVNFX0NPTSAoYnJ0MSk7CisgICAgfQorCisgIHJldHVybiBicnQ7 Cit9CisKK3ZvaWQKK3czMl9pbml0aWFsaXplX2RpcmVjdF93cml0ZSAodm9pZCkKK3sKKyAg ZGlyZWN0X3dyaXRlX2F2YWlsYWJsZSA9IGZhbHNlOworICBITU9EVUxFIGRpcmVjdF93cml0 ZSA9IExvYWRMaWJyYXJ5ICgiZHdyaXRlLmRsbCIpOworICBpZiAoIWRpcmVjdF93cml0ZSkK KyAgICByZXR1cm47CisKKyAgLyogVGhpcyBpcyBvbmx5IHVzZWQgaGVyZSwgbm8gbmVlZCB0 byBkZWZpbmUgaXQgZ2xvYmFsbHkuICAqLworICB0eXBlZGVmIEhSRVNVTFQgKFdJTkFQSSAq Q3JlYXRlRmFjdG9yeSkgKERXUklURV9GQUNUT1JZX1RZUEUgZiwgUkVGSUlEIHIsIElVbmtu b3duKiogdSk7CisKKyAgQ3JlYXRlRmFjdG9yeSBjcmVhdGVfZmFjdG9yeQorICAgID0gKENy ZWF0ZUZhY3RvcnkpIGdldF9wcm9jX2FkZHIgKGRpcmVjdF93cml0ZSwgIkRXcml0ZUNyZWF0 ZUZhY3RvcnkiKTsKKworICBpZiAoIWNyZWF0ZV9mYWN0b3J5KQorICAgIHsKKyAgICAgIEZy ZWVMaWJyYXJ5IChkaXJlY3Rfd3JpdGUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBI UkVTVUxUIGhyID0gY3JlYXRlX2ZhY3RvcnkgKERXUklURV9GQUNUT1JZX1RZUEVfU0hBUkVE LAorCQkJICAgICAgICZJSURfSURXcml0ZUZhY3RvcnksCisJCQkgICAgICAgKElVbmtub3du ICoqKSAmZHdyaXRlX2ZhY3RvcnkpOworICBpZiAoRkFJTEVEIChocikpCisgICAgeworICAg ICAgRnJlZUxpYnJhcnkgKGRpcmVjdF93cml0ZSk7CisgICAgICByZXR1cm47CisgICAgfQor CisgIGhyID0gZHdyaXRlX2ZhY3RvcnktPmxwVnRibC0+CisgICAgUXVlcnlJbnRlcmZhY2Ug KGR3cml0ZV9mYWN0b3J5LCAmSUlEX0lEV3JpdGVGYWN0b3J5MiwKKwkJICAgICh2b2lkICoq KSAmZHdyaXRlX2ZhY3RvcnkyKTsKKworICBpZiAoRkFJTEVEIChocikpCisgICAgeworICAg ICAgUkVMRUFTRV9DT00gKGR3cml0ZV9mYWN0b3J5KTsKKyAgICAgIEZyZWVMaWJyYXJ5IChk aXJlY3Rfd3JpdGUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBociA9IGR3cml0ZV9m YWN0b3J5LT5scFZ0YmwtPgorICAgIEdldEdkaUludGVyb3AgKGR3cml0ZV9mYWN0b3J5LCAm Z2RpX2ludGVyb3ApOworICBpZiAoRkFJTEVEIChocikpCisgICAgeworICAgICAgUkVMRUFT RV9DT00gKGR3cml0ZV9mYWN0b3J5KTsKKyAgICAgIFJFTEVBU0VfQ09NIChkd3JpdGVfZmFj dG9yeTIpOworICAgICAgRnJlZUxpYnJhcnkgKGRpcmVjdF93cml0ZSk7CisgICAgICByZXR1 cm47CisgICAgfQorCisgIElEV3JpdGVSZW5kZXJpbmdQYXJhbXMgKmRlZjsKKworICBociA9 IGR3cml0ZV9mYWN0b3J5LT5scFZ0YmwtPgorICAgIENyZWF0ZVJlbmRlcmluZ1BhcmFtcyAo ZHdyaXRlX2ZhY3RvcnksICZkZWYpOworICBpZiAoRkFJTEVEIChocikpCisgICAgeworICAg ICAgUkVMRUFTRV9DT00gKGR3cml0ZV9mYWN0b3J5KTsKKyAgICAgIFJFTEVBU0VfQ09NIChk d3JpdGVfZmFjdG9yeTIpOworICAgICAgUkVMRUFTRV9DT00gKGdkaV9pbnRlcm9wKTsKKyAg ICAgIEZyZWVMaWJyYXJ5IChkaXJlY3Rfd3JpdGUpOworICAgICAgcmV0dXJuOworICAgIH0K KworICAvKiByYW5nZTogWzAuMCwgMS4wXSAgKi8KKyAgZmxvYXQgZW5oYW5jZWRfY29udHJh c3QgPSBkZWYtPmxwVnRibC0+R2V0RW5oYW5jZWRDb250cmFzdChkZWYpOworICAvKiByYW5n ZTogWzAuMCwgMS4wXSAgKi8KKyAgZmxvYXQgY2xlYXJfdHlwZV9sZXZlbCA9IGRlZi0+bHBW dGJsLT5HZXRDbGVhclR5cGVMZXZlbChkZWYpOworICAvKiByYW5nZTogKDAuMCwgMjU2LjBd ICovCisgIGZsb2F0IGdhbW1hID0gMS40OyAvKiBkZWYtPmxwVnRibC0+R2V0R2FtbWEoZGVm KTsgKi8KKworICBociA9IGR3cml0ZV9mYWN0b3J5LT5scFZ0YmwtPgorICAgIENyZWF0ZUN1 c3RvbVJlbmRlcmluZ1BhcmFtcyAoZHdyaXRlX2ZhY3RvcnksCisJCQkJIGdhbW1hLAorCQkJ CSBlbmhhbmNlZF9jb250cmFzdCwKKwkJCQkgY2xlYXJfdHlwZV9sZXZlbCwKKwkJCQkgZGVm LT5scFZ0YmwtPkdldFBpeGVsR2VvbWV0cnkoZGVmKSwKKwkJCQkgUkVOREVSSU5HX01PREUs CisJCQkJICZyZW5kZXJpbmdfcGFyYW1zKTsKKyAgUkVMRUFTRV9DT00gKGRlZik7CisKKyAg aWYgKEZBSUxFRCAoaHIpKQorICAgIHsKKyAgICAgIFJFTEVBU0VfQ09NIChkd3JpdGVfZmFj dG9yeSk7CisgICAgICBSRUxFQVNFX0NPTSAoZHdyaXRlX2ZhY3RvcnkyKTsKKyAgICAgIFJF TEVBU0VfQ09NIChnZGlfaW50ZXJvcCk7CisgICAgICBGcmVlTGlicmFyeSAoZGlyZWN0X3dy aXRlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZGlyZWN0X3dyaXRlX2F2YWlsYWJs ZSA9IHRydWU7CisKKyAgREVGVkFSX0JPT0wgKCJ3MzItaW5oaWJpdC1kaXJlY3Qtd3JpdGUi LCB3MzJfaW5oaWJpdF9kaXJlY3Rfd3JpdGUsCisJICAgICAgIGRvYzogLyogSWYgdCwgZG9u J3QgdXNlIERpcmVjdFdyaXRlLiAgKi8pOworICB3MzJfaW5oaWJpdF9kaXJlY3Rfd3JpdGUg PSBmYWxzZTsKK30KKwordm9pZCB3MzJfZHdyaXRlX2RyYXcgKEhEQyBoZGMsIGludCB4LCBp bnQgeSwgdW5zaWduZWQgKmdseXBocywgaW50IGxlbiwKKwkJICAgICAgQ09MT1JSRUYgY29s b3IsIHN0cnVjdCBmb250ICpmb250KQoreworICBIUkVTVUxUIGhyOworICBJRFdyaXRlRm9u dEZhY2UgKmR3cml0ZV9mb250X2ZhY2U7CisKKyAgLyogV2hhdCB3ZSBnZXQgYXMgeSBpcyB0 aGUgYmFzZWxpbmUgcG9zaXRpb24uICAqLworICB5IC09IGZvbnQtPmFzY2VudDsKKworICBm bG9hdCBmb250X3NpemUgPSBnZXRfZm9udF9mYWNlIChmb250LCAmZHdyaXRlX2ZvbnRfZmFj ZSk7CisgIGlmIChkd3JpdGVfZm9udF9mYWNlID09IE5VTEwpCisgICAgcmV0dXJuOworCisg IHN0cnVjdCBmb250X21ldHJpY3MgbWV0cmljczsKKyAgdGV4dF9leHRlbnRzX2ludGVybmFs IChkd3JpdGVfZm9udF9mYWNlLCBmb250X3NpemUsIGdseXBocywgbGVuLCAmbWV0cmljcyk7 CisKKyAgaW50IGJpdG1hcF93aWR0aCA9IG1ldHJpY3Mud2lkdGggKyBtZXRyaWNzLnJiZWFy aW5nOworICBpbnQgYml0bWFwX2hlaWdodCA9IGZvbnQtPmFzY2VudCArIGZvbnQtPmRlc2Nl bnQ7CisKKyAgLyogV2UgbmV2ZXIgUmVsZWFzZSB0aGlzLCBnZXRfYml0bWFwX3JlbmRlcl90 YXJnZXQgcmV1c2VzIGl0LiAgKi8KKyAgSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldCAqYml0 bWFwX3JlbmRlcl90YXJnZXQgPQorICAgIGdldF9iaXRtYXBfcmVuZGVyX3RhcmdldCAoaGRj LCBiaXRtYXBfd2lkdGgsIGJpdG1hcF9oZWlnaHQpOworCisgIC8qIFRoaXMgREMgY2FuJ3Qg YmUgcmVsZWFzZWQuICAqLworICBIREMgdGV4dF9kYyA9IGJpdG1hcF9yZW5kZXJfdGFyZ2V0 LT5scFZ0YmwtPgorICAgIEdldE1lbW9yeURDIChiaXRtYXBfcmVuZGVyX3RhcmdldCk7CisK KyAgLyogQ29weSB0aGUgYmFja2dyb3VuZCBwaXhlbCB0byB0aGUgcmVuZGVyIHRhcmdldCBi aXRtYXAuICAqLworICBCaXRCbHQgKHRleHRfZGMsIDAsIDAsIGJpdG1hcF93aWR0aCwgYml0 bWFwX2hlaWdodCwgaGRjLCB4LCB5LCBTUkNDT1BZKTsKKworCisgIFVJTlQxNiAqaW5kaWNl cyA9IGFsbG9jYSAobGVuICogc2l6ZW9mIChVSU5UMTYpKTsKKworICBmb3IgKGludCBpID0g MDsgaSA8IGxlbjsgaSsrKQorICAgIGluZGljZXNbaV0gPSBnbHlwaHNbaV07CisKKyAgRkxP QVQgKmFkdmFuY2VzID0gYWxsb2NhIChsZW4gKiBzaXplb2YgKEZMT0FUKSk7CisKKyAgZm9y IChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICB7CisgICAgICB0ZXh0X2V4dGVudHNf aW50ZXJuYWwgKGR3cml0ZV9mb250X2ZhY2UsIGZvbnRfc2l6ZSwgZ2x5cGhzICsgaSwgMSwK KwkJCSAgICAgJm1ldHJpY3MpOworICAgICAgYWR2YW5jZXNbaV0gPSBtZXRyaWNzLndpZHRo OworICAgIH0KKworICBEV1JJVEVfR0xZUEhfUlVOIGdseXBoX3J1bjsKKyAgZ2x5cGhfcnVu LmZvbnRGYWNlID0gZHdyaXRlX2ZvbnRfZmFjZTsKKyAgZ2x5cGhfcnVuLmZvbnRFbVNpemUg PSBmb250X3NpemU7CisgIGdseXBoX3J1bi5nbHlwaEluZGljZXMgPSBpbmRpY2VzOworICBn bHlwaF9ydW4uZ2x5cGhDb3VudCA9IGxlbjsKKyAgZ2x5cGhfcnVuLmlzU2lkZXdheXMgPSBm YWxzZTsKKyAgZ2x5cGhfcnVuLmJpZGlMZXZlbCA9IDA7CisgIGdseXBoX3J1bi5nbHlwaE9m ZnNldHMgPSBOVUxMOworICBnbHlwaF9ydW4uZ2x5cGhBZHZhbmNlcyA9IGFkdmFuY2VzOwor CisgIElEV3JpdGVDb2xvckdseXBoUnVuRW51bWVyYXRvciAqbGF5ZXJzOworICAvKiBUaGlz IGNhbGwgd2lsbCB0ZWxsIHVzIGlmIHdlIGhhY2UgdG8gaGFuZGxlIGFueSBjb2xvciBnbHlw aC4gICovCisgIGhyID0gZHdyaXRlX2ZhY3RvcnkyLT5scFZ0YmwtPgorICAgIFRyYW5zbGF0 ZUNvbG9yR2x5cGhSdW4gKGR3cml0ZV9mYWN0b3J5MiwKKwkJCSAgICAwLCBmb250LT5hc2Nl bnQsCisJCQkgICAgJmdseXBoX3J1biwKKwkJCSAgICBOVUxMLAorCQkJICAgIE1FQVNVUklO R19NT0RFLAorCQkJICAgIE5VTEwsCisJCQkgICAgMCwKKwkJCSAgICAmbGF5ZXJzKTsKKwor ICAvKiBObyBjb2xvci4gSnVzdCBkcmF3IHRoZSBHbHlwaFJ1bi4gICovCisgIGlmIChociA9 PSBEV1JJVEVfRV9OT0NPTE9SKQorICAgIHsKKyAgICAgIGJpdG1hcF9yZW5kZXJfdGFyZ2V0 LT5scFZ0YmwtPgorCURyYXdHbHlwaFJ1biAoYml0bWFwX3JlbmRlcl90YXJnZXQsCisJCSAg ICAgIDAsIGZvbnQtPmFzY2VudCwKKwkJICAgICAgTUVBU1VSSU5HX01PREUsCisJCSAgICAg ICZnbHlwaF9ydW4sCisJCSAgICAgIHJlbmRlcmluZ19wYXJhbXMsCisJCSAgICAgIGNvbG9y LAorCQkgICAgICBOVUxMKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBJZiB0 aGVyZSB3ZXJlIGNvbG9yIGdseXBocywgbGF5ZXJzIGNvbnRhaW5zIGEgY29udGFpbnRzIGEg bGlzdAorCSBvZiBHbHlwaFJ1biB3aXRoIGEgY29sb3IgYW5kIGEgcG9zaXRpb24gZm9yIGVh Y2guICBXZSBkcmF3IHRoZW0KKwkgaW5kaXZpZHVhbGx5LiAgKi8KKyAgICAgIHZlcmlmeV9o ciAoaHIsICJGYWlsZWQgYXQgVHJhbnNsYXRlQ29sb3JHbHlwaFJ1biIpOworICAgICAgZm9y ICg7OykgeworCUhSRVNVTFQgaHI7CisJQk9PTCBtb3JlX2xheWVyczsKKwljb25zdCBEV1JJ VEVfQ09MT1JfR0xZUEhfUlVOICpsYXllcjsKKworCWhyID0gbGF5ZXJzLT5scFZ0YmwtPk1v dmVOZXh0IChsYXllcnMsICZtb3JlX2xheWVycyk7CisJdmVyaWZ5X2hyIChociwgIkZhaWxl ZCBhdCBNb3ZlTmV4dCIpOworCWlmICghbW9yZV9sYXllcnMpCisJICBicmVhazsKKwlociA9 IGxheWVycy0+bHBWdGJsLT5HZXRDdXJyZW50UnVuIChsYXllcnMsICZsYXllcik7CisJdmVy aWZ5X2hyIChociwgIkZhaWxlZCBhdCBHZXRDdXJyZW50UnVuIik7CisJYml0bWFwX3JlbmRl cl90YXJnZXQtPmxwVnRibC0+CisJICBEcmF3R2x5cGhSdW4gKGJpdG1hcF9yZW5kZXJfdGFy Z2V0LAorCQkJbGF5ZXItPmJhc2VsaW5lT3JpZ2luWCwgbGF5ZXItPmJhc2VsaW5lT3JpZ2lu WSwKKwkJCU1FQVNVUklOR19NT0RFLAorCQkJJmxheWVyLT5nbHlwaFJ1biwKKwkJCXJlbmRl cmluZ19wYXJhbXMsCisJCQlSR0IgKGxheWVyLT5ydW5Db2xvci5yICogMjU1LAorCQkJICAg ICBsYXllci0+cnVuQ29sb3IuZyAqIDI1NSwKKwkJCSAgICAgbGF5ZXItPnJ1bkNvbG9yLmIg KiAyNTUpLAorCQkJTlVMTCk7CisgICAgICB9CisgICAgICBSRUxFQVNFX0NPTSAobGF5ZXJz KTsKKyAgICB9CisKKyAgLyogRmluYWxseSwgY29weSB0aGUgcmVuZGVyZWQgdGV4dCBiYWNr IHRvIHRoZSBvcmlnaW5hbCBEQy4gICovCisgIEJpdEJsdCAoaGRjLCB4LCB5LCBiaXRtYXBf d2lkdGgsIGJpdG1hcF9oZWlnaHQsIHRleHRfZGMsIDAsIDAsIFNSQ0NPUFkpOworfQorCisv KiBSZXR1cm5zIHRydWUgaWYgRGlyZWN0V3JpdGUgaXMgdG8gYmUgdXNlZDoKKyAgIC0gSXMg aXMgYXZhaWxhYmxlLgorICAgLSBUaGUgZm9udCBpcyBoYW5kbGVkIGJ5IGhhcmZidXp6Cisg ICAtIHczMi1pbmhpYml0LWRpcmVjdC13cml0ZSBpcyBmYWxzZQorICovCitib29sCit3MzJf dXNlX2RpcmVjdF93cml0ZSAoc3RydWN0IHczMmZvbnRfaW5mbyAqdzMyZm9udCkKK3sKKyNp ZmRlZiBIQVZFX0hBUkZCVVpaCisgIHJldHVybiBkaXJlY3Rfd3JpdGVfYXZhaWxhYmxlCisg ICAgJiYgdzMyZm9udC0+Zm9udC5kcml2ZXIgPT0gJmhhcmZidXp6X2ZvbnRfZHJpdmVyCisg ICAgJiYgIXczMl9pbmhpYml0X2RpcmVjdF93cml0ZTsKKyNlbHNlCisgIHJldHVybiBmYWxz ZTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvc3JjL3czMmZvbnQuYyBiL3NyYy93MzJmb250 LmMKaW5kZXggZWZiNDJkODAzMzYuLjE2YWE5MzA4NTg0IDEwMDY0NAotLS0gYS9zcmMvdzMy Zm9udC5jCisrKyBiL3NyYy93MzJmb250LmMKQEAgLTU1LDYgKzU1LDEzIEBAICNkZWZpbmUg VklFVE5BTUVTRV9DSEFSU0VUIDE2MwogI2RlZmluZSBKT0hBQl9DSEFSU0VUIDEzMAogI2Vu ZGlmCiAKKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgZnJvbSB3MzJ3cml0ZS5jICAqLworYm9v bCB3MzJfdXNlX2RpcmVjdF93cml0ZSAoc3RydWN0IHczMmZvbnRfaW5mbyAqdzMyZm9udCk7 Cit2b2lkIHczMl9kd3JpdGVfZHJhdyAoSERDIGhkYywgaW50IHgsIGludCB5LCB1bnNpZ25l ZCAqZ2x5cGhzLCBpbnQgbGVuLAorCQkgIENPTE9SUkVGIGNvbG9yLCBzdHJ1Y3QgZm9udCAq Zm9udCApOwordm9pZCB3MzJfZHdyaXRlX3RleHRfZXh0ZW50cyAoc3RydWN0IGZvbnQgKmZv bnQsIGNvbnN0IHVuc2lnbmVkICpjb2RlLAorCQkJICBpbnQgbmdseXBocywgc3RydWN0IGZv bnRfbWV0cmljcyAqbWV0cmljcyk7CisKIHN0YXRpYyB2b2lkIGZpbGxfaW5fbG9nZm9udCAo c3RydWN0IGZyYW1lICosIExPR0ZPTlQgKiwgTGlzcF9PYmplY3QpOwogCiBzdGF0aWMgQllU RSB3MzJfYW50aWFsaWFzX3R5cGUgKExpc3BfT2JqZWN0KTsKQEAgLTQ1Miw2ICs0NTksMTIg QEAgdzMyZm9udF90ZXh0X2V4dGVudHMgKHN0cnVjdCBmb250ICpmb250LCBjb25zdCB1bnNp Z25lZCAqY29kZSwKIAogICBtZW1zZXQgKG1ldHJpY3MsIDAsIHNpemVvZiAoc3RydWN0IGZv bnRfbWV0cmljcykpOwogCisgIGlmICh3MzJfdXNlX2RpcmVjdF93cml0ZSAodzMyX2ZvbnQp KQorICAgIHsKKyAgICAgIHczMl9kd3JpdGVfdGV4dF9leHRlbnRzIChmb250LCBjb2RlLCBu Z2x5cGhzLCBtZXRyaWNzKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKICAgZm9yIChpID0g MCwgZmlyc3QgPSB0cnVlOyBpIDwgbmdseXBoczsgaSsrKQogICAgIHsKICAgICAgIHN0cnVj dCB3MzJfbWV0cmljX2NhY2hlICpjaGFyX21ldHJpYzsKQEAgLTcwNiwyMiArNzE5LDM2IEBA IHczMmZvbnRfZHJhdyAoc3RydWN0IGdseXBoX3N0cmluZyAqcywgaW50IGZyb20sIGludCB0 bywKICAgICAgIGludCBpOwogCiAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0J ewotCSAgV0NIQVIgYyA9IHMtPmNoYXIyYltmcm9tICsgaV0gJiAweEZGRkY7Ci0JICBFeHRU ZXh0T3V0VyAocy0+aGRjLCB4ICsgaSwgeSwgb3B0aW9ucywgTlVMTCwgJmMsIDEsIE5VTEwp OwotCX0KKwlpZiAodzMyX3VzZV9kaXJlY3Rfd3JpdGUgKHczMmZvbnQpKQorCSAgeworCSAg ICB3MzJfZHdyaXRlX2RyYXcgKHMtPmhkYywgeCwgeSwgcy0+Y2hhcjJiICsgZnJvbSwgMSwK KwkJCSBHZXRUZXh0Q29sb3Iocy0+aGRjKSwgcy0+Zm9udCk7CisJICB9CisJZWxzZQorCSAg eworCSAgICBXQ0hBUiBjID0gcy0+Y2hhcjJiW2Zyb20gKyBpXSAmIDB4RkZGRjsKKwkgICAg RXh0VGV4dE91dFcgKHMtPmhkYywgeCArIGksIHksIG9wdGlvbnMsIE5VTEwsICZjLCAxLCBO VUxMKTsKKwkgIH0KICAgICB9CiAgIGVsc2UKICAgICB7Ci0gICAgICAvKiBUaGUgbnVtYmVy IG9mIGdseXBocyBpbiBhIGdseXBoX3N0cmluZyBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4KLQkg dGhlIG1heGltdW0gdmFsdWUgb2YgdGhlICd1c2VkJyBtZW1iZXIgb2YgYSBnbHlwaF9yb3cs IHNvIHdlCi0JIGFyZSBPSyB1c2luZyBhbGxvY2EgaGVyZS4gICovCi0gICAgICBlYXNzZXJ0 IChsZW4gPD0gU0hSVF9NQVgpOwotICAgICAgV0NIQVIgKmNoYXJzID0gYWxsb2NhIChsZW4g KiBzaXplb2YgKFdDSEFSKSk7Ci0gICAgICBpbnQgajsKLSAgICAgIGZvciAoaiA9IDA7IGog PCBsZW47IGorKykKLQljaGFyc1tqXSA9IHMtPmNoYXIyYltmcm9tICsgal0gJiAweEZGRkY7 Ci0gICAgICBFeHRUZXh0T3V0VyAocy0+aGRjLCB4LCB5LCBvcHRpb25zLCBOVUxMLCBjaGFy cywgbGVuLCBOVUxMKTsKKyAgICAgIGlmICh3MzJfdXNlX2RpcmVjdF93cml0ZSAodzMyZm9u dCkpCisJeworCSAgdzMyX2R3cml0ZV9kcmF3ICggcy0+aGRjLCB4LCB5LAorCQkJcy0+Y2hh cjJiICsgZnJvbSwgbGVuLCBHZXRUZXh0Q29sb3Iocy0+aGRjKSwgcy0+Zm9udCApOworCX0K KyAgICAgIGVsc2UKKwl7CisJICAvKiBUaGUgbnVtYmVyIG9mIGdseXBocyBpbiBhIGdseXBo X3N0cmluZyBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4KKwkgICAgIHRoZSBtYXhpbXVtIHZhbHVl IG9mIHRoZSAndXNlZCcgbWVtYmVyIG9mIGEgZ2x5cGhfcm93LCBzbyB3ZQorCSAgICAgYXJl IE9LIHVzaW5nIGFsbG9jYSBoZXJlLiAgKi8KKwkgIGVhc3NlcnQgKGxlbiA8PSBTSFJUX01B WCk7CisJICBXQ0hBUiAqY2hhcnMgPSBhbGxvY2EgKGxlbiAqIHNpemVvZiAoV0NIQVIpKTsK KwkgIGludCBqOworCSAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKQorCSAgICBjaGFyc1tq XSA9IHMtPmNoYXIyYltmcm9tICsgal0gJiAweEZGRkY7CisJICBFeHRUZXh0T3V0VyAocy0+ aGRjLCB4LCB5LCBvcHRpb25zLCBOVUxMLCBjaGFycywgbGVuLCBOVUxMKTsKKwl9CiAgICAg fQogCiAgIC8qIFJlc3RvcmUgY2xpcCByZWdpb24uICAqLwpkaWZmIC0tZ2l0IGEvc3JjL3cz MnVuaXNjcmliZS5jIGIvc3JjL3czMnVuaXNjcmliZS5jCmluZGV4IGI3N2JmNTZiOGNmLi5h ZjA1ZDA1MDkzNiAxMDA2NDQKLS0tIGEvc3JjL3czMnVuaXNjcmliZS5jCisrKyBiL3NyYy93 MzJ1bmlzY3JpYmUuYwpAQCAtNDQsNiArNDQsMTUgQEAgI2RlZmluZSBfV0lOMzJfV0lOTlQg MHgwNjAwCiAjaW5jbHVkZSAicGR1bXBlci5oIgogI2luY2x1ZGUgInczMmNvbW1vbi5oIgog CisvKiBGdW5jdGlvbiBwcm90b3R5cGVzIGZyb20gdzMyZHdyaXRlLmMgICovCitib29sIHcz Ml91c2VfZGlyZWN0X3dyaXRlIChzdHJ1Y3QgdzMyZm9udF9pbmZvICp3MzJmb250KTsKK3Vu c2lnbmVkIHczMl9kd3JpdGVfZW5jb2RlX2NoYXIgKHN0cnVjdCBmb250ICpmb250LCBpbnQg Yyk7Cit2b2lkIHczMl9kd3JpdGVfZnJlZV9jYWNoZWRfZmFjZSAodm9pZCAqY2FjaGUpOwor CisvKiBGdW5jdGlvbiBwcm90b3R5cGVzIGZyb20gdGhpcyBmaWxlICAqLwordm9pZCAqdzMy X2ZvbnRfZ2V0X2R3cml0ZV9jYWNoZSAoc3RydWN0IGZvbnQgKmZvbnQsIGZsb2F0ICpmb250 X3NpemUpOwordm9pZCB3MzJfZm9udF9zZXRfZHdyaXRlX2NhY2hlIChzdHJ1Y3QgZm9udCAq Zm9udCwgdm9pZCAqY2FjaGUsIGZsb2F0IGZvbnRfc2l6ZSk7CisKIC8qIEV4dGVuc2lvbiBv ZiB3MzJmb250X2luZm8gdXNlZCBieSBVbmlzY3JpYmUgYW5kIEhhcmZCdXp6IGJhY2tlbmRz LiAgKi8KIHN0cnVjdCB1bmlzY3JpYmVfZm9udF9pbmZvCiB7CkBAIC01NCw4ICs2MywyNSBA QCAjZGVmaW5lIF9XSU4zMl9XSU5OVCAweDA2MDAKICAgdm9pZCAqY2FjaGU7CiAgIC8qIFRo aXMgaXMgdXNlZCBieSB0aGUgSGFyZkJ1enogYmFja2VuZCB0byBzdG9yZSB0aGUgZm9udCBz Y2FsZS4gICovCiAgIGRvdWJsZSBzY2FsZTsKKyAgLyogVGhpcyBpcyB1c2VkIGJ5IERpcmVj dFdyaXRlIHRvIHN0b3JlIHRoZSBGb250RmFjZSBvYmplY3QuCisgICAgIERpcmVjdFdyaXRl IHdvcmtzIG9uIHRvcCBvZiB0aGUgSGFyZkJ1enogYmFja2VuZCwgbW9kaWZ5aW5nIHNvbWUK KyAgICAgY2FsbHMuICAqLworICB2b2lkICpkd3JpdGVfY2FjaGU7CisgIGZsb2F0IGR3cml0 ZV9mb250X3NpemU7CiB9OwogCit2b2lkICp3MzJfZm9udF9nZXRfZHdyaXRlX2NhY2hlIChz dHJ1Y3QgZm9udCAqZm9udCwgZmxvYXQgKmZvbnRfc2l6ZSkKK3sKKyAgKmZvbnRfc2l6ZSA9 ICgoc3RydWN0IHVuaXNjcmliZV9mb250X2luZm8gKikgZm9udCktPmR3cml0ZV9mb250X3Np emU7CisgIHJldHVybiAoKHN0cnVjdCB1bmlzY3JpYmVfZm9udF9pbmZvICopIGZvbnQpLT5k d3JpdGVfY2FjaGU7Cit9CisKK3ZvaWQgdzMyX2ZvbnRfc2V0X2R3cml0ZV9jYWNoZSAoc3Ry dWN0IGZvbnQgKmZvbnQsIHZvaWQgKmNhY2hlLCBmbG9hdCBmb250X3NpemUpCit7CisgICgo c3RydWN0IHVuaXNjcmliZV9mb250X2luZm8gKikgZm9udCktPmR3cml0ZV9mb250X3NpemUg PSBmb250X3NpemU7CisgICgoc3RydWN0IHVuaXNjcmliZV9mb250X2luZm8gKikgZm9udCkt PmR3cml0ZV9jYWNoZSA9IGNhY2hlOworfQorCiBpbnQgdW5pc2NyaWJlX2F2YWlsYWJsZSA9 IDA7CiAKIC8qIEVudW1Gb250RmFtaWxpZXNFeCBjYWxsYmFjay4gICovCkBAIC0yMDAsNiAr MjI2LDcgQEAgdW5pc2NyaWJlX29wZW4gKHN0cnVjdCBmcmFtZSAqZiwgTGlzcF9PYmplY3Qg Zm9udF9lbnRpdHksIGludCBwaXhlbF9zaXplKQogCiAgIC8qIEluaXRpYWxpemUgdGhlIGNh Y2hlIGZvciB0aGlzIGZvbnQuICAqLwogICB1bmlzY3JpYmVfZm9udC0+Y2FjaGUgPSBOVUxM OworICB1bmlzY3JpYmVfZm9udC0+ZHdyaXRlX2NhY2hlID0gTlVMTDsKIAogICAvKiBVbmlz Y3JpYmUgYW5kIEhhcmZCdXp6IGJhY2tlbmRzIHVzZSBnbHlwaCBpbmRpY2VzLiAgKi8KICAg dW5pc2NyaWJlX2ZvbnQtPnczMl9mb250LmdseXBoX2lkeCA9IEVUT19HTFlQSF9JTkRFWDsK QEAgLTIyMSw2ICsyNDgsNyBAQCB1bmlzY3JpYmVfY2xvc2UgKHN0cnVjdCBmb250ICpmb250 KQogICAgID0gKHN0cnVjdCB1bmlzY3JpYmVfZm9udF9pbmZvICopIGZvbnQ7CiAKICNpZmRl ZiBIQVZFX0hBUkZCVVpaCisgIHczMl9kd3JpdGVfZnJlZV9jYWNoZWRfZmFjZSAodW5pc2Ny aWJlX2ZvbnQtPmR3cml0ZV9jYWNoZSk7CiAgIGlmICh1bmlzY3JpYmVfZm9udC0+dzMyX2Zv bnQuZm9udC5kcml2ZXIgPT0gJmhhcmZidXp6X2ZvbnRfZHJpdmVyCiAgICAgICAmJiB1bmlz Y3JpYmVfZm9udC0+Y2FjaGUpCiAgICAgaGJfZm9udF9kZXN0cm95ICgoaGJfZm9udF90ICop IHVuaXNjcmliZV9mb250LT5jYWNoZSk7CkBAIC0xMzcyLDYgKzE0MDAsMTIgQEAgdzMyaGJf ZW5jb2RlX2NoYXIgKHN0cnVjdCBmb250ICpmb250LCBpbnQgYykKICAgc3RydWN0IHVuaXNj cmliZV9mb250X2luZm8gKnVuaXNjcmliZV9mb250CiAgICAgPSAoc3RydWN0IHVuaXNjcmli ZV9mb250X2luZm8gKikgZm9udDsKICAgZWFzc2VydCAodW5pc2NyaWJlX2ZvbnQtPnczMl9m b250LmZvbnQuZHJpdmVyID09ICZoYXJmYnV6el9mb250X2RyaXZlcik7CisKKyAgaWYgKHcz Ml91c2VfZGlyZWN0X3dyaXRlKCZ1bmlzY3JpYmVfZm9udC0+dzMyX2ZvbnQpKQorICAgIHsK KyAgICAgIHJldHVybiB3MzJfZHdyaXRlX2VuY29kZV9jaGFyKGZvbnQsIGMpOworICAgIH0K KwogICBoYl9mb250X3QgKmhiX2ZvbnQgPSB1bmlzY3JpYmVfZm9udC0+Y2FjaGU7CiAKICAg LyogRmlyc3QgdGltZSB3ZSB1c2UgdGhpcyBmb250IHdpdGggSGFyZkJ1enosIGNyZWF0ZSB0 aGUgaGJfZm9udF90CkBAIC0xNTMxLDYgKzE1NjUsOCBAQCBsb2FkX2hhcmZidXp6X2Z1bmNz IChITU9EVUxFIGxpYnJhcnkpCiB9CiAjZW5kaWYJLyogSEFWRV9IQVJGQlVaWiAqLwogCit2 b2lkIHczMl9pbml0aWFsaXplX2RpcmVjdF93cml0ZSAodm9pZCk7CisKIHN0YXRpYyB2b2lk CiBzeW1zX29mX3czMnVuaXNjcmliZV9mb3JfcGR1bXBlciAodm9pZCkKIHsKQEAgLTE2MjQs NSArMTY2MCw4IEBAIHN5bXNfb2ZfdzMydW5pc2NyaWJlX2Zvcl9wZHVtcGVyICh2b2lkKQog ICBoYXJmYnV6el9mb250X2RyaXZlci5jb21iaW5pbmdfY2FwYWJpbGl0eSA9IGhiZm9udF9j b21iaW5pbmdfY2FwYWJpbGl0eTsKICAgaGFyZmJ1enpfZm9udF9kcml2ZXIuYmVnaW5faGJf Zm9udCA9IHczMmhiX2JlZ2luX2ZvbnQ7CiAgIHJlZ2lzdGVyX2ZvbnRfZHJpdmVyICgmaGFy ZmJ1enpfZm9udF9kcml2ZXIsIE5VTEwpOworCisgIHczMl9pbml0aWFsaXplX2RpcmVjdF93 cml0ZSAoKTsKKwogI2VuZGlmCS8qIEhBVkVfSEFSRkJVWlogKi8KIH0KLS0gCjIuMzUuMS53 aW5kb3dzLjIKCg== --------------9JltLzaS03WOBeF5GImMdZjU-- From debbugs-submit-bounces@debbugs.gnu.org Wed Oct 16 07:02:11 2024 Received: (at 73730) by debbugs.gnu.org; 16 Oct 2024 11:02:11 +0000 Received: from localhost ([127.0.0.1]:58730 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t11n8-0002eV-Ua for submit@debbugs.gnu.org; Wed, 16 Oct 2024 07:02:11 -0400 Received: from eggs.gnu.org ([209.51.188.92]:60176) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t11n6-0002e4-1A for 73730@debbugs.gnu.org; Wed, 16 Oct 2024 07:02:09 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1t11mf-0008AX-Mn; Wed, 16 Oct 2024 07:01:41 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=iEvw1YG9B4pjFZiF+UTMK5io09AbC8WM7AXzYH5CaRs=; b=B93XL711OvbM Qq6IgaXnCYZszwlOZLhP8yxIg+8vb4b+vSmh43NjudV6KD8CQNag1s6SuNkjWZHphqd6iH+fWsg2n UtV8xydaCOtTo5/ZgGhDtHCL+uVychfCgpII/VjesO0blgZOb+c1yClEMgFTtACzBqNt5mKhkwxsu FgZ9cIEOuqYpx3VPZjyEBxRVNV05FyxYDXd7twokCQgFcY4goJ4cDILCDe2gwLNqGDdAM7FHFvHoP 5tl2qRBj08CgkhmEuwc7qvmGIATr4ulZeyY0hdrE0jEJeQ0asUd+qfqvADEz6dlguYCMASnfmdGsa h7/oXHGTtvkyqMeZ/EGDmQ==; Date: Wed, 16 Oct 2024 14:01:36 +0300 Message-Id: <861q0gqpkf.fsf@gnu.org> From: Eli Zaretskii To: Cecilio Pardo , Ken Brown In-Reply-To: <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> (message from Cecilio Pardo on Wed, 16 Oct 2024 00:18:20 +0200) Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > Date: Wed, 16 Oct 2024 00:18:20 +0200 > Cc: 73730@debbugs.gnu.org > From: Cecilio Pardo > > The attached patch works without a new font driver. Thanks a lot for working on this! I'n CC'ing Ken, who maintains the Cygwin ports of Emacs, because I think the cygw32 build would like to use this feature as well. Ken, could you please give the patch some testing and report any problems? > This requires the harfbuzz font backend to be available. > > It works by modifying the harfbuzz backend to use DirectWrite at > some points, if it is available: > > - When encoding characters: w32hb_encode_char > - When measuring text: w32font_text_extents > - When drawing text: w32font_draw > > DirectWrite is setup by calling w32_initialize_direct_write. From > that point, the function w32_use_direct_write will return true if > DirectWrite is to be used. > > The lisp variable w32-inhibit-direct-write can switches it on and off. This design SGTM, thanks. Eventually, we will need a NEWS entry for this change, and w32-inhibit-direct-write (which I'd rename to w32-inhibit-dwrite for better mnemonic value) should be mentioned there. > It builds with Mingw64 and Mingw. As mingw doesn't have the DirectWrite > includes, I had to declare a lot of things at the start of the file. > This line marks the end of that: > > /* End of dwrite_3.h definitions. */ I wonder if this is sufficiently future-proof. AFAIU, dwrite_3.h is a generated file, so it could change in the future. So maybe we should only define these on our own for mingw.org, and in MinGW64 builds use the header file they provide? Maybe even on a separate header file? This way, at least most of the users will be immune to future changes in the header file. WDYT? > * configure.ac: Add src/w32drite to W32_OBJ ^ Period missing there. > * src/w32dwrite.c: This is a new file. > (w32-initialize-direct-write): Initializes the DirectWrite library if ^^^^^^^^^^^ A nit: our style is to say "Initialize". > (w32_use_direct_write): Allows to check if DirectWrite is available ^^^^^^^^^^^^^^^ And here, just "Check" will do. > (w32_dwrite_encode_char): Replacement for harfbuzz's encode_char. > (w32_dwrite_text_extents): Replacement for w32font text_extents. > (w32_dwrite_draw): Replacement for w32font draw. > (w32_dwrite_free_cached_face): Used on the font deletion process to > also delete DirectWrite data. > (verify_hr): Verify COM method results. These are new functions, so please say so. Like this: (w32_dwrite_encode_char): New function, implements encode_char for DirectWrite. > * src/w32font.c: > (w32font_text_extents): If DirectWrite is enabled, call This and similar entries should be formatted like so: * src/w32font.c (w32font_text_extents): If DirectWrite is enabled, ... We only break the line between the file name and the function name if the latter is too long to be placed on the same line. > * src/w32uniscribe.c: > (w32hb_encode_char): If DirectWrite is enabled, call > w32_dwrite_encode_char. Same here. > --- /dev/null > +++ b/src/w32dwrite.c > @@ -0,0 +1,930 @@ > +/* Support for using DirectWrite on MS-Windows to draw text. This allows > + for color fonts. ^^ Two spaces between sentences, per our conventions. > +/* > + This requires the harfbuzz font backend to be available. ^^^^^^^^ HarfBuzz, here and elsewhere (except in code). > +#include > +#include > +#include > + > +#include "frame.h" > +#include "w32font.h" > +#include "w32common.h" > +#include "w32term.h" > + > +#include "initguid.h" > +#include > +#include That should be . And I think the last 3 includes should be before our Emacs-specific header files. > +/* The following definitions would be included from dwrite_3.h, but it > + is not available when building with MinGW. Methods that we don't use ^^^^^ Please say "mingw.org's MinGW", to make this more clear. > + are declared with the UNUSED macro, to avoid bringing in more types > + that would need to be declared. > +*/ > + > +#define UNUSED(name) void (STDMETHODCALLTYPE *name)(void) Can we use something more specific than UNUSED here? Like W32_UNUSED or maybe EMACS_DWRITE_UNUSED? > +/* Function prototypes. */ > +void w32_initialize_direct_write (void); > +bool w32_use_direct_write (struct w32font_info *w32font); > +void w32_dwrite_draw (HDC hdc, int x, int y, unsigned *glyphs, int len, > + COLORREF color, struct font *font ); > +void w32_dwrite_text_extents (struct font *font, const unsigned *code, > + int nglyphs, struct font_metrics *metrics); > +unsigned w32_dwrite_encode_char (struct font *font, int c); > +void w32_dwrite_free_cached_face(void *cache); > + > +/* This two functions are on w32uninscribe.c */ > +void *w32_font_get_dwrite_cache (struct font *font, float *font_size); > +void w32_font_set_dwrite_cache (struct font *font, void *cache, > + float font_size); These prototypes should go to w32font.h. Then you won't need to repeat them in other source files. > +static void > +verify_hr (HRESULT hr, const char *msg) > +{ > + if (FAILED (hr)) > + emacs_abort (); > +} I think aborting is too harsh here. We could use eassert instead (in which case it will abort, but only in a build with --enable-checking). We could also augment that with DebPrint in important places, which will show a message when a production build of Emacs is run under a debugger. In a production build (i.e., when eassert compiles to nothing), it is better to disable the use of DirectWrite when one of these problems happen, if you detect that early enough, and fall back to HarfBuzz instead. Is that reasonable here? > + return abs(logfont.lfHeight); ^ SPC missing there. > +void > +w32_dwrite_free_cached_face(void *cache) ^ And here (and in a few places elsewhere in the patch). > +static float > +convert_metrics_sz( int sz, float font_size, int units_per_em ) > +{ > + return (float)sz * font_size / units_per_em; ^^ Here also. > + dwrite_font_face->lpVtbl-> > + GetMetrics (dwrite_font_face, &dwrite_font_metrics); It is better not to break at the dereference operator: dwrite_font_face->lpVtbl->GetMetrics (dwrite_font_face, &dwrite_font_metrics); Same in other places in the patch. > + CreateFactory create_factory > + = (CreateFactory) get_proc_addr (direct_write, "DWriteCreateFactory"); It is better to call the procedure pointers by names that are closer to their names in the library. In this case, I'd use dw_create_factory instead of a more general create_factory. > + /* We never Release this, get_bitmap_render_target reuses it. */ ^^^^^^^ "release", in lower case. > + DWRITE_GLYPH_RUN glyph_run; > + glyph_run.fontFace = dwrite_font_face; > + glyph_run.fontEmSize = font_size; > + glyph_run.glyphIndices = indices; > + glyph_run.glyphCount = len; > + glyph_run.isSideways = false; > + glyph_run.bidiLevel = 0; ^^^^^^^^^^^^^ Is this because otherwise DirectWrite will possibly reorder the glyphs or something? Did you test this with R2L text, e.g. by displaying TUTORIAL.he? I did try, and it looks OK, but are there any color fonts that cover the Hebrew block, so I could be sure everything works in that case? More generally, what color fonts can be used with this build on Windows for characters other than Emoji, in addition to Segoe UI Emoji? > + /* No color. Just draw the GlyphRun. */ ^^ Two spaces. > + /* If there were color glyphs, layers contains a containts a list ^^^^^^^^^^ ^^^^^^^^^^^ One of these is redundant. > --- a/src/w32font.c > +++ b/src/w32font.c > @@ -55,6 +55,13 @@ #define VIETNAMESE_CHARSET 163 > #define JOHAB_CHARSET 130 > #endif > > +/* Function prototypes from w32write.c */ ^^^^^^^^^^ w32dwrite.c > +bool w32_use_direct_write (struct w32font_info *w32font); > +void w32_dwrite_draw (HDC hdc, int x, int y, unsigned *glyphs, int len, > + COLORREF color, struct font *font ); > +void w32_dwrite_text_extents (struct font *font, const unsigned *code, > + int nglyphs, struct font_metrics *metrics); > + If you put them on w32font.h, this won't be needed. > --- a/src/w32uniscribe.c > +++ b/src/w32uniscribe.c > @@ -44,6 +44,15 @@ #define _WIN32_WINNT 0x0600 > #include "pdumper.h" > #include "w32common.h" > > +/* Function prototypes from w32dwrite.c */ > +bool w32_use_direct_write (struct w32font_info *w32font); > +unsigned w32_dwrite_encode_char (struct font *font, int c); > +void w32_dwrite_free_cached_face (void *cache); Likewise: if these are in w32font.h, you won't need this. > +/* Function prototypes from this file */ > +void *w32_font_get_dwrite_cache (struct font *font, float *font_size); > +void w32_font_set_dwrite_cache (struct font *font, void *cache, float font_size); Why aren't these functions defined in w32dwrite.c? > +void *w32_font_get_dwrite_cache (struct font *font, float *font_size) We break the line between the return type and the function name: void * w32_font_get_dwrite_cache (struct font *font, float *font_size) > + if (w32_use_direct_write(&uniscribe_font->w32_font)) > + { > + return w32_dwrite_encode_char(font, c); > + } No need for braces if you have just one statement. Compiling this with mingw.org's MinGW GCC 9.2.0, I get the following warnings: In file included from w32dwrite.c:44: w32dwrite.c:123:13: warning: 'IID_IDWriteBitmapRenderTarget1' initialized and declared 'extern' 123 | DEFINE_GUID( CC w32inevt.oIID_IDWriteBitmapRenderTarget1 , 0x791e8298, 0x3ef3, 0x4230, 0x98,0x80, 0xc9,0xbd,0xec,0xc4,0x20,0x64); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ w32dwrite.c:124:13: warning: 'IID_IDWriteFactory2' initialized and declared 'extern' 124 | DEFINE_GUID(IID_IDWriteFactory2, 0x0439fc60, 0xca44, 0x4994, 0x8d,0xee, 0x3a,0x9a,0xf7,0xb7,0x32,0xec); | ^~~~~~~~~~~~~~~~~~~ w32dwrite.c:125:13: warning: 'IID_IDWriteFactory' initialized and declared 'extern' 125 | DEFINE_GUID(IID_IDWriteFactory, 0xb859ee5a, 0xd838, 0x4b5b, 0xa2,0xe8, 0x1a,0xdc,0x7d,0x93,0xdb,0x48); | ^~~~~~~~~~~~~~~~~~ From debbugs-submit-bounces@debbugs.gnu.org Wed Oct 16 07:33:21 2024 Received: (at 73730) by debbugs.gnu.org; 16 Oct 2024 11:33:21 +0000 Received: from localhost ([127.0.0.1]:58765 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t12HI-00044b-On for submit@debbugs.gnu.org; Wed, 16 Oct 2024 07:33:21 -0400 Received: from eggs.gnu.org ([209.51.188.92]:38154) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t12HF-00044K-TB for 73730@debbugs.gnu.org; Wed, 16 Oct 2024 07:33:18 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1t12Gq-00042O-7Q; Wed, 16 Oct 2024 07:32:52 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=OFb/J9QKakzd/9p7N213OlWwfpJFy7D67VBT2pEM0W0=; b=WEO3b2d9ANFd J7ifzlh74MwTV2lUBwq+edUgKyfqp3rnnkAaQcZ5pd+98OpvHiTDvtcBwfzgle3RDErMnueTsUc2q j+iHjXERuT5nSbhTUiiiE3kJZIv7hCaquY1Q9uq5O28iHCnEKemPyq70dQ09HkNlU2bWl1yurE8ZV S/WV8SqpNqC1I4pR2D+Zxgouiq1+NfHxlQgDWkdtSKx3saTgPqZDWf4IuE0ZrCCOZvFS11n4nmw3+ gRuWTSx2Ku2H5uvm0Cji5bf1zEtbnsfwFQ2gjs1CDdCTECMhiTLMWfrYZeWrzVfr+DRyYYrQPpX/n ZbqmF2JI/T8Z801ZOe6SHg==; Date: Wed, 16 Oct 2024 14:32:47 +0300 Message-Id: <86zfn4p9k0.fsf@gnu.org> From: Eli Zaretskii To: cpardo@imayhem.com In-Reply-To: <861q0gqpkf.fsf@gnu.org> (message from Eli Zaretskii on Wed, 16 Oct 2024 14:01:36 +0300) Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org, kbrown@cornell.edu X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > Cc: 73730@debbugs.gnu.org > Date: Wed, 16 Oct 2024 14:01:36 +0300 > From: Eli Zaretskii > > > Date: Wed, 16 Oct 2024 00:18:20 +0200 > > Cc: 73730@debbugs.gnu.org > > From: Cecilio Pardo > > > > The attached patch works without a new font driver. > > Thanks a lot for working on this! And here's the first bug report after applying this patch: emacs -Q M-: (w32-find-non-USB-fonts) RET This pops up the Emacs Abort dialog. The backtrace and some additional information are below. The error from GetGdiCompatibleGlyphMetrics (0x80070057) seems to be E_INVALIDARG. Perhaps if w32_dwrite_text_extents fails, it should not abort, but instead fall back on the old code? If you cannot reproduce this (maybe it depends on what fonts are installed), feel free to ask me to provide more information or try some solutions. In case it matters, this is a 32-bit build configured as --with-wide-int --without-native-compilation. Thread 1 received signal SIGTRAP, Trace/breakpoint trap. 0x76611813 in KERNELBASE!DebugBreak () from C:\WINDOWS\SysWOW64\KernelBase.dll (gdb) bt #0 0x76611813 in KERNELBASE!DebugBreak () from C:\WINDOWS\SysWOW64\KernelBase.dll #1 0x012f47e1 in emacs_abort () at w32fns.c:11570 #2 0x013221ba in verify_hr (hr=-2147024809, msg=0x18cbe58 "Failed to GetGdiCompatibleGlyphMetrics") at w32dwrite.c:504 #3 0x01322430 in text_extents_internal (dwrite_font_face=0x9600720, font_size=0, code=0xbfc6c0, nglyphs=1, metrics=0xbfc6b6) at w32dwrite.c:588 #4 0x013226d4 in w32_dwrite_text_extents (font=0xbf3e9f0, code=0xbfc6c0, nglyphs=1, metrics=0xbfc6b6) at w32dwrite.c:654 #5 0x012fb29a in w32font_text_extents (font=0xbf3e9f0, code=0xbfc6c0, nglyphs=1, metrics=0xbfc6b6) at w32font.c:464 #6 0x01229249 in Ffont_get_glyphs (font_object=XIL(0xa00000000bf3e9f0), from=make_fixnum(0), to=make_fixnum(3), object=XIL(0xa00000000bc5cd60)) at font.c:5454 #7 0x011f1176 in funcall_subr (subr=0x187cb40 , numargs=4, args=0xa2eb2a0) at eval.c:3144 #8 0x0125eeb2 in exec_byte_code (fun=XIL(0xa00000000bd9e450), args_template=257, nargs=1, args=0xbfcf70) at bytecode.c:813 #9 0x011f198b in funcall_lambda (fun=XIL(0xa00000000bd9e450), nargs=1, arg_vector=0xbfcf68) at eval.c:3229 #10 0x011f0a51 in funcall_general (fun=XIL(0xa00000000bd9e450), numargs=1, args=0xbfcf68) at eval.c:3021 #11 0x011f0d7a in Ffuncall (nargs=2, args=0xbfcf60) at eval.c:3070 #12 0x01206ebc in mapcar1 (leni=76, vals=0x0, fn=XIL(0xa00000000bd9e450), seq=XIL(0xc000000000f3ec30)) at fns.c:3370 #13 0x01207af8 in Fmapc (function=XIL(0xa00000000bd9e450), sequence=XIL(0xc000000000f3ec30)) at fns.c:3507 #14 0x011f10c7 in funcall_subr (subr=0x187bb40 , numargs=2, args=0xa2eb1f0) at eval.c:3140 #15 0x0125eeb2 in exec_byte_code (fun=XIL(0xa000000009d8ab78), args_template=0, nargs=0, args=0xa2eb200) at bytecode.c:813 #16 0x011f198b in funcall_lambda (fun=XIL(0xa000000009d8aa58), nargs=0, arg_vector=0xbfd6d0) at eval.c:3229 #17 0x011f17a6 in apply_lambda (fun=XIL(0xa000000009d8aa58), args=XIL(0), count=480) at eval.c:3192 #18 0x011ef553 in eval_sub (form=XIL(0xc000000000efa680)) at eval.c:2622 #19 0x011ee62c in Feval (form=XIL(0xc000000000efa680), lexical=XIL(0x30)) at eval.c:2439 #20 0x011f10c7 in funcall_subr (subr=0x187a1c0 , numargs=2, args=0xa2eb1a0) at eval.c:3140 #21 0x0125eeb2 in exec_byte_code (fun=XIL(0xa0000000098cdce8), args_template=513, nargs=2, args=0xa2eb2f8) at bytecode.c:813 #22 0x011f198b in funcall_lambda (fun=XIL(0xa00000000bd346a0), nargs=0, arg_vector=0xbfe040) at eval.c:3229 #23 0x011f0a51 in funcall_general (fun=XIL(0xa00000000bd346a0), numargs=0, args=0xbfe040) at eval.c:3021 #24 0x011f0d7a in Ffuncall (nargs=1, args=0xbfe038) at eval.c:3070 #25 0x011e67ba in call0 (fn=XIL(0xa00000000bd346a0)) at lisp.h:3528 #26 0x011eb1e1 in Fhandler_bind_1 (nargs=3, args=0xa2eb128) at eval.c:1463 #27 0x011f1523 in funcall_subr (subr=0x187a080 , numargs=3, args=0xa2eb128) at eval.c:3161 #28 0x0125eeb2 in exec_byte_code (fun=XIL(0xa00000000997d720), args_template=1025, nargs=4, args=0xbfe9e0) at bytecode.c:813 #29 0x011f198b in funcall_lambda (fun=XIL(0xa00000000997d720), nargs=4, arg_vector=0xbfe9c0) at eval.c:3229 #30 0x011f0a51 in funcall_general (fun=XIL(0xa00000000997d720), numargs=4, args=0xbfe9c0) at eval.c:3021 #31 0x011f0d7a in Ffuncall (nargs=5, args=0xbfe9b8) at eval.c:3070 #32 0x011e1c1a in Ffuncall_interactively (nargs=5, args=0xbfe9b8) at callint.c:250 #33 0x011f1523 in funcall_subr (subr=0x18798c0 , numargs=5, args=0xbfe9b8) at eval.c:3161 #34 0x011f09ea in funcall_general (fun=XIL(0xa0000000018798c0), numargs=5, args=0xbfe9b8) at eval.c:3017 #35 0x011f0d7a in Ffuncall (nargs=6, args=0xbfe9b0) at eval.c:3070 #36 0x011efedd in Fapply (nargs=3, args=0xbfebd8) at eval.c:2742 #37 0x011e226a in Fcall_interactively (function=XIL(0x7fcb530), record_flag=XIL(0), keys=XIL(0xa000000009ef2300)) at callint.c:342 #38 0x011f110f in funcall_subr (subr=0x1879900 , numargs=3, args=0xa2eb078) at eval.c:3142 #39 0x0125eeb2 in exec_byte_code (fun=XIL(0xa000000009f0ad40), args_template=1025, nargs=1, args=0xbff7a0) at bytecode.c:813 #40 0x011f198b in funcall_lambda (fun=XIL(0xa000000009f0ad40), nargs=1, arg_vector=0xbff798) at eval.c:3229 #41 0x011f0a51 in funcall_general (fun=XIL(0xa000000009f0ad40), numargs=1, args=0xbff798) at eval.c:3021 #42 0x011f0d7a in Ffuncall (nargs=2, args=0xbff790) at eval.c:3070 #43 0x010f681d in command_loop_1 () at keyboard.c:1545 #44 0x011eba71 in internal_condition_case (bfun=0x10f5c2d , handlers=XIL(0x90), hfun=0x10f4c86 ) at eval.c:1598 #45 0x010f5692 in command_loop_2 (handlers=XIL(0x90)) at keyboard.c:1163 #46 0x011eabee in internal_catch (tag=XIL(0x12750), func=0x10f565b , arg=XIL(0x90)) at eval.c:1277 #47 0x010f55fd in command_loop () at keyboard.c:1141 #48 0x010f46e6 in recursive_edit_1 () at keyboard.c:749 #49 0x010f4984 in Frecursive_edit () at keyboard.c:832 #50 0x010efaa5 in main (argc=2, argv=0x7c72570) at emacs.c:2624 Lisp Backtrace: "font-get-glyphs" (0xa2eb2a0) 0xbd9e450 PVEC_CLOSURE "mapc" (0xa2eb1f0) "w32-find-non-USB-fonts" (0xbfd6d0) "eval" (0xa2eb1a0) 0xbd34678 PVEC_CLOSURE 0xbd346a0 PVEC_CLOSURE "handler-bind-1" (0xa2eb128) "eval-expression" (0xbfe9c0) "funcall-interactively" (0xbfe9b8) "call-interactively" (0xa2eb078) "command-execute" (0xbff798) (gdb) fr 6 #6 0x01229249 in Ffont_get_glyphs (font_object=XIL(0xa00000000bf3e9f0), from=make_fixnum(0), to=make_fixnum(3), object=XIL(0xa00000000bc5cd60)) at font.c:5454 5454 font->driver->text_extents (font, &code, 1, &metrics); (gdb) pp font_object # (gdb) fr 3 #3 0x01322430 in text_extents_internal (dwrite_font_face=0x9600720, font_size=0, code=0xbfc6c0, nglyphs=1, metrics=0xbfc6b6) at w32dwrite.c:588 588 verify_hr (hr, "Failed to GetGdiCompatibleGlyphMetrics"); (gdb) p/x hr $1 = 0x80070057 (gdb) fr 5 #5 0x012fb29a in w32font_text_extents (font=0xbf3e9f0, code=0xbfc6c0, nglyphs=1, metrics=0xbfc6b6) at w32font.c:464 464 w32_dwrite_text_extents (font, code, nglyphs, metrics); (gdb) p *w32_font $2 = { font = { header = { size = 1661034513 }, props = {XIL(0x9b40), XIL(0xe910), XIL(0xa5622a0), XIL(0x103b0), XIL(0xb010), make_fixnum(20544), make_fixnum(25632), make_fixnum(25664), make_fixnum(0), XIL(0), make_fixnum(0), XIL(0), XIL(0xc00000000be75600), XIL(0), XIL(0x800000000bce6cf0), XIL(0x800000000bce6ce0), XIL(0)}, min_width = 11, max_width = 76, pixel_size = 0, height = 39, space_width = 11, average_width = 11, ascent = 26, descent = 13, underline_thickness = 1, underline_position = 2, vertical_centering = false, baseline_offset = 0, relative_compose = 0, default_ascent = 26, encoding_charset = -1, repertory_charset = -1, driver = 0x19c78a0 }, metrics = { tmHeight = 39, tmAscent = 26, tmDescent = 13, tmInternalLeading = 23, tmExternalLeading = 0, tmAveCharWidth = 11, tmMaxCharWidth = 76, tmWeight = 400, tmOverhang = 0, tmDigitizedAspectX = 96, tmDigitizedAspectY = 96, tmFirstChar = 0 L'\000', tmLastChar = 65071 L'\xfe2f', tmDefaultChar = 1 L'\001', tmBreakChar = 2 L'\002', tmItalic = 0 '\000', tmUnderlined = 0 '\000', tmStruckOut = 0 '\000', tmPitchAndFamily = 39 '\'', tmCharSet = 0 '\000' }, glyph_idx = 16, cached_metrics = 0x0, n_cache_blocks = 0, hfont = 0x2d0a1e66 } (gdb) From debbugs-submit-bounces@debbugs.gnu.org Wed Oct 16 17:36:09 2024 Received: (at 73730) by debbugs.gnu.org; 16 Oct 2024 21:36:10 +0000 Received: from localhost ([127.0.0.1]:60703 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t1Bgd-0006fz-LV for submit@debbugs.gnu.org; Wed, 16 Oct 2024 17:36:09 -0400 Received: from mail.imayhem.com ([82.223.54.191]:48253 helo=zealous-pike.82-223-54-191.plesk.page) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t1BgZ-0006fQ-CZ for 73730@debbugs.gnu.org; Wed, 16 Oct 2024 17:36:05 -0400 Received: from [192.168.68.105] (111.red-88-21-7.staticip.rima-tde.net [88.21.7.111]) by zealous-pike.82-223-54-191.plesk.page (Postfix) with ESMTPSA id 220D68010A; Wed, 16 Oct 2024 21:35:36 +0000 (UTC) Authentication-Results: zealous-pike.82-223-54-191.plesk.page; spf=pass (sender IP is 88.21.7.111) smtp.mailfrom=cpardo@imayhem.com smtp.helo=[192.168.68.105] Received-SPF: pass (zealous-pike.82-223-54-191.plesk.page: connection is authenticated) Content-Type: multipart/mixed; boundary="------------CMM8u6zkSLlV8TvGrxxH8USa" Message-ID: <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> Date: Wed, 16 Oct 2024 23:35:34 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows To: Eli Zaretskii , Ken Brown References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> Content-Language: es-ES From: Cecilio Pardo In-Reply-To: <861q0gqpkf.fsf@gnu.org> X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) This is a multi-part message in MIME format. --------------CMM8u6zkSLlV8TvGrxxH8USa Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Still not done with this, but I am sending a new patch to fix the bug with w32-find-non-USB-fonts. It calls text_extents with a font of size 0. Checking for that seems to solve the problem. Also, most of the style changes are done. - With MingGW64, use dwrite_3.h normally. - renamed w32-inhibit-direct-write to w32-inhibit-dwrite, and some other things. BTW, why does that variable show as undocumented with describe-variables? What am I doing wrong? Pending: - NEWS entry. - Instead of aborting on failure, just disable DirectWrite and let emacs continue. This will take some work. - mingw warnings. > >> + glyph_run.bidiLevel = 0; > ^^^^^^^^^^^^^ > Is this because otherwise DirectWrite will possibly reorder the > glyphs or something? Did you test this with R2L text, e.g. by > displaying TUTORIAL.he? I did try, and it looks OK, but are there any > color fonts that cover the Hebrew block, so I could be sure everything > works in that case? > > More generally, what color fonts can be used with this build on > Windows for characters other than Emoji, in addition to Segoe UI > Emoji? The documentation describes this field as the "implicit resolved level of the glyph run". Odd levels indicate RTL, and the function asks for the right side position as origin, so I think they would be reordered. As there is no reference to bidi in w32font.c, I assumed glyphs reach this layer prepared to be rendered ltr. I think the only color font that Windows has is the emoji one. I'll try to find some other to test this. >> +void *w32_font_get_dwrite_cache (struct font *font, float *font_size); >> +void w32_font_set_dwrite_cache (struct font *font, void *cache, float font_size); > > Why aren't these functions defined in w32dwrite.c? They need to know about the uniscribe_font struct, which is defined there. --------------CMM8u6zkSLlV8TvGrxxH8USa Content-Type: text/plain; charset=UTF-8; name="0001-Implement-drawing-text-with-DirectWrite-on-MS-Window.patch" Content-Disposition: attachment; filename*0="0001-Implement-drawing-text-with-DirectWrite-on-MS-Window.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSBmNTk1YmVkM2U5ODRiNjU3NGU1OTQ2N2IyY2Q4M2VmZTM1MWZiYzVjIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBDZWNpbGlvIFBhcmRvIDxjcGFyZG9AaW1heWhlbS5j b20+CkRhdGU6IFdlZCwgOSBPY3QgMjAyNCAxMTo0MDoyOCArMDIwMApTdWJqZWN0OiBbUEFU Q0hdIEltcGxlbWVudCBkcmF3aW5nIHRleHQgd2l0aCBEaXJlY3RXcml0ZSBvbiBNUy1XaW5k b3dzLgoKVGhpcyBhZGRzIHN1cHBvcnQgZm9yIGNvbG9yIGZvbnRzLgoKKiBjb25maWd1cmUu YWM6IEFkZCBzcmMvdzMyZHJpdGUgdG8gVzMyX09CSi4KKiBzcmMvdzMyZHdyaXRlLmM6IFRo aXMgaXMgYSBuZXcgZmlsZS4KKHczMi1pbml0aWFsaXplLWRpcmVjdC13cml0ZSk6IE5ldyBm dW5jdGlvbiwgaW5pdGlhbGl6ZSB0aGUgRGlyZWN0V3JpdGUKbGlicmFyeSBpZiBpdCBpcyBh dmFpbGFibGUsIGFuZCByZXF1aXJlZCBnbG9iYWwgdmFyaWFibGVzLgoodzMyX3VzZV9kaXJl Y3Rfd3JpdGUpOiBOZXcgZnVuY3Rpb24sIGNoZWNrIGlmIERpcmVjdFdyaXRlIGlzIGF2YWls YWJsZQphbmQgYWN0aXZhdGVkIGJ5IHRoZSB1c2VyLgoodzMyX2R3cml0ZV9lbmNvZGVfY2hh cik6IE5ldyBmdW5jdGlvbiwgcmVwbGFjZW1lbnQgZm9yIGhhcmZidXp6J3MKZW5jb2RlX2No YXIuCih3MzJfZHdyaXRlX3RleHRfZXh0ZW50cyk6IE5ldyBmdW5jdGlvbiwgcmVwbGFjZW1l bnQgZm9yIHczMmZvbnQKdGV4dF9leHRlbnRzLgoodzMyX2R3cml0ZV9kcmF3KTogTmV3IGZ1 bmN0aW9uLCByZXBsYWNlbWVudCBmb3IgdzMyZm9udCBkcmF3LgoodzMyX2R3cml0ZV9mcmVl X2NhY2hlZF9mYWNlKTogTmV3IGZ1bmN0aW9uLCB1c2VkIG9uIHRoZSBmb250IGRlbGV0aW9u CnByb2Nlc3MgdG8gYWxzbyBkZWxldGUgRGlyZWN0V3JpdGUgZGF0YS4KKHZlcmlmeV9ocik6 IE5ldyBmdW5jdGlvbiwgdmVyaWZ5IENPTSBtZXRob2QgcmVzdWx0cy4KKiBzcmMvdzMyZm9u dC5jICh3MzJmb250X3RleHRfZXh0ZW50cyk6IElmIERpcmVjdFdyaXRlIGlzIGVuYWJsZWQs IGNhbGwKdzMyX2R3cml0ZV90ZXh0X2V4dGVudHMuCih3MzJmb250X2RyYXcpOiBJZiBEaXJl Y3RXcml0ZSBpcyBlbmFibGVkLCBjYWxsIHczMl9kd3JpdGVfZHJhdy4KKiBzcmMvdzMydW5p c2NyaWJlLmM6ICh3MzJoYl9lbmNvZGVfY2hhcik6IElmIERpcmVjdFdyaXRlIGlzIGVuYWJs ZWQsCmNhbGwgdzMyX2R3cml0ZV9lbmNvZGVfY2hhci4KKHN5bXNfb2ZfdzMydW5pc2NyaWJl X2Zvcl9wZHVtcGVyKTogSW5pdGlhbGl6ZSBEaXJlY3RXcml0ZS4KKHVuaXNjcmliZV9jbG9z ZSk6IEZyZWUgRGlyZWN0V3JpdGUgZGF0YSBmb3IgdGhlIGZvbnQuCi0tLQogY29uZmlndXJl LmFjICAgICAgIHwgICAyICstCiBzcmMvdzMyZHdyaXRlLmMgICAgfCA5MjggKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBzcmMvdzMyZm9udC5jICAg ICAgfCAgNTMgKystCiBzcmMvdzMyZm9udC5oICAgICAgfCAgMTMgKwogc3JjL3czMnVuaXNj cmliZS5jIHwgIDMwICsrCiA1IGZpbGVzIGNoYW5nZWQsIDEwMTIgaW5zZXJ0aW9ucygrKSwg MTQgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3czMmR3cml0ZS5jCgpk aWZmIC0tZ2l0IGEvY29uZmlndXJlLmFjIGIvY29uZmlndXJlLmFjCmluZGV4IDhhNWJhN2Ri M2QxLi5iYTljZDhmMGNkNSAxMDA2NDQKLS0tIGEvY29uZmlndXJlLmFjCisrKyBiL2NvbmZp Z3VyZS5hYwpAQCAtMzE3Miw3ICszMTcyLDcgQEAgQUNfREVGVU4KICAgQUNfQ0hFQ0tfVE9P TChbV0lORFJFU10sIFt3aW5kcmVzXSwKICAgICAgICAgICAgICAgICBbQUNfTVNHX0VSUk9S KFtObyByZXNvdXJjZSBjb21waWxlciBmb3VuZC5dKV0pCiAgIFczMl9PQko9InczMmZucy5v IHczMm1lbnUubyB3MzJyZWcubyB3MzJmb250Lm8gdzMydGVybS5vIgotICBXMzJfT0JKPSIk VzMyX09CSiB3MzJ4Zm5zLm8gdzMyc2VsZWN0Lm8gdzMydW5pc2NyaWJlLm8gdzMyY3lnd2lu eC5vIgorICBXMzJfT0JKPSIkVzMyX09CSiB3MzJ4Zm5zLm8gdzMyc2VsZWN0Lm8gdzMydW5p c2NyaWJlLm8gdzMyZHdyaXRlLm8gdzMyY3lnd2lueC5vIgogICBFTUFDU1JFUz0iZW1hY3Mu cmVzIgogICBjYXNlICIkY2Fub25pY2FsIiBpbgogICAgIHg4Nl82NC0qLSopIEVNQUNTX01B TklGRVNUPSJlbWFjcy14NjQubWFuaWZlc3QiIDs7CmRpZmYgLS1naXQgYS9zcmMvdzMyZHdy aXRlLmMgYi9zcmMvdzMyZHdyaXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMDAwMDAuLjFmODEwMmRlNzY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3czMmR3cml0 ZS5jCkBAIC0wLDAgKzEsOTI4IEBACisvKiBTdXBwb3J0IGZvciB1c2luZyBEaXJlY3RXcml0 ZSBvbiBNUy1XaW5kb3dzIHRvIGRyYXcgdGV4dC4gIFRoaXMKKyAgIGFsbG93cyBmb3IgY29s b3IgZm9udHMuCisgICBDb3B5cmlnaHQgKEMpIDIwMjQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0 aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBFbWFjcy4KKworR05VIEVt YWNzIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBt b2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBl aXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKK3lvdXIgb3B0aW9uKSBh bnkgbGF0ZXIgdmVyc2lvbi4KKworR05VIEVtYWNzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBo b3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7 IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZ IG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBo YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UK K2Fsb25nIHdpdGggR05VIEVtYWNzLiAgSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5v cmcvbGljZW5zZXMvPi4gICovCisKKy8qCisgIFRoaXMgcmVxdWlyZXMgdGhlIEhhcmZCdXp6 IGZvbnQgYmFja2VuZCB0byBiZSBhdmFpbGFibGUuCisKKyAgSXQgd29ya3MgYnkgbW9kaWZ5 aW5nIHRoZSBIYXJmQnV6eiBiYWNrZW5kIHRvIHVzZSBEaXJlY3RXcml0ZSBhdAorICBzb21l IHBvaW50cywgaWYgaXQgaXMgYXZhaWxhYmxlOgorCisgIC0gV2hlbiBlbmNvZGluZyBjaGFy YWN0ZXJzOiB3MzJoYl9lbmNvZGVfY2hhcgorICAtIFdoZW4gbWVhc3VyaW5nIHRleHQ6IHcz MmZvbnRfdGV4dF9leHRlbnRzCisgIC0gV2hlbiBkcmF3aW5nIHRleHQ6IHczMmZvbnRfZHJh dworCisgIERpcmVjdFdyaXRlIGlzIHNldHVwIGJ5IGNhbGxpbmcgdzMyX2luaXRpYWxpemVf ZGlyZWN0X3dyaXRlLiAgRnJvbQorICB0aGF0IHBvaW50LCB0aGUgZnVuY3Rpb24gdzMyX3Vz ZV9kaXJlY3Rfd3JpdGUgd2lsbCByZXR1cm4gdHJ1ZSBpZgorICBEaXJlY3RXcml0ZSBpcyB0 byBiZSB1c2VkLgorCisgIERpcmVjdFdyaXRlIGlzIGF2YWlsYWJsZSBzaW5jZSBXaW5kb3dz IDcsIGJ1dCB3ZSBkb24ndCBhY3RpdmF0ZSBpdCBvbgorICB2ZXJzaW9ucyBiZWZvcmUgOC4x LCBiZWNhdXNlIGNvbG9yIGZvbnRzIGFyZSBvbmx5IGF2YWlsYWJsZSBzaW5jZSB0aGF0LiAg Ki8KKworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1 ZGUgPHdpbmRvd3MuaD4KKworI2luY2x1ZGUgPGluaXRndWlkLmg+CisjaW5jbHVkZSA8b2xl Mi5oPgorI2luY2x1ZGUgPHVua253bi5oPgorCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNs dWRlICJ3MzJmb250LmgiCisjaW5jbHVkZSAidzMyY29tbW9uLmgiCisjaW5jbHVkZSAidzMy dGVybS5oIgorCisjaWZuZGVmIE1JTkdXX1c2NAorCisvKiBUaGUgZm9sbG93aW5nIGRlZmlu aXRpb25zIHdvdWxkIGJlIGluY2x1ZGVkIGZyb20gZHdyaXRlXzMuaCwgYnV0IGl0CisgICBp cyBub3QgYXZhaWxhYmxlIHdoZW4gYnVpbGRpbmcgd2l0aCBtaW5ndy5vcmcncyBNaW5HVy4g IE1ldGhvZHMgdGhhdAorICAgd2UgZG9uJ3QgdXNlIGFyZSBkZWNsYXJlZCB3aXRoIHRoZSBF TUFDU19EV1JJVEVfVU5VU0VEIG1hY3JvLCB0bworICAgYXZvaWQgYnJpbmdpbmcgaW4gbW9y ZSB0eXBlcyB0aGF0IHdvdWxkIG5lZWQgdG8gYmUgZGVjbGFyZWQuCisqLworCisjZGVmaW5l IEVNQUNTX0RXUklURV9VTlVTRUQobmFtZSkgdm9pZCAoU1RETUVUSE9EQ0FMTFRZUEUgKm5h bWUpKHZvaWQpCisKKyNkZWZpbmUgRFdSSVRFX0VfTk9DT0xPUiBfSFJFU1VMVF9UWVBFREVG XygweDg4OTg1MDBDTCkKKwordHlwZWRlZiBlbnVtIERXUklURV9QSVhFTF9HRU9NRVRSWSB7 CisgICAgRFdSSVRFX1BJWEVMX0dFT01FVFJZX0ZMQVQgPSAwLAorICAgIERXUklURV9QSVhF TF9HRU9NRVRSWV9SR0IgPSAxLAorICAgIERXUklURV9QSVhFTF9HRU9NRVRSWV9CR1IgPSAy Cit9IERXUklURV9QSVhFTF9HRU9NRVRSWTsKKwordHlwZWRlZiBlbnVtIERXUklURV9SRU5E RVJJTkdfTU9ERSB7CisgICAgRFdSSVRFX1JFTkRFUklOR19NT0RFX0RFRkFVTFQgPSAwLAor ICAgIERXUklURV9SRU5ERVJJTkdfTU9ERV9BTElBU0VEID0gMSwKKyAgICBEV1JJVEVfUkVO REVSSU5HX01PREVfR0RJX0NMQVNTSUMgPSAyLAorICAgIERXUklURV9SRU5ERVJJTkdfTU9E RV9HRElfTkFUVVJBTCA9IDMsCisgICAgRFdSSVRFX1JFTkRFUklOR19NT0RFX05BVFVSQUwg PSA0LAorICAgIERXUklURV9SRU5ERVJJTkdfTU9ERV9OQVRVUkFMX1NZTU1FVFJJQyA9IDUs CisgICAgRFdSSVRFX1JFTkRFUklOR19NT0RFX09VVExJTkUgPSA2Cit9IERXUklURV9SRU5E RVJJTkdfTU9ERTsKKwordHlwZWRlZiBlbnVtIERXUklURV9NRUFTVVJJTkdfTU9ERSB7Cisg ICAgRFdSSVRFX01FQVNVUklOR19NT0RFX05BVFVSQUwgPSAwLAorICAgIERXUklURV9NRUFT VVJJTkdfTU9ERV9HRElfQ0xBU1NJQyA9IDEsCisgICAgRFdSSVRFX01FQVNVUklOR19NT0RF X0dESV9OQVRVUkFMID0gMgorfSBEV1JJVEVfTUVBU1VSSU5HX01PREU7CisKK3R5cGVkZWYg ZW51bSBEV1JJVEVfVEVYVF9BTlRJQUxJQVNfTU9ERSB7CisgICAgRFdSSVRFX1RFWFRfQU5U SUFMSUFTX01PREVfQ0xFQVJUWVBFID0gMCwKKyAgICBEV1JJVEVfVEVYVF9BTlRJQUxJQVNf TU9ERV9HUkFZU0NBTEUgPSAxCit9IERXUklURV9URVhUX0FOVElBTElBU19NT0RFOworCit0 eXBlZGVmIGVudW0gRFdSSVRFX0ZBQ1RPUllfVFlQRSB7CisgICAgRFdSSVRFX0ZBQ1RPUllf VFlQRV9TSEFSRUQgPSAwLAorICAgIERXUklURV9GQUNUT1JZX1RZUEVfSVNPTEFURUQgPSAx Cit9IERXUklURV9GQUNUT1JZX1RZUEU7CisKK3R5cGVkZWYgc3RydWN0IERXUklURV9GT05U X01FVFJJQ1MgeworICAgIFVJTlQxNiBkZXNpZ25Vbml0c1BlckVtOworICAgIFVJTlQxNiBh c2NlbnQ7CisgICAgVUlOVDE2IGRlc2NlbnQ7CisgICAgSU5UMTYgbGluZUdhcDsKKyAgICBV SU5UMTYgY2FwSGVpZ2h0OworICAgIFVJTlQxNiB4SGVpZ2h0OworICAgIElOVDE2IHVuZGVy bGluZVBvc2l0aW9uOworICAgIFVJTlQxNiB1bmRlcmxpbmVUaGlja25lc3M7CisgICAgSU5U MTYgc3RyaWtldGhyb3VnaFBvc2l0aW9uOworICAgIFVJTlQxNiBzdHJpa2V0aHJvdWdoVGhp Y2tuZXNzOworfSBEV1JJVEVfRk9OVF9NRVRSSUNTOworCit0eXBlZGVmIHN0cnVjdCBEV1JJ VEVfR0xZUEhfTUVUUklDUyB7CisgICAgSU5UMzIgbGVmdFNpZGVCZWFyaW5nOworICAgIFVJ TlQzMiBhZHZhbmNlV2lkdGg7CisgICAgSU5UMzIgcmlnaHRTaWRlQmVhcmluZzsKKyAgICBJ TlQzMiB0b3BTaWRlQmVhcmluZzsKKyAgICBVSU5UMzIgYWR2YW5jZUhlaWdodDsKKyAgICBJ TlQzMiBib3R0b21TaWRlQmVhcmluZzsKKyAgICBJTlQzMiB2ZXJ0aWNhbE9yaWdpblk7Cit9 IERXUklURV9HTFlQSF9NRVRSSUNTOworCit0eXBlZGVmIGludGVyZmFjZSBJRFdyaXRlUmVu ZGVyaW5nUGFyYW1zIElEV3JpdGVSZW5kZXJpbmdQYXJhbXM7Cit0eXBlZGVmIGludGVyZmFj ZSBJRFdyaXRlRm9udCBJRFdyaXRlRm9udDsKK3R5cGVkZWYgaW50ZXJmYWNlIElEV3JpdGVH ZGlJbnRlcm9wIElEV3JpdGVHZGlJbnRlcm9wOwordHlwZWRlZiBpbnRlcmZhY2UgSURXcml0 ZUZhY3RvcnkgSURXcml0ZUZhY3Rvcnk7Cit0eXBlZGVmIGludGVyZmFjZSBJRFdyaXRlRmFj dG9yeTIgSURXcml0ZUZhY3RvcnkyOwordHlwZWRlZiBpbnRlcmZhY2UgSURXcml0ZUZvbnRG YWNlIElEV3JpdGVGb250RmFjZTsKK3R5cGVkZWYgaW50ZXJmYWNlIElEV3JpdGVCaXRtYXBS ZW5kZXJUYXJnZXQgSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldDsKK3R5cGVkZWYgaW50ZXJm YWNlIElEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQxIElEV3JpdGVCaXRtYXBSZW5kZXJUYXJn ZXQxOwordHlwZWRlZiBpbnRlcmZhY2UgSURXcml0ZUNvbG9yR2x5cGhSdW5FbnVtZXJhdG9y IElEV3JpdGVDb2xvckdseXBoUnVuRW51bWVyYXRvcjsKKworREVGSU5FX0dVSUQoSUlEX0lE V3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQxLCAweDc5MWU4Mjk4LCAweDNlZjMsIDB4NDIzMCwg MHg5OCwweDgwLCAweGM5LDB4YmQsMHhlYywweGM0LDB4MjAsMHg2NCk7CitERUZJTkVfR1VJ RChJSURfSURXcml0ZUZhY3RvcnkyLCAweDA0MzlmYzYwLCAweGNhNDQsIDB4NDk5NCwgMHg4 ZCwweGVlLCAweDNhLDB4OWEsMHhmNywweGI3LDB4MzIsMHhlYyk7CitERUZJTkVfR1VJRChJ SURfSURXcml0ZUZhY3RvcnksIDB4Yjg1OWVlNWEsIDB4ZDgzOCwgMHg0YjViLCAweGEyLDB4 ZTgsIDB4MWEsMHhkYywweDdkLDB4OTMsMHhkYiwweDQ4KTsKKwordHlwZWRlZiBzdHJ1Y3Qg RFdSSVRFX0dMWVBIX09GRlNFVCB7CisgICAgRkxPQVQgYWR2YW5jZU9mZnNldDsKKyAgICBG TE9BVCBhc2NlbmRlck9mZnNldDsKK30gRFdSSVRFX0dMWVBIX09GRlNFVDsKKwordHlwZWRl ZiBzdHJ1Y3QgRFdSSVRFX0dMWVBIX1JVTiB7CisgICAgSURXcml0ZUZvbnRGYWNlICpmb250 RmFjZTsKKyAgICBGTE9BVCBmb250RW1TaXplOworICAgIFVJTlQzMiBnbHlwaENvdW50Owor ICAgIGNvbnN0IFVJTlQxNiAqZ2x5cGhJbmRpY2VzOworICAgIGNvbnN0IEZMT0FUICpnbHlw aEFkdmFuY2VzOworICAgIGNvbnN0IERXUklURV9HTFlQSF9PRkZTRVQgKmdseXBoT2Zmc2V0 czsKKyAgICBXSU5CT09MIGlzU2lkZXdheXM7CisgICAgVUlOVDMyIGJpZGlMZXZlbDsKK30g IERXUklURV9HTFlQSF9SVU47CisKK3R5cGVkZWYgc3RydWN0IF9EM0RDT0xPUlZBTFVFIHsK KyAgZmxvYXQgcjsKKyAgZmxvYXQgZzsKKyAgZmxvYXQgYjsKKyAgZmxvYXQgYTsKK30gRDNE Q09MT1JWQUxVRTsKKwordHlwZWRlZiBEM0RDT0xPUlZBTFVFIERXUklURV9DT0xPUl9GOwor Cit0eXBlZGVmIHN0cnVjdCBEV1JJVEVfQ09MT1JfR0xZUEhfUlVOIHsKKyAgICBEV1JJVEVf R0xZUEhfUlVOIGdseXBoUnVuOworICAgIHZvaWQgKmdseXBoUnVuRGVzY3JpcHRpb247Cisg ICAgRkxPQVQgYmFzZWxpbmVPcmlnaW5YOworICAgIEZMT0FUIGJhc2VsaW5lT3JpZ2luWTsK KyAgICBEV1JJVEVfQ09MT1JfRiBydW5Db2xvcjsKKyAgICBVSU5UMTYgcGFsZXR0ZUluZGV4 OworfSBEV1JJVEVfQ09MT1JfR0xZUEhfUlVOOworCit0eXBlZGVmIHN0cnVjdCBJRFdyaXRl Rm9udEZhY2VWdGJsIHsKKyAgQkVHSU5fSU5URVJGQUNFCisKKyAgSFJFU1VMVCAoU1RETUVU SE9EQ0FMTFRZUEUgKlF1ZXJ5SW50ZXJmYWNlKQorICAgIChJRFdyaXRlRm9udEZhY2UgKlRo aXMsIFJFRklJRCByaWlkLCB2b2lkICoqcHB2T2JqZWN0KTsKKyAgVUxPTkcgKFNURE1FVEhP RENBTExUWVBFICpBZGRSZWYpKElEV3JpdGVGb250RmFjZSAqVGhpcyk7CisgIFVMT05HIChT VERNRVRIT0RDQUxMVFlQRSAqUmVsZWFzZSkoSURXcml0ZUZvbnRGYWNlICpUaGlzKTsKKwor ICBFTUFDU19EV1JJVEVfVU5VU0VEKEdldFR5cGUpOworICBFTUFDU19EV1JJVEVfVU5VU0VE KEdldEZpbGVzKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRChHZXRJbmRleCk7CisgIEVNQUNT X0RXUklURV9VTlVTRUQoR2V0U2ltdWxhdGlvbnMpOworICBFTUFDU19EV1JJVEVfVU5VU0VE KElzU3ltYm9sRm9udCk7CisKKyAgdm9pZCAoU1RETUVUSE9EQ0FMTFRZUEUgKkdldE1ldHJp Y3MpCisgICAgKElEV3JpdGVGb250RmFjZSAqVGhpcywgRFdSSVRFX0ZPTlRfTUVUUklDUyAq bWV0cmljcyk7CisKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoR2V0R2x5cGhDb3VudCk7Cisg IEVNQUNTX0RXUklURV9VTlVTRUQgKEdldERlc2lnbkdseXBoTWV0cmljcyk7CisKKyAgSFJF U1VMVCAoU1RETUVUSE9EQ0FMTFRZUEUgKkdldEdseXBoSW5kaWNlcykKKyAgICAoSURXcml0 ZUZvbnRGYWNlICpUaGlzLCBjb25zdCBVSU5UMzIgKmNvZGVwb2ludHMsIFVJTlQzMiBjb3Vu dCwKKyAgICAgVUlOVDE2ICpnbHlwaF9pbmRpY2VzKTsKKworICBFTUFDU19EV1JJVEVfVU5V U0VEIChUcnlHZXRGb250VGFibGUpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChSZWxlYXNl Rm9udFRhYmxlKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoR2V0R2x5cGhSdW5PdXRsaW5l KTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoR2V0UmVjb21tZW5kZWRSZW5kZXJpbmdNb2Rl KTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoR2V0R2RpQ29tcGF0aWJsZU1ldHJpY3MpOwor CisgIEhSRVNVTFQgKFNURE1FVEhPRENBTExUWVBFICpHZXRHZGlDb21wYXRpYmxlR2x5cGhN ZXRyaWNzKQorICAgIChJRFdyaXRlRm9udEZhY2UgKlRoaXMsCisgICAgIEZMT0FUIGVtU2l6 ZSwKKyAgICAgRkxPQVQgcGl4ZWxzX3Blcl9kaXAsCisgICAgIHZvaWQgKnRyYW5zZm9ybSwK KyAgICAgV0lOQk9PTCB1c2VfZ2RpX25hdHVyYWwsCisgICAgIGNvbnN0IFVJTlQxNiAqZ2x5 cGhfaW5kaWNlcywKKyAgICAgVUlOVDMyIGdseXBoX2NvdW50LAorICAgICBEV1JJVEVfR0xZ UEhfTUVUUklDUyAqbWV0cmljcywKKyAgICAgV0lOQk9PTCBpc19zaWRld2F5cyk7CisgIEVO RF9JTlRFUkZBQ0UKK30gSURXcml0ZUZvbnRGYWNlVnRibDsKKworaW50ZXJmYWNlIElEV3Jp dGVGb250RmFjZSB7CisgICAgQ09OU1RfVlRCTCBJRFdyaXRlRm9udEZhY2VWdGJsKiBscFZ0 Ymw7Cit9OworCit0eXBlZGVmIHN0cnVjdCBJRFdyaXRlUmVuZGVyaW5nUGFyYW1zVnRibCB7 CisgIEJFR0lOX0lOVEVSRkFDRQorCisgIEhSRVNVTFQgKFNURE1FVEhPRENBTExUWVBFICpR dWVyeUludGVyZmFjZSkKKyAgICAoSURXcml0ZVJlbmRlcmluZ1BhcmFtcyAqVGhpcywgUkVG SUlEIHJpaWQsIHZvaWQgKipwcHZPYmplY3QpOworICBVTE9ORyAoU1RETUVUSE9EQ0FMTFRZ UEUgKkFkZFJlZikoSURXcml0ZVJlbmRlcmluZ1BhcmFtcyAqVGhpcyk7CisgIFVMT05HIChT VERNRVRIT0RDQUxMVFlQRSAqUmVsZWFzZSkoSURXcml0ZVJlbmRlcmluZ1BhcmFtcyAqVGhp cyk7CisKKyAgRkxPQVQgKFNURE1FVEhPRENBTExUWVBFICpHZXRHYW1tYSkKKyAgICAoSURX cml0ZVJlbmRlcmluZ1BhcmFtcyAqVGhpcyk7CisgIEZMT0FUIChTVERNRVRIT0RDQUxMVFlQ RSAqR2V0RW5oYW5jZWRDb250cmFzdCkKKyAgICAoSURXcml0ZVJlbmRlcmluZ1BhcmFtcyAq VGhpcyk7CisgIEZMT0FUIChTVERNRVRIT0RDQUxMVFlQRSAqR2V0Q2xlYXJUeXBlTGV2ZWwp CisgICAgKElEV3JpdGVSZW5kZXJpbmdQYXJhbXMgKlRoaXMpOworICBpbnQgKFNURE1FVEhP RENBTExUWVBFICpHZXRQaXhlbEdlb21ldHJ5KQorICAgIChJRFdyaXRlUmVuZGVyaW5nUGFy YW1zICpUaGlzKTsKKyAgRU5EX0lOVEVSRkFDRQorfSBJRFdyaXRlUmVuZGVyaW5nUGFyYW1z VnRibDsKKworaW50ZXJmYWNlIElEV3JpdGVSZW5kZXJpbmdQYXJhbXMgeworICAgIENPTlNU X1ZUQkwgSURXcml0ZVJlbmRlcmluZ1BhcmFtc1Z0YmwqIGxwVnRibDsKK307CisKK3R5cGVk ZWYgc3RydWN0IElEV3JpdGVGb250VnRibCB7CisgIEJFR0lOX0lOVEVSRkFDRQorCisgIEhS RVNVTFQgKFNURE1FVEhPRENBTExUWVBFICpRdWVyeUludGVyZmFjZSkKKyAgICAoSURXcml0 ZUZvbnQgKlRoaXMsIFJFRklJRCByaWlkLCB2b2lkICoqcHB2T2JqZWN0KTsKKyAgVUxPTkcg KFNURE1FVEhPRENBTExUWVBFICpBZGRSZWYpKElEV3JpdGVGb250ICpUaGlzKTsKKyAgVUxP TkcgKFNURE1FVEhPRENBTExUWVBFICpSZWxlYXNlKShJRFdyaXRlRm9udCAqVGhpcyk7CisK KyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoR2V0Rm9udEZhbWlseSk7CisgIEVNQUNTX0RXUklU RV9VTlVTRUQgKEdldFdlaWdodCk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKEdldFN0cmV0 Y2gpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChHZXRTdHlsZSk7CisgIEVNQUNTX0RXUklU RV9VTlVTRUQgKElzU3ltYm9sRm9udCk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKEdldEZh Y2VOYW1lcyk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKEdldEluZm9ybWF0aW9uYWxTdHJp bmdzKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoR2V0U2ltdWxhdGlvbnMpOworCisgIHZv aWQgKFNURE1FVEhPRENBTExUWVBFICpHZXRNZXRyaWNzKQorICAgIChJRFdyaXRlRm9udCAq VGhpcywgRFdSSVRFX0ZPTlRfTUVUUklDUyAqbWV0cmljcyk7CisKKyAgRU1BQ1NfRFdSSVRF X1VOVVNFRChIYXNDaGFyYWN0ZXIpOworCisgIEhSRVNVTFQgKFNURE1FVEhPRENBTExUWVBF ICpDcmVhdGVGb250RmFjZSkKKyAgICAoSURXcml0ZUZvbnQgKlRoaXMsIElEV3JpdGVGb250 RmFjZSAqKmZhY2UpOworCisgIEVORF9JTlRFUkZBQ0UKK30gSURXcml0ZUZvbnRWdGJsOwor CitpbnRlcmZhY2UgSURXcml0ZUZvbnQgeworICAgIENPTlNUX1ZUQkwgSURXcml0ZUZvbnRW dGJsKiBscFZ0Ymw7Cit9OworCit0eXBlZGVmIHN0cnVjdCBJRFdyaXRlQml0bWFwUmVuZGVy VGFyZ2V0VnRibCB7CisgIEJFR0lOX0lOVEVSRkFDRQorCisgIEhSRVNVTFQgKFNURE1FVEhP RENBTExUWVBFICpRdWVyeUludGVyZmFjZSkKKyAgICAoSURXcml0ZUJpdG1hcFJlbmRlclRh cmdldCAqVGhpcywgUkVGSUlEIHJpaWQsIHZvaWQgKipwcHZPYmplY3QpOworICBVTE9ORyAo U1RETUVUSE9EQ0FMTFRZUEUgKkFkZFJlZikoSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldCAq VGhpcyk7CisgIFVMT05HIChTVERNRVRIT0RDQUxMVFlQRSAqUmVsZWFzZSkoSURXcml0ZUJp dG1hcFJlbmRlclRhcmdldCAqVGhpcyk7CisKKyAgSFJFU1VMVCAoU1RETUVUSE9EQ0FMTFRZ UEUgKkRyYXdHbHlwaFJ1bikKKyAgICAoSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldCAqVGhp cywKKyAgICAgRkxPQVQgYmFzZWxpbmVPcmlnaW5YLAorICAgICBGTE9BVCBiYXNlbGluZU9y aWdpblksCisgICAgIERXUklURV9NRUFTVVJJTkdfTU9ERSBtZWFzdXJpbmdfbW9kZSwKKyAg ICAgY29uc3QgRFdSSVRFX0dMWVBIX1JVTiAqZ2x5cGhfcnVuLAorICAgICBJRFdyaXRlUmVu ZGVyaW5nUGFyYW1zICpwYXJhbXMsCisgICAgIENPTE9SUkVGIHRleHRDb2xvciwKKyAgICAg UkVDVCAqYmxhY2tib3hfcmVjdCk7CisKKyAgSERDIChTVERNRVRIT0RDQUxMVFlQRSAqR2V0 TWVtb3J5REMpKElEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQgKlRoaXMpOworCisgIEVNQUNT X0RXUklURV9VTlVTRUQgKEdldFBpeGVsc1BlckRpcCk7CisKKyAgSFJFU1VMVCAoU1RETUVU SE9EQ0FMTFRZUEUgKlNldFBpeGVsc1BlckRpcCkKKyAgICAoSURXcml0ZUJpdG1hcFJlbmRl clRhcmdldCAqVGhpcywgRkxPQVQgcGl4ZWxzX3Blcl9kaXApOworCisgIEVNQUNTX0RXUklU RV9VTlVTRUQgKEdldEN1cnJlbnRUcmFuc2Zvcm0pOworICBFTUFDU19EV1JJVEVfVU5VU0VE IChTZXRDdXJyZW50VHJhbnNmb3JtKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoR2V0U2l6 ZSk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKFJlc2l6ZSk7CisgIEVORF9JTlRFUkZBQ0UK K30gSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldFZ0Ymw7CisKK2ludGVyZmFjZSBJRFdyaXRl Qml0bWFwUmVuZGVyVGFyZ2V0IHsKKyAgICBDT05TVF9WVEJMIElEV3JpdGVCaXRtYXBSZW5k ZXJUYXJnZXRWdGJsKiBscFZ0Ymw7Cit9OworCit0eXBlZGVmIHN0cnVjdCBJRFdyaXRlQml0 bWFwUmVuZGVyVGFyZ2V0MVZ0YmwgeworICBCRUdJTl9JTlRFUkZBQ0UKKworICBIUkVTVUxU IChTVERNRVRIT0RDQUxMVFlQRSAqUXVlcnlJbnRlcmZhY2UpCisgICAgKElEV3JpdGVCaXRt YXBSZW5kZXJUYXJnZXQxICpUaGlzLCBSRUZJSUQgcmlpZCwgdm9pZCAqKnBwdk9iamVjdCk7 CisgIFVMT05HIChTVERNRVRIT0RDQUxMVFlQRSAqQWRkUmVmKSAoSURXcml0ZUJpdG1hcFJl bmRlclRhcmdldDEgKlRoaXMpOworICBVTE9ORyAoU1RETUVUSE9EQ0FMTFRZUEUgKlJlbGVh c2UpIChJRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0MSAqVGhpcyk7CisKKyAgRU1BQ1NfRFdS SVRFX1VOVVNFRCAoRHJhd0dseXBoUnVuKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoR2V0 TWVtb3J5REMpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChHZXRQaXhlbHNQZXJEaXApOwor ICBFTUFDU19EV1JJVEVfVU5VU0VEIChTZXRQaXhlbHNQZXJEaXApOworICBFTUFDU19EV1JJ VEVfVU5VU0VEIChHZXRDdXJyZW50VHJhbnNmb3JtKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNF RCAoU2V0Q3VycmVudFRyYW5zZm9ybSk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKEdldFNp emUpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChSZXNpemUpOworICBFTUFDU19EV1JJVEVf VU5VU0VEIChHZXRUZXh0QW50aWFsaWFzTW9kZSk7CisKKyAgSFJFU1VMVCAoU1RETUVUSE9E Q0FMTFRZUEUgKlNldFRleHRBbnRpYWxpYXNNb2RlKQorICAgIChJRFdyaXRlQml0bWFwUmVu ZGVyVGFyZ2V0MSAqVGhpcywgRFdSSVRFX1RFWFRfQU5USUFMSUFTX01PREUgbW9kZSk7CisK KyAgRU5EX0lOVEVSRkFDRQorfSBJRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0MVZ0Ymw7CisK K2ludGVyZmFjZSBJRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0MSB7CisgICAgQ09OU1RfVlRC TCBJRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0MVZ0YmwqIGxwVnRibDsKK307CisKK3R5cGVk ZWYgc3RydWN0IElEV3JpdGVHZGlJbnRlcm9wVnRibCB7CisgIEJFR0lOX0lOVEVSRkFDRQor CisgIEhSRVNVTFQgKFNURE1FVEhPRENBTExUWVBFICpRdWVyeUludGVyZmFjZSkKKyAgICAo SURXcml0ZUdkaUludGVyb3AgKlRoaXMsIFJFRklJRCByaWlkLCB2b2lkICoqcHB2T2JqZWN0 KTsKKyAgVUxPTkcgKFNURE1FVEhPRENBTExUWVBFICpBZGRSZWYpKElEV3JpdGVHZGlJbnRl cm9wICpUaGlzKTsKKyAgVUxPTkcgKFNURE1FVEhPRENBTExUWVBFICpSZWxlYXNlKShJRFdy aXRlR2RpSW50ZXJvcCAqVGhpcyk7CisKKyAgSFJFU1VMVCAoU1RETUVUSE9EQ0FMTFRZUEUg KkNyZWF0ZUZvbnRGcm9tTE9HRk9OVCkKKyAgICAoSURXcml0ZUdkaUludGVyb3AgKlRoaXMs IGNvbnN0IExPR0ZPTlRXICpsb2dmb250LAorICAgICBJRFdyaXRlRm9udCAqKmZvbnQpOwor CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKENvbnZlcnRGb250VG9MT0dGT05UKTsKKyAgRU1B Q1NfRFdSSVRFX1VOVVNFRCAoQ29udmVydEZvbnRGYWNlVG9MT0dGT05UKTsKKyAgRU1BQ1Nf RFdSSVRFX1VOVVNFRCAoQ3JlYXRlRm9udEZhY2VGcm9tSGRjKTsKKworICBIUkVTVUxUIChT VERNRVRIT0RDQUxMVFlQRSAqQ3JlYXRlQml0bWFwUmVuZGVyVGFyZ2V0KQorICAgIChJRFdy aXRlR2RpSW50ZXJvcCAqVGhpcywgSERDIGhkYywgVUlOVDMyIHdpZHRoLCBVSU5UMzIgaGVp Z2h0LAorICAgICBJRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0ICoqdGFyZ2V0KTsKKyAgRU5E X0lOVEVSRkFDRQorfSBJRFdyaXRlR2RpSW50ZXJvcFZ0Ymw7CisKK2ludGVyZmFjZSBJRFdy aXRlR2RpSW50ZXJvcCB7CisgICAgQ09OU1RfVlRCTCBJRFdyaXRlR2RpSW50ZXJvcFZ0Ymwq IGxwVnRibDsKK307CisKK3R5cGVkZWYgc3RydWN0IElEV3JpdGVGYWN0b3J5VnRibCB7Cisg IEJFR0lOX0lOVEVSRkFDRQorCisgIEhSRVNVTFQgKFNURE1FVEhPRENBTExUWVBFICpRdWVy eUludGVyZmFjZSkKKyAgICAoSURXcml0ZUZhY3RvcnkgKlRoaXMsIFJFRklJRCByaWlkLCB2 b2lkICoqcHB2T2JqZWN0KTsKKyAgVUxPTkcgKFNURE1FVEhPRENBTExUWVBFICpBZGRSZWYp KElEV3JpdGVGYWN0b3J5ICpUaGlzKTsKKyAgVUxPTkcgKFNURE1FVEhPRENBTExUWVBFICpS ZWxlYXNlKShJRFdyaXRlRmFjdG9yeSAqVGhpcyk7CisKKyAgRU1BQ1NfRFdSSVRFX1VOVVNF RCAoR2V0U3lzdGVtRm9udENvbGxlY3Rpb24pOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChD cmVhdGVDdXN0b21Gb250Q29sbGVjdGlvbik7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKFJl Z2lzdGVyRm9udENvbGxlY3Rpb25Mb2FkZXIpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChV bnJlZ2lzdGVyRm9udENvbGxlY3Rpb25Mb2FkZXIpOworICBFTUFDU19EV1JJVEVfVU5VU0VE IChDcmVhdGVGb250RmlsZVJlZmVyZW5jZSk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKENy ZWF0ZUN1c3RvbUZvbnRGaWxlUmVmZXJlbmNlKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAo Q3JlYXRlRm9udEZhY2UpOworICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAqQ3JlYXRl UmVuZGVyaW5nUGFyYW1zKQorICAgIChJRFdyaXRlRmFjdG9yeSAqVGhpcywgSURXcml0ZVJl bmRlcmluZ1BhcmFtcyAqKnBhcmFtcyk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKENyZWF0 ZU1vbml0b3JSZW5kZXJpbmdQYXJhbXMpOworICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQ RSAqQ3JlYXRlQ3VzdG9tUmVuZGVyaW5nUGFyYW1zKQorICAgIChJRFdyaXRlRmFjdG9yeSAq VGhpcywgRkxPQVQgZ2FtbWEsIEZMT0FUIGVuaGFuY2VkQ29udHJhc3QsCisgICAgIEZMT0FU IGNsZWFydHlwZV9sZXZlbCwgRFdSSVRFX1BJWEVMX0dFT01FVFJZIGdlb21ldHJ5LAorICAg ICBEV1JJVEVfUkVOREVSSU5HX01PREUgbW9kZSwgSURXcml0ZVJlbmRlcmluZ1BhcmFtcyAq KnBhcmFtcyk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKFJlZ2lzdGVyRm9udEZpbGVMb2Fk ZXIpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChVbnJlZ2lzdGVyRm9udEZpbGVMb2FkZXIp OworICBFTUFDU19EV1JJVEVfVU5VU0VEIChDcmVhdGVUZXh0Rm9ybWF0KTsKKyAgRU1BQ1Nf RFdSSVRFX1VOVVNFRCAoQ3JlYXRlVHlwb2dyYXBoeSk7CisgIEhSRVNVTFQgKFNURE1FVEhP RENBTExUWVBFICpHZXRHZGlJbnRlcm9wKQorICAgIChJRFdyaXRlRmFjdG9yeSAqVGhpcywg SURXcml0ZUdkaUludGVyb3AgKipnZGlfaW50ZXJvcCk7CisgIEVNQUNTX0RXUklURV9VTlVT RUQgKENyZWF0ZVRleHRMYXlvdXQpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChDcmVhdGVH ZGlDb21wYXRpYmxlVGV4dExheW91dCk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKENyZWF0 ZUVsbGlwc2lzVHJpbW1pbmdTaWduKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoQ3JlYXRl VGV4dEFuYWx5emVyKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoQ3JlYXRlTnVtYmVyU3Vi c3RpdHV0aW9uKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoQ3JlYXRlR2x5cGhSdW5BbmFs eXNpcyk7CisgIEVORF9JTlRFUkZBQ0UKK30gSURXcml0ZUZhY3RvcnlWdGJsOworCitpbnRl cmZhY2UgSURXcml0ZUZhY3RvcnkgeyBDT05TVF9WVEJMIElEV3JpdGVGYWN0b3J5VnRibCog bHBWdGJsOyB9OworCit0eXBlZGVmIHN0cnVjdCBJRFdyaXRlQ29sb3JHbHlwaFJ1bkVudW1l cmF0b3JWdGJsIHsKKyAgICBCRUdJTl9JTlRFUkZBQ0UKKworICAgIEhSRVNVTFQgKFNURE1F VEhPRENBTExUWVBFICpRdWVyeUludGVyZmFjZSkKKyAgICAgIChJRFdyaXRlQ29sb3JHbHlw aFJ1bkVudW1lcmF0b3IgKlRoaXMsIFJFRklJRCByaWlkLCB2b2lkICoqcHB2T2JqZWN0KTsK KyAgICBVTE9ORyAoU1RETUVUSE9EQ0FMTFRZUEUgKkFkZFJlZikoSURXcml0ZUNvbG9yR2x5 cGhSdW5FbnVtZXJhdG9yICpUaGlzKTsKKyAgICBVTE9ORyAoU1RETUVUSE9EQ0FMTFRZUEUg KlJlbGVhc2UpKElEV3JpdGVDb2xvckdseXBoUnVuRW51bWVyYXRvciAqVGhpcyk7CisKKyAg ICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAqTW92ZU5leHQpKAorICAgICAgICBJRFdy aXRlQ29sb3JHbHlwaFJ1bkVudW1lcmF0b3IgKlRoaXMsCisgICAgICAgIFdJTkJPT0wgKmhh c1J1bik7CisKKyAgICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAqR2V0Q3VycmVudFJ1 bikoCisgICAgICAgIElEV3JpdGVDb2xvckdseXBoUnVuRW51bWVyYXRvciAqVGhpcywKKyAg ICAgICAgY29uc3QgRFdSSVRFX0NPTE9SX0dMWVBIX1JVTiAqKnJ1bik7CisKKyAgICBFTkRf SU5URVJGQUNFCit9IElEV3JpdGVDb2xvckdseXBoUnVuRW51bWVyYXRvclZ0Ymw7CisKK2lu dGVyZmFjZSBJRFdyaXRlQ29sb3JHbHlwaFJ1bkVudW1lcmF0b3IgeworICAgIENPTlNUX1ZU QkwgSURXcml0ZUNvbG9yR2x5cGhSdW5FbnVtZXJhdG9yVnRibCogbHBWdGJsOworfTsKKwor dHlwZWRlZiBzdHJ1Y3QgSURXcml0ZUZhY3RvcnkyVnRibCB7CisgIEJFR0lOX0lOVEVSRkFD RQorICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAqUXVlcnlJbnRlcmZhY2UpCisgICAg ICAoSURXcml0ZUZhY3RvcnkyICpUaGlzLCBSRUZJSUQgcmlpZCwgdm9pZCAqKnBwdk9iamVj dCk7CisgIFVMT05HIChTVERNRVRIT0RDQUxMVFlQRSAqQWRkUmVmKShJRFdyaXRlRmFjdG9y eTIgKlRoaXMpOworICBVTE9ORyAoU1RETUVUSE9EQ0FMTFRZUEUgKlJlbGVhc2UpKElEV3Jp dGVGYWN0b3J5MiAqVGhpcyk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKEdldFN5c3RlbUZv bnRDb2xsZWN0aW9uKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoQ3JlYXRlQ3VzdG9tRm9u dENvbGxlY3Rpb24pOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChSZWdpc3RlckZvbnRDb2xs ZWN0aW9uTG9hZGVyKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoVW5yZWdpc3RlckZvbnRD b2xsZWN0aW9uTG9hZGVyKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoQ3JlYXRlRm9udEZp bGVSZWZlcmVuY2UpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChDcmVhdGVDdXN0b21Gb250 RmlsZVJlZmVyZW5jZSk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKENyZWF0ZUZvbnRGYWNl KTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoQ3JlYXRlUmVuZGVyaW5nUGFyYW1zKTsKKyAg RU1BQ1NfRFdSSVRFX1VOVVNFRCAoQ3JlYXRlTW9uaXRvclJlbmRlcmluZ1BhcmFtcyk7Cisg IEVNQUNTX0RXUklURV9VTlVTRUQgKENyZWF0ZUN1c3RvbVJlbmRlcmluZ1BhcmFtcyk7Cisg IEVNQUNTX0RXUklURV9VTlVTRUQgKFJlZ2lzdGVyRm9udEZpbGVMb2FkZXIpOworICBFTUFD U19EV1JJVEVfVU5VU0VEIChVbnJlZ2lzdGVyRm9udEZpbGVMb2FkZXIpOworICBFTUFDU19E V1JJVEVfVU5VU0VEIChDcmVhdGVUZXh0Rm9ybWF0KTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNF RCAoQ3JlYXRlVHlwb2dyYXBoeSk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKEdldEdkaUlu dGVyb3ApOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChDcmVhdGVUZXh0TGF5b3V0KTsKKyAg RU1BQ1NfRFdSSVRFX1VOVVNFRCAoQ3JlYXRlR2RpQ29tcGF0aWJsZVRleHRMYXlvdXQpOwor ICBFTUFDU19EV1JJVEVfVU5VU0VEIChDcmVhdGVFbGxpcHNpc1RyaW1taW5nU2lnbik7Cisg IEVNQUNTX0RXUklURV9VTlVTRUQgKENyZWF0ZVRleHRBbmFseXplcik7CisgIEVNQUNTX0RX UklURV9VTlVTRUQgKENyZWF0ZU51bWJlclN1YnN0aXR1dGlvbik7CisgIEVNQUNTX0RXUklU RV9VTlVTRUQgKENyZWF0ZUdseXBoUnVuQW5hbHlzaXMpOworCisgIEVNQUNTX0RXUklURV9V TlVTRUQgKEdldEV1ZGNGb250Q29sbGVjdGlvbik7CisgIEVNQUNTX0RXUklURV9VTlVTRUQg KElEV3JpdGVGYWN0b3J5MV9DcmVhdGVDdXN0b21SZW5kZXJpbmdQYXJhbXMpOworCisgIEVN QUNTX0RXUklURV9VTlVTRUQgKEdldFN5c3RlbUZvbnRGYWxsYmFjayk7CisgIEVNQUNTX0RX UklURV9VTlVTRUQgKENyZWF0ZUZvbnRGYWxsYmFja0J1aWxkZXIpOworICBIUkVTVUxUIChT VERNRVRIT0RDQUxMVFlQRSAqVHJhbnNsYXRlQ29sb3JHbHlwaFJ1bikKKyAgICAoSURXcml0 ZUZhY3RvcnkyICpUaGlzLAorICAgICBGTE9BVCBvcmlnaW5YLAorICAgICBGTE9BVCBvcmln aW5ZLAorICAgICBjb25zdCBEV1JJVEVfR0xZUEhfUlVOICpydW4sCisgICAgIHZvaWQgKnJ1 bmRlc2NyLAorICAgICBEV1JJVEVfTUVBU1VSSU5HX01PREUgbW9kZSwKKyAgICAgdm9pZCAq dHJhbnNmb3JtLAorICAgICBVSU5UMzIgcGFsZXR0ZV9pbmRleCwKKyAgICAgSURXcml0ZUNv bG9yR2x5cGhSdW5FbnVtZXJhdG9yICoqY29sb3JsYXllcnMpOworCisgIEVNQUNTX0RXUklU RV9VTlVTRUQgKElEV3JpdGVGYWN0b3J5Ml9DcmVhdGVDdXN0b21SZW5kZXJpbmdQYXJhbXMp OworICBFTUFDU19EV1JJVEVfVU5VU0VEIChJRFdyaXRlRmFjdG9yeTJfQ3JlYXRlR2x5cGhS dW5BbmFseXNpcyk7CisgIEVORF9JTlRFUkZBQ0UKK30gSURXcml0ZUZhY3RvcnkyVnRibDsK KworaW50ZXJmYWNlIElEV3JpdGVGYWN0b3J5MiB7CisgICAgQ09OU1RfVlRCTCBJRFdyaXRl RmFjdG9yeTJWdGJsKiBscFZ0Ymw7Cit9OworI2Vsc2UgLyogaWZuZGVmIE1JTkdXX1c2NCAq LworIyBpbmNsdWRlIDxkd3JpdGVfMy5oPgorI2VuZGlmCisKKy8qIFZhbHVlcyB0byB1c2Ug Zm9yIERpcmVjdFdyaXRlIHJlbmRlcmluZy4gICovCisjZGVmaW5lIE1FQVNVUklOR19NT0RF IERXUklURV9NRUFTVVJJTkdfTU9ERV9OQVRVUkFMCisjZGVmaW5lIFJFTkRFUklOR19NT0RF IERXUklURV9SRU5ERVJJTkdfTU9ERV9OQVRVUkFMX1NZTU1FVFJJQworI2RlZmluZSBBTlRJ QUxJQVNfTU9ERSBEV1JJVEVfVEVYVF9BTlRJQUxJQVNfTU9ERV9DTEVBUlRZUEUKKworI2Rl ZmluZSBSRUxFQVNFX0NPTShpKSAoaSktPmxwVnRibC0+UmVsZWFzZSAoaSkKKworLyogR2xv YmFsIHZhcmlhYmxlcyBmb3IgRGlyZWN0V3JpdGUuICAqLworc3RhdGljIGJvb2wgZGlyZWN0 X3dyaXRlX2F2YWlsYWJsZSA9IGZhbHNlOworc3RhdGljIElEV3JpdGVGYWN0b3J5ICpkd3Jp dGVfZmFjdG9yeTsKK3N0YXRpYyBJRFdyaXRlRmFjdG9yeTIgKmR3cml0ZV9mYWN0b3J5MjsK K3N0YXRpYyBJRFdyaXRlR2RpSW50ZXJvcCAqZ2RpX2ludGVyb3A7CitzdGF0aWMgSURXcml0 ZVJlbmRlcmluZ1BhcmFtcyAqcmVuZGVyaW5nX3BhcmFtczsKKworc3RhdGljIHZvaWQKK3Zl cmlmeV9ociAoSFJFU1VMVCBociwgY29uc3QgY2hhciAqbXNnKQoreworICBpZiAoRkFJTEVE IChocikpCisgICAgZW1hY3NfYWJvcnQgKCk7Cit9CisKKy8qIEdldHMgYSBJRFdyaXRlRm9u dEZhY2UgZnJvbSBhIHN0cnVjdCBmb250IChpdHMgSEZPTlQpLiBSZXR1cm5zIHRoZQorICAg Zm9udCBzaXplIGluIHBvaW50cy4gIEl0IG1heSBmYWlsIHRvIGdldCBhIERpcmVjdFdyaXRl IGZvbnQsIGFuZCBmYWNlCisgICB3aWxsIGJlIE5VTEwgb24gcmV0dXJuLiAgVGhpcyBoYXBw ZW5zIGZvciBzb21lIGZvbnRzIGxpa2UgQ291cmllci4KKworICAgTmV2ZXIgY2FsbCBSZWxl YXNlIG9uIHRoZSByZXN1bHQsIGFzIGl0IGlzIGNhY2hlZCBmb3IgcmV1c2Ugb24gdGhlCisg ICBzdHJ1Y3QgZm9udC4gICovCitzdGF0aWMgZmxvYXQKK2dldF9mb250X2ZhY2UgKHN0cnVj dCBmb250ICppbmZvbnQsIElEV3JpdGVGb250RmFjZSAqKmZhY2UpCit7CisgIEhSRVNVTFQg aHI7CisgIExPR0ZPTlRXIGxvZ2ZvbnQ7CisgIElEV3JpdGVGb250ICpmb250OworICBmbG9h dCBmb250X3NpemU7CisKKyAgLyogQ2hlY2sgdGhlIGNhY2hlLiAgKi8KKyAgKmZhY2UgPSB3 MzJfZm9udF9nZXRfZHdyaXRlX2NhY2hlIChpbmZvbnQsICZmb250X3NpemUpOworICBpZiAo KmZhY2UpCisgICAgcmV0dXJuIGZvbnRfc2l6ZTsKKworICBHZXRPYmplY3RXIChGT05UX0hB TkRMRShpbmZvbnQpLCBzaXplb2YgKExPR0ZPTlRXKSwgJmxvZ2ZvbnQpOworCisgIGhyID0g Z2RpX2ludGVyb3AtPmxwVnRibC0+Q3JlYXRlRm9udEZyb21MT0dGT05UIChnZGlfaW50ZXJv cCwKKwkJCQkJCSAgIChjb25zdCBMT0dGT05UVyAqKSAmbG9nZm9udCwKKwkJCQkJCSAgICZm b250KTsKKworICBpZiAoRkFJTEVEIChocikpCisgICAgeworICAgICAgKmZhY2UgPSBOVUxM OworICAgICAgcmV0dXJuIDAuMDsKKyAgICB9CisKKyAgaHIgPSBmb250LT5scFZ0YmwtPkNy ZWF0ZUZvbnRGYWNlIChmb250LCBmYWNlKTsKKyAgUkVMRUFTRV9DT00gKGZvbnQpOworICB2 ZXJpZnlfaHIgKGhyLCAiRmFpbGVkIHRvIGNyZWF0ZSBEV3JpdGVGb250RmFjZSIpOworICB3 MzJfZm9udF9zZXRfZHdyaXRlX2NhY2hlIChpbmZvbnQsICpmYWNlLCBhYnMgKGxvZ2ZvbnQu bGZIZWlnaHQpKTsKKworICByZXR1cm4gYWJzKGxvZ2ZvbnQubGZIZWlnaHQpOworfQorCit2 b2lkCit3MzJfZHdyaXRlX2ZyZWVfY2FjaGVkX2ZhY2UgKHZvaWQgKmNhY2hlKQoreworICBp ZiAoY2FjaGUpCisgICAgUkVMRUFTRV9DT00gKChJRFdyaXRlRm9udEZhY2UgKikgY2FjaGUp OworfQorCitzdGF0aWMgZmxvYXQKK2NvbnZlcnRfbWV0cmljc19zeiAoaW50IHN6LCBmbG9h dCBmb250X3NpemUsIGludCB1bml0c19wZXJfZW0pCit7CisgIHJldHVybiAoZmxvYXQpIHN6 ICogZm9udF9zaXplIC8gdW5pdHNfcGVyX2VtOworfQorCisKKy8qIERvZXMgbm90IGZpbGwg aW4gdGhlIGFzY2VudCBhbmQgZGVzY2VudCBmaWVsZHMgb2YgbWV0cmljcy4gICovCitzdGF0 aWMgdm9pZAordGV4dF9leHRlbnRzX2ludGVybmFsIChJRFdyaXRlRm9udEZhY2UgKmR3cml0 ZV9mb250X2ZhY2UsCisJCSAgICAgICBmbG9hdCBmb250X3NpemUsIGNvbnN0IHVuc2lnbmVk ICpjb2RlLAorCQkgICAgICAgaW50IG5nbHlwaHMsIHN0cnVjdCBmb250X21ldHJpY3MgKm1l dHJpY3MpCit7CisgIEhSRVNVTFQgaHI7CisKKyAgaWYgKGZvbnRfc2l6ZSA8PSAwLjBmKQor ICAgIHsKKyAgICAgIG1ldHJpY3MtPndpZHRoID0gMDsKKyAgICAgIG1ldHJpY3MtPmxiZWFy aW5nID0gMDsKKyAgICAgIG1ldHJpY3MtPnJiZWFyaW5nID0gMDsKKyAgICAgIHJldHVybjsK KyAgICB9CisKKyAgRFdSSVRFX0ZPTlRfTUVUUklDUyBkd3JpdGVfZm9udF9tZXRyaWNzOwor ICBkd3JpdGVfZm9udF9mYWNlLT5scFZ0YmwtPkdldE1ldHJpY3MgKGR3cml0ZV9mb250X2Zh Y2UsCisJCQkJCSZkd3JpdGVfZm9udF9tZXRyaWNzKTsKKworICBVSU5UMTYgKmluZGljZXMg PSBhbGxvY2EgKG5nbHlwaHMgKiBzaXplb2YgKFVJTlQxNikpOworICBmb3IgKGludCBpID0g MDsgaSA8IG5nbHlwaHM7IGkrKykKKyAgICBpbmRpY2VzW2ldID0gY29kZVtpXTsKKworICBE V1JJVEVfR0xZUEhfTUVUUklDUyogZ21ldHJpY3MgPQorICAgIGFsbG9jYSAobmdseXBocyAq IHNpemVvZiAoRFdSSVRFX0dMWVBIX01FVFJJQ1MpKTsKKworICBociA9IGR3cml0ZV9mb250 X2ZhY2UtPmxwVnRibC0+R2V0R2RpQ29tcGF0aWJsZUdseXBoTWV0cmljcyAoZHdyaXRlX2Zv bnRfZmFjZSwKKwkJCQkJCQkgICAgICAgZm9udF9zaXplLAorCQkJCQkJCSAgICAgICAxLjAs CisJCQkJCQkJICAgICAgIE5VTEwsCisJCQkJCQkJICAgICAgIFRSVUUsCisJCQkJCQkJICAg ICAgIGluZGljZXMsCisJCQkJCQkJICAgICAgIG5nbHlwaHMsCisJCQkJCQkJICAgICAgIGdt ZXRyaWNzLAorCQkJCQkJCSAgICAgICBmYWxzZSk7CisgIHZlcmlmeV9ociAoaHIsICJGYWls ZWQgdG8gR2V0R2RpQ29tcGF0aWJsZUdseXBoTWV0cmljcyIpOworCisgIGZsb2F0IHdpZHRo ID0gMDsKKyAgaW50IGR1X3Blcl9lbSA9IGR3cml0ZV9mb250X21ldHJpY3MuZGVzaWduVW5p dHNQZXJFbTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG5nbHlwaHM7IGkrKykKKyAgICB7 CisgICAgICBmbG9hdCBhZHZhbmNlID0KKwljb252ZXJ0X21ldHJpY3Nfc3ogKGdtZXRyaWNz W2ldLmFkdmFuY2VXaWR0aCwgZm9udF9zaXplLCBkdV9wZXJfZW0pOworCisgICAgICB3aWR0 aCArPSBhZHZhbmNlOworCisgICAgICBmbG9hdCBsYmVhcmluZyA9CisJcm91bmQgKGNvbnZl cnRfbWV0cmljc19zeiAoZ21ldHJpY3NbaV0ubGVmdFNpZGVCZWFyaW5nLCBmb250X3NpemUs CisJCQkJICAgZHVfcGVyX2VtKSk7CisgICAgICBmbG9hdCByYmVhcmluZyA9CisJcm91bmQg KGFkdmFuY2UgLQorCSAgICAgICBjb252ZXJ0X21ldHJpY3Nfc3ogKGdtZXRyaWNzW2ldLnJp Z2h0U2lkZUJlYXJpbmcsCisJCQkJICAgZm9udF9zaXplLCBkdV9wZXJfZW0pKTsKKyAgICAg IGlmIChpID09IDApCisJeworCSAgbWV0cmljcy0+bGJlYXJpbmcgPSBsYmVhcmluZzsKKwkg IG1ldHJpY3MtPnJiZWFyaW5nID0gcmJlYXJpbmc7CisJfQorICAgICAgaWYgKG1ldHJpY3Mt PmxiZWFyaW5nID4gbGJlYXJpbmcpCisJbWV0cmljcy0+bGJlYXJpbmcgPSBsYmVhcmluZzsK KyAgICAgIGlmIChtZXRyaWNzLT5yYmVhcmluZyA8IHJiZWFyaW5nKQorCW1ldHJpY3MtPnJi ZWFyaW5nID0gcmJlYXJpbmc7CisgICAgfQorICBtZXRyaWNzLT53aWR0aCA9IHJvdW5kKHdp ZHRoKTsKK30KKwordW5zaWduZWQKK3czMl9kd3JpdGVfZW5jb2RlX2NoYXIgKHN0cnVjdCBm b250ICpmb250LCBpbnQgYykKK3sKKyAgSFJFU1VMVCBocjsKKyAgSURXcml0ZUZvbnRGYWNl ICpkd3JpdGVfZm9udF9mYWNlOworICBVSU5UMTYgaW5kZXg7CisKKyAgZ2V0X2ZvbnRfZmFj ZSAoZm9udCwgJmR3cml0ZV9mb250X2ZhY2UpOworICBociA9IGR3cml0ZV9mb250X2ZhY2Ut PmxwVnRibC0+R2V0R2x5cGhJbmRpY2VzIChkd3JpdGVfZm9udF9mYWNlLAorCQkJCQkJICAm YywgMSwgJmluZGV4KTsKKyAgdmVyaWZ5X2hyIChociwgIkZhaWxlZCB0byBHZXRHbHlwaElu ZGljZXMiKTsKKworICBpZiAoaW5kZXggPT0gMCkKKyAgICByZXR1cm4gRk9OVF9JTlZBTElE X0NPREU7CisKKyAgcmV0dXJuIGluZGV4OworfQorCit2b2lkCit3MzJfZHdyaXRlX3RleHRf ZXh0ZW50cyAoc3RydWN0IGZvbnQgKmZvbnQsIGNvbnN0IHVuc2lnbmVkICpjb2RlLCBpbnQg bmdseXBocywKKwkJCSBzdHJ1Y3QgZm9udF9tZXRyaWNzICptZXRyaWNzKQoreworICBJRFdy aXRlRm9udEZhY2UgKmR3cml0ZV9mb250X2ZhY2U7CisKKyAgZmxvYXQgZm9udF9zaXplID0g Z2V0X2ZvbnRfZmFjZSAoZm9udCwgJmR3cml0ZV9mb250X2ZhY2UpOworCisgIGlmIChkd3Jp dGVfZm9udF9mYWNlID09IE5VTEwpCisgICAgeworICAgICAgbWV0cmljcy0+d2lkdGggPSAw OworICAgICAgbWV0cmljcy0+bGJlYXJpbmcgPSAwOworICAgICAgbWV0cmljcy0+cmJlYXJp bmcgPSAwOworICAgICAgcmV0dXJuOworICAgIH0KKworICB0ZXh0X2V4dGVudHNfaW50ZXJu YWwgKGR3cml0ZV9mb250X2ZhY2UsIGZvbnRfc2l6ZSwgY29kZSwgbmdseXBocywgbWV0cmlj cyk7CisKKyAgbWV0cmljcy0+YXNjZW50ID0gZm9udC0+YXNjZW50OworICBtZXRyaWNzLT5k ZXNjZW50ID0gZm9udC0+ZGVzY2VudDsKK30KKworLyogTmV2ZXIgY2FsbCBSZWxlYXNlIG9u IHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uLCBhcyBpdCBpcworICAgcmV1 c2VkLiAgKi8KK3N0YXRpYyBJRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0ICoKK2dldF9iaXRt YXBfcmVuZGVyX3RhcmdldCAoSERDIGhkYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQorewor ICBIUkVTVUxUIGhyOworICBzdGF0aWMgSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldCAqYnJ0 ID0gTlVMTDsKKyAgc3RhdGljIFNJWkUgc2l6ZSA9IHswLCAwfTsKKworICBpZiAoYnJ0KQor ICAgIHsKKyAgICAgIC8qIENoZWNrIGlmIHdlIG5lZWQgdG8gbWFrZSBhIGJpZ2dlciBvbmUu ICAqLworICAgICAgaWYgKHdpZHRoIDw9IHNpemUuY3ggJiYgaGVpZ2h0IDw9IHNpemUuY3kp CisJcmV0dXJuIGJydDsKKyAgICAgIFJFTEVBU0VfQ09NIChicnQpOworICAgIH0KKworICBp ZiAod2lkdGggPiBzaXplLmN4KQorICAgIHNpemUuY3ggPSB3aWR0aDsKKyAgaWYgKGhlaWdo dCA+IHNpemUuY3kpCisgICAgc2l6ZS5jeSA9IGhlaWdodDsKKworICBociA9IGdkaV9pbnRl cm9wLT5scFZ0YmwtPkNyZWF0ZUJpdG1hcFJlbmRlclRhcmdldCAoZ2RpX2ludGVyb3AsCisJ CQkJCQkgICAgICBoZGMsCisJCQkJCQkgICAgICBzaXplLmN4LCBzaXplLmN5LAorCQkJCQkJ ICAgICAgJmJydCk7CisgIHZlcmlmeV9ociAoaHIsICJGYWlsZWQgdG8gY3JlYXRlIERXcml0 ZUJpdG1hcFJlbmRlclRhcmdldCIpOworCisgIC8qIFdlIGhhbmRsZSBoaWdoIGRwaSBkaXNw bGF5cyBieSBpbmNyZXNpbmcgZm9udCBzaXplLCBzbyBvdmVycmlkZQorICAgICBQaXhlbHNQ ZXJEaXAuICAqLworICBicnQtPmxwVnRibC0+U2V0UGl4ZWxzUGVyRGlwIChicnQsIDEuMCk7 CisKKyAgLyogVGhlIFNldFRleHRBbnRpYWxpYXNNb2RlIG1ldGhvZCBpcyBvbmx5IGF2YWls YWJsZSBpbgorICAgICBJRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0MS4gICovCisgIElEV3Jp dGVCaXRtYXBSZW5kZXJUYXJnZXQxICpicnQxOworICBociA9IGJydC0+bHBWdGJsLT5RdWVy eUludGVyZmFjZSAoYnJ0LAorCQkJCSAgICAmSUlEX0lEV3JpdGVCaXRtYXBSZW5kZXJUYXJn ZXQxLAorCQkJCSAgICAodm9pZCAqKikgJmJydDEpOworICBpZiAoU1VDQ0VFREVEIChocikp CisgICAgeworICAgICAgYnJ0MS0+bHBWdGJsLT5TZXRUZXh0QW50aWFsaWFzTW9kZSAoYnJ0 MSwgQU5USUFMSUFTX01PREUpOworICAgICAgUkVMRUFTRV9DT00gKGJydDEpOworICAgIH0K KworICByZXR1cm4gYnJ0OworfQorCit2b2lkCit3MzJfaW5pdGlhbGl6ZV9kaXJlY3Rfd3Jp dGUgKHZvaWQpCit7CisgIGRpcmVjdF93cml0ZV9hdmFpbGFibGUgPSBmYWxzZTsKKyAgSE1P RFVMRSBkaXJlY3Rfd3JpdGUgPSBMb2FkTGlicmFyeSAoImR3cml0ZS5kbGwiKTsKKyAgaWYg KCFkaXJlY3Rfd3JpdGUpCisgICAgcmV0dXJuOworCisgIC8qIFRoaXMgaXMgb25seSB1c2Vk IGhlcmUsIG5vIG5lZWQgdG8gZGVmaW5lIGl0IGdsb2JhbGx5LiAgKi8KKyAgdHlwZWRlZiBI UkVTVUxUIChXSU5BUEkgKkRXQ3JlYXRlRmFjdG9yeSkgKERXUklURV9GQUNUT1JZX1RZUEUg ZiwgUkVGSUlEIHIsIElVbmtub3duKiogdSk7CisKKyAgRFdDcmVhdGVGYWN0b3J5IGR3X2Ny ZWF0ZV9mYWN0b3J5CisgICAgPSAoRFdDcmVhdGVGYWN0b3J5KSBnZXRfcHJvY19hZGRyIChk aXJlY3Rfd3JpdGUsCisJCQkJICAgICAgICJEV3JpdGVDcmVhdGVGYWN0b3J5Iik7CisKKyAg aWYgKCFkd19jcmVhdGVfZmFjdG9yeSkKKyAgICB7CisgICAgICBGcmVlTGlicmFyeSAoZGly ZWN0X3dyaXRlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgSFJFU1VMVCBociA9IGR3 X2NyZWF0ZV9mYWN0b3J5IChEV1JJVEVfRkFDVE9SWV9UWVBFX1NIQVJFRCwKKwkJCQkgICZJ SURfSURXcml0ZUZhY3RvcnksCisJCQkJICAoSVVua25vd24gKiopICZkd3JpdGVfZmFjdG9y eSk7CisgIGlmIChGQUlMRUQgKGhyKSkKKyAgICB7CisgICAgICBGcmVlTGlicmFyeSAoZGly ZWN0X3dyaXRlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaHIgPSBkd3JpdGVfZmFj dG9yeS0+bHBWdGJsLT5RdWVyeUludGVyZmFjZSAoZHdyaXRlX2ZhY3RvcnksCisJCQkJCSAg ICAgICAmSUlEX0lEV3JpdGVGYWN0b3J5MiwKKwkJCQkJICAgICAgICh2b2lkICoqKSAmZHdy aXRlX2ZhY3RvcnkyKTsKKworICBpZiAoRkFJTEVEIChocikpCisgICAgeworICAgICAgUkVM RUFTRV9DT00gKGR3cml0ZV9mYWN0b3J5KTsKKyAgICAgIEZyZWVMaWJyYXJ5IChkaXJlY3Rf d3JpdGUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBociA9IGR3cml0ZV9mYWN0b3J5 LT5scFZ0YmwtPkdldEdkaUludGVyb3AgKGR3cml0ZV9mYWN0b3J5LAorCQkJCQkgICAgICAm Z2RpX2ludGVyb3ApOworICBpZiAoRkFJTEVEIChocikpCisgICAgeworICAgICAgUkVMRUFT RV9DT00gKGR3cml0ZV9mYWN0b3J5KTsKKyAgICAgIFJFTEVBU0VfQ09NIChkd3JpdGVfZmFj dG9yeTIpOworICAgICAgRnJlZUxpYnJhcnkgKGRpcmVjdF93cml0ZSk7CisgICAgICByZXR1 cm47CisgICAgfQorCisgIElEV3JpdGVSZW5kZXJpbmdQYXJhbXMgKmRlZjsKKworICBociA9 IGR3cml0ZV9mYWN0b3J5LT5scFZ0YmwtPkNyZWF0ZVJlbmRlcmluZ1BhcmFtcyAoZHdyaXRl X2ZhY3RvcnksCisJCQkJCQkgICAgICAmZGVmKTsKKyAgaWYgKEZBSUxFRCAoaHIpKQorICAg IHsKKyAgICAgIFJFTEVBU0VfQ09NIChkd3JpdGVfZmFjdG9yeSk7CisgICAgICBSRUxFQVNF X0NPTSAoZHdyaXRlX2ZhY3RvcnkyKTsKKyAgICAgIFJFTEVBU0VfQ09NIChnZGlfaW50ZXJv cCk7CisgICAgICBGcmVlTGlicmFyeSAoZGlyZWN0X3dyaXRlKTsKKyAgICAgIHJldHVybjsK KyAgICB9CisKKyAgLyogcmFuZ2U6IFswLjAsIDEuMF0gICovCisgIGZsb2F0IGVuaGFuY2Vk X2NvbnRyYXN0ID0gZGVmLT5scFZ0YmwtPkdldEVuaGFuY2VkQ29udHJhc3QgKGRlZik7Cisg IC8qIHJhbmdlOiBbMC4wLCAxLjBdICAqLworICBmbG9hdCBjbGVhcl90eXBlX2xldmVsID0g ZGVmLT5scFZ0YmwtPkdldENsZWFyVHlwZUxldmVsIChkZWYpOworICAvKiByYW5nZTogKDAu MCwgMjU2LjBdICovCisgIGZsb2F0IGdhbW1hID0gMS40OyAvKiBkZWYtPmxwVnRibC0+R2V0 R2FtbWEoZGVmKTsgKi8KKworICBociA9IGR3cml0ZV9mYWN0b3J5LT5scFZ0YmwtPkNyZWF0 ZUN1c3RvbVJlbmRlcmluZ1BhcmFtcyAoZHdyaXRlX2ZhY3RvcnksCisJCQkJCQkJICAgIGdh bW1hLAorCQkJCQkJCSAgICBlbmhhbmNlZF9jb250cmFzdCwKKwkJCQkJCQkgICAgY2xlYXJf dHlwZV9sZXZlbCwKKwkJCQkJCQkgICAgZGVmLT5scFZ0YmwtPkdldFBpeGVsR2VvbWV0cnko ZGVmKSwKKwkJCQkJCQkgICAgUkVOREVSSU5HX01PREUsCisJCQkJCQkJICAgICZyZW5kZXJp bmdfcGFyYW1zKTsKKworICBSRUxFQVNFX0NPTSAoZGVmKTsKKworICBpZiAoRkFJTEVEICho cikpCisgICAgeworICAgICAgUkVMRUFTRV9DT00gKGR3cml0ZV9mYWN0b3J5KTsKKyAgICAg IFJFTEVBU0VfQ09NIChkd3JpdGVfZmFjdG9yeTIpOworICAgICAgUkVMRUFTRV9DT00gKGdk aV9pbnRlcm9wKTsKKyAgICAgIEZyZWVMaWJyYXJ5IChkaXJlY3Rfd3JpdGUpOworICAgICAg cmV0dXJuOworICAgIH0KKworICBkaXJlY3Rfd3JpdGVfYXZhaWxhYmxlID0gdHJ1ZTsKKwor ICBERUZWQVJfQk9PTCAoInczMi1pbmhpYml0LWR3cml0ZSIsIHczMl9pbmhpYml0X2R3cml0 ZSwKKwkgICAgICAgZG9jOiAvKiBJZiB0LCBkb24ndCB1c2UgRGlyZWN0V3JpdGUuICAqLyk7 CisgIHczMl9pbmhpYml0X2R3cml0ZSA9IGZhbHNlOworfQorCit2b2lkIHczMl9kd3JpdGVf ZHJhdyAoSERDIGhkYywgaW50IHgsIGludCB5LCB1bnNpZ25lZCAqZ2x5cGhzLCBpbnQgbGVu LAorCQkgICAgICBDT0xPUlJFRiBjb2xvciwgc3RydWN0IGZvbnQgKmZvbnQpCit7CisgIEhS RVNVTFQgaHI7CisgIElEV3JpdGVGb250RmFjZSAqZHdyaXRlX2ZvbnRfZmFjZTsKKworICAv KiBXaGF0IHdlIGdldCBhcyB5IGlzIHRoZSBiYXNlbGluZSBwb3NpdGlvbi4gICovCisgIHkg LT0gZm9udC0+YXNjZW50OworCisgIGZsb2F0IGZvbnRfc2l6ZSA9IGdldF9mb250X2ZhY2Ug KGZvbnQsICZkd3JpdGVfZm9udF9mYWNlKTsKKyAgaWYgKGR3cml0ZV9mb250X2ZhY2UgPT0g TlVMTCkKKyAgICByZXR1cm47CisKKyAgc3RydWN0IGZvbnRfbWV0cmljcyBtZXRyaWNzOwor ICB0ZXh0X2V4dGVudHNfaW50ZXJuYWwgKGR3cml0ZV9mb250X2ZhY2UsIGZvbnRfc2l6ZSwg Z2x5cGhzLCBsZW4sICZtZXRyaWNzKTsKKworICBpbnQgYml0bWFwX3dpZHRoID0gbWV0cmlj cy53aWR0aCArIG1ldHJpY3MucmJlYXJpbmc7CisgIGludCBiaXRtYXBfaGVpZ2h0ID0gZm9u dC0+YXNjZW50ICsgZm9udC0+ZGVzY2VudDsKKworICAvKiBXZSBuZXZlciByZWxlYXNlIHRo aXMsIGdldF9iaXRtYXBfcmVuZGVyX3RhcmdldCByZXVzZXMgaXQuICAqLworICBJRFdyaXRl Qml0bWFwUmVuZGVyVGFyZ2V0ICpiaXRtYXBfcmVuZGVyX3RhcmdldCA9CisgICAgZ2V0X2Jp dG1hcF9yZW5kZXJfdGFyZ2V0IChoZGMsIGJpdG1hcF93aWR0aCwgYml0bWFwX2hlaWdodCk7 CisKKyAgLyogVGhpcyBEQyBjYW4ndCBiZSByZWxlYXNlZC4gICovCisgIEhEQyB0ZXh0X2Rj ID0gYml0bWFwX3JlbmRlcl90YXJnZXQtPmxwVnRibC0+R2V0TWVtb3J5REMKKyAgICAoYml0 bWFwX3JlbmRlcl90YXJnZXQpOworCisgIC8qIENvcHkgdGhlIGJhY2tncm91bmQgcGl4ZWwg dG8gdGhlIHJlbmRlciB0YXJnZXQgYml0bWFwLiAgKi8KKyAgQml0Qmx0ICh0ZXh0X2RjLCAw LCAwLCBiaXRtYXBfd2lkdGgsIGJpdG1hcF9oZWlnaHQsIGhkYywgeCwgeSwgU1JDQ09QWSk7 CisKKworICBVSU5UMTYgKmluZGljZXMgPSBhbGxvY2EgKGxlbiAqIHNpemVvZiAoVUlOVDE2 KSk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICBpbmRpY2VzW2ld ID0gZ2x5cGhzW2ldOworCisgIEZMT0FUICphZHZhbmNlcyA9IGFsbG9jYSAobGVuICogc2l6 ZW9mIChGTE9BVCkpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAg eworICAgICAgdGV4dF9leHRlbnRzX2ludGVybmFsIChkd3JpdGVfZm9udF9mYWNlLCBmb250 X3NpemUsIGdseXBocyArIGksIDEsCisJCQkgICAgICZtZXRyaWNzKTsKKyAgICAgIGFkdmFu Y2VzW2ldID0gbWV0cmljcy53aWR0aDsKKyAgICB9CisKKyAgRFdSSVRFX0dMWVBIX1JVTiBn bHlwaF9ydW47CisgIGdseXBoX3J1bi5mb250RmFjZSA9IGR3cml0ZV9mb250X2ZhY2U7Cisg IGdseXBoX3J1bi5mb250RW1TaXplID0gZm9udF9zaXplOworICBnbHlwaF9ydW4uZ2x5cGhJ bmRpY2VzID0gaW5kaWNlczsKKyAgZ2x5cGhfcnVuLmdseXBoQ291bnQgPSBsZW47CisgIGds eXBoX3J1bi5pc1NpZGV3YXlzID0gZmFsc2U7CisgIGdseXBoX3J1bi5iaWRpTGV2ZWwgPSAw OworICBnbHlwaF9ydW4uZ2x5cGhPZmZzZXRzID0gTlVMTDsKKyAgZ2x5cGhfcnVuLmdseXBo QWR2YW5jZXMgPSBhZHZhbmNlczsKKworICBJRFdyaXRlQ29sb3JHbHlwaFJ1bkVudW1lcmF0 b3IgKmxheWVyczsKKyAgLyogVGhpcyBjYWxsIHdpbGwgdGVsbCB1cyBpZiB3ZSBoYWNlIHRv IGhhbmRsZSBhbnkgY29sb3IgZ2x5cGguICAqLworICBociA9IGR3cml0ZV9mYWN0b3J5Mi0+ bHBWdGJsLT5UcmFuc2xhdGVDb2xvckdseXBoUnVuIChkd3JpdGVfZmFjdG9yeTIsCisJCQkJ CQkJMCwgZm9udC0+YXNjZW50LAorCQkJCQkJCSZnbHlwaF9ydW4sCisJCQkJCQkJTlVMTCwK KwkJCQkJCQlNRUFTVVJJTkdfTU9ERSwKKwkJCQkJCQlOVUxMLAorCQkJCQkJCTAsCisJCQkJ CQkJJmxheWVycyk7CisKKyAgLyogTm8gY29sb3IuICBKdXN0IGRyYXcgdGhlIEdseXBoUnVu LiAgKi8KKyAgaWYgKGhyID09IERXUklURV9FX05PQ09MT1IpCisgICAgICBiaXRtYXBfcmVu ZGVyX3RhcmdldC0+bHBWdGJsLT5EcmF3R2x5cGhSdW4gKGJpdG1hcF9yZW5kZXJfdGFyZ2V0 LAorCQkJCQkJICAwLCBmb250LT5hc2NlbnQsCisJCQkJCQkgIE1FQVNVUklOR19NT0RFLAor CQkJCQkJICAmZ2x5cGhfcnVuLAorCQkJCQkJICByZW5kZXJpbmdfcGFyYW1zLAorCQkJCQkJ ICBjb2xvciwKKwkJCQkJCSAgTlVMTCk7CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBJZiB0 aGVyZSB3ZXJlIGNvbG9yIGdseXBocywgbGF5ZXJzIGNvbnRhaW5zIGEgbGlzdCBvZiBHbHlw aFJ1bgorCSB3aXRoIGEgY29sb3IgYW5kIGEgcG9zaXRpb24gZm9yIGVhY2guICBXZSBkcmF3 IHRoZW0KKwkgaW5kaXZpZHVhbGx5LiAgKi8KKyAgICAgIHZlcmlmeV9ociAoaHIsICJGYWls ZWQgYXQgVHJhbnNsYXRlQ29sb3JHbHlwaFJ1biIpOworICAgICAgZm9yICg7OykgeworCUhS RVNVTFQgaHI7CisJQk9PTCBtb3JlX2xheWVyczsKKwljb25zdCBEV1JJVEVfQ09MT1JfR0xZ UEhfUlVOICpsYXllcjsKKworCWhyID0gbGF5ZXJzLT5scFZ0YmwtPk1vdmVOZXh0IChsYXll cnMsICZtb3JlX2xheWVycyk7CisJdmVyaWZ5X2hyIChociwgIkZhaWxlZCBhdCBNb3ZlTmV4 dCIpOworCWlmICghbW9yZV9sYXllcnMpCisJICBicmVhazsKKwlociA9IGxheWVycy0+bHBW dGJsLT5HZXRDdXJyZW50UnVuIChsYXllcnMsICZsYXllcik7CisJdmVyaWZ5X2hyIChociwg IkZhaWxlZCBhdCBHZXRDdXJyZW50UnVuIik7CisJYml0bWFwX3JlbmRlcl90YXJnZXQtPmxw VnRibC0+RHJhd0dseXBoUnVuCisJICAoYml0bWFwX3JlbmRlcl90YXJnZXQsCisJICAgbGF5 ZXItPmJhc2VsaW5lT3JpZ2luWCwKKwkgICBsYXllci0+YmFzZWxpbmVPcmlnaW5ZLAorCSAg IE1FQVNVUklOR19NT0RFLAorCSAgICZsYXllci0+Z2x5cGhSdW4sCisJICAgcmVuZGVyaW5n X3BhcmFtcywKKwkgICBSR0IgKGxheWVyLT5ydW5Db2xvci5yICogMjU1LAorCQlsYXllci0+ cnVuQ29sb3IuZyAqIDI1NSwKKwkJbGF5ZXItPnJ1bkNvbG9yLmIgKiAyNTUpLAorCSAgIE5V TEwpOworICAgICAgfQorICAgICAgUkVMRUFTRV9DT00gKGxheWVycyk7CisgICAgfQorCisg IC8qIEZpbmFsbHksIGNvcHkgdGhlIHJlbmRlcmVkIHRleHQgYmFjayB0byB0aGUgb3JpZ2lu YWwgREMuICAqLworICBCaXRCbHQgKGhkYywgeCwgeSwgYml0bWFwX3dpZHRoLCBiaXRtYXBf aGVpZ2h0LCB0ZXh0X2RjLCAwLCAwLCBTUkNDT1BZKTsKK30KKworLyogUmV0dXJucyB0cnVl IGlmIERpcmVjdFdyaXRlIGlzIHRvIGJlIHVzZWQ6CisgICAtIEl0IGlzIGF2YWlsYWJsZS4K KyAgIC0gVGhlIGZvbnQgaXMgaGFuZGxlZCBieSBIYXJmQnV6ei4KKyAgIC0gdzMyLWluaGli aXQtZHdyaXRlIGlzIGZhbHNlLgorICovCitib29sCit3MzJfdXNlX2RpcmVjdF93cml0ZSAo c3RydWN0IHczMmZvbnRfaW5mbyAqdzMyZm9udCkKK3sKKyNpZmRlZiBIQVZFX0hBUkZCVVpa CisgIHJldHVybiBkaXJlY3Rfd3JpdGVfYXZhaWxhYmxlCisgICAgJiYgdzMyZm9udC0+Zm9u dC5kcml2ZXIgPT0gJmhhcmZidXp6X2ZvbnRfZHJpdmVyCisgICAgJiYgIXczMl9pbmhpYml0 X2R3cml0ZTsKKyNlbHNlCisgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0 IGEvc3JjL3czMmZvbnQuYyBiL3NyYy93MzJmb250LmMKaW5kZXggZWZiNDJkODAzMzYuLjE2 YWE5MzA4NTg0IDEwMDY0NAotLS0gYS9zcmMvdzMyZm9udC5jCisrKyBiL3NyYy93MzJmb250 LmMKQEAgLTU1LDYgKzU1LDEzIEBAICNkZWZpbmUgVklFVE5BTUVTRV9DSEFSU0VUIDE2Mwog I2RlZmluZSBKT0hBQl9DSEFSU0VUIDEzMAogI2VuZGlmCiAKKy8qIEZ1bmN0aW9uIHByb3Rv dHlwZXMgZnJvbSB3MzJ3cml0ZS5jICAqLworYm9vbCB3MzJfdXNlX2RpcmVjdF93cml0ZSAo c3RydWN0IHczMmZvbnRfaW5mbyAqdzMyZm9udCk7Cit2b2lkIHczMl9kd3JpdGVfZHJhdyAo SERDIGhkYywgaW50IHgsIGludCB5LCB1bnNpZ25lZCAqZ2x5cGhzLCBpbnQgbGVuLAorCQkg IENPTE9SUkVGIGNvbG9yLCBzdHJ1Y3QgZm9udCAqZm9udCApOwordm9pZCB3MzJfZHdyaXRl X3RleHRfZXh0ZW50cyAoc3RydWN0IGZvbnQgKmZvbnQsIGNvbnN0IHVuc2lnbmVkICpjb2Rl LAorCQkJICBpbnQgbmdseXBocywgc3RydWN0IGZvbnRfbWV0cmljcyAqbWV0cmljcyk7CisK IHN0YXRpYyB2b2lkIGZpbGxfaW5fbG9nZm9udCAoc3RydWN0IGZyYW1lICosIExPR0ZPTlQg KiwgTGlzcF9PYmplY3QpOwogCiBzdGF0aWMgQllURSB3MzJfYW50aWFsaWFzX3R5cGUgKExp c3BfT2JqZWN0KTsKQEAgLTQ1Miw2ICs0NTksMTIgQEAgdzMyZm9udF90ZXh0X2V4dGVudHMg KHN0cnVjdCBmb250ICpmb250LCBjb25zdCB1bnNpZ25lZCAqY29kZSwKIAogICBtZW1zZXQg KG1ldHJpY3MsIDAsIHNpemVvZiAoc3RydWN0IGZvbnRfbWV0cmljcykpOwogCisgIGlmICh3 MzJfdXNlX2RpcmVjdF93cml0ZSAodzMyX2ZvbnQpKQorICAgIHsKKyAgICAgIHczMl9kd3Jp dGVfdGV4dF9leHRlbnRzIChmb250LCBjb2RlLCBuZ2x5cGhzLCBtZXRyaWNzKTsKKyAgICAg IHJldHVybjsKKyAgICB9CisKICAgZm9yIChpID0gMCwgZmlyc3QgPSB0cnVlOyBpIDwgbmds eXBoczsgaSsrKQogICAgIHsKICAgICAgIHN0cnVjdCB3MzJfbWV0cmljX2NhY2hlICpjaGFy X21ldHJpYzsKQEAgLTcwNiwyMiArNzE5LDM2IEBAIHczMmZvbnRfZHJhdyAoc3RydWN0IGds eXBoX3N0cmluZyAqcywgaW50IGZyb20sIGludCB0bywKICAgICAgIGludCBpOwogCiAgICAg ICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JewotCSAgV0NIQVIgYyA9IHMtPmNoYXIy Yltmcm9tICsgaV0gJiAweEZGRkY7Ci0JICBFeHRUZXh0T3V0VyAocy0+aGRjLCB4ICsgaSwg eSwgb3B0aW9ucywgTlVMTCwgJmMsIDEsIE5VTEwpOwotCX0KKwlpZiAodzMyX3VzZV9kaXJl Y3Rfd3JpdGUgKHczMmZvbnQpKQorCSAgeworCSAgICB3MzJfZHdyaXRlX2RyYXcgKHMtPmhk YywgeCwgeSwgcy0+Y2hhcjJiICsgZnJvbSwgMSwKKwkJCSBHZXRUZXh0Q29sb3Iocy0+aGRj KSwgcy0+Zm9udCk7CisJICB9CisJZWxzZQorCSAgeworCSAgICBXQ0hBUiBjID0gcy0+Y2hh cjJiW2Zyb20gKyBpXSAmIDB4RkZGRjsKKwkgICAgRXh0VGV4dE91dFcgKHMtPmhkYywgeCAr IGksIHksIG9wdGlvbnMsIE5VTEwsICZjLCAxLCBOVUxMKTsKKwkgIH0KICAgICB9CiAgIGVs c2UKICAgICB7Ci0gICAgICAvKiBUaGUgbnVtYmVyIG9mIGdseXBocyBpbiBhIGdseXBoX3N0 cmluZyBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4KLQkgdGhlIG1heGltdW0gdmFsdWUgb2YgdGhl ICd1c2VkJyBtZW1iZXIgb2YgYSBnbHlwaF9yb3csIHNvIHdlCi0JIGFyZSBPSyB1c2luZyBh bGxvY2EgaGVyZS4gICovCi0gICAgICBlYXNzZXJ0IChsZW4gPD0gU0hSVF9NQVgpOwotICAg ICAgV0NIQVIgKmNoYXJzID0gYWxsb2NhIChsZW4gKiBzaXplb2YgKFdDSEFSKSk7Ci0gICAg ICBpbnQgajsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBsZW47IGorKykKLQljaGFyc1tqXSA9 IHMtPmNoYXIyYltmcm9tICsgal0gJiAweEZGRkY7Ci0gICAgICBFeHRUZXh0T3V0VyAocy0+ aGRjLCB4LCB5LCBvcHRpb25zLCBOVUxMLCBjaGFycywgbGVuLCBOVUxMKTsKKyAgICAgIGlm ICh3MzJfdXNlX2RpcmVjdF93cml0ZSAodzMyZm9udCkpCisJeworCSAgdzMyX2R3cml0ZV9k cmF3ICggcy0+aGRjLCB4LCB5LAorCQkJcy0+Y2hhcjJiICsgZnJvbSwgbGVuLCBHZXRUZXh0 Q29sb3Iocy0+aGRjKSwgcy0+Zm9udCApOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBU aGUgbnVtYmVyIG9mIGdseXBocyBpbiBhIGdseXBoX3N0cmluZyBjYW5ub3QgYmUgbGFyZ2Vy IHRoYW4KKwkgICAgIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSAndXNlZCcgbWVtYmVyIG9m IGEgZ2x5cGhfcm93LCBzbyB3ZQorCSAgICAgYXJlIE9LIHVzaW5nIGFsbG9jYSBoZXJlLiAg Ki8KKwkgIGVhc3NlcnQgKGxlbiA8PSBTSFJUX01BWCk7CisJICBXQ0hBUiAqY2hhcnMgPSBh bGxvY2EgKGxlbiAqIHNpemVvZiAoV0NIQVIpKTsKKwkgIGludCBqOworCSAgZm9yIChqID0g MDsgaiA8IGxlbjsgaisrKQorCSAgICBjaGFyc1tqXSA9IHMtPmNoYXIyYltmcm9tICsgal0g JiAweEZGRkY7CisJICBFeHRUZXh0T3V0VyAocy0+aGRjLCB4LCB5LCBvcHRpb25zLCBOVUxM LCBjaGFycywgbGVuLCBOVUxMKTsKKwl9CiAgICAgfQogCiAgIC8qIFJlc3RvcmUgY2xpcCBy ZWdpb24uICAqLwpkaWZmIC0tZ2l0IGEvc3JjL3czMmZvbnQuaCBiL3NyYy93MzJmb250LmgK aW5kZXggM2Y3ODBjMWQ4NjYuLjA3NzRlOTJmYWE5IDEwMDY0NAotLS0gYS9zcmMvdzMyZm9u dC5oCisrKyBiL3NyYy93MzJmb250LmgKQEAgLTg0LDYgKzg0LDE5IEBAICNkZWZpbmUgQ0FD SEVfQkxPQ0tTSVpFIDEyOAogCiBMaXNwX09iamVjdCBpbnRlcm5fZm9udF9uYW1lIChjaGFy ICopOwogCisvKiBGdW5jdGlvbiBwcm90b3R5cGVzIGZvciBEaXJlY3RXcml0ZS4gICovCit2 b2lkIHczMl9pbml0aWFsaXplX2RpcmVjdF93cml0ZSAodm9pZCk7Citib29sIHczMl91c2Vf ZGlyZWN0X3dyaXRlIChzdHJ1Y3QgdzMyZm9udF9pbmZvICp3MzJmb250KTsKK3ZvaWQgdzMy X2R3cml0ZV9kcmF3IChIREMgaGRjLCBpbnQgeCwgaW50IHksIHVuc2lnbmVkICpnbHlwaHMs IGludCBsZW4sCisJCSAgICAgIENPTE9SUkVGIGNvbG9yLCBzdHJ1Y3QgZm9udCAqZm9udCAp Owordm9pZCB3MzJfZHdyaXRlX3RleHRfZXh0ZW50cyAoc3RydWN0IGZvbnQgKmZvbnQsIGNv bnN0IHVuc2lnbmVkICpjb2RlLAorCQkJICAgICAgaW50IG5nbHlwaHMsIHN0cnVjdCBmb250 X21ldHJpY3MgKm1ldHJpY3MpOwordW5zaWduZWQgdzMyX2R3cml0ZV9lbmNvZGVfY2hhciAo c3RydWN0IGZvbnQgKmZvbnQsIGludCBjKTsKK3ZvaWQgdzMyX2R3cml0ZV9mcmVlX2NhY2hl ZF9mYWNlKHZvaWQgKmNhY2hlKTsKK3ZvaWQgKnczMl9mb250X2dldF9kd3JpdGVfY2FjaGUg KHN0cnVjdCBmb250ICpmb250LCBmbG9hdCAqZm9udF9zaXplKTsKK3ZvaWQgdzMyX2ZvbnRf c2V0X2R3cml0ZV9jYWNoZSAoc3RydWN0IGZvbnQgKmZvbnQsIHZvaWQgKmNhY2hlLAorCQkJ CWZsb2F0IGZvbnRfc2l6ZSk7CisKIGV4dGVybiB2b2lkIGdsb2JhbHNfb2ZfdzMyZm9udCAo dm9pZCk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3czMnVuaXNjcmliZS5jIGIvc3Jj L3czMnVuaXNjcmliZS5jCmluZGV4IGI3N2JmNTZiOGNmLi45MmRmNDk2MTBiYiAxMDA2NDQK LS0tIGEvc3JjL3czMnVuaXNjcmliZS5jCisrKyBiL3NyYy93MzJ1bmlzY3JpYmUuYwpAQCAt NTQsOCArNTQsMjcgQEAgI2RlZmluZSBfV0lOMzJfV0lOTlQgMHgwNjAwCiAgIHZvaWQgKmNh Y2hlOwogICAvKiBUaGlzIGlzIHVzZWQgYnkgdGhlIEhhcmZCdXp6IGJhY2tlbmQgdG8gc3Rv cmUgdGhlIGZvbnQgc2NhbGUuICAqLwogICBkb3VibGUgc2NhbGU7CisgIC8qIFRoaXMgaXMg dXNlZCBieSBEaXJlY3RXcml0ZSB0byBzdG9yZSB0aGUgRm9udEZhY2Ugb2JqZWN0LgorICAg ICBEaXJlY3RXcml0ZSB3b3JrcyBvbiB0b3Agb2YgdGhlIEhhcmZCdXp6IGJhY2tlbmQsIG1v ZGlmeWluZyBzb21lCisgICAgIGNhbGxzLiAgKi8KKyAgdm9pZCAqZHdyaXRlX2NhY2hlOwor ICBmbG9hdCBkd3JpdGVfZm9udF9zaXplOwogfTsKIAordm9pZCAqCit3MzJfZm9udF9nZXRf ZHdyaXRlX2NhY2hlIChzdHJ1Y3QgZm9udCAqZm9udCwgZmxvYXQgKmZvbnRfc2l6ZSkKK3sK KyAgKmZvbnRfc2l6ZSA9ICgoc3RydWN0IHVuaXNjcmliZV9mb250X2luZm8gKikgZm9udCkt PmR3cml0ZV9mb250X3NpemU7CisgIHJldHVybiAoKHN0cnVjdCB1bmlzY3JpYmVfZm9udF9p bmZvICopIGZvbnQpLT5kd3JpdGVfY2FjaGU7Cit9CisKK3ZvaWQKK3czMl9mb250X3NldF9k d3JpdGVfY2FjaGUgKHN0cnVjdCBmb250ICpmb250LCB2b2lkICpjYWNoZSwgZmxvYXQgZm9u dF9zaXplKQoreworICAoKHN0cnVjdCB1bmlzY3JpYmVfZm9udF9pbmZvICopIGZvbnQpLT5k d3JpdGVfZm9udF9zaXplID0gZm9udF9zaXplOworICAoKHN0cnVjdCB1bmlzY3JpYmVfZm9u dF9pbmZvICopIGZvbnQpLT5kd3JpdGVfY2FjaGUgPSBjYWNoZTsKK30KKwogaW50IHVuaXNj cmliZV9hdmFpbGFibGUgPSAwOwogCiAvKiBFbnVtRm9udEZhbWlsaWVzRXggY2FsbGJhY2su ICAqLwpAQCAtMjAwLDYgKzIxOSw3IEBAIHVuaXNjcmliZV9vcGVuIChzdHJ1Y3QgZnJhbWUg KmYsIExpc3BfT2JqZWN0IGZvbnRfZW50aXR5LCBpbnQgcGl4ZWxfc2l6ZSkKIAogICAvKiBJ bml0aWFsaXplIHRoZSBjYWNoZSBmb3IgdGhpcyBmb250LiAgKi8KICAgdW5pc2NyaWJlX2Zv bnQtPmNhY2hlID0gTlVMTDsKKyAgdW5pc2NyaWJlX2ZvbnQtPmR3cml0ZV9jYWNoZSA9IE5V TEw7CiAKICAgLyogVW5pc2NyaWJlIGFuZCBIYXJmQnV6eiBiYWNrZW5kcyB1c2UgZ2x5cGgg aW5kaWNlcy4gICovCiAgIHVuaXNjcmliZV9mb250LT53MzJfZm9udC5nbHlwaF9pZHggPSBF VE9fR0xZUEhfSU5ERVg7CkBAIC0yMjEsNiArMjQxLDcgQEAgdW5pc2NyaWJlX2Nsb3NlIChz dHJ1Y3QgZm9udCAqZm9udCkKICAgICA9IChzdHJ1Y3QgdW5pc2NyaWJlX2ZvbnRfaW5mbyAq KSBmb250OwogCiAjaWZkZWYgSEFWRV9IQVJGQlVaWgorICB3MzJfZHdyaXRlX2ZyZWVfY2Fj aGVkX2ZhY2UgKHVuaXNjcmliZV9mb250LT5kd3JpdGVfY2FjaGUpOwogICBpZiAodW5pc2Ny aWJlX2ZvbnQtPnczMl9mb250LmZvbnQuZHJpdmVyID09ICZoYXJmYnV6el9mb250X2RyaXZl cgogICAgICAgJiYgdW5pc2NyaWJlX2ZvbnQtPmNhY2hlKQogICAgIGhiX2ZvbnRfZGVzdHJv eSAoKGhiX2ZvbnRfdCAqKSB1bmlzY3JpYmVfZm9udC0+Y2FjaGUpOwpAQCAtMTM3Miw2ICsx MzkzLDEwIEBAIHczMmhiX2VuY29kZV9jaGFyIChzdHJ1Y3QgZm9udCAqZm9udCwgaW50IGMp CiAgIHN0cnVjdCB1bmlzY3JpYmVfZm9udF9pbmZvICp1bmlzY3JpYmVfZm9udAogICAgID0g KHN0cnVjdCB1bmlzY3JpYmVfZm9udF9pbmZvICopIGZvbnQ7CiAgIGVhc3NlcnQgKHVuaXNj cmliZV9mb250LT53MzJfZm9udC5mb250LmRyaXZlciA9PSAmaGFyZmJ1enpfZm9udF9kcml2 ZXIpOworCisgIGlmICh3MzJfdXNlX2RpcmVjdF93cml0ZSgmdW5pc2NyaWJlX2ZvbnQtPncz Ml9mb250KSkKKyAgICAgIHJldHVybiB3MzJfZHdyaXRlX2VuY29kZV9jaGFyKGZvbnQsIGMp OworCiAgIGhiX2ZvbnRfdCAqaGJfZm9udCA9IHVuaXNjcmliZV9mb250LT5jYWNoZTsKIAog ICAvKiBGaXJzdCB0aW1lIHdlIHVzZSB0aGlzIGZvbnQgd2l0aCBIYXJmQnV6eiwgY3JlYXRl IHRoZSBoYl9mb250X3QKQEAgLTE1MzEsNiArMTU1Niw4IEBAIGxvYWRfaGFyZmJ1enpfZnVu Y3MgKEhNT0RVTEUgbGlicmFyeSkKIH0KICNlbmRpZgkvKiBIQVZFX0hBUkZCVVpaICovCiAK K3ZvaWQgdzMyX2luaXRpYWxpemVfZGlyZWN0X3dyaXRlICh2b2lkKTsKKwogc3RhdGljIHZv aWQKIHN5bXNfb2ZfdzMydW5pc2NyaWJlX2Zvcl9wZHVtcGVyICh2b2lkKQogewpAQCAtMTYy NCw1ICsxNjUxLDggQEAgc3ltc19vZl93MzJ1bmlzY3JpYmVfZm9yX3BkdW1wZXIgKHZvaWQp CiAgIGhhcmZidXp6X2ZvbnRfZHJpdmVyLmNvbWJpbmluZ19jYXBhYmlsaXR5ID0gaGJmb250 X2NvbWJpbmluZ19jYXBhYmlsaXR5OwogICBoYXJmYnV6el9mb250X2RyaXZlci5iZWdpbl9o Yl9mb250ID0gdzMyaGJfYmVnaW5fZm9udDsKICAgcmVnaXN0ZXJfZm9udF9kcml2ZXIgKCZo YXJmYnV6el9mb250X2RyaXZlciwgTlVMTCk7CisKKyAgdzMyX2luaXRpYWxpemVfZGlyZWN0 X3dyaXRlICgpOworCiAjZW5kaWYJLyogSEFWRV9IQVJGQlVaWiAqLwogfQotLSAKMi4zNS4x LndpbmRvd3MuMgoK --------------CMM8u6zkSLlV8TvGrxxH8USa-- From debbugs-submit-bounces@debbugs.gnu.org Thu Oct 17 02:21:44 2024 Received: (at 73730) by debbugs.gnu.org; 17 Oct 2024 06:21:44 +0000 Received: from localhost ([127.0.0.1]:33133 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t1JtH-0005bE-SP for submit@debbugs.gnu.org; Thu, 17 Oct 2024 02:21:44 -0400 Received: from eggs.gnu.org ([209.51.188.92]:52224) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t1JtC-0005av-LD for 73730@debbugs.gnu.org; Thu, 17 Oct 2024 02:21:42 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1t1Jsl-0005qm-HB; Thu, 17 Oct 2024 02:21:11 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=BHnGC+exxaJtu13cV8F2JVTK8THbDWi31Lthb9C639Y=; b=LV0b4Ya78O0S 9SCIsJN65Ov5gB7/jmJsUIWa4js2+MX85VSZG7aSj3xnhljmEQ64uWBOP0FW+GIoCWPLpztK3X+ba OX9Kr/PT/DQ1nnqV3dzZJ8uVsIrQ5Yzzo51HvJN8sCs2rOPGOimMXPLn9QOtxF6yIfGQGY5RRIcmL +twjW8Uwikiih5BJk0/NJp+VbdXM4vOEXHvT7JkVRqi6WfjlpCEgbLYnTjOETmrxIbrNfG9xJe+LY ymX1nY6e6asb3EJBNqa1j40x63vxJXc2B5U5AYKWzx9u+JkfM7bTH04mYhPiaNg94xK3saZfL4faa 0F6YVia1Tgyr58OuNcCl8A==; Date: Thu, 17 Oct 2024 09:21:08 +0300 Message-Id: <86bjzjp7vv.fsf@gnu.org> From: Eli Zaretskii To: Cecilio Pardo In-Reply-To: <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> (message from Cecilio Pardo on Wed, 16 Oct 2024 23:35:34 +0200) Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org, kbrown@cornell.edu X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > Date: Wed, 16 Oct 2024 23:35:34 +0200 > Cc: 73730@debbugs.gnu.org > From: Cecilio Pardo > > Still not done with this, but I am sending a new patch to fix the bug > with w32-find-non-USB-fonts. It calls text_extents with a font of size > 0. Checking for that seems to solve the problem. Is that really TRT? What does it mean font_size = 0 in this case? > BTW, why does that variable show as undocumented with > describe-variables? What am I doing wrong? You used DEFVAR_BOOL inside a function. It should be on the top level (look at other places where we define such variables), then make-docfile will collect its definition and it will be written to etc/DOC. > - Instead of aborting on failure, just disable DirectWrite and let emacs > continue. This will take some work. Instead of disabling DirectWrite, it might be better to fall back on previous code -- that way, the glyphs will be shown, but without colors. The trick is to detect this early enough, because some fonts AFAIR cannot be displayed using non-dwrite code. > >> + glyph_run.bidiLevel = 0; > > ^^^^^^^^^^^^^ > > Is this because otherwise DirectWrite will possibly reorder the > > glyphs or something? Did you test this with R2L text, e.g. by > > displaying TUTORIAL.he? I did try, and it looks OK, but are there any > > color fonts that cover the Hebrew block, so I could be sure everything > > works in that case? > > > > More generally, what color fonts can be used with this build on > > Windows for characters other than Emoji, in addition to Segoe UI > > Emoji? > > > The documentation describes this field as the "implicit resolved level > of the glyph run". Odd levels indicate RTL, and the function asks for > the right side position as origin, so I think they would be reordered. > > As there is no reference to bidi in w32font.c, I assumed glyphs reach > this layer prepared to be rendered ltr. Yes, that's true. > I think the only color font that Windows has is the emoji one. I'll try > to find some other to test this. Thanks. > >> +void *w32_font_get_dwrite_cache (struct font *font, float *font_size); > >> +void w32_font_set_dwrite_cache (struct font *font, void *cache, float font_size); > > > > Why aren't these functions defined in w32dwrite.c? > > They need to know about the uniscribe_font struct, which is defined there. If that's the only reason, we could perhaps move the definition of uniscribe_font struct to w32font.h. From debbugs-submit-bounces@debbugs.gnu.org Thu Oct 17 06:39:03 2024 Received: (at 73730) by debbugs.gnu.org; 17 Oct 2024 10:39:03 +0000 Received: from localhost ([127.0.0.1]:33513 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t1NuI-0000GD-OR for submit@debbugs.gnu.org; Thu, 17 Oct 2024 06:39:02 -0400 Received: from mail.imayhem.com ([82.223.54.191]:46397 helo=zealous-pike.82-223-54-191.plesk.page) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t1NuH-0000FY-8y for 73730@debbugs.gnu.org; Thu, 17 Oct 2024 06:39:01 -0400 Received: from [10.0.12.77] (66.red-2-136-43.staticip.rima-tde.net [2.136.43.66]) by zealous-pike.82-223-54-191.plesk.page (Postfix) with ESMTPSA id 4BD5D80119; Thu, 17 Oct 2024 10:38:32 +0000 (UTC) Authentication-Results: zealous-pike.82-223-54-191.plesk.page; spf=pass (sender IP is 2.136.43.66) smtp.mailfrom=cpardo@imayhem.com smtp.helo=[10.0.12.77] Received-SPF: pass (zealous-pike.82-223-54-191.plesk.page: connection is authenticated) Message-ID: Date: Thu, 17 Oct 2024 12:38:31 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows To: Eli Zaretskii References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> <86bjzjp7vv.fsf@gnu.org> Content-Language: es-ES From: Cecilio Pardo In-Reply-To: <86bjzjp7vv.fsf@gnu.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org, kbrown@cornell.edu X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) On 17/10/2024 8:21, Eli Zaretskii wrote: >> Still not done with this, but I am sending a new patch to fix the bug >> with w32-find-non-USB-fonts. It calls text_extents with a font of size >> 0. Checking for that seems to solve the problem. > > Is that really TRT? What does it mean font_size = 0 in this case? No, I was wrong, sorry. DirectDwrite is failing to create a font from certain GDI fonts. I need to then fall back to w32font. I'm on it. >> BTW, why does that variable show as undocumented with >> describe-variables? What am I doing wrong? > > You used DEFVAR_BOOL inside a function. It should be on the top level > (look at other places where we define such variables), then > make-docfile will collect its definition and it will be written to > etc/DOC. Thanks. >> - Instead of aborting on failure, just disable DirectWrite and let emacs >> continue. This will take some work. > > Instead of disabling DirectWrite, it might be better to fall back on > previous code -- that way, the glyphs will be shown, but without > colors. The trick is to detect this early enough, because some fonts > AFAIR cannot be displayed using non-dwrite code. Ok. >>>> +void *w32_font_get_dwrite_cache (struct font *font, float *font_size); >>>> +void w32_font_set_dwrite_cache (struct font *font, void *cache, float font_size); >>> >>> Why aren't these functions defined in w32dwrite.c? >> >> They need to know about the uniscribe_font struct, which is defined there. > > If that's the only reason, we could perhaps move the definition of > uniscribe_font struct to w32font.h. Will do that. From debbugs-submit-bounces@debbugs.gnu.org Sun Oct 20 09:35:45 2024 Received: (at 73730) by debbugs.gnu.org; 20 Oct 2024 13:35:45 +0000 Received: from localhost ([127.0.0.1]:46335 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t2W5w-0008Hn-Tw for submit@debbugs.gnu.org; Sun, 20 Oct 2024 09:35:45 -0400 Received: from mail.imayhem.com ([82.223.54.191]:43201 helo=zealous-pike.82-223-54-191.plesk.page) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t2W5u-0008HO-E0 for 73730@debbugs.gnu.org; Sun, 20 Oct 2024 09:35:42 -0400 Received: from [192.168.68.105] (111.red-88-21-7.staticip.rima-tde.net [88.21.7.111]) by zealous-pike.82-223-54-191.plesk.page (Postfix) with ESMTPSA id 9C13F80224; Sun, 20 Oct 2024 13:35:10 +0000 (UTC) Authentication-Results: zealous-pike.82-223-54-191.plesk.page; spf=pass (sender IP is 88.21.7.111) smtp.mailfrom=cpardo@imayhem.com smtp.helo=[192.168.68.105] Received-SPF: pass (zealous-pike.82-223-54-191.plesk.page: connection is authenticated) Message-ID: <80dc50bd-b2d4-4d21-ad38-322412588b3b@imayhem.com> Date: Sun, 20 Oct 2024 15:35:10 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows From: Cecilio Pardo To: Eli Zaretskii References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> <86bjzjp7vv.fsf@gnu.org> Content-Language: es-ES In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org, kbrown@cornell.edu X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) On 17/10/2024 12:38, Cecilio Pardo wrote: >>> Still not done with this, but I am sending a new patch to fix the bug >>> with w32-find-non-USB-fonts.ย  It calls text_extents with a font of size >>> 0. Checking for that seems to solve the problem. >> >> Is that really TRT?ย  What does it mean font_size = 0 in this case? > > No, I was wrong, sorry. DirectDwrite is failing to create a font from > certain GDI fonts. I need to then fall back to w32font. I'm on it. > The error is caused indeed by fonts with size == 0. - w32-find-non-USB-fonts calls open-font with size == nil. - open-font gets the size from font-entity, that is also empty. - It ends up calling CreateFontIndirect with a LOGFONT with lfHeight == 0 - Then, w32-find-non-USB-fonts calls font-get-glyphs, which call text_extents. - text_extents on DirectWrite fails with a font of size 0, but w32font_text_extents does return values that are not 0. If the case of size <= 0, we are now falling back to w32font_text_extents. Also, in the case of failures to get text size, draw, or encode char, now we will disable directwrite for the particular font. I'll send a patch as soon as I can. From debbugs-submit-bounces@debbugs.gnu.org Sun Oct 20 09:56:21 2024 Received: (at 73730) by debbugs.gnu.org; 20 Oct 2024 13:56:21 +0000 Received: from localhost ([127.0.0.1]:47887 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t2WPs-0001GA-GB for submit@debbugs.gnu.org; Sun, 20 Oct 2024 09:56:20 -0400 Received: from eggs.gnu.org ([209.51.188.92]:52750) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t2WPq-0001G2-Hm for 73730@debbugs.gnu.org; Sun, 20 Oct 2024 09:56:19 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1t2WPL-0003c3-MV; Sun, 20 Oct 2024 09:55:47 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=MIME-version:References:Subject:In-Reply-To:To:From: Date; bh=bW7iG4uUuh1KibYuI8Xa+C+1v7oivf7DXajpyO2oXOw=; b=B3Y6134iLevL9g8MaJDY +3Hmx5amwHzXxducOVySoFNZtrZRcjRnaJYK+oyuH+73GUWiAGz1a0uGn3sKY2PBsJlgAF5n0bmLv ID3PzQUYZ22QPUaeZa/h8Gze5O7Bw6Tt/yT5LTWVJGiYD7Pv2gTQIDOcy6dQFPCzVGSkIcbRkzqFk qH8lXwY5wrI0uOhLpysFjnTY/7MS+3EhWxkaR41bQb+sZho62QUrWuc3A7P3ZcH3wMqTX/reaeMdw ujAw7Sl0XaxBTB3XHd2ZVhxIXD/mV4ieKqJSx2GbOIuLDcteBZoYE2pRClrieAzJ81CH3A92KUHsV qghsRbBB5Ckt8A==; Date: Sun, 20 Oct 2024 16:55:44 +0300 Message-Id: <86o73ej2u7.fsf@gnu.org> From: Eli Zaretskii To: Cecilio Pardo In-Reply-To: <80dc50bd-b2d4-4d21-ad38-322412588b3b@imayhem.com> (message from Cecilio Pardo on Sun, 20 Oct 2024 15:35:10 +0200) Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> <86bjzjp7vv.fsf@gnu.org> <80dc50bd-b2d4-4d21-ad38-322412588b3b@imayhem.com> MIME-version: 1.0 Content-type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org, kbrown@cornell.edu X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > Date: Sun, 20 Oct 2024 15:35:10 +0200 > From: Cecilio Pardo > Cc: 73730@debbugs.gnu.org, kbrown@cornell.edu > > > On 17/10/2024 12:38, Cecilio Pardo wrote: > > >>> Still not done with this, but I am sending a new patch to fix the bug > >>> with w32-find-non-USB-fonts.ย  It calls text_extents with a font of size > >>> 0. Checking for that seems to solve the problem. > >> > >> Is that really TRT?ย  What does it mean font_size = 0 in this case? > > > > No, I was wrong, sorry. DirectDwrite is failing to create a font from > > certain GDI fonts. I need to then fall back to w32font. I'm on it. > > > > The error is caused indeed by fonts with size == 0. > > - w32-find-non-USB-fonts calls open-font with size == nil. > - open-font gets the size from font-entity, that is also empty. > - It ends up calling CreateFontIndirect with a LOGFONT > with lfHeight == 0 > - Then, w32-find-non-USB-fonts calls font-get-glyphs, which call > text_extents. > - text_extents on DirectWrite fails with a font of size 0, but > w32font_text_extents does return values that are not 0. > > If the case of size <= 0, we are now falling back to > w32font_text_extents. > > Also, in the case of failures to get text size, draw, or encode char, > now we will disable directwrite for the particular font. > > I'll send a patch as soon as I can. Great, thanks. From debbugs-submit-bounces@debbugs.gnu.org Sun Oct 20 12:17:53 2024 Received: (at 73730) by debbugs.gnu.org; 20 Oct 2024 16:17:53 +0000 Received: from localhost ([127.0.0.1]:48240 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t2Ycr-0008J7-8i for submit@debbugs.gnu.org; Sun, 20 Oct 2024 12:17:53 -0400 Received: from eggs.gnu.org ([209.51.188.92]:58528) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t2Yck-0008Ip-Vv for 73730@debbugs.gnu.org; Sun, 20 Oct 2024 12:17:49 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1t2YcF-0007ZI-Ea; Sun, 20 Oct 2024 12:17:15 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=ofZ6jkY+iPIlEpBHh6GUG4LmtzHyQMLFrd3oyvn7N5g=; b=mTceuxPl8N3z P7mPaAzMTfD3x0p+qUu85g3pafR9YcDZnE4SVIJ4xBkfamMILehRWgt+WNx+yBtG6+04AADTqupaQ 5r+FKUnDdCGE2LNi2uZ3pNXZT9f0//j4xWvsmJoSq/oIbx6bP+EZudZohnen7Eb6gUXjM8m/ZVT01 M28ZjHRptzNnP463WRhCbPBlCcFnpFeEb82IbnVaX2lQbhczYkvqcvEbI13JvBqE0YbQPFDQN2tso U0pRx6GqDPdcjEwuf/9COLyDM6nsyqethSfvzOIchXjpZu1WxP2MB6nBexdo/HuwcAVcw0gdLHY6o ZrH6xAqzM5OwNm+YWv+vlw==; Date: Sun, 20 Oct 2024 19:17:10 +0300 Message-Id: <86cyjuiwah.fsf@gnu.org> From: Eli Zaretskii To: Cecilio Pardo In-Reply-To: <80dc50bd-b2d4-4d21-ad38-322412588b3b@imayhem.com> (message from Cecilio Pardo on Sun, 20 Oct 2024 15:35:10 +0200) Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> <86bjzjp7vv.fsf@gnu.org> <80dc50bd-b2d4-4d21-ad38-322412588b3b@imayhem.com> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org, kbrown@cornell.edu X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > Date: Sun, 20 Oct 2024 15:35:10 +0200 > From: Cecilio Pardo > Cc: 73730@debbugs.gnu.org, kbrown@cornell.edu > > The error is caused indeed by fonts with size == 0. > > - w32-find-non-USB-fonts calls open-font with size == nil. > - open-font gets the size from font-entity, that is also empty. > - It ends up calling CreateFontIndirect with a LOGFONT > with lfHeight == 0 > - Then, w32-find-non-USB-fonts calls font-get-glyphs, which call > text_extents. > - text_extents on DirectWrite fails with a font of size 0, but > w32font_text_extents does return values that are not 0. > > If the case of size <= 0, we are now falling back to > w32font_text_extents. Maybe it's better to use some default size in text_extents instead? The pixel size of the default font is known (see FRAME_LINE_HEIGHT), so maybe just use it if you get a font of size zero? That could be a more future-proof fix, since we could get such fonts in other situations as well. Regardless, we should keep the strategy of falling back to the old code if DirectWrite fails. Thanks. From debbugs-submit-bounces@debbugs.gnu.org Sun Oct 20 14:21:04 2024 Received: (at submit) by debbugs.gnu.org; 20 Oct 2024 18:21:04 +0000 Received: from localhost ([127.0.0.1]:48431 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t2aY4-0005lV-6a for submit@debbugs.gnu.org; Sun, 20 Oct 2024 14:21:04 -0400 Received: from lists.gnu.org ([209.51.188.17]:59170) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t2aY2-0005l7-BK for submit@debbugs.gnu.org; Sun, 20 Oct 2024 14:21:02 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1t2aXb-00053L-BQ for bug-gnu-emacs@gnu.org; Sun, 20 Oct 2024 14:20:35 -0400 Received: from mail.imayhem.com ([82.223.54.191] helo=zealous-pike.82-223-54-191.plesk.page) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1t2aXY-0002GG-Pp for bug-gnu-emacs@gnu.org; Sun, 20 Oct 2024 14:20:34 -0400 Received: from [192.168.68.105] (111.red-88-21-7.staticip.rima-tde.net [88.21.7.111]) by zealous-pike.82-223-54-191.plesk.page (Postfix) with ESMTPSA id 882D380122 for ; Sun, 20 Oct 2024 18:20:30 +0000 (UTC) Authentication-Results: zealous-pike.82-223-54-191.plesk.page; spf=pass (sender IP is 88.21.7.111) smtp.mailfrom=cpardo@imayhem.com smtp.helo=[192.168.68.105] Received-SPF: pass (zealous-pike.82-223-54-191.plesk.page: connection is authenticated) Message-ID: <206b72b7-eea9-4515-b68d-69180317452f@imayhem.com> Date: Sun, 20 Oct 2024 20:20:29 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows To: bug-gnu-emacs@gnu.org References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> <86bjzjp7vv.fsf@gnu.org> <80dc50bd-b2d4-4d21-ad38-322412588b3b@imayhem.com> <86cyjuiwah.fsf@gnu.org> Content-Language: es-ES From: Cecilio Pardo In-Reply-To: <86cyjuiwah.fsf@gnu.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Received-SPF: pass client-ip=82.223.54.191; envelope-from=cpardo@imayhem.com; helo=zealous-pike.82-223-54-191.plesk.page X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Score: -1.3 (-) X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.3 (--) On 20/10/2024 18:17, Eli Zaretskii wrote: >> If the case of size <= 0, we are now falling back to >> w32font_text_extents. > > Maybe it's better to use some default size in text_extents instead? > The pixel size of the default font is known (see FRAME_LINE_HEIGHT), > so maybe just use it if you get a font of size zero? That could be a > more future-proof fix, since we could get such fonts in other > situations as well. The reason w32fint_text_extents has a value to return is because when the specified font size is 0: "The font mapper uses a default height value when it searches for a match." So it gives a font with a size that we cannot know, because when we ask it says it is 0. So we may return our own default. From debbugs-submit-bounces@debbugs.gnu.org Sun Oct 20 14:33:45 2024 Received: (at 73730) by debbugs.gnu.org; 20 Oct 2024 18:33:46 +0000 Received: from localhost ([127.0.0.1]:48456 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t2akL-0006LP-I2 for submit@debbugs.gnu.org; Sun, 20 Oct 2024 14:33:45 -0400 Received: from eggs.gnu.org ([209.51.188.92]:51548) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t2akJ-0006L8-Md for 73730@debbugs.gnu.org; Sun, 20 Oct 2024 14:33:44 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1t2ajo-0003og-W4; Sun, 20 Oct 2024 14:33:13 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=yfEvA8rfYUr2th0C8BH4mWwZYrzvHJa76wePMN7Yii4=; b=Xl4ZOn5f2E6a k06PGbFeBTtBzIOJTuBioQZFNFGCrPRMgGnlV/jgG1hk2LoL4NmeY1O/pW+MG9PJYt8aZcdceN9Ri xXBon30rzrDMT1h8IoF6FZNkocC7WGjFB75tj7/0YgUKsZ9vN3jKrvXE1Bah3b7B6mzwo1G338wz+ Fo2pcYm7z2/kG+7V8ZmwXHANsfn0VzgbjnrXMee4Dz3C6EZEIMEtm4sBKpOuMx2oeyD36cZzH05Eo BmhjKOkdcjmEBFcl3e0Hp01NlBkmZliCcFkBYrST0vRQrYj0D7F7+qk0vwmdDmD52ZkVEMt4MHgGL XqVidLFaxXEPpWJ81yCKYA==; Date: Sun, 20 Oct 2024 21:33:09 +0300 Message-Id: <8634kqipzu.fsf@gnu.org> From: Eli Zaretskii To: Cecilio Pardo In-Reply-To: <206b72b7-eea9-4515-b68d-69180317452f@imayhem.com> (message from Cecilio Pardo on Sun, 20 Oct 2024 20:20:29 +0200) Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> <86bjzjp7vv.fsf@gnu.org> <80dc50bd-b2d4-4d21-ad38-322412588b3b@imayhem.com> <86cyjuiwah.fsf@gnu.org> <206b72b7-eea9-4515-b68d-69180317452f@imayhem.com> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > Date: Sun, 20 Oct 2024 20:20:29 +0200 > From: Cecilio Pardo > > On 20/10/2024 18:17, Eli Zaretskii wrote: > > >> If the case of size <= 0, we are now falling back to > >> w32font_text_extents. > > > > Maybe it's better to use some default size in text_extents instead? > > The pixel size of the default font is known (see FRAME_LINE_HEIGHT), > > so maybe just use it if you get a font of size zero? That could be a > > more future-proof fix, since we could get such fonts in other > > situations as well. > > The reason w32fint_text_extents has a value to return is because when > the specified font size is 0: > > "The font mapper uses a default height value when it searches for a match." > > So it gives a font with a size that we cannot know, because when we ask > it says it is 0. > > So we may return our own default. I'm not sure I understand the last sentence above. It should be easy to modify w32-find-non-USB-fonts to specify a default value for SIZE if the caller didn't provide it. I just thought that other callers could do something similar, and therefore it would be better to use FRAME_LINE_HEIGHT of the selected frame as the size internally in text_extents if the caller specified zero. If what you say above disagrees with that, please elaborate why you disagree. From debbugs-submit-bounces@debbugs.gnu.org Sun Oct 20 14:38:09 2024 Received: (at 73730) by debbugs.gnu.org; 20 Oct 2024 18:38:09 +0000 Received: from localhost ([127.0.0.1]:48463 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t2aob-0006Yi-B8 for submit@debbugs.gnu.org; Sun, 20 Oct 2024 14:38:09 -0400 Received: from mail.imayhem.com ([82.223.54.191]:51021 helo=zealous-pike.82-223-54-191.plesk.page) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t2aoZ-0006YS-VP for 73730@debbugs.gnu.org; Sun, 20 Oct 2024 14:38:08 -0400 Received: from [192.168.68.105] (111.red-88-21-7.staticip.rima-tde.net [88.21.7.111]) by zealous-pike.82-223-54-191.plesk.page (Postfix) with ESMTPSA id A312380122; Sun, 20 Oct 2024 18:37:33 +0000 (UTC) Authentication-Results: zealous-pike.82-223-54-191.plesk.page; spf=pass (sender IP is 88.21.7.111) smtp.mailfrom=cpardo@imayhem.com smtp.helo=[192.168.68.105] Received-SPF: pass (zealous-pike.82-223-54-191.plesk.page: connection is authenticated) Message-ID: <9d47824a-38ad-4df1-b824-a553531e3bb8@imayhem.com> Date: Sun, 20 Oct 2024 20:37:32 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows To: Eli Zaretskii References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> <86bjzjp7vv.fsf@gnu.org> <80dc50bd-b2d4-4d21-ad38-322412588b3b@imayhem.com> <86cyjuiwah.fsf@gnu.org> <206b72b7-eea9-4515-b68d-69180317452f@imayhem.com> <8634kqipzu.fsf@gnu.org> Content-Language: es-ES From: Cecilio Pardo In-Reply-To: <8634kqipzu.fsf@gnu.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) On 20/10/2024 20:33, Eli Zaretskii wrote: >> Date: Sun, 20 Oct 2024 20:20:29 +0200 >> From: Cecilio Pardo >> >> On 20/10/2024 18:17, Eli Zaretskii wrote: >> >>>> If the case of size <= 0, we are now falling back to >>>> w32font_text_extents. >>> >>> Maybe it's better to use some default size in text_extents instead? >>> The pixel size of the default font is known (see FRAME_LINE_HEIGHT), >>> so maybe just use it if you get a font of size zero? That could be a >>> more future-proof fix, since we could get such fonts in other >>> situations as well. >> >> The reason w32fint_text_extents has a value to return is because when >> the specified font size is 0: >> >> "The font mapper uses a default height value when it searches for a match." >> >> So it gives a font with a size that we cannot know, because when we ask >> it says it is 0. >> >> So we may return our own default. > > I'm not sure I understand the last sentence above. > > It should be easy to modify w32-find-non-USB-fonts to specify a > default value for SIZE if the caller didn't provide it. I just > thought that other callers could do something similar, and therefore > it would be better to use FRAME_LINE_HEIGHT of the selected frame as > the size internally in text_extents if the caller specified zero. If > what you say above disagrees with that, please elaborate why you > disagree. No, I meant to agree. Sorry I wasn't clear. From debbugs-submit-bounces@debbugs.gnu.org Tue Oct 22 18:14:49 2024 Received: (at 73730) by debbugs.gnu.org; 22 Oct 2024 22:14:49 +0000 Received: from localhost ([127.0.0.1]:57729 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t3N9N-0002vS-JR for submit@debbugs.gnu.org; Tue, 22 Oct 2024 18:14:49 -0400 Received: from mail.imayhem.com ([82.223.54.191]:39497 helo=zealous-pike.82-223-54-191.plesk.page) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t3N9L-0002vC-BD for 73730@debbugs.gnu.org; Tue, 22 Oct 2024 18:14:47 -0400 Received: from [192.168.68.104] (111.red-88-21-7.staticip.rima-tde.net [88.21.7.111]) by zealous-pike.82-223-54-191.plesk.page (Postfix) with ESMTPSA id EA65A80138; Tue, 22 Oct 2024 22:14:12 +0000 (UTC) Authentication-Results: zealous-pike.82-223-54-191.plesk.page; spf=pass (sender IP is 88.21.7.111) smtp.mailfrom=cpardo@imayhem.com smtp.helo=[192.168.68.104] Received-SPF: pass (zealous-pike.82-223-54-191.plesk.page: connection is authenticated) Content-Type: multipart/mixed; boundary="------------5qUMQzuuu1UJMC8v0A9VT00k" Message-ID: <8e5ffc88-dda8-4b4d-a133-f80029825347@imayhem.com> Date: Wed, 23 Oct 2024 00:14:12 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows To: Eli Zaretskii References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> <86bjzjp7vv.fsf@gnu.org> <80dc50bd-b2d4-4d21-ad38-322412588b3b@imayhem.com> <86o73ej2u7.fsf@gnu.org> Content-Language: es-ES From: Cecilio Pardo In-Reply-To: <86o73ej2u7.fsf@gnu.org> X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org, kbrown@cornell.edu X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" This is a multi-part message in MIME format. --------------5qUMQzuuu1UJMC8v0A9VT00k Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Here is a new version with pending issues addressed. - No abort any more. Now, any failure marks the font as not usable, falling back to previous driver. If the error is general, then all of DirectWrite is disabled. eassert and DebPrint are called in these cases. - Added a NEWS entry. - The struct uniscribe_font_info is now in w32font.h - Build without warnings in both versions on MinGW. Some things I think we didn't discuss before: - DirectWrite is available since Windows 7, but color glyphs are available only since Windows 8.1. We only enable DirectWrite since Windows 8.1. This is stated on the NEWS entry. - The default value for the Gamma render parameter in DirectWrite gives very 'light' characters. I changed it to 1.4, which matches GDI and looks better. But that's just my opinion. I couldn't find any hebrew font with color glyphs to test RTL display. I found a latin+arabic one, Cairo Play: https://github.com/Gue3bara/Cairo https://fonts.google.com/specimen/Cairo+Play It displays diacritics in different colors on both scripts. It seems to work fine in emacs. I attach captures with and without DirectWrite, and compared to Courier New. --------------5qUMQzuuu1UJMC8v0A9VT00k Content-Type: image/png; name="emacs_KbWp4eBFOp.png" Content-Disposition: attachment; filename="emacs_KbWp4eBFOp.png" Content-Transfer-Encoding: base64 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 moty3xdKbfm13CjVAqgUgbVkaKLdG1fQ6Loa6tixiirtncxXnxOew5CuzvBd6Xm7mxd+ufCe HRtp4awGutCcf8dmFUzb9lVU3aMfNcy6nV6L+QJins/GtffS+NEXUo/qjlTVvm3WPCoq25jz rqkbTbev3UjHYzZ5Tq6rzp5uZCvpggkLYs8/adIKrIXaHl54visWNJgnsvZt27jza9O2vbmP jW+YRTv25X6pflmfREo8sIapLyQNQ7q6029YnmOMpuPGfnY7XVTTjzpWtXeHZ9tXWfvXii17 7IHjcey13dQwfrS5H4cNR7kWN6myl8eto9zHd792zB4yHkmucxBxyiRuPSwDa+/B4yLWO8me R6Osd5hjIcl9Isz8om23dDKIRMuNUi2AShFYS4CmI3vpgp5V+g7hZ0KBddOt/l/RNLeSBg1v oCMRK5K6am1aua1sU0Uz79tmjx+eZZPrzNbSjh2rqe7CC42QvdDYye+lPfYvfmS7h+5dutA8 mXor/aqe9RHXMR3SCayF2x4ZmmhZw3BqU6lPX1o7IfeDOUkFiqLQqgJrE61b0kCdxEWJn6cP Gk57Ix9wTTRn9KBwJ1ePxQisXk8fNJoORr4STH6dg4hTJlHr4WvsWwVkYGXD1sNpnEejrHfc wOo17D6RZGBNM4NItNwo1QKoFIG12DQdoSHdslsdrIO8o65soUgosL7ZOCczTdZuWZM2a30z bN9tSPjK9tgm6pA1fiVVeebBNm8pqKT6afFPGpFoOk5LPIGqfd+RxumhuKQSWAu9PYz9fOSA UzzTslrY3Pm5+3Y7Wv1K7lJPKlAUhVYSWPkEWK9sb25NkvuX9+KlTVVP2hkhtC6eUJs1fq79 2FHOL+3Auur60coyNG+5KoV1DqIQx5zzMJY3sLKB9XBK59Eo6x0mQCa5TyQWWFPOIBItN0q1 ACpFYC0yq2eOyOwk7U+hJWt2+x+YIU94DqFOQMdepY079hhXuf4PHvFv2i+ZOZraiwqw25CG UIFOhuIONePsrjp879PwQae7w3OAWbbziN03fQ5uW5a1jiPnNNp9ikMagbWw26PJqFy7ifGt Fnrt1hLzNoUt/vetFeLkmRqtILA2HdlJPatkqypv7wn6153GReKaJQ1UJS6MutZNDlWnHDPK sp2YR33DksCvjzPrl35gzQXv49517mwcg8Vc5yAKccxpgfVfPpVZdr96OK3zaJT1DhMgcxFn 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 pwAAAABJRU5ErkJggg== --------------5qUMQzuuu1UJMC8v0A9VT00k Content-Type: image/png; name="emacs_SiXOdpA67i.png" Content-Disposition: attachment; filename="emacs_SiXOdpA67i.png" Content-Transfer-Encoding: base64 iVBORw0KGgoAAAANSUhEUgAAAqwAAAH3CAYAAAB+Yw2ZAAAAAXNSR0IArs4c6QAAAARnQU1B AACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAHN1SURBVHhe7b0JvCxVea99cr+ba7w3 yXdvIvjFoBwF1LAVjSDiwOCcwSSXz+xEjeJRUWQ6zARkOFtFEDg4gyDCEQGF7cA8j6JCcEJ0 Kwgyg/NI1ERN7rr1rqrqfqv6rapV1VXd1Xs/z+/3nH26a161aq1/r67uXrXJJpu6P/U+zrv6 8Zu5p271dLfNNtu65z5ve7fDjjt17w7tuuPzX+h2esFLsCufP64vnpo7IiIuE602bnJabfuE tPol7NiXNvb5Vb4wdvsdX+S23W4H9/RnbOc2f9JWbtMnbOk23WxLt3qzOe8qHVa3nHuqe972 O7inPf3P3ZO33NI9YfPN3eMevxoRERERsTOfsPkW7s/mnhIF1m2ioPsSt9WfPysTWqPAGofV Z0QzPHPbZ7nNttjCXBEiIiIiYtdu9sQt3LOe/Ty33XN2isJqHFp9YJWR1Wduu525ECIiIiLi pJXQmo60rpJ7VuU2AEZWEREREbEvykjrjs9/ib+nddVTn/o0f8+qNSMiIiIi4rSUe1qf9ozt 3Kqtt9nWf8DKmgkRERERcVrKB7G23W57t0q+uir02wA2ffzj3aZPeLz//+aPe4p7zp/9nXvp Nru6l279BvfsP/ub6Lk4+Pr5IvWyiIiIiIh1lG8PkK+8WiXfg2rNkDcNoJs97snub5+9vzvg DZ9yRx50tVt3yHXuLftd7Q7Y9WK35/yZ7i+2fpNb/bg4ABNaEREREXEc5ftaV8kX7VsTtZs+ 4Qn+759tuo3b4+WnuaPe+nl3zDtvdm+P/h571I3u9JNvcZdecIf78Pu/6g7f/Ur3+hef4DZ/ 3Fy8LKEVERERERsq38saFFjFzTZ5snvzzh+KguoX3OGHfca95cDr3JEHX+8+sP4L7vyP3+Ye uu9hJ7wvCrHrdrvG7fL8Y9zjHhcHXURERETMuuEjH3H/8R//4fOThUyTeaxlp+l999zt/vEV rzCniTLt3rvvMqc1sVZgfdm2e7m3L3zOHXnY9e6jp3/N3XH7j92D9z/sfvD9X7r77/mZ+95D /+ruveOn7vgDr3dHvP5yd+RrL3E7bvmP5rryPvSd75jPT9qbv/AFrzVNlGnves+7zWmhXnDh hUk1jPn5z38+mCbkty/bS8tnl9etycyfKs/JtPzzsi5NX8q5qXKcKbpM8uhlpPyEfPmUlU26 jMaqF/lz+a07vjUyDyIiYpESSF/0kpe4pzxtK9MddtrRz2MtO00lkH7ve981Q2vZtKYGB9bN N9nS7f+6c90xx9zs3rL/te78xdt9B/1AFFTfs/B5d0wUUt+x77VxUH3dZW7dmkvd2193tdv1 Be9xmz62+JYA6fClk0+1QkFbFoU6rWy/aB8E2V+ZboXGEOUY86FRh5wUvZ/jBtYuy7RN5RjL XgwIUv7pY/m/zJ8vEzleXcbp43w55MtGz6PLPFW2kV9v/lzIdH0+ERERyxQkmFrTUgXr+Wlr BdMuwqoYHFi3fdJfuiP2u9K97YjPuqPecoM7bO017uwP3eruufMn7pqL7nLHHXS9O/TVl7h1 b7jcLUhgjf5/5D9d5g78m4+5pzy++Be0JGxI8JCOX4eRLiwKddp8iElNl8uHljpaISivIOWg 5yOwxqG+qH5YZSKk/0/LJj9Pvmxk/enjonMl65Bpsj69jfw81rlARETMK8xqYBV1QO0qrIrB gfWFT9/FrTvgGve2Q653R+xzjTtir6vdCUd8zl32iW+5f//Vb31h3nj5Pe7tu14RBdUorL7y YnfkP17s3vI3n3TbbvFSc52paZDQgULCQooOKhoJDjJNwowsK8ukQSIlDSAyPUWHP408TkNM Or/eJ9mObFOmF4WnMstCV6ogf2Uf03l1eJJ91PuUKs9ZISk9nqLn0+NMjylFtpnOq9Gjh1b5 yXIp1n6KmnR9+nxbywn551KtMkkf67KTv/q48mUjy6TT9XLa9ByKuiyseaxpiIiIWmGWA6uY BtWuwqoYHlifFgXWfa92R+57jXvXus+7b9/2Y1+Av/3Nf7ovf+ZBd877vuI+cMgNbmGXS90R /3iRO3L+Ive2l1/qjvzLT1cG1rxFYUDQgUNMQ5YV1kQh/b8EknS+NGzll5MAo5+X0NJW+JBj 0vuvQ1q6PUH+pvsn/9fhSZ63Ap0+Nm16PClpQNPHmW4rLXM5Xiusiel20mXy2yzajyL1/LLN /PlNtY45VZbX0+U40mORv+n5y9erfNno/S4KrLKMKOtKy7JoHmsaIiJ2ZyjWstNSILBWmwTW Hc2J2m2f9BfusDdf4o7Y82p39+1xWP3hd3/h3rHH1W6/v/m0O/Bvz3MH/+/z3eEvv9Cte3kU Vv/3xe6df3OlO+IFi25u9bPMdRYpwUHQnX5RgMiHEFEea9LndTiylhPzYaNO+JD5Uqx91eFJ q/dLSJ+X9cky4wZWa//zz+vl89uQ+TQyvaj80rLPP6+11ifPlwVWwXpelOU1uuwFPa9+rMtA 9luXR1F9S89h0fHreaxpiIiIWoFbAqoNDqybP3ZLt8/8me7I3a9115x/py+8n/343wYjq+/a 51p37BuvdEe94lL39r+5xL3jLy917/mrz7g9n/let8nj7HVWmQYb6fxDA2s+eAjp/3UoKwoc OsRYj8dRtmkdg94vvb/ptPyx5+cpek4s2v/880WBVebR5ZTOV1R+qUK6Dm3R+uT/coxFgVWm yTataXp/tTK/RbqefBkI6b4U1bd0HlHITxf1MSEiIpYp8KGraoMDq/hXz9jNLUSh9C2vvtid +rYb3S03POh+8v1fuh888LC79xs/dt9Pvof1oW/91L1v52vd8Tte7nba4u/NdYWqg5GQDzT5 4CT/TwNJGljSaToQpYEjHyzyISb/eFwlzOSDng44gp4mxyDTdXiS/+f3Mb9OPc3a//zzeh/k rzzOzydlJ8h0Mf1/uo68ep2pReuTx/rc5U3n1edf5pXHsny6v1or5MrjtCz1vqSP03KU9eoy FwU9v8yb364sU3QuEBER88pXVslXV1nTxG2fvR1faxVZK7A+/rFPdru+8L3uHW+81h3y9xe4 g/7u0+64N1/pzjnui+7as253t175gPvCp+5xZ+91szvxhZ9zr9/q7W6Tx21qrqtMCRWa9Pk0 JKVIqJB5dUBIg40gzwvpNAkbQhpE9LyCrN8KMfpxG8r2NXr/BT2vKPPnw5MEpRQrrKWmx6xJ n9fHpcOlDoC6zGUf9HxW+en9ssqtbH3peU+3nVcvK6Tllm7Xmlc/lyrI9HwZpNNkP/LHJshz el5RltdYx4yIiFjkLP5wwKZPeLz/UYCyQCrT5McFrGlNDA6ssnPy98mrn+F23endbt0rL3HH vPYqd9LaG9wpe3/Wnfja693xf3G1O+5Z17j1213p3rjVMe7xmz45XpafZkVERERcNqa5cFLW GmFNg+cToiD6l1vt5tY+/8PusBd+0r31+Re5o3e8xB29w4XuLdt9xL30Sa91j9s0/klWwioi IiIijqMPrIcfcaQ50VICaJqqN9t0S/esLf7CvejP/sm98Emvcs98wovc6k2fOJyPsIqIiIiI Y+oD6ymnnGpORERERESctj6wHnTwP5sTERERERGnba17WBERERERJy2BFRERERF7rQ+sB//z IeZERERERMRpu9Pzo8B68ikfMiciIiIiIk5bH1gPOfQt5kRERERExGnrA+v23MOKiIiIiD3V B9aX//188ou1AAAAAAD9YnAPKwAAAABAH/GB9R1HH5M8BAAAAADoF4N7WAEAAAAA+giBFQAA AAB6TWBgXXTzq1a5Vcot1y05t7TObblqSyf/jedJ/982o9ufX0wmZVD7kNm3llmcz+yLL4sm dLmPjQgtZ4O0TLZc5/zh5B9PmMX57HGkNjtXXdXtovWGbK+rfQIAAOgfNQLrNDvQ0HUXzdfi vvkgpte15NZtGRqEuiyjNsjtnw/U89GzVchyOtzmH0+TNsq8q/NWtN6Q7XW1TwAAAP2DwFqL OJyOBLFawa6rMmqD/P41Lfc+HWcb+9LV8RStN2R7fSpjAACAbtnx+S8eJ7Dq53Pz+BCXvhUb EubKKOmc1Xa2XLfO2B/5O3xLeNU4w36FwVSCbG67i3q/ZIK1H7njypRZfsQymm/d8FaE4Yhu HKJHl2lCbn9kNHmwwty0wWP5O9x+fA7042QBsz7E65if3zJ5rs1jScntd2EZR1SVv19Hh+U9 oGyfs2UXz5P8f6TOAQAALA9qBNZhJz3sqI1Oc+T/8nB+zA40v33daQ9Dw9I6CT4B+9MUCQ7m PZl65DXZ13Q+HzaK9iO/jyoAjSwXrTOd6G9LSMogEyrHJdnOwLSchap9L5om5B4P6oM8r8JV q8eSkt/P8jIunpb8v9Py1hrb9g912WX33a5zAAAAs083I6y+w8x1wGN18gXbl+1kAmTB/hQt Xxd/XDrEpRgjrGpb8gGg+PDz09RjY93hy7U1opbbjl93+rhkH0qnRST7OFof7PnaOZYUtY2y Mi6bNrKOjsp7wOj2ystudD3DfQcAAJh9OgysVrBrSsH2ZTuTDKw+mBpBIHO8+W3lR1/1NPXY KLOgwJoQjy6PG1Ia7nvV/hXWh/xyMe0cS4raRlkZ1yr/tvbRPv6qfY7Ry+bXU1BPAQAAZpSO 7mGV/7c5Ula2/WHH3PktAYK8JZwJEPljzT3OBI78fuT3UYWM4OWGyPGPV+a59fp9SB/nQpAv B73vZfsnj636YB+HMP6xpOhtxPtRXMah5R/TenkPGN3n8rLLzZPZdwAAgNlnQh+6St/GbErc IQ/WFTnonH1wSp+zPnTl5/KjZX6+sfYjQW1TzK4y3m78QaLR6dn9KCsz9Xx+Pv04sy/jhhRZ b7qu/D5E6G3Nz6t9Ktm/FLM+5OZr9VhSctsoLOOIkPJvvbxz++Ap2+fIkbKL/19U5wAAAGad wMAK4RSFEICuoM4BAMDyhsDaOoQHmDTUOQAAWN4QWFuH8ACThjoHAADLGwIrAAAAAPSaOLBu v6N7+OGHERERERF75yCw/uxnP0NERERE7J2DwAoAAAAA0EcygdVKtIiIiIiI0/I973kPgRUR ERER+6sEVsmqBFZERERE7KUEVkRERETstQRWREREROy1BNYxXPU7qxprrQ8Rm7tqVXRtKa15 EBFxNq0dWPOdQojWemZdCZ033vwx99Wvn1fb959yOKEVsaFWGyNeccUV7v/8n//jfv3rX7uD DjrInEe01jlJrX2q0loPIuJKslZglYbz61//uvvVr37l5y1DOo077rjDveIVr1h2Da6Eze98 96tmGA111kOrBIK2tNZf5YYNG9znP/95c1qfbWu/Q8qtadn2WWlLfvnL7434D/+ws293PvKR j7j3v//97vDDD/fPff7zV2Xmu+XGj7TSHjU9j7ShiIjNrB1YQxralJtuusndeuut7pvf/Gar Da6sq0hr/rZNR1e1137m9EovvvzEgR9ffOfMBlYJQpdffrm76KKL3Ic+9CF32WWXDbzkkku8 l156qf8r8+S9+OKL3SmnnOL/nnfeeY2CVVeBtes6NKuBVdZVV2s94yrnR4LnbV9ZHPipjx3r /vovnufbnL333tvttdde7txzz3XbP+fp7oPvPcR95vKTB/Med+j2rZzjcQJrH9pQRMRZs3Zg LUPejkv//ud//qe7/vrr3X333eeXPfXUU1tpcH8nCnmXXH62e/C7XxvxmOMOdltvM2cu16YS NHX4LFOCqeUsj7BKGJFAes455/jRLAkHH/vYx7xnnXXW4O/ZZ5/t/370ox8dePrpp3s/8IEP +Pk++MEPNgo3XQRWqZ9dh4I29lvKS4J/WbnJtKuvvrpR2VrKej71qU+5z372s5XecMMN7sIL L2xt21o5PxJYP3vVh7znffw496IXbOt+85vfuJ/+9Kc+4N1+++3ua1/7mjvssMPc07d6ojv2 qL38fJ+7+kPuqP2f2co5HiewljGJNhQRcRZtJbCmjet//MdvB39/+9vfuvPO+7T7/ve/7+e5 55573Lvf/e6xG9z/8T/+h7v/oVvcLUvnDfzK1z/tvfDSk9xTn7qFuVybStCU0Cmjpk1GWffc +5XLIrB+/OMfdyeddJIPpeKZZ57pTR9Lpy6P5a88TsOqPJblJNDK3ybBpo3gp5V6+dOHruw8 ELSx31JeEmSOP/54c7p48skntx5YJYxee+21wba1ba2cHz3CKiOrUp5SF0UJ1TLqL+Hu6KOP di94wQv8PDIKK/Mfte/WrZzjpudRtm0xyTYUEXEWHSuw6kZWGtff/ObXg7+//vW/RyHlTL+c 8Itf/MLdcsstfpStaYO72eaPdadteI8PrDd+4WPuczef7W784sfdTV86x938lXO98694qXvM n25kLt+WaWCVkKpHTauUkCr+1d/u1GpgLSvPLjo3CSLydr+MsMpb+9Jx11WWk8B64oknNgo2 bQZWKaOffvcz7iffXPD/11rzj2ObgfXDH/6wWXbpdHlR0aRsLWU9EljlnKUvPOR+UQmmEhLl sfxf/srjrgPrzdef7kdYZfT0JS98lnvm1lu6p85tNqIeYb3x2tPc2/bpV2CddBuKiDirNgqs ViMrjeu///u/Df7++7/9yndeskyR1jbKXL36MW7pmze4a2/4iLvo8pPc+Zec6C667IPu0qtO cVdFHdjVn9ng3vqOvdwOOz7D/c7v/I65zVRr/aGWBdbD3/omP4KaKo8lnGrbDqyidUxtHW9e CSISWOUt/XEDq9wa0CTYtBVYpWx++uClPqxqv3HZa9yFJ76o9bJrK7Bec8017tOf/rS/gPPT ZXT1uuuu8yOObYVGWU8fR1hFuU+1TH0Pa18Cq25D5X7wl750R/ff//sjvX/91y90F198kfu3 X/2y9TYUEXFWbRRYraAqAVUa2PTvr371C/eLf33Y3X3Xt93Xv/ZVd9lll7gNp5/m9t1nH/fG 17+qUWMrI6x33PUv7ryLP+AWz3u3O/Pjx7qPLR7v/3/up97lPv6JE9xZ5xznzjj7nW7xUye5 iy45211+1aK78upPuM989kJ30xcuc1/48lXuymvOGauxLwusElLzz4mTCKz6mNLH+efbUIKI Dqzy/zpecMEFfjkJVO973/saBZs2gp+Ui9wGkA+r2lvP37nV8msraJ922mnmKKv8Px1dPeGE EzLLjKOsVwKrvMB473vf6wOp3M6RH1Gto7WdKuVc6BFW7bpDd3Uv+8vnuUdv/Efuj//o/80o H8Da4bl/7p78hP85uCZSre1UOW5gTdvQc889x22zzVbR+TzB3XLLFe5znzsvOm/r3DOf+XT3 yU8uup//7KettqGIiLNqo8BqBVUJqL/8xb8O/kpYffjhn7kHH7zf3fGt29ztt3/TfflLX3Dn ffqT7p1HHdaosf3933+ku+ueL7qTTj3SnfbRo92JJx/uTjrlSPeh097qTjltwf//tDOOcmdH Ifasc49zZ55zrPtoFF4l2H707GPchjOPdqee/nZ37AkHjtXYV42w5p8Tuw6sohxTelzp/8c5 ziIlbEjwTEdIpeOuaxpYJfw0CS/jBj8pl+vPO8AMqXmv/8hftFaObQVWKTP5cJOMsh533HGD 5yWkSmCV55uGQktZV9kIq0yX4KrPcZkyqthk/+Q85EdYU1/6ou38h9Hq0PTT9+MG1rQNfclL doxedKx399//VffjH383OnefdBdeuMG97W0Hupe97EW+/bzvvntaa0MREWfVRoHVCqoSUP/1 X38++Cth9ac//bH7yY9/6H78ox+473/vO+4bS193n/vsDe7dx721UWMry9x+583uqKPXuiPe urvbaOM/8s81VW4bEK1tlVkWWHUwtTz2Xft3Hli11nzjKkFDgoEE1nFuCZARWqmATYJLG8FP yufkPR/hbv3A75vee9nLfGD91mfjFzhtlGdbgVWUe0g/85nP+LKUMjzqqKP8rQAyuioj19Yy TZX15+9hlaAqf2W0V6br8xtik/Mu50AC62Wffo+7YHF9xmc9c863T3Vpcl7HDazShkr7+chH /p77xjeuc7/97W+i8v109ELwo9F1cWIUYt/tfu/3HuFuueXL7oH773U/+uH3W2lDERFn1UaB 9Ve/jELqL+OQqgPqz3/+08Hfn//sJz6sSkP7g+9/1z304P3uwQfudV+79SvuhHce2aixlWVu u+Nmd+gRu7ntd9zG3Xvvt9wPf3yX+94PvxXsd39wu3vgO0vu7vu+6u749pcib3VzT3myub0i 08Aqn/jPB9JUCaZFPm+nZ/i/bQdWUcoo1ZrehhI0dGDNv+VfpSybBtZp3hIgSjm9e9f/ZgZW 8RunbeJD6wXvjy6SFsq0zcAq5SaBVcpUPhEvXxF2/vnntz66Ksr6qkZY5bjkK87SrzCT+iHP yfmWx/J/+SuP5f9N9lHOQdEI60aP+p++fZKRe/k0vSj386bceOON/jlB/spjocl5HTewShsq 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 iSASGKQvAAAAAElFTkSuQmCC --------------5qUMQzuuu1UJMC8v0A9VT00k Content-Type: text/plain; charset=UTF-8; name="0001-Implement-drawing-text-with-DirectWrite-on-MS-Window.patch" Content-Disposition: attachment; filename*0="0001-Implement-drawing-text-with-DirectWrite-on-MS-Window.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSBhYThjNzc3N2RkYzljYTllOGRjMzIzYzBjYmQ5OTYzNmZjNTJmMGVlIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBDZWNpbGlvIFBhcmRvIDxjcGFyZG9AaW1heWhlbS5j b20+CkRhdGU6IFdlZCwgOSBPY3QgMjAyNCAxMTo0MDoyOCArMDIwMApTdWJqZWN0OiBbUEFU Q0hdIEltcGxlbWVudCBkcmF3aW5nIHRleHQgd2l0aCBEaXJlY3RXcml0ZSBvbiBNUy1XaW5k b3dzLgoKVGhpcyBhZGRzIHN1cHBvcnQgZm9yIGNvbG9yIGZvbnRzLgoKKiBjb25maWd1cmUu YWM6IEFkZCBzcmMvdzMyZHJpdGUgdG8gVzMyX09CSi4KKiBzcmMvdzMyZHdyaXRlLmM6IFRo aXMgaXMgYSBuZXcgZmlsZS4KKHczMi1pbml0aWFsaXplLWRpcmVjdC13cml0ZSk6IE5ldyBm dW5jdGlvbiwgaW5pdGlhbGl6ZSB0aGUgRGlyZWN0V3JpdGUKbGlicmFyeSBpZiBpdCBpcyBh dmFpbGFibGUsIGFuZCByZXF1aXJlZCBnbG9iYWwgdmFyaWFibGVzLgoodzMyX3VzZV9kaXJl Y3Rfd3JpdGUpOiBOZXcgZnVuY3Rpb24sIGNoZWNrIGlmIERpcmVjdFdyaXRlIGlzIGF2YWls YWJsZQphbmQgYWN0aXZhdGVkIGJ5IHRoZSB1c2VyLgoodzMyX2R3cml0ZV9lbmNvZGVfY2hh cik6IE5ldyBmdW5jdGlvbiwgcmVwbGFjZW1lbnQgZm9yIEhhcmZCdXp6J3MKZW5jb2RlX2No YXIuCih3MzJfZHdyaXRlX3RleHRfZXh0ZW50cyk6IE5ldyBmdW5jdGlvbiwgcmVwbGFjZW1l bnQgZm9yIHczMmZvbnQKdGV4dF9leHRlbnRzLgoodzMyX2R3cml0ZV9kcmF3KTogTmV3IGZ1 bmN0aW9uLCByZXBsYWNlbWVudCBmb3IgdzMyZm9udCBkcmF3LgoodzMyX2R3cml0ZV9mcmVl X2NhY2hlZF9mYWNlKTogTmV3IGZ1bmN0aW9uLCB1c2VkIG9uIHRoZSBmb250IGRlbGV0aW9u CnByb2Nlc3MgdG8gYWxzbyBkZWxldGUgRGlyZWN0V3JpdGUgZGF0YS4KKHZlcmlmeV9ocik6 IE5ldyBmdW5jdGlvbiwgdmVyaWZ5IENPTSBtZXRob2QgcmVzdWx0cy4KKiBzcmMvdzMyZm9u dC5jICh3MzJmb250X3RleHRfZXh0ZW50cyk6IElmIERpcmVjdFdyaXRlIGlzIGVuYWJsZWQs IGNhbGwKdzMyX2R3cml0ZV90ZXh0X2V4dGVudHMuCih3MzJmb250X2RyYXcpOiBJZiBEaXJl Y3RXcml0ZSBpcyBlbmFibGVkLCBjYWxsIHczMl9kd3JpdGVfZHJhdy4KKiBzcmMvdzMydW5p c2NyaWJlLmM6ICh3MzJoYl9lbmNvZGVfY2hhcik6IElmIERpcmVjdFdyaXRlIGlzIGVuYWJs ZWQsCmNhbGwgdzMyX2R3cml0ZV9lbmNvZGVfY2hhci4KKHN5bXNfb2ZfdzMydW5pc2NyaWJl X2Zvcl9wZHVtcGVyKTogSW5pdGlhbGl6ZSBEaXJlY3RXcml0ZS4KKHVuaXNjcmliZV9jbG9z ZSk6IEZyZWUgRGlyZWN0V3JpdGUgZGF0YSBmb3IgdGhlIGZvbnQuCi0tLQogY29uZmlndXJl LmFjICAgICAgIHwgICAyICstCiBldGMvTkVXUyAgICAgICAgICAgfCAgIDUgKwogc3JjL3cz MmR3cml0ZS5jICAgIHwgOTk3ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKwogc3JjL3czMmZvbnQuYyAgICAgIHwgIDM5ICstCiBzcmMvdzMyZm9udC5o ICAgICAgfCAgMzAgKysKIHNyYy93MzJ1bmlzY3JpYmUuYyB8ICAzMyArLQogNiBmaWxlcyBj aGFuZ2VkLCAxMDgwIGluc2VydGlvbnMoKyksIDI2IGRlbGV0aW9ucygtKQogY3JlYXRlIG1v ZGUgMTAwNjQ0IHNyYy93MzJkd3JpdGUuYwoKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5hYyBi L2NvbmZpZ3VyZS5hYwppbmRleCA4YTViYTdkYjNkMS4uYmE5Y2Q4ZjBjZDUgMTAwNjQ0Ci0t LSBhL2NvbmZpZ3VyZS5hYworKysgYi9jb25maWd1cmUuYWMKQEAgLTMxNzIsNyArMzE3Miw3 IEBAIEFDX0RFRlVOCiAgIEFDX0NIRUNLX1RPT0woW1dJTkRSRVNdLCBbd2luZHJlc10sCiAg ICAgICAgICAgICAgICAgW0FDX01TR19FUlJPUihbTm8gcmVzb3VyY2UgY29tcGlsZXIgZm91 bmQuXSldKQogICBXMzJfT0JKPSJ3MzJmbnMubyB3MzJtZW51Lm8gdzMycmVnLm8gdzMyZm9u dC5vIHczMnRlcm0ubyIKLSAgVzMyX09CSj0iJFczMl9PQkogdzMyeGZucy5vIHczMnNlbGVj dC5vIHczMnVuaXNjcmliZS5vIHczMmN5Z3dpbngubyIKKyAgVzMyX09CSj0iJFczMl9PQkog dzMyeGZucy5vIHczMnNlbGVjdC5vIHczMnVuaXNjcmliZS5vIHczMmR3cml0ZS5vIHczMmN5 Z3dpbngubyIKICAgRU1BQ1NSRVM9ImVtYWNzLnJlcyIKICAgY2FzZSAiJGNhbm9uaWNhbCIg aW4KICAgICB4ODZfNjQtKi0qKSBFTUFDU19NQU5JRkVTVD0iZW1hY3MteDY0Lm1hbmlmZXN0 IiA7OwpkaWZmIC0tZ2l0IGEvZXRjL05FV1MgYi9ldGMvTkVXUwppbmRleCA2M2MyOTRmYWM0 MS4uZjY1MzMzYTM2YzAgMTAwNjQ0Ci0tLSBhL2V0Yy9ORVdTCisrKyBiL2V0Yy9ORVdTCkBA IC03NTAsNiArNzUwLDExIEBAIGFuZCBsYXRlciB2ZXJzaW9ucy4KICoqIEVtYWNzIG9uIE1T LVdpbmRvd3Mgbm93IHN1cHBvcnRzIGRyYWctbi1kcm9wIG9mIHRleHQgaW50byBhIGJ1ZmZl ci4KIFRoaXMgaXMgaW4gYWRkaXRpb24gdG8gZHJhZy1uLWRyb3Agb2YgZmlsZXMsIHRoYXQg d2FzIGFscmVhZHkgc3VwcG9ydGVkLgogCisqKiBFbWFjcyBvbiBNUy1XaW5kb3dzIG5vdyBz dXBwb3J0cyBjb2xvciBmb250cy4KK09uIFdpbmRvd3MgOC4xIGFuZCBsYXRlciB2ZXJzaW9u cyBFbWFjcyBub3cgdXNlcyBEaXJlY3RXcml0ZSB0byBkcmF3Cit0ZXh0LCB3aGljaCBzdXBw b3J0cyBjb2xvciBmb250cy4gIFRoaXMgY2FuIGJlIGRpc2FibGVkIGJ5IHNldHRpbmcgdGhl Cit2YXJpYWJsZSB3MzItaW5oaWJpdC1kd3JpdGUgdG8gdC4KKwogDAogLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQogVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEVtYWNzLgpkaWZmIC0tZ2l0IGEvc3Jj L3czMmR3cml0ZS5jIGIvc3JjL3czMmR3cml0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAwMDAwLi40N2I5M2E1MzQwZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy93 MzJkd3JpdGUuYwpAQCAtMCwwICsxLDk5NyBAQAorLyogU3VwcG9ydCBmb3IgdXNpbmcgRGly ZWN0V3JpdGUgb24gTVMtV2luZG93cyB0byBkcmF3IHRleHQuICBUaGlzCisgICBhbGxvd3Mg Zm9yIGNvbG9yIGZvbnRzLgorICAgQ29weXJpZ2h0IChDKSAyMDI0IEZyZWUgU29mdHdhcmUg Rm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgRW1hY3MuCisK K0dOVSBFbWFjcyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh bmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRh dGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Cit5b3VyIG9w dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK0dOVSBFbWFjcyBpcyBkaXN0cmlidXRlZCBp biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdB UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5U QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUK K0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBz aG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlCithbG9uZyB3aXRoIEdOVSBFbWFjcy4gIElmIG5vdCwgc2VlIDxodHRwczovL3d3 dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisvKiBUaGlzIHJlcXVpcmVzIHRoZSBIYXJm QnV6eiBmb250IGJhY2tlbmQgdG8gYmUgYXZhaWxhYmxlLgorCisgICBJdCB3b3JrcyBieSBt b2RpZnlpbmcgdGhlIEhhcmZCdXp6IGJhY2tlbmQgdG8gdXNlIERpcmVjdFdyaXRlIGF0Cisg ICBzb21lIHBvaW50cywgaWYgaXQgaXMgYXZhaWxhYmxlOgorCisgICAtIFdoZW4gZW5jb2Rp bmcgY2hhcmFjdGVyczogdzMyaGJfZW5jb2RlX2NoYXIKKyAgIC0gV2hlbiBtZWFzdXJpbmcg dGV4dDogdzMyZm9udF90ZXh0X2V4dGVudHMKKyAgIC0gV2hlbiBkcmF3aW5nIHRleHQ6IHcz MmZvbnRfZHJhdworCisgICBEaXJlY3RXcml0ZSBpcyBzZXR1cCBieSBjYWxsaW5nIHczMl9p bml0aWFsaXplX2RpcmVjdF93cml0ZS4gIEZyb20KKyAgIHRoYXQgcG9pbnQsIHRoZSBmdW5j dGlvbiB3MzJfdXNlX2RpcmVjdF93cml0ZSB3aWxsIHJldHVybiB0cnVlIGlmCisgICBEaXJl Y3RXcml0ZSBpcyB0byBiZSB1c2VkLgorCisgICBEaXJlY3RXcml0ZSBpcyBhdmFpbGFibGUg c2luY2UgV2luZG93cyA3LCBidXQgd2UgZG9uJ3QgYWN0aXZhdGUgaXQgb24KKyAgIHZlcnNp b25zIGJlZm9yZSA4LjEsIGJlY2F1c2UgY29sb3IgZm9udHMgYXJlIG9ubHkgYXZhaWxhYmxl IHNpbmNlIHRoYXQuICAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8bWF0 aC5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2lmbmRlZiBNSU5HV19XNjQKKyMgZGVm aW5lIElOSVRHVUlECisjZW5kaWYKKyNpbmNsdWRlIDxpbml0Z3VpZC5oPgorI2luY2x1ZGUg PG9sZTIuaD4KKyNpbmNsdWRlIDx1bmtud24uaD4KKworI2luY2x1ZGUgImZyYW1lLmgiCisj aW5jbHVkZSAidzMyZm9udC5oIgorI2luY2x1ZGUgInczMmNvbW1vbi5oIgorI2luY2x1ZGUg InczMnRlcm0uaCIKKworI2lmbmRlZiBNSU5HV19XNjQKKworLyogVGhlIGZvbGxvd2luZyBk ZWZpbml0aW9ucyB3b3VsZCBiZSBpbmNsdWRlZCBmcm9tIGR3cml0ZV8zLmgsIGJ1dCBpdAor ICAgaXMgbm90IGF2YWlsYWJsZSB3aGVuIGJ1aWxkaW5nIHdpdGggbWluZ3cub3JnJ3MgTWlu R1cuICBNZXRob2RzIHRoYXQKKyAgIHdlIGRvbid0IHVzZSBhcmUgZGVjbGFyZWQgd2l0aCB0 aGUgRU1BQ1NfRFdSSVRFX1VOVVNFRCBtYWNybywgdG8KKyAgIGF2b2lkIGJyaW5naW5nIGlu IG1vcmUgdHlwZXMgdGhhdCB3b3VsZCBuZWVkIHRvIGJlIGRlY2xhcmVkLiAgKi8KKworI2Rl ZmluZSBFTUFDU19EV1JJVEVfVU5VU0VEKG5hbWUpIHZvaWQgKFNURE1FVEhPRENBTExUWVBF ICpuYW1lKSh2b2lkKQorCisjZGVmaW5lIERXUklURV9FX05PQ09MT1IgX0hSRVNVTFRfVFlQ RURFRl8oMHg4ODk4NTAwQ0wpCisKK3R5cGVkZWYgZW51bSBEV1JJVEVfUElYRUxfR0VPTUVU UlkgeworICAgIERXUklURV9QSVhFTF9HRU9NRVRSWV9GTEFUID0gMCwKKyAgICBEV1JJVEVf UElYRUxfR0VPTUVUUllfUkdCID0gMSwKKyAgICBEV1JJVEVfUElYRUxfR0VPTUVUUllfQkdS ID0gMgorfSBEV1JJVEVfUElYRUxfR0VPTUVUUlk7CisKK3R5cGVkZWYgZW51bSBEV1JJVEVf UkVOREVSSU5HX01PREUgeworICAgIERXUklURV9SRU5ERVJJTkdfTU9ERV9ERUZBVUxUID0g MCwKKyAgICBEV1JJVEVfUkVOREVSSU5HX01PREVfQUxJQVNFRCA9IDEsCisgICAgRFdSSVRF X1JFTkRFUklOR19NT0RFX0dESV9DTEFTU0lDID0gMiwKKyAgICBEV1JJVEVfUkVOREVSSU5H X01PREVfR0RJX05BVFVSQUwgPSAzLAorICAgIERXUklURV9SRU5ERVJJTkdfTU9ERV9OQVRV UkFMID0gNCwKKyAgICBEV1JJVEVfUkVOREVSSU5HX01PREVfTkFUVVJBTF9TWU1NRVRSSUMg PSA1LAorICAgIERXUklURV9SRU5ERVJJTkdfTU9ERV9PVVRMSU5FID0gNgorfSBEV1JJVEVf UkVOREVSSU5HX01PREU7CisKK3R5cGVkZWYgZW51bSBEV1JJVEVfTUVBU1VSSU5HX01PREUg eworICAgIERXUklURV9NRUFTVVJJTkdfTU9ERV9OQVRVUkFMID0gMCwKKyAgICBEV1JJVEVf TUVBU1VSSU5HX01PREVfR0RJX0NMQVNTSUMgPSAxLAorICAgIERXUklURV9NRUFTVVJJTkdf TU9ERV9HRElfTkFUVVJBTCA9IDIKK30gRFdSSVRFX01FQVNVUklOR19NT0RFOworCit0eXBl ZGVmIGVudW0gRFdSSVRFX1RFWFRfQU5USUFMSUFTX01PREUgeworICAgIERXUklURV9URVhU X0FOVElBTElBU19NT0RFX0NMRUFSVFlQRSA9IDAsCisgICAgRFdSSVRFX1RFWFRfQU5USUFM SUFTX01PREVfR1JBWVNDQUxFID0gMQorfSBEV1JJVEVfVEVYVF9BTlRJQUxJQVNfTU9ERTsK KwordHlwZWRlZiBlbnVtIERXUklURV9GQUNUT1JZX1RZUEUgeworICAgIERXUklURV9GQUNU T1JZX1RZUEVfU0hBUkVEID0gMCwKKyAgICBEV1JJVEVfRkFDVE9SWV9UWVBFX0lTT0xBVEVE ID0gMQorfSBEV1JJVEVfRkFDVE9SWV9UWVBFOworCit0eXBlZGVmIHN0cnVjdCBEV1JJVEVf Rk9OVF9NRVRSSUNTIHsKKyAgICBVSU5UMTYgZGVzaWduVW5pdHNQZXJFbTsKKyAgICBVSU5U MTYgYXNjZW50OworICAgIFVJTlQxNiBkZXNjZW50OworICAgIElOVDE2IGxpbmVHYXA7Cisg ICAgVUlOVDE2IGNhcEhlaWdodDsKKyAgICBVSU5UMTYgeEhlaWdodDsKKyAgICBJTlQxNiB1 bmRlcmxpbmVQb3NpdGlvbjsKKyAgICBVSU5UMTYgdW5kZXJsaW5lVGhpY2tuZXNzOworICAg IElOVDE2IHN0cmlrZXRocm91Z2hQb3NpdGlvbjsKKyAgICBVSU5UMTYgc3RyaWtldGhyb3Vn aFRoaWNrbmVzczsKK30gRFdSSVRFX0ZPTlRfTUVUUklDUzsKKwordHlwZWRlZiBzdHJ1Y3Qg RFdSSVRFX0dMWVBIX01FVFJJQ1MgeworICAgIElOVDMyIGxlZnRTaWRlQmVhcmluZzsKKyAg ICBVSU5UMzIgYWR2YW5jZVdpZHRoOworICAgIElOVDMyIHJpZ2h0U2lkZUJlYXJpbmc7Cisg ICAgSU5UMzIgdG9wU2lkZUJlYXJpbmc7CisgICAgVUlOVDMyIGFkdmFuY2VIZWlnaHQ7Cisg ICAgSU5UMzIgYm90dG9tU2lkZUJlYXJpbmc7CisgICAgSU5UMzIgdmVydGljYWxPcmlnaW5Z OworfSBEV1JJVEVfR0xZUEhfTUVUUklDUzsKKwordHlwZWRlZiBpbnRlcmZhY2UgSURXcml0 ZVJlbmRlcmluZ1BhcmFtcyBJRFdyaXRlUmVuZGVyaW5nUGFyYW1zOwordHlwZWRlZiBpbnRl cmZhY2UgSURXcml0ZUZvbnQgSURXcml0ZUZvbnQ7Cit0eXBlZGVmIGludGVyZmFjZSBJRFdy aXRlR2RpSW50ZXJvcCBJRFdyaXRlR2RpSW50ZXJvcDsKK3R5cGVkZWYgaW50ZXJmYWNlIElE V3JpdGVGYWN0b3J5IElEV3JpdGVGYWN0b3J5OwordHlwZWRlZiBpbnRlcmZhY2UgSURXcml0 ZUZhY3RvcnkyIElEV3JpdGVGYWN0b3J5MjsKK3R5cGVkZWYgaW50ZXJmYWNlIElEV3JpdGVG b250RmFjZSBJRFdyaXRlRm9udEZhY2U7Cit0eXBlZGVmIGludGVyZmFjZSBJRFdyaXRlQml0 bWFwUmVuZGVyVGFyZ2V0IElEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQ7Cit0eXBlZGVmIGlu dGVyZmFjZSBJRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0MSBJRFdyaXRlQml0bWFwUmVuZGVy VGFyZ2V0MTsKK3R5cGVkZWYgaW50ZXJmYWNlIElEV3JpdGVDb2xvckdseXBoUnVuRW51bWVy YXRvciBJRFdyaXRlQ29sb3JHbHlwaFJ1bkVudW1lcmF0b3I7CisKK0RFRklORV9HVUlEKElJ RF9JRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0MSwgMHg3OTFlODI5OCwgMHgzZWYzLCAweDQy MzAsIDB4OTgsMHg4MCwgMHhjOSwweGJkLDB4ZWMsMHhjNCwweDIwLDB4NjQpOworREVGSU5F X0dVSUQoSUlEX0lEV3JpdGVGYWN0b3J5MiwgMHgwNDM5ZmM2MCwgMHhjYTQ0LCAweDQ5OTQs IDB4OGQsMHhlZSwgMHgzYSwweDlhLDB4ZjcsMHhiNywweDMyLDB4ZWMpOworREVGSU5FX0dV SUQoSUlEX0lEV3JpdGVGYWN0b3J5LCAweGI4NTllZTVhLCAweGQ4MzgsIDB4NGI1YiwgMHhh MiwweGU4LCAweDFhLDB4ZGMsMHg3ZCwweDkzLDB4ZGIsMHg0OCk7CisKK3R5cGVkZWYgc3Ry dWN0IERXUklURV9HTFlQSF9PRkZTRVQgeworICAgIEZMT0FUIGFkdmFuY2VPZmZzZXQ7Cisg ICAgRkxPQVQgYXNjZW5kZXJPZmZzZXQ7Cit9IERXUklURV9HTFlQSF9PRkZTRVQ7CisKK3R5 cGVkZWYgc3RydWN0IERXUklURV9HTFlQSF9SVU4geworICAgIElEV3JpdGVGb250RmFjZSAq Zm9udEZhY2U7CisgICAgRkxPQVQgZm9udEVtU2l6ZTsKKyAgICBVSU5UMzIgZ2x5cGhDb3Vu dDsKKyAgICBjb25zdCBVSU5UMTYgKmdseXBoSW5kaWNlczsKKyAgICBjb25zdCBGTE9BVCAq Z2x5cGhBZHZhbmNlczsKKyAgICBjb25zdCBEV1JJVEVfR0xZUEhfT0ZGU0VUICpnbHlwaE9m ZnNldHM7CisgICAgV0lOQk9PTCBpc1NpZGV3YXlzOworICAgIFVJTlQzMiBiaWRpTGV2ZWw7 Cit9ICBEV1JJVEVfR0xZUEhfUlVOOworCit0eXBlZGVmIHN0cnVjdCBfRDNEQ09MT1JWQUxV RSB7CisgIGZsb2F0IHI7CisgIGZsb2F0IGc7CisgIGZsb2F0IGI7CisgIGZsb2F0IGE7Cit9 IEQzRENPTE9SVkFMVUU7CisKK3R5cGVkZWYgRDNEQ09MT1JWQUxVRSBEV1JJVEVfQ09MT1Jf RjsKKwordHlwZWRlZiBzdHJ1Y3QgRFdSSVRFX0NPTE9SX0dMWVBIX1JVTiB7CisgICAgRFdS SVRFX0dMWVBIX1JVTiBnbHlwaFJ1bjsKKyAgICB2b2lkICpnbHlwaFJ1bkRlc2NyaXB0aW9u OworICAgIEZMT0FUIGJhc2VsaW5lT3JpZ2luWDsKKyAgICBGTE9BVCBiYXNlbGluZU9yaWdp blk7CisgICAgRFdSSVRFX0NPTE9SX0YgcnVuQ29sb3I7CisgICAgVUlOVDE2IHBhbGV0dGVJ bmRleDsKK30gRFdSSVRFX0NPTE9SX0dMWVBIX1JVTjsKKwordHlwZWRlZiBzdHJ1Y3QgSURX cml0ZUZvbnRGYWNlVnRibCB7CisgIEJFR0lOX0lOVEVSRkFDRQorCisgIEhSRVNVTFQgKFNU RE1FVEhPRENBTExUWVBFICpRdWVyeUludGVyZmFjZSkKKyAgICAoSURXcml0ZUZvbnRGYWNl ICpUaGlzLCBSRUZJSUQgcmlpZCwgdm9pZCAqKnBwdk9iamVjdCk7CisgIFVMT05HIChTVERN RVRIT0RDQUxMVFlQRSAqQWRkUmVmKShJRFdyaXRlRm9udEZhY2UgKlRoaXMpOworICBVTE9O RyAoU1RETUVUSE9EQ0FMTFRZUEUgKlJlbGVhc2UpKElEV3JpdGVGb250RmFjZSAqVGhpcyk7 CisKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRChHZXRUeXBlKTsKKyAgRU1BQ1NfRFdSSVRFX1VO VVNFRChHZXRGaWxlcyk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQoR2V0SW5kZXgpOworICBF TUFDU19EV1JJVEVfVU5VU0VEKEdldFNpbXVsYXRpb25zKTsKKyAgRU1BQ1NfRFdSSVRFX1VO VVNFRChJc1N5bWJvbEZvbnQpOworCisgIHZvaWQgKFNURE1FVEhPRENBTExUWVBFICpHZXRN ZXRyaWNzKQorICAgIChJRFdyaXRlRm9udEZhY2UgKlRoaXMsIERXUklURV9GT05UX01FVFJJ Q1MgKm1ldHJpY3MpOworCisgIEVNQUNTX0RXUklURV9VTlVTRUQgKEdldEdseXBoQ291bnQp OworICBFTUFDU19EV1JJVEVfVU5VU0VEIChHZXREZXNpZ25HbHlwaE1ldHJpY3MpOworCisg IEhSRVNVTFQgKFNURE1FVEhPRENBTExUWVBFICpHZXRHbHlwaEluZGljZXMpCisgICAgKElE V3JpdGVGb250RmFjZSAqVGhpcywgY29uc3QgVUlOVDMyICpjb2RlcG9pbnRzLCBVSU5UMzIg Y291bnQsCisgICAgIFVJTlQxNiAqZ2x5cGhfaW5kaWNlcyk7CisKKyAgRU1BQ1NfRFdSSVRF X1VOVVNFRCAoVHJ5R2V0Rm9udFRhYmxlKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoUmVs ZWFzZUZvbnRUYWJsZSk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKEdldEdseXBoUnVuT3V0 bGluZSk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKEdldFJlY29tbWVuZGVkUmVuZGVyaW5n TW9kZSk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKEdldEdkaUNvbXBhdGlibGVNZXRyaWNz KTsKKworICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAqR2V0R2RpQ29tcGF0aWJsZUds eXBoTWV0cmljcykKKyAgICAoSURXcml0ZUZvbnRGYWNlICpUaGlzLAorICAgICBGTE9BVCBl bVNpemUsCisgICAgIEZMT0FUIHBpeGVsc19wZXJfZGlwLAorICAgICB2b2lkICp0cmFuc2Zv cm0sCisgICAgIFdJTkJPT0wgdXNlX2dkaV9uYXR1cmFsLAorICAgICBjb25zdCBVSU5UMTYg KmdseXBoX2luZGljZXMsCisgICAgIFVJTlQzMiBnbHlwaF9jb3VudCwKKyAgICAgRFdSSVRF X0dMWVBIX01FVFJJQ1MgKm1ldHJpY3MsCisgICAgIFdJTkJPT0wgaXNfc2lkZXdheXMpOwor ICBFTkRfSU5URVJGQUNFCit9IElEV3JpdGVGb250RmFjZVZ0Ymw7CisKK2ludGVyZmFjZSBJ RFdyaXRlRm9udEZhY2UgeworICAgIENPTlNUX1ZUQkwgSURXcml0ZUZvbnRGYWNlVnRibCog bHBWdGJsOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgSURXcml0ZVJlbmRlcmluZ1BhcmFtc1Z0 YmwgeworICBCRUdJTl9JTlRFUkZBQ0UKKworICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQ RSAqUXVlcnlJbnRlcmZhY2UpCisgICAgKElEV3JpdGVSZW5kZXJpbmdQYXJhbXMgKlRoaXMs IFJFRklJRCByaWlkLCB2b2lkICoqcHB2T2JqZWN0KTsKKyAgVUxPTkcgKFNURE1FVEhPRENB TExUWVBFICpBZGRSZWYpKElEV3JpdGVSZW5kZXJpbmdQYXJhbXMgKlRoaXMpOworICBVTE9O RyAoU1RETUVUSE9EQ0FMTFRZUEUgKlJlbGVhc2UpKElEV3JpdGVSZW5kZXJpbmdQYXJhbXMg KlRoaXMpOworCisgIEZMT0FUIChTVERNRVRIT0RDQUxMVFlQRSAqR2V0R2FtbWEpCisgICAg KElEV3JpdGVSZW5kZXJpbmdQYXJhbXMgKlRoaXMpOworICBGTE9BVCAoU1RETUVUSE9EQ0FM TFRZUEUgKkdldEVuaGFuY2VkQ29udHJhc3QpCisgICAgKElEV3JpdGVSZW5kZXJpbmdQYXJh bXMgKlRoaXMpOworICBGTE9BVCAoU1RETUVUSE9EQ0FMTFRZUEUgKkdldENsZWFyVHlwZUxl dmVsKQorICAgIChJRFdyaXRlUmVuZGVyaW5nUGFyYW1zICpUaGlzKTsKKyAgaW50IChTVERN RVRIT0RDQUxMVFlQRSAqR2V0UGl4ZWxHZW9tZXRyeSkKKyAgICAoSURXcml0ZVJlbmRlcmlu Z1BhcmFtcyAqVGhpcyk7CisgIEVORF9JTlRFUkZBQ0UKK30gSURXcml0ZVJlbmRlcmluZ1Bh cmFtc1Z0Ymw7CisKK2ludGVyZmFjZSBJRFdyaXRlUmVuZGVyaW5nUGFyYW1zIHsKKyAgICBD T05TVF9WVEJMIElEV3JpdGVSZW5kZXJpbmdQYXJhbXNWdGJsKiBscFZ0Ymw7Cit9OworCit0 eXBlZGVmIHN0cnVjdCBJRFdyaXRlRm9udFZ0YmwgeworICBCRUdJTl9JTlRFUkZBQ0UKKwor ICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAqUXVlcnlJbnRlcmZhY2UpCisgICAgKElE V3JpdGVGb250ICpUaGlzLCBSRUZJSUQgcmlpZCwgdm9pZCAqKnBwdk9iamVjdCk7CisgIFVM T05HIChTVERNRVRIT0RDQUxMVFlQRSAqQWRkUmVmKShJRFdyaXRlRm9udCAqVGhpcyk7Cisg IFVMT05HIChTVERNRVRIT0RDQUxMVFlQRSAqUmVsZWFzZSkoSURXcml0ZUZvbnQgKlRoaXMp OworCisgIEVNQUNTX0RXUklURV9VTlVTRUQgKEdldEZvbnRGYW1pbHkpOworICBFTUFDU19E V1JJVEVfVU5VU0VEIChHZXRXZWlnaHQpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChHZXRT dHJldGNoKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoR2V0U3R5bGUpOworICBFTUFDU19E V1JJVEVfVU5VU0VEIChJc1N5bWJvbEZvbnQpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChH ZXRGYWNlTmFtZXMpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChHZXRJbmZvcm1hdGlvbmFs U3RyaW5ncyk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKEdldFNpbXVsYXRpb25zKTsKKwor ICB2b2lkIChTVERNRVRIT0RDQUxMVFlQRSAqR2V0TWV0cmljcykKKyAgICAoSURXcml0ZUZv bnQgKlRoaXMsIERXUklURV9GT05UX01FVFJJQ1MgKm1ldHJpY3MpOworCisgIEVNQUNTX0RX UklURV9VTlVTRUQoSGFzQ2hhcmFjdGVyKTsKKworICBIUkVTVUxUIChTVERNRVRIT0RDQUxM VFlQRSAqQ3JlYXRlRm9udEZhY2UpCisgICAgKElEV3JpdGVGb250ICpUaGlzLCBJRFdyaXRl Rm9udEZhY2UgKipmYWNlKTsKKworICBFTkRfSU5URVJGQUNFCit9IElEV3JpdGVGb250VnRi bDsKKworaW50ZXJmYWNlIElEV3JpdGVGb250IHsKKyAgICBDT05TVF9WVEJMIElEV3JpdGVG b250VnRibCogbHBWdGJsOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgSURXcml0ZUJpdG1hcFJl bmRlclRhcmdldFZ0YmwgeworICBCRUdJTl9JTlRFUkZBQ0UKKworICBIUkVTVUxUIChTVERN RVRIT0RDQUxMVFlQRSAqUXVlcnlJbnRlcmZhY2UpCisgICAgKElEV3JpdGVCaXRtYXBSZW5k ZXJUYXJnZXQgKlRoaXMsIFJFRklJRCByaWlkLCB2b2lkICoqcHB2T2JqZWN0KTsKKyAgVUxP TkcgKFNURE1FVEhPRENBTExUWVBFICpBZGRSZWYpKElEV3JpdGVCaXRtYXBSZW5kZXJUYXJn ZXQgKlRoaXMpOworICBVTE9ORyAoU1RETUVUSE9EQ0FMTFRZUEUgKlJlbGVhc2UpKElEV3Jp dGVCaXRtYXBSZW5kZXJUYXJnZXQgKlRoaXMpOworCisgIEhSRVNVTFQgKFNURE1FVEhPRENB TExUWVBFICpEcmF3R2x5cGhSdW4pCisgICAgKElEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQg KlRoaXMsCisgICAgIEZMT0FUIGJhc2VsaW5lT3JpZ2luWCwKKyAgICAgRkxPQVQgYmFzZWxp bmVPcmlnaW5ZLAorICAgICBEV1JJVEVfTUVBU1VSSU5HX01PREUgbWVhc3VyaW5nX21vZGUs CisgICAgIGNvbnN0IERXUklURV9HTFlQSF9SVU4gKmdseXBoX3J1biwKKyAgICAgSURXcml0 ZVJlbmRlcmluZ1BhcmFtcyAqcGFyYW1zLAorICAgICBDT0xPUlJFRiB0ZXh0Q29sb3IsCisg ICAgIFJFQ1QgKmJsYWNrYm94X3JlY3QpOworCisgIEhEQyAoU1RETUVUSE9EQ0FMTFRZUEUg KkdldE1lbW9yeURDKShJRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0ICpUaGlzKTsKKworICBF TUFDU19EV1JJVEVfVU5VU0VEIChHZXRQaXhlbHNQZXJEaXApOworCisgIEhSRVNVTFQgKFNU RE1FVEhPRENBTExUWVBFICpTZXRQaXhlbHNQZXJEaXApCisgICAgKElEV3JpdGVCaXRtYXBS ZW5kZXJUYXJnZXQgKlRoaXMsIEZMT0FUIHBpeGVsc19wZXJfZGlwKTsKKworICBFTUFDU19E V1JJVEVfVU5VU0VEIChHZXRDdXJyZW50VHJhbnNmb3JtKTsKKyAgRU1BQ1NfRFdSSVRFX1VO VVNFRCAoU2V0Q3VycmVudFRyYW5zZm9ybSk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKEdl dFNpemUpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChSZXNpemUpOworICBFTkRfSU5URVJG QUNFCit9IElEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXRWdGJsOworCitpbnRlcmZhY2UgSURX cml0ZUJpdG1hcFJlbmRlclRhcmdldCB7CisgICAgQ09OU1RfVlRCTCBJRFdyaXRlQml0bWFw UmVuZGVyVGFyZ2V0VnRibCogbHBWdGJsOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgSURXcml0 ZUJpdG1hcFJlbmRlclRhcmdldDFWdGJsIHsKKyAgQkVHSU5fSU5URVJGQUNFCisKKyAgSFJF U1VMVCAoU1RETUVUSE9EQ0FMTFRZUEUgKlF1ZXJ5SW50ZXJmYWNlKQorICAgIChJRFdyaXRl Qml0bWFwUmVuZGVyVGFyZ2V0MSAqVGhpcywgUkVGSUlEIHJpaWQsIHZvaWQgKipwcHZPYmpl Y3QpOworICBVTE9ORyAoU1RETUVUSE9EQ0FMTFRZUEUgKkFkZFJlZikgKElEV3JpdGVCaXRt YXBSZW5kZXJUYXJnZXQxICpUaGlzKTsKKyAgVUxPTkcgKFNURE1FVEhPRENBTExUWVBFICpS ZWxlYXNlKSAoSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldDEgKlRoaXMpOworCisgIEVNQUNT X0RXUklURV9VTlVTRUQgKERyYXdHbHlwaFJ1bik7CisgIEVNQUNTX0RXUklURV9VTlVTRUQg KEdldE1lbW9yeURDKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoR2V0UGl4ZWxzUGVyRGlw KTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoU2V0UGl4ZWxzUGVyRGlwKTsKKyAgRU1BQ1Nf RFdSSVRFX1VOVVNFRCAoR2V0Q3VycmVudFRyYW5zZm9ybSk7CisgIEVNQUNTX0RXUklURV9V TlVTRUQgKFNldEN1cnJlbnRUcmFuc2Zvcm0pOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChH ZXRTaXplKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoUmVzaXplKTsKKyAgRU1BQ1NfRFdS SVRFX1VOVVNFRCAoR2V0VGV4dEFudGlhbGlhc01vZGUpOworCisgIEhSRVNVTFQgKFNURE1F VEhPRENBTExUWVBFICpTZXRUZXh0QW50aWFsaWFzTW9kZSkKKyAgICAoSURXcml0ZUJpdG1h cFJlbmRlclRhcmdldDEgKlRoaXMsIERXUklURV9URVhUX0FOVElBTElBU19NT0RFIG1vZGUp OworCisgIEVORF9JTlRFUkZBQ0UKK30gSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldDFWdGJs OworCitpbnRlcmZhY2UgSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldDEgeworICAgIENPTlNU X1ZUQkwgSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldDFWdGJsKiBscFZ0Ymw7Cit9OworCit0 eXBlZGVmIHN0cnVjdCBJRFdyaXRlR2RpSW50ZXJvcFZ0YmwgeworICBCRUdJTl9JTlRFUkZB Q0UKKworICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAqUXVlcnlJbnRlcmZhY2UpCisg ICAgKElEV3JpdGVHZGlJbnRlcm9wICpUaGlzLCBSRUZJSUQgcmlpZCwgdm9pZCAqKnBwdk9i amVjdCk7CisgIFVMT05HIChTVERNRVRIT0RDQUxMVFlQRSAqQWRkUmVmKShJRFdyaXRlR2Rp SW50ZXJvcCAqVGhpcyk7CisgIFVMT05HIChTVERNRVRIT0RDQUxMVFlQRSAqUmVsZWFzZSko SURXcml0ZUdkaUludGVyb3AgKlRoaXMpOworCisgIEhSRVNVTFQgKFNURE1FVEhPRENBTExU WVBFICpDcmVhdGVGb250RnJvbUxPR0ZPTlQpCisgICAgKElEV3JpdGVHZGlJbnRlcm9wICpU aGlzLCBjb25zdCBMT0dGT05UVyAqbG9nZm9udCwKKyAgICAgSURXcml0ZUZvbnQgKipmb250 KTsKKworICBFTUFDU19EV1JJVEVfVU5VU0VEIChDb252ZXJ0Rm9udFRvTE9HRk9OVCk7Cisg IEVNQUNTX0RXUklURV9VTlVTRUQgKENvbnZlcnRGb250RmFjZVRvTE9HRk9OVCk7CisgIEVN QUNTX0RXUklURV9VTlVTRUQgKENyZWF0ZUZvbnRGYWNlRnJvbUhkYyk7CisKKyAgSFJFU1VM VCAoU1RETUVUSE9EQ0FMTFRZUEUgKkNyZWF0ZUJpdG1hcFJlbmRlclRhcmdldCkKKyAgICAo SURXcml0ZUdkaUludGVyb3AgKlRoaXMsIEhEQyBoZGMsIFVJTlQzMiB3aWR0aCwgVUlOVDMy IGhlaWdodCwKKyAgICAgSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldCAqKnRhcmdldCk7Cisg IEVORF9JTlRFUkZBQ0UKK30gSURXcml0ZUdkaUludGVyb3BWdGJsOworCitpbnRlcmZhY2Ug SURXcml0ZUdkaUludGVyb3AgeworICAgIENPTlNUX1ZUQkwgSURXcml0ZUdkaUludGVyb3BW dGJsKiBscFZ0Ymw7Cit9OworCit0eXBlZGVmIHN0cnVjdCBJRFdyaXRlRmFjdG9yeVZ0Ymwg eworICBCRUdJTl9JTlRFUkZBQ0UKKworICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAq UXVlcnlJbnRlcmZhY2UpCisgICAgKElEV3JpdGVGYWN0b3J5ICpUaGlzLCBSRUZJSUQgcmlp ZCwgdm9pZCAqKnBwdk9iamVjdCk7CisgIFVMT05HIChTVERNRVRIT0RDQUxMVFlQRSAqQWRk UmVmKShJRFdyaXRlRmFjdG9yeSAqVGhpcyk7CisgIFVMT05HIChTVERNRVRIT0RDQUxMVFlQ RSAqUmVsZWFzZSkoSURXcml0ZUZhY3RvcnkgKlRoaXMpOworCisgIEVNQUNTX0RXUklURV9V TlVTRUQgKEdldFN5c3RlbUZvbnRDb2xsZWN0aW9uKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNF RCAoQ3JlYXRlQ3VzdG9tRm9udENvbGxlY3Rpb24pOworICBFTUFDU19EV1JJVEVfVU5VU0VE IChSZWdpc3RlckZvbnRDb2xsZWN0aW9uTG9hZGVyKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNF RCAoVW5yZWdpc3RlckZvbnRDb2xsZWN0aW9uTG9hZGVyKTsKKyAgRU1BQ1NfRFdSSVRFX1VO VVNFRCAoQ3JlYXRlRm9udEZpbGVSZWZlcmVuY2UpOworICBFTUFDU19EV1JJVEVfVU5VU0VE IChDcmVhdGVDdXN0b21Gb250RmlsZVJlZmVyZW5jZSk7CisgIEVNQUNTX0RXUklURV9VTlVT RUQgKENyZWF0ZUZvbnRGYWNlKTsKKyAgSFJFU1VMVCAoU1RETUVUSE9EQ0FMTFRZUEUgKkNy ZWF0ZVJlbmRlcmluZ1BhcmFtcykKKyAgICAoSURXcml0ZUZhY3RvcnkgKlRoaXMsIElEV3Jp dGVSZW5kZXJpbmdQYXJhbXMgKipwYXJhbXMpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChD cmVhdGVNb25pdG9yUmVuZGVyaW5nUGFyYW1zKTsKKyAgSFJFU1VMVCAoU1RETUVUSE9EQ0FM TFRZUEUgKkNyZWF0ZUN1c3RvbVJlbmRlcmluZ1BhcmFtcykKKyAgICAoSURXcml0ZUZhY3Rv cnkgKlRoaXMsIEZMT0FUIGdhbW1hLCBGTE9BVCBlbmhhbmNlZENvbnRyYXN0LAorICAgICBG TE9BVCBjbGVhcnR5cGVfbGV2ZWwsIERXUklURV9QSVhFTF9HRU9NRVRSWSBnZW9tZXRyeSwK KyAgICAgRFdSSVRFX1JFTkRFUklOR19NT0RFIG1vZGUsIElEV3JpdGVSZW5kZXJpbmdQYXJh bXMgKipwYXJhbXMpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChSZWdpc3RlckZvbnRGaWxl TG9hZGVyKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoVW5yZWdpc3RlckZvbnRGaWxlTG9h ZGVyKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoQ3JlYXRlVGV4dEZvcm1hdCk7CisgIEVN QUNTX0RXUklURV9VTlVTRUQgKENyZWF0ZVR5cG9ncmFwaHkpOworICBIUkVTVUxUIChTVERN RVRIT0RDQUxMVFlQRSAqR2V0R2RpSW50ZXJvcCkKKyAgICAoSURXcml0ZUZhY3RvcnkgKlRo aXMsIElEV3JpdGVHZGlJbnRlcm9wICoqZ2RpX2ludGVyb3ApOworICBFTUFDU19EV1JJVEVf VU5VU0VEIChDcmVhdGVUZXh0TGF5b3V0KTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoQ3Jl YXRlR2RpQ29tcGF0aWJsZVRleHRMYXlvdXQpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChD cmVhdGVFbGxpcHNpc1RyaW1taW5nU2lnbik7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKENy ZWF0ZVRleHRBbmFseXplcik7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKENyZWF0ZU51bWJl clN1YnN0aXR1dGlvbik7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKENyZWF0ZUdseXBoUnVu QW5hbHlzaXMpOworICBFTkRfSU5URVJGQUNFCit9IElEV3JpdGVGYWN0b3J5VnRibDsKKwor aW50ZXJmYWNlIElEV3JpdGVGYWN0b3J5IHsgQ09OU1RfVlRCTCBJRFdyaXRlRmFjdG9yeVZ0 YmwqIGxwVnRibDsgfTsKKwordHlwZWRlZiBzdHJ1Y3QgSURXcml0ZUNvbG9yR2x5cGhSdW5F bnVtZXJhdG9yVnRibCB7CisgICAgQkVHSU5fSU5URVJGQUNFCisKKyAgICBIUkVTVUxUIChT VERNRVRIT0RDQUxMVFlQRSAqUXVlcnlJbnRlcmZhY2UpCisgICAgICAoSURXcml0ZUNvbG9y R2x5cGhSdW5FbnVtZXJhdG9yICpUaGlzLCBSRUZJSUQgcmlpZCwgdm9pZCAqKnBwdk9iamVj dCk7CisgICAgVUxPTkcgKFNURE1FVEhPRENBTExUWVBFICpBZGRSZWYpKElEV3JpdGVDb2xv ckdseXBoUnVuRW51bWVyYXRvciAqVGhpcyk7CisgICAgVUxPTkcgKFNURE1FVEhPRENBTExU WVBFICpSZWxlYXNlKShJRFdyaXRlQ29sb3JHbHlwaFJ1bkVudW1lcmF0b3IgKlRoaXMpOwor CisgICAgSFJFU1VMVCAoU1RETUVUSE9EQ0FMTFRZUEUgKk1vdmVOZXh0KSgKKyAgICAgICAg SURXcml0ZUNvbG9yR2x5cGhSdW5FbnVtZXJhdG9yICpUaGlzLAorICAgICAgICBXSU5CT09M ICpoYXNSdW4pOworCisgICAgSFJFU1VMVCAoU1RETUVUSE9EQ0FMTFRZUEUgKkdldEN1cnJl bnRSdW4pKAorICAgICAgICBJRFdyaXRlQ29sb3JHbHlwaFJ1bkVudW1lcmF0b3IgKlRoaXMs CisgICAgICAgIGNvbnN0IERXUklURV9DT0xPUl9HTFlQSF9SVU4gKipydW4pOworCisgICAg RU5EX0lOVEVSRkFDRQorfSBJRFdyaXRlQ29sb3JHbHlwaFJ1bkVudW1lcmF0b3JWdGJsOwor CitpbnRlcmZhY2UgSURXcml0ZUNvbG9yR2x5cGhSdW5FbnVtZXJhdG9yIHsKKyAgICBDT05T VF9WVEJMIElEV3JpdGVDb2xvckdseXBoUnVuRW51bWVyYXRvclZ0YmwqIGxwVnRibDsKK307 CisKK3R5cGVkZWYgc3RydWN0IElEV3JpdGVGYWN0b3J5MlZ0YmwgeworICBCRUdJTl9JTlRF UkZBQ0UKKyAgSFJFU1VMVCAoU1RETUVUSE9EQ0FMTFRZUEUgKlF1ZXJ5SW50ZXJmYWNlKQor ICAgICAgKElEV3JpdGVGYWN0b3J5MiAqVGhpcywgUkVGSUlEIHJpaWQsIHZvaWQgKipwcHZP YmplY3QpOworICBVTE9ORyAoU1RETUVUSE9EQ0FMTFRZUEUgKkFkZFJlZikoSURXcml0ZUZh Y3RvcnkyICpUaGlzKTsKKyAgVUxPTkcgKFNURE1FVEhPRENBTExUWVBFICpSZWxlYXNlKShJ RFdyaXRlRmFjdG9yeTIgKlRoaXMpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChHZXRTeXN0 ZW1Gb250Q29sbGVjdGlvbik7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKENyZWF0ZUN1c3Rv bUZvbnRDb2xsZWN0aW9uKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoUmVnaXN0ZXJGb250 Q29sbGVjdGlvbkxvYWRlcik7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKFVucmVnaXN0ZXJG b250Q29sbGVjdGlvbkxvYWRlcik7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKENyZWF0ZUZv bnRGaWxlUmVmZXJlbmNlKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoQ3JlYXRlQ3VzdG9t Rm9udEZpbGVSZWZlcmVuY2UpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChDcmVhdGVGb250 RmFjZSk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKENyZWF0ZVJlbmRlcmluZ1BhcmFtcyk7 CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKENyZWF0ZU1vbml0b3JSZW5kZXJpbmdQYXJhbXMp OworICBFTUFDU19EV1JJVEVfVU5VU0VEIChDcmVhdGVDdXN0b21SZW5kZXJpbmdQYXJhbXMp OworICBFTUFDU19EV1JJVEVfVU5VU0VEIChSZWdpc3RlckZvbnRGaWxlTG9hZGVyKTsKKyAg RU1BQ1NfRFdSSVRFX1VOVVNFRCAoVW5yZWdpc3RlckZvbnRGaWxlTG9hZGVyKTsKKyAgRU1B Q1NfRFdSSVRFX1VOVVNFRCAoQ3JlYXRlVGV4dEZvcm1hdCk7CisgIEVNQUNTX0RXUklURV9V TlVTRUQgKENyZWF0ZVR5cG9ncmFwaHkpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChHZXRH ZGlJbnRlcm9wKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoQ3JlYXRlVGV4dExheW91dCk7 CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKENyZWF0ZUdkaUNvbXBhdGlibGVUZXh0TGF5b3V0 KTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoQ3JlYXRlRWxsaXBzaXNUcmltbWluZ1NpZ24p OworICBFTUFDU19EV1JJVEVfVU5VU0VEIChDcmVhdGVUZXh0QW5hbHl6ZXIpOworICBFTUFD U19EV1JJVEVfVU5VU0VEIChDcmVhdGVOdW1iZXJTdWJzdGl0dXRpb24pOworICBFTUFDU19E V1JJVEVfVU5VU0VEIChDcmVhdGVHbHlwaFJ1bkFuYWx5c2lzKTsKKworICBFTUFDU19EV1JJ VEVfVU5VU0VEIChHZXRFdWRjRm9udENvbGxlY3Rpb24pOworICBFTUFDU19EV1JJVEVfVU5V U0VEIChJRFdyaXRlRmFjdG9yeTFfQ3JlYXRlQ3VzdG9tUmVuZGVyaW5nUGFyYW1zKTsKKwor ICBFTUFDU19EV1JJVEVfVU5VU0VEIChHZXRTeXN0ZW1Gb250RmFsbGJhY2spOworICBFTUFD U19EV1JJVEVfVU5VU0VEIChDcmVhdGVGb250RmFsbGJhY2tCdWlsZGVyKTsKKyAgSFJFU1VM VCAoU1RETUVUSE9EQ0FMTFRZUEUgKlRyYW5zbGF0ZUNvbG9yR2x5cGhSdW4pCisgICAgKElE V3JpdGVGYWN0b3J5MiAqVGhpcywKKyAgICAgRkxPQVQgb3JpZ2luWCwKKyAgICAgRkxPQVQg b3JpZ2luWSwKKyAgICAgY29uc3QgRFdSSVRFX0dMWVBIX1JVTiAqcnVuLAorICAgICB2b2lk ICpydW5kZXNjciwKKyAgICAgRFdSSVRFX01FQVNVUklOR19NT0RFIG1vZGUsCisgICAgIHZv aWQgKnRyYW5zZm9ybSwKKyAgICAgVUlOVDMyIHBhbGV0dGVfaW5kZXgsCisgICAgIElEV3Jp dGVDb2xvckdseXBoUnVuRW51bWVyYXRvciAqKmNvbG9ybGF5ZXJzKTsKKworICBFTUFDU19E V1JJVEVfVU5VU0VEIChJRFdyaXRlRmFjdG9yeTJfQ3JlYXRlQ3VzdG9tUmVuZGVyaW5nUGFy YW1zKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoSURXcml0ZUZhY3RvcnkyX0NyZWF0ZUds eXBoUnVuQW5hbHlzaXMpOworICBFTkRfSU5URVJGQUNFCit9IElEV3JpdGVGYWN0b3J5MlZ0 Ymw7CisKK2ludGVyZmFjZSBJRFdyaXRlRmFjdG9yeTIgeworICAgIENPTlNUX1ZUQkwgSURX cml0ZUZhY3RvcnkyVnRibCogbHBWdGJsOworfTsKKyNlbHNlIC8qIGlmbmRlZiBNSU5HV19X NjQgKi8KKyMgaW5jbHVkZSA8ZHdyaXRlXzMuaD4KKyNlbmRpZgorCisvKiBWYWx1ZXMgdG8g dXNlIGZvciBEaXJlY3RXcml0ZSByZW5kZXJpbmcuICAqLworI2RlZmluZSBNRUFTVVJJTkdf TU9ERSBEV1JJVEVfTUVBU1VSSU5HX01PREVfTkFUVVJBTAorI2RlZmluZSBSRU5ERVJJTkdf TU9ERSBEV1JJVEVfUkVOREVSSU5HX01PREVfTkFUVVJBTF9TWU1NRVRSSUMKKyNkZWZpbmUg QU5USUFMSUFTX01PREUgRFdSSVRFX1RFWFRfQU5USUFMSUFTX01PREVfQ0xFQVJUWVBFCisK KyNkZWZpbmUgUkVMRUFTRV9DT00oaSkgKGkpLT5scFZ0YmwtPlJlbGVhc2UgKGkpCisKKy8q IEdsb2JhbCB2YXJpYWJsZXMgZm9yIERpcmVjdFdyaXRlLiAgKi8KK3N0YXRpYyBib29sIGRp cmVjdF93cml0ZV9hdmFpbGFibGUgPSBmYWxzZTsKK3N0YXRpYyBJRFdyaXRlRmFjdG9yeSAq ZHdyaXRlX2ZhY3Rvcnk7CitzdGF0aWMgSURXcml0ZUZhY3RvcnkyICpkd3JpdGVfZmFjdG9y eTI7CitzdGF0aWMgSURXcml0ZUdkaUludGVyb3AgKmdkaV9pbnRlcm9wOworc3RhdGljIElE V3JpdGVSZW5kZXJpbmdQYXJhbXMgKnJlbmRlcmluZ19wYXJhbXM7CisKK3N0YXRpYyBib29s Cit2ZXJpZnlfaHIgKEhSRVNVTFQgaHIsIGNvbnN0IGNoYXIgKm1zZykKK3sKKyAgaWYgKEZB SUxFRCAoaHIpKQorICAgIHsKKyAgICAgIERlYlByaW50ICgoIkRpcmVjdFdyaXRlIEhSRVNV TFQgZmFpbGVkOiAoJWQpICVzXG4iLCBociwgbXNnKSk7CisgICAgICBlYXNzZXJ0IChTVUND RUVERUQgKGhyKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICByZXR1cm4gdHJ1 ZTsKK30KKworLyogR2V0cyBhIElEV3JpdGVGb250RmFjZSBmcm9tIGEgc3RydWN0IGZvbnQg KGl0cyBIRk9OVCkuIFJldHVybnMgdGhlCisgICBmb250IHNpemUgaW4gcG9pbnRzLiAgSXQg bWF5IGZhaWwgdG8gZ2V0IGEgRGlyZWN0V3JpdGUgZm9udCwgYW5kIGZhY2UKKyAgIHdpbGwg YmUgTlVMTCBvbiByZXR1cm4uICBUaGlzIGhhcHBlbnMgZm9yIHNvbWUgZm9udHMgbGlrZSBD b3VyaWVyLgorCisgICBOZXZlciBjYWxsIFJlbGVhc2Ugb24gdGhlIHJlc3VsdCwgYXMgaXQg aXMgY2FjaGVkIGZvciByZXVzZSBvbiB0aGUKKyAgIHN0cnVjdCBmb250LiAgKi8KK3N0YXRp YyBmbG9hdAorZ2V0X2ZvbnRfZmFjZSAoc3RydWN0IGZvbnQgKmluZm9udCwgSURXcml0ZUZv bnRGYWNlICoqZmFjZSkKK3sKKyAgSFJFU1VMVCBocjsKKyAgTE9HRk9OVFcgbG9nZm9udDsK KyAgSURXcml0ZUZvbnQgKmZvbnQ7CisKKyAgc3RydWN0IHVuaXNjcmliZV9mb250X2luZm8g KnVuaXNjcmliZV9mb250ID0KKyAgICAoc3RydWN0IHVuaXNjcmliZV9mb250X2luZm8gKikg aW5mb250OworCisgIC8qIENoZWNrIHRoZSBjYWNoZS4gICovCisgICpmYWNlID0gdW5pc2Ny aWJlX2ZvbnQtPmR3cml0ZV9jYWNoZTsKKyAgaWYgKCpmYWNlKQorICAgIHJldHVybiB1bmlz Y3JpYmVfZm9udC0+ZHdyaXRlX2ZvbnRfc2l6ZTsKKworICBHZXRPYmplY3RXIChGT05UX0hB TkRMRShpbmZvbnQpLCBzaXplb2YgKExPR0ZPTlRXKSwgJmxvZ2ZvbnQpOworCisgIGhyID0g Z2RpX2ludGVyb3AtPmxwVnRibC0+Q3JlYXRlRm9udEZyb21MT0dGT05UIChnZGlfaW50ZXJv cCwKKwkJCQkJCSAgIChjb25zdCBMT0dGT05UVyAqKSAmbG9nZm9udCwKKwkJCQkJCSAgICZm b250KTsKKworICBpZiAoIXZlcmlmeV9ociAoaHIsICJGYWlsZWQgdG8gQ3JlYXRlRm9udEZy b21MT0dGT05UIikpCisgICAgeworICAgICAgdW5pc2NyaWJlX2ZvbnQtPmR3cml0ZV9za2lw X2ZvbnQgPSB0cnVlOworICAgICAgKmZhY2UgPSBOVUxMOworICAgICAgcmV0dXJuIDAuMDsK KyAgICB9CisKKyAgaHIgPSBmb250LT5scFZ0YmwtPkNyZWF0ZUZvbnRGYWNlIChmb250LCBm YWNlKTsKKyAgUkVMRUFTRV9DT00gKGZvbnQpOworICBpZiAoIXZlcmlmeV9ociAoaHIsICJG YWlsZWQgdG8gY3JlYXRlIERXcml0ZUZvbnRGYWNlIikpCisgICAgeworICAgICAgdW5pc2Ny aWJlX2ZvbnQtPmR3cml0ZV9za2lwX2ZvbnQgPSB0cnVlOworICAgICAgKmZhY2UgPSBOVUxM OworICAgICAgcmV0dXJuIDAuMDsKKyAgICB9CisKKyAgLyogQ2FjaGUgdGhpcyBGb250RmFj ZS4gICovCisgIHVuaXNjcmliZV9mb250LT5kd3JpdGVfZm9udF9zaXplID0gYWJzIChsb2dm b250LmxmSGVpZ2h0KTsKKyAgdW5pc2NyaWJlX2ZvbnQtPmR3cml0ZV9jYWNoZSA9ICpmYWNl OworCisgIHJldHVybiBhYnMgKGxvZ2ZvbnQubGZIZWlnaHQpOworfQorCit2b2lkCit3MzJf ZHdyaXRlX2ZyZWVfY2FjaGVkX2ZhY2UgKHZvaWQgKmNhY2hlKQoreworICBpZiAoY2FjaGUp CisgICAgUkVMRUFTRV9DT00gKChJRFdyaXRlRm9udEZhY2UgKikgY2FjaGUpOworfQorCitz dGF0aWMgZmxvYXQKK2NvbnZlcnRfbWV0cmljc19zeiAoaW50IHN6LCBmbG9hdCBmb250X3Np emUsIGludCB1bml0c19wZXJfZW0pCit7CisgIHJldHVybiAoZmxvYXQpIHN6ICogZm9udF9z aXplIC8gdW5pdHNfcGVyX2VtOworfQorCisvKiBEb2VzIG5vdCBmaWxsIGluIHRoZSBhc2Nl bnQgYW5kIGRlc2NlbnQgZmllbGRzIG9mIG1ldHJpY3MuICAqLworc3RhdGljIGJvb2wKK3Rl eHRfZXh0ZW50c19pbnRlcm5hbCAoSURXcml0ZUZvbnRGYWNlICpkd3JpdGVfZm9udF9mYWNl LAorCQkgICAgICAgZmxvYXQgZm9udF9zaXplLCBjb25zdCB1bnNpZ25lZCAqY29kZSwKKwkJ ICAgICAgIGludCBuZ2x5cGhzLCBzdHJ1Y3QgZm9udF9tZXRyaWNzICptZXRyaWNzKQorewor ICBIUkVTVUxUIGhyOworCisgIERXUklURV9GT05UX01FVFJJQ1MgZHdyaXRlX2ZvbnRfbWV0 cmljczsKKyAgZHdyaXRlX2ZvbnRfZmFjZS0+bHBWdGJsLT5HZXRNZXRyaWNzIChkd3JpdGVf Zm9udF9mYWNlLAorCQkJCQkmZHdyaXRlX2ZvbnRfbWV0cmljcyk7CisKKyAgVUlOVDE2ICpp bmRpY2VzID0gYWxsb2NhIChuZ2x5cGhzICogc2l6ZW9mIChVSU5UMTYpKTsKKyAgZm9yIChp bnQgaSA9IDA7IGkgPCBuZ2x5cGhzOyBpKyspCisgICAgaW5kaWNlc1tpXSA9IGNvZGVbaV07 CisKKyAgRFdSSVRFX0dMWVBIX01FVFJJQ1MqIGdtZXRyaWNzID0KKyAgICBhbGxvY2EgKG5n bHlwaHMgKiBzaXplb2YgKERXUklURV9HTFlQSF9NRVRSSUNTKSk7CisKKyAgaHIgPSBkd3Jp dGVfZm9udF9mYWNlLT5scFZ0YmwtPkdldEdkaUNvbXBhdGlibGVHbHlwaE1ldHJpY3MgKGR3 cml0ZV9mb250X2ZhY2UsCisJCQkJCQkJICAgICAgIGZvbnRfc2l6ZSwKKwkJCQkJCQkgICAg ICAgMS4wLAorCQkJCQkJCSAgICAgICBOVUxMLAorCQkJCQkJCSAgICAgICBUUlVFLAorCQkJ CQkJCSAgICAgICBpbmRpY2VzLAorCQkJCQkJCSAgICAgICBuZ2x5cGhzLAorCQkJCQkJCSAg ICAgICBnbWV0cmljcywKKwkJCQkJCQkgICAgICAgZmFsc2UpOworICBpZiAoIXZlcmlmeV9o ciAoaHIsICJGYWlsZWQgdG8gR2V0R2RpQ29tcGF0aWJsZUdseXBoTWV0cmljcyIpKQorICAg IHJldHVybiBmYWxzZTsKKworICBmbG9hdCB3aWR0aCA9IDA7CisgIGludCBkdV9wZXJfZW0g PSBkd3JpdGVfZm9udF9tZXRyaWNzLmRlc2lnblVuaXRzUGVyRW07CisKKyAgZm9yIChpbnQg aSA9IDA7IGkgPCBuZ2x5cGhzOyBpKyspCisgICAgeworICAgICAgZmxvYXQgYWR2YW5jZSA9 CisJY29udmVydF9tZXRyaWNzX3N6IChnbWV0cmljc1tpXS5hZHZhbmNlV2lkdGgsIGZvbnRf c2l6ZSwgZHVfcGVyX2VtKTsKKworICAgICAgd2lkdGggKz0gYWR2YW5jZTsKKworICAgICAg ZmxvYXQgbGJlYXJpbmcgPQorCXJvdW5kIChjb252ZXJ0X21ldHJpY3Nfc3ogKGdtZXRyaWNz W2ldLmxlZnRTaWRlQmVhcmluZywgZm9udF9zaXplLAorCQkJCSAgIGR1X3Blcl9lbSkpOwor ICAgICAgZmxvYXQgcmJlYXJpbmcgPQorCXJvdW5kIChhZHZhbmNlIC0KKwkgICAgICAgY29u dmVydF9tZXRyaWNzX3N6IChnbWV0cmljc1tpXS5yaWdodFNpZGVCZWFyaW5nLAorCQkJCSAg IGZvbnRfc2l6ZSwgZHVfcGVyX2VtKSk7CisgICAgICBpZiAoaSA9PSAwKQorCXsKKwkgIG1l dHJpY3MtPmxiZWFyaW5nID0gbGJlYXJpbmc7CisJICBtZXRyaWNzLT5yYmVhcmluZyA9IHJi ZWFyaW5nOworCX0KKyAgICAgIGlmIChtZXRyaWNzLT5sYmVhcmluZyA+IGxiZWFyaW5nKQor CW1ldHJpY3MtPmxiZWFyaW5nID0gbGJlYXJpbmc7CisgICAgICBpZiAobWV0cmljcy0+cmJl YXJpbmcgPCByYmVhcmluZykKKwltZXRyaWNzLT5yYmVhcmluZyA9IHJiZWFyaW5nOworICAg IH0KKyAgbWV0cmljcy0+d2lkdGggPSByb3VuZCh3aWR0aCk7CisKKyAgcmV0dXJuIHRydWU7 Cit9CisKK3Vuc2lnbmVkCit3MzJfZHdyaXRlX2VuY29kZV9jaGFyIChzdHJ1Y3QgZm9udCAq Zm9udCwgaW50IGMpCit7CisgIEhSRVNVTFQgaHI7CisgIElEV3JpdGVGb250RmFjZSAqZHdy aXRlX2ZvbnRfZmFjZTsKKyAgVUlOVDE2IGluZGV4OworCisgIGdldF9mb250X2ZhY2UgKGZv bnQsICZkd3JpdGVfZm9udF9mYWNlKTsKKyAgaWYgKGR3cml0ZV9mb250X2ZhY2UgPT0gTlVM TCkKKyAgICByZXR1cm4gRk9OVF9JTlZBTElEX0NPREU7CisgIGhyID0gZHdyaXRlX2ZvbnRf ZmFjZS0+bHBWdGJsLT5HZXRHbHlwaEluZGljZXMgKGR3cml0ZV9mb250X2ZhY2UsCisJCQkJ CQkgICZjLCAxLCAmaW5kZXgpOworICBpZiAodmVyaWZ5X2hyIChociwgIkZhaWxlZCB0byBH ZXRHbHlwaEluZGljZXMiKSkKKyAgICB7CisgICAgICBpZiAoaW5kZXggPT0gMCkKKwlyZXR1 cm4gRk9OVF9JTlZBTElEX0NPREU7CisgICAgICByZXR1cm4gaW5kZXg7CisgICAgfQorICAo KHN0cnVjdCB1bmlzY3JpYmVfZm9udF9pbmZvICopIGZvbnQpLT5kd3JpdGVfc2tpcF9mb250 ID0gdHJ1ZTsKKyAgcmV0dXJuIEZPTlRfSU5WQUxJRF9DT0RFOworfQorCitib29sCit3MzJf ZHdyaXRlX3RleHRfZXh0ZW50cyAoc3RydWN0IGZvbnQgKmZvbnQsIGNvbnN0IHVuc2lnbmVk ICpjb2RlLCBpbnQgbmdseXBocywKKwkJCSBzdHJ1Y3QgZm9udF9tZXRyaWNzICptZXRyaWNz KQoreworICBJRFdyaXRlRm9udEZhY2UgKmR3cml0ZV9mb250X2ZhY2U7CisKKyAgZmxvYXQg Zm9udF9zaXplID0gZ2V0X2ZvbnRfZmFjZSAoZm9udCwgJmR3cml0ZV9mb250X2ZhY2UpOwor CisgIGlmIChkd3JpdGVfZm9udF9mYWNlID09IE5VTEwpCisgICAgICByZXR1cm4gZmFsc2U7 CisKKyAgLyogV2UgY2FuIGdldCBmb250cyB3aXRoIGEgc2l6ZSBvZiAwLiAgR0RJIGhhbmRs ZXMgdGhpcyBieSB1c2luZyBhIGRlZmF1bHQKKyAgICAgc2l6ZS4gIFdlIGRvIHRoZSBzYW1l LiAgKi8KKyAgaWYgKGZvbnRfc2l6ZSA8PSAwLjBmKQorICAgICAgZm9udF9zaXplID0gRlJB TUVfTElORV9IRUlHSFQgKFhGUkFNRSAoc2VsZWN0ZWRfZnJhbWUpKTsKKworICBtZXRyaWNz LT5hc2NlbnQgPSBmb250LT5hc2NlbnQ7CisgIG1ldHJpY3MtPmRlc2NlbnQgPSBmb250LT5k ZXNjZW50OworCisgIHJldHVybiB0ZXh0X2V4dGVudHNfaW50ZXJuYWwgKGR3cml0ZV9mb250 X2ZhY2UsIGZvbnRfc2l6ZSwgY29kZSwgbmdseXBocywKKwkJCQltZXRyaWNzKTsKK30KKwor LyogTmV2ZXIgY2FsbCBSZWxlYXNlIG9uIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGlzIGZ1 bmN0aW9uLCBhcyBpdCBpcworICAgcmV1c2VkLiAgKi8KK3N0YXRpYyBJRFdyaXRlQml0bWFw UmVuZGVyVGFyZ2V0ICoKK2dldF9iaXRtYXBfcmVuZGVyX3RhcmdldCAoSERDIGhkYywgaW50 IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICBIUkVTVUxUIGhyOworICBzdGF0aWMgSURXcml0 ZUJpdG1hcFJlbmRlclRhcmdldCAqYnJ0ID0gTlVMTDsKKyAgc3RhdGljIFNJWkUgc2l6ZSA9 IHswLCAwfTsKKworICBpZiAoYnJ0KQorICAgIHsKKyAgICAgIC8qIENoZWNrIGlmIHdlIG5l ZWQgdG8gbWFrZSBhIGJpZ2dlciBvbmUuICAqLworICAgICAgaWYgKHdpZHRoIDw9IHNpemUu Y3ggJiYgaGVpZ2h0IDw9IHNpemUuY3kpCisJcmV0dXJuIGJydDsKKyAgICAgIFJFTEVBU0Vf Q09NIChicnQpOworICAgIH0KKworICBpZiAod2lkdGggPiBzaXplLmN4KQorICAgIHNpemUu Y3ggPSB3aWR0aDsKKyAgaWYgKGhlaWdodCA+IHNpemUuY3kpCisgICAgc2l6ZS5jeSA9IGhl aWdodDsKKworICBociA9IGdkaV9pbnRlcm9wLT5scFZ0YmwtPkNyZWF0ZUJpdG1hcFJlbmRl clRhcmdldCAoZ2RpX2ludGVyb3AsCisJCQkJCQkgICAgICBoZGMsCisJCQkJCQkgICAgICBz aXplLmN4LCBzaXplLmN5LAorCQkJCQkJICAgICAgJmJydCk7CisgIGlmICghdmVyaWZ5X2hy IChociwgIkZhaWxlZCB0byBDcmVhdGVCaXRtYXBSZW5kZXJUYXJnZXQiKSkKKyAgICAgIHJl dHVybiBOVUxMOworCisgIC8qIFdlIGhhbmRsZSBoaWdoIGRwaSBkaXNwbGF5cyBieSBpbmNy ZXNpbmcgZm9udCBzaXplLCBzbyBvdmVycmlkZQorICAgICBQaXhlbHNQZXJEaXAuICAqLwor ICBicnQtPmxwVnRibC0+U2V0UGl4ZWxzUGVyRGlwIChicnQsIDEuMCk7CisKKyAgLyogVGhl IFNldFRleHRBbnRpYWxpYXNNb2RlIG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBpbgorICAg ICBJRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0MS4gICovCisgIElEV3JpdGVCaXRtYXBSZW5k ZXJUYXJnZXQxICpicnQxOworICBociA9IGJydC0+bHBWdGJsLT5RdWVyeUludGVyZmFjZSAo YnJ0LAorCQkJCSAgICAmSUlEX0lEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQxLAorCQkJCSAg ICAodm9pZCAqKikgJmJydDEpOworICAvKiBUaGlzIGVycm9yIHNob3VsZCBub3QgaGFwcGVu LCBidXQgaXMgbm90IGNhdGFzdHJvZmljICAqLworICBpZiAodmVyaWZ5X2hyIChociwgIkZh aWxlZCB0byBRdWVyeUludGVyZmFjZSBmb3IgSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldDEi KSkKKyAgICB7CisgICAgICBicnQxLT5scFZ0YmwtPlNldFRleHRBbnRpYWxpYXNNb2RlIChi cnQxLCBBTlRJQUxJQVNfTU9ERSk7CisgICAgICBSRUxFQVNFX0NPTSAoYnJ0MSk7CisgICAg fQorCisgIHJldHVybiBicnQ7Cit9CisKK3ZvaWQKK3czMl9pbml0aWFsaXplX2RpcmVjdF93 cml0ZSAodm9pZCkKK3sKKyAgZGlyZWN0X3dyaXRlX2F2YWlsYWJsZSA9IGZhbHNlOworICBI TU9EVUxFIGRpcmVjdF93cml0ZSA9IExvYWRMaWJyYXJ5ICgiZHdyaXRlLmRsbCIpOworICBp ZiAoIWRpcmVjdF93cml0ZSkKKyAgICByZXR1cm47CisKKyAgLyogVGhpcyBpcyBvbmx5IHVz ZWQgaGVyZSwgbm8gbmVlZCB0byBkZWZpbmUgaXQgZ2xvYmFsbHkuICAqLworICB0eXBlZGVm IEhSRVNVTFQgKFdJTkFQSSAqRFdDcmVhdGVGYWN0b3J5KSAoRFdSSVRFX0ZBQ1RPUllfVFlQ RSBmLCBSRUZJSUQgciwgSVVua25vd24qKiB1KTsKKworICBEV0NyZWF0ZUZhY3RvcnkgZHdf Y3JlYXRlX2ZhY3RvcnkKKyAgICA9IChEV0NyZWF0ZUZhY3RvcnkpIGdldF9wcm9jX2FkZHIg KGRpcmVjdF93cml0ZSwKKwkJCQkgICAgICAgIkRXcml0ZUNyZWF0ZUZhY3RvcnkiKTsKKwor ICBpZiAoIWR3X2NyZWF0ZV9mYWN0b3J5KQorICAgIHsKKyAgICAgIEZyZWVMaWJyYXJ5IChk aXJlY3Rfd3JpdGUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBIUkVTVUxUIGhyID0g ZHdfY3JlYXRlX2ZhY3RvcnkgKERXUklURV9GQUNUT1JZX1RZUEVfU0hBUkVELAorCQkJCSAg JklJRF9JRFdyaXRlRmFjdG9yeSwKKwkJCQkgIChJVW5rbm93biAqKikgJmR3cml0ZV9mYWN0 b3J5KTsKKyAgaWYgKEZBSUxFRCAoaHIpKQorICAgIHsKKyAgICAgIERlYlByaW50ICgoIkRp cmVjdFdyaXRlIEhSRVNVTFQgZmFpbGVkOiAoJWQpIENyZWF0ZUZhY3RvcnlcbiIsIGhyKSk7 CisgICAgICBGcmVlTGlicmFyeSAoZGlyZWN0X3dyaXRlKTsKKyAgICAgIGVhc3NlcnQgKFNV Q0NFRURFRCAoaHIpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaHIgPSBkd3JpdGVf ZmFjdG9yeS0+bHBWdGJsLT5RdWVyeUludGVyZmFjZSAoZHdyaXRlX2ZhY3RvcnksCisJCQkJ CSAgICAgICAmSUlEX0lEV3JpdGVGYWN0b3J5MiwKKwkJCQkJICAgICAgICh2b2lkICoqKSAm ZHdyaXRlX2ZhY3RvcnkyKTsKKworICBpZiAoRkFJTEVEIChocikpCisgICAgeworICAgICAg RGViUHJpbnQgKCgiRGlyZWN0V3JpdGUgSFJFU1VMVCBmYWlsZWQ6ICglZCkgUXVlcnlJbnRl cmZhY2UgSURXcml0ZUZhY3RvcnkyXG4iLCBocikpOworICAgICAgUkVMRUFTRV9DT00gKGR3 cml0ZV9mYWN0b3J5KTsKKyAgICAgIEZyZWVMaWJyYXJ5IChkaXJlY3Rfd3JpdGUpOworICAg ICAgZWFzc2VydCAoU1VDQ0VFREVEIChocikpOworICAgICAgcmV0dXJuOworICAgIH0KKwor ICBociA9IGR3cml0ZV9mYWN0b3J5LT5scFZ0YmwtPkdldEdkaUludGVyb3AgKGR3cml0ZV9m YWN0b3J5LAorCQkJCQkgICAgICAmZ2RpX2ludGVyb3ApOworICBpZiAoRkFJTEVEIChocikp CisgICAgeworICAgICAgRGViUHJpbnQgKCgiRGlyZWN0V3JpdGUgSFJFU1VMVCBmYWlsZWQ6 ICglZCkgR2V0R2RpSW50ZXJvcFxuIiwgaHIpKTsKKyAgICAgIFJFTEVBU0VfQ09NIChkd3Jp dGVfZmFjdG9yeSk7CisgICAgICBSRUxFQVNFX0NPTSAoZHdyaXRlX2ZhY3RvcnkyKTsKKyAg ICAgIEZyZWVMaWJyYXJ5IChkaXJlY3Rfd3JpdGUpOworICAgICAgZWFzc2VydCAoU1VDQ0VF REVEIChocikpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBJRFdyaXRlUmVuZGVyaW5n UGFyYW1zICpkZWY7CisKKyAgaHIgPSBkd3JpdGVfZmFjdG9yeS0+bHBWdGJsLT5DcmVhdGVS ZW5kZXJpbmdQYXJhbXMgKGR3cml0ZV9mYWN0b3J5LAorCQkJCQkJICAgICAgJmRlZik7Cisg IGlmIChGQUlMRUQgKGhyKSkKKyAgICB7CisgICAgICBEZWJQcmludCAoKCJEaXJlY3RXcml0 ZSBIUkVTVUxUIGZhaWxlZDogKCVkKSBDcmVhdGVSZW5kZXJpbmdQYXJhbXNcbiIsIGhyKSk7 CisgICAgICBSRUxFQVNFX0NPTSAoZHdyaXRlX2ZhY3RvcnkpOworICAgICAgUkVMRUFTRV9D T00gKGR3cml0ZV9mYWN0b3J5Mik7CisgICAgICBSRUxFQVNFX0NPTSAoZ2RpX2ludGVyb3Ap OworICAgICAgRnJlZUxpYnJhcnkgKGRpcmVjdF93cml0ZSk7CisgICAgICBlYXNzZXJ0IChT VUNDRUVERUQgKGhyKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIHJhbmdlOiBb MC4wLCAxLjBdICAqLworICBmbG9hdCBlbmhhbmNlZF9jb250cmFzdCA9IGRlZi0+bHBWdGJs LT5HZXRFbmhhbmNlZENvbnRyYXN0IChkZWYpOworICAvKiByYW5nZTogWzAuMCwgMS4wXSAg Ki8KKyAgZmxvYXQgY2xlYXJfdHlwZV9sZXZlbCA9IGRlZi0+bHBWdGJsLT5HZXRDbGVhclR5 cGVMZXZlbCAoZGVmKTsKKyAgLyogcmFuZ2U6ICgwLjAsIDI1Ni4wXSAqLworICBmbG9hdCBn YW1tYSA9IDEuNDsgLyogZGVmLT5scFZ0YmwtPkdldEdhbW1hKGRlZik7ICovCisKKyAgaHIg PSBkd3JpdGVfZmFjdG9yeS0+bHBWdGJsLT5DcmVhdGVDdXN0b21SZW5kZXJpbmdQYXJhbXMg KGR3cml0ZV9mYWN0b3J5LAorCQkJCQkJCSAgICBnYW1tYSwKKwkJCQkJCQkgICAgZW5oYW5j ZWRfY29udHJhc3QsCisJCQkJCQkJICAgIGNsZWFyX3R5cGVfbGV2ZWwsCisJCQkJCQkJICAg IGRlZi0+bHBWdGJsLT5HZXRQaXhlbEdlb21ldHJ5KGRlZiksCisJCQkJCQkJICAgIFJFTkRF UklOR19NT0RFLAorCQkJCQkJCSAgICAmcmVuZGVyaW5nX3BhcmFtcyk7CisKKyAgUkVMRUFT RV9DT00gKGRlZik7CisKKyAgaWYgKEZBSUxFRCAoaHIpKQorICAgIHsKKyAgICAgIERlYlBy aW50ICgoIkRpcmVjdFdyaXRlIEhSRVNVTFQgZmFpbGVkOiAoJWQpIENyZWF0ZUN1c3RvbVJl bmRlcmluZ1BhcmFtc1xuIiwgaHIpKTsKKyAgICAgIFJFTEVBU0VfQ09NIChkd3JpdGVfZmFj dG9yeSk7CisgICAgICBSRUxFQVNFX0NPTSAoZHdyaXRlX2ZhY3RvcnkyKTsKKyAgICAgIFJF TEVBU0VfQ09NIChnZGlfaW50ZXJvcCk7CisgICAgICBGcmVlTGlicmFyeSAoZGlyZWN0X3dy aXRlKTsKKyAgICAgIGVhc3NlcnQgKFNVQ0NFRURFRCAoaHIpKTsKKyAgICAgIHJldHVybjsK KyAgICB9CisKKyAgZGlyZWN0X3dyaXRlX2F2YWlsYWJsZSA9IHRydWU7CisKKyAgdzMyX2lu aGliaXRfZHdyaXRlID0gZmFsc2U7Cit9CisKK2Jvb2wKK3czMl9kd3JpdGVfZHJhdyAoSERD IGhkYywgaW50IHgsIGludCB5LCB1bnNpZ25lZCAqZ2x5cGhzLCBpbnQgbGVuLAorCQkgQ09M T1JSRUYgY29sb3IsIHN0cnVjdCBmb250ICpmb250KQoreworICBIUkVTVUxUIGhyOworICBJ RFdyaXRlRm9udEZhY2UgKmR3cml0ZV9mb250X2ZhY2U7CisKKyAgc3RydWN0IHVuaXNjcmli ZV9mb250X2luZm8gKnVuaXNjcmliZV9mb250ID0KKyAgICAoc3RydWN0IHVuaXNjcmliZV9m b250X2luZm8gKikgZm9udDsKKworICAvKiBXaGF0IHdlIGdldCBhcyB5IGlzIHRoZSBiYXNl bGluZSBwb3NpdGlvbi4gICovCisgIHkgLT0gZm9udC0+YXNjZW50OworCisgIGZsb2F0IGZv bnRfc2l6ZSA9IGdldF9mb250X2ZhY2UgKGZvbnQsICZkd3JpdGVfZm9udF9mYWNlKTsKKyAg aWYgKGR3cml0ZV9mb250X2ZhY2UgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAg c3RydWN0IGZvbnRfbWV0cmljcyBtZXRyaWNzOworICBpZiAoIXRleHRfZXh0ZW50c19pbnRl cm5hbCAoZHdyaXRlX2ZvbnRfZmFjZSwgZm9udF9zaXplLCBnbHlwaHMsIGxlbiwKKwkJCSAg ICAgICZtZXRyaWNzKSkKKyAgICB7CisgICAgICB1bmlzY3JpYmVfZm9udC0+ZHdyaXRlX3Nr aXBfZm9udCA9IHRydWU7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGludCBi aXRtYXBfd2lkdGggPSBtZXRyaWNzLndpZHRoICsgbWV0cmljcy5yYmVhcmluZzsKKyAgaW50 IGJpdG1hcF9oZWlnaHQgPSBmb250LT5hc2NlbnQgKyBmb250LT5kZXNjZW50OworCisgIC8q IFdlIG5ldmVyIHJlbGVhc2UgdGhpcywgZ2V0X2JpdG1hcF9yZW5kZXJfdGFyZ2V0IHJldXNl cyBpdC4gICovCisgIElEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQgKmJpdG1hcF9yZW5kZXJf dGFyZ2V0ID0KKyAgICBnZXRfYml0bWFwX3JlbmRlcl90YXJnZXQgKGhkYywgYml0bWFwX3dp ZHRoLCBiaXRtYXBfaGVpZ2h0KTsKKworICAvKiBJZiB0aGlzIGZhaWxzLCBjb21wbGV0ZWx5 IGRpc2FibGUgRGlyZWN0V3JpdGUuICAqLworICBpZiAoYml0bWFwX3JlbmRlcl90YXJnZXQg PT0gTlVMTCkKKyAgICB7CisgICAgICBkaXJlY3Rfd3JpdGVfYXZhaWxhYmxlID0gZmFsc2U7 CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIFRoaXMgREMgY2FuJ3QgYmUg cmVsZWFzZWQuICAqLworICBIREMgdGV4dF9kYyA9IGJpdG1hcF9yZW5kZXJfdGFyZ2V0LT5s cFZ0YmwtPkdldE1lbW9yeURDCisgICAgKGJpdG1hcF9yZW5kZXJfdGFyZ2V0KTsKKworICAv KiBDb3B5IHRoZSBiYWNrZ3JvdW5kIHBpeGVsIHRvIHRoZSByZW5kZXIgdGFyZ2V0IGJpdG1h cC4gICovCisgIEJpdEJsdCAodGV4dF9kYywgMCwgMCwgYml0bWFwX3dpZHRoLCBiaXRtYXBf aGVpZ2h0LCBoZGMsIHgsIHksIFNSQ0NPUFkpOworCisgIFVJTlQxNiAqaW5kaWNlcyA9IGFs bG9jYSAobGVuICogc2l6ZW9mIChVSU5UMTYpKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8 IGxlbjsgaSsrKQorICAgIGluZGljZXNbaV0gPSBnbHlwaHNbaV07CisKKyAgRkxPQVQgKmFk dmFuY2VzID0gYWxsb2NhIChsZW4gKiBzaXplb2YgKEZMT0FUKSk7CisKKyAgZm9yIChpbnQg aSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICB7CisgICAgICBpZiAoIXRleHRfZXh0ZW50c19p bnRlcm5hbCAoZHdyaXRlX2ZvbnRfZmFjZSwgZm9udF9zaXplLCBnbHlwaHMgKyBpLCAxLAor CQkJCSAmbWV0cmljcykpCisJeworCSAgdW5pc2NyaWJlX2ZvbnQtPmR3cml0ZV9za2lwX2Zv bnQgPSB0cnVlOworCSAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIGFkdmFuY2VzW2ldID0g bWV0cmljcy53aWR0aDsKKyAgICB9CisKKyAgRFdSSVRFX0dMWVBIX1JVTiBnbHlwaF9ydW47 CisgIGdseXBoX3J1bi5mb250RmFjZSA9IGR3cml0ZV9mb250X2ZhY2U7CisgIGdseXBoX3J1 bi5mb250RW1TaXplID0gZm9udF9zaXplOworICBnbHlwaF9ydW4uZ2x5cGhJbmRpY2VzID0g aW5kaWNlczsKKyAgZ2x5cGhfcnVuLmdseXBoQ291bnQgPSBsZW47CisgIGdseXBoX3J1bi5p c1NpZGV3YXlzID0gZmFsc2U7CisgIGdseXBoX3J1bi5iaWRpTGV2ZWwgPSAwOworICBnbHlw aF9ydW4uZ2x5cGhPZmZzZXRzID0gTlVMTDsKKyAgZ2x5cGhfcnVuLmdseXBoQWR2YW5jZXMg PSBhZHZhbmNlczsKKworICBJRFdyaXRlQ29sb3JHbHlwaFJ1bkVudW1lcmF0b3IgKmxheWVy czsKKyAgLyogVGhpcyBjYWxsIHdpbGwgdGVsbCB1cyBpZiB3ZSBoYWNlIHRvIGhhbmRsZSBh bnkgY29sb3IgZ2x5cGguICAqLworICBociA9IGR3cml0ZV9mYWN0b3J5Mi0+bHBWdGJsLT5U cmFuc2xhdGVDb2xvckdseXBoUnVuIChkd3JpdGVfZmFjdG9yeTIsCisJCQkJCQkJMCwgZm9u dC0+YXNjZW50LAorCQkJCQkJCSZnbHlwaF9ydW4sCisJCQkJCQkJTlVMTCwKKwkJCQkJCQlN RUFTVVJJTkdfTU9ERSwKKwkJCQkJCQlOVUxMLAorCQkJCQkJCTAsCisJCQkJCQkJJmxheWVy cyk7CisKKyAgLyogTm8gY29sb3IuICBKdXN0IGRyYXcgdGhlIEdseXBoUnVuLiAgKi8KKyAg aWYgKGhyID09IERXUklURV9FX05PQ09MT1IpCisgICAgICBiaXRtYXBfcmVuZGVyX3Rhcmdl dC0+bHBWdGJsLT5EcmF3R2x5cGhSdW4gKGJpdG1hcF9yZW5kZXJfdGFyZ2V0LAorCQkJCQkJ ICAwLCBmb250LT5hc2NlbnQsCisJCQkJCQkgIE1FQVNVUklOR19NT0RFLAorCQkJCQkJICAm Z2x5cGhfcnVuLAorCQkJCQkJICByZW5kZXJpbmdfcGFyYW1zLAorCQkJCQkJICBjb2xvciwK KwkJCQkJCSAgTlVMTCk7CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBJZiB0aGVyZSB3ZXJl IGNvbG9yIGdseXBocywgbGF5ZXJzIGNvbnRhaW5zIGEgbGlzdCBvZiBHbHlwaFJ1bgorCSB3 aXRoIGEgY29sb3IgYW5kIGEgcG9zaXRpb24gZm9yIGVhY2guICBXZSBkcmF3IHRoZW0KKwkg aW5kaXZpZHVhbGx5LiAgKi8KKyAgICAgIGlmICghdmVyaWZ5X2hyIChociwgIkZhaWxlZCBh dCBUcmFuc2xhdGVDb2xvckdseXBoUnVuIikpCisJeworCSAgdW5pc2NyaWJlX2ZvbnQtPmR3 cml0ZV9za2lwX2ZvbnQgPSB0cnVlOworCSAgUkVMRUFTRV9DT00gKGxheWVycyk7CisJICBy ZXR1cm4gZmFsc2U7CisJfQorICAgICAgZm9yICg7OykgeworCUhSRVNVTFQgaHI7CisJQk9P TCBtb3JlX2xheWVyczsKKwljb25zdCBEV1JJVEVfQ09MT1JfR0xZUEhfUlVOICpsYXllcjsK KworCWhyID0gbGF5ZXJzLT5scFZ0YmwtPk1vdmVOZXh0IChsYXllcnMsICZtb3JlX2xheWVy cyk7CisJaWYgKCF2ZXJpZnlfaHIgKGhyLCAiRmFpbGVkIGF0IE1vdmVOZXh0IikpCisJICB7 CisJICAgIHVuaXNjcmliZV9mb250LT5kd3JpdGVfc2tpcF9mb250ID0gdHJ1ZTsKKwkgICAg UkVMRUFTRV9DT00gKGxheWVycyk7CisJICAgIHJldHVybiBmYWxzZTsKKwkgIH0KKwlpZiAo IW1vcmVfbGF5ZXJzKQorCSAgYnJlYWs7CisJaHIgPSBsYXllcnMtPmxwVnRibC0+R2V0Q3Vy cmVudFJ1biAobGF5ZXJzLCAmbGF5ZXIpOworCWlmICghdmVyaWZ5X2hyIChociwgIkZhaWxl ZCBhdCBHZXRDdXJyZW50UnVuIikpCisJICB7CisJICAgIHVuaXNjcmliZV9mb250LT5kd3Jp dGVfc2tpcF9mb250ID0gdHJ1ZTsKKwkgICAgUkVMRUFTRV9DT00gKGxheWVycyk7CisJICAg IHJldHVybiBmYWxzZTsKKwkgIH0KKwlociA9IGJpdG1hcF9yZW5kZXJfdGFyZ2V0LT5scFZ0 YmwtPkRyYXdHbHlwaFJ1bgorCSAgKGJpdG1hcF9yZW5kZXJfdGFyZ2V0LAorCSAgIGxheWVy LT5iYXNlbGluZU9yaWdpblgsCisJICAgbGF5ZXItPmJhc2VsaW5lT3JpZ2luWSwKKwkgICBN RUFTVVJJTkdfTU9ERSwKKwkgICAmbGF5ZXItPmdseXBoUnVuLAorCSAgIHJlbmRlcmluZ19w YXJhbXMsCisJICAgUkdCIChsYXllci0+cnVuQ29sb3IuciAqIDI1NSwKKwkJbGF5ZXItPnJ1 bkNvbG9yLmcgKiAyNTUsCisJCWxheWVyLT5ydW5Db2xvci5iICogMjU1KSwKKwkgICBOVUxM KTsKKwlpZiAoIXZlcmlmeV9ociAoaHIsICJGYWlsZWQgYXQgR2V0Q3VycmVudFJ1biIpKQor CSAgeworCSAgICB1bmlzY3JpYmVfZm9udC0+ZHdyaXRlX3NraXBfZm9udCA9IHRydWU7CisJ ICAgIFJFTEVBU0VfQ09NIChsYXllcnMpOworCSAgICByZXR1cm4gZmFsc2U7CisJICB9Cisg ICAgICB9CisgICAgICBSRUxFQVNFX0NPTSAobGF5ZXJzKTsKKyAgICB9CisKKyAgLyogRmlu YWxseSwgY29weSB0aGUgcmVuZGVyZWQgdGV4dCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBEQy4g ICovCisgIEJpdEJsdCAoaGRjLCB4LCB5LCBiaXRtYXBfd2lkdGgsIGJpdG1hcF9oZWlnaHQs IHRleHRfZGMsIDAsIDAsIFNSQ0NPUFkpOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBS ZXR1cm5zIHRydWUgaWYgRGlyZWN0V3JpdGUgaXMgdG8gYmUgdXNlZDoKKyAgIC0gSXQgaXMg YXZhaWxhYmxlLgorICAgLSBUaGUgZm9udCBpcyBoYW5kbGVkIGJ5IEhhcmZCdXp6LgorICAg LSB3MzItaW5oaWJpdC1kd3JpdGUgaXMgZmFsc2UuCisgICAtIFRoZSBmb250IGhhcyBub3Qg YmVlbiBtYXJrZWQgYWZ0ZXIgYSBmYWlsZWQgRGlyZWN0V3JpdGUgb3BlcmF0aW9uLgorICov Citib29sCit3MzJfdXNlX2RpcmVjdF93cml0ZSAoc3RydWN0IHczMmZvbnRfaW5mbyAqdzMy Zm9udCkKK3sKKyNpZmRlZiBIQVZFX0hBUkZCVVpaCisgIHJldHVybiBkaXJlY3Rfd3JpdGVf YXZhaWxhYmxlCisgICAgJiYgdzMyZm9udC0+Zm9udC5kcml2ZXIgPT0gJmhhcmZidXp6X2Zv bnRfZHJpdmVyCisgICAgJiYgIXczMl9pbmhpYml0X2R3cml0ZQorICAgICYmICEoKHN0cnVj dCB1bmlzY3JpYmVfZm9udF9pbmZvICopIHczMmZvbnQpLT5kd3JpdGVfc2tpcF9mb250Owor I2Vsc2UKKyAgcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9zcmMvdzMy Zm9udC5jIGIvc3JjL3czMmZvbnQuYwppbmRleCBlZmI0MmQ4MDMzNi4uMDVlNWEwNjdmMjAg MTAwNjQ0Ci0tLSBhL3NyYy93MzJmb250LmMKKysrIGIvc3JjL3czMmZvbnQuYwpAQCAtNDUy LDYgKzQ1MiwxMCBAQCB3MzJmb250X3RleHRfZXh0ZW50cyAoc3RydWN0IGZvbnQgKmZvbnQs IGNvbnN0IHVuc2lnbmVkICpjb2RlLAogCiAgIG1lbXNldCAobWV0cmljcywgMCwgc2l6ZW9m IChzdHJ1Y3QgZm9udF9tZXRyaWNzKSk7CiAKKyAgaWYgKHczMl91c2VfZGlyZWN0X3dyaXRl ICh3MzJfZm9udCkpCisgICAgICBpZiAodzMyX2R3cml0ZV90ZXh0X2V4dGVudHMgKGZvbnQs IGNvZGUsIG5nbHlwaHMsIG1ldHJpY3MpKQorCXJldHVybjsKKwogICBmb3IgKGkgPSAwLCBm aXJzdCA9IHRydWU7IGkgPCBuZ2x5cGhzOyBpKyspCiAgICAgewogICAgICAgc3RydWN0IHcz Ml9tZXRyaWNfY2FjaGUgKmNoYXJfbWV0cmljOwpAQCAtNzA2LDIyICs3MTAsMzEgQEAgdzMy Zm9udF9kcmF3IChzdHJ1Y3QgZ2x5cGhfc3RyaW5nICpzLCBpbnQgZnJvbSwgaW50IHRvLAog ICAgICAgaW50IGk7CiAKICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQl7Ci0J ICBXQ0hBUiBjID0gcy0+Y2hhcjJiW2Zyb20gKyBpXSAmIDB4RkZGRjsKLQkgIEV4dFRleHRP dXRXIChzLT5oZGMsIHggKyBpLCB5LCBvcHRpb25zLCBOVUxMLCAmYywgMSwgTlVMTCk7Ci0J fQorCWlmICghdzMyX3VzZV9kaXJlY3Rfd3JpdGUgKHczMmZvbnQpIHx8CisJICAgICF3MzJf ZHdyaXRlX2RyYXcgKHMtPmhkYywgeCwgeSwgcy0+Y2hhcjJiICsgZnJvbSwgMSwKKwkJCSAg ICAgIEdldFRleHRDb2xvcihzLT5oZGMpLCBzLT5mb250KSkKKwkgIHsKKwkgICAgV0NIQVIg YyA9IHMtPmNoYXIyYltmcm9tICsgaV0gJiAweEZGRkY7CisJICAgIEV4dFRleHRPdXRXIChz LT5oZGMsIHggKyBpLCB5LCBvcHRpb25zLCBOVUxMLCAmYywgMSwgTlVMTCk7CisJICB9CiAg ICAgfQogICBlbHNlCiAgICAgewotICAgICAgLyogVGhlIG51bWJlciBvZiBnbHlwaHMgaW4g YSBnbHlwaF9zdHJpbmcgY2Fubm90IGJlIGxhcmdlciB0aGFuCi0JIHRoZSBtYXhpbXVtIHZh bHVlIG9mIHRoZSAndXNlZCcgbWVtYmVyIG9mIGEgZ2x5cGhfcm93LCBzbyB3ZQotCSBhcmUg T0sgdXNpbmcgYWxsb2NhIGhlcmUuICAqLwotICAgICAgZWFzc2VydCAobGVuIDw9IFNIUlRf TUFYKTsKLSAgICAgIFdDSEFSICpjaGFycyA9IGFsbG9jYSAobGVuICogc2l6ZW9mIChXQ0hB UikpOwotICAgICAgaW50IGo7Ci0gICAgICBmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspCi0J Y2hhcnNbal0gPSBzLT5jaGFyMmJbZnJvbSArIGpdICYgMHhGRkZGOwotICAgICAgRXh0VGV4 dE91dFcgKHMtPmhkYywgeCwgeSwgb3B0aW9ucywgTlVMTCwgY2hhcnMsIGxlbiwgTlVMTCk7 CisgICAgICBpZiAoIXczMl91c2VfZGlyZWN0X3dyaXRlICh3MzJmb250KSB8fAorCSAgIXcz Ml9kd3JpdGVfZHJhdyAocy0+aGRjLCB4LCB5LAorCQkJICAgIHMtPmNoYXIyYiArIGZyb20s IGxlbiwgR2V0VGV4dENvbG9yKHMtPmhkYyksCisJCQkgICAgcy0+Zm9udCkpCisJeworCSAg LyogVGhlIG51bWJlciBvZiBnbHlwaHMgaW4gYSBnbHlwaF9zdHJpbmcgY2Fubm90IGJlIGxh cmdlciB0aGFuCisJICAgICB0aGUgbWF4aW11bSB2YWx1ZSBvZiB0aGUgJ3VzZWQnIG1lbWJl ciBvZiBhIGdseXBoX3Jvdywgc28gd2UKKwkgICAgIGFyZSBPSyB1c2luZyBhbGxvY2EgaGVy ZS4gICovCisJICBlYXNzZXJ0IChsZW4gPD0gU0hSVF9NQVgpOworCSAgV0NIQVIgKmNoYXJz ID0gYWxsb2NhIChsZW4gKiBzaXplb2YgKFdDSEFSKSk7CisJICBpbnQgajsKKwkgIGZvciAo aiA9IDA7IGogPCBsZW47IGorKykKKwkgICAgY2hhcnNbal0gPSBzLT5jaGFyMmJbZnJvbSAr IGpdICYgMHhGRkZGOworCSAgRXh0VGV4dE91dFcgKHMtPmhkYywgeCwgeSwgb3B0aW9ucywg TlVMTCwgY2hhcnMsIGxlbiwgTlVMTCk7CisJfQogICAgIH0KIAogICAvKiBSZXN0b3JlIGNs aXAgcmVnaW9uLiAgKi8KZGlmZiAtLWdpdCBhL3NyYy93MzJmb250LmggYi9zcmMvdzMyZm9u dC5oCmluZGV4IDNmNzgwYzFkODY2Li42OGQyODE1NjEyNSAxMDA2NDQKLS0tIGEvc3JjL3cz MmZvbnQuaAorKysgYi9zcmMvdzMyZm9udC5oCkBAIC01Nyw2ICs1NywyNiBAQCAjZGVmaW5l IFczMk1FVFJJQ19GQUlMIDIKICAgSEZPTlQgaGZvbnQ7CiB9OwogCisvKiBFeHRlbnNpb24g b2YgdzMyZm9udF9pbmZvIHVzZWQgYnkgVW5pc2NyaWJlIGFuZCBIYXJmQnV6eiBiYWNrZW5k cy4gICovCitzdHJ1Y3QgdW5pc2NyaWJlX2ZvbnRfaW5mbworeworICBzdHJ1Y3QgdzMyZm9u dF9pbmZvIHczMl9mb250OworICAvKiBUaGlzIGlzIHVzZWQgYnkgdGhlIFVuaXNjcmliZSBi YWNrZW5kIGFzIGEgcG9pbnRlciB0byB0aGUgc2NyaXB0CisgICAgIGNhY2hlLCBhbmQgYnkg dGhlIEhhcmZCdXp6IGJhY2tlbmQgYXMgYSBwb2ludGVyIHRvIGEgaGJfZm9udF90CisgICAg IG9iamVjdC4gICovCisgIHZvaWQgKmNhY2hlOworICAvKiBUaGlzIGlzIHVzZWQgYnkgdGhl IEhhcmZCdXp6IGJhY2tlbmQgdG8gc3RvcmUgdGhlIGZvbnQgc2NhbGUuICAqLworICBkb3Vi bGUgc2NhbGU7CisgIC8qIFRoaXMgaXMgdXNlZCBieSBEaXJlY3RXcml0ZSB0byBzdG9yZSB0 aGUgRm9udEZhY2Ugb2JqZWN0LgorICAgICBEaXJlY3RXcml0ZSB3b3JrcyBvbiB0b3Agb2Yg dGhlIEhhcmZCdXp6IGJhY2tlbmQsIG1vZGlmeWluZyBzb21lCisgICAgIGNhbGxzLiAgSWYg dGhlcmUgYXJlIHByb2JsZW1zIG1hbmlwdWxhdGluZyB0aGlzIGZvbnQsCisgICAgIGR3cml0 ZV9za2lwX2ZvbnQgaXMgc2V0IHRvIHRydWUuICBGdXR1cmUgb3BlcmF0aW9ucyB3aWxsIG5v dCB1c2UKKyAgICAgRGlyZWN0V3JpdGUgYW5kIGZhbGwgYmFjayB0byB0aGUgSGFyZkJ1enog YmFja2VuZC4gICovCisgIHZvaWQgKmR3cml0ZV9jYWNoZTsKKyAgZmxvYXQgZHdyaXRlX2Zv bnRfc2l6ZTsKKyAgYm9vbCBkd3JpdGVfc2tpcF9mb250OworfTsKKwogLyogTWFjcm9zIGZv ciBnZXR0aW5nIE9TIHNwZWNpZmljIGluZm9ybWF0aW9uIGZyb20gYSBmb250IHN0cnVjdC4g ICovCiAjZGVmaW5lIEZPTlRfSEFORExFKGYpICgoKHN0cnVjdCB3MzJmb250X2luZm8gKiko ZikpLT5oZm9udCkKICNkZWZpbmUgRk9OVF9URVhUTUVUUklDKGYpICgoKHN0cnVjdCB3MzJm b250X2luZm8gKikoZikpLT5tZXRyaWNzKQpAQCAtODQsNiArMTA0LDE2IEBAICNkZWZpbmUg Q0FDSEVfQkxPQ0tTSVpFIDEyOAogCiBMaXNwX09iamVjdCBpbnRlcm5fZm9udF9uYW1lIChj aGFyICopOwogCisvKiBGdW5jdGlvbiBwcm90b3R5cGVzIGZvciBEaXJlY3RXcml0ZS4gICov Cit2b2lkIHczMl9pbml0aWFsaXplX2RpcmVjdF93cml0ZSAodm9pZCk7Citib29sIHczMl91 c2VfZGlyZWN0X3dyaXRlIChzdHJ1Y3QgdzMyZm9udF9pbmZvICp3MzJmb250KTsKK2Jvb2wg dzMyX2R3cml0ZV9kcmF3IChIREMgaGRjLCBpbnQgeCwgaW50IHksIHVuc2lnbmVkICpnbHlw aHMsIGludCBsZW4sCisJCSAgICAgIENPTE9SUkVGIGNvbG9yLCBzdHJ1Y3QgZm9udCAqZm9u dCApOworYm9vbCB3MzJfZHdyaXRlX3RleHRfZXh0ZW50cyAoc3RydWN0IGZvbnQgKmZvbnQs IGNvbnN0IHVuc2lnbmVkICpjb2RlLAorCQkJICAgICAgaW50IG5nbHlwaHMsIHN0cnVjdCBm b250X21ldHJpY3MgKm1ldHJpY3MpOwordW5zaWduZWQgdzMyX2R3cml0ZV9lbmNvZGVfY2hh ciAoc3RydWN0IGZvbnQgKmZvbnQsIGludCBjKTsKK3ZvaWQgdzMyX2R3cml0ZV9mcmVlX2Nh Y2hlZF9mYWNlKHZvaWQgKmNhY2hlKTsKKwogZXh0ZXJuIHZvaWQgZ2xvYmFsc19vZl93MzJm b250ICh2b2lkKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdzMydW5pc2NyaWJlLmMg Yi9zcmMvdzMydW5pc2NyaWJlLmMKaW5kZXggYjc3YmY1NmI4Y2YuLjk4ZTA3MmNlMmJlIDEw MDY0NAotLS0gYS9zcmMvdzMydW5pc2NyaWJlLmMKKysrIGIvc3JjL3czMnVuaXNjcmliZS5j CkBAIC00NCwxOCArNDQsNiBAQCAjZGVmaW5lIF9XSU4zMl9XSU5OVCAweDA2MDAKICNpbmNs dWRlICJwZHVtcGVyLmgiCiAjaW5jbHVkZSAidzMyY29tbW9uLmgiCiAKLS8qIEV4dGVuc2lv biBvZiB3MzJmb250X2luZm8gdXNlZCBieSBVbmlzY3JpYmUgYW5kIEhhcmZCdXp6IGJhY2tl bmRzLiAgKi8KLXN0cnVjdCB1bmlzY3JpYmVfZm9udF9pbmZvCi17Ci0gIHN0cnVjdCB3MzJm b250X2luZm8gdzMyX2ZvbnQ7Ci0gIC8qIFRoaXMgaXMgdXNlZCBieSB0aGUgVW5pc2NyaWJl IGJhY2tlbmQgYXMgYSBwb2ludGVyIHRvIHRoZSBzY3JpcHQKLSAgICAgY2FjaGUsIGFuZCBi eSB0aGUgSGFyZkJ1enogYmFja2VuZCBhcyBhIHBvaW50ZXIgdG8gYSBoYl9mb250X3QKLSAg ICAgb2JqZWN0LiAgKi8KLSAgdm9pZCAqY2FjaGU7Ci0gIC8qIFRoaXMgaXMgdXNlZCBieSB0 aGUgSGFyZkJ1enogYmFja2VuZCB0byBzdG9yZSB0aGUgZm9udCBzY2FsZS4gICovCi0gIGRv dWJsZSBzY2FsZTsKLX07Ci0KIGludCB1bmlzY3JpYmVfYXZhaWxhYmxlID0gMDsKIAogLyog RW51bUZvbnRGYW1pbGllc0V4IGNhbGxiYWNrLiAgKi8KQEAgLTIwMCw2ICsxODgsOSBAQCB1 bmlzY3JpYmVfb3BlbiAoc3RydWN0IGZyYW1lICpmLCBMaXNwX09iamVjdCBmb250X2VudGl0 eSwgaW50IHBpeGVsX3NpemUpCiAKICAgLyogSW5pdGlhbGl6ZSB0aGUgY2FjaGUgZm9yIHRo aXMgZm9udC4gICovCiAgIHVuaXNjcmliZV9mb250LT5jYWNoZSA9IE5VTEw7CisgIHVuaXNj cmliZV9mb250LT5kd3JpdGVfY2FjaGUgPSBOVUxMOworCisgIHVuaXNjcmliZV9mb250LT5k d3JpdGVfc2tpcF9mb250ID0gZmFsc2U7CiAKICAgLyogVW5pc2NyaWJlIGFuZCBIYXJmQnV6 eiBiYWNrZW5kcyB1c2UgZ2x5cGggaW5kaWNlcy4gICovCiAgIHVuaXNjcmliZV9mb250LT53 MzJfZm9udC5nbHlwaF9pZHggPSBFVE9fR0xZUEhfSU5ERVg7CkBAIC0yMjEsNiArMjEyLDcg QEAgdW5pc2NyaWJlX2Nsb3NlIChzdHJ1Y3QgZm9udCAqZm9udCkKICAgICA9IChzdHJ1Y3Qg dW5pc2NyaWJlX2ZvbnRfaW5mbyAqKSBmb250OwogCiAjaWZkZWYgSEFWRV9IQVJGQlVaWgor ICB3MzJfZHdyaXRlX2ZyZWVfY2FjaGVkX2ZhY2UgKHVuaXNjcmliZV9mb250LT5kd3JpdGVf Y2FjaGUpOwogICBpZiAodW5pc2NyaWJlX2ZvbnQtPnczMl9mb250LmZvbnQuZHJpdmVyID09 ICZoYXJmYnV6el9mb250X2RyaXZlcgogICAgICAgJiYgdW5pc2NyaWJlX2ZvbnQtPmNhY2hl KQogICAgIGhiX2ZvbnRfZGVzdHJveSAoKGhiX2ZvbnRfdCAqKSB1bmlzY3JpYmVfZm9udC0+ Y2FjaGUpOwpAQCAtMTM3Miw2ICsxMzY0LDE3IEBAIHczMmhiX2VuY29kZV9jaGFyIChzdHJ1 Y3QgZm9udCAqZm9udCwgaW50IGMpCiAgIHN0cnVjdCB1bmlzY3JpYmVfZm9udF9pbmZvICp1 bmlzY3JpYmVfZm9udAogICAgID0gKHN0cnVjdCB1bmlzY3JpYmVfZm9udF9pbmZvICopIGZv bnQ7CiAgIGVhc3NlcnQgKHVuaXNjcmliZV9mb250LT53MzJfZm9udC5mb250LmRyaXZlciA9 PSAmaGFyZmJ1enpfZm9udF9kcml2ZXIpOworCisgIGlmICh3MzJfdXNlX2RpcmVjdF93cml0 ZSAoJnVuaXNjcmliZV9mb250LT53MzJfZm9udCkpCisgICAgeworICAgICAgdW5zaWduZWQg ZW5jb2RlZCA9IHczMl9kd3JpdGVfZW5jb2RlX2NoYXIgKGZvbnQsIGMpOworCisgICAgICAv KiBUaGUgY2FsbCB0byB3MzJfZHdyaXRlX2VuY29kZV9jaGFyIG1heSBmYWlsLCBkaXNhYmxp bmcKKwkgRGlyZWN0V3JpdGUgZm9yIHRoaXMgZm9udC4gIFNvIGNoZWNrIGFnYWluLiAgKi8K KyAgICAgIGlmICh3MzJfdXNlX2RpcmVjdF93cml0ZSAoJnVuaXNjcmliZV9mb250LT53MzJf Zm9udCkpCisJcmV0dXJuIGVuY29kZWQ7CisgICAgfQorCiAgIGhiX2ZvbnRfdCAqaGJfZm9u dCA9IHVuaXNjcmliZV9mb250LT5jYWNoZTsKIAogICAvKiBGaXJzdCB0aW1lIHdlIHVzZSB0 aGlzIGZvbnQgd2l0aCBIYXJmQnV6eiwgY3JlYXRlIHRoZSBoYl9mb250X3QKQEAgLTE1MTAs NiArMTUxMyw5IEBAIHczMmhiX2dldF92YXJpYXRpb25fZ2x5cGhzIChzdHJ1Y3QgZm9udCAq Zm9udCwgaW50IGMsIHVuc2lnbmVkIHZhcmlhdGlvbnNbMjU2XSkKIHZvaWQKIHN5bXNfb2Zf dzMydW5pc2NyaWJlICh2b2lkKQogeworICBERUZWQVJfQk9PTCAoInczMi1pbmhpYml0LWR3 cml0ZSIsIHczMl9pbmhpYml0X2R3cml0ZSwKKwkgICAgICAgZG9jOiAvKiBJZiB0LCBkb24n dCB1c2UgRGlyZWN0V3JpdGUuICAqLyk7CisKICAgcGR1bXBlcl9kb19ub3dfYW5kX2FmdGVy X2xvYWQgKHN5bXNfb2ZfdzMydW5pc2NyaWJlX2Zvcl9wZHVtcGVyKTsKIH0KIApAQCAtMTYy NCw1ICsxNjMwLDggQEAgc3ltc19vZl93MzJ1bmlzY3JpYmVfZm9yX3BkdW1wZXIgKHZvaWQp CiAgIGhhcmZidXp6X2ZvbnRfZHJpdmVyLmNvbWJpbmluZ19jYXBhYmlsaXR5ID0gaGJmb250 X2NvbWJpbmluZ19jYXBhYmlsaXR5OwogICBoYXJmYnV6el9mb250X2RyaXZlci5iZWdpbl9o Yl9mb250ID0gdzMyaGJfYmVnaW5fZm9udDsKICAgcmVnaXN0ZXJfZm9udF9kcml2ZXIgKCZo YXJmYnV6el9mb250X2RyaXZlciwgTlVMTCk7CisKKyAgdzMyX2luaXRpYWxpemVfZGlyZWN0 X3dyaXRlICgpOworCiAjZW5kaWYJLyogSEFWRV9IQVJGQlVaWiAqLwogfQotLSAKMi4zNS4x LndpbmRvd3MuMgoK --------------5qUMQzuuu1UJMC8v0A9VT00k-- From debbugs-submit-bounces@debbugs.gnu.org Wed Oct 23 06:03:46 2024 Received: (at 73730) by debbugs.gnu.org; 23 Oct 2024 10:03:46 +0000 Received: from localhost ([127.0.0.1]:58664 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t3YDS-0003Fa-4F for submit@debbugs.gnu.org; Wed, 23 Oct 2024 06:03:46 -0400 Received: from eggs.gnu.org ([209.51.188.92]:45028) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t3YDQ-0003FG-CA for 73730@debbugs.gnu.org; Wed, 23 Oct 2024 06:03:45 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1t3YCq-0007NY-9y; Wed, 23 Oct 2024 06:03:09 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=oNcC9FEvf+O/aYru1XFf8KsHNqnRB55pRBXHaeSQxow=; b=QKezcS1WhtAb SewplSjk9LA/jAlChnq/LnOIC8eElu5XcZamKQhgyObRranfaUx7J/JmBbZtSiGbtLb2TBlbIAUAN ArnAU8HXZ6aXlJxZnmUnZ79MGa2gZerBoXyDW9ByCUwwFavNWQexyMxPOuPA7cxC7PC6CRAaLao6K EXfpzY5UUxcH5DGU0i/yFs4ev1yLRE/dionQbQ9M/EA/IVAe7JfsQCdz5bz97sHXcmbFPQqVgI1Ng bUbLBm8oJ6yLBQ2F7XOYPlvPH1qFxj0RDSvKpC+5kd4rT4U7RVzdtYjjpVZzXHn+r26MSTD3/mGI5 LezLC8rdU4hpKTmCplOR5A==; Date: Wed, 23 Oct 2024 13:03:02 +0300 Message-Id: <86plnrdtm1.fsf@gnu.org> From: Eli Zaretskii To: Cecilio Pardo In-Reply-To: <8e5ffc88-dda8-4b4d-a133-f80029825347@imayhem.com> (message from Cecilio Pardo on Wed, 23 Oct 2024 00:14:12 +0200) Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> <86bjzjp7vv.fsf@gnu.org> <80dc50bd-b2d4-4d21-ad38-322412588b3b@imayhem.com> <86o73ej2u7.fsf@gnu.org> <8e5ffc88-dda8-4b4d-a133-f80029825347@imayhem.com> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org, kbrown@cornell.edu X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > Date: Wed, 23 Oct 2024 00:14:12 +0200 > Cc: 73730@debbugs.gnu.org, kbrown@cornell.edu > From: Cecilio Pardo > > Here is a new version with pending issues addressed. Thanks. > - DirectWrite is available since Windows 7, but color glyphs are > available only since Windows 8.1. We only enable DirectWrite since > Windows 8.1. This is stated on the NEWS entry. Sounds okay, but I don't see the Windows version tested anywhere in the code which initializes DWrite. What did I miss? > - The default value for the Gamma render parameter in DirectWrite > gives very 'light' characters. I changed it to 1.4, which matches > GDI and looks better. But that's just my opinion. Does the best value depend on whether the theme is light or dark? In any case, this sounds like a good candidate for a variable that people could modify if they want. Maybe we should also expose to Lisp the values of enhanced contrast and clear-type level? Assuming that setting these from .emacs (or maybe in early-init?) at all could take effect, that is. > I couldn't find any hebrew font with color glyphs to test RTL > display. I found a latin+arabic one, Cairo Play: > > https://github.com/Gue3bara/Cairo > https://fonts.google.com/specimen/Cairo+Play > > It displays diacritics in different colors on both scripts. > > It seems to work fine in emacs. I attach captures with and without > DirectWrite, and compared to Courier New. Looks okay to me, thanks. > +** Emacs on MS-Windows now supports color fonts. > +On Windows 8.1 and later versions Emacs now uses DirectWrite to draw > +text, which supports color fonts. This can be disabled by setting the > +variable w32-inhibit-dwrite to t. Names of variables and functions in NEWS should be quoted 'like this'. > + /* We can get fonts with a size of 0. GDI handles this by using a default > + size. We do the same. */ > + if (font_size <= 0.0f) > + font_size = FRAME_LINE_HEIGHT (XFRAME (selected_frame)); ^^^^^^^^^^^^^^ Maybe use SLECTED_FRAME() here. > + if (!verify_hr (hr, "Failed to CreateBitmapRenderTarget")) > + return NULL; ^^^^^^^^^^^^^^^ The indentation here is incorrect: should be 2 columns, not 4. > + direct_write_available = true; > + > + w32_inhibit_dwrite = false; Does it work to set w32-inhibit-dwrite in the .emacs init file? > + UINT16 *indices = alloca (len * sizeof (UINT16)); > + > + for (int i = 0; i < len; i++) > + indices[i] = glyphs[i]; > + > + FLOAT *advances = alloca (len * sizeof (FLOAT)); How large can 'len' be? Maybe we should use USE_SAFE_ALLOCA and friends here, to avoid the possibility of overflowing the C stack if alloca is called with a too-large argument? > + for (;;) { That's not how we format for-loops: the brace should be on the next line. Thanks again for working on this. From debbugs-submit-bounces@debbugs.gnu.org Wed Oct 23 10:17:41 2024 Received: (at submit) by debbugs.gnu.org; 23 Oct 2024 14:17:41 +0000 Received: from localhost ([127.0.0.1]:60341 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t3cBB-0006X7-EU for submit@debbugs.gnu.org; Wed, 23 Oct 2024 10:17:41 -0400 Received: from lists.gnu.org ([209.51.188.17]:44474) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t3cB9-0006X0-Ll for submit@debbugs.gnu.org; Wed, 23 Oct 2024 10:17:40 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1t3cAf-0001hr-MP for bug-gnu-emacs@gnu.org; Wed, 23 Oct 2024 10:17:09 -0400 Received: from mail.imayhem.com ([82.223.54.191] helo=zealous-pike.82-223-54-191.plesk.page) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1t3cAd-0003Ac-Ci for bug-gnu-emacs@gnu.org; Wed, 23 Oct 2024 10:17:09 -0400 Received: from [192.168.68.104] (111.red-88-21-7.staticip.rima-tde.net [88.21.7.111]) by zealous-pike.82-223-54-191.plesk.page (Postfix) with ESMTPSA id 631C5800FA for ; Wed, 23 Oct 2024 14:17:04 +0000 (UTC) Authentication-Results: zealous-pike.82-223-54-191.plesk.page; spf=pass (sender IP is 88.21.7.111) smtp.mailfrom=cpardo@imayhem.com smtp.helo=[192.168.68.104] Received-SPF: pass (zealous-pike.82-223-54-191.plesk.page: connection is authenticated) Message-ID: Date: Wed, 23 Oct 2024 16:17:03 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows To: bug-gnu-emacs@gnu.org References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> <86bjzjp7vv.fsf@gnu.org> <80dc50bd-b2d4-4d21-ad38-322412588b3b@imayhem.com> <86o73ej2u7.fsf@gnu.org> <8e5ffc88-dda8-4b4d-a133-f80029825347@imayhem.com> <86plnrdtm1.fsf@gnu.org> Content-Language: es-ES From: Cecilio Pardo In-Reply-To: <86plnrdtm1.fsf@gnu.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Received-SPF: pass client-ip=82.223.54.191; envelope-from=cpardo@imayhem.com; helo=zealous-pike.82-223-54-191.plesk.page X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Score: -1.3 (-) X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.3 (--) On 23/10/2024 12:03, Eli Zaretskii wrote: >> - DirectWrite is available since Windows 7, but color glyphs are >> available only since Windows 8.1. We only enable DirectWrite since >> Windows 8.1. This is stated on the NEWS entry. > > Sounds okay, but I don't see the Windows version tested anywhere in > the code which initializes DWrite. What did I miss? The IDWriteFactory2 interface is only available from 8.1, so it will fail on previous versions when we request it in w32_initialize_direct_write. >> - The default value for the Gamma render parameter in DirectWrite >> gives very 'light' characters. I changed it to 1.4, which matches >> GDI and looks better. But that's just my opinion. > > Does the best value depend on whether the theme is light or dark? No, it looks too dim for me on both. > In any case, this sounds like a good candidate for a variable that people > could modify if they want. Maybe we should also expose to Lisp the > values of enhanced contrast and clear-type level? Assuming that > setting these from .emacs (or maybe in early-init?) at all could take > effect, that is. [...] > Does it work to set w32-inhibit-dwrite in the .emacs init file? If you change it in .emacs or early-int it will work, but will not prevent dwrite initialization and some text output. I am initializing on syms_of_w32uniscribe_for_pdumper. Could I initialize on some other place, so that the user can skip dwrite completely? Also, it will allow to add configuracion variables for Gamma, etc, without having to reinit if the user sets them. From debbugs-submit-bounces@debbugs.gnu.org Wed Oct 23 13:53:53 2024 Received: (at 73730) by debbugs.gnu.org; 23 Oct 2024 17:53:53 +0000 Received: from localhost ([127.0.0.1]:60720 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t3fYO-0007yW-QV for submit@debbugs.gnu.org; Wed, 23 Oct 2024 13:53:53 -0400 Received: from eggs.gnu.org ([209.51.188.92]:48450) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t3fYM-0007yG-AI for 73730@debbugs.gnu.org; Wed, 23 Oct 2024 13:53:51 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1t3fXm-0002lQ-FR; Wed, 23 Oct 2024 13:53:14 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=2MADPPgSPjjsmA6yfcUR1S/GyG08Be0PYgjpYAcTByM=; b=JO7+zBe/SpZg wqC7XWSrwXV4IXLicGLVGG3cuCD0I1oy29o2CYu+eB4Dfa2H9ANbODqlUD259AywgDI9Dh/WyMt7L CywFG0XnTIqUA+DC+B1Kk0/Y0fhjMiFctnbBFZ5bzVKV2qmqnJHUjJRY4YHS58EOlygKpK26QMVML eQfZO//Q0pOtpARED0jfodUIpOhrnygQ4WL55dPzJZWr6vHSf9NwzlmlxYTO1pAPVJTR9iSv6ZUr0 ltxO2c6GCO1dHxsxj/55brw7jLtu1LIRMdgwsHUOVJsQabRdDUhP4fL6aw4qStFtuARnsjsBfyfZL 5e8CjaUKCuKPvjGneALanQ==; Date: Wed, 23 Oct 2024 20:53:12 +0300 Message-Id: <86bjzaemev.fsf@gnu.org> From: Eli Zaretskii To: Cecilio Pardo In-Reply-To: (message from Cecilio Pardo on Wed, 23 Oct 2024 16:17:03 +0200) Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> <86bjzjp7vv.fsf@gnu.org> <80dc50bd-b2d4-4d21-ad38-322412588b3b@imayhem.com> <86o73ej2u7.fsf@gnu.org> <8e5ffc88-dda8-4b4d-a133-f80029825347@imayhem.com> <86plnrdtm1.fsf@gnu.org> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > Date: Wed, 23 Oct 2024 16:17:03 +0200 > From: Cecilio Pardo > > > On 23/10/2024 12:03, Eli Zaretskii wrote: > > >> - DirectWrite is available since Windows 7, but color glyphs are > >> available only since Windows 8.1. We only enable DirectWrite since > >> Windows 8.1. This is stated on the NEWS entry. > > > > Sounds okay, but I don't see the Windows version tested anywhere in > > the code which initializes DWrite. What did I miss? > > The IDWriteFactory2 interface is only available from 8.1, so it will > fail on previous versions when we request it in > w32_initialize_direct_write. OK, so please add a comment there to this effect. > >> - The default value for the Gamma render parameter in DirectWrite > >> gives very 'light' characters. I changed it to 1.4, which matches > >> GDI and looks better. But that's just my opinion. > > > > Does the best value depend on whether the theme is light or dark? > > No, it looks too dim for me on both. > > > In any case, this sounds like a good candidate for a variable that people > > could modify if they want. Maybe we should also expose to Lisp the > > values of enhanced contrast and clear-type level? Assuming that > > setting these from .emacs (or maybe in early-init?) at all could take > > effect, that is. > > [...] > > > Does it work to set w32-inhibit-dwrite in the .emacs init file? > > If you change it in .emacs or early-int it will work, but will not > prevent dwrite initialization and some text output. I am > initializing on syms_of_w32uniscribe_for_pdumper. Could I initialize > on some other place, so that the user can skip dwrite completely? > Also, it will allow to add configuracion variables for Gamma, etc, > without having to reinit if the user sets them. Initializing dwrite even though the user said we shouldn't use it doesn't sound too bad to me. We could provide a function to reinitialize (if it's needed) and document that it should be called if the user wants to disable dwrite in the init file. I wouldn't go farther than this unless we get complaints and discover that initializing dwrite could cause trouble in some configurations. From debbugs-submit-bounces@debbugs.gnu.org Thu Oct 24 16:19:52 2024 Received: (at submit) by debbugs.gnu.org; 24 Oct 2024 20:19:52 +0000 Received: from localhost ([127.0.0.1]:36286 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t44JC-0006Zh-6X for submit@debbugs.gnu.org; Thu, 24 Oct 2024 16:19:52 -0400 Received: from lists.gnu.org ([209.51.188.17]:36754) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t44J8-0006ZX-EJ for submit@debbugs.gnu.org; Thu, 24 Oct 2024 16:19:49 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1t44Id-0003Jv-1I for bug-gnu-emacs@gnu.org; Thu, 24 Oct 2024 16:19:15 -0400 Received: from mail.imayhem.com ([82.223.54.191] helo=zealous-pike.82-223-54-191.plesk.page) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1t44IY-0004LL-9N for bug-gnu-emacs@gnu.org; Thu, 24 Oct 2024 16:19:14 -0400 Received: from [192.168.68.104] (111.red-88-21-7.staticip.rima-tde.net [88.21.7.111]) by zealous-pike.82-223-54-191.plesk.page (Postfix) with ESMTPSA id 17524800F9 for ; Thu, 24 Oct 2024 20:19:07 +0000 (UTC) Authentication-Results: zealous-pike.82-223-54-191.plesk.page; spf=pass (sender IP is 88.21.7.111) smtp.mailfrom=cpardo@imayhem.com smtp.helo=[192.168.68.104] Received-SPF: pass (zealous-pike.82-223-54-191.plesk.page: connection is authenticated) Content-Type: multipart/mixed; boundary="------------MZuVgMQPS9O6Wp40XzaMLlNu" Message-ID: <68b9d35b-b8e1-4830-8ad9-8c33258e0980@imayhem.com> Date: Thu, 24 Oct 2024 22:19:06 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows To: bug-gnu-emacs@gnu.org References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> <86bjzjp7vv.fsf@gnu.org> <80dc50bd-b2d4-4d21-ad38-322412588b3b@imayhem.com> <86o73ej2u7.fsf@gnu.org> <8e5ffc88-dda8-4b4d-a133-f80029825347@imayhem.com> <86plnrdtm1.fsf@gnu.org> <86bjzaemev.fsf@gnu.org> Content-Language: es-ES From: Cecilio Pardo In-Reply-To: <86bjzaemev.fsf@gnu.org> Received-SPF: pass client-ip=82.223.54.191; envelope-from=cpardo@imayhem.com; helo=zealous-pike.82-223-54-191.plesk.page X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Score: -1.3 (-) X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.3 (--) This is a multi-part message in MIME format. --------------MZuVgMQPS9O6Wp40XzaMLlNu Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit New version attached. - Added comments - Use SAFE_ALLOCA instead of alloca. - Added two lisp functions: w32-dwrite-available to find out is dwrite is working w32-dwrite-reinit to reinitialize dwrite, optionally changing render parameters (gamma, cleartype level, contrast). Can go back to defaults passing nil. - Updated NEWS and changelog. --------------MZuVgMQPS9O6Wp40XzaMLlNu Content-Type: text/plain; charset=UTF-8; name="0001-Implement-drawing-text-with-DirectWrite-on-MS-Window.patch" Content-Disposition: attachment; filename*0="0001-Implement-drawing-text-with-DirectWrite-on-MS-Window.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSBhOTJiNDAxY2E4NzI5YzNlODJlMzk5ZDQ3ZTRmMmQ3MWNkYWNhMjY2IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBDZWNpbGlvIFBhcmRvIDxjcGFyZG9AaW1heWhlbS5j b20+CkRhdGU6IFdlZCwgOSBPY3QgMjAyNCAxMTo0MDoyOCArMDIwMApTdWJqZWN0OiBbUEFU Q0hdIEltcGxlbWVudCBkcmF3aW5nIHRleHQgd2l0aCBEaXJlY3RXcml0ZSBvbiBNUy1XaW5k b3dzLgoKVGhpcyBhZGRzIHN1cHBvcnQgZm9yIGNvbG9yIGZvbnRzLgoKKiBjb25maWd1cmUu YWM6IEFkZCBzcmMvdzMyZHJpdGUgdG8gVzMyX09CSi4KKiBzcmMvdzMyZHdyaXRlLmM6IFRo aXMgaXMgYSBuZXcgZmlsZS4KKHczMi1pbml0aWFsaXplLWRpcmVjdC13cml0ZSk6IE5ldyBm dW5jdGlvbiwgaW5pdGlhbGl6ZSB0aGUgRGlyZWN0V3JpdGUKbGlicmFyeSBpZiBpdCBpcyBh dmFpbGFibGUsIGFuZCByZXF1aXJlZCBnbG9iYWwgdmFyaWFibGVzLgoodzMyX3VzZV9kaXJl Y3Rfd3JpdGUpOiBOZXcgZnVuY3Rpb24sIGNoZWNrIGlmIERpcmVjdFdyaXRlIGlzIGF2YWls YWJsZQphbmQgYWN0aXZhdGVkIGJ5IHRoZSB1c2VyLgoodzMyX2R3cml0ZV9lbmNvZGVfY2hh cik6IE5ldyBmdW5jdGlvbiwgcmVwbGFjZW1lbnQgZm9yIEhhcmZCdXp6J3MKZW5jb2RlX2No YXIuCih3MzJfZHdyaXRlX3RleHRfZXh0ZW50cyk6IE5ldyBmdW5jdGlvbiwgcmVwbGFjZW1l bnQgZm9yIHczMmZvbnQKdGV4dF9leHRlbnRzLgoodzMyX2R3cml0ZV9kcmF3KTogTmV3IGZ1 bmN0aW9uLCByZXBsYWNlbWVudCBmb3IgdzMyZm9udCBkcmF3LgoodzMyX2R3cml0ZV9mcmVl X2NhY2hlZF9mYWNlKTogTmV3IGZ1bmN0aW9uLCB1c2VkIG9uIHRoZSBmb250IGRlbGV0aW9u CnByb2Nlc3MgdG8gYWxzbyBkZWxldGUgRGlyZWN0V3JpdGUgZGF0YS4KKHZlcmlmeV9ocik6 IE5ldyBmdW5jdGlvbiwgdmVyaWZ5IENPTSBtZXRob2QgcmVzdWx0cy4KKHJlbGVhc2VfY29t KTogTmV3IGZ1bmN0aW9uLCByZWxlYXNlIGEgQ09NIG9iamVjdC4KKHczMi1kd3JpdGUtYXZh aWxhYmxlKTogTmV3IGZ1bmN0aW9uLCByZXR1cm5zIHRydWUgaWYgRGlyZWN0V3JpdGUgaXMK YXZhaWxhYmxlLgoodzMyLWR3cml0ZS1yZWluaXQpOiBOZXcgZnVuY3Rpb24sIHJlaW5pdGlh bGl6ZSBEaXJlY3RXcml0ZSwgb3B0aW9uYWxseQpzZXR0aW5nIHNvbWUgcmVuZGVyaW5nIHBh cmFtZXRlcnMuCiogc3JjL3czMmZvbnQuYyAodzMyZm9udF90ZXh0X2V4dGVudHMpOiBJZiBE aXJlY3RXcml0ZSBpcyBlbmFibGVkLCBjYWxsCnczMl9kd3JpdGVfdGV4dF9leHRlbnRzLgoo dzMyZm9udF9kcmF3KTogSWYgRGlyZWN0V3JpdGUgaXMgZW5hYmxlZCwgY2FsbCB3MzJfZHdy aXRlX2RyYXcuCiogc3JjL3czMnVuaXNjcmliZS5jOiAodzMyaGJfZW5jb2RlX2NoYXIpOiBJ ZiBEaXJlY3RXcml0ZSBpcyBlbmFibGVkLApjYWxsIHczMl9kd3JpdGVfZW5jb2RlX2NoYXIu CihzeW1zX29mX3czMnVuaXNjcmliZV9mb3JfcGR1bXBlcik6IEluaXRpYWxpemUgRGlyZWN0 V3JpdGUuCih1bmlzY3JpYmVfY2xvc2UpOiBGcmVlIERpcmVjdFdyaXRlIGRhdGEgZm9yIHRo ZSBmb250LgotLS0KIGNvbmZpZ3VyZS5hYyAgICAgICB8ICAgIDIgKy0KIGV0Yy9ORVdTICAg ICAgICAgICB8ICAgIDggKwogc3JjL3czMmR3cml0ZS5jICAgIHwgMTA5OSArKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogc3JjL3czMmZvbnQuYyAgICAg IHwgICAzOSArLQogc3JjL3czMmZvbnQuaCAgICAgIHwgICAzMSArKwogc3JjL3czMnVuaXNj cmliZS5jIHwgICAzMSArLQogNiBmaWxlcyBjaGFuZ2VkLCAxMTg0IGluc2VydGlvbnMoKyks IDI2IGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy93MzJkd3JpdGUuYwoK ZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5hYyBiL2NvbmZpZ3VyZS5hYwppbmRleCA5NDdjMjgy N2I4ZS4uMWM3NTQ1ZWY5ODQgMTAwNjQ0Ci0tLSBhL2NvbmZpZ3VyZS5hYworKysgYi9jb25m aWd1cmUuYWMKQEAgLTMxNzIsNyArMzE3Miw3IEBAIEFDX0RFRlVOCiAgIEFDX0NIRUNLX1RP T0woW1dJTkRSRVNdLCBbd2luZHJlc10sCiAgICAgICAgICAgICAgICAgW0FDX01TR19FUlJP UihbTm8gcmVzb3VyY2UgY29tcGlsZXIgZm91bmQuXSldKQogICBXMzJfT0JKPSJ3MzJmbnMu byB3MzJtZW51Lm8gdzMycmVnLm8gdzMyZm9udC5vIHczMnRlcm0ubyIKLSAgVzMyX09CSj0i JFczMl9PQkogdzMyeGZucy5vIHczMnNlbGVjdC5vIHczMnVuaXNjcmliZS5vIHczMmN5Z3dp bngubyIKKyAgVzMyX09CSj0iJFczMl9PQkogdzMyeGZucy5vIHczMnNlbGVjdC5vIHczMnVu aXNjcmliZS5vIHczMmR3cml0ZS5vIHczMmN5Z3dpbngubyIKICAgRU1BQ1NSRVM9ImVtYWNz LnJlcyIKICAgY2FzZSAiJGNhbm9uaWNhbCIgaW4KICAgICB4ODZfNjQtKi0qKSBFTUFDU19N QU5JRkVTVD0iZW1hY3MteDY0Lm1hbmlmZXN0IiA7OwpkaWZmIC0tZ2l0IGEvZXRjL05FV1Mg Yi9ldGMvTkVXUwppbmRleCBhNGEwMzZjYmI1MC4uNDIwYzkwNmJhYTkgMTAwNjQ0Ci0tLSBh L2V0Yy9ORVdTCisrKyBiL2V0Yy9ORVdTCkBAIC03ODMsNiArNzgzLDE0IEBAIGFuZCBsYXRl ciB2ZXJzaW9ucy4KICoqIEVtYWNzIG9uIE1TLVdpbmRvd3Mgbm93IHN1cHBvcnRzIGRyYWct bi1kcm9wIG9mIHRleHQgaW50byBhIGJ1ZmZlci4KIFRoaXMgaXMgaW4gYWRkaXRpb24gdG8g ZHJhZy1uLWRyb3Agb2YgZmlsZXMsIHRoYXQgd2FzIGFscmVhZHkgc3VwcG9ydGVkLgogCist LS0KKyoqIEVtYWNzIG9uIE1TLVdpbmRvd3Mgbm93IHN1cHBvcnRzIGNvbG9yIGZvbnRzLgor T24gV2luZG93cyA4LjEgYW5kIGxhdGVyIHZlcnNpb25zIEVtYWNzIG5vdyB1c2VzIERpcmVj dFdyaXRlIHRvIGRyYXcKK3RleHQsIHdoaWNoIHN1cHBvcnRzIGNvbG9yIGZvbnRzLiAgVGhp cyBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGUKK3ZhcmlhYmxlICd3MzItaW5oaWJp dC1kd3JpdGUnIHRvIHQuICBBbHNvIHNlZSAndzMyLWR3cml0ZS1hdmFpbGFibGUnIGFuZAor J3czMi1kd3JpdGUtcmVpbml0JyB0byBjaGVjayBhdmFpbGFiaWxpdHkgYW5kIHRvIGNvbmZp Z3VyZSByZW5kZXIKK3BhcmFtZXRlcnMuCisKIAwKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFRoaXMg ZmlsZSBpcyBwYXJ0IG9mIEdOVSBFbWFjcy4KZGlmZiAtLWdpdCBhL3NyYy93MzJkd3JpdGUu YyBiL3NyYy93MzJkd3JpdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw MDAwMC4uOWY3YjhkOTY5NzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdzMyZHdyaXRlLmMK QEAgLTAsMCArMSwxMDk5IEBACisvKiBTdXBwb3J0IGZvciB1c2luZyBEaXJlY3RXcml0ZSBv biBNUy1XaW5kb3dzIHRvIGRyYXcgdGV4dC4gIFRoaXMKKyAgIGFsbG93cyBmb3IgY29sb3Ig Zm9udHMuCisgICBDb3B5cmlnaHQgKEMpIDIwMjQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u LCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBFbWFjcy4KKworR05VIEVtYWNz IGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2Rp ZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRo ZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKK3lvdXIgb3B0aW9uKSBhbnkg bGF0ZXIgdmVyc2lvbi4KKworR05VIEVtYWNzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9y IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVy YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZl IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fs b25nIHdpdGggR05VIEVtYWNzLiAgSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcv bGljZW5zZXMvPi4gICovCisKKy8qIFRoaXMgcmVxdWlyZXMgdGhlIEhhcmZCdXp6IGZvbnQg YmFja2VuZCB0byBiZSBhdmFpbGFibGUuCisKKyAgIEl0IHdvcmtzIGJ5IG1vZGlmeWluZyB0 aGUgSGFyZkJ1enogYmFja2VuZCB0byB1c2UgRGlyZWN0V3JpdGUgYXQKKyAgIHNvbWUgcG9p bnRzLCBpZiBpdCBpcyBhdmFpbGFibGU6CisKKyAgIC0gV2hlbiBlbmNvZGluZyBjaGFyYWN0 ZXJzOiB3MzJoYl9lbmNvZGVfY2hhcgorICAgLSBXaGVuIG1lYXN1cmluZyB0ZXh0OiB3MzJm b250X3RleHRfZXh0ZW50cworICAgLSBXaGVuIGRyYXdpbmcgdGV4dDogdzMyZm9udF9kcmF3 CisKKyAgIERpcmVjdFdyaXRlIGlzIHNldHVwIGJ5IGNhbGxpbmcgdzMyX2luaXRpYWxpemVf ZGlyZWN0X3dyaXRlLiAgRnJvbQorICAgdGhhdCBwb2ludCwgdGhlIGZ1bmN0aW9uIHczMl91 c2VfZGlyZWN0X3dyaXRlIHdpbGwgcmV0dXJuIHRydWUgaWYKKyAgIERpcmVjdFdyaXRlIGlz IHRvIGJlIHVzZWQuCisKKyAgIERpcmVjdFdyaXRlIGlzIGF2YWlsYWJsZSBzaW5jZSBXaW5k b3dzIDcsIGJ1dCB3ZSBkb24ndCBhY3RpdmF0ZSBpdCBvbgorICAgdmVyc2lvbnMgYmVmb3Jl IDguMSwgYmVjYXVzZSBjb2xvciBmb250cyBhcmUgb25seSBhdmFpbGFibGUgc2luY2UgdGhh dC4gICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5j bHVkZSA8d2luZG93cy5oPgorCisjaWZuZGVmIE1JTkdXX1c2NAorIyBkZWZpbmUgSU5JVEdV SUQKKyNlbmRpZgorI2luY2x1ZGUgPGluaXRndWlkLmg+CisjaW5jbHVkZSA8b2xlMi5oPgor I2luY2x1ZGUgPHVua253bi5oPgorCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJ3 MzJmb250LmgiCisjaW5jbHVkZSAidzMyY29tbW9uLmgiCisjaW5jbHVkZSAidzMydGVybS5o IgorCisjaWZuZGVmIE1JTkdXX1c2NAorCisvKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25z IHdvdWxkIGJlIGluY2x1ZGVkIGZyb20gZHdyaXRlXzMuaCwgYnV0IGl0CisgICBpcyBub3Qg YXZhaWxhYmxlIHdoZW4gYnVpbGRpbmcgd2l0aCBtaW5ndy5vcmcncyBNaW5HVy4gIE1ldGhv ZHMgdGhhdAorICAgd2UgZG9uJ3QgdXNlIGFyZSBkZWNsYXJlZCB3aXRoIHRoZSBFTUFDU19E V1JJVEVfVU5VU0VEIG1hY3JvLCB0bworICAgYXZvaWQgYnJpbmdpbmcgaW4gbW9yZSB0eXBl cyB0aGF0IHdvdWxkIG5lZWQgdG8gYmUgZGVjbGFyZWQuICAqLworCisjZGVmaW5lIEVNQUNT X0RXUklURV9VTlVTRUQobmFtZSkgdm9pZCAoU1RETUVUSE9EQ0FMTFRZUEUgKm5hbWUpKHZv aWQpCisKKyNkZWZpbmUgRFdSSVRFX0VfTk9DT0xPUiBfSFJFU1VMVF9UWVBFREVGXygweDg4 OTg1MDBDTCkKKwordHlwZWRlZiBlbnVtIERXUklURV9QSVhFTF9HRU9NRVRSWSB7CisgIERX UklURV9QSVhFTF9HRU9NRVRSWV9GTEFUID0gMCwKKyAgRFdSSVRFX1BJWEVMX0dFT01FVFJZ X1JHQiA9IDEsCisgIERXUklURV9QSVhFTF9HRU9NRVRSWV9CR1IgPSAyCit9IERXUklURV9Q SVhFTF9HRU9NRVRSWTsKKwordHlwZWRlZiBlbnVtIERXUklURV9SRU5ERVJJTkdfTU9ERSB7 CisgIERXUklURV9SRU5ERVJJTkdfTU9ERV9ERUZBVUxUID0gMCwKKyAgRFdSSVRFX1JFTkRF UklOR19NT0RFX0FMSUFTRUQgPSAxLAorICBEV1JJVEVfUkVOREVSSU5HX01PREVfR0RJX0NM QVNTSUMgPSAyLAorICBEV1JJVEVfUkVOREVSSU5HX01PREVfR0RJX05BVFVSQUwgPSAzLAor ICBEV1JJVEVfUkVOREVSSU5HX01PREVfTkFUVVJBTCA9IDQsCisgIERXUklURV9SRU5ERVJJ TkdfTU9ERV9OQVRVUkFMX1NZTU1FVFJJQyA9IDUsCisgIERXUklURV9SRU5ERVJJTkdfTU9E RV9PVVRMSU5FID0gNgorfSBEV1JJVEVfUkVOREVSSU5HX01PREU7CisKK3R5cGVkZWYgZW51 bSBEV1JJVEVfTUVBU1VSSU5HX01PREUgeworICBEV1JJVEVfTUVBU1VSSU5HX01PREVfTkFU VVJBTCA9IDAsCisgIERXUklURV9NRUFTVVJJTkdfTU9ERV9HRElfQ0xBU1NJQyA9IDEsCisg IERXUklURV9NRUFTVVJJTkdfTU9ERV9HRElfTkFUVVJBTCA9IDIKK30gRFdSSVRFX01FQVNV UklOR19NT0RFOworCit0eXBlZGVmIGVudW0gRFdSSVRFX1RFWFRfQU5USUFMSUFTX01PREUg eworICBEV1JJVEVfVEVYVF9BTlRJQUxJQVNfTU9ERV9DTEVBUlRZUEUgPSAwLAorICBEV1JJ VEVfVEVYVF9BTlRJQUxJQVNfTU9ERV9HUkFZU0NBTEUgPSAxCit9IERXUklURV9URVhUX0FO VElBTElBU19NT0RFOworCit0eXBlZGVmIGVudW0gRFdSSVRFX0ZBQ1RPUllfVFlQRSB7Cisg IERXUklURV9GQUNUT1JZX1RZUEVfU0hBUkVEID0gMCwKKyAgRFdSSVRFX0ZBQ1RPUllfVFlQ RV9JU09MQVRFRCA9IDEKK30gRFdSSVRFX0ZBQ1RPUllfVFlQRTsKKwordHlwZWRlZiBzdHJ1 Y3QgRFdSSVRFX0ZPTlRfTUVUUklDUyB7CisgIFVJTlQxNiBkZXNpZ25Vbml0c1BlckVtOwor ICBVSU5UMTYgYXNjZW50OworICBVSU5UMTYgZGVzY2VudDsKKyAgSU5UMTYgbGluZUdhcDsK KyAgVUlOVDE2IGNhcEhlaWdodDsKKyAgVUlOVDE2IHhIZWlnaHQ7CisgIElOVDE2IHVuZGVy bGluZVBvc2l0aW9uOworICBVSU5UMTYgdW5kZXJsaW5lVGhpY2tuZXNzOworICBJTlQxNiBz dHJpa2V0aHJvdWdoUG9zaXRpb247CisgIFVJTlQxNiBzdHJpa2V0aHJvdWdoVGhpY2tuZXNz OworfSBEV1JJVEVfRk9OVF9NRVRSSUNTOworCit0eXBlZGVmIHN0cnVjdCBEV1JJVEVfR0xZ UEhfTUVUUklDUyB7CisgIElOVDMyIGxlZnRTaWRlQmVhcmluZzsKKyAgVUlOVDMyIGFkdmFu Y2VXaWR0aDsKKyAgSU5UMzIgcmlnaHRTaWRlQmVhcmluZzsKKyAgSU5UMzIgdG9wU2lkZUJl YXJpbmc7CisgIFVJTlQzMiBhZHZhbmNlSGVpZ2h0OworICBJTlQzMiBib3R0b21TaWRlQmVh cmluZzsKKyAgSU5UMzIgdmVydGljYWxPcmlnaW5ZOworfSBEV1JJVEVfR0xZUEhfTUVUUklD UzsKKwordHlwZWRlZiBpbnRlcmZhY2UgSURXcml0ZVJlbmRlcmluZ1BhcmFtcyBJRFdyaXRl UmVuZGVyaW5nUGFyYW1zOwordHlwZWRlZiBpbnRlcmZhY2UgSURXcml0ZUZvbnQgSURXcml0 ZUZvbnQ7Cit0eXBlZGVmIGludGVyZmFjZSBJRFdyaXRlR2RpSW50ZXJvcCBJRFdyaXRlR2Rp SW50ZXJvcDsKK3R5cGVkZWYgaW50ZXJmYWNlIElEV3JpdGVGYWN0b3J5IElEV3JpdGVGYWN0 b3J5OwordHlwZWRlZiBpbnRlcmZhY2UgSURXcml0ZUZhY3RvcnkyIElEV3JpdGVGYWN0b3J5 MjsKK3R5cGVkZWYgaW50ZXJmYWNlIElEV3JpdGVGb250RmFjZSBJRFdyaXRlRm9udEZhY2U7 Cit0eXBlZGVmIGludGVyZmFjZSBJRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0IElEV3JpdGVC aXRtYXBSZW5kZXJUYXJnZXQ7Cit0eXBlZGVmIGludGVyZmFjZSBJRFdyaXRlQml0bWFwUmVu ZGVyVGFyZ2V0MSBJRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0MTsKK3R5cGVkZWYgaW50ZXJm YWNlIElEV3JpdGVDb2xvckdseXBoUnVuRW51bWVyYXRvciBJRFdyaXRlQ29sb3JHbHlwaFJ1 bkVudW1lcmF0b3I7CisKK0RFRklORV9HVUlEKElJRF9JRFdyaXRlQml0bWFwUmVuZGVyVGFy Z2V0MSwgMHg3OTFlODI5OCwgMHgzZWYzLCAweDQyMzAsIDB4OTgsMHg4MCwgMHhjOSwweGJk LDB4ZWMsMHhjNCwweDIwLDB4NjQpOworREVGSU5FX0dVSUQoSUlEX0lEV3JpdGVGYWN0b3J5 MiwgMHgwNDM5ZmM2MCwgMHhjYTQ0LCAweDQ5OTQsIDB4OGQsMHhlZSwgMHgzYSwweDlhLDB4 ZjcsMHhiNywweDMyLDB4ZWMpOworREVGSU5FX0dVSUQoSUlEX0lEV3JpdGVGYWN0b3J5LCAw eGI4NTllZTVhLCAweGQ4MzgsIDB4NGI1YiwgMHhhMiwweGU4LCAweDFhLDB4ZGMsMHg3ZCww eDkzLDB4ZGIsMHg0OCk7CisKK3R5cGVkZWYgc3RydWN0IERXUklURV9HTFlQSF9PRkZTRVQg eworICBGTE9BVCBhZHZhbmNlT2Zmc2V0OworICBGTE9BVCBhc2NlbmRlck9mZnNldDsKK30g RFdSSVRFX0dMWVBIX09GRlNFVDsKKwordHlwZWRlZiBzdHJ1Y3QgRFdSSVRFX0dMWVBIX1JV TiB7CisgIElEV3JpdGVGb250RmFjZSAqZm9udEZhY2U7CisgIEZMT0FUIGZvbnRFbVNpemU7 CisgIFVJTlQzMiBnbHlwaENvdW50OworICBjb25zdCBVSU5UMTYgKmdseXBoSW5kaWNlczsK KyAgY29uc3QgRkxPQVQgKmdseXBoQWR2YW5jZXM7CisgIGNvbnN0IERXUklURV9HTFlQSF9P RkZTRVQgKmdseXBoT2Zmc2V0czsKKyAgV0lOQk9PTCBpc1NpZGV3YXlzOworICBVSU5UMzIg YmlkaUxldmVsOworfSAgRFdSSVRFX0dMWVBIX1JVTjsKKwordHlwZWRlZiBzdHJ1Y3QgX0Qz RENPTE9SVkFMVUUgeworICBmbG9hdCByOworICBmbG9hdCBnOworICBmbG9hdCBiOworICBm bG9hdCBhOworfSBEM0RDT0xPUlZBTFVFOworCit0eXBlZGVmIEQzRENPTE9SVkFMVUUgRFdS SVRFX0NPTE9SX0Y7CisKK3R5cGVkZWYgc3RydWN0IERXUklURV9DT0xPUl9HTFlQSF9SVU4g eworICBEV1JJVEVfR0xZUEhfUlVOIGdseXBoUnVuOworICB2b2lkICpnbHlwaFJ1bkRlc2Ny aXB0aW9uOworICBGTE9BVCBiYXNlbGluZU9yaWdpblg7CisgIEZMT0FUIGJhc2VsaW5lT3Jp Z2luWTsKKyAgRFdSSVRFX0NPTE9SX0YgcnVuQ29sb3I7CisgIFVJTlQxNiBwYWxldHRlSW5k ZXg7Cit9IERXUklURV9DT0xPUl9HTFlQSF9SVU47CisKK3R5cGVkZWYgc3RydWN0IElEV3Jp dGVGb250RmFjZVZ0YmwgeworICBCRUdJTl9JTlRFUkZBQ0UKKworICBIUkVTVUxUIChTVERN RVRIT0RDQUxMVFlQRSAqUXVlcnlJbnRlcmZhY2UpCisgICAgKElEV3JpdGVGb250RmFjZSAq VGhpcywgUkVGSUlEIHJpaWQsIHZvaWQgKipwcHZPYmplY3QpOworICBVTE9ORyAoU1RETUVU SE9EQ0FMTFRZUEUgKkFkZFJlZikoSURXcml0ZUZvbnRGYWNlICpUaGlzKTsKKyAgVUxPTkcg KFNURE1FVEhPRENBTExUWVBFICpSZWxlYXNlKShJRFdyaXRlRm9udEZhY2UgKlRoaXMpOwor CisgIEVNQUNTX0RXUklURV9VTlVTRUQoR2V0VHlwZSk7CisgIEVNQUNTX0RXUklURV9VTlVT RUQoR2V0RmlsZXMpOworICBFTUFDU19EV1JJVEVfVU5VU0VEKEdldEluZGV4KTsKKyAgRU1B Q1NfRFdSSVRFX1VOVVNFRChHZXRTaW11bGF0aW9ucyk7CisgIEVNQUNTX0RXUklURV9VTlVT RUQoSXNTeW1ib2xGb250KTsKKworICB2b2lkIChTVERNRVRIT0RDQUxMVFlQRSAqR2V0TWV0 cmljcykKKyAgICAoSURXcml0ZUZvbnRGYWNlICpUaGlzLCBEV1JJVEVfRk9OVF9NRVRSSUNT ICptZXRyaWNzKTsKKworICBFTUFDU19EV1JJVEVfVU5VU0VEIChHZXRHbHlwaENvdW50KTsK KyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoR2V0RGVzaWduR2x5cGhNZXRyaWNzKTsKKworICBI UkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAqR2V0R2x5cGhJbmRpY2VzKQorICAgIChJRFdy aXRlRm9udEZhY2UgKlRoaXMsIGNvbnN0IFVJTlQzMiAqY29kZXBvaW50cywgVUlOVDMyIGNv dW50LAorICAgICBVSU5UMTYgKmdseXBoX2luZGljZXMpOworCisgIEVNQUNTX0RXUklURV9V TlVTRUQgKFRyeUdldEZvbnRUYWJsZSk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKFJlbGVh c2VGb250VGFibGUpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChHZXRHbHlwaFJ1bk91dGxp bmUpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChHZXRSZWNvbW1lbmRlZFJlbmRlcmluZ01v ZGUpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChHZXRHZGlDb21wYXRpYmxlTWV0cmljcyk7 CisKKyAgSFJFU1VMVCAoU1RETUVUSE9EQ0FMTFRZUEUgKkdldEdkaUNvbXBhdGlibGVHbHlw aE1ldHJpY3MpCisgICAgKElEV3JpdGVGb250RmFjZSAqVGhpcywKKyAgICAgRkxPQVQgZW1T aXplLAorICAgICBGTE9BVCBwaXhlbHNfcGVyX2RpcCwKKyAgICAgdm9pZCAqdHJhbnNmb3Jt LAorICAgICBXSU5CT09MIHVzZV9nZGlfbmF0dXJhbCwKKyAgICAgY29uc3QgVUlOVDE2ICpn bHlwaF9pbmRpY2VzLAorICAgICBVSU5UMzIgZ2x5cGhfY291bnQsCisgICAgIERXUklURV9H TFlQSF9NRVRSSUNTICptZXRyaWNzLAorICAgICBXSU5CT09MIGlzX3NpZGV3YXlzKTsKKyAg RU5EX0lOVEVSRkFDRQorfSBJRFdyaXRlRm9udEZhY2VWdGJsOworCitpbnRlcmZhY2UgSURX cml0ZUZvbnRGYWNlIHsKKyAgICBDT05TVF9WVEJMIElEV3JpdGVGb250RmFjZVZ0YmwqIGxw VnRibDsKK307CisKK3R5cGVkZWYgc3RydWN0IElEV3JpdGVSZW5kZXJpbmdQYXJhbXNWdGJs IHsKKyAgQkVHSU5fSU5URVJGQUNFCisKKyAgSFJFU1VMVCAoU1RETUVUSE9EQ0FMTFRZUEUg KlF1ZXJ5SW50ZXJmYWNlKQorICAgIChJRFdyaXRlUmVuZGVyaW5nUGFyYW1zICpUaGlzLCBS RUZJSUQgcmlpZCwgdm9pZCAqKnBwdk9iamVjdCk7CisgIFVMT05HIChTVERNRVRIT0RDQUxM VFlQRSAqQWRkUmVmKShJRFdyaXRlUmVuZGVyaW5nUGFyYW1zICpUaGlzKTsKKyAgVUxPTkcg KFNURE1FVEhPRENBTExUWVBFICpSZWxlYXNlKShJRFdyaXRlUmVuZGVyaW5nUGFyYW1zICpU aGlzKTsKKworICBGTE9BVCAoU1RETUVUSE9EQ0FMTFRZUEUgKkdldEdhbW1hKQorICAgIChJ RFdyaXRlUmVuZGVyaW5nUGFyYW1zICpUaGlzKTsKKyAgRkxPQVQgKFNURE1FVEhPRENBTExU WVBFICpHZXRFbmhhbmNlZENvbnRyYXN0KQorICAgIChJRFdyaXRlUmVuZGVyaW5nUGFyYW1z ICpUaGlzKTsKKyAgRkxPQVQgKFNURE1FVEhPRENBTExUWVBFICpHZXRDbGVhclR5cGVMZXZl bCkKKyAgICAoSURXcml0ZVJlbmRlcmluZ1BhcmFtcyAqVGhpcyk7CisgIGludCAoU1RETUVU SE9EQ0FMTFRZUEUgKkdldFBpeGVsR2VvbWV0cnkpCisgICAgKElEV3JpdGVSZW5kZXJpbmdQ YXJhbXMgKlRoaXMpOworICBFTkRfSU5URVJGQUNFCit9IElEV3JpdGVSZW5kZXJpbmdQYXJh bXNWdGJsOworCitpbnRlcmZhY2UgSURXcml0ZVJlbmRlcmluZ1BhcmFtcyB7CisgICAgQ09O U1RfVlRCTCBJRFdyaXRlUmVuZGVyaW5nUGFyYW1zVnRibCogbHBWdGJsOworfTsKKwordHlw ZWRlZiBzdHJ1Y3QgSURXcml0ZUZvbnRWdGJsIHsKKyAgQkVHSU5fSU5URVJGQUNFCisKKyAg SFJFU1VMVCAoU1RETUVUSE9EQ0FMTFRZUEUgKlF1ZXJ5SW50ZXJmYWNlKQorICAgIChJRFdy aXRlRm9udCAqVGhpcywgUkVGSUlEIHJpaWQsIHZvaWQgKipwcHZPYmplY3QpOworICBVTE9O RyAoU1RETUVUSE9EQ0FMTFRZUEUgKkFkZFJlZikoSURXcml0ZUZvbnQgKlRoaXMpOworICBV TE9ORyAoU1RETUVUSE9EQ0FMTFRZUEUgKlJlbGVhc2UpKElEV3JpdGVGb250ICpUaGlzKTsK KworICBFTUFDU19EV1JJVEVfVU5VU0VEIChHZXRGb250RmFtaWx5KTsKKyAgRU1BQ1NfRFdS SVRFX1VOVVNFRCAoR2V0V2VpZ2h0KTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoR2V0U3Ry ZXRjaCk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKEdldFN0eWxlKTsKKyAgRU1BQ1NfRFdS SVRFX1VOVVNFRCAoSXNTeW1ib2xGb250KTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoR2V0 RmFjZU5hbWVzKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoR2V0SW5mb3JtYXRpb25hbFN0 cmluZ3MpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChHZXRTaW11bGF0aW9ucyk7CisKKyAg dm9pZCAoU1RETUVUSE9EQ0FMTFRZUEUgKkdldE1ldHJpY3MpCisgICAgKElEV3JpdGVGb250 ICpUaGlzLCBEV1JJVEVfRk9OVF9NRVRSSUNTICptZXRyaWNzKTsKKworICBFTUFDU19EV1JJ VEVfVU5VU0VEKEhhc0NoYXJhY3Rlcik7CisKKyAgSFJFU1VMVCAoU1RETUVUSE9EQ0FMTFRZ UEUgKkNyZWF0ZUZvbnRGYWNlKQorICAgIChJRFdyaXRlRm9udCAqVGhpcywgSURXcml0ZUZv bnRGYWNlICoqZmFjZSk7CisKKyAgRU5EX0lOVEVSRkFDRQorfSBJRFdyaXRlRm9udFZ0Ymw7 CisKK2ludGVyZmFjZSBJRFdyaXRlRm9udCB7CisgIENPTlNUX1ZUQkwgSURXcml0ZUZvbnRW dGJsKiBscFZ0Ymw7Cit9OworCit0eXBlZGVmIHN0cnVjdCBJRFdyaXRlQml0bWFwUmVuZGVy VGFyZ2V0VnRibCB7CisgIEJFR0lOX0lOVEVSRkFDRQorCisgIEhSRVNVTFQgKFNURE1FVEhP RENBTExUWVBFICpRdWVyeUludGVyZmFjZSkKKyAgICAoSURXcml0ZUJpdG1hcFJlbmRlclRh cmdldCAqVGhpcywgUkVGSUlEIHJpaWQsIHZvaWQgKipwcHZPYmplY3QpOworICBVTE9ORyAo U1RETUVUSE9EQ0FMTFRZUEUgKkFkZFJlZikoSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldCAq VGhpcyk7CisgIFVMT05HIChTVERNRVRIT0RDQUxMVFlQRSAqUmVsZWFzZSkoSURXcml0ZUJp dG1hcFJlbmRlclRhcmdldCAqVGhpcyk7CisKKyAgSFJFU1VMVCAoU1RETUVUSE9EQ0FMTFRZ UEUgKkRyYXdHbHlwaFJ1bikKKyAgICAoSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldCAqVGhp cywKKyAgICAgRkxPQVQgYmFzZWxpbmVPcmlnaW5YLAorICAgICBGTE9BVCBiYXNlbGluZU9y aWdpblksCisgICAgIERXUklURV9NRUFTVVJJTkdfTU9ERSBtZWFzdXJpbmdfbW9kZSwKKyAg ICAgY29uc3QgRFdSSVRFX0dMWVBIX1JVTiAqZ2x5cGhfcnVuLAorICAgICBJRFdyaXRlUmVu ZGVyaW5nUGFyYW1zICpwYXJhbXMsCisgICAgIENPTE9SUkVGIHRleHRDb2xvciwKKyAgICAg UkVDVCAqYmxhY2tib3hfcmVjdCk7CisKKyAgSERDIChTVERNRVRIT0RDQUxMVFlQRSAqR2V0 TWVtb3J5REMpKElEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQgKlRoaXMpOworCisgIEVNQUNT X0RXUklURV9VTlVTRUQgKEdldFBpeGVsc1BlckRpcCk7CisKKyAgSFJFU1VMVCAoU1RETUVU SE9EQ0FMTFRZUEUgKlNldFBpeGVsc1BlckRpcCkKKyAgICAoSURXcml0ZUJpdG1hcFJlbmRl clRhcmdldCAqVGhpcywgRkxPQVQgcGl4ZWxzX3Blcl9kaXApOworCisgIEVNQUNTX0RXUklU RV9VTlVTRUQgKEdldEN1cnJlbnRUcmFuc2Zvcm0pOworICBFTUFDU19EV1JJVEVfVU5VU0VE IChTZXRDdXJyZW50VHJhbnNmb3JtKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoR2V0U2l6 ZSk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKFJlc2l6ZSk7CisgIEVORF9JTlRFUkZBQ0UK K30gSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldFZ0Ymw7CisKK2ludGVyZmFjZSBJRFdyaXRl Qml0bWFwUmVuZGVyVGFyZ2V0IHsKKyAgQ09OU1RfVlRCTCBJRFdyaXRlQml0bWFwUmVuZGVy VGFyZ2V0VnRibCogbHBWdGJsOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgSURXcml0ZUJpdG1h cFJlbmRlclRhcmdldDFWdGJsIHsKKyAgQkVHSU5fSU5URVJGQUNFCisKKyAgSFJFU1VMVCAo U1RETUVUSE9EQ0FMTFRZUEUgKlF1ZXJ5SW50ZXJmYWNlKQorICAgIChJRFdyaXRlQml0bWFw UmVuZGVyVGFyZ2V0MSAqVGhpcywgUkVGSUlEIHJpaWQsIHZvaWQgKipwcHZPYmplY3QpOwor ICBVTE9ORyAoU1RETUVUSE9EQ0FMTFRZUEUgKkFkZFJlZikgKElEV3JpdGVCaXRtYXBSZW5k ZXJUYXJnZXQxICpUaGlzKTsKKyAgVUxPTkcgKFNURE1FVEhPRENBTExUWVBFICpSZWxlYXNl KSAoSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldDEgKlRoaXMpOworCisgIEVNQUNTX0RXUklU RV9VTlVTRUQgKERyYXdHbHlwaFJ1bik7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKEdldE1l bW9yeURDKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoR2V0UGl4ZWxzUGVyRGlwKTsKKyAg RU1BQ1NfRFdSSVRFX1VOVVNFRCAoU2V0UGl4ZWxzUGVyRGlwKTsKKyAgRU1BQ1NfRFdSSVRF X1VOVVNFRCAoR2V0Q3VycmVudFRyYW5zZm9ybSk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQg KFNldEN1cnJlbnRUcmFuc2Zvcm0pOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChHZXRTaXpl KTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoUmVzaXplKTsKKyAgRU1BQ1NfRFdSSVRFX1VO VVNFRCAoR2V0VGV4dEFudGlhbGlhc01vZGUpOworCisgIEhSRVNVTFQgKFNURE1FVEhPRENB TExUWVBFICpTZXRUZXh0QW50aWFsaWFzTW9kZSkKKyAgICAoSURXcml0ZUJpdG1hcFJlbmRl clRhcmdldDEgKlRoaXMsIERXUklURV9URVhUX0FOVElBTElBU19NT0RFIG1vZGUpOworCisg IEVORF9JTlRFUkZBQ0UKK30gSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldDFWdGJsOworCitp bnRlcmZhY2UgSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldDEgeworICBDT05TVF9WVEJMIElE V3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQxVnRibCogbHBWdGJsOworfTsKKwordHlwZWRlZiBz dHJ1Y3QgSURXcml0ZUdkaUludGVyb3BWdGJsIHsKKyAgQkVHSU5fSU5URVJGQUNFCisKKyAg SFJFU1VMVCAoU1RETUVUSE9EQ0FMTFRZUEUgKlF1ZXJ5SW50ZXJmYWNlKQorICAgIChJRFdy aXRlR2RpSW50ZXJvcCAqVGhpcywgUkVGSUlEIHJpaWQsIHZvaWQgKipwcHZPYmplY3QpOwor ICBVTE9ORyAoU1RETUVUSE9EQ0FMTFRZUEUgKkFkZFJlZikoSURXcml0ZUdkaUludGVyb3Ag KlRoaXMpOworICBVTE9ORyAoU1RETUVUSE9EQ0FMTFRZUEUgKlJlbGVhc2UpKElEV3JpdGVH ZGlJbnRlcm9wICpUaGlzKTsKKworICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAqQ3Jl YXRlRm9udEZyb21MT0dGT05UKQorICAgIChJRFdyaXRlR2RpSW50ZXJvcCAqVGhpcywgY29u c3QgTE9HRk9OVFcgKmxvZ2ZvbnQsCisgICAgIElEV3JpdGVGb250ICoqZm9udCk7CisKKyAg RU1BQ1NfRFdSSVRFX1VOVVNFRCAoQ29udmVydEZvbnRUb0xPR0ZPTlQpOworICBFTUFDU19E V1JJVEVfVU5VU0VEIChDb252ZXJ0Rm9udEZhY2VUb0xPR0ZPTlQpOworICBFTUFDU19EV1JJ VEVfVU5VU0VEIChDcmVhdGVGb250RmFjZUZyb21IZGMpOworCisgIEhSRVNVTFQgKFNURE1F VEhPRENBTExUWVBFICpDcmVhdGVCaXRtYXBSZW5kZXJUYXJnZXQpCisgICAgKElEV3JpdGVH ZGlJbnRlcm9wICpUaGlzLCBIREMgaGRjLCBVSU5UMzIgd2lkdGgsIFVJTlQzMiBoZWlnaHQs CisgICAgIElEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQgKip0YXJnZXQpOworICBFTkRfSU5U RVJGQUNFCit9IElEV3JpdGVHZGlJbnRlcm9wVnRibDsKKworaW50ZXJmYWNlIElEV3JpdGVH ZGlJbnRlcm9wIHsKKyAgQ09OU1RfVlRCTCBJRFdyaXRlR2RpSW50ZXJvcFZ0YmwqIGxwVnRi bDsKK307CisKK3R5cGVkZWYgc3RydWN0IElEV3JpdGVGYWN0b3J5VnRibCB7CisgIEJFR0lO X0lOVEVSRkFDRQorCisgIEhSRVNVTFQgKFNURE1FVEhPRENBTExUWVBFICpRdWVyeUludGVy ZmFjZSkKKyAgICAoSURXcml0ZUZhY3RvcnkgKlRoaXMsIFJFRklJRCByaWlkLCB2b2lkICoq cHB2T2JqZWN0KTsKKyAgVUxPTkcgKFNURE1FVEhPRENBTExUWVBFICpBZGRSZWYpKElEV3Jp dGVGYWN0b3J5ICpUaGlzKTsKKyAgVUxPTkcgKFNURE1FVEhPRENBTExUWVBFICpSZWxlYXNl KShJRFdyaXRlRmFjdG9yeSAqVGhpcyk7CisKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoR2V0 U3lzdGVtRm9udENvbGxlY3Rpb24pOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChDcmVhdGVD dXN0b21Gb250Q29sbGVjdGlvbik7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKFJlZ2lzdGVy Rm9udENvbGxlY3Rpb25Mb2FkZXIpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChVbnJlZ2lz dGVyRm9udENvbGxlY3Rpb25Mb2FkZXIpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChDcmVh dGVGb250RmlsZVJlZmVyZW5jZSk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKENyZWF0ZUN1 c3RvbUZvbnRGaWxlUmVmZXJlbmNlKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoQ3JlYXRl Rm9udEZhY2UpOworICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAqQ3JlYXRlUmVuZGVy aW5nUGFyYW1zKQorICAgIChJRFdyaXRlRmFjdG9yeSAqVGhpcywgSURXcml0ZVJlbmRlcmlu Z1BhcmFtcyAqKnBhcmFtcyk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKENyZWF0ZU1vbml0 b3JSZW5kZXJpbmdQYXJhbXMpOworICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAqQ3Jl YXRlQ3VzdG9tUmVuZGVyaW5nUGFyYW1zKQorICAgIChJRFdyaXRlRmFjdG9yeSAqVGhpcywg RkxPQVQgZ2FtbWEsIEZMT0FUIGVuaGFuY2VkQ29udHJhc3QsCisgICAgIEZMT0FUIGNsZWFy dHlwZV9sZXZlbCwgRFdSSVRFX1BJWEVMX0dFT01FVFJZIGdlb21ldHJ5LAorICAgICBEV1JJ VEVfUkVOREVSSU5HX01PREUgbW9kZSwgSURXcml0ZVJlbmRlcmluZ1BhcmFtcyAqKnBhcmFt cyk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKFJlZ2lzdGVyRm9udEZpbGVMb2FkZXIpOwor ICBFTUFDU19EV1JJVEVfVU5VU0VEIChVbnJlZ2lzdGVyRm9udEZpbGVMb2FkZXIpOworICBF TUFDU19EV1JJVEVfVU5VU0VEIChDcmVhdGVUZXh0Rm9ybWF0KTsKKyAgRU1BQ1NfRFdSSVRF X1VOVVNFRCAoQ3JlYXRlVHlwb2dyYXBoeSk7CisgIEhSRVNVTFQgKFNURE1FVEhPRENBTExU WVBFICpHZXRHZGlJbnRlcm9wKQorICAgIChJRFdyaXRlRmFjdG9yeSAqVGhpcywgSURXcml0 ZUdkaUludGVyb3AgKipnZGlfaW50ZXJvcCk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKENy ZWF0ZVRleHRMYXlvdXQpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChDcmVhdGVHZGlDb21w YXRpYmxlVGV4dExheW91dCk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKENyZWF0ZUVsbGlw c2lzVHJpbW1pbmdTaWduKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoQ3JlYXRlVGV4dEFu YWx5emVyKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoQ3JlYXRlTnVtYmVyU3Vic3RpdHV0 aW9uKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoQ3JlYXRlR2x5cGhSdW5BbmFseXNpcyk7 CisgIEVORF9JTlRFUkZBQ0UKK30gSURXcml0ZUZhY3RvcnlWdGJsOworCitpbnRlcmZhY2Ug SURXcml0ZUZhY3RvcnkgeyBDT05TVF9WVEJMIElEV3JpdGVGYWN0b3J5VnRibCogbHBWdGJs OyB9OworCit0eXBlZGVmIHN0cnVjdCBJRFdyaXRlQ29sb3JHbHlwaFJ1bkVudW1lcmF0b3JW dGJsIHsKKyAgQkVHSU5fSU5URVJGQUNFCisKKyAgSFJFU1VMVCAoU1RETUVUSE9EQ0FMTFRZ UEUgKlF1ZXJ5SW50ZXJmYWNlKQorICAgIChJRFdyaXRlQ29sb3JHbHlwaFJ1bkVudW1lcmF0 b3IgKlRoaXMsIFJFRklJRCByaWlkLCB2b2lkICoqcHB2T2JqZWN0KTsKKyAgVUxPTkcgKFNU RE1FVEhPRENBTExUWVBFICpBZGRSZWYpKElEV3JpdGVDb2xvckdseXBoUnVuRW51bWVyYXRv ciAqVGhpcyk7CisgIFVMT05HIChTVERNRVRIT0RDQUxMVFlQRSAqUmVsZWFzZSkoSURXcml0 ZUNvbG9yR2x5cGhSdW5FbnVtZXJhdG9yICpUaGlzKTsKKworICBIUkVTVUxUIChTVERNRVRI T0RDQUxMVFlQRSAqTW92ZU5leHQpKAorICAgIElEV3JpdGVDb2xvckdseXBoUnVuRW51bWVy YXRvciAqVGhpcywKKyAgICBXSU5CT09MICpoYXNSdW4pOworCisgIEhSRVNVTFQgKFNURE1F VEhPRENBTExUWVBFICpHZXRDdXJyZW50UnVuKSgKKyAgICBJRFdyaXRlQ29sb3JHbHlwaFJ1 bkVudW1lcmF0b3IgKlRoaXMsCisgICAgY29uc3QgRFdSSVRFX0NPTE9SX0dMWVBIX1JVTiAq KnJ1bik7CisKKyAgRU5EX0lOVEVSRkFDRQorfSBJRFdyaXRlQ29sb3JHbHlwaFJ1bkVudW1l cmF0b3JWdGJsOworCitpbnRlcmZhY2UgSURXcml0ZUNvbG9yR2x5cGhSdW5FbnVtZXJhdG9y IHsKKyAgQ09OU1RfVlRCTCBJRFdyaXRlQ29sb3JHbHlwaFJ1bkVudW1lcmF0b3JWdGJsKiBs cFZ0Ymw7Cit9OworCit0eXBlZGVmIHN0cnVjdCBJRFdyaXRlRmFjdG9yeTJWdGJsIHsKKyAg QkVHSU5fSU5URVJGQUNFCisgIEhSRVNVTFQgKFNURE1FVEhPRENBTExUWVBFICpRdWVyeUlu dGVyZmFjZSkKKyAgICAoSURXcml0ZUZhY3RvcnkyICpUaGlzLCBSRUZJSUQgcmlpZCwgdm9p ZCAqKnBwdk9iamVjdCk7CisgIFVMT05HIChTVERNRVRIT0RDQUxMVFlQRSAqQWRkUmVmKShJ RFdyaXRlRmFjdG9yeTIgKlRoaXMpOworICBVTE9ORyAoU1RETUVUSE9EQ0FMTFRZUEUgKlJl bGVhc2UpKElEV3JpdGVGYWN0b3J5MiAqVGhpcyk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQg KEdldFN5c3RlbUZvbnRDb2xsZWN0aW9uKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoQ3Jl YXRlQ3VzdG9tRm9udENvbGxlY3Rpb24pOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChSZWdp c3RlckZvbnRDb2xsZWN0aW9uTG9hZGVyKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoVW5y ZWdpc3RlckZvbnRDb2xsZWN0aW9uTG9hZGVyKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAo Q3JlYXRlRm9udEZpbGVSZWZlcmVuY2UpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChDcmVh dGVDdXN0b21Gb250RmlsZVJlZmVyZW5jZSk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKENy ZWF0ZUZvbnRGYWNlKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoQ3JlYXRlUmVuZGVyaW5n UGFyYW1zKTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoQ3JlYXRlTW9uaXRvclJlbmRlcmlu Z1BhcmFtcyk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKENyZWF0ZUN1c3RvbVJlbmRlcmlu Z1BhcmFtcyk7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKFJlZ2lzdGVyRm9udEZpbGVMb2Fk ZXIpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChVbnJlZ2lzdGVyRm9udEZpbGVMb2FkZXIp OworICBFTUFDU19EV1JJVEVfVU5VU0VEIChDcmVhdGVUZXh0Rm9ybWF0KTsKKyAgRU1BQ1Nf RFdSSVRFX1VOVVNFRCAoQ3JlYXRlVHlwb2dyYXBoeSk7CisgIEVNQUNTX0RXUklURV9VTlVT RUQgKEdldEdkaUludGVyb3ApOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChDcmVhdGVUZXh0 TGF5b3V0KTsKKyAgRU1BQ1NfRFdSSVRFX1VOVVNFRCAoQ3JlYXRlR2RpQ29tcGF0aWJsZVRl eHRMYXlvdXQpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChDcmVhdGVFbGxpcHNpc1RyaW1t aW5nU2lnbik7CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKENyZWF0ZVRleHRBbmFseXplcik7 CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKENyZWF0ZU51bWJlclN1YnN0aXR1dGlvbik7Cisg IEVNQUNTX0RXUklURV9VTlVTRUQgKENyZWF0ZUdseXBoUnVuQW5hbHlzaXMpOworCisgIEVN QUNTX0RXUklURV9VTlVTRUQgKEdldEV1ZGNGb250Q29sbGVjdGlvbik7CisgIEVNQUNTX0RX UklURV9VTlVTRUQgKElEV3JpdGVGYWN0b3J5MV9DcmVhdGVDdXN0b21SZW5kZXJpbmdQYXJh bXMpOworCisgIEVNQUNTX0RXUklURV9VTlVTRUQgKEdldFN5c3RlbUZvbnRGYWxsYmFjayk7 CisgIEVNQUNTX0RXUklURV9VTlVTRUQgKENyZWF0ZUZvbnRGYWxsYmFja0J1aWxkZXIpOwor ICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAqVHJhbnNsYXRlQ29sb3JHbHlwaFJ1bikK KyAgICAoSURXcml0ZUZhY3RvcnkyICpUaGlzLAorICAgICBGTE9BVCBvcmlnaW5YLAorICAg ICBGTE9BVCBvcmlnaW5ZLAorICAgICBjb25zdCBEV1JJVEVfR0xZUEhfUlVOICpydW4sCisg ICAgIHZvaWQgKnJ1bmRlc2NyLAorICAgICBEV1JJVEVfTUVBU1VSSU5HX01PREUgbW9kZSwK KyAgICAgdm9pZCAqdHJhbnNmb3JtLAorICAgICBVSU5UMzIgcGFsZXR0ZV9pbmRleCwKKyAg ICAgSURXcml0ZUNvbG9yR2x5cGhSdW5FbnVtZXJhdG9yICoqY29sb3JsYXllcnMpOworCisg IEVNQUNTX0RXUklURV9VTlVTRUQgKElEV3JpdGVGYWN0b3J5Ml9DcmVhdGVDdXN0b21SZW5k ZXJpbmdQYXJhbXMpOworICBFTUFDU19EV1JJVEVfVU5VU0VEIChJRFdyaXRlRmFjdG9yeTJf Q3JlYXRlR2x5cGhSdW5BbmFseXNpcyk7CisgIEVORF9JTlRFUkZBQ0UKK30gSURXcml0ZUZh Y3RvcnkyVnRibDsKKworaW50ZXJmYWNlIElEV3JpdGVGYWN0b3J5MiB7CisgIENPTlNUX1ZU QkwgSURXcml0ZUZhY3RvcnkyVnRibCogbHBWdGJsOworfTsKKyNlbHNlIC8qIGlmbmRlZiBN SU5HV19XNjQgKi8KKyMgaW5jbHVkZSA8ZHdyaXRlXzMuaD4KKyNlbmRpZgorCisvKiBVc2Vy IGNvbmZpZ3VyYWJsZSB2YXJpYWJsZXMuICBJZiB0aGV5IGFyZSBsb3dlciB0aGFuIDAgdXNl CisgICBEaXJlY3RXcml0ZSdzIGRlZmF1bHRzLCBvciBvdXIgZGVmYXVsdHMuICBUbyBzZXQg dGhlbSwgdGhlIHVzZXIgY2FsbHMKKyAgICd3MzItZHdyaXRlLXJlaW5pdCcgKi8KK3N0YXRp YyBmbG9hdCBjb25maWdfZW5oYW5jZWRfY29udHJhc3QgPSAtMS4wZjsKK3N0YXRpYyBmbG9h dCBjb25maWdfY2xlYXJfdHlwZV9sZXZlbCA9IC0xLjBmOworc3RhdGljIGZsb2F0IGNvbmZp Z19nYW1tYSA9IC0xLjBmOworCisvKiBWYWx1ZXMgdG8gdXNlIGZvciBEaXJlY3RXcml0ZSBy ZW5kZXJpbmcuICAqLworI2RlZmluZSBNRUFTVVJJTkdfTU9ERSBEV1JJVEVfTUVBU1VSSU5H X01PREVfTkFUVVJBTAorI2RlZmluZSBSRU5ERVJJTkdfTU9ERSBEV1JJVEVfUkVOREVSSU5H X01PREVfTkFUVVJBTF9TWU1NRVRSSUMKKyNkZWZpbmUgQU5USUFMSUFTX01PREUgRFdSSVRF X1RFWFRfQU5USUFMSUFTX01PREVfQ0xFQVJUWVBFCisKK3N0YXRpYyB2b2lkCityZWxlYXNl X2NvbSAoSVVua25vd24gKippKQoreworICBpZiAoICppICkKKyAgICB7CisgICAgICAoKElV bmtub3duICopICgqaSkpLT5scFZ0YmwtPlJlbGVhc2UgKCppKTsKKyAgICAgICppID0gTlVM TDsKKyAgICB9Cit9CisKKyNkZWZpbmUgUkVMRUFTRV9DT00oaSkgcmVsZWFzZV9jb20gKCAo SVVua25vd24gKiopICZpICkKKworLyogR2xvYmFsIHZhcmlhYmxlcyBmb3IgRGlyZWN0V3Jp dGUuICAqLworc3RhdGljIGJvb2wgZGlyZWN0X3dyaXRlX2F2YWlsYWJsZSA9IGZhbHNlOwor c3RhdGljIElEV3JpdGVGYWN0b3J5ICpkd3JpdGVfZmFjdG9yeSA9IE5VTEw7CitzdGF0aWMg SURXcml0ZUZhY3RvcnkyICpkd3JpdGVfZmFjdG9yeTIgPSBOVUxMOworc3RhdGljIElEV3Jp dGVHZGlJbnRlcm9wICpnZGlfaW50ZXJvcCA9IE5VTEw7CitzdGF0aWMgSURXcml0ZVJlbmRl cmluZ1BhcmFtcyAqcmVuZGVyaW5nX3BhcmFtcyA9IE5VTEw7CisKK3N0YXRpYyBib29sCit2 ZXJpZnlfaHIgKEhSRVNVTFQgaHIsIGNvbnN0IGNoYXIgKm1zZykKK3sKKyAgaWYgKEZBSUxF RCAoaHIpKQorICAgIHsKKyAgICAgIERlYlByaW50ICgoIkRpcmVjdFdyaXRlIEhSRVNVTFQg ZmFpbGVkOiAoJWQpICVzXG4iLCBociwgbXNnKSk7CisgICAgICBlYXNzZXJ0IChTVUNDRUVE RUQgKGhyKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICByZXR1cm4gdHJ1ZTsK K30KKworLyogR2V0cyBhIElEV3JpdGVGb250RmFjZSBmcm9tIGEgc3RydWN0IGZvbnQgKGl0 cyBIRk9OVCkuIFJldHVybnMgdGhlCisgICBmb250IHNpemUgaW4gcG9pbnRzLiAgSXQgbWF5 IGZhaWwgdG8gZ2V0IGEgRGlyZWN0V3JpdGUgZm9udCwgYW5kIGZhY2UKKyAgIHdpbGwgYmUg TlVMTCBvbiByZXR1cm4uICBUaGlzIGhhcHBlbnMgZm9yIHNvbWUgZm9udHMgbGlrZSBDb3Vy aWVyLgorCisgICBOZXZlciBjYWxsIFJlbGVhc2Ugb24gdGhlIHJlc3VsdCwgYXMgaXQgaXMg Y2FjaGVkIGZvciByZXVzZSBvbiB0aGUKKyAgIHN0cnVjdCBmb250LiAgKi8KK3N0YXRpYyBm bG9hdAorZ2V0X2ZvbnRfZmFjZSAoc3RydWN0IGZvbnQgKmluZm9udCwgSURXcml0ZUZvbnRG YWNlICoqZmFjZSkKK3sKKyAgSFJFU1VMVCBocjsKKyAgTE9HRk9OVFcgbG9nZm9udDsKKyAg SURXcml0ZUZvbnQgKmZvbnQ7CisKKyAgc3RydWN0IHVuaXNjcmliZV9mb250X2luZm8gKnVu aXNjcmliZV9mb250ID0KKyAgICAoc3RydWN0IHVuaXNjcmliZV9mb250X2luZm8gKikgaW5m b250OworCisgIC8qIENoZWNrIHRoZSBjYWNoZS4gICovCisgICpmYWNlID0gdW5pc2NyaWJl X2ZvbnQtPmR3cml0ZV9jYWNoZTsKKyAgaWYgKCpmYWNlKQorICAgIHJldHVybiB1bmlzY3Jp YmVfZm9udC0+ZHdyaXRlX2ZvbnRfc2l6ZTsKKworICBHZXRPYmplY3RXIChGT05UX0hBTkRM RShpbmZvbnQpLCBzaXplb2YgKExPR0ZPTlRXKSwgJmxvZ2ZvbnQpOworCisgIGhyID0gZ2Rp X2ludGVyb3AtPmxwVnRibC0+Q3JlYXRlRm9udEZyb21MT0dGT05UIChnZGlfaW50ZXJvcCwK KwkJCQkJCSAgIChjb25zdCBMT0dGT05UVyAqKSAmbG9nZm9udCwKKwkJCQkJCSAgICZmb250 KTsKKworICBpZiAoIXZlcmlmeV9ociAoaHIsICJGYWlsZWQgdG8gQ3JlYXRlRm9udEZyb21M T0dGT05UIikpCisgICAgeworICAgICAgdW5pc2NyaWJlX2ZvbnQtPmR3cml0ZV9za2lwX2Zv bnQgPSB0cnVlOworICAgICAgKmZhY2UgPSBOVUxMOworICAgICAgcmV0dXJuIDAuMDsKKyAg ICB9CisKKyAgaHIgPSBmb250LT5scFZ0YmwtPkNyZWF0ZUZvbnRGYWNlIChmb250LCBmYWNl KTsKKyAgUkVMRUFTRV9DT00gKGZvbnQpOworICBpZiAoIXZlcmlmeV9ociAoaHIsICJGYWls ZWQgdG8gY3JlYXRlIERXcml0ZUZvbnRGYWNlIikpCisgICAgeworICAgICAgdW5pc2NyaWJl X2ZvbnQtPmR3cml0ZV9za2lwX2ZvbnQgPSB0cnVlOworICAgICAgKmZhY2UgPSBOVUxMOwor ICAgICAgcmV0dXJuIDAuMDsKKyAgICB9CisKKyAgLyogQ2FjaGUgdGhpcyBGb250RmFjZS4g ICovCisgIHVuaXNjcmliZV9mb250LT5kd3JpdGVfZm9udF9zaXplID0gYWJzIChsb2dmb250 LmxmSGVpZ2h0KTsKKyAgdW5pc2NyaWJlX2ZvbnQtPmR3cml0ZV9jYWNoZSA9ICpmYWNlOwor CisgIHJldHVybiBhYnMgKGxvZ2ZvbnQubGZIZWlnaHQpOworfQorCit2b2lkCit3MzJfZHdy aXRlX2ZyZWVfY2FjaGVkX2ZhY2UgKHZvaWQgKmNhY2hlKQoreworICBpZiAoY2FjaGUpCisg ICAgUkVMRUFTRV9DT00gKGNhY2hlKTsKK30KKworc3RhdGljIGZsb2F0Citjb252ZXJ0X21l dHJpY3Nfc3ogKGludCBzeiwgZmxvYXQgZm9udF9zaXplLCBpbnQgdW5pdHNfcGVyX2VtKQor eworICByZXR1cm4gKGZsb2F0KSBzeiAqIGZvbnRfc2l6ZSAvIHVuaXRzX3Blcl9lbTsKK30K KworLyogRG9lcyBub3QgZmlsbCBpbiB0aGUgYXNjZW50IGFuZCBkZXNjZW50IGZpZWxkcyBv ZiBtZXRyaWNzLiAgKi8KK3N0YXRpYyBib29sCit0ZXh0X2V4dGVudHNfaW50ZXJuYWwgKElE V3JpdGVGb250RmFjZSAqZHdyaXRlX2ZvbnRfZmFjZSwKKwkJICAgICAgIGZsb2F0IGZvbnRf c2l6ZSwgY29uc3QgdW5zaWduZWQgKmNvZGUsCisJCSAgICAgICBpbnQgbmdseXBocywgc3Ry dWN0IGZvbnRfbWV0cmljcyAqbWV0cmljcykKK3sKKyAgSFJFU1VMVCBocjsKKworICBVU0Vf U0FGRV9BTExPQ0E7CisKKyAgRFdSSVRFX0ZPTlRfTUVUUklDUyBkd3JpdGVfZm9udF9tZXRy aWNzOworICBkd3JpdGVfZm9udF9mYWNlLT5scFZ0YmwtPkdldE1ldHJpY3MgKGR3cml0ZV9m b250X2ZhY2UsCisJCQkJCSZkd3JpdGVfZm9udF9tZXRyaWNzKTsKKworICBVSU5UMTYgKmlu ZGljZXMgPSBTQUZFX0FMTE9DQSAobmdseXBocyAqIHNpemVvZiAoVUlOVDE2KSk7CisgIGZv ciAoaW50IGkgPSAwOyBpIDwgbmdseXBoczsgaSsrKQorICAgIGluZGljZXNbaV0gPSBjb2Rl W2ldOworCisgIERXUklURV9HTFlQSF9NRVRSSUNTKiBnbWV0cmljcyA9CisgICAgU0FGRV9B TExPQ0EgKG5nbHlwaHMgKiBzaXplb2YgKERXUklURV9HTFlQSF9NRVRSSUNTKSk7CisKKyAg aHIgPSBkd3JpdGVfZm9udF9mYWNlLT5scFZ0YmwtPkdldEdkaUNvbXBhdGlibGVHbHlwaE1l dHJpY3MgKGR3cml0ZV9mb250X2ZhY2UsCisJCQkJCQkJICAgICAgIGZvbnRfc2l6ZSwKKwkJ CQkJCQkgICAgICAgMS4wLAorCQkJCQkJCSAgICAgICBOVUxMLAorCQkJCQkJCSAgICAgICBU UlVFLAorCQkJCQkJCSAgICAgICBpbmRpY2VzLAorCQkJCQkJCSAgICAgICBuZ2x5cGhzLAor CQkJCQkJCSAgICAgICBnbWV0cmljcywKKwkJCQkJCQkgICAgICAgZmFsc2UpOworICBpZiAo IXZlcmlmeV9ociAoaHIsICJGYWlsZWQgdG8gR2V0R2RpQ29tcGF0aWJsZUdseXBoTWV0cmlj cyIpKQorICAgIHsKKyAgICAgIFNBRkVfRlJFRSAoKTsKKyAgICAgIHJldHVybiBmYWxzZTsK KyAgICB9CisKKyAgZmxvYXQgd2lkdGggPSAwOworICBpbnQgZHVfcGVyX2VtID0gZHdyaXRl X2ZvbnRfbWV0cmljcy5kZXNpZ25Vbml0c1BlckVtOworCisgIGZvciAoaW50IGkgPSAwOyBp IDwgbmdseXBoczsgaSsrKQorICAgIHsKKyAgICAgIGZsb2F0IGFkdmFuY2UgPQorCWNvbnZl cnRfbWV0cmljc19zeiAoZ21ldHJpY3NbaV0uYWR2YW5jZVdpZHRoLCBmb250X3NpemUsIGR1 X3Blcl9lbSk7CisKKyAgICAgIHdpZHRoICs9IGFkdmFuY2U7CisKKyAgICAgIGZsb2F0IGxi ZWFyaW5nID0KKwlyb3VuZCAoY29udmVydF9tZXRyaWNzX3N6IChnbWV0cmljc1tpXS5sZWZ0 U2lkZUJlYXJpbmcsIGZvbnRfc2l6ZSwKKwkJCQkgICBkdV9wZXJfZW0pKTsKKyAgICAgIGZs b2F0IHJiZWFyaW5nID0KKwlyb3VuZCAoYWR2YW5jZSAtCisJICAgICAgIGNvbnZlcnRfbWV0 cmljc19zeiAoZ21ldHJpY3NbaV0ucmlnaHRTaWRlQmVhcmluZywKKwkJCQkgICBmb250X3Np emUsIGR1X3Blcl9lbSkpOworICAgICAgaWYgKGkgPT0gMCkKKwl7CisJICBtZXRyaWNzLT5s YmVhcmluZyA9IGxiZWFyaW5nOworCSAgbWV0cmljcy0+cmJlYXJpbmcgPSByYmVhcmluZzsK Kwl9CisgICAgICBpZiAobWV0cmljcy0+bGJlYXJpbmcgPiBsYmVhcmluZykKKwltZXRyaWNz LT5sYmVhcmluZyA9IGxiZWFyaW5nOworICAgICAgaWYgKG1ldHJpY3MtPnJiZWFyaW5nIDwg cmJlYXJpbmcpCisJbWV0cmljcy0+cmJlYXJpbmcgPSByYmVhcmluZzsKKyAgICB9CisgIG1l dHJpY3MtPndpZHRoID0gcm91bmQod2lkdGgpOworICBTQUZFX0ZSRUUgKCk7CisgIHJldHVy biB0cnVlOworfQorCit1bnNpZ25lZAordzMyX2R3cml0ZV9lbmNvZGVfY2hhciAoc3RydWN0 IGZvbnQgKmZvbnQsIGludCBjKQoreworICBIUkVTVUxUIGhyOworICBJRFdyaXRlRm9udEZh Y2UgKmR3cml0ZV9mb250X2ZhY2U7CisgIFVJTlQxNiBpbmRleDsKKworICBnZXRfZm9udF9m YWNlIChmb250LCAmZHdyaXRlX2ZvbnRfZmFjZSk7CisgIGlmIChkd3JpdGVfZm9udF9mYWNl ID09IE5VTEwpCisgICAgcmV0dXJuIEZPTlRfSU5WQUxJRF9DT0RFOworICBociA9IGR3cml0 ZV9mb250X2ZhY2UtPmxwVnRibC0+R2V0R2x5cGhJbmRpY2VzIChkd3JpdGVfZm9udF9mYWNl LAorCQkJCQkJICAmYywgMSwgJmluZGV4KTsKKyAgaWYgKHZlcmlmeV9ociAoaHIsICJGYWls ZWQgdG8gR2V0R2x5cGhJbmRpY2VzIikpCisgICAgeworICAgICAgaWYgKGluZGV4ID09IDAp CisJcmV0dXJuIEZPTlRfSU5WQUxJRF9DT0RFOworICAgICAgcmV0dXJuIGluZGV4OworICAg IH0KKyAgKChzdHJ1Y3QgdW5pc2NyaWJlX2ZvbnRfaW5mbyAqKSBmb250KS0+ZHdyaXRlX3Nr aXBfZm9udCA9IHRydWU7CisgIHJldHVybiBGT05UX0lOVkFMSURfQ09ERTsKK30KKworYm9v bAordzMyX2R3cml0ZV90ZXh0X2V4dGVudHMgKHN0cnVjdCBmb250ICpmb250LCBjb25zdCB1 bnNpZ25lZCAqY29kZSwgaW50IG5nbHlwaHMsCisJCQkgc3RydWN0IGZvbnRfbWV0cmljcyAq bWV0cmljcykKK3sKKyAgSURXcml0ZUZvbnRGYWNlICpkd3JpdGVfZm9udF9mYWNlOworCisg IGZsb2F0IGZvbnRfc2l6ZSA9IGdldF9mb250X2ZhY2UgKGZvbnQsICZkd3JpdGVfZm9udF9m YWNlKTsKKworICBpZiAoZHdyaXRlX2ZvbnRfZmFjZSA9PSBOVUxMKQorICAgIHJldHVybiBm YWxzZTsKKworICAvKiBXZSBjYW4gZ2V0IGZvbnRzIHdpdGggYSBzaXplIG9mIDAuICBHREkg aGFuZGxlcyB0aGlzIGJ5IHVzaW5nIGEgZGVmYXVsdAorICAgICBzaXplLiAgV2UgZG8gdGhl IHNhbWUuICAqLworICBpZiAoZm9udF9zaXplIDw9IDAuMGYpCisgICAgZm9udF9zaXplID0g RlJBTUVfTElORV9IRUlHSFQgKFNFTEVDVEVEX0ZSQU1FICgpKTsKKworICBtZXRyaWNzLT5h c2NlbnQgPSBmb250LT5hc2NlbnQ7CisgIG1ldHJpY3MtPmRlc2NlbnQgPSBmb250LT5kZXNj ZW50OworCisgIHJldHVybiB0ZXh0X2V4dGVudHNfaW50ZXJuYWwgKGR3cml0ZV9mb250X2Zh Y2UsIGZvbnRfc2l6ZSwgY29kZSwgbmdseXBocywKKwkJCQltZXRyaWNzKTsKK30KKworLyog TmV2ZXIgY2FsbCBSZWxlYXNlIG9uIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGlzIGZ1bmN0 aW9uLCBhcyBpdCBpcworICAgcmV1c2VkLiAgKi8KK3N0YXRpYyBJRFdyaXRlQml0bWFwUmVu ZGVyVGFyZ2V0ICoKK2dldF9iaXRtYXBfcmVuZGVyX3RhcmdldCAoSERDIGhkYywgaW50IHdp ZHRoLCBpbnQgaGVpZ2h0KQoreworICBIUkVTVUxUIGhyOworICBzdGF0aWMgSURXcml0ZUJp dG1hcFJlbmRlclRhcmdldCAqYnJ0ID0gTlVMTDsKKyAgc3RhdGljIFNJWkUgc2l6ZSA9IHsw LCAwfTsKKworICBpZiAoYnJ0KQorICAgIHsKKyAgICAgIC8qIENoZWNrIGlmIHdlIG5lZWQg dG8gbWFrZSBhIGJpZ2dlciBvbmUuICAqLworICAgICAgaWYgKHdpZHRoIDw9IHNpemUuY3gg JiYgaGVpZ2h0IDw9IHNpemUuY3kpCisJcmV0dXJuIGJydDsKKyAgICAgIFJFTEVBU0VfQ09N IChicnQpOworICAgIH0KKworICBpZiAod2lkdGggPiBzaXplLmN4KQorICAgIHNpemUuY3gg PSB3aWR0aDsKKyAgaWYgKGhlaWdodCA+IHNpemUuY3kpCisgICAgc2l6ZS5jeSA9IGhlaWdo dDsKKworICBociA9IGdkaV9pbnRlcm9wLT5scFZ0YmwtPkNyZWF0ZUJpdG1hcFJlbmRlclRh cmdldCAoZ2RpX2ludGVyb3AsCisJCQkJCQkgICAgICBoZGMsCisJCQkJCQkgICAgICBzaXpl LmN4LCBzaXplLmN5LAorCQkJCQkJICAgICAgJmJydCk7CisgIGlmICghdmVyaWZ5X2hyICho ciwgIkZhaWxlZCB0byBDcmVhdGVCaXRtYXBSZW5kZXJUYXJnZXQiKSkKKyAgICByZXR1cm4g TlVMTDsKKworICAvKiBXZSBoYW5kbGUgaGlnaCBkcGkgZGlzcGxheXMgYnkgaW5jcmVzaW5n IGZvbnQgc2l6ZSwgc28gb3ZlcnJpZGUKKyAgICAgUGl4ZWxzUGVyRGlwLiAgKi8KKyAgYnJ0 LT5scFZ0YmwtPlNldFBpeGVsc1BlckRpcCAoYnJ0LCAxLjApOworCisgIC8qIFRoZSBTZXRU ZXh0QW50aWFsaWFzTW9kZSBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgaW4KKyAgICAgSURX cml0ZUJpdG1hcFJlbmRlclRhcmdldDEuICAqLworICBJRFdyaXRlQml0bWFwUmVuZGVyVGFy Z2V0MSAqYnJ0MTsKKyAgaHIgPSBicnQtPmxwVnRibC0+UXVlcnlJbnRlcmZhY2UgKGJydCwK KwkJCQkgICAgJklJRF9JRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0MSwKKwkJCQkgICAgKHZv aWQgKiopICZicnQxKTsKKyAgLyogVGhpcyBlcnJvciBzaG91bGQgbm90IGhhcHBlbiwgYnV0 IGlzIG5vdCBjYXRhc3Ryb2ZpYyAgKi8KKyAgaWYgKHZlcmlmeV9ociAoaHIsICJGYWlsZWQg dG8gUXVlcnlJbnRlcmZhY2UgZm9yIElEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQxIikpCisg ICAgeworICAgICAgYnJ0MS0+bHBWdGJsLT5TZXRUZXh0QW50aWFsaWFzTW9kZSAoYnJ0MSwg QU5USUFMSUFTX01PREUpOworICAgICAgUkVMRUFTRV9DT00gKGJydDEpOworICAgIH0KKwor ICByZXR1cm4gYnJ0OworfQorCit2b2lkCit3MzJfaW5pdGlhbGl6ZV9kaXJlY3Rfd3JpdGUg KHZvaWQpCit7CisgIGRpcmVjdF93cml0ZV9hdmFpbGFibGUgPSBmYWxzZTsKKworICBpZiAo ZHdyaXRlX2ZhY3RvcnkpCisgICAgeworICAgICAgUkVMRUFTRV9DT00gKGR3cml0ZV9mYWN0 b3J5KTsKKyAgICAgIFJFTEVBU0VfQ09NIChkd3JpdGVfZmFjdG9yeTIpOworICAgICAgUkVM RUFTRV9DT00gKGdkaV9pbnRlcm9wKTsKKyAgICAgIFJFTEVBU0VfQ09NIChyZW5kZXJpbmdf cGFyYW1zKTsKKyAgICB9CisKKyAgSE1PRFVMRSBkaXJlY3Rfd3JpdGUgPSBMb2FkTGlicmFy eSAoImR3cml0ZS5kbGwiKTsKKyAgaWYgKCFkaXJlY3Rfd3JpdGUpCisgICAgcmV0dXJuOwor CisgIC8qIFRoaXMgaXMgb25seSB1c2VkIGhlcmUsIG5vIG5lZWQgdG8gZGVmaW5lIGl0IGds b2JhbGx5LiAgKi8KKyAgdHlwZWRlZiBIUkVTVUxUIChXSU5BUEkgKkRXQ3JlYXRlRmFjdG9y eSkgKERXUklURV9GQUNUT1JZX1RZUEUgZiwgUkVGSUlEIHIsIElVbmtub3duKiogdSk7CisK KyAgRFdDcmVhdGVGYWN0b3J5IGR3X2NyZWF0ZV9mYWN0b3J5CisgICAgPSAoRFdDcmVhdGVG YWN0b3J5KSBnZXRfcHJvY19hZGRyIChkaXJlY3Rfd3JpdGUsCisJCQkJICAgICAgICJEV3Jp dGVDcmVhdGVGYWN0b3J5Iik7CisKKyAgaWYgKCFkd19jcmVhdGVfZmFjdG9yeSkKKyAgICB7 CisgICAgICBGcmVlTGlicmFyeSAoZGlyZWN0X3dyaXRlKTsKKyAgICAgIHJldHVybjsKKyAg ICB9CisKKyAgSFJFU1VMVCBociA9IGR3X2NyZWF0ZV9mYWN0b3J5IChEV1JJVEVfRkFDVE9S WV9UWVBFX1NIQVJFRCwKKwkJCQkgICZJSURfSURXcml0ZUZhY3RvcnksCisJCQkJICAoSVVu a25vd24gKiopICZkd3JpdGVfZmFjdG9yeSk7CisgIGlmIChGQUlMRUQgKGhyKSkKKyAgICB7 CisgICAgICBEZWJQcmludCAoKCJEaXJlY3RXcml0ZSBIUkVTVUxUIGZhaWxlZDogKCVkKSBD cmVhdGVGYWN0b3J5XG4iLCBocikpOworICAgICAgRnJlZUxpYnJhcnkgKGRpcmVjdF93cml0 ZSk7CisgICAgICBlYXNzZXJ0IChTVUNDRUVERUQgKGhyKSk7CisgICAgICByZXR1cm47Cisg ICAgfQorCisgIC8qIElEV3JpdGVGYWN0b3J5MiBpcyBvbmx5IGF2YWlsYWJsZSBvbiBXaW5k b3dzIDguMSBhbmQgbGF0ZXIuCisgICAgIFdpdGhvdXQgdGhpcywgd2UgY2FuJ3QgdXNlIGNv bG9yIGZvbnRzLiAgU28gd2UgZGlzYWJsZSBEaXJlY3RXcml0ZQorICAgICBpZiBpdCBpcyBu b3QgYXZhaWxhYmxlLiAgKi8KKyAgaHIgPSBkd3JpdGVfZmFjdG9yeS0+bHBWdGJsLT5RdWVy eUludGVyZmFjZSAoZHdyaXRlX2ZhY3RvcnksCisJCQkJCSAgICAgICAmSUlEX0lEV3JpdGVG YWN0b3J5MiwKKwkJCQkJICAgICAgICh2b2lkICoqKSAmZHdyaXRlX2ZhY3RvcnkyKTsKKwor ICBpZiAoRkFJTEVEIChocikpCisgICAgeworICAgICAgRGViUHJpbnQgKCgiRGlyZWN0V3Jp dGUgSFJFU1VMVCBmYWlsZWQ6ICglZCkgUXVlcnlJbnRlcmZhY2UgSURXcml0ZUZhY3Rvcnky XG4iLCBocikpOworICAgICAgUkVMRUFTRV9DT00gKGR3cml0ZV9mYWN0b3J5KTsKKyAgICAg IEZyZWVMaWJyYXJ5IChkaXJlY3Rfd3JpdGUpOworICAgICAgZWFzc2VydCAoU1VDQ0VFREVE IChocikpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBociA9IGR3cml0ZV9mYWN0b3J5 LT5scFZ0YmwtPkdldEdkaUludGVyb3AgKGR3cml0ZV9mYWN0b3J5LAorCQkJCQkgICAgICAm Z2RpX2ludGVyb3ApOworICBpZiAoRkFJTEVEIChocikpCisgICAgeworICAgICAgRGViUHJp bnQgKCgiRGlyZWN0V3JpdGUgSFJFU1VMVCBmYWlsZWQ6ICglZCkgR2V0R2RpSW50ZXJvcFxu IiwgaHIpKTsKKyAgICAgIFJFTEVBU0VfQ09NIChkd3JpdGVfZmFjdG9yeSk7CisgICAgICBS RUxFQVNFX0NPTSAoZHdyaXRlX2ZhY3RvcnkyKTsKKyAgICAgIEZyZWVMaWJyYXJ5IChkaXJl Y3Rfd3JpdGUpOworICAgICAgZWFzc2VydCAoU1VDQ0VFREVEIChocikpOworICAgICAgcmV0 dXJuOworICAgIH0KKworICBJRFdyaXRlUmVuZGVyaW5nUGFyYW1zICpkZWY7CisKKyAgaHIg PSBkd3JpdGVfZmFjdG9yeS0+bHBWdGJsLT5DcmVhdGVSZW5kZXJpbmdQYXJhbXMgKGR3cml0 ZV9mYWN0b3J5LAorCQkJCQkJICAgICAgJmRlZik7CisgIGlmIChGQUlMRUQgKGhyKSkKKyAg ICB7CisgICAgICBEZWJQcmludCAoKCJEaXJlY3RXcml0ZSBIUkVTVUxUIGZhaWxlZDogKCVk KSBDcmVhdGVSZW5kZXJpbmdQYXJhbXNcbiIsIGhyKSk7CisgICAgICBSRUxFQVNFX0NPTSAo ZHdyaXRlX2ZhY3RvcnkpOworICAgICAgUkVMRUFTRV9DT00gKGR3cml0ZV9mYWN0b3J5Mik7 CisgICAgICBSRUxFQVNFX0NPTSAoZ2RpX2ludGVyb3ApOworICAgICAgRnJlZUxpYnJhcnkg KGRpcmVjdF93cml0ZSk7CisgICAgICBlYXNzZXJ0IChTVUNDRUVERUQgKGhyKSk7CisgICAg ICByZXR1cm47CisgICAgfQorCisgIC8qIHJhbmdlOiBbMC4wLCAxLjBdICovCisgIGlmIChj b25maWdfZW5oYW5jZWRfY29udHJhc3QgPCAwLjBmIHx8IGNvbmZpZ19lbmhhbmNlZF9jb250 cmFzdCA+IDEuMGYpCisgICAgY29uZmlnX2VuaGFuY2VkX2NvbnRyYXN0ID0gZGVmLT5scFZ0 YmwtPkdldEVuaGFuY2VkQ29udHJhc3QgKGRlZik7CisKKyAgLyogcmFuZ2U6IFswLjAsIDEu MF0gICovCisgIGlmIChjb25maWdfY2xlYXJfdHlwZV9sZXZlbCA8IDAuMGYgfHwgY29uZmln X2NsZWFyX3R5cGVfbGV2ZWwgPiAxLjBmKQorICAgICBjb25maWdfY2xlYXJfdHlwZV9sZXZl bCA9IGRlZi0+bHBWdGJsLT5HZXRDbGVhclR5cGVMZXZlbCAoZGVmKTsKKworICAvKiByYW5n ZTogKDAuMCwgMjU2LjBdICovCisgIC8qIFdlIGNoYW5nZSB0aGUgZGVmYXVsdCB2YWx1ZSBv ZiAyLjIgZm9yIGdhbW1hIHRvIDEuNCwgdGhhdCBsb29rcworICAgICB2ZXJ5IHNpbWlsYXIg dG8gR0RJLiAgVGhlIGRlZmF1bHQgbG9va3MgdG9vIGRpbSBmb3IgZW1hY3MsCisgICAgIHN1 YmplY3RpdmVseS4gICovCisgIGlmIChjb25maWdfZ2FtbWEgPD0gMC4wZiB8fCBjb25maWdf Z2FtbWEgPiAyNTYuMGYpCisgICAgY29uZmlnX2dhbW1hID0gMS40OyAvKiBkZWYtPmxwVnRi bC0+R2V0R2FtbWEgKGRlZik7ICAqLworCisgIGhyID0gZHdyaXRlX2ZhY3RvcnktPmxwVnRi bC0+Q3JlYXRlQ3VzdG9tUmVuZGVyaW5nUGFyYW1zIChkd3JpdGVfZmFjdG9yeSwKKwkJCQkJ CQkgICAgY29uZmlnX2dhbW1hLAorCQkJCQkJCSAgICBjb25maWdfZW5oYW5jZWRfY29udHJh c3QsCisJCQkJCQkJICAgIGNvbmZpZ19jbGVhcl90eXBlX2xldmVsLAorCQkJCQkJCSAgICBk ZWYtPmxwVnRibC0+R2V0UGl4ZWxHZW9tZXRyeShkZWYpLAorCQkJCQkJCSAgICBSRU5ERVJJ TkdfTU9ERSwKKwkJCQkJCQkgICAgJnJlbmRlcmluZ19wYXJhbXMpOworCisgIFJFTEVBU0Vf Q09NIChkZWYpOworCisgIGlmIChGQUlMRUQgKGhyKSkKKyAgICB7CisgICAgICBEZWJQcmlu dCAoKCJEaXJlY3RXcml0ZSBIUkVTVUxUIGZhaWxlZDogKCVkKSBDcmVhdGVDdXN0b21SZW5k ZXJpbmdQYXJhbXNcbiIsIGhyKSk7CisgICAgICBSRUxFQVNFX0NPTSAoZHdyaXRlX2ZhY3Rv cnkpOworICAgICAgUkVMRUFTRV9DT00gKGR3cml0ZV9mYWN0b3J5Mik7CisgICAgICBSRUxF QVNFX0NPTSAoZ2RpX2ludGVyb3ApOworICAgICAgRnJlZUxpYnJhcnkgKGRpcmVjdF93cml0 ZSk7CisgICAgICBlYXNzZXJ0IChTVUNDRUVERUQgKGhyKSk7CisgICAgICByZXR1cm47Cisg ICAgfQorCisgIGRpcmVjdF93cml0ZV9hdmFpbGFibGUgPSB0cnVlOworCisgIHczMl9pbmhp Yml0X2R3cml0ZSA9IGZhbHNlOworfQorCitib29sCit3MzJfZHdyaXRlX2RyYXcgKEhEQyBo ZGMsIGludCB4LCBpbnQgeSwgdW5zaWduZWQgKmdseXBocywgaW50IGxlbiwKKwkJIENPTE9S UkVGIGNvbG9yLCBzdHJ1Y3QgZm9udCAqZm9udCkKK3sKKyAgSFJFU1VMVCBocjsKKyAgSURX cml0ZUZvbnRGYWNlICpkd3JpdGVfZm9udF9mYWNlOworCisgIFVTRV9TQUZFX0FMTE9DQTsK KworICBzdHJ1Y3QgdW5pc2NyaWJlX2ZvbnRfaW5mbyAqdW5pc2NyaWJlX2ZvbnQgPQorICAg IChzdHJ1Y3QgdW5pc2NyaWJlX2ZvbnRfaW5mbyAqKSBmb250OworCisgIC8qIFdoYXQgd2Ug Z2V0IGFzIHkgaXMgdGhlIGJhc2VsaW5lIHBvc2l0aW9uLiAgKi8KKyAgeSAtPSBmb250LT5h c2NlbnQ7CisKKyAgZmxvYXQgZm9udF9zaXplID0gZ2V0X2ZvbnRfZmFjZSAoZm9udCwgJmR3 cml0ZV9mb250X2ZhY2UpOworICBpZiAoZHdyaXRlX2ZvbnRfZmFjZSA9PSBOVUxMKQorICAg IHJldHVybiBmYWxzZTsKKworICBzdHJ1Y3QgZm9udF9tZXRyaWNzIG1ldHJpY3M7CisgIGlm ICghdGV4dF9leHRlbnRzX2ludGVybmFsIChkd3JpdGVfZm9udF9mYWNlLCBmb250X3NpemUs IGdseXBocywgbGVuLAorCQkJICAgICAgJm1ldHJpY3MpKQorICAgIHsKKyAgICAgIHVuaXNj cmliZV9mb250LT5kd3JpdGVfc2tpcF9mb250ID0gdHJ1ZTsKKyAgICAgIHJldHVybiBmYWxz ZTsKKyAgICB9CisKKyAgaW50IGJpdG1hcF93aWR0aCA9IG1ldHJpY3Mud2lkdGggKyBtZXRy aWNzLnJiZWFyaW5nOworICBpbnQgYml0bWFwX2hlaWdodCA9IGZvbnQtPmFzY2VudCArIGZv bnQtPmRlc2NlbnQ7CisKKyAgLyogV2UgbmV2ZXIgcmVsZWFzZSB0aGlzLCBnZXRfYml0bWFw X3JlbmRlcl90YXJnZXQgcmV1c2VzIGl0LiAgKi8KKyAgSURXcml0ZUJpdG1hcFJlbmRlclRh cmdldCAqYml0bWFwX3JlbmRlcl90YXJnZXQgPQorICAgIGdldF9iaXRtYXBfcmVuZGVyX3Rh cmdldCAoaGRjLCBiaXRtYXBfd2lkdGgsIGJpdG1hcF9oZWlnaHQpOworCisgIC8qIElmIHRo aXMgZmFpbHMsIGNvbXBsZXRlbHkgZGlzYWJsZSBEaXJlY3RXcml0ZS4gICovCisgIGlmIChi aXRtYXBfcmVuZGVyX3RhcmdldCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRpcmVjdF93cml0 ZV9hdmFpbGFibGUgPSBmYWxzZTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAg LyogVGhpcyBEQyBjYW4ndCBiZSByZWxlYXNlZC4gICovCisgIEhEQyB0ZXh0X2RjID0gYml0 bWFwX3JlbmRlcl90YXJnZXQtPmxwVnRibC0+R2V0TWVtb3J5REMKKyAgICAoYml0bWFwX3Jl bmRlcl90YXJnZXQpOworCisgIC8qIENvcHkgdGhlIGJhY2tncm91bmQgcGl4ZWwgdG8gdGhl IHJlbmRlciB0YXJnZXQgYml0bWFwLiAgKi8KKyAgQml0Qmx0ICh0ZXh0X2RjLCAwLCAwLCBi aXRtYXBfd2lkdGgsIGJpdG1hcF9oZWlnaHQsIGhkYywgeCwgeSwgU1JDQ09QWSk7CisKKyAg VUlOVDE2ICppbmRpY2VzID0gU0FGRV9BTExPQ0EgKGxlbiAqIHNpemVvZiAoVUlOVDE2KSk7 CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICBpbmRpY2VzW2ldID0g Z2x5cGhzW2ldOworCisgIEZMT0FUICphZHZhbmNlcyA9IFNBRkVfQUxMT0NBIChsZW4gKiBz aXplb2YgKEZMT0FUKSk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykKKyAg ICB7CisgICAgICBpZiAoIXRleHRfZXh0ZW50c19pbnRlcm5hbCAoZHdyaXRlX2ZvbnRfZmFj ZSwgZm9udF9zaXplLCBnbHlwaHMgKyBpLCAxLAorCQkJCSAgJm1ldHJpY3MpKQorCXsKKwkg IHVuaXNjcmliZV9mb250LT5kd3JpdGVfc2tpcF9mb250ID0gdHJ1ZTsKKwkgIFNBRkVfRlJF RSAoKTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICBhZHZhbmNlc1tpXSA9IG1ldHJp Y3Mud2lkdGg7CisgICAgfQorCisgIERXUklURV9HTFlQSF9SVU4gZ2x5cGhfcnVuOworICBn bHlwaF9ydW4uZm9udEZhY2UgPSBkd3JpdGVfZm9udF9mYWNlOworICBnbHlwaF9ydW4uZm9u dEVtU2l6ZSA9IGZvbnRfc2l6ZTsKKyAgZ2x5cGhfcnVuLmdseXBoSW5kaWNlcyA9IGluZGlj ZXM7CisgIGdseXBoX3J1bi5nbHlwaENvdW50ID0gbGVuOworICBnbHlwaF9ydW4uaXNTaWRl d2F5cyA9IGZhbHNlOworICBnbHlwaF9ydW4uYmlkaUxldmVsID0gMDsKKyAgZ2x5cGhfcnVu LmdseXBoT2Zmc2V0cyA9IE5VTEw7CisgIGdseXBoX3J1bi5nbHlwaEFkdmFuY2VzID0gYWR2 YW5jZXM7CisKKyAgSURXcml0ZUNvbG9yR2x5cGhSdW5FbnVtZXJhdG9yICpsYXllcnM7Cisg IC8qIFRoaXMgY2FsbCB3aWxsIHRlbGwgdXMgaWYgd2UgaGFjZSB0byBoYW5kbGUgYW55IGNv bG9yIGdseXBoLiAgKi8KKyAgaHIgPSBkd3JpdGVfZmFjdG9yeTItPmxwVnRibC0+VHJhbnNs YXRlQ29sb3JHbHlwaFJ1biAoZHdyaXRlX2ZhY3RvcnkyLAorCQkJCQkJCTAsIGZvbnQtPmFz Y2VudCwKKwkJCQkJCQkmZ2x5cGhfcnVuLAorCQkJCQkJCU5VTEwsCisJCQkJCQkJTUVBU1VS SU5HX01PREUsCisJCQkJCQkJTlVMTCwKKwkJCQkJCQkwLAorCQkJCQkJCSZsYXllcnMpOwor CisgIC8qIE5vIGNvbG9yLiAgSnVzdCBkcmF3IHRoZSBHbHlwaFJ1bi4gICovCisgIGlmICho ciA9PSBEV1JJVEVfRV9OT0NPTE9SKQorICAgIGJpdG1hcF9yZW5kZXJfdGFyZ2V0LT5scFZ0 YmwtPkRyYXdHbHlwaFJ1biAoYml0bWFwX3JlbmRlcl90YXJnZXQsCisJCQkJCQkwLCBmb250 LT5hc2NlbnQsCisJCQkJCQlNRUFTVVJJTkdfTU9ERSwKKwkJCQkJCSZnbHlwaF9ydW4sCisJ CQkJCQlyZW5kZXJpbmdfcGFyYW1zLAorCQkJCQkJY29sb3IsCisJCQkJCQlOVUxMKTsKKyAg ZWxzZQorICAgIHsKKyAgICAgIC8qIElmIHRoZXJlIHdlcmUgY29sb3IgZ2x5cGhzLCBsYXll cnMgY29udGFpbnMgYSBsaXN0IG9mIEdseXBoUnVuCisJIHdpdGggYSBjb2xvciBhbmQgYSBw b3NpdGlvbiBmb3IgZWFjaC4gIFdlIGRyYXcgdGhlbQorCSBpbmRpdmlkdWFsbHkuICAqLwor ICAgICAgaWYgKCF2ZXJpZnlfaHIgKGhyLCAiRmFpbGVkIGF0IFRyYW5zbGF0ZUNvbG9yR2x5 cGhSdW4iKSkKKwl7CisJICB1bmlzY3JpYmVfZm9udC0+ZHdyaXRlX3NraXBfZm9udCA9IHRy dWU7CisJICBSRUxFQVNFX0NPTSAobGF5ZXJzKTsKKwkgIFNBRkVfRlJFRSAoKTsKKwkgIHJl dHVybiBmYWxzZTsKKwl9CisgICAgICBmb3IgKDs7KQorCXsKKwkgIEhSRVNVTFQgaHI7CisJ ICBCT09MIG1vcmVfbGF5ZXJzOworCSAgY29uc3QgRFdSSVRFX0NPTE9SX0dMWVBIX1JVTiAq bGF5ZXI7CisKKwkgIGhyID0gbGF5ZXJzLT5scFZ0YmwtPk1vdmVOZXh0IChsYXllcnMsICZt b3JlX2xheWVycyk7CisJICBpZiAoIXZlcmlmeV9ociAoaHIsICJGYWlsZWQgYXQgTW92ZU5l eHQiKSkKKwkgICAgeworCSAgICAgIHVuaXNjcmliZV9mb250LT5kd3JpdGVfc2tpcF9mb250 ID0gdHJ1ZTsKKwkgICAgICBSRUxFQVNFX0NPTSAobGF5ZXJzKTsKKwkgICAgICBTQUZFX0ZS RUUgKCk7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisJICBpZiAoIW1vcmVfbGF5 ZXJzKQorCSAgICBicmVhazsKKwkgIGhyID0gbGF5ZXJzLT5scFZ0YmwtPkdldEN1cnJlbnRS dW4gKGxheWVycywgJmxheWVyKTsKKwkgIGlmICghdmVyaWZ5X2hyIChociwgIkZhaWxlZCBh dCBHZXRDdXJyZW50UnVuIikpCisJICAgIHsKKwkgICAgICB1bmlzY3JpYmVfZm9udC0+ZHdy aXRlX3NraXBfZm9udCA9IHRydWU7CisJICAgICAgUkVMRUFTRV9DT00gKGxheWVycyk7CisJ ICAgICAgU0FGRV9GUkVFICgpOworCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgfQorCSAg aHIgPSBiaXRtYXBfcmVuZGVyX3RhcmdldC0+bHBWdGJsLT5EcmF3R2x5cGhSdW4KKwkgICAg KGJpdG1hcF9yZW5kZXJfdGFyZ2V0LAorCSAgICAgbGF5ZXItPmJhc2VsaW5lT3JpZ2luWCwK KwkgICAgIGxheWVyLT5iYXNlbGluZU9yaWdpblksCisJICAgICBNRUFTVVJJTkdfTU9ERSwK KwkgICAgICZsYXllci0+Z2x5cGhSdW4sCisJICAgICByZW5kZXJpbmdfcGFyYW1zLAorCSAg ICAgUkdCIChsYXllci0+cnVuQ29sb3IuciAqIDI1NSwKKwkJICBsYXllci0+cnVuQ29sb3Iu ZyAqIDI1NSwKKwkJICBsYXllci0+cnVuQ29sb3IuYiAqIDI1NSksCisJICAgICBOVUxMKTsK KwkgIGlmICghdmVyaWZ5X2hyIChociwgIkZhaWxlZCBhdCBHZXRDdXJyZW50UnVuIikpCisJ ICAgIHsKKwkgICAgICB1bmlzY3JpYmVfZm9udC0+ZHdyaXRlX3NraXBfZm9udCA9IHRydWU7 CisJICAgICAgUkVMRUFTRV9DT00gKGxheWVycyk7CisJICAgICAgU0FGRV9GUkVFICgpOwor CSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgfQorCX0KKyAgICAgIFJFTEVBU0VfQ09NIChs YXllcnMpOworICAgIH0KKworICAvKiBGaW5hbGx5LCBjb3B5IHRoZSByZW5kZXJlZCB0ZXh0 IGJhY2sgdG8gdGhlIG9yaWdpbmFsIERDLiAgKi8KKyAgQml0Qmx0IChoZGMsIHgsIHksIGJp dG1hcF93aWR0aCwgYml0bWFwX2hlaWdodCwgdGV4dF9kYywgMCwgMCwgU1JDQ09QWSk7Cisg IFNBRkVfRlJFRSAoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFJldHVybnMgdHJ1ZSBp ZiBEaXJlY3RXcml0ZSBpcyB0byBiZSB1c2VkOgorICAgLSBJdCBpcyBhdmFpbGFibGUuCisg ICAtIFRoZSBmb250IGlzIGhhbmRsZWQgYnkgSGFyZkJ1enouCisgICAtIHczMi1pbmhpYml0 LWR3cml0ZSBpcyBmYWxzZS4KKyAgIC0gVGhlIGZvbnQgaGFzIG5vdCBiZWVuIG1hcmtlZCBh ZnRlciBhIGZhaWxlZCBEaXJlY3RXcml0ZSBvcGVyYXRpb24uCisqLworYm9vbAordzMyX3Vz ZV9kaXJlY3Rfd3JpdGUgKHN0cnVjdCB3MzJmb250X2luZm8gKnczMmZvbnQpCit7CisjaWZk ZWYgSEFWRV9IQVJGQlVaWgorICByZXR1cm4gZGlyZWN0X3dyaXRlX2F2YWlsYWJsZQorICAg ICYmIHczMmZvbnQtPmZvbnQuZHJpdmVyID09ICZoYXJmYnV6el9mb250X2RyaXZlcgorICAg ICYmICF3MzJfaW5oaWJpdF9kd3JpdGUKKyAgICAmJiAhKChzdHJ1Y3QgdW5pc2NyaWJlX2Zv bnRfaW5mbyAqKSB3MzJmb250KS0+ZHdyaXRlX3NraXBfZm9udDsKKyNlbHNlCisgIHJldHVy biBmYWxzZTsKKyNlbmRpZgorfQorCitERUZVTiAoInczMi1kd3JpdGUtYXZhaWxhYmxlIiwg RnczMl9kd3JpdGVfYXZhaWxhYmxlLCBTdzMyX2R3cml0ZV9hdmFpbGFibGUsIDAsIDAsIDAs CisgICAgICAgZG9jOiAvKiBSZXR1cm5zIHQgaWYgRGlyZWN0V3JpdGUgaXMgYXZhaWxhYmxl LgorRGlyZWN0V3JpdGUgd2lsbCBiZSB1c2VkIGlmIGl0IGlzIGF2YWlsYWJsZSBhbmQgJ3cz Mi1pbmhpYml0LWR3cml0ZScgaXMgbmlsLiAgKi8pCisgICh2b2lkKQoreworICByZXR1cm4g ZGlyZWN0X3dyaXRlX2F2YWlsYWJsZSA/IFF0IDogUW5pbDsKK30KKworREVGVU4gKCJ3MzIt ZHdyaXRlLXJlaW5pdCIsIEZ3MzJfZHdyaXRlX3JlaW5pdCwgU3czMl9kd3JpdGVfcmVpbml0 LCAwLCAzLCAwLAorICAgICAgIGRvYzogLyogUmVpbml0aWFsaXplIERpcmVjdFdyaXRlIHdp dGggdGhlIGdpdmVuIHBhcmFtZXRlcnMuCitJZiBhIHBhcmFtZXRlciBpcyBub3Qgc3BlY2lm aWVkLCBvciBpcyBvdXQgb2YgcmFuZ2UsIGl0IHdpbGwgdGFrZSBhIGRlZmF1bHQKK3ZhbHVl LiBSZXR1cm5zIG5pbC4KKworRU5IQU5DRURfQ09OVFJBU1QgaXMgaW4gdGhlIHJhbmdlIFsw LjAsIDEuMF0KK0NMRUFSX1RZUEVfTEVWRUwgaXMgaW4gdGhlIHJhbmdlIFswLjAsIDEuMF0K K0dBTU1BIGlzIGluIHRoZSByYW5nZSAoMC4wLCAyNTYuMF0gICovKQorICAoTGlzcF9PYmpl Y3QgZW5oYW5jZWRfY29udHJhc3QsIExpc3BfT2JqZWN0IGNsZWFyX3R5cGVfbGV2ZWwsCisg ICBMaXNwX09iamVjdCBnYW1tYSkKK3sKKyAgY29uZmlnX2VuaGFuY2VkX2NvbnRyYXN0ID0g LTEuMGY7CisgIGlmIChGTE9BVFAgKGVuaGFuY2VkX2NvbnRyYXN0KSkKKyAgICBjb25maWdf ZW5oYW5jZWRfY29udHJhc3QgPSBYRkxPQVRfREFUQSAoZW5oYW5jZWRfY29udHJhc3QpOwor ICBpZiAoRklYTlVNUCAoZW5oYW5jZWRfY29udHJhc3QpKQorICAgIGNvbmZpZ19lbmhhbmNl ZF9jb250cmFzdCA9IFhGSVhOVU0gKGVuaGFuY2VkX2NvbnRyYXN0KTsKKworICBjb25maWdf Y2xlYXJfdHlwZV9sZXZlbCA9IC0xLjBmOworICBpZiAoRkxPQVRQIChjbGVhcl90eXBlX2xl dmVsKSkKKyAgICBjb25maWdfY2xlYXJfdHlwZV9sZXZlbCA9IFhGTE9BVF9EQVRBIChjbGVh cl90eXBlX2xldmVsKTsKKyAgaWYgKEZJWE5VTVAgKGNsZWFyX3R5cGVfbGV2ZWwpKQorICAg IGNvbmZpZ19jbGVhcl90eXBlX2xldmVsID0gWEZJWE5VTSAoY2xlYXJfdHlwZV9sZXZlbCk7 CisKKyAgY29uZmlnX2dhbW1hID0gLTEuMGY7CisgIGlmIChGTE9BVFAgKGdhbW1hKSkKKyAg ICBjb25maWdfZ2FtbWEgPSBYRkxPQVRfREFUQSAoZ2FtbWEpOworICBpZiAoRklYTlVNUCAo Z2FtbWEpKQorICAgIGNvbmZpZ19nYW1tYSA9IFhGSVhOVU0gKGdhbW1hKTsKKworICB3MzJf aW5pdGlhbGl6ZV9kaXJlY3Rfd3JpdGUgKCk7CisKKyAgcmV0dXJuIFFuaWw7Cit9CisKK3Zv aWQKK3N5bXNfb2ZfdzMyZHdyaXRlICh2b2lkKQoreworICBERUZWQVJfQk9PTCAoInczMi1p bmhpYml0LWR3cml0ZSIsIHczMl9pbmhpYml0X2R3cml0ZSwKKwkgICAgICAgZG9jOiAvKiBJ ZiB0LCBkb24ndCB1c2UgRGlyZWN0V3JpdGUuICAqLyk7CisKKyAgZGVmc3ViciAoJlN3MzJf ZHdyaXRlX3JlaW5pdCk7CisgIGRlZnN1YnIgKCZTdzMyX2R3cml0ZV9hdmFpbGFibGUpOwor fQpkaWZmIC0tZ2l0IGEvc3JjL3czMmZvbnQuYyBiL3NyYy93MzJmb250LmMKaW5kZXggZWZi NDJkODAzMzYuLjA1ZTVhMDY3ZjIwIDEwMDY0NAotLS0gYS9zcmMvdzMyZm9udC5jCisrKyBi L3NyYy93MzJmb250LmMKQEAgLTQ1Miw2ICs0NTIsMTAgQEAgdzMyZm9udF90ZXh0X2V4dGVu dHMgKHN0cnVjdCBmb250ICpmb250LCBjb25zdCB1bnNpZ25lZCAqY29kZSwKIAogICBtZW1z ZXQgKG1ldHJpY3MsIDAsIHNpemVvZiAoc3RydWN0IGZvbnRfbWV0cmljcykpOwogCisgIGlm ICh3MzJfdXNlX2RpcmVjdF93cml0ZSAodzMyX2ZvbnQpKQorICAgICAgaWYgKHczMl9kd3Jp dGVfdGV4dF9leHRlbnRzIChmb250LCBjb2RlLCBuZ2x5cGhzLCBtZXRyaWNzKSkKKwlyZXR1 cm47CisKICAgZm9yIChpID0gMCwgZmlyc3QgPSB0cnVlOyBpIDwgbmdseXBoczsgaSsrKQog ICAgIHsKICAgICAgIHN0cnVjdCB3MzJfbWV0cmljX2NhY2hlICpjaGFyX21ldHJpYzsKQEAg LTcwNiwyMiArNzEwLDMxIEBAIHczMmZvbnRfZHJhdyAoc3RydWN0IGdseXBoX3N0cmluZyAq cywgaW50IGZyb20sIGludCB0bywKICAgICAgIGludCBpOwogCiAgICAgICBmb3IgKGkgPSAw OyBpIDwgbGVuOyBpKyspCi0JewotCSAgV0NIQVIgYyA9IHMtPmNoYXIyYltmcm9tICsgaV0g JiAweEZGRkY7Ci0JICBFeHRUZXh0T3V0VyAocy0+aGRjLCB4ICsgaSwgeSwgb3B0aW9ucywg TlVMTCwgJmMsIDEsIE5VTEwpOwotCX0KKwlpZiAoIXczMl91c2VfZGlyZWN0X3dyaXRlICh3 MzJmb250KSB8fAorCSAgICAhdzMyX2R3cml0ZV9kcmF3IChzLT5oZGMsIHgsIHksIHMtPmNo YXIyYiArIGZyb20sIDEsCisJCQkgICAgICBHZXRUZXh0Q29sb3Iocy0+aGRjKSwgcy0+Zm9u dCkpCisJICB7CisJICAgIFdDSEFSIGMgPSBzLT5jaGFyMmJbZnJvbSArIGldICYgMHhGRkZG OworCSAgICBFeHRUZXh0T3V0VyAocy0+aGRjLCB4ICsgaSwgeSwgb3B0aW9ucywgTlVMTCwg JmMsIDEsIE5VTEwpOworCSAgfQogICAgIH0KICAgZWxzZQogICAgIHsKLSAgICAgIC8qIFRo ZSBudW1iZXIgb2YgZ2x5cGhzIGluIGEgZ2x5cGhfc3RyaW5nIGNhbm5vdCBiZSBsYXJnZXIg dGhhbgotCSB0aGUgbWF4aW11bSB2YWx1ZSBvZiB0aGUgJ3VzZWQnIG1lbWJlciBvZiBhIGds eXBoX3Jvdywgc28gd2UKLQkgYXJlIE9LIHVzaW5nIGFsbG9jYSBoZXJlLiAgKi8KLSAgICAg IGVhc3NlcnQgKGxlbiA8PSBTSFJUX01BWCk7Ci0gICAgICBXQ0hBUiAqY2hhcnMgPSBhbGxv Y2EgKGxlbiAqIHNpemVvZiAoV0NIQVIpKTsKLSAgICAgIGludCBqOwotICAgICAgZm9yIChq ID0gMDsgaiA8IGxlbjsgaisrKQotCWNoYXJzW2pdID0gcy0+Y2hhcjJiW2Zyb20gKyBqXSAm IDB4RkZGRjsKLSAgICAgIEV4dFRleHRPdXRXIChzLT5oZGMsIHgsIHksIG9wdGlvbnMsIE5V TEwsIGNoYXJzLCBsZW4sIE5VTEwpOworICAgICAgaWYgKCF3MzJfdXNlX2RpcmVjdF93cml0 ZSAodzMyZm9udCkgfHwKKwkgICF3MzJfZHdyaXRlX2RyYXcgKHMtPmhkYywgeCwgeSwKKwkJ CSAgICBzLT5jaGFyMmIgKyBmcm9tLCBsZW4sIEdldFRleHRDb2xvcihzLT5oZGMpLAorCQkJ ICAgIHMtPmZvbnQpKQorCXsKKwkgIC8qIFRoZSBudW1iZXIgb2YgZ2x5cGhzIGluIGEgZ2x5 cGhfc3RyaW5nIGNhbm5vdCBiZSBsYXJnZXIgdGhhbgorCSAgICAgdGhlIG1heGltdW0gdmFs dWUgb2YgdGhlICd1c2VkJyBtZW1iZXIgb2YgYSBnbHlwaF9yb3csIHNvIHdlCisJICAgICBh cmUgT0sgdXNpbmcgYWxsb2NhIGhlcmUuICAqLworCSAgZWFzc2VydCAobGVuIDw9IFNIUlRf TUFYKTsKKwkgIFdDSEFSICpjaGFycyA9IGFsbG9jYSAobGVuICogc2l6ZW9mIChXQ0hBUikp OworCSAgaW50IGo7CisJICBmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspCisJICAgIGNoYXJz W2pdID0gcy0+Y2hhcjJiW2Zyb20gKyBqXSAmIDB4RkZGRjsKKwkgIEV4dFRleHRPdXRXIChz LT5oZGMsIHgsIHksIG9wdGlvbnMsIE5VTEwsIGNoYXJzLCBsZW4sIE5VTEwpOworCX0KICAg ICB9CiAKICAgLyogUmVzdG9yZSBjbGlwIHJlZ2lvbi4gICovCmRpZmYgLS1naXQgYS9zcmMv dzMyZm9udC5oIGIvc3JjL3czMmZvbnQuaAppbmRleCAzZjc4MGMxZDg2Ni4uNzVlNjNlNGEz MmUgMTAwNjQ0Ci0tLSBhL3NyYy93MzJmb250LmgKKysrIGIvc3JjL3czMmZvbnQuaApAQCAt NTcsNiArNTcsMjYgQEAgI2RlZmluZSBXMzJNRVRSSUNfRkFJTCAyCiAgIEhGT05UIGhmb250 OwogfTsKIAorLyogRXh0ZW5zaW9uIG9mIHczMmZvbnRfaW5mbyB1c2VkIGJ5IFVuaXNjcmli ZSBhbmQgSGFyZkJ1enogYmFja2VuZHMuICAqLworc3RydWN0IHVuaXNjcmliZV9mb250X2lu Zm8KK3sKKyAgc3RydWN0IHczMmZvbnRfaW5mbyB3MzJfZm9udDsKKyAgLyogVGhpcyBpcyB1 c2VkIGJ5IHRoZSBVbmlzY3JpYmUgYmFja2VuZCBhcyBhIHBvaW50ZXIgdG8gdGhlIHNjcmlw dAorICAgICBjYWNoZSwgYW5kIGJ5IHRoZSBIYXJmQnV6eiBiYWNrZW5kIGFzIGEgcG9pbnRl ciB0byBhIGhiX2ZvbnRfdAorICAgICBvYmplY3QuICAqLworICB2b2lkICpjYWNoZTsKKyAg LyogVGhpcyBpcyB1c2VkIGJ5IHRoZSBIYXJmQnV6eiBiYWNrZW5kIHRvIHN0b3JlIHRoZSBm b250IHNjYWxlLiAgKi8KKyAgZG91YmxlIHNjYWxlOworICAvKiBUaGlzIGlzIHVzZWQgYnkg RGlyZWN0V3JpdGUgdG8gc3RvcmUgdGhlIEZvbnRGYWNlIG9iamVjdC4KKyAgICAgRGlyZWN0 V3JpdGUgd29ya3Mgb24gdG9wIG9mIHRoZSBIYXJmQnV6eiBiYWNrZW5kLCBtb2RpZnlpbmcg c29tZQorICAgICBjYWxscy4gIElmIHRoZXJlIGFyZSBwcm9ibGVtcyBtYW5pcHVsYXRpbmcg dGhpcyBmb250LAorICAgICBkd3JpdGVfc2tpcF9mb250IGlzIHNldCB0byB0cnVlLiAgRnV0 dXJlIG9wZXJhdGlvbnMgd2lsbCBub3QgdXNlCisgICAgIERpcmVjdFdyaXRlIGFuZCBmYWxs IGJhY2sgdG8gdGhlIEhhcmZCdXp6IGJhY2tlbmQuICAqLworICB2b2lkICpkd3JpdGVfY2Fj aGU7CisgIGZsb2F0IGR3cml0ZV9mb250X3NpemU7CisgIGJvb2wgZHdyaXRlX3NraXBfZm9u dDsKK307CisKIC8qIE1hY3JvcyBmb3IgZ2V0dGluZyBPUyBzcGVjaWZpYyBpbmZvcm1hdGlv biBmcm9tIGEgZm9udCBzdHJ1Y3QuICAqLwogI2RlZmluZSBGT05UX0hBTkRMRShmKSAoKChz dHJ1Y3QgdzMyZm9udF9pbmZvICopKGYpKS0+aGZvbnQpCiAjZGVmaW5lIEZPTlRfVEVYVE1F VFJJQyhmKSAoKChzdHJ1Y3QgdzMyZm9udF9pbmZvICopKGYpKS0+bWV0cmljcykKQEAgLTg0 LDYgKzEwNCwxNyBAQCAjZGVmaW5lIENBQ0hFX0JMT0NLU0laRSAxMjgKIAogTGlzcF9PYmpl Y3QgaW50ZXJuX2ZvbnRfbmFtZSAoY2hhciAqKTsKIAorLyogRnVuY3Rpb24gcHJvdG90eXBl cyBmb3IgRGlyZWN0V3JpdGUuICAqLwordm9pZCB3MzJfaW5pdGlhbGl6ZV9kaXJlY3Rfd3Jp dGUgKHZvaWQpOworYm9vbCB3MzJfdXNlX2RpcmVjdF93cml0ZSAoc3RydWN0IHczMmZvbnRf aW5mbyAqdzMyZm9udCk7Citib29sIHczMl9kd3JpdGVfZHJhdyAoSERDIGhkYywgaW50IHgs IGludCB5LCB1bnNpZ25lZCAqZ2x5cGhzLCBpbnQgbGVuLAorCQkgICAgICBDT0xPUlJFRiBj b2xvciwgc3RydWN0IGZvbnQgKmZvbnQgKTsKK2Jvb2wgdzMyX2R3cml0ZV90ZXh0X2V4dGVu dHMgKHN0cnVjdCBmb250ICpmb250LCBjb25zdCB1bnNpZ25lZCAqY29kZSwKKwkJCSAgICAg IGludCBuZ2x5cGhzLCBzdHJ1Y3QgZm9udF9tZXRyaWNzICptZXRyaWNzKTsKK3Vuc2lnbmVk IHczMl9kd3JpdGVfZW5jb2RlX2NoYXIgKHN0cnVjdCBmb250ICpmb250LCBpbnQgYyk7Cit2 b2lkIHczMl9kd3JpdGVfZnJlZV9jYWNoZWRfZmFjZSh2b2lkICpjYWNoZSk7Cit2b2lkIHN5 bXNfb2ZfdzMyZHdyaXRlICh2b2lkKTsKKwogZXh0ZXJuIHZvaWQgZ2xvYmFsc19vZl93MzJm b250ICh2b2lkKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdzMydW5pc2NyaWJlLmMg Yi9zcmMvdzMydW5pc2NyaWJlLmMKaW5kZXggYjc3YmY1NmI4Y2YuLjAxNTIxNGIxZTM5IDEw MDY0NAotLS0gYS9zcmMvdzMydW5pc2NyaWJlLmMKKysrIGIvc3JjL3czMnVuaXNjcmliZS5j CkBAIC00NCwxOCArNDQsNiBAQCAjZGVmaW5lIF9XSU4zMl9XSU5OVCAweDA2MDAKICNpbmNs dWRlICJwZHVtcGVyLmgiCiAjaW5jbHVkZSAidzMyY29tbW9uLmgiCiAKLS8qIEV4dGVuc2lv biBvZiB3MzJmb250X2luZm8gdXNlZCBieSBVbmlzY3JpYmUgYW5kIEhhcmZCdXp6IGJhY2tl bmRzLiAgKi8KLXN0cnVjdCB1bmlzY3JpYmVfZm9udF9pbmZvCi17Ci0gIHN0cnVjdCB3MzJm b250X2luZm8gdzMyX2ZvbnQ7Ci0gIC8qIFRoaXMgaXMgdXNlZCBieSB0aGUgVW5pc2NyaWJl IGJhY2tlbmQgYXMgYSBwb2ludGVyIHRvIHRoZSBzY3JpcHQKLSAgICAgY2FjaGUsIGFuZCBi eSB0aGUgSGFyZkJ1enogYmFja2VuZCBhcyBhIHBvaW50ZXIgdG8gYSBoYl9mb250X3QKLSAg ICAgb2JqZWN0LiAgKi8KLSAgdm9pZCAqY2FjaGU7Ci0gIC8qIFRoaXMgaXMgdXNlZCBieSB0 aGUgSGFyZkJ1enogYmFja2VuZCB0byBzdG9yZSB0aGUgZm9udCBzY2FsZS4gICovCi0gIGRv dWJsZSBzY2FsZTsKLX07Ci0KIGludCB1bmlzY3JpYmVfYXZhaWxhYmxlID0gMDsKIAogLyog RW51bUZvbnRGYW1pbGllc0V4IGNhbGxiYWNrLiAgKi8KQEAgLTIwMCw2ICsxODgsOSBAQCB1 bmlzY3JpYmVfb3BlbiAoc3RydWN0IGZyYW1lICpmLCBMaXNwX09iamVjdCBmb250X2VudGl0 eSwgaW50IHBpeGVsX3NpemUpCiAKICAgLyogSW5pdGlhbGl6ZSB0aGUgY2FjaGUgZm9yIHRo aXMgZm9udC4gICovCiAgIHVuaXNjcmliZV9mb250LT5jYWNoZSA9IE5VTEw7CisgIHVuaXNj cmliZV9mb250LT5kd3JpdGVfY2FjaGUgPSBOVUxMOworCisgIHVuaXNjcmliZV9mb250LT5k d3JpdGVfc2tpcF9mb250ID0gZmFsc2U7CiAKICAgLyogVW5pc2NyaWJlIGFuZCBIYXJmQnV6 eiBiYWNrZW5kcyB1c2UgZ2x5cGggaW5kaWNlcy4gICovCiAgIHVuaXNjcmliZV9mb250LT53 MzJfZm9udC5nbHlwaF9pZHggPSBFVE9fR0xZUEhfSU5ERVg7CkBAIC0yMjEsNiArMjEyLDcg QEAgdW5pc2NyaWJlX2Nsb3NlIChzdHJ1Y3QgZm9udCAqZm9udCkKICAgICA9IChzdHJ1Y3Qg dW5pc2NyaWJlX2ZvbnRfaW5mbyAqKSBmb250OwogCiAjaWZkZWYgSEFWRV9IQVJGQlVaWgor ICB3MzJfZHdyaXRlX2ZyZWVfY2FjaGVkX2ZhY2UgKHVuaXNjcmliZV9mb250LT5kd3JpdGVf Y2FjaGUpOwogICBpZiAodW5pc2NyaWJlX2ZvbnQtPnczMl9mb250LmZvbnQuZHJpdmVyID09 ICZoYXJmYnV6el9mb250X2RyaXZlcgogICAgICAgJiYgdW5pc2NyaWJlX2ZvbnQtPmNhY2hl KQogICAgIGhiX2ZvbnRfZGVzdHJveSAoKGhiX2ZvbnRfdCAqKSB1bmlzY3JpYmVfZm9udC0+ Y2FjaGUpOwpAQCAtMTM3Miw2ICsxMzY0LDE3IEBAIHczMmhiX2VuY29kZV9jaGFyIChzdHJ1 Y3QgZm9udCAqZm9udCwgaW50IGMpCiAgIHN0cnVjdCB1bmlzY3JpYmVfZm9udF9pbmZvICp1 bmlzY3JpYmVfZm9udAogICAgID0gKHN0cnVjdCB1bmlzY3JpYmVfZm9udF9pbmZvICopIGZv bnQ7CiAgIGVhc3NlcnQgKHVuaXNjcmliZV9mb250LT53MzJfZm9udC5mb250LmRyaXZlciA9 PSAmaGFyZmJ1enpfZm9udF9kcml2ZXIpOworCisgIGlmICh3MzJfdXNlX2RpcmVjdF93cml0 ZSAoJnVuaXNjcmliZV9mb250LT53MzJfZm9udCkpCisgICAgeworICAgICAgdW5zaWduZWQg ZW5jb2RlZCA9IHczMl9kd3JpdGVfZW5jb2RlX2NoYXIgKGZvbnQsIGMpOworCisgICAgICAv KiBUaGUgY2FsbCB0byB3MzJfZHdyaXRlX2VuY29kZV9jaGFyIG1heSBmYWlsLCBkaXNhYmxp bmcKKwkgRGlyZWN0V3JpdGUgZm9yIHRoaXMgZm9udC4gIFNvIGNoZWNrIGFnYWluLiAgKi8K KyAgICAgIGlmICh3MzJfdXNlX2RpcmVjdF93cml0ZSAoJnVuaXNjcmliZV9mb250LT53MzJf Zm9udCkpCisJcmV0dXJuIGVuY29kZWQ7CisgICAgfQorCiAgIGhiX2ZvbnRfdCAqaGJfZm9u dCA9IHVuaXNjcmliZV9mb250LT5jYWNoZTsKIAogICAvKiBGaXJzdCB0aW1lIHdlIHVzZSB0 aGlzIGZvbnQgd2l0aCBIYXJmQnV6eiwgY3JlYXRlIHRoZSBoYl9mb250X3QKQEAgLTE1MTAs NiArMTUxMyw3IEBAIHczMmhiX2dldF92YXJpYXRpb25fZ2x5cGhzIChzdHJ1Y3QgZm9udCAq Zm9udCwgaW50IGMsIHVuc2lnbmVkIHZhcmlhdGlvbnNbMjU2XSkKIHZvaWQKIHN5bXNfb2Zf dzMydW5pc2NyaWJlICh2b2lkKQogeworICBzeW1zX29mX3czMmR3cml0ZSAoKTsKICAgcGR1 bXBlcl9kb19ub3dfYW5kX2FmdGVyX2xvYWQgKHN5bXNfb2ZfdzMydW5pc2NyaWJlX2Zvcl9w ZHVtcGVyKTsKIH0KIApAQCAtMTYyNCw1ICsxNjI4LDggQEAgc3ltc19vZl93MzJ1bmlzY3Jp YmVfZm9yX3BkdW1wZXIgKHZvaWQpCiAgIGhhcmZidXp6X2ZvbnRfZHJpdmVyLmNvbWJpbmlu Z19jYXBhYmlsaXR5ID0gaGJmb250X2NvbWJpbmluZ19jYXBhYmlsaXR5OwogICBoYXJmYnV6 el9mb250X2RyaXZlci5iZWdpbl9oYl9mb250ID0gdzMyaGJfYmVnaW5fZm9udDsKICAgcmVn aXN0ZXJfZm9udF9kcml2ZXIgKCZoYXJmYnV6el9mb250X2RyaXZlciwgTlVMTCk7CisKKyAg dzMyX2luaXRpYWxpemVfZGlyZWN0X3dyaXRlICgpOworCiAjZW5kaWYJLyogSEFWRV9IQVJG QlVaWiAqLwogfQotLSAKMi4zNS4xLndpbmRvd3MuMgoK --------------MZuVgMQPS9O6Wp40XzaMLlNu-- From debbugs-submit-bounces@debbugs.gnu.org Fri Oct 25 03:26:53 2024 Received: (at 73730) by debbugs.gnu.org; 25 Oct 2024 07:26:53 +0000 Received: from localhost ([127.0.0.1]:37102 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t4Eii-0004Cj-Mf for submit@debbugs.gnu.org; Fri, 25 Oct 2024 03:26:53 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50482) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t4Eif-0004CT-2c for 73730@debbugs.gnu.org; Fri, 25 Oct 2024 03:26:50 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1t4Ei3-0004I0-UF; Fri, 25 Oct 2024 03:26:11 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=MIME-version:References:Subject:In-Reply-To:To:From: Date; bh=92j7OMspAh5uTjvxNuqg5nIytB8x+8GeIgkUtV7+fNE=; b=HfO2kzlwXmtlTgbmed16 13OJK8kFH2tJ6JQRjgeAYAN/Bdf8FJum1ClRYhfLsOdXnUaigoyUqzRYIWHytkoAYA4wYqFcnVXr9 yLD7vF8RMuZXKOhAtTGrgZApWf5a9wcIWFz00yAKA9xRWAxc8uHrtWs33Q+H9a/G8iz3dM0cdVIaY onSXcwduAHo3v8frfn5MJFIw+R+S5Mbx+VIFVdgepg2oU7KqaLfTiwDN1FvHWGNH5WS2p8DXBq3Jr MPjNsFDoJMXcvJFs3lcSwBEnA79iJPLCKwnZoKT6N0+AttUEU6zM9XKlf2wR4cDl0KUYE2CiPuaMK PvxmjAxdzBobsA==; Date: Fri, 25 Oct 2024 10:26:10 +0300 Message-Id: <864j50d4od.fsf@gnu.org> From: Eli Zaretskii To: Cecilio Pardo In-Reply-To: <68b9d35b-b8e1-4830-8ad9-8c33258e0980@imayhem.com> (message from Cecilio Pardo on Thu, 24 Oct 2024 22:19:06 +0200) Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> <86bjzjp7vv.fsf@gnu.org> <80dc50bd-b2d4-4d21-ad38-322412588b3b@imayhem.com> <86o73ej2u7.fsf@gnu.org> <8e5ffc88-dda8-4b4d-a133-f80029825347@imayhem.com> <86plnrdtm1.fsf@gnu.org> <86bjzaemev.fsf@gnu.org> <68b9d35b-b8e1-4830-8ad9-8c33258e0980@imayhem.com> MIME-version: 1.0 Content-type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > Date: Thu, 24 Oct 2024 22:19:06 +0200 > From: Cecilio Pardo > > New version attached. > > - Added comments > - Use SAFE_ALLOCA instead of alloca. > - Added two lisp functions: > w32-dwrite-available to find out is dwrite is working > w32-dwrite-reinit to reinitialize dwrite, optionally > changing render parameters (gamma, cleartype level, contrast). > Can go back to defaults passing nil. > - Updated NEWS and changelog. Thanks, I will review this shortly. Meanwhile, could you please look at how Emacs with this patch displays some complex Emoji sequences? Some of them look incorrect to me. For example, this sequence from admin/unidata/emoji-zwj-sequences.txt: 1F469 200D 1F469 200D 1F467 200D 1F466 ; RGI_Emoji_ZWJ_Sequence ; family: woman, woman, girl, boy # E2.0 [1] (๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ) when displayed using Segoe UI Emoji, is shown with the "boy" part overlapping the closing parenthesis, which looks incorrect to me. "C-u C-x =" claims all of the codepoints of the sequence were composed into a single grapheme cluster, but it doesn't look like that on display, and the cursor doesn't include the "boy" part. From debbugs-submit-bounces@debbugs.gnu.org Fri Oct 25 06:18:22 2024 Received: (at 73730) by debbugs.gnu.org; 25 Oct 2024 10:18:22 +0000 Received: from localhost ([127.0.0.1]:37417 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t4HOg-0003kC-3z for submit@debbugs.gnu.org; Fri, 25 Oct 2024 06:18:22 -0400 Received: from mail.imayhem.com ([82.223.54.191]:44355 helo=zealous-pike.82-223-54-191.plesk.page) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t4HOa-0003jr-Lc for 73730@debbugs.gnu.org; Fri, 25 Oct 2024 06:18:20 -0400 Received: from [192.168.68.104] (111.red-88-21-7.staticip.rima-tde.net [88.21.7.111]) by zealous-pike.82-223-54-191.plesk.page (Postfix) with ESMTPSA id 8660680170; Fri, 25 Oct 2024 10:17:38 +0000 (UTC) Authentication-Results: zealous-pike.82-223-54-191.plesk.page; spf=pass (sender IP is 88.21.7.111) smtp.mailfrom=cpardo@imayhem.com smtp.helo=[192.168.68.104] Received-SPF: pass (zealous-pike.82-223-54-191.plesk.page: connection is authenticated) Message-ID: <78477402-2af1-4da1-bf02-11d1b0e4b4a0@imayhem.com> Date: Fri, 25 Oct 2024 12:17:37 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows To: Eli Zaretskii References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> <86bjzjp7vv.fsf@gnu.org> <80dc50bd-b2d4-4d21-ad38-322412588b3b@imayhem.com> <86o73ej2u7.fsf@gnu.org> <8e5ffc88-dda8-4b4d-a133-f80029825347@imayhem.com> <86plnrdtm1.fsf@gnu.org> <86bjzaemev.fsf@gnu.org> <68b9d35b-b8e1-4830-8ad9-8c33258e0980@imayhem.com> <864j50d4od.fsf@gnu.org> Content-Language: es-ES From: Cecilio Pardo In-Reply-To: <864j50d4od.fsf@gnu.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) On 25/10/2024 9:26, Eli Zaretskii wrote: > Thanks, I will review this shortly. Meanwhile, could you please look > at how Emacs with this patch displays some complex Emoji sequences? > Some of them look incorrect to me. For example, this sequence from > admin/unidata/emoji-zwj-sequences.txt: > > 1F469 200D 1F469 200D 1F467 200D 1F466 ; RGI_Emoji_ZWJ_Sequence ; family: woman, woman, girl, boy # E2.0 [1] (๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ) > > when displayed using Segoe UI Emoji, is shown with the "boy" part > overlapping the closing parenthesis, which looks incorrect to me. > "C-u C-x =" claims all of the codepoints of the sequence were composed > into a single grapheme cluster, but it doesn't look like that on > display, and the cursor doesn't include the "boy" part. I dont's see that, but I do see that the individual glyphs are truncated on the left side, even when removing color rendering. Do you see it? I will investigate this first, in case the defects are related. From debbugs-submit-bounces@debbugs.gnu.org Fri Oct 25 07:52:38 2024 Received: (at 73730-done) by debbugs.gnu.org; 25 Oct 2024 11:52:38 +0000 Received: from localhost ([127.0.0.1]:37586 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t4Irt-0008Bs-Lk for submit@debbugs.gnu.org; Fri, 25 Oct 2024 07:52:37 -0400 Received: from eggs.gnu.org ([209.51.188.92]:54134) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t4Irr-0008Bd-Hr for 73730-done@debbugs.gnu.org; Fri, 25 Oct 2024 07:52:36 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1t4IrG-0003UO-5n; Fri, 25 Oct 2024 07:51:58 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=74yk/BbOKgw5PZmdF6AWtwVKF7sug+ssrSEiWJxmOW0=; b=AyB9hLxA3y8l mkHGQgLAQUV5iqWN2xfHccw50Ft8F0WTwuvNEGZfK8kCegL3egb1BJNHgzmp6eFTg8O9IfvFRAx+q Bj+LKIJeAUe82Rroab/TH0ECP3W9Y5dpOu3+MX29/tvsLTpJIjSPWIsMfxPsbMACRMRN+s7Wo87Iz rsWg8ncNF7xbTT4bWNHKJ7szo3uSqdqea9YTS2inalpsOqLHwoSZFbIySetMSRfQTNyc3YYBzkYrT zWAHhu+HM61swlFuT9FcSsNhZiDxwZ+WT7EkX1+4diu1Fbm+mxfktvpSNcp8F/qyB3jOxUo2C6Nvt GOoPGZ0BmcI+YHmK4iv6Lw==; Date: Fri, 25 Oct 2024 14:51:53 +0300 Message-Id: <86o738bdt2.fsf@gnu.org> From: Eli Zaretskii To: Cecilio Pardo In-Reply-To: <68b9d35b-b8e1-4830-8ad9-8c33258e0980@imayhem.com> (message from Cecilio Pardo on Thu, 24 Oct 2024 22:19:06 +0200) Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> <86bjzjp7vv.fsf@gnu.org> <80dc50bd-b2d4-4d21-ad38-322412588b3b@imayhem.com> <86o73ej2u7.fsf@gnu.org> <8e5ffc88-dda8-4b4d-a133-f80029825347@imayhem.com> <86plnrdtm1.fsf@gnu.org> <86bjzaemev.fsf@gnu.org> <68b9d35b-b8e1-4830-8ad9-8c33258e0980@imayhem.com> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 73730-done Cc: 73730-done@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > Date: Thu, 24 Oct 2024 22:19:06 +0200 > From: Cecilio Pardo > > New version attached. > > - Added comments > - Use SAFE_ALLOCA instead of alloca. > - Added two lisp functions: > w32-dwrite-available to find out is dwrite is working > w32-dwrite-reinit to reinitialize dwrite, optionally > changing render parameters (gamma, cleartype level, contrast). > Can go back to defaults passing nil. > - Updated NEWS and changelog. Thanks, installed on the master branch, and closing the bug. I also installed minor followup changes: I removed the eassert from this fragment: /* IDWriteFactory2 is only available on Windows 8.1 and later. Without this, we can't use color fonts. So we disable DirectWrite if it is not available. */ hr = dwrite_factory->lpVtbl->QueryInterface (dwrite_factory, &IID_IDWriteFactory2, (void **) &dwrite_factory2); if (FAILED (hr)) { DebPrint (("DirectWrite HRESULT failed: (%d) QueryInterface IDWriteFactory2\n", hr)); RELEASE_COM (dwrite_factory); FreeLibrary (direct_write); return; } That's because otherwise the debug build of Emacs will abort on Windows 7 and 8.0, which is not what we want. Also, I've added some information about the default values of the parameters to the doc string of w32-dwrite-reinit; please see if I made some mistakes there, as the default values don't seem to be documented anywhere I could see. From debbugs-submit-bounces@debbugs.gnu.org Fri Oct 25 08:01:44 2024 Received: (at 73730) by debbugs.gnu.org; 25 Oct 2024 12:01:44 +0000 Received: from localhost ([127.0.0.1]:37599 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t4J0h-0000Cc-Np for submit@debbugs.gnu.org; Fri, 25 Oct 2024 08:01:44 -0400 Received: from eggs.gnu.org ([209.51.188.92]:40510) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t4J0f-0000CN-Ld for 73730@debbugs.gnu.org; Fri, 25 Oct 2024 08:01:42 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1t4J02-0004iA-2h; Fri, 25 Oct 2024 08:01:03 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=MIME-version:References:Subject:In-Reply-To:To:From: Date; bh=imum+W4YYzoGBajy4jjLd2H9kW5bJRBW3qG4lJEUmVw=; b=G2eCxdBSx9pAXqNOptRa Cl7oX0lArwiR+HxQBAbWSM7uFU3qsHrsy6MnUnAleWoY7vPjmXEpKeTv+WX6B4VVM+QyC3toP86gg 3RZpZYoO8M0SnFKm0s31ec6eL0RFTlQa3cuMoJzvbWLoZ/zv3p/CIEK/VYecBOFbarbN+Vn8dgUAb YgZbdbknTMOBPkukCeVlGfRGJsSFTsiOexbLf1XzboCcei8Os/HQ8ApKgICBAFAGl2nQAfpLthTby t4vAUT7IeGUEAp7umPSCFRVP8HnW4MoKpVNByogtPIwzESfdSMTqHkMVSQTR1iQ0hMmTGLMlg2Usk yTJmlkOkHw/jDw==; Date: Fri, 25 Oct 2024 15:00:28 +0300 Message-Id: <86msisbder.fsf@gnu.org> From: Eli Zaretskii To: Cecilio Pardo In-Reply-To: <78477402-2af1-4da1-bf02-11d1b0e4b4a0@imayhem.com> (message from Cecilio Pardo on Fri, 25 Oct 2024 12:17:37 +0200) Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> <86bjzjp7vv.fsf@gnu.org> <80dc50bd-b2d4-4d21-ad38-322412588b3b@imayhem.com> <86o73ej2u7.fsf@gnu.org> <8e5ffc88-dda8-4b4d-a133-f80029825347@imayhem.com> <86plnrdtm1.fsf@gnu.org> <86bjzaemev.fsf@gnu.org> <68b9d35b-b8e1-4830-8ad9-8c33258e0980@imayhem.com> <864j50d4od.fsf@gnu.org> <78477402-2af1-4da1-bf02-11d1b0e4b4a0@imayhem.com> MIME-version: 1.0 Content-type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > Date: Fri, 25 Oct 2024 12:17:37 +0200 > Cc: 73730@debbugs.gnu.org > From: Cecilio Pardo > > On 25/10/2024 9:26, Eli Zaretskii wrote: > > > Thanks, I will review this shortly. Meanwhile, could you please look > > at how Emacs with this patch displays some complex Emoji sequences? > > Some of them look incorrect to me. For example, this sequence from > > admin/unidata/emoji-zwj-sequences.txt: > > > > 1F469 200D 1F469 200D 1F467 200D 1F466 ; RGI_Emoji_ZWJ_Sequence ; family: woman, woman, girl, boy # E2.0 [1] (๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ) > > > > when displayed using Segoe UI Emoji, is shown with the "boy" part > > overlapping the closing parenthesis, which looks incorrect to me. > > "C-u C-x =" claims all of the codepoints of the sequence were composed > > into a single grapheme cluster, but it doesn't look like that on > > display, and the cursor doesn't include the "boy" part. > > I dont's see that, but I do see that the individual glyphs are truncated > on the left side, even when removing color rendering. Do you see > it? Yes. > I will investigate this first, in case the defects are related. Thanks. From debbugs-submit-bounces@debbugs.gnu.org Fri Oct 25 09:44:43 2024 Received: (at 73730) by debbugs.gnu.org; 25 Oct 2024 13:44:44 +0000 Received: from localhost ([127.0.0.1]:37721 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t4KcN-00053i-CX for submit@debbugs.gnu.org; Fri, 25 Oct 2024 09:44:43 -0400 Received: from mail.imayhem.com ([82.223.54.191]:53955 helo=zealous-pike.82-223-54-191.plesk.page) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t4KcH-00053O-2s for 73730@debbugs.gnu.org; Fri, 25 Oct 2024 09:44:41 -0400 Received: from [192.168.68.104] (111.red-88-21-7.staticip.rima-tde.net [88.21.7.111]) by zealous-pike.82-223-54-191.plesk.page (Postfix) with ESMTPSA id 3909280170; Fri, 25 Oct 2024 13:43:56 +0000 (UTC) Authentication-Results: zealous-pike.82-223-54-191.plesk.page; spf=pass (sender IP is 88.21.7.111) smtp.mailfrom=cpardo@imayhem.com smtp.helo=[192.168.68.104] Received-SPF: pass (zealous-pike.82-223-54-191.plesk.page: connection is authenticated) Message-ID: <7ac33c54-9e81-40d9-a208-898611b53e62@imayhem.com> Date: Fri, 25 Oct 2024 15:43:54 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows To: 73730@debbugs.gnu.org, eliz@gnu.org References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> <86bjzjp7vv.fsf@gnu.org> <80dc50bd-b2d4-4d21-ad38-322412588b3b@imayhem.com> <86o73ej2u7.fsf@gnu.org> <8e5ffc88-dda8-4b4d-a133-f80029825347@imayhem.com> <86plnrdtm1.fsf@gnu.org> <86bjzaemev.fsf@gnu.org> <68b9d35b-b8e1-4830-8ad9-8c33258e0980@imayhem.com> <86o738bdt2.fsf@gnu.org> Content-Language: es-ES From: Cecilio Pardo In-Reply-To: <86o738bdt2.fsf@gnu.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 73730 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) > Also, I've added some information about the default values of the > parameters to the doc string of w32-dwrite-reinit; please see if I > made some mistakes there, as the default values don't seem to be > documented anywhere I could see. LGTM. Thanks. From debbugs-submit-bounces@debbugs.gnu.org Sat Oct 26 16:14:40 2024 Received: (at 73730) by debbugs.gnu.org; 26 Oct 2024 20:14:40 +0000 Received: from localhost ([127.0.0.1]:42688 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t4nBH-00088o-Ng for submit@debbugs.gnu.org; Sat, 26 Oct 2024 16:14:40 -0400 Received: from mail.imayhem.com ([82.223.54.191]:59337 helo=zealous-pike.82-223-54-191.plesk.page) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t4nBG-00088a-OS for 73730@debbugs.gnu.org; Sat, 26 Oct 2024 16:14:39 -0400 Received: from [192.168.68.104] (111.red-88-21-7.staticip.rima-tde.net [88.21.7.111]) by zealous-pike.82-223-54-191.plesk.page (Postfix) with ESMTPSA id 9E3BD80100; Sat, 26 Oct 2024 20:13:58 +0000 (UTC) Authentication-Results: zealous-pike.82-223-54-191.plesk.page; spf=pass (sender IP is 88.21.7.111) smtp.mailfrom=cpardo@imayhem.com smtp.helo=[192.168.68.104] Received-SPF: pass (zealous-pike.82-223-54-191.plesk.page: connection is authenticated) Content-Type: multipart/mixed; boundary="------------LFkLMBThjXP4z7rLaGhIyG84" Message-ID: Date: Sat, 26 Oct 2024 22:13:57 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird From: Cecilio Pardo Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows To: Eli Zaretskii References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> <86bjzjp7vv.fsf@gnu.org> <80dc50bd-b2d4-4d21-ad38-322412588b3b@imayhem.com> <86o73ej2u7.fsf@gnu.org> <8e5ffc88-dda8-4b4d-a133-f80029825347@imayhem.com> <86plnrdtm1.fsf@gnu.org> <86bjzaemev.fsf@gnu.org> <68b9d35b-b8e1-4830-8ad9-8c33258e0980@imayhem.com> <864j50d4od.fsf@gnu.org> <78477402-2af1-4da1-bf02-11d1b0e4b4a0@imayhem.com> <86msisbder.fsf@gnu.org> Content-Language: es-ES In-Reply-To: <86msisbder.fsf@gnu.org> X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) This is a multi-part message in MIME format. --------------LFkLMBThjXP4z7rLaGhIyG84 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit >>> Thanks, I will review this shortly. Meanwhile, could you please look >>> at how Emacs with this patch displays some complex Emoji sequences? >>> Some of them look incorrect to me. For example, this sequence from >>> admin/unidata/emoji-zwj-sequences.txt: >>> >>> 1F469 200D 1F469 200D 1F467 200D 1F466 ; RGI_Emoji_ZWJ_Sequence ; family: woman, woman, girl, boy # E2.0 [1] (๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ) >>> >>> when displayed using Segoe UI Emoji, is shown with the "boy" part >>> overlapping the closing parenthesis, which looks incorrect to me. >>> "C-u C-x =" claims all of the codepoints of the sequence were composed >>> into a single grapheme cluster, but it doesn't look like that on >>> display, and the cursor doesn't include the "boy" part. >> >> I dont's see that, but I do see that the individual glyphs are truncated >> on the left side, even when removing color rendering. Do you see >> it? > > Yes. > >> I will investigate this first, in case the defects are related. This patch fixes the left side glyph truncation, which happens when glyphs have negative left bearing. About the problem you reported, I can't reproduce when building for 64bit. It does show when building with mingw32 for 32bit. It also shows when building version 30.0.92. Maybe is the Harfbuzz version? I have 2.4.0 for this build. --------------LFkLMBThjXP4z7rLaGhIyG84 Content-Type: text/plain; charset=UTF-8; name="0001-Fix-problem-with-DirectWrite-MS-Windows.patch" Content-Disposition: attachment; filename="0001-Fix-problem-with-DirectWrite-MS-Windows.patch" Content-Transfer-Encoding: base64 RnJvbSA0OWUzNTM0OTAxYjJiN2I4MzJlYzE1OTc3ZDc4OTYyYTYyNDE3Nzg5IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBDZWNpbGlvIFBhcmRvIDxjcGFyZG9AaW1heWhlbS5j b20+CkRhdGU6IFNhdCwgMjYgT2N0IDIwMjQgMTc6NTE6MjIgKzAyMDAKU3ViamVjdDogW1BB VENIXSA7IEZpeCBwcm9ibGVtIHdpdGggRGlyZWN0V3JpdGUgKE1TLVdpbmRvd3MpCgpOZWdh dGl2ZSBsYmVhcmluZ3Mgd2VyZSBub3QgaGFuZGxlZC4KCiogc3JjL3czMmR3cml0ZS5jICh3 MzJfZHdyaXRlX2RyYXcpOiBNb2RpZmllZCB0byBoYW5kbGUgbmVnYXRpdmUKbGJlYXJpbmcu Ci0tLQogc3JjL3czMmR3cml0ZS5jIHwgMTIgKysrKysrKy0tLS0tCiAxIGZpbGUgY2hhbmdl ZCwgNyBpbnNlcnRpb25zKCspLCA1IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy93 MzJkd3JpdGUuYyBiL3NyYy93MzJkd3JpdGUuYwppbmRleCBlY2MzM2FmNWYzZi4uNDViZTVi NWJlZmYgMTAwNjQ0Ci0tLSBhL3NyYy93MzJkd3JpdGUuYworKysgYi9zcmMvdzMyZHdyaXRl LmMKQEAgLTg5NSw3ICs4OTUsOSBAQCB3MzJfZHdyaXRlX2RyYXcgKEhEQyBoZGMsIGludCB4 LCBpbnQgeSwgdW5zaWduZWQgKmdseXBocywgaW50IGxlbiwKICAgICAgIHJldHVybiBmYWxz ZTsKICAgICB9CiAKLSAgaW50IGJpdG1hcF93aWR0aCA9IG1ldHJpY3Mud2lkdGggKyBtZXRy aWNzLnJiZWFyaW5nOworICBpbnQgbGVmdF9tYXJnaW4gPSBtZXRyaWNzLmxiZWFyaW5nIDwg MCA/IC1tZXRyaWNzLmxiZWFyaW5nIDogMDsKKworICBpbnQgYml0bWFwX3dpZHRoID0gbGVm dF9tYXJnaW4gKyBtZXRyaWNzLndpZHRoICsgbWV0cmljcy5yYmVhcmluZzsKICAgaW50IGJp dG1hcF9oZWlnaHQgPSBmb250LT5hc2NlbnQgKyBmb250LT5kZXNjZW50OwogCiAgIC8qIFdl IG5ldmVyIHJlbGVhc2UgdGhpcywgZ2V0X2JpdG1hcF9yZW5kZXJfdGFyZ2V0IHJldXNlcyBp dC4gICovCkBAIC05MTQsNyArOTE2LDcgQEAgdzMyX2R3cml0ZV9kcmF3IChIREMgaGRjLCBp bnQgeCwgaW50IHksIHVuc2lnbmVkICpnbHlwaHMsIGludCBsZW4sCiAgICAgPSBiaXRtYXBf cmVuZGVyX3RhcmdldC0+bHBWdGJsLT5HZXRNZW1vcnlEQyAoYml0bWFwX3JlbmRlcl90YXJn ZXQpOwogCiAgIC8qIENvcHkgdGhlIGJhY2tncm91bmQgcGl4ZWwgdG8gdGhlIHJlbmRlciB0 YXJnZXQgYml0bWFwLiAgKi8KLSAgQml0Qmx0ICh0ZXh0X2RjLCAwLCAwLCBiaXRtYXBfd2lk dGgsIGJpdG1hcF9oZWlnaHQsIGhkYywgeCwgeSwgU1JDQ09QWSk7CisgIEJpdEJsdCAodGV4 dF9kYywgMCwgMCwgYml0bWFwX3dpZHRoLCBiaXRtYXBfaGVpZ2h0LCBoZGMsIHggLSBsZWZ0 X21hcmdpbiwgeSwgU1JDQ09QWSk7CiAKICAgVUlOVDE2ICppbmRpY2VzID0gU0FGRV9BTExP Q0EgKGxlbiAqIHNpemVvZiAoVUlOVDE2KSk7CiAKQEAgLTk0OCw3ICs5NTAsNyBAQCB3MzJf ZHdyaXRlX2RyYXcgKEhEQyBoZGMsIGludCB4LCBpbnQgeSwgdW5zaWduZWQgKmdseXBocywg aW50IGxlbiwKICAgSURXcml0ZUNvbG9yR2x5cGhSdW5FbnVtZXJhdG9yICpsYXllcnM7CiAg IC8qIFRoaXMgY2FsbCB3aWxsIHRlbGwgdXMgaWYgd2UgaGF2ZSB0byBoYW5kbGUgYW55IGNv bG9yIGdseXBocy4gICovCiAgIGhyID0gZHdyaXRlX2ZhY3RvcnkyLT5scFZ0YmwtPlRyYW5z bGF0ZUNvbG9yR2x5cGhSdW4gKGR3cml0ZV9mYWN0b3J5MiwKLQkJCQkJCQkwLCBmb250LT5h c2NlbnQsCisJCQkJCQkJbGVmdF9tYXJnaW4sIGZvbnQtPmFzY2VudCwKIAkJCQkJCQkmZ2x5 cGhfcnVuLAogCQkJCQkJCU5VTEwsCiAJCQkJCQkJTUVBU1VSSU5HX01PREUsCkBAIC05NTks NyArOTYxLDcgQEAgdzMyX2R3cml0ZV9kcmF3IChIREMgaGRjLCBpbnQgeCwgaW50IHksIHVu c2lnbmVkICpnbHlwaHMsIGludCBsZW4sCiAgIC8qIE5vIGNvbG9yLiAgSnVzdCBkcmF3IHRo ZSBHbHlwaFJ1bi4gICovCiAgIGlmIChociA9PSBEV1JJVEVfRV9OT0NPTE9SKQogICAgIGJp dG1hcF9yZW5kZXJfdGFyZ2V0LT5scFZ0YmwtPkRyYXdHbHlwaFJ1biAoYml0bWFwX3JlbmRl cl90YXJnZXQsCi0JCQkJCQkwLCBmb250LT5hc2NlbnQsCisJCQkJCQlsZWZ0X21hcmdpbiwg Zm9udC0+YXNjZW50LAogCQkJCQkJTUVBU1VSSU5HX01PREUsCiAJCQkJCQkmZ2x5cGhfcnVu LAogCQkJCQkJcmVuZGVyaW5nX3BhcmFtcywKQEAgLTEwMjQsNyArMTAyNiw3IEBAIHczMl9k d3JpdGVfZHJhdyAoSERDIGhkYywgaW50IHgsIGludCB5LCB1bnNpZ25lZCAqZ2x5cGhzLCBp bnQgbGVuLAogICAgIH0KIAogICAvKiBGaW5hbGx5LCBjb3B5IHRoZSByZW5kZXJlZCB0ZXh0 IGJhY2sgdG8gdGhlIG9yaWdpbmFsIERDLiAgKi8KLSAgQml0Qmx0IChoZGMsIHgsIHksIGJp dG1hcF93aWR0aCwgYml0bWFwX2hlaWdodCwgdGV4dF9kYywgMCwgMCwgU1JDQ09QWSk7Cisg IEJpdEJsdCAoaGRjLCB4IC0gbGVmdF9tYXJnaW4sIHksIGJpdG1hcF93aWR0aCwgYml0bWFw X2hlaWdodCwgdGV4dF9kYywgMCwgMCwgU1JDQ09QWSk7CiAgIFNBRkVfRlJFRSAoKTsKICAg cmV0dXJuIHRydWU7CiB9Ci0tIAoyLjM1LjEud2luZG93cy4yCgo= --------------LFkLMBThjXP4z7rLaGhIyG84-- From debbugs-submit-bounces@debbugs.gnu.org Sun Oct 27 02:37:29 2024 Received: (at 73730) by debbugs.gnu.org; 27 Oct 2024 06:37:29 +0000 Received: from localhost ([127.0.0.1]:43602 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t4wu1-0003ri-Ce for submit@debbugs.gnu.org; Sun, 27 Oct 2024 02:37:29 -0400 Received: from eggs.gnu.org ([209.51.188.92]:38440) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t4wtz-0003rU-Q3 for 73730@debbugs.gnu.org; Sun, 27 Oct 2024 02:37:28 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1t4wtL-0005Lb-82; Sun, 27 Oct 2024 02:36:47 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=EXIJo4KfC0X6FYsGJhzldRrHapYpDe/A1qz373Qrugo=; b=ib3lP0nGLSXj /iMANPidAzhjQejUPHaepQPsLIU3kw8RSb1nr1w4Zk1bGS8MqVvsuFufQWhI0qwa/aMtjXjPQhLNh vwPuMtJhUuqv0JqYm/AaeD5zlpllVPS0Qh5hsHltSfOXS8QP91VAHOnDaE9iaCqRZEccULmeV9Cbw IpExLNUOUNE+lZelA8d/BLAqMImoCry/vdIwqQ2vX/NFgKXuqqHfaRvAaL9FGUQm5EEAxri0Aihty 6/fGArKii3gmx7hGMzX28v76JG/fFKfPyCDf90GYYDqfnq/pnUw6vPQ6euf64aEctaxEysNvlLIdx eTDTMhmobsxMLDJ9LV3gaw==; Date: Sun, 27 Oct 2024 08:36:44 +0200 Message-Id: <864j4yaw77.fsf@gnu.org> From: Eli Zaretskii To: Cecilio Pardo In-Reply-To: (message from Cecilio Pardo on Sat, 26 Oct 2024 22:13:57 +0200) Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> <86bjzjp7vv.fsf@gnu.org> <80dc50bd-b2d4-4d21-ad38-322412588b3b@imayhem.com> <86o73ej2u7.fsf@gnu.org> <8e5ffc88-dda8-4b4d-a133-f80029825347@imayhem.com> <86plnrdtm1.fsf@gnu.org> <86bjzaemev.fsf@gnu.org> <68b9d35b-b8e1-4830-8ad9-8c33258e0980@imayhem.com> <864j50d4od.fsf@gnu.org> <78477402-2af1-4da1-bf02-11d1b0e4b4a0@imayhem.com> <86msisbder.fsf@gnu.org> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > Date: Sat, 26 Oct 2024 22:13:57 +0200 > From: Cecilio Pardo > Cc: 73730@debbugs.gnu.org > > This patch fixes the left side glyph truncation, which happens when > glyphs have negative left bearing. Thanks, installed. > About the problem you reported, I can't reproduce when building for > 64bit. It does show when building with mingw32 for 32bit. It also shows > when building version 30.0.92. Maybe is the Harfbuzz version? I have > 2.4.0 for this build. Quite possible. I guess I'll have to build a newer HarfBuzz some day soon (which I tried to avoid, since they dropped support for Autoconf in favor of fancier build tools). From debbugs-submit-bounces@debbugs.gnu.org Sun Oct 27 09:33:19 2024 Received: (at 73730) by debbugs.gnu.org; 27 Oct 2024 13:33:19 +0000 Received: from localhost ([127.0.0.1]:44288 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t53OR-0006cz-Fv for submit@debbugs.gnu.org; Sun, 27 Oct 2024 09:33:19 -0400 Received: from eggs.gnu.org ([209.51.188.92]:48568) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t53OP-0006cl-FG for 73730@debbugs.gnu.org; Sun, 27 Oct 2024 09:33:17 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1t53Nl-00080H-8B; Sun, 27 Oct 2024 09:32:37 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=z/Udrhw6WudIV83NXhUuX6+bXcz4xHznuxIO6rRg37c=; b=BWpTjkHSZF0Z DUo20qLb9BS3XlHEdaBWSoOnQ9cFBatI1d/dA3W/+FcYElbKnCRxRqVJc0sUHG20IreLpryGTQ67I W2SvHVf7wRxK5OPaqfAuI1pLVF2jOmiaadhuIxThYbsNn2TPYs3x7AIvYzmr+nHQwVWe1Y+RqQcVB iT/BOcsE00HvZ1u+A/jw8o4Yq88bdCLYq5pyK0G6Ikw4+OkvKix8S/MYB2JV9w2kJRSJs5pFawzPN snwpM3c24tMohZO+hQkjFX83dOlJZ8cSmi2K93XMLvt1J7yZm+sAUdc0hTTTpbKAJwLJzcYolIA0a IbNZn1HMqHO9OG8TTpsgKw==; Date: Sun, 27 Oct 2024 15:32:34 +0200 Message-Id: <86plnl8ydp.fsf@gnu.org> From: Eli Zaretskii To: cpardo@imayhem.com In-Reply-To: <864j4yaw77.fsf@gnu.org> (message from Eli Zaretskii on Sun, 27 Oct 2024 08:36:44 +0200) Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> <86bjzjp7vv.fsf@gnu.org> <80dc50bd-b2d4-4d21-ad38-322412588b3b@imayhem.com> <86o73ej2u7.fsf@gnu.org> <8e5ffc88-dda8-4b4d-a133-f80029825347@imayhem.com> <86plnrdtm1.fsf@gnu.org> <86bjzaemev.fsf@gnu.org> <68b9d35b-b8e1-4830-8ad9-8c33258e0980@imayhem.com> <864j50d4od.fsf@gnu.org> <78477402-2af1-4da1-bf02-11d1b0e4b4a0@imayhem.com> <86msisbder.fsf@gnu.org> <864j4yaw77.fsf@gnu.org> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > Cc: 73730@debbugs.gnu.org > Date: Sun, 27 Oct 2024 08:36:44 +0200 > From: Eli Zaretskii > > > About the problem you reported, I can't reproduce when building for > > 64bit. It does show when building with mingw32 for 32bit. It also shows > > when building version 30.0.92. Maybe is the Harfbuzz version? I have > > 2.4.0 for this build. > > Quite possible. I guess I'll have to build a newer HarfBuzz some day > soon (which I tried to avoid, since they dropped support for > Autoconf in favor of fancier build tools). Could you perhaps try the 32-bit build with the latest win32 binaries that the HarfBuzz project itself provides from their Releases page? https://github.com/harfbuzz/harfbuzz/releases From debbugs-submit-bounces@debbugs.gnu.org Sun Oct 27 09:42:30 2024 Received: (at 73730) by debbugs.gnu.org; 27 Oct 2024 13:42:30 +0000 Received: from localhost ([127.0.0.1]:44313 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t53XJ-00074J-Pa for submit@debbugs.gnu.org; Sun, 27 Oct 2024 09:42:30 -0400 Received: from mail.imayhem.com ([82.223.54.191]:42761 helo=zealous-pike.82-223-54-191.plesk.page) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t53XH-000745-N5 for 73730@debbugs.gnu.org; Sun, 27 Oct 2024 09:42:28 -0400 Received: from [192.168.68.104] (111.red-88-21-7.staticip.rima-tde.net [88.21.7.111]) by zealous-pike.82-223-54-191.plesk.page (Postfix) with ESMTPSA id 2EC6A80421; Sun, 27 Oct 2024 13:41:46 +0000 (UTC) Authentication-Results: zealous-pike.82-223-54-191.plesk.page; spf=pass (sender IP is 88.21.7.111) smtp.mailfrom=cpardo@imayhem.com smtp.helo=[192.168.68.104] Received-SPF: pass (zealous-pike.82-223-54-191.plesk.page: connection is authenticated) Message-ID: Date: Sun, 27 Oct 2024 14:41:45 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows To: Eli Zaretskii References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> <86bjzjp7vv.fsf@gnu.org> <80dc50bd-b2d4-4d21-ad38-322412588b3b@imayhem.com> <86o73ej2u7.fsf@gnu.org> <8e5ffc88-dda8-4b4d-a133-f80029825347@imayhem.com> <86plnrdtm1.fsf@gnu.org> <86bjzaemev.fsf@gnu.org> <68b9d35b-b8e1-4830-8ad9-8c33258e0980@imayhem.com> <864j50d4od.fsf@gnu.org> <78477402-2af1-4da1-bf02-11d1b0e4b4a0@imayhem.com> <86msisbder.fsf@gnu.org> <864j4yaw77.fsf@gnu.org> <86plnl8ydp.fsf@gnu.org> Content-Language: es-ES From: Cecilio Pardo In-Reply-To: <86plnl8ydp.fsf@gnu.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) > Could you perhaps try the 32-bit build with the latest win32 binaries > that the HarfBuzz project itself provides from their Releases page? > > https://github.com/harfbuzz/harfbuzz/releases Ok. From debbugs-submit-bounces@debbugs.gnu.org Sun Oct 27 11:44:57 2024 Received: (at submit) by debbugs.gnu.org; 27 Oct 2024 15:44:57 +0000 Received: from localhost ([127.0.0.1]:45946 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t55Ro-0004Wx-Sd for submit@debbugs.gnu.org; Sun, 27 Oct 2024 11:44:57 -0400 Received: from lists.gnu.org ([209.51.188.17]:59750) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t55Rn-0004Wq-EC for submit@debbugs.gnu.org; Sun, 27 Oct 2024 11:44:55 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1t55RD-0004Mc-Qi for bug-gnu-emacs@gnu.org; Sun, 27 Oct 2024 11:44:19 -0400 Received: from mail.imayhem.com ([82.223.54.191] helo=zealous-pike.82-223-54-191.plesk.page) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1t55RB-0002pw-6r for bug-gnu-emacs@gnu.org; Sun, 27 Oct 2024 11:44:19 -0400 Received: from [192.168.68.104] (111.red-88-21-7.staticip.rima-tde.net [88.21.7.111]) by zealous-pike.82-223-54-191.plesk.page (Postfix) with ESMTPSA id BD7BE80421 for ; Sun, 27 Oct 2024 15:44:13 +0000 (UTC) Authentication-Results: zealous-pike.82-223-54-191.plesk.page; spf=pass (sender IP is 88.21.7.111) smtp.mailfrom=cpardo@imayhem.com smtp.helo=[192.168.68.104] Received-SPF: pass (zealous-pike.82-223-54-191.plesk.page: connection is authenticated) Message-ID: <1acdb215-fa90-46d8-8088-3f5374903f28@imayhem.com> Date: Sun, 27 Oct 2024 16:44:13 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows To: bug-gnu-emacs@gnu.org References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> <86bjzjp7vv.fsf@gnu.org> <80dc50bd-b2d4-4d21-ad38-322412588b3b@imayhem.com> <86o73ej2u7.fsf@gnu.org> <8e5ffc88-dda8-4b4d-a133-f80029825347@imayhem.com> <86plnrdtm1.fsf@gnu.org> <86bjzaemev.fsf@gnu.org> <68b9d35b-b8e1-4830-8ad9-8c33258e0980@imayhem.com> <864j50d4od.fsf@gnu.org> <78477402-2af1-4da1-bf02-11d1b0e4b4a0@imayhem.com> <86msisbder.fsf@gnu.org> <864j4yaw77.fsf@gnu.org> <86plnl8ydp.fsf@gnu.org> Content-Language: es-ES From: Cecilio Pardo In-Reply-To: <86plnl8ydp.fsf@gnu.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Received-SPF: pass client-ip=82.223.54.191; envelope-from=cpardo@imayhem.com; helo=zealous-pike.82-223-54-191.plesk.page X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Score: -1.3 (-) X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.3 (--) > Could you perhaps try the 32-bit build with the latest win32 binaries > that the HarfBuzz project itself provides from their Releases page? > > https://github.com/harfbuzz/harfbuzz/releases I replaced libharfbuzz-0.dll with the one from version 10.0.1 (the latest one) and it just works, with and without DirectWrite, without rebulding Emacs with the new headers. Besides the normal build with meson/cmake, I've seen this: There is also amalgamated source provided with HarfBuzz which reduces whole process of building HarfBuzz to g++ src/harfbuzz.cc -fno-exceptions but there is no guarantee provided with buildability and reliability of features you get. I will take a look at that. From debbugs-submit-bounces@debbugs.gnu.org Sun Oct 27 12:55:10 2024 Received: (at 73730) by debbugs.gnu.org; 27 Oct 2024 16:55:10 +0000 Received: from localhost ([127.0.0.1]:46045 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t56Xm-0007jk-ER for submit@debbugs.gnu.org; Sun, 27 Oct 2024 12:55:10 -0400 Received: from eggs.gnu.org ([209.51.188.92]:55968) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t56Xk-0007jV-Vt for 73730@debbugs.gnu.org; Sun, 27 Oct 2024 12:55:09 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1t56X5-0000ER-7w; Sun, 27 Oct 2024 12:54:28 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=tSxcxW0rZhgP9Iv/mYYw4jLfeBGfzsesCuMUKWzuBzc=; b=cBHEPygmkHzQ 3eDaxgiEAnl/IAmCEYkzaitAwptpi1HaovKj5THPykQ0zdkzK1Gs0+jI7jG0N+56Ijjd8ZA9bKcyv YcGjzBHmmQWD+ppkYzxeax5VmnGd+AlsGhRu8Qb3gBLl2d6Me6Nmjmasyx+MU+uGqDPRPoHibENVc +cgq7CqZbRCmviyY3y2JZ0pLPt3Wp8BGtWZ5q4iyjThjq3ZP7y8nAdWdJ/3fFFctpzS6T8oWKL8E9 gK2Vmak2AvfYrL0HbjJn9IVklSVV1LQ3sPqm6rHIId5zkyzBzhS7vGLFiL15YtFViIWaQ6zRNnYat 7U3WzuZ2REWHwPF/JrgvDg==; Date: Sun, 27 Oct 2024 18:54:17 +0200 Message-Id: <86jzdt8p1i.fsf@gnu.org> From: Eli Zaretskii To: Cecilio Pardo In-Reply-To: <1acdb215-fa90-46d8-8088-3f5374903f28@imayhem.com> (message from Cecilio Pardo on Sun, 27 Oct 2024 16:44:13 +0100) Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> <86bjzjp7vv.fsf@gnu.org> <80dc50bd-b2d4-4d21-ad38-322412588b3b@imayhem.com> <86o73ej2u7.fsf@gnu.org> <8e5ffc88-dda8-4b4d-a133-f80029825347@imayhem.com> <86plnrdtm1.fsf@gnu.org> <86bjzaemev.fsf@gnu.org> <68b9d35b-b8e1-4830-8ad9-8c33258e0980@imayhem.com> <864j50d4od.fsf@gnu.org> <78477402-2af1-4da1-bf02-11d1b0e4b4a0@imayhem.com> <86msisbder.fsf@gnu.org> <864j4yaw77.fsf@gnu.org> <86plnl8ydp.fsf@gnu.org> <1acdb215-fa90-46d8-8088-3f5374903f28@imayhem.com> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > Date: Sun, 27 Oct 2024 16:44:13 +0100 > From: Cecilio Pardo > > > Could you perhaps try the 32-bit build with the latest win32 binaries > > that the HarfBuzz project itself provides from their Releases page? > > > > https://github.com/harfbuzz/harfbuzz/releases > > I replaced libharfbuzz-0.dll with the one from version 10.0.1 (the > latest one) and it just works, with and without DirectWrite, without > rebulding Emacs with the new headers. And the problems with displaying emoji-zwj-sequences are gone? It doesn't surprise me that no rebuilding is needed, because the latest HarfBuzz is still ABI-compatible with the old ones (which is why the name is still "-0.dll", not a larger number). > Besides the normal build with meson/cmake, I've seen this: > > There is also amalgamated source provided with HarfBuzz which reduces > whole process of building HarfBuzz to g++ src/harfbuzz.cc > -fno-exceptions but there is no guarantee provided with buildability > and reliability of features you get. Yes, I know, I've seen the suggestion to TeX Live folks to use that. From debbugs-submit-bounces@debbugs.gnu.org Sun Oct 27 13:51:34 2024 Received: (at 73730) by debbugs.gnu.org; 27 Oct 2024 17:51:34 +0000 Received: from localhost ([127.0.0.1]:46146 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t57QM-0001zu-18 for submit@debbugs.gnu.org; Sun, 27 Oct 2024 13:51:34 -0400 Received: from mail.imayhem.com ([82.223.54.191]:34649 helo=zealous-pike.82-223-54-191.plesk.page) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t57QK-0001zg-Fm for 73730@debbugs.gnu.org; Sun, 27 Oct 2024 13:51:32 -0400 Received: from [192.168.68.104] (111.red-88-21-7.staticip.rima-tde.net [88.21.7.111]) by zealous-pike.82-223-54-191.plesk.page (Postfix) with ESMTPSA id 38BDE80421; Sun, 27 Oct 2024 17:50:51 +0000 (UTC) Authentication-Results: zealous-pike.82-223-54-191.plesk.page; spf=pass (sender IP is 88.21.7.111) smtp.mailfrom=cpardo@imayhem.com smtp.helo=[192.168.68.104] Received-SPF: pass (zealous-pike.82-223-54-191.plesk.page: connection is authenticated) Message-ID: <1fd5dbaf-ab2a-44fa-b0bf-97671639ad00@imayhem.com> Date: Sun, 27 Oct 2024 18:50:50 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows To: Eli Zaretskii References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> <86bjzjp7vv.fsf@gnu.org> <80dc50bd-b2d4-4d21-ad38-322412588b3b@imayhem.com> <86o73ej2u7.fsf@gnu.org> <8e5ffc88-dda8-4b4d-a133-f80029825347@imayhem.com> <86plnrdtm1.fsf@gnu.org> <86bjzaemev.fsf@gnu.org> <68b9d35b-b8e1-4830-8ad9-8c33258e0980@imayhem.com> <864j50d4od.fsf@gnu.org> <78477402-2af1-4da1-bf02-11d1b0e4b4a0@imayhem.com> <86msisbder.fsf@gnu.org> <864j4yaw77.fsf@gnu.org> <86plnl8ydp.fsf@gnu.org> <1acdb215-fa90-46d8-8088-3f5374903f28@imayhem.com> <86jzdt8p1i.fsf@gnu.org> Content-Language: es-ES From: Cecilio Pardo In-Reply-To: <86jzdt8p1i.fsf@gnu.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) On 27/10/2024 17:54, Eli Zaretskii wrote: >> I replaced libharfbuzz-0.dll with the one from version 10.0.1 (the >> latest one) and it just works, with and without DirectWrite, without >> rebulding Emacs with the new headers. > > And the problems with displaying emoji-zwj-sequences are gone? Yes, they show correctly. From debbugs-submit-bounces@debbugs.gnu.org Sun Oct 27 15:18:48 2024 Received: (at 73730) by debbugs.gnu.org; 27 Oct 2024 19:18:48 +0000 Received: from localhost ([127.0.0.1]:46380 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t58mm-0006Cv-1n for submit@debbugs.gnu.org; Sun, 27 Oct 2024 15:18:48 -0400 Received: from eggs.gnu.org ([209.51.188.92]:53796) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t58mk-0006Ci-1L for 73730@debbugs.gnu.org; Sun, 27 Oct 2024 15:18:46 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1t58jz-0005Qs-Cg; Sun, 27 Oct 2024 15:15:55 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=AjwXbfKell+ci0r4jFjKptovW0gsqnTW3PLFIymIc4k=; b=LiL2N2s6n9Nc +OiYUDr2UXX/G9f4QTYwC+bpg3QpIqeU5jlGlQJsKqN8MHlnofl1v2H1MUe+i3eH2eHmCV1LLA661 soTibhKQFecM2V8ssiauUHbGT+GYdM74itTLopf157uEmM5CEjqyAShEWB1oLnosIwnR9QwWCULtC u6qzVFYsw/D/1qGUXynPDmJYoHbi/XOSR6AW17IYy+xYe2G7a7Of9O4hjn/ra+5WL0HlicxrWTu1v 3j70pL2scPJSM+m6OUdS5b1DMwan+MW4HAgQ0PctaN8eym0lDr0zfPVktsMeqant/Xjv7DHLuANsy bNutxzgL60RIFOKefbzxPA==; Date: Sun, 27 Oct 2024 21:15:53 +0200 Message-Id: <86a5ep8ihi.fsf@gnu.org> From: Eli Zaretskii To: Cecilio Pardo In-Reply-To: <1fd5dbaf-ab2a-44fa-b0bf-97671639ad00@imayhem.com> (message from Cecilio Pardo on Sun, 27 Oct 2024 18:50:50 +0100) Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> <86bjzjp7vv.fsf@gnu.org> <80dc50bd-b2d4-4d21-ad38-322412588b3b@imayhem.com> <86o73ej2u7.fsf@gnu.org> <8e5ffc88-dda8-4b4d-a133-f80029825347@imayhem.com> <86plnrdtm1.fsf@gnu.org> <86bjzaemev.fsf@gnu.org> <68b9d35b-b8e1-4830-8ad9-8c33258e0980@imayhem.com> <864j50d4od.fsf@gnu.org> <78477402-2af1-4da1-bf02-11d1b0e4b4a0@imayhem.com> <86msisbder.fsf@gnu.org> <864j4yaw77.fsf@gnu.org> <86plnl8ydp.fsf@gnu.org> <1acdb215-fa90-46d8-8088-3f5374903f28@imayhem.com> <86jzdt8p1i.fsf@gnu.org> <1fd5dbaf-ab2a-44fa-b0bf-97671639ad00@imayhem.com> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > Date: Sun, 27 Oct 2024 18:50:50 +0100 > Cc: 73730@debbugs.gnu.org > From: Cecilio Pardo > > On 27/10/2024 17:54, Eli Zaretskii wrote: > > >> I replaced libharfbuzz-0.dll with the one from version 10.0.1 (the > >> latest one) and it just works, with and without DirectWrite, without > >> rebulding Emacs with the new headers. > > > > And the problems with displaying emoji-zwj-sequences are gone? > > Yes, they show correctly. OK, good to know. Then this mystery can be put to rest. From debbugs-submit-bounces@debbugs.gnu.org Tue Oct 29 04:57:23 2024 Received: (at 73730) by debbugs.gnu.org; 29 Oct 2024 08:57:23 +0000 Received: from localhost ([127.0.0.1]:55902 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t5i2V-0003r0-0P for submit@debbugs.gnu.org; Tue, 29 Oct 2024 04:57:23 -0400 Received: from mail.imayhem.com ([82.223.54.191]:36159 helo=zealous-pike.82-223-54-191.plesk.page) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t5i2S-0003qk-Fd for 73730@debbugs.gnu.org; Tue, 29 Oct 2024 04:57:21 -0400 Received: from [192.168.68.104] (111.red-88-21-7.staticip.rima-tde.net [88.21.7.111]) by zealous-pike.82-223-54-191.plesk.page (Postfix) with ESMTPSA id 0C9478012E; Tue, 29 Oct 2024 08:57:14 +0000 (UTC) Authentication-Results: zealous-pike.82-223-54-191.plesk.page; spf=pass (sender IP is 88.21.7.111) smtp.mailfrom=cpardo@imayhem.com smtp.helo=[192.168.68.104] Received-SPF: pass (zealous-pike.82-223-54-191.plesk.page: connection is authenticated) Content-Type: multipart/mixed; boundary="------------Qf4mgspnpl4JeDa06EU9qcKU" Message-ID: <9f9d0445-b53c-408c-ba1d-6e9c1b4eaf17@imayhem.com> Date: Tue, 29 Oct 2024 09:57:11 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows To: Eli Zaretskii References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> <86bjzjp7vv.fsf@gnu.org> <80dc50bd-b2d4-4d21-ad38-322412588b3b@imayhem.com> <86o73ej2u7.fsf@gnu.org> <8e5ffc88-dda8-4b4d-a133-f80029825347@imayhem.com> <86plnrdtm1.fsf@gnu.org> <86bjzaemev.fsf@gnu.org> <68b9d35b-b8e1-4830-8ad9-8c33258e0980@imayhem.com> <864j50d4od.fsf@gnu.org> <78477402-2af1-4da1-bf02-11d1b0e4b4a0@imayhem.com> <86msisbder.fsf@gnu.org> <864j4yaw77.fsf@gnu.org> <86plnl8ydp.fsf@gnu.org> <1acdb215-fa90-46d8-8088-3f5374903f28@imayhem.com> <86jzdt8p1i.fsf@gnu.org> <1fd5dbaf-ab2a-44fa-b0bf-97671639ad00@imayhem.com> <86a5ep8ihi.fsf@gnu.org> Content-Language: es-ES From: Cecilio Pardo In-Reply-To: <86a5ep8ihi.fsf@gnu.org> X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) This is a multi-part message in MIME format. --------------Qf4mgspnpl4JeDa06EU9qcKU Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit I've built HarfBuzz with the attached patch with mingw, using g++ src/harfbuzz.cc --shared -o libharfbuzz-0.dll --no-exceptions and it seems to work fine. --------------Qf4mgspnpl4JeDa06EU9qcKU Content-Type: text/plain; charset=UTF-8; name="0001-harbuzz-mingw.patch" Content-Disposition: attachment; filename="0001-harbuzz-mingw.patch" Content-Transfer-Encoding: base64 RnJvbSBhNTkwMmFiNDJhZTZkY2ZhOGNkZWQwYjBlNzMxNjkxZTRkOGY3MTA1IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBDZWNpbGlvIFBhcmRvIDxjcGFyZG9AaW1heWhlbS5j b20+CkRhdGU6IFR1ZSwgMjkgT2N0IDIwMjQgMDk6MjE6MTQgKzAxMDAKU3ViamVjdDogW1BB VENIXSAuLgoKLS0tCiBzcmMvaGFyZmJ1enouY2MgfCA0ICsrKysKIHNyYy9oYi5oaCAgICAg ICB8IDIgKy0KIDIgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9u KC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2hhcmZidXp6LmNjIGIvc3JjL2hhcmZidXp6LmNjCmlu ZGV4IDlmZjgwMGRhYS4uNDg2ZTQ0YmYzIDEwMDY0NAotLS0gYS9zcmMvaGFyZmJ1enouY2MK KysrIGIvc3JjL2hhcmZidXp6LmNjCkBAIC0xLDMgKzEsNiBAQAorI2RlZmluZSBXSU5BUElf UEFSVElUSU9OX0RFU0tUT1AgMQorI2RlZmluZSBXSU5BUElfRkFNSUxZX1BBUlRJVElPTih4 KSAoeCkKKwogI2luY2x1ZGUgIk9UL1Zhci9WQVJDL1ZBUkMuY2MiCiAjaW5jbHVkZSAiaGIt YWF0LWxheW91dC5jYyIKICNpbmNsdWRlICJoYi1hYXQtbWFwLmNjIgpAQCAtNjIsMyArNjUs NCBAQAogI2luY2x1ZGUgImhiLXVuaXNjcmliZS5jYyIKICNpbmNsdWRlICJoYi13YXNtLWFw aS5jYyIKICNpbmNsdWRlICJoYi13YXNtLXNoYXBlLmNjIgorCmRpZmYgLS1naXQgYS9zcmMv aGIuaGggYi9zcmMvaGIuaGgKaW5kZXggZmU0NjZmZTFmLi45YzU0YmMzYmQgMTAwNjQ0Ci0t LSBhL3NyYy9oYi5oaAorKysgYi9zcmMvaGIuaGgKQEAgLTIxNiw3ICsyMTYsNyBAQAogCiAj aWZkZWYgX1dJTjMyCiAjaW5jbHVkZSA8d2luZG93cy5oPgotI2luY2x1ZGUgPHdpbmFwaWZh bWlseS5oPgorLy8gI2luY2x1ZGUgPHdpbmFwaWZhbWlseS5oPgogI2VuZGlmCiAKICNpZm5k ZWYgUFJJZDMyCi0tIAoyLjM1LjEud2luZG93cy4yCgo= --------------Qf4mgspnpl4JeDa06EU9qcKU-- From debbugs-submit-bounces@debbugs.gnu.org Sun Nov 03 08:03:47 2024 Received: (at 73730) by debbugs.gnu.org; 3 Nov 2024 13:03:47 +0000 Received: from localhost ([127.0.0.1]:60309 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t7aGh-0006Fj-Hj for submit@debbugs.gnu.org; Sun, 03 Nov 2024 08:03:47 -0500 Received: from eggs.gnu.org ([209.51.188.92]:53638) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t7aGf-0006Fd-8z for 73730@debbugs.gnu.org; Sun, 03 Nov 2024 08:03:46 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1t7aET-0004CL-VT; Sun, 03 Nov 2024 08:01:29 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=KOrjKB9dw41QDYeBhf4zNm/5f1MSuhbdzBLtVtMUyKk=; b=Isufc8YMH1eY VK+dVJEbQrSwsGuy8tkqWJznKSOZzRLZjb81TCxr3yaFcIkXvng0M6b5jFpLZRAWyKOM6zmwBL2xL U2FtZHfXW7PGOT4sjtWbmdTX7cPOIaeOLp6+ubkMJlq6pRLGnK8k378EfA0JZ8WNNW9ryGJdOyGkT UDk6iRcG1ZWIglnLfMHeyc2ZMSwIzPc5Vj0mHsU1lZinCAuSdNXNKE0hQGXPmu0D3Ch7ri6AGUrIy Qh1RSWcTcYLj+xRqL0SW98NBXsqX20MbYjR6BwkOweecRc5lwvbrunHet3d2NGvuA3SE+qWsY2fpQ BP0QOGA8mWeyzY904zCpOw==; Date: Sun, 03 Nov 2024 15:01:18 +0200 Message-Id: <86ldy0wjxd.fsf@gnu.org> From: Eli Zaretskii To: cpardo@imayhem.com In-Reply-To: <864j4yaw77.fsf@gnu.org> (message from Eli Zaretskii on Sun, 27 Oct 2024 08:36:44 +0200) Subject: Re: bug#73730: 31.0.50; Support for color fonts on MS-Windows References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> <861q0gqpkf.fsf@gnu.org> <0d2238ff-5cf9-4ba7-97ab-11b76892198d@imayhem.com> <86bjzjp7vv.fsf@gnu.org> <80dc50bd-b2d4-4d21-ad38-322412588b3b@imayhem.com> <86o73ej2u7.fsf@gnu.org> <8e5ffc88-dda8-4b4d-a133-f80029825347@imayhem.com> <86plnrdtm1.fsf@gnu.org> <86bjzaemev.fsf@gnu.org> <68b9d35b-b8e1-4830-8ad9-8c33258e0980@imayhem.com> <864j50d4od.fsf@gnu.org> <78477402-2af1-4da1-bf02-11d1b0e4b4a0@imayhem.com> <86msisbder.fsf@gnu.org> <864j4yaw77.fsf@gnu.org> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 73730 Cc: 73730@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > Cc: 73730@debbugs.gnu.org > Date: Sun, 27 Oct 2024 08:36:44 +0200 > From: Eli Zaretskii > > > About the problem you reported, I can't reproduce when building for > > 64bit. It does show when building with mingw32 for 32bit. It also shows > > when building version 30.0.92. Maybe is the Harfbuzz version? I have > > 2.4.0 for this build. > > Quite possible. I guess I'll have to build a newer HarfBuzz some day > soon (which I tried to avoid, since they dropped support for > Autoconf in favor of fancier build tools). FTR: I built HarfBuzz 8.5.0 (the last release which supports Autoconf), and the problems with emoji-zwj-sequences.txt are gone with that version. From unknown Thu Jun 19 14:05:58 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: bug archived. Date: Mon, 02 Dec 2024 12:24:06 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # bug archived. thanks # This fakemail brought to you by your local debbugs # administrator