From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Vladimir Kazanov Newsgroups: gmane.emacs.devel Subject: Re: [PATCH] User-defined fringe tooltips (a request for review) Date: Sun, 24 Dec 2023 11:31:28 +0000 Message-ID: References: <83sf3xgimq.fsf@gnu.org> <83plyzfoe4.fsf@gnu.org> <83plyxca0t.fsf@gnu.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="000000000000fd4b7f060d3fca25" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="16926"; mail-complaints-to="usenet@ciao.gmane.io" Cc: emacs-devel@gnu.org To: Eli Zaretskii Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Sun Dec 24 12:32:39 2023 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1rHMil-0004Bf-4m for ged-emacs-devel@m.gmane-mx.org; Sun, 24 Dec 2023 12:32:39 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rHMhu-00088G-Pa; Sun, 24 Dec 2023 06:31:46 -0500 Original-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 1rHMhs-00087z-Uu for emacs-devel@gnu.org; Sun, 24 Dec 2023 06:31:44 -0500 Original-Received: from mail-lf1-x130.google.com ([2a00:1450:4864:20::130]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1rHMhq-0004JK-Q4; Sun, 24 Dec 2023 06:31:44 -0500 Original-Received: by mail-lf1-x130.google.com with SMTP id 2adb3069b0e04-50e4e3323a6so4070543e87.0; Sun, 24 Dec 2023 03:31:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1703417500; x=1704022300; darn=gnu.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=8ObxqJbhSrH7NwsmtEu1dLqSNa0PJQUiCdgQUuXHP+E=; b=YiyoVCYOKHP3RGf9x7Co7rSYFKWmrtTojt/kC9729lpzsr+yw+WiXib1WIdbHsoD87 selpBXEw9KIV9RLt5hz0t571mVJuut5+3hCXORbF50z2m+uHhaADQd9GA5h/Kxl1cr0/ dLvf74kyIwS1Ffd7bqQrtVkC/ycXbJ39jag2EST/p7IWyQB+AjIqcsRsEd2eOQ5DzdNU Sk0bDW2+scuKrkbTrylaWSoCvYpib08LLtxKxBRWkPzRCn1c9zjrybXV6j4KG7WEo9N3 OCvgMTUK3oXNJRofVDTTZnetunakxap6XvQqCBeJnQfhyF5jFvbjE5iwee9VJZziAUIN fBWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1703417500; x=1704022300; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=8ObxqJbhSrH7NwsmtEu1dLqSNa0PJQUiCdgQUuXHP+E=; b=VxEsp1JeW8zFIdM0g9S30G/4mBaUWgwBj4V5X8e7EA6fjlGC6NtZkEcvSa5h/fZEfw oxHP2w1N1aaRw177yDNzT1FPQypfhTFATCn7vUTncmYtjEmU+eTdiJNePYV51ISs0UPD xWsD5zBryvQEMc7Jq9o67TGroYf1CLMuwGKhmnnspsZfskZClYRHYez15CPInR5xyzhb vVYU/RZqS00+zhn9ZN0TqkiXlkZMFxZB1s9vgriHCIGycFqhF6fDHukPG3NXslxzX8vh +IlHTGYd1pFo+bt+nTbihzveea6/Qnm9fadEasK1+v8adbk3MIiFER9kwem80nvXUACZ EZcw== X-Gm-Message-State: AOJu0Yx52MUMwNeBMlf+Mdo8jEJ78oKKX2DLO/1gfwSNgrdIRWbnLCYT 0syKCSUp1lIx9uVNYYnxpGe+sDEGaKFNIzAf0ncWKqw= X-Google-Smtp-Source: AGHT+IE+D7WUtQAxwWe6lDdZ/F2LV59cMQVwfXwFQoOKQAM/9wb9bCkD2l09og8oB3jIzHAKfZ7IoUrm23MfVGgI22k= X-Received: by 2002:a05:6512:3e18:b0:50e:6b4a:f4a1 with SMTP id i24-20020a0565123e1800b0050e6b4af4a1mr2363171lfv.1.1703417499954; Sun, 24 Dec 2023 03:31:39 -0800 (PST) In-Reply-To: <83plyxca0t.fsf@gnu.org> Received-SPF: pass client-ip=2a00:1450:4864:20::130; envelope-from=vekazanov@gmail.com; helo=mail-lf1-x130.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.devel:314117 Archived-At: --000000000000fd4b7f060d3fca25 Content-Type: text/plain; charset="UTF-8" After figuring out a couple of nasty crashes I came up with a patch which works for all display specs coming from buffer text itself. But I've just realized that some fringe sources are still unhandled here. For example, when the fringe indicator is defined in non-buffer strings, like overlays with 'before-string/'after-string properties. Just iterating through text positions doesn't scan any of that. This means that we'd have to imitate more of the iterator logic when looking for display specs containing help-echo. Do we want to manage fringe help-echo text coming from various strings as well? Certainly doable. I wonder if this asks for a separate patch. Thanks On Sat, 23 Dec 2023 at 13:40, Eli Zaretskii wrote: > > > From: Vladimir Kazanov > > Date: Sat, 23 Dec 2023 13:28:48 +0000 > > Cc: emacs-devel@gnu.org > > > > The way I see things now: the code has to iterate all charpos in the > > right order, including invisible ones, and also check for display > > properties in overlays. A glyph_row has information on where the row > > starts and ends (row->start and row->end). > > > > I want to do the following in note_mouse_highlight: > > > > /* Get to the current glyph row */ > > struct glyph_row *row = MATRIX_ROW (w->current_matrix, vpos); > > Lisp_Object left_caption = Qnil, right_caption = Qnil; > > > > ptrdiff_t charpos; > > ptrdiff_t charpos_start = row->start.pos.charpos; > > ptrdiff_t charpos_end = row->end.pos.charpos; > > for (charpos = charpos_start; charpos <= charpos_end; charpos++) > > { > > /* This can be either in text props or overlays, so check both */ > > Lisp_Object spec = get_char_property_and_overlay (make_fixnum (charpos), > > Qdisplay, Qnil, NULL); > > /* ... parse the spec... */ > > } > > Yes, I think you are right. But I think it is better to use > row->minpos and row->maxpos; see the comments in dispextern.h for the > reasons why. > > > > If Fget_text_property returns non-nil for the 'display' property, you > > > will then need to look at the value and see whether it specifies a > > > help-echo for the fringe; if it does, extract the string and assign it > > > to 'help_echo_string'. > > > > I've just realized that what you have in mind is reusing the standard > > 'help-echo property? The one used for tooltips on the text itself? > > No, that's not what I meant. I only meant to assign the tip string to > help_echo_string like we do in other places in that function. > > > Either way, I'd need to test this thoroughly, I suspect there might be > > interesting corner cases. > > There always are, IME. > > Thanks. -- Regards, Vladimir Kazanov --000000000000fd4b7f060d3fca25 Content-Type: text/x-patch; charset="US-ASCII"; name="0001-Tooltips-for-user-defined-fringe-indicators.patch" Content-Disposition: attachment; filename="0001-Tooltips-for-user-defined-fringe-indicators.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lqjern6g0 RnJvbSBlMTcxNmJhNDVhYjBlMTM1ODgyNTgxNzg2MzRjMmJjZDY4MzE5ZDVjIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBWbGFkaW1pciBLYXphbm92IDx2ZWthemFub3ZAZ21haWwuY29t PgpEYXRlOiBTdW4sIDI0IERlYyAyMDIzIDExOjEzOjEwICswMDAwClN1YmplY3Q6IFtQQVRDSF0g VG9vbHRpcHMgZm9yIHVzZXItZGVmaW5lZCBmcmluZ2UgaW5kaWNhdG9ycwoKVG9vbHRpcHMgZm9y IHVzZXItZGVmaW5lZCBmcmluZ2UgaW5kaWNhdG9ycwoqIGRvYy9saXNwcmVmL2Rpc3BsYXkudGV4 aTogZXhwYW5kIHRoZSBtYW51YWwKKiBldGMvTkVXUzogbWVudGlvbiB0b29sdGlwcwoqIGV0Yy9U T0RPOiBkcm9wIGEgdG9kbwoqIHNyYy94ZGlzcC5jIChub3RlX2ZyaW5nZV9oaWdobGlnaHQpOiBo ZWxwIGZvciBmcmluZ2UgZGlzcGxheSBzcGVjcwoKLS0tCiBkb2MvbGlzcHJlZi9kaXNwbGF5LnRl eGkgfCAgOSArKy0tLQogZXRjL05FV1MgICAgICAgICAgICAgICAgIHwgIDYgKysrKwogZXRjL1RP RE8gICAgICAgICAgICAgICAgIHwgIDQgLS0tCiBzcmMveGRpc3AuYyAgICAgICAgICAgICAgfCA3 MiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0tCiA0IGZpbGVzIGNoYW5n ZWQsIDgwIGluc2VydGlvbnMoKyksIDExIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RvYy9s aXNwcmVmL2Rpc3BsYXkudGV4aSBiL2RvYy9saXNwcmVmL2Rpc3BsYXkudGV4aQppbmRleCA4YWQ4 YjA0ZjkwOC4uMzNjYjFjMjVmODQgMTAwNjQ0Ci0tLSBhL2RvYy9saXNwcmVmL2Rpc3BsYXkudGV4 aQorKysgYi9kb2MvbGlzcHJlZi9kaXNwbGF5LnRleGkKQEAgLTU0OTIsMTQgKzU0OTIsMTUgQEAg T3RoZXIgRGlzcGxheSBTcGVjcwogYnV0IGl0IGlzIGRvbmUgYXMgYSBzcGVjaWFsIGNhc2Ugb2Yg bWFyZ2luYWwgZGlzcGxheSAoQHB4cmVme0Rpc3BsYXkKIE1hcmdpbnN9KS4KCi1AaXRlbSAobGVm dC1mcmluZ2UgQHZhcntiaXRtYXB9IEBye1t9QHZhcntmYWNlfUBye119KQotQGl0ZW14IChyaWdo dC1mcmluZ2UgQHZhcntiaXRtYXB9IEBye1t9QHZhcntmYWNlfUBye119KQorQGl0ZW0gKGxlZnQt ZnJpbmdlIEB2YXJ7Yml0bWFwfSBAcntbfUB2YXJ7ZmFjZX1AcntdfSBAcntbfUB2YXJ7aGVscC1l Y2hvfUBye119KQorQGl0ZW14IChyaWdodC1mcmluZ2UgQHZhcntiaXRtYXB9IEBye1t9QHZhcntm YWNlfUBye119IEBye1t9QHZhcntoZWxwLWVjaG99QHJ7XX0pCiBUaGlzIGRpc3BsYXkgc3BlY2lm aWNhdGlvbiBvbiBhbnkgY2hhcmFjdGVyIG9mIGEgbGluZSBvZiB0ZXh0IGNhdXNlcwogdGhlIHNw ZWNpZmllZCBAdmFye2JpdG1hcH0gYmUgZGlzcGxheWVkIGluIHRoZSBsZWZ0IG9yIHJpZ2h0IGZy aW5nZXMKIGZvciB0aGF0IGxpbmUsIGluc3RlYWQgb2YgdGhlIGNoYXJhY3RlcnMgdGhhdCBoYXZl IHRoZSBkaXNwbGF5CiBzcGVjaWZpY2F0aW9uLiAgVGhlIG9wdGlvbmFsIEB2YXJ7ZmFjZX0gc3Bl Y2lmaWVzIHRoZSBmYWNlIHdob3NlCi1jb2xvcnMgYXJlIHRvIGJlIHVzZWQgZm9yIHRoZSBiaXRt YXAgZGlzcGxheS4gIEB4cmVme0ZyaW5nZSBCaXRtYXBzfSwKLWZvciB0aGUgZGV0YWlscy4KK2Nv bG9ycyBhcmUgdG8gYmUgdXNlZCBmb3IgdGhlIGJpdG1hcCBkaXNwbGF5LiAgVGhlIG9wdGlvbmFs CitAdmFye2hlbHAtZWNob30gc3RyaW5nIGNhbiBiZSB1c2VkIHRvIGRpc3BsYXkgdG9vbHRpcHMg b3IgaGVscCB0ZXh0IGluCit0aGUgZWNobyBhcmVhLiAgQHhyZWZ7RnJpbmdlIEJpdG1hcHN9LCBm b3IgdGhlIGRldGFpbHMuCgogQGl0ZW0gKHNwYWNlLXdpZHRoIEB2YXJ7ZmFjdG9yfSkKIFRoaXMg ZGlzcGxheSBzcGVjaWZpY2F0aW9uIGFmZmVjdHMgYWxsIHRoZSBzcGFjZSBjaGFyYWN0ZXJzIHdp dGhpbiB0aGUKZGlmZiAtLWdpdCBhL2V0Yy9ORVdTIGIvZXRjL05FV1MKaW5kZXggNmRmMTdhYTNm MGEuLjg3YmEwZTMyNmIzIDEwMDY0NAotLS0gYS9ldGMvTkVXUworKysgYi9ldGMvTkVXUwpAQCAt MTM1MCw2ICsxMzUwLDEyIEBAIHZhbHVlcy4KIAwKICogTGlzcCBDaGFuZ2VzIGluIEVtYWNzIDMw LjEKCisrKysKKyoqIFRvb2x0aXBzIGZvciB1c2VyIGZyaW5nZSBpbmRpY2F0b3JzLgorVXNlciBm cmluZ2UgaW5kaWNhdG9ycyBkZWZpbmVkIGluIHRleHQgZGlzcGxheSBzcGVjaWZpY2F0aW9ucyBu b3cKK3N1cHBvcnQgdXNlci1kZWZpbmVkIHRvb2x0aXBzLiBTZWUgdGhlICJPdGhlciBEaXNwbGF5 IFNwZWNpZmljYXRpb25zIgorbm9kZSBpbiB0aGUgRW1hY3MgTGlzcCBSZWZlcmVuY2UgTWFudWFs LgorCiArKysKICoqIE5ldyAncG9wLXVwLWZyYW1lcycgYWN0aW9uIGFsaXN0IGVudHJ5IGZvciAn ZGlzcGxheS1idWZmZXInLgogVGhpcyBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIHRoZSB2YXJpYWJs ZSBvZiB0aGUgc2FtZSBuYW1lIGFuZCB0YWtlcwpkaWZmIC0tZ2l0IGEvZXRjL1RPRE8gYi9ldGMv VE9ETwppbmRleCBkMmQxMjRjOWM4ZS4uMDFmMTQyM2NmOGUgMTAwNjQ0Ci0tLSBhL2V0Yy9UT0RP CisrKyBiL2V0Yy9UT0RPCkBAIC0xNTYsMTAgKzE1Niw2IEBAIENoYW5nZSB0aGVtIHRvIHVzZSBy ZXBvcnQtZW1hY3MtYnVnLgogKioqKiBsbS1yZXBvcnQtYnVnCiAqKioqIHRyYW1wLWJ1ZwogKioq KiBjLXN1Ym1pdC1idWctcmVwb3J0Ci0KLSoqIEFsbG93IGZyaW5nZSBpbmRpY2F0b3JzIHRvIGRp c3BsYXkgYSB0b29sdGlwCi1Qcm92aWRlIGEgaGVscC1lY2hvIHByb3BlcnR5PwotCiAqKiBBZGQg YSBkZWZjdXN0b20gdGhhdCBzdXBwbGllcyBhIGZ1bmN0aW9uIHRvIG5hbWUgbnVtZXJpYyBiYWNr dXAgZmlsZXMKIExpa2UgJ21ha2UtYmFja3VwLWZpbGUtbmFtZS1mdW5jdGlvbicgZm9yIG5vbi1u dW1lcmljIGJhY2t1cCBmaWxlcy4KCmRpZmYgLS1naXQgYS9zcmMveGRpc3AuYyBiL3NyYy94ZGlz cC5jCmluZGV4IDJhOTc5YzVjYjllLi5mZDk0YWJkZDM3OSAxMDA2NDQKLS0tIGEvc3JjL3hkaXNw LmMKKysrIGIvc3JjL3hkaXNwLmMKQEAgLTM1NDY4LDYgKzM1NDY4LDY4IEBAIG5vdGVfbW9kZV9s aW5lX29yX21hcmdpbl9oaWdobGlnaHQgKExpc3BfT2JqZWN0IHdpbmRvdywgaW50IHgsIGludCB5 LAogfQoKCisvKiBUYWtlIHByb3BlciBhY3Rpb24gd2hlbiBtb3VzZSBoYXMgbW92ZWQgdG8gdGhl IHdpbmRvdyBXSU5ET1csIHdpdGgKKyAgIHdpbmRvdy1sb2NhbCB4LXBvc2l0aW9uIFggYW5kIHkt cG9zaXRpb24gWS4gVGhpcyBpcyBvbmx5IHVzZWQgZm9yCisgICBkaXNwbGF5aW5nIHVzZXItZGVm aW5lZCBmcmluZ2UgaW5kaWNhdG9yIGhlbHAtZWNobyBtZXNzYWdlcy4gICAgKi8KKworc3RhdGlj IHZvaWQKK25vdGVfZnJpbmdlX2hpZ2hsaWdodCAoTGlzcF9PYmplY3Qgd2luZG93LCBpbnQgeCwg aW50IHksCisJCSAgICAgICBlbnVtIHdpbmRvd19wYXJ0IHBhcnQpCit7CisgIGlmICghTklMUCAo aGVscF9lY2hvX3N0cmluZykpCisgICAgcmV0dXJuOworCisgIC8qIEZpbmQgYSBtZXNzYWdlIHRv IGRpc3BsYXkgdGhyb3VnaCB0aHJvdWdoIHRoZSBoZWxwLWVjaG8gbWVjaGFuaXNtCisgICAgIHdo ZW5ldmVyIHRoZSBtb3VzZSBob3ZlcnMgb3ZlciBhIGZyaW5nZSBpbmRpY2F0b3IuIFRoZSBtZXNz YWdlCisgICAgIGNhbiBjb21lIGZyb20gYW55IHBvc2l0aW9uIGluIHRoZSByb3csIGludmlzaWJp bGUgcG9ydGlvbnMgb2YgdGhlCisgICAgIGJ1ZmZlciBpbmNsdWRlZC4gU28gd2UgaXRlcmF0ZSBv dmVyIGFsbCBwb3NpdGlvbnMgdGhhdCB0aGUKKyAgICAgY3VycmVudCB0ZXh0IHJvdyBkZXBlbmRz IG9udGhlIGN1cnJlbnQgcm93LCBjaGVja2luZyBib3RoCisgICAgIHByb3BlcnRpZXMgYW5kIG92 ZXJsYXlzLiAgKi8KKworICAvKiBUcmFuc2xhdGUgd2luZG93cyBjb29yZGluYXRlcyBpbnRvIGEg dmVydGljYWwgd2luZG93IHBvc2l0aW9uLiAqLworICBpbnQgaHBvcywgdnBvcywgYXJlYTsKKyAg c3RydWN0IHdpbmRvdyAqdyA9IFhXSU5ET1cgKHdpbmRvdyk7CisgIHhfeV90b19ocG9zX3Zwb3Mg KHcsIHgsIHksICZocG9zLCAmdnBvcywgMCwgMCwgJmFyZWEpOworCisgIC8qIEdldCB0byB0aGUg Y3VycmVudCBnbHlwaCByb3cuICovCisgIHN0cnVjdCBnbHlwaF9yb3cgKnJvdyA9IE1BVFJJWF9S T1cgKHctPmN1cnJlbnRfbWF0cml4LCB2cG9zKTsKKworICAvKiBObyBmcmluZ2UgaW5kaWNhdG9y cyAtIG5vIG5lZWQgdG8gbG9vayB0aGluZ3MgdXAgICovCisgIGlmIChyb3ctPmxlZnRfdXNlcl9m cmluZ2VfYml0bWFwID09IDAgJiYKKyAgICAgIHJvdy0+cmlnaHRfdXNlcl9mcmluZ2VfYml0bWFw ID09IDApCisgICAgcmV0dXJuOworCisgIC8qIENoZWNrIGRpc3BsYXkgc3BlY3MgZm9yIGJvdGgg dmlzdWFsIGFuZCBpbnZpc2libGUgdGV4dCBpbiB0aGUKKyAgICAgcm93LiAqLworICBwdHJkaWZm X3QgY2hhcnBvczsKKyAgcHRyZGlmZl90IGNoYXJwb3Nfc3RhcnQgPSByb3ctPm1pbnBvcy5jaGFy cG9zOworICBwdHJkaWZmX3QgY2hhcnBvc19lbmQgPSByb3ctPm1heHBvcy5jaGFycG9zOworICBm b3IgKGNoYXJwb3MgPSBjaGFycG9zX3N0YXJ0OyBjaGFycG9zIDw9IGNoYXJwb3NfZW5kOyBjaGFy cG9zKyspCisgICAgeworICAgICAgLyogUHJvcGVydGllcyBpbiBxdWVzdGlvbiBjYW4gYmUgZWl0 aGVyIGluIHRleHQgcHJvcHMgb3IKKyAgICAgICAgIG92ZXJsYXlzLCBzbyBjaGVjayBib3RoLiAq LworICAgICAgTGlzcF9PYmplY3Qgc3BlYyA9IGdldF9jaGFyX3Byb3BlcnR5X2FuZF9vdmVybGF5 IChtYWtlX2ZpeG51bSAoY2hhcnBvcyksCisJCQkJCQkJUWRpc3BsYXksIFFuaWwsIE5VTEwpOwor ICAgICAgaWYgKE5JTFAoc3BlYykgfHwgIUNPTlNQKHNwZWMpKQorCWNvbnRpbnVlOworCisgICAg ICAvKiBIb3ZlcmluZyBvdmVyIHRoZSByaWdodCBmcmluZ2UgLSBjaGVjayB0aGUgcmlnaHQtZnJp bmdlCisgICAgICAgICBzcGVjICAqLworICAgICAgLyogSG92ZXJpbmcgb3ZlciB0aGUgbGVmdCBm cmluZ2UgLSBjaGVjayB0aGUgbGVmdC1mcmluZ2UKKyAgICAgICAgIHNwZWMgICovCisgICAgICBp ZiAoIShFUSAoWENBUiAoc3BlYyksIFFsZWZ0X2ZyaW5nZSkgJiYgcGFydCA9PSBPTl9MRUZUX0ZS SU5HRSkgJiYKKwkgICEoRVEgKFhDQVIgKHNwZWMpLCBRcmlnaHRfZnJpbmdlKSAmJiBwYXJ0ID09 IE9OX1JJR0hUX0ZSSU5HRSkpCisJY29udGludWU7CisKKyAgICAgIC8qIEdldCB0aGUgY2FwdGlv biB3aGlsZSBpbmdvcmluZyBhbGwgbm9uLXN0cmluZ3MgKi8KKyAgICAgIExpc3BfT2JqZWN0IGZy aW5nZV9oZWxwX2VjaG8gPSBDQVJfU0FGRSAoQ0RSX1NBRkUgKENEUl9TQUZFIChDRFJfU0FGRSAo c3BlYykpKSk7CisgICAgICBpZiAoIVNUUklOR1AgKGZyaW5nZV9oZWxwX2VjaG8pKQorCWNvbnRp bnVlOworCisgICAgICBoZWxwX2VjaG9fc3RyaW5nID0gZnJpbmdlX2hlbHBfZWNobzsKKyAgICB9 Cit9CisKIC8qIEVYUE9SVDoKICAgIFRha2UgcHJvcGVyIGFjdGlvbiB3aGVuIHRoZSBtb3VzZSBo YXMgbW92ZWQgdG8gcG9zaXRpb24gWCwgWSBvbgogICAgZnJhbWUgRiB3aXRoIHJlZ2FyZHMgdG8g aGlnaGxpZ2h0aW5nIHBvcnRpb25zIG9mIGRpc3BsYXkgdGhhdCBoYXZlCkBAIC0zNTY5NSwxMCAr MzU3NTcsMTQgQEAgbm90ZV9tb3VzZV9oaWdobGlnaHQgKHN0cnVjdCBmcmFtZSAqZiwgaW50IHgs IGludCB5KQogICAgICAgfQogICAgIGVsc2UKICAgICAgIGN1cnNvciA9IEZSQU1FX09VVFBVVF9E QVRBIChmKS0+bm9udGV4dF9jdXJzb3I7Ci0gIGVsc2UgaWYgKHBhcnQgPT0gT05fTEVGVF9GUklO R0UgfHwgcGFydCA9PSBPTl9SSUdIVF9GUklOR0UKLQkgICB8fCBwYXJ0ID09IE9OX1ZFUlRJQ0FM X1NDUk9MTF9CQVIKLQkgICB8fCBwYXJ0ID09IE9OX0hPUklaT05UQUxfU0NST0xMX0JBUikKKyAg ZWxzZSBpZiAocGFydCA9PSBPTl9MRUZUX0ZSSU5HRSB8fCBwYXJ0ID09IE9OX1JJR0hUX0ZSSU5H RSkgewogICAgIGN1cnNvciA9IEZSQU1FX09VVFBVVF9EQVRBIChmKS0+bm9udGV4dF9jdXJzb3I7 CisKKyAgICBub3RlX2ZyaW5nZV9oaWdobGlnaHQgKHdpbmRvdywgeCwgeSwgcGFydCk7CisgIH0K KyAgZWxzZSBpZiAocGFydCA9PSBPTl9WRVJUSUNBTF9TQ1JPTExfQkFSCisJICAgfHwgcGFydCA9 PSBPTl9IT1JJWk9OVEFMX1NDUk9MTF9CQVIpCisgICAgICBjdXJzb3IgPSBGUkFNRV9PVVRQVVRf REFUQSAoZiktPm5vbnRleHRfY3Vyc29yOwogICBlbHNlCiAgICAgY3Vyc29yID0gRlJBTUVfT1VU UFVUX0RBVEEgKGYpLT50ZXh0X2N1cnNvcjsKICNlbmRpZgotLQoyLjM0LjEK --000000000000fd4b7f060d3fca25--