Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1s7nce-007US1-BM for pgsql-hackers@arkaria.postgresql.org; Fri, 17 May 2024 02:47:06 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1s7nce-003Q8g-9W for pgsql-hackers@arkaria.postgresql.org; Fri, 17 May 2024 02:47:04 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1s7ncd-003Q8Y-TV for pgsql-hackers@lists.postgresql.org; Fri, 17 May 2024 02:47:03 +0000 Received: from mail.thelabyrinth.net ([45.56.70.56]) by magus.postgresql.org with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1s7ncU-000dfJ-OX for pgsql-hackers@postgresql.org; Fri, 17 May 2024 02:47:03 +0000 Received: from [192.168.1.88] (14-201-17-74.static.tpgi.com.au [14.201.17.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: dsteele) by mail.thelabyrinth.net (Postfix) with ESMTPSA id AE0695465D for ; Fri, 17 May 2024 02:46:52 +0000 (UTC) Content-Type: multipart/mixed; boundary="------------1i90iZXUVF50m4dZPuVfyTzo" Message-ID: Date: Fri, 17 May 2024 12:46:49 +1000 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US To: Pg Hackers From: David Steele Subject: Return pg_control from pg_backup_stop(). List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------1i90iZXUVF50m4dZPuVfyTzo Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hackers, This is greatly simplified implementation of the patch proposed in [1] and hopefully it addresses the concerns expressed there. Since the implementation is quite different it seemed like a new thread was appropriate, especially since the old thread title would be very misleading regarding the new functionality. The basic idea is to harden recovery by returning a copy of pg_control from pg_backup_stop() that has a flag set to prevent recovery if the backup_label file is missing. Instead of backup software copying pg_control from PGDATA, it stores an updated version that is returned from pg_backup_stop(). This is better for the following reasons: * The user can no longer remove backup_label and get what looks like a successful recovery (while almost certainly causing corruption). If backup_label is removed the cluster will not start. The user may try pg_resetwal, but that tool makes it pretty clear that corruption will result from its use. * We don't need to worry about backup software seeing a torn copy of pg_control, since Postgres can safely read it out of memory and provide a valid copy via pg_backup_stop(). This solves torn reads without needing to write pg_control via a temp file, which may affect performance on a standby. * For backup from standby, we no longer need to instruct the backup software to copy pg_control last. In fact the backup software should not copy pg_control from PGDATA at all. These changes have no impact on current backup software and they are free to use the pg_control available from pg_stop_backup() or continue to use pg_control from PGDATA. Of course they will miss the benefits of getting a consistent copy of pg_control and the backup_label checking, but will be no worse off than before. I'll register this in the July CF. Regards, -David [1] https://www.postgresql.org/message-id/2daf8adc-8db7-4204-a7f2-a7e94e2bfa4b@pgmasters.net --------------1i90iZXUVF50m4dZPuVfyTzo Content-Type: text/plain; charset=UTF-8; name="pgcontrol-from-backupstop-v1.patch" Content-Disposition: attachment; filename="pgcontrol-from-backupstop-v1.patch" Content-Transfer-Encoding: base64 RnJvbSA1MzE4NzJkY2RiMDlmNWQyZjg5YWY0NGEzYzA0YzlkMmQ2ZGE4OWJlIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBEYXZpZCBTdGVlbGUgPGRhdmlkQHBnbWFzdGVycy5u ZXQ+CkRhdGU6IEZyaSwgMTcgTWF5IDIwMjQgMDI6NDI6MzUgKzAwMDAKU3ViamVjdDogUmV0 dXJuIHBnX2NvbnRyb2wgZnJvbSBwZ19iYWNrdXBfc3RvcCgpLgoKSGFyZGVuIHJlY292ZXJ5 IGJ5IHJldHVybmluZyBhIGNvcHkgb2YgcGdfY29udHJvbCBmcm9tIHBnX2JhY2t1cF9zdG9w KCkgdGhhdCBoYXMKYSBmbGFnIHNldCB0byBwcmV2ZW50IHJlY292ZXJ5IGlmIHRoZSBiYWNr dXBfbGFiZWwgZmlsZSBpcyBtaXNzaW5nLiBJbnN0ZWFkIG9mCmJhY2t1cCBzb2Z0d2FyZSBj b3B5aW5nIHBnX2NvbnRyb2wgZnJvbSBQR0RBVEEsIGl0IHN0b3JlcyBhbiB1cGRhdGVkIHZl cnNpb24KdGhhdCBpcyByZXR1cm5lZCBmcm9tIHBnX2JhY2t1cF9zdG9wKCkuIFRoaXMgaXMg YmV0dGVyIGZvciB0aGUgZm9sbG93aW5nCnJlYXNvbnM6CgoqIFRoZSB1c2VyIGNhbiBubyBs b25nZXIgcmVtb3ZlIGJhY2t1cF9sYWJlbCBhbmQgZ2V0IHdoYXQgbG9va3MgbGlrZSBhCnN1 Y2Nlc3NmdWwgcmVjb3ZlcnkgKHdoaWxlIGFsbW9zdCBjZXJ0YWlubHkgY2F1c2luZyBjb3Jy dXB0aW9uKS4gSWYgYmFja3VwX2xhYmVsCmlzIHJlbW92ZWQgdGhlIGNsdXN0ZXIgd2lsbCBu b3Qgc3RhcnQuIFRoZSB1c2VyIG1heSB0cnkgcGdfcmVzZXR3YWwsIGJ1dCB0aGF0CnRvb2wg bWFrZXMgaXQgcHJldHR5IGNsZWFyIHRoYXQgY29ycnVwdGlvbiB3aWxsIHJlc3VsdCBmcm9t IGl0cyB1c2UuCgoqIFdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgYmFja3VwIHNvZnR3 YXJlIHNlZWluZyBhIHRvcm4gY29weSBvZiBwZ19jb250cm9sLApzaW5jZSBQb3N0Z3JlcyBj YW4gc2FmZWx5IHJlYWQgaXQgb3V0IG9mIG1lbW9yeSBhbmQgcHJvdmlkZSBhIHZhbGlkIGNv cHkgdmlhCnBnX2JhY2t1cF9zdG9wKCkuIFRoaXMgc29sdmVzIHRvcm4gcmVhZHMgd2l0aG91 dCBuZWVkaW5nIHRvIHdyaXRlIHBnX2NvbnRyb2wgdmlhCmEgdGVtcCBmaWxlLCB3aGljaCBt YXkgYWZmZWN0IHBlcmZvcm1hbmNlIG9uIGEgc3RhbmRieS4KCiogRm9yIGJhY2t1cCBmcm9t IHN0YW5kYnksIHdlIG5vIGxvbmdlciBuZWVkIHRvIGluc3RydWN0IHRoZSBiYWNrdXAgc29m dHdhcmUgdG8KY29weSBwZ19jb250cm9sIGxhc3QuIEluIGZhY3QgdGhlIGJhY2t1cCBzb2Z0 d2FyZSBzaG91bGQgbm90IGNvcHkgcGdfY29udHJvbCBmcm9tClBHREFUQSBhdCBhbGwuCgpU aGVzZSBjaGFuZ2VzIGhhdmUgbm8gaW1wYWN0IG9uIGN1cnJlbnQgYmFja3VwIHNvZnR3YXJl IGFuZCB0aGV5IGFyZSBmcmVlIHRvIHVzZQp0aGUgcGdfY29udHJvbCBhdmFpbGFibGUgZnJv bSBwZ19zdG9wX2JhY2t1cCgpIG9yIGNvbnRpbnVlIHRvIHVzZSBwZ19jb250cm9sIGZyb20K UEdEQVRBLiBPZiBjb3Vyc2UgdGhleSB3aWxsIG1pc3MgdGhlIGJlbmVmaXRzIG9mIGdldHRp bmcgYSBjb25zaXN0ZW50IGNvcHkgb2YKcGdfY29udHJvbCBhbmQgdGhlIGJhY2t1cF9sYWJl bCBjaGVja2luZywgYnV0IHdpbGwgYmUgbm8gd29yc2Ugb2ZmIHRoYW4gYmVmb3JlLgoKQ29u dHJvbCBhbmQgY2F0YWxvZyB2ZXJzaW9uIGJ1bXBzIGFyZSByZXF1aXJlZC4KLS0tCiBkb2Mv c3JjL3NnbWwvYmFja3VwLnNnbWwgICAgICAgICAgICAgICAgICAgIHwgMTggKysrKystCiBk b2Mvc3JjL3NnbWwvZnVuYy5zZ21sICAgICAgICAgICAgICAgICAgICAgIHwgMTAgKystCiBz cmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9nLmMgICAgICAgICAgIHwgMTkgKysrKysr CiBzcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9nZnVuY3MuYyAgICAgIHwgMTcgKysr Ky0tCiBzcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9ncmVjb3ZlcnkuYyAgIHwgMTAg KystCiBzcmMvYmFja2VuZC9iYWNrdXAvYmFzZWJhY2t1cC5jICAgICAgICAgICAgIHwgMTkg KysrLS0tCiBzcmMvYmFja2VuZC9jYXRhbG9nL3N5c3RlbV9mdW5jdGlvbnMuc3FsICAgIHwg IDIgKy0KIHNyYy9iYWNrZW5kL3V0aWxzL21pc2MvcGdfY29udHJvbGRhdGEuYyAgICAgfCAg NyArKy0KIHNyYy9iaW4vcGdfY29udHJvbGRhdGEvcGdfY29udHJvbGRhdGEuYyAgICAgfCAg MiArCiBzcmMvYmluL3BnX3Jlc2V0d2FsL3BnX3Jlc2V0d2FsLmMgICAgICAgICAgIHwgIDEg Kwogc3JjL2Jpbi9wZ19yZXdpbmQvcGdfcmV3aW5kLmMgICAgICAgICAgICAgICB8ICAxICsK IHNyYy9pbmNsdWRlL2FjY2Vzcy94bG9nYmFja3VwLmggICAgICAgICAgICAgfCAgOCArKysK IHNyYy9pbmNsdWRlL2NhdGFsb2cvcGdfY29udHJvbC5oICAgICAgICAgICAgfCAgNCArKwog c3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdCAgICAgICAgICAgICB8IDEwICstLQog c3JjL3Rlc3QvcmVjb3ZlcnkvdC8wMDJfYXJjaGl2aW5nLnBsICAgICAgICB8IDIwICsrKysr Kwogc3JjL3Rlc3QvcmVjb3ZlcnkvdC8wNDJfbG93X2xldmVsX2JhY2t1cC5wbCB8IDY3ICsr KysrKysrKysrKysrKysrKysrLQogMTYgZmlsZXMgY2hhbmdlZCwgMTgyIGluc2VydGlvbnMo KyksIDMzIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9iYWNrdXAu c2dtbCBiL2RvYy9zcmMvc2dtbC9iYWNrdXAuc2dtbAppbmRleCA5MWRhM2MyNmJhLi4xYjg3 YTA1ZGM1IDEwMDY0NAotLS0gYS9kb2Mvc3JjL3NnbWwvYmFja3VwLnNnbWwKKysrIGIvZG9j L3NyYy9zZ21sL2JhY2t1cC5zZ21sCkBAIC0xMDEwLDkgKzEwMTAsMTIgQEAgU0VMRUNUICog RlJPTSBwZ19iYWNrdXBfc3RvcCh3YWl0X2Zvcl9hcmNoaXZlID0+IHRydWUpOwogICAgICB2 YWx1ZXMuIFRoZSBzZWNvbmQgb2YgdGhlc2UgZmllbGRzIHNob3VsZCBiZSB3cml0dGVuIHRv IGEgZmlsZSBuYW1lZAogICAgICA8ZmlsZW5hbWU+YmFja3VwX2xhYmVsPC9maWxlbmFtZT4g aW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSBiYWNrdXAuIFRoZQogICAgICB0aGlyZCBm aWVsZCBzaG91bGQgYmUgd3JpdHRlbiB0byBhIGZpbGUgbmFtZWQKLSAgICAgPGZpbGVuYW1l PnRhYmxlc3BhY2VfbWFwPC9maWxlbmFtZT4gdW5sZXNzIHRoZSBmaWVsZCBpcyBlbXB0eS4g VGhlc2UgZmlsZXMgYXJlCisgICAgIDxmaWxlbmFtZT50YWJsZXNwYWNlX21hcDwvZmlsZW5h bWU+IHVubGVzcyB0aGUgZmllbGQgaXMgZW1wdHkuIFRoZSBmb3VydGgKKyAgICAgZmllbGQg c2hvdWxkIGJlIHdyaXR0ZW4gaW50byBhIGZpbGUgbmFtZWQKKyAgICAgPGZpbGVuYW1lPmds b2JhbC9wZ19jb250cm9sPC9maWxlbmFtZT4gKG92ZXJ3cml0aW5nIHRoZSBleGlzdGluZyBm aWxlIHdoZW4KKyAgICAgcHJlc2VudCkuIFRoZXNlIGZpbGVzIGFyZQogICAgICB2aXRhbCB0 byB0aGUgYmFja3VwIHdvcmtpbmcgYW5kIG11c3QgYmUgd3JpdHRlbiBieXRlIGZvciBieXRl IHdpdGhvdXQKLSAgICAgbW9kaWZpY2F0aW9uLCB3aGljaCBtYXkgcmVxdWlyZSBvcGVuaW5n IHRoZSBmaWxlIGluIGJpbmFyeSBtb2RlLgorICAgICBtb2RpZmljYXRpb24sIHdoaWNoIHdp bGwgcmVxdWlyZSBvcGVuaW5nIHRoZSBmaWxlIGluIGJpbmFyeSBtb2RlLgogICAgIDwvcGFy YT4KICAgIDwvbGlzdGl0ZW0+CiAgICA8bGlzdGl0ZW0+CkBAIC0xMDg0LDcgKzEwODcsMTYg QEAgU0VMRUNUICogRlJPTSBwZ19iYWNrdXBfc3RvcCh3YWl0X2Zvcl9hcmNoaXZlID0+IHRy dWUpOwogICAgPC9wYXJhPgogCiAgICA8cGFyYT4KLSAgICBZb3Ugc2hvdWxkLCBob3dldmVy LCBvbWl0IGZyb20gdGhlIGJhY2t1cCB0aGUgZmlsZXMgd2l0aGluIHRoZQorICAgIFlvdSBz aG91bGQgZXhjbHVkZSA8ZmlsZW5hbWU+Z2xvYmFsL3BnX2NvbnRyb2w8L2ZpbGVuYW1lPiBm cm9tIHlvdXIgYmFja3VwCisgICAgYW5kIHB1dCB0aGUgY29udGVudHMgb2YgdGhlIDxwYXJh bWV0ZXI+Y29udHJvbGZpbGU8L3BhcmFtZXRlcj4gY29sdW1uCisgICAgcmV0dXJuZWQgZnJv bSA8ZnVuY3Rpb24+cGdfYmFja3VwX3N0b3A8L2Z1bmN0aW9uPiBpbiB5b3VyIGJhY2t1cCBh dAorICAgIDxmaWxlbmFtZT5nbG9iYWwvcGdfY29udHJvbDwvZmlsZW5hbWU+LiBUaGlzIHZl cnNpb24gb2YgcGdfY29udHJvbCBjb250YWlucworICAgIHNhZmVndWFyZHMgYWdhaW5zdCBy ZWNvdmVyeSB3aXRob3V0IGJhY2t1cF9sYWJlbCBwcmVzZW50IGFuZCBpcyBndWFyYW50ZWVk CisgICAgbm90IHRvIGJlIHRvcm4uCisgICA8L3BhcmE+CisKKyAgIDxwYXJhPgorICAgIFlv dSBzaG91bGQgYWxzbyBvbWl0IGZyb20gdGhlIGJhY2t1cCB0aGUgZmlsZXMgd2l0aGluIHRo ZQogICAgIGNsdXN0ZXIncyA8ZmlsZW5hbWU+cGdfd2FsLzwvZmlsZW5hbWU+IHN1YmRpcmVj dG9yeS4gIFRoaXMKICAgICBzbGlnaHQgYWRqdXN0bWVudCBpcyB3b3J0aHdoaWxlIGJlY2F1 c2UgaXQgcmVkdWNlcyB0aGUgcmlzawogICAgIG9mIG1pc3Rha2VzIHdoZW4gcmVzdG9yaW5n LiAgVGhpcyBpcyBlYXN5IHRvIGFycmFuZ2UgaWYKZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dt bC9mdW5jLnNnbWwgYi9kb2Mvc3JjL3NnbWwvZnVuYy5zZ21sCmluZGV4IDE3YzQ0YmMzMzgu Ljg4Zjk0MmFmNDQgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9mdW5jLnNnbWwKKysrIGIv ZG9jL3NyYy9zZ21sL2Z1bmMuc2dtbApAQCAtMjc2OTcsNiArMjc2OTcsMTEgQEAgU0VMRUNU IGN1cnJ2YWwocGdfZ2V0X3NlcmlhbF9zZXF1ZW5jZSgnc29tZXRhYmxlJywgJ2lkJykpOwog ICAgICAgIDxlbnRyeT48dHlwZT5ib29sZWFuPC90eXBlPjwvZW50cnk+CiAgICAgICA8L3Jv dz4KIAorICAgICAgPHJvdz4KKyAgICAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPmJhY2t1cF9s YWJlbF9yZXF1aXJlZDwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KKyAgICAgICA8ZW50cnk+PHR5 cGU+Ym9vbGVhbjwvdHlwZT48L2VudHJ5PgorICAgICAgPC9yb3c+CisKICAgICAgPC90Ym9k eT4KICAgICA8L3Rncm91cD4KICAgIDwvdGFibGU+CkBAIC0yODM1NSw4ICsyODM2MCw5IEBA IExPRzogIEdyYW5kIHRvdGFsOiAxNjUxOTIwIGJ5dGVzIGluIDIwMSBibG9ja3M7IDYyMjM2 MCBmcmVlICg4OCBjaHVua3MpOyAxMDI5NTYwCiAgICAgICAgIFRoZSByZXN1bHQgb2YgdGhl IGZ1bmN0aW9uIGlzIGEgc2luZ2xlIHJlY29yZC4KICAgICAgICAgVGhlIDxwYXJhbWV0ZXI+ bHNuPC9wYXJhbWV0ZXI+IGNvbHVtbiBob2xkcyB0aGUgYmFja3VwJ3MgZW5kaW5nCiAgICAg ICAgIHdyaXRlLWFoZWFkIGxvZyBsb2NhdGlvbiAod2hpY2ggYWdhaW4gY2FuIGJlIGlnbm9y ZWQpLiAgVGhlIHNlY29uZAotICAgICAgICBjb2x1bW4gcmV0dXJucyB0aGUgY29udGVudHMg b2YgdGhlIGJhY2t1cCBsYWJlbCBmaWxlLCBhbmQgdGhlIHRoaXJkCi0gICAgICAgIGNvbHVt biByZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUgdGFibGVzcGFjZSBtYXAgZmlsZS4gIFRo ZXNlIG11c3QgYmUKKyAgICAgICAgY29sdW1uIHJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRo ZSBiYWNrdXAgbGFiZWwgZmlsZSwgdGhlIHRoaXJkIGNvbHVtbgorICAgICAgICByZXR1cm5z IHRoZSBjb250ZW50cyBvZiB0aGUgdGFibGVzcGFjZSBtYXAgZmlsZSwgYW5kIHRoZSBmb3Vy dGggY29sdW1uCisgICAgICAgIHJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHBnX2NvbnRyb2wu ICBUaGVzZSBtdXN0IGJlCiAgICAgICAgIHN0b3JlZCBhcyBwYXJ0IG9mIHRoZSBiYWNrdXAg YW5kIGFyZSByZXF1aXJlZCBhcyBwYXJ0IG9mIHRoZSByZXN0b3JlCiAgICAgICAgIHByb2Nl c3MuCiAgICAgICAgPC9wYXJhPgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL3Ry YW5zYW0veGxvZy5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZy5jCmluZGV4 IGMzZmQ5YzFlYWUuLjdkN2MzZDcyN2UgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vz cy90cmFuc2FtL3hsb2cuYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9n LmMKQEAgLTkwNDgsMTEgKzkwNDgsMzAgQEAgZG9fcGdfYmFja3VwX3N0b3AoQmFja3VwU3Rh dGUgKnN0YXRlLCBib29sIHdhaXRmb3JhcmNoaXZlKQogCWludAkJCXNlY29uZHNfYmVmb3Jl X3dhcm5pbmc7CiAJaW50CQkJd2FpdHMgPSAwOwogCWJvb2wJCXJlcG9ydGVkX3dhaXRpbmcg PSBmYWxzZTsKKwlDb250cm9sRmlsZURhdGEgKmNvbnRyb2xGaWxlQ29weSA9IChDb250cm9s RmlsZURhdGEgKilzdGF0ZS0+Y29udHJvbEZpbGU7CiAKIAlBc3NlcnQoc3RhdGUgIT0gTlVM TCk7CiAKIAliYWNrdXBfc3RvcHBlZF9pbl9yZWNvdmVyeSA9IFJlY292ZXJ5SW5Qcm9ncmVz cygpOwogCisJLyoKKwkgKiBDcmVhdGUgYSBjb3B5IG9mIGNvbnRyb2wgZGF0YSBhbmQgdXBk YXRlIGl0IHRvIHJlcXVpcmUgYSBiYWNrdXAgbGFiZWwKKwkgKiBmb3IgcmVjb3ZlcnkuIEFs c28gcmVjYWxjdWxhdGUgdGhlIENSQy4KKwkgKi8KKwltZW1zZXQoCisJCXN0YXRlLT5jb250 cm9sRmlsZSArIHNpemVvZihDb250cm9sRmlsZURhdGEpLCAwLAorCQlQR19DT05UUk9MX0ZJ TEVfU0laRSAtIHNpemVvZihDb250cm9sRmlsZURhdGEpKTsKKworCUxXTG9ja0FjcXVpcmUo Q29udHJvbEZpbGVMb2NrLCBMV19TSEFSRUQpOworCW1lbWNweShjb250cm9sRmlsZUNvcHks IENvbnRyb2xGaWxlLCBzaXplb2YoQ29udHJvbEZpbGVEYXRhKSk7CisJTFdMb2NrUmVsZWFz ZShDb250cm9sRmlsZUxvY2spOworCisJY29udHJvbEZpbGVDb3B5LT5iYWNrdXBMYWJlbFJl cXVpcmVkID0gdHJ1ZTsKKworCUlOSVRfQ1JDMzJDKGNvbnRyb2xGaWxlQ29weS0+Y3JjKTsK KwlDT01QX0NSQzMyQyhjb250cm9sRmlsZUNvcHktPmNyYywgY29udHJvbEZpbGVDb3B5LCBv ZmZzZXRvZihDb250cm9sRmlsZURhdGEsIGNyYykpOworCUZJTl9DUkMzMkMoY29udHJvbEZp bGVDb3B5LT5jcmMpOworCiAJLyoKIAkgKiBEdXJpbmcgcmVjb3ZlcnksIHdlIGRvbid0IG5l ZWQgdG8gY2hlY2sgV0FMIGxldmVsLiBCZWNhdXNlLCBpZiBXQUwKIAkgKiBsZXZlbCBpcyBu b3Qgc3VmZmljaWVudCwgaXQncyBpbXBvc3NpYmxlIHRvIGdldCBoZXJlIGR1cmluZyByZWNv dmVyeS4KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2dmdW5j cy5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZ2Z1bmNzLmMKaW5kZXggOTJi ZGIxN2VkNS4uMjU3NmNhY2YyMiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL3Ry YW5zYW0veGxvZ2Z1bmNzLmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxv Z2Z1bmNzLmMKQEAgLTExMiw5ICsxMTIsMTEgQEAgcGdfYmFja3VwX3N0YXJ0KFBHX0ZVTkNU SU9OX0FSR1MpCiAgKgogICogVGhlIGJhY2t1cF9sYWJlbCBjb250YWlucyB0aGUgdXNlci1z dXBwbGllZCBsYWJlbCBzdHJpbmcgKHR5cGljYWxseSB0aGlzCiAgKiB3b3VsZCBiZSB1c2Vk IHRvIHRlbGwgd2hlcmUgdGhlIGJhY2t1cCBkdW1wIHdpbGwgYmUgc3RvcmVkKSwgdGhlIHN0 YXJ0aW5nCi0gKiB0aW1lLCBzdGFydGluZyBXQUwgbG9jYXRpb24gZm9yIHRoZSBkdW1wIGFu ZCBzbyBvbi4gIEl0IGlzIHRoZSBjYWxsZXIncwotICogcmVzcG9uc2liaWxpdHkgdG8gd3Jp dGUgdGhlIGJhY2t1cF9sYWJlbCBhbmQgdGFibGVzcGFjZV9tYXAgZmlsZXMgaW4gdGhlCi0g KiBkYXRhIGZvbGRlciB0aGF0IHdpbGwgYmUgcmVzdG9yZWQgZnJvbSB0aGlzIGJhY2t1cC4K KyAqIHRpbWUsIHN0YXJ0aW5nIFdBTCBsb2NhdGlvbiBmb3IgdGhlIGR1bXAgYW5kIHNvIG9u LiAgVGhlIHBnX2NvbnRyb2wgZmlsZQorICogY29udGFpbnMgcmVwcmVzZW50cyBhIGNvbnNp c3RlbnQgY29weSBvZiBwZ19jb250cm9sIHRoYXQgYWxzbyBoYXMgYSBzYWZlZ3VhcmQKKyAq IGFnYWluc3QgYmVpbmcgdXNlZCB3aXRob3V0IGJhY2t1cF9sYWJlbC4gIEl0IGlzIHRoZSBj YWxsZXIncyByZXNwb25zaWJpbGl0eQorICogdG8gd3JpdGUgdGhlIGJhY2t1cF9sYWJlbCwg cGdfY29udHJvbCwgYW5kIHRhYmxlc3BhY2VfbWFwIGZpbGVzIGluIHRoZSBkYXRhCisgKiBm b2xkZXIgdGhhdCB3aWxsIGJlIHJlc3RvcmVkIGZyb20gdGhpcyBiYWNrdXAuCiAgKgogICog UGVybWlzc2lvbiBjaGVja2luZyBmb3IgdGhpcyBmdW5jdGlvbiBpcyBtYW5hZ2VkIHRocm91 Z2ggdGhlIG5vcm1hbAogICogR1JBTlQgc3lzdGVtLgpAQCAtMTIyLDEyICsxMjQsMTMgQEAg cGdfYmFja3VwX3N0YXJ0KFBHX0ZVTkNUSU9OX0FSR1MpCiBEYXR1bQogcGdfYmFja3VwX3N0 b3AoUEdfRlVOQ1RJT05fQVJHUykKIHsKLSNkZWZpbmUgUEdfQkFDS1VQX1NUT1BfVjJfQ09M UyAzCisjZGVmaW5lIFBHX0JBQ0tVUF9TVE9QX1YyX0NPTFMgNAogCVR1cGxlRGVzYwl0dXBk ZXNjOwogCURhdHVtCQl2YWx1ZXNbUEdfQkFDS1VQX1NUT1BfVjJfQ09MU10gPSB7MH07CiAJ Ym9vbAkJbnVsbHNbUEdfQkFDS1VQX1NUT1BfVjJfQ09MU10gPSB7MH07CiAJYm9vbAkJd2Fp dGZvcmFyY2hpdmUgPSBQR19HRVRBUkdfQk9PTCgwKTsKIAljaGFyCSAgICpiYWNrdXBfbGFi ZWw7CisJYnl0ZWEJICAgKnBnX2NvbnRyb2xfYnl0ZWE7CiAJU2Vzc2lvbkJhY2t1cFN0YXRl IHN0YXR1cyA9IGdldF9iYWNrdXBfc3RhdHVzKCk7CiAKIAkvKiBJbml0aWFsaXplIGF0dHJp YnV0ZXMgaW5mb3JtYXRpb24gaW4gdGhlIHR1cGxlIGRlc2NyaXB0b3IgKi8KQEAgLTE0OSw5 ICsxNTIsMTUgQEAgcGdfYmFja3VwX3N0b3AoUEdfRlVOQ1RJT05fQVJHUykKIAkvKiBCdWls ZCB0aGUgY29udGVudHMgb2YgYmFja3VwX2xhYmVsICovCiAJYmFja3VwX2xhYmVsID0gYnVp bGRfYmFja3VwX2NvbnRlbnQoYmFja3VwX3N0YXRlLCBmYWxzZSk7CiAKKwkvKiBCdWlsZCB0 aGUgY29udGVudHMgb2YgcGdfY29udHJvbCAqLworCXBnX2NvbnRyb2xfYnl0ZWEgPSAoYnl0 ZWEgKikgcGFsbG9jKFBHX0NPTlRST0xfRklMRV9TSVpFICsgVkFSSERSU1opOworCVNFVF9W QVJTSVpFKHBnX2NvbnRyb2xfYnl0ZWEsIFBHX0NPTlRST0xfRklMRV9TSVpFICsgVkFSSERS U1opOworCW1lbWNweShWQVJEQVRBKHBnX2NvbnRyb2xfYnl0ZWEpLCBiYWNrdXBfc3RhdGUt PmNvbnRyb2xGaWxlLCBQR19DT05UUk9MX0ZJTEVfU0laRSk7CisKIAl2YWx1ZXNbMF0gPSBM U05HZXREYXR1bShiYWNrdXBfc3RhdGUtPnN0b3Bwb2ludCk7CiAJdmFsdWVzWzFdID0gQ1N0 cmluZ0dldFRleHREYXR1bShiYWNrdXBfbGFiZWwpOwogCXZhbHVlc1syXSA9IENTdHJpbmdH ZXRUZXh0RGF0dW0odGFibGVzcGFjZV9tYXAtPmRhdGEpOworCXZhbHVlc1szXSA9IFBvaW50 ZXJHZXREYXR1bShwZ19jb250cm9sX2J5dGVhKTsKIAogCS8qIERlYWxsb2NhdGUgYmFja3Vw LXJlbGF0ZWQgdmFyaWFibGVzICovCiAJcGZyZWUoYmFja3VwX2xhYmVsKTsKZGlmZiAtLWdp dCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2dyZWNvdmVyeS5jIGIvc3JjL2Jh Y2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZ3JlY292ZXJ5LmMKaW5kZXggMjljNWJlYzA4NC4u MDk0MGU0NzMwZSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxv Z3JlY292ZXJ5LmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZ3JlY292 ZXJ5LmMKQEAgLTcwMyw3ICs3MDMsMTQgQEAgSW5pdFdhbFJlY292ZXJ5KENvbnRyb2xGaWxl RGF0YSAqQ29udHJvbEZpbGUsIGJvb2wgKndhc1NodXRkb3duX3B0ciwKIAl9CiAJZWxzZQog CXsKLQkJLyogTm8gYmFja3VwX2xhYmVsIGZpbGUgaGFzIGJlZW4gZm91bmQgaWYgd2UgYXJl IGhlcmUuICovCisJCS8qCisJCSAqIE5vIGJhY2t1cF9sYWJlbCBmaWxlIGhhcyBiZWVuIGZv dW5kIGlmIHdlIGFyZSBoZXJlLiBFcnJvciBpZiB0aGUKKwkJICogY29udHJvbCBmaWxlIHJl cXVpcmVzIGJhY2t1cF9sYWJlbC4KKwkJICovCisJCWlmIChDb250cm9sRmlsZS0+YmFja3Vw TGFiZWxSZXF1aXJlZCkKKwkJCWVyZXBvcnQoRkFUQUwsCisJCQkJCShlcnJtc2coImNvdWxk IG5vdCBmaW5kIGJhY2t1cF9sYWJlbCByZXF1aXJlZCBmb3IgcmVjb3ZlcnkiKSwKKwkJCQkJ IGVycmhpbnQoImJhY2t1cF9sYWJlbCBtdXN0IGJlIHByZXNlbnQgZm9yIHJlY292ZXJ5IHRv IHN1Y2NlZWQiKSkpOwogCiAJCS8qCiAJCSAqIElmIHRhYmxlc3BhY2VfbWFwIGZpbGUgaXMg cHJlc2VudCB3aXRob3V0IGJhY2t1cF9sYWJlbCBmaWxlLCB0aGVyZQpAQCAtOTc2LDYgKzk4 Myw3IEBAIEluaXRXYWxSZWNvdmVyeShDb250cm9sRmlsZURhdGEgKkNvbnRyb2xGaWxlLCBi b29sICp3YXNTaHV0ZG93bl9wdHIsCiAJCXsKIAkJCUNvbnRyb2xGaWxlLT5iYWNrdXBTdGFy dFBvaW50ID0gY2hlY2tQb2ludC5yZWRvOwogCQkJQ29udHJvbEZpbGUtPmJhY2t1cEVuZFJl cXVpcmVkID0gYmFja3VwRW5kUmVxdWlyZWQ7CisJCQlDb250cm9sRmlsZS0+YmFja3VwTGFi ZWxSZXF1aXJlZCA9IGZhbHNlOwogCiAJCQlpZiAoYmFja3VwRnJvbVN0YW5kYnkpCiAJCQl7 CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9iYWNrdXAvYmFzZWJhY2t1cC5jIGIvc3JjL2Jh Y2tlbmQvYmFja3VwL2Jhc2ViYWNrdXAuYwppbmRleCA5YTJiZjU5ZTg0Li5hZTBmODM0MTZh IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9iYWNrdXAvYmFzZWJhY2t1cC5jCisrKyBiL3Ny Yy9iYWNrZW5kL2JhY2t1cC9iYXNlYmFja3VwLmMKQEAgLTMyNCw3ICszMjQsNiBAQCBwZXJm b3JtX2Jhc2VfYmFja3VwKGJhc2ViYWNrdXBfb3B0aW9ucyAqb3B0LCBiYnNpbmsgKnNpbmss CiAKIAkJCWlmICh0aS0+cGF0aCA9PSBOVUxMKQogCQkJewotCQkJCXN0cnVjdCBzdGF0IHN0 YXRidWY7CiAJCQkJYm9vbAkJc2VuZHRibHNwY2xpbmtzID0gdHJ1ZTsKIAkJCQljaGFyCSAg ICpiYWNrdXBfbGFiZWw7CiAKQEAgLTM0OCwxNSArMzQ3LDE0IEBAIHBlcmZvcm1fYmFzZV9i YWNrdXAoYmFzZWJhY2t1cF9vcHRpb25zICpvcHQsIGJic2luayAqc2luaywKIAkJCQlzZW5k RGlyKHNpbmssICIuIiwgMSwgZmFsc2UsIHN0YXRlLnRhYmxlc3BhY2VzLAogCQkJCQkJc2Vu ZHRibHNwY2xpbmtzLCAmbWFuaWZlc3QsIEludmFsaWRPaWQsIGliKTsKIAorCQkJCS8qIEVu ZCB0aGUgYmFja3VwIGJlZm9yZSBzZW5kaW5nIHBnX2NvbnRyb2wgKi8KKwkJCQliYXNlYmFj a3VwX3Byb2dyZXNzX3dhaXRfd2FsX2FyY2hpdmUoJnN0YXRlKTsKKwkJCQlkb19wZ19iYWNr dXBfc3RvcChiYWNrdXBfc3RhdGUsICFvcHQtPm5vd2FpdCk7CisKIAkJCQkvKiAuLi4gYW5k IHBnX2NvbnRyb2wgYWZ0ZXIgZXZlcnl0aGluZyBlbHNlLiAqLwotCQkJCWlmIChsc3RhdChY TE9HX0NPTlRST0xfRklMRSwgJnN0YXRidWYpICE9IDApCi0JCQkJCWVyZXBvcnQoRVJST1Is Ci0JCQkJCQkJKGVycmNvZGVfZm9yX2ZpbGVfYWNjZXNzKCksCi0JCQkJCQkJIGVycm1zZygi Y291bGQgbm90IHN0YXQgZmlsZSBcIiVzXCI6ICVtIiwKLQkJCQkJCQkJCVhMT0dfQ09OVFJP TF9GSUxFKSkpOwotCQkJCXNlbmRGaWxlKHNpbmssIFhMT0dfQ09OVFJPTF9GSUxFLCBYTE9H X0NPTlRST0xfRklMRSwgJnN0YXRidWYsCi0JCQkJCQkgZmFsc2UsIEludmFsaWRPaWQsIElu dmFsaWRPaWQsCi0JCQkJCQkgSW52YWxpZFJlbEZpbGVOdW1iZXIsIDAsICZtYW5pZmVzdCwg MCwgTlVMTCwgMCk7CisJCQkJc2VuZEZpbGVXaXRoQ29udGVudChzaW5rLCBYTE9HX0NPTlRS T0xfRklMRSwKKwkJCQkJCQkJCShjaGFyICopYmFja3VwX3N0YXRlLT5jb250cm9sRmlsZSwK KwkJCQkJCQkJCVBHX0NPTlRST0xfRklMRV9TSVpFLCAmbWFuaWZlc3QpOwogCQkJfQogCQkJ ZWxzZQogCQkJewpAQCAtMzkwLDkgKzM4OCw2IEBAIHBlcmZvcm1fYmFzZV9iYWNrdXAoYmFz ZWJhY2t1cF9vcHRpb25zICpvcHQsIGJic2luayAqc2luaywKIAkJCX0KIAkJfQogCi0JCWJh c2ViYWNrdXBfcHJvZ3Jlc3Nfd2FpdF93YWxfYXJjaGl2ZSgmc3RhdGUpOwotCQlkb19wZ19i YWNrdXBfc3RvcChiYWNrdXBfc3RhdGUsICFvcHQtPm5vd2FpdCk7Ci0KIAkJZW5kcHRyID0g YmFja3VwX3N0YXRlLT5zdG9wcG9pbnQ7CiAJCWVuZHRsaSA9IGJhY2t1cF9zdGF0ZS0+c3Rv cHRsaTsKIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvY2F0YWxvZy9zeXN0ZW1fZnVuY3Rp b25zLnNxbCBiL3NyYy9iYWNrZW5kL2NhdGFsb2cvc3lzdGVtX2Z1bmN0aW9ucy5zcWwKaW5k ZXggYWUwOTllMzI4Yy4uZDc2ZDNjNjA4ZiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvY2F0 YWxvZy9zeXN0ZW1fZnVuY3Rpb25zLnNxbAorKysgYi9zcmMvYmFja2VuZC9jYXRhbG9nL3N5 c3RlbV9mdW5jdGlvbnMuc3FsCkBAIC0zOTAsNyArMzkwLDcgQEAgQ1JFQVRFIE9SIFJFUExB Q0UgRlVOQ1RJT04KIAogQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gcGdfYmFja3VwX3N0 b3AgKAogICAgICAgICB3YWl0X2Zvcl9hcmNoaXZlIGJvb2xlYW4gREVGQVVMVCB0cnVlLCBP VVQgbHNuIHBnX2xzbiwKLSAgICAgICAgT1VUIGxhYmVsZmlsZSB0ZXh0LCBPVVQgc3BjbWFw ZmlsZSB0ZXh0KQorICAgICAgICBPVVQgbGFiZWxmaWxlIHRleHQsIE9VVCBzcGNtYXBmaWxl IHRleHQsIE9VVCBjb250cm9sZmlsZSBieXRlYSkKICAgUkVUVVJOUyByZWNvcmQgU1RSSUNU IFZPTEFUSUxFIExBTkdVQUdFIGludGVybmFsIGFzICdwZ19iYWNrdXBfc3RvcCcKICAgUEFS QUxMRUwgUkVTVFJJQ1RFRDsKIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvbWlz Yy9wZ19jb250cm9sZGF0YS5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9wZ19jb250cm9s ZGF0YS5jCmluZGV4IDk4YzkzMmRjN2IuLjllYWYzZjhiOWYgMTAwNjQ0Ci0tLSBhL3NyYy9i YWNrZW5kL3V0aWxzL21pc2MvcGdfY29udHJvbGRhdGEuYworKysgYi9zcmMvYmFja2VuZC91 dGlscy9taXNjL3BnX2NvbnRyb2xkYXRhLmMKQEAgLTE2Miw4ICsxNjIsOCBAQCBwZ19jb250 cm9sX2NoZWNrcG9pbnQoUEdfRlVOQ1RJT05fQVJHUykKIERhdHVtCiBwZ19jb250cm9sX3Jl Y292ZXJ5KFBHX0ZVTkNUSU9OX0FSR1MpCiB7Ci0JRGF0dW0JCXZhbHVlc1s1XTsKLQlib29s CQludWxsc1s1XTsKKwlEYXR1bQkJdmFsdWVzWzZdOworCWJvb2wJCW51bGxzWzZdOwogCVR1 cGxlRGVzYwl0dXBkZXNjOwogCUhlYXBUdXBsZQlodHVwOwogCUNvbnRyb2xGaWxlRGF0YSAq Q29udHJvbEZpbGU7CkBAIC0xOTUsNiArMTk1LDkgQEAgcGdfY29udHJvbF9yZWNvdmVyeShQ R19GVU5DVElPTl9BUkdTKQogCXZhbHVlc1s0XSA9IEJvb2xHZXREYXR1bShDb250cm9sRmls ZS0+YmFja3VwRW5kUmVxdWlyZWQpOwogCW51bGxzWzRdID0gZmFsc2U7CiAKKwl2YWx1ZXNb NV0gPSBCb29sR2V0RGF0dW0oQ29udHJvbEZpbGUtPmJhY2t1cExhYmVsUmVxdWlyZWQpOwor CW51bGxzWzVdID0gZmFsc2U7CisKIAlodHVwID0gaGVhcF9mb3JtX3R1cGxlKHR1cGRlc2Ms IHZhbHVlcywgbnVsbHMpOwogCiAJUEdfUkVUVVJOX0RBVFVNKEhlYXBUdXBsZUdldERhdHVt KGh0dXApKTsKZGlmZiAtLWdpdCBhL3NyYy9iaW4vcGdfY29udHJvbGRhdGEvcGdfY29udHJv bGRhdGEuYyBiL3NyYy9iaW4vcGdfY29udHJvbGRhdGEvcGdfY29udHJvbGRhdGEuYwppbmRl eCA5M2UwODM3OTQ3Li4yMTE0NDg4ZGMwIDEwMDY0NAotLS0gYS9zcmMvYmluL3BnX2NvbnRy b2xkYXRhL3BnX2NvbnRyb2xkYXRhLmMKKysrIGIvc3JjL2Jpbi9wZ19jb250cm9sZGF0YS9w Z19jb250cm9sZGF0YS5jCkBAIC0yODMsNiArMjgzLDggQEAgbWFpbihpbnQgYXJnYywgY2hh ciAqYXJndltdKQogCQkgICBMU05fRk9STUFUX0FSR1MoQ29udHJvbEZpbGUtPmJhY2t1cEVu ZFBvaW50KSk7CiAJcHJpbnRmKF8oIkVuZC1vZi1iYWNrdXAgcmVjb3JkIHJlcXVpcmVkOiAg ICAgICAgJXNcbiIpLAogCQkgICBDb250cm9sRmlsZS0+YmFja3VwRW5kUmVxdWlyZWQgPyBf KCJ5ZXMiKSA6IF8oIm5vIikpOworCXByaW50ZihfKCJCYWNrdXAgbGFiZWwgcmVxdWlyZWQ6 ICAgICAgICAgICAgICAgICVzXG4iKSwKKwkJICAgQ29udHJvbEZpbGUtPmJhY2t1cExhYmVs UmVxdWlyZWQgPyBfKCJ5ZXMiKSA6IF8oIm5vIikpOwogCXByaW50ZihfKCJ3YWxfbGV2ZWwg c2V0dGluZzogICAgICAgICAgICAgICAgICAgICVzXG4iKSwKIAkJICAgd2FsX2xldmVsX3N0 cihDb250cm9sRmlsZS0+d2FsX2xldmVsKSk7CiAJcHJpbnRmKF8oIndhbF9sb2dfaGludHMg c2V0dGluZzogICAgICAgICAgICAgICAgJXNcbiIpLApkaWZmIC0tZ2l0IGEvc3JjL2Jpbi9w Z19yZXNldHdhbC9wZ19yZXNldHdhbC5jIGIvc3JjL2Jpbi9wZ19yZXNldHdhbC9wZ19yZXNl dHdhbC5jCmluZGV4IGU5ZGNiNWE2ZDguLjcwNTY3NTJjZmYgMTAwNjQ0Ci0tLSBhL3NyYy9i aW4vcGdfcmVzZXR3YWwvcGdfcmVzZXR3YWwuYworKysgYi9zcmMvYmluL3BnX3Jlc2V0d2Fs L3BnX3Jlc2V0d2FsLmMKQEAgLTg3NSw2ICs4NzUsNyBAQCBSZXdyaXRlQ29udHJvbEZpbGUo dm9pZCkKIAlDb250cm9sRmlsZS5iYWNrdXBTdGFydFBvaW50ID0gMDsKIAlDb250cm9sRmls ZS5iYWNrdXBFbmRQb2ludCA9IDA7CiAJQ29udHJvbEZpbGUuYmFja3VwRW5kUmVxdWlyZWQg PSBmYWxzZTsKKwlDb250cm9sRmlsZS5iYWNrdXBMYWJlbFJlcXVpcmVkID0gZmFsc2U7CiAK IAkvKgogCSAqIEZvcmNlIHRoZSBkZWZhdWx0cyBmb3IgbWF4Xyogc2V0dGluZ3MuIFRoZSB2 YWx1ZXMgZG9uJ3QgcmVhbGx5IG1hdHRlcgpkaWZmIC0tZ2l0IGEvc3JjL2Jpbi9wZ19yZXdp bmQvcGdfcmV3aW5kLmMgYi9zcmMvYmluL3BnX3Jld2luZC9wZ19yZXdpbmQuYwppbmRleCA4 NDQ5YWU3OGVmLi43YzI3ZDQ3MTEwIDEwMDY0NAotLS0gYS9zcmMvYmluL3BnX3Jld2luZC9w Z19yZXdpbmQuYworKysgYi9zcmMvYmluL3BnX3Jld2luZC9wZ19yZXdpbmQuYwpAQCAtNzIy LDYgKzcyMiw3IEBAIHBlcmZvcm1fcmV3aW5kKGZpbGVtYXBfdCAqZmlsZW1hcCwgcmV3aW5k X3NvdXJjZSAqc291cmNlLAogCUNvbnRyb2xGaWxlX25ldy5taW5SZWNvdmVyeVBvaW50ID0g ZW5kcmVjOwogCUNvbnRyb2xGaWxlX25ldy5taW5SZWNvdmVyeVBvaW50VExJID0gZW5kdGxp OwogCUNvbnRyb2xGaWxlX25ldy5zdGF0ZSA9IERCX0lOX0FSQ0hJVkVfUkVDT1ZFUlk7CisJ Q29udHJvbEZpbGVfbmV3LmJhY2t1cExhYmVsUmVxdWlyZWQgPSB0cnVlOwogCWlmICghZHJ5 X3J1bikKIAkJdXBkYXRlX2NvbnRyb2xmaWxlKGRhdGFkaXJfdGFyZ2V0LCAmQ29udHJvbEZp bGVfbmV3LCBkb19zeW5jKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2FjY2Vzcy94 bG9nYmFja3VwLmggYi9zcmMvaW5jbHVkZS9hY2Nlc3MveGxvZ2JhY2t1cC5oCmluZGV4IGMz MGQ0YTU5OTEuLjkzYTBlNWM1Y2MgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2FjY2Vzcy94 bG9nYmFja3VwLmgKKysrIGIvc3JjL2luY2x1ZGUvYWNjZXNzL3hsb2diYWNrdXAuaApAQCAt MTUsNiArMTUsNyBAQAogI2RlZmluZSBYTE9HX0JBQ0tVUF9ICiAKICNpbmNsdWRlICJhY2Nl c3MveGxvZ2RlZnMuaCIKKyNpbmNsdWRlICJjYXRhbG9nL3BnX2NvbnRyb2wuaCIKICNpbmNs dWRlICJwZ3RpbWUuaCIKIAogLyogU3RydWN0dXJlIHRvIGhvbGQgYmFja3VwIHN0YXRlLiAq LwpAQCAtMzUsNiArMzYsMTMgQEAgdHlwZWRlZiBzdHJ1Y3QgQmFja3VwU3RhdGUKIAlYTG9n UmVjUHRyCXN0b3Bwb2ludDsJCS8qIGJhY2t1cCBzdG9wIFdBTCBsb2NhdGlvbiAqLwogCVRp bWVMaW5lSUQJc3RvcHRsaTsJCS8qIGJhY2t1cCBzdG9wIFRMSSAqLwogCXBnX3RpbWVfdAlz dG9wdGltZTsJCS8qIGJhY2t1cCBzdG9wIHRpbWUgKi8KKworCS8qCisJICogQWZ0ZXIgcGdf YmFja3VwX3N0b3AoKSByZXR1cm5zIHRoaXMgZmllbGQgd2lsbCBjb250YWluIGEgY29weSBv ZgorCSAqIHBnX2NvbnRyb2wgdGhhdCBzaG91bGQgYmUgc3RvcmVkIHdpdGggdGhlIGJhY2t1 cC4gYmFja3VwTGFiZWxSZXF1aXJlZAorCSAqIGhhcyBiZWVuIHNldCBzbyBiYWNrdXBfbGFi ZWwgd2lsbCBiZSByZXF1aXJlZCBmb3IgcmVjb3ZlcnkgdG8gc3RhcnQuCisJICovCisJdWlu dDhfdCBjb250cm9sRmlsZVtQR19DT05UUk9MX0ZJTEVfU0laRV07CiB9IEJhY2t1cFN0YXRl OwogCiBleHRlcm4gY2hhciAqYnVpbGRfYmFja3VwX2NvbnRlbnQoQmFja3VwU3RhdGUgKnN0 YXRlLApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19jb250cm9sLmggYi9z cmMvaW5jbHVkZS9jYXRhbG9nL3BnX2NvbnRyb2wuaAppbmRleCBhMDA2MDZmZmNkLi43MWE5 YmViMDVhIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX2NvbnRyb2wuaAor KysgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX2NvbnRyb2wuaApAQCAtMTYzLDEyICsxNjMs MTYgQEAgdHlwZWRlZiBzdHJ1Y3QgQ29udHJvbEZpbGVEYXRhCiAJICogSWYgYmFja3VwRW5k UmVxdWlyZWQgaXMgdHJ1ZSwgd2Uga25vdyBmb3Igc3VyZSB0aGF0IHdlJ3JlIHJlc3Rvcmlu ZwogCSAqIGZyb20gYSBiYWNrdXAsIGFuZCBtdXN0IHNlZSBhIGJhY2t1cC1lbmQgcmVjb3Jk IGJlZm9yZSB3ZSBjYW4gc2FmZWx5CiAJICogc3RhcnQgdXAuCisJICoKKwkgKiBJZiBiYWNr dXBMYWJlbFJlcXVpcmVkIGlzIHRydWUsIHRoZW4gYSBiYWNrdXBfbGFiZWwgZmlsZSBtdXN0 IGJlCisJICogcHJlc2VudCBpbiBvcmRlciBmb3IgcmVjb3ZlcnkgdG8gc3VjY2VlZC4KIAkg Ki8KIAlYTG9nUmVjUHRyCW1pblJlY292ZXJ5UG9pbnQ7CiAJVGltZUxpbmVJRAltaW5SZWNv dmVyeVBvaW50VExJOwogCVhMb2dSZWNQdHIJYmFja3VwU3RhcnRQb2ludDsKIAlYTG9nUmVj UHRyCWJhY2t1cEVuZFBvaW50OwogCWJvb2wJCWJhY2t1cEVuZFJlcXVpcmVkOworCWJvb2wJ CWJhY2t1cExhYmVsUmVxdWlyZWQ7CiAKIAkvKgogCSAqIFBhcmFtZXRlciBzZXR0aW5ncyB0 aGF0IGRldGVybWluZSBpZiB0aGUgV0FMIGNhbiBiZSB1c2VkIGZvciBhcmNoaXZhbApkaWZm IC0tZ2l0IGEvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdCBiL3NyYy9pbmNsdWRl L2NhdGFsb2cvcGdfcHJvYy5kYXQKaW5kZXggNmE1NDc2ZDNjNC4uNmNiODdmYjc0NCAxMDA2 NDQKLS0tIGEvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdAorKysgYi9zcmMvaW5j bHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0CkBAIC02NDYzLDggKzY0NjMsOCBAQAogeyBvaWQg PT4gJzI3MzknLCBkZXNjciA9PiAnZmluaXNoIHRha2luZyBhbiBvbmxpbmUgYmFja3VwJywK ICAgcHJvbmFtZSA9PiAncGdfYmFja3VwX3N0b3AnLCBwcm92b2xhdGlsZSA9PiAndicsIHBy b3BhcmFsbGVsID0+ICdyJywKICAgcHJvcmV0dHlwZSA9PiAncmVjb3JkJywgcHJvYXJndHlw ZXMgPT4gJ2Jvb2wnLAotICBwcm9hbGxhcmd0eXBlcyA9PiAne2Jvb2wscGdfbHNuLHRleHQs dGV4dH0nLCBwcm9hcmdtb2RlcyA9PiAne2ksbyxvLG99JywKLSAgcHJvYXJnbmFtZXMgPT4g J3t3YWl0X2Zvcl9hcmNoaXZlLGxzbixsYWJlbGZpbGUsc3BjbWFwZmlsZX0nLAorICBwcm9h bGxhcmd0eXBlcyA9PiAne2Jvb2wscGdfbHNuLHRleHQsdGV4dCxieXRlYX0nLCBwcm9hcmdt b2RlcyA9PiAne2ksbyxvLG8sb30nLAorICBwcm9hcmduYW1lcyA9PiAne3dhaXRfZm9yX2Fy Y2hpdmUsbHNuLGxhYmVsZmlsZSxzcGNtYXBmaWxlLGNvbnRyb2xmaWxlfScsCiAgIHByb3Ny YyA9PiAncGdfYmFja3VwX3N0b3AnIH0sCiB7IG9pZCA9PiAnMzQzNicsIGRlc2NyID0+ICdw cm9tb3RlIHN0YW5kYnkgc2VydmVyJywKICAgcHJvbmFtZSA9PiAncGdfcHJvbW90ZScsIHBy b3ZvbGF0aWxlID0+ICd2JywgcHJvcmV0dHlwZSA9PiAnYm9vbCcsCkBAIC0xMTk4MSw5ICsx MTk4MSw5IEBACiB7IG9pZCA9PiAnMzQ0MycsCiAgIGRlc2NyID0+ICdwZ19jb250cm9sZGF0 YSByZWNvdmVyeSBzdGF0ZSBpbmZvcm1hdGlvbiBhcyBhIGZ1bmN0aW9uJywKICAgcHJvbmFt ZSA9PiAncGdfY29udHJvbF9yZWNvdmVyeScsIHByb3ZvbGF0aWxlID0+ICd2JywgcHJvcmV0 dHlwZSA9PiAncmVjb3JkJywKLSAgcHJvYXJndHlwZXMgPT4gJycsIHByb2FsbGFyZ3R5cGVz ID0+ICd7cGdfbHNuLGludDQscGdfbHNuLHBnX2xzbixib29sfScsCi0gIHByb2FyZ21vZGVz ID0+ICd7byxvLG8sbyxvfScsCi0gIHByb2FyZ25hbWVzID0+ICd7bWluX3JlY292ZXJ5X2Vu ZF9sc24sbWluX3JlY292ZXJ5X2VuZF90aW1lbGluZSxiYWNrdXBfc3RhcnRfbHNuLGJhY2t1 cF9lbmRfbHNuLGVuZF9vZl9iYWNrdXBfcmVjb3JkX3JlcXVpcmVkfScsCisgIHByb2FyZ3R5 cGVzID0+ICcnLCBwcm9hbGxhcmd0eXBlcyA9PiAne3BnX2xzbixpbnQ0LHBnX2xzbixwZ19s c24sYm9vbCxib29sfScsCisgIHByb2FyZ21vZGVzID0+ICd7byxvLG8sbyxvLG99JywKKyAg cHJvYXJnbmFtZXMgPT4gJ3ttaW5fcmVjb3ZlcnlfZW5kX2xzbixtaW5fcmVjb3ZlcnlfZW5k X3RpbWVsaW5lLGJhY2t1cF9zdGFydF9sc24sYmFja3VwX2VuZF9sc24sZW5kX29mX2JhY2t1 cF9yZWNvcmRfcmVxdWlyZWQsYmFja3VwX2xhYmVsX3JlcXVpcmVkfScsCiAgIHByb3NyYyA9 PiAncGdfY29udHJvbF9yZWNvdmVyeScgfSwKIAogeyBvaWQgPT4gJzM0NDQnLApkaWZmIC0t Z2l0IGEvc3JjL3Rlc3QvcmVjb3ZlcnkvdC8wMDJfYXJjaGl2aW5nLnBsIGIvc3JjL3Rlc3Qv cmVjb3ZlcnkvdC8wMDJfYXJjaGl2aW5nLnBsCmluZGV4IGEyZTAxMmU0MmQuLjY1MzU0NmE2 YzAgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlY292ZXJ5L3QvMDAyX2FyY2hpdmluZy5wbAor KysgYi9zcmMvdGVzdC9yZWNvdmVyeS90LzAwMl9hcmNoaXZpbmcucGwKQEAgLTQxLDYgKzQx LDI2IEBAICRub2RlX3N0YW5kYnktPmFwcGVuZF9jb25mKAogYXJjaGl2ZV9jbGVhbnVwX2Nv bW1hbmQgPSAnZWNobyBhcmNoaXZlX2NsZWFudXBfZG9uZSA+ICRhcmNoaXZlX2NsZWFudXBf Y29tbWFuZF9maWxlJwogcmVjb3ZlcnlfZW5kX2NvbW1hbmQgPSAnZWNobyByZWNvdmVyeV9l bmRlZF9kb25lID4gJHJlY292ZXJ5X2VuZF9jb21tYW5kX2ZpbGUnCiApKTsKKworIyBSZW5h bWUgYmFja3VwX2xhYmVsIHRvIHZlcmlmeSB0aGF0IHJlY292ZXJ5IHdpbGwgbm90IHN0YXJ0 IHdpdGhvdXQgaXQKK3JlbmFtZSgiJGRhdGFfZGlyL2JhY2t1cF9sYWJlbCIsICIkZGF0YV9k aXIvYmFja3VwX2xhYmVsLnRtcCIpCisgIG9yIEJBSUxfT1VUICJjb3VsZCBub3QgbW92ZSAk ZGF0YV9kaXIvYmFja3VwX2xhYmVsIjsKKworbXkgJHJlcyA9IHJ1bl9sb2coCisJWworCQkn cGdfY3RsJywgJy1EJywgJG5vZGVfc3RhbmRieS0+ZGF0YV9kaXIsICctbCcsCisJCSRub2Rl X3N0YW5kYnktPmxvZ2ZpbGUsICdzdGFydCcKKwldKTsKK29rKCEkcmVzLCAnaW52YWxpZCBy ZWNvdmVyeSBzdGFydHVwIGZhaWxzJyk7CisKK215ICRsb2dmaWxlID0gc2x1cnBfZmlsZSgk bm9kZV9zdGFuZGJ5LT5sb2dmaWxlKCkpOworb2soJGxvZ2ZpbGUgPX4gcXIvY291bGQgbm90 IGZpbmQgYmFja3VwX2xhYmVsIHJlcXVpcmVkIGZvciByZWNvdmVyeS8sCisJJ2NvdWxkIG5v dCBmaW5kIGJhY2t1cF9sYWJlbCByZXF1aXJlZCBmb3IgcmVjb3ZlcnknKTsKKworIyBSZXN0 b3JlIGJhY2t1cF9sYWJlbCBzbyByZWNvdmVyeSBwcm9jZWVkcyBub3JtYWxseQorcmVuYW1l KCIkZGF0YV9kaXIvYmFja3VwX2xhYmVsLnRtcCIsICIkZGF0YV9kaXIvYmFja3VwX2xhYmVs IikKKyAgb3IgQkFJTF9PVVQgImNvdWxkIG5vdCBtb3ZlICRkYXRhX2Rpci9iYWNrdXBfbGFi ZWwiOworCiAkbm9kZV9zdGFuZGJ5LT5zdGFydDsKIAogIyBDcmVhdGUgc29tZSBjb250ZW50 IG9uIHByaW1hcnkKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlY292ZXJ5L3QvMDQyX2xvd19s ZXZlbF9iYWNrdXAucGwgYi9zcmMvdGVzdC9yZWNvdmVyeS90LzA0Ml9sb3dfbGV2ZWxfYmFj a3VwLnBsCmluZGV4IDYxZDIzMTg3ZTAuLmJkM2E5OTk2MGYgMTAwNjQ0Ci0tLSBhL3NyYy90 ZXN0L3JlY292ZXJ5L3QvMDQyX2xvd19sZXZlbF9iYWNrdXAucGwKKysrIGIvc3JjL3Rlc3Qv cmVjb3ZlcnkvdC8wNDJfbG93X2xldmVsX2JhY2t1cC5wbApAQCAtMTMsNiArMTMsNDIgQEAg dXNlIFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0ZXI7CiB1c2UgUG9zdGdyZVNRTDo6VGVzdDo6 VXRpbHM7CiB1c2UgVGVzdDo6TW9yZTsKIAorIyBEZWNvZGUgaGV4IHRvIGJpbmFyeQorc3Vi IGRlY29kZV9oZXgKK3sKKwlteSAoJGVuY29kZWQpID0gQF87CisJbXkgJGRlY29kZWQ7CisK KwkkZW5jb2RlZCA9fiBzL15ccyt8XHMrJC8vZzsKKworCWZvciAobXkgJGlkeCA9IDA7ICRp ZHggPCBsZW5ndGgoJGVuY29kZWQpOyAkaWR4ICs9IDIpCisJeworCQkkZGVjb2RlZCAuPSBw YWNrKCdDJywgaGV4KHN1YnN0cigkZW5jb2RlZCwgJGlkeCwgMikpKTsKKwl9CisKKwlyZXR1 cm4gJGRlY29kZWQ7Cit9CisKKyMgR2V0IGJhY2t1cF9sYWJlbC9wZ19jb250cm9sIGZyb20g cGdfc3RvcF9iYWNrdXAoKQorc3ViIHN0b3BfYmFja3VwX3Jlc3VsdAoreworCW15ICgkcHNx bCkgPSBAXzsKKworCW15ICRlbmNvZGVkID0gJHBzcWwtPnF1ZXJ5X3NhZmUoCisJCSJzZWxl Y3QgZW5jb2RlKGxhYmVsZmlsZTo6Ynl0ZWEsICdoZXgnKSB8fCAnLCcgfHwgIiAuCisJCSIg ICAgICAgZW5jb2RlKGNvbnRyb2xmaWxlLCAnaGV4JykiIC4KKwkJIiAgZnJvbSBwZ19iYWNr dXBfc3RvcCgpIik7CisKKwlteSBAcmVzdWx0OworCisgICAgZm9yZWFjaCBteSAkY29sdW1u IChzcGxpdCgnLCcsICRlbmNvZGVkKSkKKwl7CisJCXB1c2goQHJlc3VsdCwgZGVjb2RlX2hl eCgkY29sdW1uKSk7CisJfQorCisJcmV0dXJuIEByZXN1bHQ7Cit9CisKICMgU3RhcnQgcHJp bWFyeSBub2RlIHdpdGggYXJjaGl2aW5nLgogbXkgJG5vZGVfcHJpbWFyeSA9IFBvc3RncmVT UUw6OlRlc3Q6OkNsdXN0ZXItPm5ldygncHJpbWFyeScpOwogJG5vZGVfcHJpbWFyeS0+aW5p dChoYXNfYXJjaGl2aW5nID0+IDEsIGFsbG93c19zdHJlYW1pbmcgPT4gMSk7CkBAIC04MCw4 ICsxMTYsNyBAQCBteSAkc3RvcF9zZWdtZW50X25hbWUgPSAkbm9kZV9wcmltYXJ5LT5zYWZl X3BzcWwoJ3Bvc3RncmVzJywKIAknU0VMRUNUIHBnX3dhbGZpbGVfbmFtZShwZ19jdXJyZW50 X3dhbF9sc24oKSknKTsKIAogIyBTdG9wIGJhY2t1cCBhbmQgZ2V0IGJhY2t1cF9sYWJlbCwg dGhlIGxhc3Qgc2VnbWVudCBpcyBhcmNoaXZlZC4KLW15ICRiYWNrdXBfbGFiZWwgPQotICAk cHNxbC0+cXVlcnlfc2FmZSgic2VsZWN0IGxhYmVsZmlsZSBmcm9tIHBnX2JhY2t1cF9zdG9w KCkiKTsKKyhteSAkYmFja3VwX2xhYmVsLCBteSAkcGdfY29udHJvbCkgPSBzdG9wX2JhY2t1 cF9yZXN1bHQoJHBzcWwpOwogCiAkcHNxbC0+cXVpdDsKIApAQCAtMTE4LDEwICsxNTMsMzYg QEAgb2soICRub2RlX3JlcGxpY2EtPmxvZ19jb250YWlucygKICRub2RlX3JlcGxpY2EtPnRl YXJkb3duX25vZGU7CiAkbm9kZV9yZXBsaWNhLT5jbGVhbl9ub2RlOwogCisjIFNhdmUgb25s eSBwZ19jb250cm9sIGludG8gdGhlIGJhY2t1cCB0byBkZW1vbnN0cmF0ZSB0aGF0IHBnX2Nv bnRyb2wgcmV0dXJuZWQKKyMgZnJvbSBwZ19zdG9wX2JhY2t1cCgpIHdpbGwgb25seSBwZXJm b3JtIHJlY292ZXJ5IHdoZW4gYmFja3VwX2xhYmVsIGlzIHByZXNlbnQuCitvcGVuKG15ICRm aCwgIj4iLCAiJGJhY2t1cF9kaXIvZ2xvYmFsL3BnX2NvbnRyb2wiKQorICBvciBkaWUgImNv dWxkIG5vdCBvcGVuIHBnX2NvbnRyb2wiOworYmlubW9kZSgkZmgpOworc3lzd3JpdGUoJGZo LCAkcGdfY29udHJvbCk7CitjbG9zZSgkZmgpOworCiskbm9kZV9yZXBsaWNhID0gUG9zdGdy ZVNRTDo6VGVzdDo6Q2x1c3Rlci0+bmV3KCdyZXBsaWNhX2ZhaWwyJyk7Ciskbm9kZV9yZXBs aWNhLT5pbml0X2Zyb21fYmFja3VwKCRub2RlX3ByaW1hcnksICRiYWNrdXBfbmFtZSwKKwlo YXNfcmVzdG9yaW5nID0+IDEpOworCitteSAkcmVzID0gcnVuX2xvZygKKwlbCisJCSdwZ19j dGwnLCAnLUQnLCAkbm9kZV9yZXBsaWNhLT5kYXRhX2RpciwgJy1sJywKKwkJJG5vZGVfcmVw bGljYS0+bG9nZmlsZSwgJ3N0YXJ0JworCV0pOworb2soISRyZXMsICdpbnZhbGlkIHJlY292 ZXJ5IHN0YXJ0dXAgZmFpbHMnKTsKKworbXkgJGxvZ2ZpbGUgPSBzbHVycF9maWxlKCRub2Rl X3JlcGxpY2EtPmxvZ2ZpbGUoKSk7CitvaygkbG9nZmlsZSA9fiBxci9jb3VsZCBub3QgZmlu ZCBiYWNrdXBfbGFiZWwgcmVxdWlyZWQgZm9yIHJlY292ZXJ5LywKKwknY291bGQgbm90IGZp bmQgYmFja3VwX2xhYmVsIHJlcXVpcmVkIGZvciByZWNvdmVyeScpOworCiskbm9kZV9yZXBs aWNhLT50ZWFyZG93bl9ub2RlOworJG5vZGVfcmVwbGljYS0+Y2xlYW5fbm9kZTsKKwogIyBT YXZlIGJhY2t1cF9sYWJlbCBpbnRvIHRoZSBiYWNrdXAgZGlyZWN0b3J5IGFuZCByZWNvdmVy IHVzaW5nIHRoZSBwcmltYXJ5J3MKICMgYXJjaGl2ZS4gIFRoaXMgdGltZSByZWNvdmVyeSB3 aWxsIHN1Y2NlZWQgYW5kIHRoZSBjYW5hcnkgdGFibGUgd2lsbCBiZQogIyBwcmVzZW50Lgot b3BlbiBteSAkZmgsICI+PiIsICIkYmFja3VwX2Rpci9iYWNrdXBfbGFiZWwiCitvcGVuICRm aCwgIj4+IiwgIiRiYWNrdXBfZGlyL2JhY2t1cF9sYWJlbCIKICAgb3IgZGllICJjb3VsZCBu b3Qgb3BlbiBiYWNrdXBfbGFiZWwiOwogIyBCaW5hcnkgbW9kZSBpcyByZXF1aXJlZCBmb3Ig V2luZG93cywgYXMgdGhlIGJhY2t1cF9sYWJlbCBwYXJzaW5nIGlzIG5vdAogIyBhYmxlIHRv IGNvcGUgd2l0aCBDUkxGcy4KLS0gCjIuMzQuMQoK --------------1i90iZXUVF50m4dZPuVfyTzo--