From: Michael Selig Date: 2008-09-10T16:23:19+09:00 Subject: [ruby-core:18532] Ruby 1.9 string performance ------------g5GbeeAZHcGGXrCS0iBFbm Content-Type: text/plain; format=flowed; delsp=yes; charset=utf-8 Content-Transfer-Encoding: 7bit I would like to submit the attached patch to string.c which substantially improves Ruby 1.9's string performance when operating on ASCII data, especially when working in a UTF-8 locale. As a result of these changes the previously very slow benchmark "bm_so_count_words.rb" now runs about 15 times faster on my system (UTF-8 locale) - about the same speed as it did on 1.8. It now runs about 7 times faster than it did under an ASCII locale (eg: LANG=C). And it now runs at the same speed whether you use UTF-8 or ASCII locale. The main things I did are: 1) A number of methods failed to set the 7-bit coderange flag when they should have. I actually think that these may be bugs. In fact I think the usage of the coderange flags is a bit strange. "rb_str_modify()" clears the flags, so you really should make sure that they are set again correctly after every rb_str_modify(). This was not happenning in several places. Even little old String#clear was clearing these flags. As an example, if you say: s = "abc".force_encoding("UTF-8") s.clear s << "xyz" Before the "clear" the 7-bit flag is set, so ruby knows that "s" is all ascii, and can do faster operations. But the "clear" was clearing the 7-bit flag, causing subsequent use of this string to be slow, as from then on ruby thinks it is a multi-byte-char string. In this case the "append" thinks it is appending a string of ascii chars to a multi-byte-char string, so it leaves the 7-bit flag clear. Note: I have NOT checked methods outside class String which return strings for other occurrences of this problem - it may also be in other places. 2) I added "single-byte" optimization to a number of methods that didn't already have it. Perhaps some of them aren't used that much and don't need the optimization, but I was in the mood! They are (all String#): casecmp strip/lstrip/rstrip ljust/rjust/center upcase/downcase/swapcase count delete/squeeze Certainly I use strip & casecmp quite a bit in my apps. 3) I did a separate optimization in String#split when the parameter is a string. Now s.split(":") is about twice as fast as s.split(/:/), so libraries using regexps like /:/ because they used to be slightly faster than strings, should be changed to strings. 4) I also added "each_codepoint" as described previously. If you don't think it should go into 1.9, please feel free to remove it, though I feel it is useful. I haven't tested these changes exhaustively, but it passes the "rubytest". I am not sure of the procedure for further testing. I hope I haven't broken anything! There is something I'd like Matz or another developer to check: In "lstrip" & "rstrip" I made the assumption that all "space" characters in a multi-byte ascii-compatible character set (eg: UTF-8) are single-byte. I am not 100% sure if this assumption is correct. I would also like to propose an optimization, which though minor, involves lots of changes: When processing strings sequentially, there is a lot of code something like: c = rb_enc_codepoint(s, end, enc); s += rb_enc_mbclen(s, end, enc); In other words, there are 2 function calls - one to get the next codepoint, and one to get the length of the character in bytes to advance the pointer. The first function has to calculate the length of the character anyhow, so why not change it to something like: c = rb_enc_codepoint(s, end, enc, &len); s += len; I would think that this is faster, and also easier to understand. Cheers Mike ------------g5GbeeAZHcGGXrCS0iBFbm Content-Disposition: attachment; filename=string.pat Content-Type: application/octet-stream; name=string.pat Content-Transfer-Encoding: Base64 SW5kZXg6IHN0cmluZy5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHN0cmluZy5j CShyZXZpc2lvbiAxOTA3MykKKysrIHN0cmluZy5jCSh3b3JraW5nIGNvcHkpCkBA IC0yMDY1LDE5ICsyMDY1LDMzIEBACiAKICAgICBwMSA9IFJTVFJJTkdfUFRSKHN0 cjEpOyBwMWVuZCA9IFJTVFJJTkdfRU5EKHN0cjEpOwogICAgIHAyID0gUlNUUklO R19QVFIoc3RyMik7IHAyZW5kID0gUlNUUklOR19FTkQoc3RyMik7Ci0gICAgd2hp bGUgKHAxIDwgcDFlbmQgJiYgcDIgPCBwMmVuZCkgewotCWludCBjMSA9IHJiX2Vu Y19jb2RlcG9pbnQocDEsIHAxZW5kLCBlbmMpOwotCWludCBjMiA9IHJiX2VuY19j b2RlcG9pbnQocDIsIHAyZW5kLCBlbmMpOworICAgIGlmIChzaW5nbGVfYnl0ZV9v cHRpbWl6YWJsZShzdHIxKSAmJiBzaW5nbGVfYnl0ZV9vcHRpbWl6YWJsZShzdHIy KSkgeworCXdoaWxlIChwMSA8IHAxZW5kICYmIHAyIDwgcDJlbmQpIHsKKwkgICAg aWYgKCpwMSAhPSAqcDIpIHsKKwkJaW50IGMxID0gcmJfZW5jX3RvdXBwZXIoKnAx ICYgMHhmZiwgZW5jKTsKKwkJaW50IGMyID0gcmJfZW5jX3RvdXBwZXIoKnAyICYg MHhmZiwgZW5jKTsKKwkJaWYgKGMxID4gYzIpIHJldHVybiBJTlQyRklYKDEpOwor CQlpZiAoYzEgPCBjMikgcmV0dXJuIElOVDJGSVgoLTEpOworCSAgICB9CisJICAg IHAxKys7CisJICAgIHAyKys7CisJfQorICAgIH0KKyAgICBlbHNlIHsKKwl3aGls ZSAocDEgPCBwMWVuZCAmJiBwMiA8IHAyZW5kKSB7CisJICAgIGludCBjMSA9IHJi X2VuY19jb2RlcG9pbnQocDEsIHAxZW5kLCBlbmMpOworCSAgICBpbnQgYzIgPSBy Yl9lbmNfY29kZXBvaW50KHAyLCBwMmVuZCwgZW5jKTsKIAotCWlmIChjMSAhPSBj MikgewotCSAgICBjMSA9IHJiX2VuY190b3VwcGVyKGMxLCBlbmMpOwotCSAgICBj MiA9IHJiX2VuY190b3VwcGVyKGMyLCBlbmMpOwotCSAgICBpZiAoYzEgPiBjMikg cmV0dXJuIElOVDJGSVgoMSk7Ci0JICAgIGlmIChjMSA8IGMyKSByZXR1cm4gSU5U MkZJWCgtMSk7CisJICAgIGlmIChjMSAhPSBjMikgeworCQljMSA9IHJiX2VuY190 b3VwcGVyKGMxLCBlbmMpOworCQljMiA9IHJiX2VuY190b3VwcGVyKGMyLCBlbmMp OworCQlpZiAoYzEgPiBjMikgcmV0dXJuIElOVDJGSVgoMSk7CisJCWlmIChjMSA8 IGMyKSByZXR1cm4gSU5UMkZJWCgtMSk7CisJICAgIH0KKwkgICAgbGVuID0gcmJf ZW5jX2NvZGVsZW4oYzEsIGVuYyk7CisJICAgIHAxICs9IGxlbjsKKwkgICAgcDIg Kz0gbGVuOwogCX0KLQlsZW4gPSByYl9lbmNfY29kZWxlbihjMSwgZW5jKTsKLQlw MSArPSBsZW47Ci0JcDIgKz0gbGVuOwogICAgIH0KICAgICBpZiAoUlNUUklOR19M RU4oc3RyMSkgPT0gUlNUUklOR19MRU4oc3RyMikpIHJldHVybiBJTlQyRklYKDAp OwogICAgIGlmIChSU1RSSU5HX0xFTihzdHIxKSA+IFJTVFJJTkdfTEVOKHN0cjIp KSByZXR1cm4gSU5UMkZJWCgxKTsKQEAgLTI4OTQsMTEgKzI5MDgsMTEgQEAKICAg ICBjaGFyICpwLCAqZTsKICAgICByYl9lbmNvZGluZyAqZW5jOwogICAgIGludCBz aW5nbGVieXRlID0gc2luZ2xlX2J5dGVfb3B0aW1pemFibGUoc3RyKTsKKyAgICBp bnQgY3IgPSBFTkNfQ09ERVJBTkdFKHN0cik7CiAKICAgICBpZiAobGVuIDwgMCkg cmJfcmFpc2UocmJfZUluZGV4RXJyb3IsICJuZWdhdGl2ZSBsZW5ndGggJWxkIiwg bGVuKTsKIAogICAgIFN0cmluZ1ZhbHVlKHZhbCk7Ci0gICAgcmJfc3RyX21vZGlm eShzdHIpOwogICAgIGVuYyA9IHJiX2VuY19jaGVjayhzdHIsIHZhbCk7CiAgICAg c2xlbiA9IHN0cl9zdHJsZW4oc3RyLCBlbmMpOwogCkBAIC0yOTE1LDYgKzI5Mjks NyBAQAogICAgIGlmIChzbGVuIDwgbGVuIHx8IHNsZW4gPCBiZWcgKyBsZW4pIHsK IAlsZW4gPSBzbGVuIC0gYmVnOwogICAgIH0KKyAgICByYl9zdHJfbW9kaWZ5KHN0 cik7CiAgICAgcCA9IHN0cl9udGgoUlNUUklOR19QVFIoc3RyKSwgUlNUUklOR19F TkQoc3RyKSwgYmVnLCBlbmMsIHNpbmdsZWJ5dGUpOwogICAgIGlmICghcCkgcCA9 IFJTVFJJTkdfRU5EKHN0cik7CiAgICAgZSA9IHN0cl9udGgocCwgUlNUUklOR19F TkQoc3RyKSwgbGVuLCBlbmMsIHNpbmdsZWJ5dGUpOwpAQCAtMjkyNCw2ICsyOTM5 LDcgQEAKICAgICBsZW4gPSBlIC0gcDsJCS8qIHBoeXNpY2FsIGxlbmd0aCAqLwog ICAgIHJiX3N0cl9zcGxpY2VfMChzdHIsIGJlZywgbGVuLCB2YWwpOwogICAgIHJi X2VuY19hc3NvY2lhdGUoc3RyLCBlbmMpOworICAgIEVOQ19DT0RFUkFOR0VfU0VU KHN0ciwgRU5DX0NPREVSQU5HRV9BTkQoY3IsIEVOQ19DT0RFUkFOR0UodmFsKSkp OwogfQogCiB2b2lkCkBAIC0zMTA2LDExICszMTIyLDEyIEBACiB7CiAgICAgVkFM VUUgcmVzdWx0OwogICAgIFZBTFVFIGJ1ZlszXTsKLSAgICBpbnQgaTsKKyAgICBp bnQgaSwgY3I7CiAKICAgICBpZiAoYXJnYyA8IDEgfHwgMiA8IGFyZ2MpIHsKIAly Yl9yYWlzZShyYl9lQXJnRXJyb3IsICJ3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRz ICglZCBmb3IgMSkiLCBhcmdjKTsKICAgICB9CisgICAgY3IgPSBFTkNfQ09ERVJB TkdFKHN0cik7CiAgICAgZm9yIChpPTA7IGk8YXJnYzsgaSsrKSB7CiAJYnVmW2ld ID0gYXJndltpXTsKICAgICB9CkBAIC0zMTIwLDYgKzMxMzcsNyBAQAogICAgIGlm ICghTklMX1AocmVzdWx0KSkgewogCXJiX3N0cl9hc2V0X20oYXJnYysxLCBidWYs IHN0cik7CiAgICAgfQorICAgIEVOQ19DT0RFUkFOR0VfU0VUKHN0ciwgY3IpOwog ICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTM1MjQsNyArMzU0MiwxMCBAQAog ICAgIFNUUl9TRVRfRU1CRUQoc3RyKTsKICAgICBTVFJfU0VUX0VNQkVEX0xFTihz dHIsIDApOwogICAgIFJTVFJJTkdfUFRSKHN0cilbMF0gPSAwOwotICAgIEVOQ19D T0RFUkFOR0VfQ0xFQVIoc3RyKTsKKyAgICBpZiAocmJfZW5jX2FzY2lpY29tcGF0 KFNUUl9FTkNfR0VUKHN0cikpKQorCUVOQ19DT0RFUkFOR0VfU0VUKHN0ciwgRU5D X0NPREVSQU5HRV83QklUKTsKKyAgICBlbHNlCisJRU5DX0NPREVSQU5HRV9TRVQo c3RyLCBFTkNfQ09ERVJBTkdFX1ZBTElEKTsKICAgICByZXR1cm4gc3RyOwogfQog CkBAIC00MDM5LDE3ICs0MDYwLDMwIEBACiAgICAgcmJfc3RyX21vZGlmeShzdHIp OwogICAgIGVuYyA9IFNUUl9FTkNfR0VUKHN0cik7CiAgICAgcyA9IFJTVFJJTkdf UFRSKHN0cik7IHNlbmQgPSBSU1RSSU5HX0VORChzdHIpOwotICAgIHdoaWxlIChz IDwgc2VuZCkgewotCWludCBjID0gcmJfZW5jX2NvZGVwb2ludChzLCBzZW5kLCBl bmMpOworICAgIGlmIChzaW5nbGVfYnl0ZV9vcHRpbWl6YWJsZShzdHIpKSB7CisJ d2hpbGUgKHMgPCBzZW5kKSB7CisJICAgIGludCBjID0gKCpzICYgMHhmZik7CiAK LQlpZiAocmJfZW5jX2lzbG93ZXIoYywgZW5jKSkgewotCSAgICAvKiBhc3N1bWlu ZyB0b3VwcGVyIHJldHVybnMgY29kZXBvaW50IHdpdGggc2FtZSBzaXplICovCi0J ICAgIHJiX2VuY19tYmNwdXQocmJfZW5jX3RvdXBwZXIoYywgZW5jKSwgcywgZW5j KTsKLQkgICAgbW9kaWZ5ID0gMTsKKwkgICAgaWYgKHJiX2VuY19pc2xvd2VyKGMs IGVuYykpIHsKKwkJKnMgPSByYl9lbmNfdG91cHBlcihjICwgZW5jKTsKKwkJbW9k aWZ5ID0gMTsKKwkgICAgfQorCSAgICBzKys7CiAJfQotCXMgKz0gcmJfZW5jX2Nv ZGVsZW4oYywgZW5jKTsKICAgICB9CisgICAgZWxzZSB7CisJd2hpbGUgKHMgPCBz ZW5kKSB7CisJICAgIGludCBjID0gcmJfZW5jX2NvZGVwb2ludChzLCBzZW5kLCBl bmMpOwogCisJICAgIGlmIChyYl9lbmNfaXNsb3dlcihjLCBlbmMpKSB7CisJCS8q IGFzc3VtaW5nIHRvdXBwZXIgcmV0dXJucyBjb2RlcG9pbnQgd2l0aCBzYW1lIHNp emUgKi8KKwkJcmJfZW5jX21iY3B1dChyYl9lbmNfdG91cHBlcihjLCBlbmMpLCBz LCBlbmMpOworCQltb2RpZnkgPSAxOworCSAgICB9CisJICAgIHMgKz0gcmJfZW5j X2NvZGVsZW4oYywgZW5jKTsKKwl9CisgICAgfQorCiAgICAgRU5DX0NPREVSQU5H RV9TRVQoc3RyLCBjcik7CiAgICAgaWYgKG1vZGlmeSkgcmV0dXJuIHN0cjsKICAg ICByZXR1cm4gUW5pbDsKQEAgLTQwOTcsMTcgKzQxMzEsMzAgQEAKICAgICByYl9z dHJfbW9kaWZ5KHN0cik7CiAgICAgZW5jID0gU1RSX0VOQ19HRVQoc3RyKTsKICAg ICBzID0gUlNUUklOR19QVFIoc3RyKTsgc2VuZCA9IFJTVFJJTkdfRU5EKHN0cik7 Ci0gICAgd2hpbGUgKHMgPCBzZW5kKSB7Ci0JaW50IGMgPSByYl9lbmNfY29kZXBv aW50KHMsIHNlbmQsIGVuYyk7CisgICAgaWYgKHNpbmdsZV9ieXRlX29wdGltaXph YmxlKHN0cikpIHsKKwl3aGlsZSAocyA8IHNlbmQpIHsKKwkgICAgaW50IGMgPSAo KnMgJiAweGZmKTsKIAotCWlmIChyYl9lbmNfaXN1cHBlcihjLCBlbmMpKSB7Ci0J ICAgIC8qIGFzc3VtaW5nIHRvdXBwZXIgcmV0dXJucyBjb2RlcG9pbnQgd2l0aCBz YW1lIHNpemUgKi8KLQkgICAgcmJfZW5jX21iY3B1dChyYl9lbmNfdG9sb3dlcihj LCBlbmMpLCBzLCBlbmMpOwotCSAgICBtb2RpZnkgPSAxOworCSAgICBpZiAocmJf ZW5jX2lzdXBwZXIoYywgZW5jKSkgeworCQkqcyA9IHJiX2VuY190b2xvd2VyKGMg LCBlbmMpOworCQltb2RpZnkgPSAxOworCSAgICB9CisJICAgIHMrKzsKIAl9Ci0J cyArPSByYl9lbmNfY29kZWxlbihjLCBlbmMpOwogICAgIH0KKyAgICBlbHNlIHsK Kwl3aGlsZSAocyA8IHNlbmQpIHsKKwkgICAgaW50IGMgPSByYl9lbmNfY29kZXBv aW50KHMsIHNlbmQsIGVuYyk7CiAKKwkgICAgaWYgKHJiX2VuY19pc3VwcGVyKGMs IGVuYykpIHsKKwkJLyogYXNzdW1pbmcgdG9sb3dlciByZXR1cm5zIGNvZGVwb2lu dCB3aXRoIHNhbWUgc2l6ZSAqLworCQlyYl9lbmNfbWJjcHV0KHJiX2VuY190b2xv d2VyKGMsIGVuYyksIHMsIGVuYyk7CisJCW1vZGlmeSA9IDE7CisJICAgIH0KKwkg ICAgcyArPSByYl9lbmNfY29kZWxlbihjLCBlbmMpOworCX0KKyAgICB9CisKICAg ICBFTkNfQ09ERVJBTkdFX1NFVChzdHIsIGNyKTsKICAgICBpZiAobW9kaWZ5KSBy ZXR1cm4gc3RyOwogICAgIHJldHVybiBRbmlsOwpAQCAtNDIyNiwyMCArNDI3Mywz NyBAQAogICAgIHJiX3N0cl9tb2RpZnkoc3RyKTsKICAgICBlbmMgPSBTVFJfRU5D X0dFVChzdHIpOwogICAgIHMgPSBSU1RSSU5HX1BUUihzdHIpOyBzZW5kID0gUlNU UklOR19FTkQoc3RyKTsKLSAgICB3aGlsZSAocyA8IHNlbmQpIHsKLQlpbnQgYyA9 IHJiX2VuY19jb2RlcG9pbnQocywgc2VuZCwgZW5jKTsKKyAgICBpZiAoc2luZ2xl X2J5dGVfb3B0aW1pemFibGUoc3RyKSkgeworCXdoaWxlIChzIDwgc2VuZCkgewor CSAgICBpbnQgYyA9ICgqcyAmIDB4ZmYpOwogCi0JaWYgKHJiX2VuY19pc3VwcGVy KGMsIGVuYykpIHsKLQkgICAgLyogYXNzdW1pbmcgdG91cHBlciByZXR1cm5zIGNv ZGVwb2ludCB3aXRoIHNhbWUgc2l6ZSAqLwotCSAgICByYl9lbmNfbWJjcHV0KHJi X2VuY190b2xvd2VyKGMsIGVuYyksIHMsIGVuYyk7Ci0JICAgIG1vZGlmeSA9IDE7 CisJICAgIGlmIChyYl9lbmNfaXN1cHBlcihjLCBlbmMpKSB7CisJCSpzID0gcmJf ZW5jX3RvbG93ZXIoYyAsIGVuYyk7CisJCW1vZGlmeSA9IDE7CisJICAgIH0KKwkg ICAgZWxzZSBpZiAocmJfZW5jX2lzbG93ZXIoYywgZW5jKSkgeworCQkqcyA9IHJi X2VuY190b3VwcGVyKGMgLCBlbmMpOworCQltb2RpZnkgPSAxOworCSAgICB9CisJ ICAgIHMrKzsKIAl9Ci0JZWxzZSBpZiAocmJfZW5jX2lzbG93ZXIoYywgZW5jKSkg ewotCSAgICAvKiBhc3N1bWluZyB0b3VwcGVyIHJldHVybnMgY29kZXBvaW50IHdp dGggc2FtZSBzaXplICovCi0JICAgIHJiX2VuY19tYmNwdXQocmJfZW5jX3RvdXBw ZXIoYywgZW5jKSwgcywgZW5jKTsKLQkgICAgbW9kaWZ5ID0gMTsKKyAgICB9Cisg ICAgZWxzZSB7CisJd2hpbGUgKHMgPCBzZW5kKSB7CisJICAgIGludCBjID0gcmJf ZW5jX2NvZGVwb2ludChzLCBzZW5kLCBlbmMpOworCisJICAgIGlmIChyYl9lbmNf aXN1cHBlcihjLCBlbmMpKSB7CisJCS8qIGFzc3VtaW5nIHRvdXBwZXIgcmV0dXJu cyBjb2RlcG9pbnQgd2l0aCBzYW1lIHNpemUgKi8KKwkJcmJfZW5jX21iY3B1dChy Yl9lbmNfdG9sb3dlcihjLCBlbmMpLCBzLCBlbmMpOworCQltb2RpZnkgPSAxOwor CSAgICB9CisJICAgIGVsc2UgaWYgKHJiX2VuY19pc2xvd2VyKGMsIGVuYykpIHsK KwkJLyogYXNzdW1pbmcgdG9sb3dlciByZXR1cm5zIGNvZGVwb2ludCB3aXRoIHNh bWUgc2l6ZSAqLworCQlyYl9lbmNfbWJjcHV0KHJiX2VuY190b3VwcGVyKGMsIGVu YyksIHMsIGVuYyk7CisJCW1vZGlmeSA9IDE7CisJICAgIH0KKwkgICAgcyArPSBy Yl9lbmNfbWJjbGVuKHMsIHNlbmQsIGVuYyk7CiAJfQotCXMgKz0gcmJfZW5jX2Nv ZGVsZW4oYywgZW5jKTsKICAgICB9CiAKICAgICBFTkNfQ09ERVJBTkdFX1NFVChz dHIsIGNyKTsKQEAgLTQzMjEsNiArNDM4NSw3IEBACiAgICAgY2hhciAqcywgKnNl bmQ7CiAgICAgVkFMVUUgaGFzaCA9IDA7CiAgICAgaW50IHNpbmdsZWJ5dGUgPSBz aW5nbGVfYnl0ZV9vcHRpbWl6YWJsZShzdHIpOworICAgIGludCBjcjsKIAogICAg IFN0cmluZ1ZhbHVlKHNyYyk7CiAgICAgU3RyaW5nVmFsdWUocmVwbCk7CkBAIC00 MzkyLDYgKzQ0NTcsNyBAQAogCX0KICAgICB9CiAKKyAgICBjciA9IEVOQ19DT0RF UkFOR0Uoc3RyKTsKICAgICByYl9zdHJfbW9kaWZ5KHN0cik7CiAgICAgcyA9IFJT VFJJTkdfUFRSKHN0cik7IHNlbmQgPSBSU1RSSU5HX0VORChzdHIpOwogICAgIGlm IChzZmxhZykgewpAQCAtNDUxNSw4ICs0NTgxLDEwIEBACiAgICAgCiAgICAgaWYg KG1vZGlmeSkgewogCXJiX2VuY19hc3NvY2lhdGUoc3RyLCBlbmMpOworCUVOQ19D T0RFUkFOR0VfU0VUKHN0ciwgRU5DX0NPREVSQU5HRV9BTkQoY3IsIEVOQ19DT0RF UkFOR0UocmVwbCkpKTsKIAlyZXR1cm4gc3RyOwogICAgIH0KKyAgICBFTkNfQ09E RVJBTkdFX1NFVChzdHIsIGNyKTsKICAgICByZXR1cm4gUW5pbDsKIH0KIApAQCAt NDY1MSwxMSArNDcxOSwxMSBAQAogICAgIGNoYXIgKnMsICpzZW5kLCAqdDsKICAg ICBWQUxVRSBkZWwgPSAwLCBub2RlbCA9IDA7CiAgICAgaW50IG1vZGlmeSA9IDA7 Ci0gICAgaW50IGk7Ci0gICAgaW50IGNyOworICAgIGludCBpLCBjciwgc2luZ2xl Ynl0ZTsKIAogICAgIGlmIChSU1RSSU5HX0xFTihzdHIpID09IDAgfHwgIVJTVFJJ TkdfUFRSKHN0cikpIHJldHVybiBRbmlsOwogICAgIGNyID0gRU5DX0NPREVSQU5H RShzdHIpOworICAgIHNpbmdsZWJ5dGUgPSBzaW5nbGVfYnl0ZV9vcHRpbWl6YWJs ZShzdHIpOwogICAgIGlmIChhcmdjIDwgMSkgewogCXJiX3JhaXNlKHJiX2VBcmdF cnJvciwgIndyb25nIG51bWJlciBvZiBhcmd1bWVudHMiKTsKICAgICB9CkBAIC00 NjY0LDI1ICs0NzMyLDM3IEBACiAKIAlTdHJpbmdWYWx1ZShzKTsKIAllbmMgPSBy Yl9lbmNfY2hlY2soc3RyLCBzKTsKKwlpZiAoc2luZ2xlYnl0ZSAmJiAhc2luZ2xl X2J5dGVfb3B0aW1pemFibGUocykpCisJICAgIHNpbmdsZWJ5dGUgPSAwOwogCXRy X3NldHVwX3RhYmxlKHMsIHNxdWVleiwgaT09MCwgJmRlbCwgJm5vZGVsLCBlbmMp OwogICAgIH0KIAogICAgIHJiX3N0cl9tb2RpZnkoc3RyKTsKICAgICBzID0gdCA9 IFJTVFJJTkdfUFRSKHN0cik7Ci0gICAgaWYgKCFzIHx8IFJTVFJJTkdfTEVOKHN0 cikgPT0gMCkgcmV0dXJuIFFuaWw7CiAgICAgc2VuZCA9IFJTVFJJTkdfRU5EKHN0 cik7Ci0gICAgd2hpbGUgKHMgPCBzZW5kKSB7Ci0JaW50IGMgPSByYl9lbmNfY29k ZXBvaW50KHMsIHNlbmQsIGVuYyk7Ci0JaW50IGNsZW4gPSByYl9lbmNfY29kZWxl bihjLCBlbmMpOworICAgIGlmIChzaW5nbGVieXRlKSB7CisJd2hpbGUgKHMgPCBz ZW5kKSB7CisJICAgIGlmIChzcXVlZXpbKnMgJiAweGZmXSkKKwkJbW9kaWZ5ID0g MTsKKwkgICAgZWxzZQorCQkqdCsrID0gKnM7CisJICAgIHMrKzsKKwl9CisgICAg fQorICAgIGVsc2UgeworCXdoaWxlIChzIDwgc2VuZCkgeworCSAgICBpbnQgYyA9 IHJiX2VuY19jb2RlcG9pbnQocywgc2VuZCwgZW5jKTsKKwkgICAgaW50IGNsZW4g PSByYl9lbmNfY29kZWxlbihjLCBlbmMpOwogCi0JaWYgKHRyX2ZpbmQoYywgc3F1 ZWV6LCBkZWwsIG5vZGVsKSkgewotCSAgICBtb2RpZnkgPSAxOworCSAgICBpZiAo dHJfZmluZChjLCBzcXVlZXosIGRlbCwgbm9kZWwpKSB7CisJCW1vZGlmeSA9IDE7 CisJICAgIH0KKwkgICAgZWxzZSB7CisJCWlmICh0ICE9IHMpIHJiX2VuY19tYmNw dXQoYywgdCwgZW5jKTsKKwkJdCArPSBjbGVuOworCSAgICB9CisJICAgIHMgKz0g Y2xlbjsKIAl9Ci0JZWxzZSB7Ci0JICAgIGlmICh0ICE9IHMpIHJiX2VuY19tYmNw dXQoYywgdCwgZW5jKTsKLQkgICAgdCArPSBjbGVuOwotCX0KLQlzICs9IGNsZW47 CiAgICAgfQogICAgICp0ID0gJ1wwJzsKICAgICBTVFJfU0VUX0xFTihzdHIsIHQg LSBSU1RSSU5HX1BUUihzdHIpKTsKQEAgLTQ3MzIsOCArNDgxMiwxMSBAQAogICAg IFZBTFVFIGRlbCA9IDAsIG5vZGVsID0gMDsKICAgICBjaGFyICpzLCAqc2VuZCwg KnQ7CiAgICAgaW50IHNhdmUsIG1vZGlmeSA9IDA7Ci0gICAgaW50IGk7CisgICAg aW50IGksIGNyLCBzaW5nbGVieXRlOwogCisgICAgaWYgKFJTVFJJTkdfTEVOKHN0 cikgPT0gMCB8fCAhUlNUUklOR19QVFIoc3RyKSkgcmV0dXJuIFFuaWw7CisgICAg Y3IgPSBFTkNfQ09ERVJBTkdFKHN0cik7CisgICAgc2luZ2xlYnl0ZSA9IHNpbmds ZV9ieXRlX29wdGltaXphYmxlKHN0cik7CiAgICAgaWYgKGFyZ2MgPT0gMCkgewog CWVuYyA9IFNUUl9FTkNfR0VUKHN0cik7CiAgICAgfQpAQCAtNDc0MywzMiArNDgy Niw0NSBAQAogCiAJICAgIFN0cmluZ1ZhbHVlKHMpOwogCSAgICBlbmMgPSByYl9l bmNfY2hlY2soc3RyLCBzKTsKKwkgICAgaWYgKHNpbmdsZWJ5dGUgJiYgIXNpbmds ZV9ieXRlX29wdGltaXphYmxlKHMpKQorCQlzaW5nbGVieXRlID0gMDsKIAkgICAg dHJfc2V0dXBfdGFibGUocywgc3F1ZWV6LCBpPT0wLCAmZGVsLCAmbm9kZWwsIGVu Yyk7CiAJfQogICAgIH0KIAogICAgIHJiX3N0cl9tb2RpZnkoc3RyKTsKICAgICBz ID0gdCA9IFJTVFJJTkdfUFRSKHN0cik7Ci0gICAgaWYgKCFzIHx8IFJTVFJJTkdf TEVOKHN0cikgPT0gMCkgcmV0dXJuIFFuaWw7CiAgICAgc2VuZCA9IFJTVFJJTkdf RU5EKHN0cik7CiAgICAgc2F2ZSA9IC0xOwotICAgIHdoaWxlIChzIDwgc2VuZCkg ewotCWludCBjID0gcmJfZW5jX2NvZGVwb2ludChzLCBzZW5kLCBlbmMpOwotCWlu dCBjbGVuID0gcmJfZW5jX2NvZGVsZW4oYywgZW5jKTsKKyAgICBpZiAoc2luZ2xl Ynl0ZSkgeworCXdoaWxlIChzIDwgc2VuZCkgeworCSAgICBpbnQgYyA9ICpzKysg JiAweGZmOwogCi0JaWYgKGMgIT0gc2F2ZSB8fCAoYXJnYyA+IDAgJiYgIXRyX2Zp bmQoYywgc3F1ZWV6LCBkZWwsIG5vZGVsKSkpIHsKLQkgICAgaWYgKHQgIT0gcykg cmJfZW5jX21iY3B1dChjLCB0LCBlbmMpOwotCSAgICBzYXZlID0gYzsKLQkgICAg dCArPSBjbGVuOworCSAgICBpZiAoYyAhPSBzYXZlIHx8ICFzcXVlZXpbY10pIHsK KwkJKnQrKyA9IHNhdmUgPSBjOworCSAgICB9CiAJfQotCXMgKz0gY2xlbjsKICAg ICB9CisgICAgZWxzZSB7CisJd2hpbGUgKHMgPCBzZW5kKSB7CisJICAgIGludCBj ID0gcmJfZW5jX2NvZGVwb2ludChzLCBzZW5kLCBlbmMpOworCSAgICBpbnQgY2xl biA9IHJiX2VuY19jb2RlbGVuKGMsIGVuYyk7CisKKwkgICAgaWYgKGMgIT0gc2F2 ZSB8fCAoYXJnYyA+IDAgJiYgIXRyX2ZpbmQoYywgc3F1ZWV6LCBkZWwsIG5vZGVs KSkpIHsKKwkJaWYgKHQgIT0gcykgcmJfZW5jX21iY3B1dChjLCB0LCBlbmMpOwor CQlzYXZlID0gYzsKKwkJdCArPSBjbGVuOworCSAgICB9CisJICAgIHMgKz0gY2xl bjsKKwl9CisgICAgfQogICAgICp0ID0gJ1wwJzsKICAgICBpZiAodCAtIFJTVFJJ TkdfUFRSKHN0cikgIT0gUlNUUklOR19MRU4oc3RyKSkgewogCVNUUl9TRVRfTEVO KHN0ciwgdCAtIFJTVFJJTkdfUFRSKHN0cikpOwogCW1vZGlmeSA9IDE7CiAgICAg fQogCisgICAgRU5DX0NPREVSQU5HRV9TRVQoc3RyLCBjcik7CiAgICAgaWYgKG1v ZGlmeSkgcmV0dXJuIHN0cjsKICAgICByZXR1cm4gUW5pbDsKIH0KQEAgLTQ4NTcs MzMgKzQ5NTMsNjYgQEAKICAgICBjaGFyIHRhYmxlWzI1Nl07CiAgICAgcmJfZW5j b2RpbmcgKmVuYyA9IDA7CiAgICAgVkFMVUUgZGVsID0gMCwgbm9kZWwgPSAwOwor ICAgIFZBTFVFIGFyZzsKICAgICBjaGFyICpzLCAqc2VuZDsKLSAgICBpbnQgaTsK KyAgICBpbnQgaSwgc2luZ2xlYnl0ZTsKIAogICAgIGlmIChhcmdjIDwgMSkgewog CXJiX3JhaXNlKHJiX2VBcmdFcnJvciwgIndyb25nIG51bWJlciBvZiBhcmd1bWVu dHMiKTsKICAgICB9Ci0gICAgZm9yIChpPTA7IGk8YXJnYzsgaSsrKSB7Ci0JVkFM VUUgcyA9IGFyZ3ZbaV07Ci0KLQlTdHJpbmdWYWx1ZShzKTsKLQllbmMgPSByYl9l bmNfY2hlY2soc3RyLCBzKTsKLQl0cl9zZXR1cF90YWJsZShzLCB0YWJsZSxpPT0w LCAmZGVsLCAmbm9kZWwsIGVuYyk7Ci0gICAgfQotCiAgICAgcyA9IFJTVFJJTkdf UFRSKHN0cik7CiAgICAgaWYgKCFzIHx8IFJTVFJJTkdfTEVOKHN0cikgPT0gMCkg cmV0dXJuIElOVDJGSVgoMCk7CiAgICAgc2VuZCA9IFJTVFJJTkdfRU5EKHN0cik7 Ci0gICAgaSA9IDA7Ci0gICAgd2hpbGUgKHMgPCBzZW5kKSB7Ci0JaW50IGMgPSBy Yl9lbmNfY29kZXBvaW50KHMsIHNlbmQsIGVuYyk7Ci0JaW50IGNsZW4gPSByYl9l bmNfY29kZWxlbihjLCBlbmMpOwogCi0JaWYgKHRyX2ZpbmQoYywgdGFibGUsIGRl bCwgbm9kZWwpKSB7CisgICAgYXJnID0gYXJndlswXTsKKworICAgIFN0cmluZ1Zh bHVlKGFyZyk7CisgICAgZW5jID0gcmJfZW5jX2NoZWNrKHN0ciwgYXJnKTsKKyAg ICBpZiAoYXJnYyA9PSAxICYmIFJTVFJJTkdfTEVOKGFyZykgPT0gMSAmJiByYl9l bmNfYXNjaWljb21wYXQoZW5jKSkgeworCS8qIFNpbmdsZSBieXRlIHNlYXJjaCBp biBhc2NpaSBjb21wYXQgc3RyaW5nICovCisJY2hhciAqYXJncCA9IFJTVFJJTkdf UFRSKGFyZyk7CisJaW50IHBvczsKKworCWkgPSAwOworCXdoaWxlIChzIDwgc2Vu ZCAmJgorCSAgICAgICAocG9zID0gcmJfbWVtc2VhcmNoKGFyZ3AsIDEsIHMsIHNl bmQgLSBzLCBlbmMpKSA+PSAwKSB7CisJICAgIHMgKz0gcG9zICsgMTsKIAkgICAg aSsrOwogCX0KLQlzICs9IGNsZW47CisJcmV0dXJuIElOVDJOVU0oaSk7CiAgICAg fQorCisgICAgdHJfc2V0dXBfdGFibGUoYXJnLCB0YWJsZSwgMSwgJmRlbCwgJm5v ZGVsLCBlbmMpOworICAgIHNpbmdsZWJ5dGUgPSBzaW5nbGVfYnl0ZV9vcHRpbWl6 YWJsZShzdHIpICYmIHNpbmdsZV9ieXRlX29wdGltaXphYmxlKGFyZyk7CisgICAg Zm9yIChpPTE7IGk8YXJnYzsgaSsrKSB7CisJYXJnID0gYXJndltpXTsKKworCVN0 cmluZ1ZhbHVlKGFyZyk7CisJZW5jID0gcmJfZW5jX2NoZWNrKHN0ciwgYXJnKTsK KwlpZiAoc2luZ2xlYnl0ZSAmJiAhc2luZ2xlX2J5dGVfb3B0aW1pemFibGUoYXJn KSkKKwkgICBzaW5nbGVieXRlID0gMDsKKwl0cl9zZXR1cF90YWJsZShhcmcsIHRh YmxlLCAwLCAmZGVsLCAmbm9kZWwsIGVuYyk7CisgICAgfQorCisgICAgaSA9IDA7 CisgICAgaWYgKHNpbmdsZWJ5dGUpIHsKKwl3aGlsZSAocyA8IHNlbmQpIHsKKwkg ICAgaWYgKHRhYmxlWypzKysgJiAweGZmXSkgeworCQlpKys7CisJICAgIH0KKwl9 CisgICAgfQorICAgIGVsc2UgeworCXdoaWxlIChzIDwgc2VuZCkgeworCSAgICBp bnQgYyA9IHJiX2VuY19jb2RlcG9pbnQocywgc2VuZCwgZW5jKTsKKwkgICAgaW50 IGNsZW4gPSByYl9lbmNfY29kZWxlbihjLCBlbmMpOworCisJICAgIGlmICh0cl9m aW5kKGMsIHRhYmxlLCBkZWwsIG5vZGVsKSkgeworICAgICAgICAJaSsrOworCSAg ICB9CisJICAgIHMgKz0gY2xlbjsKKwl9CisgICAgfQogICAgIHJldHVybiBJTlQy TlVNKGkpOwogfQogCkBAIC00OTM2LDcgKzUwNjUsNyBAQAogICAgIHJiX2VuY29k aW5nICplbmM7CiAgICAgVkFMVUUgc3BhdDsKICAgICBWQUxVRSBsaW1pdDsKLSAg ICBpbnQgYXdrX3NwbGl0ID0gUWZhbHNlOworICAgIGVudW0ge2F3aywgc3RyaW5n LCByZWdleHB9IHNwbGl0X3R5cGU7CiAgICAgbG9uZyBiZWcsIGVuZCwgaSA9IDA7 CiAgICAgaW50IGxpbSA9IDA7CiAgICAgVkFMVUUgcmVzdWx0LCB0bXA7CkBAIC00 OTU4LDM3ICs1MDg3LDQxIEBACiAJICAgIHNwYXQgPSByYl9mczsKIAkgICAgZ290 byBmc19zZXQ7CiAJfQotCWF3a19zcGxpdCA9IFF0cnVlOworCXNwbGl0X3R5cGUg PSBhd2s7CiAgICAgfQogICAgIGVsc2UgewogICAgICAgZnNfc2V0OgogCWlmIChU WVBFKHNwYXQpID09IFRfU1RSSU5HKSB7CiAJICAgIHJiX2VuY29kaW5nICplbmMy ID0gU1RSX0VOQ19HRVQoc3BhdCk7CiAKLQkgICAgaWYgKHJiX2VuY19tYm1pbmxl bihlbmMyKSA9PSAxKSB7CisJICAgIHNwbGl0X3R5cGUgPSBzdHJpbmc7CisJICAg IGlmIChSU1RSSU5HX0xFTihzcGF0KSA9PSAwKSB7CisJCS8qIFNwZWNpYWwgY2Fz ZSAtIHNwbGl0IGJ5IGNoYXIgKi8KKwkJc3BhdCA9IHJiX3JlZ19yZWdjb21wKHNw YXQpOworCQlzcGxpdF90eXBlID0gcmVnZXhwOworCSAgICB9CisJICAgIGVsc2Ug aWYgKHJiX2VuY19tYm1pbmxlbihlbmMyKSA9PSAxKSB7CiAJCWlmIChSU1RSSU5H X0xFTihzcGF0KSA9PSAxICYmIFJTVFJJTkdfUFRSKHNwYXQpWzBdID09ICcgJyl7 Ci0JCSAgICBhd2tfc3BsaXQgPSBRdHJ1ZTsKKwkJICAgIHNwbGl0X3R5cGUgPSBh d2s7CiAJCX0KIAkgICAgfQogCSAgICBlbHNlIHsKIAkJaW50IGw7CiAJCWlmIChy Yl9lbmNfYXNjZ2V0KFJTVFJJTkdfUFRSKHNwYXQpLCBSU1RSSU5HX0VORChzcGF0 KSwgJmwsIGVuYzIpID09ICcgJyAmJgogCQkgICAgUlNUUklOR19MRU4oc3BhdCkg PT0gbCkgewotCQkgICAgYXdrX3NwbGl0ID0gUXRydWU7CisJCSAgICBzcGxpdF90 eXBlID0gYXdrOwogCQl9CiAJICAgIH0KLQkgICAgaWYgKCFhd2tfc3BsaXQpIHsK LQkJc3BhdCA9IHJiX3JlZ19yZWdjb21wKHJiX3JlZ19xdW90ZShzcGF0KSk7Ci0J ICAgIH0KIAl9CiAJZWxzZSB7CiAJICAgIHNwYXQgPSBnZXRfcGF0KHNwYXQsIDEp OworCSAgICBzcGxpdF90eXBlID0gcmVnZXhwOwogCX0KICAgICB9CiAKICAgICBy ZXN1bHQgPSByYl9hcnlfbmV3KCk7CiAgICAgYmVnID0gMDsKLSAgICBpZiAoYXdr X3NwbGl0KSB7CisgICAgaWYgKHNwbGl0X3R5cGUgPT0gYXdrKSB7CiAJY2hhciAq cHRyID0gUlNUUklOR19QVFIoc3RyKTsKIAljaGFyICplcHRyID0gUlNUUklOR19F TkQoc3RyKTsKIAljaGFyICpicHRyID0gcHRyOwpAQCAtNTAyMiw2ICs1MTU1LDIx IEBACiAJICAgIH0KIAl9CiAgICAgfQorICAgIGVsc2UgaWYgKHNwbGl0X3R5cGUg PT0gc3RyaW5nKSB7CisJY2hhciAqcHRyID0gUlNUUklOR19QVFIoc3RyKTsKKwlj aGFyIGxlbiA9IFJTVFJJTkdfTEVOKHN0cik7CisJY2hhciAqc3B0ciA9IFJTVFJJ TkdfUFRSKHNwYXQpOworCWludCBzbGVuID0gUlNUUklOR19MRU4oc3BhdCk7CisK KwllbmMgPSByYl9lbmNfY2hlY2soc3RyLCBzcGF0KTsKKwl3aGlsZSAobGVuID4g MCAmJiAoZW5kID0gcmJfbWVtc2VhcmNoKHNwdHIsIHNsZW4sIHB0ciwgbGVuLCBl bmMpKSA+PSAwKSB7CisJICAgIHJiX2FyeV9wdXNoKHJlc3VsdCwgcmJfc3RyX3N1 YnN0cihzdHIsIHB0ciAtIFJTVFJJTkdfUFRSKHN0ciksIGVuZCkpOworCSAgICBw dHIgKz0gZW5kICsgc2xlbjsKKwkgICAgbGVuIC09IGVuZCArIHNsZW47CisJICAg IGlmICghTklMX1AobGltaXQpICYmIGxpbSA8PSArK2kpIGJyZWFrOworCX0KKwli ZWcgPSBwdHIgLSBSU1RSSU5HX1BUUihzdHIpOworICAgIH0KICAgICBlbHNlIHsK IAlsb25nIHN0YXJ0ID0gYmVnOwogCWxvbmcgaWR4OwpAQCAtNTMyMyw2ICs1NDcx LDU2IEBACiAgICAgcmV0dXJuIHN0cjsKIH0KIAorLyoKKyAqICBEb2N1bWVudC1t ZXRob2Q6IGNvZGVwb2ludHMKKyAqICBjYWxsLXNlcToKKyAqICAgICBzdHIuY29k ZXBvaW50cyAgICAgICAgICAgICAgICAgICA9PiBhbkVudW1lcmF0b3IKKyAqICAg ICBzdHIuY29kZXBvaW50cyB7fGZpeG51bXwgYmxvY2sgfSA9PiBzdHIKKyAqICAK KyAqICBSZXR1cm5zIGFuIGVudW1lcmF0b3IgdGhhdCBnaXZlcyB0aGUgPGNvZGU+ SW50ZWdlcjwvY29kZT4gb3JkaW5hbAorICogIG9mIGVhY2ggY2hhcmFjdGVyIGlu IHRoZSBzdHJpbmcsIGFsc28ga25vd24gYXMgYSA8aT5jb2RlcG9pbnQ8L2k+Cisg KiAgd2hlbiBhcHBsaWVkIHRvIFVuaWNvZGUgc3RyaW5ncy4gSWYgYSBibG9jayBp cyBnaXZlbiwgaXQgaXRlcmF0ZXMKKyAqICBvdmVyIGVhY2ggY2hhcmFjdGVyIGlu IHRoZSBzdHJpbmcuCisgKiAgICAgCisgKiAgICAgImZvb1x1MDYzNSIuY2hhcnMu dG9fYSAgICM9PiBbMTAyLCAxMTEsIDExMSwgMTU4OV0KKyAqLworCisvKgorICog IERvY3VtZW50LW1ldGhvZDogZWFjaF9jb2RlcG9pbnQKKyAqICBjYWxsLXNlcToK KyAqICAgICBzdHIuZWFjaF9jb2RlcG9pbnQge3xmaXhudW18IGJsb2NrIH0gICAg PT4gc3RyCisgKiAgCisgKiAgUGFzc2VzIHRoZSA8Y29kZT5JbnRlZ2VyPC9jb2Rl PiBvcmRpbmFsIG9mIGVhY2ggY2hhcmFjdGVyIGluIDxpPnN0cjwvaT4sCisgKiAg YWxzbyBrbm93biBhcyBhIDxpPmNvZGVwb2ludDwvaT4gd2hlbiBhcHBsaWVkIHRv IFVuaWNvZGUgc3RyaW5ncyB0byB0aGUKKyAqICBnaXZlbiBibG9jay4KKyAqICAg ICAKKyAqICAgICAiaGVsbG9cdTA2MzkiLmVhY2hfY29kZXBvaW50IHt8Y3wgcHJp bnQgYywgJyAnIH0KKyAqICAgICAKKyAqICA8ZW0+cHJvZHVjZXM6PC9lbT4KKyAq ICAgICAKKyAqICAgICAxMDQgMTAxIDEwOCAxMDggMTExIDE1OTMKKyAqLworCitz dGF0aWMgVkFMVUUKK3JiX3N0cl9lYWNoX2NvZGVwb2ludChWQUxVRSBzdHIpCit7 CisgICAgaW50IGksIGxlbiwgbjsKKyAgICBjb25zdCBjaGFyICpwdHIsICplbmQ7 CisgICAgcmJfZW5jb2RpbmcgKmVuYzsKKworICAgIGlmIChzaW5nbGVfYnl0ZV9v cHRpbWl6YWJsZShzdHIpKSByZXR1cm4gcmJfc3RyX2VhY2hfYnl0ZShzdHIpOwor ICAgIFJFVFVSTl9FTlVNRVJBVE9SKHN0ciwgMCwgMCk7CisgICAgcHRyID0gUlNU UklOR19QVFIoc3RyKTsKKyAgICBsZW4gPSBSU1RSSU5HX0xFTihzdHIpOworICAg IGVuZCA9IFJTVFJJTkdfRU5EKHN0cik7CisgICAgZW5jID0gcmJfZW5jX2dldChz dHIpOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gbikgeworCW4gPSBy Yl9lbmNfbWJjbGVuKHB0ciArIGksIHB0ciArIGxlbiwgZW5jKTsKKwlyYl95aWVs ZChJTlQyRklYKHJiX2VuY19jb2RlcG9pbnQocHRyICsgaSwgZW5kLCBlbmMpKSk7 CisgICAgfQorICAgIHJldHVybiBzdHI7Cit9CisKIHN0YXRpYyBsb25nCiBjaG9w cGVkX2xlbmd0aChWQUxVRSBzdHIpCiB7CkBAIC01MzU1LDEwICs1NTUzLDEzIEBA CiB7CiAgICAgaWYgKFJTVFJJTkdfTEVOKHN0cikgPiAwKSB7CiAJbG9uZyBsZW47 CisJaW50IGNyID0gRU5DX0NPREVSQU5HRShzdHIpOworCiAJcmJfc3RyX21vZGlm eShzdHIpOwogCWxlbiA9IGNob3BwZWRfbGVuZ3RoKHN0cik7CiAJU1RSX1NFVF9M RU4oc3RyLCBsZW4pOwogCVJTVFJJTkdfUFRSKHN0cilbbGVuXSA9ICdcMCc7CisJ RU5DX0NPREVSQU5HRV9TRVQoc3RyLCBjcik7CiAJcmV0dXJuIHN0cjsKICAgICB9 CiAgICAgcmV0dXJuIFFuaWw7CkBAIC01NDA4LDkgKzU2MDksMTEgQEAKICAgICBp bnQgbmV3bGluZTsKICAgICBjaGFyICpwLCAqcHAsICplOwogICAgIGxvbmcgbGVu LCByc2xlbjsKKyAgICBpbnQgY3I7CiAKICAgICBsZW4gPSBSU1RSSU5HX0xFTihz dHIpOwogICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuIFFuaWw7CisgICAgY3IgPSBF TkNfQ09ERVJBTkdFKHN0cik7CiAgICAgcCA9IFJTVFJJTkdfUFRSKHN0cik7CiAg ICAgZSA9IHAgKyBsZW47CiAgICAgaWYgKGFyZ2MgPT0gMCkgewpAQCAtNTQzMiw2 ICs1NjM1LDcgQEAKIAkJICAgIH0KIAkJfQogCQlpZiAoZSA9PSBSU1RSSU5HX0VO RChzdHIpKSB7CisJCSAgICBFTkNfQ09ERVJBTkdFX1NFVChzdHIsIGNyKTsKIAkJ ICAgIHJldHVybiBRbmlsOwogCQl9CiAJCWxlbiA9IGUgLSBSU1RSSU5HX1BUUihz dHIpOwpAQCAtNTQ0OSwxMCArNTY1MywxMiBAQAogCQkgICAgU1RSX0RFQ19MRU4o c3RyKTsKIAkJfQogCQllbHNlIHsKKwkJICAgIEVOQ19DT0RFUkFOR0VfU0VUKHN0 ciwgY3IpOwogCQkgICAgcmV0dXJuIFFuaWw7CiAJCX0KIAkgICAgfQogCSAgICBS U1RSSU5HX1BUUihzdHIpW1JTVFJJTkdfTEVOKHN0cildID0gJ1wwJzsKKwkgICAg RU5DX0NPREVSQU5HRV9TRVQoc3RyLCBjcik7CiAJICAgIHJldHVybiBzdHI7CiAJ fQogICAgIH0KQEAgLTU0NzIsNiArNTY3OCw3IEBACiAJICAgIHJiX3N0cl9tb2Rp Znkoc3RyKTsKIAkgICAgU1RSX1NFVF9MRU4oc3RyLCBsZW4pOwogCSAgICBSU1RS SU5HX1BUUihzdHIpW2xlbl0gPSAnXDAnOworCSAgICBFTkNfQ09ERVJBTkdFX1NF VChzdHIsIGNyKTsKIAkgICAgcmV0dXJuIHN0cjsKIAl9CiAJcmV0dXJuIFFuaWw7 CkBAIC01NDk0LDYgKzU3MDEsNyBAQAogCXJiX3N0cl9tb2RpZnkoc3RyKTsKIAlT VFJfU0VUX0xFTihzdHIsIFJTVFJJTkdfTEVOKHN0cikgLSByc2xlbik7CiAJUlNU UklOR19QVFIoc3RyKVtSU1RSSU5HX0xFTihzdHIpXSA9ICdcMCc7CisJRU5DX0NP REVSQU5HRV9TRVQoc3RyLCBjcik7CiAJcmV0dXJuIHN0cjsKICAgICB9CiAgICAg cmV0dXJuIFFuaWw7CkBAIC01NTQ1LDI0ICs1NzUzLDM1IEBACiAgICAgcmJfZW5j b2RpbmcgKmVuYzsKICAgICBjaGFyICpzLCAqdCwgKmU7CiAKLSAgICByYl9zdHJf bW9kaWZ5KHN0cik7Ci0gICAgZW5jID0gU1RSX0VOQ19HRVQoc3RyKTsKICAgICBz ID0gUlNUUklOR19QVFIoc3RyKTsKICAgICBpZiAoIXMgfHwgUlNUUklOR19MRU4o c3RyKSA9PSAwKSByZXR1cm4gUW5pbDsKICAgICBlID0gdCA9IFJTVFJJTkdfRU5E KHN0cik7CisgICAgZW5jID0gU1RSX0VOQ19HRVQoc3RyKTsKICAgICAvKiByZW1v dmUgc3BhY2VzIGF0IGhlYWQgKi8KLSAgICB3aGlsZSAocyA8IGUpIHsKLQlpbnQg Y2MgPSByYl9lbmNfY29kZXBvaW50KHMsIGUsIGVuYyk7CisgICAgaWYgKHJiX2Vu Y19hc2NpaWNvbXBhdChlbmMpKSB7CisJLyogQXNzdW1lIGFsbCBzcGFjZSBjaGFy cyBhcmUgc2luZ2xlIGJ5dGUgKi8KKwl3aGlsZSAocyA8IGUpIHsKKwkgICAgaWYg KCFyYl9lbmNfaXNzcGFjZSgqcyAmIDB4ZmYsIGVuYykpIGJyZWFrOworCSAgICBz Kys7CisJfQorICAgIH0KKyAgICBlbHNlIHsKKwl3aGlsZSAocyA8IGUpIHsKKwkg ICAgaW50IGNjID0gcmJfZW5jX2NvZGVwb2ludChzLCBlLCBlbmMpOwogCQotCWlm ICghcmJfZW5jX2lzc3BhY2UoY2MsIGVuYykpIGJyZWFrOwotCXMgKz0gcmJfZW5j X2NvZGVsZW4oY2MsIGVuYyk7CisJICAgIGlmICghcmJfZW5jX2lzc3BhY2UoY2Ms IGVuYykpIGJyZWFrOworCSAgICBzICs9IHJiX2VuY19jb2RlbGVuKGNjLCBlbmMp OworCX0KICAgICB9CiAKICAgICBpZiAocyA+IFJTVFJJTkdfUFRSKHN0cikpIHsK KwlpbnQgY3IgPSBFTkNfQ09ERVJBTkdFKHN0cik7CisKIAlyYl9zdHJfbW9kaWZ5 KHN0cik7CiAJU1RSX1NFVF9MRU4oc3RyLCB0LXMpOwogCW1lbW1vdmUoUlNUUklO R19QVFIoc3RyKSwgcywgUlNUUklOR19MRU4oc3RyKSk7CiAJUlNUUklOR19QVFIo c3RyKVtSU1RSSU5HX0xFTihzdHIpXSA9ICdcMCc7CisJRU5DX0NPREVSQU5HRV9T RVQoc3RyLCBjcik7CiAJcmV0dXJuIHN0cjsKICAgICB9CiAgICAgcmV0dXJuIFFu aWw7CkBAIC01NjA4LDI4ICs1ODI3LDM5IEBACiAgICAgY2hhciAqcywgKnQsICpl OwogICAgIGludCBzcGFjZV9zZWVuID0gUWZhbHNlOwogCi0gICAgcmJfc3RyX21v ZGlmeShzdHIpOwotICAgIGVuYyA9IFNUUl9FTkNfR0VUKHN0cik7CiAgICAgcyA9 IFJTVFJJTkdfUFRSKHN0cik7CiAgICAgaWYgKCFzIHx8IFJTVFJJTkdfTEVOKHN0 cikgPT0gMCkgcmV0dXJuIFFuaWw7CiAgICAgdCA9IGUgPSBSU1RSSU5HX0VORChz dHIpOwotICAgIHdoaWxlIChzIDwgZSkgewotCWludCBjYyA9IHJiX2VuY19jb2Rl cG9pbnQocywgZSwgZW5jKTsKKyAgICBlbmMgPSBTVFJfRU5DX0dFVChzdHIpOwor ICAgIGlmIChyYl9lbmNfYXNjaWljb21wYXQoZW5jKSkgeworCS8qIEFzc3VtZSBh bGwgc3BhY2UgY2hhcnMgYXJlIHNpbmdsZSBieXRlICovCisgICAgICAgIHdoaWxl ICh0ID4gcykgeworCSAgICBpZiAoIXJiX2VuY19pc3NwYWNlKCoodC0xKSAmIDB4 ZmYsIGVuYykpIGJyZWFrOworCSAgICB0LS07CisJfQorICAgIH0KKyAgICBlbHNl IHsKKwl3aGlsZSAocyA8IGUpIHsKKwkgICAgaW50IGNjID0gcmJfZW5jX2NvZGVw b2ludChzLCBlLCBlbmMpOwogCi0JaWYgKCFjYyB8fCByYl9lbmNfaXNzcGFjZShj YywgZW5jKSkgewotCSAgICBpZiAoIXNwYWNlX3NlZW4pIHQgPSBzOwotCSAgICBz cGFjZV9zZWVuID0gUXRydWU7CisJICAgIGlmICghY2MgfHwgcmJfZW5jX2lzc3Bh Y2UoY2MsIGVuYykpIHsKKwkJaWYgKCFzcGFjZV9zZWVuKSB0ID0gczsKKwkJc3Bh Y2Vfc2VlbiA9IFF0cnVlOworCSAgICB9CisJICAgIGVsc2UgeworCQlzcGFjZV9z ZWVuID0gUWZhbHNlOworCSAgICB9CisJICAgIHMgKz0gcmJfZW5jX2NvZGVsZW4o Y2MsIGVuYyk7CiAJfQotCWVsc2UgewotCSAgICBzcGFjZV9zZWVuID0gUWZhbHNl OwotCX0KLQlzICs9IHJiX2VuY19jb2RlbGVuKGNjLCBlbmMpOworCWlmICghc3Bh Y2Vfc2VlbikgdCA9IHM7CiAgICAgfQotICAgIGlmICghc3BhY2Vfc2VlbikgdCA9 IHM7CiAgICAgaWYgKHQgPCBlKSB7CisJaW50IGNyID0gRU5DX0NPREVSQU5HRShz dHIpOworCiAJcmJfc3RyX21vZGlmeShzdHIpOwogCVNUUl9TRVRfTEVOKHN0ciwg dC1SU1RSSU5HX1BUUihzdHIpKTsKIAlSU1RSSU5HX1BUUihzdHIpW1JTVFJJTkdf TEVOKHN0cildID0gJ1wwJzsKKwlFTkNfQ09ERVJBTkdFX1NFVChzdHIsIGNyKTsK IAlyZXR1cm4gc3RyOwogICAgIH0KICAgICByZXR1cm4gUW5pbDsKQEAgLTYwMTEs NyArNjI0MSw3IEBACiAgICAgY29uc3QgY2hhciAqZiA9ICIgIjsKICAgICBsb25n IG4sIGxsZW4sIHJsZW47CiAgICAgdm9sYXRpbGUgVkFMVUUgcGFkOwotICAgIGlu dCBzaW5nbGVieXRlID0gMTsKKyAgICBpbnQgc2luZ2xlYnl0ZSA9IDEsIGNyOwog CiAgICAgcmJfc2Nhbl9hcmdzKGFyZ2MsIGFyZ3YsICIxMSIsICZ3LCAmcGFkKTsK ICAgICBlbmMgPSBTVFJfRU5DX0dFVChzdHIpOwpAQCAtNjAzMiw2ICs2MjYyLDcg QEAKICAgICBuID0gd2lkdGggLSBsZW47CiAgICAgbGxlbiA9IChqZmxhZyA9PSAn bCcpID8gMCA6ICgoamZsYWcgPT0gJ3InKSA/IG4gOiBuLzIpOwogICAgIHJsZW4g PSBuIC0gbGxlbjsKKyAgICBjciA9IEVOQ19DT0RFUkFOR0Uoc3RyKTsKICAgICBy ZXMgPSByYl9zdHJfbmV3NShzdHIsIDAsIFJTVFJJTkdfTEVOKHN0cikrbipmbGVu L2ZjbGVuKzIpOwogICAgIHAgPSBSU1RSSU5HX1BUUihyZXMpOwogICAgIHdoaWxl IChsbGVuKSB7CkBAIC02MDc3LDYgKzYzMDgsMTAgQEAKICAgICBPQkpfSU5GRUNU KHJlcywgc3RyKTsKICAgICBpZiAoIU5JTF9QKHBhZCkpIE9CSl9JTkZFQ1QocmVz LCBwYWQpOwogICAgIHJiX2VuY19hc3NvY2lhdGUocmVzLCBlbmMpOworICAgIGlm IChhcmdjID09IDIpCisJRU5DX0NPREVSQU5HRV9TRVQocmVzLCBFTkNfQ09ERVJB TkdFX0FORChjciwgRU5DX0NPREVSQU5HRShwYWQpKSk7CisgICAgZWxzZQorCUVO Q19DT0RFUkFOR0VfU0VUKHJlcywgY3IpOwogICAgIHJldHVybiByZXM7CiB9CiAK QEAgLTY2NzcsNiArNjkxMiw3IEBACiAgICAgcmJfZGVmaW5lX21ldGhvZChyYl9j U3RyaW5nLCAibGluZXMiLCByYl9zdHJfZWFjaF9saW5lLCAtMSk7CiAgICAgcmJf ZGVmaW5lX21ldGhvZChyYl9jU3RyaW5nLCAiYnl0ZXMiLCByYl9zdHJfZWFjaF9i eXRlLCAwKTsKICAgICByYl9kZWZpbmVfbWV0aG9kKHJiX2NTdHJpbmcsICJjaGFy cyIsIHJiX3N0cl9lYWNoX2NoYXIsIDApOworICAgIHJiX2RlZmluZV9tZXRob2Qo cmJfY1N0cmluZywgImNvZGVwb2ludHMiLCByYl9zdHJfZWFjaF9jb2RlcG9pbnQs IDApOwogICAgIHJiX2RlZmluZV9tZXRob2QocmJfY1N0cmluZywgInJldmVyc2Ui LCByYl9zdHJfcmV2ZXJzZSwgMCk7CiAgICAgcmJfZGVmaW5lX21ldGhvZChyYl9j U3RyaW5nLCAicmV2ZXJzZSEiLCByYl9zdHJfcmV2ZXJzZV9iYW5nLCAwKTsKICAg ICByYl9kZWZpbmVfbWV0aG9kKHJiX2NTdHJpbmcsICJjb25jYXQiLCByYl9zdHJf Y29uY2F0LCAxKTsKQEAgLTY3MjYsNiArNjk2Miw3IEBACiAgICAgcmJfZGVmaW5l X21ldGhvZChyYl9jU3RyaW5nLCAiZWFjaF9saW5lIiwgcmJfc3RyX2VhY2hfbGlu ZSwgLTEpOwogICAgIHJiX2RlZmluZV9tZXRob2QocmJfY1N0cmluZywgImVhY2hf Ynl0ZSIsIHJiX3N0cl9lYWNoX2J5dGUsIDApOwogICAgIHJiX2RlZmluZV9tZXRo b2QocmJfY1N0cmluZywgImVhY2hfY2hhciIsIHJiX3N0cl9lYWNoX2NoYXIsIDAp OworICAgIHJiX2RlZmluZV9tZXRob2QocmJfY1N0cmluZywgImVhY2hfY29kZXBv aW50IiwgcmJfc3RyX2VhY2hfY29kZXBvaW50LCAwKTsKIAogICAgIHJiX2RlZmlu ZV9tZXRob2QocmJfY1N0cmluZywgInN1bSIsIHJiX3N0cl9zdW0sIC0xKTsK ------------g5GbeeAZHcGGXrCS0iBFbm--