From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Erik Charlebois Newsgroups: gmane.emacs.bugs Subject: bug#14180: PATCH Better fullscreen frame support on Windows Date: Thu, 11 Apr 2013 00:59:54 -0400 Message-ID: NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=90e6ba5bbaa34e14ea04da0ea88b X-Trace: ger.gmane.org 1365656481 23312 80.91.229.3 (11 Apr 2013 05:01:21 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 11 Apr 2013 05:01:21 +0000 (UTC) To: 14180@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Thu Apr 11 07:01:25 2013 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1UQ9dT-0005Ud-RL for geb-bug-gnu-emacs@m.gmane.org; Thu, 11 Apr 2013 07:01:24 +0200 Original-Received: from localhost ([::1]:37699 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UQ9dT-0006zM-3i for geb-bug-gnu-emacs@m.gmane.org; Thu, 11 Apr 2013 01:01:23 -0400 Original-Received: from eggs.gnu.org ([208.118.235.92]:42148) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UQ9dN-0006z3-TR for bug-gnu-emacs@gnu.org; Thu, 11 Apr 2013 01:01:19 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UQ9dL-0003FX-Qg for bug-gnu-emacs@gnu.org; Thu, 11 Apr 2013 01:01:17 -0400 Original-Received: from debbugs.gnu.org ([140.186.70.43]:40468) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UQ9dL-0003FR-Mc for bug-gnu-emacs@gnu.org; Thu, 11 Apr 2013 01:01:15 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.72) (envelope-from ) id 1UQ9h0-0001jh-EH for bug-gnu-emacs@gnu.org; Thu, 11 Apr 2013 01:05:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Erik Charlebois Original-Sender: debbugs-submit-bounces@debbugs.gnu.org Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 11 Apr 2013 05:05:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 14180 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.13656566526318 (code B ref -1); Thu, 11 Apr 2013 05:05:02 +0000 Original-Received: (at submit) by debbugs.gnu.org; 11 Apr 2013 05:04:12 +0000 Original-Received: from localhost ([127.0.0.1]:44577 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1UQ9g3-0001cI-Qw for submit@debbugs.gnu.org; Thu, 11 Apr 2013 01:04:11 -0400 Original-Received: from eggs.gnu.org ([208.118.235.92]:58892) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1UQ9fq-0001Zp-03 for submit@debbugs.gnu.org; Thu, 11 Apr 2013 01:04:01 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UQ9c8-0002wT-H8 for submit@debbugs.gnu.org; Thu, 11 Apr 2013 01:00:02 -0400 Original-Received: from lists.gnu.org ([208.118.235.17]:47257) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UQ9c8-0002wP-E5 for submit@debbugs.gnu.org; Thu, 11 Apr 2013 01:00:00 -0400 Original-Received: from eggs.gnu.org ([208.118.235.92]:41993) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UQ9c6-0006iR-BP for bug-gnu-emacs@gnu.org; Thu, 11 Apr 2013 01:00:00 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UQ9c4-0002vF-A3 for bug-gnu-emacs@gnu.org; Thu, 11 Apr 2013 00:59:58 -0400 Original-Received: from mail-ie0-x22e.google.com ([2607:f8b0:4001:c03::22e]:48419) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UQ9c4-0002v7-2A for bug-gnu-emacs@gnu.org; Thu, 11 Apr 2013 00:59:56 -0400 Original-Received: by mail-ie0-f174.google.com with SMTP id aq17so1523150iec.19 for ; Wed, 10 Apr 2013 21:59:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:date:message-id:subject:from:to :content-type; bh=3oX6Ze8O3U5H7NYx6UgHjm+IVMrVdX5RjCPXR8ZQ1CI=; b=VKfPj2mjwOyCjDrq88nBhH01qaDub7qAzMiKWHmONIwOsSSFKMxqzUkF2XLSZEpYzi y+baQRaK9tzFUIbTL5oOVHozKZIb4jdpF1P2BQ/cWRCC1bjL0OcTX4h0hV5Q7JVvmjnt f8vOaqdbszFZe6IEAnD/zUkPmWURF1xIv4APGZuik4XBceVS4kVVnc1Wqe04D8m9rXno 9Ut7TTfy2qTJtVj3jbp6Prd2lyyubHzvr8IHcrfVWStKZds0Kps2TGRrWB99hsGpRqK3 c1aN1FYv1pzhIndlpMV8uosEqAeiJ+0A/n+Sg+hUOAMxtPo607KDZDWfGm5KUd9+wlVm 1sMA== X-Received: by 10.42.64.135 with SMTP id g7mr2910129ici.37.1365656394927; Wed, 10 Apr 2013 21:59:54 -0700 (PDT) Original-Received: by 10.64.27.3 with HTTP; Wed, 10 Apr 2013 21:59:54 -0700 (PDT) X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 140.186.70.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:73326 Archived-At: --90e6ba5bbaa34e14ea04da0ea88b Content-Type: multipart/alternative; boundary=90e6ba5bbaa34e14e704da0ea889 --90e6ba5bbaa34e14e704da0ea889 Content-Type: text/plain; charset=UTF-8 Description This change improves the 'fullscreen' frame support on Windows. When going to fullscreen, the frame gets fullscreened with no window decorations (which causes the Windows task bar to also disappear) on the nearest monitor. The old fullscreen functionality was actually 'maximize' behavior so I've moved that to 'maximize'. 'fullwidth' and 'fullheight' are now ignored because they were buggy (at least in Windows 8, they were not being sized correctly) and are not common Windows idioms. While they could be supported, I'd do it as follow on work and get it working right on multiple monitors as well. I've tested corner cases such as resolution changes and disconnect monitors; in both cases the fullscreen window stays fullscreen (and moves to a different monitor for the disconnect case). I've modified the response to WM_WINDOWPOSCHANGED to do nothing when the frame is fullscreen. Otherwise, the size gets tuned to a multiple of the character cells and the fullscreen isn't perfectly matching the screen. When this happens, Windows' special behavior to hide the taskbar doesn't kick in. Changelog 2013-04-11 Erik Charlebois * src/w32fns.c (monitor_from_window_fn): New Windows API import. (w32_monitor_rect): New function to get nearest monitor rect. * src/w32term.c (w32_fullscreen_hook): Renamed from w32fullscreen_hook for consistency. Rewritten for improved fullscreen support. (I signed the FSF copyright assignment papers in January so I'm ok on that front.) --90e6ba5bbaa34e14e704da0ea889 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Description

This chan= ge improves the 'fullscreen' frame support on Windows. When going t= o
fullscreen, the frame gets fullscreened with no window decorations (w= hich causes the
Windows task bar to also disappear) on the nearest monitor.

The old fullscreen functionality was actually 'maximize' b= ehavior so I've moved that to
'maximize'. 'fullwi= dth' and 'fullheight' are now ignored because they were buggy (= at least in
Windows 8, they were not being sized correctly) and are not common Win= dows idioms.
While they could be supported, I'd do it as foll= ow on work and get it working right on
multiple monitors as well.=

I've tested corner cases such as resolution ch= anges and disconnect monitors; in both
cases the fullscreen windo= w stays fullscreen (and moves to a different monitor for the
disconnect case).

I've modified the respon= se to WM_WINDOWPOSCHANGED to do nothing when the
frame is f= ullscreen. Otherwise, the size gets tuned to a multiple of the character ce= lls and=C2=A0
the fullscreen isn't perfectly matching the screen. When thi= s happens, Windows' special
behavior to hide the taskba= r doesn't kick in.

Changelog

2013-04-11 = =C2=A0Erik Charlebois =C2=A0<erikcharlebois@gmail.com>

* src/w32fns.c (monitor_from_window_fn): Ne= w Windows API import.
(w32_monitor_rect): Ne= w function to get nearest monitor rect.
* src/w32term.c (w32_fullscreen_hook): Renamed from w32f= ullscreen_hook
for consistency. Rewritten fo= r improved fullscreen support.


(I signed the FSF copyright = assignment papers in January so I'm ok on that front.)
--90e6ba5bbaa34e14e704da0ea889-- --90e6ba5bbaa34e14ea04da0ea88b Content-Type: text/plain; charset=US-ASCII; name="W32_FULLSCREEN.txt" Content-Disposition: attachment; filename="W32_FULLSCREEN.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hfdgjpa50 IyBCYXphYXIgbWVyZ2UgZGlyZWN0aXZlIGZvcm1hdCAyIChCYXphYXIgMC45MCkKIyByZXZpc2lv bl9pZDogZXJpa2NoYXJsZWJvaXNAZ21haWwuY29tLTIwMTMwNDExMDQyMjMyLVwKIyAgIG85ZnMx M3c2bWpzNXAxb3gKIyB0YXJnZXRfYnJhbmNoOiBmaWxlOi8vL0M6L1VzZXJzL0VyaWsvU291cmNl L2VtYWNzL3RydW5rLwojIHRlc3RhbWVudF9zaGExOiBmYjkyNzY5NDVlNDVhYjUyOTVjNDQ2YzY3 N2Q4NjljMTgxZDBkMDNkCiMgdGltZXN0YW1wOiAyMDEzLTA0LTExIDAwOjM0OjI4IC0wNDAwCiMg YmFzZV9yZXZpc2lvbl9pZDogcmdtQGdudS5vcmctMjAxMzA0MTAwMTIyMTUtMGFsZzlzcG13cG1p Ymk0NQojIAojIEJlZ2luIHBhdGNoCj09PSBtb2RpZmllZCBmaWxlICdzcmMvdzMyZm5zLmMnCi0t LSBzcmMvdzMyZm5zLmMJMjAxMy0wNC0wNyAwNDo0MToxOSArMDAwMAorKysgc3JjL3czMmZucy5j CTIwMTMtMDQtMTEgMDQ6MjI6MzIgKzAwMDAKQEAgLTE1Nyw2ICsxNTcsOCBAQAogdHlwZWRlZiBI TU9OSVRPUiAoV0lOQVBJICogTW9uaXRvckZyb21Qb2ludF9Qcm9jKSAoSU4gUE9JTlQgcHQsIElO IERXT1JEIGZsYWdzKTsKIHR5cGVkZWYgQk9PTCAoV0lOQVBJICogR2V0TW9uaXRvckluZm9fUHJv YykKICAgKElOIEhNT05JVE9SIG1vbml0b3IsIE9VVCBzdHJ1Y3QgTU9OSVRPUl9JTkZPKiBpbmZv KTsKK3R5cGVkZWYgSE1PTklUT1IgKFdJTkFQSSAqIE1vbml0b3JGcm9tV2luZG93X1Byb2MpCisg IChJTiBIV05EIGh3bmQsIElOIERXT1JEIGR3RmxhZ3MpOwogCiBUcmFja01vdXNlRXZlbnRfUHJv YyB0cmFja19tb3VzZV9ldmVudF9mbiA9IE5VTEw7CiBJbW1HZXRDb21wb3NpdGlvblN0cmluZ19Q cm9jIGdldF9jb21wb3NpdGlvbl9zdHJpbmdfZm4gPSBOVUxMOwpAQCAtMTY1LDYgKzE2Nyw3IEBA CiBJbW1TZXRDb21wb3NpdGlvbldpbmRvd19Qcm9jIHNldF9pbWVfY29tcG9zaXRpb25fd2luZG93 X2ZuID0gTlVMTDsKIE1vbml0b3JGcm9tUG9pbnRfUHJvYyBtb25pdG9yX2Zyb21fcG9pbnRfZm4g PSBOVUxMOwogR2V0TW9uaXRvckluZm9fUHJvYyBnZXRfbW9uaXRvcl9pbmZvX2ZuID0gTlVMTDsK K01vbml0b3JGcm9tV2luZG93X1Byb2MgbW9uaXRvcl9mcm9tX3dpbmRvd19mbiA9IE5VTEw7CiAK ICNpZmRlZiBOVEdVSV9VTklDT0RFCiAjZGVmaW5lIHVuaWNvZGVfYXBwZW5kX21lbnUgQXBwZW5k TWVudVcKQEAgLTMzNiw2ICszMzksMzQgQEAKICAgKnlwdHIgPSByZWN0LnRvcDsKIH0KIAordm9p ZAordzMyX21vbml0b3JfcmVjdCAoc3RydWN0IGZyYW1lICpmLCBSRUNUICpyZWN0KQoreworI2lm ZGVmIEhBVkVfV0lORE9XX1NZU1RFTQorICBpZiAoZikKKyAgICB7CisgICAgICAvKiBJZiBtdWx0 aXBsZSBtb25pdG9yIHN1cHBvcnQgaXMgYXZhaWxhYmxlLCBtYWtlIHRoZSB3aW5kb3cKKyAgICAg ICAgIGZ1bGxzY3JlZW4gb24gdGhlIGFwcHJvcHJpYXRlIHNjcmVlbi4gKi8KKyAgICAgIGlmICht b25pdG9yX2Zyb21fd2luZG93X2ZuICYmIGdldF9tb25pdG9yX2luZm9fZm4pCisgICAgICAgIHsK KyAgICAgICAgICBIV05EIGh3bmQgPSBGUkFNRV9XMzJfV0lORE9XIChmKTsKKyAgICAgICAgICBz dHJ1Y3QgTU9OSVRPUl9JTkZPIG1pID0geyBzaXplb2YobWkpIH07CisgICAgICAgICAgSE1PTklU T1IgbW9uaXRvciA9CisgICAgICAgICAgICBtb25pdG9yX2Zyb21fd2luZG93X2ZuIChod25kLCBN T05JVE9SX0RFRkFVTFRfVE9fTkVBUkVTVCk7CisgICAgICAgICAgZ2V0X21vbml0b3JfaW5mb19m biAobW9uaXRvciwgJm1pKTsKKyAgICAgICAgICAqcmVjdCA9IG1pLnJjTW9uaXRvcjsKKyAgICAg ICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgcmVjdC0+bGVmdCA9IDA7Cisg ICAgICAgICAgcmVjdC0+cmlnaHQgPSBHZXRTeXN0ZW1NZXRyaWNzIChTTV9DWFNDUkVFTik7Cisg ICAgICAgICAgcmVjdC0+dG9wID0gMDsKKyAgICAgICAgICByZWN0LT5ib3R0b20gPSBHZXRTeXN0 ZW1NZXRyaWNzIChTTV9DWVNDUkVFTik7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKK30KKwog DAogCiBERUZVTiAoInczMi1kZWZpbmUtcmdiLWNvbG9yIiwgRnczMl9kZWZpbmVfcmdiX2NvbG9y LApAQCAtMzY5MSw2ICszNzIyLDEwIEBACiAgICAgICAvKiBEb24ndCByZXN0cmljdCB0aGUgc2l6 aW5nIG9mIHRpcCBmcmFtZXMuICAqLwogICAgICAgaWYgKGh3bmQgPT0gdGlwX3dpbmRvdykKIAly ZXR1cm4gMDsKKworICAgICAgZiA9IHhfd2luZG93X3RvX2ZyYW1lIChkcHlpbmZvLCBod25kKTsK KyAgICAgIGlmIChmICYmIEZSQU1FX1BSRVZfRlNNT0RFIChmKSA9PSBGVUxMU0NSRUVOX0JPVEgp CisgICAgICAgIHJldHVybiAwOwogICAgICAgewogCVdJTkRPV1BMQUNFTUVOVCB3cDsKIAlMUFdJ TkRPV1BPUyBscHBvcyA9IChXSU5ET1dQT1MgKikgbFBhcmFtOwpAQCAtMzgzOCw5ICszODczLDEz IEBACiAKICAgICBjYXNlIFdNX0VNQUNTX1NFVFdJTkRPV1BPUzoKICAgICAgIHsKLQlXSU5ET1dQ T1MgKiBwb3MgPSAoV0lORE9XUE9TICopIHdQYXJhbTsKLQlyZXR1cm4gU2V0V2luZG93UG9zICho d25kLCBwb3MtPmh3bmRJbnNlcnRBZnRlciwKLQkJCSAgICAgcG9zLT54LCBwb3MtPnksIHBvcy0+ Y3gsIHBvcy0+Y3ksIHBvcy0+ZmxhZ3MpOworICAgICAgICBmID0geF93aW5kb3dfdG9fZnJhbWUg KGRweWluZm8sIGh3bmQpOworICAgICAgICBpZiAoIWYgfHwgRlJBTUVfUFJFVl9GU01PREUgKGYp ICE9IEZVTExTQ1JFRU5fQk9USCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBXSU5ET1dQT1Mg KiBwb3MgPSAoV0lORE9XUE9TICopIHdQYXJhbTsKKyAgICAgICAgICAgIHJldHVybiBTZXRXaW5k b3dQb3MgKGh3bmQsIHBvcy0+aHduZEluc2VydEFmdGVyLAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgcG9zLT54LCBwb3MtPnksIHBvcy0+Y3gsIHBvcy0+Y3ksIHBvcy0+ZmxhZ3Mp OworICAgICAgICAgIH0KICAgICAgIH0KIAogICAgIGNhc2UgV01fRU1BQ1NfREVTVFJPWVdJTkRP VzoKQEAgLTc2MzUsNiArNzY3NCw4IEBACiAgICAgR2V0UHJvY0FkZHJlc3MgKHVzZXIzMl9saWIs ICJNb25pdG9yRnJvbVBvaW50Iik7CiAgIGdldF9tb25pdG9yX2luZm9fZm4gPSAoR2V0TW9uaXRv ckluZm9fUHJvYykKICAgICBHZXRQcm9jQWRkcmVzcyAodXNlcjMyX2xpYiwgIkdldE1vbml0b3JJ bmZvQSIpOworICBtb25pdG9yX2Zyb21fd2luZG93X2ZuID0gKE1vbml0b3JGcm9tV2luZG93X1By b2MpCisgICAgR2V0UHJvY0FkZHJlc3MgKHVzZXIzMl9saWIsICJNb25pdG9yRnJvbVdpbmRvdyIp OwogCiAgIHsKICAgICBITU9EVUxFIGltbTMyX2xpYiA9IEdldE1vZHVsZUhhbmRsZSAoImltbTMy LmRsbCIpOwoKPT09IG1vZGlmaWVkIGZpbGUgJ3NyYy93MzJ0ZXJtLmMnCi0tLSBzcmMvdzMydGVy bS5jCTIwMTMtMDQtMDEgMDc6NTg6MDQgKzAwMDAKKysrIHNyYy93MzJ0ZXJtLmMJMjAxMy0wNC0x MSAwNDoyMjozMiArMDAwMApAQCAtMjM3LDcgKzIzNyw3IEBACiAjZW5kaWYKIHN0YXRpYyB2b2lk IG15X3NldF9mb3JlZ3JvdW5kX3dpbmRvdyAoSFdORCk7CiBzdGF0aWMgdm9pZCBteV9kZXN0cm95 X3dpbmRvdyAoc3RydWN0IGZyYW1lICosIEhXTkQpOwotc3RhdGljIHZvaWQgdzMyZnVsbHNjcmVl bl9ob29rIChGUkFNRV9QVFIpOworc3RhdGljIHZvaWQgdzMyX2Z1bGxzY3JlZW5faG9vayAoRlJB TUVfUFRSKTsKIAogI2lmZGVmIEdMWVBIX0RFQlVHCiBzdGF0aWMgdm9pZCB4X2NoZWNrX2ZvbnQg KHN0cnVjdCBmcmFtZSAqLCBzdHJ1Y3QgZm9udCAqKTsKQEAgLTQ3MjAsNyArNDcyMCw3IEBACiAJ CSBzZXRzIHRoZSBXQUlUIGZsYWcuICAqLwogCSAgICAgIGlmICgobXNnLm1zZy5tZXNzYWdlID09 IFdNX1dJTkRPV1BPU0NIQU5HRUQgfHwgbXNnLm1zZy53UGFyYW0pCiAJCSAgJiYgKGYtPndhbnRf ZnVsbHNjcmVlbiAmIEZVTExTQ1JFRU5fV0FJVCkpCi0JCXczMmZ1bGxzY3JlZW5faG9vayAoZik7 CisJCXczMl9mdWxsc2NyZWVuX2hvb2sgKGYpOwogCSAgICAgIHhfY2hlY2tfZnVsbHNjcmVlbiAo Zik7CiAJICAgIH0KIAkgIGNoZWNrX3Zpc2liaWxpdHkgPSAxOwpAQCAtNTY1OSw5MiArNTY1OSw2 MyBAQAogfQogCiBzdGF0aWMgdm9pZAotdzMyZnVsbHNjcmVlbl9ob29rIChGUkFNRV9QVFIgZikK K3czMl9mdWxsc2NyZWVuX2hvb2sgKEZSQU1FX1BUUiBmKQogewogICBpZiAoRlJBTUVfVklTSUJM RV9QIChmKSkKICAgICB7Ci0gICAgICBpbnQgd2lkdGgsIGhlaWdodCwgdG9wX3BvcywgbGVmdF9w b3MsIHBpeGVsX2hlaWdodCwgcGl4ZWxfd2lkdGg7Ci0gICAgICBpbnQgY3VyX3cgPSBGUkFNRV9D T0xTIChmKSwgY3VyX2ggPSBGUkFNRV9MSU5FUyAoZik7Ci0gICAgICBSRUNUIHdvcmthcmVhX3Jl Y3Q7CisgICAgICBIV05EIGh3bmQgPSBGUkFNRV9XMzJfV0lORE9XKGYpOworICAgICAgRFdPUkQg ZHdTdHlsZSA9IEdldFdpbmRvd0xvbmcgKGh3bmQsIEdXTF9TVFlMRSk7CisgICAgICBNT05JVE9S SU5GTyBtaSA9IHsgc2l6ZW9mKG1pKSB9OworICAgICAgaW50IHByZXZfZnNtb2RlID0gRlJBTUVf UFJFVl9GU01PREUgKGYpOwogCiAgICAgICBibG9ja19pbnB1dCAoKTsKLSAgICAgIC8qIFJlY29y ZCBjdXJyZW50ICJub3JtYWwiIGRpbWVuc2lvbnMgZm9yIHJlc3RvcmluZyBsYXRlci4gICovCi0g ICAgICBpZiAoISggICBGUkFNRV9QUkVWX0ZTTU9ERSAoZikgPT0gRlVMTFNDUkVFTl9CT1RICi0J ICAgIHx8IEZSQU1FX1BSRVZfRlNNT0RFIChmKSA9PSBGVUxMU0NSRUVOX01BWElNSVpFRCkpCi0J ewotCSAgaWYgKEZSQU1FX1BSRVZfRlNNT0RFIChmKSAhPSBGVUxMU0NSRUVOX0hFSUdIVCkKLQkg ICAgewotCSAgICAgIEZSQU1FX05PUk1BTF9IRUlHSFQgKGYpID0gY3VyX2g7Ci0JICAgICAgRlJB TUVfTk9STUFMX1RPUCAoZikgPSBmLT50b3BfcG9zOwotCSAgICB9Ci0JICBpZiAoRlJBTUVfUFJF Vl9GU01PREUgKGYpICE9IEZVTExTQ1JFRU5fV0lEVEgpCi0JICAgIHsKLQkgICAgICBGUkFNRV9O T1JNQUxfV0lEVEggKGYpICA9IGN1cl93OwotCSAgICAgIEZSQU1FX05PUk1BTF9MRUZUIChmKSA9 IGYtPmxlZnRfcG9zOwotCSAgICB9Ci0JfQotICAgICAgZWFzc2VydCAoRlJBTUVfTk9STUFMX0hF SUdIVCAoZikgPiAwKTsKLSAgICAgIGVhc3NlcnQgKEZSQU1FX05PUk1BTF9XSURUSCAoZikgPiAw KTsKLSAgICAgIHhfcmVhbF9wb3NpdGlvbnMgKGYsICZmLT5sZWZ0X3BvcywgJmYtPnRvcF9wb3Mp OwotICAgICAgeF9mdWxsc2NyZWVuX2FkanVzdCAoZiwgJndpZHRoLCAmaGVpZ2h0LCAmdG9wX3Bv cywgJmxlZnRfcG9zKTsKLQotICAgICAgU3lzdGVtUGFyYW1ldGVyc0luZm8gKFNQSV9HRVRXT1JL QVJFQSwgMCwgJndvcmthcmVhX3JlY3QsIDApOwotICAgICAgcGl4ZWxfaGVpZ2h0ID0gd29ya2Fy ZWFfcmVjdC5ib3R0b20gLSB3b3JrYXJlYV9yZWN0LnRvcDsKLSAgICAgIHBpeGVsX3dpZHRoICA9 IHdvcmthcmVhX3JlY3QucmlnaHQgIC0gd29ya2FyZWFfcmVjdC5sZWZ0OwotICAgICAgLyogTmVl ZCB0byBzZW5kIFNDX1JFU1RPUkUgdG8gdGhlIHdpbmRvdywgaW4gY2FzZSB3ZSBhcmUKLQkgcmVz aXppbmcgZnJvbSBGVUxMU0NSRUVOX01BWElNSVpFRC4gIE90aGVyd2lzZSwgdGhlIG1vdXNlCi0J IHJlc2l6ZSBoaW50cyB3aWxsIG5vdCBiZSBzaG93biBieSB0aGUgd2luZG93IG1hbmFnZXIgd2hl biB0aGUKLQkgbW91c2UgcG9pbnRlciBob3ZlcnMgb3ZlciB0aGUgd2luZG93IGVkZ2VzLCBiZWNh dXNlIHRoZSBXTQotCSB3aWxsIHN0aWxsIHRoaW5rIHRoZSB3aW5kb3cgaXMgbWF4aW1pemVkLiAg Ki8KLSAgICAgIGlmIChmLT53YW50X2Z1bGxzY3JlZW4gIT0gRlVMTFNDUkVFTl9CT1RIKQotCVNl bmRNZXNzYWdlIChGUkFNRV9XMzJfV0lORE9XIChmKSwgV01fU1lTQ09NTUFORCwgU0NfUkVTVE9S RSwgMCk7CiAKICAgICAgIEZSQU1FX1BSRVZfRlNNT0RFIChmKSA9IGYtPndhbnRfZnVsbHNjcmVl bjsKICAgICAgIHN3aXRjaCAoZi0+d2FudF9mdWxsc2NyZWVuKQogCXsKIAljYXNlIEZVTExTQ1JF RU5fQk9USDoKLQkgIFBvc3RNZXNzYWdlIChGUkFNRV9XMzJfV0lORE9XIChmKSwgV01fU1lTQ09N TUFORCwgU0NfTUFYSU1JWkUsIDApOworICAgICAgICAgIGlmIChwcmV2X2ZzbW9kZSA9PSBGVUxM U0NSRUVOX01BWElNSVpFRCkKKyAgICAgICAgICAgIFNlbmRNZXNzYWdlIChod25kLCBXTV9TWVND T01NQU5ELCBTQ19SRVNUT1JFLCAwKTsKKworICAgICAgICAgIGlmIChwcmV2X2ZzbW9kZSAhPSBG VUxMU0NSRUVOX0JPVEgpCisgICAgICAgICAgICBHZXRXaW5kb3dQbGFjZW1lbnQgKGh3bmQsICZG UkFNRV9OT1JNQUxfUExBQ0VNRU5UIChmKSk7CisKKyAgICAgICAgICBSRUNUIHJlY3Q7CisgICAg ICAgICAgdzMyX21vbml0b3JfcmVjdCAoZiwgJnJlY3QpOworICAgICAgICAgIFNldFdpbmRvd0xv bmcgKGh3bmQsIEdXTF9TVFlMRSwgZHdTdHlsZSAmIH5XU19PVkVSTEFQUEVEV0lORE9XKTsKKwor ICAgICAgICAgIFNldFdpbmRvd1BvcyAoaHduZCwgSFdORF9UT1AsIHJlY3QubGVmdCwgcmVjdC50 b3AsCisgICAgICAgICAgICAgICAgICAgICAgICByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0LCByZWN0 LmJvdHRvbSAtIHJlY3QudG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgU1dQX05PT1dORVJa T1JERVIgfCBTV1BfRlJBTUVDSEFOR0VEKTsKIAkgIGJyZWFrOwogCWNhc2UgRlVMTFNDUkVFTl9N QVhJTUlaRUQ6Ci0JICBoZWlnaHQgPQotCSAgICBGUkFNRV9QSVhFTF9IRUlHSFRfVE9fVEVYVF9M SU5FUyAoZiwgcGl4ZWxfaGVpZ2h0KQotCSAgICAtIFhJTlQgKEZ0b29sX2Jhcl9saW5lc19uZWVk ZWQgKHNlbGVjdGVkX2ZyYW1lKSkKLQkgICAgKyAoTklMUCAoVm1lbnVfYmFyX21vZGUpID8gMSA6 IDApOwotCSAgd2lkdGggID0KLQkgICAgRlJBTUVfUElYRUxfV0lEVEhfVE9fVEVYVF9DT0xTIChm LCBwaXhlbF93aWR0aCkKLQkgICAgLSBGUkFNRV9TQ1JPTExfQkFSX0NPTFMgKGYpOwotCSAgbGVm dF9wb3MgPSB3b3JrYXJlYV9yZWN0LmxlZnQ7Ci0JICB0b3BfcG9zID0gd29ya2FyZWFfcmVjdC50 b3A7CisgICAgICAgICAgaWYgKHByZXZfZnNtb2RlID09IEZVTExTQ1JFRU5fQk9USCkKKyAgICAg ICAgICAgIHsKKyAgICAgICAgICAgICAgU2V0V2luZG93TG9uZyAoaHduZCwgR1dMX1NUWUxFLCBk d1N0eWxlIHwgV1NfT1ZFUkxBUFBFRFdJTkRPVyk7CisgICAgICAgICAgICAgIFNldFdpbmRvd1Bs YWNlbWVudCAoaHduZCwgJkZSQU1FX05PUk1BTF9QTEFDRU1FTlQgKGYpKTsKKyAgICAgICAgICAg ICAgU2V0V2luZG93UG9zKGh3bmQsIE5VTEwsIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAg ICAgICAgICAgICBTV1BfTk9NT1ZFIHwgU1dQX05PU0laRSB8IFNXUF9OT1pPUkRFUiB8CisgICAg ICAgICAgICAgICAgICAgICAgICAgICBTV1BfTk9PV05FUlpPUkRFUiB8IFNXUF9GUkFNRUNIQU5H RUQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgUG9zdE1lc3NhZ2UgKEZSQU1FX1czMl9X SU5ET1cgKGYpLCBXTV9TWVNDT01NQU5ELCBTQ19NQVhJTUlaRSwgMCk7CiAJICBicmVhazsKIAlj YXNlIEZVTExTQ1JFRU5fV0lEVEg6Ci0JICB3aWR0aCAgPQotCSAgICBGUkFNRV9QSVhFTF9XSURU SF9UT19URVhUX0NPTFMgKGYsIHBpeGVsX3dpZHRoKQotCSAgICAtIEZSQU1FX1NDUk9MTF9CQVJf Q09MUyAoZik7Ci0JICBoZWlnaHQgPSBGUkFNRV9OT1JNQUxfSEVJR0hUIChmKTsKLQkgIGxlZnRf cG9zID0gd29ya2FyZWFfcmVjdC5sZWZ0OwotCSAgYnJlYWs7CiAJY2FzZSBGVUxMU0NSRUVOX0hF SUdIVDoKLQkgIGhlaWdodCA9Ci0JICAgIEZSQU1FX1BJWEVMX0hFSUdIVF9UT19URVhUX0xJTkVT IChmLCBwaXhlbF9oZWlnaHQpCi0JICAgIC0gWElOVCAoRnRvb2xfYmFyX2xpbmVzX25lZWRlZCAo c2VsZWN0ZWRfZnJhbWUpKQotCSAgICArIChOSUxQIChWbWVudV9iYXJfbW9kZSkgPyAxIDogMCk7 Ci0JICB3aWR0aCA9IEZSQU1FX05PUk1BTF9XSURUSCAoZik7Ci0JICB0b3BfcG9zID0gd29ya2Fy ZWFfcmVjdC50b3A7Ci0JICBicmVhazsKIAljYXNlIEZVTExTQ1JFRU5fTk9ORToKLQkgIGhlaWdo dCA9IEZSQU1FX05PUk1BTF9IRUlHSFQgKGYpOwotCSAgd2lkdGggPSBGUkFNRV9OT1JNQUxfV0lE VEggKGYpOwotCSAgbGVmdF9wb3MgPSBGUkFNRV9OT1JNQUxfTEVGVCAoZik7Ci0JICB0b3BfcG9z ID0gRlJBTUVfTk9STUFMX1RPUCAoZik7CisgICAgICAgICAgaWYgKHByZXZfZnNtb2RlID09IEZV TExTQ1JFRU5fQk9USCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgU2V0V2luZG93TG9u ZyAoaHduZCwgR1dMX1NUWUxFLCBkd1N0eWxlIHwgV1NfT1ZFUkxBUFBFRFdJTkRPVyk7CisgICAg ICAgICAgICAgIFNldFdpbmRvd1BsYWNlbWVudCAoaHduZCwgJkZSQU1FX05PUk1BTF9QTEFDRU1F TlQgKGYpKTsKKyAgICAgICAgICAgICAgU2V0V2luZG93UG9zKGh3bmQsIE5VTEwsIDAsIDAsIDAs IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1BfTk9NT1ZFIHwgU1dQX05PU0laRSB8 IFNXUF9OT1pPUkRFUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1BfTk9PV05FUlpP UkRFUiB8IFNXUF9GUkFNRUNIQU5HRUQpOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2Ug aWYgKHByZXZfZnNtb2RlID09IEZVTExTQ1JFRU5fTUFYSU1JWkVEKQorICAgICAgICAgICAgU2Vu ZE1lc3NhZ2UgKGh3bmQsIFdNX1NZU0NPTU1BTkQsIFNDX1JFU1RPUkUsIDApOwogCSAgYnJlYWs7 CiAJfQogCi0gICAgICBpZiAoY3VyX3cgIT0gd2lkdGggfHwgY3VyX2ggIT0gaGVpZ2h0KQotCXsK LQkgIHhfc2V0X29mZnNldCAoZiwgbGVmdF9wb3MsIHRvcF9wb3MsIDEpOwotCSAgeF9zZXRfd2lu ZG93X3NpemUgKGYsIDEsIHdpZHRoLCBoZWlnaHQpOwotCSAgZG9fcGVuZGluZ193aW5kb3dfY2hh bmdlICgwKTsKLQl9CiAgICAgICBmLT53YW50X2Z1bGxzY3JlZW4gPSBGVUxMU0NSRUVOX05PTkU7 CiAgICAgICB1bmJsb2NrX2lucHV0ICgpOwogICAgIH0KQEAgLTY0MzksNyArNjQxMCw3IEBACiAg IHRlcm1pbmFsLT5tb3VzZV9wb3NpdGlvbl9ob29rID0gdzMyX21vdXNlX3Bvc2l0aW9uOwogICB0 ZXJtaW5hbC0+ZnJhbWVfcmVoaWdobGlnaHRfaG9vayA9IHczMl9mcmFtZV9yZWhpZ2hsaWdodDsK ICAgdGVybWluYWwtPmZyYW1lX3JhaXNlX2xvd2VyX2hvb2sgPSB3MzJfZnJhbWVfcmFpc2VfbG93 ZXI7Ci0gIHRlcm1pbmFsLT5mdWxsc2NyZWVuX2hvb2sgPSB3MzJmdWxsc2NyZWVuX2hvb2s7Cisg IHRlcm1pbmFsLT5mdWxsc2NyZWVuX2hvb2sgPSB3MzJfZnVsbHNjcmVlbl9ob29rOwogICB0ZXJt aW5hbC0+c2V0X3ZlcnRpY2FsX3Njcm9sbF9iYXJfaG9vayA9IHczMl9zZXRfdmVydGljYWxfc2Ny b2xsX2JhcjsKICAgdGVybWluYWwtPmNvbmRlbW5fc2Nyb2xsX2JhcnNfaG9vayA9IHczMl9jb25k ZW1uX3Njcm9sbF9iYXJzOwogICB0ZXJtaW5hbC0+cmVkZWVtX3Njcm9sbF9iYXJfaG9vayA9IHcz Ml9yZWRlZW1fc2Nyb2xsX2JhcjsKCj09PSBtb2RpZmllZCBmaWxlICdzcmMvdzMydGVybS5oJwot LS0gc3JjL3czMnRlcm0uaAkyMDEzLTA0LTA3IDA0OjQxOjE5ICswMDAwCisrKyBzcmMvdzMydGVy bS5oCTIwMTMtMDQtMTEgMDQ6MjI6MzIgKzAwMDAKQEAgLTcxLDYgKzcxLDcgQEAKIH07CiAKIGV4 dGVybiB2b2lkIHczMl9yZWdlbmVyYXRlX3BhbGV0dGUgKHN0cnVjdCBmcmFtZSAqZik7CitleHRl cm4gdm9pZCB3MzJfbW9uaXRvcl9yZWN0IChzdHJ1Y3QgZnJhbWUgKmYsIFJFQ1QgKnJlY3QpOwog CiAMCiAvKiBGb3IgZWFjaCBkaXNwbGF5IChjdXJyZW50bHkgb25seSBvbmUgb24gdzMyKSwgd2Ug aGF2ZSBhIHN0cnVjdHVyZSB0aGF0CkBAIC0zNjIsNyArMzYzLDcgQEAKICAgLyogRnJhbWUgZ2Vv bWV0cnkgYW5kIGZ1bGwtc2NyZWVuIG1vZGUgYmVmb3JlIGl0IHdhcyByZXNpemVkIGJ5CiAgICAg IHNwZWNpZnlpbmcgdGhlICdmdWxsc2NyZWVuJyBmcmFtZSBwYXJhbWV0ZXIuICBVc2VkIHRvIHJl c3RvcmUgdGhlCiAgICAgIGdlb21ldHJ5IHdoZW4gJ2Z1bGxzY3JlZW4nIGlzIHJlc2V0IHRvIG5p bC4gICovCi0gIGludCBub3JtYWxfd2lkdGgsIG5vcm1hbF9oZWlnaHQsIG5vcm1hbF90b3AsIG5v cm1hbF9sZWZ0OworICBXSU5ET1dQTEFDRU1FTlQgbm9ybWFsX3BsYWNlbWVudDsKICAgaW50IHBy ZXZfZnNtb2RlOwogfTsKIApAQCAtMzk2LDExICszOTcsOCBAQAogI2RlZmluZSBGUkFNRV9TTUFM TEVTVF9GT05UX0hFSUdIVChGKSBcCiAgICAgIEZSQU1FX1czMl9ESVNQTEFZX0lORk8oRiktPnNt YWxsZXN0X2ZvbnRfaGVpZ2h0CiAKLSNkZWZpbmUgRlJBTUVfTk9STUFMX1dJRFRIKEYpICAoKEYp LT5vdXRwdXRfZGF0YS53MzItPm5vcm1hbF93aWR0aCkKLSNkZWZpbmUgRlJBTUVfTk9STUFMX0hF SUdIVChGKSAoKEYpLT5vdXRwdXRfZGF0YS53MzItPm5vcm1hbF9oZWlnaHQpCi0jZGVmaW5lIEZS QU1FX05PUk1BTF9UT1AoRikgICAgKChGKS0+b3V0cHV0X2RhdGEudzMyLT5ub3JtYWxfdG9wKQot I2RlZmluZSBGUkFNRV9OT1JNQUxfTEVGVChGKSAgICgoRiktPm91dHB1dF9kYXRhLnczMi0+bm9y bWFsX2xlZnQpCi0jZGVmaW5lIEZSQU1FX1BSRVZfRlNNT0RFKEYpICAgKChGKS0+b3V0cHV0X2Rh dGEudzMyLT5wcmV2X2ZzbW9kZSkKKyNkZWZpbmUgRlJBTUVfTk9STUFMX1BMQUNFTUVOVChGKSAo KEYpLT5vdXRwdXRfZGF0YS53MzItPm5vcm1hbF9wbGFjZW1lbnQpCisjZGVmaW5lIEZSQU1FX1BS RVZfRlNNT0RFKEYpICAgICAgKChGKS0+b3V0cHV0X2RhdGEudzMyLT5wcmV2X2ZzbW9kZSkKIAog DAogLyogVzMyLXNwZWNpZmljIHNjcm9sbCBiYXIgc3R1ZmYuICAqLwoKIyBCZWdpbiBidW5kbGUK SXlCQ1lYcGhZWElnY21WMmFYTnBiMjRnWW5WdVpHeGxJSFkwQ2lNS1FscG9PVEZCV1NaVFdad0JT YnNBQmE1L2dGZHdCSUo1OS8vLwpmK2ZmOEwvLy8vOWdDNjVyMFk0UHZRQWVoN09QZWFLWHVybTl1 SGlzT3hybTYwV2dra0lCTlQwRFRRbTBsUHhVODBtcCtJMU1wNko2ClpRMDlUUm9iVTlRYUdtYWdT aUV5WWpTcDdKbEp0RU5BOVFhQm9hTkRJQU1qMUdnQUFjYUdnYU5NalRScGtCaVlJQUFhQTBCcGtC Z1QKSUVwb2lhRk1ucEpwNVRFMHpCVFJvOUlHZ0FhQUEwMEJvYWFBaVVqU05OUmswMmtwK3BrajFH bnRVMDlUMFFhQjZucHBEMUhwcUFBMApIcVBTQkpFQWdCQ01tU21hbXhKNlNEMUdtVEk5UVBVQUdU MURKb1lsQUlVc3VUeXRiNTFsRE5hYTRLWnc0anl1Wmt2SDRFcytuVFRLClRmS2VSb3ZQbVhSVkQz T2NpTEtEcXQzdmw2Sm9LMG1mUkVDSUVHNEg5Rks3d1lYeFhsRTc5czJxbmlmcTZGWGhsc0RmWGx0 WUMxQ20KK3FtNGtOYzZ5eFlObXg5VmIyT2ZvZzhlNXpkZnN1L1gxbkYwcHM0Ny9qZ0lJQ1ZvMVJn QmJXdXA4Y01VbHZ0T3JqSldiZkllMTVGRApnUGUzRFpENFEyUXR3WGxOK3pNTnhxcjZESHMvQTQ4 RGVMK0huYjNsWklTS0Vod3FhRENjWTJOYlNMYStiRFMxU1JsV1JUYUtrOE1xCnN1VExWVlNweUZW WStrVnU5TEI0WlJLQ2FzVnRkSW1wSUtsRmJrMU92V2xhL0pjLzd1eFp4OFVWUmo2QmNacWdsdytp TjdnMklUQnoKd1RXbElPbmplL0RsVnJpVFNSS1FPbTVIRGpNdmx6MEdNeHFjYVdiaXd1MjNjTmlx ZGFLWlBnV3hsalBKdGhZTGRtdGcrYzY0ZTh4NQpFWmFYMzNkSlB4MUswZmF3ejNaOG5SVFJlZzlm VXFyT2NLb0F4TzJkZ1pJeTNtNTRDVWp5U2I3M1JwVS9HdXJXWG5jM0d5NWRaMXk1ClRPR1JHOEpT V2N0d0hzMmJ1YmR0NThtTWlVUHFVdTNvellSUmNEaExpQzZQQXVZcmEyZ2htTzJ6VGlJSVIxTWtj SXdaUmhLWjJKdkMKaGptR0lVNFc5MGpOeTd4d1BOY2tlM1JkdHZhWnlxQkx5d3hjcHZ1eDQzeDBU bHdwTXk3Y2d2V3gxRjRyL3k4blUzMUVMeElrRURnVgpMeU5iRFB0NDJpZGkvWnE5RjgyTDRyaDRr dVFldXBieERoVHpydVoyN0NNNGVVdW0zSUpDTnZYQWVuTnF0NHU5M0RwZGhuTm1UR1NSCi94MUUw VzUrc1lwTTVmSHNkRy93dXpNejRPR0dRVHBoM29zampGSzFvRFdqck5hRklSY29vUkFHS2xTYy9P TVA5LzJBRkJIU0paQmUKUCtUTWV4aVZaQlgyUlJqSU0xTDVWQXVQdzF1dWwybG9NbFpwWnVFV2FG cjZwNUYyQ2pmY09JdDVzRE9KMHpYdXVFYUZ5Q2FEbWRSSQp0ZFRmaUZuNFB3MkxUQU1jVUVqV0M2 Q00wYVdQVm5ZOVhIUlpLaHFOaEY1TU4raHUreHlMSUhJbkord2JSY1RnY3FiQ0xxWW80eWNqCkJz SmNkZ1dQQkFuUVdqc3QxRlVSSUlpTDZNYTVrdUk1a1JsSnQxcmhXRW55TnhnUlNOclVzOFlRd3po ZENzNlBKQVljZExIeWt4RTAKSFY2MUZHckFHVjdKY0RHRlNMTW9zWkRRdm5PSkk1a3pDT2k3V2g5 cElSTGcxNjZycjFKNmxxUWJxSExJWkNpWlU1a0JFUkdyWDlGSwpzVWl0Mkp4VXN0czVqa0NPTURr VmlPSFFjaVZOMEtXMWhoT1VGY1pHYzJJNWtpTjg0UXVSRnQ3QVVFRjY2Qlg2Nnk4VEZIS3dXbTBN CmFHQ2hwbHRSWVFLUnFTeExZRGFuTjRCVmlkWHM4aXNkdFVVdU5qa0lwdGRnOTczaGdOZHRHa1Z2 WWpVb01Rckd4QjJqQm53SjFlUkcKZEpkUTY0YWFJdkpHSEdhRFhTZHNXeWRvd3diU3padlhDaHRT OHdIVWk2aGRrMmNaRXlJVE5JTEVuTm1OMUVpYjY2Uk5rRWE2RnNqWQplSHZGNmhHYlpMZk50THJa WVBNeGNOa1B5RU50T3FsaGhZeG1kbWFMR0M0Q2s5VnpoSjJGUEF6ekNzYWxhc0RycmRvN0dkTWVs RzJuClJJUk5hRU5zYjRJRHhjUWdjWTFLYkxPYUcyd2hKSlRZM2U0MlIzWURmdFVzZlNZcDJCMEFF ZWw2TFhuNmJhdnQ0YWVBa2pDZHlaZjQKU1BZREd3bzQ1ek8xU1BuQzYxTEJMV3Z6V1UrZDdUdUth c3RrbzNidWx0YW5hOVRZaGwrdnRUT1pVaTJwdU9Ea1dxSi9kN0Frakx5LwpCWGtSSmg0TWwyY3dS cDRlTEwrTHFMcWVlMHNjM2YrVDQrMUkzNTRvNW5CVTMvQS9OWUlzdnNEN0JFVW04d1loMWh5b0dD elUxRkRJClh1WG5XZ2Q1dzBJa1RCZWpZOUo0ZkQ0OHJzVE1tWjBOQktiMGFGam5TMUdxWE1XZUUz dzlWNGlpUjlad1BGRHFBTWRCejlpSmw2OFIKWXBna1VoUlpUVnpNT25FNExtQjNRWEdsVzFRK2dC QkJxVTFRWDJNQW5aTURKaWpIbUR1ODZVVkV2RHFLVVlzRTE5WjliRGhBTmwzbQpuWURTY3hERTF1 SkpPTTBwaHhGaEdtc3NESEF5T0s4RjZUVUZCdlhCbHhWZG94OGdpdmZDaW9Nc1FYM1NJZDI1SVpR REZidWdWVHR2ClJVNzF1Ujd3L1V2VUQxa1RramdEQlpkWVFGeFZDQVhQRnF6NUhvWnFMejZZUjVn OTFiazhnRno3elVnMjJFRHJPYW9ibkc4U1pzaHEKSXhxUElRQVVtZWRnL2Z0OXZya0pxM3lYZDN2 VGZnR0VVeCtkYVJZMWpGNWZwWktLSUdITjV0N0QvQXl6RUsvZHlXWk1GRWtFRVFTYwppQlMxcm1l S3VDMUhoaDdJbWppTmZaSk5PSGlOb3lvaHFMVWJRQ2g0ZS9RL09nZ1kwaGE1bmpsWW5BeFFjaGFm cVZGbUJyOFJQYlgzCmJrZDJlM0JJakFscWtiNTEzUDRDVkQ3WkJWUWRKWHQxa0lMSHhlUXpNUkdR RDdIa1lYK0pTaUlvWjBtREp2WWFuemJ4VFhIRFl1L2gKWGZNb0xwQ2RCb0luak9lNGxTMUJpQmZW anRmTFNLS1NrZzBpN05IV20xaW0wUlREUGRyYkdpQ2xqaGtNKzBIT0h1d0lwbWxaWkxIYgptRFlx d3J6S01RV21HeUVYZVQ5bmZWQjZlNzM4MEcyYlpKeExNY0JFeGRXZThTWCtlcnpOZDQzRW50NzVj aFlpTkM3ZXcxdjRRclpsCnhKa1p5Qk1WdjFQeGM3L0E2Z1paUEtSQk5xazFRYytyUFVkaWVPTzhN S1poUmtJaUpKZlpRVHBjZVJTVWJXUVp2ampOMzNOKzdIUksKQzk1cUpPalp0MklQT01lZzlKMGwr UU9sQkk4TkNzVjFVbTNyRmNEem9xYmMxU3hJR2tTTGxmay91dmRRcTRUQ1ppMjdCZkErSjNYbApJ dnRWOG1UUnFiM29VcEczSzdUbmtQaVBHQk91S1p2TGNPL3BvZFJYNGRhNm5PRzBDUWRuZkJPWk1z ekc3dGVBejFhMmJJSGhmUm9WCmRxZTdjU3RzMnh0YUR2UkVGQmVnNEZtQmEwRTU2aGlLOTBkd3Fu clZnd01wczZqRXUxNGF1TG00NzhidkJJazhzYjkrNlNpbG83eHoKQkc0cXpJNk9JbUhqNkhHYVVF amp1RnluV01rajJuTUtpazRTSno5cThqK3ZQdjZFMUxPQjN4Rm1DOFBJbmlzOW5PdkJKYXlCTU02 bQovS01FSzVLaitsUkhBZEk3SkhNWlA4TkVGRU4yNk8wanpIK240SzNTWjhRakk2SlJwSnJIOW5P QW80WWg4MTAxaXVhcHB1S1lZQk80CjhPNGtDWmxLcG9zeExJVGRuWUJ4bElsalN3VmwxQmdRczhW Z0prNE9LZzVVT3NyZ0dmQndnNEVhUk16UnJjZXpRM0ZDSENhRTFyTTUKbU9SdzR3Y0Y1Yis5Qy9r VWdFTkdHNUtUN0tMOVgyaFVQb1NLVzNtQzVxTUlFR1FpN0Y5M2d1TG05VGx6Qmw4QTdEQ2FSdXNU NWt6RAp2VkR3bEVIemlYdW5wRTlROWlNU3dPV3ZNY2h3YTN2dThHWlBUS20wTld1REJYY29xbnF5 R0F3cEhiK0p4bHRCVXozTTRZR1FoenhOCm1oRENqUEU5aURWTDdSbTJkWVZyeFpmTk1hQktaQkMr eDZkMWlXUGZJTEtDMGxweERicy9wTklya0NkSjBOMmplS3VhM0w0Z1lNSksKc29oTWk4VVoyMVJH dmx5UmplQkZZdGFadkR1Tk9aa1lzMHhIM0NMSkdHQWVRY1JnTE1iemplN2g2OTZ1RlYweDEzbmF5 NEVybnJYNQpLUWVqQXpyZVk0QlFOUEtScUhUWmhURzY5VTU1U3hsSSt1SFhLY29oUVlIWVROV3B5 ekVyRTA1K2NVektZelBCeU51SFQ5WXEwcTR1Cm5NN0lBUjFiUGVVSDAxbEhVaHpMWmpkWGgzR2FR Y0Vtc3NDbkFsRmxrNko2RWp6L3hEdDYxd3NPS3loakZldnV2N0VsNkUxUVlUSFgKZzI4WmxuQ3RL VGVnZk5mVUloWVp5TlBaRjhoRC9xWGFwUEI4TnhLRTZFdXlNYTFvVFRNNEpnelg1TnFKc1l5TTRN T3JRUHhxVUxrNgpCd3RPbkNQVWcxd2VJdHBkSEpENjI3emhNcU5CeEZHcEJSL2U4emJ5M0FIa3do ejRSRG80bC80dTVJcHdvU0U0QXBOMgo= --90e6ba5bbaa34e14ea04da0ea88b--