ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggNTBjN2JjMy4uNGUyZDFmMyAxMDA2NDQKLS0tIGEvQU5OT1VOQ0UKKysrIGIvQU5OT1VOQ0UKQEAgLTEsMTUgKzEsMTMgQEAKLVRoaXMgaXMgcmVsZWFzZSA5NzAxMjAgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKK1RoaXMgaXMgcmVsZWFzZSA5NzAyMDIgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKIGRldmVsb3BlcidzIG9ubHkgcmVsZWFzZS4gIFRoZXJlIGFyZSBtYW55IGJ1Z3MgYW5kIG1hbnkgdW5pbXBsZW1lbnRlZCBBUEkKIGZlYXR1cmVzLiAgTW9zdCBhcHBsaWNhdGlvbnMgc3RpbGwgZG8gbm90IHdvcmsgY29ycmVjdGx5LgogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gImp1bGxpYXJkQGxyYy5lcGZsLmNoIi4gIFBsZWFzZSBkb24ndAogZm9yZ2V0IHRvIGluY2x1ZGUgYSBDaGFuZ2VMb2cgZW50cnkuCiAKLVdIQVQnUyBORVcgd2l0aCBXaW5lLTk3MDEyMDogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCi0JLSBNb3JlIGtleWJvYXJkIGltcHJvdmVtZW50cy4KLQktIFNvbWUgbmV3IHByaW50ZXIgZHJpdmVyIGZ1bmN0aW9ucy4KLQktIE1hbnkgZml4ZXMgdG8gV2luMzIgbG9hZGVyLgotCS0gQmV0dGVyIGVkaXQgY29udHJvbC4KK1dIQVQnUyBORVcgd2l0aCBXaW5lLTk3MDIwMjogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCisJLSBNb3JlIHByaW50ZXIgc3VwcG9ydC4KKwktIFNvbWUgbmV3IFdpbjMyIGZ1bmN0aW9ucy4KIAktIExvdHMgb2YgYnVnIGZpeGVzLgogCiBTZWUgdGhlIFJFQURNRSBmaWxlIGluIHRoZSBkaXN0cmlidXRpb24gZm9yIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMuCkBAIC0xOCwxMCArMTYsMTAgQEAKIHRoZSByZWxlYXNlIGlzIGF2YWlsYWJsZSBhdCB0aGUgZnRwIHNpdGVzLiAgVGhlIHNvdXJjZXMgd2lsbCBiZSBhdmFpbGFibGUKIGZyb20gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CiAKLSAgZnRwOi8vc3Vuc2l0ZS51bmMuZWR1L3B1Yi9MaW51eC9BTFBIQS93aW5lL2RldmVsb3BtZW50L1dpbmUtOTcwMTIwLnRhci5negotICBmdHA6Ly90c3gtMTEubWl0LmVkdS9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MDEyMC50YXIuZ3oKLSAgZnRwOi8vZnRwLmluZm9tYWdpYy5jb20vcHViL21pcnJvcnMvbGludXgvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MDEyMC50YXIuZ3oKLSAgZnRwOi8vYXJpcy5jb20vcHViL2xpbnV4L0FMUEhBL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NzAxMjAudGFyLmd6CisgIGZ0cDovL3N1bnNpdGUudW5jLmVkdS9wdWIvTGludXgvQUxQSEEvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MDIwMi50YXIuZ3oKKyAgZnRwOi8vdHN4LTExLm1pdC5lZHUvcHViL2xpbnV4L0FMUEhBL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NzAyMDIudGFyLmd6CisgIGZ0cDovL2Z0cC5pbmZvbWFnaWMuY29tL3B1Yi9taXJyb3JzL2xpbnV4L3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NzAyMDIudGFyLmd6CisgIGZ0cDovL2FyaXMuY29tL3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTcwMjAyLnRhci5negogCiBJdCBzaG91bGQgYWxzbyBiZSBhdmFpbGFibGUgZnJvbSBhbnkgc2l0ZSB0aGF0IG1pcnJvcnMgdHN4LTExIG9yIHN1bnNpdGUuCiAKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCAyNzEzNGFlLi5jY2U5MmZkIDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDQgKzEsOTIgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1N1biBGZWIgIDIgMTI6MzE6MDMgMTk5NyAgQWxleGFuZHJlIEp1bGxpYXJkICA8anVsbGlhcmRAbHJjLmVwZmwuY2g+CisKKwkqIFtmaWxlcy9kcml2ZS5jXQorCUZpeGVkIFNldEN1cnJlbnREaXJlY3RvcnkoKSB0byBhbHNvIGNoYW5nZSB0aGUgY3VycmVudCBkcml2ZS4KKworCSogW3dpbjMyL2V4Y2VwdC5jXSBbdG9vbHMvYnVpbGQuY10KKwlVc2UgV2luMzIgcmVnaXN0ZXIgZnVuY3Rpb25zIHRvIGltcGxlbWVudCBleGNlcHRpb24gaGFuZGxpbmcuCisJRml4ZWQgVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyLgorCitGcmkgSmFuIDMxIDE1OjQyOjQxICAxOTk3ICBEYXZpZCBGYXVyZSAgPGRhdmlkLmZhdXJlQGloYW15Lmluc2EtbHlvbi5mcj4KKworCSogW3dpbmRvd3Mva2V5Ym9hcmQuY10KKwlBZGRlZCBLRVlCT0FSRF9HZW5lcmF0ZU1zZyB0byBnZW5lcmF0ZSBDYXBzIExvY2sgYW5kIE51bUxvY2sgZXZlbnRzCisJQWRkZWQgY2FsbHMgdG8gS0VZQk9BUkRfR2VuZXJhdGVNc2cgd2hlbiB0aGUga2V5IGlzIHByZXNzZWQvcmVsZWFzZWQKKwlvciB3aGVuIHRoZSBzdGF0ZSBoYXMgY2hhbmdlZCwgb3V0IG9mIHdpbmUuCisJQ2hhbmdlZCB0eXBlIDMtc3RhdGUgJ1RvZ2dsZUtleVN0YXRlJyB0byBib29sZWFuLiBUaGUgT24vT2ZmIGlzIGdpdmVuCisJYnkgSW5wdXRLZXlTdGF0ZVRhYmxlLgorCitXZWQgSmFuIDI5IDIxOjUzOjA0IDE5OTcgIE1hcmN1cyBNZWlzc25lciA8bXNtZWlzc25AY2lwLmluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlPgorCisJKiBbbG9hZGVyLypyZXNvdXJjZS5jXVtpZjE2MzIvdGh1bmsuY10KKwlFbnVtUmVzb3VyY2UqIGFkZGVkLgorCisJKiBbbG9hZGVyL3BlX3Jlc291cmNlLl0gW2xvYWRlci9yZXNvdXJjZS5jXQorCVNpemVvZlJlc291cmNlMzIoKSwgTG9hZEFjY2VsZXJhdG9yczMyKCkgYWRkZWQuCisKKwkqIFttaXNjL2xzdHIuY10KKwlGb3JtYXRNZXNzYWdlICVuIGFkZGVkLgorCisJKiBbbWlzYy9jcnRkbGwuY11baW5jbHVkZS9jdHJkbGwuaF1baWYxNjMyL2NydGRsbC5zcGVjXQorCV9jaGRyaXZlLF9lcnJubyxfaXNjdHlwZSBhZGRlZC4KKworCSogW21pc2MvY3B1LmNdCisJUmVwbGFjZWQgcnVudGltZV9jcHUgYnkgR2V0U3lzdGVtSW5mbygpLgorCisJKiBbd2luZG93cy9ob29rLmNdW2luY2x1ZGUvaG9vay5oXQorCUZpeGVkIG1hcHBpbmcgb2YgaG9va3MgdG8gd2luMzIvdW5pY29kZS4KKworCSogW3dpbmRvd3Mva2V5Ym9hcmQuY10gW3dpbmRvd3MvZGVmd25kLmNdCisJVXBkYXRlZCB0byB3aW4zMiBzdGFuZGFyZC4KKwlBTFQtPE1lbnVrZXk+IGZpeGVkLgorCisJKiBbd2luZG93cy9xdWV1ZS5jXQorCUdldFdpbmRvd1RocmVhZFByb2Nlc3NJZCgpIGltcGxlbWVudGVkLgorCitNb24gSmFuIDI3IDE2OjQyOjQ5IDE5OTcgIEpvaG4gSGFydmV5IDxqb2huQGRpdmlzaW9uLmNvLnVrPgorCisJKiBbZ3JhcGhpY3MvbWV0YWZpbGVkcnYvKl0gW2dyYXBoaWNzL3gxMWRydi8qXQorCSAgW29iamVjdHMvYml0bWFwLmNdIFtvYmplY3RzL2JydXNoLmNdIFtvYmplY3RzL2ZvbnQuY10KKwkgIFtvYmplY3RzL2dkaW9iai5jXSBbb2JqZWN0cy9wZW4uY10KKwlNb3ZlZCBTZWxlY3RPYmplY3QgdG8gZ3JhcGhpY3MgZHJpdmVycy4gUHJpbnRlciBzdXBwb3J0IG5vdyB3b3JrcworCWluIGEgZmV3IGNhc2VzIGJ1dCBpcyBkZWZpbml0ZWx5IG5vdCBjb21wbGV0ZS4gR2VuZXJpYy90ZXh0IGRyaXZlcgorCXdvcmtzLiBUaGUgcG9zdHNjcmlwdCBkcml2ZXIgd29ya3MgaWYgdHJ1ZSB0eXBlIGZvbnRzIGFyZSBkaXNhYmxlZAorCWZyb20gdGhlIGNvbnRyb2wgcGFuZWwuIFRvIGVuYWJsZSBwcmludGVyIHN1cHBvcnQgYWRkIFByaW50ZXI9b24KKwl0byB0aGUgd2luZSBzZWN0aW9uIG9mIHlvdXIgd2luZS5jb25mIGZpbGUuIFRoaXMgY2F1c2VzIHdyaXRlIG5vdAorCXRvIHdvcmsgcHJvcGVybHkuIEkga25vdyB0aGF0IHNldmVyYWwgb3RoZXIgcHJpbnRlciBkcml2ZXJzIGRvIG5vdAorCXdvcmsuCisKKwkqIFt0b29scy9idWlsZC5jXQorCU1ha2UgLnN0YWJzIG5vdCB1c2VkIGZvciBzdnI0IHNpbmNlIGl0IGRvZXNuJ3QgdXNlIEdOVSBhc3NlbWJsZXIuCisKKwkqIFttaXNjL2ZvbnRlbmdpbmUuY10KKwlNYWtlIHN1cmUgYSBwcmludGYgZG9lc24ndCBjcmFzaCB0aGUgc3lzdGVtLgorCitTYXQgSmFuIDI1IDE1OjUzOjM1IDE5OTcgIEh1dyBEIE0gRGF2aWVzIDxoLmRhdmllczFAcGh5c2ljcy5veGZvcmQuYWMudWs+CisKKwkqIFtvYmplY3RzL21ldGFmaWxlLmNdCisJRml4ZWQgc29tZSBwcm9ibGVtcyB3aXRoIFBsYXlNZXRhRmlsZVJlY29yZCgpLgorCisJKiBbb2JqZWN0cy9kYy5jXQorCWhDbGlwUmduIGdldHMgaW5pdGlhbGl6ZWQgaW4gR2V0RENTdGF0ZSgpLgorCitGcmkgSmFuIDI0IDIxOjIyOjI2IDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+CisKKwkqIFtkZWJ1Z2dlci9zdGFicy5jXQorCUhhbmRsZSBmaWxlIG5hbWVzIGJlZ2lubmluZyB3aXRoICcvJy4KKworRnJpIEphbiAyNCAxODozMzowNCAxOTk3ICBSb2JlcnQgUG91bGlvdCA8a3J5bm9zQGNsaWMubmV0PgorCisJKiBbKi8qXQorCVNvbWUgbW9yZSBwYXRjaGVzIGZvciBPUy8yIHN1cHBvcnQuCisKK0ZyaSBKYW4gMjQgMTE6MzA6NDEgMTk5NyAgQmFuZyBKdW4tWW91bmcgIDxiYW5nanlAbm93bnVyaS5ub3djb20uY28ua3I+CisKKwkqIFtyZXNvdXJjZXMvc3lzcmVzX0tvLnJjXQorCVVwZGF0ZWQgc3VwcG9ydCBmb3IgS29yZWFuIChLbykgbGFuZ3VhZ2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFN1biBKYW4gMTkgMTE6NDY6NDggMTk5NyAgQWxleGFuZHJlIEp1bGxpYXJkICA8anVsbGlhcmRAbHJjLmVwZmwuY2g+CiAKIAkqIFtsb2FkZXIvbW9kdWxlLmNdCmRpZmYgLS1naXQgYS9jb250cm9scy9jb21iby5jIGIvY29udHJvbHMvY29tYm8uYwppbmRleCA3MjU5YWVjLi41ZWNlODc3IDEwMDY0NAotLS0gYS9jb250cm9scy9jb21iby5jCisrKyBiL2NvbnRyb2xzL2NvbWJvLmMKQEAgLTkzMiw5ICs5MzIsMTQgQEAKICAgaW50ICAgaSwgdG9wLCBoZWlnaHQ7CiAKICAgdG9wID0gMDsKKyAgaWYgKCFscGhsKQorICAgIHJldHVybiAwOwogICBoZGMgPSBCZWdpblBhaW50MTYoIGh3bmQsICZwcyApOwogCi0gIGlmICghSXNXaW5kb3dWaXNpYmxlMTYoaHduZCkgfHwgIWxwaGwtPmJSZWRyYXdGbGFnKSB7CisgIGlmICghbHBobCkgeworICAgIGZwcmludGYoc3RkbmltcCwiQ0JMUGFpbnQ6IENMQm94R2V0TGlzdEhlYWRlciByZXR1cm5lZCBOVUxMIVxuIik7CisgIH0KKyAgaWYgKCFJc1dpbmRvd1Zpc2libGUxNihod25kKSB8fCAhbHBobCB8fCAhbHBobC0+YlJlZHJhd0ZsYWcpIHsKICAgICBFbmRQYWludDE2KGh3bmQsICZwcyk7CiAgICAgcmV0dXJuIDA7CiAgIH0KZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2VkaXQuYyBiL2NvbnRyb2xzL2VkaXQuYwppbmRleCBjOGIyNDFkLi5iMzMzMjIyIDEwMDY0NAotLS0gYS9jb250cm9scy9lZGl0LmMKKysrIGIvY29udHJvbHMvZWRpdC5jCkBAIC0zNDUwLDExICszNDUwLDExIEBACiAJQk9PTDMyIHNoaWZ0OwogCUJPT0wzMiBjb250cm9sOwogCi0JaWYgKEdldEtleVN0YXRlKFZLX01FTlUpICYgMHg4MDAwKQorCWlmIChHZXRLZXlTdGF0ZTMyKFZLX01FTlUpICYgMHg4MDAwKQogCQlyZXR1cm4gMDsKIAotCXNoaWZ0ID0gR2V0S2V5U3RhdGUoVktfU0hJRlQpICYgMHg4MDAwOwotCWNvbnRyb2wgPSBHZXRLZXlTdGF0ZShWS19DT05UUk9MKSAmIDB4ODAwMDsKKwlzaGlmdCA9IEdldEtleVN0YXRlMzIoVktfU0hJRlQpICYgMHg4MDAwOworCWNvbnRyb2wgPSBHZXRLZXlTdGF0ZTMyKFZLX0NPTlRST0wpICYgMHg4MDAwOwogCiAJRURJVF9HZXRTZWwod25kUHRyLCAmcywgJmUpOwogCXN3aXRjaCAod1BhcmFtKSB7CkBAIC0zNTk5LDcgKzM1OTksNyBAQAogCWMgPSBFRElUX0NvbEZyb21XbmRYKHduZFB0ciwgbCwgeCk7CiAJbGkgPSAoSU5UMzIpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsLCAwKTsKIAllID0gbGkgKyBjOwotCWlmIChHZXRLZXlTdGF0ZShWS19TSElGVCkgJiAweDgwMDApCisJaWYgKEdldEtleVN0YXRlMzIoVktfU0hJRlQpICYgMHg4MDAwKQogCQlFRElUX0dldFNlbCh3bmRQdHIsICZzLCBOVUxMKTsKIAllbHNlCiAJCXMgPSBlOwpkaWZmIC0tZ2l0IGEvY29udHJvbHMvbGlzdGJveC5jIGIvY29udHJvbHMvbGlzdGJveC5jCmluZGV4IDAwNmRlMjUuLmZkOGM2NjUgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2xpc3Rib3guYworKysgYi9jb250cm9scy9saXN0Ym94LmMKQEAgLTM0OSwxOCArMzQ5LDIyIEBACiAgICAgZWxzZSBpZiAoZGVzY3ItPnN0eWxlICYgTEJTX09XTkVSRFJBV1ZBUklBQkxFKQogICAgIHsKICAgICAgICAgSU5UMzIgaTsKLSAgICAgICAgaWYgKGluZGV4IDwgZGVzY3ItPnRvcF9pdGVtKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGkgPSBkZXNjci0+dG9wX2l0ZW0tMTsgaSA+PSBpbmRleDsgaS0tKQotICAgICAgICAgICAgICAgIHJlY3QtPnRvcCAtPSBkZXNjci0+aXRlbXNbaV0uaGVpZ2h0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpID0gZGVzY3ItPnRvcF9pdGVtOyBpIDwgaW5kZXg7IGkrKykKLSAgICAgICAgICAgICAgICByZWN0LT50b3AgKz0gZGVzY3ItPml0ZW1zW2ldLmhlaWdodDsKLSAgICAgICAgfQotICAgICAgICByZWN0LT5ib3R0b20gPSByZWN0LT50b3AgKyBkZXNjci0+aXRlbXNbaW5kZXhdLmhlaWdodDsKICAgICAgICAgcmVjdC0+cmlnaHQgKz0gZGVzY3ItPmhvcnpfcG9zOworICAgICAgICBpZiAoKGluZGV4ID49IDApICYmIChpbmRleCA8IGRlc2NyLT5uYl9pdGVtcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IGRlc2NyLT50b3BfaXRlbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBkZXNjci0+dG9wX2l0ZW0tMTsgaSA+PSBpbmRleDsgaS0tKQorICAgICAgICAgICAgICAgICAgICByZWN0LT50b3AgLT0gZGVzY3ItPml0ZW1zW2ldLmhlaWdodDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBkZXNjci0+dG9wX2l0ZW07IGkgPCBpbmRleDsgaSsrKQorICAgICAgICAgICAgICAgICAgICByZWN0LT50b3AgKz0gZGVzY3ItPml0ZW1zW2ldLmhlaWdodDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlY3QtPmJvdHRvbSA9IHJlY3QtPnRvcCArIGRlc2NyLT5pdGVtc1tpbmRleF0uaGVpZ2h0OworCisgICAgICAgIH0KICAgICB9CiAgICAgZWxzZQogICAgIHsKQEAgLTE4OTIsNyArMTg5Niw3IEBACiAgICAgaWYgKGNhcmV0ID49IDApCiAgICAgewogICAgICAgICBpZiAoKGRlc2NyLT5zdHlsZSAmIExCU19FWFRFTkRFRFNFTCkgJiYKLSAgICAgICAgICAgICEoR2V0S2V5U3RhdGUoIFZLX1NISUZUICkgJiAweDgwMDApKQorICAgICAgICAgICAgIShHZXRLZXlTdGF0ZTMyKCBWS19TSElGVCApICYgMHg4MDAwKSkKICAgICAgICAgICAgIGRlc2NyLT5hbmNob3JfaXRlbSA9IGNhcmV0OwogICAgICAgICBMSVNUQk9YX01vdmVDYXJldCggd25kLCBkZXNjciwgY2FyZXQsIFRSVUUgKTsKICAgICAgICAgaWYgKGRlc2NyLT5zdHlsZSAmIExCU19OT1RJRlkpCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9icmVhay5jIGIvZGVidWdnZXIvYnJlYWsuYwppbmRleCBkODQ0MjdkLi5lMjI2NWY5IDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9icmVhay5jCisrKyBiL2RlYnVnZ2VyL2JyZWFrLmMKQEAgLTIwOCwxMCArMjA4LDI0IEBACiB7CiAgICAgREJHX0FERFIgYWRkciA9ICphZGRyZXNzOwogICAgIGludCBudW07CisgICAgdW5zaWduZWQgaW50IHNlZzI7CiAgICAgQllURSAqcDsKIAogICAgIERCR19GSVhfQUREUl9TRUcoICZhZGRyLCBDU19yZWcoJkRFQlVHX2NvbnRleHQpICk7CiAKKyAgICBpZiggYWRkci50eXBlICE9IE5VTEwgJiYgYWRkci50eXBlID09IERFQlVHX1R5cGVJbnRDb25zdCApCisgICAgICB7CisJLyoKKwkgKiBXZSBrbm93IHRoYXQgd2UgaGF2ZSB0aGUgYWN0dWFsIG9mZnNldCBzdG9yZWQgc29tZXdoZXJlCisJICogZWxzZSBpbiAzMi1iaXQgc3BhY2UuICBHcmFiIGl0LCBhbmQgd2UKKwkgKiBzaG91bGQgYmUgYWxsIHNldC4KKwkgKi8KKwlzZWcyID0gYWRkci5zZWc7CisJYWRkci5zZWcgPSAwOworCWFkZHIub2ZmID0gREVCVUdfR2V0RXhwclZhbHVlKCZhZGRyLCBOVUxMKTsKKwlhZGRyLnNlZyA9IHNlZzI7CisgICAgICB9CisKICAgICBpZiAobmV4dF9icCA8IE1BWF9CUkVBS1BPSU5UUykKICAgICAgICAgbnVtID0gbmV4dF9icCsrOwogICAgIGVsc2UgIC8qIHRyeSB0byBmaW5kIGFuIGVtcHR5IHNsb3QgKi8gIApkaWZmIC0tZ2l0IGEvZGVidWdnZXIvZGJnLnkgYi9kZWJ1Z2dlci9kYmcueQppbmRleCBmNzlhM2ZmLi5iODcyOTFhIDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9kYmcueQorKysgYi9kZWJ1Z2dlci9kYmcueQpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgIm9wdGlvbnMuaCIKICNpbmNsdWRlICJxdWV1ZS5oIgogI2luY2x1ZGUgIndpbi5oIgorI2luY2x1ZGUgIndpbm50LmgiCiAjaW5jbHVkZSAiZGVidWdnZXIuaCIKIAogI2luY2x1ZGUgImV4cHIuaCIKQEAgLTI4OSw3ICsyOTAsNyBAQAogICAgIHwgdEVOVU0gdElERU5USUZJRVIJCXsgJCQgPSBERUJVR19UeXBlQ2FzdChFTlVNLCAkMik7IH0KIAogZXhwcl9hZGRyOgotICAgIGV4cHIJCQkgeyAkJCA9IERFQlVHX0V2YWxFeHByKCQxKSB9CisgICAgZXhwcgkJCSB7ICQkID0gREVCVUdfRXZhbEV4cHIoJDEpOyB9CiAKIGV4cHJfdmFsdWU6CiAgICAgICBleHByICAgICAgICB7IERCR19BRERSIGFkZHIgID0gREVCVUdfRXZhbEV4cHIoJDEpOwpAQCAtMzQ4LDcgKzM0OSw3IEBACiAgKiBvZiBleHByZXNzaW9uIHRoYXQgaXMgc3VpdGFibGUgdG8gYmUgdXNlZCBhcyBhbiBsdmFsdWUuCiAgKi8KIGx2YWxfYWRkcjoKLSAgICBsdmFsCQkJIHsgJCQgPSBERUJVR19FdmFsRXhwcigkMSkgfQorICAgIGx2YWwJCQkgeyAkJCA9IERFQlVHX0V2YWxFeHByKCQxKTsgfQogCiBsdmFsOgogICAgICAgbHZhbHVlICAgICAgICAgICAgICAgICAgICAgeyAkJCA9ICQxOyB9CkBAIC01MzUsMTcgKzUzNiw2IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgREVCVUdfRW50ZXJEZWJ1Z2dlcgotICoKLSAqIEZvcmNlIGFuIGVudHJ5IGludG8gdGhlIGRlYnVnZ2VyLgotICovCi12b2lkIERFQlVHX0VudGVyRGVidWdnZXIodm9pZCkKLXsKLSAgICBraWxsKCBnZXRwaWQoKSwgU0lHSFVQICk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgRGVidWdCcmVhazE2ICAgKEtFUk5FTC4yMDMpCiAgKi8KIHZvaWQgRGVidWdCcmVhazE2KCBDT05URVhUICpyZWdzICkKQEAgLTU2MCw2ICs1NTAsMTcgQEAKIHZvaWQgd2luZV9kZWJ1ZyggaW50IHNpZ25hbCwgU0lHQ09OVEVYVCAqcmVncyApCiB7CiAgICAgREVCVUdfU2V0U2lnQ29udGV4dCggcmVncyApOworI2lmIDAKKyAgICBEV09SRCAqc3RhY2sgPSAoRFdPUkQgKilFU1BfcmVnKCZERUJVR19jb250ZXh0KTsKKyAgICAqKC0tc3RhY2spID0gMDsKKyAgICAqKC0tc3RhY2spID0gMDsKKyAgICAqKC0tc3RhY2spID0gRUhfTk9OQ09OVElOVUFCTEU7CisgICAgKigtLXN0YWNrKSA9IEVYQ0VQVElPTl9BQ0NFU1NfVklPTEFUSU9OOworICAgICooLS1zdGFjaykgPSBFSVBfcmVnKCZERUJVR19jb250ZXh0KTsKKyAgICBFU1BfcmVnKCZERUJVR19jb250ZXh0KSA9IChEV09SRClzdGFjazsKKyAgICBFSVBfcmVnKCZERUJVR19jb250ZXh0KSA9IEdldFByb2NBZGRyZXNzMzIoIEdldE1vZHVsZUhhbmRsZSgiS0VSTkVMMzIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSYWlzZUV4Y2VwdGlvbiIgKTsKKyNlbmRpZgogICAgIERFQlVHX01haW4oIHNpZ25hbCApOwogICAgIERFQlVHX0dldFNpZ0NvbnRleHQoIHJlZ3MgKTsKIH0KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL2V4cHIuYyBiL2RlYnVnZ2VyL2V4cHIuYwppbmRleCA2ZWY4ZDM3Li42OTY4YzA2IDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9leHByLmMKKysrIGIvZGVidWdnZXIvZXhwci5jCkBAIC00MTgsNyArNDE4LDE0IEBACiAgICAgICBydG4udHlwZSA9IERFQlVHX1R5cGVJbnRDb25zdDsKICAgICAgIGV4cC0+dW4ucmdpc3Rlci5yZXN1bHQgPSBERUJVR19HZXRSZWdpc3RlcihleHAtPnVuLnJnaXN0ZXIucmVnKTsKICAgICAgIHJ0bi5vZmYgPSAodW5zaWduZWQgaW50KSAmZXhwLT51bi5yZ2lzdGVyLnJlc3VsdDsKLSAgICAgIHJ0bi5zZWcgPSAwOworICAgICAgaWYoIGV4cC0+dW4ucmdpc3Rlci5yZWcgPT0gUkVHX0VJUCApCisJeworCSAgcnRuLnNlZyA9IENTX3JlZygmREVCVUdfY29udGV4dCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHJ0bi5zZWcgPSBEU19yZWcoJkRFQlVHX2NvbnRleHQpOworCX0KICAgICAgIGJyZWFrOwogICAgIGNhc2UgRVhQUl9UWVBFX0JJTk9QOgogICAgICAgZXhwMSA9IERFQlVHX0V2YWxFeHByKGV4cC0+dW4uYmlub3AuZXhwMSk7CmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9oYXNoLmMgYi9kZWJ1Z2dlci9oYXNoLmMKaW5kZXggMjBmM2U2NC4uYWI2M2M0YSAxMDA2NDQKLS0tIGEvZGVidWdnZXIvaGFzaC5jCisrKyBiL2RlYnVnZ2VyL2hhc2guYwpAQCAtNzUxLDE3ICs3NTEsMjAgQEAKICAgICBmb3IgKG9rID0gTW9kdWxlRmlyc3QoJmVudHJ5KTsgb2s7IG9rID0gTW9kdWxlTmV4dCgmZW50cnkpKQogICAgIHsKICAgICAgICAgaWYgKCEocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoIGVudHJ5LmhNb2R1bGUgKSkpIGNvbnRpbnVlOworICAgICAgICBpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfV0lOMzIpIGNvbnRpbnVlOwogCiAgICAgICAgIG5hbWUgPSAodW5zaWduZWQgY2hhciAqKXBNb2R1bGUgKyBwTW9kdWxlLT5uYW1lX3RhYmxlOwogCisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkxvYWRpbmcgc3ltYm9scyBmcm9tIFdpbjE2IG1vZHVsZSAlLipzLi4uXG4iLAorICAgICAgICAgICAgICAgICAqbmFtZSwgbmFtZSArIDEgKTsKKwogICAgICAgICAvKiBGaXJzdCBzZWFyY2ggdGhlIHJlc2lkZW50IG5hbWVzICovCiAKICAgICAgICAgY3BudCA9ICh1bnNpZ25lZCBjaGFyICopcE1vZHVsZSArIHBNb2R1bGUtPm5hbWVfdGFibGU7CiAgICAgICAgIHdoaWxlICgqY3BudCkKICAgICAgICAgewogICAgICAgICAgICAgY3BudCArPSAqY3BudCArIDEgKyBzaXplb2YoV09SRCk7Ci0gICAgICAgICAgICBzcHJpbnRmKCBidWZmZXIsICIlKi4qcy4lKi4qcyIsICpuYW1lLCAqbmFtZSwgbmFtZSArIDEsCi0gICAgICAgICAgICAgICAgICAgICAqY3BudCwgKmNwbnQsIGNwbnQgKyAxICk7CisgICAgICAgICAgICBzcHJpbnRmKCBidWZmZXIsICIlLipzXyUuKnMiLCAqbmFtZSwgbmFtZSArIDEsICpjcG50LCBjcG50ICsgMSApOwogICAgICAgICAgICAgaWYgKChhZGRyZXNzID0gTU9EVUxFX0dldEVudHJ5UG9pbnQoIGVudHJ5LmhNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooV09SRCAqKShjcG50ICsgKmNwbnQgKyAxKSApKSkKICAgICAgICAgICAgIHsKQEAgLTc3OSw4ICs3ODIsNyBAQAogICAgICAgICB3aGlsZSAoKmNwbnQpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNwbnQgKz0gKmNwbnQgKyAxICsgc2l6ZW9mKFdPUkQpOwotICAgICAgICAgICAgc3ByaW50ZiggYnVmZmVyLCAiJSouKnMuJSouKnMiLCAqbmFtZSwgKm5hbWUsIG5hbWUgKyAxLAotICAgICAgICAgICAgICAgICAgICAgKmNwbnQsICpjcG50LCBjcG50ICsgMSApOworICAgICAgICAgICAgc3ByaW50ZiggYnVmZmVyLCAiJS4qc18lLipzIiwgKm5hbWUsIG5hbWUgKyAxLCAqY3BudCwgY3BudCArIDEgKTsKICAgICAgICAgICAgIGlmICgoYWRkcmVzcyA9IE1PRFVMRV9HZXRFbnRyeVBvaW50KCBlbnRyeS5oTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihXT1JEICopKGNwbnQgKyAqY3BudCArIDEpICkpKQogICAgICAgICAgICAgewpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvbWVtb3J5LmMgYi9kZWJ1Z2dlci9tZW1vcnkuYwppbmRleCBmNjI5MTk0Li45ZjBjYjUyIDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9tZW1vcnkuYworKysgYi9kZWJ1Z2dlci9tZW1vcnkuYwpAQCAtMTQ2LDYgKzE0Niw3IEBACiAgICAgdW5zaWduZWQgaW50CSogZHVtcDsKICAgICBpbnQJCQkgIGk7CiAgICAgdW5zaWduZWQgY2hhcgkqIHBudDsKKyAgICB1bnNpZ25lZCBpbnQJICBzZWcyOwogICAgIHN0cnVjdCBkYXRhdHlwZQkqIHRlc3R0eXBlOwogICAgIHVuc2lnbmVkIHNob3J0IGludAkqIHdkdW1wOwogCkBAIC0xNTksMTMgKzE2MCwzMyBAQAogICAgICAqLwogICAgIGlmKCBhZGRyLnR5cGUgIT0gTlVMTCApCiAgICAgICB7Ci0JaWYgKCFEQkdfQ0hFQ0tfUkVBRF9QVFIoICZhZGRyLCAxICkpIHJldHVybjsKLQlERUJVR19UeXBlRGVyZWZQb2ludGVyKCZhZGRyLCAmdGVzdHR5cGUpOwotCWlmKCB0ZXN0dHlwZSAhPSBOVUxMIHx8IGFkZHIudHlwZSA9PSBERUJVR19UeXBlSW50Q29uc3QgKQorCWlmKCBhZGRyLnR5cGUgPT0gREVCVUdfVHlwZUludENvbnN0ICkKIAkgIHsKKwkgICAgLyoKKwkgICAgICogV2Uga25vdyB0aGF0IHdlIGhhdmUgdGhlIGFjdHVhbCBvZmZzZXQgc3RvcmVkIHNvbWV3aGVyZQorCSAgICAgKiBlbHNlIGluIDMyLWJpdCBzcGFjZS4gIEdyYWIgaXQsIGFuZCB3ZQorCSAgICAgKiBzaG91bGQgYmUgYWxsIHNldC4KKwkgICAgICovCisJICAgIHNlZzIgPSBhZGRyLnNlZzsKKwkgICAgYWRkci5zZWcgPSAwOwogCSAgICBhZGRyLm9mZiA9IERFQlVHX0dldEV4cHJWYWx1ZSgmYWRkciwgTlVMTCk7CisJICAgIGFkZHIuc2VnID0gc2VnMjsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIGlmICghREJHX0NIRUNLX1JFQURfUFRSKCAmYWRkciwgMSApKSByZXR1cm47CisJICAgIERFQlVHX1R5cGVEZXJlZlBvaW50ZXIoJmFkZHIsICZ0ZXN0dHlwZSk7CisJICAgIGlmKCB0ZXN0dHlwZSAhPSBOVUxMIHx8IGFkZHIudHlwZSA9PSBERUJVR19UeXBlSW50Q29uc3QgKQorCSAgICAgIHsKKwkJYWRkci5vZmYgPSBERUJVR19HZXRFeHByVmFsdWUoJmFkZHIsIE5VTEwpOworCSAgICAgIH0KIAkgIH0KICAgICAgIH0KKyAgICBlbHNlIGlmICghYWRkci5zZWcgJiYgIWFkZHIub2ZmKQorICAgIHsKKwlmcHJpbnRmKHN0ZGVyciwiSW52YWxpZCBleHByZXNzaW9uXG4iKTsKKwlyZXR1cm47CisgICAgfQogCiAgICAgaWYgKGZvcm1hdCAhPSAnaScgJiYgY291bnQgPiAxKQogICAgIHsKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL21zYy5jIGIvZGVidWdnZXIvbXNjLmMKaW5kZXggOTBiZjBmZC4uNjUxNGYzNyAxMDA2NDQKLS0tIGEvZGVidWdnZXIvbXNjLmMKKysrIGIvZGVidWdnZXIvbXNjLmMKQEAgLTg5NSw3ICs4OTUsNyBAQAogCiAgIG9yaWdfc2l6ZSA9IHNpemU7CiAgIGRiZ3B0ciA9IChMUElNQUdFX0RFQlVHX0RJUkVDVE9SWSkgKGxvYWRfYWRkciArIHZfYWRkcik7Ci0gIGZvcig7IHNpemUgPiAwOyBzaXplIC09IHNpemVvZigqZGJncHRyKSwgZGJncHRyKysgKQorICBmb3IoOyBzaXplID49IHNpemVvZigqZGJncHRyKTsgc2l6ZSAtPSBzaXplb2YoKmRiZ3B0ciksIGRiZ3B0cisrICkKICAgICB7CiAgICAgICBzd2l0Y2goZGJncHRyLT5UeXBlKQogCXsKQEAgLTkwOCw3ICs5MDgsNyBAQAogCiAgIHNpemUgPSBvcmlnX3NpemU7CiAgIGRiZ3B0ciA9IChMUElNQUdFX0RFQlVHX0RJUkVDVE9SWSkgKGxvYWRfYWRkciArIHZfYWRkcik7Ci0gIGZvcig7IHNpemUgPiAwOyBzaXplIC09IHNpemVvZigqZGJncHRyKSwgZGJncHRyKysgKQorICBmb3IoOyBzaXplID49IHNpemVvZigqZGJncHRyKTsgc2l6ZSAtPSBzaXplb2YoKmRiZ3B0ciksIGRiZ3B0cisrICkKICAgICB7CiAgICAgICBzd2l0Y2goZGJncHRyLT5UeXBlKQogCXsKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL3NvdXJjZS5jIGIvZGVidWdnZXIvc291cmNlLmMKaW5kZXggNGVjZTkzNy4uOGNhZDU2OCAxMDA2NDQKLS0tIGEvZGVidWdnZXIvc291cmNlLmMKKysrIGIvZGVidWdnZXIvc291cmNlLmMKQEAgLTEyLDcgKzEyLDcgQEAKICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8c3RyaW5ncy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPG1hbGxvYy5oPgogCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9zdGFicy5jIGIvZGVidWdnZXIvc3RhYnMuYwppbmRleCBhNTJjNDY3Li44YTFiZWExIDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9zdGFicy5jCisrKyBiL2RlYnVnZ2VyL3N0YWJzLmMKQEAgLTExLDcgKzExLDkgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2lmbmRlZiBQQVRIX01BWAorI2RlZmluZSBQQVRIX01BWCBfTUFYX1BBVEgKKyNlbmRpZgogCiAjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAiZGVidWdnZXIuaCIKQEAgLTI0LDYgKzI2LDkgQEAKICNpZmRlZiBfX0VMRl9fCiAjaW5jbHVkZSA8ZWxmLmg+CiAjaW5jbHVkZSA8bGluay5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjZWxpZiBkZWZpbmVkKF9fRU1YX18pCisjaW5jbHVkZSA8YV9vdXQuaD4KICNlbHNlCiAjaW5jbHVkZSA8YS5vdXQuaD4KICNlbmRpZgpAQCAtODgzLDcgKzg4OCwxMCBAQAogCSAgICB9CiAJICBlbHNlCiAJICAgIHsKLQkgICAgICBzdHJjYXQoY3VycnBhdGgsIHB0cik7CisJICAgICAgaWYgKCpwdHIgIT0gJy8nKQorCSAgICAgICAgc3RyY2F0KGN1cnJwYXRoLCBwdHIpOworCSAgICAgIGVsc2UKKwkgICAgICAgIHN0cmNweShjdXJycGF0aCwgcHRyKTsKIAkgICAgICBzdWJwYXRoID0gcHRyOwogCSAgICB9CiAJICBsYXN0X25zbyA9IGk7CmRpZmYgLS1naXQgYS9kZWJ1Z2dlci90eXBlcy5jIGIvZGVidWdnZXIvdHlwZXMuYwppbmRleCAwYjI2ZDUwLi4xYmJjNmVkIDEwMDY0NAotLS0gYS9kZWJ1Z2dlci90eXBlcy5jCisrKyBiL2RlYnVnZ2VyL3R5cGVzLmMKQEAgLTExLDE0ICsxMSwxMSBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaWZuZGVmIF9fRU1YX18KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2VuZGlmCiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxtYWxsb2MuaD4KIApkaWZmIC0tZ2l0IGEvZmlsZXMvZGlyZWN0b3J5LmMgYi9maWxlcy9kaXJlY3RvcnkuYwppbmRleCAxYzY0Zjc0Li4xYWJjNGIyIDEwMDY0NAotLS0gYS9maWxlcy9kaXJlY3RvcnkuYworKysgYi9maWxlcy9kaXJlY3RvcnkuYwpAQCAtNTkzLDcgKzU5Myw4IEBACiAgICAgbHN0cmNweW4zMkEoIGJ1ZmZlciwgZnVsbF9uYW1lLnNob3J0X25hbWUsIGJ1ZmxlbiApOwogICAgIHJlcyA9IGZ1bGxfbmFtZS5sb25nX25hbWUgKwogICAgICAgICAgICAgICBzdHJsZW4oRFJJVkVfR2V0Um9vdCggZnVsbF9uYW1lLnNob3J0X25hbWVbMF0gLSAnQScgKSk7Ci0gICAgaWYgKCpyZXMgJiYgKGJ1ZmxlbiA+IDMpKSBsc3RyY3B5bjMyQSggYnVmZmVyICsgMywgcmVzICsgMSwgYnVmbGVuIC0gMyApOworICAgIHdoaWxlICgqcmVzID09ICcvJykgcmVzKys7CisgICAgaWYgKGJ1ZmxlbiA+IDMpIGxzdHJjcHluMzJBKCBidWZmZXIgKyAzLCByZXMsIGJ1ZmxlbiAtIDMgKTsKICAgICBmb3IgKHAgPSBidWZmZXI7ICpwOyBwKyspIGlmICgqcCA9PSAnLycpICpwID0gJ1xcJzsKICAgICBpZiAobGFzdHBhcnQpICpsYXN0cGFydCA9IHN0cnJjaHIoIGJ1ZmZlciwgJ1xcJyApICsgMTsKICAgICByZXR1cm4gKnJlcyA/IHN0cmxlbihyZXMpICsgMiA6IDM7CkBAIC02MjIsNyArNjIzLDggQEAKICAgICBsc3RyY3B5bkF0b1coIGJ1ZmZlciwgZnVsbF9uYW1lLnNob3J0X25hbWUsIGJ1ZmxlbiApOwogICAgIHJlcyA9IGZ1bGxfbmFtZS5sb25nX25hbWUgKwogICAgICAgICAgICAgICBzdHJsZW4oRFJJVkVfR2V0Um9vdCggZnVsbF9uYW1lLnNob3J0X25hbWVbMF0gLSAnQScgKSk7Ci0gICAgaWYgKCpyZXMgJiYgKGJ1ZmxlbiA+IDMpKSBsc3RyY3B5bkF0b1coIGJ1ZmZlciArIDMsIHJlcyArIDEsIGJ1ZmxlbiAtIDMgKTsKKyAgICB3aGlsZSAoKnJlcyA9PSAnLycpIHJlcysrOworICAgIGlmIChidWZsZW4gPiAzKSBsc3RyY3B5bkF0b1coIGJ1ZmZlciArIDMsIHJlcyArIDEsIGJ1ZmxlbiAtIDMgKTsKICAgICBmb3IgKHAgPSBidWZmZXI7ICpwOyBwKyspIGlmICgqcCA9PSAnLycpICpwID0gJ1xcJzsKICAgICBpZiAobGFzdHBhcnQpCiAgICAgewpkaWZmIC0tZ2l0IGEvZmlsZXMvZHJpdmUuYyBiL2ZpbGVzL2RyaXZlLmMKaW5kZXggYjM4ZjJjMS4uOGIwNDQ5MyAxMDA2NDQKLS0tIGEvZmlsZXMvZHJpdmUuYworKysgYi9maWxlcy9kcml2ZS5jCkBAIC02NzgsMzYgKzY3OCwzOCBAQAogICovCiBCT09MMTYgU2V0Q3VycmVudERpcmVjdG9yeTE2KCBMUENTVFIgZGlyICkKIHsKLSAgICBpZiAoZGlyWzBdICYmIChkaXJbMV09PSc6JykpCi0gICAgewotICAgICAgICBpbnQgZHJpdmUgPSB0b2xvd2VyKCAqZGlyICkgLSAnYSc7Ci0gICAgICAgIGlmICghRFJJVkVfSXNWYWxpZChkcml2ZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERPU19FUlJPUiggRVJfSW52YWxpZERyaXZlLCBFQ19NZWRpYUVycm9yLCBTQV9BYm9ydCwgRUxfRGlzayApOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgZGlyICs9IDI7Ci0gICAgfQotICAgIC8qIEZJWE1FOiB3aGF0IGFib3V0IGVtcHR5IHN0cmluZ3M/IEFkZCBhIFxcID8gKi8KLSAgICByZXR1cm4gRFJJVkVfQ2hkaXIoIERSSVZFX0dldEN1cnJlbnREcml2ZSgpLCBkaXIgKTsKKyAgICByZXR1cm4gU2V0Q3VycmVudERpcmVjdG9yeTMyQSggZGlyICk7CiB9CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgU2V0Q3VycmVudERpcmVjdG9yeTMyQSAgIChLRVJORUwzMi40NzkpCiAgKi8KIEJPT0wzMiBTZXRDdXJyZW50RGlyZWN0b3J5MzJBKCBMUENTVFIgZGlyICkKIHsKLSAgICAvKiBGSVhNRTogVW5hdXRob3JpemVkIFdpbmRvd3MgOTUgbWVudGlvbnMgdGhhdCBTZXRDdXJyZW50RGlyZWN0b3J5IAotICAgICAqIG1heSBjaGFuZ2UgZHJpdmUgYW5kIGN1cnJlbnQgZGlyZWN0b3J5IGZvciB0aGVyZSBpcyBubyBkcml2ZSBiYXNlZAotICAgICAqIGN1cnJlbnRkaXIgdGFibGU/Ci0gICAgICovCi0gICAgcmV0dXJuIFNldEN1cnJlbnREaXJlY3RvcnkxNihkaXIpOworICAgIGludCBkcml2ZSA9IERSSVZFX0dldEN1cnJlbnREcml2ZSgpOworCisgICAgaWYgKGRpclswXSAmJiAoZGlyWzFdPT0nOicpKQorICAgIHsKKyAgICAgICAgZHJpdmUgPSB0b2xvd2VyKCAqZGlyICkgLSAnYSc7CisgICAgICAgIGlmICghRFJJVkVfSXNWYWxpZCggZHJpdmUgKSkKKyAgICAgICAgeworICAgICAgICAgICAgRE9TX0VSUk9SKCBFUl9JbnZhbGlkRHJpdmUsIEVDX01lZGlhRXJyb3IsIFNBX0Fib3J0LCBFTF9EaXNrICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZGlyICs9IDI7CisgICAgfQorICAgIC8qIEZJWE1FOiB3aGF0IGFib3V0IGVtcHR5IHN0cmluZ3M/IEFkZCBhIFxcID8gKi8KKyAgICBpZiAoIURSSVZFX0NoZGlyKCBkcml2ZSwgZGlyICkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoZHJpdmUgPT0gRFJJVkVfR2V0Q3VycmVudERyaXZlKCkpIHJldHVybiBUUlVFOworICAgIHJldHVybiBEUklWRV9TZXRDdXJyZW50RHJpdmUoIGRyaXZlICk7CiB9CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgU2V0Q3VycmVudERpcmVjdG9yeTMyVyAgIChLRVJORUwzMi40ODApCiAgKi8KLUJPT0wzMiBTZXRDdXJyZW50RGlyZWN0b3J5MzJXKCBMUENXU1RSIGRpclcpCitCT09MMzIgU2V0Q3VycmVudERpcmVjdG9yeTMyVyggTFBDV1NUUiBkaXJXICkKIHsKICAgICBMUFNUUiBkaXIgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIGRpclcgKTsKICAgICBCT09MMzIgcmVzID0gU2V0Q3VycmVudERpcmVjdG9yeTMyQSggZGlyICk7CmRpZmYgLS1naXQgYS9maWxlcy9maWxlLmMgYi9maWxlcy9maWxlLmMKaW5kZXggYjllMmI0YS4uOWU4YTA0MiAxMDA2NDQKLS0tIGEvZmlsZXMvZmlsZS5jCisrKyBiL2ZpbGVzL2ZpbGUuYwpAQCAtNDM1LDYgKzQzNSwyMSBAQAogICAgIHJldHVybiBUUlVFOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDb21wYXJlRmlsZVRpbWUgICAoS0VSTkVMMzIuMjgpCisgKi8KK0lOVDMyIENvbXBhcmVGaWxlVGltZSggTFBGSUxFVElNRSB4LCBMUEZJTEVUSU1FIHkgKQoreworCWlmICh4LT5kd0hpZ2hEYXRlVGltZSA+IHktPmR3SGlnaERhdGVUaW1lKQorCQlyZXR1cm4gMTsKKwlpZiAoeC0+ZHdIaWdoRGF0ZVRpbWUgPCB5LT5kd0hpZ2hEYXRlVGltZSkKKwkJcmV0dXJuIC0xOworCWlmICh4LT5kd0xvd0RhdGVUaW1lID4geS0+ZHdMb3dEYXRlVGltZSkKKwkJcmV0dXJuIDE7CisJaWYgKHgtPmR3TG93RGF0ZVRpbWUgPCB5LT5kd0xvd0RhdGVUaW1lKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEZJTEVfRHVwCmRpZmYgLS1naXQgYS9ncmFwaGljcy9tZXRhZmlsZWRydi9NYWtlZmlsZS5pbiBiL2dyYXBoaWNzL21ldGFmaWxlZHJ2L01ha2VmaWxlLmluCmluZGV4IDUyNDZhNmMuLmZmNTM4ZjIgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL21ldGFmaWxlZHJ2L01ha2VmaWxlLmluCisrKyBiL2dyYXBoaWNzL21ldGFmaWxlZHJ2L01ha2VmaWxlLmluCkBAIC0xMCw2ICsxMCw3IEBACiAJZ3JhcGhpY3MuYyBcCiAJaW5pdC5jIFwKIAltYXBwaW5nLmMgXAorCW9iamVjdHMuYyBcCiAJdGV4dC5jCiAKIGFsbDogJChNT0RVTEUpLm8KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL21ldGFmaWxlZHJ2L2luaXQuYyBiL2dyYXBoaWNzL21ldGFmaWxlZHJ2L2luaXQuYwppbmRleCA2NTQ1YzllLi4wOGRhYzVkIDEwMDY0NAotLS0gYS9ncmFwaGljcy9tZXRhZmlsZWRydi9pbml0LmMKKysrIGIvZ3JhcGhpY3MvbWV0YWZpbGVkcnYvaW5pdC5jCkBAIC01Miw3ICs1Miw3IEBACiAgICAgTUZEUlZfU2NhbGVWaWV3cG9ydEV4dCwgICAgICAgICAgLyogcFNjYWxlVmlld3BvcnRFeHQgKi8KICAgICBNRkRSVl9TY2FsZVdpbmRvd0V4dCwgICAgICAgICAgICAvKiBwU2NhbGVXaW5kb3dFeHQgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU2VsZWN0Q2xpcFJnbiAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBTZWxlY3RPYmplY3QgKi8KKyAgICBNRkRSVl9TZWxlY3RPYmplY3QsICAgICAgICAgICAgICAvKiBwU2VsZWN0T2JqZWN0ICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFNlbGVjdFBhbGV0dGUgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU2V0QmtDb2xvciAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBTZXRCa01vZGUgKi8KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL21ldGFmaWxlZHJ2L29iamVjdHMuYyBiL2dyYXBoaWNzL21ldGFmaWxlZHJ2L29iamVjdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzFhYTIyCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvbWV0YWZpbGVkcnYvb2JqZWN0cy5jCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogR0RJIG9iamVjdHMKKyAqCisgKiBDb3B5cmlnaHQgMTk5MyBBbGV4YW5kcmUgSnVsbGlhcmQKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJiaXRtYXAuaCIKKyNpbmNsdWRlICJicnVzaC5oIgorI2luY2x1ZGUgImZvbnQuaCIKKyNpbmNsdWRlICJtZXRhZmlsZS5oIgorI2luY2x1ZGUgIm1ldGFmaWxlZHJ2LmgiCisjaW5jbHVkZSAicGVuLmgiCisjaW5jbHVkZSAic3RkZGVidWcuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIE1GRFJWX0JJVE1BUF9TZWxlY3RPYmplY3QKKyAqLworc3RhdGljIEhCSVRNQVAxNiBNRkRSVl9CSVRNQVBfU2VsZWN0T2JqZWN0KCBEQyAqIGRjLCBIQklUTUFQMTYgaGJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUTUFQT0JKICogYm1wICkKK3sKKyAgICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBNRkRSVl9CUlVTSF9TZWxlY3RPYmplY3QKKyAqLworc3RhdGljIEhCUlVTSDMyIE1GRFJWX0JSVVNIX1NlbGVjdE9iamVjdCggREMgKiBkYywgSEJSVVNIMzIgaGJydXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlJVU0hPQkogKiBicnVzaCApCit7CisgICAgTE9HQlJVU0gxNiBsb2dicnVzaCA9IHsgYnJ1c2gtPmxvZ2JydXNoLmxiU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJ1c2gtPmxvZ2JydXNoLmxiQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJ1c2gtPmxvZ2JydXNoLmxiSGF0Y2ggfTsKKyAgICBzd2l0Y2ggKGJydXNoLT5sb2dicnVzaC5sYlN0eWxlKQorICAgIHsKKyAgICBjYXNlIEJTX1NPTElEOgorICAgIGNhc2UgQlNfSEFUQ0hFRDoKKyAgICBjYXNlIEJTX0hPTExPVzoKKyAgICAgICAgaWYgKCFNRl9DcmVhdGVCcnVzaEluZGlyZWN0KCBkYywgaGJydXNoLCAmbG9nYnJ1c2ggKSkgcmV0dXJuIDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQlNfUEFUVEVSTjoKKyAgICBjYXNlIEJTX0RJQlBBVFRFUk46CisgICAgICAgIGlmICghTUZfQ3JlYXRlUGF0dGVybkJydXNoKCBkYywgaGJydXNoLCAmbG9nYnJ1c2ggKSkgcmV0dXJuIDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMTsgIC8qIEZJWE1FPyAqLworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIE1GRFJWX0ZPTlRfU2VsZWN0T2JqZWN0CisgKi8KK3N0YXRpYyBIRk9OVDE2IE1GRFJWX0ZPTlRfU2VsZWN0T2JqZWN0KCBEQyAqIGRjLCBIRk9OVDE2IGhmb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPTlRPQkogKiBmb250ICkKK3sKKyAgICBIRk9OVDE2IHByZXZIYW5kbGUgPSBkYy0+dy5oRm9udDsKKyAgICBpZiAoTUZfQ3JlYXRlRm9udEluZGlyZWN0KGRjLCBoZm9udCwgJihmb250LT5sb2dmb250KSkpIHJldHVybiBwcmV2SGFuZGxlOworICAgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIE1GRFJWX1BFTl9TZWxlY3RPYmplY3QKKyAqLworc3RhdGljIEhQRU4zMiBNRkRSVl9QRU5fU2VsZWN0T2JqZWN0KCBEQyAqIGRjLCBIUEVOMzIgaHBlbiwgUEVOT0JKICogcGVuICkKK3sKKyAgICBIUEVOMzIgcHJldkhhbmRsZSA9IGRjLT53LmhQZW47CisgICAgTE9HUEVOMTYgbG9ncGVuID0geyBwZW4tPmxvZ3Blbi5sb3BuU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICB7IHBlbi0+bG9ncGVuLmxvcG5XaWR0aC54LCBwZW4tPmxvZ3Blbi5sb3BuV2lkdGgueSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgcGVuLT5sb2dwZW4ubG9wbkNvbG9yIH07CisgICAgaWYgKE1GX0NyZWF0ZVBlbkluZGlyZWN0KCBkYywgaHBlbiwgJmxvZ3BlbiApKSByZXR1cm4gcHJldkhhbmRsZTsKKyAgICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBNRkRSVl9TZWxlY3RPYmplY3QKKyAqLworSEdESU9CSjMyIE1GRFJWX1NlbGVjdE9iamVjdCggREMgKmRjLCBIR0RJT0JKMzIgaGFuZGxlICkKK3sKKyAgICBHRElPQkpIRFIgKiBwdHIgPSBHRElfR2V0T2JqUHRyKCBoYW5kbGUsIE1BR0lDX0RPTlRDQVJFICk7CisKKyAgICBpZiAoIXB0cikgcmV0dXJuIDA7CisgICAgZHByaW50Zl9nZGkoc3RkZGViLCAiU2VsZWN0T2JqZWN0OiBoZGM9JTA0eCAlMDR4XG4iLCBkYy0+aFNlbGYsIGhhbmRsZSApOworICAgIAorICAgIHN3aXRjaChwdHItPndNYWdpYykKKyAgICB7CisgICAgICBjYXNlIFBFTl9NQUdJQzoKKwkgIHJldHVybiBNRkRSVl9QRU5fU2VsZWN0T2JqZWN0KCBkYywgaGFuZGxlLCAoUEVOT0JKICopcHRyICk7CisgICAgICBjYXNlIEJSVVNIX01BR0lDOgorCSAgcmV0dXJuIE1GRFJWX0JSVVNIX1NlbGVjdE9iamVjdCggZGMsIGhhbmRsZSwgKEJSVVNIT0JKICopcHRyICk7CisgICAgICBjYXNlIEJJVE1BUF9NQUdJQzoKKwkgIHJldHVybiBNRkRSVl9CSVRNQVBfU2VsZWN0T2JqZWN0KCBkYywgaGFuZGxlLCAoQklUTUFQT0JKICopcHRyICk7CisgICAgICBjYXNlIEZPTlRfTUFHSUM6CisJICByZXR1cm4gTUZEUlZfRk9OVF9TZWxlY3RPYmplY3QoIGRjLCBoYW5kbGUsIChGT05UT0JKICopcHRyICk7CSAgCisgICAgICBjYXNlIFJFR0lPTl9NQUdJQzoKKwkgIHJldHVybiAoSEdESU9CSjE2KVNlbGVjdENsaXBSZ24xNiggZGMtPmhTZWxmLCBoYW5kbGUgKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9ncmFwaGljcy94MTFkcnYvTWFrZWZpbGUuaW4gYi9ncmFwaGljcy94MTFkcnYvTWFrZWZpbGUuaW4KaW5kZXggMWZkMzZkYi4uOTAwMWRhZCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MveDExZHJ2L01ha2VmaWxlLmluCisrKyBiL2dyYXBoaWNzL3gxMWRydi9NYWtlZmlsZS5pbgpAQCAtNywxMCArNywxNCBAQAogCiBDX1NSQ1MgPSBcCiAJYml0Ymx0LmMgXAorCWJpdG1hcC5jIFwKKwlicnVzaC5jIFwKIAljbGlwcGluZy5jIFwKIAlmb250LmMgXAogCWdyYXBoaWNzLmMgXAogCWluaXQuYyBcCisJb2JqZWN0cy5jIFwKKwlwZW4uYyBcCiAJdGV4dC5jCiAKIGFsbDogJChNT0RVTEUpLm8KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3gxMWRydi9iaXRtYXAuYyBiL2dyYXBoaWNzL3gxMWRydi9iaXRtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGNjODI1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MveDExZHJ2L2JpdG1hcC5jCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBHREkgYml0bWFwIG9iamVjdHMKKyAqCisgKiBDb3B5cmlnaHQgMTk5MyBBbGV4YW5kcmUgSnVsbGlhcmQKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgorI2luY2x1ZGUgImdkaS5oIgorI2luY2x1ZGUgImNhbGxiYWNrLmgiCisjaW5jbHVkZSAiZGMuaCIKKyNpbmNsdWRlICJiaXRtYXAuaCIKKyNpbmNsdWRlICJoZWFwLmgiCisjaW5jbHVkZSAic3RkZGVidWcuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBYMTFEUlZfQklUTUFQX0luaXQKKyAqLworQk9PTDMyIFgxMURSVl9CSVRNQVBfSW5pdCh2b2lkKQoreworICAgIFBpeG1hcCB0bXBQaXhtYXA7CisgICAgCisgICAgICAvKiBDcmVhdGUgdGhlIG5lY2Vzc2FyeSBHQ3MgKi8KKyAgICAKKyAgICBpZiAoKHRtcFBpeG1hcCA9IFhDcmVhdGVQaXhtYXAoIGRpc3BsYXksIHJvb3RXaW5kb3csIDEsIDEsIDEgKSkpCisgICAgeworCUJJVE1BUF9tb25vR0MgPSBYQ3JlYXRlR0MoIGRpc3BsYXksIHRtcFBpeG1hcCwgMCwgTlVMTCApOworCVhTZXRHcmFwaGljc0V4cG9zdXJlcyggZGlzcGxheSwgQklUTUFQX21vbm9HQywgRmFsc2UgKTsKKwlYRnJlZVBpeG1hcCggZGlzcGxheSwgdG1wUGl4bWFwICk7CisgICAgfQorCisgICAgaWYgKHNjcmVlbkRlcHRoICE9IDEpCisgICAgeworCWlmICgodG1wUGl4bWFwID0gWENyZWF0ZVBpeG1hcChkaXNwbGF5LCByb290V2luZG93LCAxLDEsc2NyZWVuRGVwdGgpKSkKKwl7CisJICAgIEJJVE1BUF9jb2xvckdDID0gWENyZWF0ZUdDKCBkaXNwbGF5LCB0bXBQaXhtYXAsIDAsIE5VTEwgKTsKKwkgICAgWFNldEdyYXBoaWNzRXhwb3N1cmVzKCBkaXNwbGF5LCBCSVRNQVBfY29sb3JHQywgRmFsc2UgKTsKKwkgICAgWEZyZWVQaXhtYXAoIGRpc3BsYXksIHRtcFBpeG1hcCApOworCX0KKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFgxMURSVl9CSVRNQVBfU2VsZWN0T2JqZWN0CisgKi8KK0hCSVRNQVAzMiBYMTFEUlZfQklUTUFQX1NlbGVjdE9iamVjdCggREMgKiBkYywgSEJJVE1BUDMyIGhiaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVE1BUE9CSiAqIGJtcCApCit7CisgICAgSFJHTjMyIGhyZ247CisgICAgSEJJVE1BUDMyIHByZXZIYW5kbGUgPSBkYy0+dy5oQml0bWFwOworICAgIAorICAgIGlmICghKGRjLT53LmZsYWdzICYgRENfTUVNT1JZKSkgcmV0dXJuIDA7CisKKyAgICBpZiAoZGMtPncuaFZpc1JnbikKKyAgICAgICBTZXRSZWN0UmduKGRjLT53LmhWaXNSZ24sIDAsIDAsIGJtcC0+Yml0bWFwLmJtV2lkdGgsIGJtcC0+Yml0bWFwLmJtSGVpZ2h0ICk7CisgICAgZWxzZQorICAgIHsgCisgICAgICAgaHJnbiA9IENyZWF0ZVJlY3RSZ24zMigwLCAwLCBibXAtPmJpdG1hcC5ibVdpZHRoLCBibXAtPmJpdG1hcC5ibUhlaWdodCk7CisgICAgICAgaWYgKCFocmduKSByZXR1cm4gMDsKKyAgICAgICBkYy0+dy5oVmlzUmduICAgID0gaHJnbjsKKyAgICB9CisKKyAgICBkYy0+dS54LmRyYXdhYmxlID0gYm1wLT5waXhtYXA7CisgICAgZGMtPncuaEJpdG1hcCAgICA9IGhiaXRtYXA7CisKKyAgICAgIC8qIENoYW5nZSBHQyBkZXB0aCBpZiBuZWVkZWQgKi8KKworICAgIGlmIChkYy0+dy5iaXRzUGVyUGl4ZWwgIT0gYm1wLT5iaXRtYXAuYm1CaXRzUGl4ZWwpCisgICAgeworCVhGcmVlR0MoIGRpc3BsYXksIGRjLT51LnguZ2MgKTsKKwlkYy0+dS54LmdjID0gWENyZWF0ZUdDKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCAwLCBOVUxMICk7CisJZGMtPncuYml0c1BlclBpeGVsID0gYm1wLT5iaXRtYXAuYm1CaXRzUGl4ZWw7CisgICAgICAgIERDX0luaXREQyggZGMgKTsKKyAgICB9CisgICAgZWxzZSBDTElQUElOR19VcGRhdGVHQ1JlZ2lvbiggZGMgKTsgIC8qIEp1c3QgdXBkYXRlIEdDIGNsaXAgcmVnaW9uICovCisgICAgcmV0dXJuIHByZXZIYW5kbGU7Cit9CmRpZmYgLS1naXQgYS9ncmFwaGljcy94MTFkcnYvYnJ1c2guYyBiL2dyYXBoaWNzL3gxMWRydi9icnVzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYmM0MWYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy94MTFkcnYvYnJ1c2guYwpAQCAtMCwwICsxLDI3MCBAQAorLyoKKyAqIEdESSBicnVzaCBvYmplY3RzCisgKgorICogQ29weXJpZ2h0IDE5OTMsIDE5OTQgIEFsZXhhbmRyZSBKdWxsaWFyZAorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJicnVzaC5oIgorI2luY2x1ZGUgImJpdG1hcC5oIgorI2luY2x1ZGUgImNvbG9yLmgiCisjaW5jbHVkZSAieDExZHJ2LmgiCisjaW5jbHVkZSAic3RkZGVidWcuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorCitzdGF0aWMgY29uc3QgY2hhciBIYXRjaEJydXNoZXNbTkJfSEFUQ0hfU1RZTEVTXVs4XSA9Cit7CisgICAgeyAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sIC8qIEhTX0hPUklaT05UQUwgKi8KKyAgICB7IDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDggfSwgLyogSFNfVkVSVElDQUwgICAqLworICAgIHsgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCB9LCAvKiBIU19GRElBR09OQUwgICovCisgICAgeyAweDgwLCAweDQwLCAweDIwLCAweDEwLCAweDA4LCAweDA0LCAweDAyLCAweDAxIH0sIC8qIEhTX0JESUFHT05BTCAgKi8KKyAgICB7IDB4MDgsIDB4MDgsIDB4MDgsIDB4ZmYsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDggfSwgLyogSFNfQ1JPU1MgICAgICAqLworICAgIHsgMHg4MSwgMHg0MiwgMHgyNCwgMHgxOCwgMHgxOCwgMHgyNCwgMHg0MiwgMHg4MSB9ICAvKiBIU19ESUFHQ1JPU1MgICovCit9OworCisgIC8qIExldmVscyBvZiBlYWNoIHByaW1hcnkgZm9yIGRpdGhlcmluZyAqLworI2RlZmluZSBQUklNQVJZX0xFVkVMUyAgMyAgCisjZGVmaW5lIFRPVEFMX0xFVkVMUyAgICAoUFJJTUFSWV9MRVZFTFMqUFJJTUFSWV9MRVZFTFMqUFJJTUFSWV9MRVZFTFMpCisKKyAvKiBEaXRoZXJpbmcgbWF0cml4IHNpemUgICovCisjZGVmaW5lIE1BVFJJWF9TSVpFICAgICA4CisjZGVmaW5lIE1BVFJJWF9TSVpFXzIgICAoTUFUUklYX1NJWkUqTUFUUklYX1NJWkUpCisKKyAgLyogVG90YWwgbnVtYmVyIG9mIHBvc3NpYmxlIGxldmVscyBmb3IgYSBkaXRoZXJlZCBwcmltYXJ5IGNvbG9yICovCisjZGVmaW5lIERJVEhFUl9MRVZFTFMgICAoTUFUUklYX1NJWkVfMiAqIChQUklNQVJZX0xFVkVMUy0xKSArIDEpCisKKyAgLyogRGl0aGVyaW5nIG1hdHJpeCAqLworc3RhdGljIGNvbnN0IGludCBkaXRoZXJfbWF0cml4W01BVFJJWF9TSVpFXzJdID0KK3sKKyAgICAgMCwgMzIsICA4LCA0MCwgIDIsIDM0LCAxMCwgNDIsCisgICAgNDgsIDE2LCA1NiwgMjQsIDUwLCAxOCwgNTgsIDI2LAorICAgIDEyLCA0NCwgIDQsIDM2LCAxNCwgNDYsICA2LCAzOCwKKyAgICA2MCwgMjgsIDUyLCAyMCwgNjIsIDMwLCA1NCwgMjIsCisgICAgIDMsIDM1LCAxMSwgNDMsICAxLCAzMywgIDksIDQxLAorICAgIDUxLCAxOSwgNTksIDI3LCA0OSwgMTcsIDU3LCAyNSwKKyAgICAxNSwgNDcsICA3LCAzOSwgMTMsIDQ1LCAgNSwgMzcsCisgICAgNjMsIDMxLCA1NSwgMjMsIDYxLCAyOSwgNTMsIDIxCit9OworCisgIC8qIE1hcHBpbmcgYmV0d2VlbiAoUixHLEIpIHRyaXBsZXMgYW5kIEVHQSBjb2xvcnMgKi8KK3N0YXRpYyBjb25zdCBpbnQgRUdBbWFwcGluZ1tUT1RBTF9MRVZFTFNdID0KK3sKKyAgICAwLCAgLyogMDAwMDAwIC0+IDAwMDAwMCAqLworICAgIDQsICAvKiAwMDAwN2YgLT4gMDAwMDgwICovCisgICAgMTIsIC8qIDAwMDBmZiAtPiAwMDAwZmYgKi8KKyAgICAyLCAgLyogMDA3ZjAwIC0+IDAwODAwMCAqLworICAgIDYsICAvKiAwMDdmN2YgLT4gMDA4MDgwICovCisgICAgNiwgIC8qIDAwN2ZmZiAtPiAwMDgwODAgKi8KKyAgICAxMCwgLyogMDBmZjAwIC0+IDAwZmYwMCAqLworICAgIDYsICAvKiAwMGZmN2YgLT4gMDA4MDgwICovCisgICAgMTQsIC8qIDAwZmZmZiAtPiAwMGZmZmYgKi8KKyAgICAxLCAgLyogN2YwMDAwIC0+IDgwMDAwMCAqLworICAgIDUsICAvKiA3ZjAwN2YgLT4gODAwMDgwICovCisgICAgNSwgIC8qIDdmMDBmZiAtPiA4MDAwODAgKi8KKyAgICAzLCAgLyogN2Y3ZjAwIC0+IDgwODAwMCAqLworICAgIDgsICAvKiA3ZjdmN2YgLT4gODA4MDgwICovCisgICAgNywgIC8qIDdmN2ZmZiAtPiBjMGMwYzAgKi8KKyAgICAzLCAgLyogN2ZmZjAwIC0+IDgwODAwMCAqLworICAgIDcsICAvKiA3ZmZmN2YgLT4gYzBjMGMwICovCisgICAgNywgIC8qIDdmZmZmZiAtPiBjMGMwYzAgKi8KKyAgICA5LCAgLyogZmYwMDAwIC0+IGZmMDAwMCAqLworICAgIDUsICAvKiBmZjAwN2YgLT4gODAwMDgwICovCisgICAgMTMsIC8qIGZmMDBmZiAtPiBmZjAwZmYgKi8KKyAgICAzLCAgLyogZmY3ZjAwIC0+IDgwODAwMCAqLworICAgIDcsICAvKiBmZjdmN2YgLT4gYzBjMGMwICovCisgICAgNywgIC8qIGZmN2ZmZiAtPiBjMGMwYzAgKi8KKyAgICAxMSwgLyogZmZmZjAwIC0+IGZmZmYwMCAqLworICAgIDcsICAvKiBmZmZmN2YgLT4gYzBjMGMwICovCisgICAgMTUgIC8qIGZmZmZmZiAtPiBmZmZmZmYgKi8KK307CisKKyNkZWZpbmUgUElYRUxfVkFMVUUocixnLGIpIFwKKyAgICBDT0xPUl9tYXBFR0FQaXhlbFtFR0FtYXBwaW5nWygocikqUFJJTUFSWV9MRVZFTFMrKGcpKSpQUklNQVJZX0xFVkVMUysoYildXQorCisgIC8qIFggaW1hZ2UgZm9yIGJ1aWxkaW5nIGRpdGhlcmVkIHBpeG1hcCAqLworc3RhdGljIFhJbWFnZSAqZGl0aGVySW1hZ2UgPSBOVUxMOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEJSVVNIX0luaXQKKyAqCisgKiBDcmVhdGUgdGhlIFggaW1hZ2UgdXNlZCBmb3IgZGl0aGVyaW5nLgorICovCitCT09MMzIgWDExRFJWX0JSVVNIX0luaXQodm9pZCkKK3sKKyAgICBYQ1JFQVRFSU1BR0UoIGRpdGhlckltYWdlLCBNQVRSSVhfU0laRSwgTUFUUklYX1NJWkUsIHNjcmVlbkRlcHRoICk7CisgICAgcmV0dXJuIChkaXRoZXJJbWFnZSAhPSBOVUxMKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBCUlVTSF9EaXRoZXJDb2xvcgorICovCitzdGF0aWMgUGl4bWFwIEJSVVNIX0RpdGhlckNvbG9yKCBEQyAqZGMsIENPTE9SUkVGIGNvbG9yICkKK3sKKyAgICBzdGF0aWMgQ09MT1JSRUYgcHJldkNvbG9yID0gMHhmZmZmZmZmZjsKKyAgICB1bnNpZ25lZCBpbnQgeCwgeTsKKyAgICBQaXhtYXAgcGl4bWFwOworCisgICAgaWYgKGNvbG9yICE9IHByZXZDb2xvcikKKyAgICB7CisJaW50IHIgPSBHZXRSVmFsdWUoIGNvbG9yICkgKiBESVRIRVJfTEVWRUxTOworCWludCBnID0gR2V0R1ZhbHVlKCBjb2xvciApICogRElUSEVSX0xFVkVMUzsKKwlpbnQgYiA9IEdldEJWYWx1ZSggY29sb3IgKSAqIERJVEhFUl9MRVZFTFM7CisJY29uc3QgaW50ICpwbWF0cml4ID0gZGl0aGVyX21hdHJpeDsKKworCWZvciAoeSA9IDA7IHkgPCBNQVRSSVhfU0laRTsgeSsrKQorCXsKKwkgICAgZm9yICh4ID0gMDsgeCA8IE1BVFJJWF9TSVpFOyB4KyspCisJICAgIHsKKwkJaW50IGQgID0gKnBtYXRyaXgrKyAqIDI1NjsKKwkJaW50IGRyID0gKChyICsgZCkgLyBNQVRSSVhfU0laRV8yKSAvIDI1NjsKKwkJaW50IGRnID0gKChnICsgZCkgLyBNQVRSSVhfU0laRV8yKSAvIDI1NjsKKwkJaW50IGRiID0gKChiICsgZCkgLyBNQVRSSVhfU0laRV8yKSAvIDI1NjsKKwkJWFB1dFBpeGVsKCBkaXRoZXJJbWFnZSwgeCwgeSwgUElYRUxfVkFMVUUoZHIsZGcsZGIpICk7CisJICAgIH0KKwl9CisJcHJldkNvbG9yID0gY29sb3I7CisgICAgfQorICAgIAorICAgIHBpeG1hcCA9IFhDcmVhdGVQaXhtYXAoIGRpc3BsYXksIHJvb3RXaW5kb3csCisJCQkgICAgTUFUUklYX1NJWkUsIE1BVFJJWF9TSVpFLCBzY3JlZW5EZXB0aCApOworICAgIFhQdXRJbWFnZSggZGlzcGxheSwgcGl4bWFwLCBCSVRNQVBfY29sb3JHQywgZGl0aGVySW1hZ2UsIDAsIDAsCisJICAgICAgIDAsIDAsIE1BVFJJWF9TSVpFLCBNQVRSSVhfU0laRSApOworICAgIHJldHVybiBwaXhtYXA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQlJVU0hfU2VsZWN0U29saWRCcnVzaAorICovCitzdGF0aWMgdm9pZCBCUlVTSF9TZWxlY3RTb2xpZEJydXNoKCBEQyAqZGMsIENPTE9SUkVGIGNvbG9yICkKK3sKKyAgICBpZiAoKGRjLT53LmJpdHNQZXJQaXhlbCA+IDEpICYmIChzY3JlZW5EZXB0aCA8PSA4KSAmJiAhQ09MT1JfSXNTb2xpZCggY29sb3IgKSkKKyAgICB7CisJICAvKiBEaXRoZXJlZCBicnVzaCAqLworCWRjLT51LnguYnJ1c2gucGl4bWFwID0gQlJVU0hfRGl0aGVyQ29sb3IoIGRjLCBjb2xvciApOworCWRjLT51LnguYnJ1c2guZmlsbFN0eWxlID0gRmlsbFRpbGVkOworCWRjLT51LnguYnJ1c2gucGl4ZWwgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworCSAgLyogU29saWQgYnJ1c2ggKi8KKwlkYy0+dS54LmJydXNoLnBpeGVsID0gQ09MT1JfVG9QaHlzaWNhbCggZGMsIGNvbG9yICk7CisJZGMtPnUueC5icnVzaC5maWxsU3R5bGUgPSBGaWxsU29saWQ7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEJSVVNIX1NlbGVjdFBhdHRlcm5CcnVzaAorICovCitzdGF0aWMgQk9PTDMyIEJSVVNIX1NlbGVjdFBhdHRlcm5CcnVzaCggREMgKiBkYywgSEJJVE1BUDMyIGhiaXRtYXAgKQoreworICAgIEJJVE1BUE9CSiAqIGJtcCA9IChCSVRNQVBPQkogKikgR0RJX0dldE9ialB0ciggaGJpdG1hcCwgQklUTUFQX01BR0lDICk7CisgICAgaWYgKCFibXApIHJldHVybiBGQUxTRTsKKyAgICBkYy0+dS54LmJydXNoLnBpeG1hcCA9IFhDcmVhdGVQaXhtYXAoIGRpc3BsYXksIHJvb3RXaW5kb3csCisJCQkJCSAgOCwgOCwgYm1wLT5iaXRtYXAuYm1CaXRzUGl4ZWwgKTsKKyAgICBYQ29weUFyZWEoIGRpc3BsYXksIGJtcC0+cGl4bWFwLCBkYy0+dS54LmJydXNoLnBpeG1hcCwKKwkgICAgICAgQklUTUFQX0dDKGJtcCksIDAsIDAsIDgsIDgsIDAsIDAgKTsKKyAgICAKKyAgICBpZiAoYm1wLT5iaXRtYXAuYm1CaXRzUGl4ZWwgPiAxKQorICAgIHsKKwlkYy0+dS54LmJydXNoLmZpbGxTdHlsZSA9IEZpbGxUaWxlZDsKKwlkYy0+dS54LmJydXNoLnBpeGVsID0gMDsgIC8qIElnbm9yZWQgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlkYy0+dS54LmJydXNoLmZpbGxTdHlsZSA9IEZpbGxPcGFxdWVTdGlwcGxlZDsKKwlkYy0+dS54LmJydXNoLnBpeGVsID0gLTE7ICAvKiBTcGVjaWFsIGNhc2UgKHNlZSBEQ19TZXR1cEdDRm9yQnJ1c2gpICovCisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBCUlVTSF9TZWxlY3RPYmplY3QKKyAqLworSEJSVVNIMzIgWDExRFJWX0JSVVNIX1NlbGVjdE9iamVjdCggREMgKiBkYywgSEJSVVNIMzIgaGJydXNoLCBCUlVTSE9CSiAqIGJydXNoICkKK3sKKyAgICBIQklUTUFQMTYgaEJpdG1hcDsKKyAgICBCSVRNQVBJTkZPICogYm1wSW5mbzsKKyAgICBIQlJVU0gxNiBwcmV2SGFuZGxlID0gZGMtPncuaEJydXNoOworCisgICAgZHByaW50Zl9nZGkoc3RkZGViLCAiQnJ1c2hfU2VsZWN0T2JqZWN0OiBoZGM9JTA0eCBoYnJ1c2g9JTA0eFxuIiwKKyAgICAgICAgICAgICAgICBkYy0+aFNlbGYsaGJydXNoKTsKKyNpZmRlZiBOT1RERUYKKyAgICBpZiAoZGMtPmhlYWRlci53TWFnaWMgPT0gTUVUQUZJTEVfRENfTUFHSUMpCisgICAgeworICAgICAgICBMT0dCUlVTSDE2IGxvZ2JydXNoID0geyBicnVzaC0+bG9nYnJ1c2gubGJTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJ1c2gtPmxvZ2JydXNoLmxiQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJydXNoLT5sb2dicnVzaC5sYkhhdGNoIH07CisJc3dpdGNoIChicnVzaC0+bG9nYnJ1c2gubGJTdHlsZSkKKwl7CisJY2FzZSBCU19TT0xJRDoKKwljYXNlIEJTX0hBVENIRUQ6CisJY2FzZSBCU19IT0xMT1c6CisJICAgIGlmICghTUZfQ3JlYXRlQnJ1c2hJbmRpcmVjdCggZGMsIGhicnVzaCwgJmxvZ2JydXNoICkpIHJldHVybiAwOworCSAgICBicmVhazsKKwljYXNlIEJTX1BBVFRFUk46CisJY2FzZSBCU19ESUJQQVRURVJOOgorCSAgICBpZiAoIU1GX0NyZWF0ZVBhdHRlcm5CcnVzaCggZGMsIGhicnVzaCwgJmxvZ2JydXNoICkpIHJldHVybiAwOworCSAgICBicmVhazsKKwl9CisJcmV0dXJuIDE7ICAvKiBGSVhNRT8gKi8KKyAgICB9CisjZW5kaWYgICAgCisgICAgZGMtPncuaEJydXNoID0gaGJydXNoOworCisgICAgaWYgKGRjLT51LnguYnJ1c2gucGl4bWFwKQorICAgIHsKKwlYRnJlZVBpeG1hcCggZGlzcGxheSwgZGMtPnUueC5icnVzaC5waXhtYXAgKTsKKwlkYy0+dS54LmJydXNoLnBpeG1hcCA9IDA7CisgICAgfQorICAgIGRjLT51LnguYnJ1c2guc3R5bGUgPSBicnVzaC0+bG9nYnJ1c2gubGJTdHlsZTsKKyAgICAKKyAgICBzd2l0Y2goYnJ1c2gtPmxvZ2JydXNoLmxiU3R5bGUpCisgICAgeworICAgICAgY2FzZSBCU19OVUxMOgorCWRwcmludGZfZ2RpKCBzdGRkZWIsIkJTX05VTExcbiIgKTsKKwlicmVhazsKKworICAgICAgY2FzZSBCU19TT0xJRDoKKyAgICAgICAgZHByaW50Zl9nZGkoIHN0ZGRlYiwiQlNfU09MSURcbiIgKTsKKwlCUlVTSF9TZWxlY3RTb2xpZEJydXNoKCBkYywgYnJ1c2gtPmxvZ2JydXNoLmxiQ29sb3IgKTsKKwlicmVhazsKKwkKKyAgICAgIGNhc2UgQlNfSEFUQ0hFRDoKKwlkcHJpbnRmX2dkaSggc3RkZGViLCAiQlNfSEFUQ0hFRFxuIiApOworCWRjLT51LnguYnJ1c2gucGl4ZWwgPSBDT0xPUl9Ub1BoeXNpY2FsKCBkYywgYnJ1c2gtPmxvZ2JydXNoLmxiQ29sb3IgKTsKKwlkYy0+dS54LmJydXNoLnBpeG1hcCA9IFhDcmVhdGVCaXRtYXBGcm9tRGF0YSggZGlzcGxheSwgcm9vdFdpbmRvdywKKwkJCQkgSGF0Y2hCcnVzaGVzW2JydXNoLT5sb2dicnVzaC5sYkhhdGNoXSwgOCwgOCApOworCWRjLT51LnguYnJ1c2guZmlsbFN0eWxlID0gRmlsbFN0aXBwbGVkOworCWJyZWFrOworCQorICAgICAgY2FzZSBCU19QQVRURVJOOgorCWRwcmludGZfZ2RpKCBzdGRkZWIsICJCU19QQVRURVJOXG4iKTsKKwlCUlVTSF9TZWxlY3RQYXR0ZXJuQnJ1c2goIGRjLCAoSEJSVVNIMTYpYnJ1c2gtPmxvZ2JydXNoLmxiSGF0Y2ggKTsKKwlicmVhazsKKworICAgICAgY2FzZSBCU19ESUJQQVRURVJOOgorCWRwcmludGZfZ2RpKCBzdGRkZWIsICJCU19ESUJQQVRURVJOXG4iKTsKKwlpZiAoKGJtcEluZm8gPSAoQklUTUFQSU5GTyAqKSBHbG9iYWxMb2NrMTYoIChIR0xPQkFMMTYpYnJ1c2gtPmxvZ2JydXNoLmxiSGF0Y2ggKSkpCisJeworCSAgICBpbnQgc2l6ZSA9IERJQl9CaXRtYXBJbmZvU2l6ZSggYm1wSW5mbywgYnJ1c2gtPmxvZ2JydXNoLmxiQ29sb3IgKTsKKwkgICAgaEJpdG1hcCA9IENyZWF0ZURJQml0bWFwMzIoIGRjLT5oU2VsZiwgJmJtcEluZm8tPmJtaUhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQk1fSU5JVCwgKChjaGFyICopYm1wSW5mbykgKyBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdPUkQpYnJ1c2gtPmxvZ2JydXNoLmxiQ29sb3IgKTsKKwkgICAgQlJVU0hfU2VsZWN0UGF0dGVybkJydXNoKCBkYywgaEJpdG1hcCApOworCSAgICBEZWxldGVPYmplY3QxNiggaEJpdG1hcCApOworCSAgICBHbG9iYWxVbmxvY2sxNiggKEhHTE9CQUwxNilicnVzaC0+bG9nYnJ1c2gubGJIYXRjaCApOwkgICAgCisJfQorCQorCWJyZWFrOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gcHJldkhhbmRsZTsKK30KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3gxMWRydi9mb250LmMgYi9ncmFwaGljcy94MTFkcnYvZm9udC5jCmluZGV4IDRiODE2ZTIuLmEyZjUxNTEgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3gxMWRydi9mb250LmMKKysrIGIvZ3JhcGhpY3MveDExZHJ2L2ZvbnQuYwpAQCAtNCw5ICs0LDI1MCBAQAogICogQ29weXJpZ2h0IDE5OTYgQWxleGFuZHJlIEp1bGxpYXJkCiAgKi8KIAotI2luY2x1ZGUgIndpbmRvd3MuaCIKLSNpbmNsdWRlICJ4MTFkcnYuaCIKLSNpbmNsdWRlICJnZGkuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPFgxMS9YYXRvbS5oPgorI2luY2x1ZGUgImZvbnQuaCIKKyNpbmNsdWRlICJoZWFwLmgiCisjaW5jbHVkZSAibWV0YWZpbGUuaCIKKyNpbmNsdWRlICJvcHRpb25zLmgiCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgInN0ZGRlYnVnLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKworCitzdHJ1Y3QgRm9udFN0cnVjdHVyZSB7CisJY2hhciAqd2luZG93OworCWNoYXIgKngxMTsKK30gRm9udE5hbWVzWzMyXTsKK2ludCBGb250U2l6ZTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBYMTFEUlZfRk9OVF9Jbml0CisgKi8KK0JPT0wzMiBYMTFEUlZfRk9OVF9Jbml0KCB2b2lkICkKK3sKKyAgY2hhciAgdGVtcFsxMDI0XTsKKyAgTFBTVFIgcHRyOworICBpbnQgaTsKKworICBpZiAoUFJPRklMRV9HZXRXaW5lSW5pU3RyaW5nKCAiZm9udHMiLCBOVUxMLCAiKiIsIHRlbXAsIHNpemVvZih0ZW1wKSApID4gMiApCisgIHsKKyAgICBmb3IoIHB0ciA9IHRlbXAsIGkgPSAxOyBzdHJsZW4ocHRyKSAhPSAwOyBwdHIgKz0gc3RybGVuKHB0cikgKyAxICkKKyAgICAgIGlmKCBzdHJjbXAoIHB0ciwgImRlZmF1bHQiICkgKQorCUZvbnROYW1lc1tpKytdLndpbmRvdyA9IHhzdHJkdXAoIHB0ciApOworICAgIEZvbnRTaXplID0gaTsKKworICAgIGZvciggaSA9IDE7IGkgPCBGb250U2l6ZTsgaSsrICkKKyAgICB7CisgICAgICAgIFBST0ZJTEVfR2V0V2luZUluaVN0cmluZyggImZvbnRzIiwgRm9udE5hbWVzW2ldLndpbmRvdywgIioiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAsIHNpemVvZih0ZW1wKSApOworICAgICAgICBGb250TmFtZXNbaV0ueDExID0geHN0cmR1cCggdGVtcCApOworICAgIH0KKyAgICBQUk9GSUxFX0dldFdpbmVJbmlTdHJpbmcoICJmb250cyIsICJkZWZhdWx0IiwgIioiLCB0ZW1wLCBzaXplb2YodGVtcCkgKTsKKyAgICBGb250TmFtZXNbMF0ueDExID0geHN0cmR1cCggdGVtcCApOworCisgIH0gZWxzZSB7CisgICAgRm9udE5hbWVzWzBdLndpbmRvdyA9IE5VTEw7IEZvbnROYW1lc1swXS54MTEgPSAiKi1oZWx2ZXRpY2EiOworICAgIEZvbnROYW1lc1sxXS53aW5kb3cgPSAibXMgc2FucyBzZXJpZiI7IEZvbnROYW1lc1sxXS54MTEgPSAiKi1oZWx2ZXRpY2EiOworICAgIEZvbnROYW1lc1syXS53aW5kb3cgPSAibXMgc2VyaWYiOyBGb250TmFtZXNbMl0ueDExID0gIiotdGltZXMiOworICAgIEZvbnROYW1lc1szXS53aW5kb3cgPSAiZml4ZWRzeXMiOyBGb250TmFtZXNbM10ueDExID0gIiotZml4ZWQiOworICAgIEZvbnROYW1lc1s0XS53aW5kb3cgPSAiYXJpYWwiOyBGb250TmFtZXNbNF0ueDExID0gIiotaGVsdmV0aWNhIjsKKyAgICBGb250TmFtZXNbNV0ud2luZG93ID0gImhlbHYiOyBGb250TmFtZXNbNV0ueDExID0gIiotaGVsdmV0aWNhIjsKKyAgICBGb250TmFtZXNbNl0ud2luZG93ID0gInJvbWFuIjsgRm9udE5hbWVzWzZdLngxMSA9ICIqLXRpbWVzIjsKKyAgICBGb250TmFtZXNbN10ud2luZG93ID0gInN5c3RlbSI7IEZvbnROYW1lc1s3XS54MTEgPSAiKi1oZWx2ZXRpY2EiOworICAgIEZvbnRTaXplID0gODsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEZPTlRfQ2hrWDExRmFtaWx5CisgKgorICogcmV0dXJucyBhIHZhbGlkIFgxMSBlcXVpdmFsZW50IGlmIGEgV2luZG93cyBmYWNlIG5hbWUgCisgKiBpcyBsaWtlIGEgWDExIGZhbWlseSAgLSBvciBOVUxMIGlmIHRyYW5zbGF0aW9uIGlzIG5lZWRlZAorICovCitzdGF0aWMgY2hhciAqRk9OVF9DaGtYMTFGYW1pbHkoY2hhciAqd2luRmFjZU5hbWUgKQoreworICBzdGF0aWMgY2hhciB4MTFmYW1bMzIrMl07ICAgLyogd2lsbCBiZSByZXR1cm5lZCAqLworICBpbnQgaTsKKworICBmb3IoaSA9IDA7IGxwTG9nRm9udExpc3RbaV0gIT0gTlVMTDsgaSsrKQorICAgIGlmKCAhbHN0cmNtcGkzMkEod2luRmFjZU5hbWUsIGxwTG9nRm9udExpc3RbaV0tPmxmRmFjZU5hbWUpICkKKyAgICB7CisJc3RyY3B5KHgxMWZhbSwiKi0iKTsKKwlyZXR1cm4gc3RyY2F0KHgxMWZhbSx3aW5GYWNlTmFtZSk7CisgICAgfSAgICAKKyAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgLyogYSBGT05UX1RyYW5zbGF0ZU5hbWUoKSBjYWxsIGlzIG5lZWRlZCAqLworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRk9OVF9UcmFuc2xhdGVOYW1lCisgKgorICogVHJhbnNsYXRlIGEgV2luZG93cyBmYWNlIG5hbWUgdG8gaXRzIFgxMSBlcXVpdmFsZW50LgorICogVGhpcyB3aWxsIHByb2JhYmx5IGhhdmUgdG8gYmUgY3VzdG9taXphYmxlLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqRk9OVF9UcmFuc2xhdGVOYW1lKCBjaGFyICp3aW5GYWNlTmFtZSApCit7CisgIGludCBpOworCisgIGZvciAoaSA9IDE7IGkgPCBGb250U2l6ZTsgaSArKykKKyAgICBpZiggIWxzdHJjbXBpMzJBKCB3aW5GYWNlTmFtZSwgRm9udE5hbWVzW2ldLndpbmRvdyApICkgeworICAgICAgZHByaW50Zl9mb250KHN0ZGRlYiwgIi0tLS0gTWFwcGVkICVzIHRvICVzXG4iLCB3aW5GYWNlTmFtZSwgRm9udE5hbWVzW2ldLngxMSApOworICAgICAgcmV0dXJuIEZvbnROYW1lc1tpXS54MTE7CisgICAgfQorICByZXR1cm4gRm9udE5hbWVzWzBdLngxMTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBGT05UX01hdGNoRm9udAorICoKKyAqIEZpbmQgYSBYIGZvbnQgbWF0Y2hpbmcgdGhlIGxvZ2ljYWwgZm9udC4KKyAqLworc3RhdGljIFhGb250U3RydWN0ICogRk9OVF9NYXRjaEZvbnQoIExPR0ZPTlQxNiAqIGZvbnQsIERDICogZGMgKQoreworICAgIGNoYXIgcGF0dGVyblsxMDBdOworICAgIGNvbnN0IGNoYXIgKmZhbWlseSwgKndlaWdodCwgKmNoYXJzZXQ7CisgICAgY2hhciAqKm5hbWVzOworICAgIGNoYXIgc2xhbnQsIG9sZHNwYWNpbmcsIHNwYWNpbmc7CisgICAgaW50IHdpZHRoLCBoZWlnaHQsIG9sZGhlaWdodCwgY291bnQ7CisgICAgWEZvbnRTdHJ1Y3QgKiBmb250U3RydWN0OworICAgIAorICAgIGRwcmludGZfZm9udChzdGRkZWIsCisJIkZPTlRfTWF0Y2hGb250KEgsVyA9ICVkLCVkOyBXZWlnaHQgPSAlZDsgSXRhbGljID0gJWQ7IEZhY2VOYW1lID0gJyVzJ1xuIiwKKwlmb250LT5sZkhlaWdodCwgZm9udC0+bGZXaWR0aCwgZm9udC0+bGZXZWlnaHQsIGZvbnQtPmxmSXRhbGljLCBmb250LT5sZkZhY2VOYW1lKTsKKyAgICB3ZWlnaHQgPSAoZm9udC0+bGZXZWlnaHQgPiA1NTApID8gImJvbGQiIDogIm1lZGl1bSI7CisgICAgc2xhbnQgPSBmb250LT5sZkl0YWxpYyA/ICdpJyA6ICdyJzsKKyAgICBpZiAoZm9udC0+bGZIZWlnaHQgPT0gLTEpCisJaGVpZ2h0ID0gMDsKKyAgICBlbHNlCisJaGVpZ2h0ID0gZm9udC0+bGZIZWlnaHQgKiBkYy0+dnBvcnRFeHRYIC8gZGMtPnduZEV4dFg7CisgICAgaWYgKGhlaWdodCA9PSAwKSBoZWlnaHQgPSAxMjA7ICAvKiBEZWZhdWx0IGhlaWdodCA9IDEyICovCisgICAgZWxzZSBpZiAoaGVpZ2h0IDwgMCkKKyAgICB7CisgICAgICAgIC8qIElmIGhlaWdodCBpcyBuZWdhdGl2ZSwgaXQgbWVhbnMgdGhlIGhlaWdodCBvZiB0aGUgY2hhcmFjdGVycyAqLworICAgICAgICAvKiAqd2l0aG91dCogdGhlIGludGVybmFsIGxlYWRpbmcuIFNvIHdlIGFkanVzdCBpdCBhIGJpdCB0byAgICAgKi8KKyAgICAgICAgLyogY29tcGVuc2F0ZS4gNS80IHNlZW1zIHRvIGdpdmUgZ29vZCByZXN1bHRzIGZvciBzbWFsbCBmb250cy4gICovCisJLyogCisgICAgICAgICAqIEouTS46IFRoaXMgY2F1c2VzIHdyb25nIGZvbnQgc2l6ZSBmb3IgYmlnZ2VyIGZvbnRzIGUuZy4gaW4gV2lud29yZCAmIFdyaXRlIAorICAgICAgICBoZWlnaHQgPSAxMCAqICgtaGVpZ2h0ICogOSAvIDgpOworCSAqIG1heSBiZSB3ZSBoYXZlIHRvIHVzZSBhbiBub24gbGluZWFyIGZ1bmN0aW9uCisJKi8KKwkvKiBhc3N1bWUgaW50ZXJuYWwgbGVhZGluZyBpcyAyIHBpeGVscy4gRWxzZSBzbWFsbCBmb250cyB3aWxsIGJlY29tZQorICAgICAgICAgKiB2ZXJ5IHNtYWxsLiAqLworICAgICAgICBoZWlnaHQgPSAoaGVpZ2h0LTIpICogLTEwOyAKKyAgICB9CisgICAgZWxzZSBoZWlnaHQgKj0gMTA7CisgICAgd2lkdGggID0gMTAgKiAoZm9udC0+bGZXaWR0aCAqIGRjLT52cG9ydEV4dFkgLyBkYy0+d25kRXh0WSk7CisgICAgaWYgKHdpZHRoIDwgMCkgeworCWRwcmludGZfZm9udCggc3RkZGViLCAiRk9OVF9NYXRjaEZvbnQ6IG5lZ2F0aXZlIHdpZHRoICVkKCVkKVxuIiwKKwkJICAgICAgd2lkdGgsIGZvbnQtPmxmV2lkdGggKTsKKwl3aWR0aCA9IC13aWR0aDsKKyAgICB9CisKKyAgICBzcGFjaW5nID0gKGZvbnQtPmxmUGl0Y2hBbmRGYW1pbHkgJiBGSVhFRF9QSVRDSCkgPyAnbScgOgorCSAgICAgIChmb250LT5sZlBpdGNoQW5kRmFtaWx5ICYgVkFSSUFCTEVfUElUQ0gpID8gJ3AnIDogJyonOworICAgIAorICAKKyAgICBjaGFyc2V0ID0gKGZvbnQtPmxmQ2hhclNldCA9PSBBTlNJX0NIQVJTRVQpID8gImlzbzg4NTktMSIgOiAiKi0qIjsKKyAgICBpZiAoKmZvbnQtPmxmRmFjZU5hbWUpIHsKKwlmYW1pbHkgPSBGT05UX0Noa1gxMUZhbWlseShmb250LT5sZkZhY2VOYW1lKTsKKwkvKi0tZG8gX25vdF8gdHJhbnNsYXRlIGlmIGxmRmFjZU5hbWUgaXMgZmFtaWx5IGZyb20gWDExICBBLksuKi8KKwlpZiAoIWZhbWlseSkgCisJICBmYW1pbHkgPSBGT05UX1RyYW5zbGF0ZU5hbWUoIGZvbnQtPmxmRmFjZU5hbWUgKTsKKwkvKiBGSVggTUU6IEkgZG9uJ3QgaWYgdGhhdCdzIGNvcnJlY3QgYnV0IGl0IHdvcmtzIEouTS4gKi8KKwlzcGFjaW5nID0gJyonOworCX0KKyAgICBlbHNlIHN3aXRjaChmb250LT5sZlBpdGNoQW5kRmFtaWx5ICYgMHhmMCkKKyAgICB7CisgICAgY2FzZSBGRl9ST01BTjoKKyAgICAgIGZhbWlseSA9IEZPTlRfVHJhbnNsYXRlTmFtZSggInJvbWFuIiApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGRl9TV0lTUzoKKyAgICAgIGZhbWlseSA9IEZPTlRfVHJhbnNsYXRlTmFtZSggInN3aXNzIiApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGRl9NT0RFUk46CisgICAgICBmYW1pbHkgPSBGT05UX1RyYW5zbGF0ZU5hbWUoICJtb2Rlcm4iICk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZGX1NDUklQVDoKKyAgICAgIGZhbWlseSA9IEZPTlRfVHJhbnNsYXRlTmFtZSggInNjcmlwdCIgKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRkZfREVDT1JBVElWRToKKyAgICAgIGZhbWlseSA9IEZPTlRfVHJhbnNsYXRlTmFtZSggImRlY29yYXRpdmUiICk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZmFtaWx5ID0gIiotKiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgc3ByaW50ZiggcGF0dGVybiwgIi0lcy0lcy0qLW5vcm1hbC0qLSotKi0qLSotKi0qLSVzIiwKKwkgICAgZmFtaWx5LCB3ZWlnaHQsIGNoYXJzZXQpOworICAgIGRwcmludGZfZm9udChzdGRkZWIsICJGT05UX01hdGNoRm9udDogJyVzJ1xuIiwgcGF0dGVybiApOworICAgIG5hbWVzID0gWExpc3RGb250cyggZGlzcGxheSwgcGF0dGVybiwgMSwgJmNvdW50ICk7CisgICAgaWYgKG5hbWVzKSBYRnJlZUZvbnROYW1lcyggbmFtZXMgKTsKKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoc3RyY21wKGZhbWlseSwgIiotKiIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRk9OVF9NYXRjaEZvbnQoJXMpIDogcmV0dXJuaW5nIE5VTExcbiIsIHBhdHRlcm4pOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBmYW1pbHkgPSAiKi0qIjsKKyAgICB9CisgICAgb2xkaGVpZ2h0ID0gaGVpZ2h0OworICAgIG9sZHNwYWNpbmcgPSBzcGFjaW5nOworICAgIHdoaWxlIChUUlVFKSB7CisJICAgIC8qIFdpZHRoPT0wIHNlZW1zIG5vdCB0byBiZSBhIHZhbGlkIHdpbGRjYXJkIG9uIFNHSSdzLCB1c2luZyAqIGluc3RlYWQgKi8KKwkgICAgaWYgKCB3aWR0aCA9PSAwICkKKwkgICAgICBzcHJpbnRmKCBwYXR0ZXJuLCAiLSVzLSVzLSVjLW5vcm1hbC0qLSotJWQtKi0qLSVjLSotJXMiLAorCQkgICAgICBmYW1pbHksIHdlaWdodCwgc2xhbnQsIGhlaWdodCwgc3BhY2luZywgY2hhcnNldCk7CisJICAgIGVsc2UKKwkgICAgICBzcHJpbnRmKCBwYXR0ZXJuLCAiLSVzLSVzLSVjLW5vcm1hbC0qLSotJWQtKi0qLSVjLSVkLSVzIiwKKwkJICAgICAgZmFtaWx5LCB3ZWlnaHQsIHNsYW50LCBoZWlnaHQsIHNwYWNpbmcsIHdpZHRoLCBjaGFyc2V0KTsKKwkgICAgZHByaW50Zl9mb250KHN0ZGRlYiwgIkZPTlRfTWF0Y2hGb250OiAnJXMnXG4iLCBwYXR0ZXJuICk7CisJICAgIG5hbWVzID0gWExpc3RGb250cyggZGlzcGxheSwgcGF0dGVybiwgMSwgJmNvdW50ICk7CisJICAgIGlmIChjb3VudCA+IDApIGJyZWFrOworICAgICAgICAgICAgaWYgKHNwYWNpbmcgPT0gJ20nKSAvKiB0cnkgJ2MnIGlmIG5vICdtJyBmb3VuZCAqLyB7CisKKyAgICAgICAgICAgICAgICBzcGFjaW5nID0gJ2MnOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChzcGFjaW5nID09ICdwJykgLyogdHJ5ICcqJyBpZiBubyAncCcgZm91bmQgKi8geworICAgICAgICAgICAgICAgIHNwYWNpbmcgPSAnKic7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcGFjaW5nID0gb2xkc3BhY2luZzsKKyAgICAgICAgICAgIGhlaWdodCAtPSAxMDsJCQorICAgICAgICAgICAgaWYgKGhlaWdodCA8IDEwKSB7CisgICAgICAgICAgICAgICAgaWYgKHNsYW50ID09ICdpJykgeworCQkgICAgLyogdHJ5IG9ibGlxdWUgaWYgbm8gaXRhbGljIGZvbnQgKi8KKwkJICAgIHNsYW50ID0gJ28nOworCQkgICAgaGVpZ2h0ID0gb2xkaGVpZ2h0OworCQkgICAgY29udGludWU7CisJCX0KKwkJaWYgKHNwYWNpbmcgPT0gJ20nICYmIHN0cmNtcChmYW1pbHksICIqLSoiKSAhPSAwKSB7CisJCSAgICAvKiBJZiBhIGZpeGVkIHNwYWNpbmcgZm9udCBjb3VsZCBub3QgYmUgZm91bmQsIGlnbm9yZQorCQkgICAgICogdGhlIGZhbWlseSAqLworCQkgICAgZmFtaWx5ID0gIiotKiI7CisJCSAgICBoZWlnaHQgPSBvbGRoZWlnaHQ7CisJCSAgICBjb250aW51ZTsKKwkJfQorICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRk9OVF9NYXRjaEZvbnQoJXMpIDogcmV0dXJuaW5nIE5VTExcbiIsIHBhdHRlcm4pOworCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICB9CisgICAgZHByaW50Zl9mb250KHN0ZGRlYiwiICAgICAgICBGb3VuZCAnJXMnXG4iLCAqbmFtZXMgKTsKKyAgICBpZiAoISpmb250LT5sZkZhY2VOYW1lKQorICAgICAgICBGT05UX1BhcnNlRm9udFBhcm1zKCpuYW1lcywgMiwgZm9udC0+bGZGYWNlTmFtZSAsIExGX0ZBQ0VTSVpFLTEpOworICAgIC8qIHdlIG5lZWQgYSBmb250IG5hbWUgZm9yIGZ1bmN0aW9uIEdldFRleHRGYWNlKCkgZXZlbiBpZiB0aGVyZSBpc24ndCBvbmUgOy0pICovICAKKworICAgIGZvbnRTdHJ1Y3QgPSBYTG9hZFF1ZXJ5Rm9udCggZGlzcGxheSwgKm5hbWVzICk7CisgICAgWEZyZWVGb250TmFtZXMoIG5hbWVzICk7CisgICAgcmV0dXJuIGZvbnRTdHJ1Y3Q7Cit9CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgWDExRFJWX0dldFRleHRFeHRlbnRQb2ludApAQCAtNjIsNCArMzAzLDE1NiBAQAogfQogCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFgxMURSVl9GT05UX1NlbGVjdE9iamVjdAorICovCitIRk9OVDMyIFgxMURSVl9GT05UX1NlbGVjdE9iamVjdCggREMgKiBkYywgSEZPTlQzMiBoZm9udCwgRk9OVE9CSiAqIGZvbnQgKQoreworICAgIHN0YXRpYyBYX1BIWVNGT05UIHN0b2NrRm9udHNbTEFTVF9TVE9DS19GT05ULUZJUlNUX1NUT0NLX0ZPTlQrMV07CiAKKyAgICBzdGF0aWMgc3RydWN0IHsKKwkJSEZPTlQzMgkJaWQ7CisJCUxPR0ZPTlQxNglsb2dmb250OworCQlpbnQJCWFjY2VzczsKKwkJaW50CQl1c2VkOworCQlYX1BIWVNGT05UCWNhY2hlRm9udDsgfSBjYWNoZUZvbnRzW0ZPTlRDQUNIRV0sICpjYWNoZUZvbnRzTWluOworICAgIGludCAJaTsKKworICAgIFhfUEhZU0ZPTlQgKiBzdG9ja1B0cjsKKyAgICBIRk9OVDMyIHByZXZIYW5kbGUgPSBkYy0+dy5oRm9udDsKKyAgICBYRm9udFN0cnVjdCAqIGZvbnRTdHJ1Y3Q7CisgICAgZHByaW50Zl9mb250KHN0ZGRlYiwiRk9OVF9TZWxlY3RPYmplY3QoJXAsICUwNHgsICVwKVxuIiwgZGMsIGhmb250LCBmb250KTsKKworI2lmIDAgLyogRnJvbSB0aGUgY29kZSBpbiBTZWxlY3RPYmplY3QsIHRoaXMgY2FuIG5vdCBoYXBwZW4gKi8KKyAgICAgIC8qIExvYWQgZm9udCBpZiBuZWNlc3NhcnkgKi8KKyAgICBpZiAoIWZvbnQpCisgICAgeworCUhGT05UMTYgaG5ld2ZvbnQ7CisKKwlobmV3Zm9udCA9IENyZWF0ZUZvbnQxNigxMCwgNywgMCwgMCwgRldfRE9OVENBUkUsCisJCQkgICAgICBGQUxTRSwgRkFMU0UsIEZBTFNFLCBERUZBVUxUX0NIQVJTRVQsIDAsIDAsCisJCQkgICAgICBERUZBVUxUX1FVQUxJVFksIEZGX0RPTlRDQVJFLCAiKiIgKTsKKwlmb250ID0gKEZPTlRPQkogKikgR0RJX0hFQVBfTElOX0FERFIoIGhuZXdmb250ICk7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoKGhmb250ID49IEZJUlNUX1NUT0NLX0ZPTlQpICYmIChoZm9udCA8PSBMQVNUX1NUT0NLX0ZPTlQpKQorCXN0b2NrUHRyID0gJnN0b2NrRm9udHNbaGZvbnQgLSBGSVJTVF9TVE9DS19GT05UXTsKKyAgICBlbHNlIHsKKwlzdG9ja1B0ciA9IE5VTEw7CisJLyoKKwkgKiBPaywgSXQncyBub3QgYSBzdG9jayBmb250IGJ1dCAKKwkgKiBtYXkgYmUgaXQncyBjYWNoZWQgaW4gZHluYW1pYyBjYWNoZQorCSAqLworCWZvcihpPTA7IGk8Rk9OVENBQ0hFOyBpKyspIC8qIHNlYXJjaCBmb3Igc2FtZSBoYW5kbGUgKi8KKwkgICAgIGlmIChjYWNoZUZvbnRzW2ldLmlkPT1oZm9udCkgeyAvKiBHb3QgdGhlIGhhbmRsZSAqLworCQkvKgorCQkgKiBDaGVjayBpZiBIYW5kbGUgbWF0Y2hlcyB0aGUgZm9udCAKKwkJICovCisJCWlmKG1lbWNtcCgmY2FjaGVGb250c1tpXS5sb2dmb250LCYoZm9udC0+bG9nZm9udCksIHNpemVvZihMT0dGT05UMTYpKSkgeworCQkJLyogTm86IHJlbW92ZSBoYW5kbGUgaWQgZnJvbSBkeW5hbWljIGZvbnQgY2FjaGUgKi8KKwkJCWNhY2hlRm9udHNbaV0uYWNjZXNzPTA7CisJCQljYWNoZUZvbnRzW2ldLnVzZWQ9MDsKKwkJCWNhY2hlRm9udHNbaV0uaWQ9MDsKKwkJCS8qIG1heSBiZSB0aGVyZSBpcyBhbiB1bnVzZWQgaGFuZGxlIHdoaWNoIGNvbnRhaW5zIHRoZSBmb250ICovCisJCQlmb3IoaT0wOyBpPEZPTlRDQUNIRTsgaSsrKSB7CisJCQkJaWYoKGNhY2hlRm9udHNbaV0udXNlZCA9PSAwKSAmJgorCQkJCSAgKG1lbWNtcCgmY2FjaGVGb250c1tpXS5sb2dmb250LCYoZm9udC0+bG9nZm9udCksIHNpemVvZihMT0dGT05UMTYpKSk9PSAwKSB7CisJCQkJCS8qIGdvdCBpdCBsb2FkIGZyb20gY2FjaGUgYW5kIHNldCBuZXcgaGFuZGxlIGlkICovCisJCQkJCXN0b2NrUHRyID0gJmNhY2hlRm9udHNbaV0uY2FjaGVGb250OworCQkJCQljYWNoZUZvbnRzW2ldLmFjY2Vzcz0xOworCQkJCQljYWNoZUZvbnRzW2ldLnVzZWQ9MTsKKwkJCQkJY2FjaGVGb250c1tpXS5pZD1oZm9udDsKKwkJCQkJZHByaW50Zl9mb250KHN0ZGRlYiwiRk9OVF9TZWxlY3RPYmplY3Q6IGdvdCBmb250IGZyb20gdW51c2VkIGhhbmRsZVxuIik7CisJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQorCQkJfQorCQllbHNlIHsKKwkJCS8qIFllczogbG9hZCBmcm9tIGR5bmFtaWMgZm9udCBjYWNoZSAqLworCQkJc3RvY2tQdHIgPSAmY2FjaGVGb250c1tpXS5jYWNoZUZvbnQ7CisJCQljYWNoZUZvbnRzW2ldLmFjY2VzcysrOworCQkJY2FjaGVGb250c1tpXS51c2VkKys7CisJCQl9CisJCWJyZWFrOworCQl9CisJfQorICAgIGlmICghc3RvY2tQdHIgfHwgIXN0b2NrUHRyLT5mc3RydWN0KQorICAgIHsKKwlpZiAoIShmb250U3RydWN0ID0gRk9OVF9NYXRjaEZvbnQoICZmb250LT5sb2dmb250LCBkYyApKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAvKiBJZiBpdCBpcyBub3QgYSBzdG9jayBmb250LCB3ZSBjYW4gc2ltcGx5IHJldHVybiAwICovCisgICAgICAgICAgICBpZiAoIXN0b2NrUHRyKSByZXR1cm4gMDsKKyAgICAgICAgICAgICAgLyogT3RoZXJ3aXNlIHdlIG11c3QgdHJ5IHRvIGZpbmQgYSBzdWJzdGl0dXRlICovCisgICAgICAgICAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJMb2FkaW5nIGZvbnQgJ2ZpeGVkJyBmb3IgJTA0eFxuIiwgaGZvbnQgKTsKKyAgICAgICAgICAgIGZvbnQtPmxvZ2ZvbnQubGZQaXRjaEFuZEZhbWlseSAmPSB+VkFSSUFCTEVfUElUQ0g7CisgICAgICAgICAgICBmb250LT5sb2dmb250LmxmUGl0Y2hBbmRGYW1pbHkgfD0gRklYRURfUElUQ0g7CisgICAgICAgICAgICBmb250U3RydWN0ID0gWExvYWRRdWVyeUZvbnQoIGRpc3BsYXksICJmaXhlZCIgKTsKKyAgICAgICAgICAgIGlmICghZm9udFN0cnVjdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJObyBzeXN0ZW0gZm9udCBjb3VsZCBiZSBmb3VuZC4gUGxlYXNlIGNoZWNrIHlvdXIgZm9udCBwYXRoLlxuIiApOworICAgICAgICAgICAgICAgIGV4aXQoIDEgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworCWZvbnRTdHJ1Y3QgPSBzdG9ja1B0ci0+ZnN0cnVjdDsKKwlkcHJpbnRmX2ZvbnQoc3RkZGViLAorICAgICAgICAgICAgICAgICAgICAgIkZPTlRfU2VsZWN0T2JqZWN0OiBMb2FkZWQgZm9udCBmcm9tIGNhY2hlICUwNHggJXBcbiIsCisJCSAgICAgaGZvbnQsIGZvbnRTdHJ1Y3QgKTsKKyAgICB9CQorCisgICAgICAvKiBVbnVzZSBwcmV2aW91cyBmb250ICovCisJZm9yIChpPTA7IGkgPCBGT05UQ0FDSEU7IGkrKykgeworCQlpZiAoY2FjaGVGb250c1tpXS5pZCA9PSBwcmV2SGFuZGxlKSB7CisJCQlpZihjYWNoZUZvbnRzW2ldLnVzZWQgPT0gMCkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlRyeWluZyB0byBkZWNyZW1lbnQgYSB1c2UgY291bnQgb2YgMC5cbiIpOworCQkJZWxzZSAKKwkJCQljYWNoZUZvbnRzW2ldLnVzZWQtLTsKKwkJfQorCX0KKworICAgICAgLyogU3RvcmUgZm9udCAqLworICAgIGRjLT53LmhGb250ID0gaGZvbnQ7CisgICAgaWYgKHN0b2NrUHRyKQorICAgIHsKKwlpZiAoIXN0b2NrUHRyLT5mc3RydWN0KQorCXsKKwkgICAgc3RvY2tQdHItPmZzdHJ1Y3QgPSBmb250U3RydWN0OworCSAgICBGT05UX0dldE1ldHJpY3MoICZmb250LT5sb2dmb250LCBmb250U3RydWN0LCAmc3RvY2tQdHItPm1ldHJpY3MgKTsKKwl9CisJbWVtY3B5KCAmZGMtPnUueC5mb250LCBzdG9ja1B0ciwgc2l6ZW9mKCpzdG9ja1B0cikgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKiAKKwkgKiBDaGVjayBpbiBjYWNoZUZvbnQKKwkgKi8KKwljYWNoZUZvbnRzTWluPU5VTEw7CisJZm9yIChpPTA7IGkgPCBGT05UQ0FDSEU7IGkrKykgeworCQlpZiAoY2FjaGVGb250c1tpXS51c2VkPT0wKSAKKwkJCWlmICgoIWNhY2hlRm9udHNNaW4pIHx8ICgoY2FjaGVGb250c01pbikgJiYgKGNhY2hlRm9udHNNaW4tPmFjY2VzcyA+IGNhY2hlRm9udHNbaV0uYWNjZXNzKSkpCisJCQkJY2FjaGVGb250c01pbj0mY2FjaGVGb250c1tpXTsKKwkJfQorCWlmICghY2FjaGVGb250c01pbikgeworCQlmcHJpbnRmKHN0ZGVyciwiTm8gdW51c2VkIGZvbnQgY2FjaGUgZW50cnkgISEhIVxuIiApOworCQlyZXR1cm4gcHJldkhhbmRsZTsKKwl9CisJaWYgKGNhY2hlRm9udHNNaW4tPmlkIT0wKSB7CisJCWRwcmludGZfZm9udChzdGRkZWIsCisJCQkiRk9OVF9TZWxlY3RPYmplY3Q6IEZyZWVpbmcgJTA0eCBcbiIsY2FjaGVGb250c01pbi0+aWQgKTsKKwkJWEZyZWVGb250KCBkaXNwbGF5LCBjYWNoZUZvbnRzTWluLT5jYWNoZUZvbnQuZnN0cnVjdCApOworCQl9CisJY2FjaGVGb250c01pbi0+Y2FjaGVGb250LmZzdHJ1Y3QgPSBmb250U3RydWN0OworCUZPTlRfR2V0TWV0cmljcyggJmZvbnQtPmxvZ2ZvbnQsIGZvbnRTdHJ1Y3QsICZjYWNoZUZvbnRzTWluLT5jYWNoZUZvbnQubWV0cmljcyApOworCWNhY2hlRm9udHNNaW4tPmFjY2Vzcz0xOworCWNhY2hlRm9udHNNaW4tPnVzZWQ9MTsKKwljYWNoZUZvbnRzTWluLT5pZD1oZm9udDsKKwltZW1jcHkoICZkYy0+dS54LmZvbnQsICYoY2FjaGVGb250c01pbi0+Y2FjaGVGb250KSwgc2l6ZW9mKGNhY2hlRm9udHNNaW4tPmNhY2hlRm9udCkgKTsKKwltZW1jcHkoJmNhY2hlRm9udHNNaW4tPmxvZ2ZvbnQsJihmb250LT5sb2dmb250KSwgc2l6ZW9mKExPR0ZPTlQxNikpOworCisgICAgfQorICAgIHJldHVybiBwcmV2SGFuZGxlOworfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L2luaXQuYyBiL2dyYXBoaWNzL3gxMWRydi9pbml0LmMKaW5kZXggYTdmZDM2MS4uNmYzNGY2MyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MveDExZHJ2L2luaXQuYworKysgYi9ncmFwaGljcy94MTFkcnYvaW5pdC5jCkBAIC01Miw3ICs1Miw3IEBACiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFNjYWxlVmlld3BvcnRFeHQgKG9wdGlvbmFsKSAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBTY2FsZVdpbmRvd0V4dCAob3B0aW9uYWwpICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFNlbGVjdENsaXBSZ24gKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU2VsZWN0T2JqZWN0ICovCisgICAgWDExRFJWX1NlbGVjdE9iamVjdCwgICAgICAgICAgICAgLyogcFNlbGVjdE9iamVjdCAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBTZWxlY3RQYWxldHRlICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFNldEJrQ29sb3IgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU2V0QmtNb2RlICovCkBAIC04NCw2ICs4NCwxOCBAQAogICovCiBCT09MMzIgWDExRFJWX0luaXQodm9pZCkKIHsKKyAgICAvKiBDcmVhdGUgZGVmYXVsdCBiaXRtYXAgKi8KKworICAgIGlmICghWDExRFJWX0JJVE1BUF9Jbml0KCkpIHJldHVybiBGQUxTRTsKKworICAgIC8qIEluaXRpYWxpemUgYnJ1c2ggZGl0aGVyaW5nICovCisKKyAgICBpZiAoIVgxMURSVl9CUlVTSF9Jbml0KCkpIHJldHVybiBGQUxTRTsKKworICAgIC8qIEluaXRpYWxpemUgZm9udHMgKi8KKworICAgIGlmICghWDExRFJWX0ZPTlRfSW5pdCgpKSByZXR1cm4gRkFMU0U7CisKICAgICByZXR1cm4gRFJJVkVSX1JlZ2lzdGVyRHJpdmVyKCAiRElTUExBWSIsICZYMTFEUlZfRnVuY3MgKTsKIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L29iamVjdHMuYyBiL2dyYXBoaWNzL3gxMWRydi9vYmplY3RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIyZjBiOAotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL3gxMWRydi9vYmplY3RzLmMKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIEdESSBvYmplY3RzCisgKgorICogQ29weXJpZ2h0IDE5OTMgQWxleGFuZHJlIEp1bGxpYXJkCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiYml0bWFwLmgiCisjaW5jbHVkZSAiYnJ1c2guaCIKKyNpbmNsdWRlICJmb250LmgiCisjaW5jbHVkZSAicGVuLmgiCisjaW5jbHVkZSAic3RkZGVidWcuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorCisKK2V4dGVybiBIQklUTUFQMzIgWDExRFJWX0JJVE1BUF9TZWxlY3RPYmplY3QoIERDICogZGMsIEhCSVRNQVAzMiBoYml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUTUFQT0JKICogYm1wICk7CitleHRlcm4gSEJSVVNIMzIgWDExRFJWX0JSVVNIX1NlbGVjdE9iamVjdCggREMgKiBkYywgSEJSVVNIMzIgaGJydXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJSVVNIT0JKICogYnJ1c2ggKTsKK2V4dGVybiBIRk9OVDMyIFgxMURSVl9GT05UX1NlbGVjdE9iamVjdCggREMgKiBkYywgSEZPTlQzMiBoZm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9OVE9CSiAqIGZvbnQgKTsKK2V4dGVybiBIUEVOMzIgWDExRFJWX1BFTl9TZWxlY3RPYmplY3QoIERDICogZGMsIEhQRU4zMiBocGVuLCBQRU5PQkogKiBwZW4gKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBYMTFEUlZfU2VsZWN0T2JqZWN0CisgKi8KK0hHRElPQkozMiBYMTFEUlZfU2VsZWN0T2JqZWN0KCBEQyAqZGMsIEhHRElPQkozMiBoYW5kbGUgKQoreworICAgIEdESU9CSkhEUiAqcHRyID0gR0RJX0dldE9ialB0ciggaGFuZGxlLCBNQUdJQ19ET05UQ0FSRSApOworCisgICAgaWYgKCFwdHIpIHJldHVybiAwOworICAgIGRwcmludGZfZ2RpKHN0ZGRlYiwgIlNlbGVjdE9iamVjdDogaGRjPSUwNHggJTA0eFxuIiwgZGMtPmhTZWxmLCBoYW5kbGUgKTsKKyAgICAKKyAgICBzd2l0Y2gocHRyLT53TWFnaWMpCisgICAgeworICAgICAgY2FzZSBQRU5fTUFHSUM6CisJICByZXR1cm4gWDExRFJWX1BFTl9TZWxlY3RPYmplY3QoIGRjLCBoYW5kbGUsIChQRU5PQkogKilwdHIgKTsKKyAgICAgIGNhc2UgQlJVU0hfTUFHSUM6CisJICByZXR1cm4gWDExRFJWX0JSVVNIX1NlbGVjdE9iamVjdCggZGMsIGhhbmRsZSwgKEJSVVNIT0JKICopcHRyICk7CisgICAgICBjYXNlIEJJVE1BUF9NQUdJQzoKKwkgIHJldHVybiBYMTFEUlZfQklUTUFQX1NlbGVjdE9iamVjdCggZGMsIGhhbmRsZSwgKEJJVE1BUE9CSiAqKXB0ciApOworICAgICAgY2FzZSBGT05UX01BR0lDOgorCSAgcmV0dXJuIFgxMURSVl9GT05UX1NlbGVjdE9iamVjdCggZGMsIGhhbmRsZSwgKEZPTlRPQkogKilwdHIgKTsJICAKKyAgICAgIGNhc2UgUkVHSU9OX01BR0lDOgorCSAgcmV0dXJuIChIR0RJT0JKMTYpU2VsZWN0Q2xpcFJnbjE2KCBkYy0+aFNlbGYsIGhhbmRsZSApOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3gxMWRydi9wZW4uYyBiL2dyYXBoaWNzL3gxMWRydi9wZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTE2NTY5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MveDExZHJ2L3Blbi5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBHREkgcGVuIG9iamVjdHMKKyAqCisgKiBDb3B5cmlnaHQgMTk5MyBBbGV4YW5kcmUgSnVsbGlhcmQKKyAqLworCisjaW5jbHVkZSAicGVuLmgiCisjaW5jbHVkZSAiY29sb3IuaCIKKyNpbmNsdWRlICJzdGRkZWJ1Zy5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIFBFTl9kYXNoW10gICAgICAgPSB7IDUsMyB9OyAgICAgIC8qIC0tLS0tICAgLS0tLS0gICAtLS0tLSAgKi8KK3N0YXRpYyBjb25zdCBjaGFyIFBFTl9kb3RbXSAgICAgICAgPSB7IDEsMSB9OyAgICAgIC8qIC0tICAtLSAgLS0gIC0tICAtLSAgLS0gKi8KK3N0YXRpYyBjb25zdCBjaGFyIFBFTl9kYXNoZG90W10gICAgPSB7IDQsMywyLDMgfTsgIC8qIC0tLS0gICAtLSAgIC0tLS0gICAtLSAgKi8KK3N0YXRpYyBjb25zdCBjaGFyIFBFTl9kYXNoZG90ZG90W10gPSB7IDQsMiwyLDIsMiwyIH07IC8qIC0tLS0gIC0tICAtLSAgLS0tLSAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgUEVOX1NlbGVjdE9iamVjdAorICovCitIUEVOMzIgWDExRFJWX1BFTl9TZWxlY3RPYmplY3QoIERDICogZGMsIEhQRU4zMiBocGVuLCBQRU5PQkogKiBwZW4gKQoreworICAgIEhQRU4zMiBwcmV2SGFuZGxlID0gZGMtPncuaFBlbjsKKworICAgIGRjLT53LmhQZW4gPSBocGVuOworICAgIGRjLT51LngucGVuLnN0eWxlID0gcGVuLT5sb2dwZW4ubG9wblN0eWxlOworICAgIGRjLT51LngucGVuLndpZHRoID0gcGVuLT5sb2dwZW4ubG9wbldpZHRoLnggKiBkYy0+dnBvcnRFeHRYIC8gZGMtPnduZEV4dFg7CisgICAgaWYgKGRjLT51LngucGVuLndpZHRoIDwgMCkgZGMtPnUueC5wZW4ud2lkdGggPSAtZGMtPnUueC5wZW4ud2lkdGg7CisgICAgaWYgKGRjLT51LngucGVuLndpZHRoID09IDEpIGRjLT51LngucGVuLndpZHRoID0gMDsgIC8qIEZhc3RlciAqLworICAgIGRjLT51LngucGVuLnBpeGVsID0gQ09MT1JfVG9QaHlzaWNhbCggZGMsIHBlbi0+bG9ncGVuLmxvcG5Db2xvciApOyAgICAKKyAgICBzd2l0Y2gocGVuLT5sb2dwZW4ubG9wblN0eWxlKQorICAgIHsKKyAgICAgIGNhc2UgUFNfREFTSDoKKwlkYy0+dS54LnBlbi5kYXNoZXMgPSAoY2hhciAqKVBFTl9kYXNoOworCWRjLT51LngucGVuLmRhc2hfbGVuID0gMjsKKwlicmVhazsKKyAgICAgIGNhc2UgUFNfRE9UOgorCWRjLT51LngucGVuLmRhc2hlcyA9IChjaGFyICopUEVOX2RvdDsKKwlkYy0+dS54LnBlbi5kYXNoX2xlbiA9IDI7CisJYnJlYWs7CisgICAgICBjYXNlIFBTX0RBU0hET1Q6CisJZGMtPnUueC5wZW4uZGFzaGVzID0gKGNoYXIgKilQRU5fZGFzaGRvdDsKKwlkYy0+dS54LnBlbi5kYXNoX2xlbiA9IDQ7CisJYnJlYWs7CisgICAgICBjYXNlIFBTX0RBU0hET1RET1Q6CisJZGMtPnUueC5wZW4uZGFzaGVzID0gKGNoYXIgKilQRU5fZGFzaGRvdGRvdDsKKwlkYy0+dS54LnBlbi5kYXNoX2xlbiA9IDY7CisJYnJlYWs7CisgICAgfQorICAgIAorICAgIHJldHVybiBwcmV2SGFuZGxlOworfQpkaWZmIC0tZ2l0IGEvaWYxNjMyL01ha2VmaWxlLmluIGIvaWYxNjMyL01ha2VmaWxlLmluCmluZGV4IGU1ZGUyMzEuLjNmMTZlYzQgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9NYWtlZmlsZS5pbgorKysgYi9pZjE2MzIvTWFrZWZpbGUuaW4KQEAgLTYwLDkgKzYwLDYgQEAKIAlyZWxheS5jIFwKIAl0aHVuay5jCiAKLUFTTV9TUkNTID0gXAotCWV4Y2VwdC5TCi0KIEdFTl9BU01fU1JDUyA9IFwKIAkkKFNQRUNfRklMRVMpIFwKIAljYWxsZnJvbTE2LnMgXApAQCAtOTMsNyArOTAsNCBAQAogY2FsbHRvMzIuczogJChUT1BTUkNESVIpL2luY2x1ZGUvY2FsbGJhY2suaCAkKEJVSUxEKQogCSQoQlVJTEQpIC1vICRAIC1jYWxsdG8zMiBgY2F0ICQoVE9QU1JDRElSKS9pbmNsdWRlL2NhbGxiYWNrLmggfCBncmVwICJleHRlcm4uKkNhbGxUbzMyXyIgfCBzZWQgJ3MvLipDYWxsVG8zMl9cKC4qXCkoLiovXDEvJyB8IHNvcnQgfCB1bmlxYAogCi1leGNlcHQubzogZXhjZXB0LlMgJChUT1BPQkpESVIpL2luY2x1ZGUvY29uZmlnLmgKLQkkKENDKSAtYyAkKERJVklOQ0wpIC1vICQqLm8gJChTUkNESVIpL2V4Y2VwdC5TCi0KICMjIyBEZXBlbmRlbmNpZXM6CmRpZmYgLS1naXQgYS9pZjE2MzIvY3J0ZGxsLnNwZWMgYi9pZjE2MzIvY3J0ZGxsLnNwZWMKaW5kZXggYjI0OWI2MC4uYTEyNzlmOSAxMDA2NDQKLS0tIGEvaWYxNjMyL2NydGRsbC5zcGVjCisrKyBiL2lmMTYzMi9jcnRkbGwuc3BlYwpAQCAtNTQsNyArNTQsNyBAQAogMDQ5IHN0dWIgX2NleGl0CiAwNTAgc3R1YiBfY2dldHMKIDA1MSBzdHViIF9jaGRpcgotMDUyIHN0dWIgX2NoZHJpdmUKKzA1MiBjZGVjbCBfY2hkcml2ZShsb25nKSBDUlRETExfX2NoZHJpdmUKIDA1MyBzdHViIF9jaGdzaWduCiAwNTQgc3R1YiBfY2htb2QKIDA1NSBzdHViIF9jaHNpemUKQEAgLTc5LDcgKzc5LDcgQEAKIDA3NCBzdHViIF9lbmR0aHJlYWQKIDA3NSBleHRlcm4gX2Vudmlyb25fZGxsIENSVERMTF9lbnZpcm9uX2RsbAogMDc2IHN0dWIgX2VvZgotMDc3IHN0dWIgX2Vycm5vCiswNzcgY2RlY2wgX2Vycm5vKCkgQ1JURExMX19lcnJubwogMDc4IHN0dWIgX2V4Y2VwdF9oYW5kbGVyMgogMDc5IHN0dWIgX2V4ZWNsCiAwODAgc3R1YiBfZXhlY2xlCkBAIC0xNDAsNyArMTQwLDcgQEAKIDEzNSBjZGVjbCBfaW5pdHRlcm0ocHRyIHB0cikgQ1JURExMX19pbml0dGVybQogMTM2IHN0dWIgX2lvYgogMTM3IGNkZWNsIF9pc2F0dHkobG9uZykgQ1JURExMX19pc2F0dHkKLTEzOCBzdHViIF9pc2N0eXBlCisxMzggY2RlY2wgX2lzY3R5cGUobG9uZyBsb25nKSBDUlRETExfX2lzY3R5cGUKIDEzOSBzdHViIF9pc21iYmFsbnVtCiAxNDAgc3R1YiBfaXNtYmJhbHBoYQogMTQxIHN0dWIgX2lzbWJiZ3JhcGgKQEAgLTQzMiw3ICs0MzIsNyBAQAogNDI3IGNkZWNsIG1hbGxvYyhwdHIpIENSVERMTF9tYWxsb2MKIDQyOCBzdHViIG1ibGVuCiA0Mjkgc3R1YiBtYnN0b3djcwotNDMwIHN0dWIgbWJ0b3djCis0MzAgY2RlY2wgbWJ0b3djKGxvbmcpIENSVERMTF9tYnRvd2MKIDQzMSBjZGVjbCBtZW1jaHIocHRyIGxvbmcgbG9uZykgbWVtY2hyCiA0MzIgY2RlY2wgbWVtY21wKHB0ciBwdHIgbG9uZykgbWVtY21wCiA0MzMgY2RlY2wgbWVtY3B5KHB0ciBwdHIgbG9uZykgbWVtY3B5CkBAIC01MTAsNyArNTEwLDcgQEAKIDUwNSBzdHViIHdjc2NtcAogNTA2IGNkZWNsIHdjc2NvbGwocHRyIHB0cikgQ1JURExMX3djc2NvbGwKIDUwNyBjZGVjbCB3Y3NjcHkocHRyIHB0cikgbHN0cmNweTMyVwotNTA4IHN0dWIgd2NzY3NwbgorNTA4IGNkZWNsIHdjc2NzcG4ocHRyIHB0cikgQ1JURExMX3djc2NzcG4KIDUwOSBzdHViIHdjc2Z0aW1lCiA1MTAgY2RlY2wgd2NzbGVuKHB0cikgbHN0cmxlbjMyVwogNTExIGNkZWNsIHdjc25jYXQocHRyIHB0ciBsb25nKSBsc3RyY2F0bjMyVwpkaWZmIC0tZ2l0IGEvaWYxNjMyL2V4Y2VwdC5TIGIvaWYxNjMyL2V4Y2VwdC5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmUwNWI3Li4wMDAwMDAwCi0tLSBhL2lmMTYzMi9leGNlcHQuUworKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKgotICogV2luMzIgZXhjZXB0aW9uIGFzc2VtYmx5IGZ1bmN0aW9ucwotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NiBPbm5vIEhvdmVycywgKG9ubm9Ac3RhY2sudXJjLnR1ZS5ubCkKLSAqCi0gKi8KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2lmZGVmIE5FRURfVU5ERVJTQ09SRV9QUkVGSVgKLQotICAgICAuZ2xvYmwgX0VYQ19DYWxsVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyCi0gX0VYQ19DYWxsVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyOgotCi0jZWxzZQotCi0gICAgIC5nbG9ibCBFWENfQ2FsbFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgotIEVYQ19DYWxsVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyOgotCi0jZW5kaWYgIC8qIE5FRURfVU5ERVJTQ09SRV9QUkVGSVggKi8KLSAgICAgbGVhbCAgIDQoJWVzcCksJWVheAotICAgICBwdXNobCAgJWVheAotI2lmZGVmIE5FRURfVU5ERVJTQ09SRV9QUkVGSVgKLSAgICAgY2FsbCAgICpfcFRvcEV4Y0hhbmRsZXIKLSNlbHNlCi0gICAgIGNhbGwgICAqcFRvcEV4Y0hhbmRsZXIKLSNlbmRpZiAgLyogTkVFRF9VTkRFUlNDT1JFX1BSRUZJWCAqLwotICAgICBtb3ZsICAgJWVicCwlZXNwCi0gICAgIHJldAotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgICAgUmFpc2VFeGNlcHRpb24gICAgICAgICAgIChLRVJORUwzMi4gNDE4ICkKLSAqICAgICAgICBSdGxVbndpbmQgICAgICAgICAgICAgICAgKEtFUk5FTDMyLiA0NDMgKQotICoKLSAqIHdlIG5lZWQgdG8gc2F2ZSBvdXIgY29udGV4dCBiZWZvcmUgYSBjYWxsIHRvCi0gKgotICogLVJhaXNlRXhjZXB0aW9uCi0gKiAtUnRsVW53aW5kCi0gKgotICogYWZ0ZXIgdGhlc2UgZnVuY3Rpb25zIHdlIG5lZWQgdG8gcmVzdG9yZSB0aGF0IGNvbnRleHQgc3RydWN0dXJlIGFzCi0gKiB0aGUgYWN0dWFsIGNvbnRleHQgc28gY2hhbmdlcyBtYWRlIHRvIHRoZSBjb250ZXh0IHN0cnVjdHVyZSBpbiBhbgotICogZXhjZXB0aW9uLWhhbmRsZXIgd2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlIGNvbnRleHQgYWZ0ZXIgdGhlc2UKLSAqIGZ1bmN0aW9ucyByZXR1cm4uIEZvcnR1bmF0ZWx5IGJvdGggZnVuY3Rpb25zIGhhdmUgNCBEV09SRCBwYXJhbXMuCi0gKiB3ZSBwYXNzIHRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYXMgYSBmaWZ0aCBwYXJhbWV0ZXIgdG8gQ29udGV4dENhbGwKLSAqCi0gKi8KLSNkZWZpbmUgQ09OVEVYVF9TZWdTcyAgICAgICAgLTQKLSNkZWZpbmUgQ09OVEVYVF9Fc3AgICAgICAgICAgLTgKLSNkZWZpbmUgQ09OVEVYVF9FRmxhZ3MgICAgICAgLTEyCi0jZGVmaW5lIENPTlRFWFRfU2VnQ3MgICAgICAgIC0xNgotI2RlZmluZSBDT05URVhUX0VpcCAgICAgICAgICAtMjAKLSNkZWZpbmUgQ09OVEVYVF9FYnAgICAgICAgICAgLTI0Ci0jZGVmaW5lIENPTlRFWFRfRWF4ICAgICAgICAgIC0yOAotI2RlZmluZSBDT05URVhUX0VjeCAgICAgICAgICAtMzIKLSNkZWZpbmUgQ09OVEVYVF9FZHggICAgICAgICAgLTM2Ci0jZGVmaW5lIENPTlRFWFRfRWJ4ICAgICAgICAgIC00MAotI2RlZmluZSBDT05URVhUX0VzaSAgICAgICAgICAtNDQKLSNkZWZpbmUgQ09OVEVYVF9FZGkgICAgICAgICAgLTQ4Ci0jZGVmaW5lIENPTlRFWFRfU2VnRHMgICAgICAgIC01MgotI2RlZmluZSBDT05URVhUX1NlZ0VzICAgICAgICAtNTYKLSNkZWZpbmUgQ09OVEVYVF9TZWdGcyAgICAgICAgLTYwCi0jZGVmaW5lIENPTlRFWFRfU2VnR3MgICAgICAgIC02NAotI2RlZmluZSBGTE9BVF9DcjBOcHhTdGF0ZSAgICAtNjgKLSNkZWZpbmUgRkxPQVRfUmVnaXN0ZXJBcmVhICAgLTE0OAotI2RlZmluZSBGTE9BVF9EYXRhU2VsZWN0b3IgICAtMTUyCi0jZGVmaW5lIEZMT0FUX0RhdGFPZmZzZXQgICAgIC0xNTYKLSNkZWZpbmUgRkxPQVRfRXJyb3JTZWxlY3RvciAgLTE2MAotI2RlZmluZSBGTE9BVF9FcnJvck9mZnNldCAgICAtMTY0Ci0jZGVmaW5lIEZMT0FUX1RhZ1dvcmQgICAgICAgIC0xNjgKLSNkZWZpbmUgRkxPQVRfU3RhdHVzV29yZCAgICAgLTE3MgotI2RlZmluZSBGTE9BVF9Db250cm9sV29yZCAgICAtMTc2Ci0jZGVmaW5lIENPTlRFWFRfRmxvYXRTYXZlICAgIC0xNzYKLSNkZWZpbmUgQ09OVEVYVF9EcjcgICAgICAgICAgLTE4MAotI2RlZmluZSBDT05URVhUX0RyNiAgICAgICAgICAtMTg0Ci0jZGVmaW5lIENPTlRFWFRfRHIzICAgICAgICAgIC0xODgKLSNkZWZpbmUgQ09OVEVYVF9EcjIgICAgICAgICAgLTE5MgotI2RlZmluZSBDT05URVhUX0RyMSAgICAgICAgICAtMTk2Ci0jZGVmaW5lIENPTlRFWFRfRHIwICAgICAgICAgIC0yMDAKLSNkZWZpbmUgQ09OVEVYVF9Db250ZXh0RmxhZ3MgLTIwNAotI2RlZmluZSBDT05URVhUICAgICAgICAgICAgICAtMjA0Ci0jZGVmaW5lIENPTlRFWFRTSVpFICAgICAgICAgICAyMDQKLSNkZWZpbmUgQ09OVEVYVEZMQUdTICAgICAgICAgIDB4MTAwMDcKLQotI2RlZmluZSBPUklHX0VTUCAgICAgICAgICAgICAgMTYgICAgICAgICAvKiogY2RlY2wgISEhICoqLwotI2RlZmluZSBQQVJNX0FSRzQgICAgICAgICAgICAgMjgKLSNkZWZpbmUgUEFSTV9BUkczICAgICAgICAgICAgIDI0Ci0jZGVmaW5lIFBBUk1fQVJHMiAgICAgICAgICAgICAyMAotI2RlZmluZSBQQVJNX0FSRzEgICAgICAgICAgICAgMTYKLSNkZWZpbmUgUEFSTV9SRVRVUk4gICAgICAgICAgIDEyCi0jZGVmaW5lIFBBUk1fQ0FMTEZVTkMgICAgICAgICA4Ci0jZGVmaW5lIFBBUk1fRUJQICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFBBUk1fRUZMQUdTICAgICAgICAgICAwCi0KLSNpZmRlZiBORUVEX1VOREVSU0NPUkVfUFJFRklYCi0JLmdsb2JsIF9SYWlzZUV4Y2VwdGlvbgotCi0gX1JhaXNlRXhjZXB0aW9uOgotICAgICAgIHB1c2ggICAkX0VYQ19SYWlzZUV4Y2VwdGlvbgotICAgICAgIGptcCAgICBDb250ZXh0Q2FsbAotCi0gICAgICAgLmdsb2JsIF9SdGxVbndpbmQKLQotIF9SdGxVbndpbmQ6Ci0gICAgICAgcHVzaCAgICRfRVhDX1J0bFVud2luZAotCi0jZWxzZSAgLyogTkVFRF9VTkRFUlNDT1JFX1BSRUZJWCAqLwotICAgICAgIC5nbG9ibCBSYWlzZUV4Y2VwdGlvbgotCi0gUmFpc2VFeGNlcHRpb246Ci0gICAgICAgcHVzaCAgICRFWENfUmFpc2VFeGNlcHRpb24KLSAgICAgICBqbXAgICAgQ29udGV4dENhbGwKLQotICAgICAgIC5nbG9ibCBSdGxVbndpbmQKLQotIFJ0bFVud2luZDoKLSAgICAgICBwdXNoICAgJEVYQ19SdGxVbndpbmQKLSNlbmRpZiAgLyogTkVFRF9VTkRFUlNDT1JFX1BSRUZJWCAqLwotCi0gQ29udGV4dENhbGw6Ci0gICAgICAgcHVzaGwgICVlYnAKLSAgICAgICBwdXNoZmwKLSAgICAgICBtb3ZsICAgJWVzcCwgJWVicAotICAgICAgIHN1YmwgICAkQ09OVEVYVFNJWkUsICAgICAgJWVzcAotICAgICAgIG1vdmwgICAlZWF4LCBDT05URVhUX0VheCglZWJwKQotICAgICAgIGxlYWwgICBPUklHX0VTUCglZWJwKSwgJWVheAotICAgICAgIG1vdmwgICAlZWF4LCBDT05URVhUX0VzcCglZWJwKQotICAgICAgIG1vdmwgICBQQVJNX0VGTEFHUyglZWJwKSwgJWVheAotICAgICAgIG1vdmwgICAlZWF4LCBDT05URVhUX0VGbGFncyglZWJwKQotICAgICAgIG1vdmwgICBQQVJNX0VCUCglZWJwKSwgJWVheAotICAgICAgIG1vdmwgICAlZWF4LCBDT05URVhUX0VicCglZWJwKQotICAgICAgIG1vdmwgICBQQVJNX1JFVFVSTiglZWJwKSwgJWVheAotICAgICAgIG1vdmwgICAlZWF4LCBDT05URVhUX0VpcCglZWJwKQotICAgICAgIG1vdmwgICAlZWRpLCBDT05URVhUX0VkaSglZWJwKQotICAgICAgIG1vdmwgICAlZXNpLCBDT05URVhUX0VzaSglZWJwKQotICAgICAgIG1vdmwgICAlZWJ4LCBDT05URVhUX0VieCglZWJwKQotICAgICAgIG1vdmwgICAlZWR4LCBDT05URVhUX0VkeCglZWJwKQotICAgICAgIG1vdmwgICAlZWN4LCBDT05URVhUX0VjeCglZWJwKQotICAgICAgIHhvcmwgICAlZWF4LCAlZWF4Ci0gICAgICAgbW92dyAgICVzcywgJWF4Ci0gICAgICAgbW92bCAgICVlYXgsIENPTlRFWFRfU2VnU3MoJWVicCkKLSAgICAgICBtb3Z3ICAgJWNzLCAlYXgKLSAgICAgICBtb3ZsICAgJWVheCwgQ09OVEVYVF9TZWdDcyglZWJwKQotICAgICAgIG1vdncgICAlZ3MsICVheAotICAgICAgIG1vdmwgICAlZWF4LCBDT05URVhUX1NlZ0dzKCVlYnApCi0gICAgICAgbW92dyAgICVmcywgJWF4Ci0gICAgICAgbW92bCAgICVlYXgsIENPTlRFWFRfU2VnRnMoJWVicCkKLSAgICAgICBtb3Z3ICAgJWVzLCAlYXgKLSAgICAgICBtb3ZsICAgJWVheCwgQ09OVEVYVF9TZWdFcyglZWJwKQotICAgICAgIG1vdncgICAlZHMsICVheAotICAgICAgIG1vdmwgICAlZWF4LCBDT05URVhUX1NlZ0RzKCVlYnApCi0gICAgICAgZnNhdmUgIENPTlRFWFRfRmxvYXRTYXZlKCVlYnApCi0gICAgICAgbW92bCAgICRDT05URVhURkxBR1MsICVlYXgKLSAgICAgICBtb3ZsICAgJWVheCwgQ09OVEVYVF9Db250ZXh0RmxhZ3MoJWVicCkKLSAgICAgICBwdXNobCAgJWVicAotICAgICAgIGxlYWwgICBDT05URVhUKCVlYnApLCAlZWF4Ci0gICAgICAgcHVzaGwgICVlYXgKLSAgICAgICBwdXNobCAgUEFSTV9BUkc0KCVlYnApCi0gICAgICAgcHVzaGwgIFBBUk1fQVJHMyglZWJwKQotICAgICAgIHB1c2hsICBQQVJNX0FSRzIoJWVicCkKLSAgICAgICBwdXNobCAgUEFSTV9BUkcxKCVlYnApCi0gICAgICAgY2FsbCAgICpQQVJNX0NBTExGVU5DKCVlYnApCi0gICAgICAgYWRkbCAgICQyMCwlZXNwCi0gICAgICAgcG9wbCAgICVlYnAKLSAgICAgICBsZHMgICAgQ09OVEVYVF9Fc3AoJWVicCksJWVkaQotICAgICAgIG1vdmwgICBDT05URVhUX0VpcCglZWJwKSwlZWF4Ci0gICAgICAgbW92bCAgICVlYXgsLTQoJWVkaSkKLSAgICAgICBtb3ZsICAgQ09OVEVYVF9FRmxhZ3MoJWVicCksJWVheAotICAgICAgIG1vdmwgICAlZWF4LC04KCVlZGkpCi0gICAgICAgbW92bCAgIENPTlRFWFRfRWRpKCVlYnApLCVlYXgKLSAgICAgICBtb3ZsICAgJWVheCwtMTIoJWVkaSkKLSAgICAgICBtb3ZsICAgQ09OVEVYVF9TZWdEcyglZWJwKSwlZWF4Ci0gICAgICAgbW92dyAgICVheCwlZHMKLSAgICAgICBtb3ZsICAgQ09OVEVYVF9TZWdFcyglZWJwKSwlZWF4Ci0gICAgICAgbW92dyAgICVheCwlZXMKLSAgICAgICBtb3ZsICAgQ09OVEVYVF9TZWdGcyglZWJwKSwlZWF4Ci0gICAgICAgbW92dyAgICVheCwlZnMKLSAgICAgICBtb3ZsICAgQ09OVEVYVF9TZWdHcyglZWJwKSwlZWF4Ci0gICAgICAgbW92dyAgICVheCwlZ3MKLSAgICAgICBmcnN0b3IgQ09OVEVYVF9GbG9hdFNhdmUoJWVicCkKLSAgICAgICBtb3ZsICAgQ09OVEVYVF9FY3goJWVicCksJWVjeAotICAgICAgIG1vdmwgICBDT05URVhUX0VkeCglZWJwKSwlZWR4Ci0gICAgICAgbW92bCAgIENPTlRFWFRfRWJ4KCVlYnApLCVlYngKLSAgICAgICBtb3ZsICAgQ09OVEVYVF9Fc2koJWVicCksJWVzaQotICAgICAgIG1vdmwgICBDT05URVhUX0VheCglZWJwKSwlZWF4Ci0gICAgICAgbW92bCAgIENPTlRFWFRfRWJwKCVlYnApLCVlYnAKLSAgICAgICBsZWEgICAgLTEyKCVlZGkpLCVlc3AKLSAgICAgICBwb3BsICAgJWVkaQotICAgICAgIHBvcGZsCi0gICAgICAgcmV0CmRpZmYgLS1naXQgYS9pZjE2MzIvZ2RpLnNwZWMgYi9pZjE2MzIvZ2RpLnNwZWMKaW5kZXggMjkwZmI4NS4uY2E4ZDFmMSAxMDA2NDQKLS0tIGEvaWYxNjMyL2dkaS5zcGVjCisrKyBiL2lmMTYzMi9nZGkuc3BlYwpAQCAtMjA5LDkgKzIwOSw5IEBACiAyODEgcGFzY2FsIERydlNldFByaW50ZXJEYXRhKHB0ciBwdHIgcHRyIHB0ciBsb25nKSBEcnZTZXRQcmludGVyRGF0YQogMjgyIHBhc2NhbCBEcnZHZXRQcmludGVyRGF0YShwdHIgcHRyIHB0ciBwdHIgbG9uZyBwdHIpIERydkdldFByaW50ZXJEYXRhCiAyOTkgc3R1YiBFTkdJTkVHRVRDSEFSV0lEVEhFWAotMzAwIHBhc2NhbCBFbmdpbkVudW1lcmF0ZUZvbnQocHRyIHNlZ3B0ciBsb25nKSBFbmdpbmVFbnVtZXJhdGVGb250CiszMDAgcGFzY2FsIEVuZ2luZUVudW1lcmF0ZUZvbnQocHRyIHNlZ3B0ciBsb25nKSBFbmdpbmVFbnVtZXJhdGVGb250CiAzMDEgc3R1YiBFTkdJTkVERUxFVEVGT05UCi0zMDIgcGFzY2FsIEVuZ2luUmVhbGl6ZUZvbnQocHRyIHB0ciBwdHIpIEVuZ2luZVJlYWxpemVGb250CiszMDIgcGFzY2FsIEVuZ2luZVJlYWxpemVGb250KHB0ciBwdHIgcHRyKSBFbmdpbmVSZWFsaXplRm9udAogMzAzIHN0dWIgRU5HSU5FR0VUQ0hBUldJRFRICiAzMDQgc3R1YiBFTkdJTkVTRVRGT05UQ09OVEVYVAogMzA1IHN0dWIgRU5HSU5FR0VUR0xZUEhCTVAKZGlmZiAtLWdpdCBhL2lmMTYzMi9nZGkzMi5zcGVjIGIvaWYxNjMyL2dkaTMyLnNwZWMKaW5kZXggYzIwZWVhYS4uYTcwMzNkZiAxMDA2NDQKLS0tIGEvaWYxNjMyL2dkaTMyLnNwZWMKKysrIGIvaWYxNjMyL2dkaTMyLnNwZWMKQEAgLTI5NCw3ICsyOTQsNyBAQAogMDI4NiBzdHViIFJlbW92ZUZvbnRSZXNvdXJjZVcKIDAyODcgc3RkY2FsbCBSZXNldERDQShsb25nIHB0cikgUmVzZXREQzMyQQogMDI4OCBzdGRjYWxsIFJlc2V0RENXKGxvbmcgcHRyKSBSZXNldERDMzJXCi0wMjg5IHN0dWIgUmVzaXplUGFsZXR0ZQorMDI4OSBzdGRjYWxsIFJlc2l6ZVBhbGV0dGUobG9uZyBsb25nKSBSZXNpemVQYWxldHRlCiAwMjkwIHN0ZGNhbGwgUmVzdG9yZURDKGxvbmcgbG9uZykgUmVzdG9yZURDMzIKIDAyOTEgc3RkY2FsbCBSb3VuZFJlY3QobG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgUm91bmRSZWN0MzIKIDAyOTIgc3RkY2FsbCBTYXZlREMobG9uZykgU2F2ZURDMzIKQEAgLTMzMiw3ICszMzIsNyBAQAogMDMyMyBzdHViIFNldE1ldGFGaWxlQml0c0V4CiAwMzI0IHN0dWIgU2V0TWV0YVJnbgogMDMyNSBzdHViIFNldE1pdGVyTGltaXQKLTAzMjYgc3R1YiBTZXRQYWxldHRlRW50cmllcworMDMyNiBzdGRjYWxsIFNldFBhbGV0dGVFbnRyaWVzKGxvbmcgbG9uZyBsb25nIHB0cikgU2V0UGFsZXR0ZUVudHJpZXMKIDAzMjcgc3RkY2FsbCBTZXRQaXhlbChsb25nIGxvbmcgbG9uZyBsb25nKSBTZXRQaXhlbDMyCiAwMzI4IHN0dWIgU2V0UGl4ZWxGb3JtYXQKIDAzMjkgc3R1YiBTZXRQaXhlbFYKQEAgLTM0MSw3ICszNDEsNyBAQAogMDMzMiBzdGRjYWxsIFNldFJlY3RSZ24obG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBTZXRSZWN0UmduCiAwMzMzIHN0ZGNhbGwgU2V0UmVsQWJzKGxvbmcgbG9uZykgU2V0UmVsQWJzMzIKIDAzMzQgc3RkY2FsbCBTZXRTdHJldGNoQmx0TW9kZShsb25nIGxvbmcpIFNldFN0cmV0Y2hCbHRNb2RlMzIKLTAzMzUgc3R1YiBTZXRTeXN0ZW1QYWxldHRlVXNlCiswMzM1IHN0ZGNhbGwgU2V0U3lzdGVtUGFsZXR0ZVVzZShsb25nIGxvbmcpIFNldFN5c3RlbVBhbGV0dGVVc2UKIDAzMzYgc3RkY2FsbCBTZXRUZXh0QWxpZ24obG9uZyBsb25nKSBTZXRUZXh0QWxpZ24zMgogMDMzNyBzdGRjYWxsIFNldFRleHRDaGFyYWN0ZXJFeHRyYShsb25nIGxvbmcpIFNldFRleHRDaGFyYWN0ZXJFeHRyYTMyCiAwMzM4IHN0ZGNhbGwgU2V0VGV4dENvbG9yKGxvbmcgbG9uZykgU2V0VGV4dENvbG9yCmRpZmYgLS1naXQgYS9pZjE2MzIva2VybmVsLnNwZWMgYi9pZjE2MzIva2VybmVsLnNwZWMKaW5kZXggYzdkMDFiOS4uZDkzNGRhZCAxMDA2NDQKLS0tIGEvaWYxNjMyL2tlcm5lbC5zcGVjCisrKyBiL2lmMTYzMi9rZXJuZWwuc3BlYwpAQCAtMTAzLDcgKzEwMyw3IEBACiAxMDQgc3R1YiBHZXRDb2RlSW5mbwogMTA1IHBhc2NhbDE2IEdldEV4ZVZlcnNpb24oKSBHZXRFeGVWZXJzaW9uCiAxMDYgcGFzY2FsIFNldFN3YXBBcmVhU2l6ZSh3b3JkKSBTZXRTd2FwQXJlYVNpemUKLTEwNyBwYXNjYWwxNiBTZXRFcnJvck1vZGUod29yZCkgU2V0RXJyb3JNb2RlCisxMDcgcGFzY2FsMTYgU2V0RXJyb3JNb2RlKHdvcmQpIFNldEVycm9yTW9kZTE2CiAxMDggcGFzY2FsMTYgU3dpdGNoU3RhY2tUbyh3b3JkIHdvcmQgd29yZCkgU3dpdGNoU3RhY2tUbwogMTA5IHJlZ2lzdGVyIFN3aXRjaFN0YWNrQmFjaygpIFN3aXRjaFN0YWNrQmFjawogMTEwIHBhc2NhbDE2IFBhdGNoQ29kZUhhbmRsZSh3b3JkKSBQYXRjaENvZGVIYW5kbGUKZGlmZiAtLWdpdCBhL2lmMTYzMi9rZXJuZWwzMi5zcGVjIGIvaWYxNjMyL2tlcm5lbDMyLnNwZWMKaW5kZXggYTlkY2JhNC4uZmE4NTllNCAxMDA2NDQKLS0tIGEvaWYxNjMyL2tlcm5lbDMyLnNwZWMKKysrIGIvaWYxNjMyL2tlcm5lbDMyLnNwZWMKQEAgLTMwLDcgKzMwLDcgQEAKIDAwMjUgc3R1YiBDbWRCYXROb3RpZmljYXRpb24KIDAwMjYgc3R1YiBDb21tQ29uZmlnRGlhbG9nQQogMDAyNyBzdHViIENvbW1Db25maWdEaWFsb2dXCi0wMDI4IHN0dWIgQ29tcGFyZUZpbGVUaW1lCiswMDI4IHN0ZGNhbGwgQ29tcGFyZUZpbGVUaW1lKHB0ciBwdHIpIENvbXBhcmVGaWxlVGltZQogMDAyOSBzdGRjYWxsIENvbXBhcmVTdHJpbmdBKGxvbmcgbG9uZyBwdHIgbG9uZyBwdHIgbG9uZykgQ29tcGFyZVN0cmluZzMyQQogMDAzMCBzdGRjYWxsIENvbXBhcmVTdHJpbmdXKGxvbmcgbG9uZyBwdHIgbG9uZyBwdHIgbG9uZykgQ29tcGFyZVN0cmluZzMyVwogMDAzMSBzdHViIENvbm5lY3ROYW1lZFBpcGUKQEAgLTY1LDcgKzY1LDcgQEAKIDAwNjAgc3R1YiBDcmVhdGVTZW1hcGhvcmVBCiAwMDYxIHN0dWIgQ3JlYXRlU2VtYXBob3JlVwogMDA2MiBzdHViIENyZWF0ZVRhcGVQYXJ0aXRpb24KLTAwNjMgc3R1YiBDcmVhdGVUaHJlYWQKKzAwNjMgc3RkY2FsbCBDcmVhdGVUaHJlYWQocHRyIGxvbmcgcHRyIGxvbmcgbG9uZyBwdHIpIENyZWF0ZVRocmVhZAogMDA2NCBzdHViIENyZWF0ZVZpcnR1YWxCdWZmZXIKIDAwNjUgc3R1YiBEZWJ1Z0FjdGl2ZVByb2Nlc3MKIDAwNjYgc3R1YiBEZWJ1Z0JyZWFrCkBAIC04OCwxMiArODgsMTIgQEAKIDAwODMgc3R1YiBFbnVtQ2FsZW5kYXJJbmZvVwogMDA4NCBzdHViIEVudW1EYXRlRm9ybWF0c0EKIDAwODUgc3R1YiBFbnVtRGF0ZUZvcm1hdHNXCi0wMDg2IHN0dWIgRW51bVJlc291cmNlTGFuZ3VhZ2VzQQotMDA4NyBzdHViIEVudW1SZXNvdXJjZUxhbmd1YWdlc1cKLTAwODggc3R1YiBFbnVtUmVzb3VyY2VOYW1lc0EKLTAwODkgc3R1YiBFbnVtUmVzb3VyY2VOYW1lc1cKLTAwOTAgc3R1YiBFbnVtUmVzb3VyY2VUeXBlc0EKLTAwOTEgc3R1YiBFbnVtUmVzb3VyY2VUeXBlc1cKKzAwODYgc3RkY2FsbCBFbnVtUmVzb3VyY2VMYW5ndWFnZXNBKGxvbmcgcHRyIHB0ciBwdHIgbG9uZykgVEhVTktfRW51bVJlc291cmNlTGFuZ3VhZ2VzMzJBCiswMDg3IHN0ZGNhbGwgRW51bVJlc291cmNlTGFuZ3VhZ2VzVyhsb25nIHB0ciBwdHIgcHRyIGxvbmcpIFRIVU5LX0VudW1SZXNvdXJjZUxhbmd1YWdlczMyVworMDA4OCBzdGRjYWxsIEVudW1SZXNvdXJjZU5hbWVzQShsb25nIHB0ciBwdHIgbG9uZykgVEhVTktfRW51bVJlc291cmNlTmFtZXMzMkEKKzAwODkgc3RkY2FsbCBFbnVtUmVzb3VyY2VOYW1lc1cobG9uZyBwdHIgcHRyIGxvbmcpIFRIVU5LX0VudW1SZXNvdXJjZU5hbWVzMzJXCiswMDkwIHN0ZGNhbGwgRW51bVJlc291cmNlVHlwZXNBKGxvbmcgcHRyIGxvbmcpIFRIVU5LX0VudW1SZXNvdXJjZVR5cGVzMzJBCiswMDkxIHN0ZGNhbGwgRW51bVJlc291cmNlVHlwZXNXKGxvbmcgcHRyIGxvbmcpIFRIVU5LX0VudW1SZXNvdXJjZVR5cGVzMzJXCiAwMDkyIHN0ZGNhbGwgRW51bVN5c3RlbUNvZGVQYWdlc0EocHRyIGxvbmcpIFRIVU5LX0VudW1TeXN0ZW1Db2RlUGFnZXMzMkEKIDAwOTMgc3RkY2FsbCBFbnVtU3lzdGVtQ29kZVBhZ2VzVyhwdHIgbG9uZykgVEhVTktfRW51bVN5c3RlbUNvZGVQYWdlczMyVwogMDA5NCBzdGRjYWxsIEVudW1TeXN0ZW1Mb2NhbGVzQShwdHIgbG9uZykgVEhVTktfRW51bVN5c3RlbUxvY2FsZXMzMkEKQEAgLTQwNyw3ICs0MDcsNyBAQAogMDQwMiBzdHViIE9wZW5Qcm9maWxlVXNlck1hcHBpbmcKIDA0MDMgc3R1YiBPcGVuU2VtYXBob3JlQQogMDQwNCBzdHViIE9wZW5TZW1hcGhvcmVXCi0wNDA1IHN0dWIgT3V0cHV0RGVidWdTdHJpbmdBCiswNDA1IHN0ZGNhbGwgT3V0cHV0RGVidWdTdHJpbmdBKHB0cikgT3V0cHV0RGVidWdTdHJpbmcKIDA0MDYgc3R1YiBPdXRwdXREZWJ1Z1N0cmluZ1cKIDA0MDcgc3R1YiBQZWVrQ29uc29sZUlucHV0QQogMDQwOCBzdHViIFBlZWtDb25zb2xlSW5wdXRXCkBAIC00MjAsNyArNDIwLDcgQEAKIDA0MTUgc3RkY2FsbCBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcihwdHIpIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyCiAwNDE2IHN0dWIgUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeQogMDQxNyBzdHViIFF1ZXJ5V2luMzFJbmlGaWxlc01hcHBlZFRvUmVnaXN0cnkKLTA0MTggc3RkY2FsbCBSYWlzZUV4Y2VwdGlvbihsb25nIGxvbmcgbG9uZyBwdHIpIFJhaXNlRXhjZXB0aW9uCiswNDE4IHJlZ2lzdGVyIFJhaXNlRXhjZXB0aW9uKGxvbmcgbG9uZyBsb25nIHB0cikgUmFpc2VFeGNlcHRpb24KIDA0MTkgc3RkY2FsbCBSZWFkQ29uc29sZUEobG9uZyBwdHIgbG9uZyBwdHIgcHRyKSBSZWFkQ29uc29sZTMyQQogMDQyMCBzdHViIFJlYWRDb25zb2xlSW5wdXRBCiAwNDIxIHN0dWIgUmVhZENvbnNvbGVJbnB1dFcKQEAgLTQ0NSw3ICs0NDUsNyBAQAogMDQ0MCBzdHViIFJlc3VtZVRocmVhZAogMDQ0MSBzdGRjYWxsIFJ0bEZpbGxNZW1vcnkocHRyIGxvbmcgbG9uZykgUnRsRmlsbE1lbW9yeQogMDQ0MiBzdGRjYWxsIFJ0bE1vdmVNZW1vcnkocHRyIHB0ciBsb25nKSBSdGxNb3ZlTWVtb3J5Ci0wNDQzIHN0ZGNhbGwgUnRsVW53aW5kKHB0ciBsb25nIHB0ciBsb25nKSBSdGxVbndpbmQKKzA0NDMgcmVnaXN0ZXIgUnRsVW53aW5kKHB0ciBsb25nIHB0ciBsb25nKSBSdGxVbndpbmQKIDA0NDQgc3RkY2FsbCBSdGxaZXJvTWVtb3J5KHB0ciBsb25nKSBSdGxaZXJvTWVtb3J5CiAwNDQ1IHN0dWIgU2Nyb2xsQ29uc29sZVNjcmVlbkJ1ZmZlckEKIDA0NDYgc3R1YiBTY3JvbGxDb25zb2xlU2NyZWVuQnVmZmVyVwpAQCAtNDg4LDcgKzQ4OCw3IEBACiAwNDgzIHN0ZGNhbGwgU2V0RW5kT2ZGaWxlKGxvbmcpIFNldEVuZE9mRmlsZQogMDQ4NCBzdGRjYWxsIFNldEVudmlyb25tZW50VmFyaWFibGVBKHB0ciBwdHIpIFNldEVudmlyb25tZW50VmFyaWFibGUzMkEKIDA0ODUgc3RkY2FsbCBTZXRFbnZpcm9ubWVudFZhcmlhYmxlVyhwdHIgcHRyKSBTZXRFbnZpcm9ubWVudFZhcmlhYmxlMzJXCi0wNDg2IHN0ZGNhbGwgU2V0RXJyb3JNb2RlKGxvbmcpIFNldEVycm9yTW9kZQorMDQ4NiBzdGRjYWxsIFNldEVycm9yTW9kZShsb25nKSBTZXRFcnJvck1vZGUzMgogMDQ4NyAJc3RkY2FsbAlTZXRFdmVudChsb25nKSBTZXRFdmVudAogMDQ4OCBzdGRjYWxsIFNldEZpbGVBcGlzVG9BTlNJKCkgU2V0RmlsZUFwaXNUb0FOU0kKIDA0ODkgc3RkY2FsbCBTZXRGaWxlQXBpc1RvT0VNKCkgU2V0RmlsZUFwaXNUb09FTQpAQCAtNTE4LDcgKzUxOCw3IEBACiAwNTEzIHN0dWIgU2V0VGhyZWFkTG9jYWxlCiAwNTE0IHN0ZGNhbGwgU2V0VGhyZWFkUHJpb3JpdHkobG9uZyBsb25nKSBTZXRUaHJlYWRQcmlvcml0eQogMDUxNSBzdGRjYWxsIFNldFRpbWVab25lSW5mb3JtYXRpb24ocHRyKSBTZXRUaW1lWm9uZUluZm9ybWF0aW9uCi0wNTE2IHN0ZGNhbGwgU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyKHB0cikgU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyCiswNTE2IHN0ZGNhbGwgU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyKHB0cikgVEhVTktfU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyCiAwNTE3IHN0dWIgU2V0VkRNQ3VycmVudERpcmVjdG9yaWVzCiAwNTE4IHN0dWIgU2V0Vm9sdW1lTGFiZWxBCiAwNTE5IHN0dWIgU2V0Vm9sdW1lTGFiZWxXCmRpZmYgLS1naXQgYS9pZjE2MzIva2V5Ym9hcmQuc3BlYyBiL2lmMTYzMi9rZXlib2FyZC5zcGVjCmluZGV4IGFlMDRhZmEuLmUyM2QzY2MgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9rZXlib2FyZC5zcGVjCisrKyBiL2lmMTYzMi9rZXlib2FyZC5zcGVjCkBAIC00LDcgKzQsNyBAQAogIzEJcGFzY2FsCUlucXVpcmUKICMyCXBhc2NhbAlFbmFibGUKICMzCXBhc2NhbAlEaXNhYmxlCi00ICAgcGFzY2FsMTYgVG9Bc2NpaSh3b3JkIHdvcmQgcHRyIHB0ciB3b3JkKSBUb0FzY2lpCis0ICAgcGFzY2FsMTYgVG9Bc2NpaSh3b3JkIHdvcmQgcHRyIHB0ciB3b3JkKSBUb0FzY2lpMTYKIDUgICBwYXNjYWwxNiBBbnNpVG9PZW0ocHRyIHB0cikgQW5zaVRvT2VtMTYKIDYgICBwYXNjYWwxNiBPZW1Ub0Fuc2kocHRyIHB0cikgT2VtVG9BbnNpMTYKIDcgICByZXR1cm4gICBTZXRTcGVlZCAyIDY1NTM1CkBAIC0xMiw5ICsxMiw5IEBACiAjMTI2CXBhc2NhbAlHZXRUYWJsZVNlZwogIzEyNwlwYXNjYWwJTmV3VGFibGUKIDEyOCBwYXNjYWwgICBPZW1LZXlTY2FuKHdvcmQpIE9lbUtleVNjYW4KLTEyOSBwYXNjYWwxNiBWa0tleVNjYW4oYnl0ZSkgVmtLZXlTY2FuCi0xMzAgcGFzY2FsMTYgR2V0S2V5Ym9hcmRUeXBlKGJ5dGUpIEdldEtleWJvYXJkVHlwZQotMTMxIHBhc2NhbDE2IE1hcFZpcnR1YWxLZXkod29yZCB3b3JkKSBNYXBWaXJ0dWFsS2V5CisxMjkgcGFzY2FsMTYgVmtLZXlTY2FuKGJ5dGUpIFZrS2V5U2NhbjE2CisxMzAgcGFzY2FsMTYgR2V0S2V5Ym9hcmRUeXBlKGJ5dGUpIEdldEtleWJvYXJkVHlwZTE2CisxMzEgcGFzY2FsMTYgTWFwVmlydHVhbEtleSh3b3JkIHdvcmQpIE1hcFZpcnR1YWxLZXkxNgogMTMyIHBhc2NhbDE2IEdldEtiQ29kZVBhZ2UoKSBHZXRLYkNvZGVQYWdlCiAxMzMgcGFzY2FsMTYgR2V0S2V5TmFtZVRleHQobG9uZyBwdHIgd29yZCkgR2V0S2V5TmFtZVRleHQxNgogMTM0IHBhc2NhbDE2IEFuc2lUb09lbUJ1ZmYocHRyIHB0ciB3b3JkKSBBbnNpVG9PZW1CdWZmMTYKZGlmZiAtLWdpdCBhL2lmMTYzMi9udGRsbC5zcGVjIGIvaWYxNjMyL250ZGxsLnNwZWMKaW5kZXggNDhlY2U1Ny4uNDUyNjFiNCAxMDA2NDQKLS0tIGEvaWYxNjMyL250ZGxsLnNwZWMKKysrIGIvaWYxNjMyL250ZGxsLnNwZWMKQEAgLTg2Myw3ICs4NjMsNyBAQAogODU5IHN0dWIgX19lRllMMlhQMQogODYwIHN0dWIgX19lR2V0U3RhdHVzV29yZAogODYxIHN0dWIgX2FsbG9jYV9wcm9iZQotODYyIHN0dWIgX2Noa3N0aworODYyIHJldHVybiBfY2hrc3RrIDAgMAogODYzIHN0dWIgX2ZsdHVzZWQKIDg2NCBzdHViIF9mdG9sCiA4NjUgc3R1YiBfaXRvYQpkaWZmIC0tZ2l0IGEvaWYxNjMyL3JlbGF5LmMgYi9pZjE2MzIvcmVsYXkuYwppbmRleCA4ZGU4NDk1Li43NWI0ZWI4IDEwMDY0NAotLS0gYS9pZjE2MzIvcmVsYXkuYworKysgYi9pZjE2MzIvcmVsYXkuYwpAQCAtMjE3LDI4ICsyMTcsMjYgQEAKICAqLwogdm9pZCBSRUxBWV9EZWJ1Z0NhbGxGcm9tMzIoIGludCAqc3RhY2ssIGludCBuYl9hcmdzICkKIHsKLSAgICBpbnQgKnBhcmc7CisgICAgaW50ICpwYXJnLCBpOwogCiAgICAgaWYgKCFkZWJ1Z2dpbmdfcmVsYXkpIHJldHVybjsKICAgICBwcmludGYoICJDYWxsICVzKCIsIEJVSUxUSU5fR2V0RW50cnlQb2ludDMyKCAodm9pZCAqKXN0YWNrWy0yXSApKTsKLSAgICBpZiAobmJfYXJncyA+IDApCisgICAgZm9yIChpID0gbmJfYXJncyAmIDB4N2ZmZmZmZmYsIHBhcmcgPSAmc3RhY2tbMl07IGk7IHBhcmcrKywgaS0tKQogICAgIHsKLSAgICAgICAgZm9yIChwYXJnID0gJnN0YWNrWzJdOyBuYl9hcmdzOyBwYXJnKyssIG5iX2FyZ3MtLSkKLSAgICAgICAgewotICAgICAgICAgICAgcHJpbnRmKCAiJTA4eCIsICpwYXJnICk7Ci0gICAgICAgICAgICBpZiAobmJfYXJncyA+IDEpIHByaW50ZiggIiwiICk7Ci0gICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCAiJTA4eCIsICpwYXJnICk7CisgICAgICAgIGlmIChpID4gMSkgcHJpbnRmKCAiLCIgKTsKICAgICB9CiAgICAgcHJpbnRmKCAiKSByZXQ9JTA4eFxuIiwgc3RhY2tbMV0gKTsKLSAgICBpZiAobmJfYXJncyA9PSAtMSkgIC8qIFJlZ2lzdGVyIGZ1bmN0aW9uICovCisgICAgaWYgKG5iX2FyZ3MgJiAweDgwMDAwMDAwKSAgLyogUmVnaXN0ZXIgZnVuY3Rpb24gKi8KICAgICB7CiAgICAgICAgIENPTlRFWFQgKmNvbnRleHQgPSAoQ09OVEVYVCAqKSgoQllURSAqKXN0YWNrIC0gc2l6ZW9mKENPTlRFWFQpIC0gOCk7CiAgICAgICAgIHByaW50ZiggIiBFQVg9JTA4bHggRUJYPSUwOGx4IEVDWD0lMDhseCBFRFg9JTA4bHggRVNJPSUwOGx4IEVEST0lMDhseFxuIiwKICAgICAgICAgICAgICAgICBjb250ZXh0LT5FYXgsIGNvbnRleHQtPkVieCwgY29udGV4dC0+RWN4LCBjb250ZXh0LT5FZHgsCiAgICAgICAgICAgICAgICAgY29udGV4dC0+RXNpLCBjb250ZXh0LT5FZGkgKTsKLSAgICAgICAgcHJpbnRmKCAiIEVCUD0lMDhseCBFU1A9JTA4bHggRFM9JTA0bHggRVM9JTA0bHggRlM9JTA0bHggR1M9JTA0bHggRUZMPSUwOGx4XG4iLAotICAgICAgICAgICAgICAgIGNvbnRleHQtPkVicCwgY29udGV4dC0+RXNwLCBjb250ZXh0LT5TZWdEcywgY29udGV4dC0+U2VnRXMsCi0gICAgICAgICAgICAgICAgY29udGV4dC0+U2VnRnMsIGNvbnRleHQtPlNlZ0dzLCBjb250ZXh0LT5FRmxhZ3MgKTsKKyAgICAgICAgcHJpbnRmKCAiIEVCUD0lMDhseCBFU1A9JTA4bHggRUlQPSUwOGx4IERTPSUwNGx4IEVTPSUwNGx4IEZTPSUwNGx4IEdTPSUwNGx4IEVGTD0lMDhseFxuIiwKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5FYnAsIGNvbnRleHQtPkVzcCwgY29udGV4dC0+RWlwLCBjb250ZXh0LT5TZWdEcywKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5TZWdFcywgY29udGV4dC0+U2VnRnMsIGNvbnRleHQtPlNlZ0dzLAorICAgICAgICAgICAgICAgIGNvbnRleHQtPkVGbGFncyApOwogICAgIH0KIH0KIApAQCAtMjYxLDE1ICsyNTksMTYgQEAKICAgICBpZiAoIWRlYnVnZ2luZ19yZWxheSkgcmV0dXJuOwogICAgIHByaW50ZiggIlJldCAgJXMoKSByZXR2YWw9JTA4eCByZXQ9JTA4eFxuIiwKICAgICAgICAgICAgIEJVSUxUSU5fR2V0RW50cnlQb2ludDMyKCAodm9pZCAqKXN0YWNrWy0yXSApLCByZXRfdmFsLCBzdGFja1sxXSApOwotICAgIGlmIChuYl9hcmdzID09IC0xKSAgLyogUmVnaXN0ZXIgZnVuY3Rpb24gKi8KKyAgICBpZiAobmJfYXJncyAmIDB4ODAwMDAwMDApICAvKiBSZWdpc3RlciBmdW5jdGlvbiAqLwogICAgIHsKICAgICAgICAgQ09OVEVYVCAqY29udGV4dCA9IChDT05URVhUICopKChCWVRFICopc3RhY2sgLSBzaXplb2YoQ09OVEVYVCkgLSA4KTsKICAgICAgICAgcHJpbnRmKCAiIEVBWD0lMDhseCBFQlg9JTA4bHggRUNYPSUwOGx4IEVEWD0lMDhseCBFU0k9JTA4bHggRURJPSUwOGx4XG4iLAogICAgICAgICAgICAgICAgIGNvbnRleHQtPkVheCwgY29udGV4dC0+RWJ4LCBjb250ZXh0LT5FY3gsIGNvbnRleHQtPkVkeCwKICAgICAgICAgICAgICAgICBjb250ZXh0LT5Fc2ksIGNvbnRleHQtPkVkaSApOwotICAgICAgICBwcmludGYoICIgRUJQPSUwOGx4IEVTUD0lMDhseCBEUz0lMDRseCBFUz0lMDRseCBGUz0lMDRseCBHUz0lMDRseCBFRkw9JTA4bHhcbiIsCi0gICAgICAgICAgICAgICAgY29udGV4dC0+RWJwLCBjb250ZXh0LT5Fc3AsIGNvbnRleHQtPlNlZ0RzLCBjb250ZXh0LT5TZWdFcywKLSAgICAgICAgICAgICAgICBjb250ZXh0LT5TZWdGcywgY29udGV4dC0+U2VnR3MsIGNvbnRleHQtPkVGbGFncyApOworICAgICAgICBwcmludGYoICIgRUJQPSUwOGx4IEVTUD0lMDhseCBFSVA9JTA4bHggRFM9JTA0bHggRVM9JTA0bHggRlM9JTA0bHggR1M9JTA0bHggRUZMPSUwOGx4XG4iLAorICAgICAgICAgICAgICAgIGNvbnRleHQtPkVicCwgY29udGV4dC0+RXNwLCBjb250ZXh0LT5FaXAsIGNvbnRleHQtPlNlZ0RzLAorICAgICAgICAgICAgICAgIGNvbnRleHQtPlNlZ0VzLCBjb250ZXh0LT5TZWdGcywgY29udGV4dC0+U2VnR3MsCisgICAgICAgICAgICAgICAgY29udGV4dC0+RUZsYWdzICk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9pZjE2MzIvdGh1bmsuYyBiL2lmMTYzMi90aHVuay5jCmluZGV4IDE2OGYyZWIuLjAzMjk5ZDcgMTAwNjQ0Ci0tLSBhL2lmMTYzMi90aHVuay5jCisrKyBiL2lmMTYzMi90aHVuay5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgImV4Y2VwdC5oIgogCiB0eXBlZGVmIHZvaWQgKCpSRUxBWSkoKTsKIApAQCAtNDEsNyArNDIsNyBAQAogICovCiBzdGF0aWMgVEhVTksgKlRIVU5LX0FsbG9jKCBGQVJQUk9DMzIgZnVuYywgUkVMQVkgcmVsYXkgKQogewotICAgIFRIVU5LICp0aHVuayA9IEhlYXBBbGxvYyggU3lzdGVtSGVhcCwgMCwgc2l6ZW9mKCp0aHVuaykgKTsKKyAgICBUSFVOSyAqdGh1bmsgPSBIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZigqdGh1bmspICk7CiAgICAgaWYgKHRodW5rKQogICAgIHsKICAgICAgICAgdGh1bmstPnBvcGxfZWF4ICAgPSAweDU4OwpAQCAtNzMsMTQgKzc0LDE0IEBACiAgKi8KIHZvaWQgVEhVTktfRnJlZSggVEhVTksgKnRodW5rICkKIHsKLSAgICBpZiAoSEVBUF9Jc0luc2lkZUhlYXAoIFN5c3RlbUhlYXAsIDAsIHRodW5rICkpCisgICAgaWYgKEhFQVBfSXNJbnNpZGVIZWFwKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB0aHVuayApKQogICAgIHsKICAgICAgICAgVEhVTksgKipwcmV2ID0gJmZpcnN0VGh1bms7CiAgICAgICAgIHdoaWxlICgqcHJldiAmJiAoKnByZXYgIT0gdGh1bmspKSBwcmV2ID0gJigqcHJldiktPm5leHQ7CiAgICAgICAgIGlmICgqcHJldikKICAgICAgICAgewogICAgICAgICAgICAgKnByZXYgPSB0aHVuay0+bmV4dDsKLSAgICAgICAgICAgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCB0aHVuayApOworICAgICAgICAgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHRodW5rICk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9CkBAIC0zOTYsNiArMzk3LDYwIEBACiAgICAgcmV0dXJuIEVudW1TeXN0ZW1Mb2NhbGVzMzJXKCAoTE9DQUxFX0VOVU1QUk9DMzJXKSZ0aHVuaywgZmxhZ3MgKTsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVEhVTktfRW51bVJlc291cmNlTGFuZ3VhZ2VzMzJXICAgKEtFUk5FTDMyLjg3KQorICovCitCT09MMzIgVEhVTktfRW51bVJlc291cmNlTGFuZ3VhZ2VzMzJXKCBITU9EVUxFMzIgaG1vZCxMUENXU1RSIHR5cGUsTFBDV1NUUiBuYW1lLEVOVU1SRVNMQU5HUFJPQzMyVyBmdW5jLCBMT05HIGxQYXJhbSApCit7CisgICAgREVDTF9USFVOSyggdGh1bmssIGZ1bmMsIENhbGxUbzMyXzUgKTsKKyAgICByZXR1cm4gRW51bVJlc291cmNlTGFuZ3VhZ2VzMzJXKCBobW9kLHR5cGUsbmFtZSwoRU5VTVJFU0xBTkdQUk9DMzJXKSZ0aHVuaywgbFBhcmFtICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFRIVU5LX0VudW1SZXNvdXJjZUxhbmd1YWdlczMyQSAgIChLRVJORUwzMi44NikKKyAqLworQk9PTDMyIFRIVU5LX0VudW1SZXNvdXJjZUxhbmd1YWdlczMyQSggSE1PRFVMRTMyIGhtb2QsTFBDU1RSIHR5cGUsTFBDU1RSIG5hbWUsRU5VTVJFU0xBTkdQUk9DMzJBIGZ1bmMsIExPTkcgbFBhcmFtICkKK3sKKyAgICBERUNMX1RIVU5LKCB0aHVuaywgZnVuYywgQ2FsbFRvMzJfNSApOworICAgIHJldHVybiBFbnVtUmVzb3VyY2VMYW5ndWFnZXMzMkEoIGhtb2QsdHlwZSxuYW1lLChFTlVNUkVTTEFOR1BST0MzMkEpJnRodW5rLCBsUGFyYW0gKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVEhVTktfRW51bVJlc291cmNlTmFtZXMzMkEgICAoS0VSTkVMMzIuODgpCisgKi8KK0JPT0wzMiBUSFVOS19FbnVtUmVzb3VyY2VOYW1lczMyQSggSE1PRFVMRTMyIGhtb2QsTFBDV1NUUiB0eXBlLEVOVU1SRVNOQU1FUFJPQzMyQSBmdW5jLCBMT05HIGxQYXJhbSApCit7CisgICAgREVDTF9USFVOSyggdGh1bmssIGZ1bmMsIENhbGxUbzMyXzQgKTsKKyAgICByZXR1cm4gRW51bVJlc291cmNlTmFtZXMzMkEoIGhtb2QsdHlwZSwoRU5VTVJFU05BTUVQUk9DMzJBKSZ0aHVuaywgbFBhcmFtICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFRIVU5LX0VudW1SZXNvdXJjZU5hbWVzMzJXICAgKEtFUk5FTDMyLjg5KQorICovCitCT09MMzIgVEhVTktfRW51bVJlc291cmNlTmFtZXMzMlcoIEhNT0RVTEUzMiBobW9kLExQQ1dTVFIgdHlwZSxFTlVNUkVTTkFNRVBST0MzMlcgZnVuYywgTE9ORyBsUGFyYW0gKQoreworICAgIERFQ0xfVEhVTksoIHRodW5rLCBmdW5jLCBDYWxsVG8zMl80ICk7CisgICAgcmV0dXJuIEVudW1SZXNvdXJjZU5hbWVzMzJXKCBobW9kLHR5cGUsKEVOVU1SRVNOQU1FUFJPQzMyVykmdGh1bmssIGxQYXJhbSApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBUSFVOS19FbnVtUmVzb3VyY2VUeXBlczMyQSAgIChLRVJORUwzMi45MCkKKyAqLworQk9PTDMyIFRIVU5LX0VudW1SZXNvdXJjZVR5cGVzMzJBKCBITU9EVUxFMzIgaG1vZCxFTlVNUkVTVFlQRVBST0MzMkEgZnVuYywgTE9ORyBsUGFyYW0gKQoreworICAgIERFQ0xfVEhVTksoIHRodW5rLCBmdW5jLCBDYWxsVG8zMl8zICk7CisgICAgcmV0dXJuIEVudW1SZXNvdXJjZVR5cGVzMzJBKCBobW9kLChFTlVNUkVTVFlQRVBST0MzMkEpJnRodW5rLCBsUGFyYW0gKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVEhVTktfRW51bVJlc291cmNlVHlwZXMzMlcgICAoS0VSTkVMMzIuOTEpCisgKi8KK0JPT0wzMiBUSFVOS19FbnVtUmVzb3VyY2VUeXBlczMyVyggSE1PRFVMRTMyIGhtb2QsRU5VTVJFU1RZUEVQUk9DMzJXIGZ1bmMsIExPTkcgbFBhcmFtICkKK3sKKyAgICBERUNMX1RIVU5LKCB0aHVuaywgZnVuYywgQ2FsbFRvMzJfMyApOworICAgIHJldHVybiBFbnVtUmVzb3VyY2VUeXBlczMyVyggaG1vZCwoRU5VTVJFU1RZUEVQUk9DMzJXKSZ0aHVuaywgbFBhcmFtICk7Cit9CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgVEhVTktfR3JheVN0cmluZzE2ICAgKFVTRVIuMTg1KQpAQCAtNDY0LDYgKzUxOSwyNCBAQAogfQogCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgIFRIVU5LX1NldFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlciAgIChLRVJORUwzMi41MTYpCisgKi8KK0xQVE9QX0xFVkVMX0VYQ0VQVElPTl9GSUxURVIgVEhVTktfU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBUT1BfTEVWRUxfRVhDRVBUSU9OX0ZJTFRFUiBmaWx0ZXIgKQoreworICAgIExQVE9QX0xFVkVMX0VYQ0VQVElPTl9GSUxURVIgb2xkOworICAgIFRIVU5LICp0aHVuayA9IFRIVU5LX0FsbG9jKCAoRkFSUFJPQzE2KWZpbHRlciwgKFJFTEFZKUNhbGxUbzMyXzEgKTsKKyAgICBpZiAoIXRodW5rKSByZXR1cm4gTlVMTDsKKyAgICBvbGQgPSBTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIoIChMUFRPUF9MRVZFTF9FWENFUFRJT05fRklMVEVSKXRodW5rICk7CisgICAgaWYgKCFvbGQpIHJldHVybiBOVUxMOworICAgIHRodW5rID0gKFRIVU5LICopb2xkOworICAgIG9sZCA9IChMUFRPUF9MRVZFTF9FWENFUFRJT05fRklMVEVSKXRodW5rLT5wcm9jOworICAgIFRIVU5LX0ZyZWUoIHRodW5rICk7CisgICAgcmV0dXJuIG9sZDsKK30KKworCiBzdGF0aWMgRkFSUFJPQzE2IGRlZkRDSG9va1Byb2MgPSBOVUxMOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2lmMTYzMi91c2VyLnNwZWMgYi9pZjE2MzIvdXNlci5zcGVjCmluZGV4IGRhYTI0YzIuLjk0OTNlYWQgMTAwNjQ0Ci0tLSBhL2lmMTYzMi91c2VyLnNwZWMKKysrIGIvaWYxNjMyL3VzZXIuc3BlYwpAQCAtMTA1LDcgKzEwNSw3IEBACiAxMDMgcGFzY2FsMTYgTWFwRGlhbG9nUmVjdCh3b3JkIHB0cikgTWFwRGlhbG9nUmVjdDE2CiAxMDQgcGFzY2FsMTYgTWVzc2FnZUJlZXAod29yZCkgTWVzc2FnZUJlZXAKIDEwNSBwYXNjYWwxNiBGbGFzaFdpbmRvdyh3b3JkIHdvcmQpIEZsYXNoV2luZG93Ci0xMDYgcGFzY2FsMTYgR2V0S2V5U3RhdGUod29yZCkgR2V0S2V5U3RhdGUKKzEwNiBwYXNjYWwxNiBHZXRLZXlTdGF0ZSh3b3JkKSBHZXRLZXlTdGF0ZTE2CiAxMDcgcGFzY2FsICAgRGVmV2luZG93UHJvYyh3b3JkIHdvcmQgd29yZCBsb25nKSBEZWZXaW5kb3dQcm9jMTYKIDEwOCBwYXNjYWwxNiBHZXRNZXNzYWdlKHNlZ3B0ciB3b3JkIHdvcmQgd29yZCkgR2V0TWVzc2FnZQogMTA5IHBhc2NhbDE2IFBlZWtNZXNzYWdlKHB0ciB3b3JkIHdvcmQgd29yZCB3b3JkKSBQZWVrTWVzc2FnZTE2CkBAIC0xNzcsNyArMTc3LDcgQEAKIDE3NSBwYXNjYWwxNiBMb2FkQml0bWFwKHdvcmQgc2VncHRyKSBMb2FkQml0bWFwMTYKIDE3NiBwYXNjYWwxNiBMb2FkU3RyaW5nKHdvcmQgd29yZCBwdHIgc193b3JkKSBMb2FkU3RyaW5nMTYKIDE3NyBwYXNjYWwxNiBMb2FkQWNjZWxlcmF0b3JzKHdvcmQgc2VncHRyKSBMb2FkQWNjZWxlcmF0b3JzMTYKLTE3OCBwYXNjYWwxNiBUcmFuc2xhdGVBY2NlbGVyYXRvcih3b3JkIHdvcmQgcHRyKSBUcmFuc2xhdGVBY2NlbGVyYXRvcgorMTc4IHBhc2NhbDE2IFRyYW5zbGF0ZUFjY2VsZXJhdG9yKHdvcmQgd29yZCBwdHIpIFRyYW5zbGF0ZUFjY2VsZXJhdG9yMTYKIDE3OSBwYXNjYWwxNiBHZXRTeXN0ZW1NZXRyaWNzKHdvcmQpIEdldFN5c3RlbU1ldHJpY3MKIDE4MCBwYXNjYWwgICBHZXRTeXNDb2xvcih3b3JkKSBHZXRTeXNDb2xvcgogMTgxIHBhc2NhbDE2IFNldFN5c0NvbG9ycyh3b3JkIHB0ciBwdHIpIFNldFN5c0NvbG9ycwpAQCAtMjUxLDcgKzI1MSw3IEBACiAyNDYgc3R1YiBFeGl0V2luZG93c0V4ZWMKIDI0NyBwYXNjYWwxNiBHZXRDdXJzb3IoKSBHZXRDdXJzb3IKIDI0OCBwYXNjYWwxNiBHZXRPcGVuQ2xpcGJvYXJkV2luZG93KCkgR2V0T3BlbkNsaXBib2FyZFdpbmRvdwotMjQ5IHBhc2NhbDE2IEdldEFzeW5jS2V5U3RhdGUod29yZCkgR2V0QXN5bmNLZXlTdGF0ZQorMjQ5IHBhc2NhbDE2IEdldEFzeW5jS2V5U3RhdGUod29yZCkgR2V0QXN5bmNLZXlTdGF0ZTE2CiAyNTAgcGFzY2FsMTYgR2V0TWVudVN0YXRlKHdvcmQgd29yZCB3b3JkKSBHZXRNZW51U3RhdGUxNgogMjUxIHBhc2NhbCAgIFNlbmREcml2ZXJNZXNzYWdlKHdvcmQgd29yZCBsb25nIGxvbmcpIFNlbmREcml2ZXJNZXNzYWdlCiAyNTIgcGFzY2FsMTYgT3BlbkRyaXZlcihwdHIgcHRyIGxvbmcpIE9wZW5Ecml2ZXIKZGlmZiAtLWdpdCBhL2lmMTYzMi91c2VyMzIuc3BlYyBiL2lmMTYzMi91c2VyMzIuc3BlYwppbmRleCA3YzUxMDEyLi5iZjdmMTMxIDEwMDY0NAotLS0gYS9pZjE2MzIvdXNlcjMyLnNwZWMKKysrIGIvaWYxNjMyL3VzZXIzMi5zcGVjCkBAIC0xMDQsNyArMTA0LDcgQEAKIDAwOTcgc3R1YiBEZGVEaXNjb25uZWN0TGlzdAogMDA5OCBzdHViIERkZUVuYWJsZUNhbGxiYWNrCiAwMDk5IHN0dWIgRGRlRnJlZURhdGFIYW5kbGUKLTAxMDAgc3R1YiBEZGVGcmVlU3RyaW5nSGFuZGxlCiswMTAwIHJldHVybiBEZGVGcmVlU3RyaW5nSGFuZGxlIDggMAogMDEwMSBzdHViIERkZUdldERhdGEKIDAxMDIgcmV0dXJuIERkZUdldExhc3RFcnJvciA0IDAKIDAxMDMgc3R1YiBEZGVHZXRRdWFsaXR5T2ZTZXJ2aWNlCkBAIC0xMjIsNyArMTIyLDcgQEAKIDAxMTUgc3R1YiBEZGVTZXRRdWFsaXR5T2ZTZXJ2aWNlCiAwMTE2IHN0dWIgRGRlU2V0VXNlckhhbmRsZQogMDExNyBzdHViIERkZVVuYWNjZXNzRGF0YQotMDExOCBzdHViIERkZVVuaW5pdGlhbGl6ZQorMDExOCByZXR1cm4gRGRlVW5pbml0aWFsaXplIDQgMAogMDExOSBzdGRjYWxsIERlZkRsZ1Byb2NBKGxvbmcgbG9uZyBsb25nIGxvbmcpIERlZkRsZ1Byb2MzMkEKIDAxMjAgc3RkY2FsbCBEZWZEbGdQcm9jVyhsb25nIGxvbmcgbG9uZyBsb25nKSBEZWZEbGdQcm9jMzJXCiAwMTIxIHN0ZGNhbGwgRGVmRnJhbWVQcm9jQShsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIERlZkZyYW1lUHJvYzMyQQpAQCAtMjEwLDcgKzIxMCw3IEBACiAwMjAzIHN0dWIgRnJlZURERWxQYXJhbQogMDIwNCBzdGRjYWxsIEdldEFjdGl2ZVdpbmRvdygpIEdldEFjdGl2ZVdpbmRvdzMyCiAwMjA1IHN0ZGNhbGwgR2V0QXBwQ29tcGF0RmxhZ3MobG9uZykgR2V0QXBwQ29tcGF0RmxhZ3MKLTAyMDYgc3RkY2FsbCBHZXRBc3luY0tleVN0YXRlKGxvbmcpIEdldEFzeW5jS2V5U3RhdGUKKzAyMDYgc3RkY2FsbCBHZXRBc3luY0tleVN0YXRlKGxvbmcpIEdldEFzeW5jS2V5U3RhdGUzMgogMDIwNyBzdGRjYWxsIEdldENhcHR1cmUoKSBHZXRDYXB0dXJlMzIKIDAyMDggc3RkY2FsbCBHZXRDYXJldEJsaW5rVGltZSgpIEdldENhcmV0QmxpbmtUaW1lMzIKIDAyMDkgc3RkY2FsbCBHZXRDYXJldFBvcyhwdHIpIEdldENhcmV0UG9zMzIKQEAgLTI1MCwxNSArMjUwLDE1IEBACiAwMjQzIHN0dWIgR2V0SW5wdXRTdGF0ZQogMDI0NCBzdGRjYWxsIEdldEludGVybmFsV2luZG93UG9zKGxvbmcgcHRyIHB0cikgR2V0SW50ZXJuYWxXaW5kb3dQb3MzMgogMDI0NSBzdHViIEdldEtCQ29kZVBhZ2UKLTAyNDYgc3R1YiBHZXRLZXlOYW1lVGV4dEEKLTAyNDcgc3R1YiBHZXRLZXlOYW1lVGV4dFcKLTAyNDggc3RkY2FsbCBHZXRLZXlTdGF0ZShsb25nKSBHZXRLZXlTdGF0ZQorMDI0NiBzdGRjYWxsIEdldEtleU5hbWVUZXh0QShsb25nIHB0ciBsb25nKSBHZXRLZXlOYW1lVGV4dDMyQQorMDI0NyBzdGRjYWxsIEdldEtleU5hbWVUZXh0Vyhsb25nIHB0ciBsb25nKSBHZXRLZXlOYW1lVGV4dDMyVworMDI0OCBzdGRjYWxsIEdldEtleVN0YXRlKGxvbmcpIEdldEtleVN0YXRlMzIKIDAyNDkgc3R1YiBHZXRLZXlib2FyZExheW91dAogMDI1MCBzdHViIEdldEtleWJvYXJkTGF5b3V0TGlzdAogMDI1MSBzdHViIEdldEtleWJvYXJkTGF5b3V0TmFtZUEKIDAyNTIgc3R1YiBHZXRLZXlib2FyZExheW91dE5hbWVXCi0wMjUzIHN0dWIgR2V0S2V5Ym9hcmRTdGF0ZQotMDI1NCBzdHViIEdldEtleWJvYXJkVHlwZQorMDI1MyBzdGRjYWxsIEdldEtleWJvYXJkU3RhdGUocHRyKSBHZXRLZXlib2FyZFN0YXRlCiswMjU0IHN0ZGNhbGwgR2V0S2V5Ym9hcmRUeXBlKGxvbmcpIEdldEtleWJvYXJkVHlwZTMyCiAwMjU1IHN0ZGNhbGwgR2V0TGFzdEFjdGl2ZVBvcHVwKGxvbmcpIEdldExhc3RBY3RpdmVQb3B1cAogMDI1NiBzdGRjYWxsIEdldE1lbnUobG9uZykgR2V0TWVudTMyCiAwMjU3IHN0ZGNhbGwgR2V0TWVudUNoZWNrTWFya0RpbWVuc2lvbnMoKSBHZXRNZW51Q2hlY2tNYXJrRGltZW5zaW9ucwpAQCAtMjc1LDcgKzI3NSw3IEBACiAwMjY4IHN0ZGNhbGwgR2V0TWVudVN0cmluZ1cobG9uZyBsb25nIHB0ciBsb25nIGxvbmcpIEdldE1lbnVTdHJpbmczMlcKIDAyNjkgc3RkY2FsbCBHZXRNZXNzYWdlQShwdHIgbG9uZyBsb25nIGxvbmcpIFVTRVIzMl9HZXRNZXNzYWdlQQogMDI3MCBzdHViIEdldE1lc3NhZ2VFeHRyYUluZm8KLTAyNzEgc3R1YiBHZXRNZXNzYWdlUG9zCiswMjcxIHN0ZGNhbGwgR2V0TWVzc2FnZVBvcygpIEdldE1lc3NhZ2VQb3MKIDAyNzIgc3R1YiBHZXRNZXNzYWdlVGltZQogMDI3MyBzdGRjYWxsIEdldE1lc3NhZ2VXKHB0ciBsb25nIGxvbmcgbG9uZykgVVNFUjMyX0dldE1lc3NhZ2VBCiAwMjc0IHN0ZGNhbGwgR2V0TmV4dERsZ0dyb3VwSXRlbShsb25nIGxvbmcgbG9uZykgR2V0TmV4dERsZ0dyb3VwSXRlbTMyCkBAIC0zMTMsMTAgKzMxMywxMCBAQAogMDMwNiBzdGRjYWxsIEdldFdpbmRvd1BsYWNlbWVudChsb25nIHB0cikgR2V0V2luZG93UGxhY2VtZW50MzIKIDAzMDcgc3RkY2FsbCBHZXRXaW5kb3dSZWN0KGxvbmcgcHRyKSBHZXRXaW5kb3dSZWN0MzIKIDAzMDggc3RkY2FsbCBHZXRXaW5kb3dUZXh0QShsb25nIHB0ciBsb25nKSBHZXRXaW5kb3dUZXh0MzJBCi0wMzA5IHN0dWIgR2V0V2luZG93VGV4dExlbmd0aEEKLTAzMTAgc3R1YiBHZXRXaW5kb3dUZXh0TGVuZ3RoVworMDMwOSBzdGRjYWxsIEdldFdpbmRvd1RleHRMZW5ndGhBKGxvbmcpIEdldFdpbmRvd1RleHRMZW5ndGgzMkEKKzAzMTAgc3RkY2FsbCBHZXRXaW5kb3dUZXh0TGVuZ3RoVyhsb25nKSBHZXRXaW5kb3dUZXh0TGVuZ3RoMzJXCiAwMzExIHN0ZGNhbGwgR2V0V2luZG93VGV4dFcobG9uZyBwdHIgbG9uZykgR2V0V2luZG93VGV4dDMyVwotMDMxMiBzdHViIEdldFdpbmRvd1RocmVhZFByb2Nlc3NJZAorMDMxMiBzdGRjYWxsIEdldFdpbmRvd1RocmVhZFByb2Nlc3NJZChsb25nIHB0cikgR2V0V2luZG93VGhyZWFkUHJvY2Vzc0lkCiAwMzEzIHN0ZGNhbGwgR2V0V2luZG93V29yZChsb25nIGxvbmcpIEdldFdpbmRvd1dvcmQKIDAzMTQgc3R1YiBHcmF5U3RyaW5nQQogMDMxNSBzdHViIEdyYXlTdHJpbmdXCkBAIC0zNDYsNyArMzQ2LDcgQEAKIDAzMzkgc3RkY2FsbCBJc0NsaXBib2FyZEZvcm1hdEF2YWlsYWJsZShsb25nKSBJc0NsaXBib2FyZEZvcm1hdEF2YWlsYWJsZQogMDM0MCBzdHViIElzRGlhbG9nTWVzc2FnZQogMDM0MSBzdGRjYWxsIElzRGlhbG9nTWVzc2FnZUEobG9uZyBwdHIpIElzRGlhbG9nTWVzc2FnZTMyQQotMDM0MiBzdHViIElzRGlhbG9nTWVzc2FnZVcKKzAzNDIgc3RkY2FsbCBJc0RpYWxvZ01lc3NhZ2VXKGxvbmcgcHRyKSBJc0RpYWxvZ01lc3NhZ2UzMlcKIDAzNDMgc3RkY2FsbCBJc0RsZ0J1dHRvbkNoZWNrZWQobG9uZyBsb25nKSBJc0RsZ0J1dHRvbkNoZWNrZWQzMgogMDM0NCBzdGRjYWxsIElzSWNvbmljKGxvbmcpIElzSWNvbmljMzIKIDAzNDUgc3RkY2FsbCBJc01lbnUobG9uZykgSXNNZW51MzIKQEAgLTM4NiwxNyArMzg2LDE3IEBACiAwMzc5IHN0dWIgTG9va3VwSWNvbklkRnJvbURpcmVjdG9yeUV4CiAwMzgwIHN0dWIgTUJUb1dDU0V4CiAwMzgxIHN0ZGNhbGwgTWFwRGlhbG9nUmVjdChsb25nIHB0cikgTWFwRGlhbG9nUmVjdDMyCi0wMzgyIHN0dWIgTWFwVmlydHVhbEtleUEKKzAzODIgc3RkY2FsbCBNYXBWaXJ0dWFsS2V5QShsb25nIGxvbmcpIE1hcFZpcnR1YWxLZXkzMkEKIDAzODMgc3R1YiBNYXBWaXJ0dWFsS2V5RXhBCi0wMzg0IHN0dWIgTWFwVmlydHVhbEtleVcKKzAzODQgc3RkY2FsbCBNYXBWaXJ0dWFsS2V5Vyhsb25nIGxvbmcpIE1hcFZpcnR1YWxLZXkzMkEKIDAzODUgc3RkY2FsbCBNYXBXaW5kb3dQb2ludHMobG9uZyBsb25nIHB0ciBsb25nKSBNYXBXaW5kb3dQb2ludHMzMgogMDM4NiBzdHViIE1lbnVJdGVtRnJvbVBvaW50CiAwMzg3IHN0dWIgTWVudVdpbmRvd1Byb2NBCiAwMzg4IHN0dWIgTWVudVdpbmRvd1Byb2NXCiAwMzg5IHN0ZGNhbGwgTWVzc2FnZUJlZXAobG9uZykgTWVzc2FnZUJlZXAKIDAzOTAgc3RkY2FsbCBNZXNzYWdlQm94QShsb25nIHB0ciBwdHIgbG9uZykgTWVzc2FnZUJveDMyQQotMDM5MSBzdHViIE1lc3NhZ2VCb3hFeEEKLTAzOTIgc3R1YiBNZXNzYWdlQm94RXhXCiswMzkxIHN0ZGNhbGwgTWVzc2FnZUJveEV4QShsb25nIHB0ciBwdHIgbG9uZyBsb25nKSBNZXNzYWdlQm94RXgzMkEKKzAzOTIgc3RkY2FsbCBNZXNzYWdlQm94RXhXKGxvbmcgcHRyIHB0ciBsb25nIGxvbmcpIE1lc3NhZ2VCb3hFeDMyVwogMDM5MyBzdHViIE1lc3NhZ2VCb3hJbmRpcmVjdEEKIDAzOTQgc3R1YiBNZXNzYWdlQm94SW5kaXJlY3RXCiAwMzk1IHN0ZGNhbGwgTWVzc2FnZUJveFcobG9uZyBwdHIgcHRyIGxvbmcpIE1lc3NhZ2VCb3gzMlcKQEAgLTQwNCw3ICs0MDQsNyBAQAogMDM5NyBzdGRjYWxsIE1vZGlmeU1lbnVXKGxvbmcgbG9uZyBsb25nIGxvbmcgcHRyKSBNb2RpZnlNZW51MzJXCiAwMzk4IHN0ZGNhbGwgTW92ZVdpbmRvdyhsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgTW92ZVdpbmRvdzMyCiAwMzk5IHN0dWIgTXNnV2FpdEZvck11bHRpcGxlT2JqZWN0cwotMDQwMCBzdHViIE9lbUtleVNjYW4KKzA0MDAgc3RkY2FsbCBPZW1LZXlTY2FuKGxvbmcpIE9lbUtleVNjYW4KIDA0MDEgc3RkY2FsbCBPZW1Ub0NoYXJBKHB0ciBwdHIpIE9lbVRvQ2hhcjMyQQogMDQwMiBzdGRjYWxsIE9lbVRvQ2hhckJ1ZmZBKHB0ciBwdHIgbG9uZykgT2VtVG9DaGFyQnVmZjMyQQogMDQwMyBzdGRjYWxsIE9lbVRvQ2hhckJ1ZmZXKHB0ciBwdHIgbG9uZykgT2VtVG9DaGFyQnVmZjMyVwpAQCAtNDg3LDcgKzQ4Nyw3IEBACiAwNDgwIHN0ZGNhbGwgU2V0Rm9jdXMobG9uZykgU2V0Rm9jdXMzMgogMDQ4MSByZXR1cm4gU2V0Rm9yZWdyb3VuZFdpbmRvdyA0IDAKIDA0ODIgc3RkY2FsbCBTZXRJbnRlcm5hbFdpbmRvd1Bvcyhsb25nIGxvbmcgcHRyIHB0cikgU2V0SW50ZXJuYWxXaW5kb3dQb3MzMgotMDQ4MyBzdHViIFNldEtleWJvYXJkU3RhdGUKKzA0ODMgc3RkY2FsbCBTZXRLZXlib2FyZFN0YXRlKHB0cikgU2V0S2V5Ym9hcmRTdGF0ZQogMDQ4NCBzdGRjYWxsIFNldExhc3RFcnJvckV4KGxvbmcgbG9uZykgU2V0TGFzdEVycm9yRXgKIDA0ODUgc3R1YiBTZXRMb2dvbk5vdGlmeVdpbmRvdwogMDQ4NiBzdGRjYWxsIFNldE1lbnUobG9uZyBsb25nKSBTZXRNZW51MzIKQEAgLTU0OSwxNCArNTQ5LDE0IEBACiAwNTQyIHN0dWIgVGFiYmVkVGV4dE91dFcKIDA1NDMgc3R1YiBUaWxlQ2hpbGRXaW5kb3dzCiAwNTQ0IHN0dWIgVGlsZVdpbmRvd3MKLTA1NDUgc3R1YiBUb0FzY2lpCiswNTQ1IHN0ZGNhbGwgVG9Bc2NpaTMyKGxvbmcgbG9uZyBwdHIgcHRyIGxvbmcpIFRvQXNjaWkzMgogMDU0NiBzdHViIFRvQXNjaWlFeAogMDU0NyBzdHViIFRvVW5pY29kZQogMDU0OCBzdGRjYWxsIFRyYWNrUG9wdXBNZW51KGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIHB0cikgVHJhY2tQb3B1cE1lbnUzMgogMDU0OSBzdGRjYWxsIFRyYWNrUG9wdXBNZW51RXgobG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIHB0cikgVHJhY2tQb3B1cE1lbnVFeAotMDU1MCBzdGRjYWxsIFRyYW5zbGF0ZUFjY2VsZXJhdG9yKGxvbmcgbG9uZyBwdHIpIFRyYW5zbGF0ZUFjY2VsZXJhdG9yCi0wNTUxIHN0ZGNhbGwgVHJhbnNsYXRlQWNjZWxlcmF0b3JBKGxvbmcgbG9uZyBwdHIpIFRyYW5zbGF0ZUFjY2VsZXJhdG9yCi0wNTUyIHN0ZGNhbGwgVHJhbnNsYXRlQWNjZWxlcmF0b3JXKGxvbmcgbG9uZyBwdHIpIFRyYW5zbGF0ZUFjY2VsZXJhdG9yCiswNTUwIHN0ZGNhbGwgVHJhbnNsYXRlQWNjZWxlcmF0b3IobG9uZyBsb25nIHB0cikgVHJhbnNsYXRlQWNjZWxlcmF0b3IzMgorMDU1MSBzdGRjYWxsIFRyYW5zbGF0ZUFjY2VsZXJhdG9yQShsb25nIGxvbmcgcHRyKSBUcmFuc2xhdGVBY2NlbGVyYXRvcjMyCiswNTUyIHN0ZGNhbGwgVHJhbnNsYXRlQWNjZWxlcmF0b3JXKGxvbmcgbG9uZyBwdHIpIFRyYW5zbGF0ZUFjY2VsZXJhdG9yMzIKIDA1NTMgc3R1YiBUcmFuc2xhdGVDaGFyc2V0SW5mbwogMDU1NCBzdHViIFRyYW5zbGF0ZU1ESVN5c0FjY2VsCiAwNTU1IHN0ZGNhbGwgVHJhbnNsYXRlTWVzc2FnZShwdHIpIFVTRVIzMl9UcmFuc2xhdGVNZXNzYWdlCkBAIC01NzYsMTAgKzU3NiwxMCBAQAogMDU2OSBzdHViIFVzZXJSZWdpc3Rlcldvd0hhbmRsZXJzCiAwNTcwIHN0ZGNhbGwgVmFsaWRhdGVSZWN0KGxvbmcgcHRyKSBWYWxpZGF0ZVJlY3QzMgogMDU3MSBzdGRjYWxsIFZhbGlkYXRlUmduKGxvbmcgbG9uZykgVmFsaWRhdGVSZ24zMgotMDU3MiBzdGRjYWxsIFZrS2V5U2NhbkEobG9uZykgVmtLZXlTY2FuCiswNTcyIHN0ZGNhbGwgVmtLZXlTY2FuQShsb25nKSBWa0tleVNjYW4zMkEKIDA1NzMgc3R1YiBWa0tleVNjYW5FeEEKIDA1NzQgc3R1YiBWa0tleVNjYW5FeFcKLTA1NzUgc3R1YiBWa0tleVNjYW5XCiswNTc1IHN0ZGNhbGwgVmtLZXlTY2FuVyhsb25nKSBWa0tleVNjYW4zMlcKIDA1NzYgc3R1YiBXYWl0Rm9ySW5wdXRJZGxlCiAwNTc3IHN0dWIgV2FpdE1lc3NhZ2UKIDA1Nzggc3RkY2FsbCBXaW5IZWxwQShsb25nIHB0ciBsb25nIGxvbmcpIFdpbkhlbHAzMkEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYml0bWFwLmggYi9pbmNsdWRlL2JpdG1hcC5oCmluZGV4IGI0YTczMWUuLmQzODk2ZTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYml0bWFwLmgKKysrIGIvaW5jbHVkZS9iaXRtYXAuaApAQCAtNywxMSArNywxMiBAQAogI2lmbmRlZiBfX1dJTkVfQklUTUFQX0gKICNkZWZpbmUgX19XSU5FX0JJVE1BUF9ICiAKLSNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YU2htLmg+CiAjaW5jbHVkZSAiZ2RpLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgogCiAjaWZkZWYgUFJFTElNSU5BUllfV0lORzE2X1NVUFBPUlQKKy8qIEZJWE1FOiB0aGlzIGRvZXNuJ3QgYmVsb25nIGhlcmUgKi8KKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YU2htLmg+CiAKIHR5cGVkZWYgc3RydWN0CiB7CkBAIC01Miw4ICs1Myw2IEBACiBleHRlcm4gSU5UMTYgQklUTUFQX0dldE9iamVjdDE2KCBCSVRNQVBPQkogKiBibXAsIElOVDE2IGNvdW50LCBMUFZPSUQgYnVmZmVyICk7CiBleHRlcm4gSU5UMzIgQklUTUFQX0dldE9iamVjdDMyKCBCSVRNQVBPQkogKiBibXAsIElOVDMyIGNvdW50LCBMUFZPSUQgYnVmZmVyICk7CiBleHRlcm4gQk9PTDMyIEJJVE1BUF9EZWxldGVPYmplY3QoIEhCSVRNQVAxNiBoYml0bWFwLCBCSVRNQVBPQkogKiBiaXRtYXAgKTsKLWV4dGVybiBIQklUTUFQMTYgQklUTUFQX1NlbGVjdE9iamVjdCggREMgKiBkYywgSEJJVE1BUDE2IGhiaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVE1BUE9CSiAqIGJtcCApOwogCiAgIC8qIG9iamVjdHMvZGliLmMgKi8KIGV4dGVybiBpbnQgRElCX0dldEltYWdlV2lkdGhCeXRlcyggaW50IHdpZHRoLCBpbnQgZGVwdGggKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYnJ1c2guaCBiL2luY2x1ZGUvYnJ1c2guaAppbmRleCBmMDNhZDhmLi44YzEzNmQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2JydXNoLmgKKysrIGIvaW5jbHVkZS9icnVzaC5oCkBAIC0xNiwxMCArMTYsMTAgQEAKICAgICBMT0dCUlVTSDMyICBsb2dicnVzaDsKIH0gQlJVU0hPQko7CiAKLWV4dGVybiBCT09MMzIgQlJVU0hfSW5pdCh2b2lkKTsKKyNkZWZpbmUgTkJfSEFUQ0hfU1RZTEVTICA2CisKIGV4dGVybiBJTlQxNiBCUlVTSF9HZXRPYmplY3QxNiggQlJVU0hPQkogKiBicnVzaCwgSU5UMTYgY291bnQsIExQU1RSIGJ1ZmZlciApOwogZXh0ZXJuIElOVDMyIEJSVVNIX0dldE9iamVjdDMyKCBCUlVTSE9CSiAqIGJydXNoLCBJTlQzMiBjb3VudCwgTFBTVFIgYnVmZmVyICk7CiBleHRlcm4gQk9PTDMyIEJSVVNIX0RlbGV0ZU9iamVjdCggSEJSVVNIMTYgaGJydXNoLCBCUlVTSE9CSiAqIGJydXNoICk7Ci1leHRlcm4gSEJSVVNIMzIgQlJVU0hfU2VsZWN0T2JqZWN0KERDICogZGMsIEhCUlVTSDMyIGhicnVzaCwgQlJVU0hPQkogKiBicnVzaCk7CiAKICNlbmRpZiAgLyogX19XSU5FX0JSVVNIX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FsbGJhY2suaCBiL2luY2x1ZGUvY2FsbGJhY2suaAppbmRleCAyZjYwM2MyLi45ZGNmMTY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NhbGxiYWNrLmgKKysrIGIvaW5jbHVkZS9jYWxsYmFjay5oCkBAIC03Nyw2ICs3Nyw3IEBACiBleHRlcm4gTE9ORyBDYWxsVG8zMl8yKCBGQVJQUk9DMzIsIERXT1JELCBEV09SRCApOwogZXh0ZXJuIExPTkcgQ2FsbFRvMzJfMyggRkFSUFJPQzMyLCBEV09SRCwgRFdPUkQsIERXT1JEICk7CiBleHRlcm4gTE9ORyBDYWxsVG8zMl80KCBGQVJQUk9DMzIsIERXT1JELCBEV09SRCwgRFdPUkQsIERXT1JEICk7CitleHRlcm4gTE9ORyBDYWxsVG8zMl81KCBGQVJQUk9DMzIsIERXT1JELCBEV09SRCwgRFdPUkQsIERXT1JELCBEV09SRCApOwogCiAjZGVmaW5lIENhbGxUYXNrU3RhcnQzMiggZnVuYyApIFwKICAgICBDYWxsVG8zMl8wKCBmdW5jICkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY3J0ZGxsLmggYi9pbmNsdWRlL2NydGRsbC5oCmluZGV4IDkxNmU5YjQuLmM1ZDlmNGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY3J0ZGxsLmgKKysrIGIvaW5jbHVkZS9jcnRkbGwuaApAQCAtMTAsNCArMTAsMTYgQEAKICNkZWZpbmUgQ1JURExMX0xDX01JTgkJTENfQUxMCiAjZGVmaW5lIENSVERMTF9MQ19NQVgJCUxDX1RJTUUKIAorLyogY3R5cGUgZGVmaW5lcyAqLworI2RlZmluZSBDUlRETExfVVBQRVIJCTB4MQorI2RlZmluZSBDUlRETExfTE9XRVIJCTB4MgorI2RlZmluZSBDUlRETExfRElHSVQJCTB4NAorI2RlZmluZSBDUlRETExfU1BBQ0UJCTB4OAorI2RlZmluZSBDUlRETExfUFVOQ1QJCTB4MTAKKyNkZWZpbmUgQ1JURExMX0NPTlRST0wJCTB4MjAKKyNkZWZpbmUgQ1JURExMX0JMQU5LCQkweDQwCisjZGVmaW5lIENSVERMTF9IRVgJCTB4ODAKKyNkZWZpbmUgQ1JURExMX0xFQURCWVRFCQkweDgwMDAKKyNkZWZpbmUgQ1JURExMX0FMUEhBCQkoMHgwMTAwfENSVERMTF9VUFBFUnxDUlRETExfTE9XRVIpCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kZWJ1Z2dlci5oIGIvaW5jbHVkZS9kZWJ1Z2dlci5oCmluZGV4IDkxZjUxMjEuLjFhMWYwMmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZGVidWdnZXIuaAorKysgYi9pbmNsdWRlL2RlYnVnZ2VyLmgKQEAgLTMwOSw3ICszMDksNiBAQAogZXh0ZXJuIHZvaWQgREVCVUdfTnVrZVBhdGgodm9pZCk7CiAKICAgLyogZGVidWdnZXIvZGJnLnkgKi8KLWV4dGVybiB2b2lkIERFQlVHX0VudGVyRGVidWdnZXIodm9pZCk7CiBleHRlcm4gdm9pZCB3aW5lX2RlYnVnKCBpbnQgc2lnbmFsLCBTSUdDT05URVhUICpyZWdzICk7CiAKICNlbmRpZiAgLyogX19XSU5FX0RFQlVHR0VSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZXhjZXB0LmggYi9pbmNsdWRlL2V4Y2VwdC5oCmluZGV4IGZmNjhjMzkuLmQ1NTE0NmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZXhjZXB0LmgKKysrIGIvaW5jbHVkZS9leGNlcHQuaApAQCAtNywxMjkgKzcsNiBAQAogI2RlZmluZSBfX1dJTkVfRVhDRVBUX0gKIAogI2luY2x1ZGUgIndpbm50LmgiCi0vKgotICogZXhjZXB0aW9uIGNvZGVzCi0gKi8KLSAKLSNkZWZpbmUgU1RBVFVTX1dBSVRfMCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBTVEFUVVNfQUJBTkRPTkVEX1dBSVRfMCAgICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIFNUQVRVU19VU0VSX0FQQyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwQzAKLSNkZWZpbmUgU1RBVFVTX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMgotI2RlZmluZSBTVEFUVVNfUEVORElORyAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAzCi0jZGVmaW5lIFNUQVRVU19EQVRBVFlQRV9NSVNBTElHTk1FTlQgICAgIDB4ODAwMDAwMDIKLSNkZWZpbmUgU1RBVFVTX0JSRUFLUE9JTlQgICAgICAgICAgICAgICAgMHg4MDAwMDAwMwotI2RlZmluZSBTVEFUVVNfU0lOR0xFX1NURVAgICAgICAgICAgICAgICAweDgwMDAwMDA0Ci0jZGVmaW5lIFNUQVRVU19BQ0NFU1NfVklPTEFUSU9OICAgICAgICAgIDB4QzAwMDAwMDUKLSNkZWZpbmUgU1RBVFVTX0lOX1BBR0VfRVJST1IgICAgICAgICAgICAgMHhDMDAwMDAwNgotI2RlZmluZSBTVEFUVVNfTk9fTUVNT1JZICAgICAgICAgICAgICAgICAweEMwMDAwMDE3Ci0jZGVmaW5lIFNUQVRVU19JTExFR0FMX0lOU1RSVUNUSU9OICAgICAgIDB4QzAwMDAwMUQKLSNkZWZpbmUgU1RBVFVTX05PTkNPTlRJTlVBQkxFX0VYQ0VQVElPTiAgMHhDMDAwMDAyNQotI2RlZmluZSBTVEFUVVNfSU5WQUxJRF9ESVNQT1NJVElPTiAgICAgICAweEMwMDAwMDI2Ci0jZGVmaW5lIFNUQVRVU19BUlJBWV9CT1VORFNfRVhDRUVERUQgICAgIDB4QzAwMDAwOEMKLSNkZWZpbmUgU1RBVFVTX0ZMT0FUX0RFTk9STUFMX09QRVJBTkQgICAgMHhDMDAwMDA4RAotI2RlZmluZSBTVEFUVVNfRkxPQVRfRElWSURFX0JZX1pFUk8gICAgICAweEMwMDAwMDhFCi0jZGVmaW5lIFNUQVRVU19GTE9BVF9JTkVYQUNUX1JFU1VMVCAgICAgIDB4QzAwMDAwOEYKLSNkZWZpbmUgU1RBVFVTX0ZMT0FUX0lOVkFMSURfT1BFUkFUSU9OICAgMHhDMDAwMDA5MAotI2RlZmluZSBTVEFUVVNfRkxPQVRfT1ZFUkZMT1cgICAgICAgICAgICAweEMwMDAwMDkxCi0jZGVmaW5lIFNUQVRVU19GTE9BVF9TVEFDS19DSEVDSyAgICAgICAgIDB4QzAwMDAwOTIKLSNkZWZpbmUgU1RBVFVTX0ZMT0FUX1VOREVSRkxPVyAgICAgICAgICAgMHhDMDAwMDA5MwotI2RlZmluZSBTVEFUVVNfSU5URUdFUl9ESVZJREVfQllfWkVSTyAgICAweEMwMDAwMDk0Ci0jZGVmaW5lIFNUQVRVU19JTlRFR0VSX09WRVJGTE9XICAgICAgICAgIDB4QzAwMDAwOTUKLSNkZWZpbmUgU1RBVFVTX1BSSVZJTEVHRURfSU5TVFJVQ1RJT04gICAgMHhDMDAwMDA5NgotI2RlZmluZSBTVEFUVVNfU1RBQ0tfT1ZFUkZMT1cgICAgICAgICAgICAweEMwMDAwMEZECi0jZGVmaW5lIFNUQVRVU19DT05UUk9MX0NfRVhJVCAgICAgICAgICAgIDB4QzAwMDAxM0EKLQotI2RlZmluZSBFWENFUFRJT05fQUNDRVNTX1ZJT0xBVElPTiAgICAgIFNUQVRVU19BQ0NFU1NfVklPTEFUSU9OCi0jZGVmaW5lIEVYQ0VQVElPTl9EQVRBVFlQRV9NSVNBTElHTk1FTlQgU1RBVFVTX0RBVEFUWVBFX01JU0FMSUdOTUVOVAotI2RlZmluZSBFWENFUFRJT05fQlJFQUtQT0lOVCAgICAgICAgICAgIFNUQVRVU19CUkVBS1BPSU5UCi0jZGVmaW5lIEVYQ0VQVElPTl9TSU5HTEVfU1RFUCAgICAgICAgICAgU1RBVFVTX1NJTkdMRV9TVEVQCi0jZGVmaW5lIEVYQ0VQVElPTl9BUlJBWV9CT1VORFNfRVhDRUVERUQgU1RBVFVTX0FSUkFZX0JPVU5EU19FWENFRURFRAotI2RlZmluZSBFWENFUFRJT05fRkxUX0RFTk9STUFMX09QRVJBTkQgIFNUQVRVU19GTE9BVF9ERU5PUk1BTF9PUEVSQU5ECi0jZGVmaW5lIEVYQ0VQVElPTl9GTFRfRElWSURFX0JZX1pFUk8gICAgU1RBVFVTX0ZMT0FUX0RJVklERV9CWV9aRVJPCi0jZGVmaW5lIEVYQ0VQVElPTl9GTFRfSU5FWEFDVF9SRVNVTFQgICAgU1RBVFVTX0ZMT0FUX0lORVhBQ1RfUkVTVUxUCi0jZGVmaW5lIEVYQ0VQVElPTl9GTFRfSU5WQUxJRF9PUEVSQVRJT04gU1RBVFVTX0ZMT0FUX0lOVkFMSURfT1BFUkFUSU9OCi0jZGVmaW5lIEVYQ0VQVElPTl9GTFRfT1ZFUkZMT1cgICAgICAgICAgU1RBVFVTX0ZMT0FUX09WRVJGTE9XCi0jZGVmaW5lIEVYQ0VQVElPTl9GTFRfU1RBQ0tfQ0hFQ0sgICAgICAgU1RBVFVTX0ZMT0FUX1NUQUNLX0NIRUNLCi0jZGVmaW5lIEVYQ0VQVElPTl9GTFRfVU5ERVJGTE9XICAgICAgICAgU1RBVFVTX0ZMT0FUX1VOREVSRkxPVwotI2RlZmluZSBFWENFUFRJT05fSU5UX0RJVklERV9CWV9aRVJPICAgIFNUQVRVU19JTlRFR0VSX0RJVklERV9CWV9aRVJPCi0jZGVmaW5lIEVYQ0VQVElPTl9JTlRfT1ZFUkZMT1cgICAgICAgICAgU1RBVFVTX0lOVEVHRVJfT1ZFUkZMT1cKLSNkZWZpbmUgRVhDRVBUSU9OX1BSSVZfSU5TVFJVQ1RJT04gICAgICBTVEFUVVNfUFJJVklMRUdFRF9JTlNUUlVDVElPTgotI2RlZmluZSBFWENFUFRJT05fSU5fUEFHRV9FUlJPUiAgICAgICAgIFNUQVRVU19JTl9QQUdFX0VSUk9SCi0KLS8qCi0gKiByZXR1cm4gdmFsdWVzIGZyb20gdGhlIGFjdHVhbCBleGNlcHRpb24gaGFuZGxlcnMKLSAqLwotCi0jZGVmaW5lIEV4Y2VwdGlvbkNvbnRpbnVlRXhlY3V0aW9uIDAKLSNkZWZpbmUgRXhjZXB0aW9uQ29udGludWVTZWFyY2ggICAgMQotI2RlZmluZSBFeGNlcHRpb25OZXN0ZWRFeGNlcHRpb24gICAyCi0jZGVmaW5lIEV4Y2VwdGlvbkNvbGxpZGVkVW53aW5kICAgIDMKLSAKLS8qCi0gKiByZXR1cm4gdmFsdWVzIGZyb20gZmlsdGVycyBpbiBleGNlcHQoKSBhbmQgZnJvbSBVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIKLSAqLwotIAotI2RlZmluZSBFWENFUFRJT05fRVhFQ1VURV9IQU5ETEVSICAgICAgICAxCi0jZGVmaW5lIEVYQ0VQVElPTl9DT05USU5VRV9TRUFSQ0ggICAgICAgIDAKLSNkZWZpbmUgRVhDRVBUSU9OX0NPTlRJTlVFX0VYRUNVVElPTiAgICAtMQotCi0vKgotICogZnJvbSBPUy8yIDIuMCBleGNlcHRpb24gaGFuZGxpbmcKLSAqIFdpbjMyIHNlZW1zIHRvIHVzZSB0aGUgc2FtZSBmbGFncyBhcyBFeGNlcHRpb25GbGFncyBpbiBhbiBFWENFUFRJT05fUkVDT1JECi0gKi8KLQotI2RlZmluZSBFSF9OT05DT05USU5VQUJMRSAgIDB4MDEKLSNkZWZpbmUgRUhfVU5XSU5ESU5HICAgICAgICAweDAyCi0jZGVmaW5lIEVIX0VYSVRfVU5XSU5EICAgICAgMHgwNAotI2RlZmluZSBFSF9TVEFDS19JTlZBTElEICAgIDB4MDgKLSNkZWZpbmUgRUhfTkVTVEVEX0NBTEwgICAgICAweDEwCi0KLSNkZWZpbmUgRVhDRVBUSU9OX0NPTlRJTlVBQkxFICAgICAgICAwCi0jZGVmaW5lIEVYQ0VQVElPTl9OT05DT05USU5VQUJMRSAgICAgRUhfTk9OQ09OVElOVUFCTEUKLSAKLS8qCi0gKiBUaGUgZXhjZXB0aW9uIHJlY29yZCB1c2VkIGJ5IFdpbjMyIHRvIGdpdmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAKLSAqIGFib3V0IGV4Y2VwdGlvbiB0byBleGNlcHRpb24gaGFuZGxlcnMuCi0gKi8KLQotI2RlZmluZSBFWENFUFRJT05fTUFYSU1VTV9QQVJBTUVURVJTIDE1Ci0KLXR5cGVkZWYgc3RydWN0IF9fRVhDRVBUSU9OX1JFQ09SRAotewotICAgIERXT1JEICAgIEV4Y2VwdGlvbkNvZGU7Ci0gICAgRFdPUkQgICAgRXhjZXB0aW9uRmxhZ3M7Ci0gICAgc3RydWN0IF9fRVhDRVBUSU9OX1JFQ09SRCAqRXhjZXB0aW9uUmVjb3JkOwotCi0gICAgTFBWT0lEICAgRXhjZXB0aW9uQWRkcmVzczsKLSAgICBEV09SRCAgICBOdW1iZXJQYXJhbWV0ZXJzOwotICAgIERXT1JEICAgIEV4Y2VwdGlvbkluZm9ybWF0aW9uW0VYQ0VQVElPTl9NQVhJTVVNX1BBUkFNRVRFUlNdOwotfSBFWENFUFRJT05fUkVDT1JEOwotCi10eXBlZGVmIHN0cnVjdCBfX0VYQ0VQVElPTl9SRUNPUkRfTUlOCi17Ci0gICAgRFdPUkQgICAgRXhjZXB0aW9uQ29kZTsKLSAgICBEV09SRCAgICBFeGNlcHRpb25GbGFnczsKLSAgICBzdHJ1Y3QgX19FWENFUFRJT05fUkVDT1JEICpFeGNlcHRpb25SZWNvcmQ7Ci0KLSAgICBMUFZPSUQgICBFeGNlcHRpb25BZGRyZXNzOwotICAgIERXT1JEICAgIE51bWJlclBhcmFtZXRlcnM7Ci0gICAgRFdPUkQgICAgRXhjZXB0aW9uSW5mb3JtYXRpb25bMF07Ci19IEVYQ0VQVElPTl9SRUNPUkRfTUlOOwotCi10eXBlZGVmIHN0cnVjdCBfX0VYQ0VQVElPTl9SRUNPUkQgKlBFWENFUFRJT05fUkVDT1JEOwotCi0vKgotICogVGhlIGV4Y2VwdGlvbiBwb2ludGVycyBzdHJ1Y3R1cmUgcGFzc2VkIHRvIGV4Y2VwdGlvbiBmaWx0ZXJzCi0gKiBpbiBleGNlcHQoKSBhbmQgdGhlIFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcigpLgotICovCi0gCi10eXBlZGVmIHN0cnVjdCBfX0VYQ0VQVElPTl9QT0lOVEVSUyAKLXsKLSAgUEVYQ0VQVElPTl9SRUNPUkQgIEV4Y2VwdGlvblJlY29yZDsKLSAgUENPTlRFWFQgICAgICAgICAgIENvbnRleHRSZWNvcmQ7Ci19IEVYQ0VQVElPTl9QT0lOVEVSUzsKLQotdHlwZWRlZiBzdHJ1Y3QgX19FWENFUFRJT05fUE9JTlRFUlMgKlBFWENFUFRJT05fUE9JTlRFUlM7CiAKIC8qCiAgKiB0aGUgZnVuY3Rpb24gcG9pbnRlciB0byBhIGV4Y2VwdGlvbiBoYW5kbGVyCkBAIC0xNDQsMTYgKzIxLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEICAgICAgICAgICAgICAgICAgICAgcGRpc3BhdGNoZXIpOwogCiAvKgotICogZnVuY3Rpb24gcG9pbnRlciB0byBhIFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcigpOwotICovCi0KLXR5cGVkZWYgbG9uZyAoKl9fUFRPUF9FWENGSUxURVIpCi0gICAgICAgICAgICAgICAgICAgKFBFWENFUFRJT05fUE9JTlRFUlMgRXhjZXB0aW9uSW5mbyk7Ci0KLXR5cGVkZWYgX19QVE9QX0VYQ0ZJTFRFUiBQVE9QX0xFVkVSX0VYQ0VQVElPTl9GSUxURVI7Ci10eXBlZGVmIF9fUFRPUF9FWENGSUxURVIgTFBUT1BfTEVWRUxfRVhDRVBUSU9OX0ZJTFRFUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLyoKICAqIFRoZSBleGNlcHRpb24gZnJhbWUsIHVzZWQgZm9yIHJlZ2lzdGVyaW5nIGV4Y2VwdGlvbiBoYW5kbGVycyAKICAqIFdpbjMyIGNhcmVzIG9ubHkgYWJvdXQgdGhpcywgYnV0IGNvbXBpbGVycyBnZW5lcmFsbHkgZW1pdCAKICAqIGxhcmdlciBleGNlcHRpb24gZnJhbWVzIGZvciB0aGVpciBvd24gdXNlLgpAQCAtMTYzLDM3ICszMCwxNiBAQAogewogICBzdHJ1Y3QgX19FWENFUFRJT05fRlJBTUUgKlByZXY7CiAgIFBFWENFUFRJT05fSEFORExFUiAgICAgICBIYW5kbGVyOwotfSBFWENFUFRJT05fRlJBTUU7Ci0KLXR5cGVkZWYgc3RydWN0IF9fRVhDRVBUSU9OX0ZSQU1FICpQRVhDRVBUSU9OX0ZSQU1FOwotCi1leHRlcm4gUEVYQ0VQVElPTl9GUkFNRSAgVGViRXhjZXB0aW9uRnJhbWUgYXNtKCIlZnM6MCIpOwotCi0jZGVmaW5lIEVYQ19HZXRGcmFtZSgpICAgVGViRXhjZXB0aW9uRnJhbWUKLSNkZWZpbmUgRVhDX1NldEZyYW1lKGEpIChUZWJFeGNlcHRpb25GcmFtZT0oYSkpCit9IEVYQ0VQVElPTl9GUkFNRSwgKlBFWENFUFRJT05fRlJBTUU7CiAKIC8qCiAgKiBGdW5jdGlvbiBkZWZpbml0aW9ucyAgCiAgKi8KICAKLXZvaWQgRVhDX1JhaXNlRXhjZXB0aW9uKERXT1JEIGV4Y2NvZGUsIERXT1JEIGV4Y2ZsYWdzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIG5hcmdzLCBjb25zdCBMUERXT1JEIHBhcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgUENPTlRFWFQgcGNvbnRleHQpOyAKK3ZvaWQgUmFpc2VFeGNlcHRpb24oRFdPUkQgZXhjY29kZSwgRFdPUkQgZXhjZmxhZ3MsIAorICAgICAgICAgICAgICAgICAgICBEV09SRCBuYXJncywgY29uc3QgTFBEV09SRCBwYXJncywKKyAgICAgICAgICAgICAgICAgICAgUENPTlRFWFQgcGNvbnRleHQgLyogV2luZSBhZGRpdGlvbmFsIHBhcmFtZXRlciAqLyApOyAKICAgICAgICAgICAgICAgICAgICAgICAgIAotdm9pZCBFWENfUnRsVW53aW5kKCBQRVhDRVBUSU9OX0ZSQU1FIHBlc3RmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgTFBWT0lEIHVudXNlZEVJUCwKLSAgICAgICAgICAgICAgICAgICAgUEVYQ0VQVElPTl9SRUNPUkQgcGV4Y3JlYywKLSAgICAgICAgICAgICAgICAgICAgRFdPUkQgY29udGV4dEVBWCwKLSAgICAgICAgICAgICAgICAgICAgUENPTlRFWFQgcGNvbnRleHQgKTsKLSAgICAgICAgICAgICAgICAgICAgCi1EV09SRCBFWENfQ2FsbFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlciggUEVYQ0VQVElPTl9SRUNPUkQgcHJlY29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ09OVEVYVCAgICAgICAgICBwY29udGV4dCk7Ci0KLXZvaWQgRVhDX0luaXQodm9pZCk7Ci0KLUJPT0wgUmFpc2VFeGNlcHRpb24oRFdPUkQgZXhjY29kZSwgRFdPUkQgZXhjZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgIERXT1JEIG5hcmdzLCBjb25zdCBMUERXT1JEIHBhcmdzKTsKLQogLyoKICAqICB0aGlzIHVuZG9jdW1lbnRlZCBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhbiBleGNlcHRpb24KICAqICBoYW5kbGVyIHdhbnRzIGFsbCB0aGUgZnJhbWVzIHRvIGJlIHVud291bmQuIFJ0bFVud2luZApAQCAtMjA4LDExICs1NCwxMCBAQAogICogIGNvbnRleHQuICAgCiAgKi8KIAotQk9PTCBSdGxVbndpbmQoIFBFWENFUFRJT05fRlJBTUUgcGVzdGZyYW1lLAordm9pZCBSdGxVbndpbmQoIFBFWENFUFRJT05fRlJBTUUgcGVzdGZyYW1lLAogICAgICAgICAgICAgICAgIExQVk9JRCB1bnVzZWRFSVAsCiAgICAgICAgICAgICAgICAgUEVYQ0VQVElPTl9SRUNPUkQgcGV4Y3JlYywKLSAgICAgICAgICAgICAgICBEV09SRCBjb250ZXh0RUFYICk7Ci0KLURXT1JEIFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcihQRVhDRVBUSU9OX1BPSU5URVJTIGVwb2ludGVycyk7CisgICAgICAgICAgICAgICAgRFdPUkQgY29udGV4dEVBWCwKKyAgICAgICAgICAgICAgICBQQ09OVEVYVCBwY29udGV4dCAvKiBXaW5lIGFkZGl0aW9uYWwgcGFyYW1ldGVyICovICk7CiAKICNlbmRpZiAgLyogX19XSU5FX0VYQ0VQVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZvbnQuaCBiL2luY2x1ZGUvZm9udC5oCmluZGV4IDY0MWQwMjkuLjEyNDU2YWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZm9udC5oCisrKyBiL2luY2x1ZGUvZm9udC5oCkBAIC0yMCw2ICsyMCwxMCBAQAogCiAjcHJhZ21hIHBhY2soNCkKIAorI2RlZmluZSBGT05UQ0FDSEUgCTMyCS8qIGR5bmFtaWMgZm9udCBjYWNoZSBzaXplICovCisjZGVmaW5lIE1BWF9GT05UUwkyNTYKK2V4dGVybiBMUExPR0ZPTlQxNiBscExvZ0ZvbnRMaXN0W01BWF9GT05UUysxXTsKKwogLyogbWF5IGJlIHN3aXRjaGVkLi4uICovCiAjZGVmaW5lIEdHT19CSVRNQVAJMHg0RjRECiAjZGVmaW5lIEdHT19OQVRJVkUJMHg0RjUwCkBAIC00Myw2ICs0Nyw5IEBACiBleHRlcm4gQk9PTDMyIEZPTlRfSW5pdCggdm9pZCApOwogZXh0ZXJuIElOVDE2IEZPTlRfR2V0T2JqZWN0MTYoIEZPTlRPQkogKiBmb250LCBJTlQxNiBjb3VudCwgTFBTVFIgYnVmZmVyICk7CiBleHRlcm4gSU5UMzIgRk9OVF9HZXRPYmplY3QzMkEoIEZPTlRPQkogKiBmb250LCBJTlQzMiBjb3VudCwgTFBTVFIgYnVmZmVyICk7Ci1leHRlcm4gSEZPTlQxNiBGT05UX1NlbGVjdE9iamVjdCggREMgKiBkYywgSEZPTlQxNiBoZm9udCwgRk9OVE9CSiAqIGZvbnQgKTsKK2V4dGVybiBpbnQgRk9OVF9QYXJzZUZvbnRQYXJtcyhMUFNUUiBscEZvbnQsIFdPUkQgd1Bhcm1zTm8sIExQU1RSIGxwUmV0U3RyLCBXT1JEIHdNYXhTaXopOworZXh0ZXJuIHZvaWQgRk9OVF9HZXRNZXRyaWNzKCBMT0dGT05UMTYgKiBsb2dmb250LCBYRm9udFN0cnVjdCAqIHhmb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFWFRNRVRSSUMxNiAqIG1ldHJpY3MgKTsKKwogCiAjZW5kaWYgLyogX19XSU5FX0ZPTlRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ob29rLmggYi9pbmNsdWRlL2hvb2suaAppbmRleCAyMWMwMTk2Li5iOWVhMDU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2hvb2suaAorKysgYi9pbmNsdWRlL2hvb2suaApAQCAtOSwxMSArOSwxMiBAQAogCiAjaW5jbHVkZSAid2luZG93cy5oIgogCi0jZGVmaW5lIEhPT0tfV0lOMTYgICAweDAKLSNkZWZpbmUgSE9PS19XSU4zMiAgIDB4MQotI2RlZmluZSBIT09LX1VOSUNPREUgMHgyCisjZGVmaW5lIEhPT0tfV0lOMTYJMHgwCisjZGVmaW5lIEhPT0tfV0lOMzJBCTB4MQorI2RlZmluZSBIT09LX1dJTjMyVwkweDIKIAotI2RlZmluZSBIT09LX01BUFRZUEUgKEhPT0tfV0lOMzIgfCBIT09LX1VOSUNPREUpCisvKiBob29rIHR5cGUgbWFzayAqLworI2RlZmluZSBIT09LX01BUFRZUEUgKDMpCiAKIGV4dGVybiBIT09LUFJPQzE2IEhPT0tfR2V0UHJvYzE2KCBISE9PSyBoaG9vayApOwogZXh0ZXJuIEJPT0wzMiBIT09LX0lzSG9va2VkKCBJTlQxNiBpZCApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZXRhZmlsZWRydi5oIGIvaW5jbHVkZS9tZXRhZmlsZWRydi5oCmluZGV4IGRmYjRiOTIuLmE4ZTY3YTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWV0YWZpbGVkcnYuaAorKysgYi9pbmNsdWRlL21ldGFmaWxlZHJ2LmgKQEAgLTY2LDYgKzY2LDcgQEAKIGV4dGVybiBCT09MMzIgTUZEUlZfUG9seWdvbiggc3RydWN0IHRhZ0RDICpkYywgTFBQT0lOVDMyIHB0LCBJTlQzMiBjb3VudCApOwogZXh0ZXJuIEJPT0wzMiBNRkRSVl9Qb2x5UG9seWdvbiggc3RydWN0IHRhZ0RDICpkYywgTFBQT0lOVDMyIHB0LCBMUElOVDMyIGNvdW50cywKIAkJCQkgVUlOVDMyIHBvbHlnb25zKTsKK2V4dGVybiBIR0RJT0JKMzIgTUZEUlZfU2VsZWN0T2JqZWN0KCBEQyAqZGMsIEhHRElPQkozMiBoYW5kbGUgKTsKIGV4dGVybiBCT09MMzIgTUZEUlZfRXh0Rmxvb2RGaWxsKCBzdHJ1Y3QgdGFnREMgKmRjLCBJTlQzMiB4LCBJTlQzMiB5LAogCQkJCSAgQ09MT1JSRUYgY29sb3IsIFVJTlQzMiBmaWxsVHlwZSApOwogZXh0ZXJuIEJPT0wzMiBNRkRSVl9FeHRUZXh0T3V0KCBzdHJ1Y3QgdGFnREMgKmRjLCBJTlQzMiB4LCBJTlQzMiB5LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9taXNjZW11LmggYi9pbmNsdWRlL21pc2NlbXUuaAppbmRleCBiYWNjMTBlLi4wNGU1MjNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL21pc2NlbXUuaAorKysgYi9pbmNsdWRlL21pc2NlbXUuaApAQCAtMzUsOSArMzUsNiBAQAogLyogbXNkb3MvaW50MWEuYyAqLwogZXh0ZXJuIERXT1JEIElOVDFBX0dldFRpY2tzU2luY2VNaWRuaWdodCh2b2lkKTsKIAotLyogbWlzYy9jcHUuYyAqLwotZXh0ZXJuIGludCBydW50aW1lX2NwdSh2b2lkKTsKLQogI2RlZmluZSBJTlRfQkFSRihjb250ZXh0LG51bSkgXAogICAgIGZwcmludGYoIHN0ZGVyciwgImludCV4OiB1bmtub3duL25vdCBpbXBsZW1lbnRlZCBwYXJhbWV0ZXJzOlxuIiBcCiAgICAgICAgICAgICAgICAgICAgICAiaW50JXg6IEFYICUwNHgsIEJYICUwNHgsIENYICUwNHgsIERYICUwNHgsICIgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wZV9pbWFnZS5oIGIvaW5jbHVkZS9wZV9pbWFnZS5oCmluZGV4IDExMzBiYTguLjEyZjY4OTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcGVfaW1hZ2UuaAorKysgYi9pbmNsdWRlL3BlX2ltYWdlLmgKQEAgLTIzLDUgKzIzLDE1IEBACiBleHRlcm4gaW50IFBFX3VubG9hZEltYWdlKEhNT0RVTEUzMiBoTW9kdWxlKTsKIGV4dGVybiBGQVJQUk9DMzIgUEVfRmluZEV4cG9ydGVkRnVuY3Rpb24oc3RydWN0IHBlX2RhdGEgKnBlLCBMUENTVFIgZnVuY05hbWUpOwogZXh0ZXJuIHZvaWQgbXlfd2NzdG9tYnMoY2hhciAqIHJlc3VsdCwgdV9zaG9ydCAqIHNvdXJjZSwgaW50IGxlbik7CitleHRlcm4gUEVfRW51bVJlc291cmNlVHlwZXMzMkEoSE1PRFVMRTMyLEVOVU1SRVNUWVBFUFJPQzMyQSxMT05HKTsKK2V4dGVybiBQRV9FbnVtUmVzb3VyY2VUeXBlczMyVyhITU9EVUxFMzIsRU5VTVJFU1RZUEVQUk9DMzJXLExPTkcpOworZXh0ZXJuIFBFX0VudW1SZXNvdXJjZU5hbWVzMzJBKEhNT0RVTEUzMixMUENTVFIsRU5VTVJFU05BTUVQUk9DMzJBLExPTkcpOworZXh0ZXJuIFBFX0VudW1SZXNvdXJjZU5hbWVzMzJXKEhNT0RVTEUzMixMUENXU1RSLEVOVU1SRVNOQU1FUFJPQzMyVyxMT05HKTsKK2V4dGVybiBQRV9FbnVtUmVzb3VyY2VMYW5ndWFnZXMzMkEoSE1PRFVMRTMyLExQQ1NUUixMUENTVFIsRU5VTVJFU0xBTkdQUk9DMzJBLExPTkcpOworZXh0ZXJuIFBFX0VudW1SZXNvdXJjZUxhbmd1YWdlczMyVyhITU9EVUxFMzIsTFBDV1NUUixMUENXU1RSLEVOVU1SRVNMQU5HUFJPQzMyVyxMT05HKTsKK2V4dGVybiBIUlNSQzMyIFBFX0ZpbmRSZXNvdXJjZUV4MzJXKEhJTlNUQU5DRTMyLExQQ1dTVFIsTFBDV1NUUixXT1JEKTsKK2V4dGVybiBEV09SRCBQRV9TaXplb2ZSZXNvdXJjZTMyKEhJTlNUQU5DRTMyLEhSU1JDMzIpOworZXh0ZXJuIEhHTE9CQUwzMiBQRV9Mb2FkUmVzb3VyY2UzMihISU5TVEFOQ0UzMixIUlNSQzMyKTsKK2V4dGVybiB2b2lkIFBFX0luaXRpYWxpemVETExzKEhNT0RVTEUxNik7CiAKICNlbmRpZiAvKiBfX1dJTkVfUEVfSU1BR0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wZW4uaCBiL2luY2x1ZGUvcGVuLmgKaW5kZXggYWI0ZjViMi4uZWZmZWQ0MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wZW4uaAorKysgYi9pbmNsdWRlL3Blbi5oCkBAIC0xOCw2ICsxOCw1IEBACiAKIGV4dGVybiBJTlQxNiBQRU5fR2V0T2JqZWN0MTYoIFBFTk9CSiAqIHBlbiwgSU5UMTYgY291bnQsIExQU1RSIGJ1ZmZlciApOwogZXh0ZXJuIElOVDMyIFBFTl9HZXRPYmplY3QzMiggUEVOT0JKICogcGVuLCBJTlQzMiBjb3VudCwgTFBTVFIgYnVmZmVyICk7Ci1leHRlcm4gSFBFTjMyIFBFTl9TZWxlY3RPYmplY3QoIERDICogZGMsIEhQRU4zMiBocGVuLCBQRU5PQkogKiBwZW4gKTsKIAogI2VuZGlmICAvKiBfX1dJTkVfUEVOX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJvY2Vzcy5oIGIvaW5jbHVkZS9wcm9jZXNzLmgKaW5kZXggMmMwMThlNy4uZGM2YjQyMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcm9jZXNzLmgKKysrIGIvaW5jbHVkZS9wcm9jZXNzLmgKQEAgLTksNiArOSw3IEBACiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAid2luYmFzZS5oIgorI2luY2x1ZGUgIndpbm50LmgiCiAjaW5jbHVkZSAiaGFuZGxlMzIuaCIKICNpbmNsdWRlICJ0YXNrLmgiCiAKQEAgLTgyLDcgKzgzLDcgQEAKICAgICBEV09SRCAgICAgICAgICAgIHByb2Nlc3NfZHdvcmQ7ICAgIC8qIDkwIFVua25vd24gKi8KICAgICBzdHJ1Y3QgX1BEQjMyICAgKmdyb3VwOyAgICAgICAgICAgIC8qIDk0IFByb2Nlc3MgZ3JvdXAgKi8KICAgICB2b2lkICAgICAgICAgICAgKmV4ZV9tb2RyZWY7ICAgICAgIC8qIDk4IE1PRFJFRiBmb3IgdGhlIHByb2Nlc3MgRVhFICovCi0gICAgdm9pZCAgICAgICAgICAgICp0b3BfZXhjX2ZpbHRlcjsgICAvKiA5YyBUb3AgZXhjZXB0aW9uIGZpbHRlciAqLworICAgIExQVE9QX0xFVkVMX0VYQ0VQVElPTl9GSUxURVIgdG9wX2ZpbHRlcjsgLyogOWMgVG9wIGV4Y2VwdGlvbiBmaWx0ZXIgKi8KICAgICBEV09SRCAgICAgICAgICAgIHByaW9yaXR5OyAgICAgICAgIC8qIGEwIFByaW9yaXR5IGxldmVsICovCiAgICAgSEFORExFMzIgICAgICAgICBoZWFwX2xpc3Q7ICAgICAgICAvKiBhNCBIZWFkIG9mIHByb2Nlc3MgaGVhcCBsaXN0ICovCiAgICAgdm9pZCAgICAgICAgICAgICpoZWFwX2hhbmRsZXM7ICAgICAvKiBhOCBIZWFkIG9mIGhlYXAgaGFuZGxlcyBsaXN0ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NlbGVjdG9ycy5oIGIvaW5jbHVkZS9zZWxlY3RvcnMuaAppbmRleCBmODA3NDAzLi42NzNhMmY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3NlbGVjdG9ycy5oCisrKyBiL2luY2x1ZGUvc2VsZWN0b3JzLmgKQEAgLTQwLDkgKzQwLDkgQEAKICNkZWZpbmUgV0lORV9DT0RFX1NFTEVDVE9SIDB4MTcKICNlbmRpZiAgLyogc3ZyNCB8fCBTQ09fRFMgKi8KIAotI2lmZGVmIF9fRU1YX18KLSNkZWZpbmUgV0lORV9EQVRBX1NFTEVDVE9SIDB4MDAgLyogRklYTUU6IFRoaXMgaXMgd3JvbmcgKi8KLSNkZWZpbmUgV0lORV9DT0RFX1NFTEVDVE9SIDB4MDAKKyNpZmRlZiBfX0VNWF9fIC8qIElzIHRoaXMgYWx3YXlzIHRydWU/ICovCisjZGVmaW5lIFdJTkVfREFUQV9TRUxFQ1RPUiAweDUzCisjZGVmaW5lIFdJTkVfQ09ERV9TRUxFQ1RPUiAweDViCiAjZW5kaWYgIC8qIE9TLzIgKi8KIAogI2Vsc2UgIC8qIFdJTkVMSUIgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2lnY29udGV4dC5oIGIvaW5jbHVkZS9zaWdjb250ZXh0LmgKaW5kZXggMTU3YmQ5MS4uNTVjNjBjMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zaWdjb250ZXh0LmgKKysrIGIvaW5jbHVkZS9zaWdjb250ZXh0LmgKQEAgLTU5LDcgKzU5LDQwIEBACiAjZW5kaWYgIC8qIHN2cjQgfHwgU0NPX0RTICovCiAKICNpZmRlZiBfX0VNWF9fCi10eXBlZGVmIHN0cnVjdCBDT05URVhUUkVDT1JEIFNJR0NPTlRFWFQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUxPTkc7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFVTSE9SVDsKK3R5cGVkZWYgc3RydWN0IF9mcHJlZwkJLyogTm90ZSAxICovCit7CisgIFVMT05HCSBsb3NpZzsKKyAgVUxPTkcJIGhpc2lnOworICBVU0hPUlQgc2lnbmV4cDsKK30gRlBSRUc7Cit0eXBlZGVmIEZQUkVHICpQRlBSRUc7CisKK3R5cGVkZWYgc3RydWN0IF9DT05URVhUCQkvKiBOb3RlIDEgKi8KK3sKKyAgVUxPTkcgQ29udGV4dEZsYWdzOworICBVTE9ORyBjdHhfZW52WzddOworICBGUFJFRyBjdHhfc3RhY2tbOF07CisgIFVMT05HIGN0eF9TZWdHczsKKyAgVUxPTkcgY3R4X1NlZ0ZzOworICBVTE9ORyBjdHhfU2VnRXM7CisgIFVMT05HIGN0eF9TZWdEczsKKyAgVUxPTkcgY3R4X1JlZ0VkaTsKKyAgVUxPTkcgY3R4X1JlZ0VzaTsKKyAgVUxPTkcgY3R4X1JlZ0VheDsKKyAgVUxPTkcgY3R4X1JlZ0VieDsKKyAgVUxPTkcgY3R4X1JlZ0VjeDsKKyAgVUxPTkcgY3R4X1JlZ0VkeDsKKyAgVUxPTkcgY3R4X1JlZ0VicDsKKyAgVUxPTkcgY3R4X1JlZ0VpcDsKKyAgVUxPTkcgY3R4X1NlZ0NzOworICBVTE9ORyBjdHhfRUZsYWdzOworICBVTE9ORyBjdHhfUmVnRXNwOworICBVTE9ORyBjdHhfU2VnU3M7Cit9IFNJR0NPTlRFWFQ7CisvKnR5cGVkZWYgQ09OVEVYVFJFQ09SRCAqUENPTlRFWFRSRUNPUkQ7Ki8KKwogI2VuZGlmICAvKiBfX0VNWF9fICovCiAKIApAQCAtMTM4LDEyICsxNzEsMTIgQEAKICNkZWZpbmUgRURJX3NpZyhjb250ZXh0KSAgICAgKChjb250ZXh0KS0+Y3R4X1JlZ0VkaSkKICNkZWZpbmUgRUJQX3NpZyhjb250ZXh0KSAgICAgKChjb250ZXh0KS0+Y3R4X1JlZ0VicCkKICNkZWZpbmUgRVNQX3NpZyhjb250ZXh0KSAgICAgKChjb250ZXh0KS0+Y3R4X1JlZ0VzcCkKLSNkZWZpbmUgQ1Nfc2lnKGNvbnRleHQpICAgICAgKChjb250ZXh0KS0+Y3R4X1NlZ0NTKQotI2RlZmluZSBEU19zaWcoY29udGV4dCkgICAgICAoKGNvbnRleHQpLT5jdHhfU2VnRFMpCi0jZGVmaW5lIEVTX3NpZyhjb250ZXh0KSAgICAgICgoY29udGV4dCktPmN0eF9TZWdFUykKLSNkZWZpbmUgU1Nfc2lnKGNvbnRleHQpICAgICAgKChjb250ZXh0KS0+Y3R4X1NlZ1NTKQotI2RlZmluZSBGU19zaWcoY29udGV4dCkgICAgICAoKGNvbnRleHQpLT5jdHhfU2VnRlMpCi0jZGVmaW5lIEdTX3NpZyhjb250ZXh0KSAgICAgICgoY29udGV4dCktPmN0eF9TZWdHUykKKyNkZWZpbmUgQ1Nfc2lnKGNvbnRleHQpICAgICAgKChjb250ZXh0KS0+Y3R4X1NlZ0NzKQorI2RlZmluZSBEU19zaWcoY29udGV4dCkgICAgICAoKGNvbnRleHQpLT5jdHhfU2VnRHMpCisjZGVmaW5lIEVTX3NpZyhjb250ZXh0KSAgICAgICgoY29udGV4dCktPmN0eF9TZWdFcykKKyNkZWZpbmUgU1Nfc2lnKGNvbnRleHQpICAgICAgKChjb250ZXh0KS0+Y3R4X1NlZ1NzKQorI2RlZmluZSBGU19zaWcoY29udGV4dCkgICAgICAoKGNvbnRleHQpLT5jdHhfU2VnRnMpCisjZGVmaW5lIEdTX3NpZyhjb250ZXh0KSAgICAgICgoY29udGV4dCktPmN0eF9TZWdHcykKICNkZWZpbmUgRUZMX3NpZyhjb250ZXh0KSAgICAgKChjb250ZXh0KS0+Y3R4X0VGbGFncykKICNkZWZpbmUgRUlQX3NpZyhjb250ZXh0KSAgICAgKChjb250ZXh0KS0+Y3R4X1JlZ0VpcCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS90aHJlYWQuaCBiL2luY2x1ZGUvdGhyZWFkLmgKaW5kZXggMTFkOWNiYi4uZWMzZmE0YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS90aHJlYWQuaAorKysgYi9pbmNsdWRlL3RocmVhZC5oCkBAIC04LDYgKzgsNyBAQAogI2RlZmluZSBfX1dJTkVfVEhSRUFEX0gKIAogI2luY2x1ZGUgInByb2Nlc3MuaCIKKyNpbmNsdWRlICJ3aW5udC5oIgogCiAvKiBUaHJlYWQgZXhjZXB0aW9uIGJsb2NrICovCiB0eXBlZGVmIHN0cnVjdCBfVEVCCkBAIC0zNSw3ICszNiw3IEBACiAgICAgSzMyT0JKICAgICAgIGhlYWRlcjsgICAgICAgICAvKiAgMDAgS2VybmVsIG9iamVjdCBoZWFkZXIgKi8KICAgICBQREIzMiAgICAgICAqcHJvY2VzczsgICAgICAgIC8qICAwOCBQcm9jZXNzIG93bmluZyB0aGlzIHRocmVhZCAqLwogICAgIEszMk9CSiAgICAgICpldmVudDsgICAgICAgICAgLyogIDBjIFRocmVhZCBldmVudCAqLwotICAgIFRFQiAgICAgICAgICB0ZWI7ICAgICAgICAgICAgLyogIDEwIFRocmVhZCBpbmZvcm1hdGlvbiBibG9jayAqLworICAgIFRFQiAgICAgICAgICB0ZWI7ICAgICAgICAgICAgLyogIDEwIFRocmVhZCBleGNlcHRpb24gYmxvY2sgKi8KICAgICBQREIzMiAgICAgICAqcHJvY2VzczI7ICAgICAgIC8qICA0MCBTYW1lIGFzIG9mZnNldCAwOCAoPykgKi8KICAgICBEV09SRCAgICAgICAgZmxhZ3M7ICAgICAgICAgIC8qICA0NCBGbGFncyAqLwogICAgIERXT1JEICAgICAgICBleGl0X2NvZGU7ICAgICAgLyogIDQ4IFRlcm1pbmF0aW9uIHN0YXR1cyAqLwpAQCAtNTIsNyArNTMsNyBAQAogICAgIERXT1JEICAgICAgICBsYXN0X2Vycm9yOyAgICAgLyogIDcwIExhc3QgZXJyb3IgY29kZSAqLwogICAgIHZvaWQgICAgICAgICpkZWJ1Z2dlcl9DQjsgICAgLyogIDc0IERlYnVnZ2VyIGNvbnRleHQgYmxvY2sgKi8KICAgICBEV09SRCAgICAgICAgZGVidWdfdGhyZWFkOyAgIC8qICA3OCBUaHJlYWQgZGVidWdnaW5nIHRoaXMgb25lICg/KSAqLwotICAgIHZvaWQgICAgICAgICpjb250ZXh0OyAgICAgICAgLyogIDdjIFRocmVhZCByZWdpc3RlciBjb250ZXh0ICovCisgICAgdm9pZCAgICAgICAgKnBjb250ZXh0OyAgICAgICAvKiAgN2MgVGhyZWFkIHJlZ2lzdGVyIGNvbnRleHQgKi8KICAgICBEV09SRCAgICAgICAgdW5rbm93bjNbM107ICAgIC8qICA4MCBVbmtub3duICovCiAgICAgV09SRCAgICAgICAgIGN1cnJlbnRfc3M7ICAgICAvKiAgOGMgQW5vdGhlciAxNi1iaXQgc3RhY2sgc2VsZWN0b3IgKi8KICAgICBXT1JEICAgICAgICAgcGFkMjsgICAgICAgICAgIC8qICA4ZSAqLwpAQCAtNjksMTEgKzcwLDE0IEBACiAgICAgSzMyT0JKICAgICAgKndpbjE2X211dGV4OyAgICAvKiAxZTggUG9pbnRlciB0byBXaW4xNiBtdXRleCAqLwogICAgIEszMk9CSiAgICAgICp3aW4zMl9tdXRleDsgICAgLyogMWVjIFBvaW50ZXIgdG8gS0VSTkVMMzIgbXV0ZXggKi8KICAgICBLMzJPQkogICAgICAqY3JpdF9zZWN0aW9uMjsgIC8qIDFmMCBBbm90aGVyIGNyaXRpY2FsIHNlY3Rpb24gKi8KLSAgICBEV09SRCAgICAgICAgdW5rbm93bjZbMl07ICAgIC8qIDFmNCBVbmtub3duICovCisgICAgRFdPUkQgICAgICAgIHVua25vd242WzNdOyAgICAvKiAxZjQgVW5rbm93biAqLworICAgIC8qIFRoZSBmb2xsb3dpbmcgYXJlIFdpbmUtc3BlY2lmaWMgZmllbGRzICovCisgICAgQ09OVEVYVCAgICAgIGNvbnRleHQ7ICAgICAgICAvKiAyMDAgVGhyZWFkIGNvbnRleHQgKi8KIH0gVEhEQjsKIAogCi1leHRlcm4gVEhEQiAqVEhSRUFEX0NyZWF0ZSggUERCMzIgKnBkYiwgRFdPUkQgc3RhY2tfc2l6ZSApOworZXh0ZXJuIFRIREIgKlRIUkVBRF9DcmVhdGUoIFBEQjMyICpwZGIsIERXT1JEIHN0YWNrX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBUSFJFQURfU1RBUlRfUk9VVElORSBzdGFydF9hZGRyICk7CiBleHRlcm4gdm9pZCBUSFJFQURfRGVzdHJveSggSzMyT0JKICpwdHIgKTsKIAogZXh0ZXJuIFRIREIgKnBDdXJyZW50VGhyZWFkOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW5iYXNlLmggYi9pbmNsdWRlL3dpbmJhc2UuaAppbmRleCBlMjc3MzUzLi45MTkxMjRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbmJhc2UuaAorKysgYi9pbmNsdWRlL3dpbmJhc2UuaApAQCAtMzgsMTIgKzM4LDYgQEAKICNkZWZpbmUgRlNfQ0FTRV9JU19QUkVTRVJWRUQgICAgICAgICAgICBGSUxFX0NBU0VfUFJFU0VSVkVEX05BTUVTCiAjZGVmaW5lIEZTX1VOSUNPREVfU1RPUkVEX09OX0RJU0sgICAgICAgRklMRV9VTklDT0RFX09OX0RJU0sKIAotc3RydWN0IF9FWENFUFRJT05fUE9JTlRFUlM7Ci0KLXR5cGVkZWYgTE9ORyAoVE9QX0xFVkVMX0VYQ0VQVElPTl9GSUxURVIpKHN0cnVjdCBfRVhDRVBUSU9OX1BPSU5URVJTICopOwotCi1UT1BfTEVWRUxfRVhDRVBUSU9OX0ZJTFRFUiAqU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyKFRPUF9MRVZFTF9FWENFUFRJT05fRklMVEVSICpmdW5jKTsKLQogLypXSU5BUEkgaW50ICBTZXRFcnJvck1vZGUoaW50KTsqLwogCiAjZGVmaW5lIFNUQVRVU19TVUNDRVNTICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luZG93cy5oIGIvaW5jbHVkZS93aW5kb3dzLmgKaW5kZXggNGQ3MWNlZC4uMzM4YmYxMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5kb3dzLmgKKysrIGIvaW5jbHVkZS93aW5kb3dzLmgKQEAgLTE4MjUsNiArMTgyNSwxMiBAQAogI2RlZmluZSBPRl9FWElTVCAgICAgICAgICAgICAgMHg0MDAwCiAjZGVmaW5lIE9GX1JFT1BFTiAgICAgICAgICAgICAweDgwMDAKIAorLyogU2V0RXJyb3JNb2RlIHZhbHVlcyAqLworI2RlZmluZSBTRU1fRkFJTENSSVRJQ0FMRVJST1JTICAgICAgMHgwMDAxCisjZGVmaW5lIFNFTV9OT0dQRkFVTFRFUlJPUkJPWCAgICAgICAweDAwMDIKKyNkZWZpbmUgU0VNX05PQUxJR05NRU5URkFVTFRFWENFUFQgIDB4MDAwNAorI2RlZmluZSBTRU1fTk9PUEVORklMRUVSUk9SQk9YICAgICAgMHg4MDAwCisKIC8qIEdldFRlbXBGaWxlTmFtZSgpIEZsYWdzICovCiAjZGVmaW5lIFRGX0ZPUkNFRFJJVkUJICAgICAgICAweDgwCiAKQEAgLTM2NjcsNyArMzY3MywxMSBAQAogI2RlZmluZSBWS19YICAgICAgICAgICAgICAgIDB4NTgKICNkZWZpbmUgVktfWSAgICAgICAgICAgICAgICAweDU5CiAjZGVmaW5lIFZLX1ogICAgICAgICAgICAgICAgMHg1QQotLyogICAgICAgICAgICAgICAgICAgICAgICAgIDB4NUItMHg1RiAgVW5kZWZpbmVkICovCisKKyNkZWZpbmUgVktfTFdJTiAgICAgICAgICAgICAweDVCCisjZGVmaW5lIFZLX1JXSU4gICAgICAgICAgICAgMHg1QworI2RlZmluZSBWS19BUFBTICAgICAgICAgICAgIDB4NUQKKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAweDVFLTB4NUYgVW5hc3NpZ25lZCAqLwogI2RlZmluZSBWS19OVU1QQUQwICAgICAgICAgIDB4NjAKICNkZWZpbmUgVktfTlVNUEFEMSAgICAgICAgICAweDYxCiAjZGVmaW5lIFZLX05VTVBBRDIgICAgICAgICAgMHg2MgpAQCAtMzcxMSwxNiArMzcyMSwzNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgtMHg4RiAgVW5hc3NpZ25lZCAqLwogI2RlZmluZSBWS19OVU1MT0NLICAgICAgICAgIDB4OTAKICNkZWZpbmUgVktfU0NST0xMICAgICAgICAgICAweDkxCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5Mi0weEI5ICBVbmFzc2lnbmVkICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5Mi0weDlGICBVbmFzc2lnbmVkICovCisvKgorICogZGlmZmVyZW5jaW5nIGJldHdlZW4gcmlnaHQgYW5kIGxlZnQgc2hpZnQvY29udHJvbC9hbHQga2V5LgorICogVXNlZCBvbmx5IGJ5IEdldEFzeW5jS2V5U3RhdGUoKSBhbmQgR2V0S2V5U3RhdGUoKS4KKyAqLworI2RlZmluZSBWS19MU0hJRlQgICAgICAgICAgIDB4QTAKKyNkZWZpbmUgVktfUlNISUZUICAgICAgICAgICAweEExCisjZGVmaW5lIFZLX0xDT05UUk9MICAgICAgICAgMHhBMgorI2RlZmluZSBWS19SQ09OVFJPTCAgICAgICAgIDB4QTMKKyNkZWZpbmUgVktfTE1FTlUgICAgICAgICAgICAweEE0CisjZGVmaW5lIFZLX1JNRU5VICAgICAgICAgICAgMHhBNQorLyogICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTYtMHhCOSAgVW5hc3NpZ25lZCAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkEtMHhDMCAgT0VNIHNwZWNpZmljICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgMHhDMS0weERBICBVbmFzc2lnbmVkICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQi0weEU0ICBPRU0gc3BlY2lmaWMgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAweEU1ICAgICAgIFVuYXNzaWduZWQgKi8KKworI2RlZmluZSBWS19QUk9DRVNTS0VZICAgICAgIDB4RTUKKwogLyogICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTYgICAgICAgT0VNIHNwZWNpZmljICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFNy0weEU4ICBVbmFzc2lnbmVkICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFOS0weEY1ICBPRU0gc3BlY2lmaWMgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAweEY2LTB4RkUgIFVuYXNzaWduZWQgKi8KIAorI2RlZmluZSBWS19BVFROICAgICAgICAgICAgIDB4RjYKKyNkZWZpbmUgVktfQ1JTRUwgICAgICAgICAgICAweEY3CisjZGVmaW5lIFZLX0VYU0VMICAgICAgICAgICAgMHhGOAorI2RlZmluZSBWS19FUkVPRiAgICAgICAgICAgIDB4RjkKKyNkZWZpbmUgVktfUExBWSAgICAgICAgICAgICAweEZBCisjZGVmaW5lIFZLX1pPT00gICAgICAgICAgICAgMHhGQgorI2RlZmluZSBWS19OT05BTUUgICAgICAgICAgIDB4RkMKKyNkZWZpbmUgVktfUEExICAgICAgICAgICAgICAweEZECisjZGVmaW5lIFZLX09FTV9DTEVBUiAgICAgICAgMHhGRQogICAKICNkZWZpbmUgTE1FTV9GSVhFRCAgICAgICAgICAwICAgCiAjZGVmaW5lIExNRU1fTU9WRUFCTEUgICAgICAgMHgwMDAyCkBAIC00NTk3LDYgKzQ2MjgsMjEgQEAKIAogI2RlZmluZSBQUl9KT0JTVEFUVVMJMHgwMDAwCiAKK3R5cGVkZWYgQk9PTDMyICgqRU5VTVJFU1RZUEVQUk9DMzJBKShITU9EVUxFMzIgaE1vZHVsZSwgTFBTVFIgdHlwZSxMT05HIGxQYXJhbSk7Cit0eXBlZGVmIEJPT0wzMiAoKkVOVU1SRVNUWVBFUFJPQzMyVykoSE1PRFVMRTMyIGhNb2R1bGUsIExQV1NUUiB0eXBlLExPTkcgbFBhcmFtKTsKK3R5cGVkZWYgQk9PTDMyICgqRU5VTVJFU05BTUVQUk9DMzJBKShITU9EVUxFMzIgaE1vZHVsZSwgTFBDU1RSIHR5cGUsCisJCQkJTFBTVFIgbmFtZSxMT05HIGxQYXJhbSk7Cit0eXBlZGVmIEJPT0wzMiAoKkVOVU1SRVNOQU1FUFJPQzMyVykoSE1PRFVMRTMyIGhNb2R1bGUsIExQQ1dTVFIgdHlwZSwKKwkJCQlMUFdTVFIgbmFtZSxMT05HIGxQYXJhbSk7Cit0eXBlZGVmIEJPT0wzMiAoKkVOVU1SRVNMQU5HUFJPQzMyQSkoSE1PRFVMRTMyIGhNb2R1bGUsIExQQ1NUUiB0eXBlLAorCQkJCUxQQ1NUUiBuYW1lLFdPUkQgbGFuZyxMT05HIGxQYXJhbSk7Cit0eXBlZGVmIEJPT0wzMiAoKkVOVU1SRVNMQU5HUFJPQzMyVykoSE1PRFVMRTMyIGhNb2R1bGUsIExQQ1dTVFIgdHlwZSwKKwkJCQlMUENXU1RSIG5hbWUsV09SRCBsYW5nLExPTkcgbFBhcmFtKTsKKworREVDTF9XSU5FTElCX1RZUEVfQVcoRU5VTVJFU1RZUEVQUk9DKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKEVOVU1SRVNOQU1FUFJPQyk7CitERUNMX1dJTkVMSUJfVFlQRV9BVyhFTlVNUkVTTEFOR1BST0MpOworCiAjcHJhZ21hIHBhY2soNCkKIAogLyogRGVjbGFyYXRpb25zIGZvciBmdW5jdGlvbnMgdGhhdCBleGlzdCBvbmx5IGluIFdpbjE2ICovCkBAIC00NjM3LDYgKzQ2ODMsNyBAQAogSFdORDE2ICAgICBHZXREZXNrdG9wSHduZCh2b2lkKTsKIEhNT0RVTEUxNiAgR2V0RXhlUHRyKEhBTkRMRTE2KTsKIFdPUkQgICAgICAgR2V0RXhlVmVyc2lvbih2b2lkKTsKK0lOVDE2ICAgICAgR2V0S2JDb2RlUGFnZShWT0lEKTsKIElOVDE2ICAgICAgR2V0SW5zdGFuY2VEYXRhKEhJTlNUQU5DRTE2LFdPUkQsSU5UMTYpOwogQk9PTDE2ICAgICBHZXRNb2R1bGVOYW1lKEhJTlNUQU5DRTE2LExQU1RSLElOVDE2KTsKIEZBUlBST0MxNiAgR2V0TW91c2VFdmVudFByb2Modm9pZCk7CkBAIC00NjUwLDYgKzQ2OTcsNyBAQAogRFdPUkQgICAgICBHZXRWaWV3cG9ydE9yZyhIREMxNik7CiBEV09SRCAgICAgIEdldFdpbmRvd0V4dChIREMxNik7CiBEV09SRCAgICAgIEdldFdpbmRvd09yZyhIREMxNik7CitEV09SRCAgICAgIEdldFdpbkZsYWdzKHZvaWQpOwogRFdPUkQgICAgICBHbG9iYWxET1NBbGxvYyhEV09SRCk7CiBXT1JEICAgICAgIEdsb2JhbERPU0ZyZWUoV09SRCk7CiB2b2lkICAgICAgIEdsb2JhbEZyZWVBbGwoSEdMT0JBTDE2KTsKQEAgLTQ3MjAsNiArNDc2OCw3IEBACiBCT09MMzIgICAgIENvcHlGaWxlMzJBKExQQ1NUUixMUENTVFIsQk9PTDMyKTsKIEJPT0wzMiAgICAgQ29weUZpbGUzMlcoTFBDV1NUUixMUENXU1RSLEJPT0wzMik7CiAjZGVmaW5lICAgIENvcHlGaWxlIFdJTkVMSUJfTkFNRV9BVyhDb3B5RmlsZSkKK0lOVDMyICAgICAgQ29tcGFyZUZpbGVUaW1lKExQRklMRVRJTUUsTFBGSUxFVElNRSk7CiBIRklMRTMyICAgIENyZWF0ZUZpbGUzMkEoTFBDU1RSLERXT1JELERXT1JELExQU0VDVVJJVFlfQVRUUklCVVRFUyxEV09SRCxEV09SRCxIQU5ETEUzMik7CiBIRklMRTMyICAgIENyZWF0ZUZpbGUzMlcoTFBDV1NUUixEV09SRCxEV09SRCxMUFNFQ1VSSVRZX0FUVFJJQlVURVMsRFdPUkQsRFdPUkQsSEFORExFMzIpOwogI2RlZmluZSAgICBDcmVhdGVGaWxlIFdJTkVMSUJfTkFNRV9BVyhDcmVhdGVGaWxlKQpAQCAtNDczMCw2ICs0Nzc5LDE1IEBACiBJTlQzMiAgICAgIEVudW1Qcm9wc0V4MzJBKEhXTkQzMixQUk9QRU5VTVBST0NFWDMyQSxMUEFSQU0pOwogSU5UMzIgICAgICBFbnVtUHJvcHNFeDMyVyhIV05EMzIsUFJPUEVOVU1QUk9DRVgzMlcsTFBBUkFNKTsKICNkZWZpbmUgICAgRW51bVByb3BzRXggV0lORUxJQl9OQU1FX0FXKEVudW1Qcm9wc0V4KQorQk9PTDMyICAgICBFbnVtUmVzb3VyY2VMYW5ndWFnZXMzMkEoSE1PRFVMRTMyLExQQ1NUUixMUENTVFIsRU5VTVJFU0xBTkdQUk9DMzJBLExPTkcpOworQk9PTDMyICAgICBFbnVtUmVzb3VyY2VMYW5ndWFnZXMzMlcoSE1PRFVMRTMyLExQQ1dTVFIsTFBDV1NUUixFTlVNUkVTTEFOR1BST0MzMlcsTE9ORyk7CisjZGVmaW5lICAgIEVudW1SZXNvdXJjZUxhbmd1YWdlcyBXSU5FTElCX05BTUVfQVcoRW51bVJlc291cmNlTGFuZ3VhZ2VzKQorQk9PTDMyICAgICBFbnVtUmVzb3VyY2VOYW1lczMyQShITU9EVUxFMzIsTFBDU1RSLEVOVU1SRVNOQU1FUFJPQzMyQSxMT05HKTsKK0JPT0wzMiAgICAgRW51bVJlc291cmNlTmFtZXMzMlcoSE1PRFVMRTMyLExQQ1dTVFIsRU5VTVJFU05BTUVQUk9DMzJXLExPTkcpOworI2RlZmluZSAgICBFbnVtUmVzb3VyY2VOYW1lcyBXSU5FTElCX05BTUVfQVcoRW51bVJlc291cmNlTmFtZXMpCitCT09MMzIgICAgIEVudW1SZXNvdXJjZVR5cGVzMzJBKEhNT0RVTEUzMixFTlVNUkVTVFlQRVBST0MzMkEsTE9ORyk7CitCT09MMzIgICAgIEVudW1SZXNvdXJjZVR5cGVzMzJXKEhNT0RVTEUzMixFTlVNUkVTVFlQRVBST0MzMlcsTE9ORyk7CisjZGVmaW5lICAgIEVudW1SZXNvdXJjZVR5cGVzIFdJTkVMSUJfTkFNRV9BVyhFbnVtUmVzb3VyY2VUeXBlcykKIEJPT0wzMiAgICAgRW51bVN5c3RlbUNvZGVQYWdlczMyQShDT0RFUEFHRV9FTlVNUFJPQzMyQSxEV09SRCk7CiBCT09MMzIgICAgIEVudW1TeXN0ZW1Db2RlUGFnZXMzMlcoQ09ERVBBR0VfRU5VTVBST0MzMlcsRFdPUkQpOwogI2RlZmluZSAgICBFbnVtU3lzdGVtQ29kZVBhZ2VzIFdJTkVMSUJfTkFNRV9BVyhFbnVtU3lzdGVtQ29kZVBhZ2VzKQpAQCAtNDc4Nyw2ICs0ODQ1LDcgQEAKIFZPSUQgICAgICAgR2V0U3lzdGVtVGltZShMUFNZU1RFTVRJTUUpOwogTENJRCAgICAgICBHZXRUaHJlYWRMb2NhbGUoKTsKIElOVDMyICAgICAgR2V0VGhyZWFkUHJpb3JpdHkoSEFORExFMzIpOworRFdPUkQgICAgICBHZXRXaW5kb3dUaHJlYWRQcm9jZXNzSWQoSFdORDMyLExQRFdPUkQpOwogVk9JRCAgICAgICBHbG9iYWxNZW1vcnlTdGF0dXMoTFBNRU1PUllTVEFUVVMpOwogTFBWT0lEICAgICBIZWFwQWxsb2MoSEFORExFMzIsRFdPUkQsRFdPUkQpOwogRFdPUkQgICAgICBIZWFwQ29tcGFjdChIQU5ETEUzMixEV09SRCk7CkBAIC00ODAzLDYgKzQ4NjIsOSBAQAogQk9PTDMyICAgICBJc1ZhbGlkTG9jYWxlKERXT1JELERXT1JEKTsKIEJPT0wzMiAgICAgTG9jYWxGaWxlVGltZVRvRmlsZVRpbWUoY29uc3QgRklMRVRJTUUqLExQRklMRVRJTUUpOwogTFBWT0lEICAgICBNYXBWaWV3T2ZGaWxlRXgoSEFORExFMzIsRFdPUkQsRFdPUkQsRFdPUkQsRFdPUkQsRFdPUkQpOworSU5UMzIgICAgICBNZXNzYWdlQm94RXgzMkEoSFdORDMyLExQQ1NUUixMUENTVFIsVUlOVDMyLFdPUkQpOworSU5UMzIgICAgICBNZXNzYWdlQm94RXgzMlcoSFdORDMyLExQQ1dTVFIsTFBDV1NUUixVSU5UMzIsV09SRCk7CisjZGVmaW5lICAgIE1lc3NhZ2VCb3hFeCBXSU5FTElCX05BTUVfQVcoTWVzc2FnZUJveEV4KQogQk9PTDMyICAgICBNb3ZlRmlsZTMyQShMUENTVFIsTFBDU1RSKTsKIEJPT0wzMiAgICAgTW92ZUZpbGUzMlcoTFBDV1NUUixMUENXU1RSKTsKICNkZWZpbmUgICAgTW92ZUZpbGUgV0lORUxJQl9OQU1FX0FXKE1vdmVGaWxlKQpAQCAtNDg4Myw2ICs0OTQ1LDcgQEAKIExPTkcgICAgICAgR2V0Qml0bWFwQml0cyhIQklUTUFQMzIsTE9ORyxMUFZPSUQpOwogV09SRCAgICAgICBHZXRDbGFzc1dvcmQoSFdORDMyLElOVDMyKTsKIERXT1JEICAgICAgR2V0RGlhbG9nQmFzZVVuaXRzKHZvaWQpOworVk9JRCAgICAgICBHZXRLZXlib2FyZFN0YXRlKExQQllURSk7CiBEV09SRCAgICAgIEdldExhc3RFcnJvcih2b2lkKTsKIERXT1JEICAgICAgR2V0TWVudUNoZWNrTWFya0RpbWVuc2lvbnModm9pZCk7CiBDT0xPUlJFRiAgIEdldFN5c0NvbG9yKElOVDMyKTsKQEAgLTQ4OTEsNyArNDk1NCw4IEBACiBXT1JEICAgICAgIEdldFdpbmRvd1dvcmQoSFdORDMyLElOVDMyKTsKIEJPT0wxNiAgICAgSGlkZUNhcmV0KEhXTkQzMik7CiBCT09MMTYgICAgIElzV2luZG93KEhXTkQzMik7Ci12b2lkICAgICAgIExaRG9uZSh2b2lkKTsKK1ZPSUQgICAgICAgTFpEb25lKHZvaWQpOworRFdPUkQgICAgICBPZW1LZXlTY2FuKFdPUkQpOwogVUlOVDE2ICAgICBSZWFsaXplUGFsZXR0ZShIREMzMik7CiBEV09SRCAgICAgIFJlZ0Nsb3NlS2V5KEhLRVkpOwogRFdPUkQgICAgICBSZWdGbHVzaEtleShIS0VZKTsKQEAgLTQ5MDEsNiArNDk2NSw3IEBACiBCT09MMTYgICAgIFNldENhcmV0QmxpbmtUaW1lKFVJTlQzMik7CiBCT09MMTYgICAgIFNldENhcmV0UG9zKElOVDMyLElOVDMyKTsKIFdPUkQgICAgICAgU2V0Q2xhc3NXb3JkKEhXTkQzMixJTlQzMixXT1JEKTsKK1ZPSUQgICAgICAgU2V0S2V5Ym9hcmRTdGF0ZShMUEJZVEUpOwogVk9JRCAgICAgICBTZXRMYXN0RXJyb3IoRFdPUkQpOwogVk9JRCAgICAgICBTZXRSZWN0UmduKEhSR04zMixJTlQzMixJTlQzMixJTlQzMixJTlQzMik7CiBDT0xPUlJFRiAgIFNldFRleHRDb2xvcihIREMzMixDT0xPUlJFRik7CkBAIC01NDE5LDYgKzU0ODQsOSBAQAogSFdORDE2ICAgICBHZXRBY3RpdmVXaW5kb3cxNih2b2lkKTsKIEhXTkQzMiAgICAgR2V0QWN0aXZlV2luZG93MzIodm9pZCk7CiAjZGVmaW5lICAgIEdldEFjdGl2ZVdpbmRvdyBXSU5FTElCX05BTUUoR2V0QWN0aXZlV2luZG93KQorV09SRCAgICAgICBHZXRBc3luY0tleVN0YXRlMTYoSU5UMTYpOworV09SRCAgICAgICBHZXRBc3luY0tleVN0YXRlMzIoSU5UMzIpOworI2RlZmluZSAgICBHZXRBc3luY0tleVN0YXRlIFdJTkVMSUJfTkFNRShHZXRBc3luY0tleVN0YXRlKQogQk9PTDE2ICAgICBHZXRCaXRtYXBEaW1lbnNpb25FeDE2KEhCSVRNQVAxNixMUFNJWkUxNik7CiBCT09MMzIgICAgIEdldEJpdG1hcERpbWVuc2lvbkV4MzIoSEJJVE1BUDMyLExQU0laRTMyKTsKICNkZWZpbmUgICAgR2V0Qml0bWFwRGltZW5zaW9uRXggV0lORUxJQl9OQU1FKEdldEJpdG1hcERpbWVuc2lvbkV4KQpAQCAtNTU0NCwxMCArNTYxMiwxNiBAQAogVUlOVDE2ICAgICBHZXRJbnRlcm5hbFdpbmRvd1BvczE2KEhXTkQxNixMUFJFQ1QxNixMUFBPSU5UMTYpOwogVUlOVDMyICAgICBHZXRJbnRlcm5hbFdpbmRvd1BvczMyKEhXTkQzMixMUFJFQ1QzMixMUFBPSU5UMzIpOwogI2RlZmluZSAgICBHZXRJbnRlcm5hbFdpbmRvd1BvcyBXSU5FTElCX05BTUUoR2V0SW50ZXJuYWxXaW5kb3dQb3MpCitJTlQxNiAgICAgIEdldEtleWJvYXJkVHlwZTE2KElOVDE2KTsKK0lOVDMyICAgICAgR2V0S2V5Ym9hcmRUeXBlMzIoSU5UMzIpOworI2RlZmluZSAgICBHZXRLZXlib2FyZFR5cGUgV0lORUxJQl9OQU1FKEdldEtleWJvYXJkVHlwZSkKIElOVDE2ICAgICAgR2V0S2V5TmFtZVRleHQxNihMT05HLExQU1RSLElOVDE2KTsKIElOVDMyICAgICAgR2V0S2V5TmFtZVRleHQzMkEoTE9ORyxMUFNUUixJTlQzMik7CiBJTlQzMiAgICAgIEdldEtleU5hbWVUZXh0MzJXKExPTkcsTFBXU1RSLElOVDMyKTsKICNkZWZpbmUgICAgR2V0S2V5TmFtZVRleHQgV0lORUxJQl9OQU1FX0FXKEdldEtleU5hbWVUZXh0KQorV09SRCAgICAgICBHZXRLZXlTdGF0ZTE2KElOVDE2KTsKK1dPUkQgICAgICAgR2V0S2V5U3RhdGUzMihJTlQzMik7CisjZGVmaW5lICAgIEdldEtleVN0YXRlIFdJTkVMSUJfTkFNRShHZXRLZXlTdGF0ZSkKIFVJTlQzMiAgICAgR2V0TG9naWNhbERyaXZlU3RyaW5nczMyQShVSU5UMzIsTFBTVFIpOwogVUlOVDMyICAgICBHZXRMb2dpY2FsRHJpdmVTdHJpbmdzMzJXKFVJTlQzMixMUFdTVFIpOwogI2RlZmluZSAgICBHZXRMb2dpY2FsRHJpdmVTdHJpbmdzIFdJTkVMSUJfTkFNRV9BVyhHZXRMb2dpY2FsRHJpdmVTdHJpbmdzKQpAQCAtNTk3OSw2ICs2MDUzLDEwIEBACiBMT05HICAgICAgIExaU2VlazE2KEhGSUxFMTYsTE9ORyxJTlQxNik7CiBMT05HICAgICAgIExaU2VlazMyKEhGSUxFMzIsTE9ORyxJTlQzMik7CiAjZGVmaW5lICAgIExaU2VlayBXSU5FTElCX05BTUUoTFpTZWVrKQorVUlOVDE2ICAgICBNYXBWaXJ0dWFsS2V5MTYoVUlOVDE2LFVJTlQxNik7CitVSU5UMzIgICAgIE1hcFZpcnR1YWxLZXkzMkEoVUlOVDMyLFVJTlQzMik7CitVSU5UMzIgICAgIE1hcFZpcnR1YWxLZXkzMlcoVUlOVDMyLFVJTlQzMik7CisjZGVmaW5lICAgIE1hcFZpcnR1YWxLZXkgV0lORUxJQl9OQU1FX0FXKE1hcFZpcnR1YWxLZXkpCiBGQVJQUk9DMTYgIE1ha2VQcm9jSW5zdGFuY2UxNihGQVJQUk9DMTYsSEFORExFMTYpOwogI2RlZmluZSAgICBNYWtlUHJvY0luc3RhbmNlMzIocHJvYyxpbnN0KSAocHJvYykKICNkZWZpbmUgICAgTWFrZVByb2NJbnN0YW5jZSBXSU5FTElCX05BTUUoTWFrZVByb2NJbnN0YW5jZSkKQEAgLTYyMjcsNiArNjMwNSwxMCBAQAogSU5UMTYgICAgICBTZXRDb21tU3RhdGUxNihMUERDQjE2KTsKIEJPT0wzMiAgICAgU2V0Q29tbVN0YXRlMzIoSU5UMzIsTFBEQ0IzMik7CiAjZGVmaW5lICAgIFNldENvbW1TdGF0ZSBXSU5FTElCX05BTUUoU2V0Q29tbVN0YXRlKQorQk9PTDE2ICAgICBTZXRDdXJyZW50RGlyZWN0b3J5MTYoTFBDU1RSKTsKK0JPT0wzMiAgICAgU2V0Q3VycmVudERpcmVjdG9yeTMyQShMUENTVFIpOworQk9PTDMyICAgICBTZXRDdXJyZW50RGlyZWN0b3J5MzJXKExQQ1dTVFIpOworI2RlZmluZSAgICBTZXRDdXJyZW50RGlyZWN0b3J5IFdJTkVMSUJfTkFNRV9BVyhTZXRDdXJyZW50RGlyZWN0b3J5KQogQk9PTDE2ICAgICBTZXREZXNrV2FsbFBhcGVyMTYoTFBDU1RSKTsKIEJPT0wzMiAgICAgU2V0RGVza1dhbGxQYXBlcjMyKExQQ1NUUik7CiAjZGVmaW5lICAgIFNldERlc2tXYWxsUGFwZXIgV0lORUxJQl9OQU1FKFNldERlc2tXYWxsUGFwZXIpCkBAIC02MjQ1LDYgKzYzMjcsOSBAQAogdm9pZCAgICAgICBTZXREbGdJdGVtVGV4dDMyQShIV05EMzIsSU5UMzIsTFBDU1RSKTsKIHZvaWQgICAgICAgU2V0RGxnSXRlbVRleHQzMlcoSFdORDMyLElOVDMyLExQQ1dTVFIpOwogI2RlZmluZSAgICBTZXREbGdJdGVtVGV4dCBXSU5FTElCX05BTUVfQVcoU2V0RGxnSXRlbVRleHQpCitVSU5UMTYgICAgIFNldEVycm9yTW9kZTE2KFVJTlQxNik7CitVSU5UMzIgICAgIFNldEVycm9yTW9kZTMyKFVJTlQzMik7CisjZGVmaW5lICAgIFNldEVycm9yTW9kZSBXSU5FTElCX05BTUUoU2V0RXJyb3JNb2RlKQogQk9PTDE2ICAgICBTZXRGaWxlQXR0cmlidXRlczE2KExQQ1NUUixEV09SRCk7CiBCT09MMzIgICAgIFNldEZpbGVBdHRyaWJ1dGVzMzJBKExQQ1NUUixEV09SRCk7CiBCT09MMzIgICAgIFNldEZpbGVBdHRyaWJ1dGVzMzJXKExQQ1dTVFIsRFdPUkQpOwpAQCAtNjM2Niw2ICs2NDUxLDkgQEAKIEJPT0wxNiAgICAgU2hvd1dpbmRvdzE2KEhXTkQxNixJTlQxNik7CiBCT09MMzIgICAgIFNob3dXaW5kb3czMihIV05EMzIsSU5UMzIpOwogI2RlZmluZSAgICBTaG93V2luZG93IFdJTkVMSUJfTkFNRShTaG93V2luZG93KQorRFdPUkQgICAgICBTaXplb2ZSZXNvdXJjZTE2KEhNT0RVTEUxNixIUlNSQzE2KTsKK0RXT1JEICAgICAgU2l6ZW9mUmVzb3VyY2UzMihITU9EVUxFMzIsSFJTUkMzMik7CisjZGVmaW5lICAgIFNpemVvZlJlc291cmNlIFdJTkVMSUJfTkFNRShTaXplb2ZSZXNvdXJjZSkKIEJPT0wxNiAgICAgU3RyZXRjaEJsdDE2KEhEQzE2LElOVDE2LElOVDE2LElOVDE2LElOVDE2LEhEQzE2LElOVDE2LElOVDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgSU5UMTYsSU5UMTYsRFdPUkQpOwogQk9PTDMyICAgICBTdHJldGNoQmx0MzIoSERDMzIsSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIsSERDMzIsSU5UMzIsSU5UMzIsCkBAIC02Mzg3LDkgKzY0NzUsMTUgQEAKIEJPT0wzMiAgICAgVGV4dE91dDMyQShIREMzMixJTlQzMixJTlQzMixMUENTVFIsSU5UMzIpOwogQk9PTDMyICAgICBUZXh0T3V0MzJXKEhEQzMyLElOVDMyLElOVDMyLExQQ1dTVFIsSU5UMzIpOwogI2RlZmluZSAgICBUZXh0T3V0IFdJTkVMSUJfTkFNRV9BVyhUZXh0T3V0KQorSU5UMTYgICAgICBUb0FzY2lpMTYoVUlOVDE2LFVJTlQxNixMUEJZVEUsTFBWT0lELFVJTlQxNik7CitJTlQzMiAgICAgIFRvQXNjaWkzMihVSU5UMzIsVUlOVDMyLExQQllURSxMUFdPUkQsVUlOVDMyKTsKKyNkZWZpbmUgICAgVG9Bc2NpaSBXSU5FTElCX05BTUUoVG9Bc2NpaSkKIEJPT0wxNiAgICAgVHJhY2tQb3B1cE1lbnUxNihITUVOVTE2LFVJTlQxNixJTlQxNixJTlQxNixJTlQxNixIV05EMTYsY29uc3QgUkVDVDE2Kik7CiBCT09MMzIgICAgIFRyYWNrUG9wdXBNZW51MzIoSE1FTlUzMixVSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIsSFdORDMyLGNvbnN0IFJFQ1QzMiopOwogI2RlZmluZSAgICBUcmFja1BvcHVwTWVudSBXSU5FTElCX05BTUUoVHJhY2tQb3B1cE1lbnUpCitJTlQxNiAgICAgIFRyYW5zbGF0ZUFjY2VsZXJhdG9yMTYoSFdORDE2LEhBQ0NFTDE2LExQTVNHMTYpOworSU5UMzIgICAgICBUcmFuc2xhdGVBY2NlbGVyYXRvcjMyKEhXTkQzMixIQUNDRUwzMixMUE1TRzMyKTsKKyNkZWZpbmUgICAgVHJhbnNsYXRlQWNjZWxlcmF0b3IgV0lORUxJQl9OQU1FKFRyYW5zbGF0ZUFjY2VsZXJhdG9yKQogSU5UMTYgICAgICBUcmFuc21pdENvbW1DaGFyMTYoSU5UMTYsQ0hBUik7CiBCT09MMzIgICAgIFRyYW5zbWl0Q29tbUNoYXIzMihJTlQzMixDSEFSKTsKICNkZWZpbmUgICAgVHJhbnNtaXRDb21tQ2hhciBXSU5FTElCX05BTUUoVHJhbnNtaXRDb21tQ2hhcikKQEAgLTY0MzQsNiArNjUyOCwxMCBAQAogRFdPUkQgICAgICBWZXJRdWVyeVZhbHVlMzJBKExQVk9JRCxMUENTVFIsTFBWT0lEKixVSU5UMzIqKTsKIERXT1JEICAgICAgVmVyUXVlcnlWYWx1ZTMyVyhMUFZPSUQsTFBDV1NUUixMUFZPSUQqLFVJTlQzMiopOwogI2RlZmluZSAgICBWZXJRdWVyeVZhbHVlIFdJTkVMSUJfTkFNRV9BVyhWZXJRdWVyeVZhbHVlKQorV09SRCAgICAgICBWa0tleVNjYW4xNihDSEFSKTsKK1dPUkQgICAgICAgVmtLZXlTY2FuMzJBKENIQVIpOworV09SRCAgICAgICBWa0tleVNjYW4zMlcoV0NIQVIpOworI2RlZmluZSAgICBWa0tleVNjYW4gV0lORUxJQl9OQU1FX0FXKFZrS2V5U2NhbikKIEhXTkQxNiAgICAgV2luZG93RnJvbURDMTYoSERDMTYpOwogSFdORDMyICAgICBXaW5kb3dGcm9tREMzMihIREMzMik7CiAjZGVmaW5lICAgIFdpbmRvd0Zyb21EQyBXSU5FTElCX05BTUUoV2luZG93RnJvbURDKQpAQCAtNjUyOSw2ICs2NjI3LDcgQEAKIElOVDMyICAgICAgTG9hZE1lc3NhZ2UzMkEoSElOU1RBTkNFMzIsVUlOVDMyLFdPUkQsTFBTVFIsSU5UMzIpOwogSU5UMzIgICAgICBMb2FkTWVzc2FnZTMyVyhISU5TVEFOQ0UzMixVSU5UMzIsV09SRCxMUFdTVFIsSU5UMzIpOwogU0VHUFRSICAgICBXSU4xNl9HbG9iYWxMb2NrMTYoSEdMT0JBTDE2KTsKK1NFR1BUUiAgICAgV0lOMTZfTG9ja1Jlc291cmNlKEhHTE9CQUwxNik7CiBJTlQzMiAgICAgIGxzdHJuY21wMzJBKExQQ1NUUixMUENTVFIsSU5UMzIpOwogSU5UMzIgICAgICBsc3RybmNtcDMyVyhMUENXU1RSLExQQ1dTVFIsSU5UMzIpOwogSU5UMzIgICAgICBsc3RybmNtcGkzMkEoTFBDU1RSLExQQ1NUUixJTlQzMik7CkBAIC02NjA0LDcgKzY3MDMsNiBAQAogVUlOVCAgICAgICBHRElSZWFsaXplUGFsZXR0ZShIREMxNik7CiBIUEFMRVRURTE2IEdESVNlbGVjdFBhbGV0dGUoSERDMTYsSFBBTEVUVEUxNixXT1JEKTsKIERXT1JEICAgICAgR2V0QXNwZWN0UmF0aW9GaWx0ZXIoSERDMTYpOwotaW50ICAgICAgICBHZXRBc3luY0tleVN0YXRlKGludCk7CiBXT1JEICAgICAgIEdldEF0b21OYW1lKEFUT00sTFBTVFIsc2hvcnQpOwogSEFORExFMTYgICBHZXRDbGlwYm9hcmREYXRhKFdPUkQpOwogaW50ICAgICAgICBHZXRDbGlwYm9hcmRGb3JtYXROYW1lKFdPUkQsTFBTVFIsc2hvcnQpOwpAQCAtNjYyMiw5ICs2NzIwLDYgQEAKIEJPT0wgICAgICAgR2V0SW5wdXRTdGF0ZSh2b2lkKTsKIGludCAgICAgICAgR2V0S0JDb2RlUGFnZSh2b2lkKTsKIGludCAgICAgICAgR2V0S2VybmluZ1BhaXJzKEhEQzE2LGludCxMUEtFUk5JTkdQQUlSMTYpOwotSU5UICAgICAgICBHZXRLZXlTdGF0ZShJTlQpOwotdm9pZCAgICAgICBHZXRLZXlib2FyZFN0YXRlKEJZVEUqKTsKLWludCAgICAgICAgR2V0S2V5Ym9hcmRUeXBlKGludCk7CiBIV05EICAgICAgIEdldExhc3RBY3RpdmVQb3B1cChIV05EKTsKIEJPT0wgICAgICAgR2V0TWVzc2FnZShTRUdQVFIsSFdORCxVSU5ULFVJTlQpOwogTE9ORyAgICAgICBHZXRNZXNzYWdlRXh0cmFJbmZvKHZvaWQpOwpAQCAtNjY0OSw3ICs2NzQ0LDYgQEAKIExQSU5UMTYgICAgR2V0VGhyZXNob2xkRXZlbnQodm9pZCk7CiBpbnQgICAgICAgIEdldFRocmVzaG9sZFN0YXR1cyh2b2lkKTsKIEJPT0wgICAgICAgR2V0V2luRGVidWdJbmZvKExQV0lOREVCVUdJTkZPLFVJTlQpOwotTE9ORyAgICAgICBHZXRXaW5GbGFncyh2b2lkKTsKIEFUT00gICAgICAgR2xvYmFsRGVsZXRlQXRvbShBVE9NKTsKIHZvaWQgICAgICAgR2xvYmFsRml4KEhHTE9CQUwxNik7CiBCT09MMTYgICAgIEdsb2JhbFVuV2lyZShIR0xPQkFMMTYpOwpAQCAtNjY2Myw5ICs2NzU3LDcgQEAKIEJPT0wgICAgICAgSXNWYWxpZE1ldGFGaWxlKEhNRVRBRklMRTE2KTsKIEhJTlNUQU5DRTE2IExvYWRNb2R1bGUoTFBDU1RSLExQVk9JRCk7CiBGQVJQUk9DMTYgIExvY2FsTm90aWZ5KEZBUlBST0MxNik7Ci1XT1JEICAgICAgIE1hcFZpcnR1YWxLZXkoV09SRCxXT1JEKTsKIHZvaWQgICAgICAgTWVzc2FnZUJlZXAoV09SRCk7Ci1EV09SRCAgICAgIE9lbUtleVNjYW4oV09SRCk7CiBCT09MICAgICAgIE9wZW5DbGlwYm9hcmQoSFdORCk7CiBCT09MICAgICAgIE9wZW5JY29uKEhXTkQpOwogaW50ICAgICAgICBPcGVuU291bmQodm9pZCk7CkBAIC02NjkyLDE0ICs2Nzg0LDExIEBACiBIV05EICAgICAgIFNldENsaXBib2FyZFZpZXdlcihIV05EKTsKIHZvaWQgICAgICAgU2V0Q29udmVydEhvb2soQk9PTCk7CiBCT09MICAgICAgIFNldENvbnZlcnRQYXJhbXMoaW50LGludCk7Ci1CT09MMzIgICAgIFNldEN1cnJlbnREaXJlY3RvcnkoTFBDU1RSKTsKIEhDVVJTT1IxNiAgU2V0Q3Vyc29yKEhDVVJTT1IxNik7CiB2b2lkICAgICAgIFNldEN1cnNvclBvcyhzaG9ydCxzaG9ydCk7CiB2b2lkICAgICAgIFNldERvdWJsZUNsaWNrVGltZShXT1JEKTsKIGludCAgICAgICAgU2V0RW52aXJvbm1lbnQoTFBDU1RSLExQQ1NUUixXT1JEKTsKLVVJTlQgICAgICAgU2V0RXJyb3JNb2RlKFVJTlQpOwogV09SRCAgICAgICBTZXRIb29rRmxhZ3MoSERDMTYsV09SRCk7Ci12b2lkICAgICAgIFNldEtleWJvYXJkU3RhdGUoQllURSopOwogRFdPUkQgICAgICBTZXRNYXBwZXJGbGFncyhIREMxNixEV09SRCk7CiBCT09MICAgICAgIFNldE1lc3NhZ2VRdWV1ZShpbnQpOwogSE1FVEFGSUxFMTYgU2V0TWV0YUZpbGVCaXRzKEhHTE9CQUwxNik7CkBAIC02NzE5LDIwICs2ODA4LDE1IEBACiBISU5TVEFOQ0UxNiBTaGVsbEV4ZWN1dGUoSFdORCxMUENTVFIsTFBDU1RSLExQU1RSLExQQ1NUUixJTlQpOwogaW50ICAgICAgICBTaG93Q3Vyc29yKEJPT0wpOwogdm9pZCAgICAgICBTaG93T3duZWRQb3B1cHMoSFdORCxCT09MKTsKLURXT1JEICAgICAgU2l6ZW9mUmVzb3VyY2UoSE1PRFVMRTE2LEhSU1JDMTYpOwogaW50ICAgICAgICBTdGFydFNvdW5kKHZvaWQpOwogaW50ICAgICAgICBTdG9wU291bmQodm9pZCk7CiBCT09MICAgICAgIFN3YXBNb3VzZUJ1dHRvbihCT09MKTsKIHZvaWQgICAgICAgU3dhcFJlY29yZGluZyhXT1JEKTsKIGludCAgICAgICAgU3luY0FsbFZvaWNlcyh2b2lkKTsKIExPTkcgICAgICAgVGFiYmVkVGV4dE91dChIREMxNixzaG9ydCxzaG9ydCxMUFNUUixzaG9ydCxzaG9ydCxMUElOVDE2LHNob3J0KTsKLWludCAgICAgICAgVG9Bc2NpaShXT1JELFdPUkQsTFBTVFIsTFBWT0lELFdPUkQpOwotSU5UMTYgICAgICBUcmFuc2xhdGVBY2NlbGVyYXRvcihIV05ELEhBQ0NFTDE2LExQTVNHMTYpOwogQk9PTCAgICAgICBUcmFuc2xhdGVNRElTeXNBY2NlbChIV05ELExQTVNHMTYpOwogQk9PTCAgICAgICBUcmFuc2xhdGVNZXNzYWdlKExQTVNHMTYpOwogaW50ICAgICAgICBVcGRhdGVDb2xvcnMoSERDMTYpOwotV09SRCAgICAgICBWa0tleVNjYW4oV09SRCk7Ci1TRUdQVFIgICAgIFdJTjE2X0xvY2tSZXNvdXJjZShIR0xPQkFMMTYpOwogdm9pZCAgICAgICBXYWl0TWVzc2FnZSh2b2lkKTsKIGludCAgICAgICAgV2FpdFNvdW5kU3RhdGUoaW50KTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW5udC5oIGIvaW5jbHVkZS93aW5udC5oCmluZGV4IDU1YTk2YTguLjRiZDczODcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2lubnQuaAorKysgYi9pbmNsdWRlL3dpbm50LmgKQEAgLTEzOSw2ICsxMzksMTI2IEBACiAKICNlbmRpZiAgLyogX19XSU5FX18gKi8KIAorLyoKKyAqIEV4Y2VwdGlvbiBjb2RlcworICovCisgCisjZGVmaW5lIFNUQVRVU19XQUlUXzAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgU1RBVFVTX0FCQU5ET05FRF9XQUlUXzAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBTVEFUVVNfVVNFUl9BUEMgICAgICAgICAgICAgICAgICAweDAwMDAwMEMwCisjZGVmaW5lIFNUQVRVU19USU1FT1VUICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDIKKyNkZWZpbmUgU1RBVFVTX1BFTkRJTkcgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMworI2RlZmluZSBTVEFUVVNfREFUQVRZUEVfTUlTQUxJR05NRU5UICAgICAweDgwMDAwMDAyCisjZGVmaW5lIFNUQVRVU19CUkVBS1BPSU5UICAgICAgICAgICAgICAgIDB4ODAwMDAwMDMKKyNkZWZpbmUgU1RBVFVTX1NJTkdMRV9TVEVQICAgICAgICAgICAgICAgMHg4MDAwMDAwNAorI2RlZmluZSBTVEFUVVNfQUNDRVNTX1ZJT0xBVElPTiAgICAgICAgICAweEMwMDAwMDA1CisjZGVmaW5lIFNUQVRVU19JTl9QQUdFX0VSUk9SICAgICAgICAgICAgIDB4QzAwMDAwMDYKKyNkZWZpbmUgU1RBVFVTX05PX01FTU9SWSAgICAgICAgICAgICAgICAgMHhDMDAwMDAxNworI2RlZmluZSBTVEFUVVNfSUxMRUdBTF9JTlNUUlVDVElPTiAgICAgICAweEMwMDAwMDFECisjZGVmaW5lIFNUQVRVU19OT05DT05USU5VQUJMRV9FWENFUFRJT04gIDB4QzAwMDAwMjUKKyNkZWZpbmUgU1RBVFVTX0lOVkFMSURfRElTUE9TSVRJT04gICAgICAgMHhDMDAwMDAyNgorI2RlZmluZSBTVEFUVVNfQVJSQVlfQk9VTkRTX0VYQ0VFREVEICAgICAweEMwMDAwMDhDCisjZGVmaW5lIFNUQVRVU19GTE9BVF9ERU5PUk1BTF9PUEVSQU5EICAgIDB4QzAwMDAwOEQKKyNkZWZpbmUgU1RBVFVTX0ZMT0FUX0RJVklERV9CWV9aRVJPICAgICAgMHhDMDAwMDA4RQorI2RlZmluZSBTVEFUVVNfRkxPQVRfSU5FWEFDVF9SRVNVTFQgICAgICAweEMwMDAwMDhGCisjZGVmaW5lIFNUQVRVU19GTE9BVF9JTlZBTElEX09QRVJBVElPTiAgIDB4QzAwMDAwOTAKKyNkZWZpbmUgU1RBVFVTX0ZMT0FUX09WRVJGTE9XICAgICAgICAgICAgMHhDMDAwMDA5MQorI2RlZmluZSBTVEFUVVNfRkxPQVRfU1RBQ0tfQ0hFQ0sgICAgICAgICAweEMwMDAwMDkyCisjZGVmaW5lIFNUQVRVU19GTE9BVF9VTkRFUkZMT1cgICAgICAgICAgIDB4QzAwMDAwOTMKKyNkZWZpbmUgU1RBVFVTX0lOVEVHRVJfRElWSURFX0JZX1pFUk8gICAgMHhDMDAwMDA5NAorI2RlZmluZSBTVEFUVVNfSU5URUdFUl9PVkVSRkxPVyAgICAgICAgICAweEMwMDAwMDk1CisjZGVmaW5lIFNUQVRVU19QUklWSUxFR0VEX0lOU1RSVUNUSU9OICAgIDB4QzAwMDAwOTYKKyNkZWZpbmUgU1RBVFVTX1NUQUNLX09WRVJGTE9XICAgICAgICAgICAgMHhDMDAwMDBGRAorI2RlZmluZSBTVEFUVVNfQ09OVFJPTF9DX0VYSVQgICAgICAgICAgICAweEMwMDAwMTNBCisKKyNkZWZpbmUgRVhDRVBUSU9OX0FDQ0VTU19WSU9MQVRJT04gICAgICBTVEFUVVNfQUNDRVNTX1ZJT0xBVElPTgorI2RlZmluZSBFWENFUFRJT05fREFUQVRZUEVfTUlTQUxJR05NRU5UIFNUQVRVU19EQVRBVFlQRV9NSVNBTElHTk1FTlQKKyNkZWZpbmUgRVhDRVBUSU9OX0JSRUFLUE9JTlQgICAgICAgICAgICBTVEFUVVNfQlJFQUtQT0lOVAorI2RlZmluZSBFWENFUFRJT05fU0lOR0xFX1NURVAgICAgICAgICAgIFNUQVRVU19TSU5HTEVfU1RFUAorI2RlZmluZSBFWENFUFRJT05fQVJSQVlfQk9VTkRTX0VYQ0VFREVEIFNUQVRVU19BUlJBWV9CT1VORFNfRVhDRUVERUQKKyNkZWZpbmUgRVhDRVBUSU9OX0ZMVF9ERU5PUk1BTF9PUEVSQU5EICBTVEFUVVNfRkxPQVRfREVOT1JNQUxfT1BFUkFORAorI2RlZmluZSBFWENFUFRJT05fRkxUX0RJVklERV9CWV9aRVJPICAgIFNUQVRVU19GTE9BVF9ESVZJREVfQllfWkVSTworI2RlZmluZSBFWENFUFRJT05fRkxUX0lORVhBQ1RfUkVTVUxUICAgIFNUQVRVU19GTE9BVF9JTkVYQUNUX1JFU1VMVAorI2RlZmluZSBFWENFUFRJT05fRkxUX0lOVkFMSURfT1BFUkFUSU9OIFNUQVRVU19GTE9BVF9JTlZBTElEX09QRVJBVElPTgorI2RlZmluZSBFWENFUFRJT05fRkxUX09WRVJGTE9XICAgICAgICAgIFNUQVRVU19GTE9BVF9PVkVSRkxPVworI2RlZmluZSBFWENFUFRJT05fRkxUX1NUQUNLX0NIRUNLICAgICAgIFNUQVRVU19GTE9BVF9TVEFDS19DSEVDSworI2RlZmluZSBFWENFUFRJT05fRkxUX1VOREVSRkxPVyAgICAgICAgIFNUQVRVU19GTE9BVF9VTkRFUkZMT1cKKyNkZWZpbmUgRVhDRVBUSU9OX0lOVF9ESVZJREVfQllfWkVSTyAgICBTVEFUVVNfSU5URUdFUl9ESVZJREVfQllfWkVSTworI2RlZmluZSBFWENFUFRJT05fSU5UX09WRVJGTE9XICAgICAgICAgIFNUQVRVU19JTlRFR0VSX09WRVJGTE9XCisjZGVmaW5lIEVYQ0VQVElPTl9QUklWX0lOU1RSVUNUSU9OICAgICAgU1RBVFVTX1BSSVZJTEVHRURfSU5TVFJVQ1RJT04KKyNkZWZpbmUgRVhDRVBUSU9OX0lOX1BBR0VfRVJST1IgICAgICAgICBTVEFUVVNfSU5fUEFHRV9FUlJPUgorCisvKgorICogUmV0dXJuIHZhbHVlcyBmcm9tIHRoZSBhY3R1YWwgZXhjZXB0aW9uIGhhbmRsZXJzCisgKi8KKworI2RlZmluZSBFeGNlcHRpb25Db250aW51ZUV4ZWN1dGlvbiAwCisjZGVmaW5lIEV4Y2VwdGlvbkNvbnRpbnVlU2VhcmNoICAgIDEKKyNkZWZpbmUgRXhjZXB0aW9uTmVzdGVkRXhjZXB0aW9uICAgMgorI2RlZmluZSBFeGNlcHRpb25Db2xsaWRlZFVud2luZCAgICAzCisgCisvKgorICogUmV0dXJuIHZhbHVlcyBmcm9tIGZpbHRlcnMgaW4gZXhjZXB0KCkgYW5kIGZyb20gVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyCisgKi8KKyAKKyNkZWZpbmUgRVhDRVBUSU9OX0VYRUNVVEVfSEFORExFUiAgICAgICAgMQorI2RlZmluZSBFWENFUFRJT05fQ09OVElOVUVfU0VBUkNIICAgICAgICAwCisjZGVmaW5lIEVYQ0VQVElPTl9DT05USU5VRV9FWEVDVVRJT04gICAgLTEKKworLyoKKyAqIEZyb20gT1MvMiAyLjAgZXhjZXB0aW9uIGhhbmRsaW5nCisgKiBXaW4zMiBzZWVtcyB0byB1c2UgdGhlIHNhbWUgZmxhZ3MgYXMgRXhjZXB0aW9uRmxhZ3MgaW4gYW4gRVhDRVBUSU9OX1JFQ09SRAorICovCisKKyNkZWZpbmUgRUhfTk9OQ09OVElOVUFCTEUgICAweDAxCisjZGVmaW5lIEVIX1VOV0lORElORyAgICAgICAgMHgwMgorI2RlZmluZSBFSF9FWElUX1VOV0lORCAgICAgIDB4MDQKKyNkZWZpbmUgRUhfU1RBQ0tfSU5WQUxJRCAgICAweDA4CisjZGVmaW5lIEVIX05FU1RFRF9DQUxMICAgICAgMHgxMAorCisjZGVmaW5lIEVYQ0VQVElPTl9DT05USU5VQUJMRSAgICAgICAgMAorI2RlZmluZSBFWENFUFRJT05fTk9OQ09OVElOVUFCTEUgICAgIEVIX05PTkNPTlRJTlVBQkxFCisgCisvKgorICogVGhlIGV4Y2VwdGlvbiByZWNvcmQgdXNlZCBieSBXaW4zMiB0byBnaXZlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gCisgKiBhYm91dCBleGNlcHRpb24gdG8gZXhjZXB0aW9uIGhhbmRsZXJzLgorICovCisKKyNkZWZpbmUgRVhDRVBUSU9OX01BWElNVU1fUEFSQU1FVEVSUyAxNQorCit0eXBlZGVmIHN0cnVjdCBfX0VYQ0VQVElPTl9SRUNPUkQKK3sKKyAgICBEV09SRCAgICBFeGNlcHRpb25Db2RlOworICAgIERXT1JEICAgIEV4Y2VwdGlvbkZsYWdzOworICAgIHN0cnVjdCBfX0VYQ0VQVElPTl9SRUNPUkQgKkV4Y2VwdGlvblJlY29yZDsKKworICAgIExQVk9JRCAgIEV4Y2VwdGlvbkFkZHJlc3M7CisgICAgRFdPUkQgICAgTnVtYmVyUGFyYW1ldGVyczsKKyAgICBEV09SRCAgICBFeGNlcHRpb25JbmZvcm1hdGlvbltFWENFUFRJT05fTUFYSU1VTV9QQVJBTUVURVJTXTsKK30gRVhDRVBUSU9OX1JFQ09SRCwgKlBFWENFUFRJT05fUkVDT1JEOworCisvKgorICogVGhlIGV4Y2VwdGlvbiBwb2ludGVycyBzdHJ1Y3R1cmUgcGFzc2VkIHRvIGV4Y2VwdGlvbiBmaWx0ZXJzCisgKiBpbiBleGNlcHQoKSBhbmQgdGhlIFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcigpLgorICovCisgCit0eXBlZGVmIHN0cnVjdCBfRVhDRVBUSU9OX1BPSU5URVJTIAoreworICBQRVhDRVBUSU9OX1JFQ09SRCAgRXhjZXB0aW9uUmVjb3JkOworICBQQ09OVEVYVCAgICAgICAgICAgQ29udGV4dFJlY29yZDsKK30gRVhDRVBUSU9OX1BPSU5URVJTLCAqUEVYQ0VQVElPTl9QT0lOVEVSUzsKKworLyoKKyAqIGZ1bmN0aW9uIHBvaW50ZXIgdG8gYSBleGNlcHRpb24gZmlsdGVyCisgKi8KKwordHlwZWRlZiBMT05HICgqUFRPUF9MRVZFTF9FWENFUFRJT05fRklMVEVSKShQRVhDRVBUSU9OX1BPSU5URVJTIEV4Y2VwdGlvbkluZm8pOwordHlwZWRlZiBQVE9QX0xFVkVMX0VYQ0VQVElPTl9GSUxURVIgTFBUT1BfTEVWRUxfRVhDRVBUSU9OX0ZJTFRFUjsKKworRFdPUkQgVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyKCBQRVhDRVBUSU9OX1BPSU5URVJTIGVwb2ludGVycyApOworTFBUT1BfTEVWRUxfRVhDRVBUSU9OX0ZJTFRFUgorU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyKCBMUFRPUF9MRVZFTF9FWENFUFRJT05fRklMVEVSIGZpbHRlciApOworCiAvKiBMYW5ndWFnZSBJRHMgKi8KIAogI2RlZmluZSBMQU5HX05FVVRSQUwgICAgICAgICAgICAgICAgICAgICAweDAwCmRpZmYgLS1naXQgYS9pbmNsdWRlL3gxMWRydi5oIGIvaW5jbHVkZS94MTFkcnYuaAppbmRleCAxMjc0NDFkLi5hMDg4MzFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL3gxMWRydi5oCisrKyBiL2luY2x1ZGUveDExZHJ2LmgKQEAgLTkwLDYgKzkwLDggQEAKIGV4dGVybiBCT09MMzIgWDExRFJWX1BvbHlQb2x5Z29uKCBzdHJ1Y3QgdGFnREMgKmRjLCBMUFBPSU5UMzIgcHQsCiAJCQkJICBMUElOVDMyIGNvdW50cywgVUlOVDMyIHBvbHlnb25zKTsKIAorZXh0ZXJuIEhHRElPQkozMiBYMTFEUlZfU2VsZWN0T2JqZWN0KCBzdHJ1Y3QgdGFnREMgKmRjLCBIR0RJT0JKMzIgaGFuZGxlICk7CisKIGV4dGVybiBCT09MMzIgWDExRFJWX0V4dEZsb29kRmlsbCggc3RydWN0IHRhZ0RDICpkYywgSU5UMzIgeCwgSU5UMzIgeSwKIAkJCQkgICBDT0xPUlJFRiBjb2xvciwgVUlOVDMyIGZpbGxUeXBlICk7CiBleHRlcm4gQk9PTDMyIFgxMURSVl9FeHRUZXh0T3V0KCBzdHJ1Y3QgdGFnREMgKmRjLCBJTlQzMiB4LCBJTlQzMiB5LApAQCAtOTcsNCArOTksMTAgQEAKIAkJCQkgTFBDU1RSIHN0ciwgVUlOVDMyIGNvdW50LCBjb25zdCBJTlQzMiAqbHBEeCApOwogCiAKKy8qIFgxMSBkcml2ZXIgaW50ZXJuYWwgZnVuY3Rpb25zICovCisKK2V4dGVybiBCT09MMzIgWDExRFJWX0JJVE1BUF9Jbml0KHZvaWQpOworZXh0ZXJuIEJPT0wzMiBYMTFEUlZfQlJVU0hfSW5pdCh2b2lkKTsKK2V4dGVybiBCT09MMzIgWDExRFJWX0ZPTlRfSW5pdCh2b2lkKTsKKwogI2VuZGlmICAvKiBfX1dJTkVfWDExRFJWX0ggKi8KZGlmZiAtLWdpdCBhL2xpYnJhcnkvbWlzY3N0dWJzLmMgYi9saWJyYXJ5L21pc2NzdHVicy5jCmluZGV4IDhiOTQ1NTQuLmE5OTg2YTQgMTAwNjQ0Ci0tLSBhL2xpYnJhcnkvbWlzY3N0dWJzLmMKKysrIGIvbGlicmFyeS9taXNjc3R1YnMuYwpAQCAtODQsNyArODQsMyBAQAogICByZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBERUJVR19FbnRlckRlYnVnZ2VyKHZvaWQpCi17Ci19Ci0KZGlmZiAtLWdpdCBhL2xvYWRlci9tYWluLmMgYi9sb2FkZXIvbWFpbi5jCmluZGV4IGY3OGVlNzguLjFjMWVlOWMgMTAwNjQ0Ci0tLSBhL2xvYWRlci9tYWluLmMKKysrIGIvbG9hZGVyL21haW4uYwpAQCAtNjEsNyArNjEsNiBAQAogICAgIGV4dGVybiBCT09MMzIgV0lOMTZEUlZfSW5pdCh2b2lkKTsKICAgICBleHRlcm4gQk9PTDMyIFNJR05BTF9Jbml0KHZvaWQpOwogICAgIGV4dGVybiBCT09MMzIgV0lER0VUU19Jbml0KHZvaWQpOwotICAgIGV4dGVybiBpbnQgS0VSTjMyX0luaXQodm9pZCk7CiAKICAgICBpbnQgcXVldWVTaXplOwogCkBAIC0xNDQsOSArMTQzLDYgQEAKICAgICAvKiBJbml0aWFsaXplIG1lc3NhZ2Ugc3B5aW5nICovCiAgICAgaWYgKCFTUFlfSW5pdCgpKSByZXR1cm4gMDsKIAotICAgICAgLyogSW5pdGlhbGl6ZSBXaW4zMiBkYXRhIHN0cnVjdHVyZXMgKi8KLSAgICBpZiAoIUtFUk4zMl9Jbml0KCkpIHJldHVybiAwOwotCiAgICAgICAvKiBDcmVhdGUgc3lzdGVtIG1lc3NhZ2UgcXVldWUgKi8KICAgICBxdWV1ZVNpemUgPSBHZXRQcm9maWxlSW50MzJBKCAid2luZG93cyIsICJUeXBlQWhlYWQiLCAxMjAgKTsKICAgICBpZiAoIVFVRVVFX0NyZWF0ZVN5c01zZ1F1ZXVlKCBxdWV1ZVNpemUgKSkgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9sb2FkZXIvcGVfaW1hZ2UuYyBiL2xvYWRlci9wZV9pbWFnZS5jCmluZGV4IDlkNDgxNmMuLmQzMGIwOWIgMTAwNjQ0Ci0tLSBhL2xvYWRlci9wZV9pbWFnZS5jCisrKyBiL2xvYWRlci9wZV9pbWFnZS5jCkBAIC0xNyw5ICsxNyw2IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWZuZGVmIF9fRU1YX18KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2VuZGlmCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbmJhc2UuaCIKICNpbmNsdWRlICJjYWxsYmFjay5oIgpAQCAtNjUsMTQgKzYyLDE0IEBACiAgICAgICBpZiAoaTxwZV9leHBvcnRzLT5OdW1iZXJPZk5hbWVzKSB7CiAJICBlbmFtZT0oY2hhciopUlZBKCpuYW1lKyspOwogCSAgZHByaW50Zl93aW4zMihzdGRkZWIsIiUtMzJzICU0ZCAgICAlOC44bHggKCU4LjhseClcbiIsZW5hbWUsKm9yZGluYWwsZnVuY3Rpb25zWypvcmRpbmFsXSwqZnVuY3Rpb24pOwotCSAgc3ByaW50ZihidWZmZXIsIiVzLiVzIixNb2R1bGUsZW5hbWUpOworCSAgc3ByaW50ZihidWZmZXIsIiVzXyVzIixNb2R1bGUsZW5hbWUpOwogCSAgZGFkZHIub2ZmPVJWQShmdW5jdGlvbnNbKm9yZGluYWxdKTsKIAkgIG9yZGluYWwrKzsKIAkgIGZ1bmN0aW9uKys7CiAgICAgICB9IGVsc2UgewogICAgICAgCSAgLyogb3JkaW5hbHMvbmFtZXMgbm8gbG9uZ2VyIHZhbGlkLCBidXQgd2Ugc3RpbGwgZ290IGZ1bmN0aW9ucyAqLwogCSAgZHByaW50Zl93aW4zMihzdGRkZWIsIiUtMzJzICU0cyAgICAlOHMgJTguOGx4XG4iLCIiLCIiLCIiLCpmdW5jdGlvbik7Ci0JICBzcHJpbnRmKGJ1ZmZlciwiJXMuJWQiLE1vZHVsZSxpKTsKKwkgIHNwcmludGYoYnVmZmVyLCIlc18lZCIsTW9kdWxlLGkpOwogCSAgZGFkZHIub2ZmPVJWQSgqZnVuY3Rpb25zKTsKIAkgIGZ1bmN0aW9uKys7CiAgICAgICB9CkBAIC01NDEsNyArNTM4LDcgQEAKIAlpZiAocGUtPnBlX2V4cG9ydCkgewogCQkvKiBhZGQgc3RhcnQgb2Ygc2VjdGlvbnMgYXMgZGVidWdzeW1ib2xzICovCiAJCWZvcihpPTA7aTxwZS0+cGVfaGVhZGVyLT5GaWxlSGVhZGVyLk51bWJlck9mU2VjdGlvbnM7aSsrKSB7Ci0JCQlzcHJpbnRmKGJ1ZmZlciwiJXMuJXMiLAorCQkJc3ByaW50ZihidWZmZXIsIiVzXyVzIiwKIAkJCQkoY2hhciopUlZBKHBlLT5wZV9leHBvcnQtPk5hbWUpLAogCQkJCXBlLT5wZV9zZWdbaV0uTmFtZQogCQkJKTsKQEAgLTU0OSw3ICs1NDYsNyBAQAogCQkJREVCVUdfQWRkU3ltYm9sKGJ1ZmZlciwmZGFkZHIsIE5VTEwsIFNZTV9XSU4zMiB8IFNZTV9GVU5DKTsKIAkJfQogCQkvKiBhZGQgZW50cnkgcG9pbnQgKi8KLQkJc3ByaW50ZihidWZmZXIsIiVzLkVudHJ5UG9pbnQiLChjaGFyKilSVkEocGUtPnBlX2V4cG9ydC0+TmFtZSkpOworCQlzcHJpbnRmKGJ1ZmZlciwiJXNfRW50cnlQb2ludCIsKGNoYXIqKVJWQShwZS0+cGVfZXhwb3J0LT5OYW1lKSk7CiAJCWRhZGRyLm9mZj1SVkEocGUtPnBlX2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuQWRkcmVzc09mRW50cnlQb2ludCk7CiAJCURFQlVHX0FkZFN5bWJvbChidWZmZXIsJmRhZGRyLCBOVUxMLCBTWU1fV0lOMzIgfCBTWU1fRlVOQyk7CiAJCS8qIGFkZCBzdGFydCBvZiBETEwgKi8KZGlmZiAtLWdpdCBhL2xvYWRlci9wZV9yZXNvdXJjZS5jIGIvbG9hZGVyL3BlX3Jlc291cmNlLmMKaW5kZXggN2M3ZTZhZi4uMDg2NTVkMCAxMDA2NDQKLS0tIGEvbG9hZGVyL3BlX3Jlc291cmNlLmMKKysrIGIvbG9hZGVyL3BlX3Jlc291cmNlLmMKQEAgLTgsOCArOCw3IEBACiAgKiBCYXNlZCBvbiB0aGUgV2luMTYgcmVzb3VyY2UgaGFuZGxpbmcgY29kZSBpbiBsb2FkZXIvcmVzb3VyY2UuYwogICogQ29weXJpZ2h0IDE5OTMgUm9iZXJ0IEouIEFtc3RhZHQKICAqIENvcHlyaWdodCAxOTk1IEFsZXhhbmRyZSBKdWxsaWFyZAotICoKLSAqIFRoaXMgaXMgbm90IGV2ZW4gYXQgQUxQSEEgbGV2ZWwgeWV0LiBEb24ndCBleHBlY3QgaXQgdG8gd29yayEKKyAqIENvcHlyaWdodCAxOTk3IE1hcmN1cyBNZWlzc25lcgogICovCiAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KQEAgLTE4LDIyICsxNywyOCBAQAogI2luY2x1ZGUgInBlX2ltYWdlLmgiCiAjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgotI2luY2x1ZGUgImhhbmRsZTMyLmgiCiAjaW5jbHVkZSAibGlicmVzLmgiCiAjaW5jbHVkZSAic3RhY2tmcmFtZS5oIgogI2luY2x1ZGUgIm5lZXhlLmgiCi0jaW5jbHVkZSAiYWNjZWwuaCIKLSNpbmNsdWRlICJ4bWFsbG9jLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCi0jZGVmaW5lIFByaW50SWRBKG5hbWUpIFwKLSAgICBpZiAoSElXT1JEKChEV09SRCluYW1lKSkgXAotICAgICAgICBkcHJpbnRmX3Jlc291cmNlKCBzdGRkZWIsICInJXMnIiwgbmFtZSk7IFwKLSAgICBlbHNlIFwKLSAgICAgICAgZHByaW50Zl9yZXNvdXJjZSggc3RkZGViLCAiIyUwNHgiLCBMT1dPUkQobmFtZSkpOyAKLSNkZWZpbmUgUHJpbnRJZFcobmFtZSkKLSNkZWZpbmUgUHJpbnRJZChuYW1lKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBITU9EVUxFMzJ0b1BFX01PRFVMRSAKKyAqCisgKiBzbWFsbCBoZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IGEgUEVfTU9EVUxFIGZyb20gYSBwYXNzZWQgSE1PRFVMRTMyCisgKi8KK3N0YXRpYyBQRV9NT0RVTEUqCitITU9EVUxFMzJ0b1BFX01PRFVMRShITU9EVUxFMzIgaG1vZCkgeworCU5FX01PRFVMRQkqcE1vZHVsZTsKKworCWlmICghaG1vZCkgaG1vZCA9IEdldFRhc2tEUygpOyAvKiBGSVhNRTogY29ycmVjdD8gKi8KKwlobW9kID0gR2V0RXhlUHRyKCBobW9kICk7ICAvKiBJbiBjYXNlIHdlIHdlcmUgcGFzc2VkIGFuIGhJbnN0YW5jZSAqLworCisJaWYgKCEocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoIGhtb2QgKSkpIHJldHVybiAwOworCWlmICghKHBNb2R1bGUtPmZsYWdzICYgTkVfRkZMQUdTX1dJTjMyKSkgcmV0dXJuIDA7CisJcmV0dXJuIHBNb2R1bGUtPnBlX21vZHVsZTsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCSAgICBHZXRSZXNEaXJFbnRyeVcKQEAgLTg3LDUwICs5MiwxOCBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJICAgIEdldFJlc0RpckVudHJ5QQotICoKLSAqCUhlbHBlciBmdW5jdGlvbiAtIGdvZXMgZG93biBvbmUgbGV2ZWwgb2YgUEUgcmVzb3VyY2UgdHJlZQotICoKLSAqLwotTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkgR2V0UmVzRGlyRW50cnlBKExQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZIHJlc2RpcnB0ciwKLQkJCQkJICAgTFBDU1RSIG5hbWUsCi0JCQkJCSAgIERXT1JEIHJvb3QpCi17Ci0JTFBXU1RSCQkJCXhuYW1lOwotCUxQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZCXJldDsKLQotCWlmIChISVdPUkQoKERXT1JEKW5hbWUpKQotCQl4bmFtZQk9IEhFQVBfc3RyZHVwQXRvVyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbmFtZSApOwotCWVsc2UKLQkJeG5hbWUJPSAoTFBXU1RSKW5hbWU7Ci0KLQlyZXQ9R2V0UmVzRGlyRW50cnlXKHJlc2RpcnB0cix4bmFtZSxyb290KTsKLQlpZiAoSElXT1JEKChEV09SRCluYW1lKSkKLSAgICAgICAgICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB4bmFtZSApOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkgICAgUEVfRmluZFJlc291cmNlRXgzMlcKICAqLwogSEFORExFMzIgUEVfRmluZFJlc291cmNlRXgzMlcoCiAJSElOU1RBTkNFMzIgaE1vZHVsZSxMUENXU1RSIG5hbWUsTFBDV1NUUiB0eXBlLFdPUkQgbGFuZwogKSB7Ci0gICAgUEVfTU9EVUxFICpwZTsKLSAgICBORV9NT0RVTEUgKnBNb2R1bGU7CiAgICAgTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkgcmVzZGlycHRyOwogICAgIERXT1JEIHJvb3Q7CiAgICAgSEFORExFMzIgcmVzdWx0OworICAgIFBFX01PRFVMRQkqcGUgPSBITU9EVUxFMzJ0b1BFX01PRFVMRShoTW9kdWxlKTsKIAotICAgIGhNb2R1bGUgPSBHZXRFeGVQdHIoIGhNb2R1bGUgKTsgIC8qIEluIGNhc2Ugd2Ugd2VyZSBwYXNzZWQgYW4gaEluc3RhbmNlICovCi0gICAgZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsICJGaW5kUmVzb3VyY2U6IG1vZHVsZT0lMDh4IHR5cGU9IiwgaE1vZHVsZSApOwotICAgIFByaW50SWQoIHR5cGUgKTsKLSAgICBkcHJpbnRmX3Jlc291cmNlKCBzdGRkZWIsICIgbmFtZT0iICk7Ci0gICAgUHJpbnRJZCggbmFtZSApOwotICAgIGRwcmludGZfcmVzb3VyY2UoIHN0ZGRlYiwgIlxuIiApOwotICAgIGlmICghKHBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyKCBoTW9kdWxlICkpKSByZXR1cm4gMDsKLSAgICBpZiAoIShwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19XSU4zMikpIHJldHVybiAwOyAgLyogRklYTUU/ICovCi0gICAgaWYgKCEocGUgPSBwTW9kdWxlLT5wZV9tb2R1bGUpIHx8ICFwZS0+cGVfcmVzb3VyY2UpIHJldHVybiAwOworICAgIGlmICghcGUgfHwgIXBlLT5wZV9yZXNvdXJjZSkKKyAgICAJcmV0dXJuIDA7CiAKICAgICByZXNkaXJwdHIgPSBwZS0+cGVfcmVzb3VyY2U7CiAgICAgcm9vdCA9IChEV09SRCkgcmVzZGlycHRyOwpAQCAtMTUxLDE4ICsxMjQsMjg3IEBACiAgKi8KIEhBTkRMRTMyIFBFX0xvYWRSZXNvdXJjZTMyKCBISU5TVEFOQ0UzMiBoTW9kdWxlLCBIQU5ETEUzMiBoUnNyYyApCiB7Ci0gICAgTkVfTU9EVUxFICpwTW9kdWxlOwotICAgIFBFX01PRFVMRSAqcGU7CisgICAgUEVfTU9EVUxFCSpwZSA9IEhNT0RVTEUzMnRvUEVfTU9EVUxFKGhNb2R1bGUpOwogCi0gICAgaWYgKCFoTW9kdWxlKSBoTW9kdWxlID0gR2V0VGFza0RTKCk7IC8qIEZJWE1FOiBzZWUgRmluZFJlc291cmNlMzJXICovCi0gICAgaE1vZHVsZSA9IEdldEV4ZVB0ciggaE1vZHVsZSApOyAgLyogSW4gY2FzZSB3ZSB3ZXJlIHBhc3NlZCBhbiBoSW5zdGFuY2UgKi8KLSAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwgIlBFX0xvYWRSZXNvdXJjZTMyOiBtb2R1bGU9JTA0eCByZXM9JTA0eFxuIiwKLSAgICAgICAgICAgICAgICAgICAgIGhNb2R1bGUsIGhSc3JjICk7CisgICAgaWYgKCFwZSB8fCAhcGUtPnBlX3Jlc291cmNlKQorICAgIAlyZXR1cm4gMDsKKyAgICBpZiAoIWhSc3JjKQorICAgCSByZXR1cm4gMDsKKyAgICByZXR1cm4gKEhBTkRMRTMyKSAocGUtPmxvYWRfYWRkcisoKExQSU1BR0VfUkVTT1VSQ0VfREFUQV9FTlRSWSloUnNyYyktPk9mZnNldFRvRGF0YSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAgICBQRV9TaXplb2ZSZXNvdXJjZTMyCisgKi8KK3ZvaWQKK19jaGVja19wdHIoRFdPUkQgeCxEV09SRCBzdGFydCxMUERXT1JEIGxhc3RtYXgpIHsKKwlpZiAoKHg+c3RhcnQpICYmICh4PCpsYXN0bWF4KSkKKwkJKmxhc3RtYXg9eDsKK30KKworc3RhdGljIHZvaWQKK3dhbGtfcmVzZGlyKERXT1JEIGxvYWRhZGRyLERXT1JEIHJvb3RyZXNkaXIsRFdPUkQgeHJlcyxEV09SRCBkYXRhLERXT1JEIGx2bCxMUERXT1JEIG1heCl7CisgICAgTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkJCXJlc2RpcjsKKyAgICBMUElNQUdFX1JFU09VUkNFX0RBVEFfRU5UUlkJCWRhdGFlbnQ7CisgICAgTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUllfRU5UUlkJZXQ7CisgICAgaW50CWk7CisKKyAgICBpZiAobHZsPT0zKSB7CisgICAgCWRhdGFlbnQgPSAoTFBJTUFHRV9SRVNPVVJDRV9EQVRBX0VOVFJZKShyb290cmVzZGlyK3hyZXMpOworCV9jaGVja19wdHIobG9hZGFkZHIrZGF0YWVudC0+T2Zmc2V0VG9EYXRhLGRhdGEsbWF4KTsKKwlyZXR1cm47CisgICAgfQorICAgIHJlc2RpciA9IChMUElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSkocm9vdHJlc2Rpcit4cmVzKTsKKyAgICBldCA9KExQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZX0VOVFJZKSgoTFBCWVRFKXJlc2RpcitzaXplb2YoSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZKSk7CisgICAgZm9yIChpPTA7aTxyZXNkaXItPk51bWJlck9mTmFtZWRFbnRyaWVzK3Jlc2Rpci0+TnVtYmVyT2ZJZEVudHJpZXM7aSsrKQorCXdhbGtfcmVzZGlyKGxvYWRhZGRyLHJvb3RyZXNkaXIsKGx2bD09Mik/ZXRbaV0udTIuT2Zmc2V0VG9EYXRhOmV0W2ldLnUyLnMuT2Zmc2V0VG9EaXJlY3RvcnksZGF0YSxsdmwrMSxtYXgpOworfQorCitEV09SRCBQRV9TaXplb2ZSZXNvdXJjZTMyKCBISU5TVEFOQ0UzMiBoTW9kdWxlLCBIQU5ETEUzMiBoUnNyYyApCit7CisgICAgUEVfTU9EVUxFCSpwZSA9IEhNT0RVTEUzMnRvUEVfTU9EVUxFKGhNb2R1bGUpOworICAgIERXT1JECW1heCxkYXRhOworICAgIElNQUdFX0RBVEFfRElSRUNUT1JZCWRpcjsKKworICAgIGlmICghcGUgfHwgIXBlLT5wZV9yZXNvdXJjZSkKKyAgICAJcmV0dXJuIDA7CiAgICAgaWYgKCFoUnNyYykgcmV0dXJuIDA7CiAKLSAgICBpZiAoIShwTW9kdWxlID0gTU9EVUxFX0dldFB0ciggaE1vZHVsZSApKSkgcmV0dXJuIDA7Ci0gICAgaWYgKCEocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfV0lOMzIpKSByZXR1cm4gMDsgIC8qIEZJWE1FPyAqLwotICAgIGlmICghKHBlID0gcE1vZHVsZS0+cGVfbW9kdWxlKSB8fCAhcGUtPnBlX3Jlc291cmNlKSByZXR1cm4gMDsKLSAgICByZXR1cm4gKEhBTkRMRTMyKSAocGUtPmxvYWRfYWRkcisoKExQSU1BR0VfUkVTT1VSQ0VfREFUQV9FTlRSWSloUnNyYyktPk9mZnNldFRvRGF0YSk7CisgICAgbWF4PShEV09SRCktMTsKKyAgICBkaXI9cGUtPnBlX2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuRGF0YURpcmVjdG9yeVtJTUFHRV9ESVJFQ1RPUllfRU5UUllfUkVTT1VSQ0VdOworICAgIGlmKGRpci5TaXplKQorICAgIAltYXg9KERXT1JEKXBlLT5wZV9yZXNvdXJjZStkaXIuU2l6ZTsKKworICAgIGRhdGE9KChEV09SRClwZS0+bG9hZF9hZGRyKygoTFBJTUFHRV9SRVNPVVJDRV9EQVRBX0VOVFJZKWhSc3JjKS0+T2Zmc2V0VG9EYXRhKTsKKyAgICB3YWxrX3Jlc2RpcihwZS0+bG9hZF9hZGRyLChEV09SRClwZS0+cGVfcmVzb3VyY2UsMCxkYXRhLDAsJm1heCk7CisgICAgcmV0dXJuIG1heC1kYXRhOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgIFBFX0VudW1SZXNvdXJjZVR5cGVzMzJBCisgKi8KK0JPT0wzMgorUEVfRW51bVJlc291cmNlVHlwZXMzMkEoSE1PRFVMRTMyIGhtb2QsRU5VTVJFU1RZUEVQUk9DMzJBIGxwZnVuLExPTkcgbHBhcmFtKSB7CisgICAgUEVfTU9EVUxFCSpwZSA9IEhNT0RVTEUzMnRvUEVfTU9EVUxFKGhtb2QpOworICAgIGludAkJaTsKKyAgICBMUElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWQkJcmVzZGlyOworICAgIExQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZX0VOVFJZCWV0OworICAgIEJPT0wzMglyZXQ7CisgICAgSEFORExFMzIJaGVhcCA9IEdldFByb2Nlc3NIZWFwKCk7CQorCisgICAgaWYgKCFwZSB8fCAhcGUtPnBlX3Jlc291cmNlKQorICAgIAlyZXR1cm4gRkFMU0U7CisKKyAgICByZXNkaXIgPSAoTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkpcGUtPnBlX3Jlc291cmNlOworICAgIGV0ID0oTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUllfRU5UUlkpKChMUEJZVEUpcmVzZGlyK3NpemVvZihJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkpKTsKKyAgICByZXQgPSBGQUxTRTsKKyAgICBmb3IgKGk9MDtpPHJlc2Rpci0+TnVtYmVyT2ZOYW1lZEVudHJpZXMrcmVzZGlyLT5OdW1iZXJPZklkRW50cmllcztpKyspIHsKKyAgICAJTFBTVFIJbmFtZTsKKworCWlmIChISVdPUkQoZXRbaV0udTEuTmFtZSkpCisJCW5hbWUgPSBIRUFQX3N0cmR1cFd0b0EoaGVhcCwwLChMUFdTVFIpKChMUEJZVEUpcGUtPnBlX3Jlc291cmNlK2V0W2ldLnUxLk5hbWUpKTsKKwllbHNlCisJCW5hbWUgPSAoTFBTVFIpZXRbaV0udTEuTmFtZTsKKwlyZXQgPSBscGZ1bihobW9kLG5hbWUsbHBhcmFtKTsKKwlpZiAoSElXT1JEKG5hbWUpKQorCQlIZWFwRnJlZShoZWFwLDAsbmFtZSk7CisJaWYgKCFyZXQpCisJCWJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgIFBFX0VudW1SZXNvdXJjZVR5cGVzMzJXCisgKi8KK0JPT0wzMgorUEVfRW51bVJlc291cmNlVHlwZXMzMlcoSE1PRFVMRTMyIGhtb2QsRU5VTVJFU1RZUEVQUk9DMzJXIGxwZnVuLExPTkcgbHBhcmFtKSB7CisgICAgUEVfTU9EVUxFCSpwZSA9IEhNT0RVTEUzMnRvUEVfTU9EVUxFKGhtb2QpOworICAgIGludAkJaTsKKyAgICBMUElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWQkJcmVzZGlyOworICAgIExQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZX0VOVFJZCWV0OworICAgIEJPT0wzMglyZXQ7CisKKyAgICBpZiAoIXBlIHx8ICFwZS0+cGVfcmVzb3VyY2UpCisgICAgCXJldHVybiBGQUxTRTsKKworICAgIHJlc2RpciA9IChMUElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSlwZS0+cGVfcmVzb3VyY2U7CisgICAgZXQgPShMUElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWV9FTlRSWSkoKExQQllURSlyZXNkaXIrc2l6ZW9mKElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSkpOworICAgIHJldCA9IEZBTFNFOworICAgIGZvciAoaT0wO2k8cmVzZGlyLT5OdW1iZXJPZk5hbWVkRW50cmllcytyZXNkaXItPk51bWJlck9mSWRFbnRyaWVzO2krKykgeworCUxQV1NUUgl0eXBlOworICAgIAlpZiAoSElXT1JEKGV0W2ldLnUxLk5hbWUpKQorCQl0eXBlID0gKExQV1NUUikoKExQQllURSlwZS0+cGVfcmVzb3VyY2UrZXRbaV0udTEuTmFtZSk7CisJZWxzZQorCQl0eXBlID0gKExQV1NUUilldFtpXS51MS5OYW1lOworCisJcmV0ID0gbHBmdW4oaG1vZCx0eXBlLGxwYXJhbSk7CisJaWYgKCFyZXQpCisJCWJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgIFBFX0VudW1SZXNvdXJjZU5hbWVzMzJBCisgKi8KK0JPT0wzMgorUEVfRW51bVJlc291cmNlTmFtZXMzMkEoCisJSE1PRFVMRTMyIGhtb2QsTFBDU1RSIHR5cGUsRU5VTVJFU05BTUVQUk9DMzJBIGxwZnVuLExPTkcgbHBhcmFtCispIHsKKyAgICBQRV9NT0RVTEUJKnBlID0gSE1PRFVMRTMydG9QRV9NT0RVTEUoaG1vZCk7CisgICAgaW50CQlpOworICAgIExQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZCQlyZXNkaXI7CisgICAgTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUllfRU5UUlkJZXQ7CisgICAgQk9PTDMyCXJldDsKKyAgICBIQU5ETEUzMgloZWFwID0gR2V0UHJvY2Vzc0hlYXAoKTsJCisgICAgTFBXU1RSCXR5cGVXOworCisgICAgaWYgKCFwZSB8fCAhcGUtPnBlX3Jlc291cmNlKQorICAgIAlyZXR1cm4gRkFMU0U7CisgICAgcmVzZGlyID0gKExQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZKXBlLT5wZV9yZXNvdXJjZTsKKyAgICBpZiAoSElXT1JEKHR5cGUpKQorCXR5cGVXID0gSEVBUF9zdHJkdXBBdG9XKGhlYXAsMCx0eXBlKTsKKyAgICBlbHNlCisJdHlwZVcgPSAoTFBXU1RSKXR5cGU7CisgICAgcmVzZGlyID0gR2V0UmVzRGlyRW50cnlXKHJlc2Rpcix0eXBlVywoRFdPUkQpcGUtPnBlX3Jlc291cmNlKTsKKyAgICBpZiAoSElXT1JEKHR5cGVXKSkKKyAgICAJSGVhcEZyZWUoaGVhcCwwLHR5cGVXKTsKKyAgICBpZiAoIXJlc2RpcikKKyAgICAJcmV0dXJuIEZBTFNFOworICAgIGV0ID0oTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUllfRU5UUlkpKChMUEJZVEUpcmVzZGlyK3NpemVvZihJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkpKTsKKyAgICByZXQgPSBGQUxTRTsKKyAgICBmb3IgKGk9MDtpPHJlc2Rpci0+TnVtYmVyT2ZOYW1lZEVudHJpZXMrcmVzZGlyLT5OdW1iZXJPZklkRW50cmllcztpKyspIHsKKyAgICAJTFBTVFIJbmFtZTsKKworCWlmIChISVdPUkQoZXRbaV0udTEuTmFtZSkpCisJICAgIG5hbWUgPSBIRUFQX3N0cmR1cFd0b0EoaGVhcCwwLChMUFdTVFIpKChMUEJZVEUpcGUtPnBlX3Jlc291cmNlK2V0W2ldLnUxLk5hbWUpKTsKKwllbHNlCisJICAgIG5hbWUgPSAoTFBTVFIpZXRbaV0udTEuTmFtZTsKKwlyZXQgPSBscGZ1bihobW9kLHR5cGUsbmFtZSxscGFyYW0pOworCWlmIChISVdPUkQobmFtZSkpIEhlYXBGcmVlKGhlYXAsMCxuYW1lKTsKKwlpZiAoIXJldCkKKwkJYnJlYWs7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgICAgUEVfRW51bVJlc291cmNlTmFtZXMzMlcKKyAqLworQk9PTDMyCitQRV9FbnVtUmVzb3VyY2VOYW1lczMyVygKKwlITU9EVUxFMzIgaG1vZCxMUENXU1RSIHR5cGUsRU5VTVJFU05BTUVQUk9DMzJXIGxwZnVuLExPTkcgbHBhcmFtCispIHsKKyAgICBQRV9NT0RVTEUJKnBlID0gSE1PRFVMRTMydG9QRV9NT0RVTEUoaG1vZCk7CisgICAgaW50CQlpOworICAgIExQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZCQlyZXNkaXI7CisgICAgTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUllfRU5UUlkJZXQ7CisgICAgQk9PTDMyCXJldDsKKworICAgIGlmICghcGUgfHwgIXBlLT5wZV9yZXNvdXJjZSkKKyAgICAJcmV0dXJuIEZBTFNFOworCisgICAgcmVzZGlyID0gKExQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZKXBlLT5wZV9yZXNvdXJjZTsKKyAgICByZXNkaXIgPSBHZXRSZXNEaXJFbnRyeVcocmVzZGlyLHR5cGUsKERXT1JEKXBlLT5wZV9yZXNvdXJjZSk7CisgICAgaWYgKCFyZXNkaXIpCisgICAgCXJldHVybiBGQUxTRTsKKyAgICBldCA9KExQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZX0VOVFJZKSgoTFBCWVRFKXJlc2RpcitzaXplb2YoSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZKSk7CisgICAgcmV0ID0gRkFMU0U7CisgICAgZm9yIChpPTA7aTxyZXNkaXItPk51bWJlck9mTmFtZWRFbnRyaWVzK3Jlc2Rpci0+TnVtYmVyT2ZJZEVudHJpZXM7aSsrKSB7CisJTFBXU1RSCW5hbWU7CisgICAgCWlmIChISVdPUkQoZXRbaV0udTEuTmFtZSkpCisJCW5hbWUgPSAoTFBXU1RSKSgoTFBCWVRFKXBlLT5wZV9yZXNvdXJjZStldFtpXS51MS5OYW1lKTsKKwllbHNlCisJCW5hbWUgPSAoTFBXU1RSKWV0W2ldLnUxLk5hbWU7CisJcmV0ID0gbHBmdW4oaG1vZCx0eXBlLG5hbWUsbHBhcmFtKTsKKwlpZiAoIXJldCkKKwkJYnJlYWs7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgICAgUEVfRW51bVJlc291cmNlTmFtZXMzMkEKKyAqLworQk9PTDMyCitQRV9FbnVtUmVzb3VyY2VMYW5ndWFnZXMzMkEoCisJSE1PRFVMRTMyIGhtb2QsTFBDU1RSIG5hbWUsTFBDU1RSIHR5cGUsRU5VTVJFU0xBTkdQUk9DMzJBIGxwZnVuLAorCUxPTkcgbHBhcmFtCispIHsKKyAgICBQRV9NT0RVTEUJKnBlID0gSE1PRFVMRTMydG9QRV9NT0RVTEUoaG1vZCk7CisgICAgaW50CQlpOworICAgIExQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZCQlyZXNkaXI7CisgICAgTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUllfRU5UUlkJZXQ7CisgICAgQk9PTDMyCXJldDsKKyAgICBIQU5ETEUzMgloZWFwID0gR2V0UHJvY2Vzc0hlYXAoKTsJCisgICAgTFBXU1RSCW5hbWVXLHR5cGVXOworCisgICAgaWYgKCFwZSB8fCAhcGUtPnBlX3Jlc291cmNlKQorICAgIAlyZXR1cm4gRkFMU0U7CisKKyAgICByZXNkaXIgPSAoTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkpcGUtPnBlX3Jlc291cmNlOworICAgIGlmIChISVdPUkQobmFtZSkpCisJbmFtZVcgPSBIRUFQX3N0cmR1cEF0b1coaGVhcCwwLG5hbWUpOworICAgIGVsc2UKKyAgICAJbmFtZVcgPSAoTFBXU1RSKW5hbWU7CisgICAgcmVzZGlyID0gR2V0UmVzRGlyRW50cnlXKHJlc2RpcixuYW1lVywoRFdPUkQpcGUtPnBlX3Jlc291cmNlKTsKKyAgICBpZiAoSElXT1JEKG5hbWVXKSkKKyAgICAJSGVhcEZyZWUoaGVhcCwwLG5hbWVXKTsKKyAgICBpZiAoIXJlc2RpcikKKyAgICAJcmV0dXJuIEZBTFNFOworICAgIGlmIChISVdPUkQodHlwZSkpCisJdHlwZVcgPSBIRUFQX3N0cmR1cEF0b1coaGVhcCwwLHR5cGUpOworICAgIGVsc2UKKwl0eXBlVyA9IChMUFdTVFIpdHlwZTsKKyAgICByZXNkaXIgPSBHZXRSZXNEaXJFbnRyeVcocmVzZGlyLHR5cGVXLChEV09SRClwZS0+cGVfcmVzb3VyY2UpOworICAgIGlmIChISVdPUkQodHlwZVcpKQorICAgIAlIZWFwRnJlZShoZWFwLDAsdHlwZVcpOworICAgIGlmICghcmVzZGlyKQorICAgIAlyZXR1cm4gRkFMU0U7CisgICAgZXQgPShMUElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWV9FTlRSWSkoKExQQllURSlyZXNkaXIrc2l6ZW9mKElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSkpOworICAgIHJldCA9IEZBTFNFOworICAgIGZvciAoaT0wO2k8cmVzZGlyLT5OdW1iZXJPZk5hbWVkRW50cmllcytyZXNkaXItPk51bWJlck9mSWRFbnRyaWVzO2krKykgeworICAgIAkvKiBsYW5ndWFnZXMgYXJlIGp1c3QgaWRzLi4uIEkgaG9wZSAqLworCXJldCA9IGxwZnVuKGhtb2QsbmFtZSx0eXBlLGV0W2ldLnUxLklkLGxwYXJhbSk7CisJaWYgKCFyZXQpCisJCWJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgIFBFX0VudW1SZXNvdXJjZUxhbmd1YWdlczMyVworICovCitCT09MMzIKK1BFX0VudW1SZXNvdXJjZUxhbmd1YWdlczMyVygKKwlITU9EVUxFMzIgaG1vZCxMUENXU1RSIG5hbWUsTFBDV1NUUiB0eXBlLEVOVU1SRVNMQU5HUFJPQzMyVyBscGZ1biwKKwlMT05HIGxwYXJhbQorKSB7CisgICAgUEVfTU9EVUxFCSpwZSA9IEhNT0RVTEUzMnRvUEVfTU9EVUxFKGhtb2QpOworICAgIGludAkJaTsKKyAgICBMUElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWQkJcmVzZGlyOworICAgIExQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZX0VOVFJZCWV0OworICAgIEJPT0wzMglyZXQ7CisKKyAgICBpZiAoIXBlIHx8ICFwZS0+cGVfcmVzb3VyY2UpCisgICAgCXJldHVybiBGQUxTRTsKKworICAgIHJlc2RpciA9IChMUElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSlwZS0+cGVfcmVzb3VyY2U7CisgICAgcmVzZGlyID0gR2V0UmVzRGlyRW50cnlXKHJlc2RpcixuYW1lLChEV09SRClwZS0+cGVfcmVzb3VyY2UpOworICAgIGlmICghcmVzZGlyKQorICAgIAlyZXR1cm4gRkFMU0U7CisgICAgcmVzZGlyID0gR2V0UmVzRGlyRW50cnlXKHJlc2Rpcix0eXBlLChEV09SRClwZS0+cGVfcmVzb3VyY2UpOworICAgIGlmICghcmVzZGlyKQorICAgIAlyZXR1cm4gRkFMU0U7CisgICAgZXQgPShMUElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWV9FTlRSWSkoKExQQllURSlyZXNkaXIrc2l6ZW9mKElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSkpOworICAgIHJldCA9IEZBTFNFOworICAgIGZvciAoaT0wO2k8cmVzZGlyLT5OdW1iZXJPZk5hbWVkRW50cmllcytyZXNkaXItPk51bWJlck9mSWRFbnRyaWVzO2krKykgeworCXJldCA9IGxwZnVuKGhtb2QsbmFtZSx0eXBlLGV0W2ldLnUxLklkLGxwYXJhbSk7CisJaWYgKCFyZXQpCisJCWJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmV0OwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9sb2FkZXIvcmVzb3VyY2UuYyBiL2xvYWRlci9yZXNvdXJjZS5jCmluZGV4IGRlMjg5YjYuLmQyZjUwZmUgMTAwNjQ0Ci0tLSBhL2xvYWRlci9yZXNvdXJjZS5jCisrKyBiL2xvYWRlci9yZXNvdXJjZS5jCkBAIC0zNDUsOCArMzQ1LDEyIEBACiAgICAgaE1vZHVsZSA9IEdldEV4ZVB0ciggaE1vZHVsZSApOyAgLyogSW4gY2FzZSB3ZSB3ZXJlIHBhc3NlZCBhbiBoSW5zdGFuY2UgKi8KICAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwgIlNpemVvZlJlc291cmNlMzI6IG1vZHVsZT0lMDR4IHJlcz0lMDR4XG4iLAogICAgICAgICAgICAgICAgICAgICAgaE1vZHVsZSwgaFJzcmMgKTsKKyNpZm5kZWYgV0lORUxJQgorICAgIHJldHVybiBQRV9TaXplb2ZSZXNvdXJjZTMyKGhNb2R1bGUsaFJzcmMpOworI2Vsc2UKICAgICBmcHJpbnRmKHN0ZGVyciwiU2l6ZW9mUmVzb3VyY2UzMjogbm90IGltcGxlbWVudGVkXG4iKTsKICAgICByZXR1cm4gMDsKKyNlbmRpZgogfQogCiAKQEAgLTQ0MSwxMCArNDQ1LDE1IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCUxvYWRBY2NlbGVyYXRvcnMzMlcJW1VTRVIuMTc3XQorICogVGhlIGltYWdlIGxheW91dCBzZWVtcyB0byBsb29rIGxpa2UgdGhpcyAobm90IDEwMCUgc3VyZSk6CisgKiAwMDoJQllURQl0eXBlCQl0eXBlIG9mIGFjY2VsZXJhdG9yCisgKiAwMToJQllURQlwYWQJCSh0byBXT1JEIGJvdW5kYXJ5KQorICogMDI6CVdPUkQJZXZlbnQKKyAqIDA0OglXT1JECUlEdmFsCQkKKyAqIDA2OglXT1JECXBhZAkJKHRvIERXT1JEIGJvdW5kYXJ5KQogICovCiBIQUNDRUwzMiBMb2FkQWNjZWxlcmF0b3JzMzJXKEhJTlNUQU5DRTMyIGluc3RhbmNlLExQQ1dTVFIgbHBUYWJsZU5hbWUpCiB7Ci0jaWYgMAogICAgIEhBQ0NFTDMyIAloQWNjZWw7CiAgICAgSEdMT0JBTDMyIAlyc2NfbWVtOwogICAgIEhSU1JDMzIgaFJzcmM7CkBAIC00NzEsMTEgKzQ4MCwxMiBAQAogICAgIGxwQWNjZWxUYmwgPSAoTFBBQ0NFTEhFQURFUilHbG9iYWxMb2NrMTYoaEFjY2VsKTsKICAgICBscEFjY2VsVGJsLT53Q291bnQgPSAwOwogICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQlscEFjY2VsVGJsLT50YmxbaV0udHlwZSA9ICoobHArKyk7CisJbHBBY2NlbFRibC0+dGJsW2ldLnR5cGUgPSAqbHA7CisJbHAgKz0gMjsKIAlscEFjY2VsVGJsLT50YmxbaV0ud0V2ZW50ID0gKigoV09SRCAqKWxwKTsKIAlscCArPSAyOwogCWxwQWNjZWxUYmwtPnRibFtpXS53SUR2YWwgPSAqKChXT1JEICopbHApOwotCWxwICs9IDI7CisJbHAgKz0gNDsKICAgICAJaWYgKGxwQWNjZWxUYmwtPnRibFtpXS53RXZlbnQgPT0gMCkgYnJlYWs7CiAJZHByaW50Zl9hY2NlbChzdGRkZWIsCiAJCSJBY2NlbGVyYXRvciAjJXUgLyBldmVudD0lMDRYIGlkPSUwNFggdHlwZT0lMDJYIFxuIiwgCkBAIC00ODYsMTAgKzQ5Niw2IEBACiAgICAgR2xvYmFsVW5sb2NrMTYoaEFjY2VsKTsKICAgICBGcmVlUmVzb3VyY2UzMihyc2NfbWVtKTsKICAgICByZXR1cm4gaEFjY2VsOwotI2Vsc2UKLQlmcHJpbnRmKHN0ZGVyciwiTG9hZEFjY2VsZXJhdG9yc1c6IG5vdCBpbXBsZW1lbnRlZFxuIik7Ci0JcmV0dXJuIDB4MTAwOyAgLyogUmV0dXJuIHNvbWV0aGluZyBhbnl3YXkgKi8KLSNlbmRpZgogfQogCiBIQUNDRUwzMiBMb2FkQWNjZWxlcmF0b3JzMzJBKEhJTlNUQU5DRTMyIGluc3RhbmNlLExQQ1NUUiBscFRhYmxlTmFtZSkKQEAgLTc0NCwzICs3NTAsNTEgQEAKIAlmcHJpbnRmKHN0ZGVyciwiU2V0UmVzb3VyY2VIYW5kbGVyKCUwNHgsMHglMDR4LCVwKSwgZW1wdHkgU1RVQiFcbiIsaW5zdGFuY2UsTE9XT1JEKHMpLGZhcnByb2MpOwogICAgIHJldHVybiBOVUxMOwogfQorCisjaWZuZGVmIFdJTkVMSUIKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglFbnVtUmVzb3VyY2VUeXBlc0EJKEtFUk5FTDMyLjkwKQorICovCitCT09MMzIKK0VudW1SZXNvdXJjZVR5cGVzMzJBKEhNT0RVTEUzMiBobW9kdWxlLEVOVU1SRVNUWVBFUFJPQzMyQSBscGZ1bixMT05HIGxQYXJhbSkgeworICAgIHJldHVybiBQRV9FbnVtUmVzb3VyY2VUeXBlczMyQShobW9kdWxlLGxwZnVuLGxQYXJhbSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglFbnVtUmVzb3VyY2VUeXBlc1cJKEtFUk5FTDMyLjkxKQorICovCitCT09MMzIKK0VudW1SZXNvdXJjZVR5cGVzMzJXKEhNT0RVTEUzMiBobW9kdWxlLEVOVU1SRVNUWVBFUFJPQzMyVyBscGZ1bixMT05HIGxQYXJhbSkgeworICAgIHJldHVybiBQRV9FbnVtUmVzb3VyY2VUeXBlczMyVyhobW9kdWxlLGxwZnVuLGxQYXJhbSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglFbnVtUmVzb3VyY2VOYW1lc0EJKEtFUk5FTDMyLjg4KQorICovCitCT09MMzIKK0VudW1SZXNvdXJjZU5hbWVzMzJBKEhNT0RVTEUzMiBobW9kdWxlLExQQ1NUUiB0eXBlLEVOVU1SRVNOQU1FUFJPQzMyQSBscGZ1bixMT05HIGxQYXJhbSkgeworICAgIHJldHVybiBQRV9FbnVtUmVzb3VyY2VOYW1lczMyQShobW9kdWxlLHR5cGUsbHBmdW4sbFBhcmFtKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglFbnVtUmVzb3VyY2VOYW1lc1cJKEtFUk5FTDMyLjg5KQorICovCitCT09MMzIKK0VudW1SZXNvdXJjZU5hbWVzMzJXKEhNT0RVTEUzMiBobW9kdWxlLExQQ1dTVFIgdHlwZSxFTlVNUkVTTkFNRVBST0MzMlcgbHBmdW4sTE9ORyBsUGFyYW0pIHsKKyAgICByZXR1cm4gUEVfRW51bVJlc291cmNlTmFtZXMzMlcoaG1vZHVsZSx0eXBlLGxwZnVuLGxQYXJhbSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglFbnVtUmVzb3VyY2VMYW5ndWFnZXNBCShLRVJORUwzMi44NikKKyAqLworQk9PTDMyCitFbnVtUmVzb3VyY2VMYW5ndWFnZXMzMkEoSE1PRFVMRTMyIGhtb2R1bGUsTFBDU1RSIHR5cGUsTFBDU1RSIG5hbWUsRU5VTVJFU0xBTkdQUk9DMzJBIGxwZnVuLExPTkcgbFBhcmFtKSB7CisgICAgcmV0dXJuIFBFX0VudW1SZXNvdXJjZUxhbmd1YWdlczMyQShobW9kdWxlLHR5cGUsbmFtZSxscGZ1bixsUGFyYW0pOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCUVudW1SZXNvdXJjZUxhbmd1YWdlc1cJKEtFUk5FTDMyLjg3KQorICovCitCT09MMzIKK0VudW1SZXNvdXJjZUxhbmd1YWdlczMyVyhITU9EVUxFMzIgaG1vZHVsZSxMUENXU1RSIHR5cGUsTFBDV1NUUiBuYW1lLEVOVU1SRVNMQU5HUFJPQzMyVyBscGZ1bixMT05HIGxQYXJhbSkgeworICAgIHJldHVybiBQRV9FbnVtUmVzb3VyY2VMYW5ndWFnZXMzMlcoaG1vZHVsZSx0eXBlLG5hbWUsbHBmdW4sbFBhcmFtKTsKK30KKyNlbmRpZiAgLyogV0lORUxJQiAqLwpkaWZmIC0tZ2l0IGEvbG9hZGVyL3NpZ25hbC5jIGIvbG9hZGVyL3NpZ25hbC5jCmluZGV4IDJkOTdlZDUuLjc2OWI1MTAgMTAwNjQ0Ci0tLSBhL2xvYWRlci9zaWduYWwuYworKysgYi9sb2FkZXIvc2lnbmFsLmMKQEAgLTE0Myw3ICsxNDMsNiBAQAogc3RhdGljIHZvaWQgU0lHTkFMX2ZhdWx0KGludCBzaWduYWwsIGludCBjb2RlLCBTSUdDT05URVhUICpjb250ZXh0KQogewogI2VuZGlmCi0jaWZuZGVmIF9fRU1YX18gLyogRklYTUU6IFhYX3NpZyhjb25zdGV4dCk9cG9pbnRlciB0byBpbmNvbXBsZXRlIHR5cGUgKEVNWCkgKi8KICAgICBpZiAoQ1Nfc2lnKGNvbnRleHQpID09IFdJTkVfQ09ERV9TRUxFQ1RPUikKICAgICB7CiAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlNlZ21lbnRhdGlvbiBmYXVsdCBpbiBXaW5lIHByb2dyYW0gKCV4OiVseCkuIgpAQCAtMTU3LDcgKzE1Niw2IEBACiAgICAgICAgICAgICAgICAgIENTX3NpZyhjb250ZXh0KSwgRUlQX3NpZyhjb250ZXh0KSApOwogICAgIH0KICAgICB3aW5lX2RlYnVnKCBzaWduYWwsIGNvbnRleHQgKTsKLSNlbmRpZgogfQogCiAKZGlmZiAtLWdpdCBhL2xvYWRlci90YXNrLmMgYi9sb2FkZXIvdGFzay5jCmluZGV4IDBiNzIxZTYuLjg2NGFiYWQgMTAwNjQ0Ci0tLSBhL2xvYWRlci90YXNrLmMKKysrIGIvbG9hZGVyL3Rhc2suYwpAQCAtMzYxLDcgKzM2MSw2IEBACiAgICAgICAgIC8qIEZJWE1FOiBhbGwgdGhpcyBpcyBhbiB1Z2x5IGhhY2sgKi8KIAogICAgICAgICBleHRlcm4gdm9pZCBJbml0VGFzayggQ09OVEVYVCAqY29udGV4dCApOwotICAgICAgICBleHRlcm4gdm9pZCBQRV9Jbml0aWFsaXplRExMcyggSE1PRFVMRTE2IGhNb2R1bGUgKTsKIAogICAgICAgICBJbml0VGFzayggTlVMTCApOwogICAgICAgICBJbml0QXBwKCBwVGFzay0+aE1vZHVsZSApOwpAQCAtNTM2LDcgKzUzNSwxNSBAQAogICAgIC8qIENyZWF0ZSB0aGUgV2luMzIgcGFydCBvZiB0aGUgdGFzayAqLwogCiAgICAgcGRiMzIgPSBQUk9DRVNTX0NyZWF0ZSggcFRhc2sgKTsKLSAgICBwVGFzay0+dGhkYiA9IFRIUkVBRF9DcmVhdGUoIHBkYjMyLCAwICk7CisgICAgaWYgKHBNb2R1bGUtPmZsYWdzICYgTkVfRkZMQUdTX1dJTjMyKQorICAgIHsKKyAgICAgICAgTFBUSFJFQURfU1RBUlRfUk9VVElORSBzdGFydCA9CisgICAgICAgICAgICAoTFBUSFJFQURfU1RBUlRfUk9VVElORSkocE1vZHVsZS0+cGVfbW9kdWxlLT5sb2FkX2FkZHIgKworICAgICAgICAgICAgcE1vZHVsZS0+cGVfbW9kdWxlLT5wZV9oZWFkZXItPk9wdGlvbmFsSGVhZGVyLkFkZHJlc3NPZkVudHJ5UG9pbnQpOworICAgICAgICBwVGFzay0+dGhkYiA9IFRIUkVBRF9DcmVhdGUoIHBkYjMyLCAwLCBzdGFydCApOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHBUYXNrLT50aGRiID0gVEhSRUFEX0NyZWF0ZSggcGRiMzIsIDAsIE5VTEwgKTsKIAogICAgIC8qIENyZWF0ZSB0aGUgMzItYml0IHN0YWNrIGZyYW1lICovCiAKQEAgLTEyNzQsMjEgKzEyODEsMzEgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBTZXRFcnJvck1vZGUgICAoS0VSTkVMLjEwNykKKyAqICAgICAgICAgICBTZXRFcnJvck1vZGUxNiAgIChLRVJORUwuMTA3KQogICovCi1VSU5UIFNldEVycm9yTW9kZSggVUlOVCBtb2RlICkKK1VJTlQxNiBTZXRFcnJvck1vZGUxNiggVUlOVDE2IG1vZGUgKQogewogICAgIFREQiAqcFRhc2s7Ci0gICAgVUlOVCBvbGRNb2RlOworICAgIFVJTlQxNiBvbGRNb2RlOwogCiAgICAgaWYgKCEocFRhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBoQ3VycmVudFRhc2sgKSkpIHJldHVybiAwOwogICAgIG9sZE1vZGUgPSBwVGFzay0+ZXJyb3JfbW9kZTsKICAgICBwVGFzay0+ZXJyb3JfbW9kZSA9IG1vZGU7CisgICAgcFRhc2stPnRoZGItPnByb2Nlc3MtPmVycm9yX21vZGUgPSBtb2RlOwogICAgIHJldHVybiBvbGRNb2RlOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNldEVycm9yTW9kZTMyICAgKEtFUk5FTDMyLjQ4NikKKyAqLworVUlOVDMyIFNldEVycm9yTW9kZTMyKCBVSU5UMzIgbW9kZSApCit7CisgICAgcmV0dXJuIFNldEVycm9yTW9kZTE2KCAoVUlOVDE2KW1vZGUgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXRET1NFbnZpcm9ubWVudCAgIChLRVJORUwuMTMxKQogICovCiBTRUdQVFIgR2V0RE9TRW52aXJvbm1lbnQodm9pZCkKZGlmZiAtLWdpdCBhL21lbW9yeS9zZWxlY3Rvci5jIGIvbWVtb3J5L3NlbGVjdG9yLmMKaW5kZXggNDlhMTMwOS4uOWQ3NjQ3NyAxMDA2NDQKLS0tIGEvbWVtb3J5L3NlbGVjdG9yLmMKKysrIGIvbWVtb3J5L3NlbGVjdG9yLmMKQEAgLTEzLDcgKzEzLDcgQEAKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAKLSNkZWZpbmUgRklSU1RfTERUX0VOVFJZX1RPX0FMTE9DICA2CisjZGVmaW5lIEZJUlNUX0xEVF9FTlRSWV9UT19BTExPQyAgMTcKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL21pc2MvY29tbS5jIGIvbWlzYy9jb21tLmMKaW5kZXggOTFiMjE2MS4uYWRmMjE5NyAxMDA2NDQKLS0tIGEvbWlzYy9jb21tLmMKKysrIGIvbWlzYy9jb21tLmMKQEAgLTg1OCw3ICs4NTgsNyBAQAogCQkJY29tbWVycm9yID0gSUVfQkFVRFJBVEU7CiAJCQlyZXR1cm4gLTE7CiAJfQotI2Vsc2UKKyNlbGlmICFkZWZpbmVkKF9fRU1YX18pCiAgICAgICAgIHN3aXRjaCAobHBkY2ItPkJhdWRSYXRlKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxMTA6CiAgICAgICAgICAgICAgICAgY2FzZSBDQlJfMTEwOgpAQCAtMTA1OSw3ICsxMDU5LDcgQEAKIAkJCWNvbW1lcnJvciA9IElFX0JBVURSQVRFOwogCQkJcmV0dXJuIEZBTFNFOwogCX0KLSNlbHNlCisjZWxpZiAhZGVmaW5lZChfX0VNWF9fKQogICAgICAgICBzd2l0Y2ggKGxwZGNiLT5CYXVkUmF0ZSkgewogICAgICAgICAgICAgICAgIGNhc2UgMTEwOgogICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzExMDoKQEAgLTExOTQsNiArMTE5NCw3IEBACiAJCXJldHVybiAtMTsKIAl9CiAJbHBkY2ItPklkID0gZmQ7CisjaWZuZGVmIF9fRU1YX18KICNpZmRlZiBDQkFVRAogICAgICAgICBzd2l0Y2ggKHBvcnQuY19jZmxhZyAmIENCQVVEKSB7CiAjZWxzZQpAQCAtMTIyNyw3ICsxMjI4LDcgQEAKIAkJCWxwZGNiLT5CYXVkUmF0ZSA9IDM4NDAwOwogCQkJYnJlYWs7CiAJfQotCisjZW5kaWYKIAlzd2l0Y2ggKHBvcnQuY19jZmxhZyAmIENTSVpFKSB7CiAJCWNhc2UgQ1M1OgogCQkJbHBkY2ItPkJ5dGVTaXplID0gNTsKQEAgLTEzMTIsNiArMTMxMyw3IEBACiAJCWNvbW1lcnJvciA9IFdpbkVycm9yKCk7CQogCQlyZXR1cm4gRkFMU0U7CiAJfQorI2lmbmRlZiBfX0VNWF9fCiAjaWZkZWYgQ0JBVUQKICAgICAgICAgc3dpdGNoIChwb3J0LmNfY2ZsYWcgJiBDQkFVRCkgewogI2Vsc2UKQEAgLTEzNDUsNyArMTM0Nyw3IEBACiAJCQlscGRjYi0+QmF1ZFJhdGUgPSAzODQwMDsKIAkJCWJyZWFrOwogCX0KLQorI2VuZGlmCiAJc3dpdGNoIChwb3J0LmNfY2ZsYWcgJiBDU0laRSkgewogCQljYXNlIENTNToKIAkJCWxwZGNiLT5CeXRlU2l6ZSA9IDU7CmRpZmYgLS1naXQgYS9taXNjL2NwdS5jIGIvbWlzYy9jcHUuYwppbmRleCBmNWQxMGU4Li40M2E5NjQyIDEwMDY0NAotLS0gYS9taXNjL2NwdS5jCisrKyBiL21pc2MvY3B1LmMKQEAgLTIsNiArMiw3IEBACiAgKiBXaGF0IHByb2Nlc3Nvcj8KICAqCiAgKiBDb3B5cmlnaHQgMTk5NSBNb3J0ZW4gV2VsaW5kZXIKKyAqIENvcHlyaWdodCAxOTk3IE1hcmN1cyBNZWlzc25lcgogICovCiAKICNpbmNsdWRlIDxzdGRpby5oPgpAQCAtOSwzOSArMTAsOTMgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAKLWludCBydW50aW1lX2NwdSAodm9pZCkKK1ZPSUQKK0dldFN5c3RlbUluZm8oTFBTWVNURU1fSU5GTyBzaSkKIHsKLSNpZm5kZWYgX19pMzg2X18KLSAgICByZXR1cm4gNTsgIC8qIE1pZ2h0IGFzIHdlbGwgcHJldGVuZCB0byBiZSBhIFBlbnRpdW0uLi4gKi8KLSNlbHNlICAvKiBfX2kzODZfXyAqLwotICBzdGF0aWMgaW50IGNhY2hlID0gMDsKKwlzdGF0aWMgaW50IGNhY2hlID0gMDsKKwlzdGF0aWMgU1lTVEVNX0lORk8gY2FjaGVkc2k7CisKKwlpZiAoY2FjaGUpIHsKKwkJbWVtY3B5KHNpLCZjYWNoZWRzaSxzaXplb2YoKnNpKSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBjaG9vc2Ugc2Vuc2libGUgZGVmYXVsdHMgLi4uCisJICogRklYTUU6IHBlcmhhcHMgb3ZlcnJpZGVhYmxlIHdpdGggcHJlY29tcGlsZXIgZmxhZ3M/CisJICovCisJY2FjaGVkc2kudS54LndQcm9jZXNzb3JBcmNoaXRlY3R1cmUJPSBQUk9DRVNTT1JfQVJDSElURUNUVVJFX0lOVEVMOworCWNhY2hlZHNpLmR3UGFnZVNpemUgCQkJPSA0MDk2OworCisJLyogRklYTUU6IGJldHRlciB2YWx1ZXMgZm9yIHRoZSB0d28gZW50cmllcyBiZWxvdy4uLiAqLworCWNhY2hlZHNpLmxwTWluaW11bUFwcGxpY2F0aW9uQWRkcmVzcwk9ICh2b2lkICopMHg0MDAwMDAwMDsKKwljYWNoZWRzaS5scE1heGltdW1BcHBsaWNhdGlvbkFkZHJlc3MJPSAodm9pZCAqKTB4ODAwMDAwMDA7CisJY2FjaGVkc2kuZHdBY3RpdmVQcm9jZXNzb3JNYXNrCQk9IDE7CisJY2FjaGVkc2kuZHdOdW1iZXJPZlByb2Nlc3NvcnMJCT0gMTsKKwljYWNoZWRzaS5kd1Byb2Nlc3NvclR5cGUJCT0gUFJPQ0VTU09SX0lOVEVMXzM4NjsKKwljYWNoZWRzaS5kd0FsbG9jYXRpb25HcmFudWxhcml0eQk9IDg7CisJY2FjaGVkc2kud1Byb2Nlc3NvckxldmVsCQk9IDM7IC8qIDM4NiAqLworCWNhY2hlZHNpLndQcm9jZXNzb3JSZXZpc2lvbgkJPSAwOworCisJY2FjaGUgPSAxOyAvKiBldmVuIGlmIHRoZXJlIGlzIG5vIG1vcmUgaW5mbywgd2Ugbm93IGhhdmUgYSBjYWNoZWVudHJ5ICovCisJbWVtY3B5KHNpLCZjYWNoZWRzaSxzaXplb2YoKnNpKSk7CiAKICNpZmRlZiBsaW51eAotICBpZiAoIWNhY2hlKQotICAgIHsKLSAgICAgIEZJTEUgKmYgPSBmb3BlbiAoIi9wcm9jL2NwdWluZm8iLCAiciIpOwotCi0gICAgICBjYWNoZSA9IDM7ICAvKiBEZWZhdWx0LiAgKi8KLQotICAgICAgaWYgKGYpCiAJewotCSAgY2hhciBpbmZvWzVdLCB2YWx1ZVs1XTsKLQkgIHdoaWxlIChmc2NhbmYgKGYsICIgJTRzJSpzIDogJTRzJSpzIiwgaW5mbywgdmFsdWUpID09IDIpCi0JICAgIGlmICghbHN0cmNtcGkzMkEoaW5mbywgImNwdSIpKQotCSAgICAgIHsKLQkJaWYgKGlzZGlnaXQgKHZhbHVlWzBdKSAmJiB2YWx1ZVsxXSA9PSAnOCcKLQkJICAgICYmIHZhbHVlWzJdID09ICc2JyAmJiB2YWx1ZVszXSA9PSAwKQotCQkgIHsKLQkJICAgIGNhY2hlID0gdmFsdWVbMF0gLSAnMCc7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JICAgICAgfQotCSAgZmNsb3NlIChmKTsKKwljaGFyIGxpbmVbMjAwXSxpbmZvWzIwMF0sdmFsdWVbMjAwXSxqdW5rWzIwMF07CisJRklMRSAqZiA9IGZvcGVuICgiL3Byb2MvY3B1aW5mbyIsICJyIik7CisKKwlpZiAoIWYpCisJCXJldHVybjsKKwl3aGlsZSAoZmdldHMobGluZSwyMDAsZikhPU5VTEwpIHsKKwkJaWYgKHNzY2FuZihsaW5lLCIlcyVbIFx0Ol0lcyIsaW5mbyxqdW5rLHZhbHVlKSE9MykKKwkJCWNvbnRpbnVlOworCQlpZiAoIWxzdHJuY21waTMyQShsaW5lLCAiY3B1IiwzKSkgeworCQkJaWYgKAlpc2RpZ2l0ICh2YWx1ZVswXSkgJiYgdmFsdWVbMV0gPT0gJzgnICYmIAorCQkJCXZhbHVlWzJdID09ICc2JyAmJiB2YWx1ZVszXSA9PSAwCisJCQkpIHsKKwkJCQlzd2l0Y2ggKHZhbHVlWzBdIC0gJzAnKSB7CisJCQkJY2FzZSAzOgorCQkJCQljYWNoZWRzaS5kd1Byb2Nlc3NvclR5cGUgPSBQUk9DRVNTT1JfSU5URUxfMzg2OworCQkJCQljYWNoZWRzaS53UHJvY2Vzc29yTGV2ZWw9IDM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNDoKKwkJCQkJY2FjaGVkc2kuZHdQcm9jZXNzb3JUeXBlID0gUFJPQ0VTU09SX0lOVEVMXzQ4NjsKKwkJCQkJY2FjaGVkc2kud1Byb2Nlc3NvckxldmVsPSA0OworCQkJCQlicmVhazsKKwkJCQljYXNlIDU6CisJCQkJCWNhY2hlZHNpLmR3UHJvY2Vzc29yVHlwZSA9IFBST0NFU1NPUl9JTlRFTF9QRU5USVVNOworCQkJCQljYWNoZWRzaS53UHJvY2Vzc29yTGV2ZWw9IDU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNjogLyogRklYTUUgZG9lcyB0aGUgUFBybyBoYXZlIGEgc3BlY2lhbCB0eXBlPyAqLworCQkJCQljYWNoZWRzaS5kd1Byb2Nlc3NvclR5cGUgPSBQUk9DRVNTT1JfSU5URUxfUEVOVElVTTsKKwkJCQkJY2FjaGVkc2kud1Byb2Nlc3NvckxldmVsPSA1OworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKCFsc3RybmNtcGkzMkEoaW5mbywicHJvY2Vzc29yIiw5KSkgeworCQkJLyogcHJvY2Vzc29yIG51bWJlciBjb3VudHMgdXAuLi4qLworCQkJaW50CXg7CisKKwkJCWlmIChzc2NhbmYodmFsdWUsIiVkIiwmeCkpCisJCQkJaWYgKHgrMT5jYWNoZWRzaS5kd051bWJlck9mUHJvY2Vzc29ycykKKwkJCQkJY2FjaGVkc2kuZHdOdW1iZXJPZlByb2Nlc3NvcnM9eCsxOworCQl9CisJCWlmICghbHN0cm5jbXBpMzJBKGluZm8sInN0ZXBwaW5nIiw4KSkgeworCQkJaW50CXg7CisKKwkJCWlmIChzc2NhbmYodmFsdWUsIiVkIiwmeCkpCisJCQkJY2FjaGVkc2kud1Byb2Nlc3NvclJldmlzaW9uID0geDsKKwkJfQogCX0KLSAgICB9Ci0gIHJldHVybiBjYWNoZTsKKwlmY2xvc2UgKGYpOworCX0KKwltZW1jcHkoc2ksJmNhY2hlZHNpLHNpemVvZigqc2kpKTsKKwlyZXR1cm47CisjZWxzZSAgLyogbGludXggKi8KKwkvKiBGSVhNRTogaG93IGRvIHdlIGRvIHRoaXMgb24gb3RoZXIgc3lzdGVtcz8gKi8KKwlyZXR1cm47CiAjZW5kaWYgIC8qIGxpbnV4ICovCi0gIC8qIEZJWE1FOiBob3cgZG8gd2UgZG8gdGhpcyBvbiBvdGhlciBzeXN0ZW1zPyAqLwotICByZXR1cm4gMzsKLSNlbmRpZiAgLyogX19pMzg2X18gKi8KIH0KZGlmZiAtLWdpdCBhL21pc2MvY3J0ZGxsLmMgYi9taXNjL2NydGRsbC5jCmluZGV4IDU5MDlhNTMuLjk4ZmMzODQgMTAwNjQ0Ci0tLSBhL21pc2MvY3J0ZGxsLmMKKysrIGIvbWlzYy9jcnRkbGwuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgInhtYWxsb2MuaCIKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAiY3J0ZGxsLmgiCisjaW5jbHVkZSAiZHJpdmUuaCIKIAogVUlOVDMyIENSVERMTF9hcmdjX2RsbDsgICAgICAgICAvKiBDUlRETEwuMjMgKi8KIExQU1RSICpDUlRETExfYXJndl9kbGw7ICAgICAgICAgLyogQ1JURExMLjI0ICovCkBAIC03NjQsNiArNzY1LDIzIEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgd2NzY3NwbiAgICAgICAgICAgKENSVERMTC41MDgpCisgKi8KK0lOVDMyIENSVERMTF93Y3Njc3BuKExQV1NUUiBzdHIsTFBXU1RSIHJlamVjdCkKK3sKKwlMUFdTVFIJcyx0OworCisJcz1zdHI7CisJZG8geworCQl0PXJlamVjdDsKKwkJd2hpbGUgKCp0KSB7IGlmICgqdD09KnMpIGJyZWFrO3QrKzt9CisJCWlmICgqdCkgYnJlYWs7CisJCXMrKzsKKwl9IHdoaWxlICgqcyk7CisJcmV0dXJuIHMtc3RyOyAvKiBuciBvZiB3Y2hhcnMgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICAgICB3Y3NjaHIgICAgICAgICAgIChDUlRETEwuNTA0KQogICovCiBMUFdTVFIgQ1JURExMX3djc2NocihMUFdTVFIgc3RyLFdDSEFSIHhjaGFyKQpAQCAtODY4LDMgKzg4Niw1OCBAQAogCWZwcmludGYoc3RkbmltcCwiQ1JURExMLmF0ZXhpdCglcCksIFNUVUIuXG4iLHgpOwogCXJldHVybiAwOyAvKiBzdWNjZXNzZnVsICovCiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgbWJ0b3djICAgICAgICAgICAoQ1JURExMLjQzMCkKKyAqIEZJWE1FOiBjaGVjayBtdWx0aWJ5dGUgc3VwcG9ydAorICovCitXQ0hBUgorQ1JURExMX21idG93YyhDSEFSIGEpIHsKKwlyZXR1cm4gYTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICBfaXNjdHlwZSAgICAgICAgICAgKENSVERMTC4xMzgpCisgKi8KK0JPT0wzMgorQ1JURExMX19pc2N0eXBlKENIQVIgeCxDSEFSIHR5cGUpIHsKKwlpZiAoKHR5cGUgJiBDUlRETExfU1BBQ0UpICYmIGlzc3BhY2UoeCkpCisJCXJldHVybiBUUlVFOworCWlmICgodHlwZSAmIENSVERMTF9QVU5DVCkgJiYgaXNwdW5jdCh4KSkKKwkJcmV0dXJuIFRSVUU7CisJaWYgKCh0eXBlICYgQ1JURExMX0xPV0VSKSAmJiBpc2xvd2VyKHgpKQorCQlyZXR1cm4gVFJVRTsKKwlpZiAoKHR5cGUgJiBDUlRETExfVVBQRVIpICYmIGlzdXBwZXIoeCkpCisJCXJldHVybiBUUlVFOworCWlmICgodHlwZSAmIENSVERMTF9BTFBIQSkgJiYgaXNhbHBoYSh4KSkKKwkJcmV0dXJuIFRSVUU7CisJaWYgKCh0eXBlICYgQ1JURExMX0RJR0lUKSAmJiBpc2RpZ2l0KHgpKQorCQlyZXR1cm4gVFJVRTsKKwlpZiAoKHR5cGUgJiBDUlRETExfQ09OVFJPTCkgJiYgaXNjbnRybCh4KSkKKwkJcmV0dXJuIFRSVUU7CisJLyogY2hlY2sgQ1JURExMX0xFQURCWVRFICovCisJcmV0dXJuIEZBTFNFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgIF9jaGRyaXZlICAgICAgICAgICAoQ1JURExMLjUyKQorICovCitCT09MMzIKK0NSVERMTF9fY2hkcml2ZShJTlQzMiBuZXdkcml2ZSkgeworCS8qIEZJWE1FOiBnZW5lcmF0ZXMgZXJybm9zICovCisJcmV0dXJuIERSSVZFX1NldEN1cnJlbnREcml2ZShuZXdkcml2ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgX2Vycm5vICAgICAgICAgICAoQ1JURExMLjUyKQorICogWWVzLCB0aGlzIGlzIGEgZnVuY3Rpb24uCisgKi8KK0xQSU5UMzIKK0NSVERMTF9fZXJybm8oKSB7CisJc3RhdGljCWludCBjcnRkbGxlcnJubzsKKwlleHRlcm4gaW50IExhc3RFcnJvclRvRXJybm8oRFdPUkQpOworCisJLyogRklYTUU6IHdlIHNob3VsZCBzZXQgdGhlIGVycm9yIGF0IHRoZSBmYWlsaW5nIGZ1bmN0aW9uIGNhbGwgdGltZSAqLworCWNydGRsbGVycm5vID0gTGFzdEVycm9yVG9FcnJubyhHZXRMYXN0RXJyb3IoKSk7CisJcmV0dXJuICZjcnRkbGxlcnJubzsKK30KZGlmZiAtLWdpdCBhL21pc2MvZm9udGVuZ2luZS5jIGIvbWlzYy9mb250ZW5naW5lLmMKaW5kZXggZDk5OTgwNy4uMzc2YjdmNyAxMDA2NDQKLS0tIGEvbWlzYy9mb250ZW5naW5lLmMKKysrIGIvbWlzYy9mb250ZW5naW5lLmMKQEAgLTExLDcgKzExLDcgQEAKIFdPUkQgCiBFbmdpbmVFbnVtZXJhdGVGb250KExQU1RSIGZvbnRuYW1lLCBGQVJQUk9DMTYgcHJvYywgRFdPUkQgZGF0YSApCiB7Ci0gICAgcHJpbnRmKCJJbiBlbmdpbmVFbnVtZXJhdGVGb250IGZvciAlc1xuIixmb250bmFtZSk7CisgICAgcHJpbnRmKCJJbiBlbmdpbmVFbnVtZXJhdGVGb250IGZvciAlc1xuIiwoZm9udG5hbWUpP2ZvbnRuYW1lOiJOVUxMIik7CiAgICAgcmV0dXJuIDA7CiB9CiAjaWZkZWYgTk9UREVGCmRpZmYgLS1naXQgYS9taXNjL2tleWJvYXJkLmMgYi9taXNjL2tleWJvYXJkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1Yzc3NzEuLjAwMDAwMDAKLS0tIGEvbWlzYy9rZXlib2FyZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLS8qCi1zdGF0aWMgY2hhciBSQ1NJZFtdID0gIiRJZDoga2V5Ym9hcmQuYyx2IDEuMiAxOTkzLzA5LzEzIDE4OjUyOjAyIHNjb3R0IEV4cCAkIjsKLXN0YXRpYyBjaGFyIENvcHlyaWdodFtdID0gIkNvcHlyaWdodCAgU2NvdHQgQS4gTGFpcmQsIEVyaWsgQm9zICAxOTkzLCAxOTk0IjsKLSovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAid2luZG93cy5oIgotI2luY2x1ZGUgImtleWJvYXJkLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKLS8qICNkZWZpbmUgREVCVUdfS0VZQk9BUkQgKi8KLSNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgInhtYWxsb2MuaCIKLQotCi1zdHJ1Y3QgS2V5VGFibGVFbnRyeSB7Ci0JaW50IHZpcnR1YWxrZXk7Ci0JaW50IEFTQ0lJOwotCWludCBzY2FuY29kZTsKLQljb25zdCBjaGFyICpuYW1lOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBLZXlUYWJsZUVudHJ5IEtleVRhYmxlW10gPQotewotCXsgVktfQ0FOQ0VMLAkweDMsCTAsCSIiIH0sCi0JeyBWS19CQUNLLAkweDgsCTB4ZSwJIkJhY2tzcGFjZSIgfSwKLQl7IFZLX1RBQiwJMHg5LAkweGYsCSJUYWIiIH0sCi0JeyBWS19DTEVBUiwJMCwJMHg0YywJIkNsZWFyIiB9LAotCXsgVktfUkVUVVJOLAkweGQsCTB4MWMsCSJFbnRlciIgfSwKLQl7IFZLX1NISUZULAkwLAkweDJhLAkiU2hpZnQiIH0sCi0JeyBWS19DT05UUk9MLAkwLAkweDFkLAkiQ3RybCIgfSwKLQl7IFZLX01FTlUsCTAsCTB4MzgsCSJBbHQiIH0sCi0JeyBWS19DQVBJVEFMLAkwLAkweDNhLAkiQ2FwcyBMb2NrIiB9LAotCXsgVktfRVNDQVBFLAkweDFiLAkweDEsCSJFc2MiIH0sCi0JeyBWS19TUEFDRSwJMHgyMCwJMHgzOSwJIlNwYWNlIiB9LAotCXsgVktfUFJJT1IsCTAsCTB4NDksCSJQYWdlIFVwIiB9LAotCXsgVktfTkVYVCwJMCwJMHg1MSwJIlBhZ2UgRG93biIgfSwKLQl7IFZLX0VORCwJMCwJMHg0ZiwJIkVuZCIgfSwKLQl7IFZLX0hPTUUsCTAsCTB4NDcsCSJIb21lIiB9LAotCXsgVktfTEVGVCwJMCwJMHg0YiwJIkxlZnQgQXJyb3ciIH0sCi0JeyBWS19VUCwJMCwJMHg0OCwJIlVwIEFycm93IiB9LAotCXsgVktfUklHSFQsCTAsCTB4NGQsCSJSaWdodCBBcnJvdyIgfSwKLQl7IFZLX0RPV04sCTAsCTB4NTAsCSJEb3duIEFycm93IiB9LAotCXsgVktfSU5TRVJULAkwLAkweDUyLAkiSW5zIiB9LAotCXsgVktfREVMRVRFLAkwLAkweDUzLAkiRGVsIiB9LAotCXsgVktfMCwJCTB4MzAsCTB4YiwJIjAiIH0sCi0JeyBWS18xLAkJMHgzMSwJMHgyLAkiMSIgfSwKLQl7IFZLXzIsCQkweDMyLAkweDMsCSIyIiB9LAotCXsgVktfMywJCTB4MzMsCTB4NCwJIjMiIH0sCi0JeyBWS180LAkJMHgzNCwJMHg1LAkiNCIgfSwKLQl7IFZLXzUsCQkweDM1LAkweDYsCSI1IiB9LAotCXsgVktfNiwJCTB4MzYsCTB4NywJIjYiIH0sCi0JeyBWS183LAkJMHgzNywJMHg4LAkiNyIgfSwKLQl7IFZLXzgsCQkweDM4LAkweDksCSI4IiB9LAotCXsgVktfOSwJCTB4MzksCTB4YSwJIjkiIH0sCi0JeyBWS19BLAkJMHg0MSwJMHgxZSwJIkEiIH0sCi0JeyBWS19CLAkJMHg0MiwJMHgzMCwJIkIiIH0sCi0JeyBWS19DLAkJMHg0MywJMHgyZSwJIkMiIH0sCi0JeyBWS19ELAkJMHg0NCwJMHgyMCwJIkQiIH0sCi0JeyBWS19FLAkJMHg0NSwJMHgxMiwJIkUiIH0sCi0JeyBWS19GLAkJMHg0NiwJMHgyMSwJIkYiIH0sCi0JeyBWS19HLAkJMHg0NywJMHgyMiwJIkciIH0sCi0JeyBWS19ILAkJMHg0OCwJMHgyMywJIkgiIH0sCi0JeyBWS19JLAkJMHg0OSwJMHgxNywJIkkiIH0sCi0JeyBWS19KLAkJMHg0YSwJMHgyNCwJIkoiIH0sCi0JeyBWS19LLAkJMHg0YiwJMHgyNSwJIksiIH0sCi0JeyBWS19MLAkJMHg0YywJMHgyNiwJIkwiIH0sCi0JeyBWS19NLAkJMHg0ZCwJMHgzMiwJIk0iIH0sCi0JeyBWS19OLAkJMHg0ZSwJMHgzMSwJIk4iIH0sCi0JeyBWS19PLAkJMHg0ZiwJMHgxOCwJIk8iIH0sCi0JeyBWS19QLAkJMHg1MCwJMHgxOSwJIlAiIH0sCi0JeyBWS19RLAkJMHg1MSwJMHgxMCwJIlEiIH0sCi0JeyBWS19SLAkJMHg1MiwJMHgxMywJIlIiIH0sCi0JeyBWS19TLAkJMHg1MywJMHgxZiwJIlMiIH0sCi0JeyBWS19ULAkJMHg1NCwJMHgxNCwJIlQiIH0sCi0JeyBWS19VLAkJMHg1NSwJMHgxNiwJIlUiIH0sCi0JeyBWS19WLAkJMHg1NiwJMHgyZiwJIlYiIH0sCi0JeyBWS19XLAkJMHg1NywJMHgxMSwJIlciIH0sCi0JeyBWS19YLAkJMHg1OCwJMHgyZCwJIlgiIH0sCi0JeyBWS19ZLAkJMHg1OSwJMHgxNSwJIlkiIH0sCi0JeyBWS19aLAkJMHg1YSwJMHgyYywJIloiIH0sCi0JeyBWS19OVU1QQUQwLAkwLAkweDUyLAkiTnVtIDAiIH0sCi0JeyBWS19OVU1QQUQxLAkwLAkweDRmLAkiTnVtIDEiIH0sCi0JeyBWS19OVU1QQUQyLAkwLAkweDUwLAkiTnVtIDIiIH0sCi0JeyBWS19OVU1QQUQzLAkwLAkweDUxLAkiTnVtIDMiIH0sCi0JeyBWS19OVU1QQUQ0LAkwLAkweDRiLAkiTnVtIDQiIH0sCi0JeyBWS19OVU1QQUQ1LAkwLAkweDRjLAkiTnVtIDUiIH0sCi0JeyBWS19OVU1QQUQ2LAkwLAkweDRkLAkiTnVtIDYiIH0sCi0JeyBWS19OVU1QQUQ3LAkwLAkweDQ3LAkiTnVtIDciIH0sCi0JeyBWS19OVU1QQUQ4LAkwLAkweDQ4LAkiTnVtIDgiIH0sCi0JeyBWS19OVU1QQUQ5LAkwLAkweDQ5LAkiTnVtIDkiIH0sCi0JeyBWS19NVUxUSVBMWSwJMHgyYSwJMHgzNywJIk51bSAqIiB9LAotCXsgVktfQURELAkweDJiLAkweDRlLAkiTnVtICsiIH0sCi0JeyBWS19TRVBBUkFUT1IsCTAsCTAsCSIiIH0sCi0JeyBWS19TVUJUUkFDVCwJMHgyZCwJMHg0YSwJIk51bSAtIiB9LAotCXsgVktfREVDSU1BTCwJMHgyZSwJMHg1MywJIk51bSBEZWwiIH0sCi0JeyBWS19ESVZJREUsCTB4MmYsCTAsCSJOdW0gLyIgfSwKLQl7IFZLX0YxLAkwLAkweDNiLAkiRjEiIH0sCi0JeyBWS19GMiwJMCwJMHgzYywJIkYyIiB9LAotCXsgVktfRjMsCTAsCTB4M2QsCSJGMyIgfSwKLQl7IFZLX0Y0LAkwLAkweDNlLAkiRjQiIH0sCi0JeyBWS19GNSwJMCwJMHgzZiwJIkY1IiB9LAotCXsgVktfRjYsCTAsCTB4NDAsCSJGNiIgfSwKLQl7IFZLX0Y3LAkwLAkweDQxLAkiRjciIH0sCi0JeyBWS19GOCwJMCwJMHg0MiwJIkY4IiB9LAotCXsgVktfRjksCTAsCTB4NDMsCSJGOSIgfSwKLQl7IFZLX0YxMCwJMCwJMHg0NCwJIkYxMCIgfSwKLQl7IFZLX0YxMSwJMCwJMHg1NywJIkYxMSIgfSwKLQl7IFZLX0YxMiwJMCwJMHg1OCwJIkYxMiIgfSwKLQl7IFZLX05VTUxPQ0ssCTAsCTB4NDUsCSJOdW0gTG9jayIgfSwKLQl7IFZLX1NDUk9MTCwJMCwJMHg0NiwJIlNjcm9sbCBMb2NrIiB9LAotCS8qIEFsbG93YWJsZSByYW5nZXMgZm9yIE9FTS1zcGVjaWZpYyB2aXJ0dWFsLWtleSBjb2RlcyAqLwotLyoJLQkJICAgIDB4QkEtMHhDMAkJT0VNIHNwZWNpZmljICovCi0JeyAweGJhLAkJMHgzYiwJMHgyNywJIjsiIH0sCi0JeyAweGJiLAkJMHgzZCwJMHhkLAkiPSIgfSwKLQl7IDB4YmMsCQkweDJjLAkweDMzLAkiLCIgfSwKLQl7IDB4YmQsCQkweDJkLAkweGMsCSItIiB9LAotCXsgMHhiZSwJCTB4MmUsCTB4MzQsCSIuIiB9LAotCXsgMHhiZiwJCTB4MmYsCTB4MzUsCSIvIiB9LAotCXsgMHhjMCwJCTB4NjAsCTB4MjksCSJgIiB9LAotLyoJLQkJICAgIDB4REItMHhFNAkJT0VNIHNwZWNpZmljICovCi0JeyAweGRiLAkJMHg1YiwJMHgxYSwJIlsiIH0sCi0JeyAweGRjLAkJMHg1YywJMHgyYiwJIlxcIiB9LAotCXsgMHhkZCwJCTB4NWQsCTB4MWIsCSJdIiB9LAotCXsgMHhkZSwJCTB4MjcsCTB4MjgsCSInIiB9LAotCXsgMHhlMiwJCTB4NWMsCTB4NTYsCSJcXCIgfSwKLS8qCS0JCSAgICAweEU2CQlPRU0gc3BlY2lmaWMgKi8KLS8qCS0JCSAgICAweEU5LTB4RjUJCU9FTSBzcGVjaWZpYyAqLwotfTsKLQotI2RlZmluZSBLZXlUYWJsZVNpemUJc2l6ZW9mKEtleVRhYmxlKSAvIHNpemVvZihzdHJ1Y3QgS2V5VGFibGVFbnRyeSkKLQotaW50IFRvQXNjaWkoV09SRCB3VmlydEtleSwgV09SRCB3U2NhbkNvZGUsIExQU1RSIGxwS2V5U3RhdGUsIAotCUxQVk9JRCBscENoYXIsIFdPUkQgd0ZsYWdzKSAKLXsKLSNpZiAxCi0JcmV0dXJuIEVWRU5UX1RvQXNjaWkod1ZpcnRLZXksIHdTY2FuQ29kZSwgbHBLZXlTdGF0ZSwgbHBDaGFyLCB3RmxhZ3MpOwotI2Vsc2UKLQljaGFyIHNoaWZ0ID0gbHBLZXlTdGF0ZVtWS19TSElGVF0gPCAwOwotCWludCBpOwotCi0gICAgCWRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCAiVG9Bc2NpaSAoJXgsJXgpIC0+ICIsIHdWaXJ0S2V5LCB3U2NhbkNvZGUpOwotCi0JLyogRklYTUU6IGNvZGVwYWdlIGlzIGJyb2tlbiAqLwotCi0JKihCWVRFKilscENoYXIgPSAwOwotCXN3aXRjaCAod1ZpcnRLZXkpCi0JICB7Ci0jZGVmaW5lIHZrY2FzZTIoazEsazIsdmFsKSBjYXNlIHZhbCA6ICooQllURSopbHBDaGFyID0gc2hpZnQgPyBrMiA6IGsxOyBicmVhazsKLSNkZWZpbmUgdmtjYXNlKGssIHZhbCkgdmtjYXNlMih2YWwsIGssIHZhbCkKLQkgIFdJTkVfVktFWV9NQVBQSU5HUwotI3VuZGVmIHZrY2FzZQotI3VuZGVmIHZrY2FzZTIKLQkgIGRlZmF1bHQgOgotCSAgICBmb3IgKGkgPSAwIDsgOyBpKyspIAotCSAgICAgIHsKLQkgICAgICBpZiAoaSA9PSBLZXlUYWJsZVNpemUpCi0JCXsKLQkJICBkcHJpbnRmX2tleWJvYXJkKHN0ZGRlYiwgIjBcbiIpOwotCQkgIHJldHVybiAwOwotCQl9Ci0JICAgICAgaWYgKEtleVRhYmxlW2ldLnZpcnR1YWxrZXkgPT0gd1ZpcnRLZXkpICAKLQkgICAgICAgIHsKLQkJICBpZiAoIWlzcHJpbnQoS2V5VGFibGVbaV0uQVNDSUkpICYmICFpc3NwYWNlKEtleVRhYmxlW2ldLkFTQ0lJKSkKLQkJICAgIHsKLQkJICAgICAgZHByaW50Zl9rZXlib2FyZChzdGRkZWIsICIwXG4iKTsKLQkJICAgICAgcmV0dXJuIDA7Ci0JCSAgICB9Ci0JCSAgZHByaW50Zl9rZXlib2FyZChzdGRkZWIsIlwiJXNcIiAiLCBLZXlUYWJsZVtpXS5uYW1lKTsKLQotCQkgICooQllURSopbHBDaGFyID0gS2V5VGFibGVbaV0uQVNDSUk7Ci0JCSAgKigoKEJZVEUqKWxwQ2hhcikgKyAxKSA9IDA7Ci0KLQkJICBpZiAoaXNhbHBoYSgqKEJZVEUqKWxwQ2hhcikpCi0JCSAgICBpZiggKGxwS2V5U3RhdGVbVktfQ0FQSVRBTF08MCAmJiAhbHBLZXlTdGF0ZVtWS19TSElGVF0pIHx8Ci0JCQkoIWxwS2V5U3RhdGVbVktfQ0FQSVRBTF0gJiYgbHBLZXlTdGF0ZVtWS19TSElGVF08MCkgKQotCQkJKihCWVRFKilscENoYXIgPSB0b3VwcGVyKCAqKEJZVEUqKWxwQ2hhciApOwotCQkgICAgZWxzZQotCQkJKihCWVRFKilscENoYXIgPSB0b2xvd2VyKCAqKEJZVEUqKWxwQ2hhciApOwotCQkgIGJyZWFrOwotCSAgICAgICAgfQotCSAgICAgfQotCSAgfQotCWlmIChscEtleVN0YXRlW1ZLX0NPTlRST0xdIDwgMCkKLQkgICooQllURSopbHBDaGFyID0gKihCWVRFKilscENoYXIgJiAweDFmOwotCWRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCAiMSAoJXgpXG4iLCAqKEJZVEUqKWxwQ2hhcik7Ci0JcmV0dXJuIDE7Ci0jZW5kaWYKLX0KLQotRFdPUkQgT2VtS2V5U2NhbihXT1JEIHdPZW1DaGFyKQotewotICAgIGRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCIqT2VtS2V5U2NhbiAoJWQpXG4iLHdPZW1DaGFyKTsKLQotCXJldHVybiB3T2VtQ2hhcjsKLX0KLQotLyogVmtLZXlTY2FuIHRyYW5zbGF0ZXMgYW4gQU5TSSBjaGFyYWN0ZXIgdG8gYSB2aXJ0dWFsLWtleSBhbmQgc2hpZnQgY29kZQotICogZm9yIHRoZSBjdXJyZW50IGtleWJvYXJkLgotICogRklYTUUgaGlnaC1vcmRlciBieXRlIHNob3VsZCB5aWVsZCA6Ci0gKgkwCVVuc2hpZnRlZAotICoJMQlTaGlmdAotICoJMglDdHJsCi0gKgkzLTUJU2hpZnQta2V5IGNvbWJpbmF0aW9ucyB0aGF0IGFyZSBub3QgdXNlZCBmb3IgY2hhcmFjdGVycwotICoJNglDdHJsLUFsdAotICoJNwlDdHJsLUFsdC1TaGlmdAotICoJSS5lLiA6CVNoaWZ0ID0gMSwgQ3RybCA9IDIsIEFsdCA9IDQuCi0gKi8KLQotV09SRCBWa0tleVNjYW4oV09SRCBjQ2hhcikKLXsKLQlpbnQgaTsKLQkKLSAgICAJZHByaW50Zl9rZXlib2FyZChzdGRkZWIsIlZrS2V5U2NhbiAoJWQpXG4iLGNDaGFyKTsKLQkKLQlmb3IgKGkgPSAwIDsgaSAhPSBLZXlUYWJsZVNpemUgOyBpKyspIAotCQlpZiAoS2V5VGFibGVbaV0uQVNDSUkgPT0gY0NoYXIpCi0JCQlyZXR1cm4gS2V5VGFibGVbaV0udmlydHVhbGtleTsKLQotCXJldHVybiAtMTsKLX0KLQotV09SRCBWa0tleVNjYW4zMlcoV09SRCBjQ2hhcikKLXsKLQkvKiBsb3dlciBwYXJ0IG9mIGNDaGFyIGlzIHVzZWQgYW55d2F5ICovCi0JcmV0dXJuIFZrS2V5U2NhbihjQ2hhcik7Ci19Ci0KLWludCBHZXRLZXlib2FyZFR5cGUoaW50IG5UeXBlRmxhZykKLXsKLSAgZHByaW50Zl9rZXlib2FyZChzdGRkZWIsIkdldEtleWJvYXJkVHlwZSglZClcbiIsblR5cGVGbGFnKTsKLSAgc3dpdGNoKG5UeXBlRmxhZykKLSAgICB7Ci0gICAgY2FzZSAwOiAgICAgIC8qIEtleWJvYXJkIHR5cGUgKi8KLSAgICAgIHJldHVybiA0OyAgICAvKiBBVC0xMDEgKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTogICAgICAvKiBLZXlib2FyZCBTdWJ0eXBlICovCi0gICAgICByZXR1cm4gMDsgICAgLyogVGhlcmUgYXJlIG5vIGRlZmluZWQgc3VidHlwZXMgKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjogICAgICAvKiBOdW1iZXIgb2YgRi1rZXlzICovCi0gICAgICByZXR1cm4gMTI7ICAgLyogV2UncmUgZG9pbmcgYW4gMTAxIGZvciBub3csIHNvIHJldHVybiAxMiBGLWtleXMgKi8KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6ICAgICAKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biB0eXBlIG9uIEdldEtleWJvYXJkVHlwZVxuIik7Ci0gICAgICByZXR1cm4gMDsgICAgLyogVGhlIGJvb2sgc2F5cyAwIGhlcmUsIHNvIDAgKi8KLSAgICB9Ci19Ci0KLS8qIE1hcFZpcnR1YWxLZXkgdHJhbnNsYXRlcyBrZXljb2RlcyBmcm9tIG9uZSBmb3JtYXQgdG8gYW5vdGhlci4gKi8KLQotV09SRCBNYXBWaXJ0dWFsS2V5KFdPUkQgd0NvZGUsIFdPUkQgd01hcFR5cGUpCi17Ci0JaW50IGk7Ci0JCi0Jc3dpdGNoKHdNYXBUeXBlKSB7Ci0JCWNhc2UgMDoJLyogdmtleS1jb2RlIHRvIHNjYW4tY29kZSAqLwotCQkJZm9yIChpID0gMCA7IGkgIT0gS2V5VGFibGVTaXplIDsgaSsrKSAKLQkJCQlpZiAoS2V5VGFibGVbaV0udmlydHVhbGtleSA9PSB3Q29kZSkgCi0JCQkJCXJldHVybiBLZXlUYWJsZVtpXS5zY2FuY29kZTsKLQkJCXJldHVybiAwOwotCi0JCWNhc2UgMTogLyogc2Nhbi1jb2RlIHRvIHZrZXktY29kZSAqLwotCQkJZm9yIChpID0gMCA7IGkgIT0gS2V5VGFibGVTaXplIDsgaSsrKSAKLQkJCQlpZiAoS2V5VGFibGVbaV0uc2NhbmNvZGUgPT0gd0NvZGUpIAotCQkJCQlyZXR1cm4gS2V5VGFibGVbaV0udmlydHVhbGtleTsKLQkJCXJldHVybiAwOwotCi0JCWNhc2UgMjogLyogdmtleS1jb2RlIHRvIHVuc2hpZnRlZCBBTlNJIGNvZGUgKi8KLQkJCS8qIEZJWE1FIDogd2hhdCBkb2VzIHVuc2hpZnRlZCBtZWFuID8gJ2EnIG9yICdBJyA/ICovCi0JCQlmb3IgKGkgPSAwIDsgaSAhPSBLZXlUYWJsZVNpemUgOyBpKyspIAotCQkJCWlmIChLZXlUYWJsZVtpXS52aXJ0dWFsa2V5ID09IHdDb2RlKSAKLQkJCQkJcmV0dXJuIEtleVRhYmxlW2ldLkFTQ0lJOwotCQkJcmV0dXJuIDA7Ci0KLQkJZGVmYXVsdDogLyogcmVzZXJ2ZWQgKi8KLQkJCWZwcmludGYoc3RkZXJyLCAiTWFwVmlydHVhbEtleTogdW5rbm93biB3TWFwVHlwZSAlZCAhXG4iLAotCQkJCXdNYXBUeXBlKTsKLQkJCXJldHVybiAwOwkKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBHZXRLYkNvZGVQYWdlKHZvaWQpCi17Ci0gICAgCWRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCJHZXRLYkNvZGVQYWdlKClcbiIpOwotCXJldHVybiA4NTA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKglHZXRLZXlOYW1lVGV4dDMyVyAgIChVU0VSMzIuMjQ3KQotICovCi1JTlQzMiBHZXRLZXlOYW1lVGV4dDMyVyhMT05HIGxQYXJhbSwgTFBXU1RSIGxwQnVmZmVyLCBJTlQzMiBuU2l6ZSkKLXsKLQlMUFNUUiBidWYgPSB4bWFsbG9jKG5TaXplKTsKLQlpbnQJcmVzID0gR2V0S2V5TmFtZVRleHQzMkEobFBhcmFtLGJ1ZixuU2l6ZSk7Ci0KLQlsc3RyY3B5bkF0b1cobHBCdWZmZXIsYnVmLG5TaXplKTsKLQlmcmVlKGJ1Zik7Ci0JcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCUdldEtleU5hbWVUZXh0MzJBICAgKFVTRVIzMi4yNDYpCi0gKi8KLUlOVDMyIEdldEtleU5hbWVUZXh0MzJBKExPTkcgbFBhcmFtLCBMUFNUUiBscEJ1ZmZlciwgSU5UMzIgblNpemUpCi17Ci0JcmV0dXJuIEdldEtleU5hbWVUZXh0MTYobFBhcmFtLGxwQnVmZmVyLG5TaXplKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCUdldEtleU5hbWVUZXh0MTYgICAoS0VZQk9BUkQuMTMzKQotICovCi1JTlQxNiBHZXRLZXlOYW1lVGV4dDE2KExPTkcgbFBhcmFtLCBMUFNUUiBscEJ1ZmZlciwgSU5UMTYgblNpemUpCi17Ci0JaW50IGk7Ci0JCi0gICAgCWRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCJHZXRLZXlOYW1lVGV4dCglbGQsPHB0cj4sJWQpXG4iLGxQYXJhbSxuU2l6ZSk7Ci0KLQlsUGFyYW0gPj49IDE2OwotCWxQYXJhbSAmPSAweGZmOwotCi0JZm9yIChpID0gMCA7IGkgIT0gS2V5VGFibGVTaXplIDsgaSsrKSAKLQkJaWYgKEtleVRhYmxlW2ldLnNjYW5jb2RlID09IGxQYXJhbSkgIHsKLQkJCWxzdHJjcHluMzJBKCBscEJ1ZmZlciwgS2V5VGFibGVbaV0ubmFtZSwgblNpemUgKTsKLQkJCXJldHVybiBzdHJsZW4obHBCdWZmZXIpOwotCQl9Ci0KLQkqbHBCdWZmZXIgPSAwOwotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbWlzYy9sc3RyLmMgYi9taXNjL2xzdHIuYwppbmRleCBlOGE2ODNkLi41ZWE0NTA5IDEwMDY0NAotLS0gYS9taXNjL2xzdHIuYworKysgYi9taXNjL2xzdHIuYwpAQCAtNTY3LDYgKzU2NywxMSBAQAogCQkJCQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsc3ByaW50ZmJ1Zik7CiAJCQkJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxmbXRzdHIpOwogCQkJCQlicmVhazsKKwkJCQljYXNlICduJzoKKwkJCQkJLyogRklYTUU6IHBlcmhhcHMgYWRkIFxyIHRvbz8gKi8KKwkJCQkJQUREX1RPX1QoJ1xuJyk7CisJCQkJCWYrKzsKKwkJCQkJYnJlYWs7CiAJCQkJY2FzZSAnMCc6CiAJCQkJCW5vbGluZWZlZWQ9MTsKIAkJCQkJZisrOwpAQCAtNzYwLDYgKzc2NSwxMSBAQAogCQkJCQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsc3ByaW50ZmJ1Zik7CiAJCQkJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxmbXRzdHIpOwogCQkJCQlicmVhazsKKwkJCQljYXNlICduJzoKKwkJCQkJLyogRklYTUU6IHBlcmhhcHMgYWRkIFxyIHRvbz8gKi8KKwkJCQkJQUREX1RPX1QoJ1xuJyk7CisJCQkJCWYrKzsKKwkJCQkJYnJlYWs7CiAJCQkJY2FzZSAnMCc6CiAJCQkJCW5vbGluZWZlZWQ9MTsKIAkJCQkJZisrOwpkaWZmIC0tZ2l0IGEvbWlzYy9tYWluLmMgYi9taXNjL21haW4uYwppbmRleCAxNDYwOGQwLi41NzkwOTc2IDEwMDY0NAotLS0gYS9taXNjL21haW4uYworKysgYi9taXNjL21haW4uYwpAQCAtNzc0LDE1ICs3NzQsMTcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJR2V0V2luRmxhZ3MgKEtFUk5FTC4xMzIpCiAgKi8KLUxPTkcgR2V0V2luRmxhZ3Modm9pZCkKK0RXT1JEIEdldFdpbkZsYWdzKHZvaWQpCiB7CiAgIHN0YXRpYyBjb25zdCBsb25nIGNwdWZsYWdzWzVdID0KICAgICB7IFdGX0NQVTA4NiwgV0ZfQ1BVMTg2LCBXRl9DUFUyODYsIFdGX0NQVTM4NiwgV0ZfQ1BVNDg2IH07CisgIFNZU1RFTV9JTkZPCXNpOworICBsb25nIHJlc3VsdCA9IDAsY3B1ZmxhZzsKIAotICBsb25nIHJlc3VsdCA9IDA7CisgIEdldFN5c3RlbUluZm8oJnNpKTsKIAogICAvKiBUaGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYW55IFBlbnRpdW0gZmxhZy4gICovCi0gIGxvbmcgY3B1ZmxhZyA9IGNwdWZsYWdzW01JTiAocnVudGltZV9jcHUgKCksIDQpXTsKKyAgY3B1ZmxhZyA9IGNwdWZsYWdzW01JTiAoc2kud1Byb2Nlc3NvckxldmVsLCA0KV07CiAKICAgc3dpdGNoKE9wdGlvbnMubW9kZSkgewogICBjYXNlIE1PREVfU1RBTkRBUkQ6CmRpZmYgLS1naXQgYS9taXNjL29sZTJubHMuYyBiL21pc2Mvb2xlMm5scy5jCmluZGV4IDNkZjAxNDguLjYxYTFiMWYgMTAwNjQ0Ci0tLSBhL21pc2Mvb2xlMm5scy5jCisrKyBiL21pc2Mvb2xlMm5scy5jCkBAIC0xMjczLDcgKzEyNzMsOCBAQAogCQkJcmV0U3RyaW5nKTsKIAkJcmV0dXJuIDA7CiAJfQotCWxzdHJjcHluMzJBKGJ1ZixyZXRTdHJpbmcsbGVuKTsKKwlpZiAoYnVmKQorCQlsc3RyY3B5bjMyQShidWYscmV0U3RyaW5nLGxlbik7CiAJcmV0dXJuIHN0cmxlbihyZXRTdHJpbmcpKzE7CiB9CiAKQEAgLTEyODYsOSArMTI4Nyw5IEBACiAJaW50IGk7CiAJTFBTVFIgYWJ1ZiA9IChMUFNUUikgd2J1ZjsKIAlJTlQzMiBuID0gR2V0TG9jYWxlSW5mb0EobGNpZCwgTENUeXBlLCBhYnVmLCBsZW4pOwotCWZvciAoaSA9IG47IGkgPiAwOyAtLWkpIHsKLQkJd2J1ZltpXSA9IGFidWZbaV07Ci0JfQorCWlmICh3YnVmKQorCQlmb3IgKGkgPSBuOyBpID4gMDsgLS1pKQorCQkJd2J1ZltpXSA9IGFidWZbaV07CiAJcmV0dXJuIG47CiB9CiAKZGlmZiAtLWdpdCBhL21pc2MvcG9ydC5jIGIvbWlzYy9wb3J0LmMKaW5kZXggM2VlYzgyNC4uYjE2ZmYwZiAxMDA2NDQKLS0tIGEvbWlzYy9wb3J0LmMKKysrIGIvbWlzYy9wb3J0LmMKQEAgLTksNiArOSw5IEBACiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KIAogI2lmbmRlZiBIQVZFX1VTTEVFUAorI2lmZGVmIF9fRU1YX18KK3Vuc2lnbmVkIGludCB1c2xlZXAgKHVuc2lnbmVkIGludCB1c2Vjb25kcykgeyBEb3NTbGVlcCh1c2Vjb25kcyk7IH0KKyNlbHNlCiB1bnNpZ25lZCBpbnQgdXNsZWVwICh1bnNpZ25lZCBpbnQgdXNlY29uZHMpCiB7CiAgICAgc3RydWN0IHRpbWV2YWwgZGVsYXk7CkBAIC0xOSw2ICsyMiw3IEBACiAgICAgc2VsZWN0KCAwLCAwLCAwLCAwLCAmZGVsYXkgKTsKICAgICByZXR1cm4gMDsKIH0KKyNlbmRpZgogI2VuZGlmIC8qIEhBVkVfVVNMRUVQICovCiAKICNpZm5kZWYgSEFWRV9NRU1NT1ZFCmRpZmYgLS1naXQgYS9taXNjL3dpbnNvY2suYyBiL21pc2Mvd2luc29jay5jCmluZGV4IDMzNmMzZmMuLjVmYzRkYjcgMTAwNjQ0Ci0tLSBhL21pc2Mvd2luc29jay5jCisrKyBiL21pc2Mvd2luc29jay5jCkBAIC0xOCw2ICsxOCw3IEBACiAjZW5kaWYKICNpZiBkZWZpbmVkKF9fRU1YX18pCiAjaW5jbHVkZSA8c3lzL3NvX2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiAjZW5kaWYKICNpbmNsdWRlIDxzeXMvbXNnLmg+CiAjaW5jbHVkZSA8c3lzL3dhaXQuaD4KQEAgLTE3NDEsOCArMTc0MiwxMiBAQAogI2lmZGVmIEVEUVVPVAogCWNhc2UgRURRVU9UOgkJcmV0dXJuIFdTQUVEUVVPVDsKICNlbmRpZgorI2lmZGVmIEVTVEFMRQogCWNhc2UgRVNUQUxFOgkJcmV0dXJuIFdTQUVTVEFMRTsKKyNlbmRpZgorI2lmZGVmIEVSRU1PVEUKIAljYXNlIEVSRU1PVEU6CQlyZXR1cm4gV1NBRVJFTU9URTsKKyNlbmRpZgogCiAgICAgICAgLyoganVzdCBpbiBjYXNlIHdlIGV2ZXIgZ2V0IGhlcmUgYW5kIHRoZXJlIGFyZSBubyBwcm9ibGVtcyAqLwogCWNhc2UgMDoJCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL21pc2Mvd2luc29ja19hc3luYy5jIGIvbWlzYy93aW5zb2NrX2FzeW5jLmMKaW5kZXggODYzZjJmZi4uNjQ0MzNmNCAxMDA2NDQKLS0tIGEvbWlzYy93aW5zb2NrX2FzeW5jLmMKKysrIGIvbWlzYy93aW5zb2NrX2FzeW5jLmMKQEAgLTE0LDYgKzE0LDEzIEBACiAjaW5jbHVkZSA8c3lzL21zZy5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KKyNpZmRlZiBfX0VNWF9fCisjaW5jbHVkZSA8c3lzL3NvX2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjZW5kaWYKKyNpZm5kZWYgRkFTWU5DCisjZGVmaW5lIEZBU1lOQyBGSU9BU1lOQworI2VuZGlmCiAjaWZkZWYgX19zdnI0X18KICNpbmNsdWRlIDxzeXMvZmlsZS5oPgogI2luY2x1ZGUgPHN5cy9maWxpby5oPgpAQCAtNDIsNyArNDksOSBAQAogewogICAgIGludCBmZF9mbGFnczsKIAorI2lmbmRlZiBfX0VNWF9fCiAgICAgZmNudGwoZmQsIEZfU0VUT1dOLCBnZXRwaWQoKSk7CisjZW5kaWYKIAogICAgIGZkX2ZsYWdzID0gZmNudGwoZmQsIEZfR0VURkwsIDApOwogICAgIGlmIChmY250bChmZCwgRl9TRVRGTCwgKGFzeW5jKT8gZmRfZmxhZ3MgfCBGQVNZTkMKQEAgLTIxMyw3ICsyMjIsOSBAQAogICB7CiAgICAgIHdyaXRlKGFzeW5jX2N0bC53c19hb3AtPmZkWzFdLCAmYXN5bmNfY3RsLmxMZW5ndGgsIHNpemVvZih1bnNpZ25lZCkgKTsKICAgICAgd3JpdGUoYXN5bmNfY3RsLndzX2FvcC0+ZmRbMV0sIGFzeW5jX2N0bC5idWZmZXIsIGFzeW5jX2N0bC5sTGVuZ3RoICk7CisjaWZuZGVmIF9fRU1YX18KICAgICAga2lsbChnZXRwcGlkKCksIFNJR0lPKTsgICAgLyogc2ltdWxhdGUgYXN5bmMgSS9PICovCisjZW5kaWYKICNpZiBfX1dTX0FTWU5DX0RFQlVHCiAgIHByaW50ZigiaGFuZGxlciAtIG5vdGlmeSBhb3AgWyVkLCBidWYgJWRdXG4iLCBhc3luY19jdGwubExlbmd0aCwgYXN5bmNfY3RsLndzX2FvcC0+YnVmbGVuKTsKICNlbmRpZgpAQCAtNDE5LDcgKzQzMCw5IEBACiAgICAgICAgIChoX2Vycm5vIDwgMCkgPyAodW5zaWduZWQpV1NBTUFLRUFTWU5DUkVQTFkoIDAsIHdzYUVycm5vKCkgKQogICAgICAgICAgICAgICAgICAgICAgIDogKHVuc2lnbmVkKVdTQU1BS0VBU1lOQ1JFUExZKCAwLCB3c2FIZXJybm8oKSApOwogICAgICB3cml0ZShhc3luY19jdGwud3NfYW9wLT5mZFsxXSwgJmFzeW5jX2N0bC5sTGVuZ3RoLCBzaXplb2YodW5zaWduZWQpICk7CisjaWZuZGVmIF9fRU1YX18KICAgICAga2lsbChnZXRwcGlkKCksIFNJR0lPKTsgICAgLyogc2ltdWxhdGUgYXN5bmMgSS9PICovCisjZW5kaWYKICAgICAgcGF1c2UoKTsKIH0KIApkaWZmIC0tZ2l0IGEvbXNkb3MvZHBtaS5jIGIvbXNkb3MvZHBtaS5jCmluZGV4IDA5MmQ1MDAuLjJjNDZiNTkgMTAwNjQ0Ci0tLSBhL21zZG9zL2RwbWkuYworKysgYi9tc2Rvcy9kcG1pLmMKQEAgLTM1NCwxMiArMzU0LDE2IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAweDA0MDA6ICAvKiBHZXQgRFBNSSB2ZXJzaW9uICovCi0gICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IDB4MDA1YTsgIC8qIERQTUkgdmVyc2lvbiAwLjkwICovCi0gICAgICAgIEJYX3JlZyhjb250ZXh0KSA9IDB4MDAwNTsgIC8qIEZsYWdzOiAzMi1iaXQsIHZpcnR1YWwgbWVtb3J5ICovCi0gICAgICAgIENMX3JlZyhjb250ZXh0KSA9IHJ1bnRpbWVfY3B1ICgpOwotICAgICAgICBEWF9yZWcoY29udGV4dCkgPSAweDAxMDI7ICAvKiBNYXN0ZXIvc2xhdmUgaW50ZXJydXB0IGNvbnRyb2xsZXIgYmFzZSovCi0gICAgICAgIGJyZWFrOworICAgIAl7CisJICAgIFNZU1RFTV9JTkZPIHNpOwogCisJICAgIEdldFN5c3RlbUluZm8oJnNpKTsKKwkgICAgQVhfcmVnKGNvbnRleHQpID0gMHgwMDVhOyAgLyogRFBNSSB2ZXJzaW9uIDAuOTAgKi8KKwkgICAgQlhfcmVnKGNvbnRleHQpID0gMHgwMDA1OyAgLyogRmxhZ3M6IDMyLWJpdCwgdmlydHVhbCBtZW1vcnkgKi8KKwkgICAgQ0xfcmVnKGNvbnRleHQpID0gc2kud1Byb2Nlc3NvckxldmVsOworCSAgICBEWF9yZWcoY29udGV4dCkgPSAweDAxMDI7ICAvKiBNYXN0ZXIvc2xhdmUgaW50ZXJydXB0IGNvbnRyb2xsZXIgYmFzZSovCisJICAgIGJyZWFrOworCX0KICAgICBjYXNlIDB4MDUwMDogIC8qIEdldCBmcmVlIG1lbW9yeSBpbmZvcm1hdGlvbiAqLwogICAgICAgICB7CiAgICAgICAgICAgICBNRU1NQU5JTkZPIG1taTsKZGlmZiAtLWdpdCBhL21zZG9zL2ludDJmLmMgYi9tc2Rvcy9pbnQyZi5jCmluZGV4IDIzZWI5YWIuLjljZmQ3OTYgMTAwNjQ0Ci0tLSBhL21zZG9zL2ludDJmLmMKKysrIGIvbXNkb3MvaW50MmYuYwpAQCAtMTIxLDE2ICsxMjEsMjAgQEAKIAogICAgIC8qIEZJWE1FOiBpcyB0aGlzIHJpZ2h0PyAgU3BlY3Mgc2F5IHRoYXQgdGhpcyBzaG91bGQgb25seSBiZSBjYWxsYWJsZQogICAgICAgIGluIHJlYWwgKHY4NikgbW9kZSB3aGljaCB3ZSBuZXZlciBlbnRlci4gICovCi0gICAgY2FzZSAweDg3OiAgLyogRFBNSSBpbnN0YWxsYXRpb24gY2hlY2sgKi8KLSAgICAgICAgQVhfcmVnKGNvbnRleHQpID0gMHgwMDAwOyAvKiBEUE1JIEluc3RhbGxlZCAqLwotICAgICAgICBCWF9yZWcoY29udGV4dCkgPSAweDAwMDE7IC8qIDMyYml0cyBhdmFpbGFibGUgKi8KLSAgICAgICAgQ0xfcmVnKGNvbnRleHQpID0gcnVudGltZV9jcHUoKTsKLSAgICAgICAgRFhfcmVnKGNvbnRleHQpID0gMHgwMDVhOyAvKiBEUE1JIG1ham9yL21pbm9yIDAuOTAgKi8KLSAgICAgICAgU0lfcmVnKGNvbnRleHQpID0gMDsgICAgICAvKiAjIG9mIHBhcmEuIG9mIERPUyBleHRlbmRlZCBwcml2YXRlIGRhdGEgKi8KLSAgICAgICAgRVNfcmVnKGNvbnRleHQpID0gMDsgICAgICAvKiBFUzpESSBpcyBEUE1JIHN3aXRjaCBlbnRyeSBwb2ludCAqLwotICAgICAgICBESV9yZWcoY29udGV4dCkgPSAwOwotICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4ODc6IC8qIERQTUkgaW5zdGFsbGF0aW9uIGNoZWNrICovCisgICAgICAgIHsKKwkgICAgU1lTVEVNX0lORk8gc2k7CiAKKwkgICAgR2V0U3lzdGVtSW5mbygmc2kpOworCSAgICBBWF9yZWcoY29udGV4dCkgPSAweDAwMDA7IC8qIERQTUkgSW5zdGFsbGVkICovCisgICAgICAgICAgICBCWF9yZWcoY29udGV4dCkgPSAweDAwMDE7IC8qIDMyYml0cyBhdmFpbGFibGUgKi8KKyAgICAgICAgICAgIENMX3JlZyhjb250ZXh0KSA9IHNpLndQcm9jZXNzb3JMZXZlbDsKKyAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSA9IDB4MDA1YTsgLyogRFBNSSBtYWpvci9taW5vciAwLjkwICovCisgICAgICAgICAgICBTSV9yZWcoY29udGV4dCkgPSAwOyAgICAgIC8qICMgb2YgcGFyYS4gb2YgRE9TIGV4dGVuZGVkIHByaXZhdGUgZGF0YSAqLworICAgICAgICAgICAgRVNfcmVnKGNvbnRleHQpID0gMDsgICAgICAvKiBFUzpESSBpcyBEUE1JIHN3aXRjaCBlbnRyeSBwb2ludCAqLworICAgICAgICAgICAgRElfcmVnKGNvbnRleHQpID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgY2FzZSAweDhhOiAgLyogRFBNSSBnZXQgdmVuZG9yLXNwZWNpZmljIEFQSSBlbnRyeSBwb2ludC4gKi8KIAkvKiBUaGUgMS4wIHNwZWNzIHNheSB0aGlzIHNob3VsZCB3b3JrIHdpdGggYWxsIDAuOSBob3N0cy4gICovCiAJYnJlYWs7CmRpZmYgLS1naXQgYS9vYmplY3RzL2JpdG1hcC5jIGIvb2JqZWN0cy9iaXRtYXAuYwppbmRleCA3OTE4NDhkLi4xZDgxYjE2IDEwMDY0NAotLS0gYS9vYmplY3RzL2JpdG1hcC5jCisrKyBiL29iamVjdHMvYml0bWFwLmMKQEAgLTI3LDMzICsyNyw2IEBACiAKIGV4dGVybiB2b2lkIENMSVBQSU5HX1VwZGF0ZUdDUmVnaW9uKCBEQyAqIGRjICk7ICAvKiBvYmplY3RzL2NsaXBwaW5nLmMgKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQklUTUFQX0luaXQKLSAqLwotQk9PTDMyIEJJVE1BUF9Jbml0KHZvaWQpCi17Ci0gICAgUGl4bWFwIHRtcFBpeG1hcDsKLSAgICAKLSAgICAgIC8qIENyZWF0ZSB0aGUgbmVjZXNzYXJ5IEdDcyAqLwotICAgIAotICAgIGlmICgodG1wUGl4bWFwID0gWENyZWF0ZVBpeG1hcCggZGlzcGxheSwgcm9vdFdpbmRvdywgMSwgMSwgMSApKSkKLSAgICB7Ci0JQklUTUFQX21vbm9HQyA9IFhDcmVhdGVHQyggZGlzcGxheSwgdG1wUGl4bWFwLCAwLCBOVUxMICk7Ci0JWFNldEdyYXBoaWNzRXhwb3N1cmVzKCBkaXNwbGF5LCBCSVRNQVBfbW9ub0dDLCBGYWxzZSApOwotCVhGcmVlUGl4bWFwKCBkaXNwbGF5LCB0bXBQaXhtYXAgKTsKLSAgICB9Ci0KLSAgICBpZiAoc2NyZWVuRGVwdGggIT0gMSkKLSAgICB7Ci0JaWYgKCh0bXBQaXhtYXAgPSBYQ3JlYXRlUGl4bWFwKGRpc3BsYXksIHJvb3RXaW5kb3csIDEsMSxzY3JlZW5EZXB0aCkpKQotCXsKLQkgICAgQklUTUFQX2NvbG9yR0MgPSBYQ3JlYXRlR0MoIGRpc3BsYXksIHRtcFBpeG1hcCwgMCwgTlVMTCApOwotCSAgICBYU2V0R3JhcGhpY3NFeHBvc3VyZXMoIGRpc3BsYXksIEJJVE1BUF9jb2xvckdDLCBGYWxzZSApOwotCSAgICBYRnJlZVBpeG1hcCggZGlzcGxheSwgdG1wUGl4bWFwICk7Ci0JfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQ0MSw0MSArNDE0LDYgQEAKIH0KICAgICAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQklUTUFQX1NlbGVjdE9iamVjdAotICovCi1IQklUTUFQMTYgQklUTUFQX1NlbGVjdE9iamVjdCggREMgKiBkYywgSEJJVE1BUDE2IGhiaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUTUFQT0JKICogYm1wICkKLXsKLSAgICBIUkdOMzIgaHJnbjsKLSAgICBIQklUTUFQMTYgcHJldkhhbmRsZSA9IGRjLT53LmhCaXRtYXA7Ci0gICAgCi0gICAgaWYgKCEoZGMtPncuZmxhZ3MgJiBEQ19NRU1PUlkpKSByZXR1cm4gMDsKLQotICAgIGlmIChkYy0+dy5oVmlzUmduKQotICAgICAgIFNldFJlY3RSZ24oZGMtPncuaFZpc1JnbiwgMCwgMCwgYm1wLT5iaXRtYXAuYm1XaWR0aCwgYm1wLT5iaXRtYXAuYm1IZWlnaHQgKTsKLSAgICBlbHNlCi0gICAgeyAKLSAgICAgICBocmduID0gQ3JlYXRlUmVjdFJnbjMyKDAsIDAsIGJtcC0+Yml0bWFwLmJtV2lkdGgsIGJtcC0+Yml0bWFwLmJtSGVpZ2h0KTsKLSAgICAgICBpZiAoIWhyZ24pIHJldHVybiAwOwotICAgICAgIGRjLT53LmhWaXNSZ24gICAgPSBocmduOwotICAgIH0KLQotICAgIGRjLT51LnguZHJhd2FibGUgPSBibXAtPnBpeG1hcDsKLSAgICBkYy0+dy5oQml0bWFwICAgID0gaGJpdG1hcDsKLQotICAgICAgLyogQ2hhbmdlIEdDIGRlcHRoIGlmIG5lZWRlZCAqLwotCi0gICAgaWYgKGRjLT53LmJpdHNQZXJQaXhlbCAhPSBibXAtPmJpdG1hcC5ibUJpdHNQaXhlbCkKLSAgICB7Ci0JWEZyZWVHQyggZGlzcGxheSwgZGMtPnUueC5nYyApOwotCWRjLT51LnguZ2MgPSBYQ3JlYXRlR0MoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIDAsIE5VTEwgKTsKLQlkYy0+dy5iaXRzUGVyUGl4ZWwgPSBibXAtPmJpdG1hcC5ibUJpdHNQaXhlbDsKLSAgICAgICAgRENfSW5pdERDKCBkYyApOwotICAgIH0KLSAgICBlbHNlIENMSVBQSU5HX1VwZGF0ZUdDUmVnaW9uKCBkYyApOyAgLyogSnVzdCB1cGRhdGUgR0MgY2xpcCByZWdpb24gKi8KLSAgICByZXR1cm4gcHJldkhhbmRsZTsKLX0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ3JlYXRlRGlzY2FyZGFibGVCaXRtYXAgICAgKEdESS4xNTYpIChHREkzMi4zOCkKZGlmZiAtLWdpdCBhL29iamVjdHMvYnJ1c2guYyBiL29iamVjdHMvYnJ1c2guYwppbmRleCA3MGY3MTQzLi5lYjhiY2EyIDEwMDY0NAotLS0gYS9vYmplY3RzL2JydXNoLmMKKysrIGIvb2JqZWN0cy9icnVzaC5jCkBAIC0xMywxMzAgKzEzLDYgQEAKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKLSNkZWZpbmUgTkJfSEFUQ0hfU1RZTEVTICA2Ci0KLXN0YXRpYyBjb25zdCBjaGFyIEhhdGNoQnJ1c2hlc1tOQl9IQVRDSF9TVFlMRVNdWzhdID0KLXsKLSAgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwgLyogSFNfSE9SSVpPTlRBTCAqLwotICAgIHsgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCB9LCAvKiBIU19WRVJUSUNBTCAgICovCi0gICAgeyAweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwIH0sIC8qIEhTX0ZESUFHT05BTCAgKi8KLSAgICB7IDB4ODAsIDB4NDAsIDB4MjAsIDB4MTAsIDB4MDgsIDB4MDQsIDB4MDIsIDB4MDEgfSwgLyogSFNfQkRJQUdPTkFMICAqLwotICAgIHsgMHgwOCwgMHgwOCwgMHgwOCwgMHhmZiwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCB9LCAvKiBIU19DUk9TUyAgICAgICovCi0gICAgeyAweDgxLCAweDQyLCAweDI0LCAweDE4LCAweDE4LCAweDI0LCAweDQyLCAweDgxIH0gIC8qIEhTX0RJQUdDUk9TUyAgKi8KLX07Ci0KLSAgLyogTGV2ZWxzIG9mIGVhY2ggcHJpbWFyeSBmb3IgZGl0aGVyaW5nICovCi0jZGVmaW5lIFBSSU1BUllfTEVWRUxTICAzICAKLSNkZWZpbmUgVE9UQUxfTEVWRUxTICAgIChQUklNQVJZX0xFVkVMUypQUklNQVJZX0xFVkVMUypQUklNQVJZX0xFVkVMUykKLQotIC8qIERpdGhlcmluZyBtYXRyaXggc2l6ZSAgKi8KLSNkZWZpbmUgTUFUUklYX1NJWkUgICAgIDgKLSNkZWZpbmUgTUFUUklYX1NJWkVfMiAgIChNQVRSSVhfU0laRSpNQVRSSVhfU0laRSkKLQotICAvKiBUb3RhbCBudW1iZXIgb2YgcG9zc2libGUgbGV2ZWxzIGZvciBhIGRpdGhlcmVkIHByaW1hcnkgY29sb3IgKi8KLSNkZWZpbmUgRElUSEVSX0xFVkVMUyAgIChNQVRSSVhfU0laRV8yICogKFBSSU1BUllfTEVWRUxTLTEpICsgMSkKLQotICAvKiBEaXRoZXJpbmcgbWF0cml4ICovCi1zdGF0aWMgY29uc3QgaW50IGRpdGhlcl9tYXRyaXhbTUFUUklYX1NJWkVfMl0gPQotewotICAgICAwLCAzMiwgIDgsIDQwLCAgMiwgMzQsIDEwLCA0MiwKLSAgICA0OCwgMTYsIDU2LCAyNCwgNTAsIDE4LCA1OCwgMjYsCi0gICAgMTIsIDQ0LCAgNCwgMzYsIDE0LCA0NiwgIDYsIDM4LAotICAgIDYwLCAyOCwgNTIsIDIwLCA2MiwgMzAsIDU0LCAyMiwKLSAgICAgMywgMzUsIDExLCA0MywgIDEsIDMzLCAgOSwgNDEsCi0gICAgNTEsIDE5LCA1OSwgMjcsIDQ5LCAxNywgNTcsIDI1LAotICAgIDE1LCA0NywgIDcsIDM5LCAxMywgNDUsICA1LCAzNywKLSAgICA2MywgMzEsIDU1LCAyMywgNjEsIDI5LCA1MywgMjEKLX07Ci0KLSAgLyogTWFwcGluZyBiZXR3ZWVuIChSLEcsQikgdHJpcGxlcyBhbmQgRUdBIGNvbG9ycyAqLwotc3RhdGljIGNvbnN0IGludCBFR0FtYXBwaW5nW1RPVEFMX0xFVkVMU10gPQotewotICAgIDAsICAvKiAwMDAwMDAgLT4gMDAwMDAwICovCi0gICAgNCwgIC8qIDAwMDA3ZiAtPiAwMDAwODAgKi8KLSAgICAxMiwgLyogMDAwMGZmIC0+IDAwMDBmZiAqLwotICAgIDIsICAvKiAwMDdmMDAgLT4gMDA4MDAwICovCi0gICAgNiwgIC8qIDAwN2Y3ZiAtPiAwMDgwODAgKi8KLSAgICA2LCAgLyogMDA3ZmZmIC0+IDAwODA4MCAqLwotICAgIDEwLCAvKiAwMGZmMDAgLT4gMDBmZjAwICovCi0gICAgNiwgIC8qIDAwZmY3ZiAtPiAwMDgwODAgKi8KLSAgICAxNCwgLyogMDBmZmZmIC0+IDAwZmZmZiAqLwotICAgIDEsICAvKiA3ZjAwMDAgLT4gODAwMDAwICovCi0gICAgNSwgIC8qIDdmMDA3ZiAtPiA4MDAwODAgKi8KLSAgICA1LCAgLyogN2YwMGZmIC0+IDgwMDA4MCAqLwotICAgIDMsICAvKiA3ZjdmMDAgLT4gODA4MDAwICovCi0gICAgOCwgIC8qIDdmN2Y3ZiAtPiA4MDgwODAgKi8KLSAgICA3LCAgLyogN2Y3ZmZmIC0+IGMwYzBjMCAqLwotICAgIDMsICAvKiA3ZmZmMDAgLT4gODA4MDAwICovCi0gICAgNywgIC8qIDdmZmY3ZiAtPiBjMGMwYzAgKi8KLSAgICA3LCAgLyogN2ZmZmZmIC0+IGMwYzBjMCAqLwotICAgIDksICAvKiBmZjAwMDAgLT4gZmYwMDAwICovCi0gICAgNSwgIC8qIGZmMDA3ZiAtPiA4MDAwODAgKi8KLSAgICAxMywgLyogZmYwMGZmIC0+IGZmMDBmZiAqLwotICAgIDMsICAvKiBmZjdmMDAgLT4gODA4MDAwICovCi0gICAgNywgIC8qIGZmN2Y3ZiAtPiBjMGMwYzAgKi8KLSAgICA3LCAgLyogZmY3ZmZmIC0+IGMwYzBjMCAqLwotICAgIDExLCAvKiBmZmZmMDAgLT4gZmZmZjAwICovCi0gICAgNywgIC8qIGZmZmY3ZiAtPiBjMGMwYzAgKi8KLSAgICAxNSAgLyogZmZmZmZmIC0+IGZmZmZmZiAqLwotfTsKLQotI2RlZmluZSBQSVhFTF9WQUxVRShyLGcsYikgXAotICAgIENPTE9SX21hcEVHQVBpeGVsW0VHQW1hcHBpbmdbKChyKSpQUklNQVJZX0xFVkVMUysoZykpKlBSSU1BUllfTEVWRUxTKyhiKV1dCi0KLSAgLyogWCBpbWFnZSBmb3IgYnVpbGRpbmcgZGl0aGVyZWQgcGl4bWFwICovCi1zdGF0aWMgWEltYWdlICpkaXRoZXJJbWFnZSA9IE5VTEw7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQlJVU0hfSW5pdAotICoKLSAqIENyZWF0ZSB0aGUgWCBpbWFnZSB1c2VkIGZvciBkaXRoZXJpbmcuCi0gKi8KLUJPT0wzMiBCUlVTSF9Jbml0KHZvaWQpCi17Ci0gICAgWENSRUFURUlNQUdFKCBkaXRoZXJJbWFnZSwgTUFUUklYX1NJWkUsIE1BVFJJWF9TSVpFLCBzY3JlZW5EZXB0aCApOwotICAgIHJldHVybiAoZGl0aGVySW1hZ2UgIT0gTlVMTCk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQlJVU0hfRGl0aGVyQ29sb3IKLSAqLwotUGl4bWFwIEJSVVNIX0RpdGhlckNvbG9yKCBEQyAqZGMsIENPTE9SUkVGIGNvbG9yICkKLXsKLSAgICBzdGF0aWMgQ09MT1JSRUYgcHJldkNvbG9yID0gMHhmZmZmZmZmZjsKLSAgICB1bnNpZ25lZCBpbnQgeCwgeTsKLSAgICBQaXhtYXAgcGl4bWFwOwotCi0gICAgaWYgKGNvbG9yICE9IHByZXZDb2xvcikKLSAgICB7Ci0JaW50IHIgPSBHZXRSVmFsdWUoIGNvbG9yICkgKiBESVRIRVJfTEVWRUxTOwotCWludCBnID0gR2V0R1ZhbHVlKCBjb2xvciApICogRElUSEVSX0xFVkVMUzsKLQlpbnQgYiA9IEdldEJWYWx1ZSggY29sb3IgKSAqIERJVEhFUl9MRVZFTFM7Ci0JY29uc3QgaW50ICpwbWF0cml4ID0gZGl0aGVyX21hdHJpeDsKLQotCWZvciAoeSA9IDA7IHkgPCBNQVRSSVhfU0laRTsgeSsrKQotCXsKLQkgICAgZm9yICh4ID0gMDsgeCA8IE1BVFJJWF9TSVpFOyB4KyspCi0JICAgIHsKLQkJaW50IGQgID0gKnBtYXRyaXgrKyAqIDI1NjsKLQkJaW50IGRyID0gKChyICsgZCkgLyBNQVRSSVhfU0laRV8yKSAvIDI1NjsKLQkJaW50IGRnID0gKChnICsgZCkgLyBNQVRSSVhfU0laRV8yKSAvIDI1NjsKLQkJaW50IGRiID0gKChiICsgZCkgLyBNQVRSSVhfU0laRV8yKSAvIDI1NjsKLQkJWFB1dFBpeGVsKCBkaXRoZXJJbWFnZSwgeCwgeSwgUElYRUxfVkFMVUUoZHIsZGcsZGIpICk7Ci0JICAgIH0KLQl9Ci0JcHJldkNvbG9yID0gY29sb3I7Ci0gICAgfQotICAgIAotICAgIHBpeG1hcCA9IFhDcmVhdGVQaXhtYXAoIGRpc3BsYXksIHJvb3RXaW5kb3csCi0JCQkgICAgTUFUUklYX1NJWkUsIE1BVFJJWF9TSVpFLCBzY3JlZW5EZXB0aCApOwotICAgIFhQdXRJbWFnZSggZGlzcGxheSwgcGl4bWFwLCBCSVRNQVBfY29sb3JHQywgZGl0aGVySW1hZ2UsIDAsIDAsCi0JICAgICAgIDAsIDAsIE1BVFJJWF9TSVpFLCBNQVRSSVhfU0laRSApOwotICAgIHJldHVybiBwaXhtYXA7Ci19Ci0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ3JlYXRlQnJ1c2hJbmRpcmVjdDE2ICAgIChHREkuNTApCkBAIC00MTgsMTM0ICsyOTQsMyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEJSVVNIX1NlbGVjdFNvbGlkQnJ1c2gKLSAqLwotc3RhdGljIHZvaWQgQlJVU0hfU2VsZWN0U29saWRCcnVzaCggREMgKmRjLCBDT0xPUlJFRiBjb2xvciApCi17Ci0gICAgaWYgKChkYy0+dy5iaXRzUGVyUGl4ZWwgPiAxKSAmJiAoc2NyZWVuRGVwdGggPD0gOCkgJiYgIUNPTE9SX0lzU29saWQoIGNvbG9yICkpCi0gICAgewotCSAgLyogRGl0aGVyZWQgYnJ1c2ggKi8KLQlkYy0+dS54LmJydXNoLnBpeG1hcCA9IEJSVVNIX0RpdGhlckNvbG9yKCBkYywgY29sb3IgKTsKLQlkYy0+dS54LmJydXNoLmZpbGxTdHlsZSA9IEZpbGxUaWxlZDsKLQlkYy0+dS54LmJydXNoLnBpeGVsID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQkgIC8qIFNvbGlkIGJydXNoICovCi0JZGMtPnUueC5icnVzaC5waXhlbCA9IENPTE9SX1RvUGh5c2ljYWwoIGRjLCBjb2xvciApOwotCWRjLT51LnguYnJ1c2guZmlsbFN0eWxlID0gRmlsbFNvbGlkOwotICAgIH0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBCUlVTSF9TZWxlY3RQYXR0ZXJuQnJ1c2gKLSAqLwotc3RhdGljIEJPT0wzMiBCUlVTSF9TZWxlY3RQYXR0ZXJuQnJ1c2goIERDICogZGMsIEhCSVRNQVAzMiBoYml0bWFwICkKLXsKLSAgICBCSVRNQVBPQkogKiBibXAgPSAoQklUTUFQT0JKICopIEdESV9HZXRPYmpQdHIoIGhiaXRtYXAsIEJJVE1BUF9NQUdJQyApOwotICAgIGlmICghYm1wKSByZXR1cm4gRkFMU0U7Ci0gICAgZGMtPnUueC5icnVzaC5waXhtYXAgPSBYQ3JlYXRlUGl4bWFwKCBkaXNwbGF5LCByb290V2luZG93LAotCQkJCQkgIDgsIDgsIGJtcC0+Yml0bWFwLmJtQml0c1BpeGVsICk7Ci0gICAgWENvcHlBcmVhKCBkaXNwbGF5LCBibXAtPnBpeG1hcCwgZGMtPnUueC5icnVzaC5waXhtYXAsCi0JICAgICAgIEJJVE1BUF9HQyhibXApLCAwLCAwLCA4LCA4LCAwLCAwICk7Ci0gICAgCi0gICAgaWYgKGJtcC0+Yml0bWFwLmJtQml0c1BpeGVsID4gMSkKLSAgICB7Ci0JZGMtPnUueC5icnVzaC5maWxsU3R5bGUgPSBGaWxsVGlsZWQ7Ci0JZGMtPnUueC5icnVzaC5waXhlbCA9IDA7ICAvKiBJZ25vcmVkICovCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JZGMtPnUueC5icnVzaC5maWxsU3R5bGUgPSBGaWxsT3BhcXVlU3RpcHBsZWQ7Ci0JZGMtPnUueC5icnVzaC5waXhlbCA9IC0xOyAgLyogU3BlY2lhbCBjYXNlIChzZWUgRENfU2V0dXBHQ0ZvckJydXNoKSAqLwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEJSVVNIX1NlbGVjdE9iamVjdAotICovCi1IQlJVU0gzMiBCUlVTSF9TZWxlY3RPYmplY3QoIERDICogZGMsIEhCUlVTSDMyIGhicnVzaCwgQlJVU0hPQkogKiBicnVzaCApCi17Ci0gICAgSEJJVE1BUDE2IGhCaXRtYXA7Ci0gICAgQklUTUFQSU5GTyAqIGJtcEluZm87Ci0gICAgSEJSVVNIMTYgcHJldkhhbmRsZSA9IGRjLT53LmhCcnVzaDsKLQotICAgIGRwcmludGZfZ2RpKHN0ZGRlYiwgIkJydXNoX1NlbGVjdE9iamVjdDogaGRjPSUwNHggaGJydXNoPSUwNHhcbiIsCi0gICAgICAgICAgICAgICAgZGMtPmhTZWxmLGhicnVzaCk7Ci0gICAgaWYgKGRjLT5oZWFkZXIud01hZ2ljID09IE1FVEFGSUxFX0RDX01BR0lDKQotICAgIHsKLSAgICAgICAgTE9HQlJVU0gxNiBsb2dicnVzaCA9IHsgYnJ1c2gtPmxvZ2JydXNoLmxiU3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJydXNoLT5sb2dicnVzaC5sYkNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicnVzaC0+bG9nYnJ1c2gubGJIYXRjaCB9OwotCXN3aXRjaCAoYnJ1c2gtPmxvZ2JydXNoLmxiU3R5bGUpCi0JewotCWNhc2UgQlNfU09MSUQ6Ci0JY2FzZSBCU19IQVRDSEVEOgotCWNhc2UgQlNfSE9MTE9XOgotCSAgICBpZiAoIU1GX0NyZWF0ZUJydXNoSW5kaXJlY3QoIGRjLCBoYnJ1c2gsICZsb2dicnVzaCApKSByZXR1cm4gMDsKLQkgICAgYnJlYWs7Ci0JY2FzZSBCU19QQVRURVJOOgotCWNhc2UgQlNfRElCUEFUVEVSTjoKLQkgICAgaWYgKCFNRl9DcmVhdGVQYXR0ZXJuQnJ1c2goIGRjLCBoYnJ1c2gsICZsb2dicnVzaCApKSByZXR1cm4gMDsKLQkgICAgYnJlYWs7Ci0JfQotCXJldHVybiAxOyAgLyogRklYTUU/ICovCi0gICAgfQotICAgIAotICAgIGRjLT53LmhCcnVzaCA9IGhicnVzaDsKLQotICAgIGlmIChkYy0+dS54LmJydXNoLnBpeG1hcCkKLSAgICB7Ci0JWEZyZWVQaXhtYXAoIGRpc3BsYXksIGRjLT51LnguYnJ1c2gucGl4bWFwICk7Ci0JZGMtPnUueC5icnVzaC5waXhtYXAgPSAwOwotICAgIH0KLSAgICBkYy0+dS54LmJydXNoLnN0eWxlID0gYnJ1c2gtPmxvZ2JydXNoLmxiU3R5bGU7Ci0gICAgCi0gICAgc3dpdGNoKGJydXNoLT5sb2dicnVzaC5sYlN0eWxlKQotICAgIHsKLSAgICAgIGNhc2UgQlNfTlVMTDoKLQlkcHJpbnRmX2dkaSggc3RkZGViLCJCU19OVUxMXG4iICk7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgQlNfU09MSUQ6Ci0gICAgICAgIGRwcmludGZfZ2RpKCBzdGRkZWIsIkJTX1NPTElEXG4iICk7Ci0JQlJVU0hfU2VsZWN0U29saWRCcnVzaCggZGMsIGJydXNoLT5sb2dicnVzaC5sYkNvbG9yICk7Ci0JYnJlYWs7Ci0JCi0gICAgICBjYXNlIEJTX0hBVENIRUQ6Ci0JZHByaW50Zl9nZGkoIHN0ZGRlYiwgIkJTX0hBVENIRURcbiIgKTsKLQlkYy0+dS54LmJydXNoLnBpeGVsID0gQ09MT1JfVG9QaHlzaWNhbCggZGMsIGJydXNoLT5sb2dicnVzaC5sYkNvbG9yICk7Ci0JZGMtPnUueC5icnVzaC5waXhtYXAgPSBYQ3JlYXRlQml0bWFwRnJvbURhdGEoIGRpc3BsYXksIHJvb3RXaW5kb3csCi0JCQkJIEhhdGNoQnJ1c2hlc1ticnVzaC0+bG9nYnJ1c2gubGJIYXRjaF0sIDgsIDggKTsKLQlkYy0+dS54LmJydXNoLmZpbGxTdHlsZSA9IEZpbGxTdGlwcGxlZDsKLQlicmVhazsKLQkKLSAgICAgIGNhc2UgQlNfUEFUVEVSTjoKLQlkcHJpbnRmX2dkaSggc3RkZGViLCAiQlNfUEFUVEVSTlxuIik7Ci0JQlJVU0hfU2VsZWN0UGF0dGVybkJydXNoKCBkYywgKEhCUlVTSDE2KWJydXNoLT5sb2dicnVzaC5sYkhhdGNoICk7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgQlNfRElCUEFUVEVSTjoKLQlkcHJpbnRmX2dkaSggc3RkZGViLCAiQlNfRElCUEFUVEVSTlxuIik7Ci0JaWYgKChibXBJbmZvID0gKEJJVE1BUElORk8gKikgR2xvYmFsTG9jazE2KCAoSEdMT0JBTDE2KWJydXNoLT5sb2dicnVzaC5sYkhhdGNoICkpKQotCXsKLQkgICAgaW50IHNpemUgPSBESUJfQml0bWFwSW5mb1NpemUoIGJtcEluZm8sIGJydXNoLT5sb2dicnVzaC5sYkNvbG9yICk7Ci0JICAgIGhCaXRtYXAgPSBDcmVhdGVESUJpdG1hcDMyKCBkYy0+aFNlbGYsICZibXBJbmZvLT5ibWlIZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JNX0lOSVQsICgoY2hhciAqKWJtcEluZm8pICsgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibXBJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXT1JEKWJydXNoLT5sb2dicnVzaC5sYkNvbG9yICk7Ci0JICAgIEJSVVNIX1NlbGVjdFBhdHRlcm5CcnVzaCggZGMsIGhCaXRtYXAgKTsKLQkgICAgRGVsZXRlT2JqZWN0MTYoIGhCaXRtYXAgKTsKLQkgICAgR2xvYmFsVW5sb2NrMTYoIChIR0xPQkFMMTYpYnJ1c2gtPmxvZ2JydXNoLmxiSGF0Y2ggKTsJICAgIAotCX0KLQkKLQlicmVhazsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHByZXZIYW5kbGU7Ci19CmRpZmYgLS1naXQgYS9vYmplY3RzL2RjLmMgYi9vYmplY3RzL2RjLmMKaW5kZXggZDMzNjNkZS4uMDJiYzVjZSAxMDA2NDQKLS0tIGEvb2JqZWN0cy9kYy5jCisrKyBiL29iamVjdHMvZGMuYwpAQCAtNDMyLDYgKzQzMiw4IEBACiAJbmV3ZGMtPncuaENsaXBSZ24gPSBDcmVhdGVSZWN0UmduMzIoIDAsIDAsIDAsIDAgKTsKIAlDb21iaW5lUmduMzIoIG5ld2RjLT53LmhDbGlwUmduLCBkYy0+dy5oQ2xpcFJnbiwgMCwgUkdOX0NPUFkgKTsKICAgICB9CisgICAgZWxzZQorCW5ld2RjLT53LmhDbGlwUmduID0gMDsKICAgICByZXR1cm4gaGFuZGxlOwogfQogCmRpZmYgLS1naXQgYS9vYmplY3RzL2ZvbnQuYyBiL29iamVjdHMvZm9udC5jCmluZGV4IDI0ODllNGQuLmI0YTNhMzIgMTAwNjQ0Ci0tLSBhL29iamVjdHMvZm9udC5jCisrKyBiL29iamVjdHMvZm9udC5jCkBAIC0yMSwxMSArMjEsOCBAQAogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAotI2RlZmluZSBGT05UQ0FDSEUgCTMyCS8qIGR5bmFtaWMgZm9udCBjYWNoZSBzaXplICovCi0jZGVmaW5lIE1BWF9GT05UUwkyNTYKLXN0YXRpYyBMUExPR0ZPTlQxNiBscExvZ0ZvbnRMaXN0W01BWF9GT05UUysxXTsKK0xQTE9HRk9OVDE2IGxwTG9nRm9udExpc3RbTUFYX0ZPTlRTKzFdOwogCi1zdGF0aWMgaW50IFBhcnNlRm9udFBhcm1zKExQU1RSIGxwRm9udCwgV09SRCB3UGFybXNObywgTFBTVFIgbHBSZXRTdHIsIFdPUkQgd01heFNpeik7CiAKICNkZWZpbmUgQ0lfTk9ORVhJU1RDSEFSKGNzKSAoKChjcyktPndpZHRoID09IDApICYmIFwKIAkJCSAgICAgKCgoY3MpLT5yYmVhcmluZ3woY3MpLT5sYmVhcmluZ3wgXApAQCAtNTQsMjM4ICs1MSw4IEBACiAjZGVmaW5lIENJX0dFVF9ERUZBVUxUX0lORk8oZnMsY3MpIFwKICAgQ0lfR0VUX0NIQVJfSU5GTyhmcywgZnMtPmRlZmF1bHRfY2hhciwgTlVMTCwgY3MpCiAKLXN0cnVjdCBGb250U3RydWN0dXJlIHsKLQljaGFyICp3aW5kb3c7Ci0JY2hhciAqeDExOwotfSBGb250TmFtZXNbMzJdOwotaW50IEZvbnRTaXplOwogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEZPTlRfSW5pdAotICovCi1CT09MMzIgRk9OVF9Jbml0KCB2b2lkICkKLXsKLSAgY2hhciAgdGVtcFsxMDI0XTsKLSAgTFBTVFIgcHRyOwotICBpbnQgaTsKLQotICBpZiAoUFJPRklMRV9HZXRXaW5lSW5pU3RyaW5nKCAiZm9udHMiLCBOVUxMLCAiKiIsIHRlbXAsIHNpemVvZih0ZW1wKSApID4gMiApCi0gIHsKLSAgICBmb3IoIHB0ciA9IHRlbXAsIGkgPSAxOyBzdHJsZW4ocHRyKSAhPSAwOyBwdHIgKz0gc3RybGVuKHB0cikgKyAxICkKLSAgICAgIGlmKCBzdHJjbXAoIHB0ciwgImRlZmF1bHQiICkgKQotCUZvbnROYW1lc1tpKytdLndpbmRvdyA9IHhzdHJkdXAoIHB0ciApOwotICAgIEZvbnRTaXplID0gaTsKLQotICAgIGZvciggaSA9IDE7IGkgPCBGb250U2l6ZTsgaSsrICkKLSAgICB7Ci0gICAgICAgIFBST0ZJTEVfR2V0V2luZUluaVN0cmluZyggImZvbnRzIiwgRm9udE5hbWVzW2ldLndpbmRvdywgIioiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAsIHNpemVvZih0ZW1wKSApOwotICAgICAgICBGb250TmFtZXNbaV0ueDExID0geHN0cmR1cCggdGVtcCApOwotICAgIH0KLSAgICBQUk9GSUxFX0dldFdpbmVJbmlTdHJpbmcoICJmb250cyIsICJkZWZhdWx0IiwgIioiLCB0ZW1wLCBzaXplb2YodGVtcCkgKTsKLSAgICBGb250TmFtZXNbMF0ueDExID0geHN0cmR1cCggdGVtcCApOwotCi0gIH0gZWxzZSB7Ci0gICAgRm9udE5hbWVzWzBdLndpbmRvdyA9IE5VTEw7IEZvbnROYW1lc1swXS54MTEgPSAiKi1oZWx2ZXRpY2EiOwotICAgIEZvbnROYW1lc1sxXS53aW5kb3cgPSAibXMgc2FucyBzZXJpZiI7IEZvbnROYW1lc1sxXS54MTEgPSAiKi1oZWx2ZXRpY2EiOwotICAgIEZvbnROYW1lc1syXS53aW5kb3cgPSAibXMgc2VyaWYiOyBGb250TmFtZXNbMl0ueDExID0gIiotdGltZXMiOwotICAgIEZvbnROYW1lc1szXS53aW5kb3cgPSAiZml4ZWRzeXMiOyBGb250TmFtZXNbM10ueDExID0gIiotZml4ZWQiOwotICAgIEZvbnROYW1lc1s0XS53aW5kb3cgPSAiYXJpYWwiOyBGb250TmFtZXNbNF0ueDExID0gIiotaGVsdmV0aWNhIjsKLSAgICBGb250TmFtZXNbNV0ud2luZG93ID0gImhlbHYiOyBGb250TmFtZXNbNV0ueDExID0gIiotaGVsdmV0aWNhIjsKLSAgICBGb250TmFtZXNbNl0ud2luZG93ID0gInJvbWFuIjsgRm9udE5hbWVzWzZdLngxMSA9ICIqLXRpbWVzIjsKLSAgICBGb250TmFtZXNbN10ud2luZG93ID0gInN5c3RlbSI7IEZvbnROYW1lc1s3XS54MTEgPSAiKi1oZWx2ZXRpY2EiOwotICAgIEZvbnRTaXplID0gODsKLSAgfQotICByZXR1cm4gVFJVRTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRk9OVF9DaGtYMTFGYW1pbHkKLSAqCi0gKiByZXR1cm5zIGEgdmFsaWQgWDExIGVxdWl2YWxlbnQgaWYgYSBXaW5kb3dzIGZhY2UgbmFtZSAKLSAqIGlzIGxpa2UgYSBYMTEgZmFtaWx5ICAtIG9yIE5VTEwgaWYgdHJhbnNsYXRpb24gaXMgbmVlZGVkCi0gKi8KLXN0YXRpYyBjaGFyICpGT05UX0Noa1gxMUZhbWlseShjaGFyICp3aW5GYWNlTmFtZSApCi17Ci0gIHN0YXRpYyBjaGFyIHgxMWZhbVszMisyXTsgICAvKiB3aWxsIGJlIHJldHVybmVkICovCi0gIGludCBpOwotCi0gIGZvcihpID0gMDsgbHBMb2dGb250TGlzdFtpXSAhPSBOVUxMOyBpKyspCi0gICAgaWYoICFsc3RyY21waTMyQSh3aW5GYWNlTmFtZSwgbHBMb2dGb250TGlzdFtpXS0+bGZGYWNlTmFtZSkgKQotICAgIHsKLQlzdHJjcHkoeDExZmFtLCIqLSIpOwotCXJldHVybiBzdHJjYXQoeDExZmFtLHdpbkZhY2VOYW1lKTsKLSAgICB9ICAgIAotICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAvKiBhIEZPTlRfVHJhbnNsYXRlTmFtZSgpIGNhbGwgaXMgbmVlZGVkICovCi19Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBGT05UX1RyYW5zbGF0ZU5hbWUKLSAqCi0gKiBUcmFuc2xhdGUgYSBXaW5kb3dzIGZhY2UgbmFtZSB0byBpdHMgWDExIGVxdWl2YWxlbnQuCi0gKiBUaGlzIHdpbGwgcHJvYmFibHkgaGF2ZSB0byBiZSBjdXN0b21pemFibGUuCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICpGT05UX1RyYW5zbGF0ZU5hbWUoIGNoYXIgKndpbkZhY2VOYW1lICkKLXsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMTsgaSA8IEZvbnRTaXplOyBpICsrKQotICAgIGlmKCAhbHN0cmNtcGkzMkEoIHdpbkZhY2VOYW1lLCBGb250TmFtZXNbaV0ud2luZG93ICkgKSB7Ci0gICAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCAiLS0tLSBNYXBwZWQgJXMgdG8gJXNcbiIsIHdpbkZhY2VOYW1lLCBGb250TmFtZXNbaV0ueDExICk7Ci0gICAgICByZXR1cm4gRm9udE5hbWVzW2ldLngxMTsKLSAgICB9Ci0gIHJldHVybiBGb250TmFtZXNbMF0ueDExOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEZPTlRfTWF0Y2hGb250Ci0gKgotICogRmluZCBhIFggZm9udCBtYXRjaGluZyB0aGUgbG9naWNhbCBmb250LgotICovCi1zdGF0aWMgWEZvbnRTdHJ1Y3QgKiBGT05UX01hdGNoRm9udCggTE9HRk9OVDE2ICogZm9udCwgREMgKiBkYyApCi17Ci0gICAgY2hhciBwYXR0ZXJuWzEwMF07Ci0gICAgY29uc3QgY2hhciAqZmFtaWx5LCAqd2VpZ2h0LCAqY2hhcnNldDsKLSAgICBjaGFyICoqbmFtZXM7Ci0gICAgY2hhciBzbGFudCwgb2xkc3BhY2luZywgc3BhY2luZzsKLSAgICBpbnQgd2lkdGgsIGhlaWdodCwgb2xkaGVpZ2h0LCBjb3VudDsKLSAgICBYRm9udFN0cnVjdCAqIGZvbnRTdHJ1Y3Q7Ci0gICAgCi0gICAgZHByaW50Zl9mb250KHN0ZGRlYiwKLQkiRk9OVF9NYXRjaEZvbnQoSCxXID0gJWQsJWQ7IFdlaWdodCA9ICVkOyBJdGFsaWMgPSAlZDsgRmFjZU5hbWUgPSAnJXMnXG4iLAotCWZvbnQtPmxmSGVpZ2h0LCBmb250LT5sZldpZHRoLCBmb250LT5sZldlaWdodCwgZm9udC0+bGZJdGFsaWMsIGZvbnQtPmxmRmFjZU5hbWUpOwotICAgIHdlaWdodCA9IChmb250LT5sZldlaWdodCA+IDU1MCkgPyAiYm9sZCIgOiAibWVkaXVtIjsKLSAgICBzbGFudCA9IGZvbnQtPmxmSXRhbGljID8gJ2knIDogJ3InOwotICAgIGlmIChmb250LT5sZkhlaWdodCA9PSAtMSkKLQloZWlnaHQgPSAwOwotICAgIGVsc2UKLQloZWlnaHQgPSBmb250LT5sZkhlaWdodCAqIGRjLT52cG9ydEV4dFggLyBkYy0+d25kRXh0WDsKLSAgICBpZiAoaGVpZ2h0ID09IDApIGhlaWdodCA9IDEyMDsgIC8qIERlZmF1bHQgaGVpZ2h0ID0gMTIgKi8KLSAgICBlbHNlIGlmIChoZWlnaHQgPCAwKQotICAgIHsKLSAgICAgICAgLyogSWYgaGVpZ2h0IGlzIG5lZ2F0aXZlLCBpdCBtZWFucyB0aGUgaGVpZ2h0IG9mIHRoZSBjaGFyYWN0ZXJzICovCi0gICAgICAgIC8qICp3aXRob3V0KiB0aGUgaW50ZXJuYWwgbGVhZGluZy4gU28gd2UgYWRqdXN0IGl0IGEgYml0IHRvICAgICAqLwotICAgICAgICAvKiBjb21wZW5zYXRlLiA1LzQgc2VlbXMgdG8gZ2l2ZSBnb29kIHJlc3VsdHMgZm9yIHNtYWxsIGZvbnRzLiAgKi8KLQkvKiAKLSAgICAgICAgICogSi5NLjogVGhpcyBjYXVzZXMgd3JvbmcgZm9udCBzaXplIGZvciBiaWdnZXIgZm9udHMgZS5nLiBpbiBXaW53b3JkICYgV3JpdGUgCi0gICAgICAgIGhlaWdodCA9IDEwICogKC1oZWlnaHQgKiA5IC8gOCk7Ci0JICogbWF5IGJlIHdlIGhhdmUgdG8gdXNlIGFuIG5vbiBsaW5lYXIgZnVuY3Rpb24KLQkqLwotCS8qIGFzc3VtZSBpbnRlcm5hbCBsZWFkaW5nIGlzIDIgcGl4ZWxzLiBFbHNlIHNtYWxsIGZvbnRzIHdpbGwgYmVjb21lCi0gICAgICAgICAqIHZlcnkgc21hbGwuICovCi0gICAgICAgIGhlaWdodCA9IChoZWlnaHQtMikgKiAtMTA7IAotICAgIH0KLSAgICBlbHNlIGhlaWdodCAqPSAxMDsKLSAgICB3aWR0aCAgPSAxMCAqIChmb250LT5sZldpZHRoICogZGMtPnZwb3J0RXh0WSAvIGRjLT53bmRFeHRZKTsKLSAgICBpZiAod2lkdGggPCAwKSB7Ci0JZHByaW50Zl9mb250KCBzdGRkZWIsICJGT05UX01hdGNoRm9udDogbmVnYXRpdmUgd2lkdGggJWQoJWQpXG4iLAotCQkgICAgICB3aWR0aCwgZm9udC0+bGZXaWR0aCApOwotCXdpZHRoID0gLXdpZHRoOwotICAgIH0KLQotICAgIHNwYWNpbmcgPSAoZm9udC0+bGZQaXRjaEFuZEZhbWlseSAmIEZJWEVEX1BJVENIKSA/ICdtJyA6Ci0JICAgICAgKGZvbnQtPmxmUGl0Y2hBbmRGYW1pbHkgJiBWQVJJQUJMRV9QSVRDSCkgPyAncCcgOiAnKic7Ci0gICAgCi0gIAotICAgIGNoYXJzZXQgPSAoZm9udC0+bGZDaGFyU2V0ID09IEFOU0lfQ0hBUlNFVCkgPyAiaXNvODg1OS0xIiA6ICIqLSoiOwotICAgIGlmICgqZm9udC0+bGZGYWNlTmFtZSkgewotCWZhbWlseSA9IEZPTlRfQ2hrWDExRmFtaWx5KGZvbnQtPmxmRmFjZU5hbWUpOwotCS8qLS1kbyBfbm90XyB0cmFuc2xhdGUgaWYgbGZGYWNlTmFtZSBpcyBmYW1pbHkgZnJvbSBYMTEgIEEuSy4qLwotCWlmICghZmFtaWx5KSAKLQkgIGZhbWlseSA9IEZPTlRfVHJhbnNsYXRlTmFtZSggZm9udC0+bGZGYWNlTmFtZSApOwotCS8qIEZJWCBNRTogSSBkb24ndCBpZiB0aGF0J3MgY29ycmVjdCBidXQgaXQgd29ya3MgSi5NLiAqLwotCXNwYWNpbmcgPSAnKic7Ci0JfQotICAgIGVsc2Ugc3dpdGNoKGZvbnQtPmxmUGl0Y2hBbmRGYW1pbHkgJiAweGYwKQotICAgIHsKLSAgICBjYXNlIEZGX1JPTUFOOgotICAgICAgZmFtaWx5ID0gRk9OVF9UcmFuc2xhdGVOYW1lKCAicm9tYW4iICk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZGX1NXSVNTOgotICAgICAgZmFtaWx5ID0gRk9OVF9UcmFuc2xhdGVOYW1lKCAic3dpc3MiICk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZGX01PREVSTjoKLSAgICAgIGZhbWlseSA9IEZPTlRfVHJhbnNsYXRlTmFtZSggIm1vZGVybiIgKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRkZfU0NSSVBUOgotICAgICAgZmFtaWx5ID0gRk9OVF9UcmFuc2xhdGVOYW1lKCAic2NyaXB0IiApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGRl9ERUNPUkFUSVZFOgotICAgICAgZmFtaWx5ID0gRk9OVF9UcmFuc2xhdGVOYW1lKCAiZGVjb3JhdGl2ZSIgKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmYW1pbHkgPSAiKi0qIjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBzcHJpbnRmKCBwYXR0ZXJuLCAiLSVzLSVzLSotbm9ybWFsLSotKi0qLSotKi0qLSotJXMiLAotCSAgICBmYW1pbHksIHdlaWdodCwgY2hhcnNldCk7Ci0gICAgZHByaW50Zl9mb250KHN0ZGRlYiwgIkZPTlRfTWF0Y2hGb250OiAnJXMnXG4iLCBwYXR0ZXJuICk7Ci0gICAgbmFtZXMgPSBYTGlzdEZvbnRzKCBkaXNwbGF5LCBwYXR0ZXJuLCAxLCAmY291bnQgKTsKLSAgICBpZiAobmFtZXMpIFhGcmVlRm9udE5hbWVzKCBuYW1lcyApOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChzdHJjbXAoZmFtaWx5LCAiKi0qIikgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGT05UX01hdGNoRm9udCglcykgOiByZXR1cm5pbmcgTlVMTFxuIiwgcGF0dGVybik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGZhbWlseSA9ICIqLSoiOwotICAgIH0KLSAgICBvbGRoZWlnaHQgPSBoZWlnaHQ7Ci0gICAgb2xkc3BhY2luZyA9IHNwYWNpbmc7Ci0gICAgd2hpbGUgKFRSVUUpIHsKLQkgICAgLyogV2lkdGg9PTAgc2VlbXMgbm90IHRvIGJlIGEgdmFsaWQgd2lsZGNhcmQgb24gU0dJJ3MsIHVzaW5nICogaW5zdGVhZCAqLwotCSAgICBpZiAoIHdpZHRoID09IDAgKQotCSAgICAgIHNwcmludGYoIHBhdHRlcm4sICItJXMtJXMtJWMtbm9ybWFsLSotKi0lZC0qLSotJWMtKi0lcyIsCi0JCSAgICAgIGZhbWlseSwgd2VpZ2h0LCBzbGFudCwgaGVpZ2h0LCBzcGFjaW5nLCBjaGFyc2V0KTsKLQkgICAgZWxzZQotCSAgICAgIHNwcmludGYoIHBhdHRlcm4sICItJXMtJXMtJWMtbm9ybWFsLSotKi0lZC0qLSotJWMtJWQtJXMiLAotCQkgICAgICBmYW1pbHksIHdlaWdodCwgc2xhbnQsIGhlaWdodCwgc3BhY2luZywgd2lkdGgsIGNoYXJzZXQpOwotCSAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCAiRk9OVF9NYXRjaEZvbnQ6ICclcydcbiIsIHBhdHRlcm4gKTsKLQkgICAgbmFtZXMgPSBYTGlzdEZvbnRzKCBkaXNwbGF5LCBwYXR0ZXJuLCAxLCAmY291bnQgKTsKLQkgICAgaWYgKGNvdW50ID4gMCkgYnJlYWs7Ci0gICAgICAgICAgICBpZiAoc3BhY2luZyA9PSAnbScpIC8qIHRyeSAnYycgaWYgbm8gJ20nIGZvdW5kICovIHsKLQotICAgICAgICAgICAgICAgIHNwYWNpbmcgPSAnYyc7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNwYWNpbmcgPT0gJ3AnKSAvKiB0cnkgJyonIGlmIG5vICdwJyBmb3VuZCAqLyB7Ci0gICAgICAgICAgICAgICAgc3BhY2luZyA9ICcqJzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwYWNpbmcgPSBvbGRzcGFjaW5nOwotICAgICAgICAgICAgaGVpZ2h0IC09IDEwOwkJCi0gICAgICAgICAgICBpZiAoaGVpZ2h0IDwgMTApIHsKLSAgICAgICAgICAgICAgICBpZiAoc2xhbnQgPT0gJ2knKSB7Ci0JCSAgICAvKiB0cnkgb2JsaXF1ZSBpZiBubyBpdGFsaWMgZm9udCAqLwotCQkgICAgc2xhbnQgPSAnbyc7Ci0JCSAgICBoZWlnaHQgPSBvbGRoZWlnaHQ7Ci0JCSAgICBjb250aW51ZTsKLQkJfQotCQlpZiAoc3BhY2luZyA9PSAnbScgJiYgc3RyY21wKGZhbWlseSwgIiotKiIpICE9IDApIHsKLQkJICAgIC8qIElmIGEgZml4ZWQgc3BhY2luZyBmb250IGNvdWxkIG5vdCBiZSBmb3VuZCwgaWdub3JlCi0JCSAgICAgKiB0aGUgZmFtaWx5ICovCi0JCSAgICBmYW1pbHkgPSAiKi0qIjsKLQkJICAgIGhlaWdodCA9IG9sZGhlaWdodDsKLQkJICAgIGNvbnRpbnVlOwotCQl9Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGT05UX01hdGNoRm9udCglcykgOiByZXR1cm5pbmcgTlVMTFxuIiwgcGF0dGVybik7Ci0JCXJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgIH0KLSAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCIgICAgICAgIEZvdW5kICclcydcbiIsICpuYW1lcyApOwotICAgIGlmICghKmZvbnQtPmxmRmFjZU5hbWUpCi0gICAgICBQYXJzZUZvbnRQYXJtcygqbmFtZXMsIDIsIGZvbnQtPmxmRmFjZU5hbWUgLCBMRl9GQUNFU0laRS0xKTsKLSAgICAvKiB3ZSBuZWVkIGEgZm9udCBuYW1lIGZvciBmdW5jdGlvbiBHZXRUZXh0RmFjZSgpIGV2ZW4gaWYgdGhlcmUgaXNuJ3Qgb25lIDstKSAqLyAgCi0KLSAgICBmb250U3RydWN0ID0gWExvYWRRdWVyeUZvbnQoIGRpc3BsYXksICpuYW1lcyApOwotICAgIFhGcmVlRm9udE5hbWVzKCBuYW1lcyApOwotICAgIHJldHVybiBmb250U3RydWN0OwotfQotCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEZPTlRfTE9HRk9OVDMyQVRvTE9HRk9OVDE2CkBAIC02MDQsMTY1ICszNzEsNiBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEZPTlRfU2VsZWN0T2JqZWN0Ci0gKi8KLUhGT05UMTYgRk9OVF9TZWxlY3RPYmplY3QoIERDICogZGMsIEhGT05UMTYgaGZvbnQsIEZPTlRPQkogKiBmb250ICkKLXsKLSAgICBzdGF0aWMgWF9QSFlTRk9OVCBzdG9ja0ZvbnRzW0xBU1RfU1RPQ0tfRk9OVC1GSVJTVF9TVE9DS19GT05UKzFdOwotCi0gICAgc3RhdGljIHN0cnVjdCB7Ci0JCUhGT05UMTYJCWlkOwotCQlMT0dGT05UMTYJbG9nZm9udDsKLQkJaW50CQlhY2Nlc3M7Ci0JCWludAkJdXNlZDsKLQkJWF9QSFlTRk9OVAljYWNoZUZvbnQ7IH0gY2FjaGVGb250c1tGT05UQ0FDSEVdLCAqY2FjaGVGb250c01pbjsKLSAgICBpbnQgCWk7Ci0KLSAgICBYX1BIWVNGT05UICogc3RvY2tQdHI7Ci0gICAgSEZPTlQxNiBwcmV2SGFuZGxlID0gZGMtPncuaEZvbnQ7Ci0gICAgWEZvbnRTdHJ1Y3QgKiBmb250U3RydWN0OwotICAgIGRwcmludGZfZm9udChzdGRkZWIsIkZPTlRfU2VsZWN0T2JqZWN0KCVwLCAlMDR4LCAlcClcbiIsIGRjLCBoZm9udCwgZm9udCk7Ci0KLSNpZiAwIC8qIEZyb20gdGhlIGNvZGUgaW4gU2VsZWN0T2JqZWN0LCB0aGlzIGNhbiBub3QgaGFwcGVuICovCi0gICAgICAvKiBMb2FkIGZvbnQgaWYgbmVjZXNzYXJ5ICovCi0gICAgaWYgKCFmb250KQotICAgIHsKLQlIRk9OVDE2IGhuZXdmb250OwotCi0JaG5ld2ZvbnQgPSBDcmVhdGVGb250MTYoMTAsIDcsIDAsIDAsIEZXX0RPTlRDQVJFLAotCQkJICAgICAgRkFMU0UsIEZBTFNFLCBGQUxTRSwgREVGQVVMVF9DSEFSU0VULCAwLCAwLAotCQkJICAgICAgREVGQVVMVF9RVUFMSVRZLCBGRl9ET05UQ0FSRSwgIioiICk7Ci0JZm9udCA9IChGT05UT0JKICopIEdESV9IRUFQX0xJTl9BRERSKCBobmV3Zm9udCApOwotICAgIH0KLSNlbmRpZgotCi0gICAgaWYgKGRjLT5oZWFkZXIud01hZ2ljID09IE1FVEFGSUxFX0RDX01BR0lDKQotICAgICAgaWYgKE1GX0NyZWF0ZUZvbnRJbmRpcmVjdChkYywgaGZvbnQsICYoZm9udC0+bG9nZm9udCkpKQotCXJldHVybiBwcmV2SGFuZGxlOwotICAgICAgZWxzZQotCXJldHVybiAwOwotCi0gICAgaWYgKChoZm9udCA+PSBGSVJTVF9TVE9DS19GT05UKSAmJiAoaGZvbnQgPD0gTEFTVF9TVE9DS19GT05UKSkKLQlzdG9ja1B0ciA9ICZzdG9ja0ZvbnRzW2hmb250IC0gRklSU1RfU1RPQ0tfRk9OVF07Ci0gICAgZWxzZSB7Ci0Jc3RvY2tQdHIgPSBOVUxMOwotCS8qCi0JICogT2ssIEl0J3Mgbm90IGEgc3RvY2sgZm9udCBidXQgCi0JICogbWF5IGJlIGl0J3MgY2FjaGVkIGluIGR5bmFtaWMgY2FjaGUKLQkgKi8KLQlmb3IoaT0wOyBpPEZPTlRDQUNIRTsgaSsrKSAvKiBzZWFyY2ggZm9yIHNhbWUgaGFuZGxlICovCi0JICAgICBpZiAoY2FjaGVGb250c1tpXS5pZD09aGZvbnQpIHsgLyogR290IHRoZSBoYW5kbGUgKi8KLQkJLyoKLQkJICogQ2hlY2sgaWYgSGFuZGxlIG1hdGNoZXMgdGhlIGZvbnQgCi0JCSAqLwotCQlpZihtZW1jbXAoJmNhY2hlRm9udHNbaV0ubG9nZm9udCwmKGZvbnQtPmxvZ2ZvbnQpLCBzaXplb2YoTE9HRk9OVDE2KSkpIHsKLQkJCS8qIE5vOiByZW1vdmUgaGFuZGxlIGlkIGZyb20gZHluYW1pYyBmb250IGNhY2hlICovCi0JCQljYWNoZUZvbnRzW2ldLmFjY2Vzcz0wOwotCQkJY2FjaGVGb250c1tpXS51c2VkPTA7Ci0JCQljYWNoZUZvbnRzW2ldLmlkPTA7Ci0JCQkvKiBtYXkgYmUgdGhlcmUgaXMgYW4gdW51c2VkIGhhbmRsZSB3aGljaCBjb250YWlucyB0aGUgZm9udCAqLwotCQkJZm9yKGk9MDsgaTxGT05UQ0FDSEU7IGkrKykgewotCQkJCWlmKChjYWNoZUZvbnRzW2ldLnVzZWQgPT0gMCkgJiYKLQkJCQkgIChtZW1jbXAoJmNhY2hlRm9udHNbaV0ubG9nZm9udCwmKGZvbnQtPmxvZ2ZvbnQpLCBzaXplb2YoTE9HRk9OVDE2KSkpPT0gMCkgewotCQkJCQkvKiBnb3QgaXQgbG9hZCBmcm9tIGNhY2hlIGFuZCBzZXQgbmV3IGhhbmRsZSBpZCAqLwotCQkJCQlzdG9ja1B0ciA9ICZjYWNoZUZvbnRzW2ldLmNhY2hlRm9udDsKLQkJCQkJY2FjaGVGb250c1tpXS5hY2Nlc3M9MTsKLQkJCQkJY2FjaGVGb250c1tpXS51c2VkPTE7Ci0JCQkJCWNhY2hlRm9udHNbaV0uaWQ9aGZvbnQ7Ci0JCQkJCWRwcmludGZfZm9udChzdGRkZWIsIkZPTlRfU2VsZWN0T2JqZWN0OiBnb3QgZm9udCBmcm9tIHVudXNlZCBoYW5kbGVcbiIpOwotCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkKLQkJCX0KLQkJZWxzZSB7Ci0JCQkvKiBZZXM6IGxvYWQgZnJvbSBkeW5hbWljIGZvbnQgY2FjaGUgKi8KLQkJCXN0b2NrUHRyID0gJmNhY2hlRm9udHNbaV0uY2FjaGVGb250OwotCQkJY2FjaGVGb250c1tpXS5hY2Nlc3MrKzsKLQkJCWNhY2hlRm9udHNbaV0udXNlZCsrOwotCQkJfQotCQlicmVhazsKLQkJfQotCX0KLSAgICBpZiAoIXN0b2NrUHRyIHx8ICFzdG9ja1B0ci0+ZnN0cnVjdCkKLSAgICB7Ci0JaWYgKCEoZm9udFN0cnVjdCA9IEZPTlRfTWF0Y2hGb250KCAmZm9udC0+bG9nZm9udCwgZGMgKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgLyogSWYgaXQgaXMgbm90IGEgc3RvY2sgZm9udCwgd2UgY2FuIHNpbXBseSByZXR1cm4gMCAqLwotICAgICAgICAgICAgaWYgKCFzdG9ja1B0cikgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgIC8qIE90aGVyd2lzZSB3ZSBtdXN0IHRyeSB0byBmaW5kIGEgc3Vic3RpdHV0ZSAqLwotICAgICAgICAgICAgZHByaW50Zl9mb250KHN0ZGRlYiwiTG9hZGluZyBmb250ICdmaXhlZCcgZm9yICUwNHhcbiIsIGhmb250ICk7Ci0gICAgICAgICAgICBmb250LT5sb2dmb250LmxmUGl0Y2hBbmRGYW1pbHkgJj0gflZBUklBQkxFX1BJVENIOwotICAgICAgICAgICAgZm9udC0+bG9nZm9udC5sZlBpdGNoQW5kRmFtaWx5IHw9IEZJWEVEX1BJVENIOwotICAgICAgICAgICAgZm9udFN0cnVjdCA9IFhMb2FkUXVlcnlGb250KCBkaXNwbGF5LCAiZml4ZWQiICk7Ci0gICAgICAgICAgICBpZiAoIWZvbnRTdHJ1Y3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiTm8gc3lzdGVtIGZvbnQgY291bGQgYmUgZm91bmQuIFBsZWFzZSBjaGVjayB5b3VyIGZvbnQgcGF0aC5cbiIgKTsKLSAgICAgICAgICAgICAgICBleGl0KCAxICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlmb250U3RydWN0ID0gc3RvY2tQdHItPmZzdHJ1Y3Q7Ci0JZHByaW50Zl9mb250KHN0ZGRlYiwKLSAgICAgICAgICAgICAgICAgICAgICJGT05UX1NlbGVjdE9iamVjdDogTG9hZGVkIGZvbnQgZnJvbSBjYWNoZSAlMDR4ICVwXG4iLAotCQkgICAgIGhmb250LCBmb250U3RydWN0ICk7Ci0gICAgfQkKLQotICAgICAgLyogVW51c2UgcHJldmlvdXMgZm9udCAqLwotCWZvciAoaT0wOyBpIDwgRk9OVENBQ0hFOyBpKyspIHsKLQkJaWYgKGNhY2hlRm9udHNbaV0uaWQgPT0gcHJldkhhbmRsZSkgewotCQkJaWYoY2FjaGVGb250c1tpXS51c2VkID09IDApCi0JCQkJZnByaW50ZihzdGRlcnIsICJUcnlpbmcgdG8gZGVjcmVtZW50IGEgdXNlIGNvdW50IG9mIDAuXG4iKTsKLQkJCWVsc2UgCi0JCQkJY2FjaGVGb250c1tpXS51c2VkLS07Ci0JCX0KLQl9Ci0KLSAgICAgIC8qIFN0b3JlIGZvbnQgKi8KLSAgICBkYy0+dy5oRm9udCA9IGhmb250OwotICAgIGlmIChzdG9ja1B0cikKLSAgICB7Ci0JaWYgKCFzdG9ja1B0ci0+ZnN0cnVjdCkKLQl7Ci0JICAgIHN0b2NrUHRyLT5mc3RydWN0ID0gZm9udFN0cnVjdDsKLQkgICAgRk9OVF9HZXRNZXRyaWNzKCAmZm9udC0+bG9nZm9udCwgZm9udFN0cnVjdCwgJnN0b2NrUHRyLT5tZXRyaWNzICk7Ci0JfQotCW1lbWNweSggJmRjLT51LnguZm9udCwgc3RvY2tQdHIsIHNpemVvZigqc3RvY2tQdHIpICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JLyogCi0JICogQ2hlY2sgaW4gY2FjaGVGb250Ci0JICovCi0JY2FjaGVGb250c01pbj1OVUxMOwotCWZvciAoaT0wOyBpIDwgRk9OVENBQ0hFOyBpKyspIHsKLQkJaWYgKGNhY2hlRm9udHNbaV0udXNlZD09MCkgCi0JCQlpZiAoKCFjYWNoZUZvbnRzTWluKSB8fCAoKGNhY2hlRm9udHNNaW4pICYmIChjYWNoZUZvbnRzTWluLT5hY2Nlc3MgPiBjYWNoZUZvbnRzW2ldLmFjY2VzcykpKQotCQkJCWNhY2hlRm9udHNNaW49JmNhY2hlRm9udHNbaV07Ci0JCX0KLQlpZiAoIWNhY2hlRm9udHNNaW4pIHsKLQkJZnByaW50ZihzdGRlcnIsIk5vIHVudXNlZCBmb250IGNhY2hlIGVudHJ5ICEhISFcbiIgKTsKLQkJcmV0dXJuIHByZXZIYW5kbGU7Ci0JfQotCWlmIChjYWNoZUZvbnRzTWluLT5pZCE9MCkgewotCQlkcHJpbnRmX2ZvbnQoc3RkZGViLAotCQkJIkZPTlRfU2VsZWN0T2JqZWN0OiBGcmVlaW5nICUwNHggXG4iLGNhY2hlRm9udHNNaW4tPmlkICk7Ci0JCVhGcmVlRm9udCggZGlzcGxheSwgY2FjaGVGb250c01pbi0+Y2FjaGVGb250LmZzdHJ1Y3QgKTsKLQkJfQotCWNhY2hlRm9udHNNaW4tPmNhY2hlRm9udC5mc3RydWN0ID0gZm9udFN0cnVjdDsKLQlGT05UX0dldE1ldHJpY3MoICZmb250LT5sb2dmb250LCBmb250U3RydWN0LCAmY2FjaGVGb250c01pbi0+Y2FjaGVGb250Lm1ldHJpY3MgKTsKLQljYWNoZUZvbnRzTWluLT5hY2Nlc3M9MTsKLQljYWNoZUZvbnRzTWluLT51c2VkPTE7Ci0JY2FjaGVGb250c01pbi0+aWQ9aGZvbnQ7Ci0JbWVtY3B5KCAmZGMtPnUueC5mb250LCAmKGNhY2hlRm9udHNNaW4tPmNhY2hlRm9udCksIHNpemVvZihjYWNoZUZvbnRzTWluLT5jYWNoZUZvbnQpICk7Ci0JbWVtY3B5KCZjYWNoZUZvbnRzTWluLT5sb2dmb250LCYoZm9udC0+bG9nZm9udCksIHNpemVvZihMT0dGT05UMTYpKTsKLQotICAgIH0KLSAgICByZXR1cm4gcHJldkhhbmRsZTsKLX0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEyNzcsNyArODg1LDEwIEBACiAgKi8KIElOVCBBZGRGb250UmVzb3VyY2UoIExQQ1NUUiBzdHIgKQogewotICAgIGZwcmludGYoIHN0ZG5pbXAsICJTVFVCOiBBZGRGb250UmVzb3VyY2UoJyVzJylcbiIsIHN0ciApOworICAgIGlmIChISVdPUkQoc3RyKSkKKyAgICAgICAgZnByaW50Ziggc3RkbmltcCwgIlNUVUI6IEFkZEZvbnRSZXNvdXJjZSgnJXMnKVxuIiwgc3RyICk7CisgICAgZWxzZQorICAgICAgICBmcHJpbnRmKCBzdGRuaW1wLCAiU1RVQjogQWRkRm9udFJlc291cmNlKCUwNHgpXG4iLCBMT1dPUkQoc3RyKSApOwogICAgIHJldHVybiAxOwogfQogCkBAIC0xMjg3LDE1ICs4OTgsMTcgQEAKICAqLwogQk9PTCBSZW1vdmVGb250UmVzb3VyY2UoIExQU1RSIHN0ciApCiB7Ci0gICAgZnByaW50Ziggc3RkbmltcCwgIlNUVUI6IFJlbW92ZUZvbnRSZXNvdXJjZSgnJXMnKVxuIiwgc3RyICk7CisgICAgaWYgKEhJV09SRChzdHIpKQorICAgICAgICBmcHJpbnRmKCBzdGRuaW1wLCAiU1RVQjogUmVtb3ZlRm9udFJlc291cmNlKCclcycpXG4iLCBzdHIgKTsKKyAgICBlbHNlCisgICAgICAgIGZwcmludGYoIHN0ZG5pbXAsICJTVFVCOiBSZW1vdmVGb250UmVzb3VyY2UoJTA0eClcbiIsIExPV09SRChzdHIpICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJCVBhcnNlRm9udFBhcm1zCQlbaW50ZXJuYWxdCisgKgkJCQlGT05UX1BhcnNlRm9udFBhcm1zCQlbaW50ZXJuYWxdCiAgKi8KLWludCBQYXJzZUZvbnRQYXJtcyhMUFNUUiBscEZvbnQsIFdPUkQgd1Bhcm1zTm8sIExQU1RSIGxwUmV0U3RyLCBXT1JEIHdNYXhTaXopCitpbnQgRk9OVF9QYXJzZUZvbnRQYXJtcyhMUFNUUiBscEZvbnQsIFdPUkQgd1Bhcm1zTm8sIExQU1RSIGxwUmV0U3RyLCBXT1JEIHdNYXhTaXopCiB7CiAJaW50IAlpOwogCWlmIChscEZvbnQgPT0gTlVMTCkgcmV0dXJuIDA7CkBAIC0xMzE4LDYgKzkzMSw3IEBACiB9CiAKIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJSW5pdEZvbnRzTGlzdAkJW2ludGVybmFsXQogICovCkBAIC0xMzYyLDExICs5NzYsMTEgQEAKICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJJbml0Rm9udHNMaXN0IC8vIG5hbWVzWyVkXT0nJXMnIFxuIiwgaSwgbmFtZXNbaV0pOwogCi0gICAgUGFyc2VGb250UGFybXMobmFtZXNbaV0sIDIsIHN0ciwgc2l6ZW9mKHN0cikpOworICAgIEZPTlRfUGFyc2VGb250UGFybXMobmFtZXNbaV0sIDIsIHN0ciwgc2l6ZW9mKHN0cikpOwogICAgIHN0cmNweShscE5ld0ZvbnQtPmxmRmFjZU5hbWUsIHN0cik7Ci0gICAgUGFyc2VGb250UGFybXMobmFtZXNbaV0sIDgsIHN0ciwgc2l6ZW9mKHN0cikpOworICAgIEZPTlRfUGFyc2VGb250UGFybXMobmFtZXNbaV0sIDgsIHN0ciwgc2l6ZW9mKHN0cikpOwogICAgIGxwTmV3Rm9udC0+bGZIZWlnaHQgPSBhdG9pKHN0cikgLyAxMDsKLSAgICBQYXJzZUZvbnRQYXJtcyhuYW1lc1tpXSwgMTIsIHN0ciwgc2l6ZW9mKHN0cikpOworICAgIEZPTlRfUGFyc2VGb250UGFybXMobmFtZXNbaV0sIDEyLCBzdHIsIHNpemVvZihzdHIpKTsKICAgICBscE5ld0ZvbnQtPmxmV2lkdGggPSBhdG9pKHN0cikgLyAxMDsKICAgICBscE5ld0ZvbnQtPmxmRXNjYXBlbWVudCA9IDA7CiAgICAgbHBOZXdGb250LT5sZk9yaWVudGF0aW9uID0gMDsKQEAgLTEzNzQsNyArOTg4LDcgQEAKICAgICBscE5ld0ZvbnQtPmxmSXRhbGljID0gMDsKICAgICBscE5ld0ZvbnQtPmxmVW5kZXJsaW5lID0gMDsKICAgICBscE5ld0ZvbnQtPmxmU3RyaWtlT3V0ID0gMDsKLSAgICBQYXJzZUZvbnRQYXJtcyhuYW1lc1tpXSwgMTMsIHN0ciwgc2l6ZW9mKHN0cikpOworICAgIEZPTlRfUGFyc2VGb250UGFybXMobmFtZXNbaV0sIDEzLCBzdHIsIHNpemVvZihzdHIpKTsKICAgICBpZiAoc3RyY21wKHN0ciwgImlzbzg4NTkiKSA9PSAwKSAgewogICAgICAgbHBOZXdGb250LT5sZkNoYXJTZXQgPSBBTlNJX0NIQVJTRVQ7CiAgICAgfSBlbHNlICB7CkBAIC0xMzgzLDcgKzk5Nyw3IEBACiAgICAgbHBOZXdGb250LT5sZk91dFByZWNpc2lvbiA9IE9VVF9ERUZBVUxUX1BSRUNJUzsKICAgICBscE5ld0ZvbnQtPmxmQ2xpcFByZWNpc2lvbiA9IENMSVBfREVGQVVMVF9QUkVDSVM7CiAgICAgbHBOZXdGb250LT5sZlF1YWxpdHkgPSBERUZBVUxUX1FVQUxJVFk7Ci0gICAgUGFyc2VGb250UGFybXMobmFtZXNbaV0sIDExLCBzdHIsIHNpemVvZihzdHIpKTsKKyAgICBGT05UX1BhcnNlRm9udFBhcm1zKG5hbWVzW2ldLCAxMSwgc3RyLCBzaXplb2Yoc3RyKSk7CiAgICAgc3dpdGNoKHN0clswXSkgewogICAgICBjYXNlICdwJzoKICAgICAgIGxwTmV3Rm9udC0+bGZQaXRjaEFuZEZhbWlseSA9IFZBUklBQkxFX1BJVENIIHwgRkZfU1dJU1M7CkBAIC0xNTcwLDYgKzExODQsNyBAQAogICByZXR1cm4gblJldDsKIH0KIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJRW51bUZvbnRGYW1pbGllc0V4QQlbR0RJMzIuODFdCiAgKiBGSVhNRTogRG9uJ3QgdXNlIDE2IGJpdCBHREkgaGVhcCBmdW5jdGlvbnMgKGFwcGxpZXMgdG8gRW51bUZvbnRGYW1pbGllc0V4MzIqKQpAQCAtMTc1NSwzICsxMzcwLDQgQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgY1BhaXJzOyBpKyspIGxwS2VybmluZ1BhaXJzW2ldLmlLZXJuQW1vdW50ID0gMDsKICAgICByZXR1cm4gMDsKIH0KKwpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9nZGlvYmouYyBiL29iamVjdHMvZ2Rpb2JqLmMKaW5kZXggOTZmN2U0Ny4uMDM1OTM0MyAxMDA2NDQKLS0tIGEvb2JqZWN0cy9nZGlvYmouYworKysgYi9vYmplY3RzL2dkaW9iai5jCkBAIC0xNjcsMTggKzE2Nyw2IEBACiAgICAgaWYgKCEoaHBhbGV0dGUgPSBDT0xPUl9Jbml0KCkpKSByZXR1cm4gRkFMU0U7CiAgICAgU3RvY2tPYmplY3RzW0RFRkFVTFRfUEFMRVRURV0gPSAoR0RJT0JKSERSICopR0RJX0hFQVBfTElOX0FERFIoIGhwYWxldHRlICk7CiAKLSAgICAgIC8qIENyZWF0ZSBkZWZhdWx0IGJpdG1hcCAqLwotCi0gICAgaWYgKCFCSVRNQVBfSW5pdCgpKSByZXR1cm4gRkFMU0U7Ci0KLSAgICAgIC8qIEluaXRpYWxpemUgYnJ1c2ggZGl0aGVyaW5nICovCi0KLSAgICBpZiAoIUJSVVNIX0luaXQoKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAvKiBJbml0aWFsaXplIGZvbnRzICovCi0KLSAgICBpZiAoIUZPTlRfSW5pdCgpKSByZXR1cm4gRkFMU0U7Ci0KICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtMzg4LDM3ICszNzYsMTAgQEAKICAqLwogSEdESU9CSjMyIFNlbGVjdE9iamVjdDMyKCBIREMzMiBoZGMsIEhHRElPQkozMiBoYW5kbGUgKQogewotICAgIEdESU9CSkhEUiAqIHB0ciA9IE5VTEw7Ci0gICAgREMgKiBkYzsKLSAgICAKKyAgICBEQyAqIGRjID0gRENfR2V0RENQdHIoIGhkYyApOworICAgIGlmICghZGMgfHwgIWRjLT5mdW5jcy0+cFNlbGVjdE9iamVjdCkgcmV0dXJuIDA7CiAgICAgZHByaW50Zl9nZGkoc3RkZGViLCAiU2VsZWN0T2JqZWN0OiBoZGM9JTA0eCAlMDR4XG4iLCBoZGMsIGhhbmRsZSApOwotICAgIGlmICgoaGFuZGxlID49IEZJUlNUX1NUT0NLX0hBTkRMRSkgJiYgKGhhbmRsZSA8PSBMQVNUX1NUT0NLX0hBTkRMRSkpCi0gICAgICBwdHIgPSBTdG9ja09iamVjdHNbaGFuZGxlIC0gRklSU1RfU1RPQ0tfSEFORExFXTsKLSAgICBlbHNlIAotICAgICAgcHRyID0gKEdESU9CSkhEUiAqKSBHRElfSEVBUF9MSU5fQUREUiggaGFuZGxlICk7Ci0gICAgaWYgKCFwdHIpIHJldHVybiAwOwotICAgIAotICAgIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKLSAgICBpZiAoIWRjKSAKLSAgICB7Ci0JZGMgPSAoREMgKilHRElfR2V0T2JqUHRyKGhkYywgTUVUQUZJTEVfRENfTUFHSUMpOwotCWlmICghZGMpIHJldHVybiAwOwotICAgIH0KLSAgICAKLSAgICBzd2l0Y2gocHRyLT53TWFnaWMpCi0gICAgewotICAgICAgY2FzZSBQRU5fTUFHSUM6Ci0JICByZXR1cm4gUEVOX1NlbGVjdE9iamVjdCggZGMsIGhhbmRsZSwgKFBFTk9CSiAqKXB0ciApOwotICAgICAgY2FzZSBCUlVTSF9NQUdJQzoKLQkgIHJldHVybiBCUlVTSF9TZWxlY3RPYmplY3QoIGRjLCBoYW5kbGUsIChCUlVTSE9CSiAqKXB0ciApOwotICAgICAgY2FzZSBCSVRNQVBfTUFHSUM6Ci0JICByZXR1cm4gQklUTUFQX1NlbGVjdE9iamVjdCggZGMsIGhhbmRsZSwgKEJJVE1BUE9CSiAqKXB0ciApOwotICAgICAgY2FzZSBGT05UX01BR0lDOgotCSAgcmV0dXJuIEZPTlRfU2VsZWN0T2JqZWN0KCBkYywgaGFuZGxlLCAoRk9OVE9CSiAqKXB0ciApOwkgIAotICAgICAgY2FzZSBSRUdJT05fTUFHSUM6Ci0JICByZXR1cm4gKEhHRElPQkoxNilTZWxlY3RDbGlwUmduMTYoIGhkYywgaGFuZGxlICk7Ci0gICAgfQotICAgIHJldHVybiAwOworICAgIHJldHVybiBkYy0+ZnVuY3MtPnBTZWxlY3RPYmplY3QoIGRjLCBoYW5kbGUgKTsKIH0KIAogCmRpZmYgLS1naXQgYS9vYmplY3RzL21ldGFmaWxlLmMgYi9vYmplY3RzL21ldGFmaWxlLmMKaW5kZXggYzdlZTI1ZC4uMDE3NGM5MiAxMDA2NDQKLS0tIGEvb2JqZWN0cy9tZXRhZmlsZS5jCisrKyBiL29iamVjdHMvbWV0YWZpbGUuYwpAQCAtMjYyLDkgKzI2MiwxOCBAQAogICAgIEhHTE9CQUwxNiBoSFQ7CiAgICAgaW50IG9mZnNldCA9IDA7CiAgICAgV09SRCBpOworICAgIEhQRU4zMiBoUGVuOworICAgIEhCUlVTSDMyIGhCcnVzaDsKKyAgICBIRk9OVDMyIGhGb250OworICAgIERDICpkYzsKIAogICAgIGRwcmludGZfbWV0YWZpbGUoc3RkZGViLCJQbGF5TWV0YUZpbGUoJTA0eCAlMDR4KVxuIixoZGMsaG1mKTsKLSAgICAKKworICAgIGlmICghKGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKSkpIHJldHVybiAwOworICAgIGhQZW4gPSBkYy0+dy5oUGVuOworICAgIGhCcnVzaCA9IGRjLT53LmhCcnVzaDsKKyAgICBoRm9udCA9IGRjLT53LmhGb250OworCiAgICAgLyogY3JlYXRlIHRoZSBoYW5kbGUgdGFibGUgKi8KICAgICBoSFQgPSBHbG9iYWxBbGxvYzE2KEdNRU1fTU9WRUFCTEV8R01FTV9aRVJPSU5JVCwKIAkJICAgICAgc2l6ZW9mKEhBTkRMRVRBQkxFMTYpICogbWgtPm10Tm9PYmplY3RzKTsKQEAgLTI4MSw2ICsyOTAsMTAgQEAKIAlQbGF5TWV0YUZpbGVSZWNvcmQoaGRjLCBodCwgbXIsIG1oLT5tdE5vT2JqZWN0cyk7CiAgICAgfQogCisgICAgU2VsZWN0T2JqZWN0MzIoaGRjLCBoQnJ1c2gpOworICAgIFNlbGVjdE9iamVjdDMyKGhkYywgaFBlbik7CisgICAgU2VsZWN0T2JqZWN0MzIoaGRjLCBoRm9udCk7CisKICAgICAvKiBmcmVlIG9iamVjdHMgaW4gaGFuZGxlIHRhYmxlICovCiAgICAgZm9yKGkgPSAwOyBpIDwgbWgtPm10Tm9PYmplY3RzOyBpKyspCiAgICAgICBpZigqKGh0LT5vYmplY3RIYW5kbGUgKyBpKSAhPSAwKQpAQCAtMzY0LDcgKzM3Nyw3IEBACiAgICAgICBicmVhazsKIAogICAgIGNhc2UgTUVUQV9TRVRCS0NPTE9SOgotCVNldEJrQ29sb3IoaGRjLCAqKG1yLT5yZFBhcmFtKSk7CisJU2V0QmtDb2xvcihoZGMsIE1BS0VMT05HKCoobXItPnJkUGFyYW0pLCAqKG1yLT5yZFBhcmFtICsgMSkpKTsKIAlicmVhazsKIAogICAgIGNhc2UgTUVUQV9TRVRCS01PREU6CkBAIC00MjksNyArNDQyLDcgQEAKIAlicmVhazsKIAogICAgIGNhc2UgTUVUQV9MSU5FVE86Ci0JTGluZVRvMzIoaGRjLCAqKG1yLT5yZFBhcmFtICsgMSksICoobXItPnJkUGFyYW0pKTsKKwlMaW5lVG8zMihoZGMsIChJTlQxNikqKG1yLT5yZFBhcmFtICsgMSksIChJTlQxNikqKG1yLT5yZFBhcmFtKSk7CiAJYnJlYWs7CiAKICAgICBjYXNlIE1FVEFfTU9WRVRPOgpAQCAtNDQ3LDM2ICs0NjAsMzggQEAKIAlicmVhazsKIAogICAgIGNhc2UgTUVUQV9BUkM6Ci0JQXJjMzIoaGRjLCAqKG1yLT5yZFBhcmFtICsgNyksICoobXItPnJkUGFyYW0gKyA2KSwgKihtci0+cmRQYXJhbSArIDUpLAotICAgICAgICAgICAgICAqKG1yLT5yZFBhcmFtICsgNCksICoobXItPnJkUGFyYW0gKyAzKSwgKihtci0+cmRQYXJhbSArIDIpLAotICAgICAgICAgICAgICAqKG1yLT5yZFBhcmFtICsgMSksICoobXItPnJkUGFyYW0pKTsKKwlBcmMzMihoZGMsIChJTlQxNikqKG1yLT5yZFBhcmFtICsgNyksIChJTlQxNikqKG1yLT5yZFBhcmFtICsgNiksCisJICAgICAgKElOVDE2KSoobXItPnJkUGFyYW0gKyA1KSwgKElOVDE2KSoobXItPnJkUGFyYW0gKyA0KSwKKwkgICAgICAoSU5UMTYpKihtci0+cmRQYXJhbSArIDMpLCAoSU5UMTYpKihtci0+cmRQYXJhbSArIDIpLAorICAgICAgICAgICAgIChJTlQxNikqKG1yLT5yZFBhcmFtICsgMSksIChJTlQxNikqKG1yLT5yZFBhcmFtKSk7CiAJYnJlYWs7CiAKICAgICBjYXNlIE1FVEFfRUxMSVBTRToKLQlFbGxpcHNlMzIoaGRjLCAqKG1yLT5yZFBhcmFtICsgMyksICoobXItPnJkUGFyYW0gKyAyKSwKLSAgICAgICAgICAgICAgICAgICoobXItPnJkUGFyYW0gKyAxKSwgKihtci0+cmRQYXJhbSkpOworCUVsbGlwc2UzMihoZGMsIChJTlQxNikqKG1yLT5yZFBhcmFtICsgMyksIChJTlQxNikqKG1yLT5yZFBhcmFtICsgMiksCisgICAgICAgICAgICAgICAgICAoSU5UMTYpKihtci0+cmRQYXJhbSArIDEpLCAoSU5UMTYpKihtci0+cmRQYXJhbSkpOwogCWJyZWFrOwogCiAgICAgY2FzZSBNRVRBX0ZMT09ERklMTDoKLQlGbG9vZEZpbGwzMihoZGMsICoobXItPnJkUGFyYW0gKyAzKSwgKihtci0+cmRQYXJhbSArIDIpLAotICAgICAgICAgICAgICAgICAgICBNQUtFTE9ORygqKG1yLT5yZFBhcmFtICsgMSksICoobXItPnJkUGFyYW0pKSk7CisJRmxvb2RGaWxsMzIoaGRjLCAoSU5UMTYpKihtci0+cmRQYXJhbSArIDMpLCAoSU5UMTYpKihtci0+cmRQYXJhbSArIDIpLAorICAgICAgICAgICAgICAgICAgICBNQUtFTE9ORygqKG1yLT5yZFBhcmFtKSwgKihtci0+cmRQYXJhbSArIDEpKSk7CiAJYnJlYWs7CiAKICAgICBjYXNlIE1FVEFfUElFOgotCVBpZTMyKGhkYywgKihtci0+cmRQYXJhbSArIDcpLCAqKG1yLT5yZFBhcmFtICsgNiksICoobXItPnJkUGFyYW0gKyA1KSwKLSAgICAgICAgICAgICAgKihtci0+cmRQYXJhbSArIDQpLCAqKG1yLT5yZFBhcmFtICsgMyksICoobXItPnJkUGFyYW0gKyAyKSwKLSAgICAgICAgICAgICAgKihtci0+cmRQYXJhbSArIDEpLCAqKG1yLT5yZFBhcmFtKSk7CisJUGllMzIoaGRjLCAoSU5UMTYpKihtci0+cmRQYXJhbSArIDcpLCAoSU5UMTYpKihtci0+cmRQYXJhbSArIDYpLAorCSAgICAgIChJTlQxNikqKG1yLT5yZFBhcmFtICsgNSksIChJTlQxNikqKG1yLT5yZFBhcmFtICsgNCksCisJICAgICAgKElOVDE2KSoobXItPnJkUGFyYW0gKyAzKSwgKElOVDE2KSoobXItPnJkUGFyYW0gKyAyKSwKKyAgICAgICAgICAgICAoSU5UMTYpKihtci0+cmRQYXJhbSArIDEpLCAoSU5UMTYpKihtci0+cmRQYXJhbSkpOwogCWJyZWFrOwogCiAgICAgY2FzZSBNRVRBX1JFQ1RBTkdMRToKLQlSZWN0YW5nbGUzMihoZGMsICoobXItPnJkUGFyYW0gKyAzKSwgKihtci0+cmRQYXJhbSArIDIpLAotICAgICAgICAgICAgICAgICAgICAqKG1yLT5yZFBhcmFtICsgMSksICoobXItPnJkUGFyYW0pKTsKKwlSZWN0YW5nbGUzMihoZGMsIChJTlQxNikqKG1yLT5yZFBhcmFtICsgMyksIChJTlQxNikqKG1yLT5yZFBhcmFtICsgMiksCisgICAgICAgICAgICAgICAgICAgIChJTlQxNikqKG1yLT5yZFBhcmFtICsgMSksIChJTlQxNikqKG1yLT5yZFBhcmFtKSk7CiAJYnJlYWs7CiAKICAgICBjYXNlIE1FVEFfUk9VTkRSRUNUOgotCVJvdW5kUmVjdDMyKGhkYywgKihtci0+cmRQYXJhbSArIDUpLCAqKG1yLT5yZFBhcmFtICsgNCksCi0gICAgICAgICAgICAgICAgICAgICoobXItPnJkUGFyYW0gKyAzKSwgKihtci0+cmRQYXJhbSArIDIpLAotICAgICAgICAgICAgICAgICAgICAqKG1yLT5yZFBhcmFtICsgMSksICoobXItPnJkUGFyYW0pKTsKKwlSb3VuZFJlY3QzMihoZGMsIChJTlQxNikqKG1yLT5yZFBhcmFtICsgNSksIChJTlQxNikqKG1yLT5yZFBhcmFtICsgNCksCisgICAgICAgICAgICAgICAgICAgIChJTlQxNikqKG1yLT5yZFBhcmFtICsgMyksIChJTlQxNikqKG1yLT5yZFBhcmFtICsgMiksCisgICAgICAgICAgICAgICAgICAgIChJTlQxNikqKG1yLT5yZFBhcmFtICsgMSksIChJTlQxNikqKG1yLT5yZFBhcmFtKSk7CiAJYnJlYWs7CiAKICAgICBjYXNlIE1FVEFfUEFUQkxUOgpAQCAtNDkwLDggKzUwNSw4IEBACiAJYnJlYWs7CiAKICAgICBjYXNlIE1FVEFfU0VUUElYRUw6Ci0JU2V0UGl4ZWwzMihoZGMsICoobXItPnJkUGFyYW0gKyAzKSwgKihtci0+cmRQYXJhbSArIDIpLAotICAgICAgICAgICAgICAgICAgIE1BS0VMT05HKCoobXItPnJkUGFyYW0gKyAxKSwgKihtci0+cmRQYXJhbSkpKTsKKwlTZXRQaXhlbDMyKGhkYywgKElOVDE2KSoobXItPnJkUGFyYW0gKyAzKSwgKElOVDE2KSoobXItPnJkUGFyYW0gKyAyKSwKKyAgICAgICAgICAgICAgICAgICBNQUtFTE9ORygqKG1yLT5yZFBhcmFtKSwgKihtci0+cmRQYXJhbSArIDEpKSk7CiAJYnJlYWs7CiAKICAgICBjYXNlIE1FVEFfT0ZGU0VUQ0xJUFJHTjoKQEAgLTUxOSw3ICs1MzQsNyBAQAogCWJyZWFrOwogCiAgICAgY2FzZSBNRVRBX1JFU1RPUkVEQzoKLQlSZXN0b3JlREMzMihoZGMsICoobXItPnJkUGFyYW0pKTsKKwlSZXN0b3JlREMzMihoZGMsIChJTlQxNikqKG1yLT5yZFBhcmFtKSk7CiAJYnJlYWs7CiAKICAgICBjYXNlIE1FVEFfU0VMRUNUT0JKRUNUOgpAQCAtNTI3LDkgKzU0MiwxMCBAQAogCWJyZWFrOwogCiAgICAgY2FzZSBNRVRBX0NIT1JEOgotCUNob3JkMzIoaGRjLCAqKG1yLT5yZFBhcmFtICsgNyksICoobXItPnJkUGFyYW0gKyA2KSwgKihtci0+cmRQYXJhbSs1KSwKLSAgICAgICAgICAgICAgICAqKG1yLT5yZFBhcmFtICsgNCksICoobXItPnJkUGFyYW0gKyAzKSwgKihtci0+cmRQYXJhbSArIDIpLAotICAgICAgICAgICAgICAgICoobXItPnJkUGFyYW0gKyAxKSwgKihtci0+cmRQYXJhbSkpOworCUNob3JkMzIoaGRjLCAoSU5UMTYpKihtci0+cmRQYXJhbSArIDcpLCAoSU5UMTYpKihtci0+cmRQYXJhbSArIDYpLAorCQkoSU5UMTYpKihtci0+cmRQYXJhbSs1KSwgKElOVDE2KSoobXItPnJkUGFyYW0gKyA0KSwKKwkJKElOVDE2KSoobXItPnJkUGFyYW0gKyAzKSwgKElOVDE2KSoobXItPnJkUGFyYW0gKyAyKSwKKyAgICAgICAgICAgICAgIChJTlQxNikqKG1yLT5yZFBhcmFtICsgMSksIChJTlQxNikqKG1yLT5yZFBhcmFtKSk7CiAJYnJlYWs7CiAKICAgICBjYXNlIE1FVEFfQ1JFQVRFUEFUVEVSTkJSVVNIOgpAQCAtNjc3LDkgKzY5Myw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXItPnJkUGFyYW1bMTBdLypQbGFuZXMqLyxtci0+cmRQYXJhbVsxMV0vKkJpdHNQaXhlbCovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUFNUUikmbXItPnJkUGFyYW1bMTJdLypiaXRzKi8pOwogICAgICAgIFNlbGVjdE9iamVjdDMyKGhkY1NyYyxoYml0bWFwKTsKLSAgICAgICBCaXRCbHQzMihoZGMsbXItPnJkUGFyYW1bNl0sbXItPnJkUGFyYW1bNV0sCi0gICAgICAgICAgICAgICAgbXItPnJkUGFyYW1bNF0sbXItPnJkUGFyYW1bM10sCi0gICAgICAgICAgICAgICAgaGRjU3JjLCBtci0+cmRQYXJhbVsyXSxtci0+cmRQYXJhbVsxXSwKKyAgICAgICBCaXRCbHQzMihoZGMsKElOVDE2KW1yLT5yZFBhcmFtWzZdLChJTlQxNiltci0+cmRQYXJhbVs1XSwKKyAgICAgICAgICAgICAgICAoSU5UMTYpbXItPnJkUGFyYW1bNF0sKElOVDE2KW1yLT5yZFBhcmFtWzNdLAorICAgICAgICAgICAgICAgIGhkY1NyYywgKElOVDE2KW1yLT5yZFBhcmFtWzJdLChJTlQxNiltci0+cmRQYXJhbVsxXSwKICAgICAgICAgICAgICAgICBNQUtFTE9ORygwLG1yLT5yZFBhcmFtWzBdKSk7CiAgICAgICAgRGVsZXRlREMzMihoZGNTcmMpOwkJICAgIAogICAgICAgfQpAQCAtNzcxLDcgKzc4Nyw3IEBACiAJICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiVWtub3duIG1ldGFmaWxlIHR5cGUgJWRcbiIsIHBoeXNEZXYtPm1oLT5tdFR5cGUgKTsKKyAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiVW5rbm93biBtZXRhZmlsZSB0eXBlICVkXG4iLCBwaHlzRGV2LT5taC0+bXRUeXBlICk7CiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL29iamVjdHMvcGVuLmMgYi9vYmplY3RzL3Blbi5jCmluZGV4IDliYjUxZWUuLjJjY2E1NzYgMTAwNjQ0Ci0tLSBhL29iamVjdHMvcGVuLmMKKysrIGIvb2JqZWN0cy9wZW4uYwpAQCAtMTIsMTAgKzEyLDYgQEAKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAKLXN0YXRpYyBjb25zdCBjaGFyIFBFTl9kYXNoW10gICAgICAgPSB7IDUsMyB9OyAgICAgIC8qIC0tLS0tICAgLS0tLS0gICAtLS0tLSAgKi8KLXN0YXRpYyBjb25zdCBjaGFyIFBFTl9kb3RbXSAgICAgICAgPSB7IDEsMSB9OyAgICAgIC8qIC0tICAtLSAgLS0gIC0tICAtLSAgLS0gKi8KLXN0YXRpYyBjb25zdCBjaGFyIFBFTl9kYXNoZG90W10gICAgPSB7IDQsMywyLDMgfTsgIC8qIC0tLS0gICAtLSAgIC0tLS0gICAtLSAgKi8KLXN0YXRpYyBjb25zdCBjaGFyIFBFTl9kYXNoZG90ZG90W10gPSB7IDQsMiwyLDIsMiwyIH07IC8qIC0tLS0gIC0tICAtLSAgLS0tLSAgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ3JlYXRlUGVuMTYgICAgKEdESS42MSkKQEAgLTEwMiw1MCArOTgsMyBAQAogICAgIHJldHVybiBjb3VudDsKIH0KIAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBQRU5fU2VsZWN0T2JqZWN0Ci0gKi8KLUhQRU4zMiBQRU5fU2VsZWN0T2JqZWN0KCBEQyAqIGRjLCBIUEVOMzIgaHBlbiwgUEVOT0JKICogcGVuICkKLXsKLSAgICBIUEVOMzIgcHJldkhhbmRsZSA9IGRjLT53LmhQZW47Ci0KLSAgICBpZiAoZGMtPmhlYWRlci53TWFnaWMgPT0gTUVUQUZJTEVfRENfTUFHSUMpCi0gICAgewotICAgICAgICBMT0dQRU4xNiBsb2dwZW4gPSB7IHBlbi0+bG9ncGVuLmxvcG5TdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHBlbi0+bG9ncGVuLmxvcG5XaWR0aC54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuLT5sb2dwZW4ubG9wbldpZHRoLnkgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW4tPmxvZ3Blbi5sb3BuQ29sb3IgfTsKLSAgICAgICAgaWYgKE1GX0NyZWF0ZVBlbkluZGlyZWN0KCBkYywgaHBlbiwgJmxvZ3BlbiApKSByZXR1cm4gcHJldkhhbmRsZTsKLSAgICAgICAgZWxzZSByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBkYy0+dy5oUGVuID0gaHBlbjsKLQotICAgIGRjLT51LngucGVuLnN0eWxlID0gcGVuLT5sb2dwZW4ubG9wblN0eWxlOwotICAgIGRjLT51LngucGVuLndpZHRoID0gcGVuLT5sb2dwZW4ubG9wbldpZHRoLnggKiBkYy0+dnBvcnRFeHRYIC8gZGMtPnduZEV4dFg7Ci0gICAgaWYgKGRjLT51LngucGVuLndpZHRoIDwgMCkgZGMtPnUueC5wZW4ud2lkdGggPSAtZGMtPnUueC5wZW4ud2lkdGg7Ci0gICAgaWYgKGRjLT51LngucGVuLndpZHRoID09IDEpIGRjLT51LngucGVuLndpZHRoID0gMDsgIC8qIEZhc3RlciAqLwotICAgIGRjLT51LngucGVuLnBpeGVsID0gQ09MT1JfVG9QaHlzaWNhbCggZGMsIHBlbi0+bG9ncGVuLmxvcG5Db2xvciApOyAgICAKLSAgICBzd2l0Y2gocGVuLT5sb2dwZW4ubG9wblN0eWxlKQotICAgIHsKLSAgICAgIGNhc2UgUFNfREFTSDoKLQlkYy0+dS54LnBlbi5kYXNoZXMgPSAoY2hhciAqKVBFTl9kYXNoOwotCWRjLT51LngucGVuLmRhc2hfbGVuID0gMjsKLQlicmVhazsKLSAgICAgIGNhc2UgUFNfRE9UOgotCWRjLT51LngucGVuLmRhc2hlcyA9IChjaGFyICopUEVOX2RvdDsKLQlkYy0+dS54LnBlbi5kYXNoX2xlbiA9IDI7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIFBTX0RBU0hET1Q6Ci0JZGMtPnUueC5wZW4uZGFzaGVzID0gKGNoYXIgKilQRU5fZGFzaGRvdDsKLQlkYy0+dS54LnBlbi5kYXNoX2xlbiA9IDQ7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIFBTX0RBU0hET1RET1Q6Ci0JZGMtPnUueC5wZW4uZGFzaGVzID0gKGNoYXIgKilQRU5fZGFzaGRvdGRvdDsKLQlkYy0+dS54LnBlbi5kYXNoX2xlbiA9IDY7Ci0JYnJlYWs7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBwcmV2SGFuZGxlOwotfQpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvcHJvZ21hbi9DaGFuZ2VMb2cgYi9wcm9ncmFtcy9wcm9nbWFuL0NoYW5nZUxvZwppbmRleCBkMjRjMjlhLi5hZWVhM2UyIDEwMDY0NAotLS0gYS9wcm9ncmFtcy9wcm9nbWFuL0NoYW5nZUxvZworKysgYi9wcm9ncmFtcy9wcm9nbWFuL0NoYW5nZUxvZwpAQCAtMSwzICsxLDggQEAKK0ZyaSBKYW4gMjQgMTE6MjE6MzAgMTk5NyAgQmFuZyBKdW4tWW91bmcgIDxiYW5nanlAbm93bnVyaS5ub3djb20uY28ua3I+CisKKwkqIFtLby5yY10gKG5ldykKKwlBZGRlZCBLb3JlYW4gbGFuZ3VhZ2Ugc3VwcG9ydC4KKwogTW9uIEp1bCAyMiAyMDozMDoxMSAxOTk2ICBKdXNzaSBUaXJra29uZW4gPGp0QG1vZGVlbWkuY3MudHV0LmZpPgogCiAJKiBbRmkucmNdIChuZXcpCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9wcm9nbWFuL0tvLnJjIGIvcHJvZ3JhbXMvcHJvZ21hbi9Lby5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmQ5MmE0Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvcHJvZ21hbi9Lby5yYwpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIFByb2dyYW0gTWFuYWdlcgorICoKKyAqIENvcHlyaWdodCAxOTk2IFVscmljaCBTY2htaWQKKyAqLworCisjZGVmaW5lIExBTkdVQUdFX0lEICAgICAgICAgICAgICAgICAgS28KKyNkZWZpbmUgTEFOR1VBR0VfTlVNQkVSICAgICAgICAgICAgICA2CisjZGVmaW5lIExBTkdVQUdFX01FTlVfSVRFTSAgICAgICAgICAgIiZLb3JlYW4iCisKKy8qIE1lbnUgKi8KKworI2RlZmluZSBNRU5VX0ZJTEUgICAgICAgICAgICAgICAgICAgICLGxMDPKCZGKSIKKyNkZWZpbmUgTUVOVV9GSUxFX05FVyAgICAgICAgICAgICAgICAiu/UgxsTAzygmTikuLi4iCisjZGVmaW5lIE1FTlVfRklMRV9PUEVOICAgICAgICAgICAgICAgIr+tseIoJlApXHRFbnRlciIKKyNkZWZpbmUgTUVOVV9GSUxFX01PVkUgICAgICAgICAgICAgICAiwMy1vygmTSkuLi5cdEY3IgorI2RlZmluZSBNRU5VX0ZJTEVfQ09QWSAgICAgICAgICAgICAgICK6ubvnKCZDKS4uLlx0RjgiCisjZGVmaW5lIE1FTlVfRklMRV9ERUxFVEUgICAgICAgICAgICAgIrvowaYoJkQpXHRFbnRmIgorI2RlZmluZSBNRU5VX0ZJTEVfQVRUUklCVVRFUyAgICAgICAgICK807y6KCZBKS4uLlx0QWx0K0VudGVyIgorI2RlZmluZSBNRU5VX0ZJTEVfRVhFQ1VURSAgICAgICAgICAgICK9x8fgKCZFKS4uLiIKKyNkZWZpbmUgTUVOVV9GSUxFX0VYSVQgICAgICAgICAgICAgICAiwKm1tb/sIMG+t+EoJlgpLi4uIgorCisjZGVmaW5lIE1FTlVfT1BUSU9OUyAgICAgICAgICAgICAgICAgIr/JvMcoJk8pIgorI2RlZmluZSBNRU5VX09QVElPTlNfQVVUT19BUlJBTkdFICAgICLA2rW/IMGkt8QoJkEpIgorI2RlZmluZSBNRU5VX09QVElPTlNfTUlOX09OX1JVTiAgICAgICK9x8fgvcMgvsbAzMTcwLi3ziC1yigmTSkiCisjZGVmaW5lIE1FTlVfT1BUSU9OU19TQVZFX1NFVFRJTkdTICAgIsG+t+G9wyC8s8GkILO7v+sgwPrA5SgmUykiCisKKyNkZWZpbmUgTUVOVV9XSU5ET1dTICAgICAgICAgICAgICAgICAiw6IoJlcpIgorI2RlZmluZSBNRU5VX1dJTkRPV1NfT1ZFUkxBUCAgICAgICAgICLB38O4KCZPKVx0U2hpZnQrRjUiCisjZGVmaW5lIE1FTlVfV0lORE9XU19TSURFX0JZX1NJREUgICAgIrrQx9IoJlMpXHRTaGlmdCtGNCIKKyNkZWZpbmUgTUVOVV9XSU5ET1dTX0FSUkFOR0UgICAgICAgICAivsbAzMTcIMGkt8QoJkEpIgorCisjZGVmaW5lIE1FTlVfTEFOR1VBR0UgICAgICAgICAgICAgICAgIr7wvu4oJkwpIgorCisjZGVmaW5lIE1FTlVfSEVMUCAgICAgICAgICAgICAgICAgICAgIrW1v/K4uygmSCkiCisjZGVmaW5lIE1FTlVfSEVMUF9DT05URU5UUyAgICAgICAgICAgIrjxwvcoJkMpIgorI2RlZmluZSBNRU5VX0hFTFBfU0VBUkNIICAgICAgICAgICAgICLDo7HiKCZTKS4uLiIKKyNkZWZpbmUgTUVOVV9IRUxQX0hFTFBfT05fSEVMUCAgICAgICAitbW/8ri7ILvnv+u5/SgmSCkiCisjZGVmaW5lIE1FTlVfSEVMUF9UVVRPUklBTCAgICAgICAgICAgIsDavcC8rSgmVCkiCisKKyNkZWZpbmUgTUVOVV9JTkZPICAgICAgICAgICAgICAgICAgICAiwaS6uCgmSSkuLi4iCisjZGVmaW5lIE1FTlVfSU5GT19MSUNFTlNFICAgICAgICAgICAgIrbzwMy8vr26KCZMKSIKKyNkZWZpbmUgTUVOVV9JTkZPX05PX1dBUlJBTlRZICAgICAgICAiuau6uMH1KCZOKSIKKyNkZWZpbmUgTUVOVV9JTkZPX0FCT1VUX1dJTkUgICAgICAgICAiv83Azr+hILD8x8+/qSgmQSkiCisKKy8qIERpYWxvZ3MgKi8KKworI2RlZmluZSBESUFMT0dfT0sgICAgICAgICAgICAgICAgICAgICLIrsDOIgorI2RlZmluZSBESUFMT0dfQ0FOQ0VMICAgICAgICAgICAgICAgICLD67zSIgorI2RlZmluZSBESUFMT0dfQlJPV1NFICAgICAgICAgICAgICAgICKwy7v2KCZCKSIKKyNkZWZpbmUgRElBTE9HX0hFTFAgICAgICAgICAgICAgICAgICAitbW/8ri7KCZIKSIKKworI2RlZmluZSBESUFMT0dfTkVXX0NBUFRJT04gICAgICAgICAgICK79SDHwbfOsde3pSCws8O8IgorI2RlZmluZSBESUFMT0dfTkVXX05FVyAgICAgICAgICAgICAgICK79SCws8O8IgorI2RlZmluZSBESUFMT0dfTkVXX0dST1VQICAgICAgICAgICAgICLHwbfOsde3pSCx17fsKCZHKSIKKyNkZWZpbmUgRElBTE9HX05FV19QUk9HUkFNICAgICAgICAgICAix8G3zrHXt6UoJlApIgorCisjZGVmaW5lIERJQUxPR19NT1ZFX0NBUFRJT04gICAgICAgICAgIsfBt86x17elIMDMtb8iCisjZGVmaW5lIERJQUxPR19NT1ZFX1BST0dSQU0gICAgICAgICAgIsfBt86x17elIMDMtb86IgorI2RlZmluZSBESUFMT0dfTU9WRV9GUk9NX0dST1VQICAgICAgICLAzLW/IMD8OiIKKyNkZWZpbmUgRElBTE9HX01PVkVfVE9fR1JPVVAgICAgICAgICAiwMy1vyDIxCgmVCk6IgorCisjZGVmaW5lIERJQUxPR19DT1BZX0NBUFRJT04gICAgICAgICAgIsfBt86x17elILq5u+ciCisjZGVmaW5lIERJQUxPR19DT1BZX1BST0dSQU0gICAgICAgICAgIsfBt86x17elILq5u+c6IgorI2RlZmluZSBESUFMT0dfQ09QWV9GUk9NX0dST1VQICAgICAgIERJQUxPR19NT1ZFX0ZST01fR1JPVVAKKyNkZWZpbmUgRElBTE9HX0NPUFlfVE9fR1JPVVAgICAgICAgICBESUFMT0dfTU9WRV9UT19HUk9VUAorCisjZGVmaW5lIERJQUxPR19HUk9VUF9DQVBUSU9OICAgICAgICAgIsfBt86x17elILHXt+wgvNO8uiIKKyNkZWZpbmUgRElBTE9HX0dST1VQX0RFU0NSSVBUSU9OICAgICAivLO47SgmRCk6IgorI2RlZmluZSBESUFMT0dfR1JPVVBfRklMRSAgICAgICAgICAgICKx17fsIMbEwM8oJkcpOiIKKworI2RlZmluZSBESUFMT0dfUFJPR1JBTV9DQVBUSU9OICAgICAgICLHwbfOsde3pSC807y6IgorI2RlZmluZSBESUFMT0dfUFJPR1JBTV9ERVNDUklQVElPTiAgIERJQUxPR19HUk9VUF9ERVNDUklQVElPTgorI2RlZmluZSBESUFMT0dfUFJPR1JBTV9DT01NQU5EX0xJTkUgICK47bfJx+AoJkMpOiIKKyNkZWZpbmUgRElBTE9HX1BST0dSQU1fRElSRUNUT1JZICAgICAiwNu+9yC18Le6xeS4rigmVyk6IgorI2RlZmluZSBESUFMT0dfUFJPR1JBTV9IT1RfS0VZICAgICAgICLFsCDBtsfVKCZLKToiCisjZGVmaW5lIERJQUxPR19QUk9HUkFNX1NZTUJPTCAgICAgICAgIr7GwMzE3MC4t84oJlMpIgorI2RlZmluZSBESUFMT0dfUFJPR1JBTV9PVEhFUl9TWU1CT0wgICK02bilIL7GwMzE3CgmTykuLi4iCisKKyNkZWZpbmUgRElBTE9HX1NZTUJPTF9DQVBUSU9OICAgICAgICAivsbAzMTcILyxxcMiCisjZGVmaW5lIERJQUxPR19TWU1CT0xfRklMRSAgICAgICAgICAgIsbEwM+47SgmRik6IgorI2RlZmluZSBESUFMT0dfU1lNQk9MX0NVUlJFTlQgICAgICAgICLH9sDnIL7GwMzE3CgmQyk6IgorCisjZGVmaW5lIERJQUxPR19FWEVDVVRFX0NBUFRJT04gICAgICAgIsfBt86x17elIL3Hx+AiCisjZGVmaW5lIERJQUxPR19FWEVDVVRFX0NPTU1BTkRfTElORSAgRElBTE9HX1BST0dSQU1fQ09NTUFORF9MSU5FCisjZGVmaW5lIERJQUxPR19FWEVDVVRFX1NZTUJPTCAgICAgICAgRElBTE9HX1BST0dSQU1fU1lNQk9MCisKKy8qIFN0cmluZ3MgKi8KKworI2RlZmluZSBTVFJJTkdfUFJPR1JBTV9NQU5BR0VSICAgICAgICAgICAgIsfBt86x17elILD8uK7A2iIKKyNkZWZpbmUgU1RSSU5HX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICK/wLf5IgorI2RlZmluZSBTVFJJTkdfV0FSTklORyAgICAgICAgICAgICAgICAgICAgIrDmsO0iCisjZGVmaW5lIFNUUklOR19JTkZPICAgICAgICAgICAgICAgICAgICAgICAiwaS6uCIKKyNkZWZpbmUgU1RSSU5HX0RFTEVURSAgICAgICAgICAgICAgICAgICAgICK76MGmIgorI2RlZmluZSBTVFJJTkdfREVMRVRFX0dST1VQX3MgICAgICAgICAgICAgIrHXt+wgYCVzJ7imILvowabH0rHuv+Q/IgorI2RlZmluZSBTVFJJTkdfREVMRVRFX1BST0dSQU1fcyAgICAgICAgICAgIsfBt86x17elIGAlcye4piC76MGmx9Kx7r/kPyIKKyNkZWZpbmUgU1RSSU5HX05PVF9JTVBMRU1FTlRFRCAgICAgICAgICAgICKxuMf2tcfB9iC+yr7SwL0iCisjZGVmaW5lIFNUUklOR19GSUxFX1JFQURfRVJST1JfcyAgICAgICAgICAiYCVzJyDA0LHiIL/At/kiCisjZGVmaW5lIFNUUklOR19GSUxFX1dSSVRFX0VSUk9SX3MgICAgICAgICAiYCVzJyC+srHiIL/At/kiCisKKyNkZWZpbmUgU1RSSU5HX0dSUEZJTEVfUkVBRF9FUlJPUl9zICAgICAgICJcCiux17fsIMbEwM8gYCVzJ7imIL+tILz2IL74vcC0z7TZLlxuXAorx9G5+CC09SC9w7W1x9gguryx7r/kPyIKKworI2RlZmluZSBTVFJJTkdfT1VUX09GX01FTU9SWSAgICAgICAgICAgICAgIrjeuPC4riC6zsG3IgorI2RlZmluZSBTVFJJTkdfV0lOSEVMUF9FUlJPUiAgICAgICAgICAgICAgIrW1v/K4u8DMIL74vcC0z7TZIgorI2RlZmluZSBTVFJJTkdfVU5LTk9XTl9GRUFUVVJFX3MgICAgICAgICAgIiVzv6EgvssgvPYgvvi0wiCx4rTJwMwgwNbAvSIKKyNkZWZpbmUgU1RSSU5HX0ZJTEVfTk9UX09WRVJXUklUVEVOX3MgICAgICLGxMDPIGAlcyewoSDBuMDnx9W0z7TZLiC1pL7uvrLB9iC+yr3AtM+02S4iCisjZGVmaW5lIFNUUklOR19TQVZFX0dST1VQX0FTX3MgICAgICAgICAgICAiv/i3oSDGxMDPwLsgtaS+7r6ytMIgsM3AuyC4t7HiIMCnx9ggsde37MC7IGAlcye3ziDA+sDlx9W0z7TZIgorCisjZGVmaW5lIFNUUklOR19OT19IT1RfS0VZICAgICAgICAgICAgICAgICAivvjAvSIKKworI2RlZmluZSBTVFJJTkdfQUxMX0ZJTEVTICAgICAgICAgICAgICAgICAgIrjwtecgxsTAzyAoKi4qKSIKKyNkZWZpbmUgU1RSSU5HX1BST0dSQU1TICAgICAgICAgICAgICAgICAgICLHwbfOsde3pSIKKyNkZWZpbmUgU1RSSU5HX0xJQlJBUklFU19ETEwgICAgICAgICAgICAgICK288DMuuq3r7iuICgqLmRsbCkiCisjZGVmaW5lIFNUUklOR19TWU1CT0xfRklMRVMgICAgICAgICAgICAgICAivsbAzMTcIMbEwM8iCisjZGVmaW5lIFNUUklOR19TWU1CT0xTX0lDTyAgICAgICAgICAgICAgICAivsbAzMTcICgqLmljbykiCisKKyNpbmNsdWRlICJYeC5yYyIKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3Byb2dtYW4vTWFrZWZpbGUuaW4gYi9wcm9ncmFtcy9wcm9nbWFuL01ha2VmaWxlLmluCmluZGV4IGVhMmU5NTQuLjE2ZDExNjcgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL3Byb2dtYW4vTWFrZWZpbGUuaW4KKysrIGIvcHJvZ3JhbXMvcHJvZ21hbi9NYWtlZmlsZS5pbgpAQCAtOCw3ICs4LDcgQEAKIERFRlMgICAgICA9IC1JJChTUkNESVIpCiBSQ0ZMQUdTICAgPSAtdzMyCiAKLUxBTkdVQUdFUyAgID0gRW4gRGUgRnIgRmkKK0xBTkdVQUdFUyAgID0gRW4gRGUgRnIgRmkgS28KIExJQ0VOU0VMQU5HID0gRW4KIAogIyBJbnN0YWxsYXRpb24gaW5mb3MKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3dpbmhlbHAvQ2hhbmdlTG9nIGIvcHJvZ3JhbXMvd2luaGVscC9DaGFuZ2VMb2cKaW5kZXggYWE2OTJiYy4uZjg2ZTRjNiAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvd2luaGVscC9DaGFuZ2VMb2cKKysrIGIvcHJvZ3JhbXMvd2luaGVscC9DaGFuZ2VMb2cKQEAgLTEsMyArMSw4IEBACitGcmkgSmFuIDI0IDExOjI3OjM3IDE5OTcgIEJhbmcgSnVuLVlvdW5nICA8YmFuZ2p5QG5vd251cmkubm93Y29tLmNvLmtyPgorCisJKiBbS28ucmNdIChuZXcpCisJQWRkZWQgS29yZWFuIGxhbmd1YWdlIHN1cHBvcnQuCisKIE1vbiBKdWwgMjIgMjA6MzA6MTEgMTk5NiAgSnVzc2kgVGlya2tvbmVuIDxqdEBtb2RlZW1pLmNzLnR1dC5maT4KIAogCSogW0ZpLnJjXSAobmV3KQpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvd2luaGVscC9Lby5yYyBiL3Byb2dyYW1zL3dpbmhlbHAvS28ucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJiMjNhZQotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL3dpbmhlbHAvS28ucmMKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIEhlbHAgVmlld2VyCisgKgorICogQ29weXJpZ2h0IDE5OTYgVWxyaWNoIFNjaG1pZAorICovCisKKy8qIFRoaXMgZmlsZSBpcyBub3QgeWV0IGNvbXBsZXRlICEhICovCisKKyNkZWZpbmUgTEFOR1VBR0VfSUQgICAgICAgICAgICAgICAgICBLbworI2RlZmluZSBMQU5HVUFHRV9OVU1CRVIgICAgICAgICAgICAgIDYKKworLyogTWVudSAqLworCisjZGVmaW5lIE1FTlVfRklMRSAgICAgICAgICAgICAgICAgICAgIsbEwM8oJkYpIgorI2RlZmluZSBNRU5VX0ZJTEVfT1BFTiAgICAgICAgICAgICAgICK/rbHiKCZPKS4uLiIKKyNkZWZpbmUgTUVOVV9GSUxFX1BSSU5UICAgICAgICAgICAgICAiwM684igmUCkiCisjZGVmaW5lIE1FTlVfRklMRV9QUklOVEVSX1NFVFVQICAgICAgIsfBuLDFzSC8s8GkKCZTKS4uLiIKKyNkZWZpbmUgTUVOVV9GSUxFX0VYSVQgICAgICAgICAgICAgICAiwb634SgmRSkiCisKKyNkZWZpbmUgTUVOVV9FRElUICAgICAgICAgICAgICAgICAgICAixu3B/SgmRSkiCisjZGVmaW5lIE1FTlVfRURJVF9DT1BZX0RJQUxPRyAgICAgICAgIrq5u+coJkMpLi4uIgorI2RlZmluZSBNRU5VX0VESVRfQU5OT1RBVEUgICAgICAgICAgICLB1ryuKCZBKS4uLiIKKworI2RlZmluZSBNRU5VX0JPT0tNQVJLICAgICAgICAgICAgICAgICLDpbClx8coJkIpIgorI2RlZmluZSBNRU5VX0JPT0tNQVJLX0RFRklORSAgICAgICAgICLBpMDHKCZEKS4uLiIKKworI2RlZmluZSBNRU5VX0hFTFAgICAgICAgICAgICAgICAgICAgICK1tb/yuLsoJkgpIgorI2RlZmluZSBNRU5VX0hFTFBfT05fSEVMUCAgICAgICAgICAgICK1tb/yuLsgu+e/67n9KCZPKSIKKyNkZWZpbmUgTUVOVV9IRUxQX09OX1RPUCAgICAgICAgICAgICAix9e78yDApygmVCkiCisjZGVmaW5lIE1FTlVfSEVMUF9JTkZPICAgICAgICAgICAgICAgIsGkurgoJkkpLi4uIgorI2RlZmluZSBNRU5VX0hFTFBfQUJPVVRfV0lORSAgICAgICAgICK/zcDOv6EgsPzHz7+pKCZBKSIKKworLyogU3RyaW5ncyAqLworCisjZGVmaW5lIFNUUklOR19XSU5FX0hFTFAgICAgICAgICAgICAgIr/NwM4gtbW/8ri7IgorI2RlZmluZSBTVFJJTkdfRVJST1IgICAgICAgICAgICAgICAgICK/wLf5IgorI2RlZmluZSBTVFJJTkdfV0FSTklORyAgICAgICAgICAgICAgICKw5rDtIgorI2RlZmluZSBTVFJJTkdfSU5GTyAgICAgICAgICAgICAgICAgICLBpLq4IgorI2RlZmluZSBTVFJJTkdfTk9UX0lNUExFTUVOVEVEICAgICAgICKxuMf2tcfB9iC+yr7SwL0iCisjZGVmaW5lIFNUUklOR19ITFBGSUxFX0VSUk9SX3MgICAgICAgIrW1v/K4uyDGxMDPIGAlcye4piDA0LTCILW1wd8gv8C3+SC537v9IgorI2RlZmluZSBTVFJJTkdfQ09OVEVOVFMgICAgICAgICAgICAgICK48cL3KCZDKSIKKyNkZWZpbmUgU1RSSU5HX1NFQVJDSCAgICAgICAgICAgICAgICAiw6Ox4igmUykiCisjZGVmaW5lIFNUUklOR19CQUNLICAgICAgICAgICAgICAgICAgIrXat84oJkIpIgorI2RlZmluZSBTVFJJTkdfSElTVE9SWSAgICAgICAgICAgICAgICLI9726xeS4rigmSCkiCisjZGVmaW5lIFNUUklOR19BTExfRklMRVMgICAgICAgICAgICAgIrjwtecgxsTAzyAoKi4qKSIKKyNkZWZpbmUgU1RSSU5HX0hFTFBfRklMRVNfSExQICAgICAgICAitbW/8ri7IMbEwM8gKCouaGxwKSIKKworI2luY2x1ZGUgIlh4LnJjIgpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvd2luaGVscC9NYWtlZmlsZS5pbiBiL3Byb2dyYW1zL3dpbmhlbHAvTWFrZWZpbGUuaW4KaW5kZXggZDcwYjcxNi4uNTZlZDI5YSAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvd2luaGVscC9NYWtlZmlsZS5pbgorKysgYi9wcm9ncmFtcy93aW5oZWxwL01ha2VmaWxlLmluCkBAIC03LDcgKzcsNyBAQAogQUxMX0xJQlMgID0gJChXSU5FTElCKSAkKFhfTElCUykgJChYUE1fTElCKSAkKFhMSUIpICQoTERMSUJTKQogUkNGTEFHUyAgID0gLXczMgogCi1MQU5HVUFHRVMgICA9IEVuIERlIEZyIEZpCitMQU5HVUFHRVMgICA9IEVuIERlIEZyIEZpIEtvCiAKICMgSW5zdGFsbGF0aW9uIGluZm9zCiAKZGlmZiAtLWdpdCBhL3Jlc291cmNlcy9zeXNyZXNfSXQucmMgYi9yZXNvdXJjZXMvc3lzcmVzX0l0LnJjCmluZGV4IGFmYTZkMDMuLmQzMmJiOGIgMTAwNjQ0Ci0tLSBhL3Jlc291cmNlcy9zeXNyZXNfSXQucmMKKysrIGIvcmVzb3VyY2VzL3N5c3Jlc19JdC5yYwpAQCAtMTcsMTQgKzE3LDE0IEBACiB7CiAJUE9QVVAgIiIKIAlCRUdJTgotCQlNRU5VSVRFTSAiJlVuZG8iLCBFTV9VTkRPMzIKKyAgICAgICAgICAgICAgICBNRU5VSVRFTSAiJkFubnVsbGEiLCBFTV9VTkRPMzIKIAkJTUVOVUlURU0gU0VQQVJBVE9SCi0JCU1FTlVJVEVNICJDdSZ0IiwgV01fQ1VUCi0JCU1FTlVJVEVNICImQ29weSIsIFdNX0NPUFkKLQkJTUVOVUlURU0gIiZQYXN0ZSIsIFdNX1BBU1RFCi0JCU1FTlVJVEVNICImRGVsZXRlIiwgV01fQ0xFQVIKKyAgICAgICAgICAgICAgICBNRU5VSVRFTSAiJlRhZ2xpYSIsIFdNX0NVVAorICAgICAgICAgICAgICAgIE1FTlVJVEVNICImQ29waWEiLCBXTV9DT1BZCisgICAgICAgICAgICAgICAgTUVOVUlURU0gIiZJbmNvbGxhIiwgV01fUEFTVEUKKyAgICAgICAgICAgICAgICBNRU5VSVRFTSAiJkVsaW1pbmEiLCBXTV9DTEVBUgogCQlNRU5VSVRFTSBTRVBBUkFUT1IKLQkJTUVOVUlURU0gIlNlbGVjdCAmQWxsIiwgRU1fU0VUU0VMMzIKKyAgICAgICAgICAgICAgICBNRU5VSVRFTSAiU2VsZSZ6aW9uYSB0dXR0byIsIEVNX1NFVFNFTDMyCiAJRU5ECiB9CiAKQEAgLTkxLDcgKzkxLDcgQEAKICBMVEVYVCAiJlVuaXRhJzoiLCAxMDkxLCAxMTAsIDEwNCwgOTIsIDkKICBDT01CT0JPWCAxMTM3LCAxMTAsIDExNCwgOTIsIDY4LCBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX1NPUlQgfCBDQlNfSEFTU1RSSU5HUyB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QCiAgREVGUFVTSEJVVFRPTiAiU2FsdmEgY29tZSIsIDEsIDIwOCwgNiwgNTYsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCi0gUFVTSEJVVFRPTiAiQ2FuY2VsIiwgMiwgMjA4LCAyNCwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJBbm51bGxhIiwgMiwgMjA4LCAyNCwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKICBQVVNIQlVUVE9OICImSGVscCIsIDEwMzgsIDIwOCwgNDYsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCiAgQ0hFQ0tCT1ggIiZSZWFkIE9ubHkiLCAxMDQwLCAyMDgsIDY4LCA1MCwgMTIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAogfQpkaWZmIC0tZ2l0IGEvcmVzb3VyY2VzL3N5c3Jlc19Lby5yYyBiL3Jlc291cmNlcy9zeXNyZXNfS28ucmMKaW5kZXggYWIyNmQwNi4uNjQ2YzhjMyAxMDA2NDQKLS0tIGEvcmVzb3VyY2VzL3N5c3Jlc19Lby5yYworKysgYi9yZXNvdXJjZXMvc3lzcmVzX0tvLnJjCkBAIC0zLDggKzMsOCBAQAogIE1FTlVJVEVNICK6ubHNKCZSKSIsIDYxNzI4CiAgTUVOVUlURU0gIsDMtb8oJk0pIiwgNjE0NTYKICBNRU5VSVRFTSAixamx4iC6r7DmKCZTKSIsIDYxNDQwCi0gTUVOVUlURU0gIsPgvNIoJk4pIiwgNjE0NzIKLSBNRU5VSVRFTSAiyK606ygmTSkiLCA2MTQ4OAorIE1FTlVJVEVNICK+xsDMxNwgx6W9wygmTikiLCA2MTQ3MgorIE1FTlVJVEVNICLA/MO8IMituOkgx6W9wygmTSkiLCA2MTQ4OAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICK03bHiKCZDKVx0QWx0LUY0IiwgNjE1MzYKICBNRU5VSVRFTSBTRVBBUkFUT1IKQEAgLTE3LDE0ICsxNywxNCBAQAogewogCVBPUFVQICIiCiAJQkVHSU4KLQkJTUVOVUlURU0gIiZVbmRvIiwgRU1fVU5ETzMyCisJCU1FTlVJVEVNICK9x8fgIMPrvNIoJlUpIiwgRU1fVU5ETzMyCiAJCU1FTlVJVEVNIFNFUEFSQVRPUgotCQlNRU5VSVRFTSAiQ3UmdCIsIFdNX0NVVAotCQlNRU5VSVRFTSAiJkNvcHkiLCBXTV9DT1BZCi0JCU1FTlVJVEVNICImUGFzdGUiLCBXTV9QQVNURQotCQlNRU5VSVRFTSAiJkRlbGV0ZSIsIFdNX0NMRUFSCisJCU1FTlVJVEVNICLA37bzs7ux4igmVCkiLCBXTV9DVVQKKwkJTUVOVUlURU0gIrq5u+coJkMpIiwgV01fQ09QWQorCQlNRU5VSVRFTSAiutm/qbPWseIoJlApIiwgV01fUEFTVEUKKwkJTUVOVUlURU0gIrvowaYoJkQpIiwgV01fQ0xFQVIKIAkJTUVOVUlURU0gU0VQQVJBVE9SCi0JCU1FTlVJVEVNICJTZWxlY3QgJkFsbCIsIEVNX1NFVFNFTDMyCisJCU1FTlVJVEVNICLA/MO8ILyxxcMoJkEpIiwgRU1fU0VUU0VMMzIKIAlFTkQKIH0KIApAQCAtMzMsNyArMzMsNyBAQAogQkVHSU4KIAlJQ09OICIiLCAxMDg4LCA4LCAyMCwgMTYsIDE2LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUKIAlMVEVYVCAiIiwgMTAwLCAzMiwgNCwgMTc2LCA0OCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAKLQlQVVNIQlVUVE9OICK9wsDOKCZPKSIsIDEsIDE2LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisJUFVTSEJVVFRPTiAiyK7AzigmTykiLCAxLCAxNiwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAogCVBVU0hCVVRUT04gIsPrvNIoJkMpIiwgMiwgNjQsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKIAlQVVNIQlVUVE9OICLB37TcKCZBKSIsIDMsIDExMiwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAogCVBVU0hCVVRUT04gIsDnvcO1tSgmUikiLCA0LCAxNjAsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKQEAgLTQ3LDcgKzQ3LDcgQEAKIENBUFRJT04gIiVzv6EgsPzHz7+pIgogRk9OVCAxMCwgIlN5c3RlbSIKIHsKLSBERUZQVVNIQlVUVE9OICK9wsDOIiwgMSwgOTEsIDI1MCwgNDAsIDE0CisgREVGUFVTSEJVVFRPTiAiyK7AziIsIDEsIDkxLCAyNTAsIDQwLCAxNAogIENPTlRST0wgIiIsIC0xLCAiU1RBVElDIiwgU1NfQkxBQ0tGUkFNRSB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0RJU0FCTEVELCA0LCAzNSwgMjE1LCAyMTAKICBMVEVYVCAiVGV4dCIsIDEwMCwgMTEsIDQwLCAyMDAsIDIwMCwgU1NfTk9QUkVGSVggfCBXU19HUk9VUAogIElDT04gIiIsIDEwODgsIDE5NSwgMTAsIDE4LCAyMApAQCAtMTMxLDcgKzEzMSw3IEBACiAgTFRFWFQgIlu++MC9XSIsIDEwODgsIDM1LCAzNSwgMTIwLCA5CiAgUkFESU9CVVRUT04gIsH2waS1yCDAzrziseIoJlApIiwgMTA1NywgMTYsIDUwLCA4MCwgMTIKICBDT01CT0JPWCAxMTM2LCAzNSwgNjUsIDE0OSwgNjgsIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfT1dORVJEUkFXRklYRUQgfCBDQlNfQVVUT0hTQ1JPTEwgfCBDQlNfU09SVCB8IENCU19IQVNTVFJJTkdTIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IFdTX1RBQlNUT1AKLSBERUZQVVNIQlVUVE9OICK9wsDOIiwgMSwgMjA2LCA2LCA1NiwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBERUZQVVNIQlVUVE9OICLIrsDOIiwgMSwgMjA2LCA2LCA1NiwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKICBQVVNIQlVUVE9OICLD67zSIiwgMiwgMjA2LCAyNCwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKICBQVVNIQlVUVE9OICK8s8GkKCZTKSIsIDEwMjQsIDIwNiwgNDYsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCiAgR1JPVVBCT1ggIrnmx+IiLCAxMDczLCA2LCA4NSwgMTAwLCA1MCwgQlNfR1JPVVBCT1gKQEAgLTE1NCw3ICsxNTQsNyBAQAogewogIExURVhUICKx28Daw7w6IiwgMTA4OCwgNiwgNiwgNDAsIDkKICBMVEVYVCAiIiwgMTA4OSwgNjAsIDYsIDE1MCwgOQotIERFRlBVU0hCVVRUT04gIr3CwM4iLCAxLCAyMDYsIDYsIDU2LCAxNCwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIERFRlBVU0hCVVRUT04gIsiuwM4iLCAxLCAyMDYsIDYsIDU2LCAxNCwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAogIFBVU0hCVVRUT04gIsPrvNIiLCAyLCAyMDYsIDI0LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAogfQogCkBAIC0xODQsNyArMTg0LDcgQEAKICBDT05UUk9MICIiICw3MTAsIlNUQVRJQyIsV1NfQk9SREVSfFNTX1NJTVBMRXxXU19UQUJTVE9QfFdTX0dST1VQLCAxNTIsNCwxMTgsMTE2CiAgQ09OVFJPTCAiIiAsNzAyLCJTVEFUSUMiLFNTX1NJTVBMRXxXU19UQUJTVE9QfFdTX0dST1VQLCAyNzgsNCw4LDExNgogIENPTlRST0wgIiIgLDcwOSwiU1RBVElDIixTU19TSU1QTEV8V1NfVEFCU1RPUHxXU19HUk9VUCwgMTUyLDEyNCw0MCwyNgotIERFRlBVU0hCVVRUT04gIr3CwM4iLCAgMSwgIDQsIDE2NiwgNDQsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgREVGUFVTSEJVVFRPTiAiyK7AziIsICAxLCAgNCwgMTY2LCA0NCwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKICBQVVNIQlVUVE9OICLD67zSIiwgMiwgNTIsIDE2NiwgNDQsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKICBQVVNIQlVUVE9OICK1tb/yuLsiLCAxMDM4LDEwMCwxNjYsIDQ0LCAxNAogIFBVU0hCVVRUT04gIrvnv+vA2rv2v6Egw9+woSgmQSkiLCAgICA3MTIvKjEwMjQqLywgMTUyLCAxNjYsIDE0MiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUApkaWZmIC0tZ2l0IGEvc2NoZWR1bGVyL3RocmVhZC5jIGIvc2NoZWR1bGVyL3RocmVhZC5jCmluZGV4IGFjYzY0YTEuLjBiNDhlZmUgMTAwNjQ0Ci0tLSBhL3NjaGVkdWxlci90aHJlYWQuYworKysgYi9zY2hlZHVsZXIvdGhyZWFkLmMKQEAgLTUsNiArNSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSAidGhyZWFkLmgiCiAjaW5jbHVkZSAid2luZXJyb3IuaCIKICNpbmNsdWRlICJoZWFwLmgiCkBAIC0xMywxMSArMTQsMzEgQEAKIAogVEhEQiAqcEN1cnJlbnRUaHJlYWQgPSBOVUxMOwogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBUSFJFQURfR2V0UHRyCisgKgorICogUmV0dXJuIGEgcG9pbnRlciB0byBhIHRocmVhZCBvYmplY3QuIFRoZSBvYmplY3QgY291bnQgbXVzdCBiZSBkZWNyZW1lbnRlZAorICogd2hlbiBubyBsb25nZXIgdXNlZC4KKyAqLworc3RhdGljIFRIREIgKlRIUkVBRF9HZXRQdHIoIEhBTkRMRTMyIGhhbmRsZSApCit7CisgICAgVEhEQiAqdGhyZWFkOworCisgICAgaWYgKGhhbmRsZSA9PSAweGZmZmZmZmZlKSAgLyogU2VsZi10aHJlYWQgaGFuZGxlICovCisgICAgeworICAgICAgICB0aHJlYWQgPSAoVEhEQiAqKUdldEN1cnJlbnRUaHJlYWRJZCgpOworICAgICAgICBLMzJPQkpfSW5jQ291bnQoICZ0aHJlYWQtPmhlYWRlciApOworICAgIH0KKyAgICBlbHNlIHRocmVhZCA9IChUSERCICopUFJPQ0VTU19HZXRPYmpQdHIoIGhhbmRsZSwgSzMyT0JKX1RIUkVBRCApOworICAgIHJldHVybiB0aHJlYWQ7Cit9CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgVEhSRUFEX0NyZWF0ZQogICovCi1USERCICpUSFJFQURfQ3JlYXRlKCBQREIzMiAqcGRiLCBEV09SRCBzdGFja19zaXplICkKK1RIREIgKlRIUkVBRF9DcmVhdGUoIFBEQjMyICpwZGIsIERXT1JEIHN0YWNrX3NpemUsCisgICAgICAgICAgICAgICAgICAgICBMUFRIUkVBRF9TVEFSVF9ST1VUSU5FIHN0YXJ0X2FkZHIgKQogewogICAgIFRIREIgKnRoZGIgPSBIZWFwQWxsb2MoIFN5c3RlbUhlYXAsIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihUSERCKSApOwogICAgIGlmICghdGhkYikgcmV0dXJuIE5VTEw7CkBAIC00OSw2ICs3MCwxOSBAQAogICAgIHRoZGItPnRlYl9zZWwgPSBTRUxFQ1RPUl9BbGxvY0Jsb2NrKCAmdGhkYi0+dGViLCAweDEwMDAsIFNFR01FTlRfREFUQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwgRkFMU0UgKTsKICAgICBpZiAoIXRoZGItPnRlYl9zZWwpIGdvdG8gZXJyb3I7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSB0aHJlYWQgY29udGV4dCAqLworCisgICAgdGhkYi0+cGNvbnRleHQgICAgICAgID0gJnRoZGItPmNvbnRleHQ7CisgICAgdGhkYi0+Y29udGV4dC5TZWdDcyAgID0gV0lORV9DT0RFX1NFTEVDVE9SOworICAgIHRoZGItPmNvbnRleHQuU2VnRHMgICA9IFdJTkVfREFUQV9TRUxFQ1RPUjsKKyAgICB0aGRiLT5jb250ZXh0LlNlZ0VzICAgPSBXSU5FX0RBVEFfU0VMRUNUT1I7CisgICAgdGhkYi0+Y29udGV4dC5TZWdGcyAgID0gdGhkYi0+dGViX3NlbDsKKyAgICB0aGRiLT5jb250ZXh0LlNlZ0dzICAgPSBXSU5FX0RBVEFfU0VMRUNUT1I7CisgICAgdGhkYi0+Y29udGV4dC5TZWdTcyAgID0gV0lORV9EQVRBX1NFTEVDVE9SOworICAgIHRoZGItPmNvbnRleHQuRWlwICAgICA9IChEV09SRClzdGFydF9hZGRyOworICAgIHRoZGItPmNvbnRleHQuRXNwICAgICA9IChEV09SRCl0aGRiLT50ZWIuc3RhY2tfdG9wOworCiAgICAgcmV0dXJuIHRoZGI7CiAKIGVycm9yOgpAQCAtNzMsNiArMTA3LDMwIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ3JlYXRlVGhyZWFkICAgKEtFUk5FTDMyLjYzKQorICoKKyAqIFRoZSBvbmx5IHRoaW5nIG1pc3NpbmcgaGVyZSBpcyBhY3R1YWxseSBnZXR0aW5nIHRoZSB0aHJlYWQgdG8gcnVuIDstKQorICovCitIQU5ETEUzMiBDcmVhdGVUaHJlYWQoIExQU0VDVVJJVFlfQVRUUklCVVRFUyBhdHRyaWJzLCBEV09SRCBzdGFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgTFBUSFJFQURfU1RBUlRfUk9VVElORSBzdGFydCwgTFBWT0lEIHBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBmbGFncywgTFBEV09SRCBpZCApCit7CisgICAgSEFORExFMzIgaGFuZGxlOworICAgIFRIREIgKnRocmVhZCA9IFRIUkVBRF9DcmVhdGUoIHBDdXJyZW50UHJvY2Vzcywgc3RhY2ssIHN0YXJ0ICk7CisgICAgaWYgKCF0aHJlYWQpIHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTMyOworICAgIGhhbmRsZSA9IFBST0NFU1NfQWxsb2NIYW5kbGUoICZ0aHJlYWQtPmhlYWRlciwgMCApOworICAgIGlmIChoYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMikKKyAgICB7CisgICAgICAgIFRIUkVBRF9EZXN0cm95KCAmdGhyZWFkLT5oZWFkZXIgKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFMzI7CisgICAgfQorICAgICppZCA9IChEV09SRCl0aHJlYWQ7CisgICAgZnByaW50Ziggc3RkZXJyLCAiQ3JlYXRlVGhyZWFkOiBzdHViXG4iICk7CisgICAgcmV0dXJuIGhhbmRsZTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXRDdXJyZW50VGhyZWFkICAgKEtFUk5FTDMyLjIwMCkKICAqLwogSEFORExFMzIgR2V0Q3VycmVudFRocmVhZCh2b2lkKQpAQCAtMjE5LDcgKzI3NywxMSBAQAogICovCiBCT09MMzIgR2V0VGhyZWFkQ29udGV4dCggSEFORExFMzIgaGFuZGxlLCBDT05URVhUICpjb250ZXh0ICkKIHsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgVEhEQiAqdGhyZWFkID0gKFRIREIqKVBST0NFU1NfR2V0T2JqUHRyKCBoYW5kbGUsIEszMk9CSl9USFJFQUQgKTsKKyAgICBpZiAoIXRocmVhZCkgcmV0dXJuIEZBTFNFOworICAgICpjb250ZXh0ID0gdGhyZWFkLT5jb250ZXh0OworICAgIEszMk9CSl9EZWNDb3VudCggJnRocmVhZC0+aGVhZGVyICk7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIApAQCAtMjMxLDM0ICsyOTMsMzEgQEAKICAgICBFQVhfcmVnKGNvbnRleHQpID0gR2V0U2VsZWN0b3JCYXNlKCBGU19yZWcoY29udGV4dCkgKTsKIH0KIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdldFRocmVhZFByaW9yaXR5ICAgKEtFUk5FTDMyLjI5NikKICAqLwotSU5UMzIKLUdldFRocmVhZFByaW9yaXR5KEhBTkRMRTMyIGh0aHJlYWQpIHsKK0lOVDMyIEdldFRocmVhZFByaW9yaXR5KEhBTkRMRTMyIGh0aHJlYWQpCit7CiAgICAgVEhEQiAqdGhyZWFkOwogICAgIElOVDMyIHJldDsKICAgICAKLSAgICByZXQgPSAwOwotICAgIHRocmVhZCA9IChUSERCKilQUk9DRVNTX0dldE9ialB0cihodGhyZWFkLEszMk9CSl9USFJFQUQpOwotICAgIGlmICh0aHJlYWQpIHsKLSAgICAJcmV0ID0gdGhyZWFkLT5kZWx0YV9wcmlvcml0eTsKLQlLMzJPQkpfRGVjQ291bnQoKEszMk9CSiopdGhyZWFkKTsKLSAgICB9CisgICAgaWYgKCEodGhyZWFkID0gVEhSRUFEX0dldFB0ciggaHRocmVhZCApKSkgcmV0dXJuIDA7CisgICAgcmV0ID0gdGhyZWFkLT5kZWx0YV9wcmlvcml0eTsKKyAgICBLMzJPQkpfRGVjQ291bnQoICZ0aHJlYWQtPmhlYWRlciApOwogICAgIHJldHVybiByZXQ7CiB9CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBTZXRUaHJlYWRQcmlvcml0eSAgIChLRVJORUwzMi41MTQpCiAgKi8KLUJPT0wzMgotU2V0VGhyZWFkUHJpb3JpdHkoSEFORExFMzIgaHRocmVhZCxJTlQzMiBwcmlvcml0eSkgeworQk9PTDMyIFNldFRocmVhZFByaW9yaXR5KEhBTkRMRTMyIGh0aHJlYWQsSU5UMzIgcHJpb3JpdHkpCit7CiAgICAgVEhEQiAqdGhyZWFkOwogICAgIAotICAgIHRocmVhZCA9IChUSERCKilQUk9DRVNTX0dldE9ialB0cihodGhyZWFkLEszMk9CSl9USFJFQUQpOwotICAgIGlmICh0aHJlYWQpIHsKLQl0aHJlYWQtPmRlbHRhX3ByaW9yaXR5ID0gcHJpb3JpdHk7Ci0JSzMyT0JKX0RlY0NvdW50KChLMzJPQkoqKXRocmVhZCk7Ci0gICAgfQorICAgIGlmICghKHRocmVhZCA9IFRIUkVBRF9HZXRQdHIoIGh0aHJlYWQgKSkpIHJldHVybiBGQUxTRTsKKyAgICB0aHJlYWQtPmRlbHRhX3ByaW9yaXR5ID0gcHJpb3JpdHk7CisgICAgSzMyT0JKX0RlY0NvdW50KCAmdGhyZWFkLT5oZWFkZXIgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2J1aWxkLmMgYi90b29scy9idWlsZC5jCmluZGV4IDg2NmFhZjAuLmU4OGUyNGUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2J1aWxkLmMKKysrIGIvdG9vbHMvYnVpbGQuYwpAQCAtMjYsNiArMjYsMTIgQEAKICMgZGVmaW5lIFBSRUZJWAogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX3N2cjRfXykKKyMgZGVmaW5lIFVTRV9TVEFCUworI2Vsc2UKKyMgdW5kZWYgVVNFX1NUQUJTCisjZW5kaWYKKwogdHlwZWRlZiBlbnVtCiB7CiAgICAgVFlQRV9JTlZBTElELApAQCAtOTgwLDcgKzk4Niw3IEBACiAKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiLyogRmlsZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseTsgZG8gbm90IGVkaXQhICovXG4iICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmZpbGVcdFwiJXNcIlxuIiwgc3BlY2ZpbGUgKTsKLSNpZmRlZiBfX0dOVUNfXworI2lmZGVmIFVTRV9TVEFCUwogICAgIGdldGN3ZChidWZmZXIsIHNpemVvZihidWZmZXIpKTsKIAogICAgIC8qCkBAIC0xMDA4LDE0ICsxMDE0LDE0IEBACiAgICAgICAgIGNhc2UgVFlQRV9TVFVCOgogICAgICAgICBjYXNlIFRZUEVfUkVHSVNURVI6CiAgICAgICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiLyogJXMuJWQgKCVzKSAqL1xuIiwgRExMTmFtZSwgaSwgb2RwLT5uYW1lKTsKLSNpZmRlZiBfX0dOVUNfXworI2lmZGVmIFVTRV9TVEFCUwogCSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiLnN0YWJzIFwiJXNfJWQ6RjFcIiwzNiwwLCVkLCVzXyVkXG4iLCAKIAkJICAgICBETExOYW1lLCBpLAogCQkgICAgIG9kcC0+bGluZW5vLCBETExOYW1lLCBpKTsKICNlbmRpZgogCiAgICAgICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiJXNfJWQ6XG4iLCBETExOYW1lLCBpICk7Ci0jaWZkZWYgX19HTlVDX18KKyNpZmRlZiBVU0VfU1RBQlMKIAkgICAgZnByaW50Ziggb3V0ZmlsZSwgIi5zdGFibiA2OCwwLCVkLDBcbiIsIG9kcC0+bGluZW5vKTsKICNlbmRpZgogCkBAIC0xMTM4LDcgKzExNDQsNyBAQAogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5sb25nIENvZGVfU3RhcnRcbiIgKTsgICAgICAgLyogQ29kZSBzdGFydCAqLwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5sb25nIEZ1bmN0aW9uc1xuIiApOyAgICAgICAgLyogRnVuY3Rpb25zICovCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmxvbmcgRnVuY05hbWVzXG4iICk7ICAgICAgICAvKiBGdW5jdGlvbiBuYW1lcyAqLwotI2lmZGVmIF9fR05VQ19fCisjaWZkZWYgVVNFX1NUQUJTCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LnRleHRcbiIpOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5zdGFicyBcIlwiLDEwMCwwLDAsLkxldGV4dFxuIik7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIi5MZXRleHQ6XG4iKTsKQEAgLTEzMjQsNyArMTMzMCw3IEBACiAgICAgLyogRnVuY3Rpb24gaGVhZGVyICovCiAKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXG5cdC5hbGlnbiA0XG4iICk7Ci0jaWZkZWYgX19HTlVDX18KKyNpZmRlZiBVU0VfU1RBQlMKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiLnN0YWJzIFwiQ2FsbFRvMzJfTGFyZ2VTdGFjazpGMVwiLDM2LDAsMCwiIFBSRUZJWCAiQ2FsbFRvMzJfTGFyZ2VTdGFja1xuIik7CiAjZW5kaWYKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuZ2xvYmwgIiBQUkVGSVggIkNhbGxUbzMyX0xhcmdlU3RhY2tcbiIgKTsKQEAgLTE2MDMsNyArMTYwOSw3IEBACiAgICAgLyogRnVuY3Rpb24gaGVhZGVyICovCiAKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXG5cdC5hbGlnbiA0XG4iICk7Ci0jaWZkZWYgX19HTlVDX18KKyNpZmRlZiBVU0VfU1RBQlMKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiLnN0YWJzIFwiQ2FsbEZyb20xNl8lczpGMVwiLDM2LDAsMCwiIFBSRUZJWCAiQ2FsbEZyb20xNl8lc1xuIiwgCiAJICAgICBwcm9maWxlLCBwcm9maWxlKTsKICNlbmRpZgpAQCAtMTgyMiw3ICsxODI4LDcgQEAKICAgICAvKiBGdW5jdGlvbiBoZWFkZXIgKi8KIAogICAgIGZwcmludGYoIG91dGZpbGUsICJcblx0LmFsaWduIDRcbiIgKTsKLSNpZmRlZiBfX0dOVUNfXworI2lmZGVmIFVTRV9TVEFCUwogICAgIGZwcmludGYoIG91dGZpbGUsICIuc3RhYnMgXCJDYWxsVG8xNl8lczpGMVwiLDM2LDAsMCwiIFBSRUZJWCAiQ2FsbFRvMTZfJXNcbiIsIAogCSAgICAgcHJvZmlsZSwgcHJvZmlsZSk7CiAjZW5kaWYKQEAgLTIwNjcsNyArMjA3Myw4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICBSZXN0b3JlQ29udGV4dDMyCiAgKgotICogUmVzdG9yZSB0aGUgcmVnaXN0ZXJzIGZyb20gdGhlIGNvbnRleHQgc3RydWN0dXJlCisgKiBSZXN0b3JlIHRoZSByZWdpc3RlcnMgZnJvbSB0aGUgY29udGV4dCBzdHJ1Y3R1cmUuCisgKiBBbGwgcmVnaXN0ZXJzIGV4Y2VwdCAlY3MgYW5kICVzcyBhcmUgcmVzdG9yZWQuCiAgKi8KIHN0YXRpYyB2b2lkIFJlc3RvcmVDb250ZXh0MzIoIEZJTEUgKm91dGZpbGUgKQogewpAQCAtMjA3NiwxNSArMjA4MywyMyBAQAogICAgIGZwcmludGYoIG91dGZpbGUsICJcdGxlYWwgJWQoJSVlYnApLCUlZXNwXG4iLCAtc2l6ZW9mKENPTlRFWFQpLTggKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRmcnN0b3IgJWQoJSVlc3ApXG4iLCBDT05URVhUT0ZGU0VUKEZsb2F0U2F2ZSkgKTsKIAotICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJWQoJSVlc3ApLCUlZWF4XG4iLCBDT05URVhUT0ZGU0VUKEVpcCkgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICUlZWF4LDQoJSVlYnApXG4iICk7IC8qICVlaXAgYXQgdGltZSBvZiBjYWxsICovCi0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlZCglJWVzcCksJSVlYXhcbiIsIENPTlRFWFRPRkZTRVQoRWJwKSApOwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJSVlYXgsMCglJWVicClcbiIgKTsgLyogJWVicCBhdCB0aW1lIG9mIGNhbGwgKi8KLQogICAgIC8qIFN0b3JlIGZsYWdzIG92ZXIgdGhlIHJlbGF5IGFkZHIgKi8KICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICVkKCUlZXNwKSwlJWVheFxuIiwgQ09OVEVYVE9GRlNFVChFRmxhZ3MpICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlJWVheCwlZCglJWVzcClcbiIsIHNpemVvZihDT05URVhUKSApOwogCisgICAgLyogR2V0IHRoZSBuZXcgc3RhY2sgYWRkciAqLworICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJWQoJSVlc3ApLCUlZWJ4XG4iLCBDT05URVhUT0ZGU0VUKEVzcCkgKTsKKworICAgIC8qIFNldCBlaXAgYW5kIGVicCB2YWx1ZSBvbnRvIHRoZSBuZXcgc3RhY2sgKi8KKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICVkKCUlZXNwKSwlJWVheFxuIiwgQ09OVEVYVE9GRlNFVChFaXApICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlJWVheCwtNCglJWVieClcbiIgKTsgLyogJWVpcCBhdCB0aW1lIG9mIGNhbGwgKi8KKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICVkKCUlZXNwKSwlJWVheFxuIiwgQ09OVEVYVE9GRlNFVChFYnApICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlJWVheCwtOCglJWVieClcbiIgKTsgLyogJWVicCBhdCB0aW1lIG9mIGNhbGwgKi8KKworICAgIC8qIFNldCBlYnAgdG8gcG9pbnQgdG8gdGhlIG5ldyBzdGFjayAqLworICAgIGZwcmludGYoIG91dGZpbGUsICJcdGxlYWwgLTgoJSVlYngpLCUlZWJwXG4iICk7CisKKyAgICAvKiBSZXN0b3JlIGFsbCByZWdpc3RlcnMgKi8KICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRhZGRsICQlZCwlJWVzcFxuIiwKICAgICAgICAgICAgICBzaXplb2YoRkxPQVRJTkdfU0FWRV9BUkVBKSArIDcgKiBzaXplb2YoRFdPUkQpICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cG9wbCAlJWVheFxuIiApOwpAQCAtMjE1Myw3ICsyMTY4LDcgQEAKICAgICAvKiBGdW5jdGlvbiBoZWFkZXIgKi8KIAogICAgIGZwcmludGYoIG91dGZpbGUsICJcblx0LmFsaWduIDRcbiIgKTsKLSNpZmRlZiBfX0dOVUNfXworI2lmZGVmIFVTRV9TVEFCUwogICAgIGZwcmludGYoIG91dGZpbGUsICIuc3RhYnMgXCJDYWxsRnJvbTMyXyVzOkYxXCIsMzYsMCwwLCIgUFJFRklYICJDYWxsRnJvbTMyXyVzXG4iLCAKIAkgICAgIHByb2ZpbGUsIHByb2ZpbGUpOwogI2VuZGlmCkBAIC0yMTgyLDExICsyMTk3LDE3IEBACiAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2hsICUlZWF4XG4iICk7CiAgICAgfQogCisgICAgLyogU2V0ICVlcyA9ICVkcyAqLworCisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92dyAlJWRzLCUlYXhcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3Z3ICUlYXgsJSVlc1xuIiApOworCiAgICAgLyogUHJpbnQgdGhlIGRlYnVnZ2luZyBpbmZvICovCiAKICAgICBpZiAoZGVidWdnaW5nKQogICAgIHsKLSAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGwgJCVkXG4iLCByZWdfZnVuYyA/IC0xIDogYXJncyk7IC8qIE5iIGFyZ3MgKi8KKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGwgJCVkXG4iLCAgLyogTmIgYXJncyAqLworICAgICAgICAgICAgICAgICByZWdfZnVuYyA/IGFyZ3MgfCAweDgwMDAwMDAwIDogYXJncyk7CiAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2hsICUlZWJwXG4iICk7CiAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdGNhbGwgIiBQUkVGSVggIlJFTEFZX0RlYnVnQ2FsbEZyb20zMlxuIiApOwogICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRhZGQgJDgsICUlZXNwXG4iICk7CkBAIC0yMTk0LDggKzIyMTUsNiBAQAogCiAgICAgLyogQ2FsbCB0aGUgZnVuY3Rpb24gKi8KIAotICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2h3ICUlZHNcbiIgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwb3B3ICUlZXNcbiIgKTsgIC8qIFNldCAlZXMgPSAlZHMgKi8KICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRjYWxsIC00KCUlZWJwKVxuIiApOwogCiAgICAgLyogUHJpbnQgdGhlIGRlYnVnZ2luZyBpbmZvICovCkBAIC0yMjAzLDcgKzIyMjIsOCBAQAogICAgIGlmIChkZWJ1Z2dpbmcpCiAgICAgewogICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAlJWVheFxuIiApOwotICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAkJWRcbiIsIHJlZ19mdW5jID8gLTEgOiBhcmdzKTsgLyogTmIgYXJncyAqLworICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAkJWRcbiIsICAvKiBOYiBhcmdzICovCisgICAgICAgICAgICAgICAgIHJlZ19mdW5jID8gYXJncyB8IDB4ODAwMDAwMDAgOiBhcmdzKTsKICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGwgJSVlYnBcbiIgKTsKICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0Y2FsbCAiIFBSRUZJWCAiUkVMQVlfRGVidWdDYWxsRnJvbTMyUmV0XG4iICk7CiAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdHBvcGwgJSVlYXhcbiIgKTsKQEAgLTIyNDQsNyArMjI2NCw3IEBACiAgICAgLyogRnVuY3Rpb24gaGVhZGVyICovCiAKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXG5cdC5hbGlnbiA0XG4iICk7Ci0jaWZkZWYgX19HTlVDX18KKyNpZmRlZiBVU0VfU1RBQlMKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiLnN0YWJzIFwiQ2FsbFRvMzJfJWQ6RjFcIiwzNiwwLDAsIiBQUkVGSVggIkNhbGxUbzMyXyVkXG4iLCAKIAkgICAgIGFyZ3MsIGFyZ3MpOwogI2VuZGlmCkBAIC0yMzE2LDcgKzIzMzYsNyBAQAogICAgIGZwcmludGYoIG91dGZpbGUsICIvKiBGaWxlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LiBEbyBub3QgZWRpdCEgKi9cblxuIiApOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC50ZXh0XG4iICk7CiAKLSNpZmRlZiBfX0dOVUNfXworI2lmZGVmIFVTRV9TVEFCUwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5maWxlXHRcIiVzXCJcbiIsIG91dG5hbWUgKTsKICAgICBnZXRjd2QoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CiAKQEAgLTIzNTEsNyArMjM3MSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSNpZmRlZiBfX0dOVUNfXworI2lmZGVmIFVTRV9TVEFCUwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC50ZXh0XG4iKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuc3RhYnMgXCJcIiwxMDAsMCwwLC5MZXRleHRcbiIpOwogICAgIGZwcmludGYoIG91dGZpbGUsICIuTGV0ZXh0OlxuIik7CkBAIC0yMzc2LDcgKzIzOTYsNyBAQAogICAgIGZwcmludGYoIG91dGZpbGUsICIvKiBGaWxlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LiBEbyBub3QgZWRpdCEgKi9cblxuIiApOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC50ZXh0XG4iICk7CiAKLSNpZmRlZiBfX0dOVUNfXworI2lmZGVmIFVTRV9TVEFCUwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5maWxlXHRcIiVzXCJcbiIsIG91dG5hbWUgKTsKICAgICBnZXRjd2QoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CiAKQEAgLTI0MDUsNyArMjQyNSw3IEBACiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0Lmdsb2JsICIgUFJFRklYICJDQUxMVE8xNl9FbmRcbiIgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCBQUkVGSVggIkNBTExUTzE2X0VuZDpcbiIgKTsKIAotI2lmZGVmIF9fR05VQ19fCisjaWZkZWYgVVNFX1NUQUJTCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LnRleHRcbiIpOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5zdGFicyBcIlwiLDEwMCwwLDAsLkxldGV4dFxuIik7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIi5MZXRleHQ6XG4iKTsKQEAgLTI0MzAsNyArMjQ1MCw3IEBACiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIi8qIEZpbGUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuIERvIG5vdCBlZGl0ISAqL1xuXG4iICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LnRleHRcbiIgKTsKIAotI2lmZGVmIF9fR05VQ19fCisjaWZkZWYgVVNFX1NUQUJTCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmZpbGVcdFwiJXNcIlxuIiwgb3V0bmFtZSApOwogICAgIGdldGN3ZChidWZmZXIsIHNpemVvZihidWZmZXIpKTsKIApAQCAtMjQ0OSw3ICsyNDY5LDcgQEAKIAogICAgIGZvciAoaSA9IDI7IGkgPCBhcmdjOyBpKyspIEJ1aWxkQ2FsbEZyb20zMkZ1bmMoIG91dGZpbGUsIGFyZ3ZbaV0gKTsKIAotI2lmZGVmIF9fR05VQ19fCisjaWZkZWYgVVNFX1NUQUJTCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LnRleHRcbiIpOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5zdGFicyBcIlwiLDEwMCwwLDAsLkxldGV4dFxuIik7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIi5MZXRleHQ6XG4iKTsKQEAgLTI0ODEsNyArMjUwMSw3IEBACiAgICAgICogbmFtZXMgYXMgYW4gaW5kaWNhdGlvbiB0aGF0IHdlIHNob3VsZCBqdXN0IHN0ZXAgdGhyb3VnaCBpdCB0byB3aGF0ZXZlcgogICAgICAqIGlzIG9uIHRoZSBvdGhlciBzaWRlLgogICAgICAqLwotI2lmZGVmIF9fR05VQ19fCisjaWZkZWYgVVNFX1NUQUJTCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmZpbGVcdFwiJXNcIlxuIiwgb3V0bmFtZSApOwogICAgIGdldGN3ZChidWZmZXIsIHNpemVvZihidWZmZXIpKTsKIApAQCAtMjUwMCw3ICsyNTIwLDcgQEAKIAogICAgIGZvciAoaSA9IDI7IGkgPCBhcmdjOyBpKyspIEJ1aWxkQ2FsbFRvMzJGdW5jKCBvdXRmaWxlLCBhdG9pKGFyZ3ZbaV0pICk7CiAKLSNpZmRlZiBfX0dOVUNfXworI2lmZGVmIFVTRV9TVEFCUwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC50ZXh0XG4iKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuc3RhYnMgXCJcIiwxMDAsMCwwLC5MZXRleHRcbiIpOwogICAgIGZwcmludGYoIG91dGZpbGUsICIuTGV0ZXh0OlxuIik7CmRpZmYgLS1naXQgYS93aW4zMi9lcnJvci5jIGIvd2luMzIvZXJyb3IuYwppbmRleCA0NGU4NmY3Li5iMzJlY2E0IDEwMDY0NAotLS0gYS93aW4zMi9lcnJvci5jCisrKyBiL3dpbjMyL2Vycm9yLmMKQEAgLTEwOSwzICsxMDksMjAgQEAKIAogICAgIHJldHVybiByYzsKIH0KKworaW50IExhc3RFcnJvclRvRXJybm8oRFdPUkQgbGFzdGVycm9yKQoreworICAgIGludCByYyA9IDA7IC8qIG5vIGVycm9yICovCisgICAgaW50IGkgPSAwOworCisgICAgd2hpbGUoZXJybm9feGxhdF90YWJsZVtpXS5lcnJubyAhPSAtMSkKKyAgICB7CisgICAgICAgIGlmKGVycm5vX3hsYXRfdGFibGVbaV0ud2luMzJlcnIgPT0gbGFzdGVycm9yICkKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBlcnJub194bGF0X3RhYmxlW2ldLmVycm5vOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaSsrOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS93aW4zMi9leGNlcHQuYyBiL3dpbjMyL2V4Y2VwdC5jCmluZGV4IDUwMTg2ZWUuLjkwYTI4ZmIgMTAwNjQ0Ci0tLSBhL3dpbjMyL2V4Y2VwdC5jCisrKyBiL3dpbjMyL2V4Y2VwdC5jCkBAIC0zMCwzNSArMzAsMzEgQEAKICAqICAgaW5mb3JtYXRpb24gaW4gVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyLgogICoKICAqLwotI2lmbmRlZiBXSU5FTElCCiAKKyNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJ3aW5lcnJvci5oIgorI2luY2x1ZGUgImxkdC5oIgorI2luY2x1ZGUgInByb2Nlc3MuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAiZXhjZXB0LmgiCiAKLUxQVE9QX0xFVkVMX0VYQ0VQVElPTl9GSUxURVIgcFRvcEV4Y0hhbmRsZXIgPSBOVUxMOworI2RlZmluZSBURUJfRVhDRVBUSU9OX0ZSQU1FKHBjb250ZXh0KSBcCisgICAgKChQRVhDRVBUSU9OX0ZSQU1FKSgoVEVCICopR0VUX1NFTF9CQVNFKChwY29udGV4dCktPlNlZ0ZzKSktPmV4Y2VwdCkKIAotdm9pZCBFWENfSW5pdCh2b2lkKQotewotICAgIHBUb3BFeGNIYW5kbGVyID0gKExQVE9QX0xFVkVMX0VYQ0VQVElPTl9GSUxURVIpR2V0UHJvY0FkZHJlc3MzMigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRNb2R1bGVIYW5kbGUoIktFUk5FTDMyIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlciIgKTsKLX0KIAotLyoKLSAqICAgICAgIEVYQ19SdGxVbndpbmQKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgIFJ0bFVud2luZCAgKEtFUk5FTDMyLjQ0MykKICAqCiAgKiAgVGhpcyBmdW5jdGlvbiBpcyB1bmRvY3VtZW50ZWQuIFRoaXMgaXMgdGhlIGdlbmVyYWwgaWRlYSBvZiAKLSAqICBSdGxVbndpbmQsIHRob3VnaC4gTm90ZSB0aGF0IGVycm9yIGhhbmRsaW5nIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQKLSAqICAKKyAqICBSdGxVbndpbmQsIHRob3VnaC4gTm90ZSB0aGF0IGVycm9yIGhhbmRsaW5nIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCiAgKi8KLQotdm9pZCBFWENfUnRsVW53aW5kKFBFWENFUFRJT05fRlJBTUUgcEVuZEZyYW1lLExQVk9JRCB1bnVzZWRFaXAsIAotICAgICAgICAgICAgICAgICAgIFBFWENFUFRJT05fUkVDT1JEIHBSZWNvcmQsIERXT1JEIHJldHVybkVheCwKLSAgICAgICAgICAgICAgICAgICBQQ09OVEVYVCBwY29udGV4dCkKK3ZvaWQgUnRsVW53aW5kKCBQRVhDRVBUSU9OX0ZSQU1FIHBFbmRGcmFtZSwgTFBWT0lEIHVudXNlZEVpcCwgCisgICAgICAgICAgICAgICAgUEVYQ0VQVElPTl9SRUNPUkQgcFJlY29yZCwgRFdPUkQgcmV0dXJuRWF4LAorICAgICAgICAgICAgICAgIFBDT05URVhUIHBjb250ZXh0IC8qIFdpbmUgYWRkaXRpb25hbCBwYXJhbWV0ZXIgKi8gKQogeyAgIAogICAgRVhDRVBUSU9OX1JFQ09SRCByZWNvcmQ7CiAgICBEV09SRCAgICAgICAgICAgIGRpc3BhdGNoOwpAQCAtNjksMTIgKzY1LDEyIEBACiAgICAvKiBidWlsZCBhbiBleGNlcHRpb24gcmVjb3JkLCBpZiB3ZSBkbyBub3QgaGF2ZSBvbmUgKi8KICAgIGlmKCFwUmVjb3JkKQogICAgewotICAgICByZWNvcmQuRXhjZXB0aW9uQ29kZT0gICAweEMwMDAwMDI2OyAgLyogaW52YWxpZCBkaXNwb3NpdGlvbiAqLyAKLSAgICAgcmVjb3JkLkV4Y2VwdGlvbkZsYWdzPSAgMDsKLSAgICAgcmVjb3JkLkV4Y2VwdGlvblJlY29yZD0gTlVMTDsKLSAgICAgcmVjb3JkLkV4Y2VwdGlvbkFkZHJlc3M9KExQVk9JRCkgcGNvbnRleHQtPkVpcDsgCi0gICAgIHJlY29yZC5OdW1iZXJQYXJhbWV0ZXJzPSAwOwotICAgICBwUmVjb3JkPSZyZWNvcmQ7ICAgICAKKyAgICAgcmVjb3JkLkV4Y2VwdGlvbkNvZGUgICAgPSBTVEFUVVNfSU5WQUxJRF9ESVNQT1NJVElPTjsKKyAgICAgcmVjb3JkLkV4Y2VwdGlvbkZsYWdzICAgPSAwOworICAgICByZWNvcmQuRXhjZXB0aW9uUmVjb3JkICA9IE5VTEw7CisgICAgIHJlY29yZC5FeGNlcHRpb25BZGRyZXNzID0gKExQVk9JRClwY29udGV4dC0+RWlwOyAKKyAgICAgcmVjb3JkLk51bWJlclBhcmFtZXRlcnMgPSAwOworICAgICBwUmVjb3JkID0gJnJlY29yZDsKICAgIH0KIAogICAgaWYocEVuZEZyYW1lKQpAQCAtODMsMzkgKzc5LDM5IEBACiAgICAgIHBSZWNvcmQtPkV4Y2VwdGlvbkZsYWdzfD1FSF9VTldJTkRJTkcgfCBFSF9FWElUX1VOV0lORDsKICAgCiAgICAvKiBnZXQgY2hhaW4gb2YgZXhjZXB0aW9uIGZyYW1lcyAqLyAgICAgIAotICAgd2hpbGUoKFRlYkV4Y2VwdGlvbkZyYW1lIT1OVUxMKSYmCi0gICAgICAgICAoVGViRXhjZXB0aW9uRnJhbWUhPSgodm9pZCAqKS0xKSkgJiYKLSAgICAgICAgIChUZWJFeGNlcHRpb25GcmFtZSE9cEVuZEZyYW1lKSkKKyAgIHdoaWxlICgoVEVCX0VYQ0VQVElPTl9GUkFNRShwY29udGV4dCkgIT0gTlVMTCkgJiYKKyAgICAgICAgICAoVEVCX0VYQ0VQVElPTl9GUkFNRShwY29udGV4dCkgIT0gKCh2b2lkICopMHhmZmZmZmZmZikpICYmCisgICAgICAgICAgKFRFQl9FWENFUFRJT05fRlJBTUUocGNvbnRleHQpICE9IHBFbmRGcmFtZSkpCiAgICB7Ci0gICAgICAgZHByaW50Zl93aW4zMihzdGRkZWIsImNhbGxpbmcgZXhjZXB0aW9uIGhhbmRsZXIgYXQgMHgleFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBUZWJFeGNlcHRpb25GcmFtZS0+SGFuZGxlcik7CisgICAgICAgZHByaW50Zl93aW4zMiggc3RkZGViLCAiY2FsbGluZyBleGNlcHRpb24gaGFuZGxlciBhdCAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgIChpbnQpVEVCX0VYQ0VQVElPTl9GUkFNRShwY29udGV4dCktPkhhbmRsZXIgKTsKIAogICAgICAgIGRpc3BhdGNoPTA7ICAgICAgIAotICAgICAgIHJldHZhbD1UZWJFeGNlcHRpb25GcmFtZS0+SGFuZGxlcihwUmVjb3JkLCBUZWJFeGNlcHRpb25GcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNvbnRleHQsICZkaXNwYXRjaCk7CisgICAgICAgcmV0dmFsID0gVEVCX0VYQ0VQVElPTl9GUkFNRShwY29udGV4dCktPkhhbmRsZXIoIHBSZWNvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURUJfRVhDRVBUSU9OX0ZSQU1FKHBjb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjb250ZXh0LCAmZGlzcGF0Y2gpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICBkcHJpbnRmX3dpbjMyKHN0ZGRlYiwiZXhjZXB0aW9uIGhhbmRsZXIgcmV0dXJucyAweCV4LCBkaXNwYXRjaD0weCV4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsLCAoaW50KSBkaXNwYXRjaCk7CiAgIAotICAgICAgIGlmKHJldHZhbD09RXhjZXB0aW9uQ29sbGlkZWRVbndpbmQpCi0gICAgICAgICAgVGViRXhjZXB0aW9uRnJhbWU9KExQVk9JRCkgZGlzcGF0Y2g7Ci0gICAgICAgZWxzZSBpZihUZWJFeGNlcHRpb25GcmFtZSE9cEVuZEZyYW1lKQotICAgICAgICAgIFRlYkV4Y2VwdGlvbkZyYW1lPVRlYkV4Y2VwdGlvbkZyYW1lLT5QcmV2OworICAgICAgIGlmIChyZXR2YWwgPT0gRXhjZXB0aW9uQ29sbGlkZWRVbndpbmQpCisgICAgICAgICAgIFRFQl9FWENFUFRJT05fRlJBTUUocGNvbnRleHQpID0gKExQVk9JRClkaXNwYXRjaDsKKyAgICAgICBlbHNlIGlmIChURUJfRVhDRVBUSU9OX0ZSQU1FKHBjb250ZXh0KSAhPSBwRW5kRnJhbWUpCisgICAgICAgICAgIFRFQl9FWENFUFRJT05fRlJBTUUocGNvbnRleHQpID0gVEVCX0VYQ0VQVElPTl9GUkFNRShwY29udGV4dCktPlByZXY7CiAgICAgICAgZWxzZQogICAgICAgICAgIGJyZWFrOyAgCiAgICB9CiB9CiAKLS8qCi0gKiAgICBFWENfUmFpc2VFeGNlcHRpb24KLSAqCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgIFJhaXNlRXhjZXB0aW9uICAoS0VSTkVMMzIuNDE4KQogICovCi0gCi1WT0lEIEVYQ19SYWlzZUV4Y2VwdGlvbihEV09SRCBkd0V4Y2VwdGlvbkNvZGUsCit2b2lkIFJhaXNlRXhjZXB0aW9uKERXT1JEIGR3RXhjZXB0aW9uQ29kZSwKIAkJICAgIERXT1JEIGR3RXhjZXB0aW9uRmxhZ3MsCiAJCSAgICBEV09SRCBjQXJndW1lbnRzLAogCQkgICAgY29uc3QgTFBEV09SRCBscEFyZ3VtZW50cywKLQkJICAgIFBDT05URVhUIHBjb250ZXh0KQorCQkgICAgUENPTlRFWFQgcGNvbnRleHQgLyogV2luZSBhZGRpdGlvbmFsIHBhcmFtZXRlciAqLyApCiB7CiAgICAgUEVYQ0VQVElPTl9GUkFNRSAgICBwZnJhbWU7IAogICAgIEVYQ0VQVElPTl9SRUNPUkQgICAgcmVjb3JkOwpAQCAtMTMxLDEzICsxMjcsMTMgQEAKICAgICByZWNvcmQuTnVtYmVyUGFyYW1ldGVycyAgICA9IGNBcmd1bWVudHM7CiAgICAgcmVjb3JkLkV4Y2VwdGlvbkFkZHJlc3MgICAgPSAoTFBWT0lEKSBwY29udGV4dC0+RWlwOwogICAgIAotICAgIGZvcihpPTA7aTxjQXJndW1lbnRzO2krKykKLSAgICAgICByZWNvcmQuRXhjZXB0aW9uSW5mb3JtYXRpb25baV09bHBBcmd1bWVudHNbaV07CisgICAgaWYgKGxwQXJndW1lbnRzKSBmb3IoIGkgPSAwOyBpIDwgY0FyZ3VtZW50czsgaSsrKQorICAgICAgICByZWNvcmQuRXhjZXB0aW9uSW5mb3JtYXRpb25baV0gPSBscEFyZ3VtZW50c1tpXTsKICAgICAKICAgICAvKiBnZXQgY2hhaW4gb2YgZXhjZXB0aW9uIGZyYW1lcyAqLyAgICAKICAgICAKLSAgICByZXR2YWw9RXhjZXB0aW9uQ29udGludWVTZWFyY2g7ICAgIAotICAgIHBmcmFtZT1UZWJFeGNlcHRpb25GcmFtZTsKKyAgICByZXR2YWwgPSBFeGNlcHRpb25Db250aW51ZVNlYXJjaDsgICAgCisgICAgcGZyYW1lID0gVEVCX0VYQ0VQVElPTl9GUkFNRSggcGNvbnRleHQgKTsKICAgICAKICAgICB3aGlsZSgocGZyYW1lIT1OVUxMKSYmKHBmcmFtZSE9KCh2b2lkICopMHhGRkZGRkZGRikpKQogICAgIHsKQEAgLTE1NCw2MiArMTUwLDQ3IEBACiAgICAgICAgcGZyYW1lPXBmcmFtZS0+UHJldjsKICAgIH0KIAotICAgaWYocmV0dmFsIT1FeGNlcHRpb25Db250aW51ZUV4ZWN1dGlvbikKKyAgIGlmIChyZXR2YWwhPUV4Y2VwdGlvbkNvbnRpbnVlRXhlY3V0aW9uKQogICAgeyAgICAKLSAgICAgIHJldHZhbD1FWENfQ2FsbFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcigmcmVjb3JkLHBjb250ZXh0KTsKLSAgICAgIGlmKHJldHZhbCE9RVhDRVBUSU9OX0NPTlRJTlVFX0VYRUNVVElPTikKLSAgICAgIHsKLSAgICAgICAgIGRwcmludGZfd2luMzIoc3RkZGViLCJubyBoYW5kbGVyIHdhbnRlZCB0byBoYW5kbGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBleGNlcHRpb24sIGV4aXRpbmdcbiIgICAgICk7Ci0gICAgICAgICBFeGl0UHJvY2Vzcyhkd0V4Y2VwdGlvbkNvZGUpOyAvKiB3aGF0IHN0YXR1cyBzaG91bGQgYmUgdXNlZCBoZXJlID8gKi8gICAgICAgICAKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgCi0gICB9IAorICAgICAgIC8qIEZJWE1FOiB3aGF0IHNob3VsZCB3ZSBkbyBoZXJlPyAqLworICAgICAgIGRwcmludGZfd2luMzIoc3RkZGViLCJubyBoYW5kbGVyIHdhbnRlZCB0byBoYW5kbGUgdGhlIGV4Y2VwdGlvbiwgZXhpdGluZ1xuIik7CisgICAgICAgRXhpdFByb2Nlc3MoZHdFeGNlcHRpb25Db2RlKTsgLyogd2hhdCBzdGF0dXMgc2hvdWxkIGJlIHVzZWQgaGVyZSA/ICovCisgICB9CiB9CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyIChLRVJORUwzMi41MzcpCi0gKiAKLSAqICBUaGlzIGlzIHRoZSB1bmhhbmRsZWQgZXhjZXB0aW9uIGNvZGUuIAotICogIEFjdHVhbGx5LCB0aGlzIHNob3VsZCBzaG93IHVwIGEgZGlhbG9nIGJveCwgd2l0aCBhbGwga2luZHMgb2YKLSAqICBmYW5jeSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uIEl0IGRvZXMgbm90aGluZyBub3chCisgKiAgICAgICAgIFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlciAgIChLRVJORUwzMi41MzcpCiAgKi8KLSAKIERXT1JEIFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcihQRVhDRVBUSU9OX1BPSU5URVJTIGVwb2ludGVycykKIHsKLSAgIFBFWENFUFRJT05fUkVDT1JEIHBSZWNvcmQ7Ci0gICBQQ09OVEVYVCAgICAgICAgICBwQ29udGV4dDsKLSAgIAotICAgcFJlY29yZD1lcG9pbnRlcnMtPkV4Y2VwdGlvblJlY29yZDsKLSAgIHBDb250ZXh0PWVwb2ludGVycy0+Q29udGV4dFJlY29yZDsKLSAgIAotICAgaWYocFJlY29yZC0+RXhjZXB0aW9uRmxhZ3MgJiAoRUhfVU5XSU5ESU5HIHwgRUhfRVhJVF9VTldJTkQpICkKLSAgIHsKLSAgICAgIGRwcmludGZfd2luMzIoc3RkZGViLCJVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXI6IGV4aXRpbmdcbiIpOwotICAgICAgRXhpdFByb2Nlc3MocFJlY29yZC0+RXhjZXB0aW9uQ29kZSk7ICAgICAgICAgICAgCi0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgICBSdGxVbndpbmQoMCxwUmVjb3JkLDAsLTEgKTsKLSAgIH0KLSAgIAotICAgLyogCi0gICAgKiBUaGlzIGlzIGp1c3QgdG8gYXZvaWQgYSB3YXJuaW5nLCBjb2RlIHNob3VsZCBub3QgZ2V0IGhlcmUgCi0gICAgKiBpZiBpdCBkb2VzLCBFWENfUmFpc2VFeGNlcHRpb24gd2lsbCB0ZXJtaW5hdGUgaXQuIAotICAgICovCi0gICByZXR1cm4gRVhDRVBUSU9OX0NPTlRJTlVFX1NFQVJDSDsKKyAgICBjaGFyIG1lc3NhZ2VbODBdOworCisgICAgLyogRklYTUU6IFNob3VsZCBjaGVjayBpZiB0aGUgcHJvY2VzcyBpcyBiZWluZyBkZWJ1Z2dlZCAqLworCisgICAgaWYgKHBDdXJyZW50UHJvY2VzcyAmJiBwQ3VycmVudFByb2Nlc3MtPnRvcF9maWx0ZXIpCisgICAgeworICAgICAgICBEV09SRCByZXQgPSBwQ3VycmVudFByb2Nlc3MtPnRvcF9maWx0ZXIoIGVwb2ludGVycyApOworICAgICAgICBpZiAocmV0ICE9IEVYQ0VQVElPTl9DT05USU5VRV9TRUFSQ0gpIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyogRklYTUU6IFNob3VsZCBjaGVjayB0aGUgY3VycmVudCBlcnJvciBtb2RlICovCisKKyAgICBzcHJpbnRmKCBtZXNzYWdlLCAiVW5oYW5kbGVkIGV4Y2VwdGlvbiAweCUwOGx4IGF0IGFkZHJlc3MgMHglMDhseC4iLAorICAgICAgICAgICAgIGVwb2ludGVycy0+RXhjZXB0aW9uUmVjb3JkLT5FeGNlcHRpb25Db2RlLAorICAgICAgICAgICAgIChEV09SRCllcG9pbnRlcnMtPkV4Y2VwdGlvblJlY29yZC0+RXhjZXB0aW9uQWRkcmVzcyApOworICAgIE1lc3NhZ2VCb3gzMkEoIDAsIG1lc3NhZ2UsICJFcnJvciIsIE1CX09LIHwgTUJfSUNPTkhBTkQgKTsKKyAgICByZXR1cm4gRVhDRVBUSU9OX0VYRUNVVEVfSEFORExFUjsKIH0KIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyICAgIChLRVJORUwzMi41MTYpCi0gKiAgCi0gKgorICogICAgICAgICAgICBTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIgICAoS0VSTkVMMzIuNTE2KQogICovCi0gIAotTFBUT1BfTEVWRUxfRVhDRVBUSU9OX0ZJTFRFUiAKLSAgICAgICAgU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyKExQVE9QX0xFVkVMX0VYQ0VQVElPTl9GSUxURVIgZWZpbHRlcikKLXsgIAotICAgcFRvcEV4Y0hhbmRsZXI9ZWZpbHRlcjsKLSAgIHJldHVybiBlZmlsdGVyOworTFBUT1BfTEVWRUxfRVhDRVBUSU9OX0ZJTFRFUiBTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFRPUF9MRVZFTF9FWENFUFRJT05fRklMVEVSIGZpbHRlciApCit7CisgICAgTFBUT1BfTEVWRUxfRVhDRVBUSU9OX0ZJTFRFUiBvbGQgPSBwQ3VycmVudFByb2Nlc3MtPnRvcF9maWx0ZXI7CisgICAgcEN1cnJlbnRQcm9jZXNzLT50b3BfZmlsdGVyID0gZmlsdGVyOworICAgIHJldHVybiBvbGQ7CiB9Ci0KLSNlbmRpZiAgLyogV0lORUxJQiAqLwpkaWZmIC0tZ2l0IGEvd2luMzIvaW5pdC5jIGIvd2luMzIvaW5pdC5jCmluZGV4IDc1MDlkYTkuLjE4ZTE0ZWYgMTAwNjQ0Ci0tLSBhL3dpbjMyL2luaXQuYworKysgYi93aW4zMi9pbml0LmMKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAid2luZXJyb3IuaCIKICNpbmNsdWRlICJoYW5kbGUzMi5oIgpAQCAtODUsNTYgKzg2LDYgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgR2V0U3RhcnR1cEluZm9BICAgICAgICAgKEtFUk5FTDMyLjI4NCkKLSAqIEZJWE1FOiBwZXJoYXBzIHN1cHBseSBiZXR0ZXIgdmFsdWVzLiAKLSAqICAgICAgICBhZGQgb3RoZXIgYXJjaGl0ZWN0dXJlcyBmb3IgV0lORUxJQi4KLSAqLwotVk9JRAotR2V0U3lzdGVtSW5mbyhMUFNZU1RFTV9JTkZPIHNpKSB7Ci0gICAgV09SRCBjcHU7Ci0gICAgCi0gICAgc2ktPnUueC53UHJvY2Vzc29yQXJjaGl0ZWN0dXJlCT0gUFJPQ0VTU09SX0FSQ0hJVEVDVFVSRV9JTlRFTDsKLQotICAgIHNpLT5kd1BhZ2VTaXplCQkJPSA0MDk2OyAvKiA0SyAqLwotICAgIHNpLT5scE1pbmltdW1BcHBsaWNhdGlvbkFkZHJlc3MJPSAodm9pZCAqKTB4NDAwMDAwMDA7Ci0gICAgc2ktPmxwTWF4aW11bUFwcGxpY2F0aW9uQWRkcmVzcwk9ICh2b2lkICopMHg4MDAwMDAwMDsKLSAgICBzaS0+ZHdBY3RpdmVQcm9jZXNzb3JNYXNrCQk9IDE7Ci0gICAgc2ktPmR3TnVtYmVyT2ZQcm9jZXNzb3JzCQk9IDE7Ci0jaWZkZWYgV0lORUxJQgotICAgIC8qIEZJWE1FOiBwZXJoYXBzIGNoZWNrIGNvbXBpbGF0aW9uIGRlZmluZXMgLi4uICovCi0gICAgc2ktPmR3UHJvY2Vzc29yVHlwZQkJCT0gUFJPQ0VTU09SX0lOVEVMXzM4NjsKLSAgICBjcHUgPSAzOwotI2Vsc2UKLSAgICBjcHUgPSBydW50aW1lX2NwdSgpOwotICAgIHN3aXRjaCAoY3B1KSB7Ci0gICAgY2FzZSA0OiBzaS0+ZHdQcm9jZXNzb3JUeXBlCQk9IFBST0NFU1NPUl9JTlRFTF80ODY7Ci0JICAgIGJyZWFrOwotICAgIGNhc2UgNTogc2ktPmR3UHJvY2Vzc29yVHlwZQkJPSBQUk9DRVNTT1JfSU5URUxfUEVOVElVTTsKLQkgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgIGRlZmF1bHQ6IHNpLT5kd1Byb2Nlc3NvclR5cGUJPSBQUk9DRVNTT1JfSU5URUxfMzg2OwotCSAgICBicmVhazsKLSAgICB9Ci0jZW5kaWYKLSAgICBzaS0+ZHdBbGxvY2F0aW9uR3JhbnVsYXJpdHkJCT0gODsgLyogaG1tPyAqLwotICAgIHNpLT53UHJvY2Vzc29yTGV2ZWwJCQk9IGNwdTsKLSAgICBzaS0+d1Byb2Nlc3NvclJldmlzaW9uCQk9IDA7IC8qIEZJWE1FLCBzZWUgU0RLICovCi19Ci0KLS8qIEluaXRpYWxpemUgd2hhdGV2ZXIgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIHdlIG5lZWQuCi0gKgotICogUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgb24gZmFpbHVyZS4KLSAqLwotaW50IEtFUk4zMl9Jbml0KHZvaWQpCi17Ci0jaWZuZGVmIFdJTkVMSUIKLSAgICAvKiBJbml0aWFsaXplIGV4Y2VwdGlvbiBoYW5kbGluZyAqLwotICAgIEVYQ19Jbml0KCk7Ci0jZW5kaWYKLSAgICByZXR1cm4gMTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgR2V0Q29tcHV0ZXJOYW1lQSAgICAgICAgIChLRVJORUwzMi4xNjUpCiAgKi8KIEJPT0wzMgpkaWZmIC0tZ2l0IGEvd2luMzIvbmV3Zm5zLmMgYi93aW4zMi9uZXdmbnMuYwppbmRleCA0YmVhMjQ3Li4xYmM5YTk4IDEwMDY0NAotLS0gYS93aW4zMi9uZXdmbnMuYworKysgYi93aW4zMi9uZXdmbnMuYwpAQCAtMjQsMTIgKzI0LDYgQEAKIAlyZXR1cm4gVFJVRTsKIH0KIAotRFdPUkQKLUdldFdpbmRvd1RocmVhZFByb2Nlc3NJZChIV05EMzIgaHduZCxMUERXT1JEIHByb2Nlc3NpZCkgewotCWZwcmludGYoc3RkbmltcCwiR2V0V2luZG93VGhyZWFkUHJvY2Vzc0lkKCUwNHgsJXApLHN0dWJcbiIsaHduZCxwcm9jZXNzaWQpOwotCXJldHVybiAwOwotfQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCURpc2FibGVUaHJlYWRMaWJyYXJ5Q2FsbHMgKEtFUk5FTDMyLjc0KQogICovCmRpZmYgLS1naXQgYS93aW4zMi9wcm9jZXNzLmMgYi93aW4zMi9wcm9jZXNzLmMKaW5kZXggYTg1MzRmZi4uZTQwM2NkZSAxMDA2NDQKLS0tIGEvd2luMzIvcHJvY2Vzcy5jCisrKyBiL3dpbjMyL3Byb2Nlc3MuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgIndpbmVycm9yLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgImhhbmRsZTMyLmgiCisjaW5jbHVkZSAicGVfaW1hZ2UuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKZGlmZiAtLWdpdCBhL3dpbmRvd3MvY2FyZXQuYyBiL3dpbmRvd3MvY2FyZXQuYwppbmRleCBkYTQ5ZWU0Li4yNDE5ZDk2IDEwMDY0NAotLS0gYS93aW5kb3dzL2NhcmV0LmMKKysrIGIvd2luZG93cy9jYXJldC5jCkBAIC0xNzIsOSArMTcyLDkgQEAKICAgICBkcHJpbnRmX2NhcmV0KHN0ZGRlYiwiRGVzdHJveUNhcmV0OiBod25kPSUwNHgsIHRpbWVyaWQ9JWRcbiIsCiAJCUNhcmV0Lmh3bmQsIENhcmV0LnRpbWVyaWQpOwogCi0gICAgRGVsZXRlT2JqZWN0MzIoIENhcmV0LmhCcnVzaCApOwogICAgIENBUkVUX0tpbGxUaW1lcigpOwogICAgIENBUkVUX0Rpc3BsYXlDYXJldChDQVJFVF9PRkYpOworICAgIERlbGV0ZU9iamVjdDMyKCBDYXJldC5oQnJ1c2ggKTsKICAgICBDYXJldC5od25kID0gMDsKICAgICByZXR1cm4gVFJVRTsKIH0KZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGVmd25kLmMgYi93aW5kb3dzL2RlZnduZC5jCmluZGV4IGMzOTNlYjcuLmQ0MDg0MzIgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGVmd25kLmMKKysrIGIvd2luZG93cy9kZWZ3bmQuYwpAQCAtMjYwLDcgKzI2MCw3IEBACiAJZWxzZSBpZiggd1BhcmFtID09IFZLX0YxMCApCiAJICAgICAgICAgaUYxMEtleSA9IDE7CiAJICAgICBlbHNlCi0JICAgICAgICAgaWYoIHdQYXJhbSA9PSBWS19FU0NBUEUgJiYgR2V0S2V5U3RhdGUoVktfU0hJRlQpIDwgMCApCisJICAgICAgICAgaWYoIHdQYXJhbSA9PSBWS19FU0NBUEUgJiYgKEdldEtleVN0YXRlMzIoVktfU0hJRlQpICYgMHg4MDAwKSkKIAkJICAgICBTZW5kTWVzc2FnZTE2KCB3bmRQdHItPmh3bmRTZWxmLCBXTV9TWVNDT01NQU5ELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdQQVJBTTE2KVNDX0tFWU1FTlUsIChMUEFSQU0pVktfU1BBQ0UpOwogCWJyZWFrOwpkaWZmIC0tZ2l0IGEvd2luZG93cy9kaWFsb2cuYyBiL3dpbmRvd3MvZGlhbG9nLmMKaW5kZXggNWZiZDRlZS4uN2JlMDdmZSAxMDA2NDQKLS0tIGEvd2luZG93cy9kaWFsb2cuYworKysgYi93aW5kb3dzL2RpYWxvZy5jCkBAIC01LDEwICs1LDEyIEBACiAgKi8KIAogI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxsaW1pdHMuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImRpYWxvZy5oIgogI2luY2x1ZGUgImRyaXZlLmgiCkBAIC05MDQsNyArOTA2LDcgQEAKICAgICAgICAgICAgIGlmICghKGRsZ0NvZGUgJiBETEdDX1dBTlRUQUIpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIFNlbmRNZXNzYWdlMTYoIGh3bmREbGcsIFdNX05FWFRETEdDVEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHZXRLZXlTdGF0ZShWS19TSElGVCkgJiAweDgwMDApLCAwICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHZXRLZXlTdGF0ZTMyKFZLX1NISUZUKSAmIDB4ODAwMCksIDAgKTsKICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvd2luZG93cy9ob29rLmMgYi93aW5kb3dzL2hvb2suYwppbmRleCBlN2EwNzNkLi4xYTliNzkzIDEwMDY0NAotLS0gYS93aW5kb3dzL2hvb2suYworKysgYi93aW5kb3dzL2hvb2suYwpAQCAtOTkwLDcgKzk5MCw3IEBACiAgICAgSE9PS0RBVEEgKmRhdGE7CiAgICAgaWYgKEhJV09SRChoaG9vaykgIT0gSE9PS19NQUdJQykgcmV0dXJuIE5VTEw7CiAgICAgaWYgKCEoZGF0YSA9IChIT09LREFUQSAqKVVTRVJfSEVBUF9MSU5fQUREUiggTE9XT1JEKGhob29rKSApKSkgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKGRhdGEtPmZsYWdzICYgSE9PS19XSU4zMikgcmV0dXJuIE5VTEw7CisgICAgaWYgKChkYXRhLT5mbGFncyAmIEhPT0tfTUFQVFlQRSkgIT0gSE9PS19XSU4xNikgcmV0dXJuIE5VTEw7CiAgICAgcmV0dXJuIChIT09LUFJPQzE2KWRhdGEtPnByb2M7CiB9CiAKQEAgLTEwMzMsNyArMTAzMyw3IEBACiAKICAgICBpZiAoIShob29rID0gSE9PS19HZXRIb29rKCBpZCAsIEdldFRhc2tRdWV1ZSgwKSApKSkgcmV0dXJuIDA7CiAgICAgaWYgKCEoaG9vayA9IEhPT0tfRmluZFZhbGlkSG9vayhob29rKSkpIHJldHVybiAwOwotICAgIHJldHVybiBIT09LX0NhbGxIb29rKCBob29rLCBIT09LX1dJTjMyLCBjb2RlLCB3UGFyYW0sIGxQYXJhbSApOworICAgIHJldHVybiBIT09LX0NhbGxIb29rKCBob29rLCBIT09LX1dJTjMyQSwgY29kZSwgd1BhcmFtLCBsUGFyYW0gKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMDQ4LDcgKzEwNDgsNyBAQAogCiAgICAgaWYgKCEoaG9vayA9IEhPT0tfR2V0SG9vayggaWQgLCBHZXRUYXNrUXVldWUoMCkgKSkpIHJldHVybiAwOwogICAgIGlmICghKGhvb2sgPSBIT09LX0ZpbmRWYWxpZEhvb2soaG9vaykpKSByZXR1cm4gMDsKLSAgICByZXR1cm4gSE9PS19DYWxsSG9vayggaG9vaywgSE9PS19XSU4zMiB8IEhPT0tfVU5JQ09ERSwgY29kZSwgd1BhcmFtLAorICAgIHJldHVybiBIT09LX0NhbGxIb29rKCBob29rLCBIT09LX1dJTjMyVywgY29kZSwgd1BhcmFtLAogCQkJICBsUGFyYW0gKTsKIH0KIApAQCAtMTE3Myw3ICsxMTczLDcgQEAKICAgICAvKiBXSF9NU0dGSUxURVIgaXMgdGhlIG9ubHkgdGFzay1zcGVjaWZpYyBob29rIGZvciBTZXRXaW5kb3dzSG9vaygpICovCiAgICAgSFRBU0sxNiBoVGFzayA9IChpZCA9PSBXSF9NU0dGSUxURVIpID8gR2V0Q3VycmVudFRhc2soKSA6IDA7CiAKLSAgICBIQU5ETEUxNiBoYW5kbGUgPSBIT09LX1NldEhvb2soIGlkLCBwcm9jLCBIT09LX1dJTjMyLCBoSW5zdCwgaFRhc2sgKTsKKyAgICBIQU5ETEUxNiBoYW5kbGUgPSBIT09LX1NldEhvb2soIGlkLCBwcm9jLCBIT09LX1dJTjMyQSwgaEluc3QsIGhUYXNrICk7CiAgICAgcmV0dXJuIChoYW5kbGUpID8gKEhIT09LKU1BS0VMT05HKCBoYW5kbGUsIEhPT0tfTUFHSUMgKSA6IDA7CiB9CiAKQEAgLTExOTAsOCArMTE5MCw3IEBACiAgICAgLyogV0hfTVNHRklMVEVSIGlzIHRoZSBvbmx5IHRhc2stc3BlY2lmaWMgaG9vayBmb3IgU2V0V2luZG93c0hvb2soKSAqLwogICAgIEhUQVNLMTYgaFRhc2sgPSAoaWQgPT0gV0hfTVNHRklMVEVSKSA/IEdldEN1cnJlbnRUYXNrKCkgOiAwOwogCi0gICAgSEFORExFMTYgaGFuZGxlID0gSE9PS19TZXRIb29rKCBpZCwgcHJvYywgSE9PS19XSU4zMiB8IEhPT0tfVU5JQ09ERSwKLQkJCQkgICAgaEluc3QsIGhUYXNrICk7CisgICAgSEFORExFMTYgaGFuZGxlID0gSE9PS19TZXRIb29rKCBpZCwgcHJvYywgSE9PS19XSU4zMlcsIGhJbnN0LCBoVGFzayApOwogICAgIHJldHVybiAoaGFuZGxlKSA/IChISE9PSylNQUtFTE9ORyggaGFuZGxlLCBIT09LX01BR0lDICkgOiAwOwogfQogCkBAIC0xMjIxLDcgKzEyMjAsNyBAQAogICAgIGVsc2UKICAgICAgIGhUYXNrID0gTE9XT1JEKGR3VGhyZWFkSUQpOwogCi0gICAgaGFuZGxlID0gSE9PS19TZXRIb29rKCBpZCwgcHJvYywgSE9PS19XSU4zMiwgaEluc3QsIGhUYXNrICk7CisgICAgaGFuZGxlID0gSE9PS19TZXRIb29rKCBpZCwgcHJvYywgSE9PS19XSU4zMkEsIGhJbnN0LCBoVGFzayApOwogICAgIHJldHVybiAoaGFuZGxlKSA/IChISE9PSylNQUtFTE9ORyggaGFuZGxlLCBIT09LX01BR0lDICkgOiAoSEhPT0spTlVMTDsKIH0KIApAQCAtMTI0MCw3ICsxMjM5LDcgQEAKICAgICBlbHNlCiAgICAgICBoVGFzayA9IExPV09SRChkd1RocmVhZElEKTsKIAotICAgIGhhbmRsZSA9IEhPT0tfU2V0SG9vayggaWQsIHByb2MsIEhPT0tfV0lOMzIgfCBIT09LX1VOSUNPREUsIGhJbnN0LCBoVGFzayApOworICAgIGhhbmRsZSA9IEhPT0tfU2V0SG9vayggaWQsIHByb2MsIEhPT0tfV0lOMzJXLCBoSW5zdCwgaFRhc2sgKTsKICAgICByZXR1cm4gKGhhbmRsZSkgPyAoSEhPT0spTUFLRUxPTkcoIGhhbmRsZSwgSE9PS19NQUdJQyApIDogKEhIT09LKU5VTEw7CiB9CiAKQEAgLTEzNDAsNyArMTMzOSw3IEBACiAgICAgb2xkaG9vayA9IChIT09LREFUQSAqKVVTRVJfSEVBUF9MSU5fQUREUiggTE9XT1JEKGhob29rKSApOwogICAgIGZyb210eXBlID0gb2xkaG9vay0+ZmxhZ3MgJiBIT09LX01BUFRZUEU7CiAKLSAgICBpZiAoIShmcm9tdHlwZSAmIEhPT0tfV0lOMzIpKQorICAgIGlmIChmcm9tdHlwZSA9PSBIT09LX1dJTjE2KQogICAgICAgZnByaW50ZihzdGRlcnIsICJDYWxsTmV4dEhvb2tFeDMyOiBjYWxsZWQgZnJvbSAxNmJpdCBob29rIVxuIik7CiAKICAgICByZXR1cm4gSE9PS19DYWxsSG9vayggbmV4dCwgZnJvbXR5cGUsIGNvZGUsIHdQYXJhbSwgbFBhcmFtICk7CmRpZmYgLS1naXQgYS93aW5kb3dzL2tleWJvYXJkLmMgYi93aW5kb3dzL2tleWJvYXJkLmMKaW5kZXggMTJjM2ZjZS4uZjgzY2MxNiAxMDA2NDQKLS0tIGEvd2luZG93cy9rZXlib2FyZC5jCisrKyBiL3dpbmRvd3Mva2V5Ym9hcmQuYwpAQCAtNiw2ICs2LDcgQEAKICAqIENvcHlyaWdodCAxOTk3IERhdmlkIEZhdXJlCiAgKgogICovCisjZGVmaW5lIE5PX1RSQU5TSVRJT05fVFlQRVMKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtMjYsNiArMjcsNyBAQAogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgogI2luY2x1ZGUgImFjY2VsLmgiCisjaW5jbHVkZSAic3RydWN0MzIuaCIKIAogQk9PTDMyIE1vdXNlQnV0dG9uc1N0YXRlc1szXTsKIEJPT0wzMiBBc3luY01vdXNlQnV0dG9uc1N0YXRlc1szXTsKQEAgLTU0LDggKzU2LDYgQEAKICAgICB1bnNpZ25lZCBsb25nIGxwMjsKIH0gS0VZTFA7CiAKLXR5cGVkZWYgZW51bSB7T0ZGLElOVEVSTSxPTn0gVG9nZ2xlS2V5U3RhdGU7Ci0KIC8qIEtleWJvYXJkIHRyYW5zbGF0aW9uIHRhYmxlcyAqLwogc3RhdGljIGNvbnN0IGludCBzcGVjaWFsX2tleVtdID0KIHsKQEAgLTI2OSw2ICsyNjksNTAgQEAKICAgICByZXR1cm4gVFJVRTsKIH0KIAorc3RhdGljIEJPT0wzMiBOdW1TdGF0ZT1GQUxTRSwgQ2Fwc1N0YXRlPUZBTFNFOworCit2b2lkIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBXT1JEIHZrZXksIGludCBFdnR5cGUsIFhLZXlFdmVudCAqIGV2ZW50LCBLRVlMUCBsb2NhbGtleWxwICkKK3sKKyAgQk9PTDMyICogU3RhdGUgPSAodmtleT09VktfTlVNTE9DSz8gJk51bVN0YXRlIDogJkNhcHNTdGF0ZSk7CisKKyAgaWYgKCpTdGF0ZSkgeworICAgIC8qIFRoZSBJTlRFUk1FRElBUlkgc3RhdGUgbWVhbnMgOiBqdXN0IGFmdGVyIGEgJ3ByZXNzJyBldmVudCwgaWYgYSAncmVsZWFzZScgZXZlbnQgY29tZXMsCisgICAgICAgZG9uJ3QgdHJlYXQgaXQuIEl0J3MgZnJvbSB0aGUgc2FtZSBrZXkgcHJlc3MuIFRoZW4gdGhlIHN0YXRlIGdvZXMgdG8gT04uCisgICAgICAgQW5kIGZyb20gdGhlcmUsIGEgJ3JlbGVhc2UnIGV2ZW50IHdpbGwgc3dpdGNoIG9mZiB0aGUgdG9nZ2xlIGtleS4gKi8KKyAgICAqU3RhdGU9RkFMU0U7CisgICAgZHByaW50Zl9rZXlib2FyZChzdGRkZWIsIklOVEVSTSA6IGRvblwndCB0cmVhdCByZWxlYXNlIG9mIHRvZ2dsZSBrZXkuIElucHV0S2V5U3RhdGVUYWJsZVslI3hdID0gJSN4XG4iLHZrZXksSW5wdXRLZXlTdGF0ZVRhYmxlW3ZrZXldKTsKKyAgfSBlbHNlCisgICAgeworCWlmICggSW5wdXRLZXlTdGF0ZVRhYmxlW3ZrZXldICYgMHgxICkgLyogaXQgd2FzIE9OICovCisJICB7CisJICAgIGlmIChFdnR5cGUhPUtleVByZXNzKQorCSAgICAgIHsKKwkJZHByaW50Zl9rZXlib2FyZChzdGRkZWIsIk9OICsgS2V5UmVsZWFzZSA9PiBnZW5lcmF0aW5nIERPV04gYW5kIFVQIG1lc3NhZ2VzLlxuIik7CisJCWxvY2Fsa2V5bHAubHAxLnByZXZpb3VzID0gMDsgLyogPyAqLworCQlsb2NhbGtleWxwLmxwMS50cmFuc2l0aW9uID0gMDsKKwkJaGFyZHdhcmVfZXZlbnQoIFdNX0tFWURPV04sIHZrZXksIGxvY2Fsa2V5bHAubHAyLCBldmVudC0+eF9yb290IC0gZGVza3RvcFgsCisJCQkJZXZlbnQtPnlfcm9vdCAtIGRlc2t0b3BZLCBldmVudC0+dGltZSAtIE1TR19XaW5lU3RhcnRUaWNrcywgMCk7CisJCWhhcmR3YXJlX2V2ZW50KCBXTV9LRVlVUCwgdmtleSwgbG9jYWxrZXlscC5scDIsIGV2ZW50LT54X3Jvb3QgLSBkZXNrdG9wWCwKKwkJCQlldmVudC0+eV9yb290IC0gZGVza3RvcFksIGV2ZW50LT50aW1lIC0gTVNHX1dpbmVTdGFydFRpY2tzLCAwKTsKKwkJKlN0YXRlPUZBTFNFOworCQlJbnB1dEtleVN0YXRlVGFibGVbdmtleV0gJj0gfjB4MDE7IC8qIFRvZ2dsZSBzdGF0ZSB0byBvZmYuICovIAorCSAgICAgIH0gCisJICB9CisJZWxzZSAvKiBpdCB3YXMgT0ZGICovCisJICBpZiAoRXZ0eXBlPT1LZXlQcmVzcykKKwkgICAgeworCSAgICAgIGRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCJPRkYgKyBLZXlwcmVzcyA9PiBnZW5lcmF0aW5nIERPV04gYW5kIFVQIG1lc3NhZ2VzLlxuIik7CisJICAgICAgaGFyZHdhcmVfZXZlbnQoIFdNX0tFWURPV04sIHZrZXksIGxvY2Fsa2V5bHAubHAyLCBldmVudC0+eF9yb290IC0gZGVza3RvcFgsCisJCQkgICAgICBldmVudC0+eV9yb290IC0gZGVza3RvcFksIGV2ZW50LT50aW1lIC0gTVNHX1dpbmVTdGFydFRpY2tzLCAwKTsKKwkgICAgICBsb2NhbGtleWxwLmxwMS5wcmV2aW91cyA9IDE7CisJICAgICAgbG9jYWxrZXlscC5scDEudHJhbnNpdGlvbiA9IDE7CisJICAgICAgaGFyZHdhcmVfZXZlbnQoIFdNX0tFWVVQLCB2a2V5LCBsb2NhbGtleWxwLmxwMiwgZXZlbnQtPnhfcm9vdCAtIGRlc2t0b3BYLAorCQkJICAgICAgZXZlbnQtPnlfcm9vdCAtIGRlc2t0b3BZLCBldmVudC0+dGltZSAtIE1TR19XaW5lU3RhcnRUaWNrcywgMCk7CisJICAgICAgKlN0YXRlPVRSVUU7IC8qIEdvZXMgdG8gaW50ZXJtZWRpYXJ5IHN0YXRlIGJlZm9yZSBnb2luZyB0byBPTiAqLworCSAgICAgIElucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSB8PSAweDAxOyAvKiBUb2dnbGUgc3RhdGUgdG8gb24uICovCisJICAgIH0KKyAgICB9Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEtFWUJPQVJEX0hhbmRsZUV2ZW50CkBAIC0yODIsMTEgKzMyNiw3IEBACiAgICAgS2V5U3ltIGtleXN5bTsKICAgICBXT1JEIHZrZXkgPSAwOwogICAgIEtFWUxQIGtleWxwOwotICAgIFdPUkQgbWVzc2FnZTsKLSAgICBzdGF0aWMgQk9PTCBmb3JjZV9leHRlbmRlZCA9IEZBTFNFOyAvKiBoYWNrIGZvciBBbHRHciB0cmFuc2xhdGlvbiAqLwotICAgIEJPT0wgRG9udFByb3BhZ2F0ZTsKLSAgICBUb2dnbGVLZXlTdGF0ZSAqIFN0YXRlOwotICAgIHN0YXRpYyBUb2dnbGVLZXlTdGF0ZSBOdW1TdGF0ZT1PRkYsIENhcHNTdGF0ZT1PRkY7CisgICAgc3RhdGljIEJPT0wzMiBmb3JjZV9leHRlbmRlZCA9IEZBTFNFOyAvKiBoYWNrIGZvciBBbHRHciB0cmFuc2xhdGlvbiAqLwogCiAgICAgaW50IGFzY2lpX2NoYXJzID0gWExvb2t1cFN0cmluZyhldmVudCwgU3RyLCAxLCAma2V5c3ltLCAmY3MpOwogCkBAIC0zMTgsMjEgKzM1OCwxNCBAQAogICAgICAgICAgICAgICAgIGtleXN5bSwga3NuYW1lLCBhc2NpaV9jaGFycywgU3RyWzBdICYgMHhmZiwgU3RyKTsKIAl9CiAKLSNpZiAwCi0gICAgLyogQ3RybC1BbHQtUmV0dXJuIGVudGVycyB0aGUgZGVidWdnZXIgKi8KLSAgICBpZiAoKGtleXN5bSA9PSBYS19SZXR1cm4pICYmIChldmVudC0+dHlwZSA9PSBLZXlQcmVzcykgJiYKLSAgICAgICAgKGV2ZW50LT5zdGF0ZSAmIENvbnRyb2xNYXNrKSAmJiAoZXZlbnQtPnN0YXRlICYgTW9kMU1hc2spKQotICAgICAgICBERUJVR19FbnRlckRlYnVnZ2VyKCk7Ci0jZW5kaWYKLQogICAgIHZrZXkgPSBFVkVOVF9ldmVudF90b192a2V5KGV2ZW50KTsKICAgICBpZiAoZm9yY2VfZXh0ZW5kZWQpIHZrZXkgfD0gMHgxMDA7CiAKICAgICBkcHJpbnRmX2tleShzdGRkZWIsICJrZXljb2RlIDB4JXggY29udmVydGVkIHRvIHZrZXkgMHgleFxuIiwKIAkJICAgIGV2ZW50LT5rZXljb2RlLCB2a2V5KTsKIAotICAgIGlmICh2a2V5KQotICAgIHsKKyAgIGlmICh2a2V5KQorICAgewogICAgIGtleWxwLmxwMS5jb3VudCA9IDE7CiAgICAga2V5bHAubHAxLmNvZGUgPSBMT0JZVEUoZXZlbnQtPmtleWNvZGUpIC0gODsKICAgICBrZXlscC5scDEuZXh0ZW5kZWQgPSAodmtleSAmIDB4MTAwID8gMSA6IDApOwpAQCAtMzQxLDc1ICszNzQsNjAgQEAKIAkJCQkvKiBpdCdzICcxJyB1bmRlciB3aW5kb3dzLCB3aGVuIGEgZGlhbG9nIGJveCBhcHBlYXJzCiAJCQkJICogYW5kIHlvdSBwcmVzcyBvbmUgb2YgdGhlIHVuZGVybGluZWQga2V5cyAtIERGKi8KICAgICB2a2V5ICY9IDB4ZmY7Ci0gICAgaWYgKGV2ZW50LT50eXBlID09IEtleVByZXNzKQotICAgIHsKLQlrZXlscC5scDEucHJldmlvdXMgPSAoSW5wdXRLZXlTdGF0ZVRhYmxlW3ZrZXldICYgMHg4MCkgIT0gMDsKLSAgICAgICAgaWYgKCEoSW5wdXRLZXlTdGF0ZVRhYmxlW3ZrZXldICYgMHg4MCkpCi0gICAgICAgICAgICBJbnB1dEtleVN0YXRlVGFibGVbdmtleV0gXj0gMHgwMTsKLQlJbnB1dEtleVN0YXRlVGFibGVbdmtleV0gfD0gMHg4MDsKLQlrZXlscC5scDEudHJhbnNpdGlvbiA9IDA7Ci0JbWVzc2FnZSA9IChJbnB1dEtleVN0YXRlVGFibGVbVktfTUVOVV0gJiAweDgwKQotCQkgICAgJiYgIShJbnB1dEtleVN0YXRlVGFibGVbVktfQ09OVFJPTF0gJiAweDgwKQotCQkJID8gV01fU1lTS0VZRE9XTiA6IFdNX0tFWURPV047Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JVUlOVCBzeXNLZXkgPSAoSW5wdXRLZXlTdGF0ZVRhYmxlW1ZLX01FTlVdICYgMHg4MCkKLQkJCSYmICEoSW5wdXRLZXlTdGF0ZVRhYmxlW1ZLX0NPTlRST0xdICYgMHg4MCkKLQkJCSYmIChmb3JjZV9leHRlbmRlZCA9PSBGQUxTRSk7IC8qIGZvciBBbHQgZnJvbSBBbHRHciAqLwogCi0JSW5wdXRLZXlTdGF0ZVRhYmxlW3ZrZXldICY9IH4weDgwOyAKLQlrZXlscC5scDEucHJldmlvdXMgPSAxOwotCWtleWxwLmxwMS50cmFuc2l0aW9uID0gMTsKLQltZXNzYWdlID0gc3lzS2V5ID8gV01fU1lTS0VZVVAgOiBXTV9LRVlVUDsKLSAgICB9Ci0gICAga2V5bHAubHAxLmNvbnRleHQgPSAoIChldmVudC0+c3RhdGUgJiBNb2QxTWFzaykgIHx8IAotCQkJICAoSW5wdXRLZXlTdGF0ZVRhYmxlW1ZLX01FTlVdICYgMHg4MCkpID8gMSA6IDA7Ci0gICAgRG9udFByb3BhZ2F0ZSA9IEZBTFNFOwotICAgIGlmICgodmtleT09VktfTlVNTE9DSykgfHwgKHZrZXk9PVZLX0NBUElUQUwpKQorICAgIHN3aXRjaCh2a2V5KQorICAgIHsKKyAgICBjYXNlIFZLX05VTUxPQ0s6ICAgIAorICAgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coVktfTlVNTE9DSyxldmVudC0+dHlwZSxldmVudCxrZXlscCk7IGJyZWFrOworICAgIGNhc2UgVktfQ0FQSVRBTDoKKyAgICAgIGRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCJDYXBzIExvY2sgZXZlbnQuICh0eXBlICVkKS4gU3RhdGUgYmVmb3JlIDogJSMuMnhcbiIsZXZlbnQtPnR5cGUsSW5wdXRLZXlTdGF0ZVRhYmxlW3ZrZXldKTsKKyAgICAgIEtFWUJPQVJEX0dlbmVyYXRlTXNnKFZLX0NBUElUQUwsZXZlbnQtPnR5cGUsZXZlbnQsa2V5bHApOyAKKyAgICAgIGRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCJTdGF0ZSBhZnRlciA6ICUjLjJ4XG4iLElucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgogICAgICAgewotCQotCXN3aXRjaCAoKiggU3RhdGUgPSAodmtleT09VktfTlVNTE9DSz8gJk51bVN0YXRlIDogJkNhcHNTdGF0ZSkpKSB7Ci0JY2FzZSBPRkY6aWYgKGV2ZW50LT50eXBlPT1LZXlQcmVzcykKKwlXT1JEIG1lc3NhZ2U7CisJaWYgKGV2ZW50LT50eXBlID09IEtleVByZXNzKQogCSAgewotCSAgICBkcHJpbnRmX2tleWJvYXJkKHN0ZGRlYiwiT0ZGICsgS2V5cHJlc3MgPT4gRE9XTiBhbmQgVVAgZ2VuZXJhdGVkLiBcbiIpOwotCSAgICBoYXJkd2FyZV9ldmVudCggbWVzc2FnZSwgdmtleSwga2V5bHAubHAyLCBldmVudC0+eF9yb290IC0gZGVza3RvcFgsCi0JCQkgICAgZXZlbnQtPnlfcm9vdCAtIGRlc2t0b3BZLCBldmVudC0+dGltZSAtIE1TR19XaW5lU3RhcnRUaWNrcywgMCk7Ci0JICAgIG1lc3NhZ2UgKz0gV01fS0VZVVAgLSBXTV9LRVlET1dOOyAvKiBjcmVhdGUgYSAqVVAgbWVzc2FnZSBmcm9tIHRoZSAqRE9XTiBvbmUgKi8KKwkgICAga2V5bHAubHAxLnByZXZpb3VzID0gKElucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSAmIDB4ODApICE9IDA7CisJICAgIGlmICghKElucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSAmIDB4ODApKQorCSAgICAgIElucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSBePSAweDAxOworCSAgICBJbnB1dEtleVN0YXRlVGFibGVbdmtleV0gfD0gMHg4MDsKKwkgICAga2V5bHAubHAxLnRyYW5zaXRpb24gPSAwOworCSAgICBtZXNzYWdlID0gKElucHV0S2V5U3RhdGVUYWJsZVtWS19NRU5VXSAmIDB4ODApCisJICAgICAgJiYgIShJbnB1dEtleVN0YXRlVGFibGVbVktfQ09OVFJPTF0gJiAweDgwKQorCSAgICAgID8gV01fU1lTS0VZRE9XTiA6IFdNX0tFWURPV047CisJICB9CisJZWxzZQorCSAgeworICAgICAgICAgICAgQk9PTDMyIHN5c0tleSA9IChJbnB1dEtleVN0YXRlVGFibGVbVktfTUVOVV0gJiAweDgwKQorICAgICAgICAgICAgICAgICYmICEoSW5wdXRLZXlTdGF0ZVRhYmxlW1ZLX0NPTlRST0xdICYgMHg4MCkKKyAgICAgICAgICAgICAgICAmJiAoZm9yY2VfZXh0ZW5kZWQgPT0gRkFMU0UpOyAvKiBmb3IgQWx0IGZyb20gQWx0R3IgKi8KKwkgICAgCisJICAgIElucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSAmPSB+MHg4MDsgCiAJICAgIGtleWxwLmxwMS5wcmV2aW91cyA9IDE7CiAJICAgIGtleWxwLmxwMS50cmFuc2l0aW9uID0gMTsKLQkgICAgKlN0YXRlID0gSU5URVJNOwotCSAgfSBicmVhazsKLQljYXNlIElOVEVSTToKLQkgIC8qIFRoZSAnSU5URVJNJyBzdGF0ZSBtZWFucyA6IGp1c3QgYWZ0ZXIgYSAncHJlc3MnIGV2ZW50LCBpZiBhICdyZWxlYXNlJyBldmVudCBjb21lcywKLQkgICAgIGRvbid0ICJwcm9wYWdhdGUiIGl0LiBJdCdzIGZyb20gdGhlIHNhbWUga2V5IHByZXNzLiBUaGVuIHRoZSBzdGF0ZSBnb2VzIHRvIE9OLgotCSAgICAgQW5kIGZyb20gdGhlcmUsIGEgJ3JlbGVhc2UnIGV2ZW50IHdpbGwgc3dpdGNoIG9mZiB0aGUgdG9nZ2xlIGtleS4gKi8KLQkgIERvbnRQcm9wYWdhdGUgPSBUUlVFOwotCSAgKlN0YXRlPU9OOwotCSAgSW5wdXRLZXlTdGF0ZVRhYmxlW3ZrZXldIHw9IDB4MDE7IC8qIGZvcmNlIHRvICdvbicgZXZlbnQgaWYgYSByZWxlYXNlIGV2ZW50IHdhcyByZWNlaXZlZCAqLwotCSAgZHByaW50Zl9rZXlib2FyZChzdGRkZWIsIklOVEVSTSA6IGRvblwndCBwcm9wYWdhdGUgcHJlc3MvcmVsZWFzZSBvZiB0b2dnbGUga2V5LiBJbnB1dEtleVN0YXRlVGFibGVbJSN4XSA9ICUjeCIsdmtleSxJbnB1dEtleVN0YXRlVGFibGVbdmtleV0pOwotCSAgYnJlYWs7Ci0JY2FzZSBPTjogaWYgKGV2ZW50LT50eXBlPT1LZXlQcmVzcykgRG9udFByb3BhZ2F0ZSA9IFRSVUU7IGVsc2UKKwkgICAgbWVzc2FnZSA9IHN5c0tleSA/IFdNX1NZU0tFWVVQIDogV01fS0VZVVA7CisJICB9CisJa2V5bHAubHAxLmNvbnRleHQgPSAoIChldmVudC0+c3RhdGUgJiBNb2QxTWFzaykgIHx8IAorCQkJICAgICAgKElucHV0S2V5U3RhdGVUYWJsZVtWS19NRU5VXSAmIDB4ODApKSA/IDEgOiAwOworCWlmICghKElucHV0S2V5U3RhdGVUYWJsZVtWS19OVU1MT0NLXSAmIDB4MDEpICE9ICEoZXZlbnQtPnN0YXRlICYgTnVtTG9ja01hc2spKQorCSAgeyAKKwkgICAgZHByaW50Zl9rZXlib2FyZChzdGRkZWIsIkFkanVzdGluZyBOdW1Mb2NrIHN0YXRlLiBcbiIpOworCSAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyhWS19OVU1MT0NLLEtleVByZXNzLGV2ZW50LGtleWxwKTsKKwkgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coVktfTlVNTE9DSyxLZXlSZWxlYXNlLGV2ZW50LGtleWxwKTsKKwkgIH0KKwlpZiAoIShJbnB1dEtleVN0YXRlVGFibGVbVktfQ0FQSVRBTF0gJiAweDAxKSAhPSAhKGV2ZW50LT5zdGF0ZSAmIExvY2tNYXNrKSkKIAkgIHsKLQkgICAgS0VZTFAgZG93bmtleWxwID0ga2V5bHA7Ci0JICAgIGRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCJPTiArIEtleVJlbGVhc2UgPT4gZ2VuZXJhdGluZyBET1dOIG1zZyBiZWZvcmUgdGhlIFVQXG4iKTsKLQkgICAgbWVzc2FnZSArPSBXTV9LRVlET1dOIC0gV01fS0VZVVA7IC8qIGNyZWF0ZSB0aGUgKkRPV04gZnJvbSB0aGUgKlVQICovCi0JICAgIGRvd25rZXlscC5scDEucHJldmlvdXMgPSAwOyAvKiA/ICovCi0JICAgIGRvd25rZXlscC5scDEudHJhbnNpdGlvbiA9IDA7Ci0JICAgIGhhcmR3YXJlX2V2ZW50KCBtZXNzYWdlLCB2a2V5LCBkb3dua2V5bHAubHAyLCBldmVudC0+eF9yb290IC0gZGVza3RvcFgsCi0JCQkgICAgZXZlbnQtPnlfcm9vdCAtIGRlc2t0b3BZLCBldmVudC0+dGltZSAtIE1TR19XaW5lU3RhcnRUaWNrcywgMCk7Ci0JICAgIG1lc3NhZ2UgKz0gV01fS0VZVVAgLSBXTV9LRVlET1dOOyAvKiBiYWNrIHRvIHRoZSBVUCBtZXNzYWdlICovCi0gICAgICAgICAgICAqU3RhdGU9T0ZGOwotCSAgfSBicmVhazsKLQl9Ci0JZHByaW50Zl9rZXlib2FyZChzdGRkZWIsIkludGVybmFsIFN0YXRlIDogJWQgKDA9T0ZGIDE9SU5URVJNIDI9T04pLiBJbnB1dFRhYmxlIHN0YXRlIDogJSN4IFxuIiwqU3RhdGUsSW5wdXRLZXlTdGF0ZVRhYmxlW3ZrZXldKTsKLSAgICAgIH0gZWxzZSB7Ci0JaWYgKE51bVN0YXRlID09IElOVEVSTSkgTnVtU3RhdGUgPSBPTjsKLQlpZiAoQ2Fwc1N0YXRlID09IElOVEVSTSkgQ2Fwc1N0YXRlID0gT047Ci0gICAgICB9Ci0gICAgCi0gICAgaWYgKCFEb250UHJvcGFnYXRlKQotICAgICAgeworCSAgICBkcHJpbnRmX2tleWJvYXJkKHN0ZGRlYiwiQWRqdXN0aW5nIENhcHMgTG9jayBzdGF0ZS4gU3RhdGUgYmVmb3JlICUjLjJ4IFxuIixJbnB1dEtleVN0YXRlVGFibGVbVktfQ0FQSVRBTF0pOworCSAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyhWS19DQVBJVEFMLEtleVByZXNzLGV2ZW50LGtleWxwKTsKKwkgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coVktfQ0FQSVRBTCxLZXlSZWxlYXNlLGV2ZW50LGtleWxwKTsKKwkgICAgZHByaW50Zl9rZXlib2FyZChzdGRkZWIsIlN0YXRlIGFmdGVyICUjLjJ4IFxuIixJbnB1dEtleVN0YXRlVGFibGVbVktfQ0FQSVRBTF0pOworCSAgfQorCS8qIEVuZCBvZiBpbnRlcm1lZGlhcnkgc3RhdGVzLiAqLworCU51bVN0YXRlID0gRkFMU0U7CisJQ2Fwc1N0YXRlID0gRkFMU0U7CisKIAlkcHJpbnRmX2tleShzdGRkZWIsIiAgICAgICAgICAgIHdQYXJhbT0lMDRYLCBsUGFyYW09JTA4bFhcbiIsIAogCQkgICAgdmtleSwga2V5bHAubHAyICk7CiAJZHByaW50Zl9rZXkoc3RkZGViLCIgICAgICAgICAgICBJbnB1dEtleVN0YXRlPSVYXG4iLApAQCAtNDE5LDE4ICs0MzcsMjcgQEAKIAkJCWV2ZW50LT55X3Jvb3QgLSBkZXNrdG9wWSwgZXZlbnQtPnRpbWUgLSBNU0dfV2luZVN0YXJ0VGlja3MsIDAgKTsKICAgICAgIH0KICAgICB9CisgICB9CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQlHZXRLZXlTdGF0ZQkJCVtVU0VSLjEwNl0KKyAqLworV09SRCBHZXRLZXlTdGF0ZTE2KElOVDE2IHZrZXkpCit7CisgICAgcmV0dXJuIEdldEtleVN0YXRlMzIodmtleSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJR2V0S2V5U3RhdGUJCQlbVVNFUjMyLjI0OF0KICAqIEFuIGFwcGxpY2F0aW9uIGNhbGxzIHRoZSBHZXRLZXlTdGF0ZSBmdW5jdGlvbiBpbiByZXNwb25zZSB0byBhCiAgKiBrZXlib2FyZC1pbnB1dCBtZXNzYWdlLiAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIHN0YXRlIG9mIHRoZSBrZXkKICAqIGF0IHRoZSB0aW1lIHRoZSBpbnB1dCBtZXNzYWdlIHdhcyBnZW5lcmF0ZWQuICAoU0RLIDMuMSBWb2wgMi4gcCAzOTApCiAgKi8KLUlOVCBHZXRLZXlTdGF0ZShJTlQgdmtleSkKK1dPUkQgR2V0S2V5U3RhdGUzMihJTlQzMiB2a2V5KQogewotICAgIElOVCByZXR2YWw7CisgICAgSU5UMzIgcmV0dmFsOwogCiAgICAgc3dpdGNoICh2a2V5KQogCXsKQEAgLTQ0NiwyMCArNDczLDIwIEBACiAJZGVmYXVsdCA6CiAJICAgIGlmICh2a2V5ID49ICdhJyAmJiB2a2V5IDw9ICd6JykKIAkJdmtleSArPSAnQScgLSAnYSc7Ci0JICAgIHJldHZhbCA9ICggKElOVCkoUXVldWVLZXlTdGF0ZVRhYmxlW3ZrZXldICYgMHg4MCkgPDwgOCApIHwKLQkJICAgICAgIChJTlQpKFF1ZXVlS2V5U3RhdGVUYWJsZVt2a2V5XSAmIDB4MDEpOworCSAgICByZXR2YWwgPSAoIChXT1JEKShRdWV1ZUtleVN0YXRlVGFibGVbdmtleV0gJiAweDgwKSA8PCA4ICkgfAorCQkgICAgICAgKFdPUkQpKFF1ZXVlS2V5U3RhdGVUYWJsZVt2a2V5XSAmIDB4MDEpOwogCX0KICAgICBkcHJpbnRmX2tleShzdGRkZWIsICJHZXRLZXlTdGF0ZSgweCV4KSAtPiAleFxuIiwgdmtleSwgcmV0dmFsKTsKICAgICByZXR1cm4gcmV0dmFsOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCUdldEtleWJvYXJkU3RhdGUJCQlbVVNFUi4yMjJdCisgKgkJR2V0S2V5Ym9hcmRTdGF0ZQlbVVNFUi4yMjJdW1VTRVIzMi4yNTNdCiAgKiBBbiBhcHBsaWNhdGlvbiBjYWxscyB0aGUgR2V0S2V5Ym9hcmRTdGF0ZSBmdW5jdGlvbiBpbiByZXNwb25zZSB0byBhCiAgKiBrZXlib2FyZC1pbnB1dCBtZXNzYWdlLiAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIHN0YXRlIG9mIHRoZSBrZXlib2FyZAogICogYXQgdGhlIHRpbWUgdGhlIGlucHV0IG1lc3NhZ2Ugd2FzIGdlbmVyYXRlZC4gIChTREsgMy4xIFZvbCAyLiBwIDM4NykKICAqLwotdm9pZCBHZXRLZXlib2FyZFN0YXRlKEJZVEUgKmxwS2V5U3RhdGUpCitWT0lEIEdldEtleWJvYXJkU3RhdGUoTFBCWVRFIGxwS2V5U3RhdGUpCiB7CiAgICAgZHByaW50Zl9rZXkoc3RkZGViLCAiR2V0S2V5Ym9hcmRTdGF0ZSgpXG4iKTsKICAgICBpZiAobHBLZXlTdGF0ZSAhPSBOVUxMKSB7CkBAIC00NzEsOSArNDk4LDkgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgU2V0S2V5Ym9hcmRTdGF0ZSAgICAgICAgICAgIFtVU0VSLjIyM10KKyAqICAgICAgU2V0S2V5Ym9hcmRTdGF0ZSAgICAgICAgICAgIFtVU0VSLjIyM11bVVNFUjMyLjQ4M10KICAqLwotdm9pZCBTZXRLZXlib2FyZFN0YXRlKEJZVEUgKmxwS2V5U3RhdGUpCitWT0lEIFNldEtleWJvYXJkU3RhdGUoTFBCWVRFIGxwS2V5U3RhdGUpCiB7CiAgICAgZHByaW50Zl9rZXkoc3RkZGViLCAiU2V0S2V5Ym9hcmRTdGF0ZSgpXG4iKTsKICAgICBpZiAobHBLZXlTdGF0ZSAhPSBOVUxMKSB7CkBAIC00ODUsNyArNTEyLDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgR2V0QXN5bmNLZXlTdGF0ZSAgICAgICAgKFVTRVIuMjQ5KQorICogICAgICAgICAgICBHZXRBc3luY0tleVN0YXRlICAgICAgICAoVVNFUjMyLjIwNikKICAqCiAgKglEZXRlcm1pbmUgaWYgYSBrZXkgaXMgb3Igd2FzIHByZXNzZWQuICByZXR2YWwgaGFzIGhpZ2gtb3JkZXIgCiAgKiBiaXQgc2V0IHRvIDEgaWYgY3VycmVudGx5IHByZXNzZWQsIGxvdy1vcmRlciBiaXQgc2V0IHRvIDEgaWYga2V5IGhhcwpAQCAtNDk3LDcgKzUyNCw3IEBACiAgKiBtb3VzZSBvciBrZXkgaGFkIGJlZW4gZGVwcmVzc2VkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gCiAgKiBHZXRBc3luY0tleVN0YXRlLgogICovCi1pbnQgR2V0QXN5bmNLZXlTdGF0ZShpbnQgbktleSkKK1dPUkQgR2V0QXN5bmNLZXlTdGF0ZTMyKElOVDMyIG5LZXkpCiB7CiAgICAgc2hvcnQgcmV0dmFsOwkKIApAQCAtNTI3LDE3ICs1NTQsMzQgQEAKICAgICByZXR1cm4gcmV0dmFsOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICBHZXRBc3luY0tleVN0YXRlICAgICAgICAoVVNFUi4yNDkpCisgKi8KK1dPUkQgR2V0QXN5bmNLZXlTdGF0ZTE2KElOVDE2IG5LZXkpCit7CisgICAgcmV0dXJuIEdldEFzeW5jS2V5U3RhdGUzMihuS2V5KTsKK30KKworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCVRyYW5zbGF0ZUFjY2VsZXJhdG9yIAlbVVNFUi4xNzhdCiAgKgogICogRklYTUU6IHNob3VsZCBzZW5kIHNvbWUgV01fSU5JVE1FTlUgb3IvYW5kIFdNX0lOSVRNRU5VUE9QVVAgIC1tZXNzYWdlcwogICovCi1JTlQxNiBUcmFuc2xhdGVBY2NlbGVyYXRvcihIV05EIGhXbmQsIEhBQ0NFTDE2IGhBY2NlbCwgTFBNU0cxNiBtc2cpCitJTlQzMiBUcmFuc2xhdGVBY2NlbGVyYXRvcjMyKEhXTkQzMiBoV25kLCBIQUNDRUwzMiBoQWNjZWwsIExQTVNHMzIgbXNnKQoreworICAgIE1TRzE2CW1zZzE2OworCisgICAgU1RSVUNUMzJfTVNHMzJ0bzE2KG1zZywmbXNnMTYpOworICAgIHJldHVybiBUcmFuc2xhdGVBY2NlbGVyYXRvcjE2KGhXbmQsaEFjY2VsLCZtc2cxNik7Cit9CisJCitJTlQxNiBUcmFuc2xhdGVBY2NlbGVyYXRvcjE2KEhXTkQxNiBoV25kLCBIQUNDRUwxNiBoQWNjZWwsIExQTVNHMTYgbXNnKQogewogICAgIEFDQ0VMSEVBREVSCSpscEFjY2VsVGJsOwogICAgIGludCAJaTsKLSAgICBCT09MIHNlbmRtc2c7CisgICAgQk9PTDMyIHNlbmRtc2c7CiAgICAgCiAgICAgaWYgKGhBY2NlbCA9PSAwIHx8IG1zZyA9PSBOVUxMKSByZXR1cm4gMDsKICAgICBpZiAobXNnLT5tZXNzYWdlICE9IFdNX0tFWURPV04gJiYKQEAgLTU2NywxMiArNjExLDEyIEBACiAgICAgICB7CiAgICAgICAgaWYobHBBY2NlbFRibC0+dGJsW2ldLnR5cGUgJiBWSVJUS0VZX0FDQ0VMKSAKICAgICAgICB7Ci0JSU5UIG1hc2sgPSAwOworCUlOVDMyIG1hc2sgPSAwOwogICAgICAgICBkcHJpbnRmX2FjY2VsKHN0ZGRlYiwiZm91bmQgYWNjZWwgZm9yIHZpcnRfa2V5ICUwNHggKHNjYW4gJTA0eCkiLAogICAJICAgICAgICAgICAgICAgICAgICAgICBtc2ctPndQYXJhbSwweGZmICYgSElXT1JEKG1zZy0+bFBhcmFtKSk7ICAgICAgICAgICAgICAgIAotCWlmKEdldEtleVN0YXRlKFZLX1NISUZUKSAmIDB4ODAwMCkgbWFzayB8PSBTSElGVF9BQ0NFTDsKLQlpZihHZXRLZXlTdGF0ZShWS19DT05UUk9MKSAmIDB4ODAwMCkgbWFzayB8PSBDT05UUk9MX0FDQ0VMOwotCWlmKEdldEtleVN0YXRlKFZLX01FTlUpICYgMHg4MDAwKSBtYXNrIHw9IEFMVF9BQ0NFTDsKKwlpZihHZXRLZXlTdGF0ZTMyKFZLX1NISUZUKSAmIDB4ODAwMCkgbWFzayB8PSBTSElGVF9BQ0NFTDsKKwlpZihHZXRLZXlTdGF0ZTMyKFZLX0NPTlRST0wpICYgMHg4MDAwKSBtYXNrIHw9IENPTlRST0xfQUNDRUw7CisJaWYoR2V0S2V5U3RhdGUzMihWS19NRU5VKSAmIDB4ODAwMCkgbWFzayB8PSBBTFRfQUNDRUw7CiAJaWYobWFzayA9PSAobHBBY2NlbFRibC0+dGJsW2ldLnR5cGUgJgogCQkJICAgIChTSElGVF9BQ0NFTCB8IENPTlRST0xfQUNDRUwgfCBBTFRfQUNDRUwpKSkKICAgICAgICAgICBzZW5kbXNnPVRSVUU7CQkJICAgIApAQCAtNjcyLDYgKzcxNiw5IEBACiB9CiAKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgCU9lbUtleVNjYW4JCQlbS0VZQk9BUkQuMTI4XVtVU0VSMzIuNDAwXQorICovCiBEV09SRCBPZW1LZXlTY2FuKFdPUkQgd09lbUNoYXIpCiB7CiAgICAgZHByaW50Zl9rZXlib2FyZChzdGRkZWIsIipPZW1LZXlTY2FuICglZClcbiIsd09lbUNoYXIpOwpAQCAtNjc5LDYgKzcyNiw5IEBACiAgICAgcmV0dXJuIHdPZW1DaGFyOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAJVmtLZXlTY2FuQQkJCVtVU0VSMzIuNTcyXQorICovCiAvKiBWa0tleVNjYW4gdHJhbnNsYXRlcyBhbiBBTlNJIGNoYXJhY3RlciB0byBhIHZpcnR1YWwta2V5IGFuZCBzaGlmdCBjb2RlCiAgKiBmb3IgdGhlIGN1cnJlbnQga2V5Ym9hcmQuCiAgKiBGSVhNRSBoaWdoLW9yZGVyIGJ5dGUgc2hvdWxkIHlpZWxkIDoKQEAgLTY5MSw3ICs3NDEsNyBAQAogICoJSS5lLiA6CVNoaWZ0ID0gMSwgQ3RybCA9IDIsIEFsdCA9IDQuCiAgKi8KIAotV09SRCBWa0tleVNjYW4oV09SRCBjQ2hhcikKK1dPUkQgVmtLZXlTY2FuMzJBKENIQVIgY0NoYXIpCiB7CiAJS2V5Q29kZSBrZXljb2RlOwogICAgIAlkcHJpbnRmX2tleWJvYXJkKHN0ZGRlYiwiVmtLZXlTY2FuICclYycoJWQpICIsY0NoYXIsY0NoYXIpOwpAQCAtNzA2LDEzICs3NTYsMzQgQEAKIAlyZXR1cm4ga2V5YzJ2a2V5W2tleWNvZGVdOwogfQogCi1XT1JEIFZrS2V5U2NhbjMyVyhXT1JEIGNDaGFyKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgCVZrS2V5U2NhbgkJCVtLRVlCT0FSRC4xMjldCisgKi8KK1dPUkQgVmtLZXlTY2FuMTYoQ0hBUiBjQ2hhcikKIHsKLQkvKiBsb3dlciBwYXJ0IG9mIGNDaGFyIGlzIHVzZWQgYW55d2F5ICovCi0JcmV0dXJuIFZrS2V5U2NhbihjQ2hhcik7CisJcmV0dXJuIFZrS2V5U2NhbjMyQShjQ2hhcik7CiB9CiAKLWludCBHZXRLZXlib2FyZFR5cGUoaW50IG5UeXBlRmxhZykKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgIAlWa0tleVNjYW5XCQkJW1VTRVIzMi41NzVdCisgKi8KK1dPUkQgVmtLZXlTY2FuMzJXKFdDSEFSIGNDaGFyKQoreworCXJldHVybiBWa0tleVNjYW4zMkEoKENIQVIpY0NoYXIpOyAvKiBGSVhNRTogY2hlY2sgdW5pY29kZSAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAJR2V0S2V5Ym9hcmRUeXBlCQkJW0tFWUJPQVJELjEzMF0KKyAqLworSU5UMTYgR2V0S2V5Ym9hcmRUeXBlMTYoSU5UMTYgblR5cGVGbGFnKQoreworICByZXR1cm4gR2V0S2V5Ym9hcmRUeXBlMzIoblR5cGVGbGFnKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgCUdldEtleWJvYXJkVHlwZQkJCVtVU0VSMzIuMjU0XQorICovCitJTlQzMiBHZXRLZXlib2FyZFR5cGUzMihJTlQzMiBuVHlwZUZsYWcpCiB7CiAgIGRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCJHZXRLZXlib2FyZFR5cGUoJWQpXG4iLG5UeXBlRmxhZyk7CiAgIHN3aXRjaChuVHlwZUZsYWcpCkBAIC03MzIsOSArODAzLDI2IEBACiAgICAgfQogfQogCi0vKiBNYXBWaXJ0dWFsS2V5IHRyYW5zbGF0ZXMga2V5Y29kZXMgZnJvbSBvbmUgZm9ybWF0IHRvIGFub3RoZXIuICovCiAKLVdPUkQgTWFwVmlydHVhbEtleShXT1JEIHdDb2RlLCBXT1JEIHdNYXBUeXBlKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgCU1hcFZpcnR1YWxLZXlBCQkJW1VTRVIzMi4zODJdCisgKi8KK1VJTlQzMiBNYXBWaXJ0dWFsS2V5MzJBKFVJTlQzMiBjb2RlLCBVSU5UMzIgbWFwdHlwZSkgeworCXJldHVybiBNYXBWaXJ0dWFsS2V5MTYoY29kZSxtYXB0eXBlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgCU1hcFZpcnR1YWxLZXlBCQkJW1VTRVIzMi4zODRdCisgKi8KK1VJTlQzMiBNYXBWaXJ0dWFsS2V5MzJXKFVJTlQzMiBjb2RlLCBVSU5UMzIgbWFwdHlwZSkgeworCXJldHVybiBNYXBWaXJ0dWFsS2V5MTYoY29kZSxtYXB0eXBlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgCU1hcFZpcnR1YWxLZXlBCQkJW0tFWUJPQVJELjEzMV0KKyAqIE1hcFZpcnR1YWxLZXkgdHJhbnNsYXRlcyBrZXljb2RlcyBmcm9tIG9uZSBmb3JtYXQgdG8gYW5vdGhlcgorICovCitVSU5UMTYgTWFwVmlydHVhbEtleTE2KFVJTlQxNiB3Q29kZSwgVUlOVDE2IHdNYXBUeXBlKQogewogI2RlZmluZSByZXR1cm5NVksodmFsdWUpIHsgZHByaW50Zl9rZXlib2FyZChzdGRkZWIsInJldHVybmluZyAweCV4LlxuIix2YWx1ZSk7IHJldHVybiB2YWx1ZTsgfQogCkBAIC03NjIsNyArODUwLDcgQEAKIAkJCWNoYXIgc1syXTsKIAkJCWUuZGlzcGxheSA9IGRpc3BsYXk7CiAJCQllLnN0YXRlID0gMDsgLyogdW5zaGlmdGVkICovCi0JCQllLmtleWNvZGUgPSBNYXBWaXJ0dWFsS2V5KCB3Q29kZSwgMCk7CisJCQllLmtleWNvZGUgPSBNYXBWaXJ0dWFsS2V5MTYoIHdDb2RlLCAwKTsKIAkJCWlmICghWExvb2t1cFN0cmluZygmZSwgcyAsIDIgLCAma2V5c3ltLCBOVUxMKSkKIAkJCSAgcmV0dXJuTVZLICgqcyk7CiAJCQkKQEAgLTc3Niw3ICs4NjQsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IEdldEtiQ29kZVBhZ2Uodm9pZCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglHZXRLYkNvZGVQYWdlICAgKEtFWUJPQVJELjEzMikKKyAqLworSU5UMTYgR2V0S2JDb2RlUGFnZShWT0lEKQogewogICAgIAlkcHJpbnRmX2tleWJvYXJkKHN0ZGRlYiwiR2V0S2JDb2RlUGFnZSgpXG4iKTsKIAlyZXR1cm4gODUwOwpAQCAtODI3LDEzICs5MTgsMjcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IFRvQXNjaWkoV09SRCB3VmlydEtleSwgV09SRCB3U2NhbkNvZGUsIExQU1RSIGxwS2V5U3RhdGUsIAotCUxQVk9JRCBscENoYXIsIFdPUkQgd0ZsYWdzKSAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCVRvQXNjaWkgICAoS0VZQk9BUkQuNCkKKyAqLworSU5UMTYgVG9Bc2NpaTE2KFVJTlQxNiB2aXJ0S2V5LFVJTlQxNiBzY2FuQ29kZSwgTFBCWVRFIGxwS2V5U3RhdGUsIAorCUxQVk9JRCBscENoYXIsIFVJTlQxNiBmbGFncykgCiB7CisgICAgcmV0dXJuIFRvQXNjaWkzMih2aXJ0S2V5LHNjYW5Db2RlLGxwS2V5U3RhdGUsbHBDaGFyLGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCVRvQXNjaWkgICAoVVNFUjMyLjU0NSkKKyAqLworSU5UMzIgVG9Bc2NpaTMyKAorCVVJTlQzMiB2aXJ0S2V5LFVJTlQzMiBzY2FuQ29kZSxMUEJZVEUgbHBLZXlTdGF0ZSwKKwlMUFdPUkQgbHBDaGFyLFVJTlQzMiBmbGFncworKSB7CiAgICAgWEtleUV2ZW50IGU7CiAgICAgS2V5U3ltIGtleXN5bTsKICAgICBzdGF0aWMgWENvbXBvc2VTdGF0dXMgY3M7Ci0gICAgaW50IHJldDsKKyAgICBJTlQzMiByZXQ7CiAgICAgV09SRCBrZXljOwogCiAgICAgZS5kaXNwbGF5ID0gZGlzcGxheTsKQEAgLTg0MSwyNiArOTQ2LDI2IEBACiAgICAgZm9yIChrZXljPW1pbl9rZXljb2RlOyBrZXljPD1tYXhfa2V5Y29kZTsga2V5YysrKQogICAgICAgeyAvKiB0aGlzIGNvdWxkIGJlIHNwZWVkZWQgdXAgYnkgbWFraW5nIGFub3RoZXIgdGFibGUsIGFuIGFycmF5IG9mIHN0cnVjdCB2a2V5LGtleWNvZGUKIAkgKiAodmtleSAtPiBrZXljb2RlKSB3aXRoIHZrZXlzIHNvcnRlZCAuLi4uIGJ1dCBpdCB0YWtlcyBtZW1vcnkgKDUxMiozIGJ5dGVzKSEgIERGICovCi0JaWYgKChrZXljMnZrZXlba2V5Y10gJiAweEZGKT09IHdWaXJ0S2V5KSAvKiBubyBuZWVkIHRvIG1ha2UgYSBtb3JlIHByZWNpc2UgdGVzdCAod2l0aCB0aGUgZXh0ZW5kZWQgYml0IGNvcnJlY3RseSBzZXQgYWJvdmUgd1ZpcnRLZXkgLi4uIFZLKiBhcmUgZGlmZmVyZW50IGVub3VnaC4uLiAqLworCWlmICgoa2V5YzJ2a2V5W2tleWNdICYgMHhGRik9PSB2aXJ0S2V5KSAvKiBubyBuZWVkIHRvIG1ha2UgYSBtb3JlIHByZWNpc2UgdGVzdCAod2l0aCB0aGUgZXh0ZW5kZWQgYml0IGNvcnJlY3RseSBzZXQgYWJvdmUgdmlydEtleSAuLi4gVksqIGFyZSBkaWZmZXJlbnQgZW5vdWdoLi4uICovCiAJICB7Ci0JICAgIGlmICgoZS5rZXljb2RlKSAmJiAoKHdWaXJ0S2V5PDB4MTApIHx8ICh3VmlydEtleT4weDEyKSkpIAorCSAgICBpZiAoKGUua2V5Y29kZSkgJiYgKCh2aXJ0S2V5PDB4MTApIHx8ICh2aXJ0S2V5PjB4MTIpKSkgCiAJCS8qIGl0J3Mgbm9ybWFsIHRvIGhhdmUgMiBzaGlmdCwgY29udHJvbCwgYW5kIGFsdCAhICovCiAJCWRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCJUb0FzY2lpIDogVGhlIGtleWNvZGVzICVYIGFuZCAlWCBhcmUgbWF0Y2hpbmcgdGhlIHNhbWUgdmtleSAlWFxuIiwKLQkJCQkgZS5rZXljb2RlLGtleWMsd1ZpcnRLZXkpOworCQkJCSBlLmtleWNvZGUsa2V5Yyx2aXJ0S2V5KTsKIAkgICAgZS5rZXljb2RlID0ga2V5YzsKIAkgIH0KICAgICAgIH0KICAgICBpZiAoKCFlLmtleWNvZGUpICYmIChscEtleVN0YXRlW1ZLX05VTUxPQ0tdICYgMHgwMSkpIAogICAgICAgewotCWlmICgod1ZpcnRLZXk+PVZLX05VTVBBRDApICYmICh3VmlydEtleTw9VktfTlVNUEFEOSkpCi0JICBlLmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgd1ZpcnRLZXktVktfTlVNUEFEMCtYS19LUF8wKTsKLQlpZiAod1ZpcnRLZXk9PVZLX0RFQ0lNQUwpCisJaWYgKCh2aXJ0S2V5Pj1WS19OVU1QQUQwKSAmJiAodmlydEtleTw9VktfTlVNUEFEOSkpCisJICBlLmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgdmlydEtleS1WS19OVU1QQUQwK1hLX0tQXzApOworCWlmICh2aXJ0S2V5PT1WS19ERUNJTUFMKQogCSAgZS5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIFhLX0tQX0RlY2ltYWwpOwogICAgICAgfQogICAgIGlmICghZS5rZXljb2RlKQogICAgICAgewotCWZwcmludGYoc3RkZXJyLCJUb0FzY2lpIDogVW5rbm93biB2aXJ0dWFsIGtleSAlWCAhISEgXG4iLHdWaXJ0S2V5KTsKLQlyZXR1cm4gd1ZpcnRLZXk7IC8qIHdoYXRldmVyICovCisJZnByaW50ZihzdGRlcnIsIlRvQXNjaWkgOiBVbmtub3duIHZpcnR1YWwga2V5ICVYICEhISBcbiIsdmlydEtleSk7CisJcmV0dXJuIHZpcnRLZXk7IC8qIHdoYXRldmVyICovCiAgICAgICB9CiAgICAgZS5zdGF0ZSA9IDA7CiAgICAgaWYgKGxwS2V5U3RhdGVbVktfU0hJRlRdICYgMHg4MCkKQEAgLTg3Niw4ICs5ODEsOCBAQAogICAgIGlmIChscEtleVN0YXRlW1ZLX05VTUxPQ0tdICYgMHgwMSkKIAllLnN0YXRlIHw9IE51bUxvY2tNYXNrOwogICAgIGRwcmludGZfa2V5KHN0ZGRlYiwgIlRvQXNjaWkoJTA0WCwgJTA0WCkgOiBmYWtlZCBzdGF0ZSA9ICVYXG4iLAotCQl3VmlydEtleSwgd1NjYW5Db2RlLCBlLnN0YXRlKTsKLSAgICByZXQgPSBYTG9va3VwU3RyaW5nKCZlLCBscENoYXIsIDIsICZrZXlzeW0sICZjcyk7CisJCXZpcnRLZXksIHNjYW5Db2RlLCBlLnN0YXRlKTsKKyAgICByZXQgPSBYTG9va3VwU3RyaW5nKCZlLCAoTFBWT0lEKWxwQ2hhciwgMiwgJmtleXN5bSwgJmNzKTsKICAgICBpZiAocmV0ID09IDApCiAJewogCUJZVEUgZGVhZF9jaGFyID0gMDsKQEAgLTkyMiw4ICsxMDI3LDggQEAKIAkJewogCQlmcHJpbnRmKHN0ZGVyciwgIlBsZWFzZSByZXBvcnQgOiBubyBjaGFyIGZvciBrZXlzeW0gJTA0bFggKCVzKSA6XG4iLAogCQkJa2V5c3ltLCBrc25hbWUpOwotCQlmcHJpbnRmKHN0ZGVyciwgIiAgd1ZpcnRLZXkgPSAlWCwgd1NjYW5Db2RlID0gJVgsIGtleWNvZGUgPSAlWCwgc3RhdGUgPSAlWFxuIiwKLQkJCXdWaXJ0S2V5LCB3U2NhbkNvZGUsIGUua2V5Y29kZSwgZS5zdGF0ZSk7CisJCWZwcmludGYoc3RkZXJyLCAiICB2aXJ0S2V5ID0gJVgsIHNjYW5Db2RlID0gJVgsIGtleWNvZGUgPSAlWCwgc3RhdGUgPSAlWFxuIiwKKwkJCXZpcnRLZXksIHNjYW5Db2RlLCBlLmtleWNvZGUsIGUuc3RhdGUpOwogCQl9CiAJICAgIH0KIAl9CmRpZmYgLS1naXQgYS93aW5kb3dzL21kaS5jIGIvd2luZG93cy9tZGkuYwppbmRleCA1NThmOWNlLi4zMTdjOGFlIDEwMDY0NAotLS0gYS93aW5kb3dzL21kaS5jCisrKyBiL3dpbmRvd3MvbWRpLmMKQEAgLTE1NzMsMTIgKzE1NzMsMTIgQEAKICAgCiAgIGlmKCB3bmQtPmR3U3R5bGUgJiBXU19ESVNBQkxFRCApIHJldHVybiAwOwogICAgCi0gIGlmICgoR2V0S2V5U3RhdGUoVktfQ09OVFJPTCkgJiAweDgwMDApICYmICEoR2V0S2V5U3RhdGUoVktfTUVOVSkgJiAweDgwMDApKQorICBpZiAoKEdldEtleVN0YXRlMzIoVktfQ09OVFJPTCkgJiAweDgwMDApICYmICEoR2V0S2V5U3RhdGUzMihWS19NRU5VKSAmIDB4ODAwMCkpCiAgICAgc3dpdGNoKCBtc2ctPndQYXJhbSApCiAgICAgICB7CiAJY2FzZSBWS19GNjoKIAljYXNlIFZLX1NFUEFSQVRPUjoKLQkgICAgIHdQYXJhbSA9ICggR2V0S2V5U3RhdGUoVktfU0hJRlQpICYgMHg4MDAwICk/IFNDX05FWFRXSU5ET1c6IFNDX1BSRVZXSU5ET1c7CisJICAgICB3UGFyYW0gPSAoIEdldEtleVN0YXRlMzIoVktfU0hJRlQpICYgMHg4MDAwICk/IFNDX05FWFRXSU5ET1c6IFNDX1BSRVZXSU5ET1c7CiAJICAgICBicmVhazsKIAljYXNlIFZLX1JCVVRUT046CiAJICAgICB3UGFyYW0gPSBTQ19DTE9TRTsgCmRpZmYgLS1naXQgYS93aW5kb3dzL21lc3NhZ2UuYyBiL3dpbmRvd3MvbWVzc2FnZS5jCmluZGV4IDczNThmNGIuLjRjZWIyNjkgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvbWVzc2FnZS5jCisrKyBiL3dpbmRvd3MvbWVzc2FnZS5jCkBAIC0xMjIzLDggKzEyMjMsOCBAQAogCQltc2ctPndQYXJhbSwgSElXT1JEKG1zZy0+bFBhcmFtKSApOwogCiAJLyogRklYTUUgOiBzaG91bGQgaGFuZGxlIFRvQXNjaWkgeWllbGRpbmcgMiAqLwotCXN3aXRjaCAoVG9Bc2NpaShtc2ctPndQYXJhbSwgSElXT1JEKG1zZy0+bFBhcmFtKSwKLQkJKExQU1RSKSZRdWV1ZUtleVN0YXRlVGFibGUsIHdwYXJhbSwgMCkpIAorCXN3aXRjaCAoVG9Bc2NpaTMyKG1zZy0+d1BhcmFtLCBISVdPUkQobXNnLT5sUGFyYW0pLAorCQlRdWV1ZUtleVN0YXRlVGFibGUsKExQV09SRCl3cGFyYW0sIDApKSAKIAkgICAgewogCSAgICBjYXNlIDEgOgogCQltZXNzYWdlID0gbWVzc2FnZSA9PSBXTV9LRVlET1dOID8gV01fQ0hBUiA6IFdNX1NZU0NIQVI7CmRpZmYgLS1naXQgYS93aW5kb3dzL21zZ2JveC5jIGIvd2luZG93cy9tc2dib3guYwppbmRleCBmNWE1ZDI2Li4xYWQ1NDBkIDEwMDY0NAotLS0gYS93aW5kb3dzL21zZ2JveC5jCisrKyBiL3dpbmRvd3MvbXNnYm94LmMKQEAgLTE5Nyw2ICsxOTcsOSBAQAogSU5UMzIgTWVzc2FnZUJveDMyQSggSFdORDMyIGhXbmQsIExQQ1NUUiB0ZXh0LCBMUENTVFIgdGl0bGUsIFVJTlQzMiB0eXBlICkKIHsKICAgICBNU0dCT1ggbWJveDsKKworICAgIGlmICghdGV4dCkgdGV4dD0iPFdJTkUtTlVMTD4iOworICAgIGlmICghdGl0bGUpIHRpdGxlPSI8V0lORS1OVUxMPiI7CiAgICAgbWJveC50aXRsZSA9IHRpdGxlOwogICAgIG1ib3gudGV4dCAgPSB0ZXh0OwogICAgIG1ib3gudHlwZSAgPSB0eXBlOwpAQCAtMjIxLDYgKzIyNCwyNiBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIE1lc3NhZ2VCb3hFeDMyQSAgIChVU0VSMzIuMzkxKQorICovCitJTlQzMgorTWVzc2FnZUJveEV4MzJBKEhXTkQzMiBoV25kLExQQ1NUUiB0ZXh0LExQQ1NUUiB0aXRsZSxVSU5UMzIgdHlwZSxXT1JEIGxhbmdpZCkgeworICAgIC8qIGlnbm9yZSBsYW5ndWFnZSBpZCBmb3Igbm93ICovCisgICAgcmV0dXJuIE1lc3NhZ2VCb3gzMkEoaFduZCx0ZXh0LHRpdGxlLHR5cGUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBNZXNzYWdlQm94RXgzMlcgICAoVVNFUjMyLjM5MikKKyAqLworSU5UMzIKK01lc3NhZ2VCb3hFeDMyVyhIV05EMzIgaFduZCxMUENXU1RSIHRleHQsTFBDV1NUUiB0aXRsZSxVSU5UMzIgdHlwZSxXT1JEIGxhbmdpZCkKK3sKKyAgICAvKiBpZ25vcmUgbGFuZ3VhZ2UgaWQgZm9yIG5vdyAqLworICAgIHJldHVybiBNZXNzYWdlQm94MzJXKGhXbmQsdGV4dCx0aXRsZSx0eXBlKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBGYXRhbEFwcEV4aXQxNiAgIChLRVJORUwuMTM3KQogICovCiB2b2lkIEZhdGFsQXBwRXhpdDE2KCBVSU5UMTYgYWN0aW9uLCBMUENTVFIgc3RyICkKQEAgLTI0NywzICsyNzAsNSBAQAogICAgIE1lc3NhZ2VCb3gzMlcoIDAsIHN0ciwgTlVMTCwgTUJfU1lTVEVNTU9EQUwgfCBNQl9PSyApOwogICAgIFRBU0tfS2lsbEN1cnJlbnRUYXNrKDApOwogfQorCisKZGlmZiAtLWdpdCBhL3dpbmRvd3MvcXVldWUuYyBiL3dpbmRvd3MvcXVldWUuYwppbmRleCA4M2E4YzdkLi43MDlmYTAyIDEwMDY0NAotLS0gYS93aW5kb3dzL3F1ZXVlLmMKKysrIGIvd2luZG93cy9xdWV1ZS5jCkBAIC0xMSw2ICsxMSw4IEBACiAjaW5jbHVkZSAidGFzay5oIgogI2luY2x1ZGUgIndpbi5oIgogI2luY2x1ZGUgImhvb2suaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlICJwcm9jZXNzLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCkBAIC02NjgsNiArNjcwLDI5IEBACiAgICAgcmV0dXJuIFFVRVVFX0dldFF1ZXVlVGFzayggd25kUHRyLT5obWVtVGFza1EgKTsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0V2luZG93VGhyZWFkUHJvY2Vzc0lkICAgKFVTRVIzMi4zMTIpCisgKi8KK0RXT1JECitHZXRXaW5kb3dUaHJlYWRQcm9jZXNzSWQoSFdORDMyIGh3bmQsTFBEV09SRCBwcm9jZXNzKSB7CisgICAgSFRBU0sxNiBodGFzazsKKyAgICBUREIJKnRkYjsKKworICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKKworICAgIGlmICghd25kUHRyKSByZXR1cm4gMDsKKyAgICBodGFzaz1RVUVVRV9HZXRRdWV1ZVRhc2soIHduZFB0ci0+aG1lbVRhc2tRICk7CisgICAgdGRiID0gKFREQiopR2xvYmFsTG9jazE2KGh0YXNrKTsKKyAgICBpZiAoIXRkYikgcmV0dXJuIDA7CisgICAgaWYgKHRkYi0+dGhkYikgeworICAgIAlpZiAocHJvY2VzcykKKwkJKnByb2Nlc3MgPSAoRFdPUkQpdGRiLT50aGRiLT5wcm9jZXNzOworCXJldHVybiAoRFdPUkQpdGRiLT50aGRiOworICAgIH0KKyAgICByZXR1cm4gMDsKKworfQorCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFNldE1lc3NhZ2VRdWV1ZSAgIChVU0VSLjI2NikKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvd2luLmMgYi93aW5kb3dzL3dpbi5jCmluZGV4IDMxY2VmZmQuLjVkOTZlZTEgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvd2luLmMKKysrIGIvd2luZG93cy93aW4uYwpAQCAtMzA5LDcgKzMwOSw3IEBACiBzdGF0aWMgdm9pZCBXSU5fRGVzdHJveVdpbmRvdyggV05EKiB3bmRQdHIgKQogewogICAgIEhXTkQgaHduZCA9IHduZFB0ci0+aHduZFNlbGY7Ci0gICAgV05EKiBwV25kLCpwTmV4dDsKKyAgICBXTkQgKnBXbmQ7CiAKICAgICBkcHJpbnRmX3dpbiggc3RkZGViLCAiV0lOX0Rlc3Ryb3lXaW5kb3c6ICUwNHhcbiIsIHduZFB0ci0+aHduZFNlbGYgKTsKIApAQCAtMzIwLDEwICszMjAsMTAgQEAKIAkKICAgICAvKiBmcmVlIGNoaWxkIHdpbmRvd3MgKi8KIAotICAgIHBOZXh0ID0gd25kUHRyLT5jaGlsZDsKLSAgICB3aGlsZSggKHBXbmQgPSBwTmV4dCkgKQorICAgIHdoaWxlICgocFduZCA9IHduZFB0ci0+Y2hpbGQpKQogICAgIHsKLSAgICAgICAgcE5leHQgPSBwV25kLT5uZXh0OworICAgICAgICAvKiBNYWtlIHN1cmUgdGhlIGxpbmtlZCBsaXN0IHJlbWFpbnMgY29oZXJlbnQgKi8KKyAgICAgICAgd25kUHRyLT5jaGlsZCA9IHBXbmQtPm5leHQ7CiAgICAgICAgIFdJTl9EZXN0cm95V2luZG93KCBwV25kICk7CiAgICAgfQogCg==