[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: (ITS#8106) Retry pwrite operations in case of EINTR



--f46d04426b642829070513e7a46a
Content-Type: text/plain; charset=UTF-8

Proposed patch in message body as issue tracker doesn't recognizes
attachments:

commit c9857a7c0df4448a14a2aa9f55850df5e830069e
Author: Dmytro Milinevskyy <milinevskyy@gmail.com>
Date:   Fri Apr 17 10:41:26 2015 +0200

    libmdb: retry write operation in case of interrupted system

diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c
index a95c7cd..ed7f370 100644
--- a/libraries/liblmdb/mdb.c
+++ b/libraries/liblmdb/mdb.c
@@ -3236,6 +3236,7 @@ mdb_page_flush(MDB_txn *txn, int keep)
                /* Write up to MDB_COMMIT_PAGES dirty pages at a time. */
                if (pos!=next_pos || n==MDB_COMMIT_PAGES ||
wsize+size>MAX_WRITE) {
                        if (n) {
+              retry_write:
                                /* Write previous page(s) */
 #ifdef MDB_USE_PWRITEV
                                wres = pwritev(env->me_fd, iov, n, wpos);
@@ -3243,8 +3244,10 @@ mdb_page_flush(MDB_txn *txn, int keep)
                                if (n == 1) {
                                        wres = pwrite(env->me_fd,
iov[0].iov_base, wsize, wpos);
                                } else {
+                                 retry_seek:
                                        if (lseek(env->me_fd, wpos,
SEEK_SET) == -1) {
                                                rc = ErrCode();
+                                               if (EINTR == rc) goto
retry_seek;
                                                DPRINTF(("lseek: %s",
strerror(rc)));
                                                return rc;
                                        }
@@ -3254,6 +3257,7 @@ mdb_page_flush(MDB_txn *txn, int keep)
                                if (wres != wsize) {
                                        if (wres < 0) {
                                                rc = ErrCode();
+                                               if (EINTR == rc) goto
retry_write;
                                                DPRINTF(("Write error: %s",
strerror(rc)));
                                        } else {
                                                rc = EIO; /* TODO: Use
which error code? */
@@ -3627,7 +3631,8 @@ mdb_env_init_meta(MDB_env *env, MDB_meta *meta)
        int len;
 #define DO_PWRITE(rc, fd, ptr, size, len, pos) do { \
        len = pwrite(fd, ptr, size, pos);       \
-       rc = (len >= 0); } while(0)
+       if (len == -1 && EINVAL == ErrCode()) continue; \
+       rc = (len >= 0); break; } while(1)
 #endif

        DPUTS("writing new meta page");
@@ -3735,6 +3740,7 @@ mdb_env_write_meta(MDB_txn *txn)

        /* Write to the SYNC fd */
        mfd = (flags & (MDB_NOSYNC|MDB_NOMETASYNC)) ? env->me_fd :
env->me_mfd;
+retry_write:
 #ifdef _WIN32
        {
                memset(&ov, 0, sizeof(ov));
@@ -3747,6 +3753,7 @@ mdb_env_write_meta(MDB_txn *txn)
 #endif
        if (rc != len) {
                rc = rc < 0 ? ErrCode() : EIO;
+               if (EINTR == rc) goto retry_write;
                DPUTS("write failed, disk error?");
                /* On a failure, the pagecache still contains the new data.
                 * Write some old data back, to prevent it from being used.

On Fri, Apr 17, 2015 at 10:46 AM, Dmytro Milinevskyy <milinevskyy@gmail.com>
wrote:

> Proposed patch in attachment.
>
> On Fri, Apr 17, 2015 at 10:43 AM, <openldap-its@openldap.org> wrote:
>
>>
>> *** THIS IS AN AUTOMATICALLY GENERATED REPLY ***
>>
>> Thanks for your report to the OpenLDAP Issue Tracking System.  Your
>> report has been assigned the tracking number ITS#8106.
>>
>> One of our support engineers will look at your report in due course.
>> Note that this may take some time because our support engineers
>> are volunteers.  They only work on OpenLDAP when they have spare
>> time.
>>
>> If you need to provide additional information in regards to your
>> issue report, you may do so by replying to this message.  Note that
>> any mail sent to openldap-its@openldap.org with (ITS#8106)
>> in the subject will automatically be attached to the issue report.
>>
>>         mailto:openldap-its@openldap.org?subject=(ITS#8106)
>>
>> You may follow the progress of this report by loading the following
>> URL in a web browser:
>>     http://www.OpenLDAP.org/its/index.cgi?findid=8106
>>
>> Please remember to retain your issue tracking number (ITS#8106)
>> on any further messages you send to us regarding this report.  If
>> you don't then you'll just waste our time and yours because we
>> won't be able to properly track the report.
>>
>> Please note that the Issue Tracking System is not intended to
>> be used to seek help in the proper use of OpenLDAP Software.
>> Such requests will be closed.
>>
>> OpenLDAP Software is user supported.
>>         http://www.OpenLDAP.org/support/
>>
>> --------------
>> Copyright 1998-2007 The OpenLDAP Foundation, All Rights Reserved.
>>
>>
>

--f46d04426b642829070513e7a46a
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: base64

PGRpdiBkaXI9Imx0ciI+UHJvcG9zZWQgcGF0Y2ggaW4gbWVzc2FnZSBib2R5IGFzIGlzc3VlIHRy
YWNrZXIgZG9lc24mIzM5O3QgcmVjb2duaXplcyBhdHRhY2htZW50czo8YnI+PGJyPmNvbW1pdCBj
OTg1N2E3YzBkZjQ0NDhhMTRhMmFhOWY1NTg1MGRmNWU4MzAwNjllPGJyPkF1dGhvcjogRG15dHJv
IE1pbGluZXZza3l5ICZsdDs8YSBocmVmPSJtYWlsdG86bWlsaW5ldnNreXlAZ21haWwuY29tIj5t
aWxpbmV2c2t5eUBnbWFpbC5jb208L2E+Jmd0Ozxicj5EYXRlOsKgwqAgRnJpIEFwciAxNyAxMDo0
MToyNiAyMDE1ICswMjAwPGJyPjxicj7CoMKgwqAgbGlibWRiOiByZXRyeSB3cml0ZSBvcGVyYXRp
b24gaW4gY2FzZSBvZiBpbnRlcnJ1cHRlZCBzeXN0ZW08YnI+PGJyPmRpZmYgLS1naXQgYS9saWJy
YXJpZXMvbGlibG1kYi9tZGIuYyBiL2xpYnJhcmllcy9saWJsbWRiL21kYi5jPGJyPmluZGV4IGE5
NWM3Y2QuLmVkN2YzNzAgMTAwNjQ0PGJyPi0tLSBhL2xpYnJhcmllcy9saWJsbWRiL21kYi5jPGJy
PisrKyBiL2xpYnJhcmllcy9saWJsbWRiL21kYi5jPGJyPkBAIC0zMjM2LDYgKzMyMzYsNyBAQCBt
ZGJfcGFnZV9mbHVzaChNREJfdHhuICp0eG4sIGludCBrZWVwKTxicj7CoMKgwqDCoMKgwqDCoMKg
wqDCoMKgwqDCoMKgwqAgLyogV3JpdGUgdXAgdG8gTURCX0NPTU1JVF9QQUdFUyBkaXJ0eSBwYWdl
cyBhdCBhIHRpbWUuICovPGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAocG9z
IT1uZXh0X3BvcyB8fCBuPT1NREJfQ09NTUlUX1BBR0VTIHx8IHdzaXplK3NpemUmZ3Q7TUFYX1dS
SVRFKSB7PGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg
aWYgKG4pIHs8YnI+K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHJ5X3dyaXRlOjxicj7C
oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg
wqDCoCAvKiBXcml0ZSBwcmV2aW91cyBwYWdlKHMpICovPGJyPsKgI2lmZGVmIE1EQl9VU0VfUFdS
SVRFVjxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC
oMKgwqDCoMKgwqDCoCB3cmVzID0gcHdyaXRldihlbnYtJmd0O21lX2ZkLCBpb3YsIG4sIHdwb3Mp
Ozxicj5AQCAtMzI0Myw4ICszMjQ0LDEwIEBAIG1kYl9wYWdlX2ZsdXNoKE1EQl90eG4gKnR4biwg
aW50IGtlZXApPGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg
wqDCoMKgwqDCoMKgwqDCoMKgIGlmIChuID09IDEpIHs8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDC
oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg
IHdyZXMgPSBwd3JpdGUoZW52LSZndDttZV9mZCwgaW92WzBdLmlvdl9iYXNlLCB3c2l6ZSwgd3Bv
cyk7PGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg
wqDCoMKgwqDCoMKgIH0gZWxzZSB7PGJyPivCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC
oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHJ5X3NlZWs6PGJyPsKgwqDCoMKg
wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC
oMKgwqDCoMKgwqDCoCBpZiAobHNlZWsoZW52LSZndDttZV9mZCwgd3BvcywgU0VFS19TRVQpID09
IC0xKSB7PGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC
oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmMgPSBFcnJD
b2RlKCk7PGJyPivCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg
wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoRUlOVFIg
PT0gcmMpIGdvdG8gcmV0cnlfc2Vlazs8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg
wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC
oMKgwqDCoCBEUFJJTlRGKCgmcXVvdDtsc2VlazogJXMmcXVvdDssIHN0cmVycm9yKHJjKSkpOzxi
cj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC
oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiByYzs8YnI+wqDC
oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg
wqDCoMKgwqDCoMKgwqDCoMKgIH08YnI+QEAgLTMyNTQsNiArMzI1Nyw3IEBAIG1kYl9wYWdlX2Zs
dXNoKE1EQl90eG4gKnR4biwgaW50IGtlZXApPGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg
wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmICh3cmVzICE9IHdzaXplKSB7
PGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC
oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAod3JlcyAmbHQ7IDApIHs8YnI+wqDCoMKgwqDC
oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg
wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByYyA9IEVyckNvZGUoKTs8YnI+K8KgwqDCoMKg
wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC
oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmIChFSU5UUiA9PSByYykgZ290byByZXRyeV93
cml0ZTs8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg
wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBEUFJJTlRGKCgm
cXVvdDtXcml0ZSBlcnJvcjogJXMmcXVvdDssIHN0cmVycm9yKHJjKSkpOzxicj7CoMKgwqDCoMKg
wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC
oMKgwqDCoMKgwqAgfSBlbHNlIHs8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC
oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg
wqDCoCByYyA9IEVJTzsgLyogVE9ETzogVXNlIHdoaWNoIGVycm9yIGNvZGU/ICovPGJyPkBAIC0z
NjI3LDcgKzM2MzEsOCBAQCBtZGJfZW52X2luaXRfbWV0YShNREJfZW52ICplbnYsIE1EQl9tZXRh
ICptZXRhKTxicj7CoMKgwqDCoMKgwqDCoCBpbnQgbGVuOzxicj7CoCNkZWZpbmUgRE9fUFdSSVRF
KHJjLCBmZCwgcHRyLCBzaXplLCBsZW4sIHBvcykgZG8geyBcPGJyPsKgwqDCoMKgwqDCoMKgIGxl
biA9IHB3cml0ZShmZCwgcHRyLCBzaXplLCBwb3MpO8KgwqDCoMKgwqDCoCBcPGJyPi3CoMKgwqDC
oMKgwqAgcmMgPSAobGVuICZndDs9IDApOyB9IHdoaWxlKDApPGJyPivCoMKgwqDCoMKgwqAgaWYg
KGxlbiA9PSAtMSAmYW1wOyZhbXA7IEVJTlZBTCA9PSBFcnJDb2RlKCkpIGNvbnRpbnVlOyBcPGJy
PivCoMKgwqDCoMKgwqAgcmMgPSAobGVuICZndDs9IDApOyBicmVhazsgfSB3aGlsZSgxKTxicj7C
oCNlbmRpZjxicj48YnI+wqDCoMKgwqDCoMKgwqAgRFBVVFMoJnF1b3Q7d3JpdGluZyBuZXcgbWV0
YSBwYWdlJnF1b3Q7KTs8YnI+QEAgLTM3MzUsNiArMzc0MCw3IEBAIG1kYl9lbnZfd3JpdGVfbWV0
YShNREJfdHhuICp0eG4pPGJyPjxicj7CoMKgwqDCoMKgwqDCoCAvKiBXcml0ZSB0byB0aGUgU1lO
QyBmZCAqLzxicj7CoMKgwqDCoMKgwqDCoCBtZmQgPSAoZmxhZ3MgJmFtcDsgKE1EQl9OT1NZTkN8
TURCX05PTUVUQVNZTkMpKSA/IGVudi0mZ3Q7bWVfZmQgOiBlbnYtJmd0O21lX21mZDs8YnI+K3Jl
dHJ5X3dyaXRlOjxicj7CoCNpZmRlZiBfV0lOMzI8YnI+wqDCoMKgwqDCoMKgwqAgezxicj7CoMKg
wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbWVtc2V0KCZhbXA7b3YsIDAsIHNpemVvZihvdikp
Ozxicj5AQCAtMzc0Nyw2ICszNzUzLDcgQEAgbWRiX2Vudl93cml0ZV9tZXRhKE1EQl90eG4gKnR4
bik8YnI+wqAjZW5kaWY8YnI+wqDCoMKgwqDCoMKgwqAgaWYgKHJjICE9IGxlbikgezxicj7CoMKg
wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmMgPSByYyAmbHQ7IDAgPyBFcnJDb2RlKCkgOiBF
SU87PGJyPivCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmIChFSU5UUiA9PSByYykgZ290
byByZXRyeV93cml0ZTs8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIERQVVRTKCZx
dW90O3dyaXRlIGZhaWxlZCwgZGlzayBlcnJvcj8mcXVvdDspOzxicj7CoMKgwqDCoMKgwqDCoMKg
wqDCoMKgwqDCoMKgwqAgLyogT24gYSBmYWlsdXJlLCB0aGUgcGFnZWNhY2hlIHN0aWxsIGNvbnRh
aW5zIHRoZSBuZXcgZGF0YS48YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKiBX
cml0ZSBzb21lIG9sZCBkYXRhIGJhY2ssIHRvIHByZXZlbnQgaXQgZnJvbSBiZWluZyB1c2VkLjxi
cj48L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+PGJyPjxkaXYgY2xhc3M9ImdtYWlsX3F1
b3RlIj5PbiBGcmksIEFwciAxNywgMjAxNSBhdCAxMDo0NiBBTSwgRG15dHJvIE1pbGluZXZza3l5
IDxzcGFuIGRpcj0ibHRyIj4mbHQ7PGEgaHJlZj0ibWFpbHRvOm1pbGluZXZza3l5QGdtYWlsLmNv
bSIgdGFyZ2V0PSJfYmxhbmsiPm1pbGluZXZza3l5QGdtYWlsLmNvbTwvYT4mZ3Q7PC9zcGFuPiB3
cm90ZTo8YnI+PGJsb2NrcXVvdGUgY2xhc3M9ImdtYWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2luOjAg
MCAwIC44ZXg7Ym9yZGVyLWxlZnQ6MXB4ICNjY2Mgc29saWQ7cGFkZGluZy1sZWZ0OjFleCI+PGRp
diBkaXI9Imx0ciI+UHJvcG9zZWQgcGF0Y2ggaW4gYXR0YWNobWVudC48YnI+PC9kaXY+PGRpdiBj
bGFzcz0iSE9FblpiIj48ZGl2IGNsYXNzPSJoNSI+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPjxi
cj48ZGl2IGNsYXNzPSJnbWFpbF9xdW90ZSI+T24gRnJpLCBBcHIgMTcsIDIwMTUgYXQgMTA6NDMg
QU0sICA8c3BhbiBkaXI9Imx0ciI+Jmx0OzxhIGhyZWY9Im1haWx0bzpvcGVubGRhcC1pdHNAb3Bl
bmxkYXAub3JnIiB0YXJnZXQ9Il9ibGFuayI+b3BlbmxkYXAtaXRzQG9wZW5sZGFwLm9yZzwvYT4m
Z3Q7PC9zcGFuPiB3cm90ZTo8YnI+PGJsb2NrcXVvdGUgY2xhc3M9ImdtYWlsX3F1b3RlIiBzdHls
ZT0ibWFyZ2luOjAgMCAwIC44ZXg7Ym9yZGVyLWxlZnQ6MXB4ICNjY2Mgc29saWQ7cGFkZGluZy1s
ZWZ0OjFleCI+PGJyPg0KKioqIFRISVMgSVMgQU4gQVVUT01BVElDQUxMWSBHRU5FUkFURUQgUkVQ
TFkgKioqPGJyPg0KPGJyPg0KVGhhbmtzIGZvciB5b3VyIHJlcG9ydCB0byB0aGUgT3BlbkxEQVAg
SXNzdWUgVHJhY2tpbmcgU3lzdGVtLsKgIFlvdXI8YnI+DQpyZXBvcnQgaGFzIGJlZW4gYXNzaWdu
ZWQgdGhlIHRyYWNraW5nIG51bWJlciBJVFMjODEwNi48YnI+DQo8YnI+DQpPbmUgb2Ygb3VyIHN1
cHBvcnQgZW5naW5lZXJzIHdpbGwgbG9vayBhdCB5b3VyIHJlcG9ydCBpbiBkdWUgY291cnNlLjxi
cj4NCk5vdGUgdGhhdCB0aGlzIG1heSB0YWtlIHNvbWUgdGltZSBiZWNhdXNlIG91ciBzdXBwb3J0
IGVuZ2luZWVyczxicj4NCmFyZSB2b2x1bnRlZXJzLsKgIFRoZXkgb25seSB3b3JrIG9uIE9wZW5M
REFQIHdoZW4gdGhleSBoYXZlIHNwYXJlPGJyPg0KdGltZS48YnI+DQo8YnI+DQpJZiB5b3UgbmVl
ZCB0byBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gcmVnYXJkcyB0byB5b3VyPGJy
Pg0KaXNzdWUgcmVwb3J0LCB5b3UgbWF5IGRvIHNvIGJ5IHJlcGx5aW5nIHRvIHRoaXMgbWVzc2Fn
ZS7CoCBOb3RlIHRoYXQ8YnI+DQphbnkgbWFpbCBzZW50IHRvIDxhIGhyZWY9Im1haWx0bzpvcGVu
bGRhcC1pdHNAb3BlbmxkYXAub3JnIiB0YXJnZXQ9Il9ibGFuayI+b3BlbmxkYXAtaXRzQG9wZW5s
ZGFwLm9yZzwvYT4gd2l0aCAoSVRTIzgxMDYpPGJyPg0KaW4gdGhlIHN1YmplY3Qgd2lsbCBhdXRv
bWF0aWNhbGx5IGJlIGF0dGFjaGVkIHRvIHRoZSBpc3N1ZSByZXBvcnQuPGJyPg0KPGJyPg0KwqAg
wqAgwqAgwqAgbWFpbHRvOjxhIGhyZWY9Im1haWx0bzpvcGVubGRhcC1pdHNAb3BlbmxkYXAub3Jn
IiB0YXJnZXQ9Il9ibGFuayI+b3BlbmxkYXAtaXRzQG9wZW5sZGFwLm9yZzwvYT4/c3ViamVjdD0o
SVRTIzgxMDYpPGJyPg0KPGJyPg0KWW91IG1heSBmb2xsb3cgdGhlIHByb2dyZXNzIG9mIHRoaXMg
cmVwb3J0IGJ5IGxvYWRpbmcgdGhlIGZvbGxvd2luZzxicj4NClVSTCBpbiBhIHdlYiBicm93c2Vy
Ojxicj4NCsKgIMKgIDxhIGhyZWY9Imh0dHA6Ly93d3cuT3BlbkxEQVAub3JnL2l0cy9pbmRleC5j
Z2k/ZmluZGlkPTgxMDYiIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3Lk9wZW5MREFQLm9yZy9p
dHMvaW5kZXguY2dpP2ZpbmRpZD04MTA2PC9hPjxicj4NCjxicj4NClBsZWFzZSByZW1lbWJlciB0
byByZXRhaW4geW91ciBpc3N1ZSB0cmFja2luZyBudW1iZXIgKElUUyM4MTA2KTxicj4NCm9uIGFu
eSBmdXJ0aGVyIG1lc3NhZ2VzIHlvdSBzZW5kIHRvIHVzIHJlZ2FyZGluZyB0aGlzIHJlcG9ydC7C
oCBJZjxicj4NCnlvdSBkb24mIzM5O3QgdGhlbiB5b3UmIzM5O2xsIGp1c3Qgd2FzdGUgb3VyIHRp
bWUgYW5kIHlvdXJzIGJlY2F1c2Ugd2U8YnI+DQp3b24mIzM5O3QgYmUgYWJsZSB0byBwcm9wZXJs
eSB0cmFjayB0aGUgcmVwb3J0Ljxicj4NCjxicj4NClBsZWFzZSBub3RlIHRoYXQgdGhlIElzc3Vl
IFRyYWNraW5nIFN5c3RlbSBpcyBub3QgaW50ZW5kZWQgdG88YnI+DQpiZSB1c2VkIHRvIHNlZWsg
aGVscCBpbiB0aGUgcHJvcGVyIHVzZSBvZiBPcGVuTERBUCBTb2Z0d2FyZS48YnI+DQpTdWNoIHJl
cXVlc3RzIHdpbGwgYmUgY2xvc2VkLjxicj4NCjxicj4NCk9wZW5MREFQIFNvZnR3YXJlIGlzIHVz
ZXIgc3VwcG9ydGVkLjxicj4NCsKgIMKgIMKgIMKgIDxhIGhyZWY9Imh0dHA6Ly93d3cuT3BlbkxE
QVAub3JnL3N1cHBvcnQvIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy5PcGVuTERBUC5vcmcv
c3VwcG9ydC88L2E+PGJyPg0KPGJyPg0KLS0tLS0tLS0tLS0tLS08YnI+DQpDb3B5cmlnaHQgMTk5
OC0yMDA3IFRoZSBPcGVuTERBUCBGb3VuZGF0aW9uLCBBbGwgUmlnaHRzIFJlc2VydmVkLjxicj4N
Cjxicj4NCjwvYmxvY2txdW90ZT48L2Rpdj48YnI+PC9kaXY+DQo8L2Rpdj48L2Rpdj48L2Jsb2Nr
cXVvdGU+PC9kaXY+PGJyPjwvZGl2Pg0K
--f46d04426b642829070513e7a46a--