LyoKICpDb3B5cmlnaHQoYykyMDA0LENpc2NvIFVSUCBpbWJ1cnNlcyBhbmQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIgaW4gQmVpamluZyBVbml2ZXJzaXR5IG9mIFBvc3RzIGFuZCBUZWxlY29tbXVuaWNhdGlvbnMgcmVzZWFyY2hlcy4KICoKICpBbGwgcmlnaHQgcmVzZXJ2ZWQKICoKICpGaWxlIE5hbWU6bG9va3VwQ3RsVGFibGUuYwogKkZpbGUgRGVzY3JpcHRpb246Um93cyBvZiB0aGUgbG9va3VwQ3RsVGFibGUgTUlCIGFkZCAsIGRlbGV0ZSBhbmQgcmVhZC5Sb3dzIG9mIGxvb2t1cFJlc3VsdHNUYWJsZQogKiAgICAgICAgICAgICAgTUlCIGFkZCBhbmQgZGVsZXRlLgogCiAqCiAqQ3VycmVudCBWZXJzaW9uOjEuMAogKkF1dGhvcjpDaGVuSmluZwogKkRhdGU6MjAwNC44LjIwCiAqLwoKLyoKICogVGhpcyBzaG91bGQgYWx3YXlzIGJlIGluY2x1ZGVkIGZpcnN0IGJlZm9yZSBhbnl0aGluZyBlbHNlIAogKi8KI2lmIEhBVkVfU1RETElCX0gKI2luY2x1ZGUgPHN0ZGxpYi5oPgojZW5kaWYKI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKI2lmZGVmIEhBVkVfTElNSVRTX0gKI2luY2x1ZGUgPGxpbWl0cy5oPgojZW5kaWYKCiNpbmNsdWRlIDxuZXRkYi5oPgojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgoKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1pbmNsdWRlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvbmV0LXNubXAtYWdlbnQtaW5jbHVkZXMuaD4KCiNpbmNsdWRlICJsb29rdXBDdGxUYWJsZS5oIgojaW5jbHVkZSAibG9va3VwUmVzdWx0c1RhYmxlLmgiCiNpbmNsdWRlICJoZWFkZXJfY29tcGxleC5oIgoKLyoKICpGb3IgZGlzY29udGludWl0eSBjaGVja2luZy4KICovCgpvaWQgICAgICAgICAgICAgbG9va3VwQ3RsVGFibGVfdmFyaWFibGVzX29pZFtdID0KICAgIHsgMSwgMywgNiwgMSwgMiwgMSwgODIsIDEsIDMgfTsKCgpzdHJ1Y3QgdmFyaWFibGUyIGxvb2t1cEN0bFRhYmxlX3ZhcmlhYmxlc1tdID0gewogICAgLyoKICAgICAqIG1hZ2ljIG51bWJlciAgICAgICAgLCB2YXJpYWJsZSB0eXBlICwgcm8vcncgLCBjYWxsYmFjayBmbiAgLCBMLCBvaWRzdWZmaXggCiAgICAgKi8KICAgIHtDT0xVTU5fTE9PS1VQQ1RMVEFSR0VUQUREUkVTU1RZUEUsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX2xvb2t1cEN0bFRhYmxlLCAyLCB7MSwgM319LAogICAge0NPTFVNTl9MT09LVVBDVExUQVJHRVRBRERSRVNTLCAgIEFTTl9PQ1RFVF9TVFIsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICB2YXJfbG9va3VwQ3RsVGFibGUsIDIsIHsxLCA0fX0sCiAgICB7Q09MVU1OX0xPT0tVUENUTE9QRVJTVEFUVVMsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfbG9va3VwQ3RsVGFibGUsIDIsIHsxLCA1fX0sCiAgICB7Q09MVU1OX0xPT0tVUENUTFRJTUUsICAgICAgQVNOX1VOU0lHTkVELCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfbG9va3VwQ3RsVGFibGUsIDIsIHsxLCA2fX0sCiAgICB7Q09MVU1OX0xPT0tVUENUTFJDLCAgICAgICAgIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfbG9va3VwQ3RsVGFibGUsIDIsIHsxLCA3fX0sCiAgICB7Q09MVU1OX0xPT0tVUENUTFJPV1NUQVRVUywgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICB2YXJfbG9va3VwQ3RsVGFibGUsIDIsIHsxLCA4fX0KfTsKCgovKgogKiBnbG9iYWwgc3RvcmFnZSBvZiBvdXIgZGF0YSwgc2F2ZWQgaW4gYW5kIGNvbmZpZ3VyZWQgYnkgaGVhZGVyX2NvbXBsZXgoKSAKICovCgoKc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICpsb29rdXBDdGxUYWJsZVN0b3JhZ2UgPSBOVUxMOwpzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKmxvb2t1cFJlc3VsdHNUYWJsZVN0b3JhZ2UgPSBOVUxMOwoKaW50IG1vZGlmeV9sb29rdXBDdGxUaW1lKHN0cnVjdCBsb29rdXBUYWJsZV9kYXRhICp0aGVkYXRhLCB1bnNpZ25lZCBsb25nIHZhbCk7CmludCBtb2RpZnlfbG9va3VwQ3RsT3BlclN0YXR1cyhzdHJ1Y3QgbG9va3VwVGFibGVfZGF0YSAqdGhlZGF0YSwgbG9uZyB2YWwpOwppbnQgbW9kaWZ5X2xvb2t1cEN0bFJjKHN0cnVjdCBsb29rdXBUYWJsZV9kYXRhICp0aGVkYXRhLCBsb25nIHZhbCk7CgoKdm9pZAppbml0X2xvb2t1cEN0bFRhYmxlKHZvaWQpCnsKICAgIERFQlVHTVNHVEwoKCJsb29rdXBDdGxUYWJsZSIsICJpbml0aWFsaXppbmcuLi4gICIpKTsKICAgIC8qCiAgICAgKiByZWdpc3RlciBvdXJzZWx2ZXMgd2l0aCB0aGUgYWdlbnQgdG8gaGFuZGxlIG91ciBtaWIgdHJlZSAKICAgICAqLwogICAgUkVHSVNURVJfTUlCKCJsb29rdXBDdGxUYWJsZSIsIGxvb2t1cEN0bFRhYmxlX3ZhcmlhYmxlcywgdmFyaWFibGUyLAogICAgICAgICAgICAgICAgIGxvb2t1cEN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpOwoKCiAgICAvKgogICAgICogcmVnaXN0ZXIgb3VyIGNvbmZpZyBoYW5kbGVyKHMpIHRvIGRlYWwgd2l0aCByZWdpc3RyYXRpb25zIAogICAgICovCiAgICBzbm1wZF9yZWdpc3Rlcl9jb25maWdfaGFuZGxlcigibG9va3VwQ3RsVGFibGUiLCBwYXJzZV9sb29rdXBDdGxUYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOwoKICAgIC8qCiAgICAgKiB3ZSBuZWVkIHRvIGJlIGNhbGxlZCBiYWNrIGxhdGVyIHRvIHN0b3JlIG91ciBkYXRhIAogICAgICovCiAgICBzbm1wX3JlZ2lzdGVyX2NhbGxiYWNrKFNOTVBfQ0FMTEJBQ0tfTElCUkFSWSwgU05NUF9DQUxMQkFDS19TVE9SRV9EQVRBLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZV9sb29rdXBDdGxUYWJsZSwgTlVMTCk7CgogICAgREVCVUdNU0dUTCgoImxvb2t1cEN0bFRhYmxlIiwgImRvbmUuXG4iKSk7Cn0KCnN0cnVjdCBsb29rdXBUYWJsZV9kYXRhICoKY3JlYXRlX2xvb2t1cFRhYmxlX2RhdGEodm9pZCkKewogICAgc3RydWN0IGxvb2t1cFRhYmxlX2RhdGEgKlN0b3JhZ2VOZXcgPSBOVUxMOwogICAgU3RvcmFnZU5ldyA9IFNOTVBfTUFMTE9DX1NUUlVDVChsb29rdXBUYWJsZV9kYXRhKTsKICAgIGlmIChTdG9yYWdlTmV3ID09IE5VTEwpIHsKICAgICAgICBleGl0KDEpOwogICAgfQogICAgU3RvcmFnZU5ldy0+bG9va3VwQ3RsVGFyZ2V0QWRkcmVzcyA9IHN0cmR1cCgiIik7CiAgICBTdG9yYWdlTmV3LT5sb29rdXBDdGxUYXJnZXRBZGRyZXNzTGVuID0gMDsKICAgIFN0b3JhZ2VOZXctPmxvb2t1cEN0bE9wZXJTdGF0dXMgPSAybDsKICAgIFN0b3JhZ2VOZXctPmxvb2t1cEN0bFRpbWUgPSAwOwogICAgU3RvcmFnZU5ldy0+c3RvcmFnZXR5cGUgPSBTVF9OT05WT0xBVElMRTsKICAgIHJldHVybiBTdG9yYWdlTmV3Owp9CgovKgogKiBsb29rdXBDdGxUYWJsZV9hZGQoKTogYWRkcyBhIHN0cnVjdHVyZSBub2RlIHRvIG91ciBkYXRhIHNldCAKICovCmludApsb29rdXBDdGxUYWJsZV9hZGQoc3RydWN0IGxvb2t1cFRhYmxlX2RhdGEgKnRoZWRhdGEpCnsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFycyA9IE5VTEw7CgoKICAgIERFQlVHTVNHVEwoKCJsb29rdXBDdGxUYWJsZSIsICJhZGRpbmcgZGF0YS4uLiAgIikpOwogICAgLyoKICAgICAqIGFkZCB0aGUgaW5kZXggdmFyaWFibGVzIHRvIHRoZSB2YXJiaW5kIGxpc3QsIHdoaWNoIGlzIAogICAgICogdXNlZCBieSBoZWFkZXJfY29tcGxleCB0byBpbmRleCB0aGUgZGF0YSAKICAgICAqLwoKCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT5sb29rdXBDdGxPd25lckluZGV4LCB0aGVkYXRhLT5sb29rdXBDdGxPd25lckluZGV4TGVuKTsgICAvKiBsb29rdXBDdGxPd25lckluZGV4ICovCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lLCB0aGVkYXRhLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lTGVuKTsgICAgIC8qIGxvb2t1cEN0bE9wZXJhdGlvbk5hbWUgKi8KCgogICAgaWYgKGhlYWRlcl9jb21wbGV4X2FkZF9kYXRhKCZsb29rdXBDdGxUYWJsZVN0b3JhZ2UsIHZhcnMsIHRoZWRhdGEpID09CiAgICAgICAgTlVMTCkgewogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgIH0KICAgIERFQlVHTVNHVEwoKCJsb29rdXBDdGxUYWJsZSIsICJyZWdpc3RlcmVkIGFuIGVudHJ5XG4iKSk7CiAgICB2YXJzID0gTlVMTDsKCiAgICBERUJVR01TR1RMKCgibG9va3VwQ3RsVGFibGUiLCAiZG9uZS5cbiIpKTsKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCmludApsb29rdXBSZXN1bHRzVGFibGVfYWRkKHN0cnVjdCBsb29rdXBUYWJsZV9kYXRhICp0aGVkYXRhKQp7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnNfbGlzdCA9IE5VTEw7CiAgICBzdHJ1Y3QgbG9va3VwUmVzdWx0c1RhYmxlX2RhdGEgKnAgPSBOVUxMOwogICAgcCA9IHRoZWRhdGEtPlJlc3VsdHNUYWJsZTsKICAgIGlmICh0aGVkYXRhLT5SZXN1bHRzVGFibGUgIT0gTlVMTCkKICAgICAgICBkbyB7CiAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfbGlzdCwgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgcC0+bG9va3VwQ3RsT3duZXJJbmRleCwgcC0+bG9va3VwQ3RsT3duZXJJbmRleExlbik7ICAvKiBsb29rdXBDdGxPd25lckluZGV4ICovCiAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfbGlzdCwgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgcC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZSwgcC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZUxlbik7ICAgIC8qIGxvb2t1cEN0bE9wZXJhdGlvbk5hbWUgKi8KICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19saXN0LCBOVUxMLCAwLCBBU05fVU5TSUdORUQsIChjaGFyICopICZwLT5sb29rdXBSZXN1bHRzSW5kZXgsIHNpemVvZihwLT5sb29rdXBSZXN1bHRzSW5kZXgpKTsgICAgICAgLyogbG9va3VwUmVzdWx0c0luZGV4ICovCgoKICAgICAgICAgICAgREVCVUdNU0dUTCgoImxvb2t1cFJlc3VsdHNUYWJsZSIsICJhZGRpbmcgZGF0YS4uLiAgIikpOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBhZGQgdGhlIGluZGV4IHZhcmlhYmxlcyB0byB0aGUgdmFyYmluZCBsaXN0LCB3aGljaCBpcyAKICAgICAgICAgICAgICogdXNlZCBieSBoZWFkZXJfY29tcGxleCB0byBpbmRleCB0aGUgZGF0YSAKICAgICAgICAgICAgICovCgogICAgICAgICAgICBpZiAoaGVhZGVyX2NvbXBsZXhfYWRkX2RhdGEKICAgICAgICAgICAgICAgICgmbG9va3VwUmVzdWx0c1RhYmxlU3RvcmFnZSwgdmFyc19saXN0LCBwKSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJsb29rdXBSZXN1bHRzVGFibGUiLCAib3V0IGZpbmlzaGVkXG4iKSk7CiAgICAgICAgICAgIHZhcnNfbGlzdCA9IE5VTEw7CiAgICAgICAgICAgIHAgPSBwLT5uZXh0OwogICAgICAgIH0gd2hpbGUgKHAgIT0gTlVMTCk7CgoKICAgIERFQlVHTVNHVEwoKCJsb29rdXBSZXN1bHRzVGFibGUiLCAiZG9uZS5cbiIpKTsKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCnZvaWQKbG9va3VwQ3RsVGFibGVfY2xlYW5lcihzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKnRoZXN0dWZmKQp7CiAgICBzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKmhjaXB0ciA9IE5VTEw7CiAgICBzdHJ1Y3QgbG9va3VwVGFibGVfZGF0YSAqU3RvcmFnZURlbCA9IE5VTEw7CiAgICBERUJVR01TR1RMKCgibG9va3VwQ3RsVGFibGUiLCAiY2xlYW5lcm91dCAgIikpOwogICAgZm9yIChoY2lwdHIgPSB0aGVzdHVmZjsgaGNpcHRyICE9IE5VTEw7IGhjaXB0ciA9IGhjaXB0ci0+bmV4dCkgewogICAgICAgIFN0b3JhZ2VEZWwgPQogICAgICAgICAgICBoZWFkZXJfY29tcGxleF9leHRyYWN0X2VudHJ5KCZsb29rdXBDdGxUYWJsZVN0b3JhZ2UsIGhjaXB0cik7CiAgICAgICAgaWYgKFN0b3JhZ2VEZWwgIT0gTlVMTCkgewogICAgICAgICAgICBmcmVlKFN0b3JhZ2VEZWwtPmxvb2t1cEN0bE93bmVySW5kZXgpOwogICAgICAgICAgICBTdG9yYWdlRGVsLT5sb29rdXBDdGxPd25lckluZGV4ID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lKTsKICAgICAgICAgICAgU3RvcmFnZURlbC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZSA9IE5VTEw7CiAgICAgICAgICAgIGZyZWUoU3RvcmFnZURlbC0+bG9va3VwQ3RsVGFyZ2V0QWRkcmVzcyk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPmxvb2t1cEN0bFRhcmdldEFkZHJlc3MgPSBOVUxMOwogICAgICAgICAgICBmcmVlKFN0b3JhZ2VEZWwpOwogICAgICAgICAgICBTdG9yYWdlRGVsID0gTlVMTDsKCiAgICAgICAgfQogICAgICAgIERFQlVHTVNHVEwoKCJsb29rdXBDdGxUYWJsZSIsICJjbGVhbmVyICAiKSk7CiAgICB9Cn0KCi8qCiAqIHBhcnNlX2xvb2t1cEN0bFRhYmxlKCk6CiAqICAgcGFyc2VzIC5jb25mIGZpbGUgZW50cmllcyBuZWVkZWQgdG8gY29uZmlndXJlIHRoZSBtaWIuCiAqLwp2b2lkCnBhcnNlX2xvb2t1cEN0bFRhYmxlKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpsaW5lKQp7CiAgICBzaXplX3QgICAgICAgICAgdG1waW50OwogICAgc3RydWN0IGxvb2t1cFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPQogICAgICAgIFNOTVBfTUFMTE9DX1NUUlVDVChsb29rdXBUYWJsZV9kYXRhKTsKCiAgICBERUJVR01TR1RMKCgibG9va3VwQ3RsVGFibGUiLCAicGFyc2luZyBjb25maWcuLi4gICIpKTsKCgogICAgaWYgKFN0b3JhZ2VUbXAgPT0gTlVMTCkgewogICAgICAgIGNvbmZpZ19wZXJyb3IoIm1hbGxvYyBmYWlsdXJlIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX09DVEVUX1NUUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPmxvb2t1cEN0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT5sb29rdXBDdGxPd25lckluZGV4TGVuKTsKICAgIGlmIChTdG9yYWdlVG1wLT5sb29rdXBDdGxPd25lckluZGV4ID09IE5VTEwpIHsKICAgICAgICBjb25maWdfcGVycm9yKCJpbnZhbGlkIHNwZWNpZmljYXRpb24gZm9yIGxvb2t1cEN0bE93bmVySW5kZXgiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9PQ1RFVF9TVFIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZUxlbik7CiAgICBpZiAoU3RvcmFnZVRtcC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZSA9PSBOVUxMKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigiaW52YWxpZCBzcGVjaWZpY2F0aW9uIGZvciBsb29rdXBDdGxPcGVyYXRpb25OYW1lIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fSU5URUdFUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPmxvb2t1cEN0bFRhcmdldEFkZHJlc3NUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX09DVEVUX1NUUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPmxvb2t1cEN0bFRhcmdldEFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT5sb29rdXBDdGxUYXJnZXRBZGRyZXNzTGVuKTsKICAgIGlmIChTdG9yYWdlVG1wLT5sb29rdXBDdGxUYXJnZXRBZGRyZXNzID09IE5VTEwpIHsKICAgICAgICBjb25maWdfcGVycm9yKCJpbnZhbGlkIHNwZWNpZmljYXRpb24gZm9yIGxvb2t1cEN0bFRhcmdldEFkZHJlc3MiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9JTlRFR0VSLCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+bG9va3VwQ3RsT3BlclN0YXR1cywgJnRtcGludCk7CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9VTlNJR05FRCwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPmxvb2t1cEN0bFRpbWUsICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fSU5URUdFUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPmxvb2t1cEN0bFJjLCAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX0lOVEVHRVIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT5sb29rdXBDdGxSb3dTdGF0dXMsICZ0bXBpbnQpOwoKCiAgICBTdG9yYWdlVG1wLT5zdG9yYWdldHlwZSA9IFNUX05PTlZPTEFUSUxFOwogICAgbG9va3VwQ3RsVGFibGVfYWRkKFN0b3JhZ2VUbXApOwogICAgLyogbG9va3VwQ3RsVGFibGVfY2xlYW5lcihsb29rdXBDdGxUYWJsZVN0b3JhZ2UpOyAqLwoKICAgIERFQlVHTVNHVEwoKCJsb29rdXBDdGxUYWJsZSIsICJkb25lLlxuIikpOwp9CgoKCi8qCiAqIHN0b3JlX2xvb2t1cEN0bFRhYmxlKCk6CiAqICAgc3RvcmVzIC5jb25mIGZpbGUgZW50cmllcyBuZWVkZWQgdG8gY29uZmlndXJlIHRoZSBtaWIuCiAqLwppbnQKc3RvcmVfbG9va3VwQ3RsVGFibGUoaW50IG1ham9ySUQsIGludCBtaW5vcklELCB2b2lkICpzZXJ2ZXJhcmcsCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNsaWVudGFyZykKewogICAgY2hhciAgICAgICAgICAgIGxpbmVbU05NUF9NQVhCVUZdOwogICAgY2hhciAgICAgICAgICAgKmNwdHI7CiAgICBzaXplX3QgICAgICAgICAgdG1waW50OwogICAgc3RydWN0IGxvb2t1cFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXA7CiAgICBzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKmhjaW5kZXg7CgoKICAgIERFQlVHTVNHVEwoKCJsb29rdXBDdGxUYWJsZSIsICJzdG9yaW5nIGRhdGEuLi4gICIpKTsKCgogICAgZm9yIChoY2luZGV4ID0gbG9va3VwQ3RsVGFibGVTdG9yYWdlOyBoY2luZGV4ICE9IE5VTEw7CiAgICAgICAgIGhjaW5kZXggPSBoY2luZGV4LT5uZXh0KSB7CiAgICAgICAgU3RvcmFnZVRtcCA9IChzdHJ1Y3QgbG9va3VwVGFibGVfZGF0YSAqKSBoY2luZGV4LT5kYXRhOwoKICAgICAgICBpZiAoU3RvcmFnZVRtcC0+c3RvcmFnZXR5cGUgIT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICAgICAgbWVtc2V0KGxpbmUsIDAsIHNpemVvZihsaW5lKSk7CiAgICAgICAgICAgIHN0cmNhdChsaW5lLCAibG9va3VwQ3RsVGFibGUgIik7CiAgICAgICAgICAgIGNwdHIgPSBsaW5lICsgc3RybGVuKGxpbmUpOwoKCiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fT0NURVRfU1RSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+bG9va3VwQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBDdGxPd25lckluZGV4TGVuKTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9PQ1RFVF9TVFIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cEN0bE9wZXJhdGlvbk5hbWVMZW4pOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX0lOVEVHRVIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwQ3RsVGFyZ2V0QWRkcmVzc1R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX09DVEVUX1NUUiwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPmxvb2t1cEN0bFRhcmdldEFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwQ3RsVGFyZ2V0QWRkcmVzc0xlbik7CgogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX0lOVEVHRVIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT5sb29rdXBDdGxPcGVyU3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9VTlNJR05FRCwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPmxvb2t1cEN0bFRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX0lOVEVHRVIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT5sb29rdXBDdGxSYywgJnRtcGludCk7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fSU5URUdFUiwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPmxvb2t1cEN0bFJvd1N0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CgoKCiAgICAgICAgICAgIHNubXBkX3N0b3JlX2NvbmZpZyhsaW5lKTsKICAgICAgICB9CiAgICB9CiAgICBERUJVR01TR1RMKCgibG9va3VwQ3RsVGFibGUiLCAiZG9uZS5cbiIpKTsKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCgoKCi8qCiAqIHZhcl9sb29rdXBDdGxUYWJsZSgpOgogKiAgIEhhbmRsZSB0aGlzIHRhYmxlIHNlcGFyYXRlbHkgZnJvbSB0aGUgc2NhbGFyIHZhbHVlIGNhc2UuCiAqICAgVGhlIHdvcmtpbmdzIG9mIHRoaXMgYXJlIGJhc2ljYWxseSB0aGUgc2FtZSBhcyBmb3IgdmFyX210ZU9iamVjdHNUYWJsZSBhYm92ZS4KICovCnVuc2lnbmVkIGNoYXIgICoKdmFyX2xvb2t1cEN0bFRhYmxlKHN0cnVjdCB2YXJpYWJsZSAqdnAsCiAgICAgICAgICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgICAgc2l6ZV90ICpsZW5ndGgsCiAgICAgICAgICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CgoKICAgIHN0cnVjdCBsb29rdXBUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKCiAgICAvKgogICAgICogdGhpcyBhc3N1bWVzIHlvdSBoYXZlIHJlZ2lzdGVyZWQgYWxsIHlvdXIgZGF0YSBwcm9wZXJseQogICAgICovCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleChsb29rdXBDdGxUYWJsZVN0b3JhZ2UsIHZwLCBuYW1lLCBsZW5ndGgsIGV4YWN0LAogICAgICAgICAgICAgICAgICAgICAgICB2YXJfbGVuLCB3cml0ZV9tZXRob2QpKSA9PSBOVUxMKSB7CiAgICAgICAgaWYgKHZwLT5tYWdpYyA9PSBDT0xVTU5fTE9PS1VQQ1RMUk9XU1RBVFVTKQogICAgICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfbG9va3VwQ3RsUm93U3RhdHVzOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIC8qCiAgICAgKiB0aGlzIGlzIHdoZXJlIHdlIGRvIHRoZSB2YWx1ZSBhc3NpZ25tZW50cyBmb3IgdGhlIG1pYiByZXN1bHRzLgogICAgICovCiAgICBzd2l0Y2ggKHZwLT5tYWdpYykgewoKCiAgICBjYXNlIENPTFVNTl9MT09LVVBDVExUQVJHRVRBRERSRVNTVFlQRToKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfbG9va3VwQ3RsVGFyZ2V0QWRkcmVzc1R5cGU7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+bG9va3VwQ3RsVGFyZ2V0QWRkcmVzc1R5cGUpOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgU3RvcmFnZVRtcC0+bG9va3VwQ3RsVGFyZ2V0QWRkcmVzc1R5cGU7CgogICAgY2FzZSBDT0xVTU5fTE9PS1VQQ1RMVEFSR0VUQUREUkVTUzoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfbG9va3VwQ3RsVGFyZ2V0QWRkcmVzczsKICAgICAgICAqdmFyX2xlbiA9IChTdG9yYWdlVG1wLT5sb29rdXBDdGxUYXJnZXRBZGRyZXNzTGVuKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgU3RvcmFnZVRtcC0+bG9va3VwQ3RsVGFyZ2V0QWRkcmVzczsKCiAgICBjYXNlIENPTFVNTl9MT09LVVBDVExPUEVSU1RBVFVTOgogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPmxvb2t1cEN0bE9wZXJTdGF0dXMpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPmxvb2t1cEN0bE9wZXJTdGF0dXM7CgogICAgY2FzZSBDT0xVTU5fTE9PS1VQQ1RMVElNRToKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihTdG9yYWdlVG1wLT5sb29rdXBDdGxUaW1lKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT5sb29rdXBDdGxUaW1lOwoKICAgIGNhc2UgQ09MVU1OX0xPT0tVUENUTFJDOgogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPmxvb2t1cEN0bFJjKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT5sb29rdXBDdGxSYzsKCiAgICBjYXNlIENPTFVNTl9MT09LVVBDVExST1dTVEFUVVM6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX2xvb2t1cEN0bFJvd1N0YXR1czsKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihTdG9yYWdlVG1wLT5sb29rdXBDdGxSb3dTdGF0dXMpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPmxvb2t1cEN0bFJvd1N0YXR1czsKCiAgICBkZWZhdWx0OgogICAgICAgIEVSUk9SX01TRygiIik7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKCnZvaWQKcnVuX2xvb2t1cChzdHJ1Y3QgbG9va3VwVGFibGVfZGF0YSAqaXRlbSkKewoKICAgIGxvbmcgICAgICAgICAgICBhZGRyZXNzVHlwZTsKICAgIGNoYXIgICAgICAgICAgICphZGRyZXNzID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBhZGRyZXNzbGVuOwogICAgc3RydWN0IGxvb2t1cFJlc3VsdHNUYWJsZV9kYXRhICpjdXJyZW50ID0gTlVMTDsKICAgIHN0cnVjdCBsb29rdXBSZXN1bHRzVGFibGVfZGF0YSAqdGVtcCA9IE5VTEw7CiAgICBpbnQgICAgICAgICAgICAgaSA9IDAsIG4gPSAxLCB0ID0gMDsKCiAgICAvKiBmb3IgaXB2NCxpcHY2ICovCiAgICB1bnNpZ25lZCBpbnQgICAgYWRkcl9pbiwgYWRkcl9pbjY7CiAgICBzdHJ1Y3QgaG9zdGVudCAqbG9va3VwID0gTlVMTDsKCiAgICBzdHJ1Y3QgdGltZXZhbCAgdHBzdGFydCwgdHBlbmQ7CiAgICB1bnNpZ25lZCBsb25nICAgdGltZXVzZSwgdGltZXVzZTQsIHRpbWV1c2U2OwoKICAgIC8qIGZvciBkbnMgKi8KCiAgICBzdHJ1Y3QgaW5fYWRkciAgYTsKICAgIHN0cnVjdCBpbjZfYWRkciBhNjsKCiAgICBpZiAoaXRlbSA9PSBOVUxMKQogICAgICAgIHJldHVybjsKCiAgICBhZGRyZXNzVHlwZSA9IChsb25nKSBpdGVtLT5sb29rdXBDdGxUYXJnZXRBZGRyZXNzVHlwZTsKICAgIGFkZHJlc3NsZW4gPSAoc2l6ZV90KSBpdGVtLT5sb29rdXBDdGxUYXJnZXRBZGRyZXNzTGVuOwogICAgYWRkcmVzcyA9IChjaGFyICopIG1hbGxvYyhhZGRyZXNzbGVuICsgMSk7CiAgICBtZW1jcHkoYWRkcmVzcywgaXRlbS0+bG9va3VwQ3RsVGFyZ2V0QWRkcmVzcywgYWRkcmVzc2xlbiArIDEpOwogICAgYWRkcmVzc1thZGRyZXNzbGVuXSA9ICdcMCc7CgogICAgaWYgKGFkZHJlc3NUeXBlID09IDEpIHsKICAgICAgICBhZGRyX2luID0gaW5ldF9hZGRyKGFkZHJlc3MpOwogICAgICAgIGlmIChhZGRyX2luID09IDB4ZmZmZmZmZmYKICAgICAgICAgICAgJiYgc3RyY21wKGFkZHJlc3MsICIyNTUuMjU1LjI1NS4yNTUiKSAhPSAwKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJsb29rdXBSZXN1bHRzVGFibGUiLCAiSW52YWxpZCBhcmd1bWVudDogJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgZ2V0dGltZW9mZGF5KCZ0cHN0YXJ0LCBOVUxMKTsKICAgICAgICBsb29rdXAgPSBnZXRob3N0YnlhZGRyKChjaGFyICopICZhZGRyX2luLCA0LCBBRl9JTkVUKTsKICAgICAgICBnZXR0aW1lb2ZkYXkoJnRwZW5kLCBOVUxMKTsKICAgICAgICB0aW1ldXNlID0gMTAwMDAwMCAqICh0cGVuZC50dl9zZWMgLSB0cHN0YXJ0LnR2X3NlYykgKwogICAgICAgICAgICB0cGVuZC50dl91c2VjIC0gdHBzdGFydC50dl91c2VjOwogICAgICAgIHRpbWV1c2UgLz0gMTAwMDsKICAgICAgICBtb2RpZnlfbG9va3VwQ3RsVGltZShpdGVtLCB0aW1ldXNlKTsKICAgICAgICBtb2RpZnlfbG9va3VwQ3RsT3BlclN0YXR1cyhpdGVtLCAzbCk7CgogICAgICAgIGlmIChsb29rdXAgPT0gTlVMTCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgibG9va3VwQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgZ2V0IGEgbmV0d29yayBob3N0IGVudHJ5IGZvciBpcHY0IGFkZHJlc3M6ICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzKSk7CiAgICAgICAgICAgIG1vZGlmeV9sb29rdXBDdGxSYyhpdGVtLCAxbCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtb2RpZnlfbG9va3VwQ3RsUmMoaXRlbSwgMGwpOwogICAgICAgICAgICBpZiAobG9va3VwLT5oX25hbWUgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgY3VycmVudCA9IHRlbXAgPQogICAgICAgICAgICAgICAgICAgIFNOTVBfTUFMTE9DX1NUUlVDVChsb29rdXBSZXN1bHRzVGFibGVfZGF0YSk7CiAgICAgICAgICAgICAgICBpZiAodGVtcCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cFJlc3VsdHNJbmRleCA9IG47CgogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwQ3RsT3duZXJJbmRleCA9CiAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKGl0ZW0tPmxvb2t1cEN0bE93bmVySW5kZXhMZW4gKyAxKTsKICAgICAgICAgICAgICAgIGlmICh0ZW1wLT5sb29rdXBDdGxPd25lckluZGV4ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWVtY3B5KHRlbXAtPmxvb2t1cEN0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+bG9va3VwQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5sb29rdXBDdGxPd25lckluZGV4TGVuICsgMSk7CiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBDdGxPd25lckluZGV4W2l0ZW0tPmxvb2t1cEN0bE93bmVySW5kZXhMZW5dID0KICAgICAgICAgICAgICAgICAgICAnXDAnOwogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwQ3RsT3duZXJJbmRleExlbiA9CiAgICAgICAgICAgICAgICAgICAgaXRlbS0+bG9va3VwQ3RsT3duZXJJbmRleExlbjsKCiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lID0KICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2MoaXRlbS0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZUxlbiArIDEpOwogICAgICAgICAgICAgICAgaWYgKHRlbXAtPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWUgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtZW1jcHkodGVtcC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lLAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWVMZW4gKyAxKTsKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWVbaXRlbS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cEN0bE9wZXJhdGlvbk5hbWVMZW5dID0KICAgICAgICAgICAgICAgICAgICAnXDAnOwogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZUxlbiA9CiAgICAgICAgICAgICAgICAgICAgaXRlbS0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZUxlbjsKCiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBSZXN1bHRzQWRkcmVzc1R5cGUgPSAxNjsKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cFJlc3VsdHNBZGRyZXNzID0KICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2Moc3RybGVuKGxvb2t1cC0+aF9uYW1lKSArIDEpOwogICAgICAgICAgICAgICAgbWVtY3B5KHRlbXAtPmxvb2t1cFJlc3VsdHNBZGRyZXNzLCBsb29rdXAtPmhfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4obG9va3VwLT5oX25hbWUpICsgMSk7CiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBSZXN1bHRzQWRkcmVzc1tzdHJsZW4obG9va3VwLT5oX25hbWUpXSA9ICdcMCc7CiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBSZXN1bHRzQWRkcmVzc0xlbiA9IHN0cmxlbihsb29rdXAtPmhfbmFtZSk7CiAgICAgICAgICAgICAgICBpdGVtLT5SZXN1bHRzVGFibGUgPSB0ZW1wOwogICAgICAgICAgICAgICAgbiA9IG4gKyAxOwoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaSA9IDA7CiAgICAgICAgICAgIHdoaWxlIChsb29rdXAtPmhfYWxpYXNlc1tpXSkgewogICAgICAgICAgICAgICAgdGVtcCA9IFNOTVBfTUFMTE9DX1NUUlVDVChsb29rdXBSZXN1bHRzVGFibGVfZGF0YSk7CiAgICAgICAgICAgICAgICBpZiAodGVtcCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cEN0bE93bmVySW5kZXggPQogICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhpdGVtLT5sb29rdXBDdGxPd25lckluZGV4TGVuICsgMSk7CiAgICAgICAgICAgICAgICBpZiAodGVtcC0+bG9va3VwQ3RsT3duZXJJbmRleCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1lbWNweSh0ZW1wLT5sb29rdXBDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPmxvb2t1cEN0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+bG9va3VwQ3RsT3duZXJJbmRleExlbiArIDEpOwogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwQ3RsT3duZXJJbmRleFtpdGVtLT5sb29rdXBDdGxPd25lckluZGV4TGVuXSA9CiAgICAgICAgICAgICAgICAgICAgJ1wwJzsKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cEN0bE93bmVySW5kZXhMZW4gPQogICAgICAgICAgICAgICAgICAgIGl0ZW0tPmxvb2t1cEN0bE93bmVySW5kZXhMZW47CgogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZSA9CiAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKGl0ZW0tPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWVMZW4gKyAxKTsKICAgICAgICAgICAgICAgIGlmICh0ZW1wLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWVtY3B5KHRlbXAtPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lTGVuICsgMSk7CiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lW2l0ZW0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBDdGxPcGVyYXRpb25OYW1lTGVuXSA9CiAgICAgICAgICAgICAgICAgICAgJ1wwJzsKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWVMZW4gPQogICAgICAgICAgICAgICAgICAgIGl0ZW0tPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWVMZW47CgogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwUmVzdWx0c0luZGV4ID0gbjsKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cFJlc3VsdHNBZGRyZXNzVHlwZSA9IDE2OwogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwUmVzdWx0c0FkZHJlc3MgPQogICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhzdHJsZW4obG9va3VwLT5oX2FsaWFzZXNbaV0pICsgMSk7CiAgICAgICAgICAgICAgICBtZW1jcHkodGVtcC0+bG9va3VwUmVzdWx0c0FkZHJlc3MsIGxvb2t1cC0+aF9hbGlhc2VzW2ldLAogICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihsb29rdXAtPmhfYWxpYXNlc1tpXSkgKyAxKTsKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cFJlc3VsdHNBZGRyZXNzW3N0cmxlbihsb29rdXAtPmhfYWxpYXNlc1tpXSldID0KICAgICAgICAgICAgICAgICAgICAnXDAnOwogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwUmVzdWx0c0FkZHJlc3NMZW4gPQogICAgICAgICAgICAgICAgICAgIHN0cmxlbihsb29rdXAtPmhfYWxpYXNlc1tpXSk7CiAgICAgICAgICAgICAgICBjdXJyZW50LT5uZXh0ID0gdGVtcDsKICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0ZW1wOwogICAgICAgICAgICAgICAgaSA9IGkgKyAxOwogICAgICAgICAgICAgICAgbiA9IG4gKyAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGN1cnJlbnQtPm5leHQgPSBOVUxMOwoKICAgICAgICB9CgoKICAgICAgICBpZiAoaXRlbS0+UmVzdWx0c1RhYmxlICE9IE5VTEwpCiAgICAgICAgICAgIGlmIChsb29rdXBSZXN1bHRzVGFibGVfYWRkKGl0ZW0pICE9IFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJsb29rdXBSZXN1bHRzVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZ2lzdGVyZWQgYW4gZW50cnkgZXJyb3JcbiIpKTsKCiAgICAgICAgU05NUF9GUkVFKGFkZHJlc3MpOwogICAgICAgIGFkZHJlc3MgPSBOVUxMOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBlbHNlIGlmIChhZGRyZXNzVHlwZSA9PSAxNikgewoKICAgICAgICBnZXR0aW1lb2ZkYXkoJnRwc3RhcnQsIE5VTEwpOwogICAgICAgIGxvb2t1cCA9IGdldGhvc3RieW5hbWUoYWRkcmVzcyk7CiAgICAgICAgZ2V0dGltZW9mZGF5KCZ0cGVuZCwgTlVMTCk7CiAgICAgICAgdGltZXVzZTQgPSAxMDAwMDAwICogKHRwZW5kLnR2X3NlYyAtIHRwc3RhcnQudHZfc2VjKSArCiAgICAgICAgICAgIHRwZW5kLnR2X3VzZWMgLSB0cHN0YXJ0LnR2X3VzZWM7CiAgICAgICAgdGltZXVzZTQgLz0gMTAwMDsKICAgICAgICBpZiAobG9va3VwID09IE5VTEwpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoImxvb2t1cEN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IGdldCBhIG5ldHdvcmsgaG9zdCBlbnRyeSBmb3IgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3aGlsZSAoKmxvb2t1cC0+aF9hZGRyX2xpc3QpIHsKICAgICAgICAgICAgICAgIG1lbWNweSgmYSwgKmxvb2t1cC0+aF9hZGRyX2xpc3QrKywgc2l6ZW9mKGEpKTsKCiAgICAgICAgICAgICAgICB0ZW1wID0gU05NUF9NQUxMT0NfU1RSVUNUKGxvb2t1cFJlc3VsdHNUYWJsZV9kYXRhKTsKICAgICAgICAgICAgICAgIGlmICh0ZW1wID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwUmVzdWx0c0luZGV4ID0gbjsKCiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBDdGxPd25lckluZGV4ID0KICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2MoaXRlbS0+bG9va3VwQ3RsT3duZXJJbmRleExlbiArIDEpOwogICAgICAgICAgICAgICAgaWYgKHRlbXAtPmxvb2t1cEN0bE93bmVySW5kZXggPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtZW1jcHkodGVtcC0+bG9va3VwQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5sb29rdXBDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPmxvb2t1cEN0bE93bmVySW5kZXhMZW4gKyAxKTsKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cEN0bE93bmVySW5kZXhbaXRlbS0+bG9va3VwQ3RsT3duZXJJbmRleExlbl0gPQogICAgICAgICAgICAgICAgICAgICdcMCc7CiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBDdGxPd25lckluZGV4TGVuID0KICAgICAgICAgICAgICAgICAgICBpdGVtLT5sb29rdXBDdGxPd25lckluZGV4TGVuOwoKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWUgPQogICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhpdGVtLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lTGVuICsgMSk7CiAgICAgICAgICAgICAgICBpZiAodGVtcC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtZW1jcHkodGVtcC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lLAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWVMZW4gKyAxKTsKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWVbaXRlbS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cEN0bE9wZXJhdGlvbk5hbWVMZW5dID0KICAgICAgICAgICAgICAgICAgICAnXDAnOwogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZUxlbiA9CiAgICAgICAgICAgICAgICAgICAgaXRlbS0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZUxlbjsKCiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBSZXN1bHRzQWRkcmVzc1R5cGUgPSAxOwogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwUmVzdWx0c0FkZHJlc3MgPQogICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhzdHJsZW4oaW5ldF9udG9hKGEpKSArIDEpOwogICAgICAgICAgICAgICAgaWYgKHRlbXAtPmxvb2t1cFJlc3VsdHNBZGRyZXNzID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWVtY3B5KHRlbXAtPmxvb2t1cFJlc3VsdHNBZGRyZXNzLCBpbmV0X250b2EoYSksCiAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGluZXRfbnRvYShhKSkgKyAxKTsKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cFJlc3VsdHNBZGRyZXNzW3N0cmxlbihpbmV0X250b2EoYSkpXSA9ICdcMCc7CiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBSZXN1bHRzQWRkcmVzc0xlbiA9IHN0cmxlbihpbmV0X250b2EoYSkpOwogICAgICAgICAgICAgICAgaWYgKG4gPT0gMSkKICAgICAgICAgICAgICAgICAgICBpdGVtLT5SZXN1bHRzVGFibGUgPSB0ZW1wOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPm5leHQgPSB0ZW1wOwogICAgICAgICAgICAgICAgY3VycmVudCA9IHRlbXA7CiAgICAgICAgICAgICAgICBuID0gbiArIDE7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGN1cnJlbnQtPm5leHQgPSBOVUxMOwogICAgICAgICAgICB0ID0gbjsKCiAgICAgICAgfQoKICAgICAgICBzdHJ1Y3QgaG9zdGVudCAqaHA7CiAgICAgICAgY2hhciAgICAgICAgICAgIHBhWzY0XTsKICAgICAgICBjaGFyICAgICAgICAgICAqaG9zdG5hbWUgPSBOVUxMOwoKICAgICAgICBnZXR0aW1lb2ZkYXkoJnRwc3RhcnQsIE5VTEwpOwogICAgICAgIGhwID0gZ2V0aG9zdGJ5bmFtZTIoYWRkcmVzcywgQUZfSU5FVDYpOwogICAgICAgIGdldHRpbWVvZmRheSgmdHBlbmQsIE5VTEwpOwogICAgICAgIHRpbWV1c2U2ID0gMTAwMDAwMCAqICh0cGVuZC50dl9zZWMgLSB0cHN0YXJ0LnR2X3NlYykgKwogICAgICAgICAgICB0cGVuZC50dl91c2VjIC0gdHBzdGFydC50dl91c2VjOwogICAgICAgIHRpbWV1c2U2IC89IDEwMDA7CgogICAgICAgIGlmIChocCA9PSBOVUxMKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJsb29rdXBDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBnZXQgYSBpcHY2IG5ldHdvcmsgaG9zdCBlbnRyeSBmb3IgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3aGlsZSAoKmhwLT5oX2FkZHJfbGlzdCkgewogICAgICAgICAgICAgICAgbWVtbW92ZSgoY2FkZHJfdCkgJiBhNiwgKmhwLT5oX2FkZHJfbGlzdCsrLCAxNik7CiAgICAgICAgICAgICAgICBob3N0bmFtZSA9IChjaGFyICopIGhwLT5oX25hbWU7CgogICAgICAgICAgICAgICAgdGVtcCA9IFNOTVBfTUFMTE9DX1NUUlVDVChsb29rdXBSZXN1bHRzVGFibGVfZGF0YSk7CiAgICAgICAgICAgICAgICBpZiAodGVtcCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cFJlc3VsdHNJbmRleCA9IG47CgogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwQ3RsT3duZXJJbmRleCA9CiAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKGl0ZW0tPmxvb2t1cEN0bE93bmVySW5kZXhMZW4gKyAxKTsKICAgICAgICAgICAgICAgIGlmICh0ZW1wLT5sb29rdXBDdGxPd25lckluZGV4ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWVtY3B5KHRlbXAtPmxvb2t1cEN0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+bG9va3VwQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5sb29rdXBDdGxPd25lckluZGV4TGVuICsgMSk7CiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBDdGxPd25lckluZGV4W2l0ZW0tPmxvb2t1cEN0bE93bmVySW5kZXhMZW5dID0KICAgICAgICAgICAgICAgICAgICAnXDAnOwogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwQ3RsT3duZXJJbmRleExlbiA9CiAgICAgICAgICAgICAgICAgICAgaXRlbS0+bG9va3VwQ3RsT3duZXJJbmRleExlbjsKCiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lID0KICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2MoaXRlbS0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZUxlbiArIDEpOwogICAgICAgICAgICAgICAgaWYgKHRlbXAtPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWUgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtZW1jcHkodGVtcC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lLAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWVMZW4gKyAxKTsKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWVbaXRlbS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cEN0bE9wZXJhdGlvbk5hbWVMZW5dID0KICAgICAgICAgICAgICAgICAgICAnXDAnOwogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZUxlbiA9CiAgICAgICAgICAgICAgICAgICAgaXRlbS0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZUxlbjsKCiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBSZXN1bHRzQWRkcmVzc1R5cGUgPSAyOwogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwUmVzdWx0c0FkZHJlc3MgPQogICAgICAgICAgICAgICAgICAgIChjaGFyICopCiAgICAgICAgICAgICAgICAgICAgbWFsbG9jKHN0cmxlbihpbmV0X250b3AoQUZfSU5FVDYsICZhNiwgcGEsIDY0KSkgKyAxKTsKICAgICAgICAgICAgICAgIG1lbWNweSh0ZW1wLT5sb29rdXBSZXN1bHRzQWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICBpbmV0X250b3AoQUZfSU5FVDYsICZhNiwgcGEsIDY0KSwKICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oaW5ldF9udG9wKEFGX0lORVQ2LCAmYTYsIHBhLCA2NCkpICsgMSk7CiAgICAgICAgICAgICAgICB0ZW1wLT4KICAgICAgICAgICAgICAgICAgICBsb29rdXBSZXN1bHRzQWRkcmVzc1tzdHJsZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5ldF9udG9wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRl9JTkVUNiwgJmE2LCBwYSwgNjQpKV0gPSAnXDAnOwogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwUmVzdWx0c0FkZHJlc3NMZW4gPQogICAgICAgICAgICAgICAgICAgIHN0cmxlbihpbmV0X250b3AoQUZfSU5FVDYsICZhNiwgcGEsIDY0KSk7CiAgICAgICAgICAgICAgICBpZiAobiA9PSAxKQogICAgICAgICAgICAgICAgICAgIGl0ZW0tPlJlc3VsdHNUYWJsZSA9IHRlbXA7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+bmV4dCA9IHRlbXA7CiAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGVtcDsKICAgICAgICAgICAgICAgIG4gPSBuICsgMTsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3VycmVudC0+bmV4dCA9IE5VTEw7CiAgICAgICAgfQogICAgICAgIHRpbWV1c2UgPSB0aW1ldXNlNCArIHRpbWV1c2U2OwogICAgICAgIG1vZGlmeV9sb29rdXBDdGxUaW1lKGl0ZW0sIHRpbWV1c2UpOwogICAgICAgIG1vZGlmeV9sb29rdXBDdGxPcGVyU3RhdHVzKGl0ZW0sIDNsKTsKCiAgICAgICAgaWYgKGl0ZW0tPlJlc3VsdHNUYWJsZSAhPSBOVUxMKSB7CgogICAgICAgICAgICBtb2RpZnlfbG9va3VwQ3RsUmMoaXRlbSwgMGwpOwogICAgICAgICAgICBpZiAobG9va3VwUmVzdWx0c1RhYmxlX2FkZChpdGVtKSAhPSBTTk1QRVJSX1NVQ0NFU1MpCiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgibG9va3VwUmVzdWx0c1RhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWdpc3RlcmVkIGFuIGVudHJ5IGVycm9yXG4iKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbW9kaWZ5X2xvb2t1cEN0bFJjKGl0ZW0sIDFsKTsKICAgICAgICB9CiAgICAgICAgU05NUF9GUkVFKGFkZHJlc3MpOwogICAgICAgIGFkZHJlc3MgPSBOVUxMOwoKICAgICAgICByZXR1cm47CgogICAgfQoKCiAgICBlbHNlIGlmIChhZGRyZXNzVHlwZSA9PSAyKSB7CiAgICAgICAgaWYgKGluZXRfcHRvbihBRl9JTkVUNiwgYWRkcmVzcywgJmFkZHJfaW42KSA9PSAxKQogICAgICAgICAgICBERUJVR01TR1RMKCgibG9va3VwQ3RsVGFibGUiLCAic3VjY2VzcyEgXG4iKSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBERUJVR01TR1RMKCgibG9va3VwQ3RsVGFibGUiLCAiZXJyb3IhIFxuIikpOwoKCiAgICAgICAgZ2V0dGltZW9mZGF5KCZ0cHN0YXJ0LCBOVUxMKTsKICAgICAgICBsb29rdXAgPSBnZXRob3N0YnlhZGRyKChjaGFyICopICZhZGRyX2luNiwgMTYsIEFGX0lORVQ2KTsKICAgICAgICBnZXR0aW1lb2ZkYXkoJnRwZW5kLCBOVUxMKTsKICAgICAgICB0aW1ldXNlID0gMTAwMDAwMCAqICh0cGVuZC50dl9zZWMgLSB0cHN0YXJ0LnR2X3NlYykgKwogICAgICAgICAgICB0cGVuZC50dl91c2VjIC0gdHBzdGFydC50dl91c2VjOwogICAgICAgIHRpbWV1c2UgLz0gMTAwMDsKICAgICAgICBtb2RpZnlfbG9va3VwQ3RsVGltZShpdGVtLCB0aW1ldXNlKTsKICAgICAgICBtb2RpZnlfbG9va3VwQ3RsT3BlclN0YXR1cyhpdGVtLCAzbCk7CgogICAgICAgIGlmIChsb29rdXAgPT0gTlVMTCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgibG9va3VwQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgZ2V0IGEgbmV0d29yayBob3N0IGVudHJ5IGZvciAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcykpOwogICAgICAgICAgICBtb2RpZnlfbG9va3VwQ3RsUmMoaXRlbSwgMWwpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbW9kaWZ5X2xvb2t1cEN0bFJjKGl0ZW0sIDBsKTsKICAgICAgICAgICAgaWYgKGxvb2t1cC0+aF9uYW1lICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0ZW1wID0KICAgICAgICAgICAgICAgICAgICBTTk1QX01BTExPQ19TVFJVQ1QobG9va3VwUmVzdWx0c1RhYmxlX2RhdGEpOwogICAgICAgICAgICAgICAgaWYgKHRlbXAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBSZXN1bHRzSW5kZXggPSBuOwoKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cEN0bE93bmVySW5kZXggPQogICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhpdGVtLT5sb29rdXBDdGxPd25lckluZGV4TGVuICsgMSk7CiAgICAgICAgICAgICAgICBpZiAodGVtcC0+bG9va3VwQ3RsT3duZXJJbmRleCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1lbWNweSh0ZW1wLT5sb29rdXBDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPmxvb2t1cEN0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+bG9va3VwQ3RsT3duZXJJbmRleExlbiArIDEpOwogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwQ3RsT3duZXJJbmRleFtpdGVtLT5sb29rdXBDdGxPd25lckluZGV4TGVuXSA9CiAgICAgICAgICAgICAgICAgICAgJ1wwJzsKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cEN0bE93bmVySW5kZXhMZW4gPQogICAgICAgICAgICAgICAgICAgIGl0ZW0tPmxvb2t1cEN0bE93bmVySW5kZXhMZW47CgogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZSA9CiAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKGl0ZW0tPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWVMZW4gKyAxKTsKICAgICAgICAgICAgICAgIGlmICh0ZW1wLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWVtY3B5KHRlbXAtPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lTGVuICsgMSk7CiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lW2l0ZW0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBDdGxPcGVyYXRpb25OYW1lTGVuXSA9CiAgICAgICAgICAgICAgICAgICAgJ1wwJzsKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWVMZW4gPQogICAgICAgICAgICAgICAgICAgIGl0ZW0tPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWVMZW47CgogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwUmVzdWx0c0FkZHJlc3NUeXBlID0gMTY7CiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBSZXN1bHRzQWRkcmVzcyA9CiAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKHN0cmxlbihsb29rdXAtPmhfbmFtZSkgKyAxKTsKICAgICAgICAgICAgICAgIG1lbWNweSh0ZW1wLT5sb29rdXBSZXN1bHRzQWRkcmVzcywgbG9va3VwLT5oX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGxvb2t1cC0+aF9uYW1lKSArIDEpOwogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwUmVzdWx0c0FkZHJlc3Nbc3RybGVuKGxvb2t1cC0+aF9uYW1lKV0gPSAnXDAnOwogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwUmVzdWx0c0FkZHJlc3NMZW4gPSBzdHJsZW4obG9va3VwLT5oX25hbWUpOwogICAgICAgICAgICAgICAgaXRlbS0+UmVzdWx0c1RhYmxlID0gdGVtcDsKICAgICAgICAgICAgICAgIG4gPSBuICsgMTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGkgPSAwOwogICAgICAgICAgICB3aGlsZSAobG9va3VwLT5oX2FsaWFzZXNbaV0pIHsKICAgICAgICAgICAgICAgIHRlbXAgPSBTTk1QX01BTExPQ19TVFJVQ1QobG9va3VwUmVzdWx0c1RhYmxlX2RhdGEpOwogICAgICAgICAgICAgICAgaWYgKHRlbXAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBDdGxPd25lckluZGV4ID0KICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2MoaXRlbS0+bG9va3VwQ3RsT3duZXJJbmRleExlbiArIDEpOwogICAgICAgICAgICAgICAgaWYgKHRlbXAtPmxvb2t1cEN0bE93bmVySW5kZXggPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtZW1jcHkodGVtcC0+bG9va3VwQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5sb29rdXBDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPmxvb2t1cEN0bE93bmVySW5kZXhMZW4gKyAxKTsKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cEN0bE93bmVySW5kZXhbaXRlbS0+bG9va3VwQ3RsT3duZXJJbmRleExlbl0gPQogICAgICAgICAgICAgICAgICAgICdcMCc7CiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBDdGxPd25lckluZGV4TGVuID0KICAgICAgICAgICAgICAgICAgICBpdGVtLT5sb29rdXBDdGxPd25lckluZGV4TGVuOwoKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWUgPQogICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhpdGVtLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lTGVuICsgMSk7CiAgICAgICAgICAgICAgICBpZiAodGVtcC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1lbWNweSh0ZW1wLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lLAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZUxlbiArIDEpOwogICAgICAgICAgICAgICAgdGVtcC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZVtpdGVtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwQ3RsT3BlcmF0aW9uTmFtZUxlbl0gPQogICAgICAgICAgICAgICAgICAgICdcMCc7CiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lTGVuID0KICAgICAgICAgICAgICAgICAgICBpdGVtLT5sb29rdXBDdGxPcGVyYXRpb25OYW1lTGVuOwoKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cFJlc3VsdHNJbmRleCA9IG47CiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBSZXN1bHRzQWRkcmVzc1R5cGUgPSAxNjsKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cFJlc3VsdHNBZGRyZXNzID0KICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2Moc3RybGVuKGxvb2t1cC0+aF9hbGlhc2VzW2ldKSArIDEpOwogICAgICAgICAgICAgICAgaWYgKHRlbXAtPmxvb2t1cFJlc3VsdHNBZGRyZXNzID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWVtY3B5KHRlbXAtPmxvb2t1cFJlc3VsdHNBZGRyZXNzLCBsb29rdXAtPmhfYWxpYXNlc1tpXSwKICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4obG9va3VwLT5oX2FsaWFzZXNbaV0pICsgMSk7CiAgICAgICAgICAgICAgICB0ZW1wLT5sb29rdXBSZXN1bHRzQWRkcmVzc1tzdHJsZW4obG9va3VwLT5oX2FsaWFzZXNbaV0pXSA9CiAgICAgICAgICAgICAgICAgICAgJ1wwJzsKICAgICAgICAgICAgICAgIHRlbXAtPmxvb2t1cFJlc3VsdHNBZGRyZXNzTGVuID0KICAgICAgICAgICAgICAgICAgICBzdHJsZW4obG9va3VwLT5oX2FsaWFzZXNbaV0pOwogICAgICAgICAgICAgICAgY3VycmVudC0+bmV4dCA9IHRlbXA7CiAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGVtcDsKICAgICAgICAgICAgICAgIGkgPSBpICsgMTsKICAgICAgICAgICAgICAgIG4gPSBuICsgMTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpdGVtLT5SZXN1bHRzVGFibGUgIT0gTlVMTCkKICAgICAgICAgICAgICAgIGN1cnJlbnQtPm5leHQgPSBOVUxMOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBjdXJyZW50ID0gTlVMTDsKCiAgICAgICAgfQoKCiAgICAgICAgaWYgKGl0ZW0tPlJlc3VsdHNUYWJsZSAhPSBOVUxMKQogICAgICAgICAgICBpZiAobG9va3VwUmVzdWx0c1RhYmxlX2FkZChpdGVtKSAhPSBTTk1QRVJSX1NVQ0NFU1MpCiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgibG9va3VwUmVzdWx0c1RhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWdpc3RlcmVkIGFuIGVudHJ5IGVycm9yXG4iKSk7CiAgICAgICAgU05NUF9GUkVFKGFkZHJlc3MpOwogICAgICAgIGFkZHJlc3MgPSBOVUxMOwogICAgICAgIHJldHVybjsKICAgIH0gZWxzZSB7CiAgICAgICAgU05NUF9GUkVFKGFkZHJlc3MpOwogICAgICAgIGFkZHJlc3MgPSBOVUxMOwogICAgICAgIHJldHVybjsKICAgIH0KfQoKCmludAptb2RpZnlfbG9va3VwQ3RsT3BlclN0YXR1cyhzdHJ1Y3QgbG9va3VwVGFibGVfZGF0YSAqdGhlZGF0YSwgbG9uZyB2YWwpCnsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFycyA9IE5VTEw7CiAgICBzdHJ1Y3QgbG9va3VwVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CgogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+bG9va3VwQ3RsT3duZXJJbmRleCwgdGhlZGF0YS0+bG9va3VwQ3RsT3duZXJJbmRleExlbik7ICAgLyogbG9va3VwQ3RsT3duZXJJbmRleCAqLwogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZSwgdGhlZGF0YS0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZUxlbik7ICAgICAvKiBsb29rdXBDdGxPcGVyYXRpb25OYW1lICovCgoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4X2dldChsb29rdXBDdGxUYWJsZVN0b3JhZ2UsIHZhcnMpKSA9PSBOVUxMKSB7CiAgICAgICAgc25tcF9mcmVlX3ZhcmJpbmQodmFycyk7CiAgICAgICAgdmFycyA9IE5VTEw7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7CiAgICB9CiAgICBTdG9yYWdlVG1wLT5sb29rdXBDdGxPcGVyU3RhdHVzID0gdmFsOwoKICAgIHNubXBfZnJlZV92YXJiaW5kKHZhcnMpOwogICAgdmFycyA9IE5VTEw7CgogICAgREVCVUdNU0dUTCgoImxvb2t1cE9wZXJTdGF0dXMiLCAiZG9uZS5cbiIpKTsKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCmludAptb2RpZnlfbG9va3VwQ3RsVGltZShzdHJ1Y3QgbG9va3VwVGFibGVfZGF0YSAqdGhlZGF0YSwgdW5zaWduZWQgbG9uZyB2YWwpCnsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFycyA9IE5VTEw7CiAgICBzdHJ1Y3QgbG9va3VwVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CgogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+bG9va3VwQ3RsT3duZXJJbmRleCwgdGhlZGF0YS0+bG9va3VwQ3RsT3duZXJJbmRleExlbik7ICAgLyogbG9va3VwQ3RsT3duZXJJbmRleCAqLwogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZSwgdGhlZGF0YS0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZUxlbik7ICAgICAvKiBsb29rdXBDdGxPcGVyYXRpb25OYW1lICovCgoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4X2dldChsb29rdXBDdGxUYWJsZVN0b3JhZ2UsIHZhcnMpKSA9PSBOVUxMKSB7CiAgICAgICAgc25tcF9mcmVlX3ZhcmJpbmQodmFycyk7CiAgICAgICAgdmFycyA9IE5VTEw7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7CiAgICB9CiAgICBTdG9yYWdlVG1wLT5sb29rdXBDdGxUaW1lID0gdmFsOwoKICAgIHNubXBfZnJlZV92YXJiaW5kKHZhcnMpOwogICAgdmFycyA9IE5VTEw7CgogICAgREVCVUdNU0dUTCgoImxvb2t1cEN0bFRpbWUiLCAiZG9uZS5cbiIpKTsKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCmludAptb2RpZnlfbG9va3VwQ3RsUmMoc3RydWN0IGxvb2t1cFRhYmxlX2RhdGEgKnRoZWRhdGEsIGxvbmcgdmFsKQp7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMgPSBOVUxMOwogICAgc3RydWN0IGxvb2t1cFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwoKICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPmxvb2t1cEN0bE93bmVySW5kZXgsIHRoZWRhdGEtPmxvb2t1cEN0bE93bmVySW5kZXhMZW4pOyAgIC8qIGxvb2t1cEN0bE93bmVySW5kZXggKi8KICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWUsIHRoZWRhdGEtPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWVMZW4pOyAgICAgLyogbG9va3VwQ3RsT3BlcmF0aW9uTmFtZSAqLwoKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleF9nZXQobG9va3VwQ3RsVGFibGVTdG9yYWdlLCB2YXJzKSkgPT0gTlVMTCkgewogICAgICAgIHNubXBfZnJlZV92YXJiaW5kKHZhcnMpOwogICAgICAgIHZhcnMgPSBOVUxMOwogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOwogICAgfQogICAgU3RvcmFnZVRtcC0+bG9va3VwQ3RsUmMgPSB2YWw7CgogICAgc25tcF9mcmVlX3ZhcmJpbmQodmFycyk7CiAgICB2YXJzID0gTlVMTDsKICAgIERFQlVHTVNHVEwoKCJsb29rdXBPcGVyU3RhdHVzIiwgImRvbmUuXG4iKSk7CiAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwp9CgoKaW50Cmxvb2t1cFJlc3VsdHNUYWJsZV9kZWwoc3RydWN0IGxvb2t1cFRhYmxlX2RhdGEgKnRoZWRhdGEpCnsKICAgIHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqaGNpcHRyMiA9IE5VTEw7CiAgICBzdHJ1Y3QgbG9va3VwUmVzdWx0c1RhYmxlX2RhdGEgKlN0b3JhZ2VEZWwgPSBOVUxMOwogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzID0gTlVMTDsKICAgIG9pZCAgICAgICAgICAgICBuZXdvaWRbTUFYX09JRF9MRU5dOwogICAgc2l6ZV90ICAgICAgICAgIG5ld29pZF9sZW47CgogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+bG9va3VwQ3RsT3duZXJJbmRleCwgdGhlZGF0YS0+bG9va3VwQ3RsT3duZXJJbmRleExlbik7ICAgLyogbG9va3VwQ3RsT3duZXJJbmRleCAqLwogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZSwgdGhlZGF0YS0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZUxlbik7ICAgICAvKiBsb29rdXBDdGxPcGVyYXRpb25OYW1lICovCiAgICBtZW1zZXQobmV3b2lkLCAnXDAnLCBNQVhfT0lEX0xFTiAqIHNpemVvZihvaWQpKTsKICAgIGhlYWRlcl9jb21wbGV4X2dlbmVyYXRlX29pZChuZXdvaWQsICZuZXdvaWRfbGVuLCBOVUxMLCAwLCB2YXJzKTsKCgogICAgc25tcF9mcmVlX3ZhcmJpbmQodmFycyk7CiAgICB2YXJzID0gTlVMTDsKICAgIGZvciAoaGNpcHRyMiA9IGxvb2t1cFJlc3VsdHNUYWJsZVN0b3JhZ2U7IGhjaXB0cjIgIT0gTlVMTDsKICAgICAgICAgaGNpcHRyMiA9IGhjaXB0cjItPm5leHQpIHsKICAgICAgICBpZiAoc25tcF9vaWRfY29tcGFyZShuZXdvaWQsIG5ld29pZF9sZW4sIGhjaXB0cjItPm5hbWUsIG5ld29pZF9sZW4pCiAgICAgICAgICAgID09IDApIHsKICAgICAgICAgICAgU3RvcmFnZURlbCA9CiAgICAgICAgICAgICAgICBoZWFkZXJfY29tcGxleF9leHRyYWN0X2VudHJ5KCZsb29rdXBSZXN1bHRzVGFibGVTdG9yYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2lwdHIyKTsKICAgICAgICAgICAgaWYgKFN0b3JhZ2VEZWwgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgU05NUF9GUkVFKFN0b3JhZ2VEZWwtPmxvb2t1cEN0bE93bmVySW5kZXgpOwogICAgICAgICAgICAgICAgU05NUF9GUkVFKFN0b3JhZ2VEZWwtPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWUpOwogICAgICAgICAgICAgICAgU05NUF9GUkVFKFN0b3JhZ2VEZWwtPmxvb2t1cFJlc3VsdHNBZGRyZXNzKTsKICAgICAgICAgICAgICAgIFNOTVBfRlJFRShTdG9yYWdlRGVsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBERUJVR01TR1RMKCgibG9va3VwUmVzdWx0c1RhYmxlIiwgImRlbGV0ZSAgc3VjY2VzcyFcbiIpKTsKCiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKCmludAp3cml0ZV9sb29rdXBDdGxUYXJnZXRBZGRyZXNzVHlwZShpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBzdHJ1Y3QgbG9va3VwVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtIChzaXplb2YobG9va3VwQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArCiAgICAgICAgICAgICAgICAgICAgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KGxvb2t1cEN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKGxvb2t1cEN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdldHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5sb29rdXBDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gbG9va3VwQ3RsVGFyZ2V0QWRkcmVzc1R5cGUgbm90IEFTTl9JTlRFR0VSXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+bG9va3VwQ3RsVGFyZ2V0QWRkcmVzc1R5cGU7CiAgICAgICAgU3RvcmFnZVRtcC0+bG9va3VwQ3RsVGFyZ2V0QWRkcmVzc1R5cGUgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT5sb29rdXBDdGxUYXJnZXRBZGRyZXNzVHlwZSA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCmludAp3cml0ZV9sb29rdXBDdGxUYXJnZXRBZGRyZXNzKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgY2hhciAgICAqdG1wdmFyID0gTlVMTDsKICAgIHN0YXRpYyBzaXplX3QgICB0bXBsZW47CiAgICBzdHJ1Y3QgbG9va3VwVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtIChzaXplb2YobG9va3VwQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArCiAgICAgICAgICAgICAgICAgICAgMyAtIDEpOwogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgobG9va3VwQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YobG9va3VwQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2V0eXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPmxvb2t1cEN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fT0NURVRfU1RSKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byBsb29rdXBDdGxUYXJnZXRBZGRyZXNzIG5vdCBBU05fT0NURVRfU1RSXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CgogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCgogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwoKICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIGxvbmdfcmV0IGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+bG9va3VwQ3RsVGFyZ2V0QWRkcmVzczsKICAgICAgICB0bXBsZW4gPSBTdG9yYWdlVG1wLT5sb29rdXBDdGxUYXJnZXRBZGRyZXNzTGVuOwoKICAgICAgICBpZiAoKFN0b3JhZ2VUbXAtPmxvb2t1cEN0bFRhcmdldEFkZHJlc3MgPQogICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKHZhcl92YWxfbGVuICsgMSkpID09IE5VTEwpIHsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiAgICAgICAgbWVtY3B5KFN0b3JhZ2VUbXAtPmxvb2t1cEN0bFRhcmdldEFkZHJlc3MsIHZhcl92YWwsIHZhcl92YWxfbGVuKTsKICAgICAgICBTdG9yYWdlVG1wLT5sb29rdXBDdGxUYXJnZXRBZGRyZXNzW3Zhcl92YWxfbGVuXSA9ICdcMCc7CiAgICAgICAgU3RvcmFnZVRtcC0+bG9va3VwQ3RsVGFyZ2V0QWRkcmVzc0xlbiA9IHZhcl92YWxfbGVuOwoKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgZnJlZShTdG9yYWdlVG1wLT5sb29rdXBDdGxUYXJnZXRBZGRyZXNzKTsKICAgICAgICBTdG9yYWdlVG1wLT5sb29rdXBDdGxUYXJnZXRBZGRyZXNzID0gTlVMTDsKICAgICAgICBTdG9yYWdlVG1wLT5sb29rdXBDdGxUYXJnZXRBZGRyZXNzID0gdG1wdmFyOwogICAgICAgIFN0b3JhZ2VUbXAtPmxvb2t1cEN0bFRhcmdldEFkZHJlc3NMZW4gPSB0bXBsZW47CgogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwoKICAgICAgICBmcmVlKHRtcHZhcik7CiAgICAgICAgdG1wdmFyID0gTlVMTDsKCiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCgoKCgppbnQKd3JpdGVfbG9va3VwQ3RsUm93U3RhdHVzKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0cnVjdCBsb29rdXBUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHN0YXRpYyBzdHJ1Y3QgbG9va3VwVGFibGVfZGF0YSAqU3RvcmFnZU5ldywgKlN0b3JhZ2VEZWwgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLSAoc2l6ZW9mKGxvb2t1cEN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKwogICAgICAgICAgICAgICAgICAgIDMgLSAxKTsKICAgIHN0YXRpYyBpbnQgICAgICBvbGRfdmFsdWU7CiAgICBpbnQgICAgICAgICAgICAgc2V0X3ZhbHVlOwogICAgc3RhdGljIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFycywgKnZwOwogICAgc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICpoY2lwdHIgPSBOVUxMOwoKICAgIFN0b3JhZ2VUbXAgPQogICAgICAgIGhlYWRlcl9jb21wbGV4KGxvb2t1cEN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YobG9va3VwQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLCBOVUxMKTsKCiAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9JTlRFR0VSIHx8IHZhcl92YWwgPT0gTlVMTCkgewogICAgICAgIHNubXBfbG9nKExPR19FUlIsICJ3cml0ZSB0byBsb29rdXBDdGxSb3dTdGF0dXMgbm90IEFTTl9JTlRFR0VSXG4iKTsKICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgfQogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZXR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgc2V0X3ZhbHVlID0gKigobG9uZyAqKSB2YXJfdmFsKTsKCgogICAgLyoKICAgICAqIGNoZWNrIGxlZ2FsIHJhbmdlLCBhbmQgbm90UmVhZHkgaXMgcmVzZXJ2ZWQgZm9yIHVzLCBub3QgYSB1c2VyIAogICAgICovCiAgICBpZiAoc2V0X3ZhbHVlIDwgMSB8fCBzZXRfdmFsdWUgPiA2IHx8IHNldF92YWx1ZSA9PSBSU19OT1RSRUFEWSkKICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UVkFMVUU7CgoKICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIC8qCiAgICAgICAgICogc3RhZ2Ugb25lOiB0ZXN0IHZhbGlkaXR5IAogICAgICAgICAqLwogICAgICAgIGlmIChTdG9yYWdlVG1wID09IE5VTEwpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogY3JlYXRlIHRoZSByb3cgbm93PyAKICAgICAgICAgICAgICovCgoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogZGl0Y2ggaWxsZWdhbCB2YWx1ZXMgbm93IAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKHNldF92YWx1ZSA9PSBSU19BQ1RJVkUgfHwgc2V0X3ZhbHVlID09IFJTX05PVElOU0VSVklDRSkgewoKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlRWQUxVRTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogZGVzdHJveWluZyBhIG5vbi1leGlzdGVudCByb3cgaXMgYWN0dWFsbHkgbGVnYWwgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoc2V0X3ZhbHVlID09IFJTX0RFU1RST1kpIHsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwogICAgICAgICAgICB9CgoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogaWxsZWdhbCBjcmVhdGlvbiB2YWx1ZXMgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoc2V0X3ZhbHVlID09IFJTX0FDVElWRSB8fCBzZXRfdmFsdWUgPT0gUlNfTk9USU5TRVJWSUNFKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UVkFMVUU7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiByb3cgZXhpc3RzLiAgQ2hlY2sgZm9yIGEgdmFsaWQgc3RhdGUgY2hhbmdlIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKHNldF92YWx1ZSA9PSBSU19DUkVBVEVBTkRHTwogICAgICAgICAgICAgICAgfHwgc2V0X3ZhbHVlID09IFJTX0NSRUFURUFORFdBSVQpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBjYW4ndCBjcmVhdGUgYSByb3cgdGhhdCBleGlzdHMgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlRWQUxVRTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogWFhYOiBpbnRlcmFjdGlvbiB3aXRoIHJvdyBzdG9yYWdlIHR5cGUgbmVlZGVkIAogICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIGlmIChTdG9yYWdlVG1wLT5sb29rdXBDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFICYmCiAgICAgICAgICAgICAgICBzZXRfdmFsdWUgIT0gUlNfREVTVFJPWSkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqICJPbmNlIG1hZGUgYWN0aXZlIGFuIGVudHJ5IG1heSBub3QgYmUgbW9kaWZpZWQgZXhjZXB0IHRvIAogICAgICAgICAgICAgICAgICogZGVsZXRlIGl0LiIgIFhYWDogZG9lc24ndCB0aGlzIGluIGZhY3QgYXBwbHkgdG8gQUxMCiAgICAgICAgICAgICAgICAgKiBjb2x1bW5zIG9mIHRoZSB0YWJsZSBhbmQgbm90IGp1c3QgdGhpcyBvbmU/ICAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVFZBTFVFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChTdG9yYWdlVG1wLT5zdG9yYWdldHlwZSAhPSBTVF9OT05WT0xBVElMRSkKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGlmIChTdG9yYWdlVG1wID09IE5VTEwpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogY3JlYXRpb24gCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoc2V0X3ZhbHVlID09IFJTX0RFU1RST1kpIHsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhcnMgPSBOVUxMOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogvatuYW1lzqq/1bXEyP249sv30v3X1rbOvNO1vXZhcrHkwb/B0LHttcTEqc6yIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgTlVMTCwgMCk7ICAvKiBsb29rdXBDdGxPd25lckluZGV4ICovCiAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIE5VTEwsIDApOyAgLyogbG9va3VwQ3RsT3BlcmF0aW9uTmFtZSAqLwoKICAgICAgICAgICAgaWYgKGhlYWRlcl9jb21wbGV4X3BhcnNlX29pZAogICAgICAgICAgICAgICAgKCYKICAgICAgICAgICAgICAgICAobmFtZQogICAgICAgICAgICAgICAgICBbc2l6ZW9mKGxvb2t1cEN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKwogICAgICAgICAgICAgICAgICAgMl0pLCBuZXdsZW4sIHZhcnMpICE9IFNOTVBFUlJfU1VDQ0VTUykgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFhYWDogZnJlZSwgemVybyB2YXJzIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzKTsKICAgICAgICAgICAgICAgIHZhcnMgPSBOVUxMOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVE5BTUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdnAgPSB2YXJzOwogICAgICAgICAgICBTdG9yYWdlTmV3ID0gY3JlYXRlX2xvb2t1cFRhYmxlX2RhdGEoKTsKICAgICAgICAgICAgU3RvcmFnZU5ldy0+bG9va3VwQ3RsT3duZXJJbmRleCA9IG1hbGxvYyh2cC0+dmFsX2xlbiArIDEpOwogICAgICAgICAgICBtZW1jcHkoU3RvcmFnZU5ldy0+bG9va3VwQ3RsT3duZXJJbmRleCwgdnAtPnZhbC5zdHJpbmcsCiAgICAgICAgICAgICAgICAgICB2cC0+dmFsX2xlbik7CiAgICAgICAgICAgIFN0b3JhZ2VOZXctPmxvb2t1cEN0bE93bmVySW5kZXhbdnAtPnZhbF9sZW5dID0gJ1wwJzsKICAgICAgICAgICAgU3RvcmFnZU5ldy0+bG9va3VwQ3RsT3duZXJJbmRleExlbiA9IHZwLT52YWxfbGVuOwogICAgICAgICAgICB2cCA9IHZwLT5uZXh0X3ZhcmlhYmxlOwoKICAgICAgICAgICAgU3RvcmFnZU5ldy0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZSA9IG1hbGxvYyh2cC0+dmFsX2xlbiArIDEpOwogICAgICAgICAgICBtZW1jcHkoU3RvcmFnZU5ldy0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZSwgdnAtPnZhbC5zdHJpbmcsCiAgICAgICAgICAgICAgICAgICB2cC0+dmFsX2xlbik7CiAgICAgICAgICAgIFN0b3JhZ2VOZXctPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWVbdnAtPnZhbF9sZW5dID0gJ1wwJzsKICAgICAgICAgICAgU3RvcmFnZU5ldy0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZUxlbiA9IHZwLT52YWxfbGVuOwogICAgICAgICAgICB2cCA9IHZwLT5uZXh0X3ZhcmlhYmxlOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogWFhYOiBmaWxsIGluIGRlZmF1bHQgcm93IHZhbHVlcyBoZXJlIGludG8gU3RvcmFnZU5ldyAKICAgICAgICAgICAgICovCgogICAgICAgICAgICBTdG9yYWdlTmV3LT5sb29rdXBDdGxUYXJnZXRBZGRyZXNzVHlwZSA9IDE7IC8qIGlwdjQgKi8KCiAgICAgICAgICAgIFN0b3JhZ2VOZXctPmxvb2t1cEN0bFJvd1N0YXR1cyA9IHNldF92YWx1ZTsKCiAgICAgICAgICAgIHNubXBfZnJlZV92YXJiaW5kKHZhcnMpOwogICAgICAgICAgICB2YXJzID0gTlVMTDsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFhYWDogZnJlZSwgemVybyB2YXJzLCBubyBsb25nZXIgbmVlZGVkPyAKICAgICAgICAgICAgICovCiAgICAgICAgfQoKCiAgICAgICAgYnJlYWs7CgoKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogWFhYOiBmcmVlLCB6ZXJvIHZhcnMgCiAgICAgICAgICovCiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBzZXRfdmFsdWUgZm9yIHlvdSB0bwogICAgICAgICAqIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4KICAgICAgICAgKiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwoKCiAgICAgICAgaWYgKFN0b3JhZ2VUbXAgPT0gTlVMTCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiByb3cgY3JlYXRpb24sIHNvIGFkZCBpdCAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChzZXRfdmFsdWUgPT0gUlNfREVTVFJPWSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKFN0b3JhZ2VOZXcgIT0gTlVMTCkKI2lmIDEKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJsb29rdXBDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JpdGVfbG9va3VwQ3RsUm93U3RhdHVzIGVudGVyaW5nIG5ldz0lZC4uLiAgXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uKSk7CiNlbmRpZgogICAgICAgICAgICBsb29rdXBDdGxUYWJsZV9hZGQoU3RvcmFnZU5ldyk7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFhYWDogYWNrLCBhbmQgaWYgaXQgaXMgTlVMTD8gCiAgICAgICAgICAgICAqLwogICAgICAgIH0gZWxzZSBpZiAoc2V0X3ZhbHVlICE9IFJTX0RFU1RST1kpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogc2V0IHRoZSBmbGFnPyAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9sZF92YWx1ZSA9IFN0b3JhZ2VUbXAtPmxvb2t1cEN0bFJvd1N0YXR1czsKICAgICAgICAgICAgU3RvcmFnZVRtcC0+bG9va3VwQ3RsUm93U3RhdHVzID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBkZXN0cm95Li4uICBleHRyYWN0IGl0IGZvciBub3cgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBERUJVR01TR1RMKCgibG9va3VwQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAid3JpdGVfbG9va3VwQ3RsVGFibGVfZGVsZXRlIDEgXG4iKSk7CiAgICAgICAgICAgIGhjaXB0ciA9CiAgICAgICAgICAgICAgICBoZWFkZXJfY29tcGxleF9maW5kX2VudHJ5KGxvb2t1cEN0bFRhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcCk7CgogICAgICAgICAgICBTdG9yYWdlRGVsID0KICAgICAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2V4dHJhY3RfZW50cnkoJmxvb2t1cEN0bFRhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpcHRyKTsKICAgICAgICAgICAgbG9va3VwUmVzdWx0c1RhYmxlX2RlbChTdG9yYWdlVG1wKTsKCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJsb29rdXBDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZV9sb29rdXBDdGxUYWJsZV9kZWxldGUgIFxuIikpOwoKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgaWYgKFN0b3JhZ2VUbXAgPT0gTlVMTCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiByb3cgY3JlYXRpb24sIHNvIHJlbW92ZSBpdCBhZ2FpbiAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGhjaXB0ciA9CiAgICAgICAgICAgICAgICBoZWFkZXJfY29tcGxleF9maW5kX2VudHJ5KGxvb2t1cEN0bFRhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcCk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwgPQogICAgICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZXh0cmFjdF9lbnRyeSgmbG9va3VwQ3RsVGFibGVTdG9yYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2lwdHIpOwoKICAgICAgICAgICAgbG9va3VwUmVzdWx0c1RhYmxlX2RlbChTdG9yYWdlVG1wKTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFhYWDogZnJlZSBpdCAKICAgICAgICAgICAgICovCiAgICAgICAgfSBlbHNlIGlmIChTdG9yYWdlRGVsICE9IE5VTEwpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogcm93IGRlbGV0aW9uLCBzbyBhZGQgaXQgYWdhaW4gCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBsb29rdXBDdGxUYWJsZV9hZGQoU3RvcmFnZURlbCk7CiAgICAgICAgICAgIGxvb2t1cFJlc3VsdHNUYWJsZV9hZGQoU3RvcmFnZURlbCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgU3RvcmFnZVRtcC0+bG9va3VwQ3RsUm93U3RhdHVzID0gb2xkX3ZhbHVlOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIGlmIChTdG9yYWdlVG1wID09IE5VTEwpIHsKICAgICAgICAgICAgaWYgKHNldF92YWx1ZSA9PSBSU19ERVNUUk9ZKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKFN0b3JhZ2VEZWwgIT0gTlVMTCkgewogICAgICAgICAgICBTTk1QX0ZSRUUoU3RvcmFnZURlbC0+bG9va3VwQ3RsT3duZXJJbmRleCk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPmxvb2t1cEN0bE93bmVySW5kZXggPSBOVUxMOwogICAgICAgICAgICBTTk1QX0ZSRUUoU3RvcmFnZURlbC0+bG9va3VwQ3RsT3BlcmF0aW9uTmFtZSk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPmxvb2t1cEN0bE9wZXJhdGlvbk5hbWUgPSBOVUxMOwogICAgICAgICAgICBTTk1QX0ZSRUUoU3RvcmFnZURlbC0+bG9va3VwQ3RsVGFyZ2V0QWRkcmVzcyk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPmxvb2t1cEN0bFRhcmdldEFkZHJlc3MgPSBOVUxMOwogICAgICAgICAgICBTTk1QX0ZSRUUoU3RvcmFnZURlbCk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwgPSBOVUxMOwoKICAgICAgICAgICAgU3RvcmFnZURlbCA9IDA7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFhYWDogZnJlZSBpdCwgaXRzIGRlYWQgCiAgICAgICAgICAgICAqLwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChTdG9yYWdlVG1wCiAgICAgICAgICAgICAgICAmJiBTdG9yYWdlVG1wLT5sb29rdXBDdGxSb3dTdGF0dXMgPT0gUlNfQ1JFQVRFQU5ER08pIHsKICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPmxvb2t1cEN0bFJvd1N0YXR1cyA9IFJTX0FDVElWRTsKICAgICAgICAgICAgfSBlbHNlIGlmIChTdG9yYWdlVG1wICYmCiAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+bG9va3VwQ3RsUm93U3RhdHVzID09CiAgICAgICAgICAgICAgICAgICAgICAgUlNfQ1JFQVRFQU5EV0FJVCkgewoKICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPmxvb2t1cEN0bFJvd1N0YXR1cyA9IFJTX05PVElOU0VSVklDRTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5sb29rdXBDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiNpZiAxCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJsb29rdXBDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZV9sb29rdXBDdGxSb3dTdGF0dXMgZW50ZXJpbmcgcnVuYmVmb3JlPSVsZC4uLiAgXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT5sb29rdXBDdGxUYXJnZXRBZGRyZXNzVHlwZSkpOwoKI2VuZGlmCiAgICAgICAgICAgIG1vZGlmeV9sb29rdXBDdGxPcGVyU3RhdHVzKFN0b3JhZ2VUbXAsIDJsKTsKICAgICAgICAgICAgcnVuX2xvb2t1cCgoc3RydWN0IGxvb2t1cFRhYmxlX2RhdGEgKikgU3RvcmFnZVRtcCk7CgogICAgICAgIH0KCiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQo=