Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bZvlL-0004GL-QB for pgsql-hackers@arkaria.postgresql.org; Wed, 17 Aug 2016 07:59:48 +0000 Received: from localhost ([127.0.0.1] helo=postgresql.org) by malur.postgresql.org with smtp (Exim 4.84_2) (envelope-from ) id 1bZvlL-0005qz-9B for pgsql-hackers@arkaria.postgresql.org; Wed, 17 Aug 2016 07:59:47 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1bZvjr-0004Ff-Jd for pgsql-hackers@postgresql.org; Wed, 17 Aug 2016 07:58:15 +0000 Received: from ohmu.fi ([2001:1bc8:100:6::f301]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1bZvjo-0001M4-Pd for pgsql-hackers@postgresql.org; Wed, 17 Aug 2016 07:58:15 +0000 Received: from [127.0.0.1] (localhost [IPv6:::1]) by ohmu.fi (Postfix) with ESMTP id 95776604BF for ; Wed, 17 Aug 2016 10:58:10 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ohmu.fi; s=ohmu20151014; t=1471420690; bh=sWw6TAPTgWhXQ205cKqFZi5pyZWq4OO/ozNlh6TFLfQ=; h=To:From:Subject:Date:From; b=FVehVmZmOs/GulYJJBLE40M1Y8ty5ycomnStGtZts7ObSt4JC8f6ead1nmz/cKtyN +MHD3HqCPY2pfTWN+dpTVacHMYOloIuJR5CodycLQ6LtMaRSLqf7r18ZcuQtDhMXiP 6eEyJ0YMqBQ6AXwtUHA0jYYJGYYKTePGohfk9XmE= To: pgsql-hackers@postgresql.org From: Oskari Saarenmaa Subject: Use pread and pwrite instead of lseek + write and read Message-ID: Date: Wed, 17 Aug 2016 10:58:09 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.1.1 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------A81F9A7BB18DB98996B02C61" X-Pg-Spam-Score: -2.5 (--) List-Archive: List-Help: List-ID: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-Mailing-List: pgsql-hackers Precedence: bulk Sender: pgsql-hackers-owner@postgresql.org This is a multi-part message in MIME format. --------------A81F9A7BB18DB98996B02C61 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Hi, The Uber blog post, among other things, pointed out that PG uses lseek + read instead of pread. I didn't see any discussion around that and my Google searches didn't find any posts about pread / pwrite for the past 10 years. With that plus the "C++ port" thread in mind, I was wondering if it's time to see if we could do better by just utilizing newer C and POSIX features. The attached patch replaces FileWrite and FileRead with FileWriteAt and FileReadAt and removes most FileSeek calls. FileSeek is still around so we can find the end of a file, but it's not used for anything else. On my laptop a simple pgbench run (scale 100, 15 minutes) shows a 1.5% performance improvement. A 1.5% performance improvement is small but measurable - and IMV more importantly it allows us to drop more than 100 lines of backwards (compatible?) code; maybe we could start targeting more recent platforms in v10? Obviously this patch needs some more work before it could be merged, and we probably still need a fallback for some platforms without pread and pwrite (afaik Windows doesn't implement them.) / Oskari --------------A81F9A7BB18DB98996B02C61 Content-Type: application/x-patch; name="use-pread-pwrite.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="use-pread-pwrite.patch" ZGlmZiAtLWdpdCBzcmMvYmFja2VuZC9hY2Nlc3MvaGVhcC9yZXdyaXRlaGVh cC5jIHNyYy9iYWNrZW5kL2FjY2Vzcy9oZWFwL3Jld3JpdGVoZWFwLmMKaW5k ZXggZjljZTk4Ni4uNmRjNWRmMyAxMDA2NDQKLS0tIHNyYy9iYWNrZW5kL2Fj Y2Vzcy9oZWFwL3Jld3JpdGVoZWFwLmMKKysrIHNyYy9iYWNrZW5kL2FjY2Vz cy9oZWFwL3Jld3JpdGVoZWFwLmMKQEAgLTkxOCw3ICs5MTgsNyBAQCBsb2dp Y2FsX2hlYXBfcmV3cml0ZV9mbHVzaF9tYXBwaW5ncyhSZXdyaXRlU3RhdGUg c3RhdGUpCiAJCSAqIE5vdGUgdGhhdCB3ZSBkZXZpYXRlIGZyb20gdGhlIHVz dWFsIFdBTCBjb2RpbmcgcHJhY3RpY2VzIGhlcmUsCiAJCSAqIGNoZWNrIHRo ZSBhYm92ZSAiTG9naWNhbCByZXdyaXRlIHN1cHBvcnQiIGNvbW1lbnQgZm9y IHJlYXNvbmluZy4KIAkJICovCi0JCXdyaXR0ZW4gPSBGaWxlV3JpdGUoc3Jj LT52ZmQsIHdhbGRhdGFfc3RhcnQsIGxlbik7CisJCXdyaXR0ZW4gPSBGaWxl V3JpdGVBdChzcmMtPnZmZCwgd2FsZGF0YV9zdGFydCwgbGVuLCBzcmMtPm9m Zik7CiAJCWlmICh3cml0dGVuICE9IGxlbikKIAkJCWVyZXBvcnQoRVJST1Is CiAJCQkJCShlcnJjb2RlX2Zvcl9maWxlX2FjY2VzcygpLApkaWZmIC0tZ2l0 IHNyYy9iYWNrZW5kL3N0b3JhZ2UvZmlsZS9idWZmaWxlLmMgc3JjL2JhY2tl bmQvc3RvcmFnZS9maWxlL2J1ZmZpbGUuYwppbmRleCAwNDJiZTc5Li4zOTQ4 MmZhIDEwMDY0NAotLS0gc3JjL2JhY2tlbmQvc3RvcmFnZS9maWxlL2J1ZmZp bGUuYworKysgc3JjL2JhY2tlbmQvc3RvcmFnZS9maWxlL2J1ZmZpbGUuYwpA QCAtNjAsMTIgKzYwLDYgQEAgc3RydWN0IEJ1ZkZpbGUKIAlpbnQJCQludW1G aWxlczsJCS8qIG51bWJlciBvZiBwaHlzaWNhbCBmaWxlcyBpbiBzZXQgKi8K IAkvKiBhbGwgZmlsZXMgZXhjZXB0IHRoZSBsYXN0IGhhdmUgbGVuZ3RoIGV4 YWN0bHkgTUFYX1BIWVNJQ0FMX0ZJTEVTSVpFICovCiAJRmlsZQkgICAqZmls ZXM7CQkJLyogcGFsbG9jJ2QgYXJyYXkgd2l0aCBudW1GaWxlcyBlbnRyaWVz ICovCi0Jb2ZmX3QJICAgKm9mZnNldHM7CQkvKiBwYWxsb2MnZCBhcnJheSB3 aXRoIG51bUZpbGVzIGVudHJpZXMgKi8KLQotCS8qCi0JICogb2Zmc2V0c1tp XSBpcyB0aGUgY3VycmVudCBzZWVrIHBvc2l0aW9uIG9mIGZpbGVzW2ldLiAg V2UgdXNlIHRoaXMgdG8KLQkgKiBhdm9pZCBtYWtpbmcgcmVkdW5kYW50IEZp bGVTZWVrIGNhbGxzLgotCSAqLwogCiAJYm9vbAkJaXNUZW1wOwkJCS8qIGNh biBvbmx5IGFkZCBmaWxlcyBpZiB0aGlzIGlzIFRSVUUgKi8KIAlib29sCQlp c0ludGVyWGFjdDsJLyoga2VlcCBvcGVuIG92ZXIgdHJhbnNhY3Rpb25zPyAq LwpAQCAtMTA4LDggKzEwMiw2IEBAIG1ha2VCdWZGaWxlKEZpbGUgZmlyc3Rm aWxlKQogCWZpbGUtPm51bUZpbGVzID0gMTsKIAlmaWxlLT5maWxlcyA9IChG aWxlICopIHBhbGxvYyhzaXplb2YoRmlsZSkpOwogCWZpbGUtPmZpbGVzWzBd ID0gZmlyc3RmaWxlOwotCWZpbGUtPm9mZnNldHMgPSAob2ZmX3QgKikgcGFs bG9jKHNpemVvZihvZmZfdCkpOwotCWZpbGUtPm9mZnNldHNbMF0gPSAwTDsK IAlmaWxlLT5pc1RlbXAgPSBmYWxzZTsKIAlmaWxlLT5pc0ludGVyWGFjdCA9 IGZhbHNlOwogCWZpbGUtPmRpcnR5ID0gZmFsc2U7CkBAIC0xNDMsMTAgKzEz NSw3IEBAIGV4dGVuZEJ1ZkZpbGUoQnVmRmlsZSAqZmlsZSkKIAogCWZpbGUt PmZpbGVzID0gKEZpbGUgKikgcmVwYWxsb2MoZmlsZS0+ZmlsZXMsCiAJCQkJ CQkJCQkoZmlsZS0+bnVtRmlsZXMgKyAxKSAqIHNpemVvZihGaWxlKSk7Ci0J ZmlsZS0+b2Zmc2V0cyA9IChvZmZfdCAqKSByZXBhbGxvYyhmaWxlLT5vZmZz ZXRzLAotCQkJCQkJCQkJICAgKGZpbGUtPm51bUZpbGVzICsgMSkgKiBzaXpl b2Yob2ZmX3QpKTsKIAlmaWxlLT5maWxlc1tmaWxlLT5udW1GaWxlc10gPSBw ZmlsZTsKLQlmaWxlLT5vZmZzZXRzW2ZpbGUtPm51bUZpbGVzXSA9IDBMOwog CWZpbGUtPm51bUZpbGVzKys7CiB9CiAKQEAgLTIxMCw3ICsxOTksNiBAQCBC dWZGaWxlQ2xvc2UoQnVmRmlsZSAqZmlsZSkKIAkJRmlsZUNsb3NlKGZpbGUt PmZpbGVzW2ldKTsKIAkvKiByZWxlYXNlIHRoZSBidWZmZXIgc3BhY2UgKi8K IAlwZnJlZShmaWxlLT5maWxlcyk7Ci0JcGZyZWUoZmlsZS0+b2Zmc2V0cyk7 CiAJcGZyZWUoZmlsZSk7CiB9CiAKQEAgLTI0MSwyMyArMjI5LDEyIEBAIEJ1 ZkZpbGVMb2FkQnVmZmVyKEJ1ZkZpbGUgKmZpbGUpCiAJfQogCiAJLyoKLQkg KiBNYXkgbmVlZCB0byByZXBvc2l0aW9uIHBoeXNpY2FsIGZpbGUuCi0JICov Ci0JdGhpc2ZpbGUgPSBmaWxlLT5maWxlc1tmaWxlLT5jdXJGaWxlXTsKLQlp ZiAoZmlsZS0+Y3VyT2Zmc2V0ICE9IGZpbGUtPm9mZnNldHNbZmlsZS0+Y3Vy RmlsZV0pCi0JewotCQlpZiAoRmlsZVNlZWsodGhpc2ZpbGUsIGZpbGUtPmN1 ck9mZnNldCwgU0VFS19TRVQpICE9IGZpbGUtPmN1ck9mZnNldCkKLQkJCXJl dHVybjsJCQkJLyogc2VlayBmYWlsZWQsIHJlYWQgbm90aGluZyAqLwotCQlm aWxlLT5vZmZzZXRzW2ZpbGUtPmN1ckZpbGVdID0gZmlsZS0+Y3VyT2Zmc2V0 OwotCX0KLQotCS8qCiAJICogUmVhZCB3aGF0ZXZlciB3ZSBjYW4gZ2V0LCB1 cCB0byBhIGZ1bGwgYnVmZmVybG9hZC4KIAkgKi8KLQlmaWxlLT5uYnl0ZXMg PSBGaWxlUmVhZCh0aGlzZmlsZSwgZmlsZS0+YnVmZmVyLCBzaXplb2YoZmls ZS0+YnVmZmVyKSk7CisJdGhpc2ZpbGUgPSBmaWxlLT5maWxlc1tmaWxlLT5j dXJGaWxlXTsKKwlmaWxlLT5uYnl0ZXMgPSBGaWxlUmVhZEF0KHRoaXNmaWxl LCBmaWxlLT5idWZmZXIsIHNpemVvZihmaWxlLT5idWZmZXIpLCBmaWxlLT5j dXJPZmZzZXQpOwogCWlmIChmaWxlLT5uYnl0ZXMgPCAwKQogCQlmaWxlLT5u Ynl0ZXMgPSAwOwotCWZpbGUtPm9mZnNldHNbZmlsZS0+Y3VyRmlsZV0gKz0g ZmlsZS0+bmJ5dGVzOwogCS8qIHdlIGNob29zZSBub3QgdG8gYWR2YW5jZSBj dXJPZmZzZXQgaGVyZSAqLwogCiAJcGdCdWZmZXJVc2FnZS50ZW1wX2Jsa3Nf cmVhZCsrOwpAQCAtMzA3LDIwICsyODQsMTAgQEAgQnVmRmlsZUR1bXBCdWZm ZXIoQnVmRmlsZSAqZmlsZSkKIAkJCQlieXRlc3Rvd3JpdGUgPSAoaW50KSBh dmFpbGJ5dGVzOwogCQl9CiAKLQkJLyoKLQkJICogTWF5IG5lZWQgdG8gcmVw b3NpdGlvbiBwaHlzaWNhbCBmaWxlLgotCQkgKi8KIAkJdGhpc2ZpbGUgPSBm aWxlLT5maWxlc1tmaWxlLT5jdXJGaWxlXTsKLQkJaWYgKGZpbGUtPmN1ck9m ZnNldCAhPSBmaWxlLT5vZmZzZXRzW2ZpbGUtPmN1ckZpbGVdKQotCQl7Ci0J CQlpZiAoRmlsZVNlZWsodGhpc2ZpbGUsIGZpbGUtPmN1ck9mZnNldCwgU0VF S19TRVQpICE9IGZpbGUtPmN1ck9mZnNldCkKLQkJCQlyZXR1cm47CQkJLyog c2VlayBmYWlsZWQsIGdpdmUgdXAgKi8KLQkJCWZpbGUtPm9mZnNldHNbZmls ZS0+Y3VyRmlsZV0gPSBmaWxlLT5jdXJPZmZzZXQ7Ci0JCX0KLQkJYnl0ZXN0 b3dyaXRlID0gRmlsZVdyaXRlKHRoaXNmaWxlLCBmaWxlLT5idWZmZXIgKyB3 cG9zLCBieXRlc3Rvd3JpdGUpOworCQlieXRlc3Rvd3JpdGUgPSBGaWxlV3Jp dGVBdCh0aGlzZmlsZSwgZmlsZS0+YnVmZmVyICsgd3BvcywgYnl0ZXN0b3dy aXRlLCBmaWxlLT5jdXJPZmZzZXQpOwogCQlpZiAoYnl0ZXN0b3dyaXRlIDw9 IDApCiAJCQlyZXR1cm47CQkJCS8qIGZhaWxlZCB0byB3cml0ZSAqLwotCQlm aWxlLT5vZmZzZXRzW2ZpbGUtPmN1ckZpbGVdICs9IGJ5dGVzdG93cml0ZTsK IAkJZmlsZS0+Y3VyT2Zmc2V0ICs9IGJ5dGVzdG93cml0ZTsKIAkJd3BvcyAr PSBieXRlc3Rvd3JpdGU7CiAKZGlmZiAtLWdpdCBzcmMvYmFja2VuZC9zdG9y YWdlL2ZpbGUvZmQuYyBzcmMvYmFja2VuZC9zdG9yYWdlL2ZpbGUvZmQuYwpp bmRleCAwMzE0M2YxLi43OTVjYjEyIDEwMDY0NAotLS0gc3JjL2JhY2tlbmQv c3RvcmFnZS9maWxlL2ZkLmMKKysrIHNyYy9iYWNrZW5kL3N0b3JhZ2UvZmls ZS9mZC5jCkBAIC0xNiw4ICsxNiw4IEBACiAgKiBpbmNsdWRpbmcgYmFzZSB0 YWJsZXMsIHNjcmF0Y2ggZmlsZXMgKGUuZy4sIHNvcnQgYW5kIGhhc2ggc3Bv b2wKICAqIGZpbGVzKSwgYW5kIHJhbmRvbSBjYWxscyB0byBDIGxpYnJhcnkg cm91dGluZXMgbGlrZSBzeXN0ZW0oMyk7IGl0CiAgKiBpcyBxdWl0ZSBlYXN5 IHRvIGV4Y2VlZCBzeXN0ZW0gbGltaXRzIG9uIHRoZSBudW1iZXIgb2Ygb3Bl biBmaWxlcyBhCi0gKiBzaW5nbGUgcHJvY2VzcyBjYW4gaGF2ZS4gIChUaGlz IGlzIGFyb3VuZCAyNTYgb24gbWFueSBtb2Rlcm4KLSAqIG9wZXJhdGluZyBz eXN0ZW1zLCBidXQgY2FuIGJlIGFzIGxvdyBhcyAzMiBvbiBvdGhlcnMuKQor ICogc2luZ2xlIHByb2Nlc3MgY2FuIGhhdmUuICAoVGhpcyBpcyBhcm91bmQg MTAyNCBvbiBtYW55IG1vZGVybgorICogb3BlcmF0aW5nIHN5c3RlbXMsIGJ1 dCBtYXkgYmUgbG93ZXIgb24gb3RoZXJzLikKICAqCiAgKiBWRkRzIGFyZSBt YW5hZ2VkIGFzIGFuIExSVSBwb29sLCB3aXRoIGFjdHVhbCBPUyBmaWxlIGRl c2NyaXB0b3JzCiAgKiBiZWluZyBvcGVuZWQgYW5kIGNsb3NlZCBhcyBuZWVk ZWQuICBPYnZpb3VzbHksIGlmIGEgcm91dGluZSBpcwpAQCAtMTc0LDcgKzE3 NCw2IEBAIHR5cGVkZWYgc3RydWN0IHZmZAogCUZpbGUJCW5leHRGcmVlOwkJ LyogbGluayB0byBuZXh0IGZyZWUgVkZELCBpZiBpbiBmcmVlbGlzdCAqLwog CUZpbGUJCWxydU1vcmVSZWNlbnRseTsJLyogZG91Ymx5IGxpbmtlZCByZWNl bmN5LW9mLXVzZSBsaXN0ICovCiAJRmlsZQkJbHJ1TGVzc1JlY2VudGx5Owot CW9mZl90CQlzZWVrUG9zOwkJLyogY3VycmVudCBsb2dpY2FsIGZpbGUgcG9z aXRpb24gKi8KIAlvZmZfdAkJZmlsZVNpemU7CQkvKiBjdXJyZW50IHNpemUg b2YgZmlsZSAoMCBpZiBub3QgdGVtcG9yYXJ5KSAqLwogCWNoYXIJICAgKmZp bGVOYW1lOwkJLyogbmFtZSBvZiBmaWxlLCBvciBOVUxMIGZvciB1bnVzZWQg VkZEICovCiAJLyogTkI6IGZpbGVOYW1lIGlzIG1hbGxvYydkLCBhbmQgbXVz dCBiZSBmcmVlJ2Qgd2hlbiBjbG9zaW5nIHRoZSBWRkQgKi8KQEAgLTk3MCwx MCArOTY5LDYgQEAgTHJ1RGVsZXRlKEZpbGUgZmlsZSkKIAkvKiBkZWxldGUg dGhlIHZmZCByZWNvcmQgZnJvbSB0aGUgTFJVIHJpbmcgKi8KIAlEZWxldGUo ZmlsZSk7CiAKLQkvKiBzYXZlIHRoZSBzZWVrIHBvc2l0aW9uICovCi0JdmZk UC0+c2Vla1BvcyA9IGxzZWVrKHZmZFAtPmZkLCAob2ZmX3QpIDAsIFNFRUtf Q1VSKTsKLQlBc3NlcnQodmZkUC0+c2Vla1BvcyAhPSAob2ZmX3QpIC0xKTsK LQogCS8qIGNsb3NlIHRoZSBmaWxlICovCiAJaWYgKGNsb3NlKHZmZFAtPmZk KSkKIAkJZWxvZyhFUlJPUiwgImNvdWxkIG5vdCBjbG9zZSBmaWxlIFwiJXNc IjogJW0iLCB2ZmRQLT5maWxlTmFtZSk7CkBAIC0xMDM4LDE1ICsxMDMzLDYg QEAgTHJ1SW5zZXJ0KEZpbGUgZmlsZSkKIAkJCURPX0RCKGVsb2coTE9HLCAi UkVfT1BFTiBTVUNDRVNTIikpOwogCQkJKytuZmlsZTsKIAkJfQotCi0JCS8q IHNlZWsgdG8gdGhlIHJpZ2h0IHBvc2l0aW9uICovCi0JCWlmICh2ZmRQLT5z ZWVrUG9zICE9IChvZmZfdCkgMCkKLQkJewotCQkJb2ZmX3QgcmV0dXJuVmFs dWUgUEdfVVNFRF9GT1JfQVNTRVJUU19PTkxZOwotCi0JCQlyZXR1cm5WYWx1 ZSA9IGxzZWVrKHZmZFAtPmZkLCB2ZmRQLT5zZWVrUG9zLCBTRUVLX1NFVCk7 Ci0JCQlBc3NlcnQocmV0dXJuVmFsdWUgIT0gKG9mZl90KSAtMSk7Ci0JCX0K IAl9CiAKIAkvKgpAQCAtMTI3MCw3ICsxMjU2LDYgQEAgUGF0aE5hbWVPcGVu RmlsZShGaWxlTmFtZSBmaWxlTmFtZSwgaW50IGZpbGVGbGFncywgaW50IGZp bGVNb2RlKQogCS8qIFNhdmVkIGZsYWdzIGFyZSBhZGp1c3RlZCB0byBiZSBP SyBmb3IgcmUtb3BlbmluZyBmaWxlICovCiAJdmZkUC0+ZmlsZUZsYWdzID0g ZmlsZUZsYWdzICYgfihPX0NSRUFUIHwgT19UUlVOQyB8IE9fRVhDTCk7CiAJ dmZkUC0+ZmlsZU1vZGUgPSBmaWxlTW9kZTsKLQl2ZmRQLT5zZWVrUG9zID0g MDsKIAl2ZmRQLT5maWxlU2l6ZSA9IDA7CiAJdmZkUC0+ZmRzdGF0ZSA9IDB4 MDsKIAl2ZmRQLT5yZXNvd25lciA9IE5VTEw7CkBAIC0xNTYzLDcgKzE1NDgs NyBAQCBGaWxlV3JpdGViYWNrKEZpbGUgZmlsZSwgb2ZmX3Qgb2Zmc2V0LCBv ZmZfdCBuYnl0ZXMpCiB9CiAKIGludAotRmlsZVJlYWQoRmlsZSBmaWxlLCBj aGFyICpidWZmZXIsIGludCBhbW91bnQpCitGaWxlUmVhZEF0KEZpbGUgZmls ZSwgY2hhciAqYnVmZmVyLCBpbnQgYW1vdW50LCBvZmZfdCBvZmZzZXQpCiB7 CiAJaW50CQkJcmV0dXJuQ29kZTsKIApAQCAtMTU3MSw3ICsxNTU2LDcgQEAg RmlsZVJlYWQoRmlsZSBmaWxlLCBjaGFyICpidWZmZXIsIGludCBhbW91bnQp CiAKIAlET19EQihlbG9nKExPRywgIkZpbGVSZWFkOiAlZCAoJXMpICIgSU5U NjRfRk9STUFUICIgJWQgJXAiLAogCQkJICAgZmlsZSwgVmZkQ2FjaGVbZmls ZV0uZmlsZU5hbWUsCi0JCQkgICAoaW50NjQpIFZmZENhY2hlW2ZpbGVdLnNl ZWtQb3MsCisJCQkgICAoaW50NjQpIG9mZnNldCwKIAkJCSAgIGFtb3VudCwg YnVmZmVyKSk7CiAKIAlyZXR1cm5Db2RlID0gRmlsZUFjY2VzcyhmaWxlKTsK QEAgLTE1NzksMTEgKzE1NjQsOSBAQCBGaWxlUmVhZChGaWxlIGZpbGUsIGNo YXIgKmJ1ZmZlciwgaW50IGFtb3VudCkKIAkJcmV0dXJuIHJldHVybkNvZGU7 CiAKIHJldHJ5OgotCXJldHVybkNvZGUgPSByZWFkKFZmZENhY2hlW2ZpbGVd LmZkLCBidWZmZXIsIGFtb3VudCk7CisJcmV0dXJuQ29kZSA9IHByZWFkKFZm ZENhY2hlW2ZpbGVdLmZkLCBidWZmZXIsIGFtb3VudCwgb2Zmc2V0KTsKIAot CWlmIChyZXR1cm5Db2RlID49IDApCi0JCVZmZENhY2hlW2ZpbGVdLnNlZWtQ b3MgKz0gcmV0dXJuQ29kZTsKLQllbHNlCisJaWYgKHJldHVybkNvZGUgPCAw KQogCXsKIAkJLyoKIAkJICogV2luZG93cyBtYXkgcnVuIG91dCBvZiBrZXJu ZWwgYnVmZmVycyBhbmQgcmV0dXJuICJJbnN1ZmZpY2llbnQKQEAgLTE2MDks MTYgKzE1OTIsMTMgQEAgcmV0cnk6CiAJCS8qIE9LIHRvIHJldHJ5IGlmIGlu dGVycnVwdGVkICovCiAJCWlmIChlcnJubyA9PSBFSU5UUikKIAkJCWdvdG8g cmV0cnk7Ci0KLQkJLyogVHJvdWJsZSwgc28gYXNzdW1lIHdlIGRvbid0IGtu b3cgdGhlIGZpbGUgcG9zaXRpb24gYW55bW9yZSAqLwotCQlWZmRDYWNoZVtm aWxlXS5zZWVrUG9zID0gRmlsZVVua25vd25Qb3M7CiAJfQogCiAJcmV0dXJu IHJldHVybkNvZGU7CiB9CiAKIGludAotRmlsZVdyaXRlKEZpbGUgZmlsZSwg Y2hhciAqYnVmZmVyLCBpbnQgYW1vdW50KQorRmlsZVdyaXRlQXQoRmlsZSBm aWxlLCBjaGFyICpidWZmZXIsIGludCBhbW91bnQsIG9mZl90IG9mZnNldCkK IHsKIAlpbnQJCQlyZXR1cm5Db2RlOwogCkBAIC0xNjI2LDcgKzE2MDYsNyBA QCBGaWxlV3JpdGUoRmlsZSBmaWxlLCBjaGFyICpidWZmZXIsIGludCBhbW91 bnQpCiAKIAlET19EQihlbG9nKExPRywgIkZpbGVXcml0ZTogJWQgKCVzKSAi IElOVDY0X0ZPUk1BVCAiICVkICVwIiwKIAkJCSAgIGZpbGUsIFZmZENhY2hl W2ZpbGVdLmZpbGVOYW1lLAotCQkJICAgKGludDY0KSBWZmRDYWNoZVtmaWxl XS5zZWVrUG9zLAorCQkJICAgKGludDY0KSBvZmZzZXQsCiAJCQkgICBhbW91 bnQsIGJ1ZmZlcikpOwogCiAJcmV0dXJuQ29kZSA9IEZpbGVBY2Nlc3MoZmls ZSk7CkBAIC0xNjQzLDcgKzE2MjMsNyBAQCBGaWxlV3JpdGUoRmlsZSBmaWxl LCBjaGFyICpidWZmZXIsIGludCBhbW91bnQpCiAJICovCiAJaWYgKHRlbXBf ZmlsZV9saW1pdCA+PSAwICYmIChWZmRDYWNoZVtmaWxlXS5mZHN0YXRlICYg RkRfVEVNUE9SQVJZKSkKIAl7Ci0JCW9mZl90CQluZXdQb3MgPSBWZmRDYWNo ZVtmaWxlXS5zZWVrUG9zICsgYW1vdW50OworCQlvZmZfdAkJbmV3UG9zID0g b2Zmc2V0ICsgYW1vdW50OwogCiAJCWlmIChuZXdQb3MgPiBWZmRDYWNoZVtm aWxlXS5maWxlU2l6ZSkKIAkJewpAQCAtMTY2MCw3ICsxNjQwLDcgQEAgRmls ZVdyaXRlKEZpbGUgZmlsZSwgY2hhciAqYnVmZmVyLCBpbnQgYW1vdW50KQog CiByZXRyeToKIAllcnJubyA9IDA7Ci0JcmV0dXJuQ29kZSA9IHdyaXRlKFZm ZENhY2hlW2ZpbGVdLmZkLCBidWZmZXIsIGFtb3VudCk7CisJcmV0dXJuQ29k ZSA9IHB3cml0ZShWZmRDYWNoZVtmaWxlXS5mZCwgYnVmZmVyLCBhbW91bnQs IG9mZnNldCk7CiAKIAkvKiBpZiB3cml0ZSBkaWRuJ3Qgc2V0IGVycm5vLCBh c3N1bWUgcHJvYmxlbSBpcyBubyBkaXNrIHNwYWNlICovCiAJaWYgKHJldHVy bkNvZGUgIT0gYW1vdW50ICYmIGVycm5vID09IDApCkBAIC0xNjY4LDEyICsx NjQ4LDEwIEBAIHJldHJ5OgogCiAJaWYgKHJldHVybkNvZGUgPj0gMCkKIAl7 Ci0JCVZmZENhY2hlW2ZpbGVdLnNlZWtQb3MgKz0gcmV0dXJuQ29kZTsKLQog CQkvKiBtYWludGFpbiBmaWxlU2l6ZSBhbmQgdGVtcG9yYXJ5X2ZpbGVzX3Np emUgaWYgaXQncyBhIHRlbXAgZmlsZSAqLwogCQlpZiAoVmZkQ2FjaGVbZmls ZV0uZmRzdGF0ZSAmIEZEX1RFTVBPUkFSWSkKIAkJewotCQkJb2ZmX3QJCW5l d1BvcyA9IFZmZENhY2hlW2ZpbGVdLnNlZWtQb3M7CisJCQlvZmZfdAkJbmV3 UG9zID0gb2Zmc2V0ICsgcmV0dXJuQ29kZTsKIAogCQkJaWYgKG5ld1BvcyA+ IFZmZENhY2hlW2ZpbGVdLmZpbGVTaXplKQogCQkJewpAQCAtMTY4NSw3ICsx NjYzLDcgQEAgcmV0cnk6CiAJZWxzZQogCXsKIAkJLyoKLQkJICogU2VlIGNv bW1lbnRzIGluIEZpbGVSZWFkKCkKKwkJICogU2VlIGNvbW1lbnRzIGluIEZp bGVSZWFkQXQoKQogCQkgKi8KICNpZmRlZiBXSU4zMgogCQlEV09SRAkJZXJy b3IgPSBHZXRMYXN0RXJyb3IoKTsKQEAgLTE3MDQsOSArMTY4Miw2IEBAIHJl dHJ5OgogCQkvKiBPSyB0byByZXRyeSBpZiBpbnRlcnJ1cHRlZCAqLwogCQlp ZiAoZXJybm8gPT0gRUlOVFIpCiAJCQlnb3RvIHJldHJ5OwotCi0JCS8qIFRy b3VibGUsIHNvIGFzc3VtZSB3ZSBkb24ndCBrbm93IHRoZSBmaWxlIHBvc2l0 aW9uIGFueW1vcmUgKi8KLQkJVmZkQ2FjaGVbZmlsZV0uc2Vla1BvcyA9IEZp bGVVbmtub3duUG9zOwogCX0KIAogCXJldHVybiByZXR1cm5Db2RlOwpAQCAt MTczNiw3OCArMTcxMSwzMyBAQCBGaWxlU2VlayhGaWxlIGZpbGUsIG9mZl90 IG9mZnNldCwgaW50IHdoZW5jZSkKIAogCUFzc2VydChGaWxlSXNWYWxpZChm aWxlKSk7CiAKLQlET19EQihlbG9nKExPRywgIkZpbGVTZWVrOiAlZCAoJXMp ICIgSU5UNjRfRk9STUFUICIgIiBJTlQ2NF9GT1JNQVQgIiAlZCIsCisJRE9f REIoZWxvZyhMT0csICJGaWxlU2VlazogJWQgKCVzKSAiIElOVDY0X0ZPUk1B VCAiICVkIiwKIAkJCSAgIGZpbGUsIFZmZENhY2hlW2ZpbGVdLmZpbGVOYW1l LAotCQkJICAgKGludDY0KSBWZmRDYWNoZVtmaWxlXS5zZWVrUG9zLAogCQkJ ICAgKGludDY0KSBvZmZzZXQsIHdoZW5jZSkpOwogCi0JaWYgKEZpbGVJc05v dE9wZW4oZmlsZSkpCisJc3dpdGNoICh3aGVuY2UpCiAJewotCQlzd2l0Y2gg KHdoZW5jZSkKLQkJewotCQkJY2FzZSBTRUVLX1NFVDoKLQkJCQlpZiAob2Zm c2V0IDwgMCkKLQkJCQkJZWxvZyhFUlJPUiwgImludmFsaWQgc2VlayBvZmZz ZXQ6ICIgSU5UNjRfRk9STUFULAotCQkJCQkJIChpbnQ2NCkgb2Zmc2V0KTsK LQkJCQlWZmRDYWNoZVtmaWxlXS5zZWVrUG9zID0gb2Zmc2V0OwotCQkJCWJy ZWFrOwotCQkJY2FzZSBTRUVLX0NVUjoKLQkJCQlWZmRDYWNoZVtmaWxlXS5z ZWVrUG9zICs9IG9mZnNldDsKLQkJCQlicmVhazsKLQkJCWNhc2UgU0VFS19F TkQ6CisJCWNhc2UgU0VFS19TRVQ6CisJCQlpZiAob2Zmc2V0IDwgMCkKKwkJ CQllbG9nKEVSUk9SLCAiaW52YWxpZCBzZWVrIG9mZnNldDogIiBJTlQ2NF9G T1JNQVQsCisJCQkJCSAoaW50NjQpIG9mZnNldCk7CisJCQlyZXR1cm4gb2Zm c2V0OworCisJCWNhc2UgU0VFS19FTkQ6CisJCQlpZiAoRmlsZUlzTm90T3Bl bihmaWxlKSkKKwkJCXsKIAkJCQlyZXR1cm5Db2RlID0gRmlsZUFjY2Vzcyhm aWxlKTsKIAkJCQlpZiAocmV0dXJuQ29kZSA8IDApCiAJCQkJCXJldHVybiBy ZXR1cm5Db2RlOwotCQkJCVZmZENhY2hlW2ZpbGVdLnNlZWtQb3MgPSBsc2Vl ayhWZmRDYWNoZVtmaWxlXS5mZCwKLQkJCQkJCQkJCQkJICAgb2Zmc2V0LCB3 aGVuY2UpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQllbG9nKEVS Uk9SLCAiaW52YWxpZCB3aGVuY2U6ICVkIiwgd2hlbmNlKTsKLQkJCQlicmVh azsKLQkJfQotCX0KLQllbHNlCi0JewotCQlzd2l0Y2ggKHdoZW5jZSkKLQkJ ewotCQkJY2FzZSBTRUVLX1NFVDoKLQkJCQlpZiAob2Zmc2V0IDwgMCkKLQkJ CQkJZWxvZyhFUlJPUiwgImludmFsaWQgc2VlayBvZmZzZXQ6ICIgSU5UNjRf Rk9STUFULAotCQkJCQkJIChpbnQ2NCkgb2Zmc2V0KTsKLQkJCQlpZiAoVmZk Q2FjaGVbZmlsZV0uc2Vla1BvcyAhPSBvZmZzZXQpCi0JCQkJCVZmZENhY2hl W2ZpbGVdLnNlZWtQb3MgPSBsc2VlayhWZmRDYWNoZVtmaWxlXS5mZCwKLQkJ CQkJCQkJCQkJCSAgIG9mZnNldCwgd2hlbmNlKTsKLQkJCQlicmVhazsKLQkJ CWNhc2UgU0VFS19DVVI6Ci0JCQkJaWYgKG9mZnNldCAhPSAwIHx8IFZmZENh Y2hlW2ZpbGVdLnNlZWtQb3MgPT0gRmlsZVVua25vd25Qb3MpCi0JCQkJCVZm ZENhY2hlW2ZpbGVdLnNlZWtQb3MgPSBsc2VlayhWZmRDYWNoZVtmaWxlXS5m ZCwKLQkJCQkJCQkJCQkJCSAgIG9mZnNldCwgd2hlbmNlKTsKLQkJCQlicmVh azsKLQkJCWNhc2UgU0VFS19FTkQ6Ci0JCQkJVmZkQ2FjaGVbZmlsZV0uc2Vl a1BvcyA9IGxzZWVrKFZmZENhY2hlW2ZpbGVdLmZkLAotCQkJCQkJCQkJCQkg ICBvZmZzZXQsIHdoZW5jZSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0Ogot CQkJCWVsb2coRVJST1IsICJpbnZhbGlkIHdoZW5jZTogJWQiLCB3aGVuY2Up OwotCQkJCWJyZWFrOwotCQl9CisJCQl9CisJCQlyZXR1cm4gbHNlZWsoVmZk Q2FjaGVbZmlsZV0uZmQsIG9mZnNldCwgd2hlbmNlKTsKKworCQlkZWZhdWx0 OgorCQkJZWxvZyhFUlJPUiwgImludmFsaWQgd2hlbmNlOiAlZCIsIHdoZW5j ZSk7CiAJfQotCXJldHVybiBWZmRDYWNoZVtmaWxlXS5zZWVrUG9zOwotfQog Ci0vKgotICogWFhYIG5vdCBhY3R1YWxseSB1c2VkIGJ1dCBoZXJlIGZvciBj b21wbGV0ZW5lc3MKLSAqLwotI2lmZGVmIE5PVF9VU0VECi1vZmZfdAotRmls ZVRlbGwoRmlsZSBmaWxlKQotewotCUFzc2VydChGaWxlSXNWYWxpZChmaWxl KSk7Ci0JRE9fREIoZWxvZyhMT0csICJGaWxlVGVsbCAlZCAoJXMpIiwKLQkJ CSAgIGZpbGUsIFZmZENhY2hlW2ZpbGVdLmZpbGVOYW1lKSk7Ci0JcmV0dXJu IFZmZENhY2hlW2ZpbGVdLnNlZWtQb3M7CisJcmV0dXJuIC0xOwogfQotI2Vu ZGlmCiAKIGludAogRmlsZVRydW5jYXRlKEZpbGUgZmlsZSwgb2ZmX3Qgb2Zm c2V0KQpkaWZmIC0tZ2l0IHNyYy9iYWNrZW5kL3N0b3JhZ2Uvc21nci9tZC5j IHNyYy9iYWNrZW5kL3N0b3JhZ2Uvc21nci9tZC5jCmluZGV4IGYzMjlkMTUu LjVmYzlhNmIgMTAwNjQ0Ci0tLSBzcmMvYmFja2VuZC9zdG9yYWdlL3NtZ3Iv bWQuYworKysgc3JjL2JhY2tlbmQvc3RvcmFnZS9zbWdyL21kLmMKQEAgLTUy NywyMiArNTI3LDcgQEAgbWRleHRlbmQoU01nclJlbGF0aW9uIHJlbG4sIEZv cmtOdW1iZXIgZm9ya251bSwgQmxvY2tOdW1iZXIgYmxvY2tudW0sCiAKIAlB c3NlcnQoc2Vla3BvcyA8IChvZmZfdCkgQkxDS1NaICogUkVMU0VHX1NJWkUp OwogCi0JLyoKLQkgKiBOb3RlOiBiZWNhdXNlIGNhbGxlciB1c3VhbGx5IG9i dGFpbmVkIGJsb2NrbnVtIGJ5IGNhbGxpbmcgbWRuYmxvY2tzLAotCSAqIHdo aWNoIGRpZCBhIHNlZWsoU0VFS19FTkQpLCB0aGlzIHNlZWsgaXMgb2Z0ZW4g cmVkdW5kYW50IGFuZCB3aWxsIGJlCi0JICogb3B0aW1pemVkIGF3YXkgYnkg ZmQuYy4gIEl0J3Mgbm90IHJlZHVuZGFudCwgaG93ZXZlciwgaWYgdGhlcmUg aXMgYQotCSAqIHBhcnRpYWwgcGFnZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxl LiBJbiB0aGF0IGNhc2Ugd2Ugd2FudCB0byB0cnkgdG8KLQkgKiBvdmVyd3Jp dGUgdGhlIHBhcnRpYWwgcGFnZSB3aXRoIGEgZnVsbCBwYWdlLiAgSXQncyBh bHNvIG5vdCByZWR1bmRhbnQKLQkgKiBpZiBidWZtZ3IuYyBoYWQgdG8gZHVt cCBhbm90aGVyIGJ1ZmZlciBvZiB0aGUgc2FtZSBmaWxlIHRvIG1ha2Ugcm9v bQotCSAqIGZvciB0aGUgbmV3IHBhZ2UncyBidWZmZXIuCi0JICovCi0JaWYg KEZpbGVTZWVrKHYtPm1kZmRfdmZkLCBzZWVrcG9zLCBTRUVLX1NFVCkgIT0g c2Vla3BvcykKLQkJZXJlcG9ydChFUlJPUiwKLQkJCQkoZXJyY29kZV9mb3Jf ZmlsZV9hY2Nlc3MoKSwKLQkJCQkgZXJybXNnKCJjb3VsZCBub3Qgc2VlayB0 byBibG9jayAldSBpbiBmaWxlIFwiJXNcIjogJW0iLAotCQkJCQkJYmxvY2tu dW0sIEZpbGVQYXRoTmFtZSh2LT5tZGZkX3ZmZCkpKSk7Ci0KLQlpZiAoKG5i eXRlcyA9IEZpbGVXcml0ZSh2LT5tZGZkX3ZmZCwgYnVmZmVyLCBCTENLU1op KSAhPSBCTENLU1opCisJaWYgKChuYnl0ZXMgPSBGaWxlV3JpdGVBdCh2LT5t ZGZkX3ZmZCwgYnVmZmVyLCBCTENLU1osIHNlZWtwb3MpKSAhPSBCTENLU1op CiAJewogCQlpZiAobmJ5dGVzIDwgMCkKIAkJCWVyZXBvcnQoRVJST1IsCkBA IC03NDksMTMgKzczNCw3IEBAIG1kcmVhZChTTWdyUmVsYXRpb24gcmVsbiwg Rm9ya051bWJlciBmb3JrbnVtLCBCbG9ja051bWJlciBibG9ja251bSwKIAog CUFzc2VydChzZWVrcG9zIDwgKG9mZl90KSBCTENLU1ogKiBSRUxTRUdfU0la RSk7CiAKLQlpZiAoRmlsZVNlZWsodi0+bWRmZF92ZmQsIHNlZWtwb3MsIFNF RUtfU0VUKSAhPSBzZWVrcG9zKQotCQllcmVwb3J0KEVSUk9SLAotCQkJCShl cnJjb2RlX2Zvcl9maWxlX2FjY2VzcygpLAotCQkJCSBlcnJtc2coImNvdWxk IG5vdCBzZWVrIHRvIGJsb2NrICV1IGluIGZpbGUgXCIlc1wiOiAlbSIsCi0J CQkJCQlibG9ja251bSwgRmlsZVBhdGhOYW1lKHYtPm1kZmRfdmZkKSkpKTsK LQotCW5ieXRlcyA9IEZpbGVSZWFkKHYtPm1kZmRfdmZkLCBidWZmZXIsIEJM Q0tTWik7CisJbmJ5dGVzID0gRmlsZVJlYWRBdCh2LT5tZGZkX3ZmZCwgYnVm ZmVyLCBCTENLU1osIHNlZWtwb3MpOwogCiAJVFJBQ0VfUE9TVEdSRVNRTF9T TUdSX01EX1JFQURfRE9ORShmb3JrbnVtLCBibG9ja251bSwKIAkJCQkJCQkJ CSAgIHJlbG4tPnNtZ3Jfcm5vZGUubm9kZS5zcGNOb2RlLApAQCAtODI1LDEz ICs4MDQsNyBAQCBtZHdyaXRlKFNNZ3JSZWxhdGlvbiByZWxuLCBGb3JrTnVt YmVyIGZvcmtudW0sIEJsb2NrTnVtYmVyIGJsb2NrbnVtLAogCiAJQXNzZXJ0 KHNlZWtwb3MgPCAob2ZmX3QpIEJMQ0tTWiAqIFJFTFNFR19TSVpFKTsKIAot CWlmIChGaWxlU2Vlayh2LT5tZGZkX3ZmZCwgc2Vla3BvcywgU0VFS19TRVQp ICE9IHNlZWtwb3MpCi0JCWVyZXBvcnQoRVJST1IsCi0JCQkJKGVycmNvZGVf Zm9yX2ZpbGVfYWNjZXNzKCksCi0JCQkJIGVycm1zZygiY291bGQgbm90IHNl ZWsgdG8gYmxvY2sgJXUgaW4gZmlsZSBcIiVzXCI6ICVtIiwKLQkJCQkJCWJs b2NrbnVtLCBGaWxlUGF0aE5hbWUodi0+bWRmZF92ZmQpKSkpOwotCi0JbmJ5 dGVzID0gRmlsZVdyaXRlKHYtPm1kZmRfdmZkLCBidWZmZXIsIEJMQ0tTWik7 CisJbmJ5dGVzID0gRmlsZVdyaXRlQXQodi0+bWRmZF92ZmQsIGJ1ZmZlciwg QkxDS1NaLCBzZWVrcG9zKTsKIAogCVRSQUNFX1BPU1RHUkVTUUxfU01HUl9N RF9XUklURV9ET05FKGZvcmtudW0sIGJsb2NrbnVtLAogCQkJCQkJCQkJCXJl bG4tPnNtZ3Jfcm5vZGUubm9kZS5zcGNOb2RlLApkaWZmIC0tZ2l0IHNyYy9p bmNsdWRlL3N0b3JhZ2UvZmQuaCBzcmMvaW5jbHVkZS9zdG9yYWdlL2ZkLmgK aW5kZXggY2JjMjIyNC4uMGI2Yjg0NiAxMDA2NDQKLS0tIHNyYy9pbmNsdWRl L3N0b3JhZ2UvZmQuaAorKysgc3JjL2luY2x1ZGUvc3RvcmFnZS9mZC5oCkBA IC02OSw4ICs2OSw4IEBAIGV4dGVybiBGaWxlIFBhdGhOYW1lT3BlbkZpbGUo RmlsZU5hbWUgZmlsZU5hbWUsIGludCBmaWxlRmxhZ3MsIGludCBmaWxlTW9k ZSk7CiBleHRlcm4gRmlsZSBPcGVuVGVtcG9yYXJ5RmlsZShib29sIGludGVy WGFjdCk7CiBleHRlcm4gdm9pZCBGaWxlQ2xvc2UoRmlsZSBmaWxlKTsKIGV4 dGVybiBpbnQJRmlsZVByZWZldGNoKEZpbGUgZmlsZSwgb2ZmX3Qgb2Zmc2V0 LCBpbnQgYW1vdW50KTsKLWV4dGVybiBpbnQJRmlsZVJlYWQoRmlsZSBmaWxl LCBjaGFyICpidWZmZXIsIGludCBhbW91bnQpOwotZXh0ZXJuIGludAlGaWxl V3JpdGUoRmlsZSBmaWxlLCBjaGFyICpidWZmZXIsIGludCBhbW91bnQpOwor ZXh0ZXJuIGludAlGaWxlUmVhZEF0KEZpbGUgZmlsZSwgY2hhciAqYnVmZmVy LCBpbnQgYW1vdW50LCBvZmZfdCBvZmZzZXQpOworZXh0ZXJuIGludAlGaWxl V3JpdGVBdChGaWxlIGZpbGUsIGNoYXIgKmJ1ZmZlciwgaW50IGFtb3VudCwg b2ZmX3Qgb2Zmc2V0KTsKIGV4dGVybiBpbnQJRmlsZVN5bmMoRmlsZSBmaWxl KTsKIGV4dGVybiBvZmZfdCBGaWxlU2VlayhGaWxlIGZpbGUsIG9mZl90IG9m ZnNldCwgaW50IHdoZW5jZSk7CiBleHRlcm4gaW50CUZpbGVUcnVuY2F0ZShG aWxlIGZpbGUsIG9mZl90IG9mZnNldCk7Cg== --------------A81F9A7BB18DB98996B02C61 Content-Type: text/plain Content-Disposition: inline Content-Transfer-Encoding: 8bit MIME-Version: 1.0 -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers --------------A81F9A7BB18DB98996B02C61--